@pstdio/workbench 0.42.0 → 0.43.0-nightly.20261011212112

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ResourceRef","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkbenchBreadcrumbItem","title","icon","indicator","startsLevel","url","onClick","resource","WorkbenchBreadcrumbChangeListener","WorkbenchBreadcrumbState","items","WorkbenchBreadcrumbController","store","setItems","clearItems","getItems","onDidChange","listener","createWorkbenchBreadcrumbController","name","initialState","undefined","setState","getState","unsubscribe","subscribeSelector","state","CommandParamSchema","WorkbenchCommandExecutionContext","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkbenchCommandPaletteChangeListener","open","WorkbenchCommandPaletteView","WorkbenchCommandParamsRequest","record","command","id","label","params","resourceMutation","CommandDefinition","args","context","WorkbenchCommandConfirmation","resolve","confirmed","WorkbenchCommandPaletteState","confirmation","view","initialQuery","paramsRequest","WorkbenchCommandPaletteOpenInput","WorkbenchCommandPaletteController","store","isOpen","getView","getInitialQuery","getParamsRequest","input","close","toggle","requestConfirmation","Promise","requestParams","request","clearParams","onDidChange","listener","CreateWorkbenchCommandPaletteControllerInput","initialOpen","createWorkbenchCommandPaletteController","internal","name","initialState","setOpenState","next","Pick","current","getState","setState","openInput","unsubscribe","subscribeSelector","state","value","resourceKey","OpenWidgetInput","RegisteredWidgetContribution","WorkbenchWidgetPlacement","buildUpdatedPlacement","placement","widget","update","next","viewId","undefined","resource","title","label","pinned","closable","mountStrategy","hiddenByDefault","tabRetention","tab","ownerId","source","role","createPlacement","widgetId","spec","contributionId","id","singleton","WorkbenchRegion","workbenchRegions","WorkbenchLayout","WorkbenchRegionState","WorkbenchWidgetPlacement","resolveUniqueWidgetId","createRegionState","id","visible","widgets","createDefaultWorkbenchLayout","regionVisibility","Partial","Record","createRegion","regions","nav","activity","sidenav","main","secondary","side","status","overlay","findLastWidgetIndex","widgetId","index","length","normalizeWidgetIds","layout","widgetIds","Set","activeWidgetId","activeResourceKey","region","Object","entries","originalActiveWidgetId","activeIndex","map","placement","contributionId","add","normalizedActiveWidgetId","resourceKey","mergeWithDefaultRegions","persisted","defaults","persistedRegions","fromEntries","flatMap","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","createDisposable","InternalWorkbenchStore","getActivePlacement","removePlacementsForContribution","PlaceholderContribution","RegisteredPlaceholderContribution","RegisteredWidgetContribution","WidgetContribution","WorkbenchLayout","WorkbenchLayoutStoreState","WorkbenchRegion","WorkbenchRegionSettings","CreateRegionQueriesInput","getLayout","getWidgets","getPlaceholder","regionId","getRegionSettings","createRegionQueries","input","getRegionSize","persistedSize","regions","size","placement","contributionSize","contributionId","regionSize","undefined","defaultPx","getRegionCollapsible","regionCollapsible","collapsible","getRegionHeaderBorderBottom","headerBorderBottom","createContributionLists","getPlaceholders","listPlaceholders","Object","values","sort","listWidgets","createContributionRegistrations","store","persistLayout","registerPlaceholder","placeholder","metadata","region","Error","priority","placeholderContribution","record","snapshot","getState","setState","placeholders","current","_removed","nextPlaceholders","registerWidget","widget","id","reuse","singleton","widgetContribution","widgets","nextWidgets","nextLayout","layout","LayoutModel","findPlacementByWidgetId","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","CreateLocationEstablisherInput","applyAndActivate","layout","regionId","placement","getLayout","getWidget","id","panelMethods","Pick","createLocationEstablisher","input","instanceId","found","Error","role","activatePanel","const","ownedPanelMenuIds","Set","contributionId","regions","Object","fromEntries","entries","map","region","widgets","candidate","widgetId","has","resourceKey","ownerResourceKey","getActivePanel","getActivePlacement","removeLocationSubPanelSelection","replaceRegionWidgets","WorkbenchLayout","WorkbenchTabPosition","WorkbenchWidgetPlacement","insertAtPosition","widgets","placement","position","next","unshift","push","targetWidgetId","beforeWidgetId","afterWidgetId","targetIndex","findIndex","candidate","widgetId","splice","placeWidget","tabRetention","persistentWidgets","filter","reorderWidgetPlacement","find","remaining","removePlacements","layout","shouldRemove","nextLayout","region","Object","values","regions","removed","length","active","id","clearActiveWidget","activePlacement","activeWidgetId","flatMap","undefined","activeResourceKey","expirePreviewTabsInLayout","ownerResourceKey","LayoutModel","buildUpdatedPlacement","replaceRegionWidgets","expirePreviewTabsInLayout","reorderWidgetPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","createLayoutPlacementMethods","input","getLayout","requireWidget","id","setLayout","layout","persistLayout","applyAndActivate","regionId","placement","Pick","updateWidgetPlacement","widgetId","update","region","Object","values","regions","index","widgets","findIndex","widget","contributionId","nextPlacement","nextLayout","map","current","currentIndex","Error","reorderWidget","position","some","expirePreviewTabs","ownerResourceKey","activateWidget","find","candidate","LayoutModel","closeWidgetInLayout","getActiveLocationPlacement","selectRegionActiveWidget","setLocationSubPanelSelection","mergeWithDefaultRegions","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchRegion","WorkbenchRegionState","workbenchPanelRegions","CreateLayoutRegionContentMethodsInput","defaultRegionVisibility","Partial","Record","getLayout","setLayout","layout","persistLayout","createLayoutRegionContentMethods","input","Pick","setRegionActiveWidget","regionId","widgetId","nextLayout","closeWidget","result","Error","closedPlacement","closable","activePlacement","removeWidgetPlacement","undefined","clearRegion","region","regions","activeWidgetId","cleared","widgets","next","activeResourceKey","includes","resetRegions","nextRegions","id","Object","entries","locationSubPanelSelections","activeLocationWidgetId","restoreLayout","LayoutModel","WorkbenchLayout","WorkbenchRegion","WorkbenchRegionState","CreateLayoutRegionMethodsInput","getLayout","setLayout","layout","persistLayout","createLayoutRegionMethods","input","Pick","updateRegion","regionId","update","region","regions","nextRegion","setRegionVisible","visible","setRegionSize","size","setSidePanelMode","mode","presentation","createDisposable","runWorkbenchEffect","createDefaultWorkbenchLayout","mergeWithDefaultRegions","WorkbenchLayout","WorkbenchRegion","carryPinnedWorkbenchChrome","current","incoming","regions","region","Object","values","pinned","widgets","filter","placement","role","length","contributionIds","Set","map","contributionId","incomingRegion","id","has","activeWidgetId","widgetId","carryWorkbenchRegionState","regionIds","regionId","resolveScopedLayout","defaultRegionVisibility","Partial","Record","persisted","createScopeEvent","listeners","value","T","notify","listener","subscribe","add","delete","runWorkbenchEffect","LayoutModel","LayoutPersistenceAdapter","LayoutScope","carryPinnedWorkbenchChrome","carryWorkbenchRegionState","createScopeEvent","resolveScopedLayout","WorkbenchLayout","WorkbenchRegion","CreateLayoutScopeMethodsInput","defaultRegionVisibility","Partial","Record","getLayout","persistence","setLayout","layout","action","createLayoutScopeMethods","input","currentScope","enteredWithLayout","undefined","willChangeScope","didChangeScope","persistLayout","setPersistenceScope","nextScope","scopeInput","notify","incoming","scopedLayout","withPinnedChrome","nextLayout","carryRegionState","getPersistenceScope","hasPersistedLayout","enteredWithPersistedLayout","onDidChangePersistenceScope","subscribe","onWillChangePersistenceScope","resourceKey","buildUpdatedPlacement","createPlacement","createUniqueWidgetId","findPlacement","findResourcePlacement","getActiveLocationPlacement","replaceRegionWidgets","placeWidget","OpenWidgetInput","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","CreateWidgetOpenersInput","getLayout","requireWidget","id","applyAndActivate","layout","regionId","placement","openOwnedPanelMenus","input","openWidget","openInput","widget","panelMenuId","ownedPanelMenuIds","panelMenu","pinned","role","viewId","rendererId","resource","title","region","label","findReusablePlacement","singleton","reuse","undefined","ownerResourceKey","Object","values","regions","index","widgets","findIndex","candidate","contributionId","withPlacementRole","panelMenuOwner","eligibleLocations","findReplacementIndex","activeWidgetId","activeLocationWidgetId","replaceWidgetId","widgetId","tabRetention","replaceActive","replacementWidgetId","defaultTabPosition","before","find","priority","beforeWidgetId","const","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","NonNullable","ReturnType","nextPlacement","updated","map","current","tabPosition","filter","replacementIndex","replacement","reuseExistingPlacement","withoutExisting","_current","clearActiveWidget","copy","splice","insertWidget","placementInput","fallbackRegion","previewContent","LayoutModel","closeWidgetInLayout","findPlacementByWidgetId","OpenWorkbenchPanelInput","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchLayoutStoreState","WorkbenchPanelRegion","WorkbenchRegion","workbenchPanelRegions","toOpenWidgetInput","toPanelContribution","toPanelInstance","defaultPanelTabRetention","widget","openInput","pinned","const","region","fallbackRegion","includes","CreatePanelLayoutMethodsInput","getLayout","getWidgets","listWidgets","persistLayout","placementMethods","Pick","setLayout","layout","widgetOpeners","createPanelLayoutMethods","input","getPanel","id","undefined","listPanels","map","listPanelInstances","placements","regions","widgets","Object","values","flatMap","candidate","getActivePanel","state","placement","find","widgetId","activeWidgetId","activeInstanceId","found","openPanel","Error","openWidget","updatePanel","instanceId","update","updateWidgetPlacement","reorderPanel","position","Parameters","reorderWidget","activatePanel","activateWidget","closePanel","closable","active","activePlacement","LayoutModel","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchPanelMenuRegion","WorkbenchPanelMenuSide","WorkbenchPanelRegion","WorkbenchWidgetPlacement","workbenchPanelMenuRegions","workbenchPanelRegions","GetWidget","contributionId","menuRegions","Object","values","flatMap","regions","menuSide","region","endsWith","ownerContributionId","getWidget","panelMenuOwner","ownerPlacement","layout","placement","widgets","find","candidate","undefined","MenuResolution","placements","changed","resolveMenuPlacements","moves","target","seen","Set","owner","push","has","add","found","bound","ownerResourceKey","resourceKey","reconcilePanelMenuOwnership","menuRegion","length","resolved","activeWidgetId","some","widgetId","move","CreateOwnedMenuMethodsInput","getLayout","openWidget","persistLayout","setLayout","createOwnedMenuMethods","input","reconcilePanelMenus","next","id","openInput","ContributionMetadata","createDisposable","Disposable","WidgetContribution","WorkbenchPanelContribution","WorkbenchPanelMenuContribution","WorkbenchPanelMenuDefinition","WorkbenchPanelRegion","workbenchPanelMenuRegions","workbenchPanelRegions","RegisteredPanelInput","WorkbenchPanelKind","RegisterPanelContributionInput","metadata","panel","registerWidget","widget","kind","CreatePanelRegistrationsInput","panelMenuContribution","menu","side","contribution","region","fallbackRegion","find","candidate","undefined","panelMenuOwner","level","contributionId","id","registerPanelContribution","input","panelMenus","panelContribution","registrations","length","includes","Error","registeredPanel","ownedPanelMenuIds","map","push","error","registration","reverse","dispose","createPanelRegistrations","registerPanel","eligibleLocations","registerPanelMenu","panelMenu","createWorkbenchStore","createContributionLists","createContributionRegistrations","createRegionQueries","createLocationEstablisher","CreateLayoutModelInput","LayoutModel","activateInLayout","removePlacementsForContribution","createLayoutPlacementMethods","createLayoutRegionContentMethods","createLayoutRegionMethods","resolveScopedLayout","createLayoutScopeMethods","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchLayoutStoreState","WorkbenchPanelInstance","WorkbenchRegion","WorkbenchWidgetPlacement","createWidgetOpeners","createPanelLayoutMethods","createOwnedMenuMethods","createPanelRegistrations","LayoutPersistenceAdapter","LayoutScope","OpenWidgetInput","OpenWorkbenchPanelInput","PlaceholderContribution","RegisteredPlaceholderContribution","WidgetContribution","WidgetMountStrategy","WidgetReusePolicy","WorkbenchCommandTarget","WorkbenchLocationEligibility","WorkbenchPanelContribution","WorkbenchPanelMenuContribution","WorkbenchPanelMenuDefinition","WorkbenchPanelMenuOwner","WorkbenchPanelMenuRegion","WorkbenchPanelMenuSide","WorkbenchPanelMountStrategy","WorkbenchPanelOpenStrategy","WorkbenchPanelRegion","WorkbenchPanelReusePolicy","WorkbenchPanelTab","WorkbenchRegionSettings","WorkbenchRegionSize","WorkbenchRegionState","WorkbenchSidePanelMode","WorkbenchTabAction","WorkbenchTabMenuGroup","WorkbenchTabMenuRow","WorkbenchTabPosition","WorkbenchTabRetention","WorkbenchTabSnapshot","WorkbenchWidgetRole","WorkbenchWidgetTab","createDefaultWorkbenchLayout","getWorkbenchPanelForMenuRegion","workbenchPanelMenuRegions","workbenchPanelRegions","workbenchRegions","LocationAwareLayoutModel","establishLocation","instanceId","requireRegisteredWidget","widgets","id","widget","Error","createLayoutModel","input","persisted","persistence","getLayout","undefined","initialLayout","defaultRegionVisibility","store","name","initialState","layout","placeholders","getState","getPlaceholders","getWidgets","getPlaceholder","regionId","regionQueries","getRegionSettings","contributionLists","scopeMethods","setLayout","action","setState","persistLayout","requireWidget","snapshot","regionMethods","regionContentMethods","applyAndActivate","placement","contributionRegistrations","panelRegistrations","registerWidget","widgetOpeners","placementMethods","panelMethods","listWidgets","ownedMenus","getWidget","openWidget","registerPlaceholder","unregisterWidget","options","current","_removed","nextWidgets","nextLayout","removePlacements","persist","getRegionSize","getRegionCollapsible","getRegionHeaderBorderBottom","listPlaceholders","reconcilePanelMenus","setPersistenceScope","getPersistenceScope","hasPersistedLayout","enteredWithPersistedLayout","onWillChangePersistenceScope","onDidChangePersistenceScope","WorkbenchModeRegistry","WorkbenchModeRegistryInternals","activatePageMode","modeId","applyLayout","modeRegistryInternals","WeakMap","setWorkbenchModeRegistryInternals","registry","internals","set","activateWorkbenchPageMode","get","Error","runWorkbenchEffect","WorkbenchModeActivationContext","WorkbenchModeContribution","seedModeScope","mode","context","establishLocation","instanceId","locationEstablished","unsubscribeMainPanel","undefined","establishSeededLocation","primary","layout","getActivePanel","placement","getLayout","regions","main","widgets","find","candidate","widgetId","role","store","subscribeSelector","state","id","seed","createDisposable","Disposable","createWorkbenchStore","runWorkbenchEffect","WorkbenchLayout","applyModePanelAvailability","disposeReverse","panelsForMode","restoreModeLayout","restoreUnscopedModeLayout","setWorkbenchModeRegistryInternals","CreateWorkbenchModeRegistryInput","WorkbenchModeActivationResult","WorkbenchModeContribution","WorkbenchModeRegistry","WorkbenchModeStoreState","seedModeScope","getWorkbenchModePanelForRegion","isWorkbenchModePanelAvailable","WorkbenchModeActivationContext","WorkbenchModeAddablePanel","WorkbenchModeAddablePanelContext","WorkbenchModeChangeListener","toDisposables","result","Array","isArray","createWorkbenchModeRegistry","input","store","name","initialState","modes","activeModeId","undefined","initializedModes","Map","seededScopes","Set","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","mode","has","id","disposables","activate","resolveContext","set","prepareScope","context","scopeKey","layout","getPersistenceScope","availableLayout","getLayout","reconcilePanelMenus","enteredWithPersistedLayout","establishLocation","add","reconcileScope","reconcile","transitionToMode","previousModeId","getState","unscoped","disposeActive","setState","Error","get","seed","activatePageMode","applyLayout","afterPublish","dispose","options","contextScope","createScope","enter","error","scopeSubscription","onDidChangePersistenceScope","registryDisposable","values","clear","registry","registerMode","snapshot","current","delete","startsWith","_removed","rest","getMode","listModes","Object","getActiveModeId","isTransitioning","setActiveMode","setActiveInput","deferSeed","seedActiveMode","onDidChangeActive","listener","unsubscribe","subscribeSelector","state","toDisposables","Disposable","LayoutModel","WidgetMountStrategy","WorkbenchPanelTab","WorkbenchRegion","WorkbenchWidgetRole","WorkbenchViewMenuRegistry","WorkbenchViewRegistry","WorkbenchPlacementPresentation","mountStrategy","hiddenByDefault","headerBorderBottom","tab","config","RegisterWorkbenchViewPlacementInput","id","viewId","region","role","singleton","closable","registerWorkbenchViewPlacement","layout","Pick","views","input","viewMenus","view","getView","Error","_role","_viewId","panel","registerPanel","title","icon","rendererId","panelMenus","definitionsFor","modePlacementContributionId","placementId","encodeURIComponent","pagePlacementContributionId","pageId","slotId","WorkbenchRegion","workbenchPanelRegions","isWorkbenchModePanelAvailable","WorkbenchModeContribution","modePlacementContributionId","WorkbenchCore","PanelDestinationPolicy","mode","movableTo","allowedRegions","allowedPanelDestinations","policy","filter","region","includes","panelDestinations","core","contributionId","widget","layout","getWidget","some","modeId","modes","getActiveModeId","getMode","undefined","declaration","modePlacements","listPlacements","find","p","id","legacyPanel","listAddablePanels","getLayout","resource","getPrimaryResource","panelId","resourceKey","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchWidgetPlacement","getActiveLocationPlacement","isWorkbenchPanelPlacementVisible","isWorkbenchModePanelAvailable","WorkbenchModeAddablePanel","WorkbenchModeContribution","ResourceRef","allowedPanelDestinations","WorkbenchCompositionAddablePanel","contribution","open","resource","Promise","WorkbenchCompositionRegionPanels","addable","closable","WorkbenchCompositionController","panelsFor","region","CreateWorkbenchCompositionControllerInput","getActiveMode","getLayout","getResource","listWidgets","listOwnedAddablePanels","input","layout","mode","isOpenSingleton","widget","placements","singleton","some","placement","contributionId","id","scopedResourceKey","role","ownerResourceKey","addModePanels","Map","modePanels","widgets","panel","includes","allowedRegions","find","panelId","set","addRegisteredPanels","location","eligibleLocations","policy","has","undefined","createWorkbenchCompositionController","regions","listAddablePanels","values","filter","map","addModePanels","ContextKeyService","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","workbenchFocusRegions","const","WorkbenchFocusRegionId","WorkbenchFocusChangeListener","region","WorkbenchFocusState","activeRegion","WorkbenchFocusController","store","setActiveRegion","clearFocus","getActiveRegion","onDidChange","listener","CreateWorkbenchFocusControllerInput","context","isRegionFocusable","focusContextByRegion","activity","sidenav","main","secondary","side","status","Record","createWorkbenchFocusController","input","name","initialState","undefined","createScope","applyContext","set","focusRegion","getState","setState","unsubscribe","subscribeSelector","state","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","PageLocation","ResourceRef","NavigationTreeRegistry","NavigationTreeSlot","WorkbenchPageContribution","TreeViewSection","resolveNavigationLevels","LevelNavigationHost","modes","getActiveModeId","pages","store","getState","location","Readonly","Record","navigationTrees","getPrimaryResource","pinnedOnly","sections","filter","section","nodes","length","map","node","mergeSections","merged","Map","current","get","id","set","values","createLevelNavigation","host","queries","modeId","state","levels","Object","modeOwner","resolveOwner","kind","const","extensionId","owner","resource","getReadKey","JSON","stringify","getSections","slot","signal","AbortSignal","ordered","reverse","index","entries","throwIfAborted","read","push","getDefaultExpandedSectionIds","all","flatMap","PageLocation","PlacementIdentity","Disposable","createPagePreparation","WorkbenchPageOpenInput","WorkbenchPageRegistry","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","WorkbenchPageRuntimeState","WorkbenchPageLocationCommitInput","projectId","location","action","pageStates","Readonly","Record","WorkbenchPageCloseResolution","kind","target","locationChanged","parentId","WorkbenchPageRegistryInternals","resources","prepare","ReturnType","Value","publish","state","onDidCommit","listener","getPublishingState","connectRuntime","apply","activateLocation","input","refreshModePlacements","refreshShellPlacements","clearProject","resolveClosePlacement","identity","registryInternals","WeakMap","setWorkbenchPageRegistryInternals","registry","internals","set","getWorkbenchPageRegistryInternals","get","Error","NavigationTargetPage","PageLocation","PlacementIdentity","ResourceRef","isWorkbenchProjectUrl","WorkbenchStore","CreateWorkbenchPageLocationControllerInput","ResolvedPageLocation","WorkbenchPageBrowserEntry","WorkbenchPageLocationController","WorkbenchPageLocationDiagnostic","WorkbenchPageLocationHistoryState","WorkbenchPageNavigationResult","PageLocationControllerActionsInput","input","Value","historyStore","clearProject","projectId","resetHistory","rootLevelTarget","restore","source","useCurrentUrl","resolveUrl","entry","normalizeTarget","target","normalizeStored","location","locationsEqual","left","right","commit","resolved","history","action","fail","error","closePlacement","identity","removeResource","resource","retained","canGoBack","canGoForward","dispose","hasResolvableCurrentPageUrl","actions","Boolean","browser","current","createPageLocationControllerActions","setProject","registry","store","getState","undefined","isCurrentProjectUrl","url","hasCurrentPageUrl","boot","switchProject","navigate","Error","replay","navigateToParent","parent","navigateToRootLevel","goBack","back","goForward","forward","FileRendererSectionTarget","FileSourcePosition","NavigationTargetPage","PageLocation","PageRef","ResourceRef","isFileSourcePosition","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","canonicalPosition","isFrozen","createLocation","input","key","declaredParent","seen","Set","parentId","normalizeResolvedLocation","candidate","routeKey","has","add","inheritedParent","active","normalizePageTarget","target","open","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","resourceKey","PageLocation","serializeWorkbenchPageUrl","WorkbenchPageContribution","WorkbenchPageResourceCodec","workbenchPageLocationRouteKey","WorkbenchPageHistoryState","WorkbenchPageLocationDiagnostic","createPageHistoryEntry","input","pages","resources","projectId","location","index","url","state","kind","routeKey","createPageLocationFailureHandler","report","diagnostic","source","error","code","message","Error","String","ok","const","NavigationTargetPage","WorkbenchPageRegistryStoreState","ResolvedPageLocation","WorkbenchPageLocationController","WorkbenchPageNavigationResult","PageLocationPreparation","resolve","target","commit","state","Value","beforePublish","preparations","WeakMap","setPageLocationPreparation","controller","preparation","set","getPageLocationPreparation","get","Error","preparations","PageLocation","WorkbenchPageRegistryStoreState","WorkbenchPageRegistryInternals","batchWorkbenchChanges","runWorkbenchEffect","createPageHistoryEntry","CreateWorkbenchPageLocationControllerInput","createPageLocationPublisher","input","Value","internals","hooks","getIndex","commitIndex","index","push","entry","ReturnType","publish","rememberRootLevel","location","projectId","state","history","action","beforePublish","Error","nextIndex","browser","rootLevel","persistence","save","ok","const","PageLocation","ResourceRef","WorkbenchPageContribution","ProjectNavigationSources","resolveRootLevelLocation","ResolvedPageLocation","RootLevelLocationTrackerInput","levels","pages","normalize","location","resourceKey","resource","start","usesResource","matches","Boolean","parent","createRootLevelLocationTracker","input","saved","restore","remember","resolved","forget","removed","candidate","undefined","target","PageLocation","WorkbenchPageContribution","WorkbenchPageRegistry","WorkbenchPageResourceCodec","normalizeDirectWorkbenchPageLocation","ResolvedPageLocation","WorkbenchPageLocationDiagnostic","PageOwnerRemovalInput","registry","Value","pages","resources","normalizeStored","location","start","commit","projectId","resolved","history","action","fail","source","error","connectPageOwnerRemoval","input","store","subscribe","state","previous","removedPage","Object","keys","some","pageId","active","activePageId","undefined","id","resource","section","PageLocation","PageRef","PlacementIdentity","WorkbenchPageCloseResolution","ResolvedPageLocation","WorkbenchPageNavigationResult","PagePlacementCloserInput","commit","projectId","resolved","history","action","fail","source","error","getCurrent","location","getPageRef","pageId","normalizePage","page","normalizeStored","resolveClosePlacement","identity","createPagePlacementCloser","input","closeToParent","resolution","Extract","kind","contextualParent","parent","undefined","parentId","Error","pageStates","closeWithinPage","target","resource","section","open","locationChanged","current","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","workbenchPageLocationKey","WorkbenchPageContribution","WorkbenchPageResourceCodec","pageStateKey","page","location","resources","main","kind","id","position","undefined","removePageStates","states","Readonly","Record","State","pageId","Object","fromEntries","entries","filter","key","startsWith","PlacementIdentity","ResourceRef","placementIdentityKey","primarySlot","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","pageStateKey","removePageResource","state","Value","resource","resources","retained","key","value","toUri","normalize","removedKey","keep","Set","map","pageStates","Object","fromEntries","entries","stateKey","current","pageId","keys","pages","find","id","startsWith","resourceInstances","slotId","instances","filter","instance","has","kind","instanceKey","primary","remaining","activePrimaryInstanceKey","item","some","at","location","page","activePageId","undefined","active","section","parent","parentId","ref","PlacementIdentity","ResourceRef","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","removePageResource","normalizeWorkbenchPageLocation","workbenchPageLocationsEqual","ResolvedPageLocation","createPageResourceRemover","input","getState","Value","resources","forgetRootLevel","resource","commit","projectId","location","history","action","retained","current","next","changed","Object","values","pages","resolved","pageStates","PageLocation","isWorkbenchProjectUrl","parseWorkbenchPageUrl","getWorkbenchPageRegistryInternals","createWorkbenchStore","createPageLocationControllerActions","createPageHistoryEntry","createPageLocationFailureHandler","normalizeDirectWorkbenchPageLocation","normalizeWorkbenchPageLocation","normalizeWorkbenchPageTarget","workbenchPageLocationRouteKey","workbenchPageLocationsEqual","setPageLocationPreparation","createPageLocationPublisher","createRootLevelLocationTracker","CreateWorkbenchPageLocationControllerInput","ResolvedPageLocation","WorkbenchPageBrowserEntry","WorkbenchPageHistoryState","WorkbenchPageLocationController","WorkbenchPageLocationHistoryState","WorkbenchPageNavigationResult","connectPageOwnerRemoval","createPagePlacementCloser","createPageResourceRemover","PersistedWorkbenchPageLocation","WorkbenchPageLocationBrowser","WorkbenchPageLocationDiagnostic","WorkbenchPageLocationPersistence","isHistoryState","value","state","Partial","kind","index","projectId","routeKey","Boolean","location","createWorkbenchPageLocationController","input","Value","internals","registry","pages","listPages","historyIndex","maxHistoryIndex","historyStore","name","initialState","canGoBack","canGoForward","publishHistory","setState","resetHistory","fail","reportDiagnostic","historyEntry","resources","rootLevel","levels","normalize","normalizeStored","resourceKey","resource","toUri","start","publish","getIndex","commitIndex","push","entry","rememberRootLevel","remember","commit","resolved","history","action","prepare","pageId","open","section","pageStates","store","getState","target","page","startPage","resolveUrl","parsed","url","undefined","direct","contextual","directKey","contextualKey","restore","source","useCurrentUrl","browserEntry","browser","current","Math","max","hasProjectUrl","fromUrl","Error","persisted","persistence","load","saved","error","fallbackError","onPopState","popStateSubscription","pageRemovalSubscription","closeActivePlacement","getCurrent","getPageRef","getPage","ref","normalizePage","resolveClosePlacement","controller","clearProject","rootLevelTarget","normalizeTarget","active","locationsEqual","left","right","closePlacement","removeResource","forgetRootLevel","forget","dispose","resolve","beforePublish","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","runWorkbenchEffect","WorkbenchPanelMenuState","openByMenuId","Record","PersistedWorkbenchPanelMenuState","WorkbenchPanelMenuStatePersistenceAdapter","getMenuStates","scope","setMenuStates","state","WorkbenchPanelMenuStateChangeListener","WorkbenchPanelMenuStateController","store","isOpen","menuId","setOpen","open","toggle","setPersistenceScope","getPersistenceScope","onDidChange","listener","CreateWorkbenchPanelMenuStateControllerInput","persistence","createWorkbenchPanelMenuStateController","input","currentScope","persisted","resolveOpenByMenuId","name","initialState","persistState","getState","snapshot","setState","incoming","unsubscribe","subscribe","LayoutModel","WorkbenchSidePanelMode","createDisposable","Disposable","WorkbenchSidePanelChangeListener","mode","WorkbenchSidePanelController","canFloat","getMode","setMode","onDidChange","listener","CreateWorkbenchSidePanelControllerInput","layout","Pick","getFloatingPanels","onDidChangePolicy","initialMode","createWorkbenchSidePanelController","input","resolveMode","defaultPresentation","side","getLayout","regions","visible","presentation","setSidePanelMode","current","notify","next","unsubscribe","store","subscribe","policy","dispose","TerminalSessionAdapter","TerminalSessionError","TerminalSessionExit","TerminalSessionRequest","createWorkbenchStore","WorkbenchStore","WorkbenchTerminalSessionRequest","WorkbenchTerminalSessionExit","WorkbenchTerminalSessionError","WorkbenchTerminalSessionAdapter","WorkbenchTerminalSessionOpener","request","Promise","WorkbenchTerminalSessionStatus","WorkbenchTerminalSessionModel","id","title","status","exit","WorkbenchTerminalState","sessionsById","Record","WorkbenchTerminalSessionSink","onData","chunk","Uint8Array","onExit","onError","error","WorkbenchTerminalController","store","isAvailable","setSessionOpener","opener","open","input","bindingId","sessionId","write","data","resize","cols","rows","kill","signal","killBinding","subscribe","sink","getSession","listSessions","dispose","DEFAULT_SESSION_TITLE","SESSION_HISTORY_LIMIT","createWorkbenchTerminalController","name","initialState","adapters","Map","adapterDisposers","Array","dataHistory","dataSubscribers","Set","sessionIdByBindingId","bindingIdBySessionId","pendingSessionByBindingId","patchSession","patch","Partial","action","snapshot","getState","session","setState","requireAdapter","adapter","get","Error","cleanupSession","delete","disposers","publishData","history","push","length","shift","subscriber","has","pending","opened","catch","undefined","openSession","set","unsubscribeTitle","onTitle","next","unsubscribes","subscribers","add","unsubscribe","Object","values","running","filter","all","map","clear","ResourceRef","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","CommandPaletteResourceQueryContext","query","limit","signal","AbortSignal","CommandPaletteResourceResult","id","resource","label","description","icon","keywords","group","activate","Promise","CommandPaletteResourceProvider","title","refreshEventIds","context","CommandPaletteResourceProviderResult","providerId","results","CommandPaletteResourceRegistryStoreState","providers","Record","refreshToken","CommandPaletteResourceRegistry","store","registerProvider","provider","listProviders","queryProviders","refresh","createCommandPaletteResourceRegistry","name","initialState","snapshot","getState","Error","setState","current","_removed","rest","Object","values","all","map","ContextKeyService","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchCommandExecutionError","commandId","args","error","WorkbenchCommandExecutionErrorListener","event","WorkbenchCommandExecutionContext","resource","signal","AbortSignal","source","CommandParamOption","label","value","icon","CommandParamOptionSource","valueField","labelField","params","Record","CommandParamDescriptor","type","description","required","defaultValue","options","allowCustomValues","templateType","resourceType","providers","accept","multiple","metadata","resolvedFrom","CommandParamSchema","Command","id","category","when","resourceMutation","CommandDefinition","CommandHandler","prepareArgs","TArgs","context","onArgsChange","Promise","execute","TResult","isEnabled","isVisible","isToggled","RegisteredCommand","command","handler","CommandRegistryStoreState","commands","CommandRegistry","store","registerCommand","getCommand","listCommands","isCommandEnabled","isCommandVisible","isCommandToggled","prepareCommandArgs","executeCommand","onDidExecuteError","listener","CreateCommandRegistryInput","createCommandRegistry","input","name","initialState","errorListeners","Set","requireCommand","record","getState","Error","emitError","snapshot","setState","current","_removed","rest","Object","values","sort","matches","prepare","add","delete","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","CommandRegistry","MenuPath","MenuItem","commandId","sourceCommandId","label","description","icon","iconSrc","overflowLabel","when","group","order","args","readOnly","external","RegisteredMenuItem","path","MenuRegistryDeps","commands","menuPathKey","join","MenuRegistryStoreState","itemsByPath","Record","MenuRegistry","menuStore","registerMenuItem","item","metadata","listMenuItems","createMenuRegistry","deps","name","initialState","getCommand","Error","key","record","snapshot","getState","items","setState","current","list","filtered","filter","entry","length","sort","left","right","leftOrder","rightOrder","ResourceConstraint","ResourceRef","resourceMatchesConstraint","constraint","resource","kinds","some","kind","id","type","extensionId","SINGLE_RESOURCE_INSTANCE_KEY","PageOpenIntent","PlacementItem","contributionRefId","resourceKey","resourceMatchesConstraint","ResourceRef","SINGLE_RESOURCE_INSTANCE_KEY","WorkbenchPlacementPresence","WorkbenchOwnedPlacementItem","placementItemViewId","item","kind","view","binding","StaticPlacementOverride","OwnedResourceInstance","instanceKey","resource","open","title","OwnedPlacementState","staticOverrides","Map","resourceInstances","createOwnedPlacementState","isStaticPlacementOpen","state","id","presence","get","staticPlacementClosable","validateOwnedPlacementItem","label","kinds","length","Error","openStaticPlacement","input","set","closeStaticPlacement","retainResourceInstances","Extract","current","next","cardinality","existing","find","candidate","retained","filter","resourceInstanceKey","key","shown","instance","taken","Set","map","suffix","has","openResourcePlacement","type","const","closeOwnedPlacementInstance","updateResourcePlacementInstance","instances","undefined","clearOwnedPlacementState","delete","PageLocation","PageOpenIntent","PlacementIdentity","ResourceRef","Disposable","WorkbenchWidgetPlacement","ResolvedOwnedPlacement","OwnedPlacementState","openResourcePlacement","openStaticPlacement","WorkbenchOwnedPlacementItem","OwnedPlacementOpenInput","placementId","resource","open","title","OwnedPlacementLocationContext","modeId","pageId","projectId","location","OwnedPlacementPreparation","connectRuntime","listener","restore","context","state","previousContext","adopt","placements","getState","target","current","identity","resolve","apply","publish","preparations","WeakMap","setOwnedPlacementPreparation","registry","preparation","set","getOwnedPlacementPreparation","get","Error","prepareOwnedPlacement","input","label","item","identityFor","instanceKey","staticOverrides","Map","resourceInstances","operation","id","kind","PlacementIdentity","resourceMatchesConstraint","WorkbenchWidgetPlacement","OwnedPlacementState","WorkbenchOwnedPlacementItem","SINGLE_RESOURCE_INSTANCE_KEY","restoreOwnedPlacementState","input","state","declarations","id","item","saved","owns","identity","staticOverrides","Map","resourceInstances","placement","filter","candidate","placementIdentity","kind","placementId","set","length","binding","instances","flatMap","resource","instanceKey","cardinality","title","open","tabRetention","const","slice","DockedWorkbenchRegion","PageOpenIntent","PlacementIdentity","PlacementRef","createDisposable","Disposable","notifyWorkbenchChange","runWorkbenchEffect","createPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchWidgetPlacement","ResolvedOwnedPlacement","clearOwnedPlacementState","closeOwnedPlacementInstance","createOwnedPlacementState","isStaticPlacementOpen","placementItemViewId","staticPlacementClosable","updateResourcePlacementInstance","validateOwnedPlacementItem","WorkbenchOwnedPlacementItem","OwnedPlacementLocationContext","OwnedPlacementPreparation","prepareOwnedPlacement","setOwnedPlacementPreparation","restoreOwnedPlacementState","ResourceRef","WorkbenchViewMenuRegistry","modePlacementContributionId","registerWorkbenchViewPlacement","WorkbenchPlacementPresentation","WorkbenchViewRegistry","WorkbenchModePlacementContribution","id","ref","modeId","item","region","order","movableTo","OpenModePlacementTarget","panel","resource","open","WorkbenchModePlacementRegistry","registerPlacement","placement","getPlacement","listPlacements","openPlacement","input","updatePlacement","identity","title","closePlacement","resolvePlacements","context","onDidChange","listener","identityFor","instanceKey","kind","placementId","tabState","pinned","tabRetention","const","placementRefKey","JSON","stringify","extensionId","validatePlacement","placements","Map","refs","views","has","Error","refKey","includes","getView","copyPlacement","createWorkbenchModePlacementRegistry","getProjectId","loadLayout","viewMenus","getPanel","panelId","registerPanel","Parameters","state","listeners","Set","label","values","filter","sort","left","right","localeCompare","runtime","emitChange","resolve","view","contributionId","value","encodeURIComponent","viewId","role","closable","preparation","connectRuntime","undefined","getState","restore","current","projectId","saved","declarations","staticOverrides","resourceInstances","length","Object","regions","flatMap","widgets","owns","adopt","target","get","apply","next","publish","map","instance","registry","registered","singleton","binding","cardinality","set","delete","dispose","prepared","changed","update","add","identityFor","tabState","NavigationTargetPage","SdkNavigationTargetPage","NavigationTargetPanel","SdkNavigationTargetPanel","isNavigationTarget","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ShellPlacementRef","kind","id","NavigationTargetShellPanel","panel","resource","open","title","DistributiveOmit","PropertyKey","T","Omit","K","NavigationTargetCommand","commandId","args","NavigationTargetHref","href","NavigationTargetItem","NavigationTargetCompound","targets","NavigationTarget","NavigationParser","priority","canParse","location","parse","RegisteredNavigationParser","NavigationDispatcherContext","canOpenPanel","target","canExecuteCommand","prepareNavigation","commit","openPanelTarget","openPageTarget","executeCommand","Promise","openHref","byPriorityAndId","left","right","localeCompare","NavigationRegistryStoreState","parsers","Record","NavigationRegistry","store","registerParser","parser","metadata","listParsers","resolveLocation","openTarget","openPage","openPanel","navigate","CreateNavigationRegistryInput","resolveDispatcher","noDispatcher","Error","dispatchItem","dispatcher","validateItem","toItems","createNavigationRegistry","input","name","initialState","removeKey","record","key","_removed","rest","registry","snapshot","getState","parserContribution","setState","current","Object","values","sort","find","candidate","items","results","item","some","prepared","push","byPriorityAndId","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchNotificationLevel","WorkbenchNotificationAction","commandId","title","args","WorkbenchNotification","id","level","message","createdAt","resource","actions","metadata","Record","RegisteredWorkbenchNotification","WorkbenchNotificationEvent","type","notification","WorkbenchNotificationListener","event","WorkbenchNotificationStoreState","notifications","NotificationRegistry","store","show","dismiss","clear","listNotifications","subscribe","listener","createNotificationRegistry","name","initialState","listeners","Set","generatedId","emit","toString","record","Date","toISOString","snapshot","getState","setState","_removed","rest","ids","Object","keys","values","sort","left","right","localeCompare","add","delete","Disposable","LayoutModel","ResourceRef","WorkbenchViewMenuRegistry","registerWorkbenchViewPlacement","WorkbenchPlacementPresentation","WorkbenchViewRegistry","WorkbenchOverlayContribution","Omit","id","viewId","closable","OpenWorkbenchOverlayInput","resource","title","WorkbenchOverlayRegistry","registerOverlay","overlay","getOverlay","listOverlays","openOverlay","input","closeOverlay","instanceId","overlayContributionId","encodeURIComponent","createWorkbenchOverlayRegistry","layout","views","viewMenus","overlays","Map","registrations","has","Error","record","registration","region","role","singleton","set","dispose","get","delete","values","sort","left","right","localeCompare","openInput","openPanel","strategy","kind","removeWidgetPlacement","PageOpenIntent","ResourceRef","resourceMatchesConstraint","SINGLE_RESOURCE_INSTANCE_KEY","isPageSlotClosable","primarySlot","ResolvedPageSlot","WorkbenchPageContribution","WorkbenchPageOpenInput","WorkbenchPageRuntimeState","WorkbenchPageSlotInstance","requirePageSlot","emptyPageState","page","openStaticSlotIds","slots","filter","slot","item","kind","presence","map","id","resourceInstances","staticSlotOpen","state","includes","nextResourceInstances","current","instance","binding","cardinality","existing","find","candidate","instanceKey","open","openResourceSlot","input","target","resourceKey","resource","Error","type","section","role","activePrimaryInstanceKey","selectPrimaryTarget","pageResourceBindingSlots","openOn","openPageResourceBindings","reduce","pageId","setStaticSlotOpen","slotId","ids","Set","add","delete","removeResourceInstance","ClosePageSlotResult","activateInstanceKey","parentId","closePageSlot","remaining","length","previous","at","PlacementIdentity","ResourceRef","placementIdentityKey","WorkbenchPageCloseResolution","WorkbenchPageContribution","WorkbenchPageRegistryStoreState","closePageSlot","emptyPageState","requirePageSlot","resolvePagePlacementClose","input","identity","page","state","Value","resourceKey","resource","stateKey","kind","Error","activePageId","pageId","slot","slotId","exists","placements","some","candidate","pageState","pageStates","closedActivePrimary","role","activePrimaryInstanceKey","instanceKey","result","parentId","location","target","id","section","locationChanged","activeInstanceKey","activeInstance","resourceInstances","find","instance","open","PlacementIdentity","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","pageStateKey","pinPagePlacement","state","Value","identity","resources","open","kind","activePageId","pageId","Error","page","pages","key","location","current","pageStates","instances","resourceInstances","slotId","some","instance","instanceKey","filter","map","PlacementIdentity","ResourceRef","contributionRefId","ResolvedOwnedPlacement","SINGLE_RESOURCE_INSTANCE_KEY","isPageSlotClosable","PAGE_MAIN_SLOT_ID","pageSlots","ResolvedPageSlot","WorkbenchPageContribution","WorkbenchPagePlacementInput","WorkbenchPageRuntimeState","pageResourceBindingSlots","staticSlotOpen","pagePlacementIdentity","pageId","slotId","instanceKey","kind","pageFollowerIdentities","page","resource","resourceKey","filter","slot","region","index","slots","findIndex","candidate","map","id","item","binding","cardinality","validatePageSlots","ids","Set","has","Error","add","kinds","length","openOn","validateWorkbenchPage","ref","extensionId","path","startsWith","endsWith","main","document","metadataKey","trim","parentId","placementFor","input","resolvePagePlacement","value","Value","section","open","view","identity","order","role","viewId","closable","resolvePagePlacements","state","sharedPlacements","placements","isAvailable","push","instance","resourceInstances","some","placement","empty","presence","PlacementIdentity","createWorkbenchStore","composeOwnedPlacements","OwnedPlacementReconciliation","ResolvedOwnedPlacement","CreateWorkbenchPageRegistryInput","WorkbenchPageRegistryStoreState","WorkbenchPageRuntimeState","emptyReconciliation","Value","add","retain","update","activate","remove","PageRegistryCommitInput","pageStates","Readonly","Record","projectId","location","activePageId","activeModeId","modePlacements","action","createPageRegistryStore","input","name","initialState","pages","placements","shell","resolveShellPlacements","reconciliation","resolveModePlacementSet","current","modeId","desired","pageId","resolveModePlacements","undefined","refreshActiveModePlacements","state","registryInput","commit","next","refreshShellPlacements","emptyReconciliation","resourceKey","resourceIdentity","composeOwnedPlacements","ResolvedOwnedPlacement","reconcileOwnedPlacements","pageFollowerIdentities","pagePlacementIdentity","resolvePagePlacements","WorkbenchPageLocationCommitInput","PageRegistryCommitInput","resolveModePlacementSet","CreateWorkbenchPageRegistryInput","WorkbenchPageRegistryStoreState","WorkbenchPageSlotOpenInput","emptyPageState","openPageResourceBindings","openResourceSlot","primarySlot","requirePageSlot","selectPrimaryTarget","setStaticSlotOpen","pageStateKey","PreparedOwnedPlacements","shell","Value","mode","createPagePreparation","input","normalizeResource","resources","normalize","resource","Parameters","toUri","requirePage","current","pageId","page","pages","Error","compose","next","owned","activePageId","undefined","pageState","pageStates","location","activeModeId","validateMode","modePlacements","modeId","desired","projectId","resolveModePlacements","some","placement","identity","kind","resolveShellPlacements","composed","state","sharedPlacements","resolvePagePlacement","reconciliation","placements","activate","valuesEqual","target","normalizedTarget","stateKey","currentPageState","restorePageState","primaryState","openFollowers","id","activePrimaryInstanceKey","primary","instanceKey","followers","action","slot","slotId","role","resourceInstances","at","item","open","presence","resourceKey","resourceIdentity","ResourceRef","createDisposable","InternalWorkbenchStore","composeOwnedPlacements","OwnedPlacementReconciliation","reconcileOwnedPlacements","validateWorkbenchPage","CreateWorkbenchPageRegistryInput","WorkbenchPageContribution","WorkbenchPageRegistryStoreState","removePageStates","emptyReconciliation","Value","add","retain","update","activate","remove","registerWorkbenchPage","input","page","registryInput","store","publishState","state","action","normalizeResource","resource","resourceKey","current","getState","pages","id","Error","Object","values","some","candidate","ref","extensionId","path","registered","slots","map","slot","placementRegistration","registerPagePlacements","setState","reconciliation","snapshot","_page","pageStates","activePageId","placements","shell","resolveShellPlacements","location","undefined","activeModeId","desired","valuesEqual","dispose","createDisposable","batchWorkbenchChanges","composeOwnedPlacements","reconcileOwnedPlacements","resolvePagePlacementClose","pinPagePlacement","createPagePreparation","registerWorkbenchPage","setWorkbenchPageRegistryInternals","WorkbenchPageLocationCommitInput","createPageRegistryStore","PageRegistryCommitInput","refreshActiveModePlacements","refreshShellPlacements","CreateWorkbenchPageRegistryInput","WorkbenchPageRegistry","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","pageStateKey","WorkbenchPageContribution","WorkbenchPageMain","WorkbenchPageOpenInput","WorkbenchPagePlacementInput","WorkbenchPageRuntimeState","WorkbenchPageSlot","WorkbenchPageSlotInstance","WorkbenchPageSlotOpenInput","createWorkbenchPageRegistry","input","Value","normalizeResource","resource","Parameters","resources","normalize","resourceKey","toUri","store","runtime","state","publishingState","publishState","action","storeBeforeRuntime","getState","previousPublishingState","setState","requirePage","pageId","page","pages","Error","prepare","commit","next","compose","activatePageWithStates","target","location","registry","registerPage","registryInput","getPage","listPages","Object","values","sort","left","right","id","localeCompare","pinPlacement","identity","open","openSlot","slot","publish","onDidCommit","listener","api","subscribe","getPublishingState","connectRuntime","apply","error","undefined","refreshModePlacements","activateLocation","clearProject","projectId","current","placements","shell","resolveShellPlacements","pageStates","activePageId","activeModeId","reconciliation","desired","valuesEqual","resolveClosePlacement","kind","stateKey","ContributionMetadata","Disposable","LayoutModel","WorkbenchRegion","WorkbenchRegionSize","WorkbenchViewRegistry","WorkbenchPlaceholderContribution","id","viewId","title","region","regionSize","regionCollapsible","config","WorkbenchPlaceholderRegistry","registerPlaceholder","placeholder","metadata","createWorkbenchPlaceholderRegistry","input","layout","Pick","views","view","getView","Error","rendererId","PageOpenIntent","PlacementIdentity","createDisposable","Disposable","notifyWorkbenchChange","runWorkbenchEffect","createPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","WorkbenchWidgetRole","ResolvedOwnedPlacement","ResourceRef","WorkbenchViewMenuRegistry","registerWorkbenchViewPlacement","WorkbenchPlacementPresentation","WorkbenchViewRegistry","clearOwnedPlacementState","closeOwnedPlacementInstance","createOwnedPlacementState","isStaticPlacementOpen","placementItemViewId","staticPlacementClosable","updateResourcePlacementInstance","validateOwnedPlacementItem","WorkbenchOwnedPlacementItem","OwnedPlacementLocationContext","OwnedPlacementPreparation","prepareOwnedPlacement","setOwnedPlacementPreparation","restoreOwnedPlacementState","WorkbenchShellPlacementContribution","id","item","region","order","OpenWorkbenchShellPlacementInput","placementId","resource","open","title","WorkbenchShellPlacementRegistry","registerPlacement","placement","getPlacement","listPlacements","openPlacement","input","updatePlacement","identity","closePlacement","resolvePlacements","context","onDidChange","listener","shellPlacementContributionId","encodeURIComponent","identityFor","instanceKey","kind","roleForRegion","tabState","pinned","tabRetention","const","createWorkbenchShellPlacementRegistry","views","viewMenus","getPanel","panelId","registerPanel","Parameters","activatePanel","instanceId","getLayout","getScope","resolveScope","loadLayout","enteredWithPersistedLayout","onDidChangePersistenceScope","placements","Map","state","listeners","Set","label","runtime","emitChange","restorePlacement","declarations","saved","Object","values","regions","flatMap","widgets","owns","resolve","panel","Error","value","viewId","role","closable","preparation","connectRuntime","undefined","getState","restore","current","previousContext","scope","previousScope","layout","adopt","_modeId","target","get","apply","next","publish","resourceInstances","map","instance","registry","has","getView","registered","singleton","binding","cardinality","set","delete","dispose","sort","left","right","localeCompare","prepared","changed","update","add","ContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","PreferenceScope","PreferenceValue","Record","PreferencePropertySchema","type","enum","default","scope","description","PreferenceSchemaContribution","properties","PreferenceScopeRef","scopeId","PreferencePersistenceAdapter","getValue","name","setValue","value","CreatePreferenceRegistryInput","persistence","RegisteredPreferenceSchema","ownerId","source","PreferenceRegistryStoreState","schemas","PreferenceRegistry","store","registerSchema","schema","metadata","getSchema","valueKey","createMemoryPreferencePersistence","values","Map","get","set","createPreferenceRegistry","input","initialState","registeredNames","Object","keys","snapshot","getState","Error","additions","property","setState","current","next","scoped","undefined","userValue","ControlsQueryResult","ControlValue","ControlValueMap","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","ControlsRendererRegion","ControlsRendererLayout","region","defaultPx","minPx","maxPx","ControlsUpdateValueInput","controlId","value","values","resource","ControlsApplyInput","ControlsResetInput","controlIds","ControlsRendererContribution","id","title","resourceKind","emptyTitle","emptyDescription","layout","defaultValues","executeQuery","signal","AbortSignal","Promise","updateValue","input","apply","reset","subscribe","listener","RegisteredControlsRendererContribution","ControlsRendererStoreState","renderers","Record","ControlsRendererRefreshEvent","controlsRendererId","ControlsRendererRefreshListener","event","ControlsRendererImplementation","CreateControlsRendererRegistryInput","rendererRegistry","ControlsRendererRegistry","controlsStore","registerControlsRenderer","contribution","metadata","setControlsRendererImplementation","impl","getControlsRenderer","listControlsRenderers","refreshControlsRenderer","onDidRefreshControlsRenderer","createControlsRendererRegistry","name","initialState","refreshListeners","Set","implementation","requireControlsRenderer","renderer","getState","Error","snapshot","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","nextRenderers","Object","sort","add","delete","DataTableRendererSettings","ViewFilterGroup","ViewSort","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","CollectionSavedView","CollectionViewsProvider","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","ViewToolbarAction","DataTableRendererThemeColor","light","dark","foreground","DataTableRendererColumnStat","type","bins","limit","DataTableRendererBadgePalette","DataTableRendererColumnRenderer","stops","Array","value","color","categories","palette","DataTableRendererColumn","id","label","groupable","filterable","description","icon","hidden","stat","renderer","DataTableRendererRow","values","Record","resource","DataTableRendererQueryResult","rows","columns","DataTableRendererQueryContext","modeId","filter","sorts","settings","DataTableRendererSavedView","DataTableRendererRowAction","commandId","destructive","run","row","Promise","DataTableRendererSelectionAction","DataTableRendererContribution","title","toolbarActions","resourceKind","selectionMode","selectionActions","rowActions","initialPageSize","pageSizeOptions","defaultSettings","Partial","defaultFilter","defaultSorts","defaultViews","defaultActiveViewId","viewsProvider","emptyTitle","emptyDescription","contextKeys","executeQuery","context","signal","AbortSignal","subscribe","listener","onRowActivate","RegisteredDataTableRendererContribution","DataTableRendererStoreState","renderers","DataTableRendererRefreshEvent","dataTableRendererId","DataTableRendererImplementation","input","DataTableRendererRegistry","dataTableStore","registerDataTableRenderer","contribution","metadata","setDataTableRendererImplementation","implementation","getDataTableRenderer","listDataTableRenderers","refreshDataTableRenderer","onDidRefreshDataTableRenderer","event","createDataTableRendererRegistry","rendererRegistry","name","initialState","refreshListeners","Set","next","snapshot","getState","Error","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","Object","sort","add","delete","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","FileRendererContent","fileName","filePath","mimeType","content","dataUrl","placeholder","editable","textRenderer","emptyState","title","description","revision","FileRendererRefreshOrigin","rendererId","instanceId","operationId","FileRendererRefreshEnvelope","resourceKey","origin","FileRendererSaveResult","FileRendererContribution","id","resourceKind","load","resource","signal","AbortSignal","Promise","save","RegisteredFileRendererContribution","FileRendererStoreState","renderers","Record","FileRendererRefreshEvent","fileRendererId","FileRendererRefreshListener","event","FileRendererImplementation","input","CreateFileRendererRegistryInput","rendererRegistry","FileRendererRegistry","fileRendererStore","registerFileRenderer","contribution","metadata","setFileRendererImplementation","impl","getFileRenderer","listFileRenderers","refreshFileRenderer","onDidRefreshFileRenderer","listener","createFileRendererRegistry","name","initialState","refreshListeners","Set","implementation","requireFileRenderer","renderer","getState","Error","snapshot","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","nextRenderers","Object","values","sort","envelope","add","delete","ViewFilterGroup","ViewSort","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","AttributeDescriptor","AttributesSource","BoardColumnConfig","KanbanRendererCreateRowConfig","KanbanRendererCreateSubmission","KanbanRendererRow","KanbanRendererSavedView","KanbanRendererSettings","KanbanRendererViewsProvider","ResourceContextAction","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","ViewToolbarAction","KanbanRendererQueryState","settings","filter","sorts","KanbanRendererContribution","id","title","toolbarActions","listRowActions","Pick","resourceKind","storageScope","attributes","TNode","getBoardColumnConfig","groupKey","TIcon","hideToolbar","emptyTitle","emptyDescription","defaultSettings","Partial","defaultFilter","defaultSorts","viewsProvider","defaultViews","defaultActiveViewId","executeQuery","state","signal","AbortSignal","Promise","TRow","subscribe","listener","onRowActivate","row","getRowContextMenuActions","onAttributeChange","rowId","attributeId","value","onReorder","beforeRowId","createRow","onCreateRow","submission","onColumnAction","columnId","actionId","RegisteredKanbanRendererContribution","KanbanRendererStoreState","renderers","Record","KanbanRendererRefreshEvent","kanbanRendererId","KanbanRendererRefreshListener","event","KanbanRendererImplementation","input","CreateKanbanRendererRegistryInput","rendererRegistry","KanbanRendererRegistry","dataStore","registerKanbanRenderer","contribution","metadata","setKanbanRendererImplementation","impl","getKanbanRenderer","listKanbanRenderers","refreshKanbanRenderer","onDidRefreshKanbanRenderer","createKanbanRendererRegistry","name","initialState","refreshListeners","Set","implementation","requireKanbanRenderer","renderer","getState","Error","snapshot","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","nextRenderers","Object","values","sort","add","delete","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkbenchCore","PlaceholderContribution","RegisteredPlaceholderContribution","WorkbenchPanelContribution","WorkbenchPanelInstance","WorkbenchPanelRenderInput","workbench","panel","instance","refresh","WorkbenchRendererRegistration","id","render","input","WorkbenchRendererChangeListener","WorkbenchRendererStoreState","renderers","Record","refreshKeys","WorkbenchRendererRegistry","store","registerRenderer","renderer","getRenderer","listRenderers","refreshRenderer","onDidChange","listener","CreateWorkbenchRendererRegistryInput","initialRenderers","createWorkbenchRendererRegistry","name","initialState","registry","snapshot","getState","Error","setState","current","_removed","_refreshKey","Object","values","subscribeSelector","state","byContributionPriority","normalizeContributionMetadata","createDisposable","createWorkbenchStore","CreateTreeRendererRegistryInput","RegisteredTreeRendererContribution","TreeRendererContribution","TreeRendererImplementation","TreeRendererRefreshListener","TreeRendererRegistry","TreeRendererState","TreeRendererStoreState","createDefaultState","view","expandedNodeIds","defaultExpandedNodeIds","expandedSectionIds","defaultExpandedSectionIds","mergeDefaultSections","state","missing","filter","id","includes","length","toggleId","ids","expanded","value","createTreeRendererRegistry","input","rendererRegistry","persistence","persisted","getTreeStates","treeStore","name","initialState","trees","statesByTreeId","refreshKeysByTreeId","refreshListeners","Set","implementation","requireTree","tree","getState","Error","ensureState","current","existing","fresh","setState","persistStates","Record","Object","entries","loading","_loading","persistable","setTreeStates","updateState","update","action","next","snapshot","registry","setTreeRendererImplementation","impl","registerTreeRenderer","metadata","record","persistedState","nextState","rendererDisposable","registerRenderer","render","rendererInput","treeId","dispose","_removed","nextTrees","_removedState","nextStates","_removedRefresh","nextRefresh","getTreeRenderer","listTreeRenderers","values","sort","getBody","ctx","getTreeState","refresh","setSelectedNode","nodeId","getHeader","getFooter","getChildren","node","selectedNodeId","setNodeExpanded","nextIds","setSectionExpanded","sectionId","setLoading","event","listener","onDidRefresh","add","delete","RendererReadRequest","queryKey","load","signal","AbortSignal","publish","value","T","Promise","onProgress","onValue","onError","error","ReadJob","token","generation","run","ReadOwner","binding","pending","active","controller","AbortController","settled","queued","waiters","Set","RendererReadBinding","request","reason","dispose","RendererReadRegistry","bind","key","createRendererReadRegistry","owners","Map","disposed","release","owner","finish","clear","get","delete","isCurrent","job","schedule","queueMicrotask","undefined","resolve","then","catch","aborted","finally","Error","set","abort","Symbol","completed","add","throwIfAborted","reading","push","allSettled","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","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","createSettingsRegistry","input","hasView","initialState","collectionItems","Map","itemKey","JSON","stringify","clear","snapshot","getState","setState","Error","record","current","_removed","nextSections","nextPanels","keys","startsWith","delete","Object","values","sort","undefined","find","candidate","set","get","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","runWorkbenchEffect","WorkbenchStatusBarSlot","WorkbenchStatusBarItem","id","viewId","slot","order","isVisible","WorkbenchStatusBarRegistryState","items","Record","WorkbenchStatusBarPersistenceAdapter","getOrder","setOrder","ids","WorkbenchStatusBarPosition","beforeItemId","afterItemId","WorkbenchStatusBarRegistry","store","registerItem","item","getItem","listItems","listVisibleItems","reorderItem","position","CreateWorkbenchStatusBarRegistryInput","hasView","persistence","bySlotOrderAndId","left","right","localeCompare","createStatusBarRegistry","input","name","initialState","getState","rank","Map","map","index","Object","values","sort","leftRank","get","Infinity","rightRank","current","Error","undefined","Number","isFinite","setState","snapshot","_removed","targetId","target","Set","entry","filter","splice","indexOf","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkflowStatus","id","label","color","icon","sortOrder","isDefault","actions","WorkflowStatusAction","WorkbenchStatusSetContribution","title","query","Promise","save","statuses","RegisteredWorkbenchStatusSet","WorkbenchStatusRegistryState","statusSets","Record","values","WorkbenchStatusRegistry","store","registerStatusSet","contribution","metadata","getStatusSet","listStatusSets","getStatuses","load","validateStatusActions","set","status","actionIds","ReadonlySet","actionId","has","Error","validateStatuses","ids","Set","map","action","defaultCount","trim","add","Number","isFinite","sort","left","right","localeCompare","createStatusRegistry","name","initialState","requireSet","getState","loadingById","Map","current","setState","record","delete","snapshot","_removed","_removedValues","Object","cached","resolve","existing","get","loading","finally","input","saved","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","FileIconThemePreferenceOption","WorkbenchFileIconThemeStoreState","themes","FileIconThemeRegistry","store","register","listThemes","createFileIconThemeRegistry","name","initialState","groups","Set","sync","setState","flat","add","delete","getState","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ThemePreferenceOption","WorkbenchThemeStoreState","themes","ThemeRegistry","store","register","listThemes","createThemeRegistry","name","initialState","groups","Set","sync","setState","flat","add","delete","getState","createDisposable","Disposable","WorkbenchPanelMenuDefinition","WorkbenchRegionSize","WorkbenchViewRegistry","WorkbenchViewMenuContribution","id","ownerViewId","viewId","side","priority","mountStrategy","hiddenByDefault","regionSize","regionCollapsible","headerBorderBottom","config","WorkbenchViewMenuRegistry","registerViewMenu","menu","getViewMenu","listViewMenus","definitionsFor","placementId","viewMenuPanelId","menuId","encodeURIComponent","viewMenuConfig","undefined","viewContextId","Array","isArray","value","createWorkbenchViewMenuRegistry","input","views","menus","Map","has","Error","getView","record","set","get","delete","values","filter","map","view","title","icon","rendererId","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ControlsRendererContribution","DataTableRendererContribution","FileRendererContribution","KanbanRendererContribution","WorkbenchRendererRegistration","TreeRendererContribution","createRendererReadRegistry","RendererReadRegistry","workbenchViewIdContextKey","NativeViewBody","kind","Kind","Omit","Contribution","WorkbenchReactViewBody","render","WorkbenchViewBody","WorkbenchViewContribution","id","title","icon","body","RegisteredWorkbenchView","WorkbenchViewRegistryStoreState","views","Record","WorkbenchViewRegistry","reads","store","registerView","view","metadata","getView","viewId","listViews","refreshView","input","CreateWorkbenchViewRegistryInput","registerBody","refresh","byPriorityAndId","left","right","priority","localeCompare","createViewRegistry","name","initialState","bodies","Map","snapshot","getState","Error","set","record","setState","current","_removed","dispose","delete","Object","values","sort","refreshInput","get","WorkbenchPanelRegion","WorkbenchTabPosition","WorkbenchCore","registerArrangementCommands","core","commands","registerCommand","id","label","category","icon","execute","resetLayout","instanceId","region","position","params","type","required","options","value","args","movePanel","NavigationTarget","PlacementIdentity","contributionRefId","WorkbenchLayout","WorkbenchPanelRegion","placementIdentityKey","WorkbenchOwnedPlacementItem","shellPlacementContributionId","ResourceRef","modePlacementContributionId","pagePlacementContributionId","resourceMatchesConstraint","runUserAction","WorkbenchCore","WorkbenchCompositionAddablePanel","panelDestinations","ownsPlacement","layout","target","matches","identity","Object","values","regions","filter","region","id","some","widgets","placement","placementIdentity","activateModePlacementInstance","core","instance","getLayout","flatMap","find","candidate","movePanel","widgetId","activatePanel","AddablePanelInput","modeId","resource","AddPanel","panelId","open","openPlacementAddTarget","kind","commands","executeCommand","command","params","source","navigation","openTarget","active","getActivePanel","instanceId","canAddItem","item","binding","add","Boolean","getCommand","isCommandVisible","isCommandEnabled","addShellPanels","input","shellPlacements","listPlacements","includes","presence","multiple","cardinality","isOpen","placementId","openPlacement","addModePanels","modePlacements","panel","ref","addPagePanels","pageState","pages","store","getState","page","activePageId","getPage","undefined","slot","slots","isAvailable","pageId","slotId","openSlot","opened","p","activeWidgetId","contributionId","createOwnedAddablePanels","addable","contribution","getWidget","push","PageSlotRef","PlacementIdentity","WorkbenchRegion","WorkbenchWidgetPlacement","placementIdentityKey","NavigationTargetPage","NavigationTargetPanel","WorkbenchPageRegistryStoreState","getWorkbenchPageRegistryInternals","OwnedPlacementState","getOwnedPlacementPreparation","batchWorkbenchChanges","WorkbenchCore","getPageLocationPreparation","NavigationOperation","placementContext","state","activeModeId","modeId","pageId","activePageId","projectId","location","undefined","requirePanelPage","panel","page","Object","values","pages","find","ref","extensionId","id","Error","prepareSharedPanel","core","target","modeState","shellState","kind","placement","modePlacements","getPlacement","prepared","open","placementId","resource","identity","shellPlacements","title","prepareWorkbenchNavigation","targets","length","locations","pageLocations","mode","shell","original","store","getState","originalMode","originalShell","proposed","activate","Map","owned","resolve","resolved","restore","prepare","section","action","slot","slotId","modes","getActiveModeId","compose","reconciliation","set","region","present","Set","placements","map","final","filter","has","commit","applyOwners","apply","publishWithoutLocation","publish","result","activateModePlacementInstance","prepareWorkbenchNavigation","WorkbenchRegion","createNavigationRegistry","NavigationTargetPanel","NavigationTargetShellPanel","WorkbenchCore","PageSlotPanelRef","Extract","kind","findPagePanelOwner","core","panel","pages","listPages","find","candidate","ref","extensionId","page","id","canOpenCorePanel","target","Boolean","shellPlacements","getPlacement","modePlacements","slots","some","slot","revealPanelRegion","region","shell","setRegionOpen","sidePanel","getMode","setMode","openPageSlotTarget","store","getState","activePageId","Error","openSlot","pageId","slotId","resource","open","revealActivePanelRegion","fallback","layout","getLayout","actual","Object","values","regions","widgets","widget","widgetId","activeWidgetId","openModePlacementTarget","placement","modeId","modes","getActiveModeId","identity","openPlacement","openShellPlacementTarget","placementId","title","openCorePanelTarget","createCoreNavigationRegistry","resolveCore","resolveDispatcher","prepareNavigation","targets","canOpenPanel","canExecuteCommand","commandId","commands","getCommand","openPanelTarget","openPageTarget","result","pageLocations","navigate","ok","diagnostic","message","executeCommand","args","openHref","href","globalThis","activateInLayout","findPlacementByWidgetId","removeLocationSubPanelSelection","selectRegionActiveWidget","insertAtPosition","WorkbenchPanelRegion","WorkbenchTabPosition","workbenchPanelRegions","batchWorkbenchChanges","revealPanelRegion","WorkbenchCore","panelDestinations","createPanelArrangement","resolve","getPanelDestinations","instanceId","core","found","layout","getLayout","placement","contributionId","movePanel","destination","position","Error","some","region","regionId","includes","source","regions","remaining","widgets","filter","t","widgetId","target","next","activeWidgetId","index","visible","selected","role","restoreLayout","activeResourceKey","resourceKey","activeLocationWidgetId","reconcilePanelMenus","PlacementIdentity","placementIdentityKey","WorkbenchCore","createPlacementCloseController","resolveCore","identity","core","key","placement","Object","values","layout","getLayout","regions","flatMap","region","widgets","find","item","placementIdentity","Error","closable","kind","result","pageLocations","closePlacement","ok","diagnostic","message","modePlacements","shellPlacements","PlacementIdentity","placementIdentityKey","WorkbenchCore","createPlacementPinController","resolveCore","identity","pinned","core","key","placement","Object","values","layout","getLayout","regions","flatMap","region","widgets","find","item","placementIdentity","Error","open","tabRetention","kind","pages","pinPlacement","modePlacements","updatePlacement","shellPlacements","dockedWorkbenchRegions","PlacementIdentity","activateInLayout","findPlacementByWidgetId","getActiveLocationPlacement","removeLocationSubPanelSelection","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","workbenchRegions","composeOwnedPlacements","placementIdentityKey","ResolvedOwnedPlacement","WorkbenchOwnedWidgetPlacement","ReconcileOwnedWidgetLayoutInput","layout","modeLayout","placements","activate","ApplyOwnedWidgetLayoutReconciliationInput","remove","RenderedOwnedPlacement","identity","region","placement","transferredFromKey","bindsToLocation","value","role","kind","Boolean","resourceKey","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","modePositions","modes","modeIndex","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","shell","mode","page","add","currentOwner","push","reconcileRegions","removedKeys","docked","desiredByKey","flatMap","regionId","pageOwnsPrimaryLocation","some","entry","placedKeys","savedWidgetOrder","replacement","activeWidgetId","opensPreviouslyEmptyRegion","hiddenByDefault","visible","normalizeRemovedState","activeLocation","activeLocationWidgetId","fallbackLocation","active","fallbackActive","activeResourceKey","bindOwnedSubPanelsToLocation","fromEntries","desiredPlacement","updateOwnedWidgetLayout","size","desiredByIdentity","reconcileOwnedWidgetLayout","keys","applyOwnedWidgetLayoutReconciliation","dockedWorkbenchRegions","reconcileOwnedWidgetLayout","getWorkbenchPageRegistryInternals","emptyPageState","pageStateKey","clearOwnedPlacementState","getOwnedPlacementPreparation","createDisposable","batchWorkbenchChanges","WorkbenchCore","resetWorkbenchLayout","core","current","pages","store","getState","page","activePageId","undefined","projectId","location","mode","modePlacements","shell","shellPlacements","modeState","staticOverrides","Map","resourceInstances","shellState","declaration","listPlacements","activeModeId","id","includes","region","internals","next","prepare","pageId","resource","action","pageStates","resources","resolve","layout","getLayout","defaults","getInitialState","cleared","regions","Object","fromEntries","entries","map","widgets","activeWidgetId","locationSubPanelSelections","activeLocationWidgetId","apply","restoreLayout","placements","activate","reconciliation","p","identity","publish","createLayoutResetController","listeners","Set","resetLayout","listener","onDidResetLayout","add","delete","PlacementIdentity","ResourceRef","resourceKey","placementIdentityKey","getOwnedPlacementPreparation","batchWorkbenchChanges","WorkbenchCore","removeWorkbenchResource","core","resource","retained","projectId","pages","store","getState","retainedKeys","Set","map","kind","const","registry","modePlacements","shellPlacements","preparation","state","resourceInstances","Map","placementId","instances","filter","instance","identity","instanceKey","modeId","listPlacements","find","placement","id","has","apply","pageLocations","removeResource","isLocalizedString","NavigationTargetPage","PageLocation","PageRef","NavigationTreeRegistry","WorkbenchPageContribution","WorkbenchPageRegistry","WorkbenchPageResourceCodec","getWorkbenchPageRegistryInternals","createDisposable","WorkbenchBreadcrumbController","WorkbenchBreadcrumbItem","leavesProjectNavigation","NavigationLevelModes","WorkbenchPageLocationController","pageRefKey","ref","extensionId","id","locationsFromRoot","location","parent","targetFromLocation","kind","page","resource","section","pageTitle","title","undefined","default","$l10n","createWorkbenchPageBreadcrumbItems","input","pages","navigationTrees","modes","resources","navigate","target","pagesByRef","Map","map","locations","index","get","item","label","icon","startsLevel","normalize","length","onClick","setWorkbenchPageBreadcrumbs","breadcrumbs","setItems","connectWorkbenchPageBreadcrumbs","ownedBreadcrumbs","dispose","sync","state","store","getState","activePageId","Object","values","subscription","onDidCommit","PersistedWorkbenchPageLocation","WorkbenchPageBrowserEntry","WorkbenchPageLocationBrowser","WorkbenchPageLocationPersistence","createMemoryWorkbenchPageLocationBrowser","entries","url","index","listeners","Set","entry","notify","listener","current","push","splice","length","replace","back","forward","onPopState","add","dispose","delete","createMemoryWorkbenchPageLocationPersistence","locations","Map","load","projectId","get","save","persisted","set","contributionRefId","defaultPageResourceCodec","resourceKey","LayoutModel","WorkbenchRegion","createPlacement","WorkbenchLayout","WorkbenchWidgetPlacement","applyOwnedWidgetLayoutReconciliation","reconcileOwnedWidgetLayout","placementIdentityKey","WorkbenchModePlacementRegistry","WorkbenchModeRegistry","activateWorkbenchPageMode","isPageSlotClosable","pagePlacementDeclarations","CreateWorkbenchPageRegistryInput","createWorkbenchPageRegistry","WorkbenchPagePlacementInput","WorkbenchPageRegistry","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","getWorkbenchPageRegistryInternals","createOwnedPlacementState","getOwnedPlacementPreparation","WorkbenchShellPlacementRegistry","WorkbenchViewMenuRegistry","pagePlacementContributionId","registerWorkbenchViewPlacement","WorkbenchViewRegistry","createDisposable","ConnectWorkbenchPageRuntimeInput","loadModeLayout","projectId","modeId","beforeApply","state","revealRegion","region","layout","modes","registry","syncOwnedPanelMenus","ownedPlacements","Object","values","getLayout","regions","flatMap","widgets","filter","placement","Boolean","placementIdentity","owner","getWidget","contributionId","menuId","ownedPanelMenuIds","menu","openWidget","pinned","role","viewId","rendererId","resource","title","endsWith","label","reconcilePanelMenus","bindPlacementsToActivePageLocation","ownerResourceKey","location","placements","map","value","identity","kind","applyPageState","input","source","storeBeforeTransition","store","getState","previousScope","getPersistenceScope","activeModeId","stored","latest","activation","reconciliation","activate","length","layoutInput","modeLayout","undefined","ReturnType","remove","restoreLayout","connectWorkbenchPageRuntime","applyingTransition","runtime","connectRuntime","scope","onDidChangePersistenceScope","dispose","toTabState","open","tabRetention","const","toWidgetPlacement","views","view","getView","Error","panelId","pageId","slotId","panel","encodeURIComponent","closable","section","CreateLiveWorkbenchPageRegistryInput","restorePageState","modePlacements","shellPlacements","resources","viewMenus","createLiveWorkbenchPageRegistry","validateMode","getMode","resolveShellPlacements","context","resolvePlacements","resolveModePlacements","resolvePagePlacement","valuesEqual","left","right","JSON","stringify","registerPagePlacements","page","registrations","slot","item","binding","id","singleton","cardinality","registration","reverse","shell","apply","adopt","mode","refreshModePlacements","refreshShellPlacements","defaultPageResourceCodec","PageLocation","WorkbenchLayout","pageSlots","WorkbenchPageContribution","WorkbenchPageRuntimeState","WorkbenchPageSlotInstance","SINGLE_RESOURCE_INSTANCE_KEY","resourceMatchesConstraint","createWorkbenchInput","WorkbenchPagePersistenceScopeInput","pageStateFromLayout","page","layout","placements","Object","values","regions","flatMap","region","widgets","openStaticSlotIds","resourceInstances","Record","activePrimaryInstanceKey","slot","matching","filter","placement","placementIdentity","kind","pageId","id","slotId","item","length","push","binding","instances","identity","resource","instanceKey","cardinality","section","open","tabRetention","const","slice","role","active","find","activeLocationWidgetId","widgetId","instance","undefined","loadWorkbenchLocationLayout","input","context","scope","resolvePagePersistenceScope","persistence","getSnapshot","layoutPersistence","getLayout","createPageStateRestorer","location","projectId","modeId","some","ResourceRef","resourceKey","LayoutPersistenceAdapter","WorkbenchLayout","WorkbenchWidgetPlacement","workbenchRegions","runWorkbenchEffect","createWorkbenchInput","selectPlacements","layout","include","placement","regions","id","region","widgets","filter","activeWidgetId","some","widget","widgetId","undefined","modeScope","projectId","modeId","JSON","stringify","createWorkbenchLayoutCache","input","scopes","Set","adapter","persistence","getLayout","scope","getSnapshot","setLayout","setSnapshot","flush","dispose","layoutPersistence","read","add","write","removeResource","resource","snapshot","p","placementIdentity","kind","savedWidgetOrder","map","readMode","saveMode","LayoutModel","WorkbenchRegion","createDisposable","Disposable","WorkbenchSidePanelController","WorkbenchSidePanelMode","WorkbenchSidePanelPresentation","WorkbenchShellOpenRegion","WorkbenchShellRegionState","open","size","WorkbenchShellController","getRegionState","region","setRegionOpen","setRegionSize","getSidePanelPresentation","setSidePanelPresentation","presentation","onDidChange","listener","createWorkbenchShellController","input","layout","sidePanel","state","getLayout","regions","visible","setMode","getMode","setRegionVisible","sidePanelMode","notify","nextLayout","nextSidePanelMode","unsubscribeLayout","store","subscribeSelector","sidePanelSubscription","dispose","resourceKey","LayoutModel","getAnchorResource","reconcileAnchors","ResourceRef","ResourceRegistry","createDisposable","Disposable","createScopedIsInScope","resources","resource","hasProvider","listProviders","some","provider","kind","type","listResources","entry","CreatePrimaryCoordinatorInput","layout","isInScope","primary","createPrimaryCoordinator","changingPersistenceScope","willChangeScope","onWillChangePersistenceScope","didChangeScope","onDidChangePersistenceScope","unsubscribe","store","subscribe","state","previous","previousPrimaryKey","action","removeWidgetPlacement","widgetId","dispose","WorkbenchShellOpenRegion","KeybindingSequence","workbenchCommandPaletteMenuPath","WorkbenchCore","SIDENAV_PANEL_ID","togglePanel","workbench","region","shell","setRegionOpen","getRegionState","open","BuiltinCommand","id","label","icon","keybinding","execute","builtinCommands","commandPalette","toggle","initialQuery","view","pageLocations","goBack","goForward","registerWorkbenchBuiltIns","command","commands","registerCommand","category","when","keybindings","registerKeybinding","action","kind","commandId","layout","registerMenuItem","group","createWorkbenchCompositionController","createOwnedAddablePanels","createPrimaryCoordinator","createScopedIsInScope","workbenchViewIdContextKey","registerWorkbenchBuiltIns","createWorkbenchInput","WorkbenchCore","createCoreCompositionController","resolveCore","getActiveMode","core","modeId","modes","getActiveModeId","getMode","undefined","getLayout","layout","getResource","getPrimaryResource","listWidgets","listOwnedAddablePanels","mode","region","resource","id","connectWorkbenchCoreState","input","store","subscribe","state","activeRegion","focus","getActiveRegion","regions","visible","clearFocus","subscribeSelector","activeId","activeWidgetId","Object","values","flatMap","widgets","find","placement","widgetId","viewId","context","set","delete","fireImmediately","isInScope","resources","activeWorkbenchResource","candidate","primaryWorkbenchResource","pages","getState","location","createNavigationTreeRegistry","NavigationTreeMoveContext","TreeNode","createCoreRenderers","createWorkbenchNavigationTrees","renderers","ReturnType","subscribeViewRefresh","viewId","listener","onDidRefresh","treeId","getViewDefaultExpandedSectionIds","getTreeRenderer","defaultExpandedSectionIds","getViewSections","context","getBody","getViewChildren","node","getChildren","moveViewNode","source","target","moveNavigationNode","moveNode","state","getTreeState","refresh","setSelectedNode","nodeId","createControlsRendererRegistry","createDataTableRendererRegistry","createFileRendererRegistry","createKanbanRendererRegistry","createWorkbenchRendererRegistry","createTreeRendererRegistry","createWorkbenchInput","WorkbenchRenderers","createCoreRenderers","input","rendererRegistry","persistence","treePersistence","ContributionMetadata","ControlsRendererRegistry","DataTableRendererRegistry","FileRendererRegistry","KanbanRendererRegistry","WorkbenchRendererRegistry","TreeRendererRegistry","WorkbenchViewContribution","ViewBodyRegistries","Pick","refreshable","dispose","registration","T","refresh","input","createWorkbenchViewBodyRegistration","registries","view","metadata","body","kind","registerRenderer","id","render","refreshRenderer","_kind","definition","registerTreeRenderer","title","icon","registerFileRenderer","refreshFileRenderer","Parameters","registerControlsRenderer","refreshControlsRenderer","registerKanbanRenderer","refreshKanbanRenderer","registerDataTableRenderer","refreshDataTableRenderer","createStatusBarRegistry","createWorkbenchViewMenuRegistry","createWorkbenchViewBodyRegistration","createViewRegistry","createWorkbenchInput","WorkbenchRenderers","createCoreViews","input","renderers","views","registerBody","viewMenus","statusBar","hasView","viewId","Boolean","getView","persistence","statusBarPersistence","ResourceRef","ContributionMetadata","ContributionSource","Disposable","createDisposable","WorkbenchCore","WorkbenchModuleContribution","WorkbenchModuleContributionContext","WorkbenchModuleActivationResult","withModuleMetadata","input","ownerId","source","metadata","toDisposables","result","Array","isArray","disposeDisposables","disposables","index","length","dispose","CreateModuleContextInput","contextScopeId","track","disposable","createModuleContext","core","contextScope","context","createScope","TDisposable","openPanel","_openPanel","openWidget","_openWidget","registerPanel","_registerPanel","registerPanelMenu","_registerPanelMenu","registerPlaceholder","_registerPlaceholder","registerWidget","_registerWidget","moduleLayout","layout","registerChildModule","module","registerModule","onDidChangePrimaryResource","listener","resource","onDidChangeActiveResource","breadcrumbs","setItems","items","onDidChange","commandPalette","set","key","value","delete","focus","commands","registerCommand","command","handler","onDidExecuteError","keybindings","registerKeybinding","keybinding","registerMenuItem","path","item","onWillChangePersistenceScope","onDidChangePersistenceScope","modes","registerMode","mode","activate","modeDisposables","modeContext","id","push","returnedDisposables","onDidChangeActive","modePlacements","registerPlacement","placement","shellPlacements","navigation","registerParser","parser","navigationTrees","registerContribution","contribution","notifications","show","notification","overlays","registerOverlay","overlay","placeholders","placeholder","pages","registerPage","page","panelMenuState","preferences","registerSchema","schema","resources","onWillRemove","registerKind","kind","registerHierarchyProvider","provider","registerProvider","views","registerView","view","viewMenus","registerViewMenu","menu","settings","registerSection","section","panel","statusBar","registerItem","statuses","registerStatusSet","statusSet","shell","sidePanel","themes","register","fileIconThemes","createDisposable","Disposable","WorkbenchCore","createModuleContext","disposeDisposables","toDisposables","createWorkbenchModuleRegistry","resolveCore","Pick","moduleRecords","Map","disposable","registerModule","module","has","id","Error","disposables","registration","get","delete","record","set","context","contextScopeId","ownerId","source","track","push","activate","error","dispose","unregisterModule","moduleId","defaultPageResourceCodec","workbenchPages","createWorkbenchBreadcrumbController","createWorkbenchCommandPaletteController","registerArrangementCommands","createPanelArrangement","createPlacementCloseController","createPlacementPinController","createLayoutResetController","removeWorkbenchResource","createWorkbenchFocusController","connectWorkbenchPageBreadcrumbs","createWorkbenchPageLocationController","createMemoryWorkbenchPageLocationBrowser","createMemoryWorkbenchPageLocationPersistence","createLiveWorkbenchPageRegistry","createPageStateRestorer","loadWorkbenchLocationLayout","createWorkbenchLayoutCache","createWorkbenchPanelMenuStateController","createWorkbenchShellController","createWorkbenchSidePanelController","createWorkbenchTerminalController","createCommandPaletteResourceRegistry","createCommandRegistry","createKeybindingRegistry","createLayoutModel","LayoutPersistenceAdapter","WorkbenchWidgetPlacement","createMenuRegistry","createWorkbenchModePlacementRegistry","createWorkbenchModeRegistry","createNavigationTreeRegistry","createNotificationRegistry","createWorkbenchOverlayRegistry","WorkbenchPageRegistryStoreState","createWorkbenchPlaceholderRegistry","createWorkbenchShellPlacementRegistry","createPreferenceRegistry","createResourceRegistry","createSettingsRegistry","createStatusRegistry","createFileIconThemeRegistry","createThemeRegistry","createContextKeyService","createDisposable","activeWorkbenchResource","connectWorkbenchCoreState","createCoreCompositionController","primaryWorkbenchResource","createCoreNavigationRegistry","revealPanelRegion","createWorkbenchNavigationTrees","createCoreRenderers","createWorkbenchInput","WorkbenchCore","createCoreViews","createWorkbenchModuleRegistry","setWorkbenchRenderers","createPagePersistenceScopeHandler","input","layout","Pick","ReturnType","panelMenuState","resolveScope","resolvePagePersistenceScope","undefined","state","resolved","currentScope","getPersistenceScope","modeId","activeModeId","pageId","activePageId","projectId","resource","location","setPersistenceScope","scope","carryRegionState","carryRegions","createPageLocations","registry","navigationTrees","modes","browser","pageLocationBrowser","persistence","pageLocationPersistence","startPage","start","disposeLayoutPersistence","flush","dispose","createWorkbench","context","commands","renderers","layoutCache","cachedInput","layoutPersistence","locationAwareLayout","defaultRegionVisibility","defaultPanelOpenByRegionId","side","initialSidePanelMode","getRegionSettings","regionId","core","getActiveModeId","activeMode","getMode","regionSettings","establishLocation","layoutModel","focus","isRegionFocusable","region","getLayout","regions","visible","views","viewMenus","statusBar","pageResources","modePlacements","loadLayout","readMode","getProjectId","pages","store","getState","getPanel","getWidget","registerPanel","shellPlacements","activatePanel","getScope","enteredWithPersistedLayout","onDidChangePersistenceScope","overlays","placeholders","breadcrumbs","panelMenuStatePersistence","resources","remove","retained","removeResource","getPrimary","getPrimaryResource","resolveView","getView","resolveContext","sidePanel","getFloatingPanels","floatingPanels","onDidChangePolicy","onDidChangeActive","initialMode","shell","loadModeLayout","beforeApply","restorePageState","revealRegion","pageLocations","composition","navigation","closePlacement","pinPlacement","commandPalette","host","getSnapshot","restoreSnapshot","snapshot","restoreLayout","scopeInput","keybindings","notifications","preferences","preferencePersistence","treeViews","getTreeState","setNodeExpanded","setSectionExpanded","setSelectedNode","commandPaletteResources","settings","hasView","viewId","Boolean","statuses","terminal","themes","fileIconThemes","getActiveResource","Promise","all","reads","onDidChangeActiveResource","listener","subscribeSelector","activeResourceKey","onDidChangePrimaryResource","registerChildModule","module","registerModule","subscribe","saveMode","breadcrumbSources","locations","defaultPageResourceCodec","normalizeContributionMetadata","workbenchRegionTabAddMenuPath","placementIdentityKey","createWorkbenchStore","headerTrailingMenuPath","createDisposable","headerLeadingMenuPath","runWorkbenchEffect","reconcileAnchors","isWorkbenchModePanelAvailable","applyModePanelAvailability","resolveAnchorRegion","restoreUnscopedModeLayout","panelsForMode","createKeybindingRegistry","workbenchTopHeaderLeadingMenuPath","workbenchTopHeaderTrailingMenuPath","resourceContextMenuPath","getAnchorResource","byContributionPriority","getKeybindingSteps","standardResourceIcons","workbenchRegions","getNavigationTargetKey","notifyWorkbenchChange","disposeReverse","reconcileOwnedPlacements","getWorkbenchModePanelForRegion","toPanelContribution","toOpenWidgetInput","toPanelInstance","workbenchResourceTypeContextKey","setLocationSubPanelSelection","createContextKeyService","activateInLayout","resourceHierarchyCycleCode","workbenchPanelMenuRegions","rendererReadKey","findPlacement","createWorkbenchSelectionResourceMetadata","getActiveLocationPlacement","getWorkbenchSelectionResourceKeys","getActivePlacement","workbenchResourceOwnerContextKey","selectRegionActiveWidget","workbenchResourceMetadataContextKey","replaceRegionWidgets","runUserAction","workbenchRegionTabLeadingMenuPath","workbenchCommandPaletteMenuPath","createResourceRegistry","findPlacementByWidgetId","workbenchResourceIdContextKey","removePlacementsForContribution","setWorkbenchRenderers","isWorkbenchPanelPlacementVisible","matchesContextExpression","closeWidgetInLayout","removeLocationSubPanelSelection","restoreModeLayout","settleReadBatch","createUniqueWidgetId","createWorkbenchResourceContextValues","findResourcePlacement","workbenchSelectionResourceKeyMetadataKey","resolveUniqueWidgetId","batchWorkbenchChanges","workbenchPanelRegions","isWorkbenchViewHierarchyNode","composeOwnedPlacements","createNavigationTreeRegistry","defaultPageResourceCodec$1","dockedWorkbenchRegions$1","createWorkbenchBreadcrumbController","store","items","unsubscribe","state","listener","createWorkbenchCommandPaletteController","internal","input","setOpenState","current","next","openInput","confirmation","resolve","confirmed","request","value","buildUpdatedPlacement","placement","update","widget","resourceKey","createPlacement","spec","createRegionState","createDefaultWorkbenchLayout","createRegion","id","regionVisibility","findLastWidgetIndex","index","widgets","widgetId","normalizeWidgetIds","widgetIds","regions","activeWidgetId","layout","activeResourceKey","region","originalActiveWidgetId","activeIndex","normalizedActiveWidgetId","mergeWithDefaultRegions","defaults","persistedRegions","persisted","createRegionQueries","persistedSize","getLayout","regionId","size","getWidgets","getPlaceholder","createContributionLists","getPlaceholders","createContributionRegistrations","placeholder","placeholderContribution","record","metadata","priority","snapshot","_removed","nextPlaceholders","widgetContribution","reuse","singleton","nextWidgets","nextLayout","persistLayout","createLocationEstablisher","found","instanceId","ownedPanelMenuIds","candidate","insertAtPosition","position","targetWidgetId","targetIndex","placeWidget","reorderWidgetPlacement","removePlacements","removed","shouldRemove","active","expirePreviewTabsInLayout","ownerResourceKey","createLayoutPlacementMethods","nextPlacement","currentIndex","createLayoutRegionContentMethods","setLayout","result","cleared","nextRegions","createLayoutRegionMethods","updateRegion","nextRegion","visible","mode","carryPinnedWorkbenchChrome","incoming","pinned","contributionIds","incomingRegion","carryWorkbenchRegionState","regionIds","resolveScopedLayout","defaultRegionVisibility","createScopeEvent","listeners","createLayoutScopeMethods","currentScope","enteredWithLayout","willChangeScope","didChangeScope","nextScope","scopedLayout","withPinnedChrome","scopeInput","openOwnedPanelMenus","panelMenuId","panelMenu","findReusablePlacement","withPlacementRole","findReplacementIndex","replacementWidgetId","defaultTabPosition","before","requireWidget","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","updated","applyAndActivate","replaceActive","replacement","replacementIndex","reuseExistingPlacement","withoutExisting","copy","insertWidget","openWidget","placementInput","previewContent","defaultPanelTabRetention","createPanelLayoutMethods","activeInstanceId","menuRegions","menuSide","ownerContributionId","getWidget","contributionId","ownerPlacement","resolveMenuPlacements","placements","moves","seen","changed","owner","bound","target","reconcilePanelMenuOwnership","menuRegion","resolved","move","createOwnedMenuMethods","reconcilePanelMenus","panelMenuContribution","contribution","menu","panel","fallbackRegion","side","kind","registerPanelContribution","panelContribution","registrations","panelMenus","registeredPanel","registerWidget","error","registration","createPanelRegistrations","requireRegisteredWidget","createLayoutModel","initialLayout","regionQueries","contributionLists","scopeMethods","action","regionMethods","regionContentMethods","contributionRegistrations","panelRegistrations","widgetOpeners","placementMethods","panelMethods","ownedMenus","establishLocation","options","modeRegistryInternals","setWorkbenchModeRegistryInternals","registry","internals","activateWorkbenchPageMode","modeId","applyLayout","seedModeScope","locationEstablished","unsubscribeMainPanel","establishSeededLocation","primary","context","toDisposables$1","createWorkbenchModeRegistry","initializedModes","seededScopes","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","disposables","prepareScope","scopeKey","availableLayout","reconcileScope","transitionToMode","previousModeId","unscoped","disposeActive","activate","activatePageMode","contextScope","scopeSubscription","activeModeId","registryDisposable","rest","setActiveInput","registerWorkbenchViewPlacement","view","views","_role","_viewId","viewMenus","modePlacementContributionId","placementId","pagePlacementContributionId","pageId","slotId","allowedPanelDestinations","policy","panelDestinations","core","declaration","p","legacyPanel","isOpenSingleton","scopedResourceKey","resource","addModePanels$1","addRegisteredPanels","createWorkbenchCompositionController","open","location","modePanels","addable","workbenchFocusRegions","focusContextByRegion","createWorkbenchFocusController","applyContext","focusRegion","findPage","pages","levelOwner","page","leavesProjectNavigation","resolveNavigationLevels","levels","level","resolveRootLevelLocation","rootLevel","pinnedOnly","sections","section","node","mergeSections","merged","createLevelNavigation","queries","host","ordered","slot","read","signal","all","registryInternals","setWorkbenchPageRegistryInternals","getWorkbenchPageRegistryInternals","hasResolvableCurrentPageUrl","actions","projectId","createPageLocationControllerActions","isWorkbenchProjectUrl","history","workbenchPageRefKey","ref","pageForRef","pageForId","canonicalSection","anchors","anchor","cloneMetadata","canonicalResource","normalized","resources","canonical","canonicalPageRef","sectionKey","resourceKey$1","sharesPageResource","left","right","workbenchPageLocationRouteKey","document","workbenchPageLocationKey","own","workbenchPageLocationsEqual","canonicalPosition","createLocation","key","isFileSourcePosition","declaredParent","parent","normalizeResolvedLocation","routeKey","inheritedParent","normalizePageTarget","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","normalize","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","createPageHistoryEntry","serializeWorkbenchPageUrl","createPageLocationFailureHandler","diagnostic","report","preparations$1","setPageLocationPreparation","controller","preparation","getPageLocationPreparation","createPageLocationPublisher","nextIndex","hooks","beforePublish","usesResource","matches","createRootLevelLocationTracker","saved","connectPageOwnerRemoval","previous","createPagePlacementCloser","closeToParent","resolution","closeWithinPage","identity","PAGE_MAIN_SLOT_ID","isPageSlotClosable","primarySlot","_kind","presentation","binding","pageSlots","main","requirePageSlot","emptyMainSlot","pagePlacementDeclarations","empty","pageStateKey","removePageStates","states","removePageResource","removedKey","keep","retained","pageStates","stateKey","resourceInstances","instances","instance","remaining","activePrimaryInstanceKey","createPageResourceRemover","isHistoryState","createWorkbenchPageLocationController","historyIndex","maxHistoryIndex","historyStore","publishHistory","resetHistory","fail","historyEntry","normalizeStored","start","publish","push","commit","resolveUrl","parsed","parseWorkbenchPageUrl","entry","direct","contextual","directKey","contextualKey","restore","browserEntry","hasProjectUrl","useCurrentUrl","fromUrl","source","fallbackError","popStateSubscription","pageRemovalSubscription","closeActivePlacement","createWorkbenchPanelMenuStateController","resolveOpenByMenuId","persistState","isOpen","menuId","scope","createWorkbenchSidePanelController","canFloat","resolveMode","defaultPresentation","getMode","notify","DEFAULT_SESSION_TITLE","SESSION_HISTORY_LIMIT","createWorkbenchTerminalController","opener","adapters","adapterDisposers","dataHistory","dataSubscribers","sessionIdByBindingId","bindingIdBySessionId","pendingSessionByBindingId","patchSession","session","sessionId","patch","requireAdapter","adapter","cleanupSession","bindingId","disposers","dispose","publishData","chunk","subscriber","kill","pending","openSession","unsubscribeTitle","opened","unsubscribes","sink","onData","subscribers","running","createCommandPaletteResourceRegistry","provider","providers","results","createCommandRegistry","errorListeners","requireCommand","emitError","event","command","args","prepare","onArgsChange","menuPathKey","path","createMenuRegistry","menuStore","deps","item","list","filtered","resourceMatchesConstraint","constraint","SINGLE_RESOURCE_INSTANCE_KEY","placementItemViewId","contributionRefId","createOwnedPlacementState","isStaticPlacementOpen","staticPlacementClosable","validateOwnedPlacementItem","label","openStaticPlacement","closeStaticPlacement","retainResourceInstances","resourceInstanceKey","shown","taken","instanceKey","suffix","openResourcePlacement","closeOwnedPlacementInstance","updateResourcePlacementInstance","clearOwnedPlacementState","preparations","setOwnedPlacementPreparation","getOwnedPlacementPreparation","prepareOwnedPlacement","operation","restoreOwnedPlacementState","identityFor$1","tabState$1","placementRefKey","validatePlacement","refKey","refs","copyPlacement","createWorkbenchModePlacementRegistry","listPlacements","runtime","emitChange","title","declarations","registered","prepared","byPriorityAndId$1","noDispatcher","dispatchItem","dispatcher","validateItem","isNavigationTarget","toItems","createNavigationRegistry","resolveDispatcher","removeKey","parser","parserContribution","createNotificationRegistry","generatedId","emit","notification","ids","overlayContributionId","createWorkbenchOverlayRegistry","overlays","overlay","emptyPageState","staticSlotOpen","nextResourceInstances","openResourceSlot","selectPrimaryTarget","pageResourceBindingSlots","openPageResourceBindings","setStaticSlotOpen","removeResourceInstance","closePageSlot","activateInstanceKey","resolvePagePlacementClose","pageState","closedActivePrimary","activeInstanceKey","activeInstance","pinPagePlacement","pagePlacementIdentity","pageFollowerIdentities","slots","validatePageSlots","validateWorkbenchPage","placementFor","resolvePagePlacements","emptyReconciliation$1","createPageRegistryStore","resolveModePlacementSet","refreshActiveModePlacements","refreshShellPlacements","createPagePreparation","normalizeResource","resourceKey$2","requirePage","compose","modePlacements","owned","shell","composed","reconciliation","normalizedTarget","primaryState","openFollowers","followers","emptyReconciliation","registerWorkbenchPage","placementRegistration","_page","createWorkbenchPageRegistry","publishingState","publishState","storeBeforeRuntime","previousPublishingState","activatePageWithStates","apply","createWorkbenchPlaceholderRegistry","shellPlacementContributionId","identityFor","roleForRegion","tabState","createWorkbenchShellPlacementRegistry","restorePlacement","previousContext","valueKey","name","createMemoryPreferencePersistence","values","createPreferenceRegistry","persistence","registeredNames","schema","additions","property","scoped","userValue","createControlsRendererRegistry","controlsStore","refreshListeners","implementation","requireControlsRenderer","renderer","impl","rendererDisposable","rendererRegistry","rendererInput","nextRenderers","createDataTableRendererRegistry","dataTableStore","renderers","createFileRendererRegistry","fileRendererStore","requireFileRenderer","envelope","createKanbanRendererRegistry","dataStore","requireKanbanRenderer","createWorkbenchRendererRegistry","_refreshKey","refreshKeys","createDefaultState","mergeDefaultSections","missing","toggleId","expanded","createTreeRendererRegistry","treeStore","requireTree","tree","ensureState","fresh","persistStates","statesByTreeId","_loading","persistable","updateState","persistedState","nextState","nextTrees","_removedState","nextStates","_removedRefresh","nextRefresh","ctx","nodeId","nextIds","sectionId","loading","createRendererReadRegistry","owners","disposed","release","finish","isCurrent","job","schedule","token","reason","generation","completed","reading","byOrderThenPriority","createSettingsRegistry","collectionItems","itemKey","panelId","itemId","nextSections","nextPanels","bySlotOrderAndId","createStatusBarRegistry","listItems","rank","order","leftRank","rightRank","targetId","validateStatusActions","actionId","status","actionIds","set","validateStatuses","defaultCount","statuses","createStatusRegistry","requireSet","loadingById","query","statusSets","_removedValues","cached","createFileIconThemeRegistry","groups","sync","themes","createThemeRegistry","viewMenuPanelId","viewMenuConfig","createWorkbenchViewMenuRegistry","menus","ownerViewId","workbenchViewIdContextKey","byPriorityAndId","createViewRegistry","bodies","body","viewId","refreshInput","registerArrangementCommands","ownsPlacement","activateModePlacementInstance","openPlacementAddTarget","canAddItem","addShellPanels","multiple","add","addModePanels","addPagePanels","createOwnedAddablePanels","placementContext","requirePanelPage","prepareSharedPanel","modeState","shellState","prepareWorkbenchNavigation","targets","locations","original","originalMode","originalShell","proposed","present","final","applyOwners","findPagePanelOwner","canOpenCorePanel","revealPanelRegion","openPageSlotTarget","revealActivePanelRegion","fallback","openModePlacementTarget","openShellPlacementTarget","openCorePanelTarget","createCoreNavigationRegistry","resolveCore","commandId","href","createPanelArrangement","destination","t","selected","createPlacementCloseController","createPlacementPinController","bindsToLocation","resolveOwnerResourceKey","desired","exact","transfer","indexCurrentOwnedPlacements","indexed","findModePlacementTransfer","desiredIdentity","currentKey","indexCurrentWidgetOwners","restoreModeWidgets","currentIds","restored","positions","a","b","modePositions","modes","modeIndex","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","desiredKeys","transferredCurrentKeys","transferredFromKey","currentOwner","reconcileRegions","docked","desiredByKey","pageOwnsPrimaryLocation","placedKeys","modeLayout","removedKeys","opensPreviouslyEmptyRegion","normalizeRemovedState","activeLocation","fallbackLocation","activeLocationWidgetId","fallbackActive","bindOwnedSubPanelsToLocation","desiredPlacement","updateOwnedWidgetLayout","desiredByIdentity","reconcileOwnedWidgetLayout","applyOwnedWidgetLayoutReconciliation","resetWorkbenchLayout","createLayoutResetController","removeWorkbenchResource","retainedKeys","pageRefKey","locationsFromRoot","targetFromLocation","pageTitle","isLocalizedString","createWorkbenchPageBreadcrumbItems","pagesByRef","setWorkbenchPageBreadcrumbs","connectWorkbenchPageBreadcrumbs","ownedBreadcrumbs","subscription","createMemoryWorkbenchPageLocationBrowser","entries","createMemoryWorkbenchPageLocationPersistence","syncOwnedPanelMenus","ownedPlacements","bindPlacementsToActivePageLocation","applyPageState","previousScope","stored","latest","storeBeforeTransition","activation","layoutInput","connectWorkbenchPageRuntime","applyingTransition","toTabState","toWidgetPlacement","createLiveWorkbenchPageRegistry","closable","pageStateFromLayout","openStaticSlotIds","matching","loadWorkbenchLocationLayout","createPageStateRestorer","selectPlacements","include","modeScope","createWorkbenchLayoutCache","scopes","write","createWorkbenchShellController","sidePanelMode","nextSidePanelMode","unsubscribeLayout","sidePanelSubscription","createScopedIsInScope","createPrimaryCoordinator","changingPersistenceScope","previousPrimaryKey","SIDENAV_PANEL_ID","togglePanel","workbench","builtinCommands","registerWorkbenchBuiltIns","createCoreCompositionController","connectWorkbenchCoreState","activeRegion","activeId","activeWorkbenchResource","primaryWorkbenchResource","createWorkbenchNavigationTrees","treeId","moveNavigationNode","createCoreRenderers","refreshable","createWorkbenchViewBodyRegistration","registries","definition","createCoreViews","withModuleMetadata","toDisposables","disposeDisposables","createModuleContext","track","disposable","_openPanel","_openWidget","_registerPanel","_registerPanelMenu","_registerPlaceholder","_registerWidget","moduleLayout","module","ownerId","handler","keybinding","modeDisposables","modeContext","returnedDisposables","statusSet","createWorkbenchModuleRegistry","moduleRecords","moduleId","createPagePersistenceScopeHandler","resolveScope","panelMenuState","createPageLocations","workbenchPages","disposeLayoutPersistence","createWorkbench","commands","layoutCache","cachedInput","layoutModel","activeMode","focus","pageResources","shellPlacements","navigationTrees","placeholders","breadcrumbs","sidePanel","pageLocations","composition","navigation","defaultPageResourceCodec","dockedWorkbenchRegions"],"sources":["../src/core/controllers/breadcrumbs/breadcrumb-registry.ts","../src/core/controllers/command-palette/command-palette-controller.ts","../src/core/registries/layout/widget-placement.ts","../src/core/registries/layout/layout-defaults.ts","../src/core/registries/layout/layout-contribution-helpers.ts","../src/core/registries/layout/layout-location-establisher.ts","../src/core/registries/layout/layout-tab-lifecycle.ts","../src/core/registries/layout/layout-placement-methods.ts","../src/core/registries/layout/layout-region-content-methods.ts","../src/core/registries/layout/layout-region-methods.ts","../src/core/registries/layout/layout-scope.ts","../src/core/registries/layout/layout-scope-methods.ts","../src/core/registries/layout/layout-widget-openers.ts","../src/core/registries/layout/panel-layout-methods.ts","../src/core/registries/layout/panel-menu-ownership.ts","../src/core/registries/layout/panel-registration.ts","../src/core/registries/layout/layout-model.ts","../src/core/registries/modes/mode-registry-internals.ts","../src/core/registries/modes/mode-seed-scope.ts","../src/core/registries/modes/mode-registry.ts","../src/core/registries/views/view-placement.ts","../src/core/controllers/composition/panel-destinations.ts","../src/core/controllers/composition/composition-controller.ts","../src/core/controllers/focus/focus-controller.ts","../src/core/controllers/page-location/navigation-level.ts","../src/core/controllers/page-location/navigation-level-composition.ts","../src/core/registries/pages/page-registry-internals.ts","../src/core/controllers/page-location/page-location-actions.ts","../src/core/controllers/page-location/page-location-normalization.ts","../src/core/controllers/page-location/page-location-history-entry.ts","../src/core/controllers/page-location/page-location-preparation.ts","../src/core/controllers/page-location/page-location-publish.ts","../src/core/controllers/page-location/page-location-root-level.ts","../src/core/controllers/page-location/page-owner-removal.ts","../src/core/controllers/page-location/page-placement-closer.ts","../src/core/registries/pages/page-main.ts","../src/core/registries/pages/page-state-key.ts","../src/core/registries/pages/page-resource-removal.ts","../src/core/controllers/page-location/page-resource-remover.ts","../src/core/controllers/page-location/page-location-controller.ts","../src/core/controllers/panel-menus/panel-menu-state-controller.ts","../src/core/controllers/side-panel/side-panel-controller.ts","../src/core/controllers/terminal/terminal-controller.ts","../src/core/registries/command-palette-resources/command-palette-resource-registry.ts","../src/core/registries/commands/command-registry.ts","../src/core/registries/menus/menu-registry.ts","../src/core/shared/contributions/reference-id.ts","../src/core/registries/placements/placement-instance-key.ts","../src/core/registries/placements/owned-placement-lifecycle.ts","../src/core/registries/placements/owned-placement-preparation.ts","../src/core/registries/placements/owned-placement-restoration.ts","../src/core/registries/modes/mode-placement-registry.ts","../src/core/registries/navigation/navigation-registry.ts","../src/core/registries/notifications/notification-registry.ts","../src/core/registries/overlays/overlay-registry.ts","../src/core/registries/pages/page-slot-lifecycle.ts","../src/core/registries/pages/page-placement-close.ts","../src/core/registries/pages/page-placement-pin.ts","../src/core/registries/pages/page-placement-resolver.ts","../src/core/registries/pages/page-registry-state.ts","../src/core/registries/pages/page-preparation.ts","../src/core/registries/pages/page-registration.ts","../src/core/registries/pages/page-registry.ts","../src/core/registries/placeholders/placeholder-registry.ts","../src/core/registries/placements/shell-placement-registry.ts","../src/core/registries/preferences/preference-registry.ts","../src/core/registries/renderers/controls-renderer-registry.ts","../src/core/registries/renderers/data-table-renderer-registry.ts","../src/core/registries/renderers/file-renderer-registry.ts","../src/core/registries/renderers/kanban-renderer-registry.ts","../src/core/registries/renderers/renderer-registry.ts","../src/core/registries/renderers/tree-renderer-registry.ts","../src/core/registries/views/renderer-read-registry.ts","../src/core/registries/settings/settings-registry.ts","../src/core/registries/status-bar/status-bar-registry.ts","../src/core/registries/statuses/status-registry.ts","../src/core/registries/themes/file-icon-theme-registry.ts","../src/core/registries/themes/theme-registry.ts","../src/core/registries/view-menus/view-menu-registry.ts","../src/core/registries/views/view-registry.ts","../src/core/controllers/composition/arrangement-commands.ts","../src/core/controllers/composition/owned-addable-panels.ts","../src/core/controllers/navigation/compound-navigation.ts","../src/core/workbench-core-navigation.ts","../src/core/controllers/composition/panel-arrangement.ts","../src/core/controllers/composition/placement-close-controller.ts","../src/core/controllers/composition/placement-pin-controller.ts","../src/core/registries/layout/owned-placement-layout.ts","../src/core/controllers/composition/reset-workbench-layout.ts","../src/core/controllers/composition/resource-removal.ts","../src/core/controllers/page-location/page-breadcrumbs.ts","../src/core/controllers/page-location/page-location-memory.ts","../src/core/controllers/page-runtime/page-runtime.ts","../src/core/controllers/page-runtime/page-state-restoration.ts","../src/core/controllers/page-runtime/workbench-layout-cache.ts","../src/core/controllers/shell/shell-controller.ts","../src/core/controllers/primary-coordinator/primary-coordinator.ts","../src/core/workbench-built-ins.ts","../src/core/workbench-core-connections.ts","../src/core/workbench-core-navigation-trees.ts","../src/core/workbench-core-renderers.ts","../src/core/registries/views/view-body-registration.ts","../src/core/workbench-core-views.ts","../src/core/workbench-module-context.ts","../src/core/workbench-module-registry.ts","../src/core/workbench-core.ts"],"sourcesContent":["import type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkbenchBreadcrumbItem {\n title: unknown;\n icon?: string;\n indicator?: \"session-status\";\n /** The crumb leaves the project navigation: it opens a Sidenav level or a mode that replaces the Sidenav. */\n startsLevel?: boolean;\n url?: string;\n onClick?: () => void;\n resource?: ResourceRef;\n}\n\nexport type WorkbenchBreadcrumbChangeListener = () => void;\n\nexport interface WorkbenchBreadcrumbState {\n items: WorkbenchBreadcrumbItem[] | undefined;\n}\n\nexport interface WorkbenchBreadcrumbController {\n store: WorkbenchStore<WorkbenchBreadcrumbState>;\n setItems(items: WorkbenchBreadcrumbItem[]): Disposable;\n clearItems(): void;\n getItems(): WorkbenchBreadcrumbItem[] | undefined;\n onDidChange(listener: WorkbenchBreadcrumbChangeListener): Disposable;\n}\n\nexport const createWorkbenchBreadcrumbController = (): WorkbenchBreadcrumbController => {\n const store = createWorkbenchStore<WorkbenchBreadcrumbState>({\n name: \"workbench.breadcrumbs\",\n initialState: { items: undefined },\n });\n\n return {\n store,\n\n setItems(items) {\n store.setState({ items }, false, \"setBreadcrumbItems\");\n return createDisposable(() => {\n if (store.getState().items === items) {\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n }\n });\n },\n\n clearItems() {\n if (store.getState().items === undefined) return;\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n },\n\n getItems() {\n return store.getState().items;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.items,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { CommandParamSchema, WorkbenchCommandExecutionContext } from \"../../registries/commands/command-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchCommandPaletteChangeListener = (open: boolean) => void;\nexport type WorkbenchCommandPaletteView = \"main\" | \"theme\";\n\n// A pending request to collect a command's params before running it. Held on the\n// controller (not in a single React tree) so any surface — palette entries, header\n// actions, tree actions — can open the one shared params dialog.\nexport interface WorkbenchCommandParamsRequest {\n record: {\n command: {\n id: string;\n label: string;\n params?: CommandParamSchema;\n resourceMutation?: import(\"@pstdio/sdk/extensions\").CommandDefinition[\"resourceMutation\"];\n };\n };\n label: string;\n args?: unknown;\n context?: WorkbenchCommandExecutionContext;\n}\n\nexport interface WorkbenchCommandConfirmation {\n label: string;\n resolve(confirmed: boolean): void;\n}\n\nexport interface WorkbenchCommandPaletteState {\n confirmation: WorkbenchCommandConfirmation | null;\n open: boolean;\n view: WorkbenchCommandPaletteView;\n initialQuery: string;\n paramsRequest: WorkbenchCommandParamsRequest | null;\n}\n\nexport interface WorkbenchCommandPaletteOpenInput {\n view?: WorkbenchCommandPaletteView;\n initialQuery?: string;\n}\n\nexport interface WorkbenchCommandPaletteController {\n store: WorkbenchStore<WorkbenchCommandPaletteState>;\n isOpen(): boolean;\n getView(): WorkbenchCommandPaletteView;\n getInitialQuery(): string;\n getParamsRequest(): WorkbenchCommandParamsRequest | null;\n open(input?: WorkbenchCommandPaletteOpenInput): void;\n close(): void;\n toggle(): void;\n requestConfirmation(label: string): Promise<boolean>;\n requestParams(request: WorkbenchCommandParamsRequest): void;\n clearParams(): void;\n onDidChange(listener: WorkbenchCommandPaletteChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchCommandPaletteControllerInput {\n initialOpen?: boolean;\n}\n\nexport const createWorkbenchCommandPaletteController = (\n input: CreateWorkbenchCommandPaletteControllerInput = {},\n): WorkbenchCommandPaletteController => {\n const internal = createWorkbenchStore<WorkbenchCommandPaletteState>({\n name: \"workbench.commandPalette\",\n initialState: {\n open: input.initialOpen ?? false,\n view: \"main\",\n initialQuery: \"\",\n paramsRequest: null,\n confirmation: null,\n },\n });\n\n // Patches open/view/initialQuery while preserving paramsRequest, which has its own\n // lifecycle (a request can outlive the palette being closed).\n const setOpenState = (next: Pick<WorkbenchCommandPaletteState, \"open\" | \"view\" | \"initialQuery\">) => {\n const current = internal.getState();\n if (current.open === next.open && current.view === next.view && current.initialQuery === next.initialQuery) return;\n internal.setState({ ...current, ...next }, false, \"setCommandPaletteState\");\n };\n\n return {\n store: internal,\n isOpen() {\n return internal.getState().open;\n },\n getView() {\n return internal.getState().view;\n },\n getInitialQuery() {\n return internal.getState().initialQuery;\n },\n getParamsRequest() {\n return internal.getState().paramsRequest;\n },\n open(openInput = {}) {\n setOpenState({ open: true, view: openInput.view ?? \"main\", initialQuery: openInput.initialQuery ?? \"\" });\n },\n close() {\n setOpenState({ open: false, view: \"main\", initialQuery: \"\" });\n },\n toggle() {\n setOpenState({ open: !internal.getState().open, view: \"main\", initialQuery: \"\" });\n },\n requestConfirmation(label) {\n internal.getState().confirmation?.resolve(false);\n return new Promise<boolean>((resolve) => {\n const confirmation = {\n label,\n resolve: (confirmed: boolean) => {\n if (internal.getState().confirmation === confirmation)\n internal.setState({ ...internal.getState(), confirmation: null });\n resolve(confirmed);\n },\n };\n internal.setState({ ...internal.getState(), confirmation });\n });\n },\n requestParams(request) {\n internal.setState({ ...internal.getState(), paramsRequest: request }, false, \"requestCommandParams\");\n },\n clearParams() {\n if (!internal.getState().paramsRequest) return;\n internal.setState(\n { ...internal.getState(), paramsRequest: null, confirmation: null },\n false,\n \"clearCommandParams\",\n );\n },\n onDidChange(listener) {\n const unsubscribe = internal.subscribeSelector(\n (state) => state.open,\n (value) => listener(value),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { OpenWidgetInput, RegisteredWidgetContribution, WorkbenchWidgetPlacement } from \"./layout-types\";\n\nexport const buildUpdatedPlacement = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n update: OpenWidgetInput,\n): WorkbenchWidgetPlacement => {\n const next: WorkbenchWidgetPlacement = { ...placement };\n if (update.viewId !== undefined) next.viewId = update.viewId ?? undefined;\n if (update.resource === null) {\n next.resource = undefined;\n next.resourceKey = undefined;\n next.title = update.title ?? widget.title;\n } else if (update.resource) {\n next.resource = update.resource;\n next.resourceKey = resourceKey(update.resource);\n next.title = update.title ?? update.resource.label ?? widget.title;\n } else if (update.title !== undefined) {\n next.title = update.title;\n }\n if (update.pinned !== undefined) next.pinned = update.pinned;\n if (update.closable !== undefined) next.closable = update.closable;\n if (update.mountStrategy !== undefined) next.mountStrategy = update.mountStrategy;\n if (update.hiddenByDefault !== undefined) next.hiddenByDefault = update.hiddenByDefault;\n if (update.tabRetention !== undefined) next.tabRetention = update.tabRetention;\n if (update.tab !== undefined) next.tab = update.tab;\n if (update.ownerId !== undefined) next.ownerId = update.ownerId;\n if (update.source !== undefined) next.source = update.source;\n if (update.role !== undefined) next.role = update.role;\n return next;\n};\nexport const createPlacement = (\n widgetId: string,\n widget: RegisteredWidgetContribution,\n spec: OpenWidgetInput,\n): WorkbenchWidgetPlacement => ({\n widgetId,\n contributionId: widget.id,\n viewId: spec.viewId ?? undefined,\n ownerId: spec.ownerId ?? widget.ownerId,\n source: spec.source ?? widget.source,\n resource: spec.resource ?? undefined,\n resourceKey: resourceKey(spec.resource ?? undefined),\n title: spec.title ?? spec.resource?.label ?? widget.title,\n pinned: spec.pinned,\n // Tabbed (non-singleton) widgets are closable unless they opt out; singleton\n // panels stay non-closable by default.\n closable: spec.closable ?? widget.closable ?? !widget.singleton,\n mountStrategy: spec.mountStrategy ?? widget.mountStrategy,\n hiddenByDefault: spec.hiddenByDefault ?? widget.hiddenByDefault,\n tabRetention: spec.tabRetention,\n tab: spec.tab ?? widget.tab,\n role: spec.role ?? \"content\",\n});\n","import { type WorkbenchRegion, workbenchRegions } from \"./layout-regions\";\nimport type { WorkbenchLayout, WorkbenchRegionState, WorkbenchWidgetPlacement } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nconst createRegionState = (id: WorkbenchRegion, visible: boolean): WorkbenchRegionState => ({\n id,\n visible,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const createRegion = (id: WorkbenchRegion) => createRegionState(id, regionVisibility[id] ?? true);\n\n return {\n regions: {\n nav: createRegion(\"nav\"),\n activity: createRegion(\"activity\"),\n sidenav: createRegion(\"sidenav\"),\n \"main-header\": createRegion(\"main-header\"),\n \"main-left-menu\": createRegion(\"main-left-menu\"),\n main: createRegion(\"main\"),\n \"main-right-menu\": createRegion(\"main-right-menu\"),\n \"secondary-header\": createRegion(\"secondary-header\"),\n \"secondary-left-menu\": createRegion(\"secondary-left-menu\"),\n secondary: createRegion(\"secondary\"),\n \"secondary-right-menu\": createRegion(\"secondary-right-menu\"),\n \"side-header\": createRegion(\"side-header\"),\n \"side-left-menu\": createRegion(\"side-left-menu\"),\n side: createRegion(\"side\"),\n \"side-right-menu\": createRegion(\"side-right-menu\"),\n status: createRegion(\"status\"),\n overlay: createRegion(\"overlay\"),\n },\n };\n};\n\nconst findLastWidgetIndex = (widgets: WorkbenchWidgetPlacement[], widgetId: string) => {\n for (let index = widgets.length - 1; index >= 0; index -= 1) {\n if (widgets[index]?.widgetId === widgetId) return index;\n }\n return -1;\n};\n\nconst normalizeWidgetIds = (layout: WorkbenchLayout) => {\n const widgetIds = new Set<string>();\n const regions = {} as WorkbenchLayout[\"regions\"];\n let activeWidgetId = layout.activeWidgetId;\n let activeResourceKey = layout.activeResourceKey;\n\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n const originalActiveWidgetId = region.activeWidgetId;\n const activeIndex = originalActiveWidgetId ? findLastWidgetIndex(region.widgets, originalActiveWidgetId) : -1;\n const widgets = region.widgets.map((placement) => {\n const widgetId = resolveUniqueWidgetId(widgetIds, placement.contributionId, placement.widgetId);\n widgetIds.add(widgetId);\n return widgetId === placement.widgetId ? placement : { ...placement, widgetId };\n });\n const normalizedActiveWidgetId = activeIndex >= 0 ? widgets[activeIndex]?.widgetId : originalActiveWidgetId;\n regions[id] = { ...region, widgets, activeWidgetId: normalizedActiveWidgetId };\n\n if (originalActiveWidgetId && layout.activeWidgetId === originalActiveWidgetId && activeIndex >= 0) {\n activeWidgetId = normalizedActiveWidgetId;\n activeResourceKey = widgets[activeIndex]?.resourceKey;\n }\n }\n\n return { ...layout, regions, activeWidgetId, activeResourceKey };\n};\n\nexport const mergeWithDefaultRegions = (\n persisted: WorkbenchLayout,\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout(regionVisibility);\n const persistedRegions = Object.fromEntries(\n workbenchRegions.flatMap((region) => (persisted.regions[region] ? [[region, persisted.regions[region]]] : [])),\n ) as Partial<WorkbenchLayout[\"regions\"]>;\n return normalizeWidgetIds({\n ...persisted,\n regions: { ...defaults.regions, ...persistedRegions },\n });\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { getActivePlacement, removePlacementsForContribution } from \"./layout-operations\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n} from \"./layout-types\";\n\ninterface CreateRegionQueriesInput {\n getLayout(): WorkbenchLayout;\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n getPlaceholder(regionId: WorkbenchRegion): RegisteredPlaceholderContribution | undefined;\n getRegionSettings?(regionId: WorkbenchRegion): WorkbenchRegionSettings | undefined;\n}\n\nexport const createRegionQueries = (input: CreateRegionQueriesInput) => {\n const { getLayout, getWidgets, getPlaceholder } = input;\n\n return {\n getRegionSize(regionId: WorkbenchRegion) {\n const persistedSize = getLayout().regions[regionId].size;\n const placement = getActivePlacement(getLayout().regions[regionId]);\n const contributionSize = placement\n ? getWidgets()[placement.contributionId]?.regionSize\n : getPlaceholder(regionId)?.regionSize;\n const size = contributionSize ?? input.getRegionSettings?.(regionId)?.size;\n if (persistedSize === undefined) return size;\n return { ...size, defaultPx: persistedSize };\n },\n\n getRegionCollapsible(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement)\n return getPlaceholder(regionId)?.regionCollapsible ?? input.getRegionSettings?.(regionId)?.collapsible ?? true;\n return (\n getWidgets()[placement.contributionId]?.regionCollapsible ??\n input.getRegionSettings?.(regionId)?.collapsible ??\n true\n );\n },\n\n getRegionHeaderBorderBottom(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement) return true;\n return getWidgets()[placement.contributionId]?.headerBorderBottom ?? true;\n },\n };\n};\n\nexport const createContributionLists = (input: {\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n}) => {\n const { getPlaceholders, getWidgets } = input;\n\n return {\n listPlaceholders: () => Object.values(getPlaceholders()).sort(byContributionPriority),\n listWidgets: () => Object.values(getWidgets()).sort(byContributionPriority),\n };\n};\n\nexport const createContributionRegistrations = (input: {\n store: InternalWorkbenchStore<WorkbenchLayoutStoreState>;\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n persistLayout(): void;\n}) => {\n const { store, getPlaceholders, getWidgets, persistLayout } = input;\n\n return {\n registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata) {\n if (getPlaceholders()[placeholder.region]) {\n throw new Error(`Placeholder already registered: ${placeholder.region}`);\n }\n\n const { priority, ...placeholderContribution } = placeholder;\n const record: RegisteredPlaceholderContribution = {\n ...placeholderContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState(\n { ...snapshot, placeholders: { ...snapshot.placeholders, [placeholder.region]: record } },\n false,\n \"registerPlaceholder\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.placeholders[placeholder.region] !== record) return;\n const { [placeholder.region]: _removed, ...nextPlaceholders } = current.placeholders;\n store.setState({ ...current, placeholders: nextPlaceholders }, false, \"unregisterPlaceholder\");\n });\n },\n\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata) {\n if (getWidgets()[widget.id]) throw new Error(`Widget already registered: ${widget.id}`);\n\n const { priority, reuse, singleton, ...widgetContribution } = widget;\n const record: RegisteredWidgetContribution = {\n ...widgetContribution,\n reuse: reuse ?? \"resource\",\n singleton: singleton ?? true,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState({ ...snapshot, widgets: { ...snapshot.widgets, [widget.id]: record } }, false, \"registerWidget\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.widgets[widget.id] !== record) return;\n const { [widget.id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout = removePlacementsForContribution(current.layout, widget.id);\n store.setState({ widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n persistLayout();\n });\n },\n };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { findPlacementByWidgetId } from \"./layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport interface CreateLocationEstablisherInput {\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n getLayout(): WorkbenchLayout;\n getWidget(id: string): RegisteredWidgetContribution | undefined;\n panelMethods: Pick<LayoutModel, \"activatePanel\" | \"getActivePanel\">;\n}\n\nexport const createLocationEstablisher = (input: CreateLocationEstablisherInput) => (instanceId: string) => {\n const layout = input.getLayout();\n const found = findPlacementByWidgetId(layout, instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n // Sub Panels and Panel Menus stay tabs beside their Location: promoting one would\n // create a second Location and clone every Sub Panel per Location.\n if (found.regionId !== \"main\" || found.placement.role === \"sub-panel\" || found.placement.role === \"panel-menu\") {\n return input.panelMethods.activatePanel(instanceId);\n }\n\n const placement = { ...found.placement, role: \"location\" as const };\n const ownedPanelMenuIds = new Set(input.getWidget(placement.contributionId)?.ownedPanelMenuIds ?? []);\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([regionId, region]) => [\n regionId,\n {\n ...region,\n widgets: region.widgets.map((candidate) => {\n if (candidate.widgetId === instanceId) return placement;\n if (!ownedPanelMenuIds.has(candidate.contributionId)) return candidate;\n if (candidate.resourceKey !== placement.resourceKey) return candidate;\n return { ...candidate, ownerResourceKey: placement.resourceKey };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n input.applyAndActivate(\n {\n ...layout,\n regions,\n },\n \"main\",\n placement,\n );\n return input.panelMethods.getActivePanel(\"main\")!;\n};\n","import { getActivePlacement, removeLocationSubPanelSelection, replaceRegionWidgets } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchTabPosition, WorkbenchWidgetPlacement } from \"./layout-types\";\n\nexport const insertAtPosition = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position: WorkbenchTabPosition = \"end\",\n) => {\n const next = [...widgets];\n if (position === \"start\") {\n next.unshift(placement);\n return next;\n }\n if (position === \"end\") {\n next.push(placement);\n return next;\n }\n\n const targetWidgetId = \"beforeWidgetId\" in position ? position.beforeWidgetId : position.afterWidgetId;\n const targetIndex = next.findIndex((candidate) => candidate.widgetId === targetWidgetId);\n if (targetIndex < 0) {\n next.push(placement);\n return next;\n }\n next.splice(targetIndex + (\"afterWidgetId\" in position ? 1 : 0), 0, placement);\n return next;\n};\n\nexport const placeWidget = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position?: WorkbenchTabPosition,\n) => {\n if (placement.tabRetention !== \"preview\") return insertAtPosition(widgets, placement, position);\n const persistentWidgets = widgets.filter(\n (candidate) => candidate.tabRetention !== \"preview\" && candidate.widgetId !== placement.widgetId,\n );\n return insertAtPosition(persistentWidgets, placement, position);\n};\n\nexport const reorderWidgetPlacement = (\n widgets: WorkbenchWidgetPlacement[],\n widgetId: string,\n position: WorkbenchTabPosition,\n) => {\n const placement = widgets.find((candidate) => candidate.widgetId === widgetId);\n if (!placement) return widgets;\n const remaining = widgets.filter((candidate) => candidate.widgetId !== widgetId);\n return insertAtPosition(remaining, placement, position);\n};\n\nconst removePlacements = (layout: WorkbenchLayout, shouldRemove: (placement: WorkbenchWidgetPlacement) => boolean) => {\n let nextLayout = layout;\n\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter(shouldRemove);\n if (removed.length === 0) continue;\n const active = getActivePlacement(region);\n nextLayout = replaceRegionWidgets(\n nextLayout,\n region.id,\n (widgets) => widgets.filter((placement) => !shouldRemove(placement)),\n { clearActiveWidget: active ? shouldRemove(active) : false },\n );\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n\n const activePlacement = nextLayout.activeWidgetId\n ? Object.values(nextLayout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === nextLayout.activeWidgetId)\n : undefined;\n if (!activePlacement) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceKey: undefined };\n }\n return nextLayout;\n};\n\nexport const expirePreviewTabsInLayout = (layout: WorkbenchLayout, ownerResourceKey?: string) =>\n removePlacements(\n layout,\n (placement) =>\n placement.tabRetention === \"preview\" &&\n (ownerResourceKey === undefined || placement.ownerResourceKey !== ownerResourceKey),\n );\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { buildUpdatedPlacement, replaceRegionWidgets } from \"./layout-operations\";\nimport { expirePreviewTabsInLayout, reorderWidgetPlacement } from \"./layout-tab-lifecycle\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport const createLayoutPlacementMethods = (input: {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}): Pick<LayoutModel, \"updateWidgetPlacement\" | \"reorderWidget\" | \"expirePreviewTabs\" | \"activateWidget\"> => ({\n updateWidgetPlacement(widgetId, update) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((placement) => placement.widgetId === widgetId);\n if (index < 0) continue;\n const widget = input.requireWidget(region.widgets[index].contributionId);\n const nextPlacement = buildUpdatedPlacement(region.widgets[index], widget, update);\n const nextLayout = replaceRegionWidgets(layout, region.id, (widgets) =>\n widgets.map((current, currentIndex) => (currentIndex === index ? nextPlacement : current)),\n );\n input.setLayout(nextLayout);\n input.persistLayout();\n return nextPlacement;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n reorderWidget(widgetId, position) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n if (!region.widgets.some((placement) => placement.widgetId === widgetId)) continue;\n input.setLayout(\n replaceRegionWidgets(layout, region.id, (widgets) => reorderWidgetPlacement(widgets, widgetId, position)),\n );\n input.persistLayout();\n return;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n expirePreviewTabs(ownerResourceKey) {\n input.setLayout(expirePreviewTabsInLayout(input.getLayout(), ownerResourceKey));\n input.persistLayout();\n },\n\n activateWidget(widgetId) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === widgetId);\n if (placement) return input.applyAndActivate(layout, region.id, placement);\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n});\n","import type { LayoutModel } from \"./layout-model-types\";\nimport {\n closeWidgetInLayout,\n getActiveLocationPlacement,\n selectRegionActiveWidget,\n setLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport {\n mergeWithDefaultRegions,\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchRegionState,\n workbenchPanelRegions,\n} from \"./layout-types\";\n\nexport interface CreateLayoutRegionContentMethodsInput {\n defaultRegionVisibility?: Partial<Record<WorkbenchRegion, boolean>>;\n getLayout(): WorkbenchLayout;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n}\n\n// Edits to the widgets inside regions: selecting, closing, clearing, and restoring them.\nexport const createLayoutRegionContentMethods = (\n input: CreateLayoutRegionContentMethodsInput,\n): Pick<\n LayoutModel,\n \"setRegionActiveWidget\" | \"closeWidget\" | \"removeWidgetPlacement\" | \"clearRegion\" | \"resetRegions\" | \"restoreLayout\"\n> => {\n const { getLayout, setLayout, persistLayout } = input;\n\n return {\n setRegionActiveWidget(regionId, widgetId) {\n const nextLayout = selectRegionActiveWidget(getLayout(), regionId, widgetId);\n if (!nextLayout) return;\n setLayout(nextLayout);\n persistLayout();\n },\n\n closeWidget(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) throw new Error(`Widget placement not found: ${widgetId}`);\n if (result.closedPlacement.closable !== true) throw new Error(`Widget cannot be closed: ${widgetId}`);\n\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n removeWidgetPlacement(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) return undefined;\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n clearRegion(regionId) {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const activeWidgetId = region.activeWidgetId;\n\n const cleared: WorkbenchLayout = {\n ...layout,\n regions: { ...layout.regions, [regionId]: { ...region, widgets: [], activeWidgetId: undefined } },\n };\n let next =\n activeWidgetId && layout.activeWidgetId === activeWidgetId\n ? { ...cleared, activeWidgetId: undefined, activeResourceKey: undefined }\n : cleared;\n\n if (regionId !== \"side\" && workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) {\n next = setLocationSubPanelSelection(\n next,\n getActiveLocationPlacement(next),\n regionId as WorkbenchPanelRegion,\n undefined,\n );\n }\n\n setLayout(next);\n persistLayout();\n },\n\n resetRegions() {\n const layout = getLayout();\n const nextRegions = {} as WorkbenchLayout[\"regions\"];\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n nextRegions[id] = { ...region, widgets: [], activeWidgetId: undefined };\n }\n setLayout({\n regions: nextRegions,\n locationSubPanelSelections: {},\n activeWidgetId: undefined,\n activeLocationWidgetId: undefined,\n activeResourceKey: undefined,\n });\n persistLayout();\n },\n\n restoreLayout(layout) {\n setLayout(mergeWithDefaultRegions(layout, input.defaultRegionVisibility));\n persistLayout();\n },\n };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport type { WorkbenchLayout, WorkbenchRegion, WorkbenchRegionState } from \"./layout-types\";\n\nexport interface CreateLayoutRegionMethodsInput {\n getLayout(): WorkbenchLayout;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n}\n\n// Region state edits share one write-and-persist path, so a region change is one layout change.\nexport const createLayoutRegionMethods = (\n input: CreateLayoutRegionMethodsInput,\n): Pick<LayoutModel, \"setRegionVisible\" | \"setRegionSize\" | \"setSidePanelMode\"> => {\n const updateRegion = (regionId: WorkbenchRegion, update: (region: WorkbenchRegionState) => WorkbenchRegionState) => {\n const layout = input.getLayout();\n const region = layout.regions[regionId];\n const nextRegion = update(region);\n if (nextRegion === region) return;\n input.setLayout({ ...layout, regions: { ...layout.regions, [regionId]: nextRegion } });\n input.persistLayout();\n };\n\n return {\n setRegionVisible(regionId, visible) {\n updateRegion(regionId, (region) => (region.visible === visible ? region : { ...region, visible }));\n },\n\n setRegionSize(regionId, size) {\n updateRegion(regionId, (region) => (region.size === size ? region : { ...region, size }));\n },\n\n setSidePanelMode(mode) {\n updateRegion(\"side\", (region) => {\n if (mode === \"closed\") return region.visible ? { ...region, visible: false } : region;\n return region.visible && region.presentation === mode\n ? region\n : { ...region, visible: true, presentation: mode };\n });\n },\n };\n};\n","import { createDisposable } from \"../../shared/disposable\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport {\n createDefaultWorkbenchLayout,\n mergeWithDefaultRegions,\n type WorkbenchLayout,\n type WorkbenchRegion,\n} from \"./layout-types\";\n\nexport const carryPinnedWorkbenchChrome = (current: WorkbenchLayout, incoming: WorkbenchLayout) => {\n const regions = { ...incoming.regions };\n\n for (const region of Object.values(current.regions)) {\n const pinned = region.widgets.filter((placement) => placement.pinned && placement.role === \"content\");\n if (pinned.length === 0) continue;\n const contributionIds = new Set(pinned.map((placement) => placement.contributionId));\n const incomingRegion = incoming.regions[region.id];\n regions[region.id] = {\n ...incomingRegion,\n widgets: [\n ...pinned,\n ...incomingRegion.widgets.filter((placement) => !contributionIds.has(placement.contributionId)),\n ],\n activeWidgetId: incomingRegion.activeWidgetId ?? pinned[0]?.widgetId,\n };\n }\n return { ...incoming, regions };\n};\n\nexport const carryWorkbenchRegionState = (\n current: WorkbenchLayout,\n incoming: WorkbenchLayout,\n regionIds: readonly WorkbenchRegion[],\n) => {\n if (regionIds.length === 0) return incoming;\n const regions = { ...incoming.regions };\n for (const regionId of regionIds) regions[regionId] = current.regions[regionId];\n return { ...incoming, regions };\n};\n\nexport const resolveScopedLayout = (\n defaultRegionVisibility: Partial<Record<WorkbenchRegion, boolean>> | undefined,\n persisted: WorkbenchLayout | undefined,\n) =>\n persisted\n ? mergeWithDefaultRegions(persisted, defaultRegionVisibility)\n : createDefaultWorkbenchLayout(defaultRegionVisibility);\n\nexport const createScopeEvent = <T>() => {\n const listeners = new Set<(value: T) => void>();\n return {\n notify(value: T) {\n for (const listener of listeners) runWorkbenchEffect(\"layout scope subscriber\", () => listener(value));\n },\n subscribe(listener: (value: T) => void) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { LayoutModel, LayoutPersistenceAdapter, LayoutScope } from \"./layout-model-types\";\nimport {\n carryPinnedWorkbenchChrome,\n carryWorkbenchRegionState,\n createScopeEvent,\n resolveScopedLayout,\n} from \"./layout-scope\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\n\nexport interface CreateLayoutScopeMethodsInput {\n defaultRegionVisibility?: Partial<Record<WorkbenchRegion, boolean>>;\n getLayout(): WorkbenchLayout;\n persistence?: LayoutPersistenceAdapter;\n setLayout(layout: WorkbenchLayout, action: string): void;\n}\n\n// Owns the active persistence scope and the layout rotation that follows it. Kept\n// beside the layout model so the model factory stays a wiring surface.\nexport const createLayoutScopeMethods = (input: CreateLayoutScopeMethodsInput) => {\n let currentScope: LayoutScope | undefined;\n // Answers \"was this scope entered with a layout the user already had?\", sampled when\n // the scope becomes current. Reading persistence live would be wrong: entering a mode\n // restores and persists panels before the mode seeds, so a new scope would look like\n // a returning one and never get its defaults.\n let enteredWithLayout =\n runWorkbenchEffect(\"layout cache read for unscoped\", () => input.persistence?.getLayout(undefined)) !== undefined;\n const willChangeScope = createScopeEvent<LayoutScope | undefined>();\n const didChangeScope = createScopeEvent<LayoutScope | undefined>();\n\n const persistLayout = () =>\n runWorkbenchEffect(`layout cache for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.setLayout(input.getLayout(), currentScope),\n );\n\n const setPersistenceScope: LayoutModel[\"setPersistenceScope\"] = (nextScope, scopeInput = {}) => {\n if (currentScope === nextScope) return;\n persistLayout();\n willChangeScope.notify(nextScope);\n currentScope = nextScope;\n const incoming = runWorkbenchEffect(`layout cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getLayout(currentScope),\n );\n enteredWithLayout = incoming !== undefined;\n const scopedLayout = resolveScopedLayout(input.defaultRegionVisibility, incoming);\n // Module-owned chrome is global workbench structure. Project scopes replace\n // Location workspaces, but must not unmount pinned navigation and headers.\n const withPinnedChrome = carryPinnedWorkbenchChrome(input.getLayout(), scopedLayout);\n const nextLayout = carryWorkbenchRegionState(\n input.getLayout(),\n withPinnedChrome,\n scopeInput.carryRegionState ?? [],\n );\n input.setLayout(nextLayout, \"setPersistenceScope\");\n didChangeScope.notify(currentScope);\n };\n\n return {\n getPersistenceScope: () => currentScope,\n // Live: whether anything is stored for the active scope right now.\n hasPersistedLayout: () =>\n runWorkbenchEffect(`layout cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getLayout(currentScope),\n ) !== undefined,\n enteredWithPersistedLayout: () => enteredWithLayout,\n onDidChangePersistenceScope: didChangeScope.subscribe,\n onWillChangePersistenceScope: willChangeScope.subscribe,\n persistLayout,\n setPersistenceScope,\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport {\n buildUpdatedPlacement,\n createPlacement,\n createUniqueWidgetId,\n findPlacement,\n findResourcePlacement,\n getActiveLocationPlacement,\n replaceRegionWidgets,\n} from \"./layout-operations\";\nimport { placeWidget } from \"./layout-tab-lifecycle\";\nimport type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\ninterface CreateWidgetOpenersInput {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}\nconst openOwnedPanelMenus = (input: {\n openWidget(id: string, openInput?: OpenWidgetInput): WorkbenchWidgetPlacement;\n placement: WorkbenchWidgetPlacement;\n requireWidget(id: string): RegisteredWidgetContribution;\n widget: RegisteredWidgetContribution;\n}) => {\n for (const panelMenuId of input.widget.ownedPanelMenuIds ?? []) {\n const panelMenu = input.requireWidget(panelMenuId);\n input.openWidget(panelMenuId, {\n pinned: true,\n role: \"panel-menu\",\n viewId: panelMenu.rendererId,\n resource: input.placement.resource,\n title: panelMenu.region === \"main-left-menu\" ? input.placement.resource?.label : panelMenu.title,\n });\n }\n};\nconst findReusablePlacement = (\n widget: RegisteredWidgetContribution,\n layout: WorkbenchLayout,\n openInput: OpenWidgetInput,\n) => {\n if (!widget.singleton && widget.reuse === \"none\") return undefined;\n if (openInput.role === \"sub-panel\" || openInput.role === \"panel-menu\") {\n const ownerResourceKey = getActiveLocationPlacement(layout)?.resourceKey;\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) =>\n candidate.contributionId === widget.id &&\n // Pinned placements are structural chrome, not per-location content, so they are\n // reused across location switches instead of accumulating one instance per owner.\n (candidate.pinned === true ||\n (widget.singleton && candidate.ownerResourceKey === undefined) ||\n candidate.ownerResourceKey === ownerResourceKey) &&\n (!openInput.resource ||\n (widget.singleton && candidate.resourceKey === undefined) ||\n candidate.resourceKey === resourceKey(openInput.resource)),\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n }\n if (widget.singleton) return findPlacement(layout, widget.id);\n if (openInput.resource) return findResourcePlacement(layout, widget.id, resourceKey(openInput.resource));\n return findPlacement(layout, widget.id);\n};\nconst withPlacementRole = (widget: RegisteredWidgetContribution, openInput: OpenWidgetInput): OpenWidgetInput => {\n if (openInput.role) return openInput;\n if (widget.panelMenuOwner) return { ...openInput, role: \"panel-menu\" };\n if (widget.eligibleLocations !== undefined) return { ...openInput, role: \"sub-panel\" };\n return openInput;\n};\nconst findReplacementIndex = (layout: WorkbenchLayout, regionId: WorkbenchRegion, openInput: OpenWidgetInput) => {\n const region = layout.regions[regionId];\n const activeWidgetId = openInput.role === \"location\" ? layout.activeLocationWidgetId : region.activeWidgetId;\n if (openInput.replaceWidgetId) {\n return region.widgets.findIndex((placement) => placement.widgetId === openInput.replaceWidgetId);\n }\n if (openInput.tabRetention === \"preview\") {\n return region.widgets.findIndex((placement) => placement.tabRetention === \"preview\");\n }\n if (!openInput.replaceActive) return -1;\n const replacementWidgetId =\n regionId === \"main\" && openInput.resource && layout.activeLocationWidgetId\n ? layout.activeLocationWidgetId\n : activeWidgetId;\n return region.widgets.findIndex((placement) => placement.widgetId === replacementWidgetId && !placement.pinned);\n};\nconst defaultTabPosition = (\n widgets: WorkbenchWidgetPlacement[],\n widget: RegisteredWidgetContribution,\n requireWidget: (id: string) => RegisteredWidgetContribution,\n) => {\n const before = widgets.find((placement) => {\n try {\n return widget.priority > requireWidget(placement.contributionId).priority;\n } catch {\n return widget.priority > 0;\n }\n });\n return before ? ({ beforeWidgetId: before.widgetId } as const) : undefined;\n};\nexport const createWidgetOpeners = (input: CreateWidgetOpenersInput) => {\n const { getLayout, requireWidget, applyAndActivate } = input;\n const bindToActiveLocation = (placement: WorkbenchWidgetPlacement, layout: WorkbenchLayout) => {\n if (placement.role !== \"sub-panel\" && placement.role !== \"panel-menu\") return placement;\n return { ...placement, ownerResourceKey: getActiveLocationPlacement(layout)?.resourceKey };\n };\n const updateSingleton = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), existing.regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === existing.index ? nextPlacement : current));\n if (!openInput.tabPosition) return updated;\n return placeWidget(\n updated.filter((placement) => placement.widgetId !== nextPlacement.widgetId),\n nextPlacement,\n openInput.tabPosition,\n );\n });\n return applyAndActivate(layout, existing.regionId, nextPlacement);\n };\n const replaceActive = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n replacement: WorkbenchWidgetPlacement,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(buildUpdatedPlacement(replacement, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === replacementIndex ? nextPlacement : current));\n if (nextPlacement.tabRetention !== \"preview\") return updated;\n return placeWidget(updated, nextPlacement, \"start\");\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n const reuseExistingPlacement = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n if (openInput.tabRetention === \"preview\" && existing.placement.tabRetention !== \"preview\") {\n return applyAndActivate(getLayout(), existing.regionId, existing.placement);\n }\n if (existing.regionId !== regionId) {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const withoutExisting = replaceRegionWidgets(\n getLayout(),\n existing.regionId,\n (widgets) => widgets.filter((_current, index) => index !== existing.index),\n { clearActiveWidget: getLayout().regions[existing.regionId].activeWidgetId === existing.placement.widgetId },\n );\n const layout = replaceRegionWidgets(withoutExisting, regionId, (widgets) => {\n if (replacementIndex < 0) return placeWidget(widgets, nextPlacement, openInput.tabPosition);\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, nextPlacement);\n return nextPlacement.tabRetention === \"preview\" ? placeWidget(copy, nextPlacement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n }\n if (replacementIndex < 0 || existing.index === replacementIndex) {\n return updateSingleton(widget, existing, openInput);\n }\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) =>\n placeWidget(\n widgets\n .map((current, index) => (index === existing.index ? nextPlacement : current))\n .filter((_current, index) => index !== replacementIndex && index !== existing.index),\n nextPlacement,\n openInput.tabPosition,\n ),\n );\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n const insertWidget = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n const widgetId = createUniqueWidgetId(getLayout(), widget.id);\n const placement = bindToActiveLocation(createPlacement(widgetId, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n if (replacementIndex < 0) {\n return placeWidget(\n widgets,\n placement,\n openInput.tabPosition ?? defaultTabPosition(widgets, widget, requireWidget),\n );\n }\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, placement);\n return placement.tabRetention === \"preview\" ? placeWidget(copy, placement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, placement);\n };\n const openWidget = (id: string, openInput: OpenWidgetInput = {}): WorkbenchWidgetPlacement => {\n const widget = requireWidget(id);\n const placementInput = withPlacementRole(widget, openInput);\n const layout = getLayout();\n const regionId = placementInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n const region = layout.regions[regionId];\n const replacementIndex = findReplacementIndex(layout, regionId, placementInput);\n const replacement = replacementIndex >= 0 ? region.widgets[replacementIndex] : undefined;\n const previewContent =\n !placementInput.replaceWidgetId && placementInput.tabRetention === \"preview\" && placementInput.resource\n ? findResourcePlacement(layout, widget.id, resourceKey(placementInput.resource))\n : undefined;\n const existing =\n placementInput.replaceWidgetId && replacement ? undefined : findReusablePlacement(widget, layout, placementInput);\n let placement: WorkbenchWidgetPlacement;\n if (previewContent) {\n placement = applyAndActivate(layout, previewContent.regionId, previewContent.placement);\n } else if (existing) {\n placement = reuseExistingPlacement(widget, existing, regionId, replacementIndex, placementInput);\n } else if (replacement?.contributionId === widget.id) {\n placement = replaceActive(widget, regionId, replacementIndex, replacement, placementInput);\n } else {\n placement = insertWidget(widget, regionId, replacementIndex, placementInput);\n }\n openOwnedPanelMenus({ openWidget, placement, requireWidget, widget });\n return applyAndActivate(getLayout(), previewContent?.regionId ?? regionId, placement);\n };\n return { openWidget };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { closeWidgetInLayout, findPlacementByWidgetId } from \"./layout-operations\";\nimport {\n type OpenWorkbenchPanelInput,\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchLayoutStoreState,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n workbenchPanelRegions,\n} from \"./layout-types\";\nimport { toOpenWidgetInput, toPanelContribution, toPanelInstance } from \"./panel-api\";\n\n// A programmatic open into a tabbed region is a peek: it lands as a preview tab that the\n// next peek replaces. Chrome regions and pinned placements are structure, so they stay put.\nconst defaultPanelTabRetention = (widget: RegisteredWidgetContribution, openInput: OpenWorkbenchPanelInput) => {\n if (openInput.pinned) return \"persistent\" as const;\n const region = openInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n return workbenchPanelRegions.includes(region as WorkbenchPanelRegion)\n ? (\"preview\" as const)\n : (\"persistent\" as const);\n};\n\ninterface CreatePanelLayoutMethodsInput {\n getLayout: () => WorkbenchLayout;\n getWidgets: () => WorkbenchLayoutStoreState[\"widgets\"];\n listWidgets: LayoutModel[\"listWidgets\"];\n persistLayout: () => void;\n placementMethods: Pick<LayoutModel, \"activateWidget\" | \"reorderWidget\" | \"updateWidgetPlacement\">;\n setLayout: (layout: WorkbenchLayout) => void;\n widgetOpeners: Pick<LayoutModel, \"openWidget\">;\n}\n\nexport const createPanelLayoutMethods = (input: CreatePanelLayoutMethodsInput) => ({\n getPanel(id: string) {\n const widget = input.getWidgets()[id];\n return widget ? toPanelContribution(widget) : undefined;\n },\n\n listPanels: () => input.listWidgets().map(toPanelContribution),\n\n listPanelInstances(region?: WorkbenchRegion) {\n const placements = region\n ? input.getLayout().regions[region].widgets\n : Object.values(input.getLayout().regions).flatMap((candidate) => candidate.widgets);\n return placements.map(toPanelInstance);\n },\n\n getActivePanel(region?: WorkbenchRegion) {\n if (region) {\n const state = input.getLayout().regions[region];\n const placement =\n state.widgets.find((candidate) => candidate.widgetId === state.activeWidgetId) ?? state.widgets[0];\n return placement ? toPanelInstance(placement) : undefined;\n }\n const activeInstanceId = input.getLayout().activeWidgetId;\n if (!activeInstanceId) return undefined;\n const found = findPlacementByWidgetId(input.getLayout(), activeInstanceId);\n return found ? toPanelInstance(found.placement) : undefined;\n },\n\n openPanel(id: string, openInput: OpenWorkbenchPanelInput = {}) {\n const widget = input.getWidgets()[id];\n if (!widget) throw new Error(`Panel not registered: ${id}`);\n return toPanelInstance(\n input.widgetOpeners.openWidget(id, toOpenWidgetInput(openInput, defaultPanelTabRetention(widget, openInput))),\n );\n },\n\n updatePanel(instanceId: string, update: OpenWorkbenchPanelInput) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.updateWidgetPlacement(instanceId, toOpenWidgetInput(update)));\n },\n\n reorderPanel(instanceId: string, position: Parameters<LayoutModel[\"reorderPanel\"]>[1]) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n input.placementMethods.reorderWidget(instanceId, position);\n },\n\n activatePanel(instanceId: string) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.activateWidget(instanceId));\n },\n\n closePanel(instanceId: string) {\n const found = findPlacementByWidgetId(input.getLayout(), instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n if (found.placement.closable !== true) throw new Error(`Panel cannot be closed: ${instanceId}`);\n const active = closeWidgetInLayout(input.getLayout(), instanceId);\n if (!active) throw new Error(`Panel instance not found: ${instanceId}`);\n input.setLayout(active.layout);\n input.persistLayout();\n return active.activePlacement ? toPanelInstance(active.activePlacement) : undefined;\n },\n});\n","import type { LayoutModel } from \"./layout-model-types\";\nimport {\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchPanelMenuRegion,\n type WorkbenchPanelMenuSide,\n type WorkbenchPanelRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n} from \"./layout-types\";\n\ntype GetWidget = (contributionId: string) => RegisteredWidgetContribution | undefined;\n\nconst menuRegions = Object.values(workbenchPanelMenuRegions).flatMap(\n (regions) => Object.values(regions) as WorkbenchPanelMenuRegion[],\n);\n\nconst menuSide = (region: WorkbenchPanelMenuRegion): WorkbenchPanelMenuSide =>\n region.endsWith(\"-left-menu\") ? \"left\" : \"right\";\n\nconst ownerContributionId = (getWidget: GetWidget, contributionId: string) =>\n getWidget(contributionId)?.panelMenuOwner?.contributionId;\n\nconst ownerPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of workbenchPanelRegions) {\n const placement = layout.regions[region].widgets.find((candidate) => candidate.contributionId === contributionId);\n if (placement) return { region, placement };\n }\n return undefined;\n};\n\ninterface MenuResolution {\n placements: WorkbenchWidgetPlacement[];\n changed: boolean;\n}\n\n// One placement per owned menu contribution. A panel opened without a resource and\n// then reopened with one would otherwise leave its first menu behind, because menu\n// reuse keys on the owner's resource. Keeping the first placement and rebinding it\n// preserves the menu's identity and active state.\nconst resolveMenuPlacements = (\n layout: WorkbenchLayout,\n getWidget: GetWidget,\n region: WorkbenchPanelMenuRegion,\n): MenuResolution & { moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] } => {\n const placements: WorkbenchWidgetPlacement[] = [];\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n const seen = new Set<string>();\n let changed = false;\n\n for (const placement of layout.regions[region].widgets) {\n const owner = ownerContributionId(getWidget, placement.contributionId);\n if (!owner) {\n placements.push(placement);\n continue;\n }\n if (seen.has(placement.contributionId)) {\n changed = true;\n continue;\n }\n seen.add(placement.contributionId);\n\n const found = ownerPlacement(layout, owner);\n if (!found) {\n // Orphaned menu: its owner panel has no placement anywhere.\n changed = true;\n continue;\n }\n\n const bound =\n placement.ownerResourceKey === found.placement.resourceKey\n ? placement\n : { ...placement, ownerResourceKey: found.placement.resourceKey };\n if (bound !== placement) changed = true;\n\n const target = workbenchPanelMenuRegions[found.region as WorkbenchPanelRegion][menuSide(region)];\n if (target === region) {\n placements.push(bound);\n continue;\n }\n changed = true;\n moves.push({ placement: bound, target });\n }\n\n return { changed, moves, placements };\n};\n\n// A panel instance owns its menu instances: menus render beside the region their\n// owner currently occupies, stay bound to the owner's resource, and a menu whose\n// owner has no placement is an orphan. Menu identity (widget id, active state) is\n// preserved on a move; no second instance is created.\nexport const reconcilePanelMenuOwnership = (layout: WorkbenchLayout, getWidget: GetWidget): WorkbenchLayout => {\n let changed = false;\n const regions = { ...layout.regions };\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n\n for (const menuRegion of menuRegions) {\n if (layout.regions[menuRegion].widgets.length === 0) continue;\n const resolved = resolveMenuPlacements(layout, getWidget, menuRegion);\n moves.push(...resolved.moves);\n if (!resolved.changed) continue;\n\n changed = true;\n const region = regions[menuRegion];\n regions[menuRegion] = {\n ...region,\n widgets: resolved.placements,\n activeWidgetId: resolved.placements.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n\n for (const move of moves) {\n const target = regions[move.target];\n regions[move.target] = { ...target, widgets: [...target.widgets, move.placement] };\n }\n\n return changed ? { ...layout, regions } : layout;\n};\n\nexport interface CreateOwnedMenuMethodsInput {\n getLayout(): WorkbenchLayout;\n getWidget: GetWidget;\n openWidget: LayoutModel[\"openWidget\"];\n persistLayout(): void;\n setLayout(layout: WorkbenchLayout): void;\n}\n\n// Every open (including a region move or a rebind to a resource) reconciles the\n// owned menus of the panel that moved, so a panel instance always has exactly one\n// instance of each menu it owns.\nexport const createOwnedMenuMethods = (input: CreateOwnedMenuMethodsInput) => {\n const reconcilePanelMenus = () => {\n const next = reconcilePanelMenuOwnership(input.getLayout(), input.getWidget);\n if (next === input.getLayout()) return;\n input.setLayout(next);\n input.persistLayout();\n };\n\n const openWidget: LayoutModel[\"openWidget\"] = (id, openInput) => {\n const placement = input.openWidget(id, openInput);\n reconcilePanelMenus();\n return placement;\n };\n\n return { openWidget, reconcilePanelMenus };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type {\n WidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelRegion,\n} from \"./layout-types\";\nimport { workbenchPanelMenuRegions, workbenchPanelRegions } from \"./layout-types\";\n\ntype RegisteredPanelInput = WorkbenchPanelContribution;\ntype WorkbenchPanelKind = \"panel\" | \"sub-panel\";\n\ninterface RegisterPanelContributionInput {\n metadata?: ContributionMetadata;\n panel: RegisteredPanelInput;\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n kind: WorkbenchPanelKind;\n}\n\ninterface CreatePanelRegistrationsInput {\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nconst panelMenuContribution = (\n panel: RegisteredPanelInput,\n menu: WorkbenchPanelMenuDefinition,\n kind: WorkbenchPanelKind,\n): WidgetContribution => {\n const { side, ...contribution } = menu;\n const region = panel.region as WorkbenchPanelRegion;\n const fallbackRegion = workbenchPanelRegions.find((candidate) => candidate === panel.fallbackRegion);\n return {\n ...contribution,\n region: workbenchPanelMenuRegions[region][side],\n fallbackRegion: fallbackRegion ? workbenchPanelMenuRegions[fallbackRegion][side] : undefined,\n panelMenuOwner: {\n level: kind === \"sub-panel\" ? \"sub-panel\" : \"panel\",\n contributionId: panel.id,\n },\n };\n};\n\nexport const registerPanelContribution = (input: RegisterPanelContributionInput) => {\n const { kind, metadata, panel, registerWidget } = input;\n const { panelMenus = [], ...panelContribution } = panel;\n const registrations: Disposable[] = [];\n\n if (panelMenus.length > 0 && !workbenchPanelRegions.includes(panel.region as WorkbenchPanelRegion)) {\n throw new Error(`Panel Menus require a Panel region: ${panel.id}`);\n }\n\n try {\n const registeredPanel: WidgetContribution & { ownedPanelMenuIds: readonly string[] } = {\n ...panelContribution,\n ownedPanelMenuIds: panelMenus.map((menu) => menu.id),\n };\n registrations.push(registerWidget(registeredPanel, metadata));\n for (const menu of panelMenus) {\n registrations.push(registerWidget(panelMenuContribution(panel, menu, kind), metadata));\n }\n } catch (error) {\n for (const registration of registrations.reverse()) registration.dispose();\n throw error;\n }\n\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n};\n\nexport const createPanelRegistrations = (input: CreatePanelRegistrationsInput) => {\n const registerPanel = (panel: WorkbenchPanelContribution, metadata?: ContributionMetadata) => {\n return registerPanelContribution({\n panel,\n kind: panel.eligibleLocations ? \"sub-panel\" : \"panel\",\n metadata,\n registerWidget: input.registerWidget,\n });\n };\n\n const registerPanelMenu = (panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata) =>\n input.registerWidget({ ...panelMenu, panelMenuOwner: panelMenu.panelMenuOwner ?? { level: \"panel\" } }, metadata);\n\n return { registerPanel, registerPanelMenu };\n};\n","import { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n createContributionLists,\n createContributionRegistrations,\n createRegionQueries,\n} from \"./layout-contribution-helpers\";\nimport { createLocationEstablisher } from \"./layout-location-establisher\";\nimport type { CreateLayoutModelInput, LayoutModel } from \"./layout-model-types\";\nimport { activateInLayout, removePlacementsForContribution } from \"./layout-operations\";\nimport { createLayoutPlacementMethods } from \"./layout-placement-methods\";\nimport { createLayoutRegionContentMethods } from \"./layout-region-content-methods\";\nimport { createLayoutRegionMethods } from \"./layout-region-methods\";\nimport { resolveScopedLayout } from \"./layout-scope\";\nimport { createLayoutScopeMethods } from \"./layout-scope-methods\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchPanelInstance,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { createWidgetOpeners } from \"./layout-widget-openers\";\nimport { createPanelLayoutMethods } from \"./panel-layout-methods\";\nimport { createOwnedMenuMethods } from \"./panel-menu-ownership\";\nimport { createPanelRegistrations } from \"./panel-registration\";\n\nexport type {\n CreateLayoutModelInput,\n LayoutModel,\n LayoutPersistenceAdapter,\n LayoutScope,\n} from \"./layout-model-types\";\nexport type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WidgetMountStrategy,\n WidgetReusePolicy,\n WorkbenchCommandTarget,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchLocationEligibility,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelMenuOwner,\n WorkbenchPanelMenuRegion,\n WorkbenchPanelMenuSide,\n WorkbenchPanelMountStrategy,\n WorkbenchPanelOpenStrategy,\n WorkbenchPanelRegion,\n WorkbenchPanelReusePolicy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n WorkbenchRegionSize,\n WorkbenchRegionState,\n WorkbenchSidePanelMode,\n WorkbenchTabAction,\n WorkbenchTabMenuGroup,\n WorkbenchTabMenuRow,\n WorkbenchTabPosition,\n WorkbenchTabRetention,\n WorkbenchTabSnapshot,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n WorkbenchWidgetTab,\n} from \"./layout-types\";\nexport {\n createDefaultWorkbenchLayout,\n getWorkbenchPanelForMenuRegion,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n workbenchRegions,\n} from \"./layout-types\";\n\ninterface LocationAwareLayoutModel extends LayoutModel {\n establishLocation(instanceId: string): WorkbenchPanelInstance;\n}\n\nconst requireRegisteredWidget = (\n widgets: WorkbenchLayoutStoreState[\"widgets\"],\n id: string,\n): RegisteredWidgetContribution => {\n const widget = widgets[id];\n if (!widget) throw new Error(`Widget not registered: ${id}`);\n return widget;\n};\n\nexport const createLayoutModel = (input: CreateLayoutModelInput = {}): LocationAwareLayoutModel => {\n const persisted = input.persistence?.getLayout(undefined);\n const initialLayout = resolveScopedLayout(input.defaultRegionVisibility, persisted);\n\n const store = createWorkbenchStore<WorkbenchLayoutStoreState>({\n name: \"workbench.layout\",\n initialState: { layout: initialLayout, widgets: {}, placeholders: {} },\n });\n\n const getLayout = () => store.getState().layout;\n const getPlaceholders = () => store.getState().placeholders;\n const getWidgets = () => store.getState().widgets;\n const getPlaceholder = (regionId: WorkbenchRegion) => getPlaceholders()[regionId];\n const regionQueries = createRegionQueries({\n getLayout,\n getWidgets,\n getPlaceholder,\n getRegionSettings: input.getRegionSettings,\n });\n const contributionLists = createContributionLists({ getPlaceholders, getWidgets });\n\n const scopeMethods = createLayoutScopeMethods({\n defaultRegionVisibility: input.defaultRegionVisibility,\n getLayout,\n persistence: input.persistence,\n setLayout: (layout, action) => store.setState({ ...store.getState(), layout }, false, action),\n });\n const persistLayout = () => scopeMethods.persistLayout();\n\n const requireWidget = (id: string) => requireRegisteredWidget(getWidgets(), id);\n\n const setLayout = (layout: WorkbenchLayout) => {\n const snapshot = store.getState();\n if (snapshot.layout === layout) return;\n store.setState({ ...snapshot, layout }, false, \"setLayout\");\n };\n\n const regionMethods = createLayoutRegionMethods({ getLayout, setLayout, persistLayout });\n const regionContentMethods = createLayoutRegionContentMethods({\n defaultRegionVisibility: input.defaultRegionVisibility,\n getLayout,\n setLayout,\n persistLayout,\n });\n\n const applyAndActivate = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ) => {\n setLayout(activateInLayout(layout, regionId, placement));\n persistLayout();\n return placement;\n };\n\n const contributionRegistrations = createContributionRegistrations({\n store,\n getPlaceholders,\n getWidgets,\n persistLayout,\n });\n const panelRegistrations = createPanelRegistrations({\n registerWidget: contributionRegistrations.registerWidget,\n });\n const widgetOpeners = createWidgetOpeners({ getLayout, requireWidget, applyAndActivate });\n const placementMethods = createLayoutPlacementMethods({\n getLayout,\n requireWidget,\n setLayout,\n persistLayout,\n applyAndActivate,\n });\n const panelMethods = createPanelLayoutMethods({\n getLayout,\n getWidgets,\n listWidgets: contributionLists.listWidgets,\n persistLayout,\n placementMethods,\n setLayout,\n widgetOpeners,\n });\n const ownedMenus = createOwnedMenuMethods({\n getLayout,\n getWidget: (id) => getWidgets()[id],\n openWidget: widgetOpeners.openWidget,\n persistLayout,\n setLayout,\n });\n\n const establishLocation = createLocationEstablisher({\n applyAndActivate,\n getLayout,\n getWidget: requireWidget,\n panelMethods,\n });\n\n return {\n store,\n\n registerPlaceholder: contributionRegistrations.registerPlaceholder,\n\n registerWidget: contributionRegistrations.registerWidget,\n\n ...panelRegistrations,\n\n unregisterWidget(id, options = {}) {\n const current = store.getState();\n if (!current.widgets[id]) return;\n const { [id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout =\n options.removePlacements === false ? current.layout : removePlacementsForContribution(current.layout, id);\n store.setState({ ...current, widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n if (options.persist !== false) persistLayout();\n },\n\n getWidget(id) {\n return getWidgets()[id];\n },\n\n getPlaceholder,\n\n getRegionSize: regionQueries.getRegionSize,\n getRegionSettings: (regionId) => input.getRegionSettings?.(regionId),\n getRegionCollapsible: regionQueries.getRegionCollapsible,\n getRegionHeaderBorderBottom: regionQueries.getRegionHeaderBorderBottom,\n\n ...regionMethods,\n\n listPlaceholders: contributionLists.listPlaceholders,\n listWidgets: contributionLists.listWidgets,\n ...panelMethods,\n openWidget: ownedMenus.openWidget,\n\n ...placementMethods,\n\n establishLocation,\n\n reconcilePanelMenus: ownedMenus.reconcilePanelMenus,\n\n ...regionContentMethods,\n\n getLayout,\n\n setPersistenceScope: scopeMethods.setPersistenceScope,\n getPersistenceScope: scopeMethods.getPersistenceScope,\n hasPersistedLayout: scopeMethods.hasPersistedLayout,\n enteredWithPersistedLayout: scopeMethods.enteredWithPersistedLayout,\n onWillChangePersistenceScope: scopeMethods.onWillChangePersistenceScope,\n onDidChangePersistenceScope: scopeMethods.onDidChangePersistenceScope,\n };\n};\n","import type { WorkbenchModeRegistry } from \"./mode-registry-types\";\n\ninterface WorkbenchModeRegistryInternals {\n activatePageMode(modeId: string | undefined, applyLayout: () => void): void;\n}\n\nconst modeRegistryInternals = new WeakMap<WorkbenchModeRegistry, WorkbenchModeRegistryInternals>();\n\nexport const setWorkbenchModeRegistryInternals = (\n registry: WorkbenchModeRegistry,\n internals: WorkbenchModeRegistryInternals,\n) => {\n modeRegistryInternals.set(registry, internals);\n};\n\nexport const activateWorkbenchPageMode = (\n registry: WorkbenchModeRegistry,\n modeId: string | undefined,\n applyLayout: () => void,\n) => {\n const internals = modeRegistryInternals.get(registry);\n if (!internals) throw new Error(\"Workbench mode registry internals are unavailable\");\n internals.activatePageMode(modeId, applyLayout);\n};\n","import { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { WorkbenchModeActivationContext, WorkbenchModeContribution } from \"./mode-registry-types\";\n\n// Runs the mode's one-shot seed and promotes the first Location-capable panel it opens\n// in main to a Location, so a freshly seeded scope starts with a Location.\nexport const seedModeScope = (\n mode: WorkbenchModeContribution,\n context: WorkbenchModeActivationContext,\n establishLocation: ((instanceId: string) => void) | undefined,\n) => {\n let locationEstablished = false;\n let unsubscribeMainPanel: () => void = () => undefined;\n const establishSeededLocation = () => {\n if (locationEstablished) return;\n const primary = context.layout.getActivePanel(\"main\");\n if (!primary) return;\n // Sub Panels cannot become Locations; keep waiting for a Location-capable\n // placement instead of consuming the one-shot on a tab.\n const placement = context.layout\n .getLayout()\n .regions.main.widgets.find((candidate) => candidate.widgetId === primary.instanceId);\n if (placement && (placement.role === \"sub-panel\" || placement.role === \"panel-menu\")) return;\n locationEstablished = true;\n unsubscribeMainPanel();\n establishLocation?.(primary.instanceId);\n };\n\n unsubscribeMainPanel = context.layout.store.subscribeSelector(\n (state) => state.layout.regions.main,\n establishSeededLocation,\n );\n try {\n runWorkbenchEffect(`mode ${mode.id}.seed`, () => mode.seed?.(context));\n establishSeededLocation();\n } finally {\n unsubscribeMainPanel();\n }\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { WorkbenchLayout } from \"../layout/layout-model\";\nimport {\n applyModePanelAvailability,\n disposeReverse,\n panelsForMode,\n restoreModeLayout,\n restoreUnscopedModeLayout,\n} from \"./mode-layout\";\nimport { setWorkbenchModeRegistryInternals } from \"./mode-registry-internals\";\nimport type {\n CreateWorkbenchModeRegistryInput,\n WorkbenchModeActivationResult,\n WorkbenchModeContribution,\n WorkbenchModeRegistry,\n WorkbenchModeStoreState,\n} from \"./mode-registry-types\";\nimport { seedModeScope } from \"./mode-seed-scope\";\n\nexport { getWorkbenchModePanelForRegion, isWorkbenchModePanelAvailable } from \"./mode-layout\";\nexport type {\n CreateWorkbenchModeRegistryInput,\n WorkbenchModeActivationContext,\n WorkbenchModeActivationResult,\n WorkbenchModeAddablePanel,\n WorkbenchModeAddablePanelContext,\n WorkbenchModeChangeListener,\n WorkbenchModeContribution,\n WorkbenchModeRegistry,\n WorkbenchModeStoreState,\n} from \"./mode-registry-types\";\n\nconst toDisposables = (result: WorkbenchModeActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nexport const createWorkbenchModeRegistry = (input: CreateWorkbenchModeRegistryInput): WorkbenchModeRegistry => {\n const store = createWorkbenchStore<WorkbenchModeStoreState>({\n name: \"workbench.modes\",\n initialState: { modes: {}, activeModeId: undefined },\n });\n\n const initializedModes = new Map<string, Disposable[]>();\n const seededScopes = new Set<string>();\n const unscopedLayouts = new Map<string, WorkbenchLayout>();\n let activeDisposables: Disposable[] = [];\n let activeModeContext: Disposable | undefined;\n let deferredSeedModeId: string | undefined;\n let transitioning = false;\n\n const initializeMode = (mode: WorkbenchModeContribution) => {\n if (initializedModes.has(mode.id)) return;\n const disposables = toDisposables(\n runWorkbenchEffect(`mode ${mode.id}.activate`, () => mode.activate(input.resolveContext())),\n );\n initializedModes.set(mode.id, disposables);\n };\n\n // Applies panel availability and seeds default placements only when the scope is\n // new: no persisted layout and not seeded earlier in this session.\n const prepareScope = (mode: WorkbenchModeContribution) => {\n const context = input.resolveContext();\n const scopeKey = `${mode.id}\\0${context.layout.getPersistenceScope() ?? \"unscoped\"}`;\n const availableLayout = applyModePanelAvailability(context.layout.getLayout(), panelsForMode(mode));\n restoreModeLayout(context, availableLayout);\n context.layout.reconcilePanelMenus();\n if (!seededScopes.has(scopeKey) && !context.layout.enteredWithPersistedLayout()) {\n seedModeScope(mode, context, input.establishLocation);\n }\n seededScopes.add(scopeKey);\n };\n\n // One reconciliation pass for every context activation: first activation,\n // reselecting the active mode, and persistence-scope changes. Repair of required\n // structure belongs to mode.reconcile and runs every time, so a user can recover\n // required placements by reselecting the active mode. Reconciliation must not\n // rerun activate or enter.\n const reconcileScope = (mode: WorkbenchModeContribution) => {\n prepareScope(mode);\n runWorkbenchEffect(`mode ${mode.id}.reconcile`, () => mode.reconcile?.(input.resolveContext()));\n };\n\n // Switching modes stashes the outgoing unscoped layout, disposes the active mode,\n // and restores the incoming mode's unscoped layout before activating it. Scoped\n // layouts are owned by the persistence scope instead.\n const transitionToMode = (id: string | undefined) => {\n const context = input.resolveContext();\n const previousModeId = store.getState().activeModeId;\n const unscoped = context.layout.getPersistenceScope() === undefined;\n if (previousModeId && unscoped) unscopedLayouts.set(previousModeId, context.layout.getLayout());\n\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n return;\n }\n\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n if (unscoped) {\n restoreModeLayout(\n context,\n restoreUnscopedModeLayout(context.layout.getLayout(), unscopedLayouts.get(id), panelsForMode(mode)),\n );\n }\n activate(id, { seed: deferredSeedModeId !== id });\n };\n\n const activatePageMode = (id: string | undefined, applyLayout: () => void) => {\n if (id && !store.getState().modes[id]) throw new Error(`Workbench mode not registered: ${id}`);\n if (id === store.getState().activeModeId) {\n applyLayout();\n return;\n }\n // Publish the page's mode before its layout. Layout listeners may open panels\n // owned by that mode as soon as the new primary resource appears.\n transitioning = true;\n deferredSeedModeId = undefined;\n try {\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivatePageMode\");\n applyLayout();\n return;\n }\n activate(id, { seed: false, afterPublish: applyLayout });\n } finally {\n transitioning = false;\n }\n };\n\n const disposeActive = () => {\n disposeReverse(activeDisposables);\n activeDisposables = [];\n activeModeContext?.dispose();\n activeModeContext = undefined;\n };\n\n const activate = (id: string, options: { seed: boolean; afterPublish?: () => void }) => {\n const context = input.resolveContext();\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n\n const contextScope = context.context.createScope(\"workbench.mode\");\n contextScope.set(\"activeWorkbenchMode\", id);\n contextScope.set(`workbenchMode.${id}`, true);\n activeModeContext = contextScope;\n try {\n initializeMode(mode);\n store.setState({ ...store.getState(), activeModeId: id }, false, \"activateMode\");\n options.afterPublish?.();\n if (options.seed) prepareScope(mode);\n activeDisposables = toDisposables(runWorkbenchEffect(`mode ${mode.id}.enter`, () => mode.enter?.(context)));\n if (options.seed) runWorkbenchEffect(`mode ${mode.id}.reconcile`, () => mode.reconcile?.(input.resolveContext()));\n } catch (error) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n throw error;\n }\n };\n\n const scopeSubscription = input.layout.onDidChangePersistenceScope(() => {\n const activeModeId = store.getState().activeModeId;\n if (activeModeId === deferredSeedModeId) return;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n if (mode) reconcileScope(mode);\n });\n const registryDisposable = createDisposable(() => {\n scopeSubscription.dispose();\n disposeActive();\n for (const disposables of initializedModes.values()) disposeReverse(disposables);\n initializedModes.clear();\n seededScopes.clear();\n unscopedLayouts.clear();\n store.setState({ modes: {}, activeModeId: undefined }, false, \"disposeModes\");\n });\n\n const registry: WorkbenchModeRegistry = {\n store,\n\n dispose() {\n registryDisposable.dispose();\n },\n\n registerMode(mode) {\n const snapshot = store.getState();\n if (snapshot.modes[mode.id]) throw new Error(`Workbench mode already registered: ${mode.id}`);\n\n store.setState({ ...snapshot, modes: { ...snapshot.modes, [mode.id]: mode } }, false, \"registerMode\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.modes[mode.id] !== mode) return;\n if (current.activeModeId === mode.id) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n }\n disposeReverse(initializedModes.get(mode.id) ?? []);\n initializedModes.delete(mode.id);\n unscopedLayouts.delete(mode.id);\n for (const scopeKey of seededScopes) {\n if (scopeKey.startsWith(`${mode.id}\\0`)) seededScopes.delete(scopeKey);\n }\n const { [mode.id]: _removed, ...rest } = current.modes;\n store.setState({ ...store.getState(), modes: rest }, false, \"unregisterMode\");\n });\n },\n\n getMode(id) {\n return store.getState().modes[id];\n },\n\n listModes() {\n return Object.values(store.getState().modes);\n },\n\n getActiveModeId() {\n return store.getState().activeModeId;\n },\n\n // A deferred seed is the second half of one transition: the caller rotates the\n // layout persistence scope between the two halves. Observers must not treat the\n // gap as a settled context, so the transition is not over until the seed runs.\n isTransitioning() {\n return transitioning || deferredSeedModeId !== undefined;\n },\n\n setActiveMode(id, setActiveInput = {}) {\n if (id === store.getState().activeModeId) {\n // Reselecting the active mode reconciles its layout without disposing or\n // rerunning enter, so a missing required placement can recover.\n const mode = id ? store.getState().modes[id] : undefined;\n if (mode && id !== deferredSeedModeId) reconcileScope(mode);\n return;\n }\n transitioning = true;\n deferredSeedModeId = setActiveInput.deferSeed ? id : undefined;\n try {\n transitionToMode(id);\n } finally {\n transitioning = false;\n }\n },\n\n seedActiveMode() {\n const activeModeId = store.getState().activeModeId;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n transitioning = true;\n try {\n if (mode) reconcileScope(mode);\n } finally {\n deferredSeedModeId = undefined;\n transitioning = false;\n }\n },\n\n onDidChangeActive(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeModeId,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n\n setWorkbenchModeRegistryInternals(registry, { activatePageMode });\n return registry;\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type {\n WidgetMountStrategy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchWidgetRole,\n} from \"../layout/layout-types\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport type { WorkbenchViewRegistry } from \"./view-registry\";\n\nexport interface WorkbenchPlacementPresentation {\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n headerBorderBottom?: boolean;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n}\n\nexport interface RegisterWorkbenchViewPlacementInput extends WorkbenchPlacementPresentation {\n id: string;\n viewId: string;\n region: WorkbenchRegion;\n role: WorkbenchWidgetRole;\n singleton: boolean;\n closable: boolean;\n}\n\nexport const registerWorkbenchViewPlacement = (\n layout: Pick<LayoutModel, \"registerPanel\">,\n views: WorkbenchViewRegistry,\n input: RegisterWorkbenchViewPlacementInput,\n viewMenus?: WorkbenchViewMenuRegistry,\n): Disposable => {\n const view = views.getView(input.viewId);\n if (!view) throw new Error(`Workbench placement view is not registered: ${input.viewId}`);\n const { role: _role, viewId: _viewId, ...panel } = input;\n return layout.registerPanel({\n ...panel,\n title: view.title,\n icon: view.icon,\n rendererId: view.id,\n panelMenus: viewMenus?.definitionsFor(view.id, input.id),\n });\n};\n\nexport const modePlacementContributionId = (placementId: string) =>\n `workbench.mode-placement.${encodeURIComponent(placementId)}`;\n\nexport const pagePlacementContributionId = (pageId: string, slotId: string) =>\n `workbench.page-placement.${encodeURIComponent(pageId)}.${encodeURIComponent(slotId)}`;\n","import { type WorkbenchRegion, workbenchPanelRegions } from \"../../registries/layout/layout-types\";\nimport { isWorkbenchModePanelAvailable } from \"../../registries/modes/mode-layout\";\nimport type { WorkbenchModeContribution } from \"../../registries/modes/mode-registry\";\nimport { modePlacementContributionId } from \"../../registries/views/view-placement\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\ninterface PanelDestinationPolicy {\n mode?: WorkbenchModeContribution;\n movableTo?: readonly WorkbenchRegion[];\n allowedRegions?: readonly WorkbenchRegion[];\n}\n\nexport const allowedPanelDestinations = (policy: PanelDestinationPolicy) =>\n workbenchPanelRegions.filter(\n (region) =>\n isWorkbenchModePanelAvailable(policy.mode, region) &&\n (!policy.movableTo || policy.movableTo.includes(region)) &&\n (!policy.allowedRegions || policy.allowedRegions.includes(region)),\n );\n\nexport const panelDestinations = (core: WorkbenchCore, contributionId: string) => {\n const widget = core.layout.getWidget(contributionId);\n if (!widget || !workbenchPanelRegions.some((region) => region === widget.region)) return [];\n const modeId = core.modes.getActiveModeId();\n const mode = modeId ? core.modes.getMode(modeId) : undefined;\n const declaration = core.modePlacements\n .listPlacements(modeId)\n .find((p) => modePlacementContributionId(p.id) === contributionId);\n const legacyPanel = mode\n ?.listAddablePanels?.({ layout: core.layout.getLayout(), resource: core.getPrimaryResource() })\n .find((p) => p.panelId === contributionId);\n return allowedPanelDestinations({\n mode,\n movableTo: declaration?.movableTo,\n allowedRegions: legacyPanel?.allowedRegions,\n });\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"../../registries/layout/layout-model\";\nimport { getActiveLocationPlacement } from \"../../registries/layout/layout-operations\";\nimport { isWorkbenchPanelPlacementVisible } from \"../../registries/layout/panel-widget-eligibility\";\nimport {\n isWorkbenchModePanelAvailable,\n type WorkbenchModeAddablePanel,\n type WorkbenchModeContribution,\n} from \"../../registries/modes/mode-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { allowedPanelDestinations } from \"./panel-destinations\";\nexport interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {\n contribution: RegisteredWidgetContribution;\n open?(resource?: ResourceRef): void | Promise<void>;\n}\nexport interface WorkbenchCompositionRegionPanels {\n open: readonly WorkbenchWidgetPlacement[];\n addable: readonly WorkbenchCompositionAddablePanel[];\n closable: readonly string[];\n}\nexport interface WorkbenchCompositionController {\n panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;\n}\ninterface CreateWorkbenchCompositionControllerInput {\n getActiveMode(): WorkbenchModeContribution | undefined;\n getLayout(): WorkbenchLayout;\n getResource(): ResourceRef | undefined;\n listWidgets(): RegisteredWidgetContribution[];\n listOwnedAddablePanels?(input: {\n layout: WorkbenchLayout;\n mode: WorkbenchModeContribution | undefined;\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n }): readonly WorkbenchCompositionAddablePanel[];\n}\nconst isOpenSingleton = (\n widget: RegisteredWidgetContribution,\n placements: readonly WorkbenchWidgetPlacement[],\n resource: ResourceRef | undefined,\n) => {\n if (!widget.singleton) return false;\n return placements.some((placement) => {\n if (placement.contributionId !== widget.id) return false;\n const scopedResourceKey = placement.role === \"location\" ? placement.resourceKey : placement.ownerResourceKey;\n return !scopedResourceKey || scopedResourceKey === resourceKey(resource);\n });\n};\nconst addModePanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n mode: WorkbenchModeContribution | undefined;\n modePanels: readonly WorkbenchModeAddablePanel[];\n layout: WorkbenchLayout;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const panel of input.modePanels) {\n if (![\"main\", \"side\", \"secondary\"].includes(panel.region)) continue;\n if (!allowedPanelDestinations({ mode: input.mode, allowedRegions: panel.allowedRegions }).includes(input.region))\n continue;\n const contribution = input.widgets.find((widget) => widget.id === panel.panelId);\n if (!contribution || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n input.addable.set(panel.panelId, { ...panel, region: input.region, contribution });\n }\n};\nconst addRegisteredPanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n mode: WorkbenchModeContribution | undefined;\n modePanels: readonly WorkbenchModeAddablePanel[];\n location: WorkbenchWidgetPlacement | undefined;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const contribution of input.widgets) {\n if (!contribution.eligibleLocations) continue;\n if (![\"main\", \"side\", \"secondary\"].includes(contribution.region)) continue;\n const policy = input.modePanels.find((panel) => panel.panelId === contribution.id);\n if (!allowedPanelDestinations({ mode: input.mode, allowedRegions: policy?.allowedRegions }).includes(input.region))\n continue;\n if (input.addable.has(contribution.id) || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n if (\n !isWorkbenchPanelPlacementVisible(contribution, input.resource, input.mode?.id, undefined, {\n location: input.location,\n })\n )\n continue;\n input.addable.set(contribution.id, { panelId: contribution.id, region: input.region, contribution });\n }\n};\nexport const createWorkbenchCompositionController = (\n input: CreateWorkbenchCompositionControllerInput,\n): WorkbenchCompositionController => ({\n panelsFor(region) {\n const layout = input.getLayout();\n const open = layout.regions[region]?.widgets ?? [];\n const resource = input.getResource();\n const location = getActiveLocationPlacement(layout);\n const mode = input.getActiveMode();\n if (!isWorkbenchModePanelAvailable(mode, region)) return { open, addable: [], closable: [] };\n const placements = open;\n const widgets = input.listWidgets();\n const modePanels = mode?.listAddablePanels?.({ layout, resource }) ?? [];\n const addable = new Map<string, WorkbenchCompositionAddablePanel>();\n for (const panel of input.listOwnedAddablePanels?.({ layout, mode, region, resource }) ?? []) {\n addable.set(panel.panelId, panel);\n }\n addModePanels({ addable, layout, mode, modePanels, placements, region, resource, widgets });\n addRegisteredPanels({ addable, location, mode, modePanels, placements, region, resource, widgets });\n return {\n open,\n addable: [...addable.values()],\n closable: open.filter((placement) => placement.closable === true).map((placement) => placement.contributionId),\n };\n },\n});\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport const workbenchFocusRegions = [\"activity\", \"sidenav\", \"main\", \"secondary\", \"side\", \"status\"] as const;\n\nexport type WorkbenchFocusRegionId = (typeof workbenchFocusRegions)[number];\n\nexport type WorkbenchFocusChangeListener = (region: WorkbenchFocusRegionId | undefined) => void;\n\nexport interface WorkbenchFocusState {\n activeRegion: WorkbenchFocusRegionId | undefined;\n}\n\nexport interface WorkbenchFocusController {\n store: WorkbenchStore<WorkbenchFocusState>;\n setActiveRegion(region: WorkbenchFocusRegionId): void;\n clearFocus(): void;\n getActiveRegion(): WorkbenchFocusRegionId | undefined;\n onDidChange(listener: WorkbenchFocusChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchFocusControllerInput {\n context: ContextKeyService;\n isRegionFocusable?: (region: WorkbenchFocusRegionId) => boolean;\n}\n\nconst focusContextByRegion = {\n activity: \"activityFocus\",\n sidenav: \"sidenavFocus\",\n main: \"mainFocus\",\n secondary: \"secondaryFocus\",\n side: \"sideFocus\",\n status: \"statusFocus\",\n} as const satisfies Record<WorkbenchFocusRegionId, string>;\n\nexport const createWorkbenchFocusController = (\n input: CreateWorkbenchFocusControllerInput,\n): WorkbenchFocusController => {\n const store = createWorkbenchStore<WorkbenchFocusState>({\n name: \"workbench.focus\",\n initialState: { activeRegion: undefined },\n });\n const context = input.context.createScope(\"workbench.focus\");\n\n const applyContext = (region: WorkbenchFocusRegionId | undefined) => {\n context.set(\"workbenchFocus\", region !== undefined);\n context.set(\"activeWorkbenchFocusRegion\", region);\n for (const focusRegion of workbenchFocusRegions) {\n context.set(focusContextByRegion[focusRegion], focusRegion === region);\n }\n };\n\n applyContext(undefined);\n\n return {\n store,\n\n setActiveRegion(region) {\n if (input.isRegionFocusable?.(region) === false) return;\n if (store.getState().activeRegion === region) return;\n store.setState({ activeRegion: region }, false, \"setActiveWorkbenchFocusRegion\");\n applyContext(region);\n },\n\n clearFocus() {\n if (store.getState().activeRegion === undefined) return;\n store.setState({ activeRegion: undefined }, false, \"clearWorkbenchFocusRegion\");\n applyContext(undefined);\n },\n\n getActiveRegion() {\n return store.getState().activeRegion;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeRegion,\n (region) => listener(region),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { 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 { PageLocation, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTreeRegistry, NavigationTreeSlot } from \"../../registries/navigation/navigation-tree-registry\";\nimport type { WorkbenchPageContribution } from \"../../registries/pages/page-registry\";\nimport type { TreeViewSection } from \"../../registries/renderers/tree-renderer-types\";\nimport { resolveNavigationLevels } from \"./navigation-level\";\n\ninterface LevelNavigationHost {\n modes: { getActiveModeId(): string | undefined };\n pages: {\n store: {\n getState(): { location?: PageLocation; pages: Readonly<Record<string, WorkbenchPageContribution>> };\n };\n };\n navigationTrees: NavigationTreeRegistry;\n getPrimaryResource(): ResourceRef | undefined;\n}\n\nconst pinnedOnly = (sections: TreeViewSection[]) =>\n sections\n .filter((section) => section.nodes.length > 0)\n .map((section) => ({ ...section, nodes: section.nodes.map((node) => ({ ...node, pinnedOnly: true })) }));\n\n// Owners can share a section id, such as the navigation root. The first owner keeps its section settings.\nconst mergeSections = (sections: TreeViewSection[]) => {\n const merged = new Map<string, TreeViewSection>();\n for (const section of sections) {\n const current = merged.get(section.id);\n merged.set(section.id, current ? { ...current, nodes: [...current.nodes, ...section.nodes] } : section);\n }\n return [...merged.values()];\n};\n\n// Composes one navigation tree from the active mode and every open Sidenav level.\nexport const createLevelNavigation = (host: LevelNavigationHost) => {\n // The mode and every open level, from the outermost to the innermost.\n const queries = () => {\n const modeId = host.modes.getActiveModeId();\n if (!modeId) return [];\n const state = host.pages.store.getState();\n const levels = resolveNavigationLevels({\n location: state.location,\n pages: Object.values(state.pages),\n navigationTrees: host.navigationTrees,\n });\n const modeOwner = host.navigationTrees.resolveOwner(\"mode\", modeId) ?? {\n kind: \"mode\" as const,\n id: modeId,\n extensionId: \"pstdio\",\n };\n return [\n { owner: modeOwner, resource: host.getPrimaryResource() },\n ...levels.map(({ owner, location }) => ({ owner, resource: location.resource })),\n ];\n };\n\n return {\n getReadKey: () =>\n JSON.stringify(queries().map(({ owner, resource }) => host.navigationTrees.getReadKey(owner, { resource }))),\n\n async getSections(slot: NavigationTreeSlot, signal?: AbortSignal) {\n // Header and footer rows accumulate from the mode inward; the innermost owner fills the body.\n const ordered = slot === \"content\" ? queries().reverse() : queries();\n const sections: TreeViewSection[] = [];\n for (const [index, { owner, resource }] of ordered.entries()) {\n signal?.throwIfAborted();\n const read = await host.navigationTrees.getSections(owner, slot, { resource, signal });\n // Outer body rows stay available, so rows users pinned to the header or footer persist inside levels.\n sections.push(...(slot === \"content\" && index > 0 ? pinnedOnly(read) : read));\n }\n signal?.throwIfAborted();\n return mergeSections(sections);\n },\n\n getDefaultExpandedSectionIds: () => {\n const all = queries();\n return all.flatMap(({ owner }, index) =>\n (index === all.length - 1\n ? ([\"header\", \"content\", \"footer\"] as const)\n : ([\"header\", \"footer\"] as const)\n ).flatMap((slot) => host.navigationTrees.getDefaultExpandedSectionIds(owner, slot)),\n );\n },\n };\n};\n","import type { PageLocation, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { createPagePreparation } from \"./page-preparation\";\nimport type {\n WorkbenchPageOpenInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\n\nexport interface WorkbenchPageLocationCommitInput extends WorkbenchPageOpenInput {\n projectId: string;\n location: PageLocation;\n action: string;\n pageStates?: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n}\n\nexport type WorkbenchPageCloseResolution =\n | {\n kind: \"stay\";\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n target: WorkbenchPageOpenInput;\n locationChanged: boolean;\n }\n | {\n kind: \"parent\";\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n parentId: string;\n };\n\nexport interface WorkbenchPageRegistryInternals<Value> {\n resources: WorkbenchPageResourceCodec;\n prepare: ReturnType<typeof createPagePreparation<Value>>;\n publish(state: WorkbenchPageRegistryStoreState<Value>, action: string): void;\n onDidCommit(listener: () => void): Disposable;\n getPublishingState(): WorkbenchPageRegistryStoreState<Value>;\n connectRuntime(apply: (state: WorkbenchPageRegistryStoreState<Value>) => void): Disposable;\n activateLocation(input: WorkbenchPageLocationCommitInput): void;\n refreshModePlacements(): void;\n refreshShellPlacements(): void;\n clearProject(projectId: string | undefined): void;\n resolveClosePlacement(identity: PlacementIdentity): WorkbenchPageCloseResolution;\n}\n\nconst registryInternals = new WeakMap<object, WorkbenchPageRegistryInternals<unknown>>();\n\nexport const setWorkbenchPageRegistryInternals = <Value>(\n registry: WorkbenchPageRegistry<Value>,\n internals: WorkbenchPageRegistryInternals<Value>,\n) => {\n registryInternals.set(registry, internals as WorkbenchPageRegistryInternals<unknown>);\n};\n\nexport const getWorkbenchPageRegistryInternals = <Value>(registry: WorkbenchPageRegistry<Value>) => {\n const internals = registryInternals.get(registry) as WorkbenchPageRegistryInternals<Value> | undefined;\n if (!internals) throw new Error(\"Workbench page registry internals are unavailable\");\n return internals;\n};\n","import type { NavigationTargetPage, PageLocation, PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { isWorkbenchProjectUrl } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n CreateWorkbenchPageLocationControllerInput,\n ResolvedPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageLocationController,\n WorkbenchPageLocationDiagnostic,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\ninterface PageLocationControllerActionsInput<Value> {\n input: CreateWorkbenchPageLocationControllerInput<Value>;\n historyStore: WorkbenchStore<WorkbenchPageLocationHistoryState>;\n clearProject(projectId: string | undefined): void;\n resetHistory(): void;\n rootLevelTarget(): ResolvedPageLocation;\n restore(projectId: string, source: \"boot\" | \"project-switch\", useCurrentUrl: boolean): WorkbenchPageNavigationResult;\n resolveUrl(projectId: string, entry: WorkbenchPageBrowserEntry): ResolvedPageLocation | undefined;\n normalizeTarget(target: NavigationTargetPage): ResolvedPageLocation;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n locationsEqual(left: PageLocation | undefined, right: PageLocation | undefined): boolean;\n commit(\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ): WorkbenchPageNavigationResult;\n fail(source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown): WorkbenchPageNavigationResult;\n closePlacement(identity: PlacementIdentity): WorkbenchPageNavigationResult;\n removeResource(resource: ResourceRef, retained: readonly PlacementIdentity[]): void;\n canGoBack(): boolean;\n canGoForward(): boolean;\n dispose(): void;\n}\n\nconst hasResolvableCurrentPageUrl = <Value>(actions: PageLocationControllerActionsInput<Value>, projectId: string) => {\n try {\n return Boolean(actions.resolveUrl(projectId, actions.input.browser.current()));\n } catch {\n return false;\n }\n};\n\nexport const createPageLocationControllerActions = <Value>(\n actions: PageLocationControllerActionsInput<Value>,\n): WorkbenchPageLocationController => {\n const { input } = actions;\n return {\n historyStore: actions.historyStore,\n removeResource: actions.removeResource,\n setProject(projectId) {\n if (input.registry.store.getState().projectId === projectId) return;\n actions.clearProject(projectId);\n actions.resetHistory();\n },\n clearProject() {\n actions.clearProject(undefined);\n actions.resetHistory();\n },\n isCurrentProjectUrl: (projectId) => isWorkbenchProjectUrl(input.browser.current().url, projectId),\n hasCurrentPageUrl: (projectId) => hasResolvableCurrentPageUrl(actions, projectId),\n boot: (projectId) => actions.restore(projectId, \"boot\", true),\n switchProject(projectId) {\n actions.clearProject(projectId);\n return actions.restore(projectId, \"project-switch\", false);\n },\n navigate(target) {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return actions.fail(\"navigation\", new Error(\"Cannot navigate before a project is active\"));\n try {\n const resolved = actions.normalizeTarget(target);\n const history = actions.locationsEqual(input.registry.store.getState().location, resolved.location)\n ? \"none\"\n : \"push\";\n return actions.commit(projectId, resolved, history, \"navigatePageLocation\");\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n replay(location) {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return actions.fail(\"history\", new Error(\"Cannot replay a page before a project is active\"));\n try {\n return actions.commit(projectId, actions.normalizeStored(location), \"replace\", \"replayWorkbenchPageHistory\");\n } catch (error) {\n return actions.fail(\"history\", error);\n }\n },\n navigateToParent() {\n const current = input.registry.store.getState();\n if (!current.projectId || !current.location?.parent) {\n return actions.fail(\"navigation\", new Error(\"The active page does not have a parent location\"));\n }\n try {\n return actions.commit(\n current.projectId,\n actions.normalizeStored(current.location.parent),\n \"replace\",\n \"navigateToParentPageLocation\",\n );\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n navigateToRootLevel() {\n const current = input.registry.store.getState();\n if (!current.projectId) {\n return actions.fail(\"navigation\", new Error(\"Cannot navigate before a project is active\"));\n }\n try {\n const resolved = actions.rootLevelTarget();\n const history = actions.locationsEqual(current.location, resolved.location) ? \"none\" : \"push\";\n return actions.commit(current.projectId, resolved, history, \"navigateToRootLevelPageLocation\");\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n closePlacement: actions.closePlacement,\n goBack() {\n if (actions.canGoBack()) input.browser.back();\n },\n goForward() {\n if (actions.canGoForward()) input.browser.forward();\n },\n dispose: actions.dispose,\n };\n};\n","import type {\n FileRendererSectionTarget,\n FileSourcePosition,\n NavigationTargetPage,\n PageLocation,\n PageRef,\n ResourceRef,\n} from \"@pstdio/sdk/extensions\";\nimport { isFileSourcePosition } from \"@pstdio/sdk/extensions\";\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 if (!left || !right) return left === right;\n return workbenchPageLocationKey(left, resources, pages) === workbenchPageLocationKey(right, resources, pages);\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 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.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 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 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 });\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 ...(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 });\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 ...(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 });\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 ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(candidate.position ? { position: candidate.position } : {}),\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}) => {\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 }),\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport { serializeWorkbenchPageUrl } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry\";\nimport { workbenchPageLocationRouteKey } from \"./page-location-normalization\";\nimport type { WorkbenchPageHistoryState, WorkbenchPageLocationDiagnostic } from \"./page-location-types\";\n\nexport const createPageHistoryEntry =\n (input: { pages(): WorkbenchPageContribution[]; resources: WorkbenchPageResourceCodec }) =>\n (projectId: string, location: PageLocation, index: number) => ({\n url: serializeWorkbenchPageUrl({ projectId, location, pages: input.pages(), resources: input.resources }),\n state: {\n kind: \"pstdio.page-location\",\n index,\n projectId,\n routeKey: workbenchPageLocationRouteKey(location, input.resources, input.pages()),\n location,\n } satisfies WorkbenchPageHistoryState,\n });\n\nexport const createPageLocationFailureHandler =\n (report?: (diagnostic: WorkbenchPageLocationDiagnostic) => void) =>\n (source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown) => {\n const diagnostic: WorkbenchPageLocationDiagnostic = {\n code: \"page-location-unresolved\",\n source,\n message: error instanceof Error ? error.message : String(error),\n };\n report?.(diagnostic);\n return { ok: false, diagnostic } as const;\n };\n","import type { NavigationTargetPage } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport type {\n ResolvedPageLocation,\n WorkbenchPageLocationController,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\ninterface PageLocationPreparation<Value> {\n resolve(target: NavigationTargetPage): ResolvedPageLocation;\n commit(state: WorkbenchPageRegistryStoreState<Value>, beforePublish?: () => void): WorkbenchPageNavigationResult;\n}\nconst preparations = new WeakMap<WorkbenchPageLocationController, PageLocationPreparation<unknown>>();\nexport const setPageLocationPreparation = <Value>(\n controller: WorkbenchPageLocationController,\n preparation: PageLocationPreparation<Value>,\n) => preparations.set(controller, preparation as PageLocationPreparation<unknown>);\nexport const getPageLocationPreparation = <Value>(controller: WorkbenchPageLocationController) => {\n const preparation = preparations.get(controller);\n if (!preparation) throw new Error(\"Page location preparation is unavailable\");\n return preparation as PageLocationPreparation<Value>;\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport type { WorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { createPageHistoryEntry } from \"./page-location-history-entry\";\nimport type { CreateWorkbenchPageLocationControllerInput } from \"./page-location-types\";\n\nexport const createPageLocationPublisher = <Value>(\n input: CreateWorkbenchPageLocationControllerInput<Value>,\n internals: WorkbenchPageRegistryInternals<Value>,\n hooks: {\n getIndex(): number;\n commitIndex(index: number, push: boolean): void;\n entry: ReturnType<typeof createPageHistoryEntry>;\n publish(): void;\n rememberRootLevel(location: PageLocation): PageLocation | undefined;\n },\n) => {\n return (\n projectId: string,\n state: WorkbenchPageRegistryStoreState<Value>,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n beforePublish?: () => void,\n ) =>\n batchWorkbenchChanges(() => {\n const location = state.location;\n if (!location) throw new Error(\"Prepared page navigation has no location\");\n const nextIndex = history === \"push\" ? hooks.getIndex() + 1 : hooks.getIndex();\n // Browser history is the commit boundary. Serialization and the browser write\n // can fail, so both precede changes to stores, placement owners, and caches.\n if (history !== \"none\") input.browser[history](hooks.entry(projectId, location, nextIndex));\n hooks.commitIndex(nextIndex, history === \"push\");\n beforePublish?.();\n internals.publish(state, action);\n const rootLevel = hooks.rememberRootLevel(location);\n runWorkbenchEffect(`page location cache for ${projectId}`, () =>\n input.persistence.save(projectId, { location, ...(rootLevel ? { rootLevel } : {}) }),\n );\n if (history !== \"none\") hooks.publish();\n return { ok: true, location } as const;\n });\n};\n","import type { PageLocation, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution } from \"../../registries/pages/page-registry\";\nimport { type ProjectNavigationSources, resolveRootLevelLocation } from \"./navigation-level\";\nimport type { ResolvedPageLocation } from \"./page-location-types\";\n\ninterface RootLevelLocationTrackerInput {\n levels: ProjectNavigationSources;\n pages(): readonly WorkbenchPageContribution[];\n normalize(location: PageLocation): ResolvedPageLocation;\n resourceKey(resource: ResourceRef): string;\n start(): ResolvedPageLocation;\n}\n\nconst usesResource = (location: PageLocation | undefined, matches: (resource: ResourceRef) => boolean): boolean => {\n if (!location) return false;\n return Boolean(location.resource && matches(location.resource)) || usesResource(location.parent, matches);\n};\n\n// Holds the last location inside the project navigation for the active project. Navigation inside a\n// level keeps it, so a breadcrumb that starts with a level page still has somewhere to lead back to.\nexport const createRootLevelLocationTracker = (input: RootLevelLocationTrackerInput) => {\n let saved: PageLocation | undefined;\n\n return {\n restore(location: PageLocation | undefined) {\n saved = location;\n },\n\n remember(location: PageLocation) {\n const resolved = resolveRootLevelLocation({ ...input.levels, location, pages: input.pages() });\n if (resolved) saved = resolved;\n return saved;\n },\n\n // A removed resource cannot be opened again, so the project falls back to its start page.\n forget(resource: ResourceRef) {\n const removed = input.resourceKey(resource);\n if (saved && usesResource(saved, (candidate) => input.resourceKey(candidate) === removed)) saved = undefined;\n },\n\n // A saved location stops resolving once its page is gone, which leaves the start page.\n target() {\n if (!saved) return input.start();\n try {\n return input.normalize(saved);\n } catch {\n return input.start();\n }\n },\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageRegistry } from \"../../registries/pages/page-registry\";\nimport type { WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry-types\";\nimport { normalizeDirectWorkbenchPageLocation } from \"./page-location-normalization\";\nimport type { ResolvedPageLocation, WorkbenchPageLocationDiagnostic } from \"./page-location-types\";\n\ninterface PageOwnerRemovalInput<Value> {\n registry: WorkbenchPageRegistry<Value>;\n pages(): readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n start(): ResolvedPageLocation;\n commit(projectId: string, resolved: ResolvedPageLocation, history: \"replace\", action: string): unknown;\n fail(source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown): unknown;\n}\n\n// Unloading a page contribution can leave the active location without an owner. The nearest page that\n// is still registered takes over; otherwise the project falls back to its start page.\nexport const connectPageOwnerRemoval = <Value>(input: PageOwnerRemovalInput<Value>) =>\n input.registry.store.subscribe((state, previous) => {\n const removedPage = Object.keys(previous.pages).some((pageId) => !state.pages[pageId]);\n if (!removedPage || !state.projectId || state.projectId !== previous.projectId || !previous.location) return;\n try {\n if (state.location) {\n input.normalizeStored(state.location);\n return;\n }\n } catch (error) {\n input.fail(\"navigation\", error);\n }\n try {\n const active = state.activePageId ? state.pages[state.activePageId] : undefined;\n const resolved =\n active && state.location\n ? normalizeDirectWorkbenchPageLocation({\n pageId: active.id,\n pages: input.pages(),\n resources: input.resources,\n ...(state.location.resource ? { resource: state.location.resource } : {}),\n ...(state.location.section ? { section: state.location.section } : {}),\n })\n : input.start();\n input.commit(state.projectId, resolved, \"replace\", \"removePageLocationOwner\");\n } catch (error) {\n input.fail(\"navigation\", error);\n }\n });\n","import type { PageLocation, PageRef, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageCloseResolution } from \"../../registries/pages/page-registry-internals\";\nimport type { ResolvedPageLocation, WorkbenchPageNavigationResult } from \"./page-location-types\";\n\ninterface PagePlacementCloserInput {\n commit(\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ): WorkbenchPageNavigationResult;\n fail(source: \"navigation\", error: unknown): WorkbenchPageNavigationResult;\n getCurrent(): { projectId?: string; location?: PageLocation };\n getPageRef(pageId: string): PageRef | undefined;\n normalizePage(page: PageRef): ResolvedPageLocation;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n resolveClosePlacement(identity: PlacementIdentity): WorkbenchPageCloseResolution;\n}\n\nexport const createPagePlacementCloser = (input: PagePlacementCloserInput) => {\n const closeToParent = (\n projectId: string,\n location: PageLocation,\n resolution: Extract<WorkbenchPageCloseResolution, { kind: \"parent\" }>,\n ) => {\n const contextualParent = location.parent ? input.normalizeStored(location.parent) : undefined;\n const parent = input.getPageRef(resolution.parentId);\n if (!parent) throw new Error(`Unknown parent page: ${resolution.parentId}`);\n const resolved = contextualParent?.pageId === resolution.parentId ? contextualParent : input.normalizePage(parent);\n return input.commit(\n projectId,\n { ...resolved, pageStates: resolution.pageStates },\n \"replace\",\n \"closePagePlacementToParent\",\n );\n };\n\n const closeWithinPage = (\n projectId: string,\n location: PageLocation,\n resolution: Extract<WorkbenchPageCloseResolution, { kind: \"stay\" }>,\n ) => {\n const page = input.getPageRef(resolution.target.pageId);\n if (!page) throw new Error(`Unknown page: ${resolution.target.pageId}`);\n const resolved = input.normalizeStored({\n page,\n ...(resolution.target.resource ? { resource: resolution.target.resource } : {}),\n ...(resolution.target.section ? { section: resolution.target.section } : {}),\n ...(location.parent ? { parent: location.parent } : {}),\n });\n return input.commit(\n projectId,\n {\n ...resolved,\n pageStates: resolution.pageStates,\n ...(resolution.target.open ? { open: resolution.target.open } : {}),\n },\n resolution.locationChanged ? \"replace\" : \"none\",\n \"closePagePlacement\",\n );\n };\n\n return (identity: PlacementIdentity) => {\n const current = input.getCurrent();\n if (!current.projectId || !current.location) {\n return input.fail(\"navigation\", new Error(\"Cannot close a page placement without an active location\"));\n }\n try {\n if (identity.kind !== \"page\") throw new Error(\"Only page-owned placements can close through page navigation\");\n const resolution = input.resolveClosePlacement(identity);\n return resolution.kind === \"parent\"\n ? closeToParent(current.projectId, current.location, resolution)\n : closeWithinPage(current.projectId, current.location, resolution);\n } catch (error) {\n return input.fail(\"navigation\", error);\n }\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 } from \"@pstdio/sdk/extensions\";\nimport { workbenchPageLocationKey } from \"../../controllers/page-location/page-location-normalization\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"./page-registry-types\";\n\nexport const pageStateKey = (\n page: WorkbenchPageContribution,\n location: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n) =>\n page.main.kind === \"panels\" && location\n ? `${page.id}|${workbenchPageLocationKey({ ...location, position: undefined }, resources)}`\n : page.id;\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 { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../layout/placement-reconciliation\";\nimport { primarySlot } from \"./page-main\";\nimport type { WorkbenchPageRegistryStoreState, WorkbenchPageResourceCodec } from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\n/** Reconcile the state owner, including pages that have no current layout widgets. */\nexport const removePageResource = <Value>(\n state: WorkbenchPageRegistryStoreState<Value>,\n resource: ResourceRef,\n resources: WorkbenchPageResourceCodec,\n retained: readonly PlacementIdentity[],\n) => {\n const key = (value: ResourceRef) => resources.toUri(resources.normalize(value));\n const removedKey = key(resource);\n const keep = new Set(retained.map(placementIdentityKey));\n const pageStates = Object.fromEntries(\n Object.entries(state.pageStates).map(([stateKey, current]) => {\n const pageId = Object.keys(state.pages).find((id) => stateKey === id || stateKey.startsWith(`${id}|`));\n if (!pageId) return [stateKey, current];\n const resourceInstances = Object.fromEntries(\n Object.entries(current.resourceInstances).map(([slotId, instances]) => [\n slotId,\n instances.filter(\n (instance) =>\n key(instance.resource) !== removedKey ||\n keep.has(\n placementIdentityKey({\n kind: \"page\",\n pageId,\n slotId,\n instanceKey: instance.instanceKey,\n }),\n ),\n ),\n ]),\n );\n const primary = primarySlot(state.pages[pageId]!);\n const remaining = primary ? (resourceInstances[primary.id] ?? []) : [];\n let activePrimaryInstanceKey = current.activePrimaryInstanceKey;\n if (\n primary?.item.kind === \"binding\" &&\n !remaining.some((instance) => instance.instanceKey === activePrimaryInstanceKey)\n ) {\n activePrimaryInstanceKey = remaining.at(-1)?.instanceKey;\n }\n return [stateKey, { ...current, resourceInstances, activePrimaryInstanceKey }];\n }),\n );\n let location = state.location;\n const page = state.activePageId ? state.pages[state.activePageId] : undefined;\n if (page && location?.resource && key(location.resource) === removedKey) {\n const current = pageStates[pageStateKey(page, location, resources)];\n const primary = primarySlot(page);\n const remaining = primary ? (current?.resourceInstances[primary.id] ?? []) : [];\n const active = remaining.find((instance) => instance.instanceKey === current?.activePrimaryInstanceKey);\n if (active) location = { ...location, resource: active.resource, section: active.section };\n else if (location.parent) location = location.parent;\n else if (page.parentId) location = { page: state.pages[page.parentId]!.ref };\n }\n return { pageStates, location };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type {\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry-types\";\nimport { removePageResource } from \"../../registries/pages/page-resource-removal\";\nimport { normalizeWorkbenchPageLocation, workbenchPageLocationsEqual } from \"./page-location-normalization\";\nimport type { ResolvedPageLocation } from \"./page-location-types\";\n\nexport const createPageResourceRemover =\n <Value>(input: {\n getState(): WorkbenchPageRegistryStoreState<Value>;\n resources: WorkbenchPageResourceCodec;\n forgetRootLevel(resource: ResourceRef): void;\n commit(projectId: string, location: ResolvedPageLocation, history: \"replace\" | \"none\", action: string): unknown;\n }) =>\n (resource: ResourceRef, retained: readonly PlacementIdentity[]) => {\n input.forgetRootLevel(resource);\n const current = input.getState();\n if (!current.projectId || !current.location) return;\n const next = removePageResource(current, resource, input.resources, retained);\n if (!next.location) return;\n const changed = !workbenchPageLocationsEqual(\n current.location,\n next.location,\n input.resources,\n Object.values(current.pages),\n );\n const resolved = normalizeWorkbenchPageLocation({\n location: next.location,\n pages: Object.values(current.pages),\n resources: input.resources,\n });\n input.commit(\n current.projectId,\n { ...resolved, pageStates: next.pageStates },\n changed ? \"replace\" : \"none\",\n \"removePageResource\",\n );\n };\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport { isWorkbenchProjectUrl, parseWorkbenchPageUrl } from \"@pstdio/sdk/extensions\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { createPageLocationControllerActions } from \"./page-location-actions\";\nimport { createPageHistoryEntry, createPageLocationFailureHandler } from \"./page-location-history-entry\";\nimport {\n normalizeDirectWorkbenchPageLocation,\n normalizeWorkbenchPageLocation,\n normalizeWorkbenchPageTarget,\n workbenchPageLocationRouteKey,\n workbenchPageLocationsEqual,\n} from \"./page-location-normalization\";\nimport { setPageLocationPreparation } from \"./page-location-preparation\";\nimport { createPageLocationPublisher } from \"./page-location-publish\";\nimport { createRootLevelLocationTracker } from \"./page-location-root-level\";\nimport type {\n CreateWorkbenchPageLocationControllerInput,\n ResolvedPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageHistoryState,\n WorkbenchPageLocationController,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\nimport { connectPageOwnerRemoval } from \"./page-owner-removal\";\nimport { createPagePlacementCloser } from \"./page-placement-closer\";\nimport { createPageResourceRemover } from \"./page-resource-remover\";\n\nexport type {\n CreateWorkbenchPageLocationControllerInput,\n PersistedWorkbenchPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageHistoryState,\n WorkbenchPageLocationBrowser,\n WorkbenchPageLocationController,\n WorkbenchPageLocationDiagnostic,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageLocationPersistence,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\nconst isHistoryState = (value: unknown): value is WorkbenchPageHistoryState => {\n if (!value || typeof value !== \"object\") return false;\n const state = value as Partial<WorkbenchPageHistoryState>;\n return (\n state.kind === \"pstdio.page-location\" &&\n typeof state.index === \"number\" &&\n typeof state.projectId === \"string\" &&\n typeof state.routeKey === \"string\" &&\n Boolean(state.location && typeof state.location === \"object\")\n );\n};\n\nexport const createWorkbenchPageLocationController = <Value>(\n input: CreateWorkbenchPageLocationControllerInput<Value>,\n): WorkbenchPageLocationController => {\n const internals = getWorkbenchPageRegistryInternals(input.registry);\n const pages = input.registry.listPages;\n let historyIndex = 0;\n let maxHistoryIndex = 0;\n const historyStore = createWorkbenchStore<WorkbenchPageLocationHistoryState>({\n name: \"workbench.page-location-history\",\n initialState: { canGoBack: false, canGoForward: false },\n });\n const publishHistory = () =>\n historyStore.setState(\n { canGoBack: historyIndex > 0, canGoForward: historyIndex < maxHistoryIndex },\n false,\n \"pageLocationHistory\",\n );\n const resetHistory = () => {\n [historyIndex, maxHistoryIndex] = [0, 0];\n publishHistory();\n };\n\n const fail = createPageLocationFailureHandler(input.reportDiagnostic);\n const historyEntry = createPageHistoryEntry({ pages, resources: internals.resources });\n\n const rootLevel = createRootLevelLocationTracker({\n levels: input,\n pages,\n normalize: (location) => normalizeStored(location),\n resourceKey: (resource) => internals.resources.toUri(internals.resources.normalize(resource)),\n start: () => start(),\n });\n\n const publish = createPageLocationPublisher(input, internals, {\n getIndex: () => historyIndex,\n commitIndex: (index, push) => {\n historyIndex = index;\n if (push) maxHistoryIndex = index;\n },\n entry: historyEntry,\n publish: publishHistory,\n rememberRootLevel: rootLevel.remember,\n });\n const commit = (\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ) => {\n const state = internals.prepare.location(\n {\n pageId: resolved.pageId,\n projectId,\n location: resolved.location,\n action,\n open: resolved.open,\n resource: resolved.location.resource,\n section: resolved.location.section,\n pageStates: resolved.pageStates,\n },\n input.registry.store.getState(),\n );\n return publish(projectId, state, history, action);\n };\n\n const normalizeStored = (location: PageLocation): ResolvedPageLocation =>\n normalizeWorkbenchPageLocation({ location, pages: pages(), resources: internals.resources });\n\n const start = (): ResolvedPageLocation =>\n normalizeWorkbenchPageTarget({\n target: { kind: \"page\", page: input.startPage },\n pages: pages(),\n resources: internals.resources,\n });\n\n const resolveUrl = (projectId: string, entry: WorkbenchPageBrowserEntry) => {\n const parsed = parseWorkbenchPageUrl({\n url: entry.url,\n projectId,\n pages: pages(),\n resources: internals.resources,\n });\n if (!parsed) return undefined;\n const direct = normalizeDirectWorkbenchPageLocation({\n ...parsed,\n pages: pages(),\n resources: internals.resources,\n });\n if (!isHistoryState(entry.state) || entry.state.projectId !== projectId) return direct;\n const contextual = normalizeStored(entry.state.location);\n const directKey = workbenchPageLocationRouteKey(direct.location, internals.resources, pages());\n const contextualKey = workbenchPageLocationRouteKey(contextual.location, internals.resources, pages());\n if (entry.state.routeKey !== directKey || contextualKey !== directKey) return direct;\n return contextual;\n };\n\n const restore = (\n projectId: string,\n source: \"boot\" | \"project-switch\",\n useCurrentUrl: boolean,\n ): WorkbenchPageNavigationResult => {\n try {\n const browserEntry = input.browser.current();\n if (isHistoryState(browserEntry.state) && browserEntry.state.projectId === projectId) {\n historyIndex = browserEntry.state.index;\n maxHistoryIndex = Math.max(maxHistoryIndex, historyIndex);\n } else {\n historyIndex = 0;\n maxHistoryIndex = 0;\n }\n const hasProjectUrl = useCurrentUrl && isWorkbenchProjectUrl(browserEntry.url, projectId);\n const fromUrl = hasProjectUrl ? resolveUrl(projectId, browserEntry) : undefined;\n if (hasProjectUrl && !fromUrl) throw new Error(`Cannot resolve page URL: ${browserEntry.url}`);\n // A URL wins over the saved location, but the saved root level still names the way out of a level.\n const persisted = input.persistence.load(projectId);\n rootLevel.restore(persisted?.rootLevel);\n const saved = hasProjectUrl ? undefined : persisted?.location;\n const resolved = fromUrl ?? (saved ? normalizeStored(saved) : start());\n return commit(projectId, resolved, \"replace\", source === \"boot\" ? \"bootPageLocation\" : \"switchPageProject\");\n } catch (error) {\n fail(source, error);\n try {\n return commit(projectId, start(), \"replace\", `${source}StartFallback`);\n } catch (fallbackError) {\n return fail(source, fallbackError);\n }\n }\n };\n\n const onPopState = (entry: WorkbenchPageBrowserEntry) => {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return;\n try {\n if (isHistoryState(entry.state) && entry.state.projectId === projectId) {\n historyIndex = entry.state.index;\n maxHistoryIndex = Math.max(maxHistoryIndex, historyIndex);\n publishHistory();\n }\n const resolved = resolveUrl(projectId, entry);\n if (!resolved) throw new Error(`Cannot resolve page URL: ${entry.url}`);\n commit(projectId, resolved, \"none\", \"replayPageHistory\");\n } catch (error) {\n fail(\"history\", error);\n }\n };\n const popStateSubscription = input.browser.onPopState(onPopState);\n const pageRemovalSubscription = connectPageOwnerRemoval({\n registry: input.registry,\n pages,\n resources: internals.resources,\n normalizeStored,\n start,\n commit,\n fail,\n });\n\n const closeActivePlacement = createPagePlacementCloser({\n commit,\n fail,\n getCurrent: () => input.registry.store.getState(),\n getPageRef: (pageId) => input.registry.getPage(pageId)?.ref,\n normalizePage: (page) =>\n normalizeWorkbenchPageTarget({\n target: { kind: \"page\", page },\n pages: pages(),\n resources: internals.resources,\n }),\n normalizeStored,\n resolveClosePlacement: internals.resolveClosePlacement,\n });\n\n const controller = createPageLocationControllerActions({\n input,\n historyStore,\n clearProject(projectId) {\n // The remembered root level belongs to the project the user is leaving.\n rootLevel.restore(undefined);\n internals.clearProject(projectId);\n },\n resetHistory,\n rootLevelTarget: rootLevel.target,\n restore,\n resolveUrl,\n normalizeTarget: (target) =>\n normalizeWorkbenchPageTarget({\n target,\n pages: pages(),\n resources: internals.resources,\n active: input.registry.store.getState().location,\n }),\n normalizeStored,\n locationsEqual: (left, right) => workbenchPageLocationsEqual(left, right, internals.resources, pages()),\n commit,\n fail,\n closePlacement: closeActivePlacement,\n removeResource: createPageResourceRemover({\n getState: input.registry.store.getState,\n resources: internals.resources,\n forgetRootLevel: rootLevel.forget,\n commit,\n }),\n canGoBack: () => historyIndex > 0,\n canGoForward: () => historyIndex < maxHistoryIndex,\n dispose() {\n popStateSubscription.dispose();\n pageRemovalSubscription();\n },\n });\n setPageLocationPreparation<Value>(controller, {\n resolve: (target) =>\n normalizeWorkbenchPageTarget({\n target,\n pages: pages(),\n resources: internals.resources,\n active: input.registry.store.getState().location,\n }),\n commit: (state, beforePublish) => {\n if (!state.projectId || !state.location) throw new Error(\"Cannot navigate before a project is active\");\n const history = workbenchPageLocationsEqual(\n input.registry.store.getState().location,\n state.location,\n internals.resources,\n pages(),\n )\n ? \"none\"\n : \"push\";\n return publish(state.projectId, state, history, \"navigateCompoundTarget\", beforePublish);\n },\n });\n return controller;\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\n\nexport interface WorkbenchPanelMenuState {\n openByMenuId: Record<string, boolean>;\n}\n\nexport interface PersistedWorkbenchPanelMenuState {\n openByMenuId: Record<string, boolean>;\n}\n\nexport interface WorkbenchPanelMenuStatePersistenceAdapter {\n getMenuStates(scope?: string): PersistedWorkbenchPanelMenuState | undefined;\n setMenuStates(state: PersistedWorkbenchPanelMenuState, scope?: string): void;\n}\n\nexport type WorkbenchPanelMenuStateChangeListener = (state: WorkbenchPanelMenuState) => void;\n\nexport interface WorkbenchPanelMenuStateController {\n store: WorkbenchStore<WorkbenchPanelMenuState>;\n isOpen(menuId: string): boolean;\n setOpen(menuId: string, open: boolean): void;\n toggle(menuId: string): void;\n setPersistenceScope(scope: string | undefined): void;\n getPersistenceScope(): string | undefined;\n onDidChange(listener: WorkbenchPanelMenuStateChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchPanelMenuStateControllerInput {\n persistence?: WorkbenchPanelMenuStatePersistenceAdapter;\n}\n\nexport const createWorkbenchPanelMenuStateController = (\n input: CreateWorkbenchPanelMenuStateControllerInput = {},\n): WorkbenchPanelMenuStateController => {\n let currentScope: string | undefined;\n const persisted = runWorkbenchEffect(`panel menu cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getMenuStates(currentScope),\n );\n const resolveOpenByMenuId = (state: PersistedWorkbenchPanelMenuState | undefined) => ({\n ...state?.openByMenuId,\n });\n\n const store = createWorkbenchStore<WorkbenchPanelMenuState>({\n name: \"workbench.panelMenuState\",\n initialState: { openByMenuId: resolveOpenByMenuId(persisted) },\n });\n\n const persistState = () => {\n if (!input.persistence) return;\n runWorkbenchEffect(`panel menu cache write for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.setMenuStates({ openByMenuId: store.getState().openByMenuId }, currentScope),\n );\n };\n\n const isOpen = (menuId: string) => store.getState().openByMenuId[menuId] ?? true;\n\n return {\n store,\n\n isOpen,\n\n setOpen(menuId, open) {\n const snapshot = store.getState();\n if ((snapshot.openByMenuId[menuId] ?? true) === open) return;\n store.setState(\n {\n openByMenuId: { ...snapshot.openByMenuId, [menuId]: open },\n },\n false,\n \"setMenuOpen\",\n );\n persistState();\n },\n\n toggle(menuId) {\n this.setOpen(menuId, !isOpen(menuId));\n },\n\n setPersistenceScope(scope) {\n if (scope === currentScope) return;\n persistState();\n currentScope = scope;\n const incoming = runWorkbenchEffect(`panel menu cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getMenuStates(currentScope),\n );\n store.setState({ openByMenuId: resolveOpenByMenuId(incoming) }, false, \"setPersistenceScope\");\n },\n\n getPersistenceScope: () => currentScope,\n\n onDidChange(listener) {\n const unsubscribe = store.subscribe((state) => listener(state));\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchSidePanelMode } from \"../../registries/layout/layout-types\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\n\nexport type { WorkbenchSidePanelMode };\n\nexport type WorkbenchSidePanelChangeListener = (mode: WorkbenchSidePanelMode) => void;\n\nexport interface WorkbenchSidePanelController {\n canFloat(): boolean;\n getMode(): WorkbenchSidePanelMode;\n setMode(mode: WorkbenchSidePanelMode): void;\n onDidChange(listener: WorkbenchSidePanelChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchSidePanelControllerInput {\n layout: Pick<LayoutModel, \"getLayout\" | \"setSidePanelMode\" | \"store\">;\n getFloatingPanels?(): \"visible\" | \"hidden\";\n onDidChangePolicy?(listener: () => void): Disposable;\n initialMode?: WorkbenchSidePanelMode;\n}\n\n// The layout's side region owns the mode, so it follows layout persistence scopes\n// like every other region. The controller only applies the floating policy.\nexport const createWorkbenchSidePanelController = (input: CreateWorkbenchSidePanelControllerInput) => {\n const canFloat = () => input.getFloatingPanels?.() !== \"hidden\";\n const resolveMode = (mode: WorkbenchSidePanelMode) => (!canFloat() && mode === \"floating\" ? \"attached\" : mode);\n const defaultPresentation = input.initialMode === \"attached\" ? \"attached\" : \"floating\";\n const getMode = () => {\n const side = input.layout.getLayout().regions.side;\n return side.visible ? resolveMode(side.presentation ?? defaultPresentation) : \"closed\";\n };\n\n return {\n canFloat,\n getMode,\n setMode: (mode: WorkbenchSidePanelMode) => input.layout.setSidePanelMode(resolveMode(mode)),\n onDidChange(listener: WorkbenchSidePanelChangeListener) {\n let current = getMode();\n const notify = () => {\n const next = getMode();\n if (next === current) return;\n current = next;\n listener(next);\n };\n const unsubscribe = input.layout.store.subscribe(notify);\n const policy = input.onDidChangePolicy?.(notify);\n return createDisposable(() => {\n unsubscribe();\n policy?.dispose();\n });\n },\n };\n};\n","import type {\n TerminalSessionAdapter,\n TerminalSessionError,\n TerminalSessionExit,\n TerminalSessionRequest,\n} from \"@pstdio/sdk/api\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n// The renderer-side terminal contract is shared through the public SDK. Core keeps its\n// Workbench* names as aliases so its API does not depend on @pstdio/ui.\nexport type WorkbenchTerminalSessionRequest = TerminalSessionRequest;\nexport type WorkbenchTerminalSessionExit = TerminalSessionExit;\nexport type WorkbenchTerminalSessionError = TerminalSessionError;\nexport type WorkbenchTerminalSessionAdapter = TerminalSessionAdapter;\n\n// Host-injected session factory. Production hosts back this with a PTY transport;\n// the testbench and stories inject a deterministic scripted opener.\nexport type WorkbenchTerminalSessionOpener = (\n request: WorkbenchTerminalSessionRequest,\n) => Promise<WorkbenchTerminalSessionAdapter>;\n\nexport type WorkbenchTerminalSessionStatus = \"running\" | \"exited\" | \"killed\";\n\nexport interface WorkbenchTerminalSessionModel {\n id: string;\n title: string;\n status: WorkbenchTerminalSessionStatus;\n exit?: WorkbenchTerminalSessionExit;\n}\n\nexport interface WorkbenchTerminalState {\n sessionsById: Record<string, WorkbenchTerminalSessionModel>;\n}\n\nexport interface WorkbenchTerminalSessionSink {\n onData?(chunk: Uint8Array): void;\n onExit?(exit: WorkbenchTerminalSessionExit): void;\n onError?(error: WorkbenchTerminalSessionError): void;\n}\n\nexport interface WorkbenchTerminalController {\n store: WorkbenchStore<WorkbenchTerminalState>;\n /** True once the host injected a session opener. */\n isAvailable(): boolean;\n setSessionOpener(opener: WorkbenchTerminalSessionOpener | null): void;\n /** Opens a session; the live adapter stays host-side and only the id is returned. */\n open(input: {\n bindingId?: string;\n request: WorkbenchTerminalSessionRequest;\n title?: string;\n }): Promise<{ sessionId: string }>;\n write(input: { sessionId: string; data: string | Uint8Array }): void;\n resize(input: { sessionId: string; cols: number; rows: number }): void;\n kill(input: { sessionId: string; signal?: string }): Promise<void>;\n killBinding(bindingId: string): Promise<void>;\n subscribe(sessionId: string, sink: WorkbenchTerminalSessionSink): () => void;\n getSession(sessionId: string): WorkbenchTerminalSessionModel | undefined;\n listSessions(): WorkbenchTerminalSessionModel[];\n /** Kills every live session. Called when the owning workbench is torn down. */\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_SESSION_TITLE = \"Terminal\";\nconst SESSION_HISTORY_LIMIT = 200;\n\nexport const createWorkbenchTerminalController = (): WorkbenchTerminalController => {\n const store = createWorkbenchStore<WorkbenchTerminalState>({\n name: \"workbench.terminal\",\n initialState: { sessionsById: {} },\n });\n\n let opener: WorkbenchTerminalSessionOpener | null = null;\n const adapters = new Map<string, WorkbenchTerminalSessionAdapter>();\n const adapterDisposers = new Map<string, Array<() => void>>();\n const dataHistory = new Map<string, Uint8Array[]>();\n const dataSubscribers = new Map<string, Set<(chunk: Uint8Array) => void>>();\n const sessionIdByBindingId = new Map<string, string>();\n const bindingIdBySessionId = new Map<string, string>();\n const pendingSessionByBindingId = new Map<string, Promise<{ sessionId: string }>>();\n\n const patchSession = (sessionId: string, patch: Partial<WorkbenchTerminalSessionModel>, action: string) => {\n const snapshot = store.getState();\n const session = snapshot.sessionsById[sessionId];\n if (!session) return;\n store.setState(\n { sessionsById: { ...snapshot.sessionsById, [sessionId]: { ...session, ...patch } } },\n false,\n action,\n );\n };\n\n const requireAdapter = (sessionId: string) => {\n const adapter = adapters.get(sessionId);\n if (!adapter) throw new Error(`Unknown terminal session: ${sessionId}`);\n return adapter;\n };\n\n const cleanupSession = (sessionId: string) => {\n adapters.delete(sessionId);\n dataHistory.delete(sessionId);\n dataSubscribers.delete(sessionId);\n const bindingId = bindingIdBySessionId.get(sessionId);\n bindingIdBySessionId.delete(sessionId);\n if (bindingId && sessionIdByBindingId.get(bindingId) === sessionId) sessionIdByBindingId.delete(bindingId);\n const disposers = adapterDisposers.get(sessionId) ?? [];\n adapterDisposers.delete(sessionId);\n for (const dispose of disposers) dispose();\n };\n\n const publishData = (sessionId: string, chunk: Uint8Array) => {\n const history = dataHistory.get(sessionId);\n if (!history) return;\n const snapshot = new Uint8Array(chunk);\n history.push(snapshot);\n if (history.length > SESSION_HISTORY_LIMIT) history.shift();\n for (const subscriber of dataSubscribers.get(sessionId) ?? []) subscriber(snapshot);\n };\n\n const kill = async (input: { sessionId: string; signal?: string }) => {\n const adapter = requireAdapter(input.sessionId);\n await adapter.kill(input.signal);\n patchSession(input.sessionId, { status: \"killed\" }, \"killTerminalSession\");\n cleanupSession(input.sessionId);\n };\n\n const killBinding = async (bindingId: string) => {\n const sessionId = sessionIdByBindingId.get(bindingId);\n if (sessionId && adapters.has(sessionId)) {\n await kill({ sessionId });\n return;\n }\n\n const pending = pendingSessionByBindingId.get(bindingId);\n if (!pending) return;\n const opened = await pending.catch(() => undefined);\n if (opened && adapters.has(opened.sessionId)) await kill({ sessionId: opened.sessionId });\n };\n\n const open = async (input: { bindingId?: string; request: WorkbenchTerminalSessionRequest; title?: string }) => {\n if (!opener) throw new Error(\"Terminal sessions are not available in this workbench host.\");\n\n if (input.bindingId) {\n const sessionId = sessionIdByBindingId.get(input.bindingId);\n if (sessionId && adapters.has(sessionId)) return { sessionId };\n const pending = pendingSessionByBindingId.get(input.bindingId);\n if (pending) return await pending;\n }\n\n const openSession = (async () => {\n const adapter = await opener(input.request);\n adapters.set(adapter.id, adapter);\n dataHistory.set(adapter.id, []);\n dataSubscribers.set(adapter.id, new Set());\n if (input.bindingId) {\n sessionIdByBindingId.set(input.bindingId, adapter.id);\n bindingIdBySessionId.set(adapter.id, input.bindingId);\n }\n\n const disposers = [adapter.onData((chunk) => publishData(adapter.id, chunk))];\n const unsubscribeTitle = adapter.onTitle?.((title) =>\n patchSession(adapter.id, { title }, \"terminalSessionTitleChanged\"),\n );\n if (unsubscribeTitle) disposers.push(unsubscribeTitle);\n disposers.push(\n adapter.onExit((exit) => {\n const session = store.getState().sessionsById[adapter.id];\n if (session?.status === \"running\") {\n patchSession(adapter.id, { status: \"exited\", exit }, \"terminalSessionExited\");\n }\n cleanupSession(adapter.id);\n }),\n );\n adapterDisposers.set(adapter.id, disposers);\n\n const snapshot = store.getState();\n store.setState(\n {\n sessionsById: {\n ...snapshot.sessionsById,\n [adapter.id]: { id: adapter.id, title: input.title ?? DEFAULT_SESSION_TITLE, status: \"running\" },\n },\n },\n false,\n \"openTerminalSession\",\n );\n\n return { sessionId: adapter.id };\n })();\n\n if (input.bindingId) pendingSessionByBindingId.set(input.bindingId, openSession);\n try {\n return await openSession;\n } finally {\n if (input.bindingId && pendingSessionByBindingId.get(input.bindingId) === openSession) {\n pendingSessionByBindingId.delete(input.bindingId);\n }\n }\n };\n\n return {\n store,\n\n isAvailable: () => opener !== null,\n\n setSessionOpener(next) {\n opener = next;\n },\n\n open,\n\n write(input) {\n requireAdapter(input.sessionId).write(input.data);\n },\n\n resize(input) {\n requireAdapter(input.sessionId).resize(input.cols, input.rows);\n },\n\n kill,\n\n killBinding,\n\n subscribe(sessionId, sink) {\n const adapter = requireAdapter(sessionId);\n const unsubscribes: Array<(() => void) | undefined> = [];\n if (sink.onData) {\n const onData = sink.onData;\n const subscribers = dataSubscribers.get(sessionId);\n subscribers?.add(onData);\n unsubscribes.push(() => subscribers?.delete(onData));\n for (const chunk of dataHistory.get(sessionId) ?? []) onData(chunk);\n }\n unsubscribes.push(\n sink.onExit ? adapter.onExit(sink.onExit) : undefined,\n sink.onError ? adapter.onError(sink.onError) : undefined,\n );\n return () => {\n for (const unsubscribe of unsubscribes) unsubscribe?.();\n };\n },\n\n getSession(sessionId) {\n return store.getState().sessionsById[sessionId];\n },\n\n listSessions() {\n return Object.values(store.getState().sessionsById);\n },\n\n async dispose() {\n const running = Object.values(store.getState().sessionsById).filter((session) => session.status === \"running\");\n await Promise.all(running.map((session) => kill({ sessionId: session.id })));\n for (const session of Object.values(store.getState().sessionsById)) cleanupSession(session.id);\n adapters.clear();\n },\n };\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface CommandPaletteResourceQueryContext {\n query: string;\n limit: number;\n signal?: AbortSignal;\n}\n\n// A single dynamic palette result. `activate` is supplied by whoever registers the\n// provider (e.g. the extension host running a command or opening a resource), keeping\n// this registry free of command/resource execution concerns.\nexport interface CommandPaletteResourceResult {\n id: string;\n resource?: ResourceRef;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n group?: string;\n activate(): void | Promise<void>;\n}\n\nexport interface CommandPaletteResourceProvider {\n id: string;\n title: string;\n refreshEventIds?: string[];\n query(context: CommandPaletteResourceQueryContext): Promise<readonly CommandPaletteResourceResult[]>;\n}\n\nexport interface CommandPaletteResourceProviderResult {\n providerId: string;\n title: string;\n results: readonly CommandPaletteResourceResult[];\n}\n\nexport interface CommandPaletteResourceRegistryStoreState {\n providers: Record<string, CommandPaletteResourceProvider>;\n // Bumped to ask the palette to re-query providers (e.g. after a refresh event).\n refreshToken: number;\n}\n\nexport interface CommandPaletteResourceRegistry {\n store: WorkbenchStore<CommandPaletteResourceRegistryStoreState>;\n registerProvider(provider: CommandPaletteResourceProvider): Disposable;\n listProviders(): CommandPaletteResourceProvider[];\n queryProviders(context: CommandPaletteResourceQueryContext): Promise<CommandPaletteResourceProviderResult[]>;\n refresh(): void;\n}\n\nexport const createCommandPaletteResourceRegistry = (): CommandPaletteResourceRegistry => {\n const store = createWorkbenchStore<CommandPaletteResourceRegistryStoreState>({\n name: \"workbench.commandPaletteResources\",\n initialState: { providers: {}, refreshToken: 0 },\n });\n\n return {\n store,\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) {\n throw new Error(`Command palette resource provider already registered: ${provider.id}`);\n }\n\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n\n listProviders() {\n return Object.values(store.getState().providers);\n },\n\n async queryProviders(context) {\n const providers = Object.values(store.getState().providers);\n return Promise.all(\n providers.map(async (provider) => {\n try {\n const results = await provider.query(context);\n return { providerId: provider.id, title: provider.title, results };\n } catch {\n // Error isolation: a failing provider must not blank the palette or break peers.\n return { providerId: provider.id, title: provider.title, results: [] };\n }\n }),\n );\n },\n\n refresh() {\n const snapshot = store.getState();\n store.setState({ ...snapshot, refreshToken: snapshot.refreshToken + 1 }, false, \"refresh\");\n },\n };\n};\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport interface WorkbenchCommandExecutionError {\n commandId: string;\n args: unknown;\n error: unknown;\n}\n\nexport type WorkbenchCommandExecutionErrorListener = (event: WorkbenchCommandExecutionError) => void;\n\nexport interface WorkbenchCommandExecutionContext {\n resource?: ResourceRef;\n signal?: AbortSignal;\n source?: \"panel-add\";\n}\n\nexport interface CommandParamOption {\n label: string;\n value: string;\n icon?: string;\n}\n\nexport interface CommandParamOptionSource {\n commandId: string;\n valueField: string;\n labelField: string;\n params?: Record<string, unknown>;\n}\n\nexport interface CommandParamDescriptor {\n type: string;\n label?: string;\n description?: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: CommandParamOption[] | CommandParamOptionSource;\n allowCustomValues?: boolean;\n templateType?: string;\n resourceType?: string;\n /** Workspace provider ids a `workspace` param may offer. */\n providers?: string[];\n accept?: string;\n multiple?: boolean;\n metadata?: Record<string, unknown>;\n resolvedFrom?: \"resource\";\n}\n\nexport type CommandParamSchema = Record<string, CommandParamDescriptor>;\n\nexport interface Command {\n id: string;\n label: string;\n category?: string;\n description?: string;\n icon?: string;\n when?: string;\n params?: CommandParamSchema;\n resourceMutation?: import(\"@pstdio/sdk/extensions\").CommandDefinition[\"resourceMutation\"];\n}\n\nexport interface CommandHandler<TArgs = unknown, TResult = unknown> {\n prepareArgs?(\n args: TArgs,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: TArgs) => void,\n ): TArgs | Promise<TArgs>;\n execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;\n isEnabled?(args: TArgs): boolean;\n isVisible?(args: TArgs): boolean;\n isToggled?(args: TArgs): boolean;\n}\n\nexport interface RegisteredCommand extends RegisteredContributionMetadata {\n command: Command;\n handler: CommandHandler;\n}\n\nexport interface CommandRegistryStoreState {\n commands: Record<string, RegisteredCommand>;\n}\n\nexport interface CommandRegistry {\n store: WorkbenchStore<CommandRegistryStoreState>;\n registerCommand<TArgs = unknown, TResult = unknown>(\n command: Command,\n handler: CommandHandler<TArgs, TResult>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getCommand(id: string): RegisteredCommand | undefined;\n listCommands(): RegisteredCommand[];\n isCommandEnabled(id: string, args?: unknown): boolean;\n isCommandVisible(id: string, args?: unknown): boolean;\n isCommandToggled(id: string, args?: unknown): boolean;\n prepareCommandArgs(\n id: string,\n args: unknown,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n ): Promise<unknown>;\n executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;\n onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable;\n}\n\nexport interface CreateCommandRegistryInput {\n context?: ContextKeyService;\n}\n\nexport const createCommandRegistry = (input: CreateCommandRegistryInput = {}): CommandRegistry => {\n const store = createWorkbenchStore<CommandRegistryStoreState>({\n name: \"workbench.commands\",\n initialState: { commands: {} },\n });\n\n const errorListeners = new Set<WorkbenchCommandExecutionErrorListener>();\n\n const requireCommand = (id: string) => {\n const record = store.getState().commands[id];\n if (!record) throw new Error(`Command not registered: ${id}`);\n return record;\n };\n\n const emitError = (event: WorkbenchCommandExecutionError) => {\n for (const listener of errorListeners) listener(event);\n };\n\n return {\n store,\n\n registerCommand(command, handler, metadata) {\n const snapshot = store.getState();\n if (snapshot.commands[command.id]) throw new Error(`Command already registered: ${command.id}`);\n\n const record: RegisteredCommand = {\n ...normalizeContributionMetadata(metadata),\n command,\n handler: handler as CommandHandler,\n };\n\n store.setState({ commands: { ...snapshot.commands, [command.id]: record } }, false, \"registerCommand\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.commands[command.id] !== record) return;\n const { [command.id]: _removed, ...rest } = current.commands;\n store.setState({ commands: rest }, false, \"unregisterCommand\");\n });\n },\n\n getCommand(id) {\n return store.getState().commands[id];\n },\n\n listCommands() {\n return Object.values(store.getState().commands).sort(byContributionPriority);\n },\n\n isCommandEnabled(id, args) {\n return requireCommand(id).handler.isEnabled?.(args) ?? true;\n },\n\n isCommandVisible(id, args) {\n const record = requireCommand(id);\n if (!input.context?.matches(record.command.when)) return false;\n return record.handler.isVisible?.(args) ?? true;\n },\n\n isCommandToggled(id, args) {\n return requireCommand(id).handler.isToggled?.(args) ?? false;\n },\n\n async prepareCommandArgs(id, args, context, onArgsChange) {\n const prepare = requireCommand(id).handler.prepareArgs;\n return prepare ? prepare(args, context, onArgsChange) : args;\n },\n\n async executeCommand(id, args, context) {\n const record = requireCommand(id);\n if (record.handler.isEnabled?.(args) === false) {\n const error = new Error(`Command is disabled: ${id}`);\n emitError({ commandId: id, args, error });\n throw error;\n }\n try {\n return await record.handler.execute(args, context);\n } catch (error) {\n emitError({ commandId: id, args, error });\n throw error;\n }\n },\n\n onDidExecuteError(listener) {\n errorListeners.add(listener);\n return createDisposable(() => {\n errorListeners.delete(listener);\n });\n },\n };\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\n\nexport type MenuPath = readonly string[];\n\nexport interface MenuItem {\n commandId: string;\n sourceCommandId?: string;\n label?: string;\n description?: string;\n icon?: string;\n iconSrc?: string;\n overflowLabel?: string;\n when?: string;\n group?: string;\n order?: number;\n args?: unknown;\n readOnly?: boolean;\n /** Marks a menu action that navigates outside the app, rendered with a trailing external-link icon. */\n external?: boolean;\n}\n\nexport interface RegisteredMenuItem extends MenuItem, RegisteredContributionMetadata {\n path: MenuPath;\n}\n\ninterface MenuRegistryDeps {\n commands: CommandRegistry;\n}\n\nconst menuPathKey = (path: MenuPath) => path.join(\"/\");\n\nexport interface MenuRegistryStoreState {\n itemsByPath: Record<string, RegisteredMenuItem[]>;\n}\n\nexport interface MenuRegistry {\n menuStore: WorkbenchStore<MenuRegistryStoreState>;\n registerMenuItem(path: MenuPath, item: MenuItem, metadata?: ContributionMetadata): Disposable;\n listMenuItems(path: MenuPath): RegisteredMenuItem[];\n}\n\nexport const createMenuRegistry = (deps: MenuRegistryDeps): MenuRegistry => {\n const menuStore = createWorkbenchStore<MenuRegistryStoreState>({\n name: \"workbench.menus\",\n initialState: { itemsByPath: {} },\n });\n\n return {\n menuStore,\n\n registerMenuItem(path, item, metadata) {\n if (!deps.commands.getCommand(item.commandId)) throw new Error(`Menu command not registered: ${item.commandId}`);\n\n const key = menuPathKey(path);\n const record: RegisteredMenuItem = {\n ...normalizeContributionMetadata(metadata),\n ...item,\n path,\n };\n const snapshot = menuStore.getState();\n const items = snapshot.itemsByPath[key] ?? [];\n menuStore.setState(\n {\n itemsByPath: { ...snapshot.itemsByPath, [key]: [...items, record] },\n },\n false,\n \"registerMenuItem\",\n );\n\n return createDisposable(() => {\n const current = menuStore.getState();\n const list = current.itemsByPath[key] ?? [];\n const filtered = list.filter((entry) => entry !== record);\n if (filtered.length === list.length) return;\n menuStore.setState(\n {\n itemsByPath: { ...current.itemsByPath, [key]: filtered },\n },\n false,\n \"unregisterMenuItem\",\n );\n });\n },\n\n listMenuItems(path) {\n return [...(menuStore.getState().itemsByPath[menuPathKey(path)] ?? [])].sort((left, right) => {\n const leftOrder = left.order ?? 0;\n const rightOrder = right.order ?? 0;\n return leftOrder - rightOrder || byContributionPriority(left, right);\n });\n },\n };\n};\n","import 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","// A one-resource binding owns one live view; its resource is updated in place.\nexport const SINGLE_RESOURCE_INSTANCE_KEY = \"single\";\n","import type { PageOpenIntent, PlacementItem } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"./placement-instance-key\";\nexport type WorkbenchPlacementPresence = \"fixed\" | \"open\" | \"closed\";\nexport type WorkbenchOwnedPlacementItem = PlacementItem;\nexport const placementItemViewId = (item: PlacementItem) =>\n contributionRefId(item.kind === \"view\" ? item.view : item.binding.view);\n/** A user's explicit open or close of an optional static placement. */\nexport type StaticPlacementOverride = \"open\" | \"closed\";\nexport interface OwnedResourceInstance {\n instanceKey: string;\n resource: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface OwnedPlacementState {\n staticOverrides: Map<string, StaticPlacementOverride>;\n resourceInstances: Map<string, readonly OwnedResourceInstance[]>;\n}\nexport const createOwnedPlacementState = (): OwnedPlacementState => ({\n staticOverrides: new Map(),\n resourceInstances: new Map(),\n});\nexport const isStaticPlacementOpen = (item: WorkbenchOwnedPlacementItem, state: OwnedPlacementState, id: string) => {\n if (item.kind !== \"view\") return false;\n if (item.presence === \"fixed\") return true;\n return (state.staticOverrides.get(id) ?? item.presence) === \"open\";\n};\nexport const staticPlacementClosable = (item: WorkbenchOwnedPlacementItem) =>\n item.kind !== \"view\" || item.presence !== \"fixed\";\nexport const validateOwnedPlacementItem = (label: string, id: string, item: WorkbenchOwnedPlacementItem) => {\n if (item.kind === \"binding\" && item.binding.kinds.length === 0) {\n throw new Error(`${label} \"${id}\" must bind at least one resource kind`);\n }\n};\nexport const openStaticPlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"view\") throw new Error(`${label} \"${id}\" is not a static placement`);\n if (input.resource) throw new Error(`${label} \"${id}\" does not accept a resource`);\n if (input.open) throw new Error(`${label} \"${id}\" does not accept an open intent`);\n if (item.presence !== \"fixed\") state.staticOverrides.set(id, \"open\");\n};\nexport const closeStaticPlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"view\") throw new Error(`${label} \"${id}\" is not a static placement`);\n if (item.presence === \"fixed\") throw new Error(`${label} \"${id}\" is fixed and cannot close`);\n state.staticOverrides.set(id, \"closed\");\n};\nconst retainResourceInstances = (\n item: Extract<\n WorkbenchOwnedPlacementItem,\n {\n kind: \"binding\";\n }\n >,\n current: readonly OwnedResourceInstance[],\n next: OwnedResourceInstance,\n): readonly OwnedResourceInstance[] => {\n if (item.binding.cardinality === \"one\") return [next];\n const existing = current.find((candidate) => candidate.instanceKey === next.instanceKey);\n const open: PageOpenIntent = existing?.open === \"pin\" || next.open === \"pin\" ? \"pin\" : \"preview\";\n const retained = current.filter(\n (candidate) => candidate.instanceKey !== next.instanceKey && (open === \"pin\" || candidate.open === \"pin\"),\n );\n return [...retained, { ...next, open }];\n};\n// An instance keeps the key it opened with while updates change its resource, so an open\n// resource is found by what the instance shows now. A new instance never reuses a taken key.\nconst resourceInstanceKey = (current: readonly OwnedResourceInstance[], resource: ResourceRef) => {\n const key = resourceKey(resource);\n const shown = current.find((instance) => resourceKey(instance.resource) === key);\n if (shown) return shown.instanceKey;\n const taken = new Set(current.map((instance) => instance.instanceKey));\n let instanceKey = key;\n for (let suffix = 2; taken.has(instanceKey); suffix += 1) instanceKey = `${key}#${suffix}`;\n return instanceKey;\n};\nexport const openResourcePlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"binding\") throw new Error(`${label} \"${id}\" is not resource-backed`);\n if (!input.resource) throw new Error(`${label} \"${id}\" requires a resource`);\n if (!resourceMatchesConstraint(item.binding, input.resource)) {\n throw new Error(`${label} \"${id}\" does not accept resource kind \"${input.resource.type}\"`);\n }\n if (input.open && item.binding.cardinality !== \"many\") {\n throw new Error(`${label} \"${id}\" accepts open intent only with many cardinality`);\n }\n const current = state.resourceInstances.get(id) ?? [];\n const instance: OwnedResourceInstance = {\n instanceKey:\n item.binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : resourceInstanceKey(current, input.resource),\n resource: input.resource,\n ...(item.binding.cardinality === \"many\" ? { open: input.open ?? (\"preview\" as const) } : {}),\n ...(input.title ? { title: input.title } : {}),\n };\n state.resourceInstances.set(id, retainResourceInstances(item, current, instance));\n return instance.instanceKey;\n};\nexport const closeOwnedPlacementInstance = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n instanceKey: string;\n}) => {\n if (input.instanceKey === \"default\") {\n closeStaticPlacement(input);\n return true;\n }\n const current = input.state.resourceInstances.get(input.id) ?? [];\n const next = current.filter((instance) => instance.instanceKey !== input.instanceKey);\n if (next.length === current.length) return false;\n input.state.resourceInstances.set(input.id, next);\n return true;\n};\nexport const updateResourcePlacementInstance = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n instanceKey: string;\n resource?: ResourceRef;\n title?: string;\n open?: PageOpenIntent;\n}) => {\n const { id, item, label, state } = input;\n if (input.instanceKey === \"default\" || item.kind !== \"binding\") return;\n if (input.resource && !resourceMatchesConstraint(item.binding, input.resource)) {\n throw new Error(`${label} \"${id}\" does not accept resource kind \"${input.resource.type}\"`);\n }\n const instances = state.resourceInstances.get(id) ?? [];\n state.resourceInstances.set(\n id,\n instances\n .filter(\n (instance) => input.open !== \"preview\" || instance.open === \"pin\" || instance.instanceKey === input.instanceKey,\n )\n .map((instance) =>\n instance.instanceKey === input.instanceKey\n ? {\n ...instance,\n ...(input.open ? { open: input.open } : {}),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.title === undefined ? {} : { title: input.title }),\n }\n : instance,\n ),\n );\n};\nexport const clearOwnedPlacementState = (state: OwnedPlacementState, id: string) => {\n state.staticOverrides.delete(id);\n state.resourceInstances.delete(id);\n};\n","import type { PageLocation, PageOpenIntent, PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport {\n type OwnedPlacementState,\n openResourcePlacement,\n openStaticPlacement,\n type WorkbenchOwnedPlacementItem,\n} from \"./owned-placement-lifecycle\";\n\nexport interface OwnedPlacementOpenInput {\n placementId: string;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface OwnedPlacementLocationContext {\n modeId: string;\n pageId?: string;\n projectId?: string;\n location?: PageLocation;\n}\nexport interface OwnedPlacementPreparation {\n connectRuntime(listener: () => void): Disposable;\n restore?(\n context: OwnedPlacementLocationContext,\n state?: OwnedPlacementState,\n previousContext?: OwnedPlacementLocationContext,\n ): OwnedPlacementState;\n adopt?(\n modeId: string,\n placements: readonly WorkbenchWidgetPlacement[],\n state?: OwnedPlacementState,\n ): OwnedPlacementState;\n getState(): OwnedPlacementState;\n open(\n target: OwnedPlacementOpenInput,\n current?: OwnedPlacementState,\n ): { state: OwnedPlacementState; identity: PlacementIdentity };\n resolve(modeId?: string, state?: OwnedPlacementState): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n apply(state: OwnedPlacementState): void;\n publish(): void;\n}\nconst preparations = new WeakMap<object, OwnedPlacementPreparation>();\nexport const setOwnedPlacementPreparation = (registry: object, preparation: OwnedPlacementPreparation) =>\n preparations.set(registry, preparation);\nexport const getOwnedPlacementPreparation = (registry: object) => {\n const preparation = preparations.get(registry);\n if (!preparation) throw new Error(\"Owned placement preparation is unavailable\");\n return preparation;\n};\nexport const prepareOwnedPlacement = (input: {\n label: string;\n target: OwnedPlacementOpenInput;\n item: WorkbenchOwnedPlacementItem;\n current: OwnedPlacementState;\n identityFor(instanceKey: string): PlacementIdentity;\n}) => {\n const state = {\n staticOverrides: new Map(input.current.staticOverrides),\n resourceInstances: new Map(input.current.resourceInstances),\n };\n const operation = { ...input.target, label: input.label, id: input.target.placementId, item: input.item, state };\n let instanceKey = \"default\";\n if (input.item.kind === \"view\") openStaticPlacement(operation);\n else instanceKey = openResourcePlacement(operation);\n return { state, identity: input.identityFor(instanceKey) };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { OwnedPlacementState, WorkbenchOwnedPlacementItem } from \"./owned-placement-lifecycle\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"./placement-instance-key\";\n\nexport const restoreOwnedPlacementState = (input: {\n state: OwnedPlacementState;\n declarations: readonly { id: string; item: WorkbenchOwnedPlacementItem }[];\n saved: readonly WorkbenchWidgetPlacement[];\n owns(identity: PlacementIdentity): boolean;\n}) => {\n const state = {\n staticOverrides: new Map(input.state.staticOverrides),\n resourceInstances: new Map(input.state.resourceInstances),\n };\n for (const placement of input.declarations) {\n const saved = input.saved.filter((candidate) => {\n const identity = candidate.placementIdentity;\n return identity && input.owns(identity) && identity.kind !== \"page\" && identity.placementId === placement.id;\n });\n if (placement.item.kind === \"view\") {\n state.staticOverrides.set(placement.id, saved.length ? \"open\" : \"closed\");\n continue;\n }\n const binding = placement.item.binding;\n const instances = saved.flatMap((candidate) => {\n if (\n !candidate.resource ||\n !candidate.placementIdentity ||\n !resourceMatchesConstraint(binding, candidate.resource)\n )\n return [];\n return [\n {\n instanceKey:\n binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : candidate.placementIdentity.instanceKey,\n resource: candidate.resource,\n title: candidate.title,\n ...(binding.cardinality === \"many\"\n ? { open: candidate.tabRetention === \"preview\" ? (\"preview\" as const) : (\"pin\" as const) }\n : {}),\n },\n ];\n });\n state.resourceInstances.set(placement.id, binding.cardinality === \"one\" ? instances.slice(-1) : instances);\n }\n return state;\n};\n","import type { DockedWorkbenchRegion, PageOpenIntent, PlacementIdentity, PlacementRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { notifyWorkbenchChange } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport { createPlacement } from \"../layout/layout-operations\";\nimport type { RegisteredWidgetContribution, WorkbenchLayout, WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport {\n clearOwnedPlacementState,\n closeOwnedPlacementInstance,\n createOwnedPlacementState,\n isStaticPlacementOpen,\n placementItemViewId,\n staticPlacementClosable,\n updateResourcePlacementInstance,\n validateOwnedPlacementItem,\n type WorkbenchOwnedPlacementItem,\n} from \"../placements/owned-placement-lifecycle\";\nimport type { OwnedPlacementLocationContext } from \"../placements/owned-placement-preparation\";\nimport {\n type OwnedPlacementPreparation,\n prepareOwnedPlacement,\n setOwnedPlacementPreparation,\n} from \"../placements/owned-placement-preparation\";\nimport { restoreOwnedPlacementState } from \"../placements/owned-placement-restoration\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport {\n modePlacementContributionId,\n registerWorkbenchViewPlacement,\n type WorkbenchPlacementPresentation,\n} from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchModePlacementContribution extends WorkbenchPlacementPresentation {\n readonly id: string;\n readonly ref: PlacementRef;\n readonly modeId: string;\n readonly item: WorkbenchOwnedPlacementItem;\n readonly region: DockedWorkbenchRegion;\n readonly order?: number;\n readonly movableTo?: readonly DockedWorkbenchRegion[];\n}\n\ninterface OpenModePlacementTarget {\n panel: PlacementRef;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n}\n\nexport interface WorkbenchModePlacementRegistry {\n registerPlacement(placement: WorkbenchModePlacementContribution): Disposable;\n getPlacement(ref: PlacementRef): WorkbenchModePlacementContribution | undefined;\n listPlacements(modeId?: string): WorkbenchModePlacementContribution[];\n openPlacement(input: OpenModePlacementTarget): PlacementIdentity;\n updatePlacement(\n identity: PlacementIdentity,\n input: { resource?: ResourceRef; title?: string; open?: PageOpenIntent },\n ): void;\n closePlacement(identity: PlacementIdentity): void;\n resolvePlacements(\n modeId: string,\n context?: OwnedPlacementLocationContext,\n ): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n onDidChange(listener: () => void): Disposable;\n}\n\nconst identityFor = (placement: WorkbenchModePlacementContribution, instanceKey: string): PlacementIdentity => ({\n kind: \"mode\",\n modeId: placement.modeId,\n placementId: placement.id,\n instanceKey,\n});\n\nconst tabState = (open: PageOpenIntent | undefined) => {\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n if (open === \"preview\") return { pinned: false, tabRetention: \"preview\" as const };\n return {};\n};\n\nconst placementRefKey = (ref: PlacementRef) => JSON.stringify([ref.extensionId, ref.id]);\n\nconst validatePlacement = (input: {\n placement: WorkbenchModePlacementContribution;\n placements: Map<string, WorkbenchModePlacementContribution>;\n refs: Map<string, WorkbenchModePlacementContribution>;\n views: WorkbenchViewRegistry;\n}) => {\n const { placement, placements, refs, views } = input;\n if (placements.has(placement.id)) throw new Error(`Mode placement already registered: ${placement.id}`);\n if (placement.ref.kind !== \"placement\" || !placement.ref.extensionId || !placement.ref.id) {\n throw new Error(`Mode placement \"${placement.id}\" must declare a normalized placement ref`);\n }\n const refKey = placementRefKey(placement.ref);\n if (refs.has(refKey)) throw new Error(`Mode placement ref already registered: ${refKey}`);\n if (placement.movableTo && !placement.movableTo.includes(placement.region)) {\n throw new Error(`Mode placement \"${placement.id}\" must include its initial region in movableTo`);\n }\n validateOwnedPlacementItem(\"Mode placement\", placement.id, placement.item);\n if (!views.getView(placementItemViewId(placement.item))) {\n throw new Error(`Workbench mode placement view is not registered: ${placementItemViewId(placement.item)}`);\n }\n return refKey;\n};\n\nconst copyPlacement = (placement: WorkbenchModePlacementContribution) => ({\n ...placement,\n ref: { ...placement.ref },\n item: { ...placement.item },\n ...(placement.movableTo ? { movableTo: [...placement.movableTo] } : {}),\n});\n\nexport const createWorkbenchModePlacementRegistry = (input: {\n views: WorkbenchViewRegistry;\n getProjectId?(): string | undefined;\n loadLayout?(context: OwnedPlacementLocationContext): WorkbenchLayout | undefined;\n viewMenus?: WorkbenchViewMenuRegistry;\n getPanel(panelId: string): RegisteredWidgetContribution | undefined;\n registerPanel: Parameters<typeof registerWorkbenchViewPlacement>[0];\n}): WorkbenchModePlacementRegistry => {\n const placements = new Map<string, WorkbenchModePlacementContribution>();\n const refs = new Map<string, WorkbenchModePlacementContribution>();\n let state = createOwnedPlacementState();\n const listeners = new Set<() => void>();\n const label = \"Mode placement\";\n\n const listPlacements = (modeId?: string) =>\n [...placements.values()]\n .filter((placement) => !modeId || placement.modeId === modeId)\n .sort((left, right) => left.id.localeCompare(right.id));\n\n let runtime: (() => void) | undefined;\n const emitChange = () => {\n runtime?.();\n for (const listener of listeners)\n notifyWorkbenchChange(listener, () => runWorkbenchEffect(\"mode placement subscriber\", listener));\n };\n\n const resolve = (\n placement: WorkbenchModePlacementContribution,\n instanceKey: string,\n resource?: ResourceRef,\n open?: PageOpenIntent,\n title?: string,\n ): ResolvedOwnedPlacement<WorkbenchWidgetPlacement> => {\n const view = input.views.getView(placementItemViewId(placement.item));\n if (!view)\n throw new Error(`Workbench mode placement view is not registered: ${placementItemViewId(placement.item)}`);\n const contributionId = modePlacementContributionId(placement.id);\n const panel = input.getPanel(contributionId);\n if (!panel) throw new Error(`Workbench mode placement is not registered: ${placement.id}`);\n const identity = identityFor(placement, instanceKey);\n return {\n identity,\n region: placement.region,\n order: placement.order ?? 0,\n value: createPlacement(\n `workbench.mode.${encodeURIComponent(placement.id)}.${encodeURIComponent(instanceKey)}`,\n panel,\n {\n viewId: placementItemViewId(placement.item),\n role: placement.region === \"main\" ? \"location\" : \"sub-panel\",\n closable: staticPlacementClosable(placement.item),\n ...(resource ? { resource } : {}),\n ...(title ? { title } : {}),\n ...tabState(open),\n },\n ),\n };\n };\n\n const preparation: OwnedPlacementPreparation = {\n connectRuntime(listener) {\n runtime = listener;\n return createDisposable(() => {\n if (runtime === listener) runtime = undefined;\n });\n },\n getState: () => state,\n restore(context, current = state) {\n if (input.getProjectId && context.projectId !== input.getProjectId()) current = createOwnedPlacementState();\n const saved = input.loadLayout?.(context);\n if (!saved) return current;\n const declarations = listPlacements(context.modeId).filter((placement) =>\n placement.item.kind === \"view\"\n ? !current.staticOverrides.has(placement.id)\n : !current.resourceInstances.has(placement.id),\n );\n if (!declarations.length) return current;\n return restoreOwnedPlacementState({\n state: current,\n declarations,\n saved: Object.values(saved.regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"mode\" && identity.modeId === context.modeId,\n });\n },\n adopt(modeId, saved, current = state) {\n return restoreOwnedPlacementState({\n state: current,\n declarations: listPlacements(modeId),\n saved,\n owns: (identity) => identity.kind === \"mode\" && identity.modeId === modeId,\n });\n },\n open(target, current = state) {\n const placement = placements.get(target.placementId);\n if (!placement) throw new Error(`Unknown mode placement: ${target.placementId}`);\n return prepareOwnedPlacement({\n label,\n target,\n item: placement.item,\n current,\n identityFor: (instanceKey) => identityFor(placement, instanceKey),\n });\n },\n apply: (next) => {\n state = next;\n },\n publish: emitChange,\n resolve(modeId, current = state) {\n if (!modeId) return [];\n return listPlacements(modeId).flatMap((placement) => {\n if (placement.item.kind === \"view\") {\n return isStaticPlacementOpen(placement.item, current, placement.id) ? [resolve(placement, \"default\")] : [];\n }\n return (current.resourceInstances.get(placement.id) ?? []).map((instance) =>\n resolve(placement, instance.instanceKey, instance.resource, instance.open, instance.title),\n );\n });\n },\n };\n const registry: WorkbenchModePlacementRegistry = {\n registerPlacement(placement) {\n const refKey = validatePlacement({ placement, placements, refs, views: input.views });\n const registered = copyPlacement(placement);\n const panel = registerWorkbenchViewPlacement(\n input.registerPanel,\n input.views,\n {\n ...registered,\n id: modePlacementContributionId(registered.id),\n viewId: placementItemViewId(registered.item),\n role: registered.region === \"main\" ? \"location\" : \"sub-panel\",\n singleton: registered.item.kind === \"view\" || registered.item.binding.cardinality === \"one\",\n closable: staticPlacementClosable(registered.item),\n },\n input.viewMenus,\n );\n placements.set(registered.id, registered);\n refs.set(refKey, registered);\n emitChange();\n return createDisposable(() => {\n if (placements.get(registered.id) !== registered) return;\n placements.delete(registered.id);\n refs.delete(refKey);\n clearOwnedPlacementState(state, registered.id);\n panel.dispose();\n emitChange();\n });\n },\n\n getPlacement(ref) {\n return refs.get(placementRefKey(ref));\n },\n\n listPlacements,\n\n openPlacement(target) {\n const placement = refs.get(placementRefKey(target.panel));\n if (!placement) throw new Error(`Unknown mode panel: ${target.panel.extensionId}.${target.panel.id}`);\n const prepared = preparation.open({ ...target, placementId: placement.id });\n preparation.apply(prepared.state);\n preparation.publish();\n return prepared.identity;\n },\n\n closePlacement(identity) {\n if (identity.kind !== \"mode\") throw new Error(\"Mode placement registry closes only mode-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n const changed = closeOwnedPlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n });\n if (changed) emitChange();\n },\n\n updatePlacement(identity, update) {\n if (identity.kind !== \"mode\") throw new Error(\"Mode placement registry updates only mode-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n updateResourcePlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n ...update,\n });\n emitChange();\n },\n\n resolvePlacements: (modeId, context) =>\n preparation.resolve(modeId, context ? preparation.restore!(context) : state),\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n\n setOwnedPlacementPreparation(registry, preparation);\n return registry;\n};\n","import type {\n NavigationTargetPage as SdkNavigationTargetPage,\n NavigationTargetPanel as SdkNavigationTargetPanel,\n} from \"@pstdio/sdk/extensions\";\nimport { isNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport {\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\";\n\n/** Core-only panel ref for host-owned shell placements. Extensions cannot address them. */\nexport interface ShellPlacementRef {\n kind: \"shell-placement\";\n id: string;\n}\n\nexport interface NavigationTargetShellPanel {\n kind: \"panel\";\n panel: ShellPlacementRef;\n resource?: SdkNavigationTargetPanel[\"resource\"];\n open?: SdkNavigationTargetPanel[\"open\"];\n title?: string;\n}\n\nexport type NavigationTargetPanel = SdkNavigationTargetPanel | NavigationTargetShellPanel;\n\nexport type NavigationTargetPage = SdkNavigationTargetPage;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport interface NavigationTargetCommand {\n kind: \"command\";\n commandId: string;\n args?: unknown;\n}\n\nexport interface NavigationTargetHref {\n kind: \"href\";\n href: string;\n}\n\nexport type NavigationTargetItem =\n | NavigationTargetPage\n | NavigationTargetPanel\n | NavigationTargetCommand\n | NavigationTargetHref;\n\nexport interface NavigationTargetCompound {\n kind: \"compound\";\n targets: readonly (NavigationTargetPage | NavigationTargetPanel)[];\n}\n\nexport type NavigationTarget = NavigationTargetItem | NavigationTargetCompound;\n\nexport interface NavigationParser {\n id: string;\n priority?: number;\n canParse(location: string): boolean;\n parse(location: string): NavigationTarget;\n}\n\nexport type RegisteredNavigationParser = Omit<NavigationParser, \"priority\"> & RegisteredContributionMetadata;\n\n// Minimal presenter surface the navigation dispatcher needs; resolved through a\n// closure to break the otherwise-circular core ↔ navigation dep.\nexport interface NavigationDispatcherContext {\n canOpenPanel?(target: NavigationTargetPanel): boolean;\n canExecuteCommand?(commandId: string): boolean;\n prepareNavigation?(targets: readonly (NavigationTargetPage | NavigationTargetPanel)[]): { commit(): unknown };\n openPanelTarget?(target: NavigationTargetPanel): unknown;\n openPageTarget?(target: NavigationTargetPage): unknown;\n executeCommand(commandId: string, args?: unknown): Promise<unknown> | unknown;\n openHref?(href: string): Promise<unknown> | unknown;\n}\n\nconst byPriorityAndId = (left: { id: string; priority: number }, right: { id: string; priority: number }) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport interface NavigationRegistryStoreState {\n parsers: Record<string, RegisteredNavigationParser>;\n}\n\nexport interface NavigationRegistry {\n store: WorkbenchStore<NavigationRegistryStoreState>;\n registerParser(parser: NavigationParser, metadata?: ContributionMetadata): Disposable;\n listParsers(): RegisteredNavigationParser[];\n resolveLocation(location: string): NavigationTarget;\n openTarget(target: NavigationTarget): Promise<readonly unknown[]>;\n /** Opens a page location through the shared executor. */\n openPage(target: Omit<NavigationTargetPage, \"kind\">): Promise<readonly unknown[]>;\n /** Opens or activates an owned panel through the shared executor. */\n openPanel(target: DistributiveOmit<NavigationTargetPanel, \"kind\">): Promise<readonly unknown[]>;\n navigate(location: string): Promise<readonly unknown[]>;\n}\n\nexport interface CreateNavigationRegistryInput {\n // Returns the presenters the dispatcher should call. Lazy so `createWorkbench`\n // can install the navigation registry before the rest of the core is ready.\n resolveDispatcher?(): NavigationDispatcherContext;\n}\n\nconst noDispatcher = (): NavigationDispatcherContext => {\n throw new Error(\"navigation.openTarget: no dispatcher available (configure resolveDispatcher)\");\n};\n\nconst dispatchItem = async (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"page\") {\n if (!dispatcher.openPageTarget) throw new Error(\"navigation.openTarget: page target dispatcher is not configured\");\n return dispatcher.openPageTarget(target);\n }\n if (target.kind === \"panel\") {\n if (!dispatcher.openPanelTarget)\n throw new Error(\"navigation.openTarget: panel target dispatcher is not configured\");\n return dispatcher.openPanelTarget(target);\n }\n if (target.kind === \"href\") {\n if (!dispatcher.openHref) throw new Error(`Cannot open navigation href target: ${target.href}`);\n return dispatcher.openHref(target.href);\n }\n return dispatcher.executeCommand(target.commandId, target.args);\n};\n\nconst validateItem = (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"href\" && !isNavigationTarget(target)) {\n throw new Error(\"Navigation requires an HTTP or HTTPS URL.\");\n }\n if (target.kind === \"panel\" && dispatcher.canOpenPanel?.(target) === false) {\n throw new Error(`Cannot open navigation panel target: ${target.panel.id}`);\n }\n if (target.kind === \"command\" && dispatcher.canExecuteCommand?.(target.commandId) === false) {\n throw new Error(`Cannot open navigation command target: ${target.commandId}`);\n }\n};\n\nconst toItems = (target: NavigationTarget): readonly NavigationTargetItem[] =>\n target.kind === \"compound\" ? target.targets : [target];\n\nexport const createNavigationRegistry = (input: CreateNavigationRegistryInput = {}): NavigationRegistry => {\n const resolveDispatcher = input.resolveDispatcher ?? noDispatcher;\n\n const store = createWorkbenchStore<NavigationRegistryStoreState>({\n name: \"workbench.navigation\",\n initialState: { parsers: {} },\n });\n\n const removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n };\n\n const registry: NavigationRegistry = {\n store,\n\n registerParser(parser, metadata) {\n const snapshot = store.getState();\n if (snapshot.parsers[parser.id]) throw new Error(`Navigation parser already registered: ${parser.id}`);\n\n const { priority, ...parserContribution } = parser;\n const record: RegisteredNavigationParser = {\n ...parserContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n\n store.setState({ ...snapshot, parsers: { ...snapshot.parsers, [parser.id]: record } }, false, \"registerParser\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.parsers[parser.id] !== record) return;\n store.setState({ ...current, parsers: removeKey(current.parsers, parser.id) }, false, \"unregisterParser\");\n });\n },\n\n listParsers() {\n return Object.values(store.getState().parsers).sort(byPriorityAndId);\n },\n\n resolveLocation(location) {\n const parser = this.listParsers().find((candidate) => candidate.canParse(location));\n if (!parser) throw new Error(`No navigation parser registered for location: ${location}`);\n return parser.parse(location);\n },\n\n async openTarget(target) {\n const dispatcher = resolveDispatcher();\n const items = toItems(target);\n const results: unknown[] = [];\n\n for (const item of items) validateItem(item, dispatcher);\n\n if (target.kind === \"compound\") {\n if (target.targets.some((item) => item.kind !== \"page\" && item.kind !== \"panel\"))\n throw new Error(\"Compound navigation accepts only page and panel targets\");\n if (!dispatcher.prepareNavigation)\n throw new Error(\"navigation.openTarget: navigation preparation is not configured\");\n const prepared = dispatcher.prepareNavigation(target.targets);\n return [prepared.commit()];\n }\n for (const item of items) results.push(await dispatchItem(item, dispatcher));\n return results;\n },\n\n async openPage(target) {\n return registry.openTarget({ ...target, kind: \"page\" });\n },\n\n async openPanel(target) {\n return registry.openTarget({ ...target, kind: \"panel\" } as NavigationTargetPanel);\n },\n\n async navigate(location) {\n return registry.openTarget(registry.resolveLocation(location));\n },\n };\n\n return registry;\n};\n","import {\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport type WorkbenchNotificationLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\nexport interface WorkbenchNotificationAction {\n commandId: string;\n title: string;\n args?: unknown;\n}\n\nexport interface WorkbenchNotification {\n id?: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt?: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {\n id: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport type WorkbenchNotificationEvent =\n | { type: \"show\"; id: string; notification: RegisteredWorkbenchNotification }\n | { type: \"dismiss\"; id: string };\n\ntype WorkbenchNotificationListener = (event: WorkbenchNotificationEvent) => void;\n\nexport interface WorkbenchNotificationStoreState {\n notifications: Record<string, RegisteredWorkbenchNotification>;\n}\n\nexport interface NotificationRegistry {\n store: WorkbenchStore<WorkbenchNotificationStoreState>;\n show(notification: WorkbenchNotification, metadata?: ContributionMetadata): RegisteredWorkbenchNotification;\n dismiss(id: string): boolean;\n clear(): void;\n listNotifications(): RegisteredWorkbenchNotification[];\n subscribe(listener: WorkbenchNotificationListener): Disposable;\n}\n\nexport const createNotificationRegistry = (): NotificationRegistry => {\n const store = createWorkbenchStore<WorkbenchNotificationStoreState>({\n name: \"workbench.notifications\",\n initialState: { notifications: {} },\n });\n\n const listeners = new Set<WorkbenchNotificationListener>();\n let generatedId = 0;\n\n const emit = (event: WorkbenchNotificationEvent) => {\n for (const listener of listeners) listener(event);\n };\n\n return {\n store,\n\n show(notification, metadata) {\n let id = notification.id;\n if (!id) {\n generatedId += 1;\n id = `workbench.notification.${generatedId.toString()}`;\n }\n\n const record: RegisteredWorkbenchNotification = {\n ...normalizeContributionMetadata(metadata),\n ...notification,\n id,\n createdAt: notification.createdAt ?? new Date().toISOString(),\n };\n\n const snapshot = store.getState();\n store.setState({ notifications: { ...snapshot.notifications, [id]: record } }, false, \"showNotification\");\n emit({ type: \"show\", id, notification: record });\n\n return record;\n },\n\n dismiss(id) {\n const snapshot = store.getState();\n if (!snapshot.notifications[id]) return false;\n const { [id]: _removed, ...rest } = snapshot.notifications;\n store.setState({ notifications: rest }, false, \"dismissNotification\");\n emit({ type: \"dismiss\", id });\n return true;\n },\n\n clear() {\n const ids = Object.keys(store.getState().notifications);\n store.setState({ notifications: {} }, false, \"clearNotifications\");\n for (const id of ids) emit({ type: \"dismiss\", id });\n },\n\n listNotifications() {\n return Object.values(store.getState().notifications).sort((left, right) =>\n right.createdAt.localeCompare(left.createdAt),\n );\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return createDisposable(() => {\n listeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport { registerWorkbenchViewPlacement, type WorkbenchPlacementPresentation } from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchOverlayContribution extends Omit<WorkbenchPlacementPresentation, \"mountStrategy\"> {\n id: string;\n viewId: string;\n closable?: boolean;\n}\n\nexport interface OpenWorkbenchOverlayInput {\n resource?: ResourceRef;\n title?: string;\n}\n\nexport interface WorkbenchOverlayRegistry {\n registerOverlay(overlay: WorkbenchOverlayContribution): Disposable;\n getOverlay(id: string): WorkbenchOverlayContribution | undefined;\n listOverlays(): WorkbenchOverlayContribution[];\n openOverlay(id: string, input?: OpenWorkbenchOverlayInput): string;\n closeOverlay(instanceId: string): void;\n}\n\nconst overlayContributionId = (id: string) => `workbench.overlay.${encodeURIComponent(id)}`;\n\nexport const createWorkbenchOverlayRegistry = (input: {\n layout: LayoutModel;\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n}): WorkbenchOverlayRegistry => {\n const overlays = new Map<string, WorkbenchOverlayContribution>();\n const registrations = new Map<string, Disposable>();\n\n return {\n registerOverlay(overlay) {\n if (overlays.has(overlay.id)) throw new Error(`Overlay already registered: ${overlay.id}`);\n const record = { ...overlay };\n const registration = registerWorkbenchViewPlacement(\n input.layout,\n input.views,\n {\n ...record,\n id: overlayContributionId(record.id),\n region: \"overlay\",\n role: \"content\",\n singleton: true,\n closable: record.closable ?? true,\n },\n input.viewMenus,\n );\n overlays.set(record.id, record);\n registrations.set(record.id, registration);\n return {\n dispose() {\n if (overlays.get(record.id) !== record) return;\n overlays.delete(record.id);\n registrations.delete(record.id);\n registration.dispose();\n },\n };\n },\n\n getOverlay: (id) => overlays.get(id),\n\n listOverlays: () => [...overlays.values()].sort((left, right) => left.id.localeCompare(right.id)),\n\n openOverlay(id, openInput = {}) {\n if (!overlays.has(id)) throw new Error(`Unknown overlay: ${id}`);\n return input.layout.openPanel(overlayContributionId(id), {\n viewId: overlays.get(id)?.viewId,\n resource: openInput.resource,\n title: openInput.title,\n closable: overlays.get(id)?.closable ?? true,\n strategy: { kind: \"persistent\" },\n }).instanceId;\n },\n\n closeOverlay(instanceId) {\n input.layout.removeWidgetPlacement(instanceId);\n },\n };\n};\n","import type { PageOpenIntent, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"../placements/placement-instance-key\";\nimport { isPageSlotClosable, primarySlot, type ResolvedPageSlot } from \"./page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageOpenInput,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlotInstance,\n} from \"./page-registry-types\";\n\nexport { primarySlot, requirePageSlot } from \"./page-main\";\n\nexport const emptyPageState = (page: WorkbenchPageContribution): WorkbenchPageRuntimeState => ({\n openStaticSlotIds: page.slots\n .filter((slot) => slot.item.kind === \"view\" && slot.item.presence === \"open\")\n .map((slot) => slot.id),\n resourceInstances: {},\n});\n\nexport const staticSlotOpen = (slot: ResolvedPageSlot, state: WorkbenchPageRuntimeState) =>\n slot.item.kind === \"view\" && (slot.item.presence === \"fixed\" || state.openStaticSlotIds.includes(slot.id));\n\nconst nextResourceInstances = (\n slot: ResolvedPageSlot,\n current: readonly WorkbenchPageSlotInstance[],\n instance: WorkbenchPageSlotInstance,\n) => {\n if (slot.item.kind !== \"binding\" || slot.item.binding.cardinality !== \"many\") return [instance];\n const existing = current.find((candidate) => candidate.instanceKey === instance.instanceKey);\n const open: PageOpenIntent = existing?.open === \"pin\" || instance.open === \"pin\" ? \"pin\" : \"preview\";\n return [\n ...current.filter(\n (candidate) => candidate.instanceKey !== instance.instanceKey && (open === \"pin\" || candidate.open === \"pin\"),\n ),\n { ...instance, open },\n ];\n};\n\nexport const openResourceSlot = (input: {\n slot: ResolvedPageSlot;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { slot, state, target } = input;\n if (slot.item.kind !== \"binding\") throw new Error(`Page slot \"${slot.id}\" does not accept a resource`);\n const binding = slot.item.binding;\n if (!target.resource) throw new Error(`Page slot \"${slot.id}\" requires a resource`);\n if (!resourceMatchesConstraint(binding, target.resource))\n throw new Error(`Page slot \"${slot.id}\" does not accept resource kind \"${target.resource.type}\"`);\n if (target.open && binding.cardinality !== \"many\")\n throw new Error(`Page slot \"${slot.id}\" accepts open intent only with many cardinality`);\n const instanceKey = binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : input.resourceKey(target.resource);\n const instance: WorkbenchPageSlotInstance = {\n instanceKey,\n resource: target.resource,\n ...(target.section ? { section: target.section } : {}),\n ...(binding.cardinality === \"many\" ? { open: target.open ?? \"preview\" } : {}),\n };\n return {\n ...state,\n resourceInstances: {\n ...state.resourceInstances,\n [slot.id]: nextResourceInstances(slot, state.resourceInstances[slot.id] ?? [], instance),\n },\n ...(slot.role === \"primary\" ? { activePrimaryInstanceKey: instanceKey } : {}),\n } satisfies WorkbenchPageRuntimeState;\n};\n\nexport const selectPrimaryTarget = (input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { page, target } = input;\n if (page.resource) {\n if (!target.resource) throw new Error(`Page \"${page.id}\" requires a resource`);\n if (!resourceMatchesConstraint(page.resource, target.resource))\n throw new Error(`Page \"${page.id}\" does not accept resource kind \"${target.resource.type}\"`);\n } else if (target.resource) throw new Error(`Page \"${page.id}\" does not accept a resource`);\n const slot = primarySlot(page);\n if (!slot) {\n if (target.open) throw new Error(`Panel collection page \"${page.id}\" does not accept an open intent`);\n return input.state;\n }\n if (target.resource) return openResourceSlot({ ...input, slot });\n if (target.open) throw new Error(`Page \"${page.id}\" accepts open intent only with a resource`);\n return { ...input.state, activePrimaryInstanceKey: \"default\" };\n};\n\nexport const pageResourceBindingSlots = (page: WorkbenchPageContribution, resource: ResourceRef | undefined) =>\n page.slots.filter(\n (slot) =>\n slot.item.kind === \"binding\" &&\n slot.openOn === \"page-resource\" &&\n resource &&\n resourceMatchesConstraint(slot.item.binding, resource),\n );\n\nexport const openPageResourceBindings = (input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n if (!input.target.resource) return input.state;\n return pageResourceBindingSlots(input.page, input.target.resource).reduce(\n (state, slot) =>\n openResourceSlot({\n slot: { ...slot, role: \"auxiliary\" },\n state,\n target: { pageId: input.page.id, resource: input.target.resource },\n resourceKey: input.resourceKey,\n }),\n input.state,\n );\n};\n\nexport const setStaticSlotOpen = (state: WorkbenchPageRuntimeState, slotId: string, open: boolean) => {\n const ids = new Set(state.openStaticSlotIds);\n if (open) ids.add(slotId);\n else ids.delete(slotId);\n return { ...state, openStaticSlotIds: [...ids] };\n};\n\nexport const removeResourceInstance = (state: WorkbenchPageRuntimeState, slotId: string, instanceKey: string) => ({\n ...state,\n resourceInstances: {\n ...state.resourceInstances,\n [slotId]: (state.resourceInstances[slotId] ?? []).filter((instance) => instance.instanceKey !== instanceKey),\n },\n});\n\nexport type ClosePageSlotResult =\n | { kind: \"stay\"; state: WorkbenchPageRuntimeState; activateInstanceKey?: string }\n | { kind: \"parent\"; state: WorkbenchPageRuntimeState; parentId: string };\n\nexport const closePageSlot = (input: {\n page: WorkbenchPageContribution;\n slot: ResolvedPageSlot;\n state: WorkbenchPageRuntimeState;\n instanceKey: string;\n}): ClosePageSlotResult => {\n const { page, slot, instanceKey } = input;\n if (!isPageSlotClosable(slot)) throw new Error(`Page slot \"${slot.id}\" is fixed and cannot close`);\n const state =\n instanceKey === \"default\"\n ? setStaticSlotOpen(input.state, slot.id, false)\n : removeResourceInstance(input.state, slot.id, instanceKey);\n if (slot.role === \"auxiliary\") return { kind: \"stay\", state };\n const remaining = state.resourceInstances[slot.id] ?? [];\n if (remaining.length) {\n const previous = state.activePrimaryInstanceKey;\n const activateInstanceKey = previous && previous !== instanceKey ? previous : remaining.at(-1)?.instanceKey;\n return { kind: \"stay\", state: { ...state, activePrimaryInstanceKey: activateInstanceKey }, activateInstanceKey };\n }\n if (!page.parentId) throw new Error(`Resource page has no parent: ${page.id}`);\n return { kind: \"parent\", state, parentId: page.parentId };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../layout/placement-reconciliation\";\nimport type { WorkbenchPageCloseResolution } from \"./page-registry-internals\";\nimport type { WorkbenchPageContribution, WorkbenchPageRegistryStoreState } from \"./page-registry-types\";\nimport { closePageSlot, emptyPageState, requirePageSlot } from \"./page-slot-lifecycle\";\n\nexport const resolvePagePlacementClose = <Value>(input: {\n identity: PlacementIdentity;\n page: WorkbenchPageContribution;\n state: WorkbenchPageRegistryStoreState<Value>;\n resourceKey(resource: ResourceRef): string;\n stateKey: string;\n}): WorkbenchPageCloseResolution => {\n const { identity, page, state } = input;\n if (identity.kind !== \"page\") throw new Error(\"Page registry can close only page-owned placements\");\n if (state.activePageId !== identity.pageId) throw new Error(`Page is not active: ${identity.pageId}`);\n const slot = requirePageSlot(page, identity.slotId);\n const exists = state.placements.some(\n (candidate) => placementIdentityKey(candidate.identity) === placementIdentityKey(identity),\n );\n if (!exists) throw new Error(`Page placement is not open: ${placementIdentityKey(identity)}`);\n\n const pageState = state.pageStates[input.stateKey] ?? emptyPageState(page);\n const closedActivePrimary = slot.role === \"primary\" && pageState.activePrimaryInstanceKey === identity.instanceKey;\n const result = closePageSlot({ page, slot, state: pageState, instanceKey: identity.instanceKey });\n const pageStates = { ...state.pageStates, [input.stateKey]: result.state };\n if (result.kind === \"parent\") return { kind: \"parent\", pageStates, parentId: result.parentId };\n if (slot.role === \"auxiliary\") {\n if (!state.location) throw new Error(\"Active page has no canonical location\");\n return {\n kind: \"stay\",\n pageStates,\n target: {\n pageId: page.id,\n ...(state.location.resource ? { resource: state.location.resource } : {}),\n ...(state.location.section ? { section: state.location.section } : {}),\n },\n locationChanged: false,\n };\n }\n const activeInstanceKey = result.state.activePrimaryInstanceKey;\n const activeInstance = (result.state.resourceInstances[slot.id] ?? []).find(\n (instance) => instance.instanceKey === activeInstanceKey,\n );\n return {\n kind: \"stay\",\n pageStates,\n target: {\n pageId: page.id,\n ...(activeInstance?.resource ? { resource: activeInstance.resource } : {}),\n ...(activeInstance?.section ? { section: activeInstance.section } : {}),\n ...(activeInstance?.open ? { open: activeInstance.open } : {}),\n },\n locationChanged: closedActivePrimary,\n };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState, WorkbenchPageResourceCodec } from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport const pinPagePlacement = <Value>(\n state: WorkbenchPageRegistryStoreState<Value>,\n identity: PlacementIdentity,\n resources: WorkbenchPageResourceCodec,\n open: \"pin\" | \"preview\" = \"pin\",\n) => {\n if (identity.kind !== \"page\" || state.activePageId !== identity.pageId)\n throw new Error(\"Only an active page placement can be pinned\");\n const page = state.pages[identity.pageId]!;\n const key = pageStateKey(page, state.location, resources);\n const current = state.pageStates[key]!;\n const instances = current.resourceInstances[identity.slotId] ?? [];\n if (!instances.some((instance) => instance.instanceKey === identity.instanceKey))\n throw new Error(\"Only an open resource placement can be pinned\");\n return {\n ...state,\n pageStates: {\n ...state.pageStates,\n [key]: {\n ...current,\n resourceInstances: {\n ...current.resourceInstances,\n [identity.slotId]: instances\n .filter(\n (instance) =>\n open !== \"preview\" || instance.open === \"pin\" || instance.instanceKey === identity.instanceKey,\n )\n .map((instance) => (instance.instanceKey === identity.instanceKey ? { ...instance, open } : instance)),\n },\n },\n },\n };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"../placements/placement-instance-key\";\nimport { isPageSlotClosable, PAGE_MAIN_SLOT_ID, pageSlots, type ResolvedPageSlot } from \"./page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPagePlacementInput,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\nimport { pageResourceBindingSlots, staticSlotOpen } from \"./page-slot-lifecycle\";\n\nexport const pagePlacementIdentity = (pageId: string, slotId: string, instanceKey: string): PlacementIdentity => ({\n kind: \"page\",\n pageId,\n slotId,\n instanceKey,\n});\n\nexport const pageFollowerIdentities = (\n page: WorkbenchPageContribution,\n resource: ResourceRef | undefined,\n resourceKey: (resource: ResourceRef) => string,\n) => {\n if (!resource) return [];\n return pageResourceBindingSlots(page, resource)\n .filter((slot) => slot.region !== \"main\")\n .filter((slot, index, slots) => slots.findIndex((candidate) => candidate.region === slot.region) === index)\n .map((slot) =>\n pagePlacementIdentity(\n page.id,\n slot.id,\n slot.item.kind === \"binding\" && slot.item.binding.cardinality === \"one\"\n ? SINGLE_RESOURCE_INSTANCE_KEY\n : resourceKey(resource),\n ),\n );\n};\n\nconst validatePageSlots = (page: WorkbenchPageContribution) => {\n const ids = new Set<string>();\n for (const slot of page.slots) {\n if (slot.id === PAGE_MAIN_SLOT_ID || ids.has(slot.id))\n throw new Error(`Page \"${page.id}\" declares duplicate or reserved slot \"${slot.id}\"`);\n ids.add(slot.id);\n if (slot.item.kind === \"binding\" && slot.item.binding.kinds.length === 0)\n throw new Error(`Page slot \"${slot.id}\" must bind at least one resource kind`);\n if (slot.openOn && slot.item.kind !== \"binding\")\n throw new Error(`Page slot \"${slot.id}\" requires a binding for openOn`);\n }\n};\n\nexport const validateWorkbenchPage = (page: WorkbenchPageContribution) => {\n if (page.ref.kind !== \"page\" || !page.ref.extensionId || !page.ref.id)\n throw new Error(`Page \"${page.id}\" must declare a normalized page ref`);\n if (page.path.startsWith(\"/\") || page.path.endsWith(\"/\"))\n throw new Error(`Page \"${page.id}\" must declare a normalized path`);\n if (!page.main || (page.main.kind !== \"view\" && page.main.kind !== \"panels\"))\n throw new Error(`Page \"${page.id}\" must declare Main content or a panel collection`);\n if (page.document && (!page.resource || !page.document.metadataKey.trim()))\n throw new Error(`Page \"${page.id}\" requires a document metadata key and routed resource`);\n if (page.resource && page.resource.kinds.length === 0)\n throw new Error(`Page \"${page.id}\" must accept at least one resource kind`);\n if (page.main.kind === \"view\" && page.main.cardinality === \"many\" && !page.resource)\n throw new Error(`Page \"${page.id}\" requires a resource for many cardinality`);\n if (page.main.kind === \"view\" && page.resource && !page.parentId)\n throw new Error(`Resource page \"${page.id}\" must declare a parent`);\n validatePageSlots(page);\n};\n\nconst placementFor = <Value>(input: {\n page: WorkbenchPageContribution;\n slot: ResolvedPageSlot;\n instanceKey: string;\n resolvePagePlacement(value: WorkbenchPagePlacementInput): Value;\n resource?: ResourceRef;\n section?: WorkbenchPagePlacementInput[\"section\"];\n open?: WorkbenchPagePlacementInput[\"open\"];\n}) => {\n const item = input.slot.item;\n const view = item.kind === \"view\" ? item.view : item.binding.view;\n const identity = pagePlacementIdentity(input.page.id, input.slot.id, input.instanceKey);\n return {\n identity,\n region: input.slot.region,\n order: input.slot.order ?? 0,\n value: input.resolvePagePlacement({\n identity,\n pageId: input.page.id,\n slotId: input.slot.id,\n role: input.slot.role,\n viewId: contributionRefId(view),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n ...(input.open ? { open: input.open } : {}),\n closable: isPageSlotClosable(input.slot),\n }),\n } satisfies ResolvedOwnedPlacement<Value>;\n};\n\nexport const resolvePagePlacements = <Value>(input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n resource?: ResourceRef;\n sharedPlacements: readonly ResolvedOwnedPlacement<Value>[];\n resolvePagePlacement(value: WorkbenchPagePlacementInput): Value;\n}) => {\n const placements: ResolvedOwnedPlacement<Value>[] = [];\n for (const slot of pageSlots(input.page)) {\n if (slot.isAvailable && !slot.isAvailable(input.resource)) continue;\n if (staticSlotOpen(slot, input.state)) placements.push(placementFor({ ...input, slot, instanceKey: \"default\" }));\n for (const instance of input.state.resourceInstances[slot.id] ?? []) {\n placements.push(placementFor({ ...input, slot, ...instance }));\n }\n }\n if (\n input.page.main.kind === \"panels\" &&\n ![...placements, ...input.sharedPlacements].some((placement) => placement.region === \"main\")\n ) {\n placements.push(\n placementFor({\n ...input,\n instanceKey: \"default\",\n slot: {\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: { kind: \"view\", view: input.page.main.empty, presence: \"fixed\" },\n },\n }),\n );\n }\n return placements;\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n composeOwnedPlacements,\n type OwnedPlacementReconciliation,\n type ResolvedOwnedPlacement,\n} from \"../layout/placement-reconciliation\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\n\nconst emptyReconciliation = <Value>(): OwnedPlacementReconciliation<Value> => ({\n add: [],\n retain: [],\n update: [],\n activate: [],\n remove: [],\n});\n\nexport interface PageRegistryCommitInput<Value> {\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n projectId?: string;\n location?: WorkbenchPageRegistryStoreState<Value>[\"location\"];\n activePageId?: string;\n activeModeId?: string;\n modePlacements?: readonly ResolvedOwnedPlacement<Value>[];\n activate?: readonly PlacementIdentity[];\n action: string;\n}\n\nexport const createPageRegistryStore = <Value>(input: CreateWorkbenchPageRegistryInput<Value>) =>\n createWorkbenchStore<WorkbenchPageRegistryStoreState<Value>>({\n name: \"workbench.pages\",\n initialState: {\n pages: {},\n pageStates: {},\n placements: composeOwnedPlacements({ shell: input.resolveShellPlacements() }).placements,\n reconciliation: emptyReconciliation(),\n },\n });\n\nexport const resolveModePlacementSet = <Value>(input: {\n current: WorkbenchPageRegistryStoreState<Value>;\n modeId: string | undefined;\n desired: readonly ResolvedOwnedPlacement<Value>[] | undefined;\n location?: WorkbenchPageRegistryStoreState<Value>[\"location\"];\n projectId?: string;\n pageId?: string;\n resolveModePlacements: CreateWorkbenchPageRegistryInput<Value>[\"resolveModePlacements\"];\n}) => {\n if (!input.modeId) return undefined;\n if (input.desired) return input.desired;\n return input.resolveModePlacements(input.modeId, input.location, input.projectId, input.pageId);\n};\n\nexport const refreshActiveModePlacements = <Value>(input: {\n state: WorkbenchPageRegistryStoreState<Value>;\n registryInput: CreateWorkbenchPageRegistryInput<Value>;\n commit(next: PageRegistryCommitInput<Value>): void;\n}) => {\n const modeId = input.state.activeModeId;\n if (!modeId) return;\n input.commit({\n pageStates: input.state.pageStates,\n projectId: input.state.projectId,\n location: input.state.location,\n activePageId: input.state.activePageId,\n activeModeId: modeId,\n modePlacements: input.registryInput.resolveModePlacements(modeId),\n action: \"refreshModePlacements\",\n });\n};\n\nexport const refreshShellPlacements = <Value>(input: {\n state: WorkbenchPageRegistryStoreState<Value>;\n commit(next: PageRegistryCommitInput<Value>): void;\n}) => {\n input.commit({\n pageStates: input.state.pageStates,\n projectId: input.state.projectId,\n location: input.state.location,\n activePageId: input.state.activePageId,\n activeModeId: input.state.activeModeId,\n action: \"refreshShellPlacements\",\n });\n};\n","import { resourceKey as resourceIdentity } from \"@pstdio/sdk/extensions\";\nimport {\n composeOwnedPlacements,\n type ResolvedOwnedPlacement,\n reconcileOwnedPlacements,\n} from \"../layout/placement-reconciliation\";\nimport { pageFollowerIdentities, pagePlacementIdentity, resolvePagePlacements } from \"./page-placement-resolver\";\nimport type { WorkbenchPageLocationCommitInput } from \"./page-registry-internals\";\nimport { type PageRegistryCommitInput, resolveModePlacementSet } from \"./page-registry-state\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageSlotOpenInput,\n} from \"./page-registry-types\";\nimport {\n emptyPageState,\n openPageResourceBindings,\n openResourceSlot,\n primarySlot,\n requirePageSlot,\n selectPrimaryTarget,\n setStaticSlotOpen,\n} from \"./page-slot-lifecycle\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport interface PreparedOwnedPlacements<Value> {\n shell: readonly ResolvedOwnedPlacement<Value>[];\n mode: readonly ResolvedOwnedPlacement<Value>[];\n}\nexport const createPagePreparation = <Value>(input: CreateWorkbenchPageRegistryInput<Value>) => {\n const normalizeResource = input.resources.normalize;\n const resourceKey = (resource: Parameters<typeof normalizeResource>[0]) =>\n input.resources.toUri(normalizeResource(resource));\n const requirePage = (current: WorkbenchPageRegistryStoreState<Value>, pageId: string) => {\n const page = current.pages[pageId];\n if (!page) throw new Error(`Unknown page: ${pageId}`);\n return page;\n };\n const compose = (\n current: WorkbenchPageRegistryStoreState<Value>,\n next: PageRegistryCommitInput<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n const page = next.activePageId ? current.pages[next.activePageId] : undefined;\n const pageState = page ? next.pageStates[pageStateKey(page, next.location, input.resources)] : undefined;\n if (next.activeModeId) input.validateMode?.(next.activeModeId);\n const modePlacements =\n owned?.mode ??\n resolveModePlacementSet({\n current,\n modeId: next.activeModeId,\n desired: next.modePlacements,\n location: next.location,\n projectId: next.projectId,\n pageId: next.activePageId,\n resolveModePlacements: input.resolveModePlacements,\n });\n if (\n next.activeModeId &&\n modePlacements?.some(\n (placement) => placement.identity.kind !== \"mode\" || placement.identity.modeId !== next.activeModeId,\n )\n )\n throw new Error(`Mode placement owner does not match active mode: ${next.activeModeId}`);\n const shell =\n owned?.shell ??\n input.resolveShellPlacements(\n next.activeModeId\n ? { modeId: next.activeModeId, pageId: next.activePageId, projectId: next.projectId, location: next.location }\n : undefined,\n );\n const composed = composeOwnedPlacements({\n shell,\n mode: modePlacements,\n ...(page && pageState\n ? {\n page: resolvePagePlacements({\n page,\n state: pageState,\n resource: next.location?.resource,\n sharedPlacements: [...shell, ...(modePlacements ?? [])],\n resolvePagePlacement: input.resolvePagePlacement,\n }),\n }\n : {}),\n });\n const reconciliation = reconcileOwnedPlacements({\n current: current.placements,\n desired: composed.placements,\n activate: next.activate,\n valuesEqual: input.valuesEqual,\n });\n return {\n ...current,\n pageStates: next.pageStates,\n projectId: next.projectId,\n location: next.location,\n activePageId: next.activePageId,\n activeModeId: next.activeModeId,\n placements: composed.placements,\n reconciliation,\n };\n };\n const location = (\n target: WorkbenchPageLocationCommitInput,\n current: WorkbenchPageRegistryStoreState<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n const pageStates = target.pageStates ?? current.pageStates;\n const page = requirePage(current, target.pageId);\n const normalizedTarget = {\n ...target,\n ...(target.resource ? { resource: normalizeResource(target.resource) } : {}),\n };\n const stateKey = pageStateKey(page, target.location, input.resources);\n const currentPageState =\n pageStates[stateKey] ?? input.restorePageState?.(page, target.location, target.projectId) ?? emptyPageState(page);\n const primaryState = selectPrimaryTarget({ page, state: currentPageState, target: normalizedTarget, resourceKey });\n const openFollowers =\n !target.pageStates ||\n current.activePageId !== page.id ||\n resourceIdentity(current.location?.resource) !== resourceIdentity(normalizedTarget.resource) ||\n current.pageStates[stateKey]?.activePrimaryInstanceKey !== primaryState.activePrimaryInstanceKey;\n const pageState = openFollowers\n ? openPageResourceBindings({ page, state: primaryState, target: normalizedTarget, resourceKey })\n : primaryState;\n const primary = primarySlot(page);\n const instanceKey = pageState.activePrimaryInstanceKey;\n const followers = openFollowers ? pageFollowerIdentities(page, normalizedTarget.resource, resourceKey) : [];\n return compose(\n current,\n {\n pageStates: { ...pageStates, [stateKey]: pageState },\n projectId: target.projectId,\n location: target.location,\n activePageId: page.id,\n activeModeId: page.modeId,\n activate: [\n ...(primary && instanceKey ? [pagePlacementIdentity(page.id, primary.id, instanceKey)] : []),\n ...followers,\n ],\n action: target.action,\n },\n owned,\n );\n };\n const slot = (\n target: WorkbenchPageSlotOpenInput,\n current: WorkbenchPageRegistryStoreState<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n if (current.activePageId !== target.pageId) throw new Error(`Page is not active: ${target.pageId}`);\n const page = requirePage(current, target.pageId);\n const slot = requirePageSlot(page, target.slotId);\n if (slot.role !== \"auxiliary\") throw new Error(`Page slot is not an auxiliary panel: ${page.id}.${slot.id}`);\n const stateKey = pageStateKey(page, current.location, input.resources);\n let pageState = current.pageStates[stateKey] ?? emptyPageState(page);\n let instanceKey = \"default\";\n const resource = target.resource ? normalizeResource(target.resource) : undefined;\n if (resource) {\n pageState = openResourceSlot({\n slot,\n state: pageState,\n target: { ...target, resource },\n resourceKey,\n });\n instanceKey = pageState.resourceInstances[slot.id]!.at(-1)!.instanceKey;\n } else {\n if (slot.item.kind === \"binding\") throw new Error(`Page slot \"${slot.id}\" requires a resource`);\n if (target.open) throw new Error(`Page slot \"${slot.id}\" accepts open intent only with a resource`);\n if (slot.item.presence !== \"fixed\") pageState = setStaticSlotOpen(pageState, slot.id, true);\n }\n return compose(\n current,\n {\n ...current,\n pageStates: { ...current.pageStates, [stateKey]: pageState },\n activate: [pagePlacementIdentity(page.id, slot.id, instanceKey)],\n action: \"openPageSlot\",\n },\n owned,\n );\n };\n return { compose, location, slot };\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n composeOwnedPlacements,\n type OwnedPlacementReconciliation,\n reconcileOwnedPlacements,\n} from \"../layout/placement-reconciliation\";\nimport { validateWorkbenchPage } from \"./page-placement-resolver\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageContribution,\n WorkbenchPageRegistryStoreState,\n} from \"./page-registry-types\";\nimport { removePageStates } from \"./page-state-key\";\n\nconst emptyReconciliation = <Value>(): OwnedPlacementReconciliation<Value> => ({\n add: [],\n retain: [],\n update: [],\n activate: [],\n remove: [],\n});\n\nexport const registerWorkbenchPage = <Value>(input: {\n page: WorkbenchPageContribution;\n registryInput: CreateWorkbenchPageRegistryInput<Value>;\n store: InternalWorkbenchStore<WorkbenchPageRegistryStoreState<Value>>;\n publishState(state: WorkbenchPageRegistryStoreState<Value>, action: string): void;\n normalizeResource(resource: ResourceRef): ResourceRef;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { page, store } = input;\n validateWorkbenchPage(page);\n const current = store.getState();\n if (current.pages[page.id]) throw new Error(`Page already registered: ${page.id}`);\n if (\n Object.values(current.pages).some(\n (candidate) => candidate.ref.extensionId === page.ref.extensionId && candidate.ref.id === page.ref.id,\n )\n ) {\n throw new Error(`Page ref already registered: ${page.ref.extensionId}.${page.ref.id}`);\n }\n if (\n Object.values(current.pages).some(\n (candidate) => candidate.ref.extensionId === page.ref.extensionId && candidate.path === page.path,\n )\n ) {\n throw new Error(`Page route already registered: ${page.ref.extensionId}.${page.path}`);\n }\n const registered = {\n ...page,\n ref: { ...page.ref },\n slots: page.slots.map((slot) => ({ ...slot })),\n };\n const placementRegistration = input.registryInput.registerPagePlacements?.(registered);\n store.setState(\n {\n ...current,\n pages: { ...current.pages, [page.id]: registered },\n reconciliation: emptyReconciliation(),\n },\n false,\n \"registerPage\",\n );\n return createDisposable(() => {\n const snapshot = store.getState();\n if (snapshot.pages[page.id] !== registered) return;\n const { [page.id]: _page, ...pages } = snapshot.pages;\n const pageStates = removePageStates(snapshot.pageStates, page.id);\n if (snapshot.activePageId === page.id) {\n const placements = composeOwnedPlacements({ shell: input.registryInput.resolveShellPlacements() }).placements;\n input.publishState(\n {\n ...snapshot,\n pages,\n pageStates,\n location: undefined,\n activePageId: undefined,\n activeModeId: undefined,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: snapshot.placements,\n desired: placements,\n valuesEqual: input.registryInput.valuesEqual,\n }),\n },\n \"unregisterActivePage\",\n );\n placementRegistration?.dispose();\n return;\n }\n store.setState({ ...snapshot, pages, pageStates, reconciliation: emptyReconciliation() }, false, \"unregisterPage\");\n placementRegistration?.dispose();\n });\n};\n","import { createDisposable } from \"../../shared/disposable\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { composeOwnedPlacements, reconcileOwnedPlacements } from \"../layout/placement-reconciliation\";\nimport { resolvePagePlacementClose } from \"./page-placement-close\";\nimport { pinPagePlacement } from \"./page-placement-pin\";\nimport { createPagePreparation } from \"./page-preparation\";\nimport { registerWorkbenchPage } from \"./page-registration\";\nimport { setWorkbenchPageRegistryInternals, type WorkbenchPageLocationCommitInput } from \"./page-registry-internals\";\nimport {\n createPageRegistryStore,\n type PageRegistryCommitInput,\n refreshActiveModePlacements,\n refreshShellPlacements,\n} from \"./page-registry-state\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n} from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageContribution,\n WorkbenchPageMain,\n WorkbenchPageOpenInput,\n WorkbenchPagePlacementInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlot,\n WorkbenchPageSlotInstance,\n WorkbenchPageSlotOpenInput,\n} from \"./page-registry-types\";\n\nexport const createWorkbenchPageRegistry = <Value>(\n input: CreateWorkbenchPageRegistryInput<Value>,\n): WorkbenchPageRegistry<Value> => {\n const normalizeResource = (resource: Parameters<WorkbenchPageResourceCodec[\"normalize\"]>[0]) =>\n input.resources.normalize(resource);\n const resourceKey = (resource: Parameters<WorkbenchPageResourceCodec[\"toUri\"]>[0]) =>\n input.resources.toUri(normalizeResource(resource));\n const store = createPageRegistryStore(input);\n let runtime: ((state: WorkbenchPageRegistryStoreState<Value>) => void) | undefined;\n let publishingState: WorkbenchPageRegistryStoreState<Value> | undefined;\n\n const publishState = (state: WorkbenchPageRegistryStoreState<Value>, action: string) =>\n batchWorkbenchChanges(() => {\n const storeBeforeRuntime = store.getState();\n const previousPublishingState = publishingState;\n publishingState = state;\n try {\n runtime?.(state);\n } finally {\n publishingState = previousPublishingState;\n }\n // A layout listener may synchronously commit a panel opened for the new page.\n // That nested commit already includes this state and must not be overwritten.\n if (store.getState() === storeBeforeRuntime) store.setState(state, false, action);\n });\n\n const requirePage = (pageId: string) => {\n const page = store.getState().pages[pageId];\n if (!page) throw new Error(`Unknown page: ${pageId}`);\n return page;\n };\n\n const prepare = createPagePreparation(input);\n const commit = (next: PageRegistryCommitInput<Value>) =>\n publishState(prepare.compose(publishingState ?? store.getState(), next), next.action);\n const activatePageWithStates = (target: WorkbenchPageLocationCommitInput) =>\n publishState(prepare.location(target, store.getState()), target.action);\n\n const registry: WorkbenchPageRegistry<Value> = {\n store,\n\n registerPage(page) {\n return registerWorkbenchPage({\n page,\n registryInput: input,\n store,\n publishState,\n normalizeResource,\n resourceKey,\n });\n },\n\n getPage(pageId) {\n return store.getState().pages[pageId];\n },\n\n listPages() {\n return Object.values(store.getState().pages).sort((left, right) => left.id.localeCompare(right.id));\n },\n\n pinPlacement(identity, open) {\n commit({ ...pinPagePlacement(store.getState(), identity, input.resources, open), action: \"pinPagePlacement\" });\n },\n\n openSlot(target) {\n publishState(prepare.slot(target, store.getState()), \"openPageSlot\");\n },\n };\n\n setWorkbenchPageRegistryInternals(registry, {\n resources: input.resources,\n prepare,\n publish: publishState,\n onDidCommit: (listener) => createDisposable(store.api.subscribe(listener)),\n getPublishingState: () => publishingState ?? store.getState(),\n connectRuntime(apply) {\n if (runtime) throw new Error(\"Workbench page registry already has a runtime\");\n runtime = apply;\n try {\n apply(store.getState());\n } catch (error) {\n runtime = undefined;\n throw error;\n }\n return createDisposable(() => {\n if (runtime === apply) runtime = undefined;\n });\n },\n refreshModePlacements() {\n refreshActiveModePlacements({ state: publishingState ?? store.getState(), registryInput: input, commit });\n },\n refreshShellPlacements() {\n refreshShellPlacements({ state: publishingState ?? store.getState(), commit });\n },\n activateLocation: activatePageWithStates,\n clearProject(projectId) {\n const current = store.getState();\n const placements = composeOwnedPlacements({ shell: input.resolveShellPlacements() }).placements;\n const pageStates = {};\n publishState(\n {\n ...current,\n pageStates,\n projectId,\n location: undefined,\n activePageId: undefined,\n activeModeId: undefined,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: current.placements,\n desired: placements,\n valuesEqual: input.valuesEqual,\n }),\n },\n \"clearPageProject\",\n );\n },\n resolveClosePlacement(identity) {\n const current = store.getState();\n if (identity.kind !== \"page\") throw new Error(\"Page registry can close only page-owned placements\");\n return resolvePagePlacementClose({\n identity,\n page: requirePage(identity.pageId),\n state: current,\n stateKey: pageStateKey(requirePage(identity.pageId), current.location, input.resources),\n resourceKey,\n });\n },\n });\n\n return registry;\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type { WorkbenchRegion, WorkbenchRegionSize } from \"../layout/layout-types\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchPlaceholderContribution {\n id: string;\n viewId: string;\n title?: string;\n region: WorkbenchRegion;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n}\n\nexport interface WorkbenchPlaceholderRegistry {\n registerPlaceholder(placeholder: WorkbenchPlaceholderContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nexport const createWorkbenchPlaceholderRegistry = (input: {\n layout: Pick<LayoutModel, \"registerPlaceholder\">;\n views: WorkbenchViewRegistry;\n}): WorkbenchPlaceholderRegistry => ({\n registerPlaceholder(placeholder, metadata) {\n const view = input.views.getView(placeholder.viewId);\n if (!view) throw new Error(`Workbench placeholder view is not registered: ${placeholder.viewId}`);\n return input.layout.registerPlaceholder(\n {\n ...placeholder,\n title: placeholder.title ?? view.title,\n rendererId: view.id,\n },\n metadata,\n );\n },\n});\n","import type { PageOpenIntent, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { notifyWorkbenchChange } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport { createPlacement } from \"../layout/layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n} from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport { registerWorkbenchViewPlacement, type WorkbenchPlacementPresentation } from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\nimport {\n clearOwnedPlacementState,\n closeOwnedPlacementInstance,\n createOwnedPlacementState,\n isStaticPlacementOpen,\n placementItemViewId,\n staticPlacementClosable,\n updateResourcePlacementInstance,\n validateOwnedPlacementItem,\n type WorkbenchOwnedPlacementItem,\n} from \"./owned-placement-lifecycle\";\nimport {\n type OwnedPlacementLocationContext,\n type OwnedPlacementPreparation,\n prepareOwnedPlacement,\n setOwnedPlacementPreparation,\n} from \"./owned-placement-preparation\";\nimport { restoreOwnedPlacementState } from \"./owned-placement-restoration\";\nexport interface WorkbenchShellPlacementContribution extends WorkbenchPlacementPresentation {\n readonly id: string;\n readonly item: WorkbenchOwnedPlacementItem;\n readonly region: WorkbenchRegion;\n readonly order?: number;\n}\nexport interface OpenWorkbenchShellPlacementInput {\n placementId: string;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface WorkbenchShellPlacementRegistry {\n registerPlacement(placement: WorkbenchShellPlacementContribution): Disposable;\n getPlacement(placementId: string): WorkbenchShellPlacementContribution | undefined;\n listPlacements(): WorkbenchShellPlacementContribution[];\n openPlacement(input: OpenWorkbenchShellPlacementInput): PlacementIdentity;\n updatePlacement(\n identity: PlacementIdentity,\n input: {\n resource?: ResourceRef;\n title?: string;\n open?: PageOpenIntent;\n },\n ): void;\n closePlacement(identity: PlacementIdentity): void;\n resolvePlacements(\n context?: OwnedPlacementLocationContext,\n ): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n onDidChange(listener: () => void): Disposable;\n}\nexport const shellPlacementContributionId = (placementId: string) =>\n `workbench.shell-placement.${encodeURIComponent(placementId)}`;\nconst identityFor = (placementId: string, instanceKey: string): PlacementIdentity => ({\n kind: \"shell\",\n placementId,\n instanceKey,\n});\nconst roleForRegion = (region: WorkbenchRegion): WorkbenchWidgetRole => {\n if (region === \"main\") return \"location\";\n if (region === \"secondary\" || region === \"side\") return \"sub-panel\";\n return \"content\";\n};\nconst tabState = (open: PageOpenIntent | undefined) => {\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n if (open === \"preview\") return { pinned: false, tabRetention: \"preview\" as const };\n return {};\n};\nexport const createWorkbenchShellPlacementRegistry = (input: {\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n getPanel(panelId: string): RegisteredWidgetContribution | undefined;\n registerPanel: Parameters<typeof registerWorkbenchViewPlacement>[0];\n activatePanel(instanceId: string): unknown;\n getLayout(): WorkbenchLayout;\n getScope?(): string | undefined;\n resolveScope?(context: OwnedPlacementLocationContext): string | undefined;\n loadLayout?(context: OwnedPlacementLocationContext): WorkbenchLayout | undefined;\n enteredWithPersistedLayout(): boolean;\n onDidChangePersistenceScope(listener: () => void): Disposable;\n}): WorkbenchShellPlacementRegistry => {\n const placements = new Map<string, WorkbenchShellPlacementContribution>();\n let state = createOwnedPlacementState();\n const listeners = new Set<() => void>();\n const label = \"Shell placement\";\n let runtime: (() => void) | undefined;\n const emitChange = () => {\n runtime?.();\n for (const listener of listeners)\n notifyWorkbenchChange(listener, () => runWorkbenchEffect(\"shell placement subscriber\", listener));\n };\n // A restored layout snapshot is the user's saved choice: placements present in\n // it are open, optional placements missing from it are closed. A scope without\n // a snapshot starts from each placement's declared presence.\n const restorePlacement = (placement: WorkbenchShellPlacementContribution) => {\n if (!input.enteredWithPersistedLayout()) {\n clearOwnedPlacementState(state, placement.id);\n return;\n }\n state = restoreOwnedPlacementState({\n state,\n declarations: [placement],\n saved: Object.values(input.getLayout().regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"shell\",\n });\n };\n input.onDidChangePersistenceScope(() => {\n for (const placement of placements.values()) restorePlacement(placement);\n notifyWorkbenchChange(placements, emitChange);\n });\n const resolve = (\n placement: WorkbenchShellPlacementContribution,\n instanceKey: string,\n resource?: ResourceRef,\n open?: PageOpenIntent,\n title?: string,\n ): ResolvedOwnedPlacement<WorkbenchWidgetPlacement> => {\n const panel = input.getPanel(shellPlacementContributionId(placement.id));\n if (!panel) throw new Error(`Workbench shell placement is not registered: ${placement.id}`);\n const identity = identityFor(placement.id, instanceKey);\n return {\n identity,\n region: placement.region,\n order: placement.order ?? 0,\n value: createPlacement(\n `workbench.shell.${encodeURIComponent(placement.id)}.${encodeURIComponent(instanceKey)}`,\n panel,\n {\n viewId: placementItemViewId(placement.item),\n role: roleForRegion(placement.region),\n closable: staticPlacementClosable(placement.item),\n ...(resource ? { resource } : {}),\n ...(title ? { title } : {}),\n ...tabState(open),\n },\n ),\n };\n };\n const preparation: OwnedPlacementPreparation = {\n connectRuntime(listener) {\n runtime = listener;\n return createDisposable(() => {\n if (runtime === listener) runtime = undefined;\n });\n },\n getState: () => state,\n restore(context, current = state, previousContext) {\n if (!input.resolveScope) return current;\n const scope = input.resolveScope(context);\n const previousScope = previousContext ? input.resolveScope(previousContext) : input.getScope?.();\n if (scope === previousScope) return current;\n if (scope === input.getScope?.()) return state;\n const layout = input.loadLayout?.(context);\n if (!layout) return createOwnedPlacementState();\n return restoreOwnedPlacementState({\n state: createOwnedPlacementState(),\n declarations: [...placements.values()],\n saved: Object.values(layout.regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"shell\",\n });\n },\n adopt(_modeId, saved, current = state) {\n return restoreOwnedPlacementState({\n state: current,\n declarations: [...placements.values()],\n saved,\n owns: (identity) => identity.kind === \"shell\",\n });\n },\n open(target, current = state) {\n const placement = placements.get(target.placementId);\n if (!placement) throw new Error(`Unknown shell placement: ${target.placementId}`);\n return prepareOwnedPlacement({\n label,\n target,\n item: placement.item,\n current,\n identityFor: (instanceKey) => identityFor(placement.id, instanceKey),\n });\n },\n apply: (next) => {\n state = next;\n },\n publish: emitChange,\n resolve(_modeId, current = state) {\n return [...placements.values()].flatMap((placement) => {\n if (placement.item.kind === \"view\") {\n return isStaticPlacementOpen(placement.item, current, placement.id) ? [resolve(placement, \"default\")] : [];\n }\n return (current.resourceInstances.get(placement.id) ?? []).map((instance) =>\n resolve(placement, instance.instanceKey, instance.resource, instance.open, instance.title),\n );\n });\n },\n };\n const registry: WorkbenchShellPlacementRegistry = {\n registerPlacement(placement) {\n if (placements.has(placement.id)) throw new Error(`Shell placement already registered: ${placement.id}`);\n if (!input.views.getView(placementItemViewId(placement.item))) {\n throw new Error(`Workbench shell placement view is not registered: ${placementItemViewId(placement.item)}`);\n }\n validateOwnedPlacementItem(label, placement.id, placement.item);\n const registered = { ...placement, item: { ...placement.item } };\n const panel = registerWorkbenchViewPlacement(\n input.registerPanel,\n input.views,\n {\n ...registered,\n id: shellPlacementContributionId(registered.id),\n viewId: placementItemViewId(registered.item),\n role: roleForRegion(registered.region),\n singleton: registered.item.kind === \"view\" || registered.item.binding.cardinality === \"one\",\n closable: staticPlacementClosable(registered.item),\n },\n input.viewMenus,\n );\n placements.set(registered.id, registered);\n if (input.enteredWithPersistedLayout()) restorePlacement(registered);\n emitChange();\n return createDisposable(() => {\n if (placements.get(registered.id) !== registered) return;\n placements.delete(registered.id);\n clearOwnedPlacementState(state, registered.id);\n panel.dispose();\n emitChange();\n });\n },\n getPlacement: (placementId) => placements.get(placementId),\n listPlacements: () => [...placements.values()].sort((left, right) => left.id.localeCompare(right.id)),\n openPlacement(target) {\n const prepared = preparation.open(target);\n preparation.apply(prepared.state);\n preparation.publish();\n input.activatePanel(\n `workbench.shell.${encodeURIComponent(target.placementId)}.${encodeURIComponent(prepared.identity.instanceKey)}`,\n );\n return prepared.identity;\n },\n\n closePlacement(identity) {\n if (identity.kind !== \"shell\") throw new Error(\"Shell placement registry closes only shell-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n const changed = closeOwnedPlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n });\n if (changed) emitChange();\n },\n updatePlacement(identity, update) {\n if (identity.kind !== \"shell\") throw new Error(\"Shell placement registry updates only shell-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n updateResourcePlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n ...update,\n });\n emitChange();\n },\n resolvePlacements: (context) => preparation.resolve(undefined, context ? preparation.restore!(context) : state),\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n setOwnedPlacementPreparation(registry, preparation);\n return registry;\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type PreferenceScope = \"default\" | \"user\" | \"project\" | \"repo\" | \"workspace\" | \"extension\" | \"session\";\nexport type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;\n\nexport interface PreferencePropertySchema {\n type: \"boolean\" | \"number\" | \"string\" | \"array\" | \"object\";\n enum?: PreferenceValue[];\n default?: PreferenceValue;\n scope: PreferenceScope;\n description?: string;\n}\n\nexport interface PreferenceSchemaContribution {\n properties: Record<string, PreferencePropertySchema>;\n}\n\nexport interface PreferenceScopeRef {\n scope: PreferenceScope;\n scopeId?: string;\n}\n\nexport interface PreferencePersistenceAdapter {\n getValue(name: string, scope: PreferenceScopeRef): PreferenceValue | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n}\n\nexport interface CreatePreferenceRegistryInput {\n persistence?: PreferencePersistenceAdapter;\n}\n\ntype RegisteredPreferenceSchema = PreferencePropertySchema & { ownerId: string; source: string };\n\nexport interface PreferenceRegistryStoreState {\n schemas: Record<string, RegisteredPreferenceSchema>;\n}\n\nexport interface PreferenceRegistry {\n store: WorkbenchStore<PreferenceRegistryStoreState>;\n registerSchema(schema: PreferenceSchemaContribution, metadata?: ContributionMetadata): Disposable;\n getSchema(name: string): RegisteredPreferenceSchema | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n getValue(name: string, scope?: PreferenceScopeRef): PreferenceValue | undefined;\n}\n\nconst valueKey = (name: string, scope: PreferenceScopeRef) => `${name}:${scope.scope}:${scope.scopeId ?? \"\"}`;\n\nconst createMemoryPreferencePersistence = () => {\n const values = new Map<string, PreferenceValue>();\n\n return {\n getValue(name: string, scope: PreferenceScopeRef) {\n return values.get(valueKey(name, scope));\n },\n\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef) {\n values.set(valueKey(name, scope), value);\n },\n } satisfies PreferencePersistenceAdapter;\n};\n\nexport const createPreferenceRegistry = (input: CreatePreferenceRegistryInput = {}): PreferenceRegistry => {\n const store = createWorkbenchStore<PreferenceRegistryStoreState>({\n name: \"workbench.preferences\",\n initialState: { schemas: {} },\n });\n const persistence = input.persistence ?? createMemoryPreferencePersistence();\n\n return {\n store,\n\n registerSchema(schema, metadata) {\n const registeredNames = Object.keys(schema.properties);\n const snapshot = store.getState();\n\n for (const name of registeredNames) {\n if (snapshot.schemas[name]) throw new Error(`Preference schema already registered: ${name}`);\n }\n\n const additions: Record<string, RegisteredPreferenceSchema> = {};\n for (const name of registeredNames) {\n const property = schema.properties[name];\n if (property) {\n additions[name] = {\n ...property,\n ownerId: metadata?.ownerId ?? \"workbench.core\",\n source: metadata?.source ?? \"module\",\n };\n }\n }\n\n store.setState({ schemas: { ...snapshot.schemas, ...additions } }, false, \"registerSchema\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = { ...current.schemas };\n for (const name of registeredNames) delete next[name];\n store.setState({ schemas: next }, false, \"unregisterSchema\");\n });\n },\n\n getSchema(name) {\n return store.getState().schemas[name];\n },\n\n setValue(name, value, scope) {\n if (!store.getState().schemas[name]) throw new Error(`Preference schema not registered: ${name}`);\n persistence.setValue(name, value, scope);\n },\n\n getValue(name, scope) {\n if (scope) {\n const scoped = persistence.getValue(name, scope);\n if (scoped !== undefined) return scoped;\n }\n\n const userValue = persistence.getValue(name, { scope: \"user\" });\n if (userValue !== undefined) return userValue;\n\n return store.getState().schemas[name]?.default;\n },\n };\n};\n","import type { ControlsQueryResult, ControlValue, ControlValueMap } from \"@pstdio/sdk/extensions\";\n\nexport type { ControlsQueryResult } from \"@pstdio/sdk/extensions\";\n\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport type ControlsRendererRegion = \"main-right-menu\" | \"secondary\" | \"overlay\";\n\nexport interface ControlsRendererLayout {\n region?: ControlsRendererRegion;\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport interface ControlsUpdateValueInput {\n controlId: string;\n value: ControlValue;\n values: ControlValueMap;\n resource?: ResourceRef;\n}\n\nexport interface ControlsApplyInput {\n values: ControlValueMap;\n resource?: ResourceRef;\n}\n\nexport interface ControlsResetInput {\n controlIds?: string[];\n resource?: ResourceRef;\n}\n\nexport interface ControlsRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n layout?: ControlsRendererLayout;\n defaultValues?: ControlValueMap;\n\n /** Load the control declarations + current values for the active resource. */\n executeQuery(\n resource: ResourceRef | undefined,\n signal: AbortSignal,\n ): Promise<ControlsQueryResult> | ControlsQueryResult;\n /** Live-save a single control edit. Omit for explicit-apply or read-only panels. */\n updateValue?(input: ControlsUpdateValueInput): Promise<void> | void;\n /** Commit the full value map from a sticky footer. */\n apply?(input: ControlsApplyInput): Promise<void> | void;\n /** Reset some or all controls to their defaults. */\n reset?(input: ControlsResetInput): Promise<void> | void;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n}\n\nexport interface RegisteredControlsRendererContribution\n extends ControlsRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface ControlsRendererStoreState {\n renderers: Record<string, RegisteredControlsRendererContribution>;\n}\n\nexport interface ControlsRendererRefreshEvent {\n controlsRendererId: string;\n}\n\nexport type ControlsRendererRefreshListener = (event: ControlsRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a controls widget. Set once on\n// workbench mount via setControlsRendererImplementation so registerControlsRenderer\n// can auto-register a widget renderer with the same id.\nexport type ControlsRendererImplementation = (\n input: WorkbenchPanelRenderInput & { controlsRendererId: string },\n) => unknown;\n\nexport interface CreateControlsRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface ControlsRendererRegistry {\n controlsStore: WorkbenchStore<ControlsRendererStoreState>;\n registerControlsRenderer(contribution: ControlsRendererContribution, metadata?: ContributionMetadata): Disposable;\n setControlsRendererImplementation(impl: ControlsRendererImplementation): void;\n getControlsRenderer(id: string): RegisteredControlsRendererContribution | undefined;\n listControlsRenderers(): RegisteredControlsRendererContribution[];\n refreshControlsRenderer(id: string): void;\n onDidRefreshControlsRenderer(listener: ControlsRendererRefreshListener): Disposable;\n}\n\nexport const createControlsRendererRegistry = (\n input: CreateControlsRendererRegistryInput,\n): ControlsRendererRegistry => {\n const { rendererRegistry } = input;\n\n const controlsStore = createWorkbenchStore<ControlsRendererStoreState>({\n name: \"workbench.controlsRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<ControlsRendererRefreshListener>();\n let implementation: ControlsRendererImplementation = () => null;\n\n const requireControlsRenderer = (id: string) => {\n const renderer = controlsStore.getState().renderers[id];\n if (!renderer) throw new Error(`Controls renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n controlsStore,\n\n setControlsRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerControlsRenderer(contribution, metadata) {\n const snapshot = controlsStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Controls renderer already registered: ${contribution.id}`);\n }\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredControlsRendererContribution;\n\n controlsStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerControlsRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchControlsView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, controlsRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = controlsStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n controlsStore.setState({ renderers: nextRenderers }, false, \"unregisterControlsRenderer\");\n });\n },\n\n getControlsRenderer(id) {\n return controlsStore.getState().renderers[id];\n },\n\n listControlsRenderers() {\n return Object.values(controlsStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshControlsRenderer(id) {\n requireControlsRenderer(id);\n const event = { controlsRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshControlsRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { DataTableRendererSettings, ViewFilterGroup, ViewSort } from \"@pstdio/sdk/extensions\";\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { CollectionSavedView, CollectionViewsProvider } from \"./kanban-renderer-contracts\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\nimport type { ViewToolbarAction } from \"./view-toolbar-action\";\n\nexport interface DataTableRendererThemeColor {\n light: string;\n dark: string;\n foreground?: { light: string; dark: string };\n}\n\nexport type DataTableRendererColumnStat =\n | { type: \"unique\" }\n | { type: \"histogram\"; bins?: number }\n | { type: \"top-values\"; limit?: number };\n\nexport type DataTableRendererBadgePalette =\n | \"gray\"\n | \"red\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"teal\"\n | \"blue\"\n | \"cyan\"\n | \"purple\"\n | \"pink\";\n\nexport type DataTableRendererColumnRenderer =\n | { type: \"json\" }\n | { type: \"color-scale\"; stops: Array<{ value: number; color: DataTableRendererThemeColor }> }\n | {\n type: \"categorical-color\";\n categories: Array<{ value: string | number | boolean | null; color: DataTableRendererThemeColor }>;\n }\n | {\n type: \"badge\";\n categories?: Array<{ value: string | number | boolean | null; palette: DataTableRendererBadgePalette }>;\n }\n | { type: \"diff\" }\n | { type: \"date\" }\n | { type: \"path\" };\n\nexport interface DataTableRendererColumn {\n id: string;\n label?: string;\n /** How filters and sorts compare the column. Without it, the type is inferred from the values. */\n type?: \"string\" | \"number\" | \"boolean\" | \"date\";\n /** Offers the column under Grouping in the table's Display menu. */\n groupable?: boolean;\n /** Whether this column can be filtered. Defaults to true. */\n filterable?: boolean;\n description?: string;\n icon?: unknown;\n hidden?: boolean;\n stat?: DataTableRendererColumnStat;\n renderer?: DataTableRendererColumnRenderer;\n}\n\nexport interface DataTableRendererRow {\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n}\n\nexport interface DataTableRendererQueryResult {\n rows: DataTableRendererRow[];\n columns?: DataTableRendererColumn[];\n}\n\nexport interface DataTableRendererQueryContext {\n resource?: ResourceRef;\n modeId?: string;\n filter: ViewFilterGroup;\n sorts: ViewSort[];\n settings: DataTableRendererSettings;\n}\n\nexport type DataTableRendererSavedView = CollectionSavedView<DataTableRendererSettings>;\n\nexport interface DataTableRendererRowAction {\n id: string;\n commandId?: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(row: DataTableRendererRow): Promise<void> | void;\n}\n\nexport interface DataTableRendererSelectionAction {\n id: string;\n commandId?: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(rows: DataTableRendererRow[]): Promise<void> | void;\n}\n\nexport interface DataTableRendererContribution {\n id: string;\n title: string;\n toolbarActions?: ViewToolbarAction[];\n resourceKind?: string;\n columns?: DataTableRendererColumn[];\n selectionMode?: \"none\" | \"multiple\";\n selectionActions?: DataTableRendererSelectionAction[];\n rowActions?: DataTableRendererRowAction[];\n initialPageSize?: number;\n pageSizeOptions?: number[];\n /** The view state used before a saved view is active, such as hidden columns or statistics. */\n defaultSettings?: Partial<DataTableRendererSettings>;\n defaultFilter?: ViewFilterGroup;\n defaultSorts?: ViewSort[];\n defaultViews?: DataTableRendererSavedView[];\n defaultActiveViewId?: string;\n /** Shared saved views. Without it the table offers its default views only. */\n viewsProvider?: CollectionViewsProvider<DataTableRendererSettings>;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Context keys that choose which rows the query returns. A change drops the old rows and starts a new read. */\n contextKeys?: string[];\n executeQuery(\n context: DataTableRendererQueryContext,\n signal: AbortSignal,\n ): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;\n}\n\nexport interface RegisteredDataTableRendererContribution\n extends DataTableRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface DataTableRendererStoreState {\n renderers: Record<string, RegisteredDataTableRendererContribution>;\n}\n\nexport interface DataTableRendererRefreshEvent {\n dataTableRendererId: string;\n}\n\nexport type DataTableRendererImplementation = (\n input: WorkbenchPanelRenderInput & { dataTableRendererId: string },\n) => unknown;\n\nexport interface DataTableRendererRegistry {\n dataTableStore: WorkbenchStore<DataTableRendererStoreState>;\n registerDataTableRenderer(contribution: DataTableRendererContribution, metadata?: ContributionMetadata): Disposable;\n setDataTableRendererImplementation(implementation: DataTableRendererImplementation): void;\n getDataTableRenderer(id: string): RegisteredDataTableRendererContribution | undefined;\n listDataTableRenderers(): RegisteredDataTableRendererContribution[];\n refreshDataTableRenderer(id: string): void;\n onDidRefreshDataTableRenderer(listener: (event: DataTableRendererRefreshEvent) => void): Disposable;\n}\n\nexport const createDataTableRendererRegistry = (input: {\n rendererRegistry: WorkbenchRendererRegistry;\n}): DataTableRendererRegistry => {\n const dataTableStore = createWorkbenchStore<DataTableRendererStoreState>({\n name: \"workbench.dataTableRenderers\",\n initialState: { renderers: {} },\n });\n const refreshListeners = new Set<(event: DataTableRendererRefreshEvent) => void>();\n let implementation: DataTableRendererImplementation = () => null;\n\n return {\n dataTableStore,\n setDataTableRendererImplementation(next) {\n implementation = next;\n },\n registerDataTableRenderer(contribution, metadata) {\n const snapshot = dataTableStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Data table renderer already registered: ${contribution.id}`);\n }\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredDataTableRendererContribution;\n dataTableStore.setState(\n { renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerDataTableRenderer\",\n );\n const rendererDisposable = input.rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, dataTableRendererId: contribution.id }),\n });\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataTableStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...renderers } = current.renderers;\n dataTableStore.setState({ renderers }, false, \"unregisterDataTableRenderer\");\n });\n },\n getDataTableRenderer(id) {\n return dataTableStore.getState().renderers[id];\n },\n listDataTableRenderers() {\n return Object.values(dataTableStore.getState().renderers).sort(byContributionPriority);\n },\n refreshDataTableRenderer(id) {\n if (!dataTableStore.getState().renderers[id]) throw new Error(`Data table renderer not registered: ${id}`);\n const event = { dataTableRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n onDidRefreshDataTableRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => refreshListeners.delete(listener));\n },\n } satisfies DataTableRendererRegistry;\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\n// What a file renderer's load resolves to. The React layer dispatches to a\n// markdown editor, a code editor, or an image preview based on `fileName` /\n// `mimeType`; text-ish files carry `content`, images carry `dataUrl`.\nexport interface FileRendererContent {\n fileName?: string;\n /** Workspace-relative path shown above the file preview. */\n filePath?: string;\n mimeType?: string;\n content?: string;\n dataUrl?: string;\n // Shown by the editor when the content is empty (editable text only).\n placeholder?: string;\n /** Override contribution-level save support for one loaded file. */\n editable?: boolean;\n /** Request Monaco for text that automatic dispatch would open as markdown. */\n textRenderer?: \"automatic\" | \"monaco\";\n /** Represent a deliberate no-file selection without an editable blank document. */\n emptyState?: {\n title: string;\n description?: string;\n };\n /** Ordered backing-store revision when one is available. */\n revision?: string;\n}\n\nexport interface FileRendererRefreshOrigin {\n rendererId: string;\n instanceId: string;\n operationId: string;\n}\n\nexport interface FileRendererRefreshEnvelope {\n resourceKey?: string;\n origin?: FileRendererRefreshOrigin;\n revision?: string;\n}\n\nexport interface FileRendererSaveResult {\n revision?: string;\n}\n\nexport interface FileRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n\n /** Resolve the file's content (and identity) for the bound resource. */\n load(resource: ResourceRef | undefined, signal: AbortSignal): Promise<FileRendererContent> | FileRendererContent;\n /** Persist edited text. Absent ⇒ read-only. Never called for images. */\n save?(\n resource: ResourceRef | undefined,\n content: string,\n origin?: FileRendererRefreshOrigin,\n // biome-ignore lint/suspicious/noConfusingVoidType: Existing synchronous save callbacks return void.\n ): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;\n}\n\nexport interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {}\n\nexport interface FileRendererStoreState {\n renderers: Record<string, RegisteredFileRendererContribution>;\n}\n\nexport interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {\n fileRendererId: string;\n}\n\nexport type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a file-renderer widget. Set once on\n// workbench mount via setFileRendererImplementation so registerFileRenderer can\n// auto-register a widget renderer with the same id.\nexport type FileRendererImplementation = (input: WorkbenchPanelRenderInput & { fileRendererId: string }) => unknown;\n\nexport interface CreateFileRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface FileRendererRegistry {\n fileRendererStore: WorkbenchStore<FileRendererStoreState>;\n registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable;\n setFileRendererImplementation(impl: FileRendererImplementation): void;\n getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;\n listFileRenderers(): RegisteredFileRendererContribution[];\n refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;\n onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable;\n}\n\nexport const createFileRendererRegistry = (input: CreateFileRendererRegistryInput): FileRendererRegistry => {\n const { rendererRegistry } = input;\n\n const fileRendererStore = createWorkbenchStore<FileRendererStoreState>({\n name: \"workbench.fileRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<FileRendererRefreshListener>();\n let implementation: FileRendererImplementation = () => null;\n\n const requireFileRenderer = (id: string) => {\n const renderer = fileRendererStore.getState().renderers[id];\n if (!renderer) throw new Error(`File renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n fileRendererStore,\n\n setFileRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerFileRenderer(contribution, metadata) {\n const snapshot = fileRendererStore.getState();\n if (snapshot.renderers[contribution.id]) throw new Error(`File renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredFileRendererContribution;\n\n fileRendererStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerFileRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchFileRendererView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, fileRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = fileRendererStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n fileRendererStore.setState({ renderers: nextRenderers }, false, \"unregisterFileRenderer\");\n });\n },\n\n getFileRenderer(id) {\n return fileRendererStore.getState().renderers[id];\n },\n\n listFileRenderers(): RegisteredFileRendererContribution[] {\n return Object.values(fileRendererStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshFileRenderer(id, envelope = {}) {\n requireFileRenderer(id);\n const event = { fileRendererId: id, ...envelope };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshFileRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ViewFilterGroup, ViewSort } from \"@pstdio/sdk/extensions\";\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n AttributeDescriptor,\n AttributesSource,\n BoardColumnConfig,\n KanbanRendererCreateRowConfig,\n KanbanRendererCreateSubmission,\n KanbanRendererRow,\n KanbanRendererSavedView,\n KanbanRendererSettings,\n KanbanRendererViewsProvider,\n ResourceContextAction,\n} from \"./kanban-renderer-contracts\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\nimport type { ViewToolbarAction } from \"./view-toolbar-action\";\n\nexport interface KanbanRendererQueryState {\n settings: KanbanRendererSettings;\n filter: ViewFilterGroup;\n sorts: ViewSort[];\n}\n\nexport interface KanbanRendererContribution<\n TRow extends KanbanRendererRow = KanbanRendererRow,\n TNode = unknown,\n TIcon = unknown,\n> {\n id: string;\n title: string;\n toolbarActions?: ViewToolbarAction[];\n /** Authored row actions for discovery without querying rows or evaluating a row menu. */\n listRowActions?: () => Pick<ViewToolbarAction, \"commandId\" | \"label\" | \"args\">[];\n resourceKind?: string;\n /** Host-owned scope for persisted display settings. */\n storageScope?: string;\n\n /**\n * Declarative attribute schema. The renderer dispatches filter / group /\n * sort / display / inline-edit behavior on each descriptor's `type.kind`.\n *\n * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a\n * static array to let the contribution mutate its schema at runtime —\n * `WorkbenchKanbanView` subscribes so additions / removals / kind changes\n * propagate live without re-registering the renderer.\n */\n attributes: AttributeDescriptor<TNode>[] | AttributesSource<TNode>;\n\n /** Per-board-column overrides (color, drag/create rules, custom actions). */\n getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig<TIcon>;\n hideToolbar?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n\n /** The view state used before a saved view is active. */\n defaultSettings?: Partial<KanbanRendererSettings>;\n defaultFilter?: ViewFilterGroup;\n defaultSorts?: ViewSort[];\n viewsProvider?: KanbanRendererViewsProvider;\n defaultViews?: KanbanRendererSavedView[];\n defaultActiveViewId?: string;\n\n /**\n * Data source. Receives the current display state so backends can paginate\n * / filter / sort. The renderer re-applies filter / sort / group locally,\n * so this can return unfiltered rows in simple cases.\n */\n executeQuery(state: KanbanRendererQueryState, signal: AbortSignal): Promise<TRow[]> | TRow[];\n subscribe?: (listener: () => void) => Disposable | (() => void);\n\n /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */\n onRowActivate?: (row: TRow) => Promise<void> | void;\n /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */\n getRowContextMenuActions?: (row: TRow) => ResourceContextAction<TNode>[];\n /**\n * Fires for inline attribute edits AND for cross-column drag-to-reorder on\n * the board (the renderer passes the grouping attribute id + the target\n * column value).\n */\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n /** Manual within-column reorder. Only fires while the view has no sorts. */\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n createRow?: KanbanRendererCreateRowConfig;\n onCreateRow?: (submission: KanbanRendererCreateSubmission) => Promise<void> | void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n}\n\nexport interface RegisteredKanbanRendererContribution<\n TRow extends KanbanRendererRow = KanbanRendererRow,\n TNode = unknown,\n TIcon = unknown,\n> extends KanbanRendererContribution<TRow, TNode, TIcon>,\n RegisteredContributionMetadata {}\n\nexport interface KanbanRendererStoreState {\n renderers: Record<string, RegisteredKanbanRendererContribution>;\n}\n\nexport interface KanbanRendererRefreshEvent {\n kanbanRendererId: string;\n}\n\nexport type KanbanRendererRefreshListener = (event: KanbanRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a kanban-renderer Panel. Set once on\n// workbench mount via setKanbanRendererImplementation so registerKanbanRenderer can\n// auto-register a Panel renderer with the same id.\nexport type KanbanRendererImplementation = (input: WorkbenchPanelRenderInput & { kanbanRendererId: string }) => unknown;\n\nexport interface CreateKanbanRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface KanbanRendererRegistry {\n dataStore: WorkbenchStore<KanbanRendererStoreState>;\n registerKanbanRenderer<TRow extends KanbanRendererRow = KanbanRendererRow>(\n contribution: KanbanRendererContribution<TRow>,\n metadata?: ContributionMetadata,\n ): Disposable;\n setKanbanRendererImplementation(impl: KanbanRendererImplementation): void;\n getKanbanRenderer(id: string): RegisteredKanbanRendererContribution | undefined;\n listKanbanRenderers(): RegisteredKanbanRendererContribution[];\n refreshKanbanRenderer(id: string): void;\n onDidRefreshKanbanRenderer(listener: KanbanRendererRefreshListener): Disposable;\n}\n\nexport const createKanbanRendererRegistry = (input: CreateKanbanRendererRegistryInput): KanbanRendererRegistry => {\n const { rendererRegistry } = input;\n\n const dataStore = createWorkbenchStore<KanbanRendererStoreState>({\n name: \"workbench.kanbanRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<KanbanRendererRefreshListener>();\n let implementation: KanbanRendererImplementation = () => null;\n\n const requireKanbanRenderer = (id: string) => {\n const renderer = dataStore.getState().renderers[id];\n if (!renderer) throw new Error(`Kanban renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n dataStore,\n\n setKanbanRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerKanbanRenderer(contribution, metadata) {\n const snapshot = dataStore.getState();\n if (snapshot.renderers[contribution.id])\n throw new Error(`Kanban renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredKanbanRendererContribution;\n\n dataStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerKanbanRenderer\",\n );\n\n // Auto-register a Panel renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchKanbanView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, kanbanRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n dataStore.setState({ renderers: nextRenderers }, false, \"unregisterKanbanRenderer\");\n });\n },\n\n getKanbanRenderer(id) {\n return dataStore.getState().renderers[id];\n },\n\n listKanbanRenderers(): RegisteredKanbanRendererContribution[] {\n return Object.values(dataStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshKanbanRenderer(id) {\n requireKanbanRenderer(id);\n const event = { kanbanRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshKanbanRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n} from \"../layout/layout-model\";\n\nexport interface WorkbenchPanelRenderInput {\n workbench: WorkbenchCore;\n panel: WorkbenchPanelContribution | PlaceholderContribution | RegisteredPlaceholderContribution;\n instance: WorkbenchPanelInstance;\n refresh: () => void;\n}\n\nexport interface WorkbenchRendererRegistration {\n id: string;\n render: (input: WorkbenchPanelRenderInput) => unknown;\n}\n\nexport type WorkbenchRendererChangeListener = () => void;\n\nexport interface WorkbenchRendererStoreState {\n renderers: Record<string, WorkbenchRendererRegistration>;\n refreshKeys: Record<string, number>;\n}\n\nexport interface WorkbenchRendererRegistry {\n store: WorkbenchStore<WorkbenchRendererStoreState>;\n registerRenderer(renderer: WorkbenchRendererRegistration): Disposable;\n getRenderer(id: string): WorkbenchRendererRegistration | undefined;\n listRenderers(): WorkbenchRendererRegistration[];\n refreshRenderer(id: string): void;\n onDidChange(listener: WorkbenchRendererChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchRendererRegistryInput {\n initialRenderers?: WorkbenchRendererRegistration[];\n}\n\nexport const createWorkbenchRendererRegistry = (\n input: CreateWorkbenchRendererRegistryInput = {},\n): WorkbenchRendererRegistry => {\n const store = createWorkbenchStore<WorkbenchRendererStoreState>({\n name: \"workbench.renderers\",\n initialState: { renderers: {}, refreshKeys: {} },\n });\n\n const registry: WorkbenchRendererRegistry = {\n store,\n\n registerRenderer(renderer) {\n const snapshot = store.getState();\n if (snapshot.renderers[renderer.id]) throw new Error(`Renderer already registered: ${renderer.id}`);\n store.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [renderer.id]: renderer } },\n false,\n \"registerRenderer\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.renderers[renderer.id] !== renderer) return;\n const { [renderer.id]: _removed, ...renderers } = current.renderers;\n const { [renderer.id]: _refreshKey, ...refreshKeys } = current.refreshKeys;\n store.setState({ renderers, refreshKeys }, false, \"unregisterRenderer\");\n });\n },\n\n getRenderer: (id) => store.getState().renderers[id],\n\n listRenderers: () => Object.values(store.getState().renderers),\n\n refreshRenderer(id) {\n const snapshot = store.getState();\n if (!snapshot.renderers[id]) throw new Error(`Renderer is not registered: ${id}`);\n store.setState(\n { ...snapshot, refreshKeys: { ...snapshot.refreshKeys, [id]: (snapshot.refreshKeys[id] ?? 0) + 1 } },\n false,\n \"refreshRenderer\",\n );\n },\n\n onDidChange(listener) {\n return createDisposable(\n store.subscribeSelector(\n (state) => state.renderers,\n () => listener(),\n ),\n );\n },\n };\n\n for (const renderer of input.initialRenderers ?? []) registry.registerRenderer(renderer);\n return registry;\n};\n","import { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n CreateTreeRendererRegistryInput,\n RegisteredTreeRendererContribution,\n TreeRendererContribution,\n TreeRendererImplementation,\n TreeRendererRefreshListener,\n TreeRendererRegistry,\n TreeRendererState,\n TreeRendererStoreState,\n} from \"./tree-renderer-types\";\n\nexport type * from \"./tree-renderer-types\";\n\nconst createDefaultState = (view: TreeRendererContribution): TreeRendererState => ({\n expandedNodeIds: [...(view.defaultExpandedNodeIds ?? [])],\n expandedSectionIds: [...(view.defaultExpandedSectionIds ?? [])],\n});\n\n// Section defaults are re-applied on every registration so a section that\n// should start expanded (e.g. a ticket's workspaces) stays expanded even when\n// an older persisted state predates it. Node expansion stays user-controlled.\nconst mergeDefaultSections = (state: TreeRendererState, view: TreeRendererContribution): TreeRendererState => {\n const missing = (view.defaultExpandedSectionIds ?? []).filter((id) => !state.expandedSectionIds.includes(id));\n if (missing.length === 0) return state;\n return { ...state, expandedSectionIds: [...state.expandedSectionIds, ...missing] };\n};\n\nconst toggleId = (ids: string[], id: string, expanded: boolean) => {\n if (expanded) return ids.includes(id) ? ids : [...ids, id];\n return ids.includes(id) ? ids.filter((value) => value !== id) : ids;\n};\n\nexport const createTreeRendererRegistry = (input: CreateTreeRendererRegistryInput): TreeRendererRegistry => {\n const { rendererRegistry, persistence } = input;\n const persisted = persistence?.getTreeStates();\n\n const treeStore = createWorkbenchStore<TreeRendererStoreState>({\n name: \"workbench.treeRenderers\",\n initialState: {\n trees: {},\n statesByTreeId: persisted?.statesByTreeId ?? {},\n refreshKeysByTreeId: {},\n },\n });\n\n const refreshListeners = new Set<TreeRendererRefreshListener>();\n let implementation: TreeRendererImplementation = () => null;\n\n const requireTree = (id: string) => {\n const tree = treeStore.getState().trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n return tree;\n };\n\n const ensureState = (id: string) => {\n const current = treeStore.getState();\n const existing = current.statesByTreeId[id];\n if (existing) return existing;\n\n const tree = current.trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n\n const fresh = createDefaultState(tree);\n treeStore.setState(\n {\n ...current,\n statesByTreeId: { ...current.statesByTreeId, [id]: fresh },\n },\n false,\n \"ensureTreeState\",\n );\n return fresh;\n };\n\n const persistStates = () => {\n if (!persistence) return;\n const statesByTreeId: Record<string, TreeRendererState> = {};\n for (const [id, state] of Object.entries(treeStore.getState().statesByTreeId)) {\n const { loading: _loading, ...persistable } = state;\n statesByTreeId[id] = persistable;\n }\n persistence.setTreeStates({ statesByTreeId });\n };\n\n const updateState = (id: string, update: (state: TreeRendererState) => TreeRendererState, action: string) => {\n const current = ensureState(id);\n const next = update(current);\n if (next === current) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: next },\n },\n false,\n action,\n );\n persistStates();\n };\n\n const registry: TreeRendererRegistry = {\n treeStore,\n\n setTreeRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerTreeRenderer(view, metadata) {\n const snapshot = treeStore.getState();\n if (snapshot.trees[view.id]) throw new Error(`Tree renderer already registered: ${view.id}`);\n\n const record: RegisteredTreeRendererContribution = {\n ...normalizeContributionMetadata(metadata),\n ...view,\n };\n const persistedState = snapshot.statesByTreeId[view.id];\n const nextState = persistedState ? mergeDefaultSections(persistedState, view) : createDefaultState(view);\n\n treeStore.setState(\n {\n ...snapshot,\n trees: { ...snapshot.trees, [view.id]: record },\n statesByTreeId: { ...snapshot.statesByTreeId, [view.id]: nextState },\n },\n false,\n \"registerTreeRenderer\",\n );\n\n // Auto-register a widget renderer with the same id so widgets can place\n // this tree via rendererId: view.id. The render fn calls the React-side\n // implementation supplied through setTreeRendererImplementation.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: view.id,\n render: (rendererInput) => implementation({ ...rendererInput, treeId: view.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = treeStore.getState();\n if (current.trees[view.id] !== record) return;\n const { [view.id]: _removed, ...nextTrees } = current.trees;\n const { [view.id]: _removedState, ...nextStates } = current.statesByTreeId;\n const { [view.id]: _removedRefresh, ...nextRefresh } = current.refreshKeysByTreeId;\n treeStore.setState(\n {\n trees: nextTrees,\n statesByTreeId: nextStates,\n refreshKeysByTreeId: nextRefresh,\n },\n false,\n \"unregisterTreeRenderer\",\n );\n persistStates();\n });\n },\n\n getTreeRenderer(id) {\n return treeStore.getState().trees[id];\n },\n\n listTreeRenderers() {\n return Object.values(treeStore.getState().trees).sort(byContributionPriority);\n },\n\n async getBody(id, ctx = {}) {\n return await requireTree(id).getBody({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getHeader(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getHeader) return [];\n return await tree.getHeader({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getFooter(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getFooter) return [];\n return await tree.getFooter({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getChildren(id, node, ctx = {}) {\n return await requireTree(id).getChildren(node, {\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n getTreeState(id) {\n const state = ensureState(id);\n return {\n expandedNodeIds: [...state.expandedNodeIds],\n expandedSectionIds: [...state.expandedSectionIds],\n selectedNodeId: state.selectedNodeId,\n loading: state.loading,\n };\n },\n\n setNodeExpanded(id, nodeId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedNodeIds, nodeId, expanded);\n if (nextIds === state.expandedNodeIds) return state;\n return { ...state, expandedNodeIds: nextIds };\n },\n \"setNodeExpanded\",\n );\n },\n\n setSectionExpanded(id, sectionId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedSectionIds, sectionId, expanded);\n if (nextIds === state.expandedSectionIds) return state;\n return { ...state, expandedSectionIds: nextIds };\n },\n \"setSectionExpanded\",\n );\n },\n\n setSelectedNode(id, nodeId) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n if (state.selectedNodeId === nodeId) return state;\n return { ...state, selectedNodeId: nodeId };\n },\n \"setSelectedNode\",\n );\n },\n\n setLoading(id, loading) {\n requireTree(id);\n const current = ensureState(id);\n if (current.loading === loading) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: { ...current, loading } },\n },\n false,\n \"setLoading\",\n );\n },\n\n refresh(id) {\n requireTree(id);\n const snapshot = treeStore.getState();\n const current = snapshot.refreshKeysByTreeId[id] ?? 0;\n treeStore.setState(\n {\n ...snapshot,\n refreshKeysByTreeId: { ...snapshot.refreshKeysByTreeId, [id]: current + 1 },\n },\n false,\n \"refreshTreeRenderer\",\n );\n const event = { treeId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefresh(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n return registry;\n};\n","export interface RendererReadRequest<T> {\n queryKey: string;\n load(signal: AbortSignal, publish: (value: T) => void): Promise<T> | T;\n onProgress?(value: T): void;\n onValue(value: T): void;\n onError(error: unknown): void;\n}\n\ninterface ReadJob {\n token: symbol;\n generation: number;\n queryKey: string;\n run(signal: AbortSignal): Promise<void>;\n onError(error: unknown): void;\n}\n\ninterface ReadOwner {\n binding?: symbol;\n queryKey?: string;\n generation: number;\n pending?: ReadJob;\n active?: { controller: AbortController; settled: Promise<void> };\n queued: boolean;\n waiters: Set<() => void>;\n}\n\nexport interface RendererReadBinding {\n request<T>(request: RendererReadRequest<T>, reason?: \"refresh\" | \"retry\"): Promise<void>;\n dispose(): void;\n}\n\nexport interface RendererReadRegistry {\n bind(key: string): RendererReadBinding;\n dispose(): Promise<void>;\n}\n\nexport const createRendererReadRegistry = (): RendererReadRegistry => {\n const owners = new Map<string, ReadOwner>();\n let disposed = false;\n const release = (key: string, owner: ReadOwner) => {\n if (!owner.active && !owner.pending && !owner.queued) {\n for (const finish of owner.waiters) finish();\n owner.waiters.clear();\n }\n if (!owner.binding && !owner.active && !owner.pending && owners.get(key) === owner) owners.delete(key);\n };\n const isCurrent = (owner: ReadOwner, job: ReadJob) =>\n owner.binding === job.token && owner.generation === job.generation;\n const schedule = (key: string, owner: ReadOwner) => {\n if (owner.queued || owner.active || disposed) return;\n owner.queued = true;\n queueMicrotask(() => {\n owner.queued = false;\n const job = owner.pending;\n if (!job || disposed || owner.active) {\n release(key, owner);\n return;\n }\n owner.pending = undefined;\n if (!isCurrent(owner, job)) {\n release(key, owner);\n return;\n }\n const controller = new AbortController();\n const settled = Promise.resolve()\n .then(() => job.run(controller.signal))\n .catch((error) => {\n if (!controller.signal.aborted && isCurrent(owner, job)) job.onError(error);\n })\n .finally(() => {\n owner.active = undefined;\n if (owner.pending) schedule(key, owner);\n release(key, owner);\n });\n owner.active = { controller, settled };\n });\n };\n\n return {\n bind(key) {\n if (disposed) throw new Error(\"Read registry is disposed\");\n const owner = owners.get(key) ?? { generation: 0, queued: false, waiters: new Set<() => void>() };\n owners.set(key, owner);\n owner.active?.controller.abort();\n owner.pending = undefined;\n const token = Symbol(key);\n owner.binding = token;\n owner.generation++;\n return {\n request<T>(request: RendererReadRequest<T>, reason: \"refresh\" | \"retry\" = \"refresh\") {\n if (owner.binding !== token || disposed) return Promise.resolve();\n if (owner.queryKey !== request.queryKey || reason === \"retry\") {\n owner.generation++;\n owner.active?.controller.abort();\n }\n owner.queryKey = request.queryKey;\n const generation = owner.generation;\n let finish!: () => void;\n const completed = new Promise<void>((resolve) => {\n finish = resolve;\n });\n owner.waiters.add(finish);\n const job: ReadJob = {\n token,\n generation,\n queryKey: request.queryKey,\n onError: request.onError,\n async run(signal) {\n signal.throwIfAborted();\n let reading = true;\n const publish = (value: T) => {\n if (reading && !signal.aborted && isCurrent(owner, job)) request.onProgress?.(value);\n };\n let value: T;\n try {\n value = await request.load(signal, publish);\n } finally {\n reading = false;\n }\n if (!signal.aborted && isCurrent(owner, job)) request.onValue(value);\n },\n };\n owner.pending = job;\n schedule(key, owner);\n return completed;\n },\n dispose() {\n if (owner.binding !== token) return;\n owner.binding = undefined;\n owner.pending = undefined;\n owner.generation++;\n owner.active?.controller.abort();\n release(key, owner);\n },\n };\n },\n async dispose() {\n disposed = true;\n const pending: Promise<void>[] = [];\n for (const [key, owner] of owners) {\n owner.binding = undefined;\n owner.pending = undefined;\n if (owner.active) {\n owner.active.controller.abort();\n pending.push(owner.active.settled);\n }\n release(key, owner);\n }\n await Promise.allSettled(pending);\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n/** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */\nexport type SettingsScope = \"global\" | \"project\";\n\n/** A \"+ create\"-style action surfaced on a section or a collection's parent node. */\nexport interface SettingsAction {\n id: string;\n label: string;\n icon?: string;\n run(): void | Promise<void>;\n}\n\n/** An ordered sidenav container. Headerless when `title` is omitted. */\nexport interface SettingsSectionContribution {\n id: string;\n title?: string;\n order?: number;\n scope?: SettingsScope;\n actions?: SettingsAction[];\n}\nexport type RegisteredSettingsSection = SettingsSectionContribution & RegisteredContributionMetadata;\n\n/** A preference this panel edits; a bare string uses the preference name as its label. */\nexport type SettingsPanelPreference = string | { name: string; label?: string };\n\nexport interface SettingsPanelBase {\n id: string;\n title: string;\n description?: string;\n /** Section id this panel belongs to. */\n section?: string;\n icon?: string;\n /** Lower sorts first; ties fall back to contribution priority then registration order. */\n order?: number;\n scope?: SettingsScope;\n when?: string;\n}\n\n/** Auto-rendered as a param editor from the registered preference schema. */\nexport interface SchemaSettingsPanel extends SettingsPanelBase {\n kind: \"schema\";\n preferences: SettingsPanelPreference[];\n /** \"live\" persists on change (default); \"apply\" stages edits behind Save/Discard. */\n save?: \"live\" | \"apply\";\n}\n\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 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 Object.values(store.getState().panels).sort(byOrderThenPriority);\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 { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\n\nexport type WorkbenchStatusBarSlot = \"leading\" | \"trailing\";\n\nexport interface WorkbenchStatusBarItem {\n id: string;\n viewId: string;\n slot: WorkbenchStatusBarSlot;\n order?: number;\n isVisible?(): boolean;\n}\n\nexport interface WorkbenchStatusBarRegistryState {\n items: Record<string, WorkbenchStatusBarItem>;\n order: string[];\n}\n\nexport interface WorkbenchStatusBarPersistenceAdapter {\n getOrder(): string[] | undefined;\n setOrder(ids: string[]): void;\n}\n\nexport type WorkbenchStatusBarPosition = { beforeItemId: string } | { afterItemId: string };\n\nexport interface WorkbenchStatusBarRegistry {\n store: WorkbenchStore<WorkbenchStatusBarRegistryState>;\n registerItem(item: WorkbenchStatusBarItem): Disposable;\n getItem(id: string): WorkbenchStatusBarItem | undefined;\n listItems(): WorkbenchStatusBarItem[];\n listVisibleItems(slot?: WorkbenchStatusBarSlot): WorkbenchStatusBarItem[];\n reorderItem(id: string, position: WorkbenchStatusBarPosition): void;\n}\n\nexport interface CreateWorkbenchStatusBarRegistryInput {\n hasView(viewId: string): boolean;\n persistence?: WorkbenchStatusBarPersistenceAdapter;\n}\n\nconst bySlotOrderAndId = (left: WorkbenchStatusBarItem, right: WorkbenchStatusBarItem) =>\n left.slot.localeCompare(right.slot) || (left.order ?? 0) - (right.order ?? 0) || left.id.localeCompare(right.id);\n\nexport const createStatusBarRegistry = (input: CreateWorkbenchStatusBarRegistryInput): WorkbenchStatusBarRegistry => {\n const store = createWorkbenchStore<WorkbenchStatusBarRegistryState>({\n name: \"workbench.statusBar\",\n initialState: {\n items: {},\n order: runWorkbenchEffect(\"status bar order read\", () => input.persistence?.getOrder()) ?? [],\n },\n });\n\n const listItems = () => {\n const { items, order } = store.getState();\n const rank = new Map(order.map((id, index) => [id, index]));\n return Object.values(items).sort((left, right) => {\n const leftRank = rank.get(left.id) ?? Infinity;\n const rightRank = rank.get(right.id) ?? Infinity;\n return left.slot.localeCompare(right.slot) || leftRank - rightRank || bySlotOrderAndId(left, right);\n });\n };\n\n return {\n store,\n\n registerItem(item) {\n const current = store.getState();\n if (current.items[item.id]) throw new Error(`Status bar item already registered: ${item.id}`);\n if (!input.hasView(item.viewId)) throw new Error(`Status bar view is not registered: ${item.viewId}`);\n if (item.order !== undefined && !Number.isFinite(item.order)) {\n throw new Error(`Status bar item order must be finite: ${item.id}`);\n }\n\n store.setState({ items: { ...current.items, [item.id]: item } }, false, \"registerItem\");\n return createDisposable(() => {\n const snapshot = store.getState();\n if (snapshot.items[item.id] !== item) return;\n const { [item.id]: _removed, ...items } = snapshot.items;\n store.setState({ items }, false, \"unregisterItem\");\n });\n },\n\n getItem(id) {\n return store.getState().items[id];\n },\n\n listItems,\n\n reorderItem(id, position) {\n const snapshot = store.getState();\n const targetId = \"beforeItemId\" in position ? position.beforeItemId : position.afterItemId;\n const item = snapshot.items[id];\n const target = snapshot.items[targetId];\n if (!item || !target || item.id === target.id || item.slot !== target.slot) return;\n // Keep disabled owners in the preference so re-registering them restores their place.\n const ids = [...new Set([...snapshot.order, ...listItems().map((entry) => entry.id)])].filter(\n (entry) => entry !== id,\n );\n ids.splice(ids.indexOf(targetId) + (\"afterItemId\" in position ? 1 : 0), 0, id);\n store.setState({ order: ids }, false, \"reorderItem\");\n runWorkbenchEffect(\"status bar order write\", () => input.persistence?.setOrder(ids));\n },\n\n listVisibleItems(slot) {\n return listItems().filter((item) => (!slot || item.slot === slot) && (item.isVisible?.() ?? true));\n },\n };\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkflowStatus {\n id: string;\n label: string;\n color: string;\n icon?: string | null;\n sortOrder: number;\n isDefault?: boolean;\n actions?: readonly string[];\n}\n\nexport interface WorkflowStatusAction {\n id: string;\n label: string;\n icon?: string;\n}\n\nexport interface WorkbenchStatusSetContribution {\n id: string;\n title: string;\n actions?: readonly WorkflowStatusAction[];\n query(): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];\n save?(statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];\n}\n\nexport type RegisteredWorkbenchStatusSet = WorkbenchStatusSetContribution & RegisteredContributionMetadata;\n\nexport interface WorkbenchStatusRegistryState {\n statusSets: Record<string, RegisteredWorkbenchStatusSet>;\n values: Record<string, readonly WorkflowStatus[]>;\n}\n\nexport interface WorkbenchStatusRegistry {\n store: WorkbenchStore<WorkbenchStatusRegistryState>;\n registerStatusSet(contribution: WorkbenchStatusSetContribution, metadata?: ContributionMetadata): Disposable;\n getStatusSet(id: string): RegisteredWorkbenchStatusSet | undefined;\n listStatusSets(): RegisteredWorkbenchStatusSet[];\n getStatuses(id: string): readonly WorkflowStatus[] | undefined;\n load(id: string): Promise<readonly WorkflowStatus[]>;\n query(id: string): Promise<readonly WorkflowStatus[]>;\n save(id: string, statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]>;\n}\n\nconst validateStatusActions = (\n set: WorkbenchStatusSetContribution,\n status: WorkflowStatus,\n actionIds: ReadonlySet<string>,\n) => {\n for (const actionId of status.actions ?? []) {\n if (!actionIds.has(actionId)) {\n throw new Error(`Status \"${set.id}.${status.id}\" references unknown action \"${actionId}\"`);\n }\n }\n};\n\nconst validateStatuses = (set: WorkbenchStatusSetContribution, statuses: readonly WorkflowStatus[]) => {\n const ids = new Set<string>();\n const actionIds = new Set((set.actions ?? []).map((action) => action.id));\n let defaultCount = 0;\n\n for (const status of statuses) {\n if (!status.id.trim()) throw new Error(`Status set \"${set.id}\" contains an empty status id`);\n if (ids.has(status.id)) throw new Error(`Status set \"${set.id}\" contains duplicate id \"${status.id}\"`);\n ids.add(status.id);\n if (!status.label.trim()) throw new Error(`Status \"${set.id}.${status.id}\" must have a label`);\n if (!status.color.trim()) throw new Error(`Status \"${set.id}.${status.id}\" must have a color`);\n if (!Number.isFinite(status.sortOrder)) throw new Error(`Status \"${set.id}.${status.id}\" must have a finite order`);\n validateStatusActions(set, status, actionIds);\n if (status.isDefault) defaultCount += 1;\n }\n\n if (defaultCount > 1) throw new Error(`Status set \"${set.id}\" has more than one default status`);\n return [...statuses].sort((left, right) => left.sortOrder - right.sortOrder || left.id.localeCompare(right.id));\n};\n\nexport const createStatusRegistry = (): WorkbenchStatusRegistry => {\n const store = createWorkbenchStore<WorkbenchStatusRegistryState>({\n name: \"workbench.statuses\",\n initialState: { statusSets: {}, values: {} },\n });\n\n const requireSet = (id: string) => {\n const set = store.getState().statusSets[id];\n if (!set) throw new Error(`Status set is not registered: ${id}`);\n return set;\n };\n\n const loadingById = new Map<string, Promise<readonly WorkflowStatus[]>>();\n\n const query = async (id: string) => {\n const set = requireSet(id);\n const statuses = validateStatuses(set, await set.query());\n const current = store.getState();\n if (current.statusSets[id] === set) {\n store.setState({ ...current, values: { ...current.values, [id]: statuses } }, false, \"queryStatuses\");\n }\n return statuses;\n };\n\n return {\n store,\n\n registerStatusSet(contribution, metadata) {\n const current = store.getState();\n if (current.statusSets[contribution.id]) throw new Error(`Status set already registered: ${contribution.id}`);\n const record = { ...normalizeContributionMetadata(metadata), ...contribution };\n store.setState(\n { ...current, statusSets: { ...current.statusSets, [contribution.id]: record } },\n false,\n \"registerStatusSet\",\n );\n return createDisposable(() => {\n loadingById.delete(contribution.id);\n const snapshot = store.getState();\n if (snapshot.statusSets[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...statusSets } = snapshot.statusSets;\n const { [contribution.id]: _removedValues, ...values } = snapshot.values;\n store.setState({ statusSets, values }, false, \"unregisterStatusSet\");\n });\n },\n\n getStatusSet(id) {\n return store.getState().statusSets[id];\n },\n\n listStatusSets() {\n return Object.values(store.getState().statusSets).sort(\n (left, right) => byContributionPriority(left, right) || left.id.localeCompare(right.id),\n );\n },\n\n getStatuses(id) {\n return store.getState().values[id];\n },\n\n load(id) {\n const cached = store.getState().values[id];\n if (cached) return Promise.resolve(cached);\n\n const existing = loadingById.get(id);\n if (existing) return existing;\n\n const loading = query(id).finally(() => {\n if (loadingById.get(id) === loading) loadingById.delete(id);\n });\n loadingById.set(id, loading);\n return loading;\n },\n\n query,\n\n async save(id, statuses) {\n const set = requireSet(id);\n if (!set.save) throw new Error(`Status set is read-only: ${id}`);\n const input = validateStatuses(set, statuses);\n const saved = validateStatuses(set, await set.save(input));\n const current = store.getState();\n store.setState({ ...current, values: { ...current.values, [id]: saved } }, false, \"saveStatuses\");\n return saved;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { FileIconThemePreferenceOption } from \"./file-icon-theme-contracts\";\n\nexport interface WorkbenchFileIconThemeStoreState {\n themes: readonly FileIconThemePreferenceOption[];\n}\n\nexport interface FileIconThemeRegistry {\n store: WorkbenchStore<WorkbenchFileIconThemeStoreState>;\n register(themes: readonly FileIconThemePreferenceOption[]): Disposable;\n listThemes(): readonly FileIconThemePreferenceOption[];\n}\n\nexport const createFileIconThemeRegistry = (): FileIconThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchFileIconThemeStoreState>({\n name: \"workbench.fileIconThemes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly FileIconThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncFileIconThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ThemePreferenceOption } from \"./theme-contracts\";\n\nexport interface WorkbenchThemeStoreState {\n themes: readonly ThemePreferenceOption[];\n}\n\nexport interface ThemeRegistry {\n store: WorkbenchStore<WorkbenchThemeStoreState>;\n register(themes: readonly ThemePreferenceOption[]): Disposable;\n listThemes(): readonly ThemePreferenceOption[];\n}\n\nexport const createThemeRegistry = (): ThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchThemeStoreState>({\n name: \"workbench.themes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly ThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchPanelMenuDefinition, WorkbenchRegionSize } from \"../layout/layout-types\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchViewMenuContribution {\n id: string;\n ownerViewId: string;\n viewId: string;\n side: \"left\" | \"right\";\n priority?: number;\n mountStrategy?: \"active\" | \"keep-mounted\";\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n config?: unknown;\n}\n\nexport interface WorkbenchViewMenuRegistry {\n registerViewMenu(menu: WorkbenchViewMenuContribution): Disposable;\n getViewMenu(id: string): WorkbenchViewMenuContribution | undefined;\n listViewMenus(ownerViewId?: string): WorkbenchViewMenuContribution[];\n definitionsFor(ownerViewId: string, placementId: string): readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport const viewMenuPanelId = (placementId: string, menuId: string) =>\n `workbench.view-menu.${encodeURIComponent(placementId)}.${encodeURIComponent(menuId)}`;\n\nconst viewMenuConfig = (menu: WorkbenchViewMenuContribution) => {\n if (menu.config === undefined) return { viewContextId: menu.id };\n if (!menu.config || typeof menu.config !== \"object\" || Array.isArray(menu.config)) {\n return { viewContextId: menu.id, value: menu.config };\n }\n return { ...menu.config, viewContextId: menu.id };\n};\n\nexport const createWorkbenchViewMenuRegistry = (input: { views: WorkbenchViewRegistry }): WorkbenchViewMenuRegistry => {\n const menus = new Map<string, WorkbenchViewMenuContribution>();\n\n return {\n registerViewMenu(menu) {\n if (menus.has(menu.id)) throw new Error(`View menu already registered: ${menu.id}`);\n if (!input.views.getView(menu.ownerViewId)) {\n throw new Error(`View menu owner is not registered: ${menu.ownerViewId}`);\n }\n if (!input.views.getView(menu.viewId)) throw new Error(`View menu View is not registered: ${menu.viewId}`);\n const record = { ...menu };\n menus.set(record.id, record);\n return createDisposable(() => {\n if (menus.get(record.id) === record) menus.delete(record.id);\n });\n },\n\n getViewMenu: (id) => menus.get(id),\n\n listViewMenus: (ownerViewId) =>\n [...menus.values()].filter((menu) => !ownerViewId || menu.ownerViewId === ownerViewId),\n\n definitionsFor(ownerViewId, placementId) {\n return [...menus.values()]\n .filter((menu) => menu.ownerViewId === ownerViewId)\n .map((menu) => {\n const view = input.views.getView(menu.viewId);\n if (!view) throw new Error(`View menu View is not registered: ${menu.viewId}`);\n return {\n id: viewMenuPanelId(placementId, menu.id),\n title: view.title,\n icon: view.icon,\n side: menu.side,\n rendererId: view.id,\n priority: menu.priority,\n mountStrategy: menu.mountStrategy,\n hiddenByDefault: menu.hiddenByDefault,\n regionSize: menu.regionSize,\n regionCollapsible: menu.regionCollapsible,\n headerBorderBottom: menu.headerBorderBottom,\n config: viewMenuConfig(menu),\n };\n });\n },\n };\n};\n","import {\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ControlsRendererContribution } from \"../renderers/controls-renderer-registry\";\nimport type { DataTableRendererContribution } from \"../renderers/data-table-renderer-registry\";\nimport type { FileRendererContribution } from \"../renderers/file-renderer-registry\";\nimport type { KanbanRendererContribution } from \"../renderers/kanban-renderer-registry\";\nimport type { WorkbenchRendererRegistration } from \"../renderers/renderer-registry\";\nimport type { TreeRendererContribution } from \"../renderers/tree-renderer-registry\";\nimport { createRendererReadRegistry, type RendererReadRegistry } from \"./renderer-read-registry\";\n\nexport const workbenchViewIdContextKey = \"workbench.view.id\";\n\ntype NativeViewBody<Kind extends string, Contribution> = { kind: Kind } & Omit<Contribution, \"id\" | \"title\" | \"icon\">;\n\nexport interface WorkbenchReactViewBody {\n kind: \"react\";\n render: WorkbenchRendererRegistration[\"render\"];\n}\n\nexport type WorkbenchViewBody =\n | WorkbenchReactViewBody\n | NativeViewBody<\"tree\", TreeRendererContribution>\n | NativeViewBody<\"file\", FileRendererContribution>\n | NativeViewBody<\"controls\", ControlsRendererContribution>\n | NativeViewBody<\"kanban\", KanbanRendererContribution>\n | NativeViewBody<\"dataTable\", DataTableRendererContribution>;\n\nexport interface WorkbenchViewContribution {\n id: string;\n title: string;\n icon?: string;\n body: WorkbenchViewBody;\n}\n\nexport type RegisteredWorkbenchView = WorkbenchViewContribution & RegisteredContributionMetadata;\n\nexport interface WorkbenchViewRegistryStoreState {\n views: Record<string, RegisteredWorkbenchView>;\n}\n\nexport interface WorkbenchViewRegistry {\n reads: RendererReadRegistry;\n store: WorkbenchStore<WorkbenchViewRegistryStoreState>;\n registerView(view: WorkbenchViewContribution, metadata?: ContributionMetadata): Disposable;\n getView(viewId: string): RegisteredWorkbenchView | undefined;\n listViews(): RegisteredWorkbenchView[];\n refreshView(viewId: string, input?: unknown): void;\n}\n\nexport interface CreateWorkbenchViewRegistryInput {\n registerBody(\n view: WorkbenchViewContribution,\n metadata?: ContributionMetadata,\n ): Disposable & { refresh?(input?: unknown): void };\n}\n\nconst byPriorityAndId = (left: RegisteredWorkbenchView, right: RegisteredWorkbenchView) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport const createViewRegistry = (input: CreateWorkbenchViewRegistryInput): WorkbenchViewRegistry => {\n const store = createWorkbenchStore<WorkbenchViewRegistryStoreState>({\n name: \"workbench.views\",\n initialState: { views: {} },\n });\n const bodies = new Map<string, Disposable & { refresh?(input?: unknown): void }>();\n\n return {\n reads: createRendererReadRegistry(),\n store,\n\n registerView(view, metadata) {\n const snapshot = store.getState();\n if (snapshot.views[view.id]) throw new Error(`View already registered: ${view.id}`);\n\n const body = input.registerBody(view, metadata);\n bodies.set(view.id, body);\n\n const record: RegisteredWorkbenchView = {\n ...view,\n ...normalizeContributionMetadata(metadata),\n };\n store.setState(\n {\n views: { ...snapshot.views, [view.id]: record },\n },\n false,\n \"registerView\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.views[view.id] !== record) return;\n const { [view.id]: _removed, ...views } = current.views;\n store.setState(\n {\n views,\n },\n false,\n \"unregisterView\",\n );\n body.dispose();\n bodies.delete(view.id);\n });\n },\n\n getView(viewId) {\n return store.getState().views[viewId];\n },\n\n listViews() {\n return Object.values(store.getState().views).sort(byPriorityAndId);\n },\n\n refreshView(viewId, refreshInput) {\n if (!store.getState().views[viewId]) throw new Error(`View is not registered: ${viewId}`);\n bodies.get(viewId)?.refresh?.(refreshInput);\n },\n };\n};\n","import type { WorkbenchPanelRegion, WorkbenchTabPosition } from \"../../registries/layout/layout-types\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const registerArrangementCommands = (core: WorkbenchCore) => {\n core.commands.registerCommand(\n {\n id: \"workbench.resetLayout\",\n label: \"Reset workbench layout\",\n category: \"Workbench\",\n icon: \"RotateCcw\",\n },\n { execute: () => core.resetLayout() },\n );\n core.commands.registerCommand<{ instanceId: string; region: WorkbenchPanelRegion; position?: WorkbenchTabPosition }>(\n {\n id: \"workbench.movePanel\",\n label: \"Move workbench tab\",\n category: \"Workbench\",\n icon: \"PanelsTopLeft\",\n params: {\n instanceId: { type: \"string\", label: \"Tab instance\", required: true },\n region: {\n type: \"string\",\n label: \"Destination\",\n required: true,\n options: [\n { label: \"Main\", value: \"main\" },\n { label: \"Side\", value: \"side\" },\n { label: \"Secondary\", value: \"secondary\" },\n ],\n },\n },\n },\n { execute: (args) => core.movePanel(args.instanceId, args.region, args.position) },\n );\n};\n","import type { NavigationTarget, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout, WorkbenchPanelRegion } from \"../../registries/layout/layout-model\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchOwnedPlacementItem } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { shellPlacementContributionId } from \"../../registries/placements/shell-placement-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { modePlacementContributionId, pagePlacementContributionId } from \"../../registries/views/view-placement\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport { runUserAction } from \"../../shared/run-user-action\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type { WorkbenchCompositionAddablePanel } from \"./composition-controller\";\nimport { panelDestinations } from \"./panel-destinations\";\n\nconst ownsPlacement = (\n layout: WorkbenchLayout,\n target: WorkbenchPanelRegion,\n matches: (identity: PlacementIdentity) => boolean,\n) =>\n Object.values(layout.regions)\n .filter((region) => region.id === target)\n .some((region) =>\n region.widgets.some((placement) => placement.placementIdentity && matches(placement.placementIdentity)),\n );\nexport const activateModePlacementInstance = (\n core: WorkbenchCore,\n identity: PlacementIdentity,\n region?: WorkbenchPanelRegion,\n) => {\n const instance = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find(\n (candidate) =>\n candidate.placementIdentity &&\n placementIdentityKey(candidate.placementIdentity) === placementIdentityKey(identity),\n );\n if (instance) {\n if (region) core.movePanel(instance.widgetId, region);\n else core.layout.activatePanel(instance.widgetId);\n }\n};\ninterface AddablePanelInput {\n layout: WorkbenchLayout;\n modeId?: string;\n region: WorkbenchPanelRegion;\n resource?: ResourceRef;\n}\ntype AddPanel = (panelId: string, open: WorkbenchCompositionAddablePanel[\"open\"]) => void;\nconst openPlacementAddTarget = (\n core: WorkbenchCore,\n target: NavigationTarget,\n panelId: string,\n region: WorkbenchPanelRegion,\n) =>\n runUserAction(core, \"Add panel\", async () => {\n if (target.kind === \"command\") {\n await core.commands.executeCommand(contributionRefId(target.target.command), target.target.params, {\n source: \"panel-add\",\n });\n } else {\n await core.navigation.openTarget(target);\n }\n const active = core.layout.getActivePanel();\n if (active?.panelId === panelId) core.movePanel(active.instanceId, region);\n });\nconst canAddItem = (core: WorkbenchCore, item: WorkbenchOwnedPlacementItem, resource: ResourceRef | undefined) => {\n if (item.kind !== \"binding\") return true;\n const target = item.binding.add;\n if (!target) return Boolean(resource && resourceMatchesConstraint(item.binding, resource));\n if (target.kind !== \"command\") return true;\n const id = contributionRefId(target.target.command);\n return Boolean(\n core.commands.getCommand(id) &&\n core.commands.isCommandVisible(id, target.target.params) &&\n core.commands.isCommandEnabled(id, target.target.params),\n );\n};\nconst addShellPanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n for (const placement of core.shellPlacements.listPlacements()) {\n if (!panelDestinations(core, shellPlacementContributionId(placement.id)).includes(input.region)) continue;\n if (placement.item.kind === \"view\" && placement.item.presence === \"fixed\") continue;\n const multiple = placement.item.kind === \"binding\" && placement.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n input.region,\n (identity) => identity.kind === \"shell\" && identity.placementId === placement.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, placement.item, input.resource)) continue;\n add(shellPlacementContributionId(placement.id), (resource) => {\n if (placement.item.kind === \"binding\" && placement.item.binding.add) {\n return openPlacementAddTarget(\n core,\n placement.item.binding.add,\n shellPlacementContributionId(placement.id),\n input.region,\n );\n }\n const identity = core.shellPlacements.openPlacement({\n placementId: placement.id,\n ...(placement.item.kind === \"binding\" && resource ? { resource, open: \"pin\" } : {}),\n });\n activateModePlacementInstance(core, identity, input.region);\n });\n }\n};\nconst addModePanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n for (const placement of core.modePlacements.listPlacements(input.modeId)) {\n if (!panelDestinations(core, modePlacementContributionId(placement.id)).includes(input.region)) continue;\n if (placement.item.kind === \"view\" && placement.item.presence === \"fixed\") continue;\n const multiple = placement.item.kind === \"binding\" && placement.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n input.region,\n (identity) => identity.kind === \"mode\" && identity.placementId === placement.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, placement.item, input.resource)) continue;\n add(modePlacementContributionId(placement.id), (resource) => {\n if (placement.item.kind === \"binding\" && placement.item.binding.add) {\n return openPlacementAddTarget(\n core,\n placement.item.binding.add,\n modePlacementContributionId(placement.id),\n input.region,\n );\n }\n const identity = core.modePlacements.openPlacement({\n panel: placement.ref,\n ...(placement.item.kind === \"binding\" && resource ? { resource, open: \"pin\" } : {}),\n });\n activateModePlacementInstance(core, identity, input.region);\n });\n }\n};\nconst addPagePanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n const pageState = core.pages.store.getState();\n const page = pageState.activePageId ? core.pages.getPage(pageState.activePageId) : undefined;\n if (!page) return;\n for (const slot of page.slots) {\n if (slot.isAvailable && !slot.isAvailable(input.resource)) continue;\n if (!panelDestinations(core, pagePlacementContributionId(page.id, slot.id)).includes(input.region)) continue;\n if (slot.item.kind === \"view\" && slot.item.presence === \"fixed\") continue;\n const multiple = slot.item.kind === \"binding\" && slot.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n input.region,\n (identity) => identity.kind === \"page\" && identity.pageId === page.id && identity.slotId === slot.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, slot.item, input.resource)) continue;\n add(pagePlacementContributionId(page.id, slot.id), (resource) => {\n if (slot.item.kind === \"binding\" && slot.item.binding.add) {\n return openPlacementAddTarget(\n core,\n slot.item.binding.add,\n pagePlacementContributionId(page.id, slot.id),\n input.region,\n );\n }\n core.pages.openSlot({\n pageId: page.id,\n slotId: slot.id,\n ...(resource ? { resource: resource } : {}),\n ...(multiple ? { open: \"pin\" } : {}),\n });\n const opened = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find(\n (p) =>\n p.widgetId === core.layout.getLayout().activeWidgetId &&\n p.contributionId === pagePlacementContributionId(page.id, slot.id),\n );\n if (opened) core.movePanel(opened.widgetId, input.region);\n });\n }\n};\nexport const createOwnedAddablePanels = (core: WorkbenchCore, input: AddablePanelInput) => {\n const addable: WorkbenchCompositionAddablePanel[] = [];\n const add = (panelId: string, open: WorkbenchCompositionAddablePanel[\"open\"]) => {\n const contribution = core.layout.getWidget(panelId);\n if (contribution) addable.push({ panelId, region: input.region, contribution, open });\n };\n addShellPanels(core, input, add);\n addModePanels(core, input, add);\n addPagePanels(core, input, add);\n return addable;\n};\n","import type { PageSlotRef, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchRegion, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { NavigationTargetPage, NavigationTargetPanel } from \"../../registries/navigation/navigation-registry\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport type { OwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\nimport { getPageLocationPreparation } from \"../page-location/page-location-preparation\";\n\ntype NavigationOperation = NavigationTargetPage | NavigationTargetPanel;\n\nconst placementContext = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) =>\n state.activeModeId\n ? {\n modeId: state.activeModeId,\n pageId: state.activePageId,\n projectId: state.projectId,\n location: state.location,\n }\n : undefined;\nconst requirePanelPage = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>, panel: PageSlotRef) => {\n const page = Object.values(state.pages).find(\n (page) => page.ref.extensionId === panel.page.extensionId && page.ref.id === panel.page.id,\n );\n if (!page || page.id !== state.activePageId)\n throw new Error(`Page panel \"${panel.id}\" is not owned by the proposed page`);\n return page;\n};\nconst prepareSharedPanel = (\n core: WorkbenchCore,\n target: NavigationTargetPanel,\n modeId: string | undefined,\n modeState: OwnedPlacementState,\n shellState: OwnedPlacementState,\n) => {\n const panel = target.panel;\n if (panel.kind === \"placement\") {\n const placement = core.modePlacements.getPlacement(panel);\n if (!placement || placement.modeId !== modeId)\n throw new Error(`Mode panel \"${panel.id}\" is not owned by the proposed mode`);\n const prepared = getOwnedPlacementPreparation(core.modePlacements).open(\n { placementId: placement.id, resource: target.resource, open: target.open },\n modeState,\n );\n return { modeState: prepared.state, shellState, identity: prepared.identity };\n }\n const prepared = getOwnedPlacementPreparation(core.shellPlacements).open(\n {\n placementId: panel.id,\n resource: target.resource,\n open: target.open,\n ...(\"title\" in target ? { title: target.title } : {}),\n },\n shellState,\n );\n return { modeState, shellState: prepared.state, identity: prepared.identity };\n};\n\nexport const prepareWorkbenchNavigation = (core: WorkbenchCore, targets: readonly NavigationOperation[]) => {\n if (!targets.length) throw new Error(\"Compound navigation requires at least one page or panel target\");\n const pages = getWorkbenchPageRegistryInternals(core.pages);\n const locations = getPageLocationPreparation<WorkbenchWidgetPlacement>(core.pageLocations);\n const mode = getOwnedPlacementPreparation(core.modePlacements);\n const shell = getOwnedPlacementPreparation(core.shellPlacements);\n const original = core.pages.store.getState();\n const originalMode = mode.getState();\n const originalShell = shell.getState();\n let modeState = originalMode;\n let shellState = originalShell;\n let proposed = original;\n const activate = new Map<WorkbenchRegion, PlacementIdentity>();\n const owned = (modeId = proposed.activeModeId) => ({\n shell: shell.resolve(undefined, shellState),\n mode: mode.resolve(modeId, modeState),\n });\n\n for (const target of targets) {\n if (target.kind === \"page\") {\n if (!proposed.projectId) throw new Error(\"Cannot navigate before a project is active\");\n const resolved = locations.resolve(target);\n const page = proposed.pages[resolved.pageId]!;\n shellState =\n shell.restore?.(\n { modeId: page.modeId, pageId: page.id, projectId: proposed.projectId, location: resolved.location },\n shellState,\n placementContext(proposed),\n ) ?? shellState;\n modeState =\n mode.restore?.(\n { modeId: page.modeId, pageId: page.id, location: resolved.location, projectId: proposed.projectId },\n modeState,\n ) ?? modeState;\n proposed = pages.prepare.location(\n {\n pageId: page.id,\n projectId: proposed.projectId,\n location: resolved.location,\n resource: resolved.location.resource,\n section: resolved.location.section,\n open: resolved.open,\n action: \"preparePageNavigation\",\n },\n proposed,\n owned(page.modeId),\n );\n } else if (target.kind === \"panel\") {\n const panel = target.panel;\n if (panel.kind === \"page-slot\") {\n const page = requirePanelPage(proposed, panel);\n proposed = pages.prepare.slot(\n { pageId: page.id, slotId: panel.id, resource: target.resource, open: target.open },\n proposed,\n owned(),\n );\n } else {\n const modeId = proposed.activeModeId ?? core.modes.getActiveModeId();\n const prepared = prepareSharedPanel(core, target, modeId, modeState, shellState);\n modeState = prepared.modeState;\n shellState = prepared.shellState;\n const identity = prepared.identity;\n proposed = pages.prepare.compose(\n proposed,\n { ...proposed, activeModeId: modeId, activate: [identity], action: \"preparePanelNavigation\" },\n owned(modeId),\n );\n }\n } else {\n throw new Error(\"Compound navigation accepts only page and panel targets\");\n }\n for (const placement of proposed.reconciliation.activate) activate.set(placement.region, placement.identity);\n }\n const present = new Set(proposed.placements.map((placement) => placementIdentityKey(placement.identity)));\n const final = pages.prepare.compose(\n original,\n {\n ...proposed,\n activate: [...activate.values()].filter((identity) => present.has(placementIdentityKey(identity))),\n action: \"prepareCompoundNavigation\",\n },\n owned(),\n );\n return {\n commit: () =>\n batchWorkbenchChanges(() => {\n const applyOwners = () => {\n mode.apply(modeState);\n shell.apply(shellState);\n };\n const publishWithoutLocation = () => {\n applyOwners();\n return pages.publish(final, \"navigateCompoundTarget\");\n };\n const result = final.location ? locations.commit(final, applyOwners) : publishWithoutLocation();\n if (modeState !== originalMode) mode.publish();\n if (shellState !== originalShell) shell.publish();\n return result;\n }),\n };\n};\n","import { activateModePlacementInstance } from \"./controllers/composition/owned-addable-panels\";\nimport { prepareWorkbenchNavigation } from \"./controllers/navigation/compound-navigation\";\nimport type { WorkbenchRegion } from \"./registries/layout/layout-model\";\nimport {\n createNavigationRegistry,\n type NavigationTargetPanel,\n type NavigationTargetShellPanel,\n} from \"./registries/navigation/navigation-registry\";\nimport type { WorkbenchCore } from \"./workbench-core-types\";\n\ntype PageSlotPanelRef = Extract<NavigationTargetPanel[\"panel\"], { kind: \"page-slot\" }>;\n\nconst findPagePanelOwner = (core: WorkbenchCore, panel: PageSlotPanelRef) =>\n core.pages\n .listPages()\n .find((candidate) => candidate.ref.extensionId === panel.page.extensionId && candidate.ref.id === panel.page.id);\n\nconst canOpenCorePanel = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind === \"shell-placement\") return Boolean(core.shellPlacements.getPlacement(panel.id));\n if (panel.kind !== \"page-slot\") return Boolean(core.modePlacements.getPlacement(panel));\n return Boolean(findPagePanelOwner(core, panel)?.slots.some((slot) => slot.id === panel.id));\n};\n\nexport const revealPanelRegion = (core: WorkbenchCore, region: WorkbenchRegion) => {\n if (region === \"secondary\") {\n core.shell.setRegionOpen(\"secondary\", true);\n }\n if (region === \"side\" && core.sidePanel.getMode() === \"closed\") core.sidePanel.setMode(\"attached\");\n};\n\nconst openPageSlotTarget = (core: WorkbenchCore, target: NavigationTargetPanel, panel: PageSlotPanelRef) => {\n const page = findPagePanelOwner(core, panel);\n if (!page || core.pages.store.getState().activePageId !== page.id) {\n throw new Error(`Page panel \"${panel.id}\" is not owned by the active page`);\n }\n const slot = page.slots.find((candidate) => candidate.id === panel.id);\n if (!slot) throw new Error(`Page panel \"${panel.id}\" is not an auxiliary slot`);\n core.pages.openSlot({\n pageId: page.id,\n slotId: panel.id,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n });\n revealActivePanelRegion(core, slot.region);\n};\n\nconst revealActivePanelRegion = (core: WorkbenchCore, fallback: WorkbenchRegion) => {\n const layout = core.layout.getLayout();\n const actual = Object.values(layout.regions).find((region) =>\n region.widgets.some((widget) => widget.widgetId === layout.activeWidgetId),\n );\n revealPanelRegion(core, actual?.id ?? fallback);\n};\n\nconst openModePlacementTarget = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind !== \"placement\") throw new Error(`Expected a mode placement panel: ${panel.id}`);\n const placement = core.modePlacements.getPlacement(panel);\n if (!placement || placement.modeId !== core.modes.getActiveModeId()) {\n throw new Error(`Mode panel \"${panel.id}\" is not owned by the active mode`);\n }\n const identity = core.modePlacements.openPlacement({\n panel,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n });\n activateModePlacementInstance(core, identity);\n revealActivePanelRegion(core, placement.region);\n};\n\nconst openShellPlacementTarget = (core: WorkbenchCore, target: NavigationTargetShellPanel) => {\n const placement = core.shellPlacements.getPlacement(target.panel.id);\n if (!placement) throw new Error(`Unknown shell placement: ${target.panel.id}`);\n const identity = core.shellPlacements.openPlacement({\n placementId: target.panel.id,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n ...(target.title ? { title: target.title } : {}),\n });\n activateModePlacementInstance(core, identity);\n revealActivePanelRegion(core, placement.region);\n};\n\nconst openCorePanelTarget = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind === \"shell-placement\") {\n openShellPlacementTarget(core, { ...target, panel });\n return;\n }\n if (panel.kind === \"page-slot\") {\n openPageSlotTarget(core, target, panel);\n return;\n }\n openModePlacementTarget(core, target);\n};\n\nexport const createCoreNavigationRegistry = (resolveCore: () => WorkbenchCore) =>\n createNavigationRegistry({\n resolveDispatcher: () => {\n const core = resolveCore();\n return {\n prepareNavigation: (targets) => prepareWorkbenchNavigation(core, targets),\n canOpenPanel: (target) => canOpenCorePanel(core, target),\n canExecuteCommand: (commandId) => Boolean(core.commands.getCommand(commandId)),\n openPanelTarget: (target) => openCorePanelTarget(core, target),\n openPageTarget: (target) => {\n const result = core.pageLocations.navigate(target);\n if (!result.ok) throw new Error(result.diagnostic.message);\n return result;\n },\n executeCommand: (commandId, args) => core.commands.executeCommand(commandId, args),\n openHref: (href) => globalThis.open(href, \"_blank\", \"noopener,noreferrer\"),\n };\n },\n });\n","import {\n activateInLayout,\n findPlacementByWidgetId,\n removeLocationSubPanelSelection,\n selectRegionActiveWidget,\n} from \"../../registries/layout/layout-operations\";\nimport { insertAtPosition } from \"../../registries/layout/layout-tab-lifecycle\";\nimport type { WorkbenchPanelRegion, WorkbenchTabPosition } from \"../../registries/layout/layout-types\";\nimport { workbenchPanelRegions } from \"../../registries/layout/layout-types\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { revealPanelRegion } from \"../../workbench-core-navigation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\nimport { panelDestinations } from \"./panel-destinations\";\n\nexport const createPanelArrangement = (resolve: () => WorkbenchCore) => ({\n getPanelDestinations(instanceId: string) {\n const core = resolve();\n const found = findPlacementByWidgetId(core.layout.getLayout(), instanceId);\n return found ? panelDestinations(core, found.placement.contributionId) : [];\n },\n movePanel(instanceId: string, destination: WorkbenchPanelRegion, position: WorkbenchTabPosition = \"end\") {\n const core = resolve();\n const layout = core.layout.getLayout();\n const found = findPlacementByWidgetId(layout, instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n if (\n !workbenchPanelRegions.some((region) => region === found.regionId) ||\n !panelDestinations(core, found.placement.contributionId).includes(destination)\n )\n throw new Error(`Panel cannot move to ${destination}: ${instanceId}`);\n const source = layout.regions[found.regionId];\n const remaining = source.widgets.filter((t) => t.widgetId !== instanceId);\n const target = layout.regions[destination];\n const next = {\n ...removeLocationSubPanelSelection(layout, instanceId),\n regions: {\n ...layout.regions,\n [found.regionId]: {\n ...source,\n widgets: remaining,\n activeWidgetId:\n source.activeWidgetId === instanceId\n ? (remaining[found.index] ?? remaining[found.index - 1])?.widgetId\n : source.activeWidgetId,\n },\n [destination]: {\n ...target,\n visible: true,\n widgets: insertAtPosition(\n destination === found.regionId ? remaining : target.widgets,\n found.placement,\n position,\n ),\n },\n },\n };\n batchWorkbenchChanges(() => {\n // Moving selects the instance directly; navigation owns auxiliary-selection restoration.\n const selected =\n found.placement.role === \"location\"\n ? (selectRegionActiveWidget(next, destination, instanceId) ?? next)\n : activateInLayout(next, destination, found.placement);\n core.layout.restoreLayout({\n ...selected,\n activeWidgetId: instanceId,\n activeResourceKey: found.placement.resourceKey,\n activeLocationWidgetId: found.placement.role === \"location\" ? instanceId : layout.activeLocationWidgetId,\n });\n core.layout.reconcilePanelMenus();\n revealPanelRegion(core, destination);\n });\n },\n});\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const createPlacementCloseController = (resolveCore: () => WorkbenchCore) => (identity: PlacementIdentity) => {\n const core = resolveCore();\n const key = placementIdentityKey(identity);\n const placement = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find((item) => item.placementIdentity && placementIdentityKey(item.placementIdentity) === key);\n if (!placement) throw new Error(`Placement is not open: ${key}`);\n if (!placement.closable) throw new Error(`Placement is fixed and cannot close: ${key}`);\n if (identity.kind === \"page\") {\n const result = core.pageLocations.closePlacement(identity);\n if (!result.ok) throw new Error(result.diagnostic.message);\n return;\n }\n if (identity.kind === \"mode\") core.modePlacements.closePlacement(identity);\n else core.shellPlacements.closePlacement(identity);\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const createPlacementPinController =\n (resolveCore: () => WorkbenchCore) =>\n (identity: PlacementIdentity, pinned = true) => {\n const core = resolveCore();\n const key = placementIdentityKey(identity);\n const placement = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find((item) => item.placementIdentity && placementIdentityKey(item.placementIdentity) === key);\n if (!placement) throw new Error(`Placement is not open: ${key}`);\n const open = pinned ? \"pin\" : \"preview\";\n if (!placement.tabRetention || (placement.tabRetention === \"persistent\") === pinned) return;\n if (identity.kind === \"page\") core.pages.pinPlacement(identity, open);\n else if (identity.kind === \"mode\") core.modePlacements.updatePlacement(identity, { open });\n else core.shellPlacements.updatePlacement(identity, { open });\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 { composeOwnedPlacements, placementIdentityKey, type ResolvedOwnedPlacement } from \"./placement-reconciliation\";\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}\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\" || Boolean(placement.value.resourceKey));\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\nconst 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. Shared mode snapshots own the order\n // of mode tabs occupying those slots, including edits made on another page.\n const modePositions = new Map(saved.map((widget, index) => [widget.widgetId, index]));\n const modes = ordered\n .filter((widget) => widget.placementIdentity?.kind === \"mode\")\n .sort((a, b) => (modePositions.get(a.widgetId) ?? saved.length) - (modePositions.get(b.widgetId) ?? saved.length));\n let modeIndex = 0;\n return ordered.map((widget) => (widget.placementIdentity?.kind === \"mode\" ? modes[modeIndex++]! : widget));\n};\n\nconst 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\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: 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 // Page caches omit mode tabs. Recover their shared selection from the mode's cache.\n const activeWidgetId =\n [region.activeWidgetId, modeLayout?.regions[regionId].activeWidgetId].find((id) =>\n widgets.some((placement) => placement.widgetId === id),\n ) ?? widgets[0]?.widgetId;\n const opensPreviouslyEmptyRegion =\n region.widgets.length === 0 && widgets.some((placement) => !placement.hiddenByDefault);\n regions[regionId] = {\n ...region,\n widgets,\n savedWidgetOrder: undefined,\n activeWidgetId,\n ...(docked.has(regionId) ? { visible: region.visible || opensPreviouslyEmptyRegion } : {}),\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 if (desiredPlacement.identity.kind !== \"page\" && !desiredPlacement.placement.resourceKey) 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 { reconcileOwnedWidgetLayout } from \"../../registries/layout/owned-placement-layout\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { emptyPageState } from \"../../registries/pages/page-slot-lifecycle\";\nimport { pageStateKey } from \"../../registries/pages/page-state-key\";\nimport { clearOwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const resetWorkbenchLayout = (core: WorkbenchCore) => {\n const current = core.pages.store.getState();\n const page = current.activePageId ? current.pages[current.activePageId] : undefined;\n if (!page || !current.projectId || !current.location) return;\n const mode = getOwnedPlacementPreparation(core.modePlacements);\n const shell = getOwnedPlacementPreparation(core.shellPlacements);\n const modeState = {\n staticOverrides: new Map(mode.getState().staticOverrides),\n resourceInstances: new Map(mode.getState().resourceInstances),\n };\n const shellState = {\n staticOverrides: new Map(shell.getState().staticOverrides),\n resourceInstances: new Map(shell.getState().resourceInstances),\n };\n for (const declaration of core.modePlacements.listPlacements(current.activeModeId))\n clearOwnedPlacementState(modeState, declaration.id);\n for (const declaration of core.shellPlacements.listPlacements()) {\n if ([\"main\", \"secondary\", \"side\"].includes(declaration.region))\n clearOwnedPlacementState(shellState, declaration.id);\n }\n const internals = getWorkbenchPageRegistryInternals(core.pages);\n const next = internals.prepare.location(\n {\n pageId: page.id,\n projectId: current.projectId,\n location: current.location,\n resource: current.location.resource,\n action: \"resetWorkbenchLayout\",\n pageStates: {\n ...current.pageStates,\n [pageStateKey(page, current.location, internals.resources)]: emptyPageState(page),\n },\n },\n current,\n { mode: mode.resolve(current.activeModeId, modeState), shell: shell.resolve(undefined, shellState) },\n );\n const layout = core.layout.getLayout();\n const defaults = core.layout.store.getInitialState().layout;\n const cleared = {\n ...layout,\n regions: Object.fromEntries(\n Object.entries(layout.regions).map(([id, region]) => [\n id,\n [\"main\", \"secondary\", \"side\"].includes(id)\n ? { ...defaults.regions[id as keyof typeof defaults.regions], widgets: [], activeWidgetId: undefined }\n : region,\n ]),\n ) as typeof layout.regions,\n locationSubPanelSelections: {},\n activeWidgetId: undefined,\n activeLocationWidgetId: undefined,\n };\n batchWorkbenchChanges(() => {\n mode.apply(modeState);\n shell.apply(shellState);\n core.layout.restoreLayout(\n reconcileOwnedWidgetLayout({\n layout: cleared,\n placements: next.placements,\n activate: next.reconciliation.activate.map((p) => p.identity),\n }),\n );\n internals.publish(next, \"resetWorkbenchLayout\");\n });\n};\n\nexport const createLayoutResetController = (resolve: () => WorkbenchCore) => {\n const listeners = new Set<() => void>();\n return {\n resetLayout() {\n resetWorkbenchLayout(resolve());\n for (const listener of listeners) listener();\n },\n onDidResetLayout(listener: () => void) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const removeWorkbenchResource = (\n core: WorkbenchCore,\n resource: ResourceRef,\n retained: readonly PlacementIdentity[],\n) => {\n if (resource.projectId !== core.pages.store.getState().projectId) return;\n const retainedKeys = new Set(retained.map(placementIdentityKey));\n batchWorkbenchChanges(() => {\n for (const kind of [\"mode\", \"shell\"] as const) {\n const registry = kind === \"mode\" ? core.modePlacements : core.shellPlacements;\n const preparation = getOwnedPlacementPreparation(registry);\n const state = preparation.getState();\n const resourceInstances = new Map(\n [...state.resourceInstances].map(([placementId, instances]) => [\n placementId,\n instances.filter((instance) => {\n if (resourceKey(instance.resource) !== resourceKey(resource)) return true;\n const identity: PlacementIdentity =\n kind === \"shell\"\n ? { kind, placementId, instanceKey: instance.instanceKey }\n : {\n kind,\n placementId,\n instanceKey: instance.instanceKey,\n modeId: core.modePlacements.listPlacements().find((placement) => placement.id === placementId)!\n .modeId,\n };\n return retainedKeys.has(placementIdentityKey(identity));\n }),\n ]),\n );\n preparation.apply({ ...state, resourceInstances });\n }\n core.pageLocations.removeResource(resource, retained);\n });\n};\n","import { isLocalizedString, type NavigationTargetPage, type PageLocation, type PageRef } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTreeRegistry } from \"../../registries/navigation/navigation-tree-registry\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageRegistry,\n WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { WorkbenchBreadcrumbController, WorkbenchBreadcrumbItem } from \"../breadcrumbs/breadcrumb-registry\";\nimport { leavesProjectNavigation, type NavigationLevelModes } from \"./navigation-level\";\nimport type { WorkbenchPageLocationController } from \"./page-location-controller\";\n\nconst pageRefKey = (ref: PageRef) => `${ref.extensionId ?? \"\"}:${ref.id}`;\nconst locationsFromRoot = (location: PageLocation): PageLocation[] =>\n location.parent ? [...locationsFromRoot(location.parent), location] : [location];\nconst targetFromLocation = (location: PageLocation): NavigationTargetPage => ({\n kind: \"page\",\n page: location.page,\n ...(location.resource ? { resource: location.resource } : {}),\n ...(location.section ? { section: location.section } : {}),\n ...(location.parent ? { parent: targetFromLocation(location.parent) } : {}),\n});\nconst pageTitle = (page: WorkbenchPageContribution) => {\n if (page.title === undefined) return page.ref.id;\n if (!isLocalizedString(page.title)) return page.title;\n return page.title.default ?? page.title.$l10n;\n};\nexport const createWorkbenchPageBreadcrumbItems = (input: {\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n resources: WorkbenchPageResourceCodec;\n navigate(target: NavigationTargetPage): void;\n}): WorkbenchBreadcrumbItem[] => {\n const pagesByRef = new Map(input.pages.map((page) => [pageRefKey(page.ref), page]));\n const locations = locationsFromRoot(input.location);\n return locations.map((location, index) => {\n const page = pagesByRef.get(pageRefKey(location.page));\n const item: WorkbenchBreadcrumbItem = {\n title: location.resource?.label ?? (page ? pageTitle(page) : location.page.id),\n icon: location.resource?.icon ?? page?.icon,\n ...(leavesProjectNavigation(location, input) ? { startsLevel: true } : {}),\n ...(location.resource ? { resource: input.resources.normalize(location.resource) } : {}),\n };\n if (index < locations.length - 1) {\n item.onClick = () => input.navigate(targetFromLocation(location));\n }\n return item;\n });\n};\nexport const setWorkbenchPageBreadcrumbs = (input: {\n breadcrumbs: WorkbenchBreadcrumbController;\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n resources: WorkbenchPageResourceCodec;\n navigate(target: NavigationTargetPage): void;\n}) => input.breadcrumbs.setItems(createWorkbenchPageBreadcrumbItems(input));\nexport const connectWorkbenchPageBreadcrumbs = (input: {\n breadcrumbs: WorkbenchBreadcrumbController;\n locations: WorkbenchPageLocationController;\n pages: WorkbenchPageRegistry<unknown>;\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n resources: WorkbenchPageResourceCodec;\n}) => {\n let ownedBreadcrumbs:\n | {\n dispose(): void;\n }\n | undefined;\n const sync = () => {\n const state = input.pages.store.getState();\n if (!state.activePageId || !state.location) {\n ownedBreadcrumbs?.dispose();\n ownedBreadcrumbs = undefined;\n return;\n }\n ownedBreadcrumbs?.dispose();\n ownedBreadcrumbs = setWorkbenchPageBreadcrumbs({\n breadcrumbs: input.breadcrumbs,\n location: state.location,\n pages: Object.values(state.pages),\n navigationTrees: input.navigationTrees,\n modes: input.modes,\n resources: input.resources,\n navigate: (target) => {\n input.locations.navigate(target);\n },\n });\n };\n const subscription = getWorkbenchPageRegistryInternals(input.pages).onDidCommit(sync);\n sync();\n return createDisposable(() => {\n subscription.dispose();\n ownedBreadcrumbs?.dispose();\n });\n};\n","import type {\n PersistedWorkbenchPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageLocationBrowser,\n WorkbenchPageLocationPersistence,\n} from \"./page-location-controller\";\n\nexport const createMemoryWorkbenchPageLocationBrowser = (): WorkbenchPageLocationBrowser => {\n const entries: WorkbenchPageBrowserEntry[] = [{ url: \"/\" }];\n let index = 0;\n const listeners = new Set<(entry: WorkbenchPageBrowserEntry) => void>();\n const notify = () => {\n for (const listener of listeners) listener(entries[index]!);\n };\n return {\n current: () => entries[index]!,\n push: (entry) => {\n entries.splice(index + 1);\n entries.push(entry);\n index = entries.length - 1;\n },\n replace: (entry) => {\n entries[index] = entry;\n },\n back: () => {\n if (index === 0) return;\n index -= 1;\n notify();\n },\n forward: () => {\n if (index >= entries.length - 1) return;\n index += 1;\n notify();\n },\n onPopState: (listener) => {\n listeners.add(listener);\n return { dispose: () => listeners.delete(listener) };\n },\n };\n};\n\nexport const createMemoryWorkbenchPageLocationPersistence = (): WorkbenchPageLocationPersistence => {\n const locations = new Map<string, PersistedWorkbenchPageLocation>();\n return {\n load: (projectId) => locations.get(projectId),\n save: (projectId, persisted) => locations.set(projectId, persisted),\n };\n};\n","import { contributionRefId, defaultPageResourceCodec, resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutModel, WorkbenchRegion } from \"../../registries/layout/layout-model\";\nimport { createPlacement } from \"../../registries/layout/layout-operations\";\nimport type { WorkbenchLayout, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport {\n applyOwnedWidgetLayoutReconciliation,\n reconcileOwnedWidgetLayout,\n} from \"../../registries/layout/owned-placement-layout\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchModePlacementRegistry } from \"../../registries/modes/mode-placement-registry\";\nimport type { WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport { activateWorkbenchPageMode } from \"../../registries/modes/mode-registry-internals\";\nimport { isPageSlotClosable, pagePlacementDeclarations } from \"../../registries/pages/page-main\";\nimport {\n type CreateWorkbenchPageRegistryInput,\n createWorkbenchPageRegistry,\n type WorkbenchPagePlacementInput,\n type WorkbenchPageRegistry,\n type WorkbenchPageRegistryStoreState,\n type WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createOwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport type { WorkbenchShellPlacementRegistry } from \"../../registries/placements/shell-placement-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../../registries/view-menus/view-menu-registry\";\nimport { pagePlacementContributionId, registerWorkbenchViewPlacement } from \"../../registries/views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../../registries/views/view-registry\";\nimport { createDisposable } from \"../../shared/disposable\";\nexport interface ConnectWorkbenchPageRuntimeInput {\n loadModeLayout?(projectId: string | undefined, modeId: string): WorkbenchLayout | undefined;\n beforeApply?(state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>): void;\n revealRegion?(region: WorkbenchRegion): void;\n layout: LayoutModel;\n modes: WorkbenchModeRegistry;\n registry: WorkbenchPageRegistry<WorkbenchWidgetPlacement>;\n}\nconst syncOwnedPanelMenus = (layout: LayoutModel) => {\n const ownedPlacements = Object.values(layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .filter((placement) => Boolean(placement.placementIdentity));\n for (const placement of ownedPlacements) {\n const owner = layout.getWidget(placement.contributionId);\n for (const menuId of owner?.ownedPanelMenuIds ?? []) {\n const menu = layout.getWidget(menuId);\n if (!menu) continue;\n layout.openWidget(menuId, {\n pinned: true,\n role: \"panel-menu\",\n viewId: menu.rendererId,\n resource: placement.resource,\n title: menu.region.endsWith(\"-left-menu\") ? placement.resource?.label : menu.title,\n });\n }\n }\n layout.reconcilePanelMenus();\n};\nconst bindPlacementsToActivePageLocation = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) => {\n const ownerResourceKey = resourceKey(state.location?.resource);\n if (!ownerResourceKey) return state.placements;\n return state.placements.map((placement) =>\n placement.value.role === \"sub-panel\" && (placement.identity.kind === \"page\" || Boolean(placement.value.resourceKey))\n ? { ...placement, value: { ...placement.value, ownerResourceKey } }\n : placement,\n );\n};\nconst applyPageState = (\n input: ConnectWorkbenchPageRuntimeInput,\n state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>,\n source: \"transition\" | \"scope-restore\",\n storeBeforeTransition = input.registry.store.getState(),\n) => {\n const previousScope = input.layout.getPersistenceScope();\n activateWorkbenchPageMode(input.modes, state.activeModeId, () => {\n // Scope listeners must apply the destination mode's panel policy to its saved layout.\n if (source === \"transition\") input.beforeApply?.(state);\n // Mode listeners may open or close mode/shell placements after the mode is\n // published. Reconcile the latest registry state so this transition cannot\n // overwrite those declarative changes with the snapshot that began it.\n const stored = input.registry.store.getState();\n const latest = stored === storeBeforeTransition ? state : stored;\n const activation =\n latest.reconciliation.activate.length > 0 ? latest.reconciliation.activate : state.reconciliation.activate;\n const layoutInput = {\n layout: input.layout.getLayout(),\n modeLayout: latest.activeModeId ? input.loadModeLayout?.(latest.projectId, latest.activeModeId) : undefined,\n placements: bindPlacementsToActivePageLocation(latest),\n activate: activation.map((placement) => placement.identity),\n };\n let layout: ReturnType<typeof reconcileOwnedWidgetLayout>;\n // A restored cache needs the complete owned set; a delta belongs to the previous scope.\n if (source === \"scope-restore\" || input.layout.getPersistenceScope() !== previousScope) {\n layout = reconcileOwnedWidgetLayout(layoutInput);\n } else {\n layout = applyOwnedWidgetLayoutReconciliation({\n ...layoutInput,\n remove: latest.reconciliation.remove.map((placement) => placement.identity),\n });\n }\n input.layout.restoreLayout(layout);\n syncOwnedPanelMenus(input.layout);\n if (source === \"transition\") {\n for (const placement of activation) input.revealRegion?.(placement.region);\n }\n });\n};\nexport const connectWorkbenchPageRuntime = (input: ConnectWorkbenchPageRuntimeInput) => {\n let applyingTransition = false;\n const runtime = getWorkbenchPageRegistryInternals(input.registry).connectRuntime((state) => {\n const storeBeforeTransition = input.registry.store.getState();\n applyingTransition = true;\n try {\n applyPageState(input, state, \"transition\", storeBeforeTransition);\n } finally {\n applyingTransition = false;\n }\n });\n const scope = input.layout.onDidChangePersistenceScope(() => {\n if (!applyingTransition) applyPageState(input, input.registry.store.getState(), \"scope-restore\");\n });\n return createDisposable(() => {\n scope.dispose();\n runtime.dispose();\n });\n};\nconst toTabState = (open: WorkbenchPagePlacementInput[\"open\"]) => {\n if (!open) return {};\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n return { pinned: false, tabRetention: \"preview\" as const };\n};\nconst toWidgetPlacement = (\n input: WorkbenchPagePlacementInput,\n layout: LayoutModel,\n views: WorkbenchViewRegistry,\n): WorkbenchWidgetPlacement => {\n const resource = input.resource;\n const view = views.getView(input.viewId);\n if (!view) throw new Error(`Workbench page view is not registered: ${input.viewId}`);\n const panelId = pagePlacementContributionId(input.pageId, input.slotId);\n const panel = layout.getWidget(panelId);\n if (!panel) throw new Error(`Workbench page placement is not registered: ${input.pageId}.${input.slotId}`);\n return {\n ...createPlacement(`workbench.page.${encodeURIComponent(placementIdentityKey(input.identity))}`, panel, {\n viewId: input.viewId,\n title: resource?.label ?? view.title ?? panel.title,\n role: input.role === \"primary\" ? \"location\" : \"sub-panel\",\n closable: input.closable,\n ...(resource ? { resource } : {}),\n ...toTabState(input.open),\n }),\n ...(input.section ? { section: input.section } : {}),\n };\n};\nexport interface CreateLiveWorkbenchPageRegistryInput {\n loadModeLayout?: ConnectWorkbenchPageRuntimeInput[\"loadModeLayout\"];\n restorePageState?: CreateWorkbenchPageRegistryInput<WorkbenchWidgetPlacement>[\"restorePageState\"];\n beforeApply?(state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>): void;\n revealRegion?(region: WorkbenchRegion): void;\n layout: LayoutModel;\n modePlacements: WorkbenchModePlacementRegistry;\n shellPlacements: WorkbenchShellPlacementRegistry;\n modes: WorkbenchModeRegistry;\n resources?: WorkbenchPageResourceCodec;\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n}\nexport const createLiveWorkbenchPageRegistry = (input: CreateLiveWorkbenchPageRegistryInput) => {\n const resources = input.resources ?? defaultPageResourceCodec;\n const registry = createWorkbenchPageRegistry<WorkbenchWidgetPlacement>({\n restorePageState: input.restorePageState,\n validateMode: (modeId) => {\n if (!input.modes.getMode(modeId)) throw new Error(`Workbench mode not registered: ${modeId}`);\n },\n resolveShellPlacements: (context) => input.shellPlacements.resolvePlacements(context),\n resolveModePlacements: (modeId, location, projectId, pageId) =>\n input.modePlacements.resolvePlacements(modeId, projectId ? { modeId, location, projectId, pageId } : undefined),\n resolvePagePlacement: (placement) => toWidgetPlacement(placement, input.layout, input.views),\n resources,\n valuesEqual: (left, right) => JSON.stringify(left) === JSON.stringify(right),\n registerPagePlacements: (page) => {\n const registrations = pagePlacementDeclarations(page).map((slot) => {\n const viewId = contributionRefId(slot.item.kind === \"view\" ? slot.item.view : slot.item.binding.view);\n if (!viewId) throw new Error(`Workbench page slot view is not registered: ${page.id}.${slot.id}`);\n const closable = isPageSlotClosable(slot);\n return registerWorkbenchViewPlacement(\n input.layout,\n input.views,\n {\n ...slot,\n id: pagePlacementContributionId(page.id, slot.id),\n viewId,\n role: slot.role === \"primary\" ? \"location\" : \"sub-panel\",\n singleton: slot.item.kind === \"view\" || slot.item.binding.cardinality !== \"many\",\n closable,\n },\n input.viewMenus,\n );\n });\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n },\n });\n connectWorkbenchPageRuntime({\n loadModeLayout: input.loadModeLayout,\n beforeApply: (state) => {\n input.beforeApply?.(state);\n const shell = getOwnedPlacementPreparation(input.shellPlacements);\n shell.apply(\n shell.adopt!(\n state.activeModeId ?? \"\",\n state.placements.map((placement) => ({ ...placement.value, placementIdentity: placement.identity })),\n ),\n );\n const mode = getOwnedPlacementPreparation(input.modePlacements);\n if (state.projectId !== registry.store.getState().projectId) mode.apply(createOwnedPlacementState());\n if (state.activeModeId)\n mode.apply(\n mode.adopt!(\n state.activeModeId,\n state.placements.map((placement) => ({ ...placement.value, placementIdentity: placement.identity })),\n ),\n );\n },\n revealRegion: input.revealRegion,\n layout: input.layout,\n modes: input.modes,\n registry,\n });\n getOwnedPlacementPreparation(input.modePlacements).connectRuntime(() =>\n getWorkbenchPageRegistryInternals(registry).refreshModePlacements(),\n );\n getOwnedPlacementPreparation(input.shellPlacements).connectRuntime(() =>\n getWorkbenchPageRegistryInternals(registry).refreshShellPlacements(),\n );\n return registry;\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout } from \"../../registries/layout/layout-types\";\nimport { pageSlots } from \"../../registries/pages/page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlotInstance,\n} from \"../../registries/pages/page-registry-types\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"../../registries/placements/placement-instance-key\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { createWorkbenchInput, WorkbenchPagePersistenceScopeInput } from \"../../workbench-core-types\";\n\n// The layout already persists instance resources, retention, and selection. Rebuild\n// the page owner's state from that cache instead of storing a second copy.\nexport const pageStateFromLayout = (\n page: WorkbenchPageContribution,\n layout: WorkbenchLayout,\n): WorkbenchPageRuntimeState => {\n const placements = Object.values(layout.regions).flatMap((region) => region.widgets);\n const openStaticSlotIds: string[] = [];\n const resourceInstances: Record<string, WorkbenchPageSlotInstance[]> = {};\n let activePrimaryInstanceKey: string | undefined;\n for (const slot of pageSlots(page)) {\n const matching = placements.filter(\n (placement) =>\n placement.placementIdentity?.kind === \"page\" &&\n placement.placementIdentity.pageId === page.id &&\n placement.placementIdentity.slotId === slot.id,\n );\n if (slot.item.kind === \"view\") {\n if (matching.length) openStaticSlotIds.push(slot.id);\n continue;\n }\n const binding = slot.item.binding;\n const instances = matching.flatMap((placement) => {\n const identity = placement.placementIdentity;\n if (!identity || !placement.resource || !resourceMatchesConstraint(binding, placement.resource)) return [];\n return [\n {\n instanceKey: binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : identity.instanceKey,\n resource: placement.resource,\n ...(placement.section ? { section: placement.section } : {}),\n ...(binding.cardinality === \"many\"\n ? { open: placement.tabRetention === \"preview\" ? (\"preview\" as const) : (\"pin\" as const) }\n : {}),\n },\n ];\n });\n resourceInstances[slot.id] = binding.cardinality === \"one\" ? instances.slice(-1) : instances;\n if (slot.role === \"primary\") {\n const active = matching.find((placement) => layout.activeLocationWidgetId === placement.widgetId);\n activePrimaryInstanceKey = active\n ? instances.find((instance) => instance.resource === active.resource)?.instanceKey\n : undefined;\n }\n }\n return { openStaticSlotIds, resourceInstances, activePrimaryInstanceKey };\n};\n\nexport const loadWorkbenchLocationLayout = (\n input: createWorkbenchInput,\n context: WorkbenchPagePersistenceScopeInput,\n) => {\n const scope = input.resolvePagePersistenceScope?.(context).scope;\n return input.persistence?.getSnapshot(scope)?.layout ?? input.layoutPersistence?.getLayout(scope);\n};\n\nexport const createPageStateRestorer =\n (input: createWorkbenchInput) => (page: WorkbenchPageContribution, location: PageLocation, projectId: string) => {\n const layout = loadWorkbenchLocationLayout(input, {\n modeId: page.modeId,\n pageId: page.id,\n projectId,\n resource: location.resource,\n });\n if (\n !layout ||\n !Object.values(layout.regions).some((region) =>\n region.widgets.some(\n (placement) => placement.placementIdentity?.kind === \"page\" && placement.placementIdentity.pageId === page.id,\n ),\n )\n )\n return undefined;\n return pageStateFromLayout(page, layout);\n };\n","import { type ResourceRef, resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutPersistenceAdapter } from \"../../registries/layout/layout-model-types\";\nimport {\n type WorkbenchLayout,\n type WorkbenchWidgetPlacement,\n workbenchRegions,\n} from \"../../registries/layout/layout-types\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { createWorkbenchInput } from \"../../workbench-core-types\";\n\nconst selectPlacements = (layout: WorkbenchLayout, include: (placement: WorkbenchWidgetPlacement) => boolean) => {\n const regions = { ...layout.regions };\n for (const id of workbenchRegions) {\n const region = layout.regions[id];\n const widgets = region.widgets.filter(include);\n regions[id] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((widget) => widget.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n return { ...layout, regions };\n};\nconst modeScope = (projectId: string | undefined, modeId: string) =>\n `workbench-mode:${JSON.stringify([projectId ?? null, modeId])}`;\n\n/** Page caches hold page and shell placements. Shared mode choices have one project/mode owner. */\nexport const createWorkbenchLayoutCache = (input: createWorkbenchInput) => {\n // The persistence adapter does not enumerate keys. Track only scopes visited\n // by this workbench so live removal can edit their existing cached layouts.\n const scopes = new Set<string | undefined>();\n const adapter: LayoutPersistenceAdapter | undefined = input.persistence\n ? {\n getLayout: (scope) => input.persistence?.getSnapshot(scope)?.layout,\n setLayout: (layout, scope) => input.persistence?.setSnapshot({ layout }, scope),\n flush: input.persistence.flush,\n dispose: input.persistence.dispose,\n }\n : input.layoutPersistence;\n const read = (scope?: string) => {\n scopes.add(scope);\n return runWorkbenchEffect(`layout cache read for ${scope ?? \"unscoped\"}`, () => adapter?.getLayout(scope));\n };\n const write = (layout: WorkbenchLayout, scope?: string) => {\n scopes.add(scope);\n return runWorkbenchEffect(`layout cache write for ${scope ?? \"unscoped\"}`, () => adapter?.setLayout(layout, scope));\n };\n return {\n removeResource(resource: ResourceRef) {\n for (const scope of scopes) {\n const layout = read(scope);\n if (layout)\n write(\n selectPlacements(layout, (placement) => resourceKey(placement.resource) !== resourceKey(resource)),\n scope,\n );\n }\n },\n layout: adapter\n ? {\n ...adapter,\n getLayout: read,\n setLayout: (layout: WorkbenchLayout, scope?: string) => {\n const snapshot = selectPlacements(layout, (p) => p.placementIdentity?.kind !== \"mode\");\n for (const id of workbenchRegions) {\n snapshot.regions[id].savedWidgetOrder = layout.regions[id].widgets.map((widget) => widget.widgetId);\n }\n return write(snapshot, scope);\n },\n }\n : undefined,\n readMode: (projectId: string | undefined, modeId: string) => read(modeScope(projectId, modeId)),\n saveMode: (projectId: string | undefined, modeId: string, layout: WorkbenchLayout) =>\n write(\n selectPlacements(layout, (p) => p.placementIdentity?.kind === \"mode\" && p.placementIdentity.modeId === modeId),\n modeScope(projectId, modeId),\n ),\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchRegion } from \"../../registries/layout/layout-types\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchSidePanelController, WorkbenchSidePanelMode } from \"../side-panel/side-panel-controller\";\n\nexport type WorkbenchSidePanelPresentation = WorkbenchSidePanelMode;\n\nexport type WorkbenchShellOpenRegion = \"sidenav\" | \"secondary\" | \"side\";\n\nexport interface WorkbenchShellRegionState {\n open: boolean;\n size?: number;\n}\n\nexport interface WorkbenchShellController {\n getRegionState(region: WorkbenchRegion): WorkbenchShellRegionState;\n setRegionOpen(region: WorkbenchShellOpenRegion, open: boolean): void;\n setRegionSize(region: WorkbenchRegion, size: number): void;\n getSidePanelPresentation(): WorkbenchSidePanelPresentation;\n setSidePanelPresentation(presentation: WorkbenchSidePanelPresentation): void;\n onDidChange(listener: () => void): Disposable;\n}\n\nexport const createWorkbenchShellController = (input: {\n layout: LayoutModel;\n sidePanel: WorkbenchSidePanelController;\n}): WorkbenchShellController => ({\n getRegionState(region) {\n const state = input.layout.getLayout().regions[region];\n return { open: state.visible, size: state.size };\n },\n\n setRegionOpen(region, open) {\n if (region === \"side\") {\n if (!open) input.sidePanel.setMode(\"closed\");\n else if (input.sidePanel.getMode() === \"closed\") input.sidePanel.setMode(\"attached\");\n return;\n }\n input.layout.setRegionVisible(region, open);\n },\n\n setRegionSize(region, size) {\n input.layout.setRegionSize(region, size);\n },\n\n getSidePanelPresentation: input.sidePanel.getMode,\n setSidePanelPresentation: input.sidePanel.setMode,\n\n onDidChange(listener) {\n // The Side Panel mode lives in the layout, so one change can reach both sources.\n // A mode policy change moves the panel without a layout change.\n let layout = input.layout.getLayout();\n let sidePanelMode = input.sidePanel.getMode();\n const notify = () => {\n const nextLayout = input.layout.getLayout();\n const nextSidePanelMode = input.sidePanel.getMode();\n if (nextLayout === layout && nextSidePanelMode === sidePanelMode) return;\n layout = nextLayout;\n sidePanelMode = nextSidePanelMode;\n listener();\n };\n const unsubscribeLayout = input.layout.store.subscribeSelector((state) => state.layout, notify);\n const sidePanelSubscription = input.sidePanel.onDidChange(notify);\n return createDisposable(() => {\n unsubscribeLayout();\n sidePanelSubscription.dispose();\n });\n },\n});\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport { getAnchorResource, reconcileAnchors } from \"../../registries/layout/surface-reconcile\";\nimport type { ResourceRef, ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\n// Default scope predicate derived from the scoped resource providers. A detached\n// resource stays in scope while a provider for its kind still lists it under the active\n// primary; kinds with no provider can't be scoped, so they are kept. This makes the\n// detached-disconnect behaviour fall out of how providers filter their candidates —\n// no per-app wiring needed (apps can still inject a custom predicate).\n//\n// It deliberately ignores the `primary` argument the coordinator passes: scoping is read\n// from the registry's own `getPrimary` closure (which already reflects the live primary),\n// so the candidate list and this predicate cannot drift to different primaries.\nexport const createScopedIsInScope = (resources: ResourceRegistry) => (resource: ResourceRef) => {\n const hasProvider = resources.listProviders().some((provider) => provider.kind === resource.type);\n if (!hasProvider) return true;\n return resources.listResources(\"\").some((entry) => resourceKey(entry.resource) === resourceKey(resource));\n};\nexport interface CreatePrimaryCoordinatorInput {\n layout: LayoutModel;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scope. Injected (no baked default) so apps decide the disconnect policy; the core\n // default keeps detached anchors (() => true) until scoped providers land.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n// Keeps the secondary resource anchors consistent with the primary (main) resource.\n// On a primary change, derived anchors clear (they re-scope to the new primary) and\n// detached anchors disconnect once they fall outside the new primary's scope. The\n// primary anchor is never mutated, so the selector keyed on the main region's active\n// resource cannot re-fire — the reconciliation is feedback-loop safe by construction.\nexport const createPrimaryCoordinator = ({ layout, isInScope }: CreatePrimaryCoordinatorInput): Disposable => {\n let changingPersistenceScope = false;\n const willChangeScope = layout.onWillChangePersistenceScope(() => {\n changingPersistenceScope = true;\n });\n const didChangeScope = layout.onDidChangePersistenceScope(() => {\n changingPersistenceScope = false;\n });\n const unsubscribe = layout.store.subscribe((state, previous) => {\n const primary = getAnchorResource(state.layout, \"primary\");\n const previousPrimaryKey = resourceKey(getAnchorResource(previous.layout, \"primary\"));\n if (resourceKey(primary) === previousPrimaryKey || changingPersistenceScope) return;\n // Reconcile only placements that belonged to the Location that is leaving.\n // Another listener may synchronously populate the new Location before this\n // callback runs; clearing the live region would delete that new content too.\n for (const action of reconcileAnchors({ layout: previous.layout, primary, isInScope })) {\n if (action.action !== \"clear\") continue;\n layout.removeWidgetPlacement(action.widgetId);\n }\n });\n return createDisposable(() => {\n unsubscribe();\n willChangeScope.dispose();\n didChangeScope.dispose();\n });\n};\n","import type { WorkbenchShellOpenRegion } from \"./controllers/shell/shell-controller\";\nimport type { KeybindingSequence } from \"./registries/keybindings/keybinding-registry\";\nimport { workbenchCommandPaletteMenuPath } from \"./registries/menus/workbench-menu-paths\";\nimport type { WorkbenchCore } from \"./workbench-core\";\n\nconst SIDENAV_PANEL_ID = \"sidenav\";\n\nconst togglePanel = (workbench: WorkbenchCore, region: WorkbenchShellOpenRegion) => {\n workbench.shell.setRegionOpen(region, !workbench.shell.getRegionState(region).open);\n};\n\ninterface BuiltinCommand {\n id: string;\n label: string;\n icon: string;\n keybinding: KeybindingSequence;\n execute: (workbench: WorkbenchCore) => void;\n}\n\n// Defaults use `Mod` so a single chord works on macOS (Cmd), Windows, and\n// Linux (Ctrl). The command palette intentionally claims the browser print\n// chord. Other built-ins must avoid the reserved table in `pstdio-extensions`.\nconst builtinCommands: BuiltinCommand[] = [\n {\n id: \"workbench.toggleCommandPalette\",\n label: \"Toggle Command Palette\",\n icon: \"Command\",\n keybinding: \"Mod+P\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.toggle(),\n },\n {\n id: \"workbench.action.showCommands\",\n label: \"Run Command\",\n icon: \"Terminal\",\n keybinding: \"Alt+Shift+K\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ initialQuery: \"> \" }),\n },\n {\n id: \"workbench.action.changeTheme\",\n label: \"Change Theme\",\n icon: \"Palette\",\n keybinding: \"Alt+Shift+T\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ view: \"theme\" }),\n },\n {\n id: \"workbench.action.navigateBack\",\n label: \"Navigate Back\",\n icon: \"ArrowLeft\",\n keybinding: \"Alt+Shift+ArrowLeft\",\n execute: (workbench: WorkbenchCore) => {\n workbench.pageLocations.goBack();\n },\n },\n {\n id: \"workbench.action.navigateForward\",\n label: \"Navigate Forward\",\n icon: \"ArrowRight\",\n keybinding: \"Alt+Shift+ArrowRight\",\n execute: (workbench: WorkbenchCore) => {\n workbench.pageLocations.goForward();\n },\n },\n {\n id: \"workbench.toggleSideBar\",\n label: \"Toggle Sidenav\",\n icon: \"PanelLeft\",\n keybinding: \"Mod+B\",\n execute: (workbench: WorkbenchCore) => togglePanel(workbench, SIDENAV_PANEL_ID),\n },\n];\n\nexport const registerWorkbenchBuiltIns = (workbench: WorkbenchCore) => {\n for (const command of builtinCommands) {\n workbench.commands.registerCommand(\n {\n id: command.id,\n label: command.label,\n category: \"Workbench\",\n icon: command.icon,\n when: \"!inputFocus\",\n },\n { execute: () => command.execute(workbench) },\n );\n workbench.keybindings.registerKeybinding({\n action: { kind: \"command\", commandId: command.id },\n keybinding: command.keybinding,\n when: \"!inputFocus\",\n });\n workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, {\n commandId: command.id,\n group: \"Workbench\",\n });\n }\n};\n","import { createWorkbenchCompositionController } from \"./controllers/composition/composition-controller\";\nimport { createOwnedAddablePanels } from \"./controllers/composition/owned-addable-panels\";\nimport { createPrimaryCoordinator, createScopedIsInScope } from \"./controllers/primary-coordinator/primary-coordinator\";\nimport { workbenchViewIdContextKey } from \"./registries/views/view-registry\";\nimport { registerWorkbenchBuiltIns } from \"./workbench-built-ins\";\nimport type { createWorkbenchInput, WorkbenchCore } from \"./workbench-core-types\";\n\nexport const createCoreCompositionController = (resolveCore: () => WorkbenchCore) =>\n createWorkbenchCompositionController({\n getActiveMode: () => {\n const core = resolveCore();\n const modeId = core.modes.getActiveModeId();\n return modeId ? core.modes.getMode(modeId) : undefined;\n },\n getLayout: () => resolveCore().layout.getLayout(),\n getResource: () => resolveCore().getPrimaryResource(),\n listWidgets: () => resolveCore().layout.listWidgets(),\n listOwnedAddablePanels: ({ layout, mode, region, resource }) => {\n const core = resolveCore();\n return createOwnedAddablePanels(core, { layout, modeId: mode?.id, region, resource });\n },\n });\n\nexport const connectWorkbenchCoreState = (core: WorkbenchCore, input: createWorkbenchInput) => {\n core.layout.store.subscribe((state) => {\n const activeRegion = core.focus.getActiveRegion();\n if (activeRegion && !state.layout.regions[activeRegion].visible) core.focus.clearFocus();\n });\n core.layout.store.subscribeSelector(\n (state) => {\n const activeId = state.layout.activeWidgetId;\n if (!activeId) return undefined;\n return Object.values(state.layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === activeId)?.viewId;\n },\n (viewId) => {\n if (viewId) core.context.set(workbenchViewIdContextKey, viewId);\n else core.context.delete(workbenchViewIdContextKey);\n },\n { fireImmediately: true },\n );\n\n createPrimaryCoordinator({\n layout: core.layout,\n isInScope: input.isInScope ?? createScopedIsInScope(core.resources),\n });\n registerWorkbenchBuiltIns(core);\n};\n\nexport const activeWorkbenchResource = (core: WorkbenchCore) => {\n const activeWidgetId = core.layout.getLayout().activeWidgetId;\n if (!activeWidgetId) return undefined;\n for (const region of Object.values(core.layout.getLayout().regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === activeWidgetId);\n if (placement) return placement.resource;\n }\n return undefined;\n};\n\nexport const primaryWorkbenchResource = (core: WorkbenchCore) => core.pages.store.getState().location?.resource;\n","import {\n createNavigationTreeRegistry,\n type NavigationTreeMoveContext,\n} from \"./registries/navigation/navigation-tree-registry\";\nimport type { TreeNode } from \"./registries/renderers/tree-renderer-types\";\nimport type { createCoreRenderers } from \"./workbench-core-renderers\";\n\nexport const createWorkbenchNavigationTrees = (renderers: ReturnType<typeof createCoreRenderers>) =>\n createNavigationTreeRegistry({\n subscribeViewRefresh: (viewId, listener) =>\n renderers.onDidRefresh(({ treeId }) => {\n if (treeId === viewId) listener();\n }),\n getViewDefaultExpandedSectionIds: (viewId) => renderers.getTreeRenderer(viewId)?.defaultExpandedSectionIds,\n getViewSections: (viewId, context) => renderers.getBody(viewId, { ...context, viewId }),\n getViewChildren: (viewId, node, context) => renderers.getChildren(viewId, node, { ...context, viewId }),\n moveViewNode: (viewId, source, target, context) => moveNavigationNode(renderers, viewId, source, target, context),\n });\n\nconst moveNavigationNode = async (\n renderers: ReturnType<typeof createCoreRenderers>,\n viewId: string,\n source: TreeNode,\n target: TreeNode | undefined,\n context: NavigationTreeMoveContext,\n) => {\n await renderers.getTreeRenderer(viewId)?.moveNode?.(source, target, {\n ...context,\n viewId,\n state: renderers.getTreeState(viewId),\n refresh: () => renderers.refresh(viewId),\n setSelectedNode: (nodeId) => renderers.setSelectedNode(viewId, nodeId),\n });\n};\n","import { createControlsRendererRegistry } from \"./registries/renderers/controls-renderer-registry\";\nimport { createDataTableRendererRegistry } from \"./registries/renderers/data-table-renderer-registry\";\nimport { createFileRendererRegistry } from \"./registries/renderers/file-renderer-registry\";\nimport { createKanbanRendererRegistry } from \"./registries/renderers/kanban-renderer-registry\";\nimport { createWorkbenchRendererRegistry } from \"./registries/renderers/renderer-registry\";\nimport { createTreeRendererRegistry } from \"./registries/renderers/tree-renderer-registry\";\nimport type { createWorkbenchInput, WorkbenchRenderers } from \"./workbench-core-types\";\n\nexport const createCoreRenderers = (input: createWorkbenchInput): WorkbenchRenderers => {\n const rendererRegistry = createWorkbenchRendererRegistry();\n return {\n ...rendererRegistry,\n ...createTreeRendererRegistry({ rendererRegistry, persistence: input.treePersistence }),\n ...createKanbanRendererRegistry({ rendererRegistry }),\n ...createDataTableRendererRegistry({ rendererRegistry }),\n ...createFileRendererRegistry({ rendererRegistry }),\n ...createControlsRendererRegistry({ rendererRegistry }),\n };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ControlsRendererRegistry } from \"../renderers/controls-renderer-registry\";\nimport type { DataTableRendererRegistry } from \"../renderers/data-table-renderer-registry\";\nimport type { FileRendererRegistry } from \"../renderers/file-renderer-registry\";\nimport type { KanbanRendererRegistry } from \"../renderers/kanban-renderer-registry\";\nimport type { WorkbenchRendererRegistry } from \"../renderers/renderer-registry\";\nimport type { TreeRendererRegistry } from \"../renderers/tree-renderer-registry\";\nimport type { WorkbenchViewContribution } from \"./view-registry\";\n\ntype ViewBodyRegistries = Pick<WorkbenchRendererRegistry, \"refreshRenderer\" | \"registerRenderer\"> &\n Pick<TreeRendererRegistry, \"refresh\" | \"registerTreeRenderer\"> &\n Pick<KanbanRendererRegistry, \"refreshKanbanRenderer\" | \"registerKanbanRenderer\"> &\n Pick<DataTableRendererRegistry, \"refreshDataTableRenderer\" | \"registerDataTableRenderer\"> &\n Pick<FileRendererRegistry, \"refreshFileRenderer\" | \"registerFileRenderer\"> &\n Pick<ControlsRendererRegistry, \"refreshControlsRenderer\" | \"registerControlsRenderer\">;\n\nconst refreshable = <T extends { dispose(): void }>(registration: T, refresh: (input?: unknown) => void) => ({\n dispose: () => registration.dispose(),\n refresh,\n});\n\nexport const createWorkbenchViewBodyRegistration =\n (registries: ViewBodyRegistries) => (view: WorkbenchViewContribution, metadata?: ContributionMetadata) => {\n const body = view.body;\n if (body.kind === \"react\") {\n return refreshable(registries.registerRenderer({ id: view.id, render: body.render }), () =>\n registries.refreshRenderer(view.id),\n );\n }\n if (body.kind === \"tree\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerTreeRenderer({ ...definition, id: view.id, title: view.title, icon: view.icon }, metadata),\n () => registries.refresh(view.id),\n );\n }\n if (body.kind === \"file\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerFileRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n (input) =>\n registries.refreshFileRenderer(view.id, input as Parameters<FileRendererRegistry[\"refreshFileRenderer\"]>[1]),\n );\n }\n if (body.kind === \"controls\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerControlsRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshControlsRenderer(view.id),\n );\n }\n if (body.kind === \"kanban\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerKanbanRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshKanbanRenderer(view.id),\n );\n }\n\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerDataTableRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshDataTableRenderer(view.id),\n );\n };\n","import { createStatusBarRegistry } from \"./registries/status-bar/status-bar-registry\";\nimport { createWorkbenchViewMenuRegistry } from \"./registries/view-menus/view-menu-registry\";\nimport { createWorkbenchViewBodyRegistration } from \"./registries/views/view-body-registration\";\nimport { createViewRegistry } from \"./registries/views/view-registry\";\nimport type { createWorkbenchInput, WorkbenchRenderers } from \"./workbench-core-types\";\n\nexport const createCoreViews = (input: createWorkbenchInput, renderers: WorkbenchRenderers) => {\n const views = createViewRegistry({ registerBody: createWorkbenchViewBodyRegistration(renderers) });\n return {\n views,\n viewMenus: createWorkbenchViewMenuRegistry({ views }),\n statusBar: createStatusBarRegistry({\n hasView: (viewId) => Boolean(views.getView(viewId)),\n persistence: input.statusBarPersistence,\n }),\n };\n};\n","import type { ResourceRef } from \"./registries/resources/resource-registry\";\nimport type { ContributionMetadata, ContributionSource } from \"./shared/contributions/metadata\";\nimport type { Disposable } from \"./shared/disposable\";\nimport { createDisposable } from \"./shared/disposable\";\nimport type { WorkbenchCore, WorkbenchModuleContribution, WorkbenchModuleContributionContext } from \"./workbench-core\";\n\ntype WorkbenchModuleActivationResult = Disposable | readonly Disposable[] | undefined;\n\nconst withModuleMetadata = (\n input: { ownerId: string; source: ContributionSource },\n metadata?: ContributionMetadata,\n) => ({\n ...metadata,\n source: input.source,\n ownerId: input.ownerId,\n});\n\nexport const toDisposables = (result: WorkbenchModuleActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nexport const disposeDisposables = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\n\ninterface CreateModuleContextInput {\n contextScopeId: string;\n ownerId: string;\n source: ContributionSource;\n track(disposable: Disposable): void;\n}\n\nexport const createModuleContext = (\n core: WorkbenchCore,\n input: CreateModuleContextInput,\n): WorkbenchModuleContributionContext => {\n // Contributions may share an owner, but each module or mode owns its context lifetime.\n const contextScope = core.context.createScope(input.contextScopeId);\n input.track(contextScope);\n\n const track = <TDisposable extends Disposable>(disposable: TDisposable) => {\n input.track(disposable);\n return disposable;\n };\n\n const {\n openPanel: _openPanel,\n openWidget: _openWidget,\n registerPanel: _registerPanel,\n registerPanelMenu: _registerPanelMenu,\n registerPlaceholder: _registerPlaceholder,\n registerWidget: _registerWidget,\n ...moduleLayout\n } = core.layout;\n return {\n ...core,\n registerChildModule: (module: WorkbenchModuleContribution) => track(core.registerModule(module)),\n onDidChangePrimaryResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangePrimaryResource(listener)),\n onDidChangeActiveResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangeActiveResource(listener)),\n breadcrumbs: {\n ...core.breadcrumbs,\n setItems: (items) => track(core.breadcrumbs.setItems(items)),\n onDidChange: (listener) => track(core.breadcrumbs.onDidChange(listener)),\n },\n commandPalette: {\n ...core.commandPalette,\n onDidChange: (listener) => track(core.commandPalette.onDidChange(listener)),\n },\n context: {\n ...core.context,\n set: (key, value) => contextScope.set(key, value),\n delete: (key) => contextScope.delete(key),\n createScope: (ownerId) => track(core.context.createScope(ownerId)),\n },\n focus: {\n ...core.focus,\n onDidChange: (listener) => track(core.focus.onDidChange(listener)),\n },\n commands: {\n ...core.commands,\n registerCommand: (command, handler, metadata) =>\n track(core.commands.registerCommand(command, handler, withModuleMetadata(input, metadata))),\n onDidExecuteError: (listener) => track(core.commands.onDidExecuteError(listener)),\n },\n keybindings: {\n ...core.keybindings,\n registerKeybinding: (keybinding, metadata) =>\n track(core.keybindings.registerKeybinding(keybinding, withModuleMetadata(input, metadata))),\n },\n layout: {\n ...moduleLayout,\n registerMenuItem: (path, item, metadata) =>\n track(core.layout.registerMenuItem(path, item, withModuleMetadata(input, metadata))),\n onWillChangePersistenceScope: (listener) => track(core.layout.onWillChangePersistenceScope(listener)),\n onDidChangePersistenceScope: (listener) => track(core.layout.onDidChangePersistenceScope(listener)),\n },\n modes: {\n ...core.modes,\n registerMode: (mode) =>\n track(\n core.modes.registerMode({\n ...mode,\n activate: () => {\n const modeDisposables: Disposable[] = [];\n const modeContext = createModuleContext(core, {\n ...input,\n contextScopeId: `mode:${mode.id}`,\n track: (disposable) => modeDisposables.push(disposable),\n });\n const returnedDisposables = toDisposables(mode.activate(modeContext));\n return createDisposable(() => disposeDisposables([...modeDisposables, ...returnedDisposables]));\n },\n }),\n ),\n onDidChangeActive: (listener) => track(core.modes.onDidChangeActive(listener)),\n },\n modePlacements: {\n ...core.modePlacements,\n registerPlacement: (placement) => track(core.modePlacements.registerPlacement(placement)),\n onDidChange: (listener) => track(core.modePlacements.onDidChange(listener)),\n },\n shellPlacements: {\n ...core.shellPlacements,\n registerPlacement: (placement) => track(core.shellPlacements.registerPlacement(placement)),\n onDidChange: (listener) => track(core.shellPlacements.onDidChange(listener)),\n },\n navigation: {\n ...core.navigation,\n registerParser: (parser, metadata) =>\n track(core.navigation.registerParser(parser, withModuleMetadata(input, metadata))),\n },\n navigationTrees: {\n ...core.navigationTrees,\n registerContribution: (contribution) => track(core.navigationTrees.registerContribution(contribution)),\n onDidChange: (listener) => track(core.navigationTrees.onDidChange(listener)),\n },\n notifications: {\n ...core.notifications,\n show: (notification, metadata) => core.notifications.show(notification, withModuleMetadata(input, metadata)),\n },\n overlays: {\n ...core.overlays,\n registerOverlay: (overlay) => track(core.overlays.registerOverlay(overlay)),\n },\n placeholders: {\n ...core.placeholders,\n registerPlaceholder: (placeholder, metadata) =>\n track(core.placeholders.registerPlaceholder(placeholder, withModuleMetadata(input, metadata))),\n },\n pages: {\n ...core.pages,\n registerPage: (page) => track(core.pages.registerPage(page)),\n },\n panelMenuState: {\n ...core.panelMenuState,\n onDidChange: (listener) => track(core.panelMenuState.onDidChange(listener)),\n },\n preferences: {\n ...core.preferences,\n registerSchema: (schema, metadata) =>\n track(core.preferences.registerSchema(schema, withModuleMetadata(input, metadata))),\n },\n resources: {\n ...core.resources,\n onWillRemove: (listener) => track(core.resources.onWillRemove(listener)),\n registerKind: (kind, metadata) => track(core.resources.registerKind(kind, withModuleMetadata(input, metadata))),\n registerHierarchyProvider: (provider) => track(core.resources.registerHierarchyProvider(provider)),\n registerProvider: (provider) => track(core.resources.registerProvider(provider)),\n },\n views: {\n ...core.views,\n registerView: (view, metadata) => track(core.views.registerView(view, withModuleMetadata(input, metadata))),\n },\n viewMenus: {\n ...core.viewMenus,\n registerViewMenu: (menu) => track(core.viewMenus.registerViewMenu(menu)),\n },\n settings: {\n ...core.settings,\n registerSection: (section, metadata) =>\n track(core.settings.registerSection(section, withModuleMetadata(input, metadata))),\n registerPanel: (panel, metadata) =>\n track(core.settings.registerPanel(panel, withModuleMetadata(input, metadata))),\n },\n statusBar: {\n ...core.statusBar,\n registerItem: (item) => track(core.statusBar.registerItem(item)),\n },\n statuses: {\n ...core.statuses,\n registerStatusSet: (statusSet, metadata) =>\n track(core.statuses.registerStatusSet(statusSet, withModuleMetadata(input, metadata))),\n },\n shell: {\n ...core.shell,\n onDidChange: (listener) => track(core.shell.onDidChange(listener)),\n },\n sidePanel: {\n ...core.sidePanel,\n onDidChange: (listener) => track(core.sidePanel.onDidChange(listener)),\n },\n themes: {\n ...core.themes,\n register: (themes) => track(core.themes.register(themes)),\n },\n fileIconThemes: {\n ...core.fileIconThemes,\n register: (themes) => track(core.fileIconThemes.register(themes)),\n },\n } satisfies WorkbenchModuleContributionContext;\n};\n","import { createDisposable, type Disposable } from \"./shared/disposable\";\nimport type { WorkbenchCore } from \"./workbench-core-types\";\nimport { createModuleContext, disposeDisposables, toDisposables } from \"./workbench-module-context\";\n\nexport const createWorkbenchModuleRegistry = (\n resolveCore: () => WorkbenchCore,\n): Pick<WorkbenchCore, \"registerModule\" | \"unregisterModule\"> => {\n const moduleRecords = new Map<string, { disposable: Disposable }>();\n return {\n registerModule(module) {\n if (moduleRecords.has(module.id)) throw new Error(`Workbench module already registered: ${module.id}`);\n\n const disposables: Disposable[] = [];\n let registration: Disposable;\n\n registration = createDisposable(() => {\n if (moduleRecords.get(module.id)?.disposable !== registration) return;\n moduleRecords.delete(module.id);\n disposeDisposables(disposables);\n });\n\n const record = { disposable: registration };\n\n moduleRecords.set(module.id, record);\n\n try {\n const context = createModuleContext(resolveCore(), {\n contextScopeId: `module:${module.id}`,\n ownerId: module.ownerId ?? module.id,\n source: module.source ?? \"module\",\n track: (disposable) => {\n disposables.push(disposable);\n },\n });\n disposables.push(...toDisposables(module.activate(context)));\n } catch (error) {\n record.disposable.dispose();\n throw error;\n }\n\n return record.disposable;\n },\n\n unregisterModule(moduleId) {\n moduleRecords.get(moduleId)?.disposable.dispose();\n },\n };\n};\n","import { defaultPageResourceCodec, workbenchPages } from \"@pstdio/sdk/extensions\";\nimport { createWorkbenchBreadcrumbController } from \"./controllers/breadcrumbs/breadcrumb-registry\";\nimport { createWorkbenchCommandPaletteController } from \"./controllers/command-palette/command-palette-controller\";\nimport { registerArrangementCommands } from \"./controllers/composition/arrangement-commands\";\nimport { createPanelArrangement } from \"./controllers/composition/panel-arrangement\";\nimport { createPlacementCloseController } from \"./controllers/composition/placement-close-controller\";\nimport { createPlacementPinController } from \"./controllers/composition/placement-pin-controller\";\nimport { createLayoutResetController } from \"./controllers/composition/reset-workbench-layout\";\nimport { removeWorkbenchResource } from \"./controllers/composition/resource-removal\";\nimport { createWorkbenchFocusController } from \"./controllers/focus/focus-controller\";\nimport { connectWorkbenchPageBreadcrumbs } from \"./controllers/page-location/page-breadcrumbs\";\nimport { createWorkbenchPageLocationController } from \"./controllers/page-location/page-location-controller\";\nimport {\n createMemoryWorkbenchPageLocationBrowser,\n createMemoryWorkbenchPageLocationPersistence,\n} from \"./controllers/page-location/page-location-memory\";\nimport { createLiveWorkbenchPageRegistry } from \"./controllers/page-runtime/page-runtime\";\nimport {\n createPageStateRestorer,\n loadWorkbenchLocationLayout,\n} from \"./controllers/page-runtime/page-state-restoration\";\nimport { createWorkbenchLayoutCache } from \"./controllers/page-runtime/workbench-layout-cache\";\nimport { createWorkbenchPanelMenuStateController } from \"./controllers/panel-menus/panel-menu-state-controller\";\nimport { createWorkbenchShellController } from \"./controllers/shell/shell-controller\";\nimport { createWorkbenchSidePanelController } from \"./controllers/side-panel/side-panel-controller\";\nimport { createWorkbenchTerminalController } from \"./controllers/terminal/terminal-controller\";\nimport { createCommandPaletteResourceRegistry } from \"./registries/command-palette-resources/command-palette-resource-registry\";\nimport { createCommandRegistry } from \"./registries/commands/command-registry\";\nimport { createKeybindingRegistry } from \"./registries/keybindings/keybinding-registry\";\nimport { createLayoutModel } from \"./registries/layout/layout-model\";\nimport type { LayoutPersistenceAdapter } from \"./registries/layout/layout-model-types\";\nimport type { WorkbenchWidgetPlacement } from \"./registries/layout/layout-types\";\nimport { createMenuRegistry } from \"./registries/menus/menu-registry\";\nimport { createWorkbenchModePlacementRegistry } from \"./registries/modes/mode-placement-registry\";\nimport { createWorkbenchModeRegistry } from \"./registries/modes/mode-registry\";\nimport type { createNavigationTreeRegistry } from \"./registries/navigation/navigation-tree-registry\";\nimport { createNotificationRegistry } from \"./registries/notifications/notification-registry\";\nimport { createWorkbenchOverlayRegistry } from \"./registries/overlays/overlay-registry\";\nimport type { WorkbenchPageRegistryStoreState } from \"./registries/pages/page-registry\";\nimport { createWorkbenchPlaceholderRegistry } from \"./registries/placeholders/placeholder-registry\";\nimport { createWorkbenchShellPlacementRegistry } from \"./registries/placements/shell-placement-registry\";\nimport { createPreferenceRegistry } from \"./registries/preferences/preference-registry\";\nimport { createResourceRegistry } from \"./registries/resources/resource-registry\";\nimport { createSettingsRegistry } from \"./registries/settings/settings-registry\";\nimport { createStatusRegistry } from \"./registries/statuses/status-registry\";\nimport { createFileIconThemeRegistry } from \"./registries/themes/file-icon-theme-registry\";\nimport { createThemeRegistry } from \"./registries/themes/theme-registry\";\nimport { createContextKeyService } from \"./shared/context/context-key-service\";\nimport { createDisposable } from \"./shared/disposable\";\nimport {\n activeWorkbenchResource,\n connectWorkbenchCoreState,\n createCoreCompositionController,\n primaryWorkbenchResource,\n} from \"./workbench-core-connections\";\nimport { createCoreNavigationRegistry, revealPanelRegion } from \"./workbench-core-navigation\";\nimport { createWorkbenchNavigationTrees } from \"./workbench-core-navigation-trees\";\nimport { createCoreRenderers } from \"./workbench-core-renderers\";\nimport type { createWorkbenchInput, WorkbenchCore } from \"./workbench-core-types\";\nimport { createCoreViews } from \"./workbench-core-views\";\nimport { createWorkbenchModuleRegistry } from \"./workbench-module-registry\";\nimport { setWorkbenchRenderers } from \"./workbench-renderers\";\n\nexport * from \"./workbench-core-types\";\n\nconst createPagePersistenceScopeHandler = (\n input: createWorkbenchInput,\n layout: Pick<ReturnType<typeof createLayoutModel>, \"getPersistenceScope\" | \"setPersistenceScope\">,\n panelMenuState: ReturnType<typeof createWorkbenchPanelMenuStateController>,\n) => {\n const resolveScope = input.resolvePagePersistenceScope;\n if (!resolveScope) return undefined;\n return (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) => {\n const resolved = resolveScope({\n currentScope: layout.getPersistenceScope(),\n modeId: state.activeModeId,\n pageId: state.activePageId,\n projectId: state.projectId,\n resource: state.location?.resource,\n });\n panelMenuState.setPersistenceScope(resolved.scope);\n layout.setPersistenceScope(resolved.scope, { carryRegionState: resolved.carryRegions });\n };\n};\n\nconst createPageLocations = (\n input: createWorkbenchInput,\n registry: ReturnType<typeof createLiveWorkbenchPageRegistry>,\n navigationTrees: ReturnType<typeof createNavigationTreeRegistry>,\n modes: ReturnType<typeof createWorkbenchModeRegistry>,\n) =>\n createWorkbenchPageLocationController({\n registry,\n browser: input.pageLocationBrowser ?? createMemoryWorkbenchPageLocationBrowser(),\n navigationTrees,\n modes,\n persistence: input.pageLocationPersistence ?? createMemoryWorkbenchPageLocationPersistence(),\n startPage: input.startPage ?? workbenchPages.start,\n });\n\nconst disposeLayoutPersistence = (persistence: LayoutPersistenceAdapter | undefined) => {\n // Save pending writes before the adapter releases its resources.\n persistence?.flush?.();\n persistence?.dispose?.();\n};\n\nexport const createWorkbench = (input: createWorkbenchInput = {}) => {\n const context = createContextKeyService();\n const commands = createCommandRegistry({ context });\n const renderers = createCoreRenderers(input);\n\n const layoutCache = createWorkbenchLayoutCache(input);\n const cachedInput = { ...input, persistence: undefined, layoutPersistence: layoutCache.layout };\n const locationAwareLayout = createLayoutModel({\n defaultRegionVisibility: {\n ...input.defaultPanelOpenByRegionId,\n side: (input.initialSidePanelMode ?? \"floating\") !== \"closed\",\n },\n // The active mode owns region policy; the host input is the fallback. Resolved\n // lazily because the mode registry is created after the layout model.\n getRegionSettings: (regionId) => {\n const activeModeId = core?.modes.getActiveModeId();\n const activeMode = activeModeId ? core?.modes.getMode(activeModeId) : undefined;\n return { ...input.regionSettings?.[regionId], ...activeMode?.regionSettings?.[regionId] };\n },\n persistence: layoutCache.layout,\n });\n\n const { establishLocation, ...layoutModel } = locationAwareLayout;\n\n const layout = {\n ...layoutModel,\n ...createMenuRegistry({ commands }),\n };\n\n const focus = createWorkbenchFocusController({\n context,\n isRegionFocusable: (region) => layout.getLayout().regions[region].visible,\n });\n\n const { views, viewMenus, statusBar } = createCoreViews(input, renderers);\n const pageResources = input.pageResources ?? defaultPageResourceCodec;\n\n const modePlacements = createWorkbenchModePlacementRegistry({\n loadLayout: (context) => layoutCache.readMode(context.projectId, context.modeId),\n getProjectId: () => core?.pages.store.getState().projectId,\n views,\n viewMenus,\n getPanel: layout.getWidget,\n registerPanel: layout,\n });\n\n const shellPlacements = createWorkbenchShellPlacementRegistry({\n views,\n viewMenus,\n getPanel: layout.getWidget,\n registerPanel: layout,\n activatePanel: layout.activatePanel,\n getLayout: layout.getLayout,\n getScope: layout.getPersistenceScope,\n resolveScope: input.resolvePagePersistenceScope\n ? (context) =>\n input.resolvePagePersistenceScope!({\n ...context,\n currentScope: layout.getPersistenceScope(),\n resource: context.location?.resource,\n }).scope\n : undefined,\n loadLayout: (context) =>\n loadWorkbenchLocationLayout(cachedInput, { ...context, resource: context.location?.resource }),\n enteredWithPersistedLayout: layout.enteredWithPersistedLayout,\n onDidChangePersistenceScope: layout.onDidChangePersistenceScope,\n });\n\n const navigationTrees = createWorkbenchNavigationTrees(renderers);\n\n const overlays = createWorkbenchOverlayRegistry({ layout, views, viewMenus });\n const placeholders = createWorkbenchPlaceholderRegistry({ layout, views });\n const breadcrumbs = createWorkbenchBreadcrumbController();\n const panelMenuState = createWorkbenchPanelMenuStateController({\n persistence: input.panelMenuStatePersistence,\n });\n\n const resources = createResourceRegistry({\n remove: (resource, retained) => {\n removeWorkbenchResource(core, resource, retained);\n layoutCache.removeResource(resource);\n },\n getPrimary: () => core.getPrimaryResource(),\n resolveView: views.getView,\n });\n\n let core: WorkbenchCore;\n\n const modes = createWorkbenchModeRegistry({\n establishLocation,\n layout,\n resolveContext: () => core,\n });\n\n const sidePanel = createWorkbenchSidePanelController({\n getFloatingPanels: () => {\n const activeModeId = modes.getActiveModeId();\n return (\n (activeModeId ? modes.getMode(activeModeId)?.floatingPanels : undefined) ?? input.floatingPanels ?? \"visible\"\n );\n },\n onDidChangePolicy: modes.onDidChangeActive,\n initialMode: input.initialSidePanelMode,\n layout,\n });\n const shell = createWorkbenchShellController({ layout, sidePanel });\n\n const pages = createLiveWorkbenchPageRegistry({\n loadModeLayout: layoutCache.readMode,\n beforeApply: createPagePersistenceScopeHandler(input, layout, panelMenuState),\n restorePageState: createPageStateRestorer(cachedInput),\n\n revealRegion: (region) => revealPanelRegion(core, region),\n layout,\n modePlacements,\n modes,\n shellPlacements,\n views,\n viewMenus,\n resources: pageResources,\n });\n\n const pageLocations = createPageLocations(input, pages, navigationTrees, modes);\n\n const composition = createCoreCompositionController(() => core);\n const navigation = createCoreNavigationRegistry(() => core);\n\n core = {\n closePlacement: createPlacementCloseController(() => core),\n pinPlacement: createPlacementPinController(() => core),\n ...createPanelArrangement(() => core),\n ...createLayoutResetController(() => core),\n breadcrumbs,\n commandPalette: createWorkbenchCommandPaletteController(),\n commands,\n composition,\n context,\n focus,\n host: {\n getSnapshot: () => ({ layout: layout.getLayout() }),\n restoreSnapshot: (snapshot) => layout.restoreLayout(snapshot.layout),\n setPersistenceScope: (scope, scopeInput = {}) =>\n layout.setPersistenceScope(scope, { carryRegionState: scopeInput.carryRegions }),\n getPersistenceScope: layout.getPersistenceScope,\n },\n keybindings: createKeybindingRegistry({ commands, context }),\n layout,\n modes,\n modePlacements,\n shellPlacements,\n notifications: createNotificationRegistry(),\n overlays,\n placeholders,\n pageLocations,\n pages,\n navigation,\n navigationTrees,\n panelMenuState,\n preferences: createPreferenceRegistry({ persistence: input.preferencePersistence }),\n treeViews: {\n getTreeState: renderers.getTreeState,\n setNodeExpanded: renderers.setNodeExpanded,\n setSectionExpanded: renderers.setSectionExpanded,\n setSelectedNode: renderers.setSelectedNode,\n },\n commandPaletteResources: createCommandPaletteResourceRegistry(),\n resources,\n views,\n viewMenus,\n settings: createSettingsRegistry({ hasView: (viewId) => Boolean(views.getView(viewId)) }),\n statusBar,\n statuses: createStatusRegistry(),\n shell,\n sidePanel,\n terminal: createWorkbenchTerminalController(),\n themes: createThemeRegistry(),\n fileIconThemes: createFileIconThemeRegistry(),\n\n getActiveResource() {\n return activeWorkbenchResource(core);\n },\n\n async dispose() {\n disposeLayoutPersistence(layoutCache.layout);\n await Promise.all([views.reads.dispose(), core.terminal.dispose()]);\n },\n\n onDidChangeActiveResource(listener) {\n return createDisposable(\n core.layout.store.subscribeSelector(\n (state) => state.layout.activeResourceKey,\n () => listener(core.getActiveResource()),\n ),\n );\n },\n\n getPrimaryResource() {\n return primaryWorkbenchResource(core);\n },\n\n onDidChangePrimaryResource(listener) {\n return createDisposable(\n core.pages.store.subscribeSelector(\n (state) => state.location?.resource,\n () => listener(core.getPrimaryResource()),\n ),\n );\n },\n\n registerChildModule(module) {\n return core.registerModule(module);\n },\n\n ...createWorkbenchModuleRegistry(() => core),\n };\n\n setWorkbenchRenderers(core, renderers);\n registerArrangementCommands(core);\n layout.store.subscribe(() => {\n const state = pages.store.getState();\n if (state.activeModeId) layoutCache.saveMode(state.projectId, state.activeModeId, layout.getLayout());\n });\n const breadcrumbSources = { breadcrumbs, locations: pageLocations, pages, navigationTrees, modes };\n connectWorkbenchPageBreadcrumbs({ ...breadcrumbSources, resources: pageResources });\n connectWorkbenchCoreState(core, input);\n\n return core;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["ResourceRef","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkbenchBreadcrumbItem","title","icon","indicator","startsLevel","url","onClick","resource","WorkbenchBreadcrumbChangeListener","WorkbenchBreadcrumbState","items","WorkbenchBreadcrumbController","store","setItems","clearItems","getItems","onDidChange","listener","createWorkbenchBreadcrumbController","name","initialState","undefined","setState","getState","unsubscribe","subscribeSelector","state","CommandParamSchema","WorkbenchCommandExecutionContext","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkbenchCommandPaletteChangeListener","open","WorkbenchCommandPaletteView","WorkbenchCommandParamsRequest","record","command","id","label","params","resourceMutation","CommandDefinition","args","context","WorkbenchCommandConfirmation","resolve","confirmed","WorkbenchCommandPaletteState","confirmation","view","initialQuery","paramsRequest","WorkbenchCommandPaletteOpenInput","WorkbenchCommandPaletteController","store","isOpen","getView","getInitialQuery","getParamsRequest","input","close","toggle","requestConfirmation","Promise","requestParams","request","clearParams","onDidChange","listener","CreateWorkbenchCommandPaletteControllerInput","initialOpen","createWorkbenchCommandPaletteController","internal","name","initialState","setOpenState","next","Pick","current","getState","setState","openInput","unsubscribe","subscribeSelector","state","value","resourceKey","OpenWidgetInput","RegisteredWidgetContribution","WorkbenchWidgetPlacement","buildUpdatedPlacement","placement","widget","update","next","viewId","undefined","resource","title","label","pinned","closable","mountStrategy","hiddenByDefault","tabRetention","tab","ownerId","source","role","createPlacement","widgetId","spec","contributionId","id","singleton","WorkbenchRegion","workbenchRegions","WorkbenchLayout","WorkbenchRegionState","WorkbenchWidgetPlacement","resolveUniqueWidgetId","createRegionState","id","visible","widgets","createDefaultWorkbenchLayout","regionVisibility","Partial","Record","createRegion","regions","nav","activity","sidenav","main","secondary","side","status","overlay","findLastWidgetIndex","widgetId","index","length","normalizeWidgetIds","layout","widgetIds","Set","activeWidgetId","activeResourceKey","region","Object","entries","originalActiveWidgetId","activeIndex","map","placement","contributionId","add","normalizedActiveWidgetId","resourceKey","mergeWithDefaultRegions","persisted","defaults","persistedRegions","fromEntries","flatMap","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","createDisposable","InternalWorkbenchStore","getActivePlacement","removePlacementsForContribution","PlaceholderContribution","RegisteredPlaceholderContribution","RegisteredWidgetContribution","WidgetContribution","WorkbenchLayout","WorkbenchLayoutStoreState","WorkbenchRegion","WorkbenchRegionSettings","CreateRegionQueriesInput","getLayout","getWidgets","getPlaceholder","regionId","getRegionSettings","createRegionQueries","input","getRegionSize","persistedSize","regions","size","placement","contributionSize","contributionId","regionSize","undefined","defaultPx","getRegionCollapsible","regionCollapsible","collapsible","getRegionHeaderBorderBottom","headerBorderBottom","createContributionLists","getPlaceholders","listPlaceholders","Object","values","sort","listWidgets","createContributionRegistrations","store","persistLayout","registerPlaceholder","placeholder","metadata","region","Error","priority","placeholderContribution","record","snapshot","getState","setState","placeholders","current","_removed","nextPlaceholders","registerWidget","widget","id","reuse","singleton","widgetContribution","widgets","nextWidgets","nextLayout","layout","LayoutModel","findPlacementByWidgetId","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","CreateLocationEstablisherInput","applyAndActivate","layout","regionId","placement","getLayout","getWidget","id","panelMethods","Pick","createLocationEstablisher","input","instanceId","found","Error","role","activatePanel","const","ownedPanelMenuIds","Set","contributionId","regions","Object","fromEntries","entries","map","region","widgets","candidate","widgetId","has","resourceKey","ownerResourceKey","getActivePanel","getActivePlacement","removeLocationSubPanelSelection","replaceRegionWidgets","WorkbenchLayout","WorkbenchTabPosition","WorkbenchWidgetPlacement","insertAtPosition","widgets","placement","position","next","unshift","push","targetWidgetId","beforeWidgetId","afterWidgetId","targetIndex","findIndex","candidate","widgetId","splice","placeWidget","tabRetention","persistentWidgets","filter","reorderWidgetPlacement","find","remaining","removePlacements","layout","shouldRemove","nextLayout","region","Object","values","regions","removed","length","active","id","clearActiveWidget","activePlacement","activeWidgetId","flatMap","undefined","activeResourceKey","expirePreviewTabsInLayout","ownerResourceKey","LayoutModel","buildUpdatedPlacement","replaceRegionWidgets","expirePreviewTabsInLayout","reorderWidgetPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","createLayoutPlacementMethods","input","getLayout","requireWidget","id","setLayout","layout","persistLayout","applyAndActivate","regionId","placement","Pick","updateWidgetPlacement","widgetId","update","region","Object","values","regions","index","widgets","findIndex","widget","contributionId","nextPlacement","nextLayout","map","current","currentIndex","Error","reorderWidget","position","some","expirePreviewTabs","ownerResourceKey","activateWidget","find","candidate","LayoutModel","closeWidgetInLayout","getActiveLocationPlacement","selectRegionActiveWidget","setLocationSubPanelSelection","mergeWithDefaultRegions","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchRegion","WorkbenchRegionState","workbenchPanelRegions","CreateLayoutRegionContentMethodsInput","defaultRegionVisibility","Partial","Record","getLayout","setLayout","layout","persistLayout","createLayoutRegionContentMethods","input","Pick","setRegionActiveWidget","regionId","widgetId","nextLayout","closeWidget","result","Error","closedPlacement","closable","activePlacement","removeWidgetPlacement","undefined","clearRegion","region","regions","activeWidgetId","cleared","widgets","next","activeResourceKey","includes","resetRegions","nextRegions","id","Object","entries","locationSubPanelSelections","activeLocationWidgetId","restoreLayout","LayoutModel","WorkbenchLayout","WorkbenchRegion","WorkbenchRegionState","CreateLayoutRegionMethodsInput","getLayout","setLayout","layout","persistLayout","createLayoutRegionMethods","input","Pick","updateRegion","regionId","update","region","regions","nextRegion","setRegionVisible","visible","setRegionSize","size","setSidePanelMode","mode","presentation","createDisposable","runWorkbenchEffect","createDefaultWorkbenchLayout","mergeWithDefaultRegions","WorkbenchLayout","WorkbenchRegion","carryPinnedWorkbenchChrome","current","incoming","regions","region","Object","values","pinned","widgets","filter","placement","role","length","contributionIds","Set","map","contributionId","incomingRegion","id","has","activeWidgetId","widgetId","carryWorkbenchRegionState","regionIds","regionId","resolveScopedLayout","defaultRegionVisibility","Partial","Record","persisted","createScopeEvent","listeners","value","T","notify","listener","subscribe","add","delete","runWorkbenchEffect","LayoutModel","LayoutPersistenceAdapter","LayoutScope","carryPinnedWorkbenchChrome","carryWorkbenchRegionState","createScopeEvent","resolveScopedLayout","WorkbenchLayout","WorkbenchRegion","CreateLayoutScopeMethodsInput","defaultRegionVisibility","Partial","Record","getLayout","persistence","setLayout","layout","action","createLayoutScopeMethods","input","currentScope","enteredWithLayout","undefined","willChangeScope","didChangeScope","persistLayout","setPersistenceScope","nextScope","scopeInput","notify","incoming","scopedLayout","withPinnedChrome","nextLayout","carryRegionState","getPersistenceScope","hasPersistedLayout","enteredWithPersistedLayout","onDidChangePersistenceScope","subscribe","onWillChangePersistenceScope","resourceKey","buildUpdatedPlacement","createPlacement","createUniqueWidgetId","findPlacement","findResourcePlacement","getActiveLocationPlacement","replaceRegionWidgets","placeWidget","OpenWidgetInput","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","CreateWidgetOpenersInput","getLayout","requireWidget","id","applyAndActivate","layout","regionId","placement","openOwnedPanelMenus","input","openWidget","openInput","widget","panelMenuId","ownedPanelMenuIds","panelMenu","pinned","role","viewId","rendererId","resource","title","region","label","findReusablePlacement","singleton","reuse","undefined","ownerResourceKey","Object","values","regions","index","widgets","findIndex","candidate","contributionId","withPlacementRole","panelMenuOwner","eligibleLocations","findReplacementIndex","activeWidgetId","activeLocationWidgetId","replaceWidgetId","widgetId","tabRetention","replaceActive","replacementWidgetId","defaultTabPosition","before","find","priority","beforeWidgetId","const","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","NonNullable","ReturnType","nextPlacement","updated","map","current","tabPosition","filter","replacementIndex","replacement","reuseExistingPlacement","withoutExisting","_current","clearActiveWidget","copy","splice","insertWidget","placementInput","fallbackRegion","previewContent","LayoutModel","closeWidgetInLayout","findPlacementByWidgetId","OpenWorkbenchPanelInput","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchLayoutStoreState","WorkbenchPanelRegion","WorkbenchRegion","workbenchPanelRegions","toOpenWidgetInput","toPanelContribution","toPanelInstance","defaultPanelTabRetention","widget","openInput","pinned","const","region","fallbackRegion","includes","CreatePanelLayoutMethodsInput","getLayout","getWidgets","listWidgets","persistLayout","placementMethods","Pick","setLayout","layout","widgetOpeners","createPanelLayoutMethods","input","getPanel","id","undefined","listPanels","map","listPanelInstances","placements","regions","widgets","Object","values","flatMap","candidate","getActivePanel","state","placement","find","widgetId","activeWidgetId","activeInstanceId","found","openPanel","Error","openWidget","updatePanel","instanceId","update","updateWidgetPlacement","reorderPanel","position","Parameters","reorderWidget","activatePanel","activateWidget","closePanel","closable","active","activePlacement","LayoutModel","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchPanelMenuRegion","WorkbenchPanelMenuSide","WorkbenchPanelRegion","WorkbenchWidgetPlacement","workbenchPanelMenuRegions","workbenchPanelRegions","GetWidget","contributionId","menuRegions","Object","values","flatMap","regions","menuSide","region","endsWith","ownerContributionId","getWidget","panelMenuOwner","ownerPlacement","layout","placement","widgets","find","candidate","undefined","MenuResolution","placements","changed","resolveMenuPlacements","moves","target","seen","Set","owner","push","has","add","found","bound","ownerResourceKey","resourceKey","reconcilePanelMenuOwnership","menuRegion","length","resolved","activeWidgetId","some","widgetId","move","CreateOwnedMenuMethodsInput","getLayout","openWidget","persistLayout","setLayout","createOwnedMenuMethods","input","reconcilePanelMenus","next","id","openInput","ContributionMetadata","createDisposable","Disposable","WidgetContribution","WorkbenchPanelContribution","WorkbenchPanelMenuContribution","WorkbenchPanelMenuDefinition","WorkbenchPanelRegion","workbenchPanelMenuRegions","workbenchPanelRegions","RegisteredPanelInput","WorkbenchPanelKind","RegisterPanelContributionInput","metadata","panel","registerWidget","widget","kind","CreatePanelRegistrationsInput","panelMenuContribution","menu","side","contribution","region","fallbackRegion","find","candidate","undefined","panelMenuOwner","level","contributionId","id","registerPanelContribution","input","panelMenus","panelContribution","registrations","length","includes","Error","registeredPanel","ownedPanelMenuIds","map","push","error","registration","reverse","dispose","createPanelRegistrations","registerPanel","eligibleLocations","registerPanelMenu","panelMenu","createWorkbenchStore","createContributionLists","createContributionRegistrations","createRegionQueries","createLocationEstablisher","CreateLayoutModelInput","LayoutModel","activateInLayout","removePlacementsForContribution","createLayoutPlacementMethods","createLayoutRegionContentMethods","createLayoutRegionMethods","resolveScopedLayout","createLayoutScopeMethods","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchLayoutStoreState","WorkbenchPanelInstance","WorkbenchRegion","WorkbenchWidgetPlacement","createWidgetOpeners","createPanelLayoutMethods","createOwnedMenuMethods","createPanelRegistrations","LayoutPersistenceAdapter","LayoutScope","OpenWidgetInput","OpenWorkbenchPanelInput","PlaceholderContribution","RegisteredPlaceholderContribution","WidgetContribution","WidgetMountStrategy","WidgetReusePolicy","WorkbenchCommandTarget","WorkbenchLocationEligibility","WorkbenchPanelContribution","WorkbenchPanelMenuContribution","WorkbenchPanelMenuDefinition","WorkbenchPanelMenuOwner","WorkbenchPanelMenuRegion","WorkbenchPanelMenuSide","WorkbenchPanelMountStrategy","WorkbenchPanelOpenStrategy","WorkbenchPanelRegion","WorkbenchPanelReusePolicy","WorkbenchPanelTab","WorkbenchRegionSettings","WorkbenchRegionSize","WorkbenchRegionState","WorkbenchSidePanelMode","WorkbenchTabAction","WorkbenchTabMenuGroup","WorkbenchTabMenuRow","WorkbenchTabPosition","WorkbenchTabRetention","WorkbenchTabSnapshot","WorkbenchWidgetRole","WorkbenchWidgetTab","createDefaultWorkbenchLayout","getWorkbenchPanelForMenuRegion","workbenchPanelMenuRegions","workbenchPanelRegions","workbenchRegions","LocationAwareLayoutModel","establishLocation","instanceId","requireRegisteredWidget","widgets","id","widget","Error","createLayoutModel","input","persisted","persistence","getLayout","undefined","initialLayout","defaultRegionVisibility","store","name","initialState","layout","placeholders","getState","getPlaceholders","getWidgets","getPlaceholder","regionId","regionQueries","getRegionSettings","contributionLists","scopeMethods","setLayout","action","setState","persistLayout","requireWidget","snapshot","regionMethods","regionContentMethods","applyAndActivate","placement","contributionRegistrations","panelRegistrations","registerWidget","widgetOpeners","placementMethods","panelMethods","listWidgets","ownedMenus","getWidget","openWidget","registerPlaceholder","unregisterWidget","options","current","_removed","nextWidgets","nextLayout","removePlacements","persist","getRegionSize","getRegionCollapsible","getRegionHeaderBorderBottom","listPlaceholders","reconcilePanelMenus","setPersistenceScope","getPersistenceScope","hasPersistedLayout","enteredWithPersistedLayout","onWillChangePersistenceScope","onDidChangePersistenceScope","WorkbenchModeRegistry","WorkbenchModeRegistryInternals","activatePageMode","modeId","applyLayout","modeRegistryInternals","WeakMap","setWorkbenchModeRegistryInternals","registry","internals","set","activateWorkbenchPageMode","get","Error","runWorkbenchEffect","WorkbenchModeActivationContext","WorkbenchModeContribution","seedModeScope","mode","context","establishLocation","instanceId","locationEstablished","unsubscribeMainPanel","undefined","establishSeededLocation","primary","layout","getActivePanel","placement","getLayout","regions","main","widgets","find","candidate","widgetId","role","store","subscribeSelector","state","id","seed","createDisposable","Disposable","createWorkbenchStore","runWorkbenchEffect","WorkbenchLayout","applyModePanelAvailability","disposeReverse","panelsForMode","restoreModeLayout","restoreUnscopedModeLayout","setWorkbenchModeRegistryInternals","CreateWorkbenchModeRegistryInput","WorkbenchModeActivationResult","WorkbenchModeContribution","WorkbenchModeRegistry","WorkbenchModeStoreState","seedModeScope","getWorkbenchModePanelForRegion","isWorkbenchModePanelAvailable","WorkbenchModeActivationContext","WorkbenchModeAddablePanel","WorkbenchModeAddablePanelContext","WorkbenchModeChangeListener","toDisposables","result","Array","isArray","createWorkbenchModeRegistry","input","store","name","initialState","modes","activeModeId","undefined","initializedModes","Map","seededScopes","Set","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","mode","has","id","disposables","activate","resolveContext","set","prepareScope","context","scopeKey","layout","getPersistenceScope","availableLayout","getLayout","reconcilePanelMenus","enteredWithPersistedLayout","establishLocation","add","reconcileScope","reconcile","transitionToMode","previousModeId","getState","unscoped","disposeActive","setState","Error","get","seed","activatePageMode","applyLayout","afterPublish","dispose","options","contextScope","createScope","enter","error","scopeSubscription","onDidChangePersistenceScope","registryDisposable","values","clear","registry","registerMode","snapshot","current","delete","startsWith","_removed","rest","getMode","listModes","Object","getActiveModeId","isTransitioning","setActiveMode","setActiveInput","deferSeed","seedActiveMode","onDidChangeActive","listener","unsubscribe","subscribeSelector","state","toDisposables","Disposable","LayoutModel","WidgetMountStrategy","WorkbenchPanelTab","WorkbenchRegion","WorkbenchWidgetRole","WorkbenchViewMenuRegistry","WorkbenchViewRegistry","WorkbenchPlacementPresentation","mountStrategy","hiddenByDefault","headerBorderBottom","tab","config","RegisterWorkbenchViewPlacementInput","id","viewId","region","role","singleton","closable","registerWorkbenchViewPlacement","layout","Pick","views","input","viewMenus","view","getView","Error","_role","_viewId","panel","registerPanel","title","icon","rendererId","panelMenus","definitionsFor","modePlacementContributionId","placementId","encodeURIComponent","pagePlacementContributionId","pageId","slotId","WorkbenchRegion","workbenchPanelRegions","isWorkbenchModePanelAvailable","WorkbenchModeContribution","modePlacementContributionId","WorkbenchCore","PanelDestinationPolicy","mode","movableTo","allowedRegions","allowedPanelDestinations","policy","filter","region","includes","panelDestinations","core","contributionId","widget","layout","getWidget","some","modeId","modes","getActiveModeId","getMode","undefined","declaration","modePlacements","listPlacements","find","p","id","legacyPanel","listAddablePanels","getLayout","resource","getPrimaryResource","panelId","resourceKey","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchPanelRegion","WorkbenchWidgetPlacement","getActiveLocationPlacement","isWorkbenchPanelPlacementVisible","isWorkbenchModePanelAvailable","WorkbenchModeAddablePanel","WorkbenchModeContribution","ResourceRef","allowedPanelDestinations","WorkbenchCompositionAddablePanel","contribution","open","resource","Promise","WorkbenchCompositionRegionPanels","addable","closable","WorkbenchCompositionController","panelsFor","region","CreateWorkbenchCompositionControllerInput","getActiveMode","getLayout","getResource","listWidgets","listOwnedAddablePanels","input","layout","mode","isOpenSingleton","widget","placements","singleton","some","placement","contributionId","id","scopedResourceKey","role","ownerResourceKey","addModePanels","Map","modePanels","widgets","panel","includes","allowedRegions","find","panelId","set","addRegisteredPanels","location","eligibleLocations","policy","has","undefined","createWorkbenchCompositionController","regions","listAddablePanels","values","filter","map","addModePanels","ContextKeyService","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","workbenchFocusRegions","const","WorkbenchFocusRegionId","WorkbenchFocusChangeListener","region","WorkbenchFocusState","activeRegion","WorkbenchFocusController","store","setActiveRegion","clearFocus","getActiveRegion","onDidChange","listener","CreateWorkbenchFocusControllerInput","context","isRegionFocusable","focusContextByRegion","activity","sidenav","main","secondary","side","status","Record","createWorkbenchFocusController","input","name","initialState","undefined","createScope","applyContext","set","focusRegion","getState","setState","unsubscribe","subscribeSelector","state","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","PageLocation","ResourceRef","NavigationTreeRegistry","NavigationTreeSlot","WorkbenchPageContribution","TreeViewSection","resolveNavigationLevels","LevelNavigationHost","modes","getActiveModeId","pages","store","getState","location","Readonly","Record","navigationTrees","getPrimaryResource","pinnedOnly","sections","filter","section","nodes","length","map","node","mergeSections","merged","Map","current","get","id","set","values","createLevelNavigation","host","queries","modeId","state","levels","Object","modeOwner","resolveOwner","kind","const","extensionId","owner","resource","getReadKey","JSON","stringify","getSections","slot","signal","AbortSignal","ordered","reverse","index","entries","throwIfAborted","read","push","getDefaultExpandedSectionIds","all","flatMap","PageLocation","PlacementIdentity","Disposable","createPagePreparation","WorkbenchPageOpenInput","WorkbenchPageRegistry","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","WorkbenchPageRuntimeState","WorkbenchPageLocationCommitInput","projectId","location","action","pageStates","Readonly","Record","WorkbenchPageCloseResolution","kind","target","locationChanged","parentId","WorkbenchPageRegistryInternals","resources","prepare","ReturnType","Value","publish","state","onDidCommit","listener","getPublishingState","connectRuntime","apply","activateLocation","input","refreshModePlacements","refreshShellPlacements","clearProject","resolveClosePlacement","identity","registryInternals","WeakMap","setWorkbenchPageRegistryInternals","registry","internals","set","getWorkbenchPageRegistryInternals","get","Error","NavigationTargetPage","PageLocation","PlacementIdentity","ResourceRef","isWorkbenchProjectUrl","WorkbenchStore","CreateWorkbenchPageLocationControllerInput","ResolvedPageLocation","WorkbenchPageBrowserEntry","WorkbenchPageLocationController","WorkbenchPageLocationDiagnostic","WorkbenchPageLocationHistoryState","WorkbenchPageNavigationResult","PageLocationControllerActionsInput","input","Value","historyStore","clearProject","projectId","resetHistory","rootLevelTarget","restore","source","useCurrentUrl","resolveUrl","entry","normalizeTarget","target","normalizeStored","location","locationsEqual","left","right","commit","resolved","history","action","fail","error","closePlacement","identity","removeResource","resource","retained","canGoBack","canGoForward","dispose","hasResolvableCurrentPageUrl","actions","Boolean","browser","current","createPageLocationControllerActions","setProject","registry","store","getState","undefined","isCurrentProjectUrl","url","hasCurrentPageUrl","boot","switchProject","navigate","Error","replay","navigateToParent","parent","navigateToRootLevel","goBack","back","goForward","forward","FileRendererSectionTarget","FileSourcePosition","NavigationTargetPage","PageLocation","PageRef","ResourceRef","isFileSourcePosition","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","canonicalPosition","isFrozen","createLocation","input","key","declaredParent","seen","Set","parentId","normalizeResolvedLocation","candidate","routeKey","has","add","inheritedParent","active","normalizePageTarget","target","open","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","resourceKey","PageLocation","serializeWorkbenchPageUrl","WorkbenchPageContribution","WorkbenchPageResourceCodec","workbenchPageLocationRouteKey","WorkbenchPageHistoryState","WorkbenchPageLocationDiagnostic","createPageHistoryEntry","input","pages","resources","projectId","location","index","url","state","kind","routeKey","createPageLocationFailureHandler","report","diagnostic","source","error","code","message","Error","String","ok","const","NavigationTargetPage","WorkbenchPageRegistryStoreState","ResolvedPageLocation","WorkbenchPageLocationController","WorkbenchPageNavigationResult","PageLocationPreparation","resolve","target","commit","state","Value","beforePublish","preparations","WeakMap","setPageLocationPreparation","controller","preparation","set","getPageLocationPreparation","get","Error","preparations","PageLocation","WorkbenchPageRegistryStoreState","WorkbenchPageRegistryInternals","batchWorkbenchChanges","runWorkbenchEffect","createPageHistoryEntry","CreateWorkbenchPageLocationControllerInput","createPageLocationPublisher","input","Value","internals","hooks","getIndex","commitIndex","index","push","entry","ReturnType","publish","rememberRootLevel","location","projectId","state","history","action","beforePublish","Error","nextIndex","browser","rootLevel","persistence","save","ok","const","PageLocation","ResourceRef","WorkbenchPageContribution","ProjectNavigationSources","resolveRootLevelLocation","ResolvedPageLocation","RootLevelLocationTrackerInput","levels","pages","normalize","location","resourceKey","resource","start","usesResource","matches","Boolean","parent","createRootLevelLocationTracker","input","saved","restore","remember","resolved","forget","removed","candidate","undefined","target","PageLocation","WorkbenchPageContribution","WorkbenchPageRegistry","WorkbenchPageResourceCodec","normalizeDirectWorkbenchPageLocation","ResolvedPageLocation","WorkbenchPageLocationDiagnostic","PageOwnerRemovalInput","registry","Value","pages","resources","normalizeStored","location","start","commit","projectId","resolved","history","action","fail","source","error","connectPageOwnerRemoval","input","store","subscribe","state","previous","removedPage","Object","keys","some","pageId","active","activePageId","undefined","id","resource","section","PageLocation","PageRef","PlacementIdentity","WorkbenchPageCloseResolution","ResolvedPageLocation","WorkbenchPageNavigationResult","PagePlacementCloserInput","commit","projectId","resolved","history","action","fail","source","error","getCurrent","location","getPageRef","pageId","normalizePage","page","normalizeStored","resolveClosePlacement","identity","createPagePlacementCloser","input","closeToParent","resolution","Extract","kind","contextualParent","parent","undefined","parentId","Error","pageStates","closeWithinPage","target","resource","section","open","locationChanged","current","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","workbenchPageLocationKey","WorkbenchPageContribution","WorkbenchPageResourceCodec","pageStateKey","page","location","resources","main","kind","id","position","undefined","removePageStates","states","Readonly","Record","State","pageId","Object","fromEntries","entries","filter","key","startsWith","PlacementIdentity","ResourceRef","placementIdentityKey","primarySlot","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","pageStateKey","removePageResource","state","Value","resource","resources","retained","key","value","toUri","normalize","removedKey","keep","Set","map","pageStates","Object","fromEntries","entries","stateKey","current","pageId","keys","pages","find","id","startsWith","resourceInstances","slotId","instances","filter","instance","has","kind","instanceKey","primary","remaining","activePrimaryInstanceKey","item","some","at","location","page","activePageId","undefined","active","section","parent","parentId","ref","PlacementIdentity","ResourceRef","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","removePageResource","normalizeWorkbenchPageLocation","workbenchPageLocationsEqual","ResolvedPageLocation","createPageResourceRemover","input","getState","Value","resources","forgetRootLevel","resource","commit","projectId","location","history","action","retained","current","next","changed","Object","values","pages","resolved","pageStates","PageLocation","isWorkbenchProjectUrl","parseWorkbenchPageUrl","getWorkbenchPageRegistryInternals","createWorkbenchStore","createPageLocationControllerActions","createPageHistoryEntry","createPageLocationFailureHandler","normalizeDirectWorkbenchPageLocation","normalizeWorkbenchPageLocation","normalizeWorkbenchPageTarget","workbenchPageLocationRouteKey","workbenchPageLocationsEqual","setPageLocationPreparation","createPageLocationPublisher","createRootLevelLocationTracker","CreateWorkbenchPageLocationControllerInput","ResolvedPageLocation","WorkbenchPageBrowserEntry","WorkbenchPageHistoryState","WorkbenchPageLocationController","WorkbenchPageLocationHistoryState","WorkbenchPageNavigationResult","connectPageOwnerRemoval","createPagePlacementCloser","createPageResourceRemover","PersistedWorkbenchPageLocation","WorkbenchPageLocationBrowser","WorkbenchPageLocationDiagnostic","WorkbenchPageLocationPersistence","isHistoryState","value","state","Partial","kind","index","projectId","routeKey","Boolean","location","createWorkbenchPageLocationController","input","Value","internals","registry","pages","listPages","historyIndex","maxHistoryIndex","historyStore","name","initialState","canGoBack","canGoForward","publishHistory","setState","resetHistory","fail","reportDiagnostic","historyEntry","resources","rootLevel","levels","normalize","normalizeStored","resourceKey","resource","toUri","start","publish","getIndex","commitIndex","push","entry","rememberRootLevel","remember","commit","resolved","history","action","prepare","pageId","open","section","pageStates","store","getState","target","page","startPage","resolveUrl","parsed","url","undefined","direct","contextual","directKey","contextualKey","restore","source","useCurrentUrl","browserEntry","browser","current","Math","max","hasProjectUrl","fromUrl","Error","persisted","persistence","load","saved","error","fallbackError","onPopState","popStateSubscription","pageRemovalSubscription","closeActivePlacement","getCurrent","getPageRef","getPage","ref","normalizePage","resolveClosePlacement","controller","clearProject","rootLevelTarget","normalizeTarget","active","locationsEqual","left","right","closePlacement","removeResource","forgetRootLevel","forget","dispose","resolve","beforePublish","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","runWorkbenchEffect","WorkbenchPanelMenuState","openByMenuId","Record","PersistedWorkbenchPanelMenuState","WorkbenchPanelMenuStatePersistenceAdapter","getMenuStates","scope","setMenuStates","state","WorkbenchPanelMenuStateChangeListener","WorkbenchPanelMenuStateController","store","isOpen","menuId","setOpen","open","toggle","setPersistenceScope","getPersistenceScope","onDidChange","listener","CreateWorkbenchPanelMenuStateControllerInput","persistence","createWorkbenchPanelMenuStateController","input","currentScope","persisted","resolveOpenByMenuId","name","initialState","persistState","getState","snapshot","setState","incoming","unsubscribe","subscribe","LayoutModel","WorkbenchSidePanelMode","createDisposable","Disposable","WorkbenchSidePanelChangeListener","mode","WorkbenchSidePanelController","canFloat","getMode","setMode","onDidChange","listener","CreateWorkbenchSidePanelControllerInput","layout","Pick","getFloatingPanels","onDidChangePolicy","initialMode","createWorkbenchSidePanelController","input","resolveMode","defaultPresentation","side","getLayout","regions","visible","presentation","setSidePanelMode","current","notify","next","unsubscribe","store","subscribe","policy","dispose","TerminalSessionAdapter","TerminalSessionError","TerminalSessionExit","TerminalSessionRequest","createWorkbenchStore","WorkbenchStore","WorkbenchTerminalSessionRequest","WorkbenchTerminalSessionExit","WorkbenchTerminalSessionError","WorkbenchTerminalSessionAdapter","WorkbenchTerminalSessionOpener","request","Promise","WorkbenchTerminalSessionStatus","WorkbenchTerminalSessionModel","id","title","status","exit","WorkbenchTerminalState","sessionsById","Record","WorkbenchTerminalSessionSink","onData","chunk","Uint8Array","onExit","onError","error","WorkbenchTerminalController","store","isAvailable","setSessionOpener","opener","open","input","bindingId","sessionId","write","data","resize","cols","rows","kill","signal","killBinding","subscribe","sink","getSession","listSessions","dispose","DEFAULT_SESSION_TITLE","SESSION_HISTORY_LIMIT","createWorkbenchTerminalController","name","initialState","adapters","Map","adapterDisposers","Array","dataHistory","dataSubscribers","Set","sessionIdByBindingId","bindingIdBySessionId","pendingSessionByBindingId","patchSession","patch","Partial","action","snapshot","getState","session","setState","requireAdapter","adapter","get","Error","cleanupSession","delete","disposers","publishData","history","push","length","shift","subscriber","has","pending","opened","catch","undefined","openSession","set","unsubscribeTitle","onTitle","next","unsubscribes","subscribers","add","unsubscribe","Object","values","running","filter","all","map","clear","ResourceRef","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","CommandPaletteResourceQueryContext","query","limit","signal","AbortSignal","CommandPaletteResourceResult","id","resource","label","description","icon","keywords","group","activate","Promise","CommandPaletteResourceProvider","title","refreshEventIds","context","CommandPaletteResourceProviderResult","providerId","results","CommandPaletteResourceRegistryStoreState","providers","Record","refreshToken","CommandPaletteResourceRegistry","store","registerProvider","provider","listProviders","queryProviders","refresh","createCommandPaletteResourceRegistry","name","initialState","snapshot","getState","Error","setState","current","_removed","rest","Object","values","all","map","ContextKeyService","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchCommandExecutionError","commandId","args","error","WorkbenchCommandExecutionErrorListener","event","WorkbenchCommandExecutionContext","resource","signal","AbortSignal","source","CommandParamOption","label","value","icon","CommandParamOptionSource","valueField","labelField","params","Record","CommandParamDescriptor","type","description","required","defaultValue","options","allowCustomValues","templateType","resourceType","providers","accept","multiple","metadata","resolvedFrom","CommandParamSchema","Command","id","category","when","resourceMutation","CommandDefinition","CommandHandler","prepareArgs","TArgs","context","onArgsChange","Promise","execute","TResult","isEnabled","isVisible","isToggled","RegisteredCommand","command","handler","CommandRegistryStoreState","commands","CommandRegistry","store","registerCommand","getCommand","listCommands","isCommandEnabled","isCommandVisible","isCommandToggled","prepareCommandArgs","executeCommand","onDidExecuteError","listener","CreateCommandRegistryInput","createCommandRegistry","input","name","initialState","errorListeners","Set","requireCommand","record","getState","Error","emitError","snapshot","setState","current","_removed","rest","Object","values","sort","matches","prepare","add","delete","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","CommandRegistry","MenuPath","MenuItem","commandId","sourceCommandId","label","description","icon","iconSrc","overflowLabel","when","group","order","args","readOnly","external","RegisteredMenuItem","path","MenuRegistryDeps","commands","menuPathKey","join","MenuRegistryStoreState","itemsByPath","Record","MenuRegistry","menuStore","registerMenuItem","item","metadata","listMenuItems","createMenuRegistry","deps","name","initialState","getCommand","Error","key","record","snapshot","getState","items","setState","current","list","filtered","filter","entry","length","sort","left","right","leftOrder","rightOrder","ResourceConstraint","ResourceRef","resourceMatchesConstraint","constraint","resource","kinds","some","kind","id","type","extensionId","SINGLE_RESOURCE_INSTANCE_KEY","PageOpenIntent","PlacementItem","contributionRefId","resourceKey","resourceMatchesConstraint","ResourceRef","SINGLE_RESOURCE_INSTANCE_KEY","WorkbenchPlacementPresence","WorkbenchOwnedPlacementItem","placementItemViewId","item","kind","view","binding","StaticPlacementOverride","OwnedResourceInstance","instanceKey","resource","open","title","OwnedPlacementState","staticOverrides","Map","resourceInstances","createOwnedPlacementState","isStaticPlacementOpen","state","id","presence","get","staticPlacementClosable","validateOwnedPlacementItem","label","kinds","length","Error","openStaticPlacement","input","set","closeStaticPlacement","retainResourceInstances","Extract","current","next","cardinality","existing","find","candidate","retained","filter","resourceInstanceKey","key","shown","instance","taken","Set","map","suffix","has","openResourcePlacement","type","const","closeOwnedPlacementInstance","updateResourcePlacementInstance","instances","undefined","clearOwnedPlacementState","delete","PageLocation","PageOpenIntent","PlacementIdentity","ResourceRef","Disposable","WorkbenchWidgetPlacement","ResolvedOwnedPlacement","OwnedPlacementState","openResourcePlacement","openStaticPlacement","WorkbenchOwnedPlacementItem","OwnedPlacementOpenInput","placementId","resource","open","title","OwnedPlacementLocationContext","modeId","pageId","projectId","location","OwnedPlacementPreparation","connectRuntime","listener","restore","context","state","previousContext","adopt","placements","getState","target","current","identity","resolve","apply","publish","preparations","WeakMap","setOwnedPlacementPreparation","registry","preparation","set","getOwnedPlacementPreparation","get","Error","prepareOwnedPlacement","input","label","item","identityFor","instanceKey","staticOverrides","Map","resourceInstances","operation","id","kind","PlacementIdentity","resourceMatchesConstraint","WorkbenchWidgetPlacement","OwnedPlacementState","WorkbenchOwnedPlacementItem","SINGLE_RESOURCE_INSTANCE_KEY","restoreOwnedPlacementState","input","state","declarations","id","item","saved","owns","identity","staticOverrides","Map","resourceInstances","placement","filter","candidate","placementIdentity","kind","placementId","set","length","binding","instances","flatMap","resource","instanceKey","cardinality","title","open","tabRetention","const","slice","DockedWorkbenchRegion","PageOpenIntent","PlacementIdentity","PlacementRef","createDisposable","Disposable","notifyWorkbenchChange","runWorkbenchEffect","createPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchWidgetPlacement","ResolvedOwnedPlacement","clearOwnedPlacementState","closeOwnedPlacementInstance","createOwnedPlacementState","isStaticPlacementOpen","placementItemViewId","staticPlacementClosable","updateResourcePlacementInstance","validateOwnedPlacementItem","WorkbenchOwnedPlacementItem","OwnedPlacementLocationContext","OwnedPlacementPreparation","prepareOwnedPlacement","setOwnedPlacementPreparation","restoreOwnedPlacementState","ResourceRef","WorkbenchViewMenuRegistry","modePlacementContributionId","registerWorkbenchViewPlacement","WorkbenchPlacementPresentation","WorkbenchViewRegistry","WorkbenchModePlacementContribution","id","ref","modeId","item","region","order","movableTo","OpenModePlacementTarget","panel","resource","open","WorkbenchModePlacementRegistry","registerPlacement","placement","getPlacement","listPlacements","openPlacement","input","updatePlacement","identity","title","closePlacement","resolvePlacements","context","onDidChange","listener","identityFor","instanceKey","kind","placementId","tabState","pinned","tabRetention","const","placementRefKey","JSON","stringify","extensionId","validatePlacement","placements","Map","refs","views","has","Error","refKey","includes","getView","copyPlacement","createWorkbenchModePlacementRegistry","getProjectId","loadLayout","viewMenus","getPanel","panelId","registerPanel","Parameters","state","listeners","Set","label","values","filter","sort","left","right","localeCompare","runtime","emitChange","resolve","view","contributionId","value","encodeURIComponent","viewId","role","closable","preparation","connectRuntime","undefined","getState","restore","current","projectId","saved","declarations","staticOverrides","resourceInstances","length","Object","regions","flatMap","widgets","owns","adopt","target","get","apply","next","publish","map","instance","registry","registered","singleton","binding","cardinality","set","delete","dispose","prepared","changed","update","add","identityFor","tabState","NavigationTargetPage","SdkNavigationTargetPage","NavigationTargetPanel","SdkNavigationTargetPanel","isNavigationTarget","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ShellPlacementRef","kind","id","NavigationTargetShellPanel","panel","resource","open","title","DistributiveOmit","PropertyKey","T","Omit","K","NavigationTargetCommand","commandId","args","NavigationTargetHref","href","NavigationTargetItem","NavigationTargetCompound","targets","NavigationTarget","NavigationParser","priority","canParse","location","parse","RegisteredNavigationParser","NavigationDispatcherContext","canOpenPanel","target","canExecuteCommand","prepareNavigation","commit","openPanelTarget","openPageTarget","executeCommand","Promise","openHref","byPriorityAndId","left","right","localeCompare","NavigationRegistryStoreState","parsers","Record","NavigationRegistry","store","registerParser","parser","metadata","listParsers","resolveLocation","openTarget","openPage","openPanel","navigate","CreateNavigationRegistryInput","resolveDispatcher","noDispatcher","Error","dispatchItem","dispatcher","validateItem","toItems","createNavigationRegistry","input","name","initialState","removeKey","record","key","_removed","rest","registry","snapshot","getState","parserContribution","setState","current","Object","values","sort","find","candidate","items","results","item","some","prepared","push","byPriorityAndId","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchNotificationLevel","WorkbenchNotificationAction","commandId","title","args","WorkbenchNotification","id","level","message","createdAt","resource","actions","metadata","Record","RegisteredWorkbenchNotification","WorkbenchNotificationEvent","type","notification","WorkbenchNotificationListener","event","WorkbenchNotificationStoreState","notifications","NotificationRegistry","store","show","dismiss","clear","listNotifications","subscribe","listener","createNotificationRegistry","name","initialState","listeners","Set","generatedId","emit","toString","record","Date","toISOString","snapshot","getState","setState","_removed","rest","ids","Object","keys","values","sort","left","right","localeCompare","add","delete","Disposable","LayoutModel","ResourceRef","WorkbenchViewMenuRegistry","registerWorkbenchViewPlacement","WorkbenchPlacementPresentation","WorkbenchViewRegistry","WorkbenchOverlayContribution","Omit","id","viewId","closable","OpenWorkbenchOverlayInput","resource","title","WorkbenchOverlayRegistry","registerOverlay","overlay","getOverlay","listOverlays","openOverlay","input","closeOverlay","instanceId","overlayContributionId","encodeURIComponent","createWorkbenchOverlayRegistry","layout","views","viewMenus","overlays","Map","registrations","has","Error","record","registration","region","role","singleton","set","dispose","get","delete","values","sort","left","right","localeCompare","openInput","openPanel","strategy","kind","removeWidgetPlacement","PageOpenIntent","ResourceRef","resourceMatchesConstraint","SINGLE_RESOURCE_INSTANCE_KEY","isPageSlotClosable","primarySlot","ResolvedPageSlot","WorkbenchPageContribution","WorkbenchPageOpenInput","WorkbenchPageRuntimeState","WorkbenchPageSlotInstance","requirePageSlot","emptyPageState","page","openStaticSlotIds","slots","filter","slot","item","kind","presence","map","id","resourceInstances","staticSlotOpen","state","includes","nextResourceInstances","current","instance","binding","cardinality","existing","find","candidate","instanceKey","open","openResourceSlot","input","target","resourceKey","resource","Error","type","section","role","activePrimaryInstanceKey","selectPrimaryTarget","pageResourceBindingSlots","openOn","openPageResourceBindings","reduce","pageId","setStaticSlotOpen","slotId","ids","Set","add","delete","removeResourceInstance","ClosePageSlotResult","activateInstanceKey","parentId","closePageSlot","remaining","length","previous","at","PlacementIdentity","ResourceRef","placementIdentityKey","WorkbenchPageCloseResolution","WorkbenchPageContribution","WorkbenchPageRegistryStoreState","closePageSlot","emptyPageState","requirePageSlot","resolvePagePlacementClose","input","identity","page","state","Value","resourceKey","resource","stateKey","kind","Error","activePageId","pageId","slot","slotId","exists","placements","some","candidate","pageState","pageStates","closedActivePrimary","role","activePrimaryInstanceKey","instanceKey","result","parentId","location","target","id","section","locationChanged","activeInstanceKey","activeInstance","resourceInstances","find","instance","open","PlacementIdentity","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","pageStateKey","pinPagePlacement","state","Value","identity","resources","open","kind","activePageId","pageId","Error","page","pages","key","location","current","pageStates","instances","resourceInstances","slotId","some","instance","instanceKey","filter","map","PlacementIdentity","ResourceRef","contributionRefId","ResolvedOwnedPlacement","SINGLE_RESOURCE_INSTANCE_KEY","isPageSlotClosable","PAGE_MAIN_SLOT_ID","pageSlots","ResolvedPageSlot","WorkbenchPageContribution","WorkbenchPagePlacementInput","WorkbenchPageRuntimeState","pageResourceBindingSlots","staticSlotOpen","pagePlacementIdentity","pageId","slotId","instanceKey","kind","pageFollowerIdentities","page","resource","resourceKey","filter","slot","region","index","slots","findIndex","candidate","map","id","item","binding","cardinality","validatePageSlots","ids","Set","has","Error","add","kinds","length","openOn","validateWorkbenchPage","ref","extensionId","path","startsWith","endsWith","main","document","metadataKey","trim","parentId","placementFor","input","resolvePagePlacement","value","Value","section","open","view","identity","order","role","viewId","closable","resolvePagePlacements","state","sharedPlacements","placements","isAvailable","push","instance","resourceInstances","some","placement","empty","presence","PlacementIdentity","createWorkbenchStore","composeOwnedPlacements","OwnedPlacementReconciliation","ResolvedOwnedPlacement","CreateWorkbenchPageRegistryInput","WorkbenchPageRegistryStoreState","WorkbenchPageRuntimeState","emptyReconciliation","Value","add","retain","update","activate","remove","PageRegistryCommitInput","pageStates","Readonly","Record","projectId","location","activePageId","activeModeId","modePlacements","action","createPageRegistryStore","input","name","initialState","pages","placements","shell","resolveShellPlacements","reconciliation","resolveModePlacementSet","current","modeId","desired","pageId","resolveModePlacements","undefined","refreshActiveModePlacements","state","registryInput","commit","next","refreshShellPlacements","emptyReconciliation","resourceKey","resourceIdentity","composeOwnedPlacements","ResolvedOwnedPlacement","reconcileOwnedPlacements","pageFollowerIdentities","pagePlacementIdentity","resolvePagePlacements","WorkbenchPageLocationCommitInput","PageRegistryCommitInput","resolveModePlacementSet","CreateWorkbenchPageRegistryInput","WorkbenchPageRegistryStoreState","WorkbenchPageSlotOpenInput","emptyPageState","openPageResourceBindings","openResourceSlot","primarySlot","requirePageSlot","selectPrimaryTarget","setStaticSlotOpen","pageStateKey","PreparedOwnedPlacements","shell","Value","mode","createPagePreparation","input","normalizeResource","resources","normalize","resource","Parameters","toUri","requirePage","current","pageId","page","pages","Error","compose","next","owned","activePageId","undefined","pageState","pageStates","location","activeModeId","validateMode","modePlacements","modeId","desired","projectId","resolveModePlacements","some","placement","identity","kind","resolveShellPlacements","composed","state","sharedPlacements","resolvePagePlacement","reconciliation","placements","activate","valuesEqual","target","normalizedTarget","stateKey","currentPageState","restorePageState","primaryState","openFollowers","id","activePrimaryInstanceKey","primary","instanceKey","followers","action","slot","slotId","role","resourceInstances","at","item","open","presence","resourceKey","resourceIdentity","ResourceRef","createDisposable","InternalWorkbenchStore","composeOwnedPlacements","OwnedPlacementReconciliation","reconcileOwnedPlacements","validateWorkbenchPage","CreateWorkbenchPageRegistryInput","WorkbenchPageContribution","WorkbenchPageRegistryStoreState","removePageStates","emptyReconciliation","Value","add","retain","update","activate","remove","registerWorkbenchPage","input","page","registryInput","store","publishState","state","action","normalizeResource","resource","resourceKey","current","getState","pages","id","Error","Object","values","some","candidate","ref","extensionId","path","registered","slots","map","slot","placementRegistration","registerPagePlacements","setState","reconciliation","snapshot","_page","pageStates","activePageId","placements","shell","resolveShellPlacements","location","undefined","activeModeId","desired","valuesEqual","dispose","createDisposable","batchWorkbenchChanges","composeOwnedPlacements","reconcileOwnedPlacements","resolvePagePlacementClose","pinPagePlacement","createPagePreparation","registerWorkbenchPage","setWorkbenchPageRegistryInternals","WorkbenchPageLocationCommitInput","createPageRegistryStore","PageRegistryCommitInput","refreshActiveModePlacements","refreshShellPlacements","CreateWorkbenchPageRegistryInput","WorkbenchPageRegistry","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","pageStateKey","WorkbenchPageContribution","WorkbenchPageMain","WorkbenchPageOpenInput","WorkbenchPagePlacementInput","WorkbenchPageRuntimeState","WorkbenchPageSlot","WorkbenchPageSlotInstance","WorkbenchPageSlotOpenInput","createWorkbenchPageRegistry","input","Value","normalizeResource","resource","Parameters","resources","normalize","resourceKey","toUri","store","runtime","state","publishingState","publishState","action","storeBeforeRuntime","getState","previousPublishingState","setState","requirePage","pageId","page","pages","Error","prepare","commit","next","compose","activatePageWithStates","target","location","registry","registerPage","registryInput","getPage","listPages","Object","values","sort","left","right","id","localeCompare","pinPlacement","identity","open","openSlot","slot","publish","onDidCommit","listener","api","subscribe","getPublishingState","connectRuntime","apply","error","undefined","refreshModePlacements","activateLocation","clearProject","projectId","current","placements","shell","resolveShellPlacements","pageStates","activePageId","activeModeId","reconciliation","desired","valuesEqual","resolveClosePlacement","kind","stateKey","ContributionMetadata","Disposable","LayoutModel","WorkbenchRegion","WorkbenchRegionSize","WorkbenchViewRegistry","WorkbenchPlaceholderContribution","id","viewId","title","region","regionSize","regionCollapsible","config","WorkbenchPlaceholderRegistry","registerPlaceholder","placeholder","metadata","createWorkbenchPlaceholderRegistry","input","layout","Pick","views","view","getView","Error","rendererId","PageOpenIntent","PlacementIdentity","createDisposable","Disposable","notifyWorkbenchChange","runWorkbenchEffect","createPlacement","RegisteredWidgetContribution","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","WorkbenchWidgetRole","ResolvedOwnedPlacement","ResourceRef","WorkbenchViewMenuRegistry","registerWorkbenchViewPlacement","WorkbenchPlacementPresentation","WorkbenchViewRegistry","clearOwnedPlacementState","closeOwnedPlacementInstance","createOwnedPlacementState","isStaticPlacementOpen","placementItemViewId","staticPlacementClosable","updateResourcePlacementInstance","validateOwnedPlacementItem","WorkbenchOwnedPlacementItem","OwnedPlacementLocationContext","OwnedPlacementPreparation","prepareOwnedPlacement","setOwnedPlacementPreparation","restoreOwnedPlacementState","WorkbenchShellPlacementContribution","id","item","region","order","OpenWorkbenchShellPlacementInput","placementId","resource","open","title","WorkbenchShellPlacementRegistry","registerPlacement","placement","getPlacement","listPlacements","openPlacement","input","updatePlacement","identity","closePlacement","resolvePlacements","context","onDidChange","listener","shellPlacementContributionId","encodeURIComponent","identityFor","instanceKey","kind","roleForRegion","tabState","pinned","tabRetention","const","createWorkbenchShellPlacementRegistry","views","viewMenus","getPanel","panelId","registerPanel","Parameters","activatePanel","instanceId","getLayout","getScope","resolveScope","loadLayout","enteredWithPersistedLayout","onDidChangePersistenceScope","placements","Map","state","listeners","Set","label","runtime","emitChange","restorePlacement","declarations","saved","Object","values","regions","flatMap","widgets","owns","resolve","panel","Error","value","viewId","role","closable","preparation","connectRuntime","undefined","getState","restore","current","previousContext","scope","previousScope","layout","adopt","_modeId","target","get","apply","next","publish","resourceInstances","map","instance","registry","has","getView","registered","singleton","binding","cardinality","set","delete","dispose","sort","left","right","localeCompare","prepared","changed","update","add","ContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","PreferenceScope","PreferenceValue","Record","PreferencePropertySchema","type","enum","default","scope","description","PreferenceSchemaContribution","properties","PreferenceScopeRef","scopeId","PreferencePersistenceAdapter","getValue","name","setValue","value","CreatePreferenceRegistryInput","persistence","RegisteredPreferenceSchema","ownerId","source","PreferenceRegistryStoreState","schemas","PreferenceRegistry","store","registerSchema","schema","metadata","getSchema","valueKey","createMemoryPreferencePersistence","values","Map","get","set","createPreferenceRegistry","input","initialState","registeredNames","Object","keys","snapshot","getState","Error","additions","property","setState","current","next","scoped","undefined","userValue","ControlsQueryResult","ControlValue","ControlValueMap","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","ControlsRendererRegion","ControlsRendererLayout","region","defaultPx","minPx","maxPx","ControlsUpdateValueInput","controlId","value","values","resource","ControlsApplyInput","ControlsResetInput","controlIds","ControlsRendererContribution","id","title","resourceKind","emptyTitle","emptyDescription","layout","defaultValues","executeQuery","signal","AbortSignal","Promise","updateValue","input","apply","reset","subscribe","listener","RegisteredControlsRendererContribution","ControlsRendererStoreState","renderers","Record","ControlsRendererRefreshEvent","controlsRendererId","ControlsRendererRefreshListener","event","ControlsRendererImplementation","CreateControlsRendererRegistryInput","rendererRegistry","ControlsRendererRegistry","controlsStore","registerControlsRenderer","contribution","metadata","setControlsRendererImplementation","impl","getControlsRenderer","listControlsRenderers","refreshControlsRenderer","onDidRefreshControlsRenderer","createControlsRendererRegistry","name","initialState","refreshListeners","Set","implementation","requireControlsRenderer","renderer","getState","Error","snapshot","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","nextRenderers","Object","sort","add","delete","DataTableRendererSettings","ViewFilterGroup","ViewSort","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","CollectionSavedView","CollectionViewsProvider","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","ViewToolbarAction","DataTableRendererThemeColor","light","dark","foreground","DataTableRendererColumnStat","type","bins","limit","DataTableRendererBadgePalette","DataTableRendererColumnRenderer","stops","Array","value","color","categories","palette","DataTableRendererColumn","id","label","groupable","filterable","description","icon","hidden","stat","renderer","DataTableRendererRow","values","Record","resource","DataTableRendererQueryResult","rows","columns","DataTableRendererQueryContext","modeId","filter","sorts","settings","DataTableRendererSavedView","DataTableRendererRowAction","commandId","destructive","run","row","Promise","DataTableRendererSelectionAction","DataTableRendererContribution","title","toolbarActions","resourceKind","selectionMode","selectionActions","rowActions","initialPageSize","pageSizeOptions","defaultSettings","Partial","defaultFilter","defaultSorts","defaultViews","defaultActiveViewId","viewsProvider","emptyTitle","emptyDescription","contextKeys","executeQuery","context","signal","AbortSignal","subscribe","listener","onRowActivate","RegisteredDataTableRendererContribution","DataTableRendererStoreState","renderers","DataTableRendererRefreshEvent","dataTableRendererId","DataTableRendererImplementation","input","DataTableRendererRegistry","dataTableStore","registerDataTableRenderer","contribution","metadata","setDataTableRendererImplementation","implementation","getDataTableRenderer","listDataTableRenderers","refreshDataTableRenderer","onDidRefreshDataTableRenderer","event","createDataTableRendererRegistry","rendererRegistry","name","initialState","refreshListeners","Set","next","snapshot","getState","Error","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","Object","sort","add","delete","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ResourceRef","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","FileRendererContent","fileName","filePath","mimeType","content","dataUrl","placeholder","editable","textRenderer","emptyState","title","description","revision","FileRendererRefreshOrigin","rendererId","instanceId","operationId","FileRendererRefreshEnvelope","resourceKey","origin","FileRendererSaveResult","FileRendererContribution","id","resourceKind","load","resource","signal","AbortSignal","Promise","save","RegisteredFileRendererContribution","FileRendererStoreState","renderers","Record","FileRendererRefreshEvent","fileRendererId","FileRendererRefreshListener","event","FileRendererImplementation","input","CreateFileRendererRegistryInput","rendererRegistry","FileRendererRegistry","fileRendererStore","registerFileRenderer","contribution","metadata","setFileRendererImplementation","impl","getFileRenderer","listFileRenderers","refreshFileRenderer","onDidRefreshFileRenderer","listener","createFileRendererRegistry","name","initialState","refreshListeners","Set","implementation","requireFileRenderer","renderer","getState","Error","snapshot","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","nextRenderers","Object","values","sort","envelope","add","delete","ViewFilterGroup","ViewSort","ContributionMetadata","RegisteredContributionMetadata","byContributionPriority","normalizeContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","AttributeDescriptor","AttributesSource","BoardColumnConfig","KanbanRendererCreateRowConfig","KanbanRendererCreateSubmission","KanbanRendererRow","KanbanRendererSavedView","KanbanRendererSettings","KanbanRendererViewsProvider","ResourceContextAction","WorkbenchPanelRenderInput","WorkbenchRendererRegistry","ViewToolbarAction","KanbanRendererQueryState","settings","filter","sorts","KanbanRendererContribution","id","title","toolbarActions","listRowActions","Pick","resourceKind","storageScope","attributes","TNode","getBoardColumnConfig","groupKey","TIcon","hideToolbar","emptyTitle","emptyDescription","defaultSettings","Partial","defaultFilter","defaultSorts","viewsProvider","defaultViews","defaultActiveViewId","executeQuery","state","signal","AbortSignal","Promise","TRow","subscribe","listener","onRowActivate","row","getRowContextMenuActions","onAttributeChange","rowId","attributeId","value","onReorder","beforeRowId","createRow","onCreateRow","submission","onColumnAction","columnId","actionId","RegisteredKanbanRendererContribution","KanbanRendererStoreState","renderers","Record","KanbanRendererRefreshEvent","kanbanRendererId","KanbanRendererRefreshListener","event","KanbanRendererImplementation","input","CreateKanbanRendererRegistryInput","rendererRegistry","KanbanRendererRegistry","dataStore","registerKanbanRenderer","contribution","metadata","setKanbanRendererImplementation","impl","getKanbanRenderer","listKanbanRenderers","refreshKanbanRenderer","onDidRefreshKanbanRenderer","createKanbanRendererRegistry","name","initialState","refreshListeners","Set","implementation","requireKanbanRenderer","renderer","getState","Error","snapshot","record","setState","rendererDisposable","registerRenderer","render","rendererInput","dispose","current","_removed","nextRenderers","Object","values","sort","add","delete","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkbenchCore","PlaceholderContribution","RegisteredPlaceholderContribution","WorkbenchPanelContribution","WorkbenchPanelInstance","WorkbenchPanelRenderInput","workbench","panel","instance","refresh","WorkbenchRendererRegistration","id","render","input","WorkbenchRendererChangeListener","WorkbenchRendererStoreState","renderers","Record","refreshKeys","WorkbenchRendererRegistry","store","registerRenderer","renderer","getRenderer","listRenderers","refreshRenderer","onDidChange","listener","CreateWorkbenchRendererRegistryInput","initialRenderers","createWorkbenchRendererRegistry","name","initialState","registry","snapshot","getState","Error","setState","current","_removed","_refreshKey","Object","values","subscribeSelector","state","byContributionPriority","normalizeContributionMetadata","createDisposable","createWorkbenchStore","CreateTreeRendererRegistryInput","RegisteredTreeRendererContribution","TreeRendererContribution","TreeRendererImplementation","TreeRendererRefreshListener","TreeRendererRegistry","TreeRendererState","TreeRendererStoreState","createDefaultState","view","expandedNodeIds","defaultExpandedNodeIds","expandedSectionIds","defaultExpandedSectionIds","mergeDefaultSections","state","missing","filter","id","includes","length","toggleId","ids","expanded","value","createTreeRendererRegistry","input","rendererRegistry","persistence","persisted","getTreeStates","treeStore","name","initialState","trees","statesByTreeId","refreshKeysByTreeId","refreshListeners","Set","implementation","requireTree","tree","getState","Error","ensureState","current","existing","fresh","setState","persistStates","Record","Object","entries","loading","_loading","persistable","setTreeStates","updateState","update","action","next","snapshot","registry","setTreeRendererImplementation","impl","registerTreeRenderer","metadata","record","persistedState","nextState","rendererDisposable","registerRenderer","render","rendererInput","treeId","dispose","_removed","nextTrees","_removedState","nextStates","_removedRefresh","nextRefresh","getTreeRenderer","listTreeRenderers","values","sort","getBody","ctx","getTreeState","refresh","setSelectedNode","nodeId","getHeader","getFooter","getChildren","node","selectedNodeId","setNodeExpanded","nextIds","setSectionExpanded","sectionId","setLoading","event","listener","onDidRefresh","add","delete","RendererReadRequest","queryKey","load","signal","AbortSignal","publish","value","T","Promise","onProgress","onValue","onError","error","ReadJob","token","generation","run","ReadOwner","binding","pending","active","controller","AbortController","settled","queued","waiters","Set","RendererReadBinding","request","reason","dispose","RendererReadRegistry","bind","key","createRendererReadRegistry","owners","Map","disposed","release","owner","finish","clear","get","delete","isCurrent","job","schedule","queueMicrotask","undefined","resolve","then","catch","aborted","finally","Error","set","abort","Symbol","completed","add","throwIfAborted","reading","push","allSettled","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","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","createSettingsRegistry","input","hasView","initialState","collectionItems","Map","itemKey","JSON","stringify","clear","snapshot","getState","setState","Error","record","current","_removed","nextSections","nextPanels","keys","startsWith","delete","Object","values","sort","undefined","find","candidate","set","get","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","runWorkbenchEffect","WorkbenchStatusBarSlot","WorkbenchStatusBarItem","id","viewId","slot","order","isVisible","WorkbenchStatusBarRegistryState","items","Record","WorkbenchStatusBarPersistenceAdapter","getOrder","setOrder","ids","WorkbenchStatusBarPosition","beforeItemId","afterItemId","WorkbenchStatusBarRegistry","store","registerItem","item","getItem","listItems","listVisibleItems","reorderItem","position","CreateWorkbenchStatusBarRegistryInput","hasView","persistence","bySlotOrderAndId","left","right","localeCompare","createStatusBarRegistry","input","name","initialState","getState","rank","Map","map","index","Object","values","sort","leftRank","get","Infinity","rightRank","current","Error","undefined","Number","isFinite","setState","snapshot","_removed","targetId","target","Set","entry","filter","splice","indexOf","byContributionPriority","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","WorkflowStatus","id","label","color","icon","sortOrder","isDefault","actions","WorkflowStatusAction","WorkbenchStatusSetContribution","title","query","Promise","save","statuses","RegisteredWorkbenchStatusSet","WorkbenchStatusRegistryState","statusSets","Record","values","WorkbenchStatusRegistry","store","registerStatusSet","contribution","metadata","getStatusSet","listStatusSets","getStatuses","load","validateStatusActions","set","status","actionIds","ReadonlySet","actionId","has","Error","validateStatuses","ids","Set","map","action","defaultCount","trim","add","Number","isFinite","sort","left","right","localeCompare","createStatusRegistry","name","initialState","requireSet","getState","loadingById","Map","current","setState","record","delete","snapshot","_removed","_removedValues","Object","cached","resolve","existing","get","loading","finally","input","saved","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","FileIconThemePreferenceOption","WorkbenchFileIconThemeStoreState","themes","FileIconThemeRegistry","store","register","listThemes","createFileIconThemeRegistry","name","initialState","groups","Set","sync","setState","flat","add","delete","getState","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ThemePreferenceOption","WorkbenchThemeStoreState","themes","ThemeRegistry","store","register","listThemes","createThemeRegistry","name","initialState","groups","Set","sync","setState","flat","add","delete","getState","createDisposable","Disposable","WorkbenchPanelMenuDefinition","WorkbenchRegionSize","WorkbenchViewRegistry","WorkbenchViewMenuContribution","id","ownerViewId","viewId","side","priority","mountStrategy","hiddenByDefault","regionSize","regionCollapsible","headerBorderBottom","config","WorkbenchViewMenuRegistry","registerViewMenu","menu","getViewMenu","listViewMenus","definitionsFor","placementId","viewMenuPanelId","menuId","encodeURIComponent","viewMenuConfig","undefined","viewContextId","Array","isArray","value","createWorkbenchViewMenuRegistry","input","views","menus","Map","has","Error","getView","record","set","get","delete","values","filter","map","view","title","icon","rendererId","ContributionMetadata","normalizeContributionMetadata","RegisteredContributionMetadata","createDisposable","Disposable","createWorkbenchStore","WorkbenchStore","ControlsRendererContribution","DataTableRendererContribution","FileRendererContribution","KanbanRendererContribution","WorkbenchRendererRegistration","TreeRendererContribution","createRendererReadRegistry","RendererReadRegistry","workbenchViewIdContextKey","NativeViewBody","kind","Kind","Omit","Contribution","WorkbenchReactViewBody","render","WorkbenchViewBody","WorkbenchViewContribution","id","title","icon","body","RegisteredWorkbenchView","WorkbenchViewRegistryStoreState","views","Record","WorkbenchViewRegistry","reads","store","registerView","view","metadata","getView","viewId","listViews","refreshView","input","CreateWorkbenchViewRegistryInput","registerBody","refresh","byPriorityAndId","left","right","priority","localeCompare","createViewRegistry","name","initialState","bodies","Map","snapshot","getState","Error","set","record","setState","current","_removed","dispose","delete","Object","values","sort","refreshInput","get","WorkbenchPanelRegion","WorkbenchTabPosition","WorkbenchCore","registerArrangementCommands","core","commands","registerCommand","id","label","category","icon","execute","resetLayout","instanceId","region","position","params","type","required","options","value","args","movePanel","NavigationTarget","PlacementIdentity","contributionRefId","WorkbenchLayout","WorkbenchPanelRegion","placementIdentityKey","WorkbenchOwnedPlacementItem","shellPlacementContributionId","ResourceRef","modePlacementContributionId","pagePlacementContributionId","resourceMatchesConstraint","runUserAction","WorkbenchCore","WorkbenchCompositionAddablePanel","panelDestinations","ownsPlacement","layout","target","matches","identity","Object","values","regions","filter","region","id","some","widgets","placement","placementIdentity","activateModePlacementInstance","core","instance","getLayout","flatMap","find","candidate","movePanel","widgetId","activatePanel","AddablePanelInput","modeId","resource","AddPanel","panelId","open","openPlacementAddTarget","kind","commands","executeCommand","command","params","source","navigation","openTarget","active","getActivePanel","instanceId","canAddItem","item","binding","add","Boolean","getCommand","isCommandVisible","isCommandEnabled","addShellPanels","input","shellPlacements","listPlacements","includes","presence","multiple","cardinality","isOpen","placementId","openPlacement","addModePanels","modePlacements","panel","ref","addPagePanels","pageState","pages","store","getState","page","activePageId","getPage","undefined","slot","slots","isAvailable","pageId","slotId","openSlot","opened","p","activeWidgetId","contributionId","createOwnedAddablePanels","addable","contribution","getWidget","push","PageSlotRef","PlacementIdentity","WorkbenchRegion","WorkbenchWidgetPlacement","placementIdentityKey","NavigationTargetPage","NavigationTargetPanel","WorkbenchPageRegistryStoreState","getWorkbenchPageRegistryInternals","OwnedPlacementState","getOwnedPlacementPreparation","batchWorkbenchChanges","WorkbenchCore","getPageLocationPreparation","NavigationOperation","placementContext","state","activeModeId","modeId","pageId","activePageId","projectId","location","undefined","requirePanelPage","panel","page","Object","values","pages","find","ref","extensionId","id","Error","prepareSharedPanel","core","target","modeState","shellState","kind","placement","modePlacements","getPlacement","prepared","open","placementId","resource","identity","shellPlacements","title","prepareWorkbenchNavigation","targets","length","locations","pageLocations","mode","shell","original","store","getState","originalMode","originalShell","proposed","activate","Map","owned","resolve","resolved","restore","prepare","section","action","slot","slotId","modes","getActiveModeId","compose","reconciliation","set","region","present","Set","placements","map","final","filter","has","commit","applyOwners","apply","publishWithoutLocation","publish","result","activateModePlacementInstance","prepareWorkbenchNavigation","WorkbenchRegion","createNavigationRegistry","NavigationTargetPanel","NavigationTargetShellPanel","WorkbenchCore","PageSlotPanelRef","Extract","kind","findPagePanelOwner","core","panel","pages","listPages","find","candidate","ref","extensionId","page","id","canOpenCorePanel","target","Boolean","shellPlacements","getPlacement","modePlacements","slots","some","slot","revealPanelRegion","region","shell","setRegionOpen","sidePanel","getMode","setMode","openPageSlotTarget","store","getState","activePageId","Error","openSlot","pageId","slotId","resource","open","revealActivePanelRegion","fallback","layout","getLayout","actual","Object","values","regions","widgets","widget","widgetId","activeWidgetId","openModePlacementTarget","placement","modeId","modes","getActiveModeId","identity","openPlacement","openShellPlacementTarget","placementId","title","openCorePanelTarget","createCoreNavigationRegistry","resolveCore","resolveDispatcher","prepareNavigation","targets","canOpenPanel","canExecuteCommand","commandId","commands","getCommand","openPanelTarget","openPageTarget","result","pageLocations","navigate","ok","diagnostic","message","executeCommand","args","openHref","href","globalThis","activateInLayout","findPlacementByWidgetId","removeLocationSubPanelSelection","selectRegionActiveWidget","insertAtPosition","WorkbenchPanelRegion","WorkbenchTabPosition","workbenchPanelRegions","batchWorkbenchChanges","revealPanelRegion","WorkbenchCore","panelDestinations","createPanelArrangement","resolve","getPanelDestinations","instanceId","core","found","layout","getLayout","placement","contributionId","movePanel","destination","position","Error","some","region","regionId","includes","source","regions","remaining","widgets","filter","t","widgetId","target","next","activeWidgetId","index","visible","selected","role","restoreLayout","activeResourceKey","resourceKey","activeLocationWidgetId","reconcilePanelMenus","PlacementIdentity","placementIdentityKey","WorkbenchCore","createPlacementCloseController","resolveCore","identity","core","key","placement","Object","values","layout","getLayout","regions","flatMap","region","widgets","find","item","placementIdentity","Error","closable","kind","result","pageLocations","closePlacement","ok","diagnostic","message","modePlacements","shellPlacements","PlacementIdentity","placementIdentityKey","WorkbenchCore","createPlacementPinController","resolveCore","identity","pinned","core","key","placement","Object","values","layout","getLayout","regions","flatMap","region","widgets","find","item","placementIdentity","Error","open","tabRetention","kind","pages","pinPlacement","modePlacements","updatePlacement","shellPlacements","dockedWorkbenchRegions","PlacementIdentity","activateInLayout","findPlacementByWidgetId","getActiveLocationPlacement","removeLocationSubPanelSelection","WorkbenchLayout","WorkbenchRegion","WorkbenchWidgetPlacement","workbenchRegions","composeOwnedPlacements","placementIdentityKey","ResolvedOwnedPlacement","WorkbenchOwnedWidgetPlacement","ReconcileOwnedWidgetLayoutInput","layout","modeLayout","placements","activate","ApplyOwnedWidgetLayoutReconciliationInput","remove","RenderedOwnedPlacement","identity","region","placement","transferredFromKey","bindsToLocation","value","role","kind","Boolean","resourceKey","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","modePositions","modes","modeIndex","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","shell","mode","page","add","currentOwner","push","reconcileRegions","removedKeys","docked","desiredByKey","flatMap","regionId","pageOwnsPrimaryLocation","some","entry","placedKeys","savedWidgetOrder","replacement","activeWidgetId","opensPreviouslyEmptyRegion","hiddenByDefault","visible","normalizeRemovedState","activeLocation","activeLocationWidgetId","fallbackLocation","active","fallbackActive","activeResourceKey","bindOwnedSubPanelsToLocation","fromEntries","desiredPlacement","updateOwnedWidgetLayout","size","desiredByIdentity","reconcileOwnedWidgetLayout","keys","applyOwnedWidgetLayoutReconciliation","dockedWorkbenchRegions","reconcileOwnedWidgetLayout","getWorkbenchPageRegistryInternals","emptyPageState","pageStateKey","clearOwnedPlacementState","getOwnedPlacementPreparation","createDisposable","batchWorkbenchChanges","WorkbenchCore","resetWorkbenchLayout","core","current","pages","store","getState","page","activePageId","undefined","projectId","location","mode","modePlacements","shell","shellPlacements","modeState","staticOverrides","Map","resourceInstances","shellState","declaration","listPlacements","activeModeId","id","includes","region","internals","next","prepare","pageId","resource","action","pageStates","resources","resolve","layout","getLayout","defaults","getInitialState","cleared","regions","Object","fromEntries","entries","map","widgets","activeWidgetId","locationSubPanelSelections","activeLocationWidgetId","apply","restoreLayout","placements","activate","reconciliation","p","identity","publish","createLayoutResetController","listeners","Set","resetLayout","listener","onDidResetLayout","add","delete","PlacementIdentity","ResourceRef","resourceKey","placementIdentityKey","getOwnedPlacementPreparation","batchWorkbenchChanges","WorkbenchCore","removeWorkbenchResource","core","resource","retained","projectId","pages","store","getState","retainedKeys","Set","map","kind","const","registry","modePlacements","shellPlacements","preparation","state","resourceInstances","Map","placementId","instances","filter","instance","identity","instanceKey","modeId","listPlacements","find","placement","id","has","apply","pageLocations","removeResource","isLocalizedString","NavigationTargetPage","PageLocation","PageRef","NavigationTreeRegistry","WorkbenchPageContribution","WorkbenchPageRegistry","WorkbenchPageResourceCodec","getWorkbenchPageRegistryInternals","createDisposable","WorkbenchBreadcrumbController","WorkbenchBreadcrumbItem","leavesProjectNavigation","NavigationLevelModes","WorkbenchPageLocationController","pageRefKey","ref","extensionId","id","locationsFromRoot","location","parent","targetFromLocation","kind","page","resource","section","pageTitle","title","undefined","default","$l10n","createWorkbenchPageBreadcrumbItems","input","pages","navigationTrees","modes","resources","navigate","target","openPanel","pageId","slotId","pagesByRef","Map","map","locations","index","get","item","label","icon","startsLevel","normalize","landingPanel","main","slots","find","slot","region","presence","length","onClick","setWorkbenchPageBreadcrumbs","breadcrumbs","setItems","connectWorkbenchPageBreadcrumbs","ownedBreadcrumbs","dispose","sync","state","store","getState","activePageId","Object","values","openSlot","subscription","onDidCommit","PersistedWorkbenchPageLocation","WorkbenchPageBrowserEntry","WorkbenchPageLocationBrowser","WorkbenchPageLocationPersistence","createMemoryWorkbenchPageLocationBrowser","entries","url","index","listeners","Set","entry","notify","listener","current","push","splice","length","replace","back","forward","onPopState","add","dispose","delete","createMemoryWorkbenchPageLocationPersistence","locations","Map","load","projectId","get","save","persisted","set","contributionRefId","defaultPageResourceCodec","resourceKey","LayoutModel","WorkbenchRegion","createPlacement","WorkbenchLayout","WorkbenchWidgetPlacement","applyOwnedWidgetLayoutReconciliation","reconcileOwnedWidgetLayout","placementIdentityKey","WorkbenchModePlacementRegistry","WorkbenchModeRegistry","activateWorkbenchPageMode","isPageSlotClosable","pagePlacementDeclarations","CreateWorkbenchPageRegistryInput","createWorkbenchPageRegistry","WorkbenchPagePlacementInput","WorkbenchPageRegistry","WorkbenchPageRegistryStoreState","WorkbenchPageResourceCodec","getWorkbenchPageRegistryInternals","createOwnedPlacementState","getOwnedPlacementPreparation","WorkbenchShellPlacementRegistry","WorkbenchViewMenuRegistry","pagePlacementContributionId","registerWorkbenchViewPlacement","WorkbenchViewRegistry","createDisposable","ConnectWorkbenchPageRuntimeInput","loadModeLayout","projectId","modeId","beforeApply","state","revealRegion","region","layout","modes","registry","syncOwnedPanelMenus","ownedPlacements","Object","values","getLayout","regions","flatMap","widgets","filter","placement","Boolean","placementIdentity","owner","getWidget","contributionId","menuId","ownedPanelMenuIds","menu","openWidget","pinned","role","viewId","rendererId","resource","title","endsWith","label","reconcilePanelMenus","bindPlacementsToActivePageLocation","ownerResourceKey","location","placements","map","value","identity","kind","applyPageState","input","source","storeBeforeTransition","store","getState","previousScope","getPersistenceScope","activeModeId","stored","latest","activation","reconciliation","activate","length","layoutInput","modeLayout","undefined","ReturnType","remove","restoreLayout","connectWorkbenchPageRuntime","applyingTransition","runtime","connectRuntime","scope","onDidChangePersistenceScope","dispose","toTabState","open","tabRetention","const","toWidgetPlacement","views","view","getView","Error","panelId","pageId","slotId","panel","encodeURIComponent","closable","section","CreateLiveWorkbenchPageRegistryInput","restorePageState","modePlacements","shellPlacements","resources","viewMenus","createLiveWorkbenchPageRegistry","validateMode","getMode","resolveShellPlacements","context","resolvePlacements","resolveModePlacements","resolvePagePlacement","valuesEqual","left","right","JSON","stringify","registerPagePlacements","page","registrations","slot","item","binding","id","singleton","cardinality","registration","reverse","shell","apply","adopt","mode","refreshModePlacements","refreshShellPlacements","defaultPageResourceCodec","PageLocation","WorkbenchLayout","pageSlots","WorkbenchPageContribution","WorkbenchPageRuntimeState","WorkbenchPageSlotInstance","SINGLE_RESOURCE_INSTANCE_KEY","resourceMatchesConstraint","createWorkbenchInput","WorkbenchPagePersistenceScopeInput","pageStateFromLayout","page","layout","placements","Object","values","regions","flatMap","region","widgets","openStaticSlotIds","resourceInstances","Record","activePrimaryInstanceKey","slot","matching","filter","placement","placementIdentity","kind","pageId","id","slotId","item","length","push","binding","instances","identity","resource","instanceKey","cardinality","section","open","tabRetention","const","slice","role","active","find","activeLocationWidgetId","widgetId","instance","undefined","loadWorkbenchLocationLayout","input","context","scope","resolvePagePersistenceScope","persistence","getSnapshot","layoutPersistence","getLayout","createPageStateRestorer","location","projectId","modeId","some","ResourceRef","resourceKey","LayoutPersistenceAdapter","WorkbenchLayout","WorkbenchWidgetPlacement","workbenchRegions","runWorkbenchEffect","createWorkbenchInput","selectPlacements","layout","include","placement","regions","id","region","widgets","filter","activeWidgetId","some","widget","widgetId","undefined","modeScope","projectId","modeId","JSON","stringify","createWorkbenchLayoutCache","input","scopes","Set","adapter","persistence","getLayout","scope","getSnapshot","setLayout","setSnapshot","flush","dispose","layoutPersistence","read","add","write","removeResource","resource","snapshot","p","placementIdentity","kind","savedWidgetOrder","map","readMode","saveMode","LayoutModel","WorkbenchRegion","createDisposable","Disposable","WorkbenchSidePanelController","WorkbenchSidePanelMode","WorkbenchSidePanelPresentation","WorkbenchShellOpenRegion","WorkbenchShellRegionState","open","size","WorkbenchShellController","getRegionState","region","setRegionOpen","setRegionSize","getSidePanelPresentation","setSidePanelPresentation","presentation","onDidChange","listener","createWorkbenchShellController","input","layout","sidePanel","state","getLayout","regions","visible","setMode","getMode","setRegionVisible","sidePanelMode","notify","nextLayout","nextSidePanelMode","unsubscribeLayout","store","subscribeSelector","sidePanelSubscription","dispose","resourceKey","LayoutModel","getAnchorResource","reconcileAnchors","ResourceRef","ResourceRegistry","createDisposable","Disposable","createScopedIsInScope","resources","resource","hasProvider","listProviders","some","provider","kind","type","listResources","entry","CreatePrimaryCoordinatorInput","layout","isInScope","primary","createPrimaryCoordinator","changingPersistenceScope","willChangeScope","onWillChangePersistenceScope","didChangeScope","onDidChangePersistenceScope","unsubscribe","store","subscribe","state","previous","previousPrimaryKey","action","removeWidgetPlacement","widgetId","dispose","WorkbenchShellOpenRegion","KeybindingSequence","workbenchCommandPaletteMenuPath","WorkbenchCore","SIDENAV_PANEL_ID","togglePanel","workbench","region","shell","setRegionOpen","getRegionState","open","BuiltinCommand","id","label","icon","keybinding","execute","builtinCommands","commandPalette","toggle","initialQuery","view","pageLocations","goBack","goForward","registerWorkbenchBuiltIns","command","commands","registerCommand","category","when","keybindings","registerKeybinding","action","kind","commandId","layout","registerMenuItem","group","createWorkbenchCompositionController","createOwnedAddablePanels","createPrimaryCoordinator","createScopedIsInScope","workbenchViewIdContextKey","registerWorkbenchBuiltIns","createWorkbenchInput","WorkbenchCore","createCoreCompositionController","resolveCore","getActiveMode","core","modeId","modes","getActiveModeId","getMode","undefined","getLayout","layout","getResource","getPrimaryResource","listWidgets","listOwnedAddablePanels","mode","region","resource","id","connectWorkbenchCoreState","input","store","subscribe","state","activeRegion","focus","getActiveRegion","regions","visible","clearFocus","subscribeSelector","activeId","activeWidgetId","Object","values","flatMap","widgets","find","placement","widgetId","viewId","context","set","delete","fireImmediately","isInScope","resources","activeWorkbenchResource","candidate","primaryWorkbenchResource","pages","getState","location","createNavigationTreeRegistry","NavigationTreeMoveContext","TreeNode","createCoreRenderers","createWorkbenchNavigationTrees","renderers","ReturnType","subscribeViewRefresh","viewId","listener","onDidRefresh","treeId","getViewDefaultExpandedSectionIds","getTreeRenderer","defaultExpandedSectionIds","getViewSections","context","getBody","getViewChildren","node","getChildren","moveViewNode","source","target","moveNavigationNode","moveNode","state","getTreeState","refresh","setSelectedNode","nodeId","createControlsRendererRegistry","createDataTableRendererRegistry","createFileRendererRegistry","createKanbanRendererRegistry","createWorkbenchRendererRegistry","createTreeRendererRegistry","createWorkbenchInput","WorkbenchRenderers","createCoreRenderers","input","rendererRegistry","persistence","treePersistence","ContributionMetadata","ControlsRendererRegistry","DataTableRendererRegistry","FileRendererRegistry","KanbanRendererRegistry","WorkbenchRendererRegistry","TreeRendererRegistry","WorkbenchViewContribution","ViewBodyRegistries","Pick","refreshable","dispose","registration","T","refresh","input","createWorkbenchViewBodyRegistration","registries","view","metadata","body","kind","registerRenderer","id","render","refreshRenderer","_kind","definition","registerTreeRenderer","title","icon","registerFileRenderer","refreshFileRenderer","Parameters","registerControlsRenderer","refreshControlsRenderer","registerKanbanRenderer","refreshKanbanRenderer","registerDataTableRenderer","refreshDataTableRenderer","createStatusBarRegistry","createWorkbenchViewMenuRegistry","createWorkbenchViewBodyRegistration","createViewRegistry","createWorkbenchInput","WorkbenchRenderers","createCoreViews","input","renderers","views","registerBody","viewMenus","statusBar","hasView","viewId","Boolean","getView","persistence","statusBarPersistence","ResourceRef","ContributionMetadata","ContributionSource","Disposable","createDisposable","WorkbenchCore","WorkbenchModuleContribution","WorkbenchModuleContributionContext","WorkbenchModuleActivationResult","withModuleMetadata","input","ownerId","source","metadata","toDisposables","result","Array","isArray","disposeDisposables","disposables","index","length","dispose","CreateModuleContextInput","contextScopeId","track","disposable","createModuleContext","core","contextScope","context","createScope","TDisposable","openPanel","_openPanel","openWidget","_openWidget","registerPanel","_registerPanel","registerPanelMenu","_registerPanelMenu","registerPlaceholder","_registerPlaceholder","registerWidget","_registerWidget","moduleLayout","layout","registerChildModule","module","registerModule","onDidChangePrimaryResource","listener","resource","onDidChangeActiveResource","breadcrumbs","setItems","items","onDidChange","commandPalette","set","key","value","delete","focus","commands","registerCommand","command","handler","onDidExecuteError","keybindings","registerKeybinding","keybinding","registerMenuItem","path","item","onWillChangePersistenceScope","onDidChangePersistenceScope","modes","registerMode","mode","activate","modeDisposables","modeContext","id","push","returnedDisposables","onDidChangeActive","modePlacements","registerPlacement","placement","shellPlacements","navigation","registerParser","parser","navigationTrees","registerContribution","contribution","notifications","show","notification","overlays","registerOverlay","overlay","placeholders","placeholder","pages","registerPage","page","panelMenuState","preferences","registerSchema","schema","resources","onWillRemove","registerKind","kind","registerHierarchyProvider","provider","registerProvider","views","registerView","view","viewMenus","registerViewMenu","menu","settings","registerSection","section","panel","statusBar","registerItem","statuses","registerStatusSet","statusSet","shell","sidePanel","themes","register","fileIconThemes","createDisposable","Disposable","WorkbenchCore","createModuleContext","disposeDisposables","toDisposables","createWorkbenchModuleRegistry","resolveCore","Pick","moduleRecords","Map","disposable","registerModule","module","has","id","Error","disposables","registration","get","delete","record","set","context","contextScopeId","ownerId","source","track","push","activate","error","dispose","unregisterModule","moduleId","defaultPageResourceCodec","workbenchPages","createWorkbenchBreadcrumbController","createWorkbenchCommandPaletteController","registerArrangementCommands","createPanelArrangement","createPlacementCloseController","createPlacementPinController","createLayoutResetController","removeWorkbenchResource","createWorkbenchFocusController","connectWorkbenchPageBreadcrumbs","createWorkbenchPageLocationController","createMemoryWorkbenchPageLocationBrowser","createMemoryWorkbenchPageLocationPersistence","createLiveWorkbenchPageRegistry","createPageStateRestorer","loadWorkbenchLocationLayout","createWorkbenchLayoutCache","createWorkbenchPanelMenuStateController","createWorkbenchShellController","createWorkbenchSidePanelController","createWorkbenchTerminalController","createCommandPaletteResourceRegistry","createCommandRegistry","createKeybindingRegistry","createLayoutModel","LayoutPersistenceAdapter","WorkbenchWidgetPlacement","createMenuRegistry","createWorkbenchModePlacementRegistry","createWorkbenchModeRegistry","createNavigationTreeRegistry","createNotificationRegistry","createWorkbenchOverlayRegistry","WorkbenchPageRegistryStoreState","createWorkbenchPlaceholderRegistry","createWorkbenchShellPlacementRegistry","createPreferenceRegistry","createResourceRegistry","createSettingsRegistry","createStatusRegistry","createFileIconThemeRegistry","createThemeRegistry","createContextKeyService","createDisposable","activeWorkbenchResource","connectWorkbenchCoreState","createCoreCompositionController","primaryWorkbenchResource","createCoreNavigationRegistry","revealPanelRegion","createWorkbenchNavigationTrees","createCoreRenderers","createWorkbenchInput","WorkbenchCore","createCoreViews","createWorkbenchModuleRegistry","setWorkbenchRenderers","createPagePersistenceScopeHandler","input","layout","Pick","ReturnType","panelMenuState","resolveScope","resolvePagePersistenceScope","undefined","state","resolved","currentScope","getPersistenceScope","modeId","activeModeId","pageId","activePageId","projectId","resource","location","setPersistenceScope","scope","carryRegionState","carryRegions","createPageLocations","registry","navigationTrees","modes","browser","pageLocationBrowser","persistence","pageLocationPersistence","startPage","start","disposeLayoutPersistence","flush","dispose","createWorkbench","context","commands","renderers","layoutCache","cachedInput","layoutPersistence","locationAwareLayout","defaultRegionVisibility","defaultPanelOpenByRegionId","side","initialSidePanelMode","getRegionSettings","regionId","core","getActiveModeId","activeMode","getMode","regionSettings","establishLocation","layoutModel","focus","isRegionFocusable","region","getLayout","regions","visible","views","viewMenus","statusBar","pageResources","modePlacements","loadLayout","readMode","getProjectId","pages","store","getState","getPanel","getWidget","registerPanel","shellPlacements","activatePanel","getScope","enteredWithPersistedLayout","onDidChangePersistenceScope","overlays","placeholders","breadcrumbs","panelMenuStatePersistence","resources","remove","retained","removeResource","getPrimary","getPrimaryResource","resolveView","getView","resolveContext","sidePanel","getFloatingPanels","floatingPanels","onDidChangePolicy","onDidChangeActive","initialMode","shell","loadModeLayout","beforeApply","restorePageState","revealRegion","pageLocations","composition","navigation","closePlacement","pinPlacement","commandPalette","host","getSnapshot","restoreSnapshot","snapshot","restoreLayout","scopeInput","keybindings","notifications","preferences","preferencePersistence","treeViews","getTreeState","setNodeExpanded","setSectionExpanded","setSelectedNode","commandPaletteResources","settings","hasView","viewId","Boolean","statuses","terminal","themes","fileIconThemes","getActiveResource","Promise","all","reads","onDidChangeActiveResource","listener","subscribeSelector","activeResourceKey","onDidChangePrimaryResource","registerChildModule","module","registerModule","subscribe","saveMode","breadcrumbSources","locations","defaultPageResourceCodec","byContributionPriority","workbenchCommandPaletteMenuPath","composeOwnedPlacements","workbenchRegions","headerTrailingMenuPath","runWorkbenchEffect","headerLeadingMenuPath","notifyWorkbenchChange","getAnchorResource","getWorkbenchModePanelForRegion","reconcileOwnedPlacements","reconcileAnchors","restoreModeLayout","isWorkbenchModePanelAvailable","resolveAnchorRegion","workbenchRegionTabLeadingMenuPath","workbenchTopHeaderLeadingMenuPath","resourceContextMenuPath","createDisposable","workbenchTopHeaderTrailingMenuPath","toPanelInstance","createKeybindingRegistry","workbenchPanelRegions","getNavigationTargetKey","batchWorkbenchChanges","applyModePanelAvailability","placementIdentityKey","disposeReverse","toOpenWidgetInput","restoreUnscopedModeLayout","toPanelContribution","workbenchResourceTypeContextKey","selectRegionActiveWidget","createContextKeyService","resourceHierarchyCycleCode","rendererReadKey","createUniqueWidgetId","createWorkbenchSelectionResourceMetadata","findResourcePlacement","normalizeContributionMetadata","getWorkbenchSelectionResourceKeys","getActiveLocationPlacement","workbenchResourceOwnerContextKey","replaceRegionWidgets","workbenchResourceMetadataContextKey","removePlacementsForContribution","runUserAction","workbenchRegionTabAddMenuPath","workbenchBreadcrumbLocationMenuPath","createResourceRegistry","findPlacement","workbenchResourceIdContextKey","removeLocationSubPanelSelection","setWorkbenchRenderers","matchesContextExpression","activateInLayout","getActivePlacement","panelsForMode","isWorkbenchPanelPlacementVisible","settleReadBatch","closeWidgetInLayout","createWorkbenchResourceContextValues","findPlacementByWidgetId","workbenchSelectionResourceKeyMetadataKey","setLocationSubPanelSelection","createWorkbenchStore","workbenchPanelMenuRegions","isWorkbenchViewHierarchyNode","resolveUniqueWidgetId","getKeybindingSteps","createNavigationTreeRegistry","defaultPageResourceCodec$1","dockedWorkbenchRegions$1","createWorkbenchBreadcrumbController","store","items","unsubscribe","state","listener","createWorkbenchCommandPaletteController","internal","input","setOpenState","current","next","openInput","confirmation","resolve","confirmed","request","value","buildUpdatedPlacement","placement","update","widget","resourceKey","createPlacement","spec","createRegionState","createDefaultWorkbenchLayout","createRegion","id","regionVisibility","findLastWidgetIndex","index","widgets","widgetId","normalizeWidgetIds","widgetIds","regions","activeWidgetId","layout","activeResourceKey","region","originalActiveWidgetId","activeIndex","normalizedActiveWidgetId","mergeWithDefaultRegions","defaults","persistedRegions","persisted","createRegionQueries","persistedSize","getLayout","regionId","size","getWidgets","getPlaceholder","createContributionLists","getPlaceholders","createContributionRegistrations","placeholder","placeholderContribution","record","metadata","priority","snapshot","_removed","nextPlaceholders","widgetContribution","reuse","singleton","nextWidgets","nextLayout","persistLayout","createLocationEstablisher","found","instanceId","ownedPanelMenuIds","candidate","insertAtPosition","position","targetWidgetId","targetIndex","placeWidget","reorderWidgetPlacement","removePlacements","removed","shouldRemove","active","expirePreviewTabsInLayout","ownerResourceKey","createLayoutPlacementMethods","nextPlacement","currentIndex","createLayoutRegionContentMethods","setLayout","result","cleared","nextRegions","createLayoutRegionMethods","updateRegion","nextRegion","visible","mode","carryPinnedWorkbenchChrome","incoming","pinned","contributionIds","incomingRegion","carryWorkbenchRegionState","regionIds","resolveScopedLayout","defaultRegionVisibility","createScopeEvent","listeners","createLayoutScopeMethods","currentScope","enteredWithLayout","willChangeScope","didChangeScope","nextScope","scopedLayout","withPinnedChrome","scopeInput","openOwnedPanelMenus","panelMenuId","panelMenu","findReusablePlacement","withPlacementRole","findReplacementIndex","replacementWidgetId","defaultTabPosition","before","requireWidget","createWidgetOpeners","bindToActiveLocation","updateSingleton","existing","updated","applyAndActivate","replaceActive","replacement","replacementIndex","reuseExistingPlacement","withoutExisting","copy","insertWidget","openWidget","placementInput","previewContent","defaultPanelTabRetention","createPanelLayoutMethods","activeInstanceId","menuRegions","menuSide","ownerContributionId","getWidget","contributionId","ownerPlacement","resolveMenuPlacements","placements","moves","seen","changed","owner","bound","target","reconcilePanelMenuOwnership","menuRegion","resolved","move","createOwnedMenuMethods","reconcilePanelMenus","panelMenuContribution","contribution","menu","panel","fallbackRegion","side","kind","registerPanelContribution","panelContribution","registrations","panelMenus","registeredPanel","registerWidget","error","registration","createPanelRegistrations","requireRegisteredWidget","createLayoutModel","initialLayout","regionQueries","contributionLists","scopeMethods","action","regionMethods","regionContentMethods","contributionRegistrations","panelRegistrations","widgetOpeners","placementMethods","panelMethods","ownedMenus","establishLocation","options","modeRegistryInternals","setWorkbenchModeRegistryInternals","registry","internals","activateWorkbenchPageMode","modeId","applyLayout","seedModeScope","locationEstablished","unsubscribeMainPanel","establishSeededLocation","primary","context","toDisposables$1","createWorkbenchModeRegistry","initializedModes","seededScopes","unscopedLayouts","activeDisposables","activeModeContext","deferredSeedModeId","transitioning","initializeMode","disposables","prepareScope","scopeKey","availableLayout","reconcileScope","transitionToMode","previousModeId","unscoped","disposeActive","activate","activatePageMode","contextScope","scopeSubscription","activeModeId","registryDisposable","rest","setActiveInput","registerWorkbenchViewPlacement","view","views","_role","_viewId","viewMenus","modePlacementContributionId","placementId","pagePlacementContributionId","pageId","slotId","allowedPanelDestinations","policy","panelDestinations","core","declaration","p","legacyPanel","isOpenSingleton","scopedResourceKey","resource","addModePanels$1","addRegisteredPanels","createWorkbenchCompositionController","open","location","modePanels","addable","workbenchFocusRegions","focusContextByRegion","createWorkbenchFocusController","applyContext","focusRegion","findPage","pages","levelOwner","page","leavesProjectNavigation","resolveNavigationLevels","levels","level","resolveRootLevelLocation","rootLevel","pinnedOnly","sections","section","node","mergeSections","merged","createLevelNavigation","queries","host","ordered","slot","read","signal","all","registryInternals","setWorkbenchPageRegistryInternals","getWorkbenchPageRegistryInternals","hasResolvableCurrentPageUrl","actions","projectId","createPageLocationControllerActions","isWorkbenchProjectUrl","history","workbenchPageRefKey","ref","pageForRef","pageForId","canonicalSection","anchors","anchor","cloneMetadata","canonicalResource","normalized","resources","canonical","canonicalPageRef","sectionKey","resourceKey$1","sharesPageResource","left","right","workbenchPageLocationRouteKey","document","workbenchPageLocationKey","own","workbenchPageLocationsEqual","canonicalPosition","createLocation","key","isFileSourcePosition","declaredParent","parent","normalizeResolvedLocation","routeKey","inheritedParent","normalizePageTarget","contextualParent","normalizeWorkbenchPageTarget","normalizeWorkbenchPageLocation","normalize","nextSeen","explicitParent","normalizeDirectWorkbenchPageLocation","createPageHistoryEntry","serializeWorkbenchPageUrl","createPageLocationFailureHandler","diagnostic","report","preparations$1","setPageLocationPreparation","controller","preparation","getPageLocationPreparation","createPageLocationPublisher","nextIndex","hooks","beforePublish","usesResource","matches","createRootLevelLocationTracker","saved","connectPageOwnerRemoval","previous","createPagePlacementCloser","closeToParent","resolution","closeWithinPage","identity","PAGE_MAIN_SLOT_ID","isPageSlotClosable","primarySlot","_kind","presentation","binding","pageSlots","main","requirePageSlot","emptyMainSlot","pagePlacementDeclarations","empty","pageStateKey","removePageStates","states","removePageResource","removedKey","keep","retained","pageStates","stateKey","resourceInstances","instances","instance","remaining","activePrimaryInstanceKey","createPageResourceRemover","isHistoryState","createWorkbenchPageLocationController","historyIndex","maxHistoryIndex","historyStore","publishHistory","resetHistory","fail","historyEntry","normalizeStored","start","publish","push","commit","resolveUrl","parsed","parseWorkbenchPageUrl","entry","direct","contextual","directKey","contextualKey","restore","browserEntry","hasProjectUrl","useCurrentUrl","fromUrl","source","fallbackError","popStateSubscription","pageRemovalSubscription","closeActivePlacement","createWorkbenchPanelMenuStateController","resolveOpenByMenuId","persistState","isOpen","menuId","scope","createWorkbenchSidePanelController","canFloat","resolveMode","defaultPresentation","getMode","notify","DEFAULT_SESSION_TITLE","SESSION_HISTORY_LIMIT","createWorkbenchTerminalController","opener","adapters","adapterDisposers","dataHistory","dataSubscribers","sessionIdByBindingId","bindingIdBySessionId","pendingSessionByBindingId","patchSession","session","sessionId","patch","requireAdapter","adapter","cleanupSession","bindingId","disposers","dispose","publishData","chunk","subscriber","kill","pending","openSession","unsubscribeTitle","opened","unsubscribes","sink","onData","subscribers","running","createCommandPaletteResourceRegistry","provider","providers","results","createCommandRegistry","errorListeners","requireCommand","emitError","event","command","args","prepare","onArgsChange","menuPathKey","path","createMenuRegistry","menuStore","deps","item","list","filtered","resourceMatchesConstraint","constraint","SINGLE_RESOURCE_INSTANCE_KEY","placementItemViewId","contributionRefId","createOwnedPlacementState","isStaticPlacementOpen","staticPlacementClosable","validateOwnedPlacementItem","label","openStaticPlacement","closeStaticPlacement","retainResourceInstances","resourceInstanceKey","shown","taken","instanceKey","suffix","openResourcePlacement","closeOwnedPlacementInstance","updateResourcePlacementInstance","clearOwnedPlacementState","preparations","setOwnedPlacementPreparation","getOwnedPlacementPreparation","prepareOwnedPlacement","operation","restoreOwnedPlacementState","identityFor$1","tabState$1","placementRefKey","validatePlacement","refKey","refs","copyPlacement","createWorkbenchModePlacementRegistry","listPlacements","runtime","emitChange","title","declarations","registered","prepared","byPriorityAndId$1","noDispatcher","dispatchItem","dispatcher","validateItem","isNavigationTarget","toItems","createNavigationRegistry","resolveDispatcher","removeKey","parser","parserContribution","createNotificationRegistry","generatedId","emit","notification","ids","overlayContributionId","createWorkbenchOverlayRegistry","overlays","overlay","emptyPageState","staticSlotOpen","nextResourceInstances","openResourceSlot","selectPrimaryTarget","pageResourceBindingSlots","openPageResourceBindings","setStaticSlotOpen","removeResourceInstance","closePageSlot","activateInstanceKey","resolvePagePlacementClose","pageState","closedActivePrimary","activeInstanceKey","activeInstance","pinPagePlacement","pagePlacementIdentity","pageFollowerIdentities","slots","validatePageSlots","validateWorkbenchPage","placementFor","resolvePagePlacements","emptyReconciliation$1","createPageRegistryStore","resolveModePlacementSet","refreshActiveModePlacements","refreshShellPlacements","createPagePreparation","normalizeResource","resourceKey$2","requirePage","compose","modePlacements","owned","shell","composed","reconciliation","normalizedTarget","primaryState","openFollowers","followers","emptyReconciliation","registerWorkbenchPage","placementRegistration","_page","createWorkbenchPageRegistry","publishingState","publishState","storeBeforeRuntime","previousPublishingState","activatePageWithStates","apply","createWorkbenchPlaceholderRegistry","shellPlacementContributionId","identityFor","roleForRegion","tabState","createWorkbenchShellPlacementRegistry","restorePlacement","previousContext","valueKey","name","createMemoryPreferencePersistence","values","createPreferenceRegistry","persistence","registeredNames","schema","additions","property","scoped","userValue","createControlsRendererRegistry","controlsStore","refreshListeners","implementation","requireControlsRenderer","renderer","impl","rendererDisposable","rendererRegistry","rendererInput","nextRenderers","createDataTableRendererRegistry","dataTableStore","renderers","createFileRendererRegistry","fileRendererStore","requireFileRenderer","envelope","createKanbanRendererRegistry","dataStore","requireKanbanRenderer","createWorkbenchRendererRegistry","_refreshKey","refreshKeys","createDefaultState","mergeDefaultSections","missing","toggleId","expanded","createTreeRendererRegistry","treeStore","requireTree","tree","ensureState","fresh","persistStates","statesByTreeId","_loading","persistable","updateState","persistedState","nextState","nextTrees","_removedState","nextStates","_removedRefresh","nextRefresh","ctx","nodeId","nextIds","sectionId","loading","createRendererReadRegistry","owners","disposed","release","finish","isCurrent","job","schedule","token","reason","generation","completed","reading","byOrderThenPriority","createSettingsRegistry","collectionItems","itemKey","panelId","itemId","nextSections","nextPanels","bySlotOrderAndId","createStatusBarRegistry","listItems","rank","order","leftRank","rightRank","targetId","validateStatusActions","actionId","status","actionIds","set","validateStatuses","defaultCount","statuses","createStatusRegistry","requireSet","loadingById","query","statusSets","_removedValues","cached","createFileIconThemeRegistry","groups","sync","themes","createThemeRegistry","viewMenuPanelId","viewMenuConfig","createWorkbenchViewMenuRegistry","menus","ownerViewId","workbenchViewIdContextKey","byPriorityAndId","createViewRegistry","bodies","body","viewId","refreshInput","registerArrangementCommands","ownsPlacement","activateModePlacementInstance","openPlacementAddTarget","canAddItem","addShellPanels","multiple","add","addModePanels","addPagePanels","createOwnedAddablePanels","placementContext","requirePanelPage","prepareSharedPanel","modeState","shellState","prepareWorkbenchNavigation","targets","locations","original","originalMode","originalShell","proposed","present","final","applyOwners","findPagePanelOwner","canOpenCorePanel","revealPanelRegion","openPageSlotTarget","revealActivePanelRegion","fallback","openModePlacementTarget","openShellPlacementTarget","openCorePanelTarget","createCoreNavigationRegistry","resolveCore","commandId","href","createPanelArrangement","destination","t","selected","createPlacementCloseController","createPlacementPinController","bindsToLocation","resolveOwnerResourceKey","desired","exact","transfer","indexCurrentOwnedPlacements","indexed","findModePlacementTransfer","desiredIdentity","currentKey","indexCurrentWidgetOwners","restoreModeWidgets","currentIds","restored","positions","a","b","modePositions","modes","modeIndex","renderDesiredPlacements","rendered","identities","currentWidgetOwners","desiredWidgetIds","desiredKeys","transferredCurrentKeys","transferredFromKey","currentOwner","reconcileRegions","docked","desiredByKey","pageOwnsPrimaryLocation","placedKeys","modeLayout","removedKeys","opensPreviouslyEmptyRegion","normalizeRemovedState","activeLocation","fallbackLocation","activeLocationWidgetId","fallbackActive","bindOwnedSubPanelsToLocation","desiredPlacement","updateOwnedWidgetLayout","desiredByIdentity","reconcileOwnedWidgetLayout","applyOwnedWidgetLayoutReconciliation","resetWorkbenchLayout","createLayoutResetController","removeWorkbenchResource","retainedKeys","pageRefKey","locationsFromRoot","targetFromLocation","pageTitle","isLocalizedString","createWorkbenchPageBreadcrumbItems","pagesByRef","landingPanel","setWorkbenchPageBreadcrumbs","connectWorkbenchPageBreadcrumbs","ownedBreadcrumbs","subscription","createMemoryWorkbenchPageLocationBrowser","entries","createMemoryWorkbenchPageLocationPersistence","syncOwnedPanelMenus","ownedPlacements","bindPlacementsToActivePageLocation","applyPageState","previousScope","stored","latest","storeBeforeTransition","activation","layoutInput","connectWorkbenchPageRuntime","applyingTransition","toTabState","toWidgetPlacement","createLiveWorkbenchPageRegistry","closable","pageStateFromLayout","openStaticSlotIds","matching","loadWorkbenchLocationLayout","createPageStateRestorer","selectPlacements","include","modeScope","createWorkbenchLayoutCache","scopes","write","createWorkbenchShellController","sidePanelMode","nextSidePanelMode","unsubscribeLayout","sidePanelSubscription","createScopedIsInScope","createPrimaryCoordinator","changingPersistenceScope","previousPrimaryKey","SIDENAV_PANEL_ID","togglePanel","workbench","builtinCommands","registerWorkbenchBuiltIns","createCoreCompositionController","connectWorkbenchCoreState","activeRegion","activeId","activeWorkbenchResource","primaryWorkbenchResource","createWorkbenchNavigationTrees","treeId","moveNavigationNode","createCoreRenderers","refreshable","createWorkbenchViewBodyRegistration","registries","definition","createCoreViews","withModuleMetadata","toDisposables","disposeDisposables","createModuleContext","track","disposable","_openPanel","_openWidget","_registerPanel","_registerPanelMenu","_registerPlaceholder","_registerWidget","moduleLayout","module","ownerId","handler","keybinding","modeDisposables","modeContext","returnedDisposables","statusSet","createWorkbenchModuleRegistry","moduleRecords","moduleId","createPagePersistenceScopeHandler","resolveScope","panelMenuState","createPageLocations","workbenchPages","disposeLayoutPersistence","createWorkbench","commands","layoutCache","cachedInput","layoutModel","activeMode","focus","pageResources","shellPlacements","navigationTrees","placeholders","breadcrumbs","sidePanel","pageLocations","composition","navigation","defaultPageResourceCodec","dockedWorkbenchRegions","standardResourceIcons"],"sources":["../src/core/controllers/breadcrumbs/breadcrumb-registry.ts","../src/core/controllers/command-palette/command-palette-controller.ts","../src/core/registries/layout/widget-placement.ts","../src/core/registries/layout/layout-defaults.ts","../src/core/registries/layout/layout-contribution-helpers.ts","../src/core/registries/layout/layout-location-establisher.ts","../src/core/registries/layout/layout-tab-lifecycle.ts","../src/core/registries/layout/layout-placement-methods.ts","../src/core/registries/layout/layout-region-content-methods.ts","../src/core/registries/layout/layout-region-methods.ts","../src/core/registries/layout/layout-scope.ts","../src/core/registries/layout/layout-scope-methods.ts","../src/core/registries/layout/layout-widget-openers.ts","../src/core/registries/layout/panel-layout-methods.ts","../src/core/registries/layout/panel-menu-ownership.ts","../src/core/registries/layout/panel-registration.ts","../src/core/registries/layout/layout-model.ts","../src/core/registries/modes/mode-registry-internals.ts","../src/core/registries/modes/mode-seed-scope.ts","../src/core/registries/modes/mode-registry.ts","../src/core/registries/views/view-placement.ts","../src/core/controllers/composition/panel-destinations.ts","../src/core/controllers/composition/composition-controller.ts","../src/core/controllers/focus/focus-controller.ts","../src/core/controllers/page-location/navigation-level.ts","../src/core/controllers/page-location/navigation-level-composition.ts","../src/core/registries/pages/page-registry-internals.ts","../src/core/controllers/page-location/page-location-actions.ts","../src/core/controllers/page-location/page-location-normalization.ts","../src/core/controllers/page-location/page-location-history-entry.ts","../src/core/controllers/page-location/page-location-preparation.ts","../src/core/controllers/page-location/page-location-publish.ts","../src/core/controllers/page-location/page-location-root-level.ts","../src/core/controllers/page-location/page-owner-removal.ts","../src/core/controllers/page-location/page-placement-closer.ts","../src/core/registries/pages/page-main.ts","../src/core/registries/pages/page-state-key.ts","../src/core/registries/pages/page-resource-removal.ts","../src/core/controllers/page-location/page-resource-remover.ts","../src/core/controllers/page-location/page-location-controller.ts","../src/core/controllers/panel-menus/panel-menu-state-controller.ts","../src/core/controllers/side-panel/side-panel-controller.ts","../src/core/controllers/terminal/terminal-controller.ts","../src/core/registries/command-palette-resources/command-palette-resource-registry.ts","../src/core/registries/commands/command-registry.ts","../src/core/registries/menus/menu-registry.ts","../src/core/shared/contributions/reference-id.ts","../src/core/registries/placements/placement-instance-key.ts","../src/core/registries/placements/owned-placement-lifecycle.ts","../src/core/registries/placements/owned-placement-preparation.ts","../src/core/registries/placements/owned-placement-restoration.ts","../src/core/registries/modes/mode-placement-registry.ts","../src/core/registries/navigation/navigation-registry.ts","../src/core/registries/notifications/notification-registry.ts","../src/core/registries/overlays/overlay-registry.ts","../src/core/registries/pages/page-slot-lifecycle.ts","../src/core/registries/pages/page-placement-close.ts","../src/core/registries/pages/page-placement-pin.ts","../src/core/registries/pages/page-placement-resolver.ts","../src/core/registries/pages/page-registry-state.ts","../src/core/registries/pages/page-preparation.ts","../src/core/registries/pages/page-registration.ts","../src/core/registries/pages/page-registry.ts","../src/core/registries/placeholders/placeholder-registry.ts","../src/core/registries/placements/shell-placement-registry.ts","../src/core/registries/preferences/preference-registry.ts","../src/core/registries/renderers/controls-renderer-registry.ts","../src/core/registries/renderers/data-table-renderer-registry.ts","../src/core/registries/renderers/file-renderer-registry.ts","../src/core/registries/renderers/kanban-renderer-registry.ts","../src/core/registries/renderers/renderer-registry.ts","../src/core/registries/renderers/tree-renderer-registry.ts","../src/core/registries/views/renderer-read-registry.ts","../src/core/registries/settings/settings-registry.ts","../src/core/registries/status-bar/status-bar-registry.ts","../src/core/registries/statuses/status-registry.ts","../src/core/registries/themes/file-icon-theme-registry.ts","../src/core/registries/themes/theme-registry.ts","../src/core/registries/view-menus/view-menu-registry.ts","../src/core/registries/views/view-registry.ts","../src/core/controllers/composition/arrangement-commands.ts","../src/core/controllers/composition/owned-addable-panels.ts","../src/core/controllers/navigation/compound-navigation.ts","../src/core/workbench-core-navigation.ts","../src/core/controllers/composition/panel-arrangement.ts","../src/core/controllers/composition/placement-close-controller.ts","../src/core/controllers/composition/placement-pin-controller.ts","../src/core/registries/layout/owned-placement-layout.ts","../src/core/controllers/composition/reset-workbench-layout.ts","../src/core/controllers/composition/resource-removal.ts","../src/core/controllers/page-location/page-breadcrumbs.ts","../src/core/controllers/page-location/page-location-memory.ts","../src/core/controllers/page-runtime/page-runtime.ts","../src/core/controllers/page-runtime/page-state-restoration.ts","../src/core/controllers/page-runtime/workbench-layout-cache.ts","../src/core/controllers/shell/shell-controller.ts","../src/core/controllers/primary-coordinator/primary-coordinator.ts","../src/core/workbench-built-ins.ts","../src/core/workbench-core-connections.ts","../src/core/workbench-core-navigation-trees.ts","../src/core/workbench-core-renderers.ts","../src/core/registries/views/view-body-registration.ts","../src/core/workbench-core-views.ts","../src/core/workbench-module-context.ts","../src/core/workbench-module-registry.ts","../src/core/workbench-core.ts"],"sourcesContent":["import type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkbenchBreadcrumbItem {\n title: unknown;\n icon?: string;\n indicator?: \"session-status\";\n /** The crumb leaves the project navigation: it opens a Sidenav level or a mode that replaces the Sidenav. */\n startsLevel?: boolean;\n url?: string;\n onClick?: () => void;\n resource?: ResourceRef;\n}\n\nexport type WorkbenchBreadcrumbChangeListener = () => void;\n\nexport interface WorkbenchBreadcrumbState {\n items: WorkbenchBreadcrumbItem[] | undefined;\n}\n\nexport interface WorkbenchBreadcrumbController {\n store: WorkbenchStore<WorkbenchBreadcrumbState>;\n setItems(items: WorkbenchBreadcrumbItem[]): Disposable;\n clearItems(): void;\n getItems(): WorkbenchBreadcrumbItem[] | undefined;\n onDidChange(listener: WorkbenchBreadcrumbChangeListener): Disposable;\n}\n\nexport const createWorkbenchBreadcrumbController = (): WorkbenchBreadcrumbController => {\n const store = createWorkbenchStore<WorkbenchBreadcrumbState>({\n name: \"workbench.breadcrumbs\",\n initialState: { items: undefined },\n });\n\n return {\n store,\n\n setItems(items) {\n store.setState({ items }, false, \"setBreadcrumbItems\");\n return createDisposable(() => {\n if (store.getState().items === items) {\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n }\n });\n },\n\n clearItems() {\n if (store.getState().items === undefined) return;\n store.setState({ items: undefined }, false, \"clearBreadcrumbItems\");\n },\n\n getItems() {\n return store.getState().items;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.items,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { CommandParamSchema, WorkbenchCommandExecutionContext } from \"../../registries/commands/command-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type WorkbenchCommandPaletteChangeListener = (open: boolean) => void;\nexport type WorkbenchCommandPaletteView = \"main\" | \"theme\";\n\n// A pending request to collect a command's params before running it. Held on the\n// controller (not in a single React tree) so any surface — palette entries, header\n// actions, tree actions — can open the one shared params dialog.\nexport interface WorkbenchCommandParamsRequest {\n record: {\n command: {\n id: string;\n label: string;\n params?: CommandParamSchema;\n resourceMutation?: import(\"@pstdio/sdk/extensions\").CommandDefinition[\"resourceMutation\"];\n };\n };\n label: string;\n args?: unknown;\n context?: WorkbenchCommandExecutionContext;\n}\n\nexport interface WorkbenchCommandConfirmation {\n label: string;\n resolve(confirmed: boolean): void;\n}\n\nexport interface WorkbenchCommandPaletteState {\n confirmation: WorkbenchCommandConfirmation | null;\n open: boolean;\n view: WorkbenchCommandPaletteView;\n initialQuery: string;\n paramsRequest: WorkbenchCommandParamsRequest | null;\n}\n\nexport interface WorkbenchCommandPaletteOpenInput {\n view?: WorkbenchCommandPaletteView;\n initialQuery?: string;\n}\n\nexport interface WorkbenchCommandPaletteController {\n store: WorkbenchStore<WorkbenchCommandPaletteState>;\n isOpen(): boolean;\n getView(): WorkbenchCommandPaletteView;\n getInitialQuery(): string;\n getParamsRequest(): WorkbenchCommandParamsRequest | null;\n open(input?: WorkbenchCommandPaletteOpenInput): void;\n close(): void;\n toggle(): void;\n requestConfirmation(label: string): Promise<boolean>;\n requestParams(request: WorkbenchCommandParamsRequest): void;\n clearParams(): void;\n onDidChange(listener: WorkbenchCommandPaletteChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchCommandPaletteControllerInput {\n initialOpen?: boolean;\n}\n\nexport const createWorkbenchCommandPaletteController = (\n input: CreateWorkbenchCommandPaletteControllerInput = {},\n): WorkbenchCommandPaletteController => {\n const internal = createWorkbenchStore<WorkbenchCommandPaletteState>({\n name: \"workbench.commandPalette\",\n initialState: {\n open: input.initialOpen ?? false,\n view: \"main\",\n initialQuery: \"\",\n paramsRequest: null,\n confirmation: null,\n },\n });\n\n // Patches open/view/initialQuery while preserving paramsRequest, which has its own\n // lifecycle (a request can outlive the palette being closed).\n const setOpenState = (next: Pick<WorkbenchCommandPaletteState, \"open\" | \"view\" | \"initialQuery\">) => {\n const current = internal.getState();\n if (current.open === next.open && current.view === next.view && current.initialQuery === next.initialQuery) return;\n internal.setState({ ...current, ...next }, false, \"setCommandPaletteState\");\n };\n\n return {\n store: internal,\n isOpen() {\n return internal.getState().open;\n },\n getView() {\n return internal.getState().view;\n },\n getInitialQuery() {\n return internal.getState().initialQuery;\n },\n getParamsRequest() {\n return internal.getState().paramsRequest;\n },\n open(openInput = {}) {\n setOpenState({ open: true, view: openInput.view ?? \"main\", initialQuery: openInput.initialQuery ?? \"\" });\n },\n close() {\n setOpenState({ open: false, view: \"main\", initialQuery: \"\" });\n },\n toggle() {\n setOpenState({ open: !internal.getState().open, view: \"main\", initialQuery: \"\" });\n },\n requestConfirmation(label) {\n internal.getState().confirmation?.resolve(false);\n return new Promise<boolean>((resolve) => {\n const confirmation = {\n label,\n resolve: (confirmed: boolean) => {\n if (internal.getState().confirmation === confirmation)\n internal.setState({ ...internal.getState(), confirmation: null });\n resolve(confirmed);\n },\n };\n internal.setState({ ...internal.getState(), confirmation });\n });\n },\n requestParams(request) {\n internal.setState({ ...internal.getState(), paramsRequest: request }, false, \"requestCommandParams\");\n },\n clearParams() {\n if (!internal.getState().paramsRequest) return;\n internal.setState(\n { ...internal.getState(), paramsRequest: null, confirmation: null },\n false,\n \"clearCommandParams\",\n );\n },\n onDidChange(listener) {\n const unsubscribe = internal.subscribeSelector(\n (state) => state.open,\n (value) => listener(value),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { OpenWidgetInput, RegisteredWidgetContribution, WorkbenchWidgetPlacement } from \"./layout-types\";\n\nexport const buildUpdatedPlacement = (\n placement: WorkbenchWidgetPlacement,\n widget: RegisteredWidgetContribution,\n update: OpenWidgetInput,\n): WorkbenchWidgetPlacement => {\n const next: WorkbenchWidgetPlacement = { ...placement };\n if (update.viewId !== undefined) next.viewId = update.viewId ?? undefined;\n if (update.resource === null) {\n next.resource = undefined;\n next.resourceKey = undefined;\n next.title = update.title ?? widget.title;\n } else if (update.resource) {\n next.resource = update.resource;\n next.resourceKey = resourceKey(update.resource);\n next.title = update.title ?? update.resource.label ?? widget.title;\n } else if (update.title !== undefined) {\n next.title = update.title;\n }\n if (update.pinned !== undefined) next.pinned = update.pinned;\n if (update.closable !== undefined) next.closable = update.closable;\n if (update.mountStrategy !== undefined) next.mountStrategy = update.mountStrategy;\n if (update.hiddenByDefault !== undefined) next.hiddenByDefault = update.hiddenByDefault;\n if (update.tabRetention !== undefined) next.tabRetention = update.tabRetention;\n if (update.tab !== undefined) next.tab = update.tab;\n if (update.ownerId !== undefined) next.ownerId = update.ownerId;\n if (update.source !== undefined) next.source = update.source;\n if (update.role !== undefined) next.role = update.role;\n return next;\n};\nexport const createPlacement = (\n widgetId: string,\n widget: RegisteredWidgetContribution,\n spec: OpenWidgetInput,\n): WorkbenchWidgetPlacement => ({\n widgetId,\n contributionId: widget.id,\n viewId: spec.viewId ?? undefined,\n ownerId: spec.ownerId ?? widget.ownerId,\n source: spec.source ?? widget.source,\n resource: spec.resource ?? undefined,\n resourceKey: resourceKey(spec.resource ?? undefined),\n title: spec.title ?? spec.resource?.label ?? widget.title,\n pinned: spec.pinned,\n // Tabbed (non-singleton) widgets are closable unless they opt out; singleton\n // panels stay non-closable by default.\n closable: spec.closable ?? widget.closable ?? !widget.singleton,\n mountStrategy: spec.mountStrategy ?? widget.mountStrategy,\n hiddenByDefault: spec.hiddenByDefault ?? widget.hiddenByDefault,\n tabRetention: spec.tabRetention,\n tab: spec.tab ?? widget.tab,\n role: spec.role ?? \"content\",\n});\n","import { type WorkbenchRegion, workbenchRegions } from \"./layout-regions\";\nimport type { WorkbenchLayout, WorkbenchRegionState, WorkbenchWidgetPlacement } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\n\nconst createRegionState = (id: WorkbenchRegion, visible: boolean): WorkbenchRegionState => ({\n id,\n visible,\n widgets: [],\n});\n\nexport const createDefaultWorkbenchLayout = (\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const createRegion = (id: WorkbenchRegion) => createRegionState(id, regionVisibility[id] ?? true);\n\n return {\n regions: {\n nav: createRegion(\"nav\"),\n activity: createRegion(\"activity\"),\n sidenav: createRegion(\"sidenav\"),\n \"main-header\": createRegion(\"main-header\"),\n \"main-left-menu\": createRegion(\"main-left-menu\"),\n main: createRegion(\"main\"),\n \"main-right-menu\": createRegion(\"main-right-menu\"),\n \"secondary-header\": createRegion(\"secondary-header\"),\n \"secondary-left-menu\": createRegion(\"secondary-left-menu\"),\n secondary: createRegion(\"secondary\"),\n \"secondary-right-menu\": createRegion(\"secondary-right-menu\"),\n \"side-header\": createRegion(\"side-header\"),\n \"side-left-menu\": createRegion(\"side-left-menu\"),\n side: createRegion(\"side\"),\n \"side-right-menu\": createRegion(\"side-right-menu\"),\n status: createRegion(\"status\"),\n overlay: createRegion(\"overlay\"),\n },\n };\n};\n\nconst findLastWidgetIndex = (widgets: WorkbenchWidgetPlacement[], widgetId: string) => {\n for (let index = widgets.length - 1; index >= 0; index -= 1) {\n if (widgets[index]?.widgetId === widgetId) return index;\n }\n return -1;\n};\n\nconst normalizeWidgetIds = (layout: WorkbenchLayout) => {\n const widgetIds = new Set<string>();\n const regions = {} as WorkbenchLayout[\"regions\"];\n let activeWidgetId = layout.activeWidgetId;\n let activeResourceKey = layout.activeResourceKey;\n\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n const originalActiveWidgetId = region.activeWidgetId;\n const activeIndex = originalActiveWidgetId ? findLastWidgetIndex(region.widgets, originalActiveWidgetId) : -1;\n const widgets = region.widgets.map((placement) => {\n const widgetId = resolveUniqueWidgetId(widgetIds, placement.contributionId, placement.widgetId);\n widgetIds.add(widgetId);\n return widgetId === placement.widgetId ? placement : { ...placement, widgetId };\n });\n const normalizedActiveWidgetId = activeIndex >= 0 ? widgets[activeIndex]?.widgetId : originalActiveWidgetId;\n regions[id] = { ...region, widgets, activeWidgetId: normalizedActiveWidgetId };\n\n if (originalActiveWidgetId && layout.activeWidgetId === originalActiveWidgetId && activeIndex >= 0) {\n activeWidgetId = normalizedActiveWidgetId;\n activeResourceKey = widgets[activeIndex]?.resourceKey;\n }\n }\n\n return { ...layout, regions, activeWidgetId, activeResourceKey };\n};\n\nexport const mergeWithDefaultRegions = (\n persisted: WorkbenchLayout,\n regionVisibility: Partial<Record<WorkbenchRegion, boolean>> = {},\n): WorkbenchLayout => {\n const defaults = createDefaultWorkbenchLayout(regionVisibility);\n const persistedRegions = Object.fromEntries(\n workbenchRegions.flatMap((region) => (persisted.regions[region] ? [[region, persisted.regions[region]]] : [])),\n ) as Partial<WorkbenchLayout[\"regions\"]>;\n return normalizeWidgetIds({\n ...persisted,\n regions: { ...defaults.regions, ...persistedRegions },\n });\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { getActivePlacement, removePlacementsForContribution } from \"./layout-operations\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n} from \"./layout-types\";\n\ninterface CreateRegionQueriesInput {\n getLayout(): WorkbenchLayout;\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n getPlaceholder(regionId: WorkbenchRegion): RegisteredPlaceholderContribution | undefined;\n getRegionSettings?(regionId: WorkbenchRegion): WorkbenchRegionSettings | undefined;\n}\n\nexport const createRegionQueries = (input: CreateRegionQueriesInput) => {\n const { getLayout, getWidgets, getPlaceholder } = input;\n\n return {\n getRegionSize(regionId: WorkbenchRegion) {\n const persistedSize = getLayout().regions[regionId].size;\n const placement = getActivePlacement(getLayout().regions[regionId]);\n const contributionSize = placement\n ? getWidgets()[placement.contributionId]?.regionSize\n : getPlaceholder(regionId)?.regionSize;\n const size = contributionSize ?? input.getRegionSettings?.(regionId)?.size;\n if (persistedSize === undefined) return size;\n return { ...size, defaultPx: persistedSize };\n },\n\n getRegionCollapsible(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement)\n return getPlaceholder(regionId)?.regionCollapsible ?? input.getRegionSettings?.(regionId)?.collapsible ?? true;\n return (\n getWidgets()[placement.contributionId]?.regionCollapsible ??\n input.getRegionSettings?.(regionId)?.collapsible ??\n true\n );\n },\n\n getRegionHeaderBorderBottom(regionId: WorkbenchRegion) {\n const placement = getActivePlacement(getLayout().regions[regionId]);\n if (!placement) return true;\n return getWidgets()[placement.contributionId]?.headerBorderBottom ?? true;\n },\n };\n};\n\nexport const createContributionLists = (input: {\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n}) => {\n const { getPlaceholders, getWidgets } = input;\n\n return {\n listPlaceholders: () => Object.values(getPlaceholders()).sort(byContributionPriority),\n listWidgets: () => Object.values(getWidgets()).sort(byContributionPriority),\n };\n};\n\nexport const createContributionRegistrations = (input: {\n store: InternalWorkbenchStore<WorkbenchLayoutStoreState>;\n getPlaceholders(): WorkbenchLayoutStoreState[\"placeholders\"];\n getWidgets(): WorkbenchLayoutStoreState[\"widgets\"];\n persistLayout(): void;\n}) => {\n const { store, getPlaceholders, getWidgets, persistLayout } = input;\n\n return {\n registerPlaceholder(placeholder: PlaceholderContribution, metadata?: ContributionMetadata) {\n if (getPlaceholders()[placeholder.region]) {\n throw new Error(`Placeholder already registered: ${placeholder.region}`);\n }\n\n const { priority, ...placeholderContribution } = placeholder;\n const record: RegisteredPlaceholderContribution = {\n ...placeholderContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState(\n { ...snapshot, placeholders: { ...snapshot.placeholders, [placeholder.region]: record } },\n false,\n \"registerPlaceholder\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.placeholders[placeholder.region] !== record) return;\n const { [placeholder.region]: _removed, ...nextPlaceholders } = current.placeholders;\n store.setState({ ...current, placeholders: nextPlaceholders }, false, \"unregisterPlaceholder\");\n });\n },\n\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata) {\n if (getWidgets()[widget.id]) throw new Error(`Widget already registered: ${widget.id}`);\n\n const { priority, reuse, singleton, ...widgetContribution } = widget;\n const record: RegisteredWidgetContribution = {\n ...widgetContribution,\n reuse: reuse ?? \"resource\",\n singleton: singleton ?? true,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n const snapshot = store.getState();\n store.setState({ ...snapshot, widgets: { ...snapshot.widgets, [widget.id]: record } }, false, \"registerWidget\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.widgets[widget.id] !== record) return;\n const { [widget.id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout = removePlacementsForContribution(current.layout, widget.id);\n store.setState({ widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n persistLayout();\n });\n },\n };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { findPlacementByWidgetId } from \"./layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport interface CreateLocationEstablisherInput {\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n getLayout(): WorkbenchLayout;\n getWidget(id: string): RegisteredWidgetContribution | undefined;\n panelMethods: Pick<LayoutModel, \"activatePanel\" | \"getActivePanel\">;\n}\n\nexport const createLocationEstablisher = (input: CreateLocationEstablisherInput) => (instanceId: string) => {\n const layout = input.getLayout();\n const found = findPlacementByWidgetId(layout, instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n // Sub Panels and Panel Menus stay tabs beside their Location: promoting one would\n // create a second Location and clone every Sub Panel per Location.\n if (found.regionId !== \"main\" || found.placement.role === \"sub-panel\" || found.placement.role === \"panel-menu\") {\n return input.panelMethods.activatePanel(instanceId);\n }\n\n const placement = { ...found.placement, role: \"location\" as const };\n const ownedPanelMenuIds = new Set(input.getWidget(placement.contributionId)?.ownedPanelMenuIds ?? []);\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([regionId, region]) => [\n regionId,\n {\n ...region,\n widgets: region.widgets.map((candidate) => {\n if (candidate.widgetId === instanceId) return placement;\n if (!ownedPanelMenuIds.has(candidate.contributionId)) return candidate;\n if (candidate.resourceKey !== placement.resourceKey) return candidate;\n return { ...candidate, ownerResourceKey: placement.resourceKey };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n input.applyAndActivate(\n {\n ...layout,\n regions,\n },\n \"main\",\n placement,\n );\n return input.panelMethods.getActivePanel(\"main\")!;\n};\n","import { getActivePlacement, removeLocationSubPanelSelection, replaceRegionWidgets } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchTabPosition, WorkbenchWidgetPlacement } from \"./layout-types\";\n\nexport const insertAtPosition = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position: WorkbenchTabPosition = \"end\",\n) => {\n const next = [...widgets];\n if (position === \"start\") {\n next.unshift(placement);\n return next;\n }\n if (position === \"end\") {\n next.push(placement);\n return next;\n }\n\n const targetWidgetId = \"beforeWidgetId\" in position ? position.beforeWidgetId : position.afterWidgetId;\n const targetIndex = next.findIndex((candidate) => candidate.widgetId === targetWidgetId);\n if (targetIndex < 0) {\n next.push(placement);\n return next;\n }\n next.splice(targetIndex + (\"afterWidgetId\" in position ? 1 : 0), 0, placement);\n return next;\n};\n\nexport const placeWidget = (\n widgets: WorkbenchWidgetPlacement[],\n placement: WorkbenchWidgetPlacement,\n position?: WorkbenchTabPosition,\n) => {\n if (placement.tabRetention !== \"preview\") return insertAtPosition(widgets, placement, position);\n const persistentWidgets = widgets.filter(\n (candidate) => candidate.tabRetention !== \"preview\" && candidate.widgetId !== placement.widgetId,\n );\n return insertAtPosition(persistentWidgets, placement, position);\n};\n\nexport const reorderWidgetPlacement = (\n widgets: WorkbenchWidgetPlacement[],\n widgetId: string,\n position: WorkbenchTabPosition,\n) => {\n const placement = widgets.find((candidate) => candidate.widgetId === widgetId);\n if (!placement) return widgets;\n const remaining = widgets.filter((candidate) => candidate.widgetId !== widgetId);\n return insertAtPosition(remaining, placement, position);\n};\n\nconst removePlacements = (layout: WorkbenchLayout, shouldRemove: (placement: WorkbenchWidgetPlacement) => boolean) => {\n let nextLayout = layout;\n\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter(shouldRemove);\n if (removed.length === 0) continue;\n const active = getActivePlacement(region);\n nextLayout = replaceRegionWidgets(\n nextLayout,\n region.id,\n (widgets) => widgets.filter((placement) => !shouldRemove(placement)),\n { clearActiveWidget: active ? shouldRemove(active) : false },\n );\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n\n const activePlacement = nextLayout.activeWidgetId\n ? Object.values(nextLayout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === nextLayout.activeWidgetId)\n : undefined;\n if (!activePlacement) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceKey: undefined };\n }\n return nextLayout;\n};\n\nexport const expirePreviewTabsInLayout = (layout: WorkbenchLayout, ownerResourceKey?: string) =>\n removePlacements(\n layout,\n (placement) =>\n placement.tabRetention === \"preview\" &&\n (ownerResourceKey === undefined || placement.ownerResourceKey !== ownerResourceKey),\n );\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { buildUpdatedPlacement, replaceRegionWidgets } from \"./layout-operations\";\nimport { expirePreviewTabsInLayout, reorderWidgetPlacement } from \"./layout-tab-lifecycle\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nexport const createLayoutPlacementMethods = (input: {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}): Pick<LayoutModel, \"updateWidgetPlacement\" | \"reorderWidget\" | \"expirePreviewTabs\" | \"activateWidget\"> => ({\n updateWidgetPlacement(widgetId, update) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((placement) => placement.widgetId === widgetId);\n if (index < 0) continue;\n const widget = input.requireWidget(region.widgets[index].contributionId);\n const nextPlacement = buildUpdatedPlacement(region.widgets[index], widget, update);\n const nextLayout = replaceRegionWidgets(layout, region.id, (widgets) =>\n widgets.map((current, currentIndex) => (currentIndex === index ? nextPlacement : current)),\n );\n input.setLayout(nextLayout);\n input.persistLayout();\n return nextPlacement;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n reorderWidget(widgetId, position) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n if (!region.widgets.some((placement) => placement.widgetId === widgetId)) continue;\n input.setLayout(\n replaceRegionWidgets(layout, region.id, (widgets) => reorderWidgetPlacement(widgets, widgetId, position)),\n );\n input.persistLayout();\n return;\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n\n expirePreviewTabs(ownerResourceKey) {\n input.setLayout(expirePreviewTabsInLayout(input.getLayout(), ownerResourceKey));\n input.persistLayout();\n },\n\n activateWidget(widgetId) {\n const layout = input.getLayout();\n for (const region of Object.values(layout.regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === widgetId);\n if (placement) return input.applyAndActivate(layout, region.id, placement);\n }\n throw new Error(`Widget placement not found: ${widgetId}`);\n },\n});\n","import type { LayoutModel } from \"./layout-model-types\";\nimport {\n closeWidgetInLayout,\n getActiveLocationPlacement,\n selectRegionActiveWidget,\n setLocationSubPanelSelection,\n} from \"./layout-operations\";\nimport {\n mergeWithDefaultRegions,\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchRegionState,\n workbenchPanelRegions,\n} from \"./layout-types\";\n\nexport interface CreateLayoutRegionContentMethodsInput {\n defaultRegionVisibility?: Partial<Record<WorkbenchRegion, boolean>>;\n getLayout(): WorkbenchLayout;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n}\n\n// Edits to the widgets inside regions: selecting, closing, clearing, and restoring them.\nexport const createLayoutRegionContentMethods = (\n input: CreateLayoutRegionContentMethodsInput,\n): Pick<\n LayoutModel,\n \"setRegionActiveWidget\" | \"closeWidget\" | \"removeWidgetPlacement\" | \"clearRegion\" | \"resetRegions\" | \"restoreLayout\"\n> => {\n const { getLayout, setLayout, persistLayout } = input;\n\n return {\n setRegionActiveWidget(regionId, widgetId) {\n const nextLayout = selectRegionActiveWidget(getLayout(), regionId, widgetId);\n if (!nextLayout) return;\n setLayout(nextLayout);\n persistLayout();\n },\n\n closeWidget(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) throw new Error(`Widget placement not found: ${widgetId}`);\n if (result.closedPlacement.closable !== true) throw new Error(`Widget cannot be closed: ${widgetId}`);\n\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n removeWidgetPlacement(widgetId) {\n const result = closeWidgetInLayout(getLayout(), widgetId);\n if (!result) return undefined;\n setLayout(result.layout);\n persistLayout();\n return result.activePlacement;\n },\n\n clearRegion(regionId) {\n const layout = getLayout();\n const region = layout.regions[regionId];\n const activeWidgetId = region.activeWidgetId;\n\n const cleared: WorkbenchLayout = {\n ...layout,\n regions: { ...layout.regions, [regionId]: { ...region, widgets: [], activeWidgetId: undefined } },\n };\n let next =\n activeWidgetId && layout.activeWidgetId === activeWidgetId\n ? { ...cleared, activeWidgetId: undefined, activeResourceKey: undefined }\n : cleared;\n\n if (regionId !== \"side\" && workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) {\n next = setLocationSubPanelSelection(\n next,\n getActiveLocationPlacement(next),\n regionId as WorkbenchPanelRegion,\n undefined,\n );\n }\n\n setLayout(next);\n persistLayout();\n },\n\n resetRegions() {\n const layout = getLayout();\n const nextRegions = {} as WorkbenchLayout[\"regions\"];\n for (const [id, region] of Object.entries(layout.regions) as [WorkbenchRegion, WorkbenchRegionState][]) {\n nextRegions[id] = { ...region, widgets: [], activeWidgetId: undefined };\n }\n setLayout({\n regions: nextRegions,\n locationSubPanelSelections: {},\n activeWidgetId: undefined,\n activeLocationWidgetId: undefined,\n activeResourceKey: undefined,\n });\n persistLayout();\n },\n\n restoreLayout(layout) {\n setLayout(mergeWithDefaultRegions(layout, input.defaultRegionVisibility));\n persistLayout();\n },\n };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport type { WorkbenchLayout, WorkbenchRegion, WorkbenchRegionState } from \"./layout-types\";\n\nexport interface CreateLayoutRegionMethodsInput {\n getLayout(): WorkbenchLayout;\n setLayout(layout: WorkbenchLayout): void;\n persistLayout(): void;\n}\n\n// Region state edits share one write-and-persist path, so a region change is one layout change.\nexport const createLayoutRegionMethods = (\n input: CreateLayoutRegionMethodsInput,\n): Pick<LayoutModel, \"setRegionVisible\" | \"setRegionSize\" | \"setSidePanelMode\"> => {\n const updateRegion = (regionId: WorkbenchRegion, update: (region: WorkbenchRegionState) => WorkbenchRegionState) => {\n const layout = input.getLayout();\n const region = layout.regions[regionId];\n const nextRegion = update(region);\n if (nextRegion === region) return;\n input.setLayout({ ...layout, regions: { ...layout.regions, [regionId]: nextRegion } });\n input.persistLayout();\n };\n\n return {\n setRegionVisible(regionId, visible) {\n updateRegion(regionId, (region) => (region.visible === visible ? region : { ...region, visible }));\n },\n\n setRegionSize(regionId, size) {\n updateRegion(regionId, (region) => (region.size === size ? region : { ...region, size }));\n },\n\n setSidePanelMode(mode) {\n updateRegion(\"side\", (region) => {\n if (mode === \"closed\") return region.visible ? { ...region, visible: false } : region;\n return region.visible && region.presentation === mode\n ? region\n : { ...region, visible: true, presentation: mode };\n });\n },\n };\n};\n","import { createDisposable } from \"../../shared/disposable\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport {\n createDefaultWorkbenchLayout,\n mergeWithDefaultRegions,\n type WorkbenchLayout,\n type WorkbenchRegion,\n} from \"./layout-types\";\n\nexport const carryPinnedWorkbenchChrome = (current: WorkbenchLayout, incoming: WorkbenchLayout) => {\n const regions = { ...incoming.regions };\n\n for (const region of Object.values(current.regions)) {\n const pinned = region.widgets.filter((placement) => placement.pinned && placement.role === \"content\");\n if (pinned.length === 0) continue;\n const contributionIds = new Set(pinned.map((placement) => placement.contributionId));\n const incomingRegion = incoming.regions[region.id];\n regions[region.id] = {\n ...incomingRegion,\n widgets: [\n ...pinned,\n ...incomingRegion.widgets.filter((placement) => !contributionIds.has(placement.contributionId)),\n ],\n activeWidgetId: incomingRegion.activeWidgetId ?? pinned[0]?.widgetId,\n };\n }\n return { ...incoming, regions };\n};\n\nexport const carryWorkbenchRegionState = (\n current: WorkbenchLayout,\n incoming: WorkbenchLayout,\n regionIds: readonly WorkbenchRegion[],\n) => {\n if (regionIds.length === 0) return incoming;\n const regions = { ...incoming.regions };\n for (const regionId of regionIds) regions[regionId] = current.regions[regionId];\n return { ...incoming, regions };\n};\n\nexport const resolveScopedLayout = (\n defaultRegionVisibility: Partial<Record<WorkbenchRegion, boolean>> | undefined,\n persisted: WorkbenchLayout | undefined,\n) =>\n persisted\n ? mergeWithDefaultRegions(persisted, defaultRegionVisibility)\n : createDefaultWorkbenchLayout(defaultRegionVisibility);\n\nexport const createScopeEvent = <T>() => {\n const listeners = new Set<(value: T) => void>();\n return {\n notify(value: T) {\n for (const listener of listeners) runWorkbenchEffect(\"layout scope subscriber\", () => listener(value));\n },\n subscribe(listener: (value: T) => void) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { LayoutModel, LayoutPersistenceAdapter, LayoutScope } from \"./layout-model-types\";\nimport {\n carryPinnedWorkbenchChrome,\n carryWorkbenchRegionState,\n createScopeEvent,\n resolveScopedLayout,\n} from \"./layout-scope\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\n\nexport interface CreateLayoutScopeMethodsInput {\n defaultRegionVisibility?: Partial<Record<WorkbenchRegion, boolean>>;\n getLayout(): WorkbenchLayout;\n persistence?: LayoutPersistenceAdapter;\n setLayout(layout: WorkbenchLayout, action: string): void;\n}\n\n// Owns the active persistence scope and the layout rotation that follows it. Kept\n// beside the layout model so the model factory stays a wiring surface.\nexport const createLayoutScopeMethods = (input: CreateLayoutScopeMethodsInput) => {\n let currentScope: LayoutScope | undefined;\n // Answers \"was this scope entered with a layout the user already had?\", sampled when\n // the scope becomes current. Reading persistence live would be wrong: entering a mode\n // restores and persists panels before the mode seeds, so a new scope would look like\n // a returning one and never get its defaults.\n let enteredWithLayout =\n runWorkbenchEffect(\"layout cache read for unscoped\", () => input.persistence?.getLayout(undefined)) !== undefined;\n const willChangeScope = createScopeEvent<LayoutScope | undefined>();\n const didChangeScope = createScopeEvent<LayoutScope | undefined>();\n\n const persistLayout = () =>\n runWorkbenchEffect(`layout cache for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.setLayout(input.getLayout(), currentScope),\n );\n\n const setPersistenceScope: LayoutModel[\"setPersistenceScope\"] = (nextScope, scopeInput = {}) => {\n if (currentScope === nextScope) return;\n persistLayout();\n willChangeScope.notify(nextScope);\n currentScope = nextScope;\n const incoming = runWorkbenchEffect(`layout cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getLayout(currentScope),\n );\n enteredWithLayout = incoming !== undefined;\n const scopedLayout = resolveScopedLayout(input.defaultRegionVisibility, incoming);\n // Module-owned chrome is global workbench structure. Project scopes replace\n // Location workspaces, but must not unmount pinned navigation and headers.\n const withPinnedChrome = carryPinnedWorkbenchChrome(input.getLayout(), scopedLayout);\n const nextLayout = carryWorkbenchRegionState(\n input.getLayout(),\n withPinnedChrome,\n scopeInput.carryRegionState ?? [],\n );\n input.setLayout(nextLayout, \"setPersistenceScope\");\n didChangeScope.notify(currentScope);\n };\n\n return {\n getPersistenceScope: () => currentScope,\n // Live: whether anything is stored for the active scope right now.\n hasPersistedLayout: () =>\n runWorkbenchEffect(`layout cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getLayout(currentScope),\n ) !== undefined,\n enteredWithPersistedLayout: () => enteredWithLayout,\n onDidChangePersistenceScope: didChangeScope.subscribe,\n onWillChangePersistenceScope: willChangeScope.subscribe,\n persistLayout,\n setPersistenceScope,\n };\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport {\n buildUpdatedPlacement,\n createPlacement,\n createUniqueWidgetId,\n findPlacement,\n findResourcePlacement,\n getActiveLocationPlacement,\n replaceRegionWidgets,\n} from \"./layout-operations\";\nimport { placeWidget } from \"./layout-tab-lifecycle\";\nimport type {\n OpenWidgetInput,\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\ninterface CreateWidgetOpenersInput {\n getLayout(): WorkbenchLayout;\n requireWidget(id: string): RegisteredWidgetContribution;\n applyAndActivate(\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ): WorkbenchWidgetPlacement;\n}\nconst openOwnedPanelMenus = (input: {\n openWidget(id: string, openInput?: OpenWidgetInput): WorkbenchWidgetPlacement;\n placement: WorkbenchWidgetPlacement;\n requireWidget(id: string): RegisteredWidgetContribution;\n widget: RegisteredWidgetContribution;\n}) => {\n for (const panelMenuId of input.widget.ownedPanelMenuIds ?? []) {\n const panelMenu = input.requireWidget(panelMenuId);\n input.openWidget(panelMenuId, {\n pinned: true,\n role: \"panel-menu\",\n viewId: panelMenu.rendererId,\n resource: input.placement.resource,\n title: panelMenu.region === \"main-left-menu\" ? input.placement.resource?.label : panelMenu.title,\n });\n }\n};\nconst findReusablePlacement = (\n widget: RegisteredWidgetContribution,\n layout: WorkbenchLayout,\n openInput: OpenWidgetInput,\n) => {\n if (!widget.singleton && widget.reuse === \"none\") return undefined;\n if (openInput.role === \"sub-panel\" || openInput.role === \"panel-menu\") {\n const ownerResourceKey = getActiveLocationPlacement(layout)?.resourceKey;\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) =>\n candidate.contributionId === widget.id &&\n // Pinned placements are structural chrome, not per-location content, so they are\n // reused across location switches instead of accumulating one instance per owner.\n (candidate.pinned === true ||\n (widget.singleton && candidate.ownerResourceKey === undefined) ||\n candidate.ownerResourceKey === ownerResourceKey) &&\n (!openInput.resource ||\n (widget.singleton && candidate.resourceKey === undefined) ||\n candidate.resourceKey === resourceKey(openInput.resource)),\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n }\n if (widget.singleton) return findPlacement(layout, widget.id);\n if (openInput.resource) return findResourcePlacement(layout, widget.id, resourceKey(openInput.resource));\n return findPlacement(layout, widget.id);\n};\nconst withPlacementRole = (widget: RegisteredWidgetContribution, openInput: OpenWidgetInput): OpenWidgetInput => {\n if (openInput.role) return openInput;\n if (widget.panelMenuOwner) return { ...openInput, role: \"panel-menu\" };\n if (widget.eligibleLocations !== undefined) return { ...openInput, role: \"sub-panel\" };\n return openInput;\n};\nconst findReplacementIndex = (layout: WorkbenchLayout, regionId: WorkbenchRegion, openInput: OpenWidgetInput) => {\n const region = layout.regions[regionId];\n const activeWidgetId = openInput.role === \"location\" ? layout.activeLocationWidgetId : region.activeWidgetId;\n if (openInput.replaceWidgetId) {\n return region.widgets.findIndex((placement) => placement.widgetId === openInput.replaceWidgetId);\n }\n if (openInput.tabRetention === \"preview\") {\n return region.widgets.findIndex((placement) => placement.tabRetention === \"preview\");\n }\n if (!openInput.replaceActive) return -1;\n const replacementWidgetId =\n regionId === \"main\" && openInput.resource && layout.activeLocationWidgetId\n ? layout.activeLocationWidgetId\n : activeWidgetId;\n return region.widgets.findIndex((placement) => placement.widgetId === replacementWidgetId && !placement.pinned);\n};\nconst defaultTabPosition = (\n widgets: WorkbenchWidgetPlacement[],\n widget: RegisteredWidgetContribution,\n requireWidget: (id: string) => RegisteredWidgetContribution,\n) => {\n const before = widgets.find((placement) => {\n try {\n return widget.priority > requireWidget(placement.contributionId).priority;\n } catch {\n return widget.priority > 0;\n }\n });\n return before ? ({ beforeWidgetId: before.widgetId } as const) : undefined;\n};\nexport const createWidgetOpeners = (input: CreateWidgetOpenersInput) => {\n const { getLayout, requireWidget, applyAndActivate } = input;\n const bindToActiveLocation = (placement: WorkbenchWidgetPlacement, layout: WorkbenchLayout) => {\n if (placement.role !== \"sub-panel\" && placement.role !== \"panel-menu\") return placement;\n return { ...placement, ownerResourceKey: getActiveLocationPlacement(layout)?.resourceKey };\n };\n const updateSingleton = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), existing.regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === existing.index ? nextPlacement : current));\n if (!openInput.tabPosition) return updated;\n return placeWidget(\n updated.filter((placement) => placement.widgetId !== nextPlacement.widgetId),\n nextPlacement,\n openInput.tabPosition,\n );\n });\n return applyAndActivate(layout, existing.regionId, nextPlacement);\n };\n const replaceActive = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n replacement: WorkbenchWidgetPlacement,\n openInput: OpenWidgetInput,\n ) => {\n const nextPlacement = bindToActiveLocation(buildUpdatedPlacement(replacement, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n const updated = widgets.map((current, index) => (index === replacementIndex ? nextPlacement : current));\n if (nextPlacement.tabRetention !== \"preview\") return updated;\n return placeWidget(updated, nextPlacement, \"start\");\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n const reuseExistingPlacement = (\n widget: RegisteredWidgetContribution,\n existing: NonNullable<ReturnType<typeof findPlacement>>,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n if (openInput.tabRetention === \"preview\" && existing.placement.tabRetention !== \"preview\") {\n return applyAndActivate(getLayout(), existing.regionId, existing.placement);\n }\n if (existing.regionId !== regionId) {\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const withoutExisting = replaceRegionWidgets(\n getLayout(),\n existing.regionId,\n (widgets) => widgets.filter((_current, index) => index !== existing.index),\n { clearActiveWidget: getLayout().regions[existing.regionId].activeWidgetId === existing.placement.widgetId },\n );\n const layout = replaceRegionWidgets(withoutExisting, regionId, (widgets) => {\n if (replacementIndex < 0) return placeWidget(widgets, nextPlacement, openInput.tabPosition);\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, nextPlacement);\n return nextPlacement.tabRetention === \"preview\" ? placeWidget(copy, nextPlacement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, nextPlacement);\n }\n if (replacementIndex < 0 || existing.index === replacementIndex) {\n return updateSingleton(widget, existing, openInput);\n }\n const nextPlacement = bindToActiveLocation(\n buildUpdatedPlacement(existing.placement, widget, openInput),\n getLayout(),\n );\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) =>\n placeWidget(\n widgets\n .map((current, index) => (index === existing.index ? nextPlacement : current))\n .filter((_current, index) => index !== replacementIndex && index !== existing.index),\n nextPlacement,\n openInput.tabPosition,\n ),\n );\n return applyAndActivate(layout, regionId, nextPlacement);\n };\n const insertWidget = (\n widget: RegisteredWidgetContribution,\n regionId: WorkbenchRegion,\n replacementIndex: number,\n openInput: OpenWidgetInput,\n ) => {\n const widgetId = createUniqueWidgetId(getLayout(), widget.id);\n const placement = bindToActiveLocation(createPlacement(widgetId, widget, openInput), getLayout());\n const layout = replaceRegionWidgets(getLayout(), regionId, (widgets) => {\n if (replacementIndex < 0) {\n return placeWidget(\n widgets,\n placement,\n openInput.tabPosition ?? defaultTabPosition(widgets, widget, requireWidget),\n );\n }\n const copy = [...widgets];\n copy.splice(replacementIndex, 1, placement);\n return placement.tabRetention === \"preview\" ? placeWidget(copy, placement, \"start\") : copy;\n });\n return applyAndActivate(layout, regionId, placement);\n };\n const openWidget = (id: string, openInput: OpenWidgetInput = {}): WorkbenchWidgetPlacement => {\n const widget = requireWidget(id);\n const placementInput = withPlacementRole(widget, openInput);\n const layout = getLayout();\n const regionId = placementInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n const region = layout.regions[regionId];\n const replacementIndex = findReplacementIndex(layout, regionId, placementInput);\n const replacement = replacementIndex >= 0 ? region.widgets[replacementIndex] : undefined;\n const previewContent =\n !placementInput.replaceWidgetId && placementInput.tabRetention === \"preview\" && placementInput.resource\n ? findResourcePlacement(layout, widget.id, resourceKey(placementInput.resource))\n : undefined;\n const existing =\n placementInput.replaceWidgetId && replacement ? undefined : findReusablePlacement(widget, layout, placementInput);\n let placement: WorkbenchWidgetPlacement;\n if (previewContent) {\n placement = applyAndActivate(layout, previewContent.regionId, previewContent.placement);\n } else if (existing) {\n placement = reuseExistingPlacement(widget, existing, regionId, replacementIndex, placementInput);\n } else if (replacement?.contributionId === widget.id) {\n placement = replaceActive(widget, regionId, replacementIndex, replacement, placementInput);\n } else {\n placement = insertWidget(widget, regionId, replacementIndex, placementInput);\n }\n openOwnedPanelMenus({ openWidget, placement, requireWidget, widget });\n return applyAndActivate(getLayout(), previewContent?.regionId ?? regionId, placement);\n };\n return { openWidget };\n};\n","import type { LayoutModel } from \"./layout-model-types\";\nimport { closeWidgetInLayout, findPlacementByWidgetId } from \"./layout-operations\";\nimport {\n type OpenWorkbenchPanelInput,\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchLayoutStoreState,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n workbenchPanelRegions,\n} from \"./layout-types\";\nimport { toOpenWidgetInput, toPanelContribution, toPanelInstance } from \"./panel-api\";\n\n// A programmatic open into a tabbed region is a peek: it lands as a preview tab that the\n// next peek replaces. Chrome regions and pinned placements are structure, so they stay put.\nconst defaultPanelTabRetention = (widget: RegisteredWidgetContribution, openInput: OpenWorkbenchPanelInput) => {\n if (openInput.pinned) return \"persistent\" as const;\n const region = openInput.region ?? widget.region ?? widget.fallbackRegion ?? \"main\";\n return workbenchPanelRegions.includes(region as WorkbenchPanelRegion)\n ? (\"preview\" as const)\n : (\"persistent\" as const);\n};\n\ninterface CreatePanelLayoutMethodsInput {\n getLayout: () => WorkbenchLayout;\n getWidgets: () => WorkbenchLayoutStoreState[\"widgets\"];\n listWidgets: LayoutModel[\"listWidgets\"];\n persistLayout: () => void;\n placementMethods: Pick<LayoutModel, \"activateWidget\" | \"reorderWidget\" | \"updateWidgetPlacement\">;\n setLayout: (layout: WorkbenchLayout) => void;\n widgetOpeners: Pick<LayoutModel, \"openWidget\">;\n}\n\nexport const createPanelLayoutMethods = (input: CreatePanelLayoutMethodsInput) => ({\n getPanel(id: string) {\n const widget = input.getWidgets()[id];\n return widget ? toPanelContribution(widget) : undefined;\n },\n\n listPanels: () => input.listWidgets().map(toPanelContribution),\n\n listPanelInstances(region?: WorkbenchRegion) {\n const placements = region\n ? input.getLayout().regions[region].widgets\n : Object.values(input.getLayout().regions).flatMap((candidate) => candidate.widgets);\n return placements.map(toPanelInstance);\n },\n\n getActivePanel(region?: WorkbenchRegion) {\n if (region) {\n const state = input.getLayout().regions[region];\n const placement =\n state.widgets.find((candidate) => candidate.widgetId === state.activeWidgetId) ?? state.widgets[0];\n return placement ? toPanelInstance(placement) : undefined;\n }\n const activeInstanceId = input.getLayout().activeWidgetId;\n if (!activeInstanceId) return undefined;\n const found = findPlacementByWidgetId(input.getLayout(), activeInstanceId);\n return found ? toPanelInstance(found.placement) : undefined;\n },\n\n openPanel(id: string, openInput: OpenWorkbenchPanelInput = {}) {\n const widget = input.getWidgets()[id];\n if (!widget) throw new Error(`Panel not registered: ${id}`);\n return toPanelInstance(\n input.widgetOpeners.openWidget(id, toOpenWidgetInput(openInput, defaultPanelTabRetention(widget, openInput))),\n );\n },\n\n updatePanel(instanceId: string, update: OpenWorkbenchPanelInput) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.updateWidgetPlacement(instanceId, toOpenWidgetInput(update)));\n },\n\n reorderPanel(instanceId: string, position: Parameters<LayoutModel[\"reorderPanel\"]>[1]) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n input.placementMethods.reorderWidget(instanceId, position);\n },\n\n activatePanel(instanceId: string) {\n if (!findPlacementByWidgetId(input.getLayout(), instanceId)) {\n throw new Error(`Panel instance not found: ${instanceId}`);\n }\n return toPanelInstance(input.placementMethods.activateWidget(instanceId));\n },\n\n closePanel(instanceId: string) {\n const found = findPlacementByWidgetId(input.getLayout(), instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n if (found.placement.closable !== true) throw new Error(`Panel cannot be closed: ${instanceId}`);\n const active = closeWidgetInLayout(input.getLayout(), instanceId);\n if (!active) throw new Error(`Panel instance not found: ${instanceId}`);\n input.setLayout(active.layout);\n input.persistLayout();\n return active.activePlacement ? toPanelInstance(active.activePlacement) : undefined;\n },\n});\n","import type { LayoutModel } from \"./layout-model-types\";\nimport {\n type RegisteredWidgetContribution,\n type WorkbenchLayout,\n type WorkbenchPanelMenuRegion,\n type WorkbenchPanelMenuSide,\n type WorkbenchPanelRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n} from \"./layout-types\";\n\ntype GetWidget = (contributionId: string) => RegisteredWidgetContribution | undefined;\n\nconst menuRegions = Object.values(workbenchPanelMenuRegions).flatMap(\n (regions) => Object.values(regions) as WorkbenchPanelMenuRegion[],\n);\n\nconst menuSide = (region: WorkbenchPanelMenuRegion): WorkbenchPanelMenuSide =>\n region.endsWith(\"-left-menu\") ? \"left\" : \"right\";\n\nconst ownerContributionId = (getWidget: GetWidget, contributionId: string) =>\n getWidget(contributionId)?.panelMenuOwner?.contributionId;\n\nconst ownerPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of workbenchPanelRegions) {\n const placement = layout.regions[region].widgets.find((candidate) => candidate.contributionId === contributionId);\n if (placement) return { region, placement };\n }\n return undefined;\n};\n\ninterface MenuResolution {\n placements: WorkbenchWidgetPlacement[];\n changed: boolean;\n}\n\n// One placement per owned menu contribution. A panel opened without a resource and\n// then reopened with one would otherwise leave its first menu behind, because menu\n// reuse keys on the owner's resource. Keeping the first placement and rebinding it\n// preserves the menu's identity and active state.\nconst resolveMenuPlacements = (\n layout: WorkbenchLayout,\n getWidget: GetWidget,\n region: WorkbenchPanelMenuRegion,\n): MenuResolution & { moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] } => {\n const placements: WorkbenchWidgetPlacement[] = [];\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n const seen = new Set<string>();\n let changed = false;\n\n for (const placement of layout.regions[region].widgets) {\n const owner = ownerContributionId(getWidget, placement.contributionId);\n if (!owner) {\n placements.push(placement);\n continue;\n }\n if (seen.has(placement.contributionId)) {\n changed = true;\n continue;\n }\n seen.add(placement.contributionId);\n\n const found = ownerPlacement(layout, owner);\n if (!found) {\n // Orphaned menu: its owner panel has no placement anywhere.\n changed = true;\n continue;\n }\n\n const bound =\n placement.ownerResourceKey === found.placement.resourceKey\n ? placement\n : { ...placement, ownerResourceKey: found.placement.resourceKey };\n if (bound !== placement) changed = true;\n\n const target = workbenchPanelMenuRegions[found.region as WorkbenchPanelRegion][menuSide(region)];\n if (target === region) {\n placements.push(bound);\n continue;\n }\n changed = true;\n moves.push({ placement: bound, target });\n }\n\n return { changed, moves, placements };\n};\n\n// A panel instance owns its menu instances: menus render beside the region their\n// owner currently occupies, stay bound to the owner's resource, and a menu whose\n// owner has no placement is an orphan. Menu identity (widget id, active state) is\n// preserved on a move; no second instance is created.\nexport const reconcilePanelMenuOwnership = (layout: WorkbenchLayout, getWidget: GetWidget): WorkbenchLayout => {\n let changed = false;\n const regions = { ...layout.regions };\n const moves: { placement: WorkbenchWidgetPlacement; target: WorkbenchPanelMenuRegion }[] = [];\n\n for (const menuRegion of menuRegions) {\n if (layout.regions[menuRegion].widgets.length === 0) continue;\n const resolved = resolveMenuPlacements(layout, getWidget, menuRegion);\n moves.push(...resolved.moves);\n if (!resolved.changed) continue;\n\n changed = true;\n const region = regions[menuRegion];\n regions[menuRegion] = {\n ...region,\n widgets: resolved.placements,\n activeWidgetId: resolved.placements.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n\n for (const move of moves) {\n const target = regions[move.target];\n regions[move.target] = { ...target, widgets: [...target.widgets, move.placement] };\n }\n\n return changed ? { ...layout, regions } : layout;\n};\n\nexport interface CreateOwnedMenuMethodsInput {\n getLayout(): WorkbenchLayout;\n getWidget: GetWidget;\n openWidget: LayoutModel[\"openWidget\"];\n persistLayout(): void;\n setLayout(layout: WorkbenchLayout): void;\n}\n\n// Every open (including a region move or a rebind to a resource) reconciles the\n// owned menus of the panel that moved, so a panel instance always has exactly one\n// instance of each menu it owns.\nexport const createOwnedMenuMethods = (input: CreateOwnedMenuMethodsInput) => {\n const reconcilePanelMenus = () => {\n const next = reconcilePanelMenuOwnership(input.getLayout(), input.getWidget);\n if (next === input.getLayout()) return;\n input.setLayout(next);\n input.persistLayout();\n };\n\n const openWidget: LayoutModel[\"openWidget\"] = (id, openInput) => {\n const placement = input.openWidget(id, openInput);\n reconcilePanelMenus();\n return placement;\n };\n\n return { openWidget, reconcilePanelMenus };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type {\n WidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelRegion,\n} from \"./layout-types\";\nimport { workbenchPanelMenuRegions, workbenchPanelRegions } from \"./layout-types\";\n\ntype RegisteredPanelInput = WorkbenchPanelContribution;\ntype WorkbenchPanelKind = \"panel\" | \"sub-panel\";\n\ninterface RegisterPanelContributionInput {\n metadata?: ContributionMetadata;\n panel: RegisteredPanelInput;\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n kind: WorkbenchPanelKind;\n}\n\ninterface CreatePanelRegistrationsInput {\n registerWidget(widget: WidgetContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nconst panelMenuContribution = (\n panel: RegisteredPanelInput,\n menu: WorkbenchPanelMenuDefinition,\n kind: WorkbenchPanelKind,\n): WidgetContribution => {\n const { side, ...contribution } = menu;\n const region = panel.region as WorkbenchPanelRegion;\n const fallbackRegion = workbenchPanelRegions.find((candidate) => candidate === panel.fallbackRegion);\n return {\n ...contribution,\n region: workbenchPanelMenuRegions[region][side],\n fallbackRegion: fallbackRegion ? workbenchPanelMenuRegions[fallbackRegion][side] : undefined,\n panelMenuOwner: {\n level: kind === \"sub-panel\" ? \"sub-panel\" : \"panel\",\n contributionId: panel.id,\n },\n };\n};\n\nexport const registerPanelContribution = (input: RegisterPanelContributionInput) => {\n const { kind, metadata, panel, registerWidget } = input;\n const { panelMenus = [], ...panelContribution } = panel;\n const registrations: Disposable[] = [];\n\n if (panelMenus.length > 0 && !workbenchPanelRegions.includes(panel.region as WorkbenchPanelRegion)) {\n throw new Error(`Panel Menus require a Panel region: ${panel.id}`);\n }\n\n try {\n const registeredPanel: WidgetContribution & { ownedPanelMenuIds: readonly string[] } = {\n ...panelContribution,\n ownedPanelMenuIds: panelMenus.map((menu) => menu.id),\n };\n registrations.push(registerWidget(registeredPanel, metadata));\n for (const menu of panelMenus) {\n registrations.push(registerWidget(panelMenuContribution(panel, menu, kind), metadata));\n }\n } catch (error) {\n for (const registration of registrations.reverse()) registration.dispose();\n throw error;\n }\n\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n};\n\nexport const createPanelRegistrations = (input: CreatePanelRegistrationsInput) => {\n const registerPanel = (panel: WorkbenchPanelContribution, metadata?: ContributionMetadata) => {\n return registerPanelContribution({\n panel,\n kind: panel.eligibleLocations ? \"sub-panel\" : \"panel\",\n metadata,\n registerWidget: input.registerWidget,\n });\n };\n\n const registerPanelMenu = (panelMenu: WorkbenchPanelMenuContribution, metadata?: ContributionMetadata) =>\n input.registerWidget({ ...panelMenu, panelMenuOwner: panelMenu.panelMenuOwner ?? { level: \"panel\" } }, metadata);\n\n return { registerPanel, registerPanelMenu };\n};\n","import { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n createContributionLists,\n createContributionRegistrations,\n createRegionQueries,\n} from \"./layout-contribution-helpers\";\nimport { createLocationEstablisher } from \"./layout-location-establisher\";\nimport type { CreateLayoutModelInput, LayoutModel } from \"./layout-model-types\";\nimport { activateInLayout, removePlacementsForContribution } from \"./layout-operations\";\nimport { createLayoutPlacementMethods } from \"./layout-placement-methods\";\nimport { createLayoutRegionContentMethods } from \"./layout-region-content-methods\";\nimport { createLayoutRegionMethods } from \"./layout-region-methods\";\nimport { resolveScopedLayout } from \"./layout-scope\";\nimport { createLayoutScopeMethods } from \"./layout-scope-methods\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchPanelInstance,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { createWidgetOpeners } from \"./layout-widget-openers\";\nimport { createPanelLayoutMethods } from \"./panel-layout-methods\";\nimport { createOwnedMenuMethods } from \"./panel-menu-ownership\";\nimport { createPanelRegistrations } from \"./panel-registration\";\n\nexport type {\n CreateLayoutModelInput,\n LayoutModel,\n LayoutPersistenceAdapter,\n LayoutScope,\n} from \"./layout-model-types\";\nexport type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n RegisteredWidgetContribution,\n WidgetContribution,\n WidgetMountStrategy,\n WidgetReusePolicy,\n WorkbenchCommandTarget,\n WorkbenchLayout,\n WorkbenchLayoutStoreState,\n WorkbenchLocationEligibility,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchPanelMenuContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchPanelMenuOwner,\n WorkbenchPanelMenuRegion,\n WorkbenchPanelMenuSide,\n WorkbenchPanelMountStrategy,\n WorkbenchPanelOpenStrategy,\n WorkbenchPanelRegion,\n WorkbenchPanelReusePolicy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchRegionSettings,\n WorkbenchRegionSize,\n WorkbenchRegionState,\n WorkbenchSidePanelMode,\n WorkbenchTabAction,\n WorkbenchTabMenuGroup,\n WorkbenchTabMenuRow,\n WorkbenchTabPosition,\n WorkbenchTabRetention,\n WorkbenchTabSnapshot,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n WorkbenchWidgetTab,\n} from \"./layout-types\";\nexport {\n createDefaultWorkbenchLayout,\n getWorkbenchPanelForMenuRegion,\n workbenchPanelMenuRegions,\n workbenchPanelRegions,\n workbenchRegions,\n} from \"./layout-types\";\n\ninterface LocationAwareLayoutModel extends LayoutModel {\n establishLocation(instanceId: string): WorkbenchPanelInstance;\n}\n\nconst requireRegisteredWidget = (\n widgets: WorkbenchLayoutStoreState[\"widgets\"],\n id: string,\n): RegisteredWidgetContribution => {\n const widget = widgets[id];\n if (!widget) throw new Error(`Widget not registered: ${id}`);\n return widget;\n};\n\nexport const createLayoutModel = (input: CreateLayoutModelInput = {}): LocationAwareLayoutModel => {\n const persisted = input.persistence?.getLayout(undefined);\n const initialLayout = resolveScopedLayout(input.defaultRegionVisibility, persisted);\n\n const store = createWorkbenchStore<WorkbenchLayoutStoreState>({\n name: \"workbench.layout\",\n initialState: { layout: initialLayout, widgets: {}, placeholders: {} },\n });\n\n const getLayout = () => store.getState().layout;\n const getPlaceholders = () => store.getState().placeholders;\n const getWidgets = () => store.getState().widgets;\n const getPlaceholder = (regionId: WorkbenchRegion) => getPlaceholders()[regionId];\n const regionQueries = createRegionQueries({\n getLayout,\n getWidgets,\n getPlaceholder,\n getRegionSettings: input.getRegionSettings,\n });\n const contributionLists = createContributionLists({ getPlaceholders, getWidgets });\n\n const scopeMethods = createLayoutScopeMethods({\n defaultRegionVisibility: input.defaultRegionVisibility,\n getLayout,\n persistence: input.persistence,\n setLayout: (layout, action) => store.setState({ ...store.getState(), layout }, false, action),\n });\n const persistLayout = () => scopeMethods.persistLayout();\n\n const requireWidget = (id: string) => requireRegisteredWidget(getWidgets(), id);\n\n const setLayout = (layout: WorkbenchLayout) => {\n const snapshot = store.getState();\n if (snapshot.layout === layout) return;\n store.setState({ ...snapshot, layout }, false, \"setLayout\");\n };\n\n const regionMethods = createLayoutRegionMethods({ getLayout, setLayout, persistLayout });\n const regionContentMethods = createLayoutRegionContentMethods({\n defaultRegionVisibility: input.defaultRegionVisibility,\n getLayout,\n setLayout,\n persistLayout,\n });\n\n const applyAndActivate = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n ) => {\n setLayout(activateInLayout(layout, regionId, placement));\n persistLayout();\n return placement;\n };\n\n const contributionRegistrations = createContributionRegistrations({\n store,\n getPlaceholders,\n getWidgets,\n persistLayout,\n });\n const panelRegistrations = createPanelRegistrations({\n registerWidget: contributionRegistrations.registerWidget,\n });\n const widgetOpeners = createWidgetOpeners({ getLayout, requireWidget, applyAndActivate });\n const placementMethods = createLayoutPlacementMethods({\n getLayout,\n requireWidget,\n setLayout,\n persistLayout,\n applyAndActivate,\n });\n const panelMethods = createPanelLayoutMethods({\n getLayout,\n getWidgets,\n listWidgets: contributionLists.listWidgets,\n persistLayout,\n placementMethods,\n setLayout,\n widgetOpeners,\n });\n const ownedMenus = createOwnedMenuMethods({\n getLayout,\n getWidget: (id) => getWidgets()[id],\n openWidget: widgetOpeners.openWidget,\n persistLayout,\n setLayout,\n });\n\n const establishLocation = createLocationEstablisher({\n applyAndActivate,\n getLayout,\n getWidget: requireWidget,\n panelMethods,\n });\n\n return {\n store,\n\n registerPlaceholder: contributionRegistrations.registerPlaceholder,\n\n registerWidget: contributionRegistrations.registerWidget,\n\n ...panelRegistrations,\n\n unregisterWidget(id, options = {}) {\n const current = store.getState();\n if (!current.widgets[id]) return;\n const { [id]: _removed, ...nextWidgets } = current.widgets;\n const nextLayout =\n options.removePlacements === false ? current.layout : removePlacementsForContribution(current.layout, id);\n store.setState({ ...current, widgets: nextWidgets, layout: nextLayout }, false, \"unregisterWidget\");\n if (options.persist !== false) persistLayout();\n },\n\n getWidget(id) {\n return getWidgets()[id];\n },\n\n getPlaceholder,\n\n getRegionSize: regionQueries.getRegionSize,\n getRegionSettings: (regionId) => input.getRegionSettings?.(regionId),\n getRegionCollapsible: regionQueries.getRegionCollapsible,\n getRegionHeaderBorderBottom: regionQueries.getRegionHeaderBorderBottom,\n\n ...regionMethods,\n\n listPlaceholders: contributionLists.listPlaceholders,\n listWidgets: contributionLists.listWidgets,\n ...panelMethods,\n openWidget: ownedMenus.openWidget,\n\n ...placementMethods,\n\n establishLocation,\n\n reconcilePanelMenus: ownedMenus.reconcilePanelMenus,\n\n ...regionContentMethods,\n\n getLayout,\n\n setPersistenceScope: scopeMethods.setPersistenceScope,\n getPersistenceScope: scopeMethods.getPersistenceScope,\n hasPersistedLayout: scopeMethods.hasPersistedLayout,\n enteredWithPersistedLayout: scopeMethods.enteredWithPersistedLayout,\n onWillChangePersistenceScope: scopeMethods.onWillChangePersistenceScope,\n onDidChangePersistenceScope: scopeMethods.onDidChangePersistenceScope,\n };\n};\n","import type { WorkbenchModeRegistry } from \"./mode-registry-types\";\n\ninterface WorkbenchModeRegistryInternals {\n activatePageMode(modeId: string | undefined, applyLayout: () => void): void;\n}\n\nconst modeRegistryInternals = new WeakMap<WorkbenchModeRegistry, WorkbenchModeRegistryInternals>();\n\nexport const setWorkbenchModeRegistryInternals = (\n registry: WorkbenchModeRegistry,\n internals: WorkbenchModeRegistryInternals,\n) => {\n modeRegistryInternals.set(registry, internals);\n};\n\nexport const activateWorkbenchPageMode = (\n registry: WorkbenchModeRegistry,\n modeId: string | undefined,\n applyLayout: () => void,\n) => {\n const internals = modeRegistryInternals.get(registry);\n if (!internals) throw new Error(\"Workbench mode registry internals are unavailable\");\n internals.activatePageMode(modeId, applyLayout);\n};\n","import { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { WorkbenchModeActivationContext, WorkbenchModeContribution } from \"./mode-registry-types\";\n\n// Runs the mode's one-shot seed and promotes the first Location-capable panel it opens\n// in main to a Location, so a freshly seeded scope starts with a Location.\nexport const seedModeScope = (\n mode: WorkbenchModeContribution,\n context: WorkbenchModeActivationContext,\n establishLocation: ((instanceId: string) => void) | undefined,\n) => {\n let locationEstablished = false;\n let unsubscribeMainPanel: () => void = () => undefined;\n const establishSeededLocation = () => {\n if (locationEstablished) return;\n const primary = context.layout.getActivePanel(\"main\");\n if (!primary) return;\n // Sub Panels cannot become Locations; keep waiting for a Location-capable\n // placement instead of consuming the one-shot on a tab.\n const placement = context.layout\n .getLayout()\n .regions.main.widgets.find((candidate) => candidate.widgetId === primary.instanceId);\n if (placement && (placement.role === \"sub-panel\" || placement.role === \"panel-menu\")) return;\n locationEstablished = true;\n unsubscribeMainPanel();\n establishLocation?.(primary.instanceId);\n };\n\n unsubscribeMainPanel = context.layout.store.subscribeSelector(\n (state) => state.layout.regions.main,\n establishSeededLocation,\n );\n try {\n runWorkbenchEffect(`mode ${mode.id}.seed`, () => mode.seed?.(context));\n establishSeededLocation();\n } finally {\n unsubscribeMainPanel();\n }\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { WorkbenchLayout } from \"../layout/layout-model\";\nimport {\n applyModePanelAvailability,\n disposeReverse,\n panelsForMode,\n restoreModeLayout,\n restoreUnscopedModeLayout,\n} from \"./mode-layout\";\nimport { setWorkbenchModeRegistryInternals } from \"./mode-registry-internals\";\nimport type {\n CreateWorkbenchModeRegistryInput,\n WorkbenchModeActivationResult,\n WorkbenchModeContribution,\n WorkbenchModeRegistry,\n WorkbenchModeStoreState,\n} from \"./mode-registry-types\";\nimport { seedModeScope } from \"./mode-seed-scope\";\n\nexport { getWorkbenchModePanelForRegion, isWorkbenchModePanelAvailable } from \"./mode-layout\";\nexport type {\n CreateWorkbenchModeRegistryInput,\n WorkbenchModeActivationContext,\n WorkbenchModeActivationResult,\n WorkbenchModeAddablePanel,\n WorkbenchModeAddablePanelContext,\n WorkbenchModeChangeListener,\n WorkbenchModeContribution,\n WorkbenchModeRegistry,\n WorkbenchModeStoreState,\n} from \"./mode-registry-types\";\n\nconst toDisposables = (result: WorkbenchModeActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nexport const createWorkbenchModeRegistry = (input: CreateWorkbenchModeRegistryInput): WorkbenchModeRegistry => {\n const store = createWorkbenchStore<WorkbenchModeStoreState>({\n name: \"workbench.modes\",\n initialState: { modes: {}, activeModeId: undefined },\n });\n\n const initializedModes = new Map<string, Disposable[]>();\n const seededScopes = new Set<string>();\n const unscopedLayouts = new Map<string, WorkbenchLayout>();\n let activeDisposables: Disposable[] = [];\n let activeModeContext: Disposable | undefined;\n let deferredSeedModeId: string | undefined;\n let transitioning = false;\n\n const initializeMode = (mode: WorkbenchModeContribution) => {\n if (initializedModes.has(mode.id)) return;\n const disposables = toDisposables(\n runWorkbenchEffect(`mode ${mode.id}.activate`, () => mode.activate(input.resolveContext())),\n );\n initializedModes.set(mode.id, disposables);\n };\n\n // Applies panel availability and seeds default placements only when the scope is\n // new: no persisted layout and not seeded earlier in this session.\n const prepareScope = (mode: WorkbenchModeContribution) => {\n const context = input.resolveContext();\n const scopeKey = `${mode.id}\\0${context.layout.getPersistenceScope() ?? \"unscoped\"}`;\n const availableLayout = applyModePanelAvailability(context.layout.getLayout(), panelsForMode(mode));\n restoreModeLayout(context, availableLayout);\n context.layout.reconcilePanelMenus();\n if (!seededScopes.has(scopeKey) && !context.layout.enteredWithPersistedLayout()) {\n seedModeScope(mode, context, input.establishLocation);\n }\n seededScopes.add(scopeKey);\n };\n\n // One reconciliation pass for every context activation: first activation,\n // reselecting the active mode, and persistence-scope changes. Repair of required\n // structure belongs to mode.reconcile and runs every time, so a user can recover\n // required placements by reselecting the active mode. Reconciliation must not\n // rerun activate or enter.\n const reconcileScope = (mode: WorkbenchModeContribution) => {\n prepareScope(mode);\n runWorkbenchEffect(`mode ${mode.id}.reconcile`, () => mode.reconcile?.(input.resolveContext()));\n };\n\n // Switching modes stashes the outgoing unscoped layout, disposes the active mode,\n // and restores the incoming mode's unscoped layout before activating it. Scoped\n // layouts are owned by the persistence scope instead.\n const transitionToMode = (id: string | undefined) => {\n const context = input.resolveContext();\n const previousModeId = store.getState().activeModeId;\n const unscoped = context.layout.getPersistenceScope() === undefined;\n if (previousModeId && unscoped) unscopedLayouts.set(previousModeId, context.layout.getLayout());\n\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n return;\n }\n\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n if (unscoped) {\n restoreModeLayout(\n context,\n restoreUnscopedModeLayout(context.layout.getLayout(), unscopedLayouts.get(id), panelsForMode(mode)),\n );\n }\n activate(id, { seed: deferredSeedModeId !== id });\n };\n\n const activatePageMode = (id: string | undefined, applyLayout: () => void) => {\n if (id && !store.getState().modes[id]) throw new Error(`Workbench mode not registered: ${id}`);\n if (id === store.getState().activeModeId) {\n applyLayout();\n return;\n }\n // Publish the page's mode before its layout. Layout listeners may open panels\n // owned by that mode as soon as the new primary resource appears.\n transitioning = true;\n deferredSeedModeId = undefined;\n try {\n disposeActive();\n if (id === undefined) {\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivatePageMode\");\n applyLayout();\n return;\n }\n activate(id, { seed: false, afterPublish: applyLayout });\n } finally {\n transitioning = false;\n }\n };\n\n const disposeActive = () => {\n disposeReverse(activeDisposables);\n activeDisposables = [];\n activeModeContext?.dispose();\n activeModeContext = undefined;\n };\n\n const activate = (id: string, options: { seed: boolean; afterPublish?: () => void }) => {\n const context = input.resolveContext();\n const mode = store.getState().modes[id];\n if (!mode) throw new Error(`Workbench mode not registered: ${id}`);\n\n const contextScope = context.context.createScope(\"workbench.mode\");\n contextScope.set(\"activeWorkbenchMode\", id);\n contextScope.set(`workbenchMode.${id}`, true);\n activeModeContext = contextScope;\n try {\n initializeMode(mode);\n store.setState({ ...store.getState(), activeModeId: id }, false, \"activateMode\");\n options.afterPublish?.();\n if (options.seed) prepareScope(mode);\n activeDisposables = toDisposables(runWorkbenchEffect(`mode ${mode.id}.enter`, () => mode.enter?.(context)));\n if (options.seed) runWorkbenchEffect(`mode ${mode.id}.reconcile`, () => mode.reconcile?.(input.resolveContext()));\n } catch (error) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n throw error;\n }\n };\n\n const scopeSubscription = input.layout.onDidChangePersistenceScope(() => {\n const activeModeId = store.getState().activeModeId;\n if (activeModeId === deferredSeedModeId) return;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n if (mode) reconcileScope(mode);\n });\n const registryDisposable = createDisposable(() => {\n scopeSubscription.dispose();\n disposeActive();\n for (const disposables of initializedModes.values()) disposeReverse(disposables);\n initializedModes.clear();\n seededScopes.clear();\n unscopedLayouts.clear();\n store.setState({ modes: {}, activeModeId: undefined }, false, \"disposeModes\");\n });\n\n const registry: WorkbenchModeRegistry = {\n store,\n\n dispose() {\n registryDisposable.dispose();\n },\n\n registerMode(mode) {\n const snapshot = store.getState();\n if (snapshot.modes[mode.id]) throw new Error(`Workbench mode already registered: ${mode.id}`);\n\n store.setState({ ...snapshot, modes: { ...snapshot.modes, [mode.id]: mode } }, false, \"registerMode\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.modes[mode.id] !== mode) return;\n if (current.activeModeId === mode.id) {\n disposeActive();\n store.setState({ ...store.getState(), activeModeId: undefined }, false, \"deactivateMode\");\n }\n disposeReverse(initializedModes.get(mode.id) ?? []);\n initializedModes.delete(mode.id);\n unscopedLayouts.delete(mode.id);\n for (const scopeKey of seededScopes) {\n if (scopeKey.startsWith(`${mode.id}\\0`)) seededScopes.delete(scopeKey);\n }\n const { [mode.id]: _removed, ...rest } = current.modes;\n store.setState({ ...store.getState(), modes: rest }, false, \"unregisterMode\");\n });\n },\n\n getMode(id) {\n return store.getState().modes[id];\n },\n\n listModes() {\n return Object.values(store.getState().modes);\n },\n\n getActiveModeId() {\n return store.getState().activeModeId;\n },\n\n // A deferred seed is the second half of one transition: the caller rotates the\n // layout persistence scope between the two halves. Observers must not treat the\n // gap as a settled context, so the transition is not over until the seed runs.\n isTransitioning() {\n return transitioning || deferredSeedModeId !== undefined;\n },\n\n setActiveMode(id, setActiveInput = {}) {\n if (id === store.getState().activeModeId) {\n // Reselecting the active mode reconciles its layout without disposing or\n // rerunning enter, so a missing required placement can recover.\n const mode = id ? store.getState().modes[id] : undefined;\n if (mode && id !== deferredSeedModeId) reconcileScope(mode);\n return;\n }\n transitioning = true;\n deferredSeedModeId = setActiveInput.deferSeed ? id : undefined;\n try {\n transitionToMode(id);\n } finally {\n transitioning = false;\n }\n },\n\n seedActiveMode() {\n const activeModeId = store.getState().activeModeId;\n const mode = activeModeId ? store.getState().modes[activeModeId] : undefined;\n transitioning = true;\n try {\n if (mode) reconcileScope(mode);\n } finally {\n deferredSeedModeId = undefined;\n transitioning = false;\n }\n },\n\n onDidChangeActive(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeModeId,\n () => listener(),\n );\n return createDisposable(unsubscribe);\n },\n };\n\n setWorkbenchModeRegistryInternals(registry, { activatePageMode });\n return registry;\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type {\n WidgetMountStrategy,\n WorkbenchPanelTab,\n WorkbenchRegion,\n WorkbenchWidgetRole,\n} from \"../layout/layout-types\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport type { WorkbenchViewRegistry } from \"./view-registry\";\n\nexport interface WorkbenchPlacementPresentation {\n mountStrategy?: WidgetMountStrategy;\n hiddenByDefault?: boolean;\n headerBorderBottom?: boolean;\n tab?: WorkbenchPanelTab;\n config?: unknown;\n}\n\nexport interface RegisterWorkbenchViewPlacementInput extends WorkbenchPlacementPresentation {\n id: string;\n viewId: string;\n region: WorkbenchRegion;\n role: WorkbenchWidgetRole;\n singleton: boolean;\n closable: boolean;\n}\n\nexport const registerWorkbenchViewPlacement = (\n layout: Pick<LayoutModel, \"registerPanel\">,\n views: WorkbenchViewRegistry,\n input: RegisterWorkbenchViewPlacementInput,\n viewMenus?: WorkbenchViewMenuRegistry,\n): Disposable => {\n const view = views.getView(input.viewId);\n if (!view) throw new Error(`Workbench placement view is not registered: ${input.viewId}`);\n const { role: _role, viewId: _viewId, ...panel } = input;\n return layout.registerPanel({\n ...panel,\n title: view.title,\n icon: view.icon,\n rendererId: view.id,\n panelMenus: viewMenus?.definitionsFor(view.id, input.id),\n });\n};\n\nexport const modePlacementContributionId = (placementId: string) =>\n `workbench.mode-placement.${encodeURIComponent(placementId)}`;\n\nexport const pagePlacementContributionId = (pageId: string, slotId: string) =>\n `workbench.page-placement.${encodeURIComponent(pageId)}.${encodeURIComponent(slotId)}`;\n","import { type WorkbenchRegion, workbenchPanelRegions } from \"../../registries/layout/layout-types\";\nimport { isWorkbenchModePanelAvailable } from \"../../registries/modes/mode-layout\";\nimport type { WorkbenchModeContribution } from \"../../registries/modes/mode-registry\";\nimport { modePlacementContributionId } from \"../../registries/views/view-placement\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\ninterface PanelDestinationPolicy {\n mode?: WorkbenchModeContribution;\n movableTo?: readonly WorkbenchRegion[];\n allowedRegions?: readonly WorkbenchRegion[];\n}\n\nexport const allowedPanelDestinations = (policy: PanelDestinationPolicy) =>\n workbenchPanelRegions.filter(\n (region) =>\n isWorkbenchModePanelAvailable(policy.mode, region) &&\n (!policy.movableTo || policy.movableTo.includes(region)) &&\n (!policy.allowedRegions || policy.allowedRegions.includes(region)),\n );\n\nexport const panelDestinations = (core: WorkbenchCore, contributionId: string) => {\n const widget = core.layout.getWidget(contributionId);\n if (!widget || !workbenchPanelRegions.some((region) => region === widget.region)) return [];\n const modeId = core.modes.getActiveModeId();\n const mode = modeId ? core.modes.getMode(modeId) : undefined;\n const declaration = core.modePlacements\n .listPlacements(modeId)\n .find((p) => modePlacementContributionId(p.id) === contributionId);\n const legacyPanel = mode\n ?.listAddablePanels?.({ layout: core.layout.getLayout(), resource: core.getPrimaryResource() })\n .find((p) => p.panelId === contributionId);\n return allowedPanelDestinations({\n mode,\n movableTo: declaration?.movableTo,\n allowedRegions: legacyPanel?.allowedRegions,\n });\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"../../registries/layout/layout-model\";\nimport { getActiveLocationPlacement } from \"../../registries/layout/layout-operations\";\nimport { isWorkbenchPanelPlacementVisible } from \"../../registries/layout/panel-widget-eligibility\";\nimport {\n isWorkbenchModePanelAvailable,\n type WorkbenchModeAddablePanel,\n type WorkbenchModeContribution,\n} from \"../../registries/modes/mode-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { allowedPanelDestinations } from \"./panel-destinations\";\nexport interface WorkbenchCompositionAddablePanel extends WorkbenchModeAddablePanel {\n contribution: RegisteredWidgetContribution;\n open?(resource?: ResourceRef): void | Promise<void>;\n}\nexport interface WorkbenchCompositionRegionPanels {\n open: readonly WorkbenchWidgetPlacement[];\n addable: readonly WorkbenchCompositionAddablePanel[];\n closable: readonly string[];\n}\nexport interface WorkbenchCompositionController {\n panelsFor(region: WorkbenchPanelRegion): WorkbenchCompositionRegionPanels;\n}\ninterface CreateWorkbenchCompositionControllerInput {\n getActiveMode(): WorkbenchModeContribution | undefined;\n getLayout(): WorkbenchLayout;\n getResource(): ResourceRef | undefined;\n listWidgets(): RegisteredWidgetContribution[];\n listOwnedAddablePanels?(input: {\n layout: WorkbenchLayout;\n mode: WorkbenchModeContribution | undefined;\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n }): readonly WorkbenchCompositionAddablePanel[];\n}\nconst isOpenSingleton = (\n widget: RegisteredWidgetContribution,\n placements: readonly WorkbenchWidgetPlacement[],\n resource: ResourceRef | undefined,\n) => {\n if (!widget.singleton) return false;\n return placements.some((placement) => {\n if (placement.contributionId !== widget.id) return false;\n const scopedResourceKey = placement.role === \"location\" ? placement.resourceKey : placement.ownerResourceKey;\n return !scopedResourceKey || scopedResourceKey === resourceKey(resource);\n });\n};\nconst addModePanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n mode: WorkbenchModeContribution | undefined;\n modePanels: readonly WorkbenchModeAddablePanel[];\n layout: WorkbenchLayout;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const panel of input.modePanels) {\n if (![\"main\", \"side\", \"secondary\"].includes(panel.region)) continue;\n if (!allowedPanelDestinations({ mode: input.mode, allowedRegions: panel.allowedRegions }).includes(input.region))\n continue;\n const contribution = input.widgets.find((widget) => widget.id === panel.panelId);\n if (!contribution || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n input.addable.set(panel.panelId, { ...panel, region: input.region, contribution });\n }\n};\nconst addRegisteredPanels = (input: {\n addable: Map<string, WorkbenchCompositionAddablePanel>;\n mode: WorkbenchModeContribution | undefined;\n modePanels: readonly WorkbenchModeAddablePanel[];\n location: WorkbenchWidgetPlacement | undefined;\n placements: readonly WorkbenchWidgetPlacement[];\n region: WorkbenchPanelRegion;\n resource: ResourceRef | undefined;\n widgets: readonly RegisteredWidgetContribution[];\n}) => {\n for (const contribution of input.widgets) {\n if (!contribution.eligibleLocations) continue;\n if (![\"main\", \"side\", \"secondary\"].includes(contribution.region)) continue;\n const policy = input.modePanels.find((panel) => panel.panelId === contribution.id);\n if (!allowedPanelDestinations({ mode: input.mode, allowedRegions: policy?.allowedRegions }).includes(input.region))\n continue;\n if (input.addable.has(contribution.id) || isOpenSingleton(contribution, input.placements, input.resource)) continue;\n if (\n !isWorkbenchPanelPlacementVisible(contribution, input.resource, input.mode?.id, undefined, {\n location: input.location,\n })\n )\n continue;\n input.addable.set(contribution.id, { panelId: contribution.id, region: input.region, contribution });\n }\n};\nexport const createWorkbenchCompositionController = (\n input: CreateWorkbenchCompositionControllerInput,\n): WorkbenchCompositionController => ({\n panelsFor(region) {\n const layout = input.getLayout();\n const open = layout.regions[region]?.widgets ?? [];\n const resource = input.getResource();\n const location = getActiveLocationPlacement(layout);\n const mode = input.getActiveMode();\n if (!isWorkbenchModePanelAvailable(mode, region)) return { open, addable: [], closable: [] };\n const placements = open;\n const widgets = input.listWidgets();\n const modePanels = mode?.listAddablePanels?.({ layout, resource }) ?? [];\n const addable = new Map<string, WorkbenchCompositionAddablePanel>();\n for (const panel of input.listOwnedAddablePanels?.({ layout, mode, region, resource }) ?? []) {\n addable.set(panel.panelId, panel);\n }\n addModePanels({ addable, layout, mode, modePanels, placements, region, resource, widgets });\n addRegisteredPanels({ addable, location, mode, modePanels, placements, region, resource, widgets });\n return {\n open,\n addable: [...addable.values()],\n closable: open.filter((placement) => placement.closable === true).map((placement) => placement.contributionId),\n };\n },\n});\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport const workbenchFocusRegions = [\"activity\", \"sidenav\", \"main\", \"secondary\", \"side\", \"status\"] as const;\n\nexport type WorkbenchFocusRegionId = (typeof workbenchFocusRegions)[number];\n\nexport type WorkbenchFocusChangeListener = (region: WorkbenchFocusRegionId | undefined) => void;\n\nexport interface WorkbenchFocusState {\n activeRegion: WorkbenchFocusRegionId | undefined;\n}\n\nexport interface WorkbenchFocusController {\n store: WorkbenchStore<WorkbenchFocusState>;\n setActiveRegion(region: WorkbenchFocusRegionId): void;\n clearFocus(): void;\n getActiveRegion(): WorkbenchFocusRegionId | undefined;\n onDidChange(listener: WorkbenchFocusChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchFocusControllerInput {\n context: ContextKeyService;\n isRegionFocusable?: (region: WorkbenchFocusRegionId) => boolean;\n}\n\nconst focusContextByRegion = {\n activity: \"activityFocus\",\n sidenav: \"sidenavFocus\",\n main: \"mainFocus\",\n secondary: \"secondaryFocus\",\n side: \"sideFocus\",\n status: \"statusFocus\",\n} as const satisfies Record<WorkbenchFocusRegionId, string>;\n\nexport const createWorkbenchFocusController = (\n input: CreateWorkbenchFocusControllerInput,\n): WorkbenchFocusController => {\n const store = createWorkbenchStore<WorkbenchFocusState>({\n name: \"workbench.focus\",\n initialState: { activeRegion: undefined },\n });\n const context = input.context.createScope(\"workbench.focus\");\n\n const applyContext = (region: WorkbenchFocusRegionId | undefined) => {\n context.set(\"workbenchFocus\", region !== undefined);\n context.set(\"activeWorkbenchFocusRegion\", region);\n for (const focusRegion of workbenchFocusRegions) {\n context.set(focusContextByRegion[focusRegion], focusRegion === region);\n }\n };\n\n applyContext(undefined);\n\n return {\n store,\n\n setActiveRegion(region) {\n if (input.isRegionFocusable?.(region) === false) return;\n if (store.getState().activeRegion === region) return;\n store.setState({ activeRegion: region }, false, \"setActiveWorkbenchFocusRegion\");\n applyContext(region);\n },\n\n clearFocus() {\n if (store.getState().activeRegion === undefined) return;\n store.setState({ activeRegion: undefined }, false, \"clearWorkbenchFocusRegion\");\n applyContext(undefined);\n },\n\n getActiveRegion() {\n return store.getState().activeRegion;\n },\n\n onDidChange(listener) {\n const unsubscribe = store.subscribeSelector(\n (state) => state.activeRegion,\n (region) => listener(region),\n );\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { 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 { PageLocation, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTreeRegistry, NavigationTreeSlot } from \"../../registries/navigation/navigation-tree-registry\";\nimport type { WorkbenchPageContribution } from \"../../registries/pages/page-registry\";\nimport type { TreeViewSection } from \"../../registries/renderers/tree-renderer-types\";\nimport { resolveNavigationLevels } from \"./navigation-level\";\n\ninterface LevelNavigationHost {\n modes: { getActiveModeId(): string | undefined };\n pages: {\n store: {\n getState(): { location?: PageLocation; pages: Readonly<Record<string, WorkbenchPageContribution>> };\n };\n };\n navigationTrees: NavigationTreeRegistry;\n getPrimaryResource(): ResourceRef | undefined;\n}\n\nconst pinnedOnly = (sections: TreeViewSection[]) =>\n sections\n .filter((section) => section.nodes.length > 0)\n .map((section) => ({ ...section, nodes: section.nodes.map((node) => ({ ...node, pinnedOnly: true })) }));\n\n// Owners can share a section id, such as the navigation root. The first owner keeps its section settings.\nconst mergeSections = (sections: TreeViewSection[]) => {\n const merged = new Map<string, TreeViewSection>();\n for (const section of sections) {\n const current = merged.get(section.id);\n merged.set(section.id, current ? { ...current, nodes: [...current.nodes, ...section.nodes] } : section);\n }\n return [...merged.values()];\n};\n\n// Composes one navigation tree from the active mode and every open Sidenav level.\nexport const createLevelNavigation = (host: LevelNavigationHost) => {\n // The mode and every open level, from the outermost to the innermost.\n const queries = () => {\n const modeId = host.modes.getActiveModeId();\n if (!modeId) return [];\n const state = host.pages.store.getState();\n const levels = resolveNavigationLevels({\n location: state.location,\n pages: Object.values(state.pages),\n navigationTrees: host.navigationTrees,\n });\n const modeOwner = host.navigationTrees.resolveOwner(\"mode\", modeId) ?? {\n kind: \"mode\" as const,\n id: modeId,\n extensionId: \"pstdio\",\n };\n return [\n { owner: modeOwner, resource: host.getPrimaryResource() },\n ...levels.map(({ owner, location }) => ({ owner, resource: location.resource })),\n ];\n };\n\n return {\n getReadKey: () =>\n JSON.stringify(queries().map(({ owner, resource }) => host.navigationTrees.getReadKey(owner, { resource }))),\n\n async getSections(slot: NavigationTreeSlot, signal?: AbortSignal) {\n // Header and footer rows accumulate from the mode inward; the innermost owner fills the body.\n const ordered = slot === \"content\" ? queries().reverse() : queries();\n const sections: TreeViewSection[] = [];\n for (const [index, { owner, resource }] of ordered.entries()) {\n signal?.throwIfAborted();\n const read = await host.navigationTrees.getSections(owner, slot, { resource, signal });\n // Outer body rows stay available, so rows users pinned to the header or footer persist inside levels.\n sections.push(...(slot === \"content\" && index > 0 ? pinnedOnly(read) : read));\n }\n signal?.throwIfAborted();\n return mergeSections(sections);\n },\n\n getDefaultExpandedSectionIds: () => {\n const all = queries();\n return all.flatMap(({ owner }, index) =>\n (index === all.length - 1\n ? ([\"header\", \"content\", \"footer\"] as const)\n : ([\"header\", \"footer\"] as const)\n ).flatMap((slot) => host.navigationTrees.getDefaultExpandedSectionIds(owner, slot)),\n );\n },\n };\n};\n","import type { PageLocation, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { createPagePreparation } from \"./page-preparation\";\nimport type {\n WorkbenchPageOpenInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\n\nexport interface WorkbenchPageLocationCommitInput extends WorkbenchPageOpenInput {\n projectId: string;\n location: PageLocation;\n action: string;\n pageStates?: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n}\n\nexport type WorkbenchPageCloseResolution =\n | {\n kind: \"stay\";\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n target: WorkbenchPageOpenInput;\n locationChanged: boolean;\n }\n | {\n kind: \"parent\";\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n parentId: string;\n };\n\nexport interface WorkbenchPageRegistryInternals<Value> {\n resources: WorkbenchPageResourceCodec;\n prepare: ReturnType<typeof createPagePreparation<Value>>;\n publish(state: WorkbenchPageRegistryStoreState<Value>, action: string): void;\n onDidCommit(listener: () => void): Disposable;\n getPublishingState(): WorkbenchPageRegistryStoreState<Value>;\n connectRuntime(apply: (state: WorkbenchPageRegistryStoreState<Value>) => void): Disposable;\n activateLocation(input: WorkbenchPageLocationCommitInput): void;\n refreshModePlacements(): void;\n refreshShellPlacements(): void;\n clearProject(projectId: string | undefined): void;\n resolveClosePlacement(identity: PlacementIdentity): WorkbenchPageCloseResolution;\n}\n\nconst registryInternals = new WeakMap<object, WorkbenchPageRegistryInternals<unknown>>();\n\nexport const setWorkbenchPageRegistryInternals = <Value>(\n registry: WorkbenchPageRegistry<Value>,\n internals: WorkbenchPageRegistryInternals<Value>,\n) => {\n registryInternals.set(registry, internals as WorkbenchPageRegistryInternals<unknown>);\n};\n\nexport const getWorkbenchPageRegistryInternals = <Value>(registry: WorkbenchPageRegistry<Value>) => {\n const internals = registryInternals.get(registry) as WorkbenchPageRegistryInternals<Value> | undefined;\n if (!internals) throw new Error(\"Workbench page registry internals are unavailable\");\n return internals;\n};\n","import type { NavigationTargetPage, PageLocation, PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { isWorkbenchProjectUrl } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n CreateWorkbenchPageLocationControllerInput,\n ResolvedPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageLocationController,\n WorkbenchPageLocationDiagnostic,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\ninterface PageLocationControllerActionsInput<Value> {\n input: CreateWorkbenchPageLocationControllerInput<Value>;\n historyStore: WorkbenchStore<WorkbenchPageLocationHistoryState>;\n clearProject(projectId: string | undefined): void;\n resetHistory(): void;\n rootLevelTarget(): ResolvedPageLocation;\n restore(projectId: string, source: \"boot\" | \"project-switch\", useCurrentUrl: boolean): WorkbenchPageNavigationResult;\n resolveUrl(projectId: string, entry: WorkbenchPageBrowserEntry): ResolvedPageLocation | undefined;\n normalizeTarget(target: NavigationTargetPage): ResolvedPageLocation;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n locationsEqual(left: PageLocation | undefined, right: PageLocation | undefined): boolean;\n commit(\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ): WorkbenchPageNavigationResult;\n fail(source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown): WorkbenchPageNavigationResult;\n closePlacement(identity: PlacementIdentity): WorkbenchPageNavigationResult;\n removeResource(resource: ResourceRef, retained: readonly PlacementIdentity[]): void;\n canGoBack(): boolean;\n canGoForward(): boolean;\n dispose(): void;\n}\n\nconst hasResolvableCurrentPageUrl = <Value>(actions: PageLocationControllerActionsInput<Value>, projectId: string) => {\n try {\n return Boolean(actions.resolveUrl(projectId, actions.input.browser.current()));\n } catch {\n return false;\n }\n};\n\nexport const createPageLocationControllerActions = <Value>(\n actions: PageLocationControllerActionsInput<Value>,\n): WorkbenchPageLocationController => {\n const { input } = actions;\n return {\n historyStore: actions.historyStore,\n removeResource: actions.removeResource,\n setProject(projectId) {\n if (input.registry.store.getState().projectId === projectId) return;\n actions.clearProject(projectId);\n actions.resetHistory();\n },\n clearProject() {\n actions.clearProject(undefined);\n actions.resetHistory();\n },\n isCurrentProjectUrl: (projectId) => isWorkbenchProjectUrl(input.browser.current().url, projectId),\n hasCurrentPageUrl: (projectId) => hasResolvableCurrentPageUrl(actions, projectId),\n boot: (projectId) => actions.restore(projectId, \"boot\", true),\n switchProject(projectId) {\n actions.clearProject(projectId);\n return actions.restore(projectId, \"project-switch\", false);\n },\n navigate(target) {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return actions.fail(\"navigation\", new Error(\"Cannot navigate before a project is active\"));\n try {\n const resolved = actions.normalizeTarget(target);\n const history = actions.locationsEqual(input.registry.store.getState().location, resolved.location)\n ? \"none\"\n : \"push\";\n return actions.commit(projectId, resolved, history, \"navigatePageLocation\");\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n replay(location) {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return actions.fail(\"history\", new Error(\"Cannot replay a page before a project is active\"));\n try {\n return actions.commit(projectId, actions.normalizeStored(location), \"replace\", \"replayWorkbenchPageHistory\");\n } catch (error) {\n return actions.fail(\"history\", error);\n }\n },\n navigateToParent() {\n const current = input.registry.store.getState();\n if (!current.projectId || !current.location?.parent) {\n return actions.fail(\"navigation\", new Error(\"The active page does not have a parent location\"));\n }\n try {\n return actions.commit(\n current.projectId,\n actions.normalizeStored(current.location.parent),\n \"replace\",\n \"navigateToParentPageLocation\",\n );\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n navigateToRootLevel() {\n const current = input.registry.store.getState();\n if (!current.projectId) {\n return actions.fail(\"navigation\", new Error(\"Cannot navigate before a project is active\"));\n }\n try {\n const resolved = actions.rootLevelTarget();\n const history = actions.locationsEqual(current.location, resolved.location) ? \"none\" : \"push\";\n return actions.commit(current.projectId, resolved, history, \"navigateToRootLevelPageLocation\");\n } catch (error) {\n return actions.fail(\"navigation\", error);\n }\n },\n closePlacement: actions.closePlacement,\n goBack() {\n if (actions.canGoBack()) input.browser.back();\n },\n goForward() {\n if (actions.canGoForward()) input.browser.forward();\n },\n dispose: actions.dispose,\n };\n};\n","import type {\n FileRendererSectionTarget,\n FileSourcePosition,\n NavigationTargetPage,\n PageLocation,\n PageRef,\n ResourceRef,\n} from \"@pstdio/sdk/extensions\";\nimport { isFileSourcePosition } from \"@pstdio/sdk/extensions\";\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 if (!left || !right) return left === right;\n return workbenchPageLocationKey(left, resources, pages) === workbenchPageLocationKey(right, resources, pages);\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 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.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 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 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 });\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 ...(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 });\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 ...(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 });\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 ...(candidate.resource ? { resource: candidate.resource } : {}),\n ...(candidate.section ? { section: candidate.section } : {}),\n ...(candidate.position ? { position: candidate.position } : {}),\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}) => {\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 }),\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport { serializeWorkbenchPageUrl } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry\";\nimport { workbenchPageLocationRouteKey } from \"./page-location-normalization\";\nimport type { WorkbenchPageHistoryState, WorkbenchPageLocationDiagnostic } from \"./page-location-types\";\n\nexport const createPageHistoryEntry =\n (input: { pages(): WorkbenchPageContribution[]; resources: WorkbenchPageResourceCodec }) =>\n (projectId: string, location: PageLocation, index: number) => ({\n url: serializeWorkbenchPageUrl({ projectId, location, pages: input.pages(), resources: input.resources }),\n state: {\n kind: \"pstdio.page-location\",\n index,\n projectId,\n routeKey: workbenchPageLocationRouteKey(location, input.resources, input.pages()),\n location,\n } satisfies WorkbenchPageHistoryState,\n });\n\nexport const createPageLocationFailureHandler =\n (report?: (diagnostic: WorkbenchPageLocationDiagnostic) => void) =>\n (source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown) => {\n const diagnostic: WorkbenchPageLocationDiagnostic = {\n code: \"page-location-unresolved\",\n source,\n message: error instanceof Error ? error.message : String(error),\n };\n report?.(diagnostic);\n return { ok: false, diagnostic } as const;\n };\n","import type { NavigationTargetPage } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport type {\n ResolvedPageLocation,\n WorkbenchPageLocationController,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\ninterface PageLocationPreparation<Value> {\n resolve(target: NavigationTargetPage): ResolvedPageLocation;\n commit(state: WorkbenchPageRegistryStoreState<Value>, beforePublish?: () => void): WorkbenchPageNavigationResult;\n}\nconst preparations = new WeakMap<WorkbenchPageLocationController, PageLocationPreparation<unknown>>();\nexport const setPageLocationPreparation = <Value>(\n controller: WorkbenchPageLocationController,\n preparation: PageLocationPreparation<Value>,\n) => preparations.set(controller, preparation as PageLocationPreparation<unknown>);\nexport const getPageLocationPreparation = <Value>(controller: WorkbenchPageLocationController) => {\n const preparation = preparations.get(controller);\n if (!preparation) throw new Error(\"Page location preparation is unavailable\");\n return preparation as PageLocationPreparation<Value>;\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport type { WorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { createPageHistoryEntry } from \"./page-location-history-entry\";\nimport type { CreateWorkbenchPageLocationControllerInput } from \"./page-location-types\";\n\nexport const createPageLocationPublisher = <Value>(\n input: CreateWorkbenchPageLocationControllerInput<Value>,\n internals: WorkbenchPageRegistryInternals<Value>,\n hooks: {\n getIndex(): number;\n commitIndex(index: number, push: boolean): void;\n entry: ReturnType<typeof createPageHistoryEntry>;\n publish(): void;\n rememberRootLevel(location: PageLocation): PageLocation | undefined;\n },\n) => {\n return (\n projectId: string,\n state: WorkbenchPageRegistryStoreState<Value>,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n beforePublish?: () => void,\n ) =>\n batchWorkbenchChanges(() => {\n const location = state.location;\n if (!location) throw new Error(\"Prepared page navigation has no location\");\n const nextIndex = history === \"push\" ? hooks.getIndex() + 1 : hooks.getIndex();\n // Browser history is the commit boundary. Serialization and the browser write\n // can fail, so both precede changes to stores, placement owners, and caches.\n if (history !== \"none\") input.browser[history](hooks.entry(projectId, location, nextIndex));\n hooks.commitIndex(nextIndex, history === \"push\");\n beforePublish?.();\n internals.publish(state, action);\n const rootLevel = hooks.rememberRootLevel(location);\n runWorkbenchEffect(`page location cache for ${projectId}`, () =>\n input.persistence.save(projectId, { location, ...(rootLevel ? { rootLevel } : {}) }),\n );\n if (history !== \"none\") hooks.publish();\n return { ok: true, location } as const;\n });\n};\n","import type { PageLocation, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution } from \"../../registries/pages/page-registry\";\nimport { type ProjectNavigationSources, resolveRootLevelLocation } from \"./navigation-level\";\nimport type { ResolvedPageLocation } from \"./page-location-types\";\n\ninterface RootLevelLocationTrackerInput {\n levels: ProjectNavigationSources;\n pages(): readonly WorkbenchPageContribution[];\n normalize(location: PageLocation): ResolvedPageLocation;\n resourceKey(resource: ResourceRef): string;\n start(): ResolvedPageLocation;\n}\n\nconst usesResource = (location: PageLocation | undefined, matches: (resource: ResourceRef) => boolean): boolean => {\n if (!location) return false;\n return Boolean(location.resource && matches(location.resource)) || usesResource(location.parent, matches);\n};\n\n// Holds the last location inside the project navigation for the active project. Navigation inside a\n// level keeps it, so a breadcrumb that starts with a level page still has somewhere to lead back to.\nexport const createRootLevelLocationTracker = (input: RootLevelLocationTrackerInput) => {\n let saved: PageLocation | undefined;\n\n return {\n restore(location: PageLocation | undefined) {\n saved = location;\n },\n\n remember(location: PageLocation) {\n const resolved = resolveRootLevelLocation({ ...input.levels, location, pages: input.pages() });\n if (resolved) saved = resolved;\n return saved;\n },\n\n // A removed resource cannot be opened again, so the project falls back to its start page.\n forget(resource: ResourceRef) {\n const removed = input.resourceKey(resource);\n if (saved && usesResource(saved, (candidate) => input.resourceKey(candidate) === removed)) saved = undefined;\n },\n\n // A saved location stops resolving once its page is gone, which leaves the start page.\n target() {\n if (!saved) return input.start();\n try {\n return input.normalize(saved);\n } catch {\n return input.start();\n }\n },\n };\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageContribution, WorkbenchPageRegistry } from \"../../registries/pages/page-registry\";\nimport type { WorkbenchPageResourceCodec } from \"../../registries/pages/page-registry-types\";\nimport { normalizeDirectWorkbenchPageLocation } from \"./page-location-normalization\";\nimport type { ResolvedPageLocation, WorkbenchPageLocationDiagnostic } from \"./page-location-types\";\n\ninterface PageOwnerRemovalInput<Value> {\n registry: WorkbenchPageRegistry<Value>;\n pages(): readonly WorkbenchPageContribution[];\n resources: WorkbenchPageResourceCodec;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n start(): ResolvedPageLocation;\n commit(projectId: string, resolved: ResolvedPageLocation, history: \"replace\", action: string): unknown;\n fail(source: WorkbenchPageLocationDiagnostic[\"source\"], error: unknown): unknown;\n}\n\n// Unloading a page contribution can leave the active location without an owner. The nearest page that\n// is still registered takes over; otherwise the project falls back to its start page.\nexport const connectPageOwnerRemoval = <Value>(input: PageOwnerRemovalInput<Value>) =>\n input.registry.store.subscribe((state, previous) => {\n const removedPage = Object.keys(previous.pages).some((pageId) => !state.pages[pageId]);\n if (!removedPage || !state.projectId || state.projectId !== previous.projectId || !previous.location) return;\n try {\n if (state.location) {\n input.normalizeStored(state.location);\n return;\n }\n } catch (error) {\n input.fail(\"navigation\", error);\n }\n try {\n const active = state.activePageId ? state.pages[state.activePageId] : undefined;\n const resolved =\n active && state.location\n ? normalizeDirectWorkbenchPageLocation({\n pageId: active.id,\n pages: input.pages(),\n resources: input.resources,\n ...(state.location.resource ? { resource: state.location.resource } : {}),\n ...(state.location.section ? { section: state.location.section } : {}),\n })\n : input.start();\n input.commit(state.projectId, resolved, \"replace\", \"removePageLocationOwner\");\n } catch (error) {\n input.fail(\"navigation\", error);\n }\n });\n","import type { PageLocation, PageRef, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageCloseResolution } from \"../../registries/pages/page-registry-internals\";\nimport type { ResolvedPageLocation, WorkbenchPageNavigationResult } from \"./page-location-types\";\n\ninterface PagePlacementCloserInput {\n commit(\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ): WorkbenchPageNavigationResult;\n fail(source: \"navigation\", error: unknown): WorkbenchPageNavigationResult;\n getCurrent(): { projectId?: string; location?: PageLocation };\n getPageRef(pageId: string): PageRef | undefined;\n normalizePage(page: PageRef): ResolvedPageLocation;\n normalizeStored(location: PageLocation): ResolvedPageLocation;\n resolveClosePlacement(identity: PlacementIdentity): WorkbenchPageCloseResolution;\n}\n\nexport const createPagePlacementCloser = (input: PagePlacementCloserInput) => {\n const closeToParent = (\n projectId: string,\n location: PageLocation,\n resolution: Extract<WorkbenchPageCloseResolution, { kind: \"parent\" }>,\n ) => {\n const contextualParent = location.parent ? input.normalizeStored(location.parent) : undefined;\n const parent = input.getPageRef(resolution.parentId);\n if (!parent) throw new Error(`Unknown parent page: ${resolution.parentId}`);\n const resolved = contextualParent?.pageId === resolution.parentId ? contextualParent : input.normalizePage(parent);\n return input.commit(\n projectId,\n { ...resolved, pageStates: resolution.pageStates },\n \"replace\",\n \"closePagePlacementToParent\",\n );\n };\n\n const closeWithinPage = (\n projectId: string,\n location: PageLocation,\n resolution: Extract<WorkbenchPageCloseResolution, { kind: \"stay\" }>,\n ) => {\n const page = input.getPageRef(resolution.target.pageId);\n if (!page) throw new Error(`Unknown page: ${resolution.target.pageId}`);\n const resolved = input.normalizeStored({\n page,\n ...(resolution.target.resource ? { resource: resolution.target.resource } : {}),\n ...(resolution.target.section ? { section: resolution.target.section } : {}),\n ...(location.parent ? { parent: location.parent } : {}),\n });\n return input.commit(\n projectId,\n {\n ...resolved,\n pageStates: resolution.pageStates,\n ...(resolution.target.open ? { open: resolution.target.open } : {}),\n },\n resolution.locationChanged ? \"replace\" : \"none\",\n \"closePagePlacement\",\n );\n };\n\n return (identity: PlacementIdentity) => {\n const current = input.getCurrent();\n if (!current.projectId || !current.location) {\n return input.fail(\"navigation\", new Error(\"Cannot close a page placement without an active location\"));\n }\n try {\n if (identity.kind !== \"page\") throw new Error(\"Only page-owned placements can close through page navigation\");\n const resolution = input.resolveClosePlacement(identity);\n return resolution.kind === \"parent\"\n ? closeToParent(current.projectId, current.location, resolution)\n : closeWithinPage(current.projectId, current.location, resolution);\n } catch (error) {\n return input.fail(\"navigation\", error);\n }\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 } from \"@pstdio/sdk/extensions\";\nimport { workbenchPageLocationKey } from \"../../controllers/page-location/page-location-normalization\";\nimport type { WorkbenchPageContribution, WorkbenchPageResourceCodec } from \"./page-registry-types\";\n\nexport const pageStateKey = (\n page: WorkbenchPageContribution,\n location: PageLocation | undefined,\n resources: WorkbenchPageResourceCodec,\n) =>\n page.main.kind === \"panels\" && location\n ? `${page.id}|${workbenchPageLocationKey({ ...location, position: undefined }, resources)}`\n : page.id;\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 { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../layout/placement-reconciliation\";\nimport { primarySlot } from \"./page-main\";\nimport type { WorkbenchPageRegistryStoreState, WorkbenchPageResourceCodec } from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\n/** Reconcile the state owner, including pages that have no current layout widgets. */\nexport const removePageResource = <Value>(\n state: WorkbenchPageRegistryStoreState<Value>,\n resource: ResourceRef,\n resources: WorkbenchPageResourceCodec,\n retained: readonly PlacementIdentity[],\n) => {\n const key = (value: ResourceRef) => resources.toUri(resources.normalize(value));\n const removedKey = key(resource);\n const keep = new Set(retained.map(placementIdentityKey));\n const pageStates = Object.fromEntries(\n Object.entries(state.pageStates).map(([stateKey, current]) => {\n const pageId = Object.keys(state.pages).find((id) => stateKey === id || stateKey.startsWith(`${id}|`));\n if (!pageId) return [stateKey, current];\n const resourceInstances = Object.fromEntries(\n Object.entries(current.resourceInstances).map(([slotId, instances]) => [\n slotId,\n instances.filter(\n (instance) =>\n key(instance.resource) !== removedKey ||\n keep.has(\n placementIdentityKey({\n kind: \"page\",\n pageId,\n slotId,\n instanceKey: instance.instanceKey,\n }),\n ),\n ),\n ]),\n );\n const primary = primarySlot(state.pages[pageId]!);\n const remaining = primary ? (resourceInstances[primary.id] ?? []) : [];\n let activePrimaryInstanceKey = current.activePrimaryInstanceKey;\n if (\n primary?.item.kind === \"binding\" &&\n !remaining.some((instance) => instance.instanceKey === activePrimaryInstanceKey)\n ) {\n activePrimaryInstanceKey = remaining.at(-1)?.instanceKey;\n }\n return [stateKey, { ...current, resourceInstances, activePrimaryInstanceKey }];\n }),\n );\n let location = state.location;\n const page = state.activePageId ? state.pages[state.activePageId] : undefined;\n if (page && location?.resource && key(location.resource) === removedKey) {\n const current = pageStates[pageStateKey(page, location, resources)];\n const primary = primarySlot(page);\n const remaining = primary ? (current?.resourceInstances[primary.id] ?? []) : [];\n const active = remaining.find((instance) => instance.instanceKey === current?.activePrimaryInstanceKey);\n if (active) location = { ...location, resource: active.resource, section: active.section };\n else if (location.parent) location = location.parent;\n else if (page.parentId) location = { page: state.pages[page.parentId]!.ref };\n }\n return { pageStates, location };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type {\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry-types\";\nimport { removePageResource } from \"../../registries/pages/page-resource-removal\";\nimport { normalizeWorkbenchPageLocation, workbenchPageLocationsEqual } from \"./page-location-normalization\";\nimport type { ResolvedPageLocation } from \"./page-location-types\";\n\nexport const createPageResourceRemover =\n <Value>(input: {\n getState(): WorkbenchPageRegistryStoreState<Value>;\n resources: WorkbenchPageResourceCodec;\n forgetRootLevel(resource: ResourceRef): void;\n commit(projectId: string, location: ResolvedPageLocation, history: \"replace\" | \"none\", action: string): unknown;\n }) =>\n (resource: ResourceRef, retained: readonly PlacementIdentity[]) => {\n input.forgetRootLevel(resource);\n const current = input.getState();\n if (!current.projectId || !current.location) return;\n const next = removePageResource(current, resource, input.resources, retained);\n if (!next.location) return;\n const changed = !workbenchPageLocationsEqual(\n current.location,\n next.location,\n input.resources,\n Object.values(current.pages),\n );\n const resolved = normalizeWorkbenchPageLocation({\n location: next.location,\n pages: Object.values(current.pages),\n resources: input.resources,\n });\n input.commit(\n current.projectId,\n { ...resolved, pageStates: next.pageStates },\n changed ? \"replace\" : \"none\",\n \"removePageResource\",\n );\n };\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport { isWorkbenchProjectUrl, parseWorkbenchPageUrl } from \"@pstdio/sdk/extensions\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { createPageLocationControllerActions } from \"./page-location-actions\";\nimport { createPageHistoryEntry, createPageLocationFailureHandler } from \"./page-location-history-entry\";\nimport {\n normalizeDirectWorkbenchPageLocation,\n normalizeWorkbenchPageLocation,\n normalizeWorkbenchPageTarget,\n workbenchPageLocationRouteKey,\n workbenchPageLocationsEqual,\n} from \"./page-location-normalization\";\nimport { setPageLocationPreparation } from \"./page-location-preparation\";\nimport { createPageLocationPublisher } from \"./page-location-publish\";\nimport { createRootLevelLocationTracker } from \"./page-location-root-level\";\nimport type {\n CreateWorkbenchPageLocationControllerInput,\n ResolvedPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageHistoryState,\n WorkbenchPageLocationController,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\nimport { connectPageOwnerRemoval } from \"./page-owner-removal\";\nimport { createPagePlacementCloser } from \"./page-placement-closer\";\nimport { createPageResourceRemover } from \"./page-resource-remover\";\n\nexport type {\n CreateWorkbenchPageLocationControllerInput,\n PersistedWorkbenchPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageHistoryState,\n WorkbenchPageLocationBrowser,\n WorkbenchPageLocationController,\n WorkbenchPageLocationDiagnostic,\n WorkbenchPageLocationHistoryState,\n WorkbenchPageLocationPersistence,\n WorkbenchPageNavigationResult,\n} from \"./page-location-types\";\n\nconst isHistoryState = (value: unknown): value is WorkbenchPageHistoryState => {\n if (!value || typeof value !== \"object\") return false;\n const state = value as Partial<WorkbenchPageHistoryState>;\n return (\n state.kind === \"pstdio.page-location\" &&\n typeof state.index === \"number\" &&\n typeof state.projectId === \"string\" &&\n typeof state.routeKey === \"string\" &&\n Boolean(state.location && typeof state.location === \"object\")\n );\n};\n\nexport const createWorkbenchPageLocationController = <Value>(\n input: CreateWorkbenchPageLocationControllerInput<Value>,\n): WorkbenchPageLocationController => {\n const internals = getWorkbenchPageRegistryInternals(input.registry);\n const pages = input.registry.listPages;\n let historyIndex = 0;\n let maxHistoryIndex = 0;\n const historyStore = createWorkbenchStore<WorkbenchPageLocationHistoryState>({\n name: \"workbench.page-location-history\",\n initialState: { canGoBack: false, canGoForward: false },\n });\n const publishHistory = () =>\n historyStore.setState(\n { canGoBack: historyIndex > 0, canGoForward: historyIndex < maxHistoryIndex },\n false,\n \"pageLocationHistory\",\n );\n const resetHistory = () => {\n [historyIndex, maxHistoryIndex] = [0, 0];\n publishHistory();\n };\n\n const fail = createPageLocationFailureHandler(input.reportDiagnostic);\n const historyEntry = createPageHistoryEntry({ pages, resources: internals.resources });\n\n const rootLevel = createRootLevelLocationTracker({\n levels: input,\n pages,\n normalize: (location) => normalizeStored(location),\n resourceKey: (resource) => internals.resources.toUri(internals.resources.normalize(resource)),\n start: () => start(),\n });\n\n const publish = createPageLocationPublisher(input, internals, {\n getIndex: () => historyIndex,\n commitIndex: (index, push) => {\n historyIndex = index;\n if (push) maxHistoryIndex = index;\n },\n entry: historyEntry,\n publish: publishHistory,\n rememberRootLevel: rootLevel.remember,\n });\n const commit = (\n projectId: string,\n resolved: ResolvedPageLocation,\n history: \"push\" | \"replace\" | \"none\",\n action: string,\n ) => {\n const state = internals.prepare.location(\n {\n pageId: resolved.pageId,\n projectId,\n location: resolved.location,\n action,\n open: resolved.open,\n resource: resolved.location.resource,\n section: resolved.location.section,\n pageStates: resolved.pageStates,\n },\n input.registry.store.getState(),\n );\n return publish(projectId, state, history, action);\n };\n\n const normalizeStored = (location: PageLocation): ResolvedPageLocation =>\n normalizeWorkbenchPageLocation({ location, pages: pages(), resources: internals.resources });\n\n const start = (): ResolvedPageLocation =>\n normalizeWorkbenchPageTarget({\n target: { kind: \"page\", page: input.startPage },\n pages: pages(),\n resources: internals.resources,\n });\n\n const resolveUrl = (projectId: string, entry: WorkbenchPageBrowserEntry) => {\n const parsed = parseWorkbenchPageUrl({\n url: entry.url,\n projectId,\n pages: pages(),\n resources: internals.resources,\n });\n if (!parsed) return undefined;\n const direct = normalizeDirectWorkbenchPageLocation({\n ...parsed,\n pages: pages(),\n resources: internals.resources,\n });\n if (!isHistoryState(entry.state) || entry.state.projectId !== projectId) return direct;\n const contextual = normalizeStored(entry.state.location);\n const directKey = workbenchPageLocationRouteKey(direct.location, internals.resources, pages());\n const contextualKey = workbenchPageLocationRouteKey(contextual.location, internals.resources, pages());\n if (entry.state.routeKey !== directKey || contextualKey !== directKey) return direct;\n return contextual;\n };\n\n const restore = (\n projectId: string,\n source: \"boot\" | \"project-switch\",\n useCurrentUrl: boolean,\n ): WorkbenchPageNavigationResult => {\n try {\n const browserEntry = input.browser.current();\n if (isHistoryState(browserEntry.state) && browserEntry.state.projectId === projectId) {\n historyIndex = browserEntry.state.index;\n maxHistoryIndex = Math.max(maxHistoryIndex, historyIndex);\n } else {\n historyIndex = 0;\n maxHistoryIndex = 0;\n }\n const hasProjectUrl = useCurrentUrl && isWorkbenchProjectUrl(browserEntry.url, projectId);\n const fromUrl = hasProjectUrl ? resolveUrl(projectId, browserEntry) : undefined;\n if (hasProjectUrl && !fromUrl) throw new Error(`Cannot resolve page URL: ${browserEntry.url}`);\n // A URL wins over the saved location, but the saved root level still names the way out of a level.\n const persisted = input.persistence.load(projectId);\n rootLevel.restore(persisted?.rootLevel);\n const saved = hasProjectUrl ? undefined : persisted?.location;\n const resolved = fromUrl ?? (saved ? normalizeStored(saved) : start());\n return commit(projectId, resolved, \"replace\", source === \"boot\" ? \"bootPageLocation\" : \"switchPageProject\");\n } catch (error) {\n fail(source, error);\n try {\n return commit(projectId, start(), \"replace\", `${source}StartFallback`);\n } catch (fallbackError) {\n return fail(source, fallbackError);\n }\n }\n };\n\n const onPopState = (entry: WorkbenchPageBrowserEntry) => {\n const projectId = input.registry.store.getState().projectId;\n if (!projectId) return;\n try {\n if (isHistoryState(entry.state) && entry.state.projectId === projectId) {\n historyIndex = entry.state.index;\n maxHistoryIndex = Math.max(maxHistoryIndex, historyIndex);\n publishHistory();\n }\n const resolved = resolveUrl(projectId, entry);\n if (!resolved) throw new Error(`Cannot resolve page URL: ${entry.url}`);\n commit(projectId, resolved, \"none\", \"replayPageHistory\");\n } catch (error) {\n fail(\"history\", error);\n }\n };\n const popStateSubscription = input.browser.onPopState(onPopState);\n const pageRemovalSubscription = connectPageOwnerRemoval({\n registry: input.registry,\n pages,\n resources: internals.resources,\n normalizeStored,\n start,\n commit,\n fail,\n });\n\n const closeActivePlacement = createPagePlacementCloser({\n commit,\n fail,\n getCurrent: () => input.registry.store.getState(),\n getPageRef: (pageId) => input.registry.getPage(pageId)?.ref,\n normalizePage: (page) =>\n normalizeWorkbenchPageTarget({\n target: { kind: \"page\", page },\n pages: pages(),\n resources: internals.resources,\n }),\n normalizeStored,\n resolveClosePlacement: internals.resolveClosePlacement,\n });\n\n const controller = createPageLocationControllerActions({\n input,\n historyStore,\n clearProject(projectId) {\n // The remembered root level belongs to the project the user is leaving.\n rootLevel.restore(undefined);\n internals.clearProject(projectId);\n },\n resetHistory,\n rootLevelTarget: rootLevel.target,\n restore,\n resolveUrl,\n normalizeTarget: (target) =>\n normalizeWorkbenchPageTarget({\n target,\n pages: pages(),\n resources: internals.resources,\n active: input.registry.store.getState().location,\n }),\n normalizeStored,\n locationsEqual: (left, right) => workbenchPageLocationsEqual(left, right, internals.resources, pages()),\n commit,\n fail,\n closePlacement: closeActivePlacement,\n removeResource: createPageResourceRemover({\n getState: input.registry.store.getState,\n resources: internals.resources,\n forgetRootLevel: rootLevel.forget,\n commit,\n }),\n canGoBack: () => historyIndex > 0,\n canGoForward: () => historyIndex < maxHistoryIndex,\n dispose() {\n popStateSubscription.dispose();\n pageRemovalSubscription();\n },\n });\n setPageLocationPreparation<Value>(controller, {\n resolve: (target) =>\n normalizeWorkbenchPageTarget({\n target,\n pages: pages(),\n resources: internals.resources,\n active: input.registry.store.getState().location,\n }),\n commit: (state, beforePublish) => {\n if (!state.projectId || !state.location) throw new Error(\"Cannot navigate before a project is active\");\n const history = workbenchPageLocationsEqual(\n input.registry.store.getState().location,\n state.location,\n internals.resources,\n pages(),\n )\n ? \"none\"\n : \"push\";\n return publish(state.projectId, state, history, \"navigateCompoundTarget\", beforePublish);\n },\n });\n return controller;\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\n\nexport interface WorkbenchPanelMenuState {\n openByMenuId: Record<string, boolean>;\n}\n\nexport interface PersistedWorkbenchPanelMenuState {\n openByMenuId: Record<string, boolean>;\n}\n\nexport interface WorkbenchPanelMenuStatePersistenceAdapter {\n getMenuStates(scope?: string): PersistedWorkbenchPanelMenuState | undefined;\n setMenuStates(state: PersistedWorkbenchPanelMenuState, scope?: string): void;\n}\n\nexport type WorkbenchPanelMenuStateChangeListener = (state: WorkbenchPanelMenuState) => void;\n\nexport interface WorkbenchPanelMenuStateController {\n store: WorkbenchStore<WorkbenchPanelMenuState>;\n isOpen(menuId: string): boolean;\n setOpen(menuId: string, open: boolean): void;\n toggle(menuId: string): void;\n setPersistenceScope(scope: string | undefined): void;\n getPersistenceScope(): string | undefined;\n onDidChange(listener: WorkbenchPanelMenuStateChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchPanelMenuStateControllerInput {\n persistence?: WorkbenchPanelMenuStatePersistenceAdapter;\n}\n\nexport const createWorkbenchPanelMenuStateController = (\n input: CreateWorkbenchPanelMenuStateControllerInput = {},\n): WorkbenchPanelMenuStateController => {\n let currentScope: string | undefined;\n const persisted = runWorkbenchEffect(`panel menu cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getMenuStates(currentScope),\n );\n const resolveOpenByMenuId = (state: PersistedWorkbenchPanelMenuState | undefined) => ({\n ...state?.openByMenuId,\n });\n\n const store = createWorkbenchStore<WorkbenchPanelMenuState>({\n name: \"workbench.panelMenuState\",\n initialState: { openByMenuId: resolveOpenByMenuId(persisted) },\n });\n\n const persistState = () => {\n if (!input.persistence) return;\n runWorkbenchEffect(`panel menu cache write for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.setMenuStates({ openByMenuId: store.getState().openByMenuId }, currentScope),\n );\n };\n\n const isOpen = (menuId: string) => store.getState().openByMenuId[menuId] ?? true;\n\n return {\n store,\n\n isOpen,\n\n setOpen(menuId, open) {\n const snapshot = store.getState();\n if ((snapshot.openByMenuId[menuId] ?? true) === open) return;\n store.setState(\n {\n openByMenuId: { ...snapshot.openByMenuId, [menuId]: open },\n },\n false,\n \"setMenuOpen\",\n );\n persistState();\n },\n\n toggle(menuId) {\n this.setOpen(menuId, !isOpen(menuId));\n },\n\n setPersistenceScope(scope) {\n if (scope === currentScope) return;\n persistState();\n currentScope = scope;\n const incoming = runWorkbenchEffect(`panel menu cache read for ${currentScope ?? \"unscoped\"}`, () =>\n input.persistence?.getMenuStates(currentScope),\n );\n store.setState({ openByMenuId: resolveOpenByMenuId(incoming) }, false, \"setPersistenceScope\");\n },\n\n getPersistenceScope: () => currentScope,\n\n onDidChange(listener) {\n const unsubscribe = store.subscribe((state) => listener(state));\n return createDisposable(unsubscribe);\n },\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchSidePanelMode } from \"../../registries/layout/layout-types\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\n\nexport type { WorkbenchSidePanelMode };\n\nexport type WorkbenchSidePanelChangeListener = (mode: WorkbenchSidePanelMode) => void;\n\nexport interface WorkbenchSidePanelController {\n canFloat(): boolean;\n getMode(): WorkbenchSidePanelMode;\n setMode(mode: WorkbenchSidePanelMode): void;\n onDidChange(listener: WorkbenchSidePanelChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchSidePanelControllerInput {\n layout: Pick<LayoutModel, \"getLayout\" | \"setSidePanelMode\" | \"store\">;\n getFloatingPanels?(): \"visible\" | \"hidden\";\n onDidChangePolicy?(listener: () => void): Disposable;\n initialMode?: WorkbenchSidePanelMode;\n}\n\n// The layout's side region owns the mode, so it follows layout persistence scopes\n// like every other region. The controller only applies the floating policy.\nexport const createWorkbenchSidePanelController = (input: CreateWorkbenchSidePanelControllerInput) => {\n const canFloat = () => input.getFloatingPanels?.() !== \"hidden\";\n const resolveMode = (mode: WorkbenchSidePanelMode) => (!canFloat() && mode === \"floating\" ? \"attached\" : mode);\n const defaultPresentation = input.initialMode === \"attached\" ? \"attached\" : \"floating\";\n const getMode = () => {\n const side = input.layout.getLayout().regions.side;\n return side.visible ? resolveMode(side.presentation ?? defaultPresentation) : \"closed\";\n };\n\n return {\n canFloat,\n getMode,\n setMode: (mode: WorkbenchSidePanelMode) => input.layout.setSidePanelMode(resolveMode(mode)),\n onDidChange(listener: WorkbenchSidePanelChangeListener) {\n let current = getMode();\n const notify = () => {\n const next = getMode();\n if (next === current) return;\n current = next;\n listener(next);\n };\n const unsubscribe = input.layout.store.subscribe(notify);\n const policy = input.onDidChangePolicy?.(notify);\n return createDisposable(() => {\n unsubscribe();\n policy?.dispose();\n });\n },\n };\n};\n","import type {\n TerminalSessionAdapter,\n TerminalSessionError,\n TerminalSessionExit,\n TerminalSessionRequest,\n} from \"@pstdio/sdk/api\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n// The renderer-side terminal contract is shared through the public SDK. Core keeps its\n// Workbench* names as aliases so its API does not depend on @pstdio/ui.\nexport type WorkbenchTerminalSessionRequest = TerminalSessionRequest;\nexport type WorkbenchTerminalSessionExit = TerminalSessionExit;\nexport type WorkbenchTerminalSessionError = TerminalSessionError;\nexport type WorkbenchTerminalSessionAdapter = TerminalSessionAdapter;\n\n// Host-injected session factory. Production hosts back this with a PTY transport;\n// the testbench and stories inject a deterministic scripted opener.\nexport type WorkbenchTerminalSessionOpener = (\n request: WorkbenchTerminalSessionRequest,\n) => Promise<WorkbenchTerminalSessionAdapter>;\n\nexport type WorkbenchTerminalSessionStatus = \"running\" | \"exited\" | \"killed\";\n\nexport interface WorkbenchTerminalSessionModel {\n id: string;\n title: string;\n status: WorkbenchTerminalSessionStatus;\n exit?: WorkbenchTerminalSessionExit;\n}\n\nexport interface WorkbenchTerminalState {\n sessionsById: Record<string, WorkbenchTerminalSessionModel>;\n}\n\nexport interface WorkbenchTerminalSessionSink {\n onData?(chunk: Uint8Array): void;\n onExit?(exit: WorkbenchTerminalSessionExit): void;\n onError?(error: WorkbenchTerminalSessionError): void;\n}\n\nexport interface WorkbenchTerminalController {\n store: WorkbenchStore<WorkbenchTerminalState>;\n /** True once the host injected a session opener. */\n isAvailable(): boolean;\n setSessionOpener(opener: WorkbenchTerminalSessionOpener | null): void;\n /** Opens a session; the live adapter stays host-side and only the id is returned. */\n open(input: {\n bindingId?: string;\n request: WorkbenchTerminalSessionRequest;\n title?: string;\n }): Promise<{ sessionId: string }>;\n write(input: { sessionId: string; data: string | Uint8Array }): void;\n resize(input: { sessionId: string; cols: number; rows: number }): void;\n kill(input: { sessionId: string; signal?: string }): Promise<void>;\n killBinding(bindingId: string): Promise<void>;\n subscribe(sessionId: string, sink: WorkbenchTerminalSessionSink): () => void;\n getSession(sessionId: string): WorkbenchTerminalSessionModel | undefined;\n listSessions(): WorkbenchTerminalSessionModel[];\n /** Kills every live session. Called when the owning workbench is torn down. */\n dispose(): Promise<void>;\n}\n\nconst DEFAULT_SESSION_TITLE = \"Terminal\";\nconst SESSION_HISTORY_LIMIT = 200;\n\nexport const createWorkbenchTerminalController = (): WorkbenchTerminalController => {\n const store = createWorkbenchStore<WorkbenchTerminalState>({\n name: \"workbench.terminal\",\n initialState: { sessionsById: {} },\n });\n\n let opener: WorkbenchTerminalSessionOpener | null = null;\n const adapters = new Map<string, WorkbenchTerminalSessionAdapter>();\n const adapterDisposers = new Map<string, Array<() => void>>();\n const dataHistory = new Map<string, Uint8Array[]>();\n const dataSubscribers = new Map<string, Set<(chunk: Uint8Array) => void>>();\n const sessionIdByBindingId = new Map<string, string>();\n const bindingIdBySessionId = new Map<string, string>();\n const pendingSessionByBindingId = new Map<string, Promise<{ sessionId: string }>>();\n\n const patchSession = (sessionId: string, patch: Partial<WorkbenchTerminalSessionModel>, action: string) => {\n const snapshot = store.getState();\n const session = snapshot.sessionsById[sessionId];\n if (!session) return;\n store.setState(\n { sessionsById: { ...snapshot.sessionsById, [sessionId]: { ...session, ...patch } } },\n false,\n action,\n );\n };\n\n const requireAdapter = (sessionId: string) => {\n const adapter = adapters.get(sessionId);\n if (!adapter) throw new Error(`Unknown terminal session: ${sessionId}`);\n return adapter;\n };\n\n const cleanupSession = (sessionId: string) => {\n adapters.delete(sessionId);\n dataHistory.delete(sessionId);\n dataSubscribers.delete(sessionId);\n const bindingId = bindingIdBySessionId.get(sessionId);\n bindingIdBySessionId.delete(sessionId);\n if (bindingId && sessionIdByBindingId.get(bindingId) === sessionId) sessionIdByBindingId.delete(bindingId);\n const disposers = adapterDisposers.get(sessionId) ?? [];\n adapterDisposers.delete(sessionId);\n for (const dispose of disposers) dispose();\n };\n\n const publishData = (sessionId: string, chunk: Uint8Array) => {\n const history = dataHistory.get(sessionId);\n if (!history) return;\n const snapshot = new Uint8Array(chunk);\n history.push(snapshot);\n if (history.length > SESSION_HISTORY_LIMIT) history.shift();\n for (const subscriber of dataSubscribers.get(sessionId) ?? []) subscriber(snapshot);\n };\n\n const kill = async (input: { sessionId: string; signal?: string }) => {\n const adapter = requireAdapter(input.sessionId);\n await adapter.kill(input.signal);\n patchSession(input.sessionId, { status: \"killed\" }, \"killTerminalSession\");\n cleanupSession(input.sessionId);\n };\n\n const killBinding = async (bindingId: string) => {\n const sessionId = sessionIdByBindingId.get(bindingId);\n if (sessionId && adapters.has(sessionId)) {\n await kill({ sessionId });\n return;\n }\n\n const pending = pendingSessionByBindingId.get(bindingId);\n if (!pending) return;\n const opened = await pending.catch(() => undefined);\n if (opened && adapters.has(opened.sessionId)) await kill({ sessionId: opened.sessionId });\n };\n\n const open = async (input: { bindingId?: string; request: WorkbenchTerminalSessionRequest; title?: string }) => {\n if (!opener) throw new Error(\"Terminal sessions are not available in this workbench host.\");\n\n if (input.bindingId) {\n const sessionId = sessionIdByBindingId.get(input.bindingId);\n if (sessionId && adapters.has(sessionId)) return { sessionId };\n const pending = pendingSessionByBindingId.get(input.bindingId);\n if (pending) return await pending;\n }\n\n const openSession = (async () => {\n const adapter = await opener(input.request);\n adapters.set(adapter.id, adapter);\n dataHistory.set(adapter.id, []);\n dataSubscribers.set(adapter.id, new Set());\n if (input.bindingId) {\n sessionIdByBindingId.set(input.bindingId, adapter.id);\n bindingIdBySessionId.set(adapter.id, input.bindingId);\n }\n\n const disposers = [adapter.onData((chunk) => publishData(adapter.id, chunk))];\n const unsubscribeTitle = adapter.onTitle?.((title) =>\n patchSession(adapter.id, { title }, \"terminalSessionTitleChanged\"),\n );\n if (unsubscribeTitle) disposers.push(unsubscribeTitle);\n disposers.push(\n adapter.onExit((exit) => {\n const session = store.getState().sessionsById[adapter.id];\n if (session?.status === \"running\") {\n patchSession(adapter.id, { status: \"exited\", exit }, \"terminalSessionExited\");\n }\n cleanupSession(adapter.id);\n }),\n );\n adapterDisposers.set(adapter.id, disposers);\n\n const snapshot = store.getState();\n store.setState(\n {\n sessionsById: {\n ...snapshot.sessionsById,\n [adapter.id]: { id: adapter.id, title: input.title ?? DEFAULT_SESSION_TITLE, status: \"running\" },\n },\n },\n false,\n \"openTerminalSession\",\n );\n\n return { sessionId: adapter.id };\n })();\n\n if (input.bindingId) pendingSessionByBindingId.set(input.bindingId, openSession);\n try {\n return await openSession;\n } finally {\n if (input.bindingId && pendingSessionByBindingId.get(input.bindingId) === openSession) {\n pendingSessionByBindingId.delete(input.bindingId);\n }\n }\n };\n\n return {\n store,\n\n isAvailable: () => opener !== null,\n\n setSessionOpener(next) {\n opener = next;\n },\n\n open,\n\n write(input) {\n requireAdapter(input.sessionId).write(input.data);\n },\n\n resize(input) {\n requireAdapter(input.sessionId).resize(input.cols, input.rows);\n },\n\n kill,\n\n killBinding,\n\n subscribe(sessionId, sink) {\n const adapter = requireAdapter(sessionId);\n const unsubscribes: Array<(() => void) | undefined> = [];\n if (sink.onData) {\n const onData = sink.onData;\n const subscribers = dataSubscribers.get(sessionId);\n subscribers?.add(onData);\n unsubscribes.push(() => subscribers?.delete(onData));\n for (const chunk of dataHistory.get(sessionId) ?? []) onData(chunk);\n }\n unsubscribes.push(\n sink.onExit ? adapter.onExit(sink.onExit) : undefined,\n sink.onError ? adapter.onError(sink.onError) : undefined,\n );\n return () => {\n for (const unsubscribe of unsubscribes) unsubscribe?.();\n };\n },\n\n getSession(sessionId) {\n return store.getState().sessionsById[sessionId];\n },\n\n listSessions() {\n return Object.values(store.getState().sessionsById);\n },\n\n async dispose() {\n const running = Object.values(store.getState().sessionsById).filter((session) => session.status === \"running\");\n await Promise.all(running.map((session) => kill({ sessionId: session.id })));\n for (const session of Object.values(store.getState().sessionsById)) cleanupSession(session.id);\n adapters.clear();\n },\n };\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface CommandPaletteResourceQueryContext {\n query: string;\n limit: number;\n signal?: AbortSignal;\n}\n\n// A single dynamic palette result. `activate` is supplied by whoever registers the\n// provider (e.g. the extension host running a command or opening a resource), keeping\n// this registry free of command/resource execution concerns.\nexport interface CommandPaletteResourceResult {\n id: string;\n resource?: ResourceRef;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n group?: string;\n activate(): void | Promise<void>;\n}\n\nexport interface CommandPaletteResourceProvider {\n id: string;\n title: string;\n refreshEventIds?: string[];\n query(context: CommandPaletteResourceQueryContext): Promise<readonly CommandPaletteResourceResult[]>;\n}\n\nexport interface CommandPaletteResourceProviderResult {\n providerId: string;\n title: string;\n results: readonly CommandPaletteResourceResult[];\n}\n\nexport interface CommandPaletteResourceRegistryStoreState {\n providers: Record<string, CommandPaletteResourceProvider>;\n // Bumped to ask the palette to re-query providers (e.g. after a refresh event).\n refreshToken: number;\n}\n\nexport interface CommandPaletteResourceRegistry {\n store: WorkbenchStore<CommandPaletteResourceRegistryStoreState>;\n registerProvider(provider: CommandPaletteResourceProvider): Disposable;\n listProviders(): CommandPaletteResourceProvider[];\n queryProviders(context: CommandPaletteResourceQueryContext): Promise<CommandPaletteResourceProviderResult[]>;\n refresh(): void;\n}\n\nexport const createCommandPaletteResourceRegistry = (): CommandPaletteResourceRegistry => {\n const store = createWorkbenchStore<CommandPaletteResourceRegistryStoreState>({\n name: \"workbench.commandPaletteResources\",\n initialState: { providers: {}, refreshToken: 0 },\n });\n\n return {\n store,\n\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) {\n throw new Error(`Command palette resource provider already registered: ${provider.id}`);\n }\n\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n\n listProviders() {\n return Object.values(store.getState().providers);\n },\n\n async queryProviders(context) {\n const providers = Object.values(store.getState().providers);\n return Promise.all(\n providers.map(async (provider) => {\n try {\n const results = await provider.query(context);\n return { providerId: provider.id, title: provider.title, results };\n } catch {\n // Error isolation: a failing provider must not blank the palette or break peers.\n return { providerId: provider.id, title: provider.title, results: [] };\n }\n }),\n );\n },\n\n refresh() {\n const snapshot = store.getState();\n store.setState({ ...snapshot, refreshToken: snapshot.refreshToken + 1 }, false, \"refresh\");\n },\n };\n};\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport interface WorkbenchCommandExecutionError {\n commandId: string;\n args: unknown;\n error: unknown;\n}\n\nexport type WorkbenchCommandExecutionErrorListener = (event: WorkbenchCommandExecutionError) => void;\n\nexport interface WorkbenchCommandExecutionContext {\n resource?: ResourceRef;\n signal?: AbortSignal;\n source?: \"panel-add\";\n}\n\nexport interface CommandParamOption {\n label: string;\n value: string;\n icon?: string;\n}\n\nexport interface CommandParamOptionSource {\n commandId: string;\n valueField: string;\n labelField: string;\n params?: Record<string, unknown>;\n}\n\nexport interface CommandParamDescriptor {\n type: string;\n label?: string;\n description?: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: CommandParamOption[] | CommandParamOptionSource;\n allowCustomValues?: boolean;\n templateType?: string;\n resourceType?: string;\n /** Workspace provider ids a `workspace` param may offer. */\n providers?: string[];\n accept?: string;\n multiple?: boolean;\n metadata?: Record<string, unknown>;\n resolvedFrom?: \"resource\";\n}\n\nexport type CommandParamSchema = Record<string, CommandParamDescriptor>;\n\nexport interface Command {\n id: string;\n label: string;\n category?: string;\n description?: string;\n icon?: string;\n when?: string;\n params?: CommandParamSchema;\n resourceMutation?: import(\"@pstdio/sdk/extensions\").CommandDefinition[\"resourceMutation\"];\n}\n\nexport interface CommandHandler<TArgs = unknown, TResult = unknown> {\n prepareArgs?(\n args: TArgs,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: TArgs) => void,\n ): TArgs | Promise<TArgs>;\n execute(args: TArgs, context?: WorkbenchCommandExecutionContext): TResult | Promise<TResult>;\n isEnabled?(args: TArgs): boolean;\n isVisible?(args: TArgs): boolean;\n isToggled?(args: TArgs): boolean;\n}\n\nexport interface RegisteredCommand extends RegisteredContributionMetadata {\n command: Command;\n handler: CommandHandler;\n}\n\nexport interface CommandRegistryStoreState {\n commands: Record<string, RegisteredCommand>;\n}\n\nexport interface CommandRegistry {\n store: WorkbenchStore<CommandRegistryStoreState>;\n registerCommand<TArgs = unknown, TResult = unknown>(\n command: Command,\n handler: CommandHandler<TArgs, TResult>,\n metadata?: ContributionMetadata,\n ): Disposable;\n getCommand(id: string): RegisteredCommand | undefined;\n listCommands(): RegisteredCommand[];\n isCommandEnabled(id: string, args?: unknown): boolean;\n isCommandVisible(id: string, args?: unknown): boolean;\n isCommandToggled(id: string, args?: unknown): boolean;\n prepareCommandArgs(\n id: string,\n args: unknown,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n ): Promise<unknown>;\n executeCommand(id: string, args?: unknown, context?: WorkbenchCommandExecutionContext): Promise<unknown>;\n onDidExecuteError(listener: WorkbenchCommandExecutionErrorListener): Disposable;\n}\n\nexport interface CreateCommandRegistryInput {\n context?: ContextKeyService;\n}\n\nexport const createCommandRegistry = (input: CreateCommandRegistryInput = {}): CommandRegistry => {\n const store = createWorkbenchStore<CommandRegistryStoreState>({\n name: \"workbench.commands\",\n initialState: { commands: {} },\n });\n\n const errorListeners = new Set<WorkbenchCommandExecutionErrorListener>();\n\n const requireCommand = (id: string) => {\n const record = store.getState().commands[id];\n if (!record) throw new Error(`Command not registered: ${id}`);\n return record;\n };\n\n const emitError = (event: WorkbenchCommandExecutionError) => {\n for (const listener of errorListeners) listener(event);\n };\n\n return {\n store,\n\n registerCommand(command, handler, metadata) {\n const snapshot = store.getState();\n if (snapshot.commands[command.id]) throw new Error(`Command already registered: ${command.id}`);\n\n const record: RegisteredCommand = {\n ...normalizeContributionMetadata(metadata),\n command,\n handler: handler as CommandHandler,\n };\n\n store.setState({ commands: { ...snapshot.commands, [command.id]: record } }, false, \"registerCommand\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.commands[command.id] !== record) return;\n const { [command.id]: _removed, ...rest } = current.commands;\n store.setState({ commands: rest }, false, \"unregisterCommand\");\n });\n },\n\n getCommand(id) {\n return store.getState().commands[id];\n },\n\n listCommands() {\n return Object.values(store.getState().commands).sort(byContributionPriority);\n },\n\n isCommandEnabled(id, args) {\n return requireCommand(id).handler.isEnabled?.(args) ?? true;\n },\n\n isCommandVisible(id, args) {\n const record = requireCommand(id);\n if (!input.context?.matches(record.command.when)) return false;\n return record.handler.isVisible?.(args) ?? true;\n },\n\n isCommandToggled(id, args) {\n return requireCommand(id).handler.isToggled?.(args) ?? false;\n },\n\n async prepareCommandArgs(id, args, context, onArgsChange) {\n const prepare = requireCommand(id).handler.prepareArgs;\n return prepare ? prepare(args, context, onArgsChange) : args;\n },\n\n async executeCommand(id, args, context) {\n const record = requireCommand(id);\n if (record.handler.isEnabled?.(args) === false) {\n const error = new Error(`Command is disabled: ${id}`);\n emitError({ commandId: id, args, error });\n throw error;\n }\n try {\n return await record.handler.execute(args, context);\n } catch (error) {\n emitError({ commandId: id, args, error });\n throw error;\n }\n },\n\n onDidExecuteError(listener) {\n errorListeners.add(listener);\n return createDisposable(() => {\n errorListeners.delete(listener);\n });\n },\n };\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\n\nexport type MenuPath = readonly string[];\n\nexport interface MenuItem {\n commandId: string;\n sourceCommandId?: string;\n label?: string;\n description?: string;\n icon?: string;\n iconSrc?: string;\n overflowLabel?: string;\n when?: string;\n group?: string;\n order?: number;\n args?: unknown;\n readOnly?: boolean;\n /** Marks a menu action that navigates outside the app, rendered with a trailing external-link icon. */\n external?: boolean;\n}\n\nexport interface RegisteredMenuItem extends MenuItem, RegisteredContributionMetadata {\n path: MenuPath;\n}\n\ninterface MenuRegistryDeps {\n commands: CommandRegistry;\n}\n\nconst menuPathKey = (path: MenuPath) => path.join(\"/\");\n\nexport interface MenuRegistryStoreState {\n itemsByPath: Record<string, RegisteredMenuItem[]>;\n}\n\nexport interface MenuRegistry {\n menuStore: WorkbenchStore<MenuRegistryStoreState>;\n registerMenuItem(path: MenuPath, item: MenuItem, metadata?: ContributionMetadata): Disposable;\n listMenuItems(path: MenuPath): RegisteredMenuItem[];\n}\n\nexport const createMenuRegistry = (deps: MenuRegistryDeps): MenuRegistry => {\n const menuStore = createWorkbenchStore<MenuRegistryStoreState>({\n name: \"workbench.menus\",\n initialState: { itemsByPath: {} },\n });\n\n return {\n menuStore,\n\n registerMenuItem(path, item, metadata) {\n if (!deps.commands.getCommand(item.commandId)) throw new Error(`Menu command not registered: ${item.commandId}`);\n\n const key = menuPathKey(path);\n const record: RegisteredMenuItem = {\n ...normalizeContributionMetadata(metadata),\n ...item,\n path,\n };\n const snapshot = menuStore.getState();\n const items = snapshot.itemsByPath[key] ?? [];\n menuStore.setState(\n {\n itemsByPath: { ...snapshot.itemsByPath, [key]: [...items, record] },\n },\n false,\n \"registerMenuItem\",\n );\n\n return createDisposable(() => {\n const current = menuStore.getState();\n const list = current.itemsByPath[key] ?? [];\n const filtered = list.filter((entry) => entry !== record);\n if (filtered.length === list.length) return;\n menuStore.setState(\n {\n itemsByPath: { ...current.itemsByPath, [key]: filtered },\n },\n false,\n \"unregisterMenuItem\",\n );\n });\n },\n\n listMenuItems(path) {\n return [...(menuStore.getState().itemsByPath[menuPathKey(path)] ?? [])].sort((left, right) => {\n const leftOrder = left.order ?? 0;\n const rightOrder = right.order ?? 0;\n return leftOrder - rightOrder || byContributionPriority(left, right);\n });\n },\n };\n};\n","import 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","// A one-resource binding owns one live view; its resource is updated in place.\nexport const SINGLE_RESOURCE_INSTANCE_KEY = \"single\";\n","import type { PageOpenIntent, PlacementItem } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"./placement-instance-key\";\nexport type WorkbenchPlacementPresence = \"fixed\" | \"open\" | \"closed\";\nexport type WorkbenchOwnedPlacementItem = PlacementItem;\nexport const placementItemViewId = (item: PlacementItem) =>\n contributionRefId(item.kind === \"view\" ? item.view : item.binding.view);\n/** A user's explicit open or close of an optional static placement. */\nexport type StaticPlacementOverride = \"open\" | \"closed\";\nexport interface OwnedResourceInstance {\n instanceKey: string;\n resource: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface OwnedPlacementState {\n staticOverrides: Map<string, StaticPlacementOverride>;\n resourceInstances: Map<string, readonly OwnedResourceInstance[]>;\n}\nexport const createOwnedPlacementState = (): OwnedPlacementState => ({\n staticOverrides: new Map(),\n resourceInstances: new Map(),\n});\nexport const isStaticPlacementOpen = (item: WorkbenchOwnedPlacementItem, state: OwnedPlacementState, id: string) => {\n if (item.kind !== \"view\") return false;\n if (item.presence === \"fixed\") return true;\n return (state.staticOverrides.get(id) ?? item.presence) === \"open\";\n};\nexport const staticPlacementClosable = (item: WorkbenchOwnedPlacementItem) =>\n item.kind !== \"view\" || item.presence !== \"fixed\";\nexport const validateOwnedPlacementItem = (label: string, id: string, item: WorkbenchOwnedPlacementItem) => {\n if (item.kind === \"binding\" && item.binding.kinds.length === 0) {\n throw new Error(`${label} \"${id}\" must bind at least one resource kind`);\n }\n};\nexport const openStaticPlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"view\") throw new Error(`${label} \"${id}\" is not a static placement`);\n if (input.resource) throw new Error(`${label} \"${id}\" does not accept a resource`);\n if (input.open) throw new Error(`${label} \"${id}\" does not accept an open intent`);\n if (item.presence !== \"fixed\") state.staticOverrides.set(id, \"open\");\n};\nexport const closeStaticPlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"view\") throw new Error(`${label} \"${id}\" is not a static placement`);\n if (item.presence === \"fixed\") throw new Error(`${label} \"${id}\" is fixed and cannot close`);\n state.staticOverrides.set(id, \"closed\");\n};\nconst retainResourceInstances = (\n item: Extract<\n WorkbenchOwnedPlacementItem,\n {\n kind: \"binding\";\n }\n >,\n current: readonly OwnedResourceInstance[],\n next: OwnedResourceInstance,\n): readonly OwnedResourceInstance[] => {\n if (item.binding.cardinality === \"one\") return [next];\n const existing = current.find((candidate) => candidate.instanceKey === next.instanceKey);\n const open: PageOpenIntent = existing?.open === \"pin\" || next.open === \"pin\" ? \"pin\" : \"preview\";\n const retained = current.filter(\n (candidate) => candidate.instanceKey !== next.instanceKey && (open === \"pin\" || candidate.open === \"pin\"),\n );\n return [...retained, { ...next, open }];\n};\n// An instance keeps the key it opened with while updates change its resource, so an open\n// resource is found by what the instance shows now. A new instance never reuses a taken key.\nconst resourceInstanceKey = (current: readonly OwnedResourceInstance[], resource: ResourceRef) => {\n const key = resourceKey(resource);\n const shown = current.find((instance) => resourceKey(instance.resource) === key);\n if (shown) return shown.instanceKey;\n const taken = new Set(current.map((instance) => instance.instanceKey));\n let instanceKey = key;\n for (let suffix = 2; taken.has(instanceKey); suffix += 1) instanceKey = `${key}#${suffix}`;\n return instanceKey;\n};\nexport const openResourcePlacement = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}) => {\n const { id, item, label, state } = input;\n if (item.kind !== \"binding\") throw new Error(`${label} \"${id}\" is not resource-backed`);\n if (!input.resource) throw new Error(`${label} \"${id}\" requires a resource`);\n if (!resourceMatchesConstraint(item.binding, input.resource)) {\n throw new Error(`${label} \"${id}\" does not accept resource kind \"${input.resource.type}\"`);\n }\n if (input.open && item.binding.cardinality !== \"many\") {\n throw new Error(`${label} \"${id}\" accepts open intent only with many cardinality`);\n }\n const current = state.resourceInstances.get(id) ?? [];\n const instance: OwnedResourceInstance = {\n instanceKey:\n item.binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : resourceInstanceKey(current, input.resource),\n resource: input.resource,\n ...(item.binding.cardinality === \"many\" ? { open: input.open ?? (\"preview\" as const) } : {}),\n ...(input.title ? { title: input.title } : {}),\n };\n state.resourceInstances.set(id, retainResourceInstances(item, current, instance));\n return instance.instanceKey;\n};\nexport const closeOwnedPlacementInstance = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n instanceKey: string;\n}) => {\n if (input.instanceKey === \"default\") {\n closeStaticPlacement(input);\n return true;\n }\n const current = input.state.resourceInstances.get(input.id) ?? [];\n const next = current.filter((instance) => instance.instanceKey !== input.instanceKey);\n if (next.length === current.length) return false;\n input.state.resourceInstances.set(input.id, next);\n return true;\n};\nexport const updateResourcePlacementInstance = (input: {\n label: string;\n id: string;\n item: WorkbenchOwnedPlacementItem;\n state: OwnedPlacementState;\n instanceKey: string;\n resource?: ResourceRef;\n title?: string;\n open?: PageOpenIntent;\n}) => {\n const { id, item, label, state } = input;\n if (input.instanceKey === \"default\" || item.kind !== \"binding\") return;\n if (input.resource && !resourceMatchesConstraint(item.binding, input.resource)) {\n throw new Error(`${label} \"${id}\" does not accept resource kind \"${input.resource.type}\"`);\n }\n const instances = state.resourceInstances.get(id) ?? [];\n state.resourceInstances.set(\n id,\n instances\n .filter(\n (instance) => input.open !== \"preview\" || instance.open === \"pin\" || instance.instanceKey === input.instanceKey,\n )\n .map((instance) =>\n instance.instanceKey === input.instanceKey\n ? {\n ...instance,\n ...(input.open ? { open: input.open } : {}),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.title === undefined ? {} : { title: input.title }),\n }\n : instance,\n ),\n );\n};\nexport const clearOwnedPlacementState = (state: OwnedPlacementState, id: string) => {\n state.staticOverrides.delete(id);\n state.resourceInstances.delete(id);\n};\n","import type { PageLocation, PageOpenIntent, PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport {\n type OwnedPlacementState,\n openResourcePlacement,\n openStaticPlacement,\n type WorkbenchOwnedPlacementItem,\n} from \"./owned-placement-lifecycle\";\n\nexport interface OwnedPlacementOpenInput {\n placementId: string;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface OwnedPlacementLocationContext {\n modeId: string;\n pageId?: string;\n projectId?: string;\n location?: PageLocation;\n}\nexport interface OwnedPlacementPreparation {\n connectRuntime(listener: () => void): Disposable;\n restore?(\n context: OwnedPlacementLocationContext,\n state?: OwnedPlacementState,\n previousContext?: OwnedPlacementLocationContext,\n ): OwnedPlacementState;\n adopt?(\n modeId: string,\n placements: readonly WorkbenchWidgetPlacement[],\n state?: OwnedPlacementState,\n ): OwnedPlacementState;\n getState(): OwnedPlacementState;\n open(\n target: OwnedPlacementOpenInput,\n current?: OwnedPlacementState,\n ): { state: OwnedPlacementState; identity: PlacementIdentity };\n resolve(modeId?: string, state?: OwnedPlacementState): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n apply(state: OwnedPlacementState): void;\n publish(): void;\n}\nconst preparations = new WeakMap<object, OwnedPlacementPreparation>();\nexport const setOwnedPlacementPreparation = (registry: object, preparation: OwnedPlacementPreparation) =>\n preparations.set(registry, preparation);\nexport const getOwnedPlacementPreparation = (registry: object) => {\n const preparation = preparations.get(registry);\n if (!preparation) throw new Error(\"Owned placement preparation is unavailable\");\n return preparation;\n};\nexport const prepareOwnedPlacement = (input: {\n label: string;\n target: OwnedPlacementOpenInput;\n item: WorkbenchOwnedPlacementItem;\n current: OwnedPlacementState;\n identityFor(instanceKey: string): PlacementIdentity;\n}) => {\n const state = {\n staticOverrides: new Map(input.current.staticOverrides),\n resourceInstances: new Map(input.current.resourceInstances),\n };\n const operation = { ...input.target, label: input.label, id: input.target.placementId, item: input.item, state };\n let instanceKey = \"default\";\n if (input.item.kind === \"view\") openStaticPlacement(operation);\n else instanceKey = openResourcePlacement(operation);\n return { state, identity: input.identityFor(instanceKey) };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { OwnedPlacementState, WorkbenchOwnedPlacementItem } from \"./owned-placement-lifecycle\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"./placement-instance-key\";\n\nexport const restoreOwnedPlacementState = (input: {\n state: OwnedPlacementState;\n declarations: readonly { id: string; item: WorkbenchOwnedPlacementItem }[];\n saved: readonly WorkbenchWidgetPlacement[];\n owns(identity: PlacementIdentity): boolean;\n}) => {\n const state = {\n staticOverrides: new Map(input.state.staticOverrides),\n resourceInstances: new Map(input.state.resourceInstances),\n };\n for (const placement of input.declarations) {\n const saved = input.saved.filter((candidate) => {\n const identity = candidate.placementIdentity;\n return identity && input.owns(identity) && identity.kind !== \"page\" && identity.placementId === placement.id;\n });\n if (placement.item.kind === \"view\") {\n state.staticOverrides.set(placement.id, saved.length ? \"open\" : \"closed\");\n continue;\n }\n const binding = placement.item.binding;\n const instances = saved.flatMap((candidate) => {\n if (\n !candidate.resource ||\n !candidate.placementIdentity ||\n !resourceMatchesConstraint(binding, candidate.resource)\n )\n return [];\n return [\n {\n instanceKey:\n binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : candidate.placementIdentity.instanceKey,\n resource: candidate.resource,\n title: candidate.title,\n ...(binding.cardinality === \"many\"\n ? { open: candidate.tabRetention === \"preview\" ? (\"preview\" as const) : (\"pin\" as const) }\n : {}),\n },\n ];\n });\n state.resourceInstances.set(placement.id, binding.cardinality === \"one\" ? instances.slice(-1) : instances);\n }\n return state;\n};\n","import type { DockedWorkbenchRegion, PageOpenIntent, PlacementIdentity, PlacementRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { notifyWorkbenchChange } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport { createPlacement } from \"../layout/layout-operations\";\nimport type { RegisteredWidgetContribution, WorkbenchLayout, WorkbenchWidgetPlacement } from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport {\n clearOwnedPlacementState,\n closeOwnedPlacementInstance,\n createOwnedPlacementState,\n isStaticPlacementOpen,\n placementItemViewId,\n staticPlacementClosable,\n updateResourcePlacementInstance,\n validateOwnedPlacementItem,\n type WorkbenchOwnedPlacementItem,\n} from \"../placements/owned-placement-lifecycle\";\nimport type { OwnedPlacementLocationContext } from \"../placements/owned-placement-preparation\";\nimport {\n type OwnedPlacementPreparation,\n prepareOwnedPlacement,\n setOwnedPlacementPreparation,\n} from \"../placements/owned-placement-preparation\";\nimport { restoreOwnedPlacementState } from \"../placements/owned-placement-restoration\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport {\n modePlacementContributionId,\n registerWorkbenchViewPlacement,\n type WorkbenchPlacementPresentation,\n} from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchModePlacementContribution extends WorkbenchPlacementPresentation {\n readonly id: string;\n readonly ref: PlacementRef;\n readonly modeId: string;\n readonly item: WorkbenchOwnedPlacementItem;\n readonly region: DockedWorkbenchRegion;\n readonly order?: number;\n readonly movableTo?: readonly DockedWorkbenchRegion[];\n}\n\ninterface OpenModePlacementTarget {\n panel: PlacementRef;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n}\n\nexport interface WorkbenchModePlacementRegistry {\n registerPlacement(placement: WorkbenchModePlacementContribution): Disposable;\n getPlacement(ref: PlacementRef): WorkbenchModePlacementContribution | undefined;\n listPlacements(modeId?: string): WorkbenchModePlacementContribution[];\n openPlacement(input: OpenModePlacementTarget): PlacementIdentity;\n updatePlacement(\n identity: PlacementIdentity,\n input: { resource?: ResourceRef; title?: string; open?: PageOpenIntent },\n ): void;\n closePlacement(identity: PlacementIdentity): void;\n resolvePlacements(\n modeId: string,\n context?: OwnedPlacementLocationContext,\n ): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n onDidChange(listener: () => void): Disposable;\n}\n\nconst identityFor = (placement: WorkbenchModePlacementContribution, instanceKey: string): PlacementIdentity => ({\n kind: \"mode\",\n modeId: placement.modeId,\n placementId: placement.id,\n instanceKey,\n});\n\nconst tabState = (open: PageOpenIntent | undefined) => {\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n if (open === \"preview\") return { pinned: false, tabRetention: \"preview\" as const };\n return {};\n};\n\nconst placementRefKey = (ref: PlacementRef) => JSON.stringify([ref.extensionId, ref.id]);\n\nconst validatePlacement = (input: {\n placement: WorkbenchModePlacementContribution;\n placements: Map<string, WorkbenchModePlacementContribution>;\n refs: Map<string, WorkbenchModePlacementContribution>;\n views: WorkbenchViewRegistry;\n}) => {\n const { placement, placements, refs, views } = input;\n if (placements.has(placement.id)) throw new Error(`Mode placement already registered: ${placement.id}`);\n if (placement.ref.kind !== \"placement\" || !placement.ref.extensionId || !placement.ref.id) {\n throw new Error(`Mode placement \"${placement.id}\" must declare a normalized placement ref`);\n }\n const refKey = placementRefKey(placement.ref);\n if (refs.has(refKey)) throw new Error(`Mode placement ref already registered: ${refKey}`);\n if (placement.movableTo && !placement.movableTo.includes(placement.region)) {\n throw new Error(`Mode placement \"${placement.id}\" must include its initial region in movableTo`);\n }\n validateOwnedPlacementItem(\"Mode placement\", placement.id, placement.item);\n if (!views.getView(placementItemViewId(placement.item))) {\n throw new Error(`Workbench mode placement view is not registered: ${placementItemViewId(placement.item)}`);\n }\n return refKey;\n};\n\nconst copyPlacement = (placement: WorkbenchModePlacementContribution) => ({\n ...placement,\n ref: { ...placement.ref },\n item: { ...placement.item },\n ...(placement.movableTo ? { movableTo: [...placement.movableTo] } : {}),\n});\n\nexport const createWorkbenchModePlacementRegistry = (input: {\n views: WorkbenchViewRegistry;\n getProjectId?(): string | undefined;\n loadLayout?(context: OwnedPlacementLocationContext): WorkbenchLayout | undefined;\n viewMenus?: WorkbenchViewMenuRegistry;\n getPanel(panelId: string): RegisteredWidgetContribution | undefined;\n registerPanel: Parameters<typeof registerWorkbenchViewPlacement>[0];\n}): WorkbenchModePlacementRegistry => {\n const placements = new Map<string, WorkbenchModePlacementContribution>();\n const refs = new Map<string, WorkbenchModePlacementContribution>();\n let state = createOwnedPlacementState();\n const listeners = new Set<() => void>();\n const label = \"Mode placement\";\n\n const listPlacements = (modeId?: string) =>\n [...placements.values()]\n .filter((placement) => !modeId || placement.modeId === modeId)\n .sort((left, right) => left.id.localeCompare(right.id));\n\n let runtime: (() => void) | undefined;\n const emitChange = () => {\n runtime?.();\n for (const listener of listeners)\n notifyWorkbenchChange(listener, () => runWorkbenchEffect(\"mode placement subscriber\", listener));\n };\n\n const resolve = (\n placement: WorkbenchModePlacementContribution,\n instanceKey: string,\n resource?: ResourceRef,\n open?: PageOpenIntent,\n title?: string,\n ): ResolvedOwnedPlacement<WorkbenchWidgetPlacement> => {\n const view = input.views.getView(placementItemViewId(placement.item));\n if (!view)\n throw new Error(`Workbench mode placement view is not registered: ${placementItemViewId(placement.item)}`);\n const contributionId = modePlacementContributionId(placement.id);\n const panel = input.getPanel(contributionId);\n if (!panel) throw new Error(`Workbench mode placement is not registered: ${placement.id}`);\n const identity = identityFor(placement, instanceKey);\n return {\n identity,\n region: placement.region,\n order: placement.order ?? 0,\n value: createPlacement(\n `workbench.mode.${encodeURIComponent(placement.id)}.${encodeURIComponent(instanceKey)}`,\n panel,\n {\n viewId: placementItemViewId(placement.item),\n role: placement.region === \"main\" ? \"location\" : \"sub-panel\",\n closable: staticPlacementClosable(placement.item),\n ...(resource ? { resource } : {}),\n ...(title ? { title } : {}),\n ...tabState(open),\n },\n ),\n };\n };\n\n const preparation: OwnedPlacementPreparation = {\n connectRuntime(listener) {\n runtime = listener;\n return createDisposable(() => {\n if (runtime === listener) runtime = undefined;\n });\n },\n getState: () => state,\n restore(context, current = state) {\n if (input.getProjectId && context.projectId !== input.getProjectId()) current = createOwnedPlacementState();\n const saved = input.loadLayout?.(context);\n if (!saved) return current;\n const declarations = listPlacements(context.modeId).filter((placement) =>\n placement.item.kind === \"view\"\n ? !current.staticOverrides.has(placement.id)\n : !current.resourceInstances.has(placement.id),\n );\n if (!declarations.length) return current;\n return restoreOwnedPlacementState({\n state: current,\n declarations,\n saved: Object.values(saved.regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"mode\" && identity.modeId === context.modeId,\n });\n },\n adopt(modeId, saved, current = state) {\n return restoreOwnedPlacementState({\n state: current,\n declarations: listPlacements(modeId),\n saved,\n owns: (identity) => identity.kind === \"mode\" && identity.modeId === modeId,\n });\n },\n open(target, current = state) {\n const placement = placements.get(target.placementId);\n if (!placement) throw new Error(`Unknown mode placement: ${target.placementId}`);\n return prepareOwnedPlacement({\n label,\n target,\n item: placement.item,\n current,\n identityFor: (instanceKey) => identityFor(placement, instanceKey),\n });\n },\n apply: (next) => {\n state = next;\n },\n publish: emitChange,\n resolve(modeId, current = state) {\n if (!modeId) return [];\n return listPlacements(modeId).flatMap((placement) => {\n if (placement.item.kind === \"view\") {\n return isStaticPlacementOpen(placement.item, current, placement.id) ? [resolve(placement, \"default\")] : [];\n }\n return (current.resourceInstances.get(placement.id) ?? []).map((instance) =>\n resolve(placement, instance.instanceKey, instance.resource, instance.open, instance.title),\n );\n });\n },\n };\n const registry: WorkbenchModePlacementRegistry = {\n registerPlacement(placement) {\n const refKey = validatePlacement({ placement, placements, refs, views: input.views });\n const registered = copyPlacement(placement);\n const panel = registerWorkbenchViewPlacement(\n input.registerPanel,\n input.views,\n {\n ...registered,\n id: modePlacementContributionId(registered.id),\n viewId: placementItemViewId(registered.item),\n role: registered.region === \"main\" ? \"location\" : \"sub-panel\",\n singleton: registered.item.kind === \"view\" || registered.item.binding.cardinality === \"one\",\n closable: staticPlacementClosable(registered.item),\n },\n input.viewMenus,\n );\n placements.set(registered.id, registered);\n refs.set(refKey, registered);\n emitChange();\n return createDisposable(() => {\n if (placements.get(registered.id) !== registered) return;\n placements.delete(registered.id);\n refs.delete(refKey);\n clearOwnedPlacementState(state, registered.id);\n panel.dispose();\n emitChange();\n });\n },\n\n getPlacement(ref) {\n return refs.get(placementRefKey(ref));\n },\n\n listPlacements,\n\n openPlacement(target) {\n const placement = refs.get(placementRefKey(target.panel));\n if (!placement) throw new Error(`Unknown mode panel: ${target.panel.extensionId}.${target.panel.id}`);\n const prepared = preparation.open({ ...target, placementId: placement.id });\n preparation.apply(prepared.state);\n preparation.publish();\n return prepared.identity;\n },\n\n closePlacement(identity) {\n if (identity.kind !== \"mode\") throw new Error(\"Mode placement registry closes only mode-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n const changed = closeOwnedPlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n });\n if (changed) emitChange();\n },\n\n updatePlacement(identity, update) {\n if (identity.kind !== \"mode\") throw new Error(\"Mode placement registry updates only mode-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n updateResourcePlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n ...update,\n });\n emitChange();\n },\n\n resolvePlacements: (modeId, context) =>\n preparation.resolve(modeId, context ? preparation.restore!(context) : state),\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n\n setOwnedPlacementPreparation(registry, preparation);\n return registry;\n};\n","import type {\n NavigationTargetPage as SdkNavigationTargetPage,\n NavigationTargetPanel as SdkNavigationTargetPanel,\n} from \"@pstdio/sdk/extensions\";\nimport { isNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport {\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\";\n\n/** Core-only panel ref for host-owned shell placements. Extensions cannot address them. */\nexport interface ShellPlacementRef {\n kind: \"shell-placement\";\n id: string;\n}\n\nexport interface NavigationTargetShellPanel {\n kind: \"panel\";\n panel: ShellPlacementRef;\n resource?: SdkNavigationTargetPanel[\"resource\"];\n open?: SdkNavigationTargetPanel[\"open\"];\n title?: string;\n}\n\nexport type NavigationTargetPanel = SdkNavigationTargetPanel | NavigationTargetShellPanel;\n\nexport type NavigationTargetPage = SdkNavigationTargetPage;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport interface NavigationTargetCommand {\n kind: \"command\";\n commandId: string;\n args?: unknown;\n}\n\nexport interface NavigationTargetHref {\n kind: \"href\";\n href: string;\n}\n\nexport type NavigationTargetItem =\n | NavigationTargetPage\n | NavigationTargetPanel\n | NavigationTargetCommand\n | NavigationTargetHref;\n\nexport interface NavigationTargetCompound {\n kind: \"compound\";\n targets: readonly (NavigationTargetPage | NavigationTargetPanel)[];\n}\n\nexport type NavigationTarget = NavigationTargetItem | NavigationTargetCompound;\n\nexport interface NavigationParser {\n id: string;\n priority?: number;\n canParse(location: string): boolean;\n parse(location: string): NavigationTarget;\n}\n\nexport type RegisteredNavigationParser = Omit<NavigationParser, \"priority\"> & RegisteredContributionMetadata;\n\n// Minimal presenter surface the navigation dispatcher needs; resolved through a\n// closure to break the otherwise-circular core ↔ navigation dep.\nexport interface NavigationDispatcherContext {\n canOpenPanel?(target: NavigationTargetPanel): boolean;\n canExecuteCommand?(commandId: string): boolean;\n prepareNavigation?(targets: readonly (NavigationTargetPage | NavigationTargetPanel)[]): { commit(): unknown };\n openPanelTarget?(target: NavigationTargetPanel): unknown;\n openPageTarget?(target: NavigationTargetPage): unknown;\n executeCommand(commandId: string, args?: unknown): Promise<unknown> | unknown;\n openHref?(href: string): Promise<unknown> | unknown;\n}\n\nconst byPriorityAndId = (left: { id: string; priority: number }, right: { id: string; priority: number }) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport interface NavigationRegistryStoreState {\n parsers: Record<string, RegisteredNavigationParser>;\n}\n\nexport interface NavigationRegistry {\n store: WorkbenchStore<NavigationRegistryStoreState>;\n registerParser(parser: NavigationParser, metadata?: ContributionMetadata): Disposable;\n listParsers(): RegisteredNavigationParser[];\n resolveLocation(location: string): NavigationTarget;\n openTarget(target: NavigationTarget): Promise<readonly unknown[]>;\n /** Opens a page location through the shared executor. */\n openPage(target: Omit<NavigationTargetPage, \"kind\">): Promise<readonly unknown[]>;\n /** Opens or activates an owned panel through the shared executor. */\n openPanel(target: DistributiveOmit<NavigationTargetPanel, \"kind\">): Promise<readonly unknown[]>;\n navigate(location: string): Promise<readonly unknown[]>;\n}\n\nexport interface CreateNavigationRegistryInput {\n // Returns the presenters the dispatcher should call. Lazy so `createWorkbench`\n // can install the navigation registry before the rest of the core is ready.\n resolveDispatcher?(): NavigationDispatcherContext;\n}\n\nconst noDispatcher = (): NavigationDispatcherContext => {\n throw new Error(\"navigation.openTarget: no dispatcher available (configure resolveDispatcher)\");\n};\n\nconst dispatchItem = async (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"page\") {\n if (!dispatcher.openPageTarget) throw new Error(\"navigation.openTarget: page target dispatcher is not configured\");\n return dispatcher.openPageTarget(target);\n }\n if (target.kind === \"panel\") {\n if (!dispatcher.openPanelTarget)\n throw new Error(\"navigation.openTarget: panel target dispatcher is not configured\");\n return dispatcher.openPanelTarget(target);\n }\n if (target.kind === \"href\") {\n if (!dispatcher.openHref) throw new Error(`Cannot open navigation href target: ${target.href}`);\n return dispatcher.openHref(target.href);\n }\n return dispatcher.executeCommand(target.commandId, target.args);\n};\n\nconst validateItem = (target: NavigationTargetItem, dispatcher: NavigationDispatcherContext) => {\n if (target.kind === \"href\" && !isNavigationTarget(target)) {\n throw new Error(\"Navigation requires an HTTP or HTTPS URL.\");\n }\n if (target.kind === \"panel\" && dispatcher.canOpenPanel?.(target) === false) {\n throw new Error(`Cannot open navigation panel target: ${target.panel.id}`);\n }\n if (target.kind === \"command\" && dispatcher.canExecuteCommand?.(target.commandId) === false) {\n throw new Error(`Cannot open navigation command target: ${target.commandId}`);\n }\n};\n\nconst toItems = (target: NavigationTarget): readonly NavigationTargetItem[] =>\n target.kind === \"compound\" ? target.targets : [target];\n\nexport const createNavigationRegistry = (input: CreateNavigationRegistryInput = {}): NavigationRegistry => {\n const resolveDispatcher = input.resolveDispatcher ?? noDispatcher;\n\n const store = createWorkbenchStore<NavigationRegistryStoreState>({\n name: \"workbench.navigation\",\n initialState: { parsers: {} },\n });\n\n const removeKey = <T>(record: Record<string, T>, key: string): Record<string, T> => {\n const { [key]: _removed, ...rest } = record;\n return rest;\n };\n\n const registry: NavigationRegistry = {\n store,\n\n registerParser(parser, metadata) {\n const snapshot = store.getState();\n if (snapshot.parsers[parser.id]) throw new Error(`Navigation parser already registered: ${parser.id}`);\n\n const { priority, ...parserContribution } = parser;\n const record: RegisteredNavigationParser = {\n ...parserContribution,\n ...normalizeContributionMetadata({ ...metadata, priority: metadata?.priority ?? priority }),\n };\n\n store.setState({ ...snapshot, parsers: { ...snapshot.parsers, [parser.id]: record } }, false, \"registerParser\");\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.parsers[parser.id] !== record) return;\n store.setState({ ...current, parsers: removeKey(current.parsers, parser.id) }, false, \"unregisterParser\");\n });\n },\n\n listParsers() {\n return Object.values(store.getState().parsers).sort(byPriorityAndId);\n },\n\n resolveLocation(location) {\n const parser = this.listParsers().find((candidate) => candidate.canParse(location));\n if (!parser) throw new Error(`No navigation parser registered for location: ${location}`);\n return parser.parse(location);\n },\n\n async openTarget(target) {\n const dispatcher = resolveDispatcher();\n const items = toItems(target);\n const results: unknown[] = [];\n\n for (const item of items) validateItem(item, dispatcher);\n\n if (target.kind === \"compound\") {\n if (target.targets.some((item) => item.kind !== \"page\" && item.kind !== \"panel\"))\n throw new Error(\"Compound navigation accepts only page and panel targets\");\n if (!dispatcher.prepareNavigation)\n throw new Error(\"navigation.openTarget: navigation preparation is not configured\");\n const prepared = dispatcher.prepareNavigation(target.targets);\n return [prepared.commit()];\n }\n for (const item of items) results.push(await dispatchItem(item, dispatcher));\n return results;\n },\n\n async openPage(target) {\n return registry.openTarget({ ...target, kind: \"page\" });\n },\n\n async openPanel(target) {\n return registry.openTarget({ ...target, kind: \"panel\" } as NavigationTargetPanel);\n },\n\n async navigate(location) {\n return registry.openTarget(registry.resolveLocation(location));\n },\n };\n\n return registry;\n};\n","import {\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\n\nexport type WorkbenchNotificationLevel = \"info\" | \"success\" | \"warning\" | \"error\";\n\nexport interface WorkbenchNotificationAction {\n commandId: string;\n title: string;\n args?: unknown;\n}\n\nexport interface WorkbenchNotification {\n id?: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt?: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface RegisteredWorkbenchNotification extends RegisteredContributionMetadata {\n id: string;\n level: WorkbenchNotificationLevel;\n title: string;\n message?: string;\n createdAt: string;\n resource?: ResourceRef;\n actions?: WorkbenchNotificationAction[];\n metadata?: Record<string, unknown>;\n}\n\nexport type WorkbenchNotificationEvent =\n | { type: \"show\"; id: string; notification: RegisteredWorkbenchNotification }\n | { type: \"dismiss\"; id: string };\n\ntype WorkbenchNotificationListener = (event: WorkbenchNotificationEvent) => void;\n\nexport interface WorkbenchNotificationStoreState {\n notifications: Record<string, RegisteredWorkbenchNotification>;\n}\n\nexport interface NotificationRegistry {\n store: WorkbenchStore<WorkbenchNotificationStoreState>;\n show(notification: WorkbenchNotification, metadata?: ContributionMetadata): RegisteredWorkbenchNotification;\n dismiss(id: string): boolean;\n clear(): void;\n listNotifications(): RegisteredWorkbenchNotification[];\n subscribe(listener: WorkbenchNotificationListener): Disposable;\n}\n\nexport const createNotificationRegistry = (): NotificationRegistry => {\n const store = createWorkbenchStore<WorkbenchNotificationStoreState>({\n name: \"workbench.notifications\",\n initialState: { notifications: {} },\n });\n\n const listeners = new Set<WorkbenchNotificationListener>();\n let generatedId = 0;\n\n const emit = (event: WorkbenchNotificationEvent) => {\n for (const listener of listeners) listener(event);\n };\n\n return {\n store,\n\n show(notification, metadata) {\n let id = notification.id;\n if (!id) {\n generatedId += 1;\n id = `workbench.notification.${generatedId.toString()}`;\n }\n\n const record: RegisteredWorkbenchNotification = {\n ...normalizeContributionMetadata(metadata),\n ...notification,\n id,\n createdAt: notification.createdAt ?? new Date().toISOString(),\n };\n\n const snapshot = store.getState();\n store.setState({ notifications: { ...snapshot.notifications, [id]: record } }, false, \"showNotification\");\n emit({ type: \"show\", id, notification: record });\n\n return record;\n },\n\n dismiss(id) {\n const snapshot = store.getState();\n if (!snapshot.notifications[id]) return false;\n const { [id]: _removed, ...rest } = snapshot.notifications;\n store.setState({ notifications: rest }, false, \"dismissNotification\");\n emit({ type: \"dismiss\", id });\n return true;\n },\n\n clear() {\n const ids = Object.keys(store.getState().notifications);\n store.setState({ notifications: {} }, false, \"clearNotifications\");\n for (const id of ids) emit({ type: \"dismiss\", id });\n },\n\n listNotifications() {\n return Object.values(store.getState().notifications).sort((left, right) =>\n right.createdAt.localeCompare(left.createdAt),\n );\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return createDisposable(() => {\n listeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport { registerWorkbenchViewPlacement, type WorkbenchPlacementPresentation } from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchOverlayContribution extends Omit<WorkbenchPlacementPresentation, \"mountStrategy\"> {\n id: string;\n viewId: string;\n closable?: boolean;\n}\n\nexport interface OpenWorkbenchOverlayInput {\n resource?: ResourceRef;\n title?: string;\n}\n\nexport interface WorkbenchOverlayRegistry {\n registerOverlay(overlay: WorkbenchOverlayContribution): Disposable;\n getOverlay(id: string): WorkbenchOverlayContribution | undefined;\n listOverlays(): WorkbenchOverlayContribution[];\n openOverlay(id: string, input?: OpenWorkbenchOverlayInput): string;\n closeOverlay(instanceId: string): void;\n}\n\nconst overlayContributionId = (id: string) => `workbench.overlay.${encodeURIComponent(id)}`;\n\nexport const createWorkbenchOverlayRegistry = (input: {\n layout: LayoutModel;\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n}): WorkbenchOverlayRegistry => {\n const overlays = new Map<string, WorkbenchOverlayContribution>();\n const registrations = new Map<string, Disposable>();\n\n return {\n registerOverlay(overlay) {\n if (overlays.has(overlay.id)) throw new Error(`Overlay already registered: ${overlay.id}`);\n const record = { ...overlay };\n const registration = registerWorkbenchViewPlacement(\n input.layout,\n input.views,\n {\n ...record,\n id: overlayContributionId(record.id),\n region: \"overlay\",\n role: \"content\",\n singleton: true,\n closable: record.closable ?? true,\n },\n input.viewMenus,\n );\n overlays.set(record.id, record);\n registrations.set(record.id, registration);\n return {\n dispose() {\n if (overlays.get(record.id) !== record) return;\n overlays.delete(record.id);\n registrations.delete(record.id);\n registration.dispose();\n },\n };\n },\n\n getOverlay: (id) => overlays.get(id),\n\n listOverlays: () => [...overlays.values()].sort((left, right) => left.id.localeCompare(right.id)),\n\n openOverlay(id, openInput = {}) {\n if (!overlays.has(id)) throw new Error(`Unknown overlay: ${id}`);\n return input.layout.openPanel(overlayContributionId(id), {\n viewId: overlays.get(id)?.viewId,\n resource: openInput.resource,\n title: openInput.title,\n closable: overlays.get(id)?.closable ?? true,\n strategy: { kind: \"persistent\" },\n }).instanceId;\n },\n\n closeOverlay(instanceId) {\n input.layout.removeWidgetPlacement(instanceId);\n },\n };\n};\n","import type { PageOpenIntent, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"../placements/placement-instance-key\";\nimport { isPageSlotClosable, primarySlot, type ResolvedPageSlot } from \"./page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageOpenInput,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlotInstance,\n} from \"./page-registry-types\";\n\nexport { primarySlot, requirePageSlot } from \"./page-main\";\n\nexport const emptyPageState = (page: WorkbenchPageContribution): WorkbenchPageRuntimeState => ({\n openStaticSlotIds: page.slots\n .filter((slot) => slot.item.kind === \"view\" && slot.item.presence === \"open\")\n .map((slot) => slot.id),\n resourceInstances: {},\n});\n\nexport const staticSlotOpen = (slot: ResolvedPageSlot, state: WorkbenchPageRuntimeState) =>\n slot.item.kind === \"view\" && (slot.item.presence === \"fixed\" || state.openStaticSlotIds.includes(slot.id));\n\nconst nextResourceInstances = (\n slot: ResolvedPageSlot,\n current: readonly WorkbenchPageSlotInstance[],\n instance: WorkbenchPageSlotInstance,\n) => {\n if (slot.item.kind !== \"binding\" || slot.item.binding.cardinality !== \"many\") return [instance];\n const existing = current.find((candidate) => candidate.instanceKey === instance.instanceKey);\n const open: PageOpenIntent = existing?.open === \"pin\" || instance.open === \"pin\" ? \"pin\" : \"preview\";\n return [\n ...current.filter(\n (candidate) => candidate.instanceKey !== instance.instanceKey && (open === \"pin\" || candidate.open === \"pin\"),\n ),\n { ...instance, open },\n ];\n};\n\nexport const openResourceSlot = (input: {\n slot: ResolvedPageSlot;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { slot, state, target } = input;\n if (slot.item.kind !== \"binding\") throw new Error(`Page slot \"${slot.id}\" does not accept a resource`);\n const binding = slot.item.binding;\n if (!target.resource) throw new Error(`Page slot \"${slot.id}\" requires a resource`);\n if (!resourceMatchesConstraint(binding, target.resource))\n throw new Error(`Page slot \"${slot.id}\" does not accept resource kind \"${target.resource.type}\"`);\n if (target.open && binding.cardinality !== \"many\")\n throw new Error(`Page slot \"${slot.id}\" accepts open intent only with many cardinality`);\n const instanceKey = binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : input.resourceKey(target.resource);\n const instance: WorkbenchPageSlotInstance = {\n instanceKey,\n resource: target.resource,\n ...(target.section ? { section: target.section } : {}),\n ...(binding.cardinality === \"many\" ? { open: target.open ?? \"preview\" } : {}),\n };\n return {\n ...state,\n resourceInstances: {\n ...state.resourceInstances,\n [slot.id]: nextResourceInstances(slot, state.resourceInstances[slot.id] ?? [], instance),\n },\n ...(slot.role === \"primary\" ? { activePrimaryInstanceKey: instanceKey } : {}),\n } satisfies WorkbenchPageRuntimeState;\n};\n\nexport const selectPrimaryTarget = (input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { page, target } = input;\n if (page.resource) {\n if (!target.resource) throw new Error(`Page \"${page.id}\" requires a resource`);\n if (!resourceMatchesConstraint(page.resource, target.resource))\n throw new Error(`Page \"${page.id}\" does not accept resource kind \"${target.resource.type}\"`);\n } else if (target.resource) throw new Error(`Page \"${page.id}\" does not accept a resource`);\n const slot = primarySlot(page);\n if (!slot) {\n if (target.open) throw new Error(`Panel collection page \"${page.id}\" does not accept an open intent`);\n return input.state;\n }\n if (target.resource) return openResourceSlot({ ...input, slot });\n if (target.open) throw new Error(`Page \"${page.id}\" accepts open intent only with a resource`);\n return { ...input.state, activePrimaryInstanceKey: \"default\" };\n};\n\nexport const pageResourceBindingSlots = (page: WorkbenchPageContribution, resource: ResourceRef | undefined) =>\n page.slots.filter(\n (slot) =>\n slot.item.kind === \"binding\" &&\n slot.openOn === \"page-resource\" &&\n resource &&\n resourceMatchesConstraint(slot.item.binding, resource),\n );\n\nexport const openPageResourceBindings = (input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n target: WorkbenchPageOpenInput;\n resourceKey(resource: ResourceRef): string;\n}) => {\n if (!input.target.resource) return input.state;\n return pageResourceBindingSlots(input.page, input.target.resource).reduce(\n (state, slot) =>\n openResourceSlot({\n slot: { ...slot, role: \"auxiliary\" },\n state,\n target: { pageId: input.page.id, resource: input.target.resource },\n resourceKey: input.resourceKey,\n }),\n input.state,\n );\n};\n\nexport const setStaticSlotOpen = (state: WorkbenchPageRuntimeState, slotId: string, open: boolean) => {\n const ids = new Set(state.openStaticSlotIds);\n if (open) ids.add(slotId);\n else ids.delete(slotId);\n return { ...state, openStaticSlotIds: [...ids] };\n};\n\nexport const removeResourceInstance = (state: WorkbenchPageRuntimeState, slotId: string, instanceKey: string) => ({\n ...state,\n resourceInstances: {\n ...state.resourceInstances,\n [slotId]: (state.resourceInstances[slotId] ?? []).filter((instance) => instance.instanceKey !== instanceKey),\n },\n});\n\nexport type ClosePageSlotResult =\n | { kind: \"stay\"; state: WorkbenchPageRuntimeState; activateInstanceKey?: string }\n | { kind: \"parent\"; state: WorkbenchPageRuntimeState; parentId: string };\n\nexport const closePageSlot = (input: {\n page: WorkbenchPageContribution;\n slot: ResolvedPageSlot;\n state: WorkbenchPageRuntimeState;\n instanceKey: string;\n}): ClosePageSlotResult => {\n const { page, slot, instanceKey } = input;\n if (!isPageSlotClosable(slot)) throw new Error(`Page slot \"${slot.id}\" is fixed and cannot close`);\n const state =\n instanceKey === \"default\"\n ? setStaticSlotOpen(input.state, slot.id, false)\n : removeResourceInstance(input.state, slot.id, instanceKey);\n if (slot.role === \"auxiliary\") return { kind: \"stay\", state };\n const remaining = state.resourceInstances[slot.id] ?? [];\n if (remaining.length) {\n const previous = state.activePrimaryInstanceKey;\n const activateInstanceKey = previous && previous !== instanceKey ? previous : remaining.at(-1)?.instanceKey;\n return { kind: \"stay\", state: { ...state, activePrimaryInstanceKey: activateInstanceKey }, activateInstanceKey };\n }\n if (!page.parentId) throw new Error(`Resource page has no parent: ${page.id}`);\n return { kind: \"parent\", state, parentId: page.parentId };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../layout/placement-reconciliation\";\nimport type { WorkbenchPageCloseResolution } from \"./page-registry-internals\";\nimport type { WorkbenchPageContribution, WorkbenchPageRegistryStoreState } from \"./page-registry-types\";\nimport { closePageSlot, emptyPageState, requirePageSlot } from \"./page-slot-lifecycle\";\n\nexport const resolvePagePlacementClose = <Value>(input: {\n identity: PlacementIdentity;\n page: WorkbenchPageContribution;\n state: WorkbenchPageRegistryStoreState<Value>;\n resourceKey(resource: ResourceRef): string;\n stateKey: string;\n}): WorkbenchPageCloseResolution => {\n const { identity, page, state } = input;\n if (identity.kind !== \"page\") throw new Error(\"Page registry can close only page-owned placements\");\n if (state.activePageId !== identity.pageId) throw new Error(`Page is not active: ${identity.pageId}`);\n const slot = requirePageSlot(page, identity.slotId);\n const exists = state.placements.some(\n (candidate) => placementIdentityKey(candidate.identity) === placementIdentityKey(identity),\n );\n if (!exists) throw new Error(`Page placement is not open: ${placementIdentityKey(identity)}`);\n\n const pageState = state.pageStates[input.stateKey] ?? emptyPageState(page);\n const closedActivePrimary = slot.role === \"primary\" && pageState.activePrimaryInstanceKey === identity.instanceKey;\n const result = closePageSlot({ page, slot, state: pageState, instanceKey: identity.instanceKey });\n const pageStates = { ...state.pageStates, [input.stateKey]: result.state };\n if (result.kind === \"parent\") return { kind: \"parent\", pageStates, parentId: result.parentId };\n if (slot.role === \"auxiliary\") {\n if (!state.location) throw new Error(\"Active page has no canonical location\");\n return {\n kind: \"stay\",\n pageStates,\n target: {\n pageId: page.id,\n ...(state.location.resource ? { resource: state.location.resource } : {}),\n ...(state.location.section ? { section: state.location.section } : {}),\n },\n locationChanged: false,\n };\n }\n const activeInstanceKey = result.state.activePrimaryInstanceKey;\n const activeInstance = (result.state.resourceInstances[slot.id] ?? []).find(\n (instance) => instance.instanceKey === activeInstanceKey,\n );\n return {\n kind: \"stay\",\n pageStates,\n target: {\n pageId: page.id,\n ...(activeInstance?.resource ? { resource: activeInstance.resource } : {}),\n ...(activeInstance?.section ? { section: activeInstance.section } : {}),\n ...(activeInstance?.open ? { open: activeInstance.open } : {}),\n },\n locationChanged: closedActivePrimary,\n };\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageRegistryStoreState, WorkbenchPageResourceCodec } from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport const pinPagePlacement = <Value>(\n state: WorkbenchPageRegistryStoreState<Value>,\n identity: PlacementIdentity,\n resources: WorkbenchPageResourceCodec,\n open: \"pin\" | \"preview\" = \"pin\",\n) => {\n if (identity.kind !== \"page\" || state.activePageId !== identity.pageId)\n throw new Error(\"Only an active page placement can be pinned\");\n const page = state.pages[identity.pageId]!;\n const key = pageStateKey(page, state.location, resources);\n const current = state.pageStates[key]!;\n const instances = current.resourceInstances[identity.slotId] ?? [];\n if (!instances.some((instance) => instance.instanceKey === identity.instanceKey))\n throw new Error(\"Only an open resource placement can be pinned\");\n return {\n ...state,\n pageStates: {\n ...state.pageStates,\n [key]: {\n ...current,\n resourceInstances: {\n ...current.resourceInstances,\n [identity.slotId]: instances\n .filter(\n (instance) =>\n open !== \"preview\" || instance.open === \"pin\" || instance.instanceKey === identity.instanceKey,\n )\n .map((instance) => (instance.instanceKey === identity.instanceKey ? { ...instance, open } : instance)),\n },\n },\n },\n };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"../placements/placement-instance-key\";\nimport { isPageSlotClosable, PAGE_MAIN_SLOT_ID, pageSlots, type ResolvedPageSlot } from \"./page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPagePlacementInput,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\nimport { pageResourceBindingSlots, staticSlotOpen } from \"./page-slot-lifecycle\";\n\nexport const pagePlacementIdentity = (pageId: string, slotId: string, instanceKey: string): PlacementIdentity => ({\n kind: \"page\",\n pageId,\n slotId,\n instanceKey,\n});\n\nexport const pageFollowerIdentities = (\n page: WorkbenchPageContribution,\n resource: ResourceRef | undefined,\n resourceKey: (resource: ResourceRef) => string,\n) => {\n if (!resource) return [];\n return pageResourceBindingSlots(page, resource)\n .filter((slot) => slot.region !== \"main\")\n .filter((slot, index, slots) => slots.findIndex((candidate) => candidate.region === slot.region) === index)\n .map((slot) =>\n pagePlacementIdentity(\n page.id,\n slot.id,\n slot.item.kind === \"binding\" && slot.item.binding.cardinality === \"one\"\n ? SINGLE_RESOURCE_INSTANCE_KEY\n : resourceKey(resource),\n ),\n );\n};\n\nconst validatePageSlots = (page: WorkbenchPageContribution) => {\n const ids = new Set<string>();\n for (const slot of page.slots) {\n if (slot.id === PAGE_MAIN_SLOT_ID || ids.has(slot.id))\n throw new Error(`Page \"${page.id}\" declares duplicate or reserved slot \"${slot.id}\"`);\n ids.add(slot.id);\n if (slot.item.kind === \"binding\" && slot.item.binding.kinds.length === 0)\n throw new Error(`Page slot \"${slot.id}\" must bind at least one resource kind`);\n if (slot.openOn && slot.item.kind !== \"binding\")\n throw new Error(`Page slot \"${slot.id}\" requires a binding for openOn`);\n }\n};\n\nexport const validateWorkbenchPage = (page: WorkbenchPageContribution) => {\n if (page.ref.kind !== \"page\" || !page.ref.extensionId || !page.ref.id)\n throw new Error(`Page \"${page.id}\" must declare a normalized page ref`);\n if (page.path.startsWith(\"/\") || page.path.endsWith(\"/\"))\n throw new Error(`Page \"${page.id}\" must declare a normalized path`);\n if (!page.main || (page.main.kind !== \"view\" && page.main.kind !== \"panels\"))\n throw new Error(`Page \"${page.id}\" must declare Main content or a panel collection`);\n if (page.document && (!page.resource || !page.document.metadataKey.trim()))\n throw new Error(`Page \"${page.id}\" requires a document metadata key and routed resource`);\n if (page.resource && page.resource.kinds.length === 0)\n throw new Error(`Page \"${page.id}\" must accept at least one resource kind`);\n if (page.main.kind === \"view\" && page.main.cardinality === \"many\" && !page.resource)\n throw new Error(`Page \"${page.id}\" requires a resource for many cardinality`);\n if (page.main.kind === \"view\" && page.resource && !page.parentId)\n throw new Error(`Resource page \"${page.id}\" must declare a parent`);\n validatePageSlots(page);\n};\n\nconst placementFor = <Value>(input: {\n page: WorkbenchPageContribution;\n slot: ResolvedPageSlot;\n instanceKey: string;\n resolvePagePlacement(value: WorkbenchPagePlacementInput): Value;\n resource?: ResourceRef;\n section?: WorkbenchPagePlacementInput[\"section\"];\n open?: WorkbenchPagePlacementInput[\"open\"];\n}) => {\n const item = input.slot.item;\n const view = item.kind === \"view\" ? item.view : item.binding.view;\n const identity = pagePlacementIdentity(input.page.id, input.slot.id, input.instanceKey);\n return {\n identity,\n region: input.slot.region,\n order: input.slot.order ?? 0,\n value: input.resolvePagePlacement({\n identity,\n pageId: input.page.id,\n slotId: input.slot.id,\n role: input.slot.role,\n viewId: contributionRefId(view),\n ...(input.resource ? { resource: input.resource } : {}),\n ...(input.section ? { section: input.section } : {}),\n ...(input.open ? { open: input.open } : {}),\n closable: isPageSlotClosable(input.slot),\n }),\n } satisfies ResolvedOwnedPlacement<Value>;\n};\n\nexport const resolvePagePlacements = <Value>(input: {\n page: WorkbenchPageContribution;\n state: WorkbenchPageRuntimeState;\n resource?: ResourceRef;\n sharedPlacements: readonly ResolvedOwnedPlacement<Value>[];\n resolvePagePlacement(value: WorkbenchPagePlacementInput): Value;\n}) => {\n const placements: ResolvedOwnedPlacement<Value>[] = [];\n for (const slot of pageSlots(input.page)) {\n if (slot.isAvailable && !slot.isAvailable(input.resource)) continue;\n if (staticSlotOpen(slot, input.state)) placements.push(placementFor({ ...input, slot, instanceKey: \"default\" }));\n for (const instance of input.state.resourceInstances[slot.id] ?? []) {\n placements.push(placementFor({ ...input, slot, ...instance }));\n }\n }\n if (\n input.page.main.kind === \"panels\" &&\n ![...placements, ...input.sharedPlacements].some((placement) => placement.region === \"main\")\n ) {\n placements.push(\n placementFor({\n ...input,\n instanceKey: \"default\",\n slot: {\n id: PAGE_MAIN_SLOT_ID,\n role: \"primary\",\n region: \"main\",\n item: { kind: \"view\", view: input.page.main.empty, presence: \"fixed\" },\n },\n }),\n );\n }\n return placements;\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n composeOwnedPlacements,\n type OwnedPlacementReconciliation,\n type ResolvedOwnedPlacement,\n} from \"../layout/placement-reconciliation\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageRuntimeState,\n} from \"./page-registry-types\";\n\nconst emptyReconciliation = <Value>(): OwnedPlacementReconciliation<Value> => ({\n add: [],\n retain: [],\n update: [],\n activate: [],\n remove: [],\n});\n\nexport interface PageRegistryCommitInput<Value> {\n pageStates: Readonly<Record<string, WorkbenchPageRuntimeState>>;\n projectId?: string;\n location?: WorkbenchPageRegistryStoreState<Value>[\"location\"];\n activePageId?: string;\n activeModeId?: string;\n modePlacements?: readonly ResolvedOwnedPlacement<Value>[];\n activate?: readonly PlacementIdentity[];\n action: string;\n}\n\nexport const createPageRegistryStore = <Value>(input: CreateWorkbenchPageRegistryInput<Value>) =>\n createWorkbenchStore<WorkbenchPageRegistryStoreState<Value>>({\n name: \"workbench.pages\",\n initialState: {\n pages: {},\n pageStates: {},\n placements: composeOwnedPlacements({ shell: input.resolveShellPlacements() }).placements,\n reconciliation: emptyReconciliation(),\n },\n });\n\nexport const resolveModePlacementSet = <Value>(input: {\n current: WorkbenchPageRegistryStoreState<Value>;\n modeId: string | undefined;\n desired: readonly ResolvedOwnedPlacement<Value>[] | undefined;\n location?: WorkbenchPageRegistryStoreState<Value>[\"location\"];\n projectId?: string;\n pageId?: string;\n resolveModePlacements: CreateWorkbenchPageRegistryInput<Value>[\"resolveModePlacements\"];\n}) => {\n if (!input.modeId) return undefined;\n if (input.desired) return input.desired;\n return input.resolveModePlacements(input.modeId, input.location, input.projectId, input.pageId);\n};\n\nexport const refreshActiveModePlacements = <Value>(input: {\n state: WorkbenchPageRegistryStoreState<Value>;\n registryInput: CreateWorkbenchPageRegistryInput<Value>;\n commit(next: PageRegistryCommitInput<Value>): void;\n}) => {\n const modeId = input.state.activeModeId;\n if (!modeId) return;\n input.commit({\n pageStates: input.state.pageStates,\n projectId: input.state.projectId,\n location: input.state.location,\n activePageId: input.state.activePageId,\n activeModeId: modeId,\n modePlacements: input.registryInput.resolveModePlacements(modeId),\n action: \"refreshModePlacements\",\n });\n};\n\nexport const refreshShellPlacements = <Value>(input: {\n state: WorkbenchPageRegistryStoreState<Value>;\n commit(next: PageRegistryCommitInput<Value>): void;\n}) => {\n input.commit({\n pageStates: input.state.pageStates,\n projectId: input.state.projectId,\n location: input.state.location,\n activePageId: input.state.activePageId,\n activeModeId: input.state.activeModeId,\n action: \"refreshShellPlacements\",\n });\n};\n","import { resourceKey as resourceIdentity } from \"@pstdio/sdk/extensions\";\nimport {\n composeOwnedPlacements,\n type ResolvedOwnedPlacement,\n reconcileOwnedPlacements,\n} from \"../layout/placement-reconciliation\";\nimport { pageFollowerIdentities, pagePlacementIdentity, resolvePagePlacements } from \"./page-placement-resolver\";\nimport type { WorkbenchPageLocationCommitInput } from \"./page-registry-internals\";\nimport { type PageRegistryCommitInput, resolveModePlacementSet } from \"./page-registry-state\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageSlotOpenInput,\n} from \"./page-registry-types\";\nimport {\n emptyPageState,\n openPageResourceBindings,\n openResourceSlot,\n primarySlot,\n requirePageSlot,\n selectPrimaryTarget,\n setStaticSlotOpen,\n} from \"./page-slot-lifecycle\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport interface PreparedOwnedPlacements<Value> {\n shell: readonly ResolvedOwnedPlacement<Value>[];\n mode: readonly ResolvedOwnedPlacement<Value>[];\n}\nexport const createPagePreparation = <Value>(input: CreateWorkbenchPageRegistryInput<Value>) => {\n const normalizeResource = input.resources.normalize;\n const resourceKey = (resource: Parameters<typeof normalizeResource>[0]) =>\n input.resources.toUri(normalizeResource(resource));\n const requirePage = (current: WorkbenchPageRegistryStoreState<Value>, pageId: string) => {\n const page = current.pages[pageId];\n if (!page) throw new Error(`Unknown page: ${pageId}`);\n return page;\n };\n const compose = (\n current: WorkbenchPageRegistryStoreState<Value>,\n next: PageRegistryCommitInput<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n const page = next.activePageId ? current.pages[next.activePageId] : undefined;\n const pageState = page ? next.pageStates[pageStateKey(page, next.location, input.resources)] : undefined;\n if (next.activeModeId) input.validateMode?.(next.activeModeId);\n const modePlacements =\n owned?.mode ??\n resolveModePlacementSet({\n current,\n modeId: next.activeModeId,\n desired: next.modePlacements,\n location: next.location,\n projectId: next.projectId,\n pageId: next.activePageId,\n resolveModePlacements: input.resolveModePlacements,\n });\n if (\n next.activeModeId &&\n modePlacements?.some(\n (placement) => placement.identity.kind !== \"mode\" || placement.identity.modeId !== next.activeModeId,\n )\n )\n throw new Error(`Mode placement owner does not match active mode: ${next.activeModeId}`);\n const shell =\n owned?.shell ??\n input.resolveShellPlacements(\n next.activeModeId\n ? { modeId: next.activeModeId, pageId: next.activePageId, projectId: next.projectId, location: next.location }\n : undefined,\n );\n const composed = composeOwnedPlacements({\n shell,\n mode: modePlacements,\n ...(page && pageState\n ? {\n page: resolvePagePlacements({\n page,\n state: pageState,\n resource: next.location?.resource,\n sharedPlacements: [...shell, ...(modePlacements ?? [])],\n resolvePagePlacement: input.resolvePagePlacement,\n }),\n }\n : {}),\n });\n const reconciliation = reconcileOwnedPlacements({\n current: current.placements,\n desired: composed.placements,\n activate: next.activate,\n valuesEqual: input.valuesEqual,\n });\n return {\n ...current,\n pageStates: next.pageStates,\n projectId: next.projectId,\n location: next.location,\n activePageId: next.activePageId,\n activeModeId: next.activeModeId,\n placements: composed.placements,\n reconciliation,\n };\n };\n const location = (\n target: WorkbenchPageLocationCommitInput,\n current: WorkbenchPageRegistryStoreState<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n const pageStates = target.pageStates ?? current.pageStates;\n const page = requirePage(current, target.pageId);\n const normalizedTarget = {\n ...target,\n ...(target.resource ? { resource: normalizeResource(target.resource) } : {}),\n };\n const stateKey = pageStateKey(page, target.location, input.resources);\n const currentPageState =\n pageStates[stateKey] ?? input.restorePageState?.(page, target.location, target.projectId) ?? emptyPageState(page);\n const primaryState = selectPrimaryTarget({ page, state: currentPageState, target: normalizedTarget, resourceKey });\n const openFollowers =\n !target.pageStates ||\n current.activePageId !== page.id ||\n resourceIdentity(current.location?.resource) !== resourceIdentity(normalizedTarget.resource) ||\n current.pageStates[stateKey]?.activePrimaryInstanceKey !== primaryState.activePrimaryInstanceKey;\n const pageState = openFollowers\n ? openPageResourceBindings({ page, state: primaryState, target: normalizedTarget, resourceKey })\n : primaryState;\n const primary = primarySlot(page);\n const instanceKey = pageState.activePrimaryInstanceKey;\n const followers = openFollowers ? pageFollowerIdentities(page, normalizedTarget.resource, resourceKey) : [];\n return compose(\n current,\n {\n pageStates: { ...pageStates, [stateKey]: pageState },\n projectId: target.projectId,\n location: target.location,\n activePageId: page.id,\n activeModeId: page.modeId,\n activate: [\n ...(primary && instanceKey ? [pagePlacementIdentity(page.id, primary.id, instanceKey)] : []),\n ...followers,\n ],\n action: target.action,\n },\n owned,\n );\n };\n const slot = (\n target: WorkbenchPageSlotOpenInput,\n current: WorkbenchPageRegistryStoreState<Value>,\n owned?: PreparedOwnedPlacements<Value>,\n ) => {\n if (current.activePageId !== target.pageId) throw new Error(`Page is not active: ${target.pageId}`);\n const page = requirePage(current, target.pageId);\n const slot = requirePageSlot(page, target.slotId);\n if (slot.role !== \"auxiliary\") throw new Error(`Page slot is not an auxiliary panel: ${page.id}.${slot.id}`);\n const stateKey = pageStateKey(page, current.location, input.resources);\n let pageState = current.pageStates[stateKey] ?? emptyPageState(page);\n let instanceKey = \"default\";\n const resource = target.resource ? normalizeResource(target.resource) : undefined;\n if (resource) {\n pageState = openResourceSlot({\n slot,\n state: pageState,\n target: { ...target, resource },\n resourceKey,\n });\n instanceKey = pageState.resourceInstances[slot.id]!.at(-1)!.instanceKey;\n } else {\n if (slot.item.kind === \"binding\") throw new Error(`Page slot \"${slot.id}\" requires a resource`);\n if (target.open) throw new Error(`Page slot \"${slot.id}\" accepts open intent only with a resource`);\n if (slot.item.presence !== \"fixed\") pageState = setStaticSlotOpen(pageState, slot.id, true);\n }\n return compose(\n current,\n {\n ...current,\n pageStates: { ...current.pageStates, [stateKey]: pageState },\n activate: [pagePlacementIdentity(page.id, slot.id, instanceKey)],\n action: \"openPageSlot\",\n },\n owned,\n );\n };\n return { compose, location, slot };\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { InternalWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n composeOwnedPlacements,\n type OwnedPlacementReconciliation,\n reconcileOwnedPlacements,\n} from \"../layout/placement-reconciliation\";\nimport { validateWorkbenchPage } from \"./page-placement-resolver\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageContribution,\n WorkbenchPageRegistryStoreState,\n} from \"./page-registry-types\";\nimport { removePageStates } from \"./page-state-key\";\n\nconst emptyReconciliation = <Value>(): OwnedPlacementReconciliation<Value> => ({\n add: [],\n retain: [],\n update: [],\n activate: [],\n remove: [],\n});\n\nexport const registerWorkbenchPage = <Value>(input: {\n page: WorkbenchPageContribution;\n registryInput: CreateWorkbenchPageRegistryInput<Value>;\n store: InternalWorkbenchStore<WorkbenchPageRegistryStoreState<Value>>;\n publishState(state: WorkbenchPageRegistryStoreState<Value>, action: string): void;\n normalizeResource(resource: ResourceRef): ResourceRef;\n resourceKey(resource: ResourceRef): string;\n}) => {\n const { page, store } = input;\n validateWorkbenchPage(page);\n const current = store.getState();\n if (current.pages[page.id]) throw new Error(`Page already registered: ${page.id}`);\n if (\n Object.values(current.pages).some(\n (candidate) => candidate.ref.extensionId === page.ref.extensionId && candidate.ref.id === page.ref.id,\n )\n ) {\n throw new Error(`Page ref already registered: ${page.ref.extensionId}.${page.ref.id}`);\n }\n if (\n Object.values(current.pages).some(\n (candidate) => candidate.ref.extensionId === page.ref.extensionId && candidate.path === page.path,\n )\n ) {\n throw new Error(`Page route already registered: ${page.ref.extensionId}.${page.path}`);\n }\n const registered = {\n ...page,\n ref: { ...page.ref },\n slots: page.slots.map((slot) => ({ ...slot })),\n };\n const placementRegistration = input.registryInput.registerPagePlacements?.(registered);\n store.setState(\n {\n ...current,\n pages: { ...current.pages, [page.id]: registered },\n reconciliation: emptyReconciliation(),\n },\n false,\n \"registerPage\",\n );\n return createDisposable(() => {\n const snapshot = store.getState();\n if (snapshot.pages[page.id] !== registered) return;\n const { [page.id]: _page, ...pages } = snapshot.pages;\n const pageStates = removePageStates(snapshot.pageStates, page.id);\n if (snapshot.activePageId === page.id) {\n const placements = composeOwnedPlacements({ shell: input.registryInput.resolveShellPlacements() }).placements;\n input.publishState(\n {\n ...snapshot,\n pages,\n pageStates,\n location: undefined,\n activePageId: undefined,\n activeModeId: undefined,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: snapshot.placements,\n desired: placements,\n valuesEqual: input.registryInput.valuesEqual,\n }),\n },\n \"unregisterActivePage\",\n );\n placementRegistration?.dispose();\n return;\n }\n store.setState({ ...snapshot, pages, pageStates, reconciliation: emptyReconciliation() }, false, \"unregisterPage\");\n placementRegistration?.dispose();\n });\n};\n","import { createDisposable } from \"../../shared/disposable\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { composeOwnedPlacements, reconcileOwnedPlacements } from \"../layout/placement-reconciliation\";\nimport { resolvePagePlacementClose } from \"./page-placement-close\";\nimport { pinPagePlacement } from \"./page-placement-pin\";\nimport { createPagePreparation } from \"./page-preparation\";\nimport { registerWorkbenchPage } from \"./page-registration\";\nimport { setWorkbenchPageRegistryInternals, type WorkbenchPageLocationCommitInput } from \"./page-registry-internals\";\nimport {\n createPageRegistryStore,\n type PageRegistryCommitInput,\n refreshActiveModePlacements,\n refreshShellPlacements,\n} from \"./page-registry-state\";\nimport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n} from \"./page-registry-types\";\nimport { pageStateKey } from \"./page-state-key\";\n\nexport type {\n CreateWorkbenchPageRegistryInput,\n WorkbenchPageContribution,\n WorkbenchPageMain,\n WorkbenchPageOpenInput,\n WorkbenchPagePlacementInput,\n WorkbenchPageRegistry,\n WorkbenchPageRegistryStoreState,\n WorkbenchPageResourceCodec,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlot,\n WorkbenchPageSlotInstance,\n WorkbenchPageSlotOpenInput,\n} from \"./page-registry-types\";\n\nexport const createWorkbenchPageRegistry = <Value>(\n input: CreateWorkbenchPageRegistryInput<Value>,\n): WorkbenchPageRegistry<Value> => {\n const normalizeResource = (resource: Parameters<WorkbenchPageResourceCodec[\"normalize\"]>[0]) =>\n input.resources.normalize(resource);\n const resourceKey = (resource: Parameters<WorkbenchPageResourceCodec[\"toUri\"]>[0]) =>\n input.resources.toUri(normalizeResource(resource));\n const store = createPageRegistryStore(input);\n let runtime: ((state: WorkbenchPageRegistryStoreState<Value>) => void) | undefined;\n let publishingState: WorkbenchPageRegistryStoreState<Value> | undefined;\n\n const publishState = (state: WorkbenchPageRegistryStoreState<Value>, action: string) =>\n batchWorkbenchChanges(() => {\n const storeBeforeRuntime = store.getState();\n const previousPublishingState = publishingState;\n publishingState = state;\n try {\n runtime?.(state);\n } finally {\n publishingState = previousPublishingState;\n }\n // A layout listener may synchronously commit a panel opened for the new page.\n // That nested commit already includes this state and must not be overwritten.\n if (store.getState() === storeBeforeRuntime) store.setState(state, false, action);\n });\n\n const requirePage = (pageId: string) => {\n const page = store.getState().pages[pageId];\n if (!page) throw new Error(`Unknown page: ${pageId}`);\n return page;\n };\n\n const prepare = createPagePreparation(input);\n const commit = (next: PageRegistryCommitInput<Value>) =>\n publishState(prepare.compose(publishingState ?? store.getState(), next), next.action);\n const activatePageWithStates = (target: WorkbenchPageLocationCommitInput) =>\n publishState(prepare.location(target, store.getState()), target.action);\n\n const registry: WorkbenchPageRegistry<Value> = {\n store,\n\n registerPage(page) {\n return registerWorkbenchPage({\n page,\n registryInput: input,\n store,\n publishState,\n normalizeResource,\n resourceKey,\n });\n },\n\n getPage(pageId) {\n return store.getState().pages[pageId];\n },\n\n listPages() {\n return Object.values(store.getState().pages).sort((left, right) => left.id.localeCompare(right.id));\n },\n\n pinPlacement(identity, open) {\n commit({ ...pinPagePlacement(store.getState(), identity, input.resources, open), action: \"pinPagePlacement\" });\n },\n\n openSlot(target) {\n publishState(prepare.slot(target, store.getState()), \"openPageSlot\");\n },\n };\n\n setWorkbenchPageRegistryInternals(registry, {\n resources: input.resources,\n prepare,\n publish: publishState,\n onDidCommit: (listener) => createDisposable(store.api.subscribe(listener)),\n getPublishingState: () => publishingState ?? store.getState(),\n connectRuntime(apply) {\n if (runtime) throw new Error(\"Workbench page registry already has a runtime\");\n runtime = apply;\n try {\n apply(store.getState());\n } catch (error) {\n runtime = undefined;\n throw error;\n }\n return createDisposable(() => {\n if (runtime === apply) runtime = undefined;\n });\n },\n refreshModePlacements() {\n refreshActiveModePlacements({ state: publishingState ?? store.getState(), registryInput: input, commit });\n },\n refreshShellPlacements() {\n refreshShellPlacements({ state: publishingState ?? store.getState(), commit });\n },\n activateLocation: activatePageWithStates,\n clearProject(projectId) {\n const current = store.getState();\n const placements = composeOwnedPlacements({ shell: input.resolveShellPlacements() }).placements;\n const pageStates = {};\n publishState(\n {\n ...current,\n pageStates,\n projectId,\n location: undefined,\n activePageId: undefined,\n activeModeId: undefined,\n placements,\n reconciliation: reconcileOwnedPlacements({\n current: current.placements,\n desired: placements,\n valuesEqual: input.valuesEqual,\n }),\n },\n \"clearPageProject\",\n );\n },\n resolveClosePlacement(identity) {\n const current = store.getState();\n if (identity.kind !== \"page\") throw new Error(\"Page registry can close only page-owned placements\");\n return resolvePagePlacementClose({\n identity,\n page: requirePage(identity.pageId),\n state: current,\n stateKey: pageStateKey(requirePage(identity.pageId), current.location, input.resources),\n resourceKey,\n });\n },\n });\n\n return registry;\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { Disposable } from \"../../shared/disposable\";\nimport type { LayoutModel } from \"../layout/layout-model\";\nimport type { WorkbenchRegion, WorkbenchRegionSize } from \"../layout/layout-types\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchPlaceholderContribution {\n id: string;\n viewId: string;\n title?: string;\n region: WorkbenchRegion;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n config?: unknown;\n}\n\nexport interface WorkbenchPlaceholderRegistry {\n registerPlaceholder(placeholder: WorkbenchPlaceholderContribution, metadata?: ContributionMetadata): Disposable;\n}\n\nexport const createWorkbenchPlaceholderRegistry = (input: {\n layout: Pick<LayoutModel, \"registerPlaceholder\">;\n views: WorkbenchViewRegistry;\n}): WorkbenchPlaceholderRegistry => ({\n registerPlaceholder(placeholder, metadata) {\n const view = input.views.getView(placeholder.viewId);\n if (!view) throw new Error(`Workbench placeholder view is not registered: ${placeholder.viewId}`);\n return input.layout.registerPlaceholder(\n {\n ...placeholder,\n title: placeholder.title ?? view.title,\n rendererId: view.id,\n },\n metadata,\n );\n },\n});\n","import type { PageOpenIntent, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { notifyWorkbenchChange } from \"../../shared/store/workbench-batch\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport { createPlacement } from \"../layout/layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchRegion,\n WorkbenchWidgetPlacement,\n WorkbenchWidgetRole,\n} from \"../layout/layout-types\";\nimport type { ResolvedOwnedPlacement } from \"../layout/placement-reconciliation\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../view-menus/view-menu-registry\";\nimport { registerWorkbenchViewPlacement, type WorkbenchPlacementPresentation } from \"../views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\nimport {\n clearOwnedPlacementState,\n closeOwnedPlacementInstance,\n createOwnedPlacementState,\n isStaticPlacementOpen,\n placementItemViewId,\n staticPlacementClosable,\n updateResourcePlacementInstance,\n validateOwnedPlacementItem,\n type WorkbenchOwnedPlacementItem,\n} from \"./owned-placement-lifecycle\";\nimport {\n type OwnedPlacementLocationContext,\n type OwnedPlacementPreparation,\n prepareOwnedPlacement,\n setOwnedPlacementPreparation,\n} from \"./owned-placement-preparation\";\nimport { restoreOwnedPlacementState } from \"./owned-placement-restoration\";\nexport interface WorkbenchShellPlacementContribution extends WorkbenchPlacementPresentation {\n readonly id: string;\n readonly item: WorkbenchOwnedPlacementItem;\n readonly region: WorkbenchRegion;\n readonly order?: number;\n}\nexport interface OpenWorkbenchShellPlacementInput {\n placementId: string;\n resource?: ResourceRef;\n open?: PageOpenIntent;\n title?: string;\n}\nexport interface WorkbenchShellPlacementRegistry {\n registerPlacement(placement: WorkbenchShellPlacementContribution): Disposable;\n getPlacement(placementId: string): WorkbenchShellPlacementContribution | undefined;\n listPlacements(): WorkbenchShellPlacementContribution[];\n openPlacement(input: OpenWorkbenchShellPlacementInput): PlacementIdentity;\n updatePlacement(\n identity: PlacementIdentity,\n input: {\n resource?: ResourceRef;\n title?: string;\n open?: PageOpenIntent;\n },\n ): void;\n closePlacement(identity: PlacementIdentity): void;\n resolvePlacements(\n context?: OwnedPlacementLocationContext,\n ): readonly ResolvedOwnedPlacement<WorkbenchWidgetPlacement>[];\n onDidChange(listener: () => void): Disposable;\n}\nexport const shellPlacementContributionId = (placementId: string) =>\n `workbench.shell-placement.${encodeURIComponent(placementId)}`;\nconst identityFor = (placementId: string, instanceKey: string): PlacementIdentity => ({\n kind: \"shell\",\n placementId,\n instanceKey,\n});\nconst roleForRegion = (region: WorkbenchRegion): WorkbenchWidgetRole => {\n if (region === \"main\") return \"location\";\n if (region === \"secondary\" || region === \"side\") return \"sub-panel\";\n return \"content\";\n};\nconst tabState = (open: PageOpenIntent | undefined) => {\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n if (open === \"preview\") return { pinned: false, tabRetention: \"preview\" as const };\n return {};\n};\nexport const createWorkbenchShellPlacementRegistry = (input: {\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n getPanel(panelId: string): RegisteredWidgetContribution | undefined;\n registerPanel: Parameters<typeof registerWorkbenchViewPlacement>[0];\n activatePanel(instanceId: string): unknown;\n getLayout(): WorkbenchLayout;\n getScope?(): string | undefined;\n resolveScope?(context: OwnedPlacementLocationContext): string | undefined;\n loadLayout?(context: OwnedPlacementLocationContext): WorkbenchLayout | undefined;\n enteredWithPersistedLayout(): boolean;\n onDidChangePersistenceScope(listener: () => void): Disposable;\n}): WorkbenchShellPlacementRegistry => {\n const placements = new Map<string, WorkbenchShellPlacementContribution>();\n let state = createOwnedPlacementState();\n const listeners = new Set<() => void>();\n const label = \"Shell placement\";\n let runtime: (() => void) | undefined;\n const emitChange = () => {\n runtime?.();\n for (const listener of listeners)\n notifyWorkbenchChange(listener, () => runWorkbenchEffect(\"shell placement subscriber\", listener));\n };\n // A restored layout snapshot is the user's saved choice: placements present in\n // it are open, optional placements missing from it are closed. A scope without\n // a snapshot starts from each placement's declared presence.\n const restorePlacement = (placement: WorkbenchShellPlacementContribution) => {\n if (!input.enteredWithPersistedLayout()) {\n clearOwnedPlacementState(state, placement.id);\n return;\n }\n state = restoreOwnedPlacementState({\n state,\n declarations: [placement],\n saved: Object.values(input.getLayout().regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"shell\",\n });\n };\n input.onDidChangePersistenceScope(() => {\n for (const placement of placements.values()) restorePlacement(placement);\n notifyWorkbenchChange(placements, emitChange);\n });\n const resolve = (\n placement: WorkbenchShellPlacementContribution,\n instanceKey: string,\n resource?: ResourceRef,\n open?: PageOpenIntent,\n title?: string,\n ): ResolvedOwnedPlacement<WorkbenchWidgetPlacement> => {\n const panel = input.getPanel(shellPlacementContributionId(placement.id));\n if (!panel) throw new Error(`Workbench shell placement is not registered: ${placement.id}`);\n const identity = identityFor(placement.id, instanceKey);\n return {\n identity,\n region: placement.region,\n order: placement.order ?? 0,\n value: createPlacement(\n `workbench.shell.${encodeURIComponent(placement.id)}.${encodeURIComponent(instanceKey)}`,\n panel,\n {\n viewId: placementItemViewId(placement.item),\n role: roleForRegion(placement.region),\n closable: staticPlacementClosable(placement.item),\n ...(resource ? { resource } : {}),\n ...(title ? { title } : {}),\n ...tabState(open),\n },\n ),\n };\n };\n const preparation: OwnedPlacementPreparation = {\n connectRuntime(listener) {\n runtime = listener;\n return createDisposable(() => {\n if (runtime === listener) runtime = undefined;\n });\n },\n getState: () => state,\n restore(context, current = state, previousContext) {\n if (!input.resolveScope) return current;\n const scope = input.resolveScope(context);\n const previousScope = previousContext ? input.resolveScope(previousContext) : input.getScope?.();\n if (scope === previousScope) return current;\n if (scope === input.getScope?.()) return state;\n const layout = input.loadLayout?.(context);\n if (!layout) return createOwnedPlacementState();\n return restoreOwnedPlacementState({\n state: createOwnedPlacementState(),\n declarations: [...placements.values()],\n saved: Object.values(layout.regions).flatMap((region) => region.widgets),\n owns: (identity) => identity.kind === \"shell\",\n });\n },\n adopt(_modeId, saved, current = state) {\n return restoreOwnedPlacementState({\n state: current,\n declarations: [...placements.values()],\n saved,\n owns: (identity) => identity.kind === \"shell\",\n });\n },\n open(target, current = state) {\n const placement = placements.get(target.placementId);\n if (!placement) throw new Error(`Unknown shell placement: ${target.placementId}`);\n return prepareOwnedPlacement({\n label,\n target,\n item: placement.item,\n current,\n identityFor: (instanceKey) => identityFor(placement.id, instanceKey),\n });\n },\n apply: (next) => {\n state = next;\n },\n publish: emitChange,\n resolve(_modeId, current = state) {\n return [...placements.values()].flatMap((placement) => {\n if (placement.item.kind === \"view\") {\n return isStaticPlacementOpen(placement.item, current, placement.id) ? [resolve(placement, \"default\")] : [];\n }\n return (current.resourceInstances.get(placement.id) ?? []).map((instance) =>\n resolve(placement, instance.instanceKey, instance.resource, instance.open, instance.title),\n );\n });\n },\n };\n const registry: WorkbenchShellPlacementRegistry = {\n registerPlacement(placement) {\n if (placements.has(placement.id)) throw new Error(`Shell placement already registered: ${placement.id}`);\n if (!input.views.getView(placementItemViewId(placement.item))) {\n throw new Error(`Workbench shell placement view is not registered: ${placementItemViewId(placement.item)}`);\n }\n validateOwnedPlacementItem(label, placement.id, placement.item);\n const registered = { ...placement, item: { ...placement.item } };\n const panel = registerWorkbenchViewPlacement(\n input.registerPanel,\n input.views,\n {\n ...registered,\n id: shellPlacementContributionId(registered.id),\n viewId: placementItemViewId(registered.item),\n role: roleForRegion(registered.region),\n singleton: registered.item.kind === \"view\" || registered.item.binding.cardinality === \"one\",\n closable: staticPlacementClosable(registered.item),\n },\n input.viewMenus,\n );\n placements.set(registered.id, registered);\n if (input.enteredWithPersistedLayout()) restorePlacement(registered);\n emitChange();\n return createDisposable(() => {\n if (placements.get(registered.id) !== registered) return;\n placements.delete(registered.id);\n clearOwnedPlacementState(state, registered.id);\n panel.dispose();\n emitChange();\n });\n },\n getPlacement: (placementId) => placements.get(placementId),\n listPlacements: () => [...placements.values()].sort((left, right) => left.id.localeCompare(right.id)),\n openPlacement(target) {\n const prepared = preparation.open(target);\n preparation.apply(prepared.state);\n preparation.publish();\n input.activatePanel(\n `workbench.shell.${encodeURIComponent(target.placementId)}.${encodeURIComponent(prepared.identity.instanceKey)}`,\n );\n return prepared.identity;\n },\n\n closePlacement(identity) {\n if (identity.kind !== \"shell\") throw new Error(\"Shell placement registry closes only shell-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n const changed = closeOwnedPlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n });\n if (changed) emitChange();\n },\n updatePlacement(identity, update) {\n if (identity.kind !== \"shell\") throw new Error(\"Shell placement registry updates only shell-owned placements\");\n const placement = placements.get(identity.placementId);\n if (!placement) return;\n updateResourcePlacementInstance({\n label,\n id: placement.id,\n item: placement.item,\n state,\n instanceKey: identity.instanceKey,\n ...update,\n });\n emitChange();\n },\n resolvePlacements: (context) => preparation.resolve(undefined, context ? preparation.restore!(context) : state),\n onDidChange(listener) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n setOwnedPlacementPreparation(registry, preparation);\n return registry;\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport type PreferenceScope = \"default\" | \"user\" | \"project\" | \"repo\" | \"workspace\" | \"extension\" | \"session\";\nexport type PreferenceValue = boolean | number | string | string[] | number[] | boolean[] | Record<string, unknown>;\n\nexport interface PreferencePropertySchema {\n type: \"boolean\" | \"number\" | \"string\" | \"array\" | \"object\";\n enum?: PreferenceValue[];\n default?: PreferenceValue;\n scope: PreferenceScope;\n description?: string;\n}\n\nexport interface PreferenceSchemaContribution {\n properties: Record<string, PreferencePropertySchema>;\n}\n\nexport interface PreferenceScopeRef {\n scope: PreferenceScope;\n scopeId?: string;\n}\n\nexport interface PreferencePersistenceAdapter {\n getValue(name: string, scope: PreferenceScopeRef): PreferenceValue | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n}\n\nexport interface CreatePreferenceRegistryInput {\n persistence?: PreferencePersistenceAdapter;\n}\n\ntype RegisteredPreferenceSchema = PreferencePropertySchema & { ownerId: string; source: string };\n\nexport interface PreferenceRegistryStoreState {\n schemas: Record<string, RegisteredPreferenceSchema>;\n}\n\nexport interface PreferenceRegistry {\n store: WorkbenchStore<PreferenceRegistryStoreState>;\n registerSchema(schema: PreferenceSchemaContribution, metadata?: ContributionMetadata): Disposable;\n getSchema(name: string): RegisteredPreferenceSchema | undefined;\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef): void;\n getValue(name: string, scope?: PreferenceScopeRef): PreferenceValue | undefined;\n}\n\nconst valueKey = (name: string, scope: PreferenceScopeRef) => `${name}:${scope.scope}:${scope.scopeId ?? \"\"}`;\n\nconst createMemoryPreferencePersistence = () => {\n const values = new Map<string, PreferenceValue>();\n\n return {\n getValue(name: string, scope: PreferenceScopeRef) {\n return values.get(valueKey(name, scope));\n },\n\n setValue(name: string, value: PreferenceValue, scope: PreferenceScopeRef) {\n values.set(valueKey(name, scope), value);\n },\n } satisfies PreferencePersistenceAdapter;\n};\n\nexport const createPreferenceRegistry = (input: CreatePreferenceRegistryInput = {}): PreferenceRegistry => {\n const store = createWorkbenchStore<PreferenceRegistryStoreState>({\n name: \"workbench.preferences\",\n initialState: { schemas: {} },\n });\n const persistence = input.persistence ?? createMemoryPreferencePersistence();\n\n return {\n store,\n\n registerSchema(schema, metadata) {\n const registeredNames = Object.keys(schema.properties);\n const snapshot = store.getState();\n\n for (const name of registeredNames) {\n if (snapshot.schemas[name]) throw new Error(`Preference schema already registered: ${name}`);\n }\n\n const additions: Record<string, RegisteredPreferenceSchema> = {};\n for (const name of registeredNames) {\n const property = schema.properties[name];\n if (property) {\n additions[name] = {\n ...property,\n ownerId: metadata?.ownerId ?? \"workbench.core\",\n source: metadata?.source ?? \"module\",\n };\n }\n }\n\n store.setState({ schemas: { ...snapshot.schemas, ...additions } }, false, \"registerSchema\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = { ...current.schemas };\n for (const name of registeredNames) delete next[name];\n store.setState({ schemas: next }, false, \"unregisterSchema\");\n });\n },\n\n getSchema(name) {\n return store.getState().schemas[name];\n },\n\n setValue(name, value, scope) {\n if (!store.getState().schemas[name]) throw new Error(`Preference schema not registered: ${name}`);\n persistence.setValue(name, value, scope);\n },\n\n getValue(name, scope) {\n if (scope) {\n const scoped = persistence.getValue(name, scope);\n if (scoped !== undefined) return scoped;\n }\n\n const userValue = persistence.getValue(name, { scope: \"user\" });\n if (userValue !== undefined) return userValue;\n\n return store.getState().schemas[name]?.default;\n },\n };\n};\n","import type { ControlsQueryResult, ControlValue, ControlValueMap } from \"@pstdio/sdk/extensions\";\n\nexport type { ControlsQueryResult } from \"@pstdio/sdk/extensions\";\n\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\nexport type ControlsRendererRegion = \"main-right-menu\" | \"secondary\" | \"overlay\";\n\nexport interface ControlsRendererLayout {\n region?: ControlsRendererRegion;\n defaultPx?: number;\n minPx?: number;\n maxPx?: number;\n}\n\nexport interface ControlsUpdateValueInput {\n controlId: string;\n value: ControlValue;\n values: ControlValueMap;\n resource?: ResourceRef;\n}\n\nexport interface ControlsApplyInput {\n values: ControlValueMap;\n resource?: ResourceRef;\n}\n\nexport interface ControlsResetInput {\n controlIds?: string[];\n resource?: ResourceRef;\n}\n\nexport interface ControlsRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n layout?: ControlsRendererLayout;\n defaultValues?: ControlValueMap;\n\n /** Load the control declarations + current values for the active resource. */\n executeQuery(\n resource: ResourceRef | undefined,\n signal: AbortSignal,\n ): Promise<ControlsQueryResult> | ControlsQueryResult;\n /** Live-save a single control edit. Omit for explicit-apply or read-only panels. */\n updateValue?(input: ControlsUpdateValueInput): Promise<void> | void;\n /** Commit the full value map from a sticky footer. */\n apply?(input: ControlsApplyInput): Promise<void> | void;\n /** Reset some or all controls to their defaults. */\n reset?(input: ControlsResetInput): Promise<void> | void;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n}\n\nexport interface RegisteredControlsRendererContribution\n extends ControlsRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface ControlsRendererStoreState {\n renderers: Record<string, RegisteredControlsRendererContribution>;\n}\n\nexport interface ControlsRendererRefreshEvent {\n controlsRendererId: string;\n}\n\nexport type ControlsRendererRefreshListener = (event: ControlsRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a controls widget. Set once on\n// workbench mount via setControlsRendererImplementation so registerControlsRenderer\n// can auto-register a widget renderer with the same id.\nexport type ControlsRendererImplementation = (\n input: WorkbenchPanelRenderInput & { controlsRendererId: string },\n) => unknown;\n\nexport interface CreateControlsRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface ControlsRendererRegistry {\n controlsStore: WorkbenchStore<ControlsRendererStoreState>;\n registerControlsRenderer(contribution: ControlsRendererContribution, metadata?: ContributionMetadata): Disposable;\n setControlsRendererImplementation(impl: ControlsRendererImplementation): void;\n getControlsRenderer(id: string): RegisteredControlsRendererContribution | undefined;\n listControlsRenderers(): RegisteredControlsRendererContribution[];\n refreshControlsRenderer(id: string): void;\n onDidRefreshControlsRenderer(listener: ControlsRendererRefreshListener): Disposable;\n}\n\nexport const createControlsRendererRegistry = (\n input: CreateControlsRendererRegistryInput,\n): ControlsRendererRegistry => {\n const { rendererRegistry } = input;\n\n const controlsStore = createWorkbenchStore<ControlsRendererStoreState>({\n name: \"workbench.controlsRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<ControlsRendererRefreshListener>();\n let implementation: ControlsRendererImplementation = () => null;\n\n const requireControlsRenderer = (id: string) => {\n const renderer = controlsStore.getState().renderers[id];\n if (!renderer) throw new Error(`Controls renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n controlsStore,\n\n setControlsRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerControlsRenderer(contribution, metadata) {\n const snapshot = controlsStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Controls renderer already registered: ${contribution.id}`);\n }\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredControlsRendererContribution;\n\n controlsStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerControlsRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchControlsView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, controlsRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = controlsStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n controlsStore.setState({ renderers: nextRenderers }, false, \"unregisterControlsRenderer\");\n });\n },\n\n getControlsRenderer(id) {\n return controlsStore.getState().renderers[id];\n },\n\n listControlsRenderers() {\n return Object.values(controlsStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshControlsRenderer(id) {\n requireControlsRenderer(id);\n const event = { controlsRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshControlsRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { DataTableRendererSettings, ViewFilterGroup, ViewSort } from \"@pstdio/sdk/extensions\";\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { CollectionSavedView, CollectionViewsProvider } from \"./kanban-renderer-contracts\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\nimport type { ViewToolbarAction } from \"./view-toolbar-action\";\n\nexport interface DataTableRendererThemeColor {\n light: string;\n dark: string;\n foreground?: { light: string; dark: string };\n}\n\nexport type DataTableRendererColumnStat =\n | { type: \"unique\" }\n | { type: \"histogram\"; bins?: number }\n | { type: \"top-values\"; limit?: number };\n\nexport type DataTableRendererBadgePalette =\n | \"gray\"\n | \"red\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"teal\"\n | \"blue\"\n | \"cyan\"\n | \"purple\"\n | \"pink\";\n\nexport type DataTableRendererColumnRenderer =\n | { type: \"json\" }\n | { type: \"color-scale\"; stops: Array<{ value: number; color: DataTableRendererThemeColor }> }\n | {\n type: \"categorical-color\";\n categories: Array<{ value: string | number | boolean | null; color: DataTableRendererThemeColor }>;\n }\n | {\n type: \"badge\";\n categories?: Array<{ value: string | number | boolean | null; palette: DataTableRendererBadgePalette }>;\n }\n | { type: \"diff\" }\n | { type: \"date\" }\n | { type: \"path\" };\n\nexport interface DataTableRendererColumn {\n id: string;\n label?: string;\n /** How filters and sorts compare the column. Without it, the type is inferred from the values. */\n type?: \"string\" | \"number\" | \"boolean\" | \"date\";\n /** Offers the column under Grouping in the table's Display menu. */\n groupable?: boolean;\n /** Whether this column can be filtered. Defaults to true. */\n filterable?: boolean;\n description?: string;\n icon?: unknown;\n hidden?: boolean;\n stat?: DataTableRendererColumnStat;\n renderer?: DataTableRendererColumnRenderer;\n}\n\nexport interface DataTableRendererRow {\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n}\n\nexport interface DataTableRendererQueryResult {\n rows: DataTableRendererRow[];\n columns?: DataTableRendererColumn[];\n}\n\nexport interface DataTableRendererQueryContext {\n resource?: ResourceRef;\n modeId?: string;\n filter: ViewFilterGroup;\n sorts: ViewSort[];\n settings: DataTableRendererSettings;\n}\n\nexport type DataTableRendererSavedView = CollectionSavedView<DataTableRendererSettings>;\n\nexport interface DataTableRendererRowAction {\n id: string;\n commandId?: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(row: DataTableRendererRow): Promise<void> | void;\n}\n\nexport interface DataTableRendererSelectionAction {\n id: string;\n commandId?: string;\n label: string;\n icon?: unknown;\n destructive?: boolean;\n run(rows: DataTableRendererRow[]): Promise<void> | void;\n}\n\nexport interface DataTableRendererContribution {\n id: string;\n title: string;\n toolbarActions?: ViewToolbarAction[];\n resourceKind?: string;\n columns?: DataTableRendererColumn[];\n selectionMode?: \"none\" | \"multiple\";\n selectionActions?: DataTableRendererSelectionAction[];\n rowActions?: DataTableRendererRowAction[];\n initialPageSize?: number;\n pageSizeOptions?: number[];\n /** The view state used before a saved view is active, such as hidden columns or statistics. */\n defaultSettings?: Partial<DataTableRendererSettings>;\n defaultFilter?: ViewFilterGroup;\n defaultSorts?: ViewSort[];\n defaultViews?: DataTableRendererSavedView[];\n defaultActiveViewId?: string;\n /** Shared saved views. Without it the table offers its default views only. */\n viewsProvider?: CollectionViewsProvider<DataTableRendererSettings>;\n emptyTitle?: string;\n emptyDescription?: string;\n /** Context keys that choose which rows the query returns. A change drops the old rows and starts a new read. */\n contextKeys?: string[];\n executeQuery(\n context: DataTableRendererQueryContext,\n signal: AbortSignal,\n ): Promise<DataTableRendererQueryResult> | DataTableRendererQueryResult;\n subscribe?: (listener: () => void) => Disposable | (() => void);\n onRowActivate?: (row: DataTableRendererRow) => Promise<void> | void;\n}\n\nexport interface RegisteredDataTableRendererContribution\n extends DataTableRendererContribution,\n RegisteredContributionMetadata {}\n\nexport interface DataTableRendererStoreState {\n renderers: Record<string, RegisteredDataTableRendererContribution>;\n}\n\nexport interface DataTableRendererRefreshEvent {\n dataTableRendererId: string;\n}\n\nexport type DataTableRendererImplementation = (\n input: WorkbenchPanelRenderInput & { dataTableRendererId: string },\n) => unknown;\n\nexport interface DataTableRendererRegistry {\n dataTableStore: WorkbenchStore<DataTableRendererStoreState>;\n registerDataTableRenderer(contribution: DataTableRendererContribution, metadata?: ContributionMetadata): Disposable;\n setDataTableRendererImplementation(implementation: DataTableRendererImplementation): void;\n getDataTableRenderer(id: string): RegisteredDataTableRendererContribution | undefined;\n listDataTableRenderers(): RegisteredDataTableRendererContribution[];\n refreshDataTableRenderer(id: string): void;\n onDidRefreshDataTableRenderer(listener: (event: DataTableRendererRefreshEvent) => void): Disposable;\n}\n\nexport const createDataTableRendererRegistry = (input: {\n rendererRegistry: WorkbenchRendererRegistry;\n}): DataTableRendererRegistry => {\n const dataTableStore = createWorkbenchStore<DataTableRendererStoreState>({\n name: \"workbench.dataTableRenderers\",\n initialState: { renderers: {} },\n });\n const refreshListeners = new Set<(event: DataTableRendererRefreshEvent) => void>();\n let implementation: DataTableRendererImplementation = () => null;\n\n return {\n dataTableStore,\n setDataTableRendererImplementation(next) {\n implementation = next;\n },\n registerDataTableRenderer(contribution, metadata) {\n const snapshot = dataTableStore.getState();\n if (snapshot.renderers[contribution.id]) {\n throw new Error(`Data table renderer already registered: ${contribution.id}`);\n }\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredDataTableRendererContribution;\n dataTableStore.setState(\n { renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerDataTableRenderer\",\n );\n const rendererDisposable = input.rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, dataTableRendererId: contribution.id }),\n });\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataTableStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...renderers } = current.renderers;\n dataTableStore.setState({ renderers }, false, \"unregisterDataTableRenderer\");\n });\n },\n getDataTableRenderer(id) {\n return dataTableStore.getState().renderers[id];\n },\n listDataTableRenderers() {\n return Object.values(dataTableStore.getState().renderers).sort(byContributionPriority);\n },\n refreshDataTableRenderer(id) {\n if (!dataTableStore.getState().renderers[id]) throw new Error(`Data table renderer not registered: ${id}`);\n const event = { dataTableRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n onDidRefreshDataTableRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => refreshListeners.delete(listener));\n },\n } satisfies DataTableRendererRegistry;\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\n\n// What a file renderer's load resolves to. The React layer dispatches to a\n// markdown editor, a code editor, or an image preview based on `fileName` /\n// `mimeType`; text-ish files carry `content`, images carry `dataUrl`.\nexport interface FileRendererContent {\n fileName?: string;\n /** Workspace-relative path shown above the file preview. */\n filePath?: string;\n mimeType?: string;\n content?: string;\n dataUrl?: string;\n // Shown by the editor when the content is empty (editable text only).\n placeholder?: string;\n /** Override contribution-level save support for one loaded file. */\n editable?: boolean;\n /** Request Monaco for text that automatic dispatch would open as markdown. */\n textRenderer?: \"automatic\" | \"monaco\";\n /** Represent a deliberate no-file selection without an editable blank document. */\n emptyState?: {\n title: string;\n description?: string;\n };\n /** Ordered backing-store revision when one is available. */\n revision?: string;\n}\n\nexport interface FileRendererRefreshOrigin {\n rendererId: string;\n instanceId: string;\n operationId: string;\n}\n\nexport interface FileRendererRefreshEnvelope {\n resourceKey?: string;\n origin?: FileRendererRefreshOrigin;\n revision?: string;\n}\n\nexport interface FileRendererSaveResult {\n revision?: string;\n}\n\nexport interface FileRendererContribution {\n id: string;\n title: string;\n resourceKind?: string;\n\n /** Resolve the file's content (and identity) for the bound resource. */\n load(resource: ResourceRef | undefined, signal: AbortSignal): Promise<FileRendererContent> | FileRendererContent;\n /** Persist edited text. Absent ⇒ read-only. Never called for images. */\n save?(\n resource: ResourceRef | undefined,\n content: string,\n origin?: FileRendererRefreshOrigin,\n // biome-ignore lint/suspicious/noConfusingVoidType: Existing synchronous save callbacks return void.\n ): Promise<FileRendererSaveResult | undefined> | FileRendererSaveResult | void;\n}\n\nexport interface RegisteredFileRendererContribution extends FileRendererContribution, RegisteredContributionMetadata {}\n\nexport interface FileRendererStoreState {\n renderers: Record<string, RegisteredFileRendererContribution>;\n}\n\nexport interface FileRendererRefreshEvent extends FileRendererRefreshEnvelope {\n fileRendererId: string;\n}\n\nexport type FileRendererRefreshListener = (event: FileRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a file-renderer widget. Set once on\n// workbench mount via setFileRendererImplementation so registerFileRenderer can\n// auto-register a widget renderer with the same id.\nexport type FileRendererImplementation = (input: WorkbenchPanelRenderInput & { fileRendererId: string }) => unknown;\n\nexport interface CreateFileRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface FileRendererRegistry {\n fileRendererStore: WorkbenchStore<FileRendererStoreState>;\n registerFileRenderer(contribution: FileRendererContribution, metadata?: ContributionMetadata): Disposable;\n setFileRendererImplementation(impl: FileRendererImplementation): void;\n getFileRenderer(id: string): RegisteredFileRendererContribution | undefined;\n listFileRenderers(): RegisteredFileRendererContribution[];\n refreshFileRenderer(id: string, event?: FileRendererRefreshEnvelope): void;\n onDidRefreshFileRenderer(listener: FileRendererRefreshListener): Disposable;\n}\n\nexport const createFileRendererRegistry = (input: CreateFileRendererRegistryInput): FileRendererRegistry => {\n const { rendererRegistry } = input;\n\n const fileRendererStore = createWorkbenchStore<FileRendererStoreState>({\n name: \"workbench.fileRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<FileRendererRefreshListener>();\n let implementation: FileRendererImplementation = () => null;\n\n const requireFileRenderer = (id: string) => {\n const renderer = fileRendererStore.getState().renderers[id];\n if (!renderer) throw new Error(`File renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n fileRendererStore,\n\n setFileRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerFileRenderer(contribution, metadata) {\n const snapshot = fileRendererStore.getState();\n if (snapshot.renderers[contribution.id]) throw new Error(`File renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredFileRendererContribution;\n\n fileRendererStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerFileRenderer\",\n );\n\n // Auto-register a widget renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchFileRendererView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, fileRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = fileRendererStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n fileRendererStore.setState({ renderers: nextRenderers }, false, \"unregisterFileRenderer\");\n });\n },\n\n getFileRenderer(id) {\n return fileRendererStore.getState().renderers[id];\n },\n\n listFileRenderers(): RegisteredFileRendererContribution[] {\n return Object.values(fileRendererStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshFileRenderer(id, envelope = {}) {\n requireFileRenderer(id);\n const event = { fileRendererId: id, ...envelope };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshFileRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import type { ViewFilterGroup, ViewSort } from \"@pstdio/sdk/extensions\";\nimport type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n AttributeDescriptor,\n AttributesSource,\n BoardColumnConfig,\n KanbanRendererCreateRowConfig,\n KanbanRendererCreateSubmission,\n KanbanRendererRow,\n KanbanRendererSavedView,\n KanbanRendererSettings,\n KanbanRendererViewsProvider,\n ResourceContextAction,\n} from \"./kanban-renderer-contracts\";\nimport type { WorkbenchPanelRenderInput, WorkbenchRendererRegistry } from \"./renderer-registry\";\nimport type { ViewToolbarAction } from \"./view-toolbar-action\";\n\nexport interface KanbanRendererQueryState {\n settings: KanbanRendererSettings;\n filter: ViewFilterGroup;\n sorts: ViewSort[];\n}\n\nexport interface KanbanRendererContribution<\n TRow extends KanbanRendererRow = KanbanRendererRow,\n TNode = unknown,\n TIcon = unknown,\n> {\n id: string;\n title: string;\n toolbarActions?: ViewToolbarAction[];\n /** Authored row actions for discovery without querying rows or evaluating a row menu. */\n listRowActions?: () => Pick<ViewToolbarAction, \"commandId\" | \"label\" | \"args\">[];\n resourceKind?: string;\n /** Host-owned scope for persisted display settings. */\n storageScope?: string;\n\n /**\n * Declarative attribute schema. The renderer dispatches filter / group /\n * sort / display / inline-edit behavior on each descriptor's `type.kind`.\n *\n * Pass an `AttributesSource` ({ subscribe, getSnapshot }) instead of a\n * static array to let the contribution mutate its schema at runtime —\n * `WorkbenchKanbanView` subscribes so additions / removals / kind changes\n * propagate live without re-registering the renderer.\n */\n attributes: AttributeDescriptor<TNode>[] | AttributesSource<TNode>;\n\n /** Per-board-column overrides (color, drag/create rules, custom actions). */\n getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig<TIcon>;\n hideToolbar?: boolean;\n emptyTitle?: string;\n emptyDescription?: string;\n\n /** The view state used before a saved view is active. */\n defaultSettings?: Partial<KanbanRendererSettings>;\n defaultFilter?: ViewFilterGroup;\n defaultSorts?: ViewSort[];\n viewsProvider?: KanbanRendererViewsProvider;\n defaultViews?: KanbanRendererSavedView[];\n defaultActiveViewId?: string;\n\n /**\n * Data source. Receives the current display state so backends can paginate\n * / filter / sort. The renderer re-applies filter / sort / group locally,\n * so this can return unfiltered rows in simple cases.\n */\n executeQuery(state: KanbanRendererQueryState, signal: AbortSignal): Promise<TRow[]> | TRow[];\n subscribe?: (listener: () => void) => Disposable | (() => void);\n\n /** Row activation surfaced by the renderer (mirrored from <KanbanRenderer>). */\n onRowActivate?: (row: TRow) => Promise<void> | void;\n /** Per-row right-click context menu actions (mirrored from <KanbanRenderer>). */\n getRowContextMenuActions?: (row: TRow) => ResourceContextAction<TNode>[];\n /**\n * Fires for inline attribute edits AND for cross-column drag-to-reorder on\n * the board (the renderer passes the grouping attribute id + the target\n * column value).\n */\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n /** Manual within-column reorder. Only fires while the view has no sorts. */\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n createRow?: KanbanRendererCreateRowConfig;\n onCreateRow?: (submission: KanbanRendererCreateSubmission) => Promise<void> | void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n}\n\nexport interface RegisteredKanbanRendererContribution<\n TRow extends KanbanRendererRow = KanbanRendererRow,\n TNode = unknown,\n TIcon = unknown,\n> extends KanbanRendererContribution<TRow, TNode, TIcon>,\n RegisteredContributionMetadata {}\n\nexport interface KanbanRendererStoreState {\n renderers: Record<string, RegisteredKanbanRendererContribution>;\n}\n\nexport interface KanbanRendererRefreshEvent {\n kanbanRendererId: string;\n}\n\nexport type KanbanRendererRefreshListener = (event: KanbanRendererRefreshEvent) => void;\n\n// The React layer supplies the rendering for a kanban-renderer Panel. Set once on\n// workbench mount via setKanbanRendererImplementation so registerKanbanRenderer can\n// auto-register a Panel renderer with the same id.\nexport type KanbanRendererImplementation = (input: WorkbenchPanelRenderInput & { kanbanRendererId: string }) => unknown;\n\nexport interface CreateKanbanRendererRegistryInput {\n rendererRegistry: WorkbenchRendererRegistry;\n}\n\nexport interface KanbanRendererRegistry {\n dataStore: WorkbenchStore<KanbanRendererStoreState>;\n registerKanbanRenderer<TRow extends KanbanRendererRow = KanbanRendererRow>(\n contribution: KanbanRendererContribution<TRow>,\n metadata?: ContributionMetadata,\n ): Disposable;\n setKanbanRendererImplementation(impl: KanbanRendererImplementation): void;\n getKanbanRenderer(id: string): RegisteredKanbanRendererContribution | undefined;\n listKanbanRenderers(): RegisteredKanbanRendererContribution[];\n refreshKanbanRenderer(id: string): void;\n onDidRefreshKanbanRenderer(listener: KanbanRendererRefreshListener): Disposable;\n}\n\nexport const createKanbanRendererRegistry = (input: CreateKanbanRendererRegistryInput): KanbanRendererRegistry => {\n const { rendererRegistry } = input;\n\n const dataStore = createWorkbenchStore<KanbanRendererStoreState>({\n name: \"workbench.kanbanRenderers\",\n initialState: { renderers: {} },\n });\n\n const refreshListeners = new Set<KanbanRendererRefreshListener>();\n let implementation: KanbanRendererImplementation = () => null;\n\n const requireKanbanRenderer = (id: string) => {\n const renderer = dataStore.getState().renderers[id];\n if (!renderer) throw new Error(`Kanban renderer not registered: ${id}`);\n return renderer;\n };\n\n return {\n dataStore,\n\n setKanbanRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerKanbanRenderer(contribution, metadata) {\n const snapshot = dataStore.getState();\n if (snapshot.renderers[contribution.id])\n throw new Error(`Kanban renderer already registered: ${contribution.id}`);\n\n const record = {\n ...normalizeContributionMetadata(metadata),\n ...contribution,\n } as RegisteredKanbanRendererContribution;\n\n dataStore.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [contribution.id]: record } },\n false,\n \"registerKanbanRenderer\",\n );\n\n // Auto-register a Panel renderer with the same id; the React-side\n // implementation looks up the contribution by id and renders the\n // WorkbenchKanbanView component.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: contribution.id,\n render: (rendererInput) => implementation({ ...rendererInput, kanbanRendererId: contribution.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = dataStore.getState();\n if (current.renderers[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...nextRenderers } = current.renderers;\n dataStore.setState({ renderers: nextRenderers }, false, \"unregisterKanbanRenderer\");\n });\n },\n\n getKanbanRenderer(id) {\n return dataStore.getState().renderers[id];\n },\n\n listKanbanRenderers(): RegisteredKanbanRendererContribution[] {\n return Object.values(dataStore.getState().renderers).sort(byContributionPriority);\n },\n\n refreshKanbanRenderer(id) {\n requireKanbanRenderer(id);\n const event = { kanbanRendererId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefreshKanbanRenderer(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type {\n PlaceholderContribution,\n RegisteredPlaceholderContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n} from \"../layout/layout-model\";\n\nexport interface WorkbenchPanelRenderInput {\n workbench: WorkbenchCore;\n panel: WorkbenchPanelContribution | PlaceholderContribution | RegisteredPlaceholderContribution;\n instance: WorkbenchPanelInstance;\n refresh: () => void;\n}\n\nexport interface WorkbenchRendererRegistration {\n id: string;\n render: (input: WorkbenchPanelRenderInput) => unknown;\n}\n\nexport type WorkbenchRendererChangeListener = () => void;\n\nexport interface WorkbenchRendererStoreState {\n renderers: Record<string, WorkbenchRendererRegistration>;\n refreshKeys: Record<string, number>;\n}\n\nexport interface WorkbenchRendererRegistry {\n store: WorkbenchStore<WorkbenchRendererStoreState>;\n registerRenderer(renderer: WorkbenchRendererRegistration): Disposable;\n getRenderer(id: string): WorkbenchRendererRegistration | undefined;\n listRenderers(): WorkbenchRendererRegistration[];\n refreshRenderer(id: string): void;\n onDidChange(listener: WorkbenchRendererChangeListener): Disposable;\n}\n\nexport interface CreateWorkbenchRendererRegistryInput {\n initialRenderers?: WorkbenchRendererRegistration[];\n}\n\nexport const createWorkbenchRendererRegistry = (\n input: CreateWorkbenchRendererRegistryInput = {},\n): WorkbenchRendererRegistry => {\n const store = createWorkbenchStore<WorkbenchRendererStoreState>({\n name: \"workbench.renderers\",\n initialState: { renderers: {}, refreshKeys: {} },\n });\n\n const registry: WorkbenchRendererRegistry = {\n store,\n\n registerRenderer(renderer) {\n const snapshot = store.getState();\n if (snapshot.renderers[renderer.id]) throw new Error(`Renderer already registered: ${renderer.id}`);\n store.setState(\n { ...snapshot, renderers: { ...snapshot.renderers, [renderer.id]: renderer } },\n false,\n \"registerRenderer\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.renderers[renderer.id] !== renderer) return;\n const { [renderer.id]: _removed, ...renderers } = current.renderers;\n const { [renderer.id]: _refreshKey, ...refreshKeys } = current.refreshKeys;\n store.setState({ renderers, refreshKeys }, false, \"unregisterRenderer\");\n });\n },\n\n getRenderer: (id) => store.getState().renderers[id],\n\n listRenderers: () => Object.values(store.getState().renderers),\n\n refreshRenderer(id) {\n const snapshot = store.getState();\n if (!snapshot.renderers[id]) throw new Error(`Renderer is not registered: ${id}`);\n store.setState(\n { ...snapshot, refreshKeys: { ...snapshot.refreshKeys, [id]: (snapshot.refreshKeys[id] ?? 0) + 1 } },\n false,\n \"refreshRenderer\",\n );\n },\n\n onDidChange(listener) {\n return createDisposable(\n store.subscribeSelector(\n (state) => state.renderers,\n () => listener(),\n ),\n );\n },\n };\n\n for (const renderer of input.initialRenderers ?? []) registry.registerRenderer(renderer);\n return registry;\n};\n","import { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type {\n CreateTreeRendererRegistryInput,\n RegisteredTreeRendererContribution,\n TreeRendererContribution,\n TreeRendererImplementation,\n TreeRendererRefreshListener,\n TreeRendererRegistry,\n TreeRendererState,\n TreeRendererStoreState,\n} from \"./tree-renderer-types\";\n\nexport type * from \"./tree-renderer-types\";\n\nconst createDefaultState = (view: TreeRendererContribution): TreeRendererState => ({\n expandedNodeIds: [...(view.defaultExpandedNodeIds ?? [])],\n expandedSectionIds: [...(view.defaultExpandedSectionIds ?? [])],\n});\n\n// Section defaults are re-applied on every registration so a section that\n// should start expanded (e.g. a ticket's workspaces) stays expanded even when\n// an older persisted state predates it. Node expansion stays user-controlled.\nconst mergeDefaultSections = (state: TreeRendererState, view: TreeRendererContribution): TreeRendererState => {\n const missing = (view.defaultExpandedSectionIds ?? []).filter((id) => !state.expandedSectionIds.includes(id));\n if (missing.length === 0) return state;\n return { ...state, expandedSectionIds: [...state.expandedSectionIds, ...missing] };\n};\n\nconst toggleId = (ids: string[], id: string, expanded: boolean) => {\n if (expanded) return ids.includes(id) ? ids : [...ids, id];\n return ids.includes(id) ? ids.filter((value) => value !== id) : ids;\n};\n\nexport const createTreeRendererRegistry = (input: CreateTreeRendererRegistryInput): TreeRendererRegistry => {\n const { rendererRegistry, persistence } = input;\n const persisted = persistence?.getTreeStates();\n\n const treeStore = createWorkbenchStore<TreeRendererStoreState>({\n name: \"workbench.treeRenderers\",\n initialState: {\n trees: {},\n statesByTreeId: persisted?.statesByTreeId ?? {},\n refreshKeysByTreeId: {},\n },\n });\n\n const refreshListeners = new Set<TreeRendererRefreshListener>();\n let implementation: TreeRendererImplementation = () => null;\n\n const requireTree = (id: string) => {\n const tree = treeStore.getState().trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n return tree;\n };\n\n const ensureState = (id: string) => {\n const current = treeStore.getState();\n const existing = current.statesByTreeId[id];\n if (existing) return existing;\n\n const tree = current.trees[id];\n if (!tree) throw new Error(`Tree renderer not registered: ${id}`);\n\n const fresh = createDefaultState(tree);\n treeStore.setState(\n {\n ...current,\n statesByTreeId: { ...current.statesByTreeId, [id]: fresh },\n },\n false,\n \"ensureTreeState\",\n );\n return fresh;\n };\n\n const persistStates = () => {\n if (!persistence) return;\n const statesByTreeId: Record<string, TreeRendererState> = {};\n for (const [id, state] of Object.entries(treeStore.getState().statesByTreeId)) {\n const { loading: _loading, ...persistable } = state;\n statesByTreeId[id] = persistable;\n }\n persistence.setTreeStates({ statesByTreeId });\n };\n\n const updateState = (id: string, update: (state: TreeRendererState) => TreeRendererState, action: string) => {\n const current = ensureState(id);\n const next = update(current);\n if (next === current) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: next },\n },\n false,\n action,\n );\n persistStates();\n };\n\n const registry: TreeRendererRegistry = {\n treeStore,\n\n setTreeRendererImplementation(impl) {\n implementation = impl;\n },\n\n registerTreeRenderer(view, metadata) {\n const snapshot = treeStore.getState();\n if (snapshot.trees[view.id]) throw new Error(`Tree renderer already registered: ${view.id}`);\n\n const record: RegisteredTreeRendererContribution = {\n ...normalizeContributionMetadata(metadata),\n ...view,\n };\n const persistedState = snapshot.statesByTreeId[view.id];\n const nextState = persistedState ? mergeDefaultSections(persistedState, view) : createDefaultState(view);\n\n treeStore.setState(\n {\n ...snapshot,\n trees: { ...snapshot.trees, [view.id]: record },\n statesByTreeId: { ...snapshot.statesByTreeId, [view.id]: nextState },\n },\n false,\n \"registerTreeRenderer\",\n );\n\n // Auto-register a widget renderer with the same id so widgets can place\n // this tree via rendererId: view.id. The render fn calls the React-side\n // implementation supplied through setTreeRendererImplementation.\n const rendererDisposable = rendererRegistry.registerRenderer({\n id: view.id,\n render: (rendererInput) => implementation({ ...rendererInput, treeId: view.id }),\n });\n\n return createDisposable(() => {\n rendererDisposable.dispose();\n const current = treeStore.getState();\n if (current.trees[view.id] !== record) return;\n const { [view.id]: _removed, ...nextTrees } = current.trees;\n const { [view.id]: _removedState, ...nextStates } = current.statesByTreeId;\n const { [view.id]: _removedRefresh, ...nextRefresh } = current.refreshKeysByTreeId;\n treeStore.setState(\n {\n trees: nextTrees,\n statesByTreeId: nextStates,\n refreshKeysByTreeId: nextRefresh,\n },\n false,\n \"unregisterTreeRenderer\",\n );\n persistStates();\n });\n },\n\n getTreeRenderer(id) {\n return treeStore.getState().trees[id];\n },\n\n listTreeRenderers() {\n return Object.values(treeStore.getState().trees).sort(byContributionPriority);\n },\n\n async getBody(id, ctx = {}) {\n return await requireTree(id).getBody({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getHeader(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getHeader) return [];\n return await tree.getHeader({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getFooter(id, ctx = {}) {\n const tree = requireTree(id);\n if (!tree.getFooter) return [];\n return await tree.getFooter({\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n async getChildren(id, node, ctx = {}) {\n return await requireTree(id).getChildren(node, {\n ...ctx,\n state: registry.getTreeState(id),\n refresh: () => registry.refresh(id),\n setSelectedNode: (nodeId) => registry.setSelectedNode(id, nodeId),\n });\n },\n\n getTreeState(id) {\n const state = ensureState(id);\n return {\n expandedNodeIds: [...state.expandedNodeIds],\n expandedSectionIds: [...state.expandedSectionIds],\n selectedNodeId: state.selectedNodeId,\n loading: state.loading,\n };\n },\n\n setNodeExpanded(id, nodeId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedNodeIds, nodeId, expanded);\n if (nextIds === state.expandedNodeIds) return state;\n return { ...state, expandedNodeIds: nextIds };\n },\n \"setNodeExpanded\",\n );\n },\n\n setSectionExpanded(id, sectionId, expanded) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n const nextIds = toggleId(state.expandedSectionIds, sectionId, expanded);\n if (nextIds === state.expandedSectionIds) return state;\n return { ...state, expandedSectionIds: nextIds };\n },\n \"setSectionExpanded\",\n );\n },\n\n setSelectedNode(id, nodeId) {\n requireTree(id);\n updateState(\n id,\n (state) => {\n if (state.selectedNodeId === nodeId) return state;\n return { ...state, selectedNodeId: nodeId };\n },\n \"setSelectedNode\",\n );\n },\n\n setLoading(id, loading) {\n requireTree(id);\n const current = ensureState(id);\n if (current.loading === loading) return;\n\n const snapshot = treeStore.getState();\n treeStore.setState(\n {\n ...snapshot,\n statesByTreeId: { ...snapshot.statesByTreeId, [id]: { ...current, loading } },\n },\n false,\n \"setLoading\",\n );\n },\n\n refresh(id) {\n requireTree(id);\n const snapshot = treeStore.getState();\n const current = snapshot.refreshKeysByTreeId[id] ?? 0;\n treeStore.setState(\n {\n ...snapshot,\n refreshKeysByTreeId: { ...snapshot.refreshKeysByTreeId, [id]: current + 1 },\n },\n false,\n \"refreshTreeRenderer\",\n );\n const event = { treeId: id };\n for (const listener of refreshListeners) listener(event);\n },\n\n onDidRefresh(listener) {\n refreshListeners.add(listener);\n return createDisposable(() => {\n refreshListeners.delete(listener);\n });\n },\n };\n return registry;\n};\n","export interface RendererReadRequest<T> {\n queryKey: string;\n load(signal: AbortSignal, publish: (value: T) => void): Promise<T> | T;\n onProgress?(value: T): void;\n onValue(value: T): void;\n onError(error: unknown): void;\n}\n\ninterface ReadJob {\n token: symbol;\n generation: number;\n queryKey: string;\n run(signal: AbortSignal): Promise<void>;\n onError(error: unknown): void;\n}\n\ninterface ReadOwner {\n binding?: symbol;\n queryKey?: string;\n generation: number;\n pending?: ReadJob;\n active?: { controller: AbortController; settled: Promise<void> };\n queued: boolean;\n waiters: Set<() => void>;\n}\n\nexport interface RendererReadBinding {\n request<T>(request: RendererReadRequest<T>, reason?: \"refresh\" | \"retry\"): Promise<void>;\n dispose(): void;\n}\n\nexport interface RendererReadRegistry {\n bind(key: string): RendererReadBinding;\n dispose(): Promise<void>;\n}\n\nexport const createRendererReadRegistry = (): RendererReadRegistry => {\n const owners = new Map<string, ReadOwner>();\n let disposed = false;\n const release = (key: string, owner: ReadOwner) => {\n if (!owner.active && !owner.pending && !owner.queued) {\n for (const finish of owner.waiters) finish();\n owner.waiters.clear();\n }\n if (!owner.binding && !owner.active && !owner.pending && owners.get(key) === owner) owners.delete(key);\n };\n const isCurrent = (owner: ReadOwner, job: ReadJob) =>\n owner.binding === job.token && owner.generation === job.generation;\n const schedule = (key: string, owner: ReadOwner) => {\n if (owner.queued || owner.active || disposed) return;\n owner.queued = true;\n queueMicrotask(() => {\n owner.queued = false;\n const job = owner.pending;\n if (!job || disposed || owner.active) {\n release(key, owner);\n return;\n }\n owner.pending = undefined;\n if (!isCurrent(owner, job)) {\n release(key, owner);\n return;\n }\n const controller = new AbortController();\n const settled = Promise.resolve()\n .then(() => job.run(controller.signal))\n .catch((error) => {\n if (!controller.signal.aborted && isCurrent(owner, job)) job.onError(error);\n })\n .finally(() => {\n owner.active = undefined;\n if (owner.pending) schedule(key, owner);\n release(key, owner);\n });\n owner.active = { controller, settled };\n });\n };\n\n return {\n bind(key) {\n if (disposed) throw new Error(\"Read registry is disposed\");\n const owner = owners.get(key) ?? { generation: 0, queued: false, waiters: new Set<() => void>() };\n owners.set(key, owner);\n owner.active?.controller.abort();\n owner.pending = undefined;\n const token = Symbol(key);\n owner.binding = token;\n owner.generation++;\n return {\n request<T>(request: RendererReadRequest<T>, reason: \"refresh\" | \"retry\" = \"refresh\") {\n if (owner.binding !== token || disposed) return Promise.resolve();\n if (owner.queryKey !== request.queryKey || reason === \"retry\") {\n owner.generation++;\n owner.active?.controller.abort();\n }\n owner.queryKey = request.queryKey;\n const generation = owner.generation;\n let finish!: () => void;\n const completed = new Promise<void>((resolve) => {\n finish = resolve;\n });\n owner.waiters.add(finish);\n const job: ReadJob = {\n token,\n generation,\n queryKey: request.queryKey,\n onError: request.onError,\n async run(signal) {\n signal.throwIfAborted();\n let reading = true;\n const publish = (value: T) => {\n if (reading && !signal.aborted && isCurrent(owner, job)) request.onProgress?.(value);\n };\n let value: T;\n try {\n value = await request.load(signal, publish);\n } finally {\n reading = false;\n }\n if (!signal.aborted && isCurrent(owner, job)) request.onValue(value);\n },\n };\n owner.pending = job;\n schedule(key, owner);\n return completed;\n },\n dispose() {\n if (owner.binding !== token) return;\n owner.binding = undefined;\n owner.pending = undefined;\n owner.generation++;\n owner.active?.controller.abort();\n release(key, owner);\n },\n };\n },\n async dispose() {\n disposed = true;\n const pending: Promise<void>[] = [];\n for (const [key, owner] of owners) {\n owner.binding = undefined;\n owner.pending = undefined;\n if (owner.active) {\n owner.active.controller.abort();\n pending.push(owner.active.settled);\n }\n release(key, owner);\n }\n await Promise.allSettled(pending);\n },\n };\n};\n","import type { ContributionMetadata, RegisteredContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { byContributionPriority, normalizeContributionMetadata } from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\n/** Settings are stored either per-user (global) or per-project. Projectless surfaces show only global entries. */\nexport type SettingsScope = \"global\" | \"project\";\n\n/** A \"+ create\"-style action surfaced on a section or a collection's parent node. */\nexport interface SettingsAction {\n id: string;\n label: string;\n icon?: string;\n run(): void | Promise<void>;\n}\n\n/** An ordered sidenav container. Headerless when `title` is omitted. */\nexport interface SettingsSectionContribution {\n id: string;\n title?: string;\n order?: number;\n scope?: SettingsScope;\n actions?: SettingsAction[];\n}\nexport type RegisteredSettingsSection = SettingsSectionContribution & RegisteredContributionMetadata;\n\n/** A preference this panel edits; a bare string uses the preference name as its label. */\nexport type SettingsPanelPreference = string | { name: string; label?: string };\n\nexport interface SettingsPanelBase {\n id: string;\n title: string;\n description?: string;\n /** Section id this panel belongs to. */\n section?: string;\n icon?: string;\n /** Lower sorts first; ties fall back to contribution priority then registration order. */\n order?: number;\n scope?: SettingsScope;\n when?: string;\n}\n\n/** Auto-rendered as a param editor from the registered preference schema. */\nexport interface SchemaSettingsPanel extends SettingsPanelBase {\n kind: \"schema\";\n preferences: SettingsPanelPreference[];\n /** \"live\" persists on change (default); \"apply\" stages edits behind Save/Discard. */\n save?: \"live\" | \"apply\";\n}\n\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 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 Object.values(store.getState().panels).sort(byOrderThenPriority);\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 { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\n\nexport type WorkbenchStatusBarSlot = \"leading\" | \"trailing\";\n\nexport interface WorkbenchStatusBarItem {\n id: string;\n viewId: string;\n slot: WorkbenchStatusBarSlot;\n order?: number;\n isVisible?(): boolean;\n}\n\nexport interface WorkbenchStatusBarRegistryState {\n items: Record<string, WorkbenchStatusBarItem>;\n order: string[];\n}\n\nexport interface WorkbenchStatusBarPersistenceAdapter {\n getOrder(): string[] | undefined;\n setOrder(ids: string[]): void;\n}\n\nexport type WorkbenchStatusBarPosition = { beforeItemId: string } | { afterItemId: string };\n\nexport interface WorkbenchStatusBarRegistry {\n store: WorkbenchStore<WorkbenchStatusBarRegistryState>;\n registerItem(item: WorkbenchStatusBarItem): Disposable;\n getItem(id: string): WorkbenchStatusBarItem | undefined;\n listItems(): WorkbenchStatusBarItem[];\n listVisibleItems(slot?: WorkbenchStatusBarSlot): WorkbenchStatusBarItem[];\n reorderItem(id: string, position: WorkbenchStatusBarPosition): void;\n}\n\nexport interface CreateWorkbenchStatusBarRegistryInput {\n hasView(viewId: string): boolean;\n persistence?: WorkbenchStatusBarPersistenceAdapter;\n}\n\nconst bySlotOrderAndId = (left: WorkbenchStatusBarItem, right: WorkbenchStatusBarItem) =>\n left.slot.localeCompare(right.slot) || (left.order ?? 0) - (right.order ?? 0) || left.id.localeCompare(right.id);\n\nexport const createStatusBarRegistry = (input: CreateWorkbenchStatusBarRegistryInput): WorkbenchStatusBarRegistry => {\n const store = createWorkbenchStore<WorkbenchStatusBarRegistryState>({\n name: \"workbench.statusBar\",\n initialState: {\n items: {},\n order: runWorkbenchEffect(\"status bar order read\", () => input.persistence?.getOrder()) ?? [],\n },\n });\n\n const listItems = () => {\n const { items, order } = store.getState();\n const rank = new Map(order.map((id, index) => [id, index]));\n return Object.values(items).sort((left, right) => {\n const leftRank = rank.get(left.id) ?? Infinity;\n const rightRank = rank.get(right.id) ?? Infinity;\n return left.slot.localeCompare(right.slot) || leftRank - rightRank || bySlotOrderAndId(left, right);\n });\n };\n\n return {\n store,\n\n registerItem(item) {\n const current = store.getState();\n if (current.items[item.id]) throw new Error(`Status bar item already registered: ${item.id}`);\n if (!input.hasView(item.viewId)) throw new Error(`Status bar view is not registered: ${item.viewId}`);\n if (item.order !== undefined && !Number.isFinite(item.order)) {\n throw new Error(`Status bar item order must be finite: ${item.id}`);\n }\n\n store.setState({ items: { ...current.items, [item.id]: item } }, false, \"registerItem\");\n return createDisposable(() => {\n const snapshot = store.getState();\n if (snapshot.items[item.id] !== item) return;\n const { [item.id]: _removed, ...items } = snapshot.items;\n store.setState({ items }, false, \"unregisterItem\");\n });\n },\n\n getItem(id) {\n return store.getState().items[id];\n },\n\n listItems,\n\n reorderItem(id, position) {\n const snapshot = store.getState();\n const targetId = \"beforeItemId\" in position ? position.beforeItemId : position.afterItemId;\n const item = snapshot.items[id];\n const target = snapshot.items[targetId];\n if (!item || !target || item.id === target.id || item.slot !== target.slot) return;\n // Keep disabled owners in the preference so re-registering them restores their place.\n const ids = [...new Set([...snapshot.order, ...listItems().map((entry) => entry.id)])].filter(\n (entry) => entry !== id,\n );\n ids.splice(ids.indexOf(targetId) + (\"afterItemId\" in position ? 1 : 0), 0, id);\n store.setState({ order: ids }, false, \"reorderItem\");\n runWorkbenchEffect(\"status bar order write\", () => input.persistence?.setOrder(ids));\n },\n\n listVisibleItems(slot) {\n return listItems().filter((item) => (!slot || item.slot === slot) && (item.isVisible?.() ?? true));\n },\n };\n};\n","import {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\n\nexport interface WorkflowStatus {\n id: string;\n label: string;\n color: string;\n icon?: string | null;\n sortOrder: number;\n isDefault?: boolean;\n actions?: readonly string[];\n}\n\nexport interface WorkflowStatusAction {\n id: string;\n label: string;\n icon?: string;\n}\n\nexport interface WorkbenchStatusSetContribution {\n id: string;\n title: string;\n actions?: readonly WorkflowStatusAction[];\n query(): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];\n save?(statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]> | readonly WorkflowStatus[];\n}\n\nexport type RegisteredWorkbenchStatusSet = WorkbenchStatusSetContribution & RegisteredContributionMetadata;\n\nexport interface WorkbenchStatusRegistryState {\n statusSets: Record<string, RegisteredWorkbenchStatusSet>;\n values: Record<string, readonly WorkflowStatus[]>;\n}\n\nexport interface WorkbenchStatusRegistry {\n store: WorkbenchStore<WorkbenchStatusRegistryState>;\n registerStatusSet(contribution: WorkbenchStatusSetContribution, metadata?: ContributionMetadata): Disposable;\n getStatusSet(id: string): RegisteredWorkbenchStatusSet | undefined;\n listStatusSets(): RegisteredWorkbenchStatusSet[];\n getStatuses(id: string): readonly WorkflowStatus[] | undefined;\n load(id: string): Promise<readonly WorkflowStatus[]>;\n query(id: string): Promise<readonly WorkflowStatus[]>;\n save(id: string, statuses: readonly WorkflowStatus[]): Promise<readonly WorkflowStatus[]>;\n}\n\nconst validateStatusActions = (\n set: WorkbenchStatusSetContribution,\n status: WorkflowStatus,\n actionIds: ReadonlySet<string>,\n) => {\n for (const actionId of status.actions ?? []) {\n if (!actionIds.has(actionId)) {\n throw new Error(`Status \"${set.id}.${status.id}\" references unknown action \"${actionId}\"`);\n }\n }\n};\n\nconst validateStatuses = (set: WorkbenchStatusSetContribution, statuses: readonly WorkflowStatus[]) => {\n const ids = new Set<string>();\n const actionIds = new Set((set.actions ?? []).map((action) => action.id));\n let defaultCount = 0;\n\n for (const status of statuses) {\n if (!status.id.trim()) throw new Error(`Status set \"${set.id}\" contains an empty status id`);\n if (ids.has(status.id)) throw new Error(`Status set \"${set.id}\" contains duplicate id \"${status.id}\"`);\n ids.add(status.id);\n if (!status.label.trim()) throw new Error(`Status \"${set.id}.${status.id}\" must have a label`);\n if (!status.color.trim()) throw new Error(`Status \"${set.id}.${status.id}\" must have a color`);\n if (!Number.isFinite(status.sortOrder)) throw new Error(`Status \"${set.id}.${status.id}\" must have a finite order`);\n validateStatusActions(set, status, actionIds);\n if (status.isDefault) defaultCount += 1;\n }\n\n if (defaultCount > 1) throw new Error(`Status set \"${set.id}\" has more than one default status`);\n return [...statuses].sort((left, right) => left.sortOrder - right.sortOrder || left.id.localeCompare(right.id));\n};\n\nexport const createStatusRegistry = (): WorkbenchStatusRegistry => {\n const store = createWorkbenchStore<WorkbenchStatusRegistryState>({\n name: \"workbench.statuses\",\n initialState: { statusSets: {}, values: {} },\n });\n\n const requireSet = (id: string) => {\n const set = store.getState().statusSets[id];\n if (!set) throw new Error(`Status set is not registered: ${id}`);\n return set;\n };\n\n const loadingById = new Map<string, Promise<readonly WorkflowStatus[]>>();\n\n const query = async (id: string) => {\n const set = requireSet(id);\n const statuses = validateStatuses(set, await set.query());\n const current = store.getState();\n if (current.statusSets[id] === set) {\n store.setState({ ...current, values: { ...current.values, [id]: statuses } }, false, \"queryStatuses\");\n }\n return statuses;\n };\n\n return {\n store,\n\n registerStatusSet(contribution, metadata) {\n const current = store.getState();\n if (current.statusSets[contribution.id]) throw new Error(`Status set already registered: ${contribution.id}`);\n const record = { ...normalizeContributionMetadata(metadata), ...contribution };\n store.setState(\n { ...current, statusSets: { ...current.statusSets, [contribution.id]: record } },\n false,\n \"registerStatusSet\",\n );\n return createDisposable(() => {\n loadingById.delete(contribution.id);\n const snapshot = store.getState();\n if (snapshot.statusSets[contribution.id] !== record) return;\n const { [contribution.id]: _removed, ...statusSets } = snapshot.statusSets;\n const { [contribution.id]: _removedValues, ...values } = snapshot.values;\n store.setState({ statusSets, values }, false, \"unregisterStatusSet\");\n });\n },\n\n getStatusSet(id) {\n return store.getState().statusSets[id];\n },\n\n listStatusSets() {\n return Object.values(store.getState().statusSets).sort(\n (left, right) => byContributionPriority(left, right) || left.id.localeCompare(right.id),\n );\n },\n\n getStatuses(id) {\n return store.getState().values[id];\n },\n\n load(id) {\n const cached = store.getState().values[id];\n if (cached) return Promise.resolve(cached);\n\n const existing = loadingById.get(id);\n if (existing) return existing;\n\n const loading = query(id).finally(() => {\n if (loadingById.get(id) === loading) loadingById.delete(id);\n });\n loadingById.set(id, loading);\n return loading;\n },\n\n query,\n\n async save(id, statuses) {\n const set = requireSet(id);\n if (!set.save) throw new Error(`Status set is read-only: ${id}`);\n const input = validateStatuses(set, statuses);\n const saved = validateStatuses(set, await set.save(input));\n const current = store.getState();\n store.setState({ ...current, values: { ...current.values, [id]: saved } }, false, \"saveStatuses\");\n return saved;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { FileIconThemePreferenceOption } from \"./file-icon-theme-contracts\";\n\nexport interface WorkbenchFileIconThemeStoreState {\n themes: readonly FileIconThemePreferenceOption[];\n}\n\nexport interface FileIconThemeRegistry {\n store: WorkbenchStore<WorkbenchFileIconThemeStoreState>;\n register(themes: readonly FileIconThemePreferenceOption[]): Disposable;\n listThemes(): readonly FileIconThemePreferenceOption[];\n}\n\nexport const createFileIconThemeRegistry = (): FileIconThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchFileIconThemeStoreState>({\n name: \"workbench.fileIconThemes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly FileIconThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncFileIconThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ThemePreferenceOption } from \"./theme-contracts\";\n\nexport interface WorkbenchThemeStoreState {\n themes: readonly ThemePreferenceOption[];\n}\n\nexport interface ThemeRegistry {\n store: WorkbenchStore<WorkbenchThemeStoreState>;\n register(themes: readonly ThemePreferenceOption[]): Disposable;\n listThemes(): readonly ThemePreferenceOption[];\n}\n\nexport const createThemeRegistry = (): ThemeRegistry => {\n const store = createWorkbenchStore<WorkbenchThemeStoreState>({\n name: \"workbench.themes\",\n initialState: { themes: [] },\n });\n\n // Each registration owns its own group; the published list is every group\n // flattened in registration order.\n const groups = new Set<readonly ThemePreferenceOption[]>();\n\n const sync = () => {\n store.setState({ themes: [...groups].flat() }, false, \"syncThemes\");\n };\n\n return {\n store,\n\n register(themes) {\n groups.add(themes);\n sync();\n return createDisposable(() => {\n if (groups.delete(themes)) sync();\n });\n },\n\n listThemes() {\n return store.getState().themes;\n },\n };\n};\n","import { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchPanelMenuDefinition, WorkbenchRegionSize } from \"../layout/layout-types\";\nimport type { WorkbenchViewRegistry } from \"../views/view-registry\";\n\nexport interface WorkbenchViewMenuContribution {\n id: string;\n ownerViewId: string;\n viewId: string;\n side: \"left\" | \"right\";\n priority?: number;\n mountStrategy?: \"active\" | \"keep-mounted\";\n hiddenByDefault?: boolean;\n regionSize?: WorkbenchRegionSize;\n regionCollapsible?: boolean;\n headerBorderBottom?: boolean;\n config?: unknown;\n}\n\nexport interface WorkbenchViewMenuRegistry {\n registerViewMenu(menu: WorkbenchViewMenuContribution): Disposable;\n getViewMenu(id: string): WorkbenchViewMenuContribution | undefined;\n listViewMenus(ownerViewId?: string): WorkbenchViewMenuContribution[];\n definitionsFor(ownerViewId: string, placementId: string): readonly WorkbenchPanelMenuDefinition[];\n}\n\nexport const viewMenuPanelId = (placementId: string, menuId: string) =>\n `workbench.view-menu.${encodeURIComponent(placementId)}.${encodeURIComponent(menuId)}`;\n\nconst viewMenuConfig = (menu: WorkbenchViewMenuContribution) => {\n if (menu.config === undefined) return { viewContextId: menu.id };\n if (!menu.config || typeof menu.config !== \"object\" || Array.isArray(menu.config)) {\n return { viewContextId: menu.id, value: menu.config };\n }\n return { ...menu.config, viewContextId: menu.id };\n};\n\nexport const createWorkbenchViewMenuRegistry = (input: { views: WorkbenchViewRegistry }): WorkbenchViewMenuRegistry => {\n const menus = new Map<string, WorkbenchViewMenuContribution>();\n\n return {\n registerViewMenu(menu) {\n if (menus.has(menu.id)) throw new Error(`View menu already registered: ${menu.id}`);\n if (!input.views.getView(menu.ownerViewId)) {\n throw new Error(`View menu owner is not registered: ${menu.ownerViewId}`);\n }\n if (!input.views.getView(menu.viewId)) throw new Error(`View menu View is not registered: ${menu.viewId}`);\n const record = { ...menu };\n menus.set(record.id, record);\n return createDisposable(() => {\n if (menus.get(record.id) === record) menus.delete(record.id);\n });\n },\n\n getViewMenu: (id) => menus.get(id),\n\n listViewMenus: (ownerViewId) =>\n [...menus.values()].filter((menu) => !ownerViewId || menu.ownerViewId === ownerViewId),\n\n definitionsFor(ownerViewId, placementId) {\n return [...menus.values()]\n .filter((menu) => menu.ownerViewId === ownerViewId)\n .map((menu) => {\n const view = input.views.getView(menu.viewId);\n if (!view) throw new Error(`View menu View is not registered: ${menu.viewId}`);\n return {\n id: viewMenuPanelId(placementId, menu.id),\n title: view.title,\n icon: view.icon,\n side: menu.side,\n rendererId: view.id,\n priority: menu.priority,\n mountStrategy: menu.mountStrategy,\n hiddenByDefault: menu.hiddenByDefault,\n regionSize: menu.regionSize,\n regionCollapsible: menu.regionCollapsible,\n headerBorderBottom: menu.headerBorderBottom,\n config: viewMenuConfig(menu),\n };\n });\n },\n };\n};\n","import {\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { ControlsRendererContribution } from \"../renderers/controls-renderer-registry\";\nimport type { DataTableRendererContribution } from \"../renderers/data-table-renderer-registry\";\nimport type { FileRendererContribution } from \"../renderers/file-renderer-registry\";\nimport type { KanbanRendererContribution } from \"../renderers/kanban-renderer-registry\";\nimport type { WorkbenchRendererRegistration } from \"../renderers/renderer-registry\";\nimport type { TreeRendererContribution } from \"../renderers/tree-renderer-registry\";\nimport { createRendererReadRegistry, type RendererReadRegistry } from \"./renderer-read-registry\";\n\nexport const workbenchViewIdContextKey = \"workbench.view.id\";\n\ntype NativeViewBody<Kind extends string, Contribution> = { kind: Kind } & Omit<Contribution, \"id\" | \"title\" | \"icon\">;\n\nexport interface WorkbenchReactViewBody {\n kind: \"react\";\n render: WorkbenchRendererRegistration[\"render\"];\n}\n\nexport type WorkbenchViewBody =\n | WorkbenchReactViewBody\n | NativeViewBody<\"tree\", TreeRendererContribution>\n | NativeViewBody<\"file\", FileRendererContribution>\n | NativeViewBody<\"controls\", ControlsRendererContribution>\n | NativeViewBody<\"kanban\", KanbanRendererContribution>\n | NativeViewBody<\"dataTable\", DataTableRendererContribution>;\n\nexport interface WorkbenchViewContribution {\n id: string;\n title: string;\n icon?: string;\n body: WorkbenchViewBody;\n}\n\nexport type RegisteredWorkbenchView = WorkbenchViewContribution & RegisteredContributionMetadata;\n\nexport interface WorkbenchViewRegistryStoreState {\n views: Record<string, RegisteredWorkbenchView>;\n}\n\nexport interface WorkbenchViewRegistry {\n reads: RendererReadRegistry;\n store: WorkbenchStore<WorkbenchViewRegistryStoreState>;\n registerView(view: WorkbenchViewContribution, metadata?: ContributionMetadata): Disposable;\n getView(viewId: string): RegisteredWorkbenchView | undefined;\n listViews(): RegisteredWorkbenchView[];\n refreshView(viewId: string, input?: unknown): void;\n}\n\nexport interface CreateWorkbenchViewRegistryInput {\n registerBody(\n view: WorkbenchViewContribution,\n metadata?: ContributionMetadata,\n ): Disposable & { refresh?(input?: unknown): void };\n}\n\nconst byPriorityAndId = (left: RegisteredWorkbenchView, right: RegisteredWorkbenchView) =>\n right.priority - left.priority || left.id.localeCompare(right.id);\n\nexport const createViewRegistry = (input: CreateWorkbenchViewRegistryInput): WorkbenchViewRegistry => {\n const store = createWorkbenchStore<WorkbenchViewRegistryStoreState>({\n name: \"workbench.views\",\n initialState: { views: {} },\n });\n const bodies = new Map<string, Disposable & { refresh?(input?: unknown): void }>();\n\n return {\n reads: createRendererReadRegistry(),\n store,\n\n registerView(view, metadata) {\n const snapshot = store.getState();\n if (snapshot.views[view.id]) throw new Error(`View already registered: ${view.id}`);\n\n const body = input.registerBody(view, metadata);\n bodies.set(view.id, body);\n\n const record: RegisteredWorkbenchView = {\n ...view,\n ...normalizeContributionMetadata(metadata),\n };\n store.setState(\n {\n views: { ...snapshot.views, [view.id]: record },\n },\n false,\n \"registerView\",\n );\n\n return createDisposable(() => {\n const current = store.getState();\n if (current.views[view.id] !== record) return;\n const { [view.id]: _removed, ...views } = current.views;\n store.setState(\n {\n views,\n },\n false,\n \"unregisterView\",\n );\n body.dispose();\n bodies.delete(view.id);\n });\n },\n\n getView(viewId) {\n return store.getState().views[viewId];\n },\n\n listViews() {\n return Object.values(store.getState().views).sort(byPriorityAndId);\n },\n\n refreshView(viewId, refreshInput) {\n if (!store.getState().views[viewId]) throw new Error(`View is not registered: ${viewId}`);\n bodies.get(viewId)?.refresh?.(refreshInput);\n },\n };\n};\n","import type { WorkbenchPanelRegion, WorkbenchTabPosition } from \"../../registries/layout/layout-types\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const registerArrangementCommands = (core: WorkbenchCore) => {\n core.commands.registerCommand(\n {\n id: \"workbench.resetLayout\",\n label: \"Reset workbench layout\",\n category: \"Workbench\",\n icon: \"RotateCcw\",\n },\n { execute: () => core.resetLayout() },\n );\n core.commands.registerCommand<{ instanceId: string; region: WorkbenchPanelRegion; position?: WorkbenchTabPosition }>(\n {\n id: \"workbench.movePanel\",\n label: \"Move workbench tab\",\n category: \"Workbench\",\n icon: \"PanelsTopLeft\",\n params: {\n instanceId: { type: \"string\", label: \"Tab instance\", required: true },\n region: {\n type: \"string\",\n label: \"Destination\",\n required: true,\n options: [\n { label: \"Main\", value: \"main\" },\n { label: \"Side\", value: \"side\" },\n { label: \"Secondary\", value: \"secondary\" },\n ],\n },\n },\n },\n { execute: (args) => core.movePanel(args.instanceId, args.region, args.position) },\n );\n};\n","import type { NavigationTarget, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout, WorkbenchPanelRegion } from \"../../registries/layout/layout-model\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchOwnedPlacementItem } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { shellPlacementContributionId } from \"../../registries/placements/shell-placement-registry\";\nimport type { ResourceRef } from \"../../registries/resources/resource-registry\";\nimport { modePlacementContributionId, pagePlacementContributionId } from \"../../registries/views/view-placement\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport { runUserAction } from \"../../shared/run-user-action\";\nimport type { WorkbenchCore } from \"../../workbench-core\";\nimport type { WorkbenchCompositionAddablePanel } from \"./composition-controller\";\nimport { panelDestinations } from \"./panel-destinations\";\n\nconst ownsPlacement = (\n layout: WorkbenchLayout,\n target: WorkbenchPanelRegion,\n matches: (identity: PlacementIdentity) => boolean,\n) =>\n Object.values(layout.regions)\n .filter((region) => region.id === target)\n .some((region) =>\n region.widgets.some((placement) => placement.placementIdentity && matches(placement.placementIdentity)),\n );\nexport const activateModePlacementInstance = (\n core: WorkbenchCore,\n identity: PlacementIdentity,\n region?: WorkbenchPanelRegion,\n) => {\n const instance = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find(\n (candidate) =>\n candidate.placementIdentity &&\n placementIdentityKey(candidate.placementIdentity) === placementIdentityKey(identity),\n );\n if (instance) {\n if (region) core.movePanel(instance.widgetId, region);\n else core.layout.activatePanel(instance.widgetId);\n }\n};\ninterface AddablePanelInput {\n layout: WorkbenchLayout;\n modeId?: string;\n region: WorkbenchPanelRegion;\n resource?: ResourceRef;\n}\ntype AddPanel = (panelId: string, open: WorkbenchCompositionAddablePanel[\"open\"]) => void;\nconst openPlacementAddTarget = (\n core: WorkbenchCore,\n target: NavigationTarget,\n panelId: string,\n region: WorkbenchPanelRegion,\n) =>\n runUserAction(core, \"Add panel\", async () => {\n if (target.kind === \"command\") {\n await core.commands.executeCommand(contributionRefId(target.target.command), target.target.params, {\n source: \"panel-add\",\n });\n } else {\n await core.navigation.openTarget(target);\n }\n const active = core.layout.getActivePanel();\n if (active?.panelId === panelId) core.movePanel(active.instanceId, region);\n });\nconst canAddItem = (core: WorkbenchCore, item: WorkbenchOwnedPlacementItem, resource: ResourceRef | undefined) => {\n if (item.kind !== \"binding\") return true;\n const target = item.binding.add;\n if (!target) return Boolean(resource && resourceMatchesConstraint(item.binding, resource));\n if (target.kind !== \"command\") return true;\n const id = contributionRefId(target.target.command);\n return Boolean(\n core.commands.getCommand(id) &&\n core.commands.isCommandVisible(id, target.target.params) &&\n core.commands.isCommandEnabled(id, target.target.params),\n );\n};\nconst addShellPanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n for (const placement of core.shellPlacements.listPlacements()) {\n if (!panelDestinations(core, shellPlacementContributionId(placement.id)).includes(input.region)) continue;\n if (placement.item.kind === \"view\" && placement.item.presence === \"fixed\") continue;\n const multiple = placement.item.kind === \"binding\" && placement.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n input.region,\n (identity) => identity.kind === \"shell\" && identity.placementId === placement.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, placement.item, input.resource)) continue;\n add(shellPlacementContributionId(placement.id), (resource) => {\n if (placement.item.kind === \"binding\" && placement.item.binding.add) {\n return openPlacementAddTarget(\n core,\n placement.item.binding.add,\n shellPlacementContributionId(placement.id),\n input.region,\n );\n }\n const identity = core.shellPlacements.openPlacement({\n placementId: placement.id,\n ...(placement.item.kind === \"binding\" && resource ? { resource, open: \"pin\" } : {}),\n });\n activateModePlacementInstance(core, identity, input.region);\n });\n }\n};\nconst addModePanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n for (const placement of core.modePlacements.listPlacements(input.modeId)) {\n if (!panelDestinations(core, modePlacementContributionId(placement.id)).includes(input.region)) continue;\n if (placement.item.kind === \"view\" && placement.item.presence === \"fixed\") continue;\n const multiple = placement.item.kind === \"binding\" && placement.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n input.region,\n (identity) => identity.kind === \"mode\" && identity.placementId === placement.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, placement.item, input.resource)) continue;\n add(modePlacementContributionId(placement.id), (resource) => {\n if (placement.item.kind === \"binding\" && placement.item.binding.add) {\n return openPlacementAddTarget(\n core,\n placement.item.binding.add,\n modePlacementContributionId(placement.id),\n input.region,\n );\n }\n const identity = core.modePlacements.openPlacement({\n panel: placement.ref,\n ...(placement.item.kind === \"binding\" && resource ? { resource, open: \"pin\" } : {}),\n });\n activateModePlacementInstance(core, identity, input.region);\n });\n }\n};\nconst addPagePanels = (core: WorkbenchCore, input: AddablePanelInput, add: AddPanel) => {\n const pageState = core.pages.store.getState();\n const page = pageState.activePageId ? core.pages.getPage(pageState.activePageId) : undefined;\n if (!page) return;\n for (const slot of page.slots) {\n if (slot.isAvailable && !slot.isAvailable(input.resource)) continue;\n if (!panelDestinations(core, pagePlacementContributionId(page.id, slot.id)).includes(input.region)) continue;\n if (slot.item.kind === \"view\" && slot.item.presence === \"fixed\") continue;\n const multiple = slot.item.kind === \"binding\" && slot.item.binding.cardinality === \"many\";\n const isOpen = ownsPlacement(\n input.layout,\n input.region,\n (identity) => identity.kind === \"page\" && identity.pageId === page.id && identity.slotId === slot.id,\n );\n if ((!multiple && isOpen) || !canAddItem(core, slot.item, input.resource)) continue;\n add(pagePlacementContributionId(page.id, slot.id), (resource) => {\n if (slot.item.kind === \"binding\" && slot.item.binding.add) {\n return openPlacementAddTarget(\n core,\n slot.item.binding.add,\n pagePlacementContributionId(page.id, slot.id),\n input.region,\n );\n }\n core.pages.openSlot({\n pageId: page.id,\n slotId: slot.id,\n ...(resource ? { resource: resource } : {}),\n ...(multiple ? { open: \"pin\" } : {}),\n });\n const opened = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find(\n (p) =>\n p.widgetId === core.layout.getLayout().activeWidgetId &&\n p.contributionId === pagePlacementContributionId(page.id, slot.id),\n );\n if (opened) core.movePanel(opened.widgetId, input.region);\n });\n }\n};\nexport const createOwnedAddablePanels = (core: WorkbenchCore, input: AddablePanelInput) => {\n const addable: WorkbenchCompositionAddablePanel[] = [];\n const add = (panelId: string, open: WorkbenchCompositionAddablePanel[\"open\"]) => {\n const contribution = core.layout.getWidget(panelId);\n if (contribution) addable.push({ panelId, region: input.region, contribution, open });\n };\n addShellPanels(core, input, add);\n addModePanels(core, input, add);\n addPagePanels(core, input, add);\n return addable;\n};\n","import type { PageSlotRef, PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchRegion, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { NavigationTargetPage, NavigationTargetPanel } from \"../../registries/navigation/navigation-registry\";\nimport type { WorkbenchPageRegistryStoreState } from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport type { OwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\nimport { getPageLocationPreparation } from \"../page-location/page-location-preparation\";\n\ntype NavigationOperation = NavigationTargetPage | NavigationTargetPanel;\n\nconst placementContext = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) =>\n state.activeModeId\n ? {\n modeId: state.activeModeId,\n pageId: state.activePageId,\n projectId: state.projectId,\n location: state.location,\n }\n : undefined;\nconst requirePanelPage = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>, panel: PageSlotRef) => {\n const page = Object.values(state.pages).find(\n (page) => page.ref.extensionId === panel.page.extensionId && page.ref.id === panel.page.id,\n );\n if (!page || page.id !== state.activePageId)\n throw new Error(`Page panel \"${panel.id}\" is not owned by the proposed page`);\n return page;\n};\nconst prepareSharedPanel = (\n core: WorkbenchCore,\n target: NavigationTargetPanel,\n modeId: string | undefined,\n modeState: OwnedPlacementState,\n shellState: OwnedPlacementState,\n) => {\n const panel = target.panel;\n if (panel.kind === \"placement\") {\n const placement = core.modePlacements.getPlacement(panel);\n if (!placement || placement.modeId !== modeId)\n throw new Error(`Mode panel \"${panel.id}\" is not owned by the proposed mode`);\n const prepared = getOwnedPlacementPreparation(core.modePlacements).open(\n { placementId: placement.id, resource: target.resource, open: target.open },\n modeState,\n );\n return { modeState: prepared.state, shellState, identity: prepared.identity };\n }\n const prepared = getOwnedPlacementPreparation(core.shellPlacements).open(\n {\n placementId: panel.id,\n resource: target.resource,\n open: target.open,\n ...(\"title\" in target ? { title: target.title } : {}),\n },\n shellState,\n );\n return { modeState, shellState: prepared.state, identity: prepared.identity };\n};\n\nexport const prepareWorkbenchNavigation = (core: WorkbenchCore, targets: readonly NavigationOperation[]) => {\n if (!targets.length) throw new Error(\"Compound navigation requires at least one page or panel target\");\n const pages = getWorkbenchPageRegistryInternals(core.pages);\n const locations = getPageLocationPreparation<WorkbenchWidgetPlacement>(core.pageLocations);\n const mode = getOwnedPlacementPreparation(core.modePlacements);\n const shell = getOwnedPlacementPreparation(core.shellPlacements);\n const original = core.pages.store.getState();\n const originalMode = mode.getState();\n const originalShell = shell.getState();\n let modeState = originalMode;\n let shellState = originalShell;\n let proposed = original;\n const activate = new Map<WorkbenchRegion, PlacementIdentity>();\n const owned = (modeId = proposed.activeModeId) => ({\n shell: shell.resolve(undefined, shellState),\n mode: mode.resolve(modeId, modeState),\n });\n\n for (const target of targets) {\n if (target.kind === \"page\") {\n if (!proposed.projectId) throw new Error(\"Cannot navigate before a project is active\");\n const resolved = locations.resolve(target);\n const page = proposed.pages[resolved.pageId]!;\n shellState =\n shell.restore?.(\n { modeId: page.modeId, pageId: page.id, projectId: proposed.projectId, location: resolved.location },\n shellState,\n placementContext(proposed),\n ) ?? shellState;\n modeState =\n mode.restore?.(\n { modeId: page.modeId, pageId: page.id, location: resolved.location, projectId: proposed.projectId },\n modeState,\n ) ?? modeState;\n proposed = pages.prepare.location(\n {\n pageId: page.id,\n projectId: proposed.projectId,\n location: resolved.location,\n resource: resolved.location.resource,\n section: resolved.location.section,\n open: resolved.open,\n action: \"preparePageNavigation\",\n },\n proposed,\n owned(page.modeId),\n );\n } else if (target.kind === \"panel\") {\n const panel = target.panel;\n if (panel.kind === \"page-slot\") {\n const page = requirePanelPage(proposed, panel);\n proposed = pages.prepare.slot(\n { pageId: page.id, slotId: panel.id, resource: target.resource, open: target.open },\n proposed,\n owned(),\n );\n } else {\n const modeId = proposed.activeModeId ?? core.modes.getActiveModeId();\n const prepared = prepareSharedPanel(core, target, modeId, modeState, shellState);\n modeState = prepared.modeState;\n shellState = prepared.shellState;\n const identity = prepared.identity;\n proposed = pages.prepare.compose(\n proposed,\n { ...proposed, activeModeId: modeId, activate: [identity], action: \"preparePanelNavigation\" },\n owned(modeId),\n );\n }\n } else {\n throw new Error(\"Compound navigation accepts only page and panel targets\");\n }\n for (const placement of proposed.reconciliation.activate) activate.set(placement.region, placement.identity);\n }\n const present = new Set(proposed.placements.map((placement) => placementIdentityKey(placement.identity)));\n const final = pages.prepare.compose(\n original,\n {\n ...proposed,\n activate: [...activate.values()].filter((identity) => present.has(placementIdentityKey(identity))),\n action: \"prepareCompoundNavigation\",\n },\n owned(),\n );\n return {\n commit: () =>\n batchWorkbenchChanges(() => {\n const applyOwners = () => {\n mode.apply(modeState);\n shell.apply(shellState);\n };\n const publishWithoutLocation = () => {\n applyOwners();\n return pages.publish(final, \"navigateCompoundTarget\");\n };\n const result = final.location ? locations.commit(final, applyOwners) : publishWithoutLocation();\n if (modeState !== originalMode) mode.publish();\n if (shellState !== originalShell) shell.publish();\n return result;\n }),\n };\n};\n","import { activateModePlacementInstance } from \"./controllers/composition/owned-addable-panels\";\nimport { prepareWorkbenchNavigation } from \"./controllers/navigation/compound-navigation\";\nimport type { WorkbenchRegion } from \"./registries/layout/layout-model\";\nimport {\n createNavigationRegistry,\n type NavigationTargetPanel,\n type NavigationTargetShellPanel,\n} from \"./registries/navigation/navigation-registry\";\nimport type { WorkbenchCore } from \"./workbench-core-types\";\n\ntype PageSlotPanelRef = Extract<NavigationTargetPanel[\"panel\"], { kind: \"page-slot\" }>;\n\nconst findPagePanelOwner = (core: WorkbenchCore, panel: PageSlotPanelRef) =>\n core.pages\n .listPages()\n .find((candidate) => candidate.ref.extensionId === panel.page.extensionId && candidate.ref.id === panel.page.id);\n\nconst canOpenCorePanel = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind === \"shell-placement\") return Boolean(core.shellPlacements.getPlacement(panel.id));\n if (panel.kind !== \"page-slot\") return Boolean(core.modePlacements.getPlacement(panel));\n return Boolean(findPagePanelOwner(core, panel)?.slots.some((slot) => slot.id === panel.id));\n};\n\nexport const revealPanelRegion = (core: WorkbenchCore, region: WorkbenchRegion) => {\n if (region === \"secondary\") {\n core.shell.setRegionOpen(\"secondary\", true);\n }\n if (region === \"side\" && core.sidePanel.getMode() === \"closed\") core.sidePanel.setMode(\"attached\");\n};\n\nconst openPageSlotTarget = (core: WorkbenchCore, target: NavigationTargetPanel, panel: PageSlotPanelRef) => {\n const page = findPagePanelOwner(core, panel);\n if (!page || core.pages.store.getState().activePageId !== page.id) {\n throw new Error(`Page panel \"${panel.id}\" is not owned by the active page`);\n }\n const slot = page.slots.find((candidate) => candidate.id === panel.id);\n if (!slot) throw new Error(`Page panel \"${panel.id}\" is not an auxiliary slot`);\n core.pages.openSlot({\n pageId: page.id,\n slotId: panel.id,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n });\n revealActivePanelRegion(core, slot.region);\n};\n\nconst revealActivePanelRegion = (core: WorkbenchCore, fallback: WorkbenchRegion) => {\n const layout = core.layout.getLayout();\n const actual = Object.values(layout.regions).find((region) =>\n region.widgets.some((widget) => widget.widgetId === layout.activeWidgetId),\n );\n revealPanelRegion(core, actual?.id ?? fallback);\n};\n\nconst openModePlacementTarget = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind !== \"placement\") throw new Error(`Expected a mode placement panel: ${panel.id}`);\n const placement = core.modePlacements.getPlacement(panel);\n if (!placement || placement.modeId !== core.modes.getActiveModeId()) {\n throw new Error(`Mode panel \"${panel.id}\" is not owned by the active mode`);\n }\n const identity = core.modePlacements.openPlacement({\n panel,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n });\n activateModePlacementInstance(core, identity);\n revealActivePanelRegion(core, placement.region);\n};\n\nconst openShellPlacementTarget = (core: WorkbenchCore, target: NavigationTargetShellPanel) => {\n const placement = core.shellPlacements.getPlacement(target.panel.id);\n if (!placement) throw new Error(`Unknown shell placement: ${target.panel.id}`);\n const identity = core.shellPlacements.openPlacement({\n placementId: target.panel.id,\n ...(target.resource ? { resource: target.resource } : {}),\n ...(target.open ? { open: target.open } : {}),\n ...(target.title ? { title: target.title } : {}),\n });\n activateModePlacementInstance(core, identity);\n revealActivePanelRegion(core, placement.region);\n};\n\nconst openCorePanelTarget = (core: WorkbenchCore, target: NavigationTargetPanel) => {\n const panel = target.panel;\n if (panel.kind === \"shell-placement\") {\n openShellPlacementTarget(core, { ...target, panel });\n return;\n }\n if (panel.kind === \"page-slot\") {\n openPageSlotTarget(core, target, panel);\n return;\n }\n openModePlacementTarget(core, target);\n};\n\nexport const createCoreNavigationRegistry = (resolveCore: () => WorkbenchCore) =>\n createNavigationRegistry({\n resolveDispatcher: () => {\n const core = resolveCore();\n return {\n prepareNavigation: (targets) => prepareWorkbenchNavigation(core, targets),\n canOpenPanel: (target) => canOpenCorePanel(core, target),\n canExecuteCommand: (commandId) => Boolean(core.commands.getCommand(commandId)),\n openPanelTarget: (target) => openCorePanelTarget(core, target),\n openPageTarget: (target) => {\n const result = core.pageLocations.navigate(target);\n if (!result.ok) throw new Error(result.diagnostic.message);\n return result;\n },\n executeCommand: (commandId, args) => core.commands.executeCommand(commandId, args),\n openHref: (href) => globalThis.open(href, \"_blank\", \"noopener,noreferrer\"),\n };\n },\n });\n","import {\n activateInLayout,\n findPlacementByWidgetId,\n removeLocationSubPanelSelection,\n selectRegionActiveWidget,\n} from \"../../registries/layout/layout-operations\";\nimport { insertAtPosition } from \"../../registries/layout/layout-tab-lifecycle\";\nimport type { WorkbenchPanelRegion, WorkbenchTabPosition } from \"../../registries/layout/layout-types\";\nimport { workbenchPanelRegions } from \"../../registries/layout/layout-types\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport { revealPanelRegion } from \"../../workbench-core-navigation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\nimport { panelDestinations } from \"./panel-destinations\";\n\nexport const createPanelArrangement = (resolve: () => WorkbenchCore) => ({\n getPanelDestinations(instanceId: string) {\n const core = resolve();\n const found = findPlacementByWidgetId(core.layout.getLayout(), instanceId);\n return found ? panelDestinations(core, found.placement.contributionId) : [];\n },\n movePanel(instanceId: string, destination: WorkbenchPanelRegion, position: WorkbenchTabPosition = \"end\") {\n const core = resolve();\n const layout = core.layout.getLayout();\n const found = findPlacementByWidgetId(layout, instanceId);\n if (!found) throw new Error(`Panel instance not found: ${instanceId}`);\n if (\n !workbenchPanelRegions.some((region) => region === found.regionId) ||\n !panelDestinations(core, found.placement.contributionId).includes(destination)\n )\n throw new Error(`Panel cannot move to ${destination}: ${instanceId}`);\n const source = layout.regions[found.regionId];\n const remaining = source.widgets.filter((t) => t.widgetId !== instanceId);\n const target = layout.regions[destination];\n const next = {\n ...removeLocationSubPanelSelection(layout, instanceId),\n regions: {\n ...layout.regions,\n [found.regionId]: {\n ...source,\n widgets: remaining,\n activeWidgetId:\n source.activeWidgetId === instanceId\n ? (remaining[found.index] ?? remaining[found.index - 1])?.widgetId\n : source.activeWidgetId,\n },\n [destination]: {\n ...target,\n visible: true,\n widgets: insertAtPosition(\n destination === found.regionId ? remaining : target.widgets,\n found.placement,\n position,\n ),\n },\n },\n };\n batchWorkbenchChanges(() => {\n // Moving selects the instance directly; navigation owns auxiliary-selection restoration.\n const selected =\n found.placement.role === \"location\"\n ? (selectRegionActiveWidget(next, destination, instanceId) ?? next)\n : activateInLayout(next, destination, found.placement);\n core.layout.restoreLayout({\n ...selected,\n activeWidgetId: instanceId,\n activeResourceKey: found.placement.resourceKey,\n activeLocationWidgetId: found.placement.role === \"location\" ? instanceId : layout.activeLocationWidgetId,\n });\n core.layout.reconcilePanelMenus();\n revealPanelRegion(core, destination);\n });\n },\n});\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const createPlacementCloseController = (resolveCore: () => WorkbenchCore) => (identity: PlacementIdentity) => {\n const core = resolveCore();\n const key = placementIdentityKey(identity);\n const placement = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find((item) => item.placementIdentity && placementIdentityKey(item.placementIdentity) === key);\n if (!placement) throw new Error(`Placement is not open: ${key}`);\n if (!placement.closable) throw new Error(`Placement is fixed and cannot close: ${key}`);\n if (identity.kind === \"page\") {\n const result = core.pageLocations.closePlacement(identity);\n if (!result.ok) throw new Error(result.diagnostic.message);\n return;\n }\n if (identity.kind === \"mode\") core.modePlacements.closePlacement(identity);\n else core.shellPlacements.closePlacement(identity);\n};\n","import type { PlacementIdentity } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const createPlacementPinController =\n (resolveCore: () => WorkbenchCore) =>\n (identity: PlacementIdentity, pinned = true) => {\n const core = resolveCore();\n const key = placementIdentityKey(identity);\n const placement = Object.values(core.layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .find((item) => item.placementIdentity && placementIdentityKey(item.placementIdentity) === key);\n if (!placement) throw new Error(`Placement is not open: ${key}`);\n const open = pinned ? \"pin\" : \"preview\";\n if (!placement.tabRetention || (placement.tabRetention === \"persistent\") === pinned) return;\n if (identity.kind === \"page\") core.pages.pinPlacement(identity, open);\n else if (identity.kind === \"mode\") core.modePlacements.updatePlacement(identity, { open });\n else core.shellPlacements.updatePlacement(identity, { open });\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 { composeOwnedPlacements, placementIdentityKey, type ResolvedOwnedPlacement } from \"./placement-reconciliation\";\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}\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\" || Boolean(placement.value.resourceKey));\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\nconst 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. Shared mode snapshots own the order\n // of mode tabs occupying those slots, including edits made on another page.\n const modePositions = new Map(saved.map((widget, index) => [widget.widgetId, index]));\n const modes = ordered\n .filter((widget) => widget.placementIdentity?.kind === \"mode\")\n .sort((a, b) => (modePositions.get(a.widgetId) ?? saved.length) - (modePositions.get(b.widgetId) ?? saved.length));\n let modeIndex = 0;\n return ordered.map((widget) => (widget.placementIdentity?.kind === \"mode\" ? modes[modeIndex++]! : widget));\n};\n\nconst 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\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: 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 // Page caches omit mode tabs. Recover their shared selection from the mode's cache.\n const activeWidgetId =\n [region.activeWidgetId, modeLayout?.regions[regionId].activeWidgetId].find((id) =>\n widgets.some((placement) => placement.widgetId === id),\n ) ?? widgets[0]?.widgetId;\n const opensPreviouslyEmptyRegion =\n region.widgets.length === 0 && widgets.some((placement) => !placement.hiddenByDefault);\n regions[regionId] = {\n ...region,\n widgets,\n savedWidgetOrder: undefined,\n activeWidgetId,\n ...(docked.has(regionId) ? { visible: region.visible || opensPreviouslyEmptyRegion } : {}),\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 if (desiredPlacement.identity.kind !== \"page\" && !desiredPlacement.placement.resourceKey) 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 { reconcileOwnedWidgetLayout } from \"../../registries/layout/owned-placement-layout\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { emptyPageState } from \"../../registries/pages/page-slot-lifecycle\";\nimport { pageStateKey } from \"../../registries/pages/page-state-key\";\nimport { clearOwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const resetWorkbenchLayout = (core: WorkbenchCore) => {\n const current = core.pages.store.getState();\n const page = current.activePageId ? current.pages[current.activePageId] : undefined;\n if (!page || !current.projectId || !current.location) return;\n const mode = getOwnedPlacementPreparation(core.modePlacements);\n const shell = getOwnedPlacementPreparation(core.shellPlacements);\n const modeState = {\n staticOverrides: new Map(mode.getState().staticOverrides),\n resourceInstances: new Map(mode.getState().resourceInstances),\n };\n const shellState = {\n staticOverrides: new Map(shell.getState().staticOverrides),\n resourceInstances: new Map(shell.getState().resourceInstances),\n };\n for (const declaration of core.modePlacements.listPlacements(current.activeModeId))\n clearOwnedPlacementState(modeState, declaration.id);\n for (const declaration of core.shellPlacements.listPlacements()) {\n if ([\"main\", \"secondary\", \"side\"].includes(declaration.region))\n clearOwnedPlacementState(shellState, declaration.id);\n }\n const internals = getWorkbenchPageRegistryInternals(core.pages);\n const next = internals.prepare.location(\n {\n pageId: page.id,\n projectId: current.projectId,\n location: current.location,\n resource: current.location.resource,\n action: \"resetWorkbenchLayout\",\n pageStates: {\n ...current.pageStates,\n [pageStateKey(page, current.location, internals.resources)]: emptyPageState(page),\n },\n },\n current,\n { mode: mode.resolve(current.activeModeId, modeState), shell: shell.resolve(undefined, shellState) },\n );\n const layout = core.layout.getLayout();\n const defaults = core.layout.store.getInitialState().layout;\n const cleared = {\n ...layout,\n regions: Object.fromEntries(\n Object.entries(layout.regions).map(([id, region]) => [\n id,\n [\"main\", \"secondary\", \"side\"].includes(id)\n ? { ...defaults.regions[id as keyof typeof defaults.regions], widgets: [], activeWidgetId: undefined }\n : region,\n ]),\n ) as typeof layout.regions,\n locationSubPanelSelections: {},\n activeWidgetId: undefined,\n activeLocationWidgetId: undefined,\n };\n batchWorkbenchChanges(() => {\n mode.apply(modeState);\n shell.apply(shellState);\n core.layout.restoreLayout(\n reconcileOwnedWidgetLayout({\n layout: cleared,\n placements: next.placements,\n activate: next.reconciliation.activate.map((p) => p.identity),\n }),\n );\n internals.publish(next, \"resetWorkbenchLayout\");\n });\n};\n\nexport const createLayoutResetController = (resolve: () => WorkbenchCore) => {\n const listeners = new Set<() => void>();\n return {\n resetLayout() {\n resetWorkbenchLayout(resolve());\n for (const listener of listeners) listener();\n },\n onDidResetLayout(listener: () => void) {\n listeners.add(listener);\n return createDisposable(() => listeners.delete(listener));\n },\n };\n};\n","import type { PlacementIdentity, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport { batchWorkbenchChanges } from \"../../shared/store/workbench-batch\";\nimport type { WorkbenchCore } from \"../../workbench-core-types\";\n\nexport const removeWorkbenchResource = (\n core: WorkbenchCore,\n resource: ResourceRef,\n retained: readonly PlacementIdentity[],\n) => {\n if (resource.projectId !== core.pages.store.getState().projectId) return;\n const retainedKeys = new Set(retained.map(placementIdentityKey));\n batchWorkbenchChanges(() => {\n for (const kind of [\"mode\", \"shell\"] as const) {\n const registry = kind === \"mode\" ? core.modePlacements : core.shellPlacements;\n const preparation = getOwnedPlacementPreparation(registry);\n const state = preparation.getState();\n const resourceInstances = new Map(\n [...state.resourceInstances].map(([placementId, instances]) => [\n placementId,\n instances.filter((instance) => {\n if (resourceKey(instance.resource) !== resourceKey(resource)) return true;\n const identity: PlacementIdentity =\n kind === \"shell\"\n ? { kind, placementId, instanceKey: instance.instanceKey }\n : {\n kind,\n placementId,\n instanceKey: instance.instanceKey,\n modeId: core.modePlacements.listPlacements().find((placement) => placement.id === placementId)!\n .modeId,\n };\n return retainedKeys.has(placementIdentityKey(identity));\n }),\n ]),\n );\n preparation.apply({ ...state, resourceInstances });\n }\n core.pageLocations.removeResource(resource, retained);\n });\n};\n","import { isLocalizedString, type NavigationTargetPage, type PageLocation, type PageRef } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTreeRegistry } from \"../../registries/navigation/navigation-tree-registry\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageRegistry,\n WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createDisposable } from \"../../shared/disposable\";\nimport type { WorkbenchBreadcrumbController, WorkbenchBreadcrumbItem } from \"../breadcrumbs/breadcrumb-registry\";\nimport { leavesProjectNavigation, type NavigationLevelModes } from \"./navigation-level\";\nimport type { WorkbenchPageLocationController } from \"./page-location-controller\";\n\nconst pageRefKey = (ref: PageRef) => `${ref.extensionId ?? \"\"}:${ref.id}`;\nconst locationsFromRoot = (location: PageLocation): PageLocation[] =>\n location.parent ? [...locationsFromRoot(location.parent), location] : [location];\nconst targetFromLocation = (location: PageLocation): NavigationTargetPage => ({\n kind: \"page\",\n page: location.page,\n ...(location.resource ? { resource: location.resource } : {}),\n ...(location.section ? { section: location.section } : {}),\n ...(location.parent ? { parent: targetFromLocation(location.parent) } : {}),\n});\nconst pageTitle = (page: WorkbenchPageContribution) => {\n if (page.title === undefined) return page.ref.id;\n if (!isLocalizedString(page.title)) return page.title;\n return page.title.default ?? page.title.$l10n;\n};\nexport const createWorkbenchPageBreadcrumbItems = (input: {\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n resources: WorkbenchPageResourceCodec;\n navigate(target: NavigationTargetPage): void;\n openPanel?(pageId: string, slotId: string): void;\n}): WorkbenchBreadcrumbItem[] => {\n const pagesByRef = new Map(input.pages.map((page) => [pageRefKey(page.ref), page]));\n const locations = locationsFromRoot(input.location);\n return locations.map((location, index) => {\n const page = pagesByRef.get(pageRefKey(location.page));\n const item: WorkbenchBreadcrumbItem = {\n title: location.resource?.label ?? (page ? pageTitle(page) : location.page.id),\n icon: location.resource?.icon ?? page?.icon,\n ...(leavesProjectNavigation(location, input) ? { startsLevel: true } : {}),\n ...(location.resource ? { resource: input.resources.normalize(location.resource) } : {}),\n };\n // Collection pages return to their landing panel; resource crumbs keep their resource link.\n const landingPanel =\n page?.main.kind === \"panels\" && !location.resource\n ? page.slots.find(\n (slot) => slot.region === \"main\" && slot.item.kind === \"view\" && slot.item.presence === \"fixed\",\n )\n : undefined;\n if (index < locations.length - 1 || (landingPanel && input.openPanel)) {\n item.onClick = () => {\n input.navigate(targetFromLocation(location));\n if (page && landingPanel) input.openPanel?.(page.id, landingPanel.id);\n };\n }\n return item;\n });\n};\nexport const setWorkbenchPageBreadcrumbs = (input: {\n breadcrumbs: WorkbenchBreadcrumbController;\n location: PageLocation;\n pages: readonly WorkbenchPageContribution[];\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n resources: WorkbenchPageResourceCodec;\n navigate(target: NavigationTargetPage): void;\n openPanel?(pageId: string, slotId: string): void;\n}) => input.breadcrumbs.setItems(createWorkbenchPageBreadcrumbItems(input));\nexport const connectWorkbenchPageBreadcrumbs = (input: {\n breadcrumbs: WorkbenchBreadcrumbController;\n locations: WorkbenchPageLocationController;\n pages: WorkbenchPageRegistry<unknown>;\n navigationTrees: NavigationTreeRegistry;\n modes: NavigationLevelModes;\n resources: WorkbenchPageResourceCodec;\n}) => {\n let ownedBreadcrumbs:\n | {\n dispose(): void;\n }\n | undefined;\n const sync = () => {\n const state = input.pages.store.getState();\n if (!state.activePageId || !state.location) {\n ownedBreadcrumbs?.dispose();\n ownedBreadcrumbs = undefined;\n return;\n }\n ownedBreadcrumbs?.dispose();\n ownedBreadcrumbs = setWorkbenchPageBreadcrumbs({\n breadcrumbs: input.breadcrumbs,\n location: state.location,\n pages: Object.values(state.pages),\n navigationTrees: input.navigationTrees,\n modes: input.modes,\n resources: input.resources,\n navigate: (target) => {\n input.locations.navigate(target);\n },\n openPanel: (pageId, slotId) => input.pages.openSlot({ pageId, slotId }),\n });\n };\n const subscription = getWorkbenchPageRegistryInternals(input.pages).onDidCommit(sync);\n sync();\n return createDisposable(() => {\n subscription.dispose();\n ownedBreadcrumbs?.dispose();\n });\n};\n","import type {\n PersistedWorkbenchPageLocation,\n WorkbenchPageBrowserEntry,\n WorkbenchPageLocationBrowser,\n WorkbenchPageLocationPersistence,\n} from \"./page-location-controller\";\n\nexport const createMemoryWorkbenchPageLocationBrowser = (): WorkbenchPageLocationBrowser => {\n const entries: WorkbenchPageBrowserEntry[] = [{ url: \"/\" }];\n let index = 0;\n const listeners = new Set<(entry: WorkbenchPageBrowserEntry) => void>();\n const notify = () => {\n for (const listener of listeners) listener(entries[index]!);\n };\n return {\n current: () => entries[index]!,\n push: (entry) => {\n entries.splice(index + 1);\n entries.push(entry);\n index = entries.length - 1;\n },\n replace: (entry) => {\n entries[index] = entry;\n },\n back: () => {\n if (index === 0) return;\n index -= 1;\n notify();\n },\n forward: () => {\n if (index >= entries.length - 1) return;\n index += 1;\n notify();\n },\n onPopState: (listener) => {\n listeners.add(listener);\n return { dispose: () => listeners.delete(listener) };\n },\n };\n};\n\nexport const createMemoryWorkbenchPageLocationPersistence = (): WorkbenchPageLocationPersistence => {\n const locations = new Map<string, PersistedWorkbenchPageLocation>();\n return {\n load: (projectId) => locations.get(projectId),\n save: (projectId, persisted) => locations.set(projectId, persisted),\n };\n};\n","import { contributionRefId, defaultPageResourceCodec, resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutModel, WorkbenchRegion } from \"../../registries/layout/layout-model\";\nimport { createPlacement } from \"../../registries/layout/layout-operations\";\nimport type { WorkbenchLayout, WorkbenchWidgetPlacement } from \"../../registries/layout/layout-types\";\nimport {\n applyOwnedWidgetLayoutReconciliation,\n reconcileOwnedWidgetLayout,\n} from \"../../registries/layout/owned-placement-layout\";\nimport { placementIdentityKey } from \"../../registries/layout/placement-reconciliation\";\nimport type { WorkbenchModePlacementRegistry } from \"../../registries/modes/mode-placement-registry\";\nimport type { WorkbenchModeRegistry } from \"../../registries/modes/mode-registry\";\nimport { activateWorkbenchPageMode } from \"../../registries/modes/mode-registry-internals\";\nimport { isPageSlotClosable, pagePlacementDeclarations } from \"../../registries/pages/page-main\";\nimport {\n type CreateWorkbenchPageRegistryInput,\n createWorkbenchPageRegistry,\n type WorkbenchPagePlacementInput,\n type WorkbenchPageRegistry,\n type WorkbenchPageRegistryStoreState,\n type WorkbenchPageResourceCodec,\n} from \"../../registries/pages/page-registry\";\nimport { getWorkbenchPageRegistryInternals } from \"../../registries/pages/page-registry-internals\";\nimport { createOwnedPlacementState } from \"../../registries/placements/owned-placement-lifecycle\";\nimport { getOwnedPlacementPreparation } from \"../../registries/placements/owned-placement-preparation\";\nimport type { WorkbenchShellPlacementRegistry } from \"../../registries/placements/shell-placement-registry\";\nimport type { WorkbenchViewMenuRegistry } from \"../../registries/view-menus/view-menu-registry\";\nimport { pagePlacementContributionId, registerWorkbenchViewPlacement } from \"../../registries/views/view-placement\";\nimport type { WorkbenchViewRegistry } from \"../../registries/views/view-registry\";\nimport { createDisposable } from \"../../shared/disposable\";\nexport interface ConnectWorkbenchPageRuntimeInput {\n loadModeLayout?(projectId: string | undefined, modeId: string): WorkbenchLayout | undefined;\n beforeApply?(state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>): void;\n revealRegion?(region: WorkbenchRegion): void;\n layout: LayoutModel;\n modes: WorkbenchModeRegistry;\n registry: WorkbenchPageRegistry<WorkbenchWidgetPlacement>;\n}\nconst syncOwnedPanelMenus = (layout: LayoutModel) => {\n const ownedPlacements = Object.values(layout.getLayout().regions)\n .flatMap((region) => region.widgets)\n .filter((placement) => Boolean(placement.placementIdentity));\n for (const placement of ownedPlacements) {\n const owner = layout.getWidget(placement.contributionId);\n for (const menuId of owner?.ownedPanelMenuIds ?? []) {\n const menu = layout.getWidget(menuId);\n if (!menu) continue;\n layout.openWidget(menuId, {\n pinned: true,\n role: \"panel-menu\",\n viewId: menu.rendererId,\n resource: placement.resource,\n title: menu.region.endsWith(\"-left-menu\") ? placement.resource?.label : menu.title,\n });\n }\n }\n layout.reconcilePanelMenus();\n};\nconst bindPlacementsToActivePageLocation = (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) => {\n const ownerResourceKey = resourceKey(state.location?.resource);\n if (!ownerResourceKey) return state.placements;\n return state.placements.map((placement) =>\n placement.value.role === \"sub-panel\" && (placement.identity.kind === \"page\" || Boolean(placement.value.resourceKey))\n ? { ...placement, value: { ...placement.value, ownerResourceKey } }\n : placement,\n );\n};\nconst applyPageState = (\n input: ConnectWorkbenchPageRuntimeInput,\n state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>,\n source: \"transition\" | \"scope-restore\",\n storeBeforeTransition = input.registry.store.getState(),\n) => {\n const previousScope = input.layout.getPersistenceScope();\n activateWorkbenchPageMode(input.modes, state.activeModeId, () => {\n // Scope listeners must apply the destination mode's panel policy to its saved layout.\n if (source === \"transition\") input.beforeApply?.(state);\n // Mode listeners may open or close mode/shell placements after the mode is\n // published. Reconcile the latest registry state so this transition cannot\n // overwrite those declarative changes with the snapshot that began it.\n const stored = input.registry.store.getState();\n const latest = stored === storeBeforeTransition ? state : stored;\n const activation =\n latest.reconciliation.activate.length > 0 ? latest.reconciliation.activate : state.reconciliation.activate;\n const layoutInput = {\n layout: input.layout.getLayout(),\n modeLayout: latest.activeModeId ? input.loadModeLayout?.(latest.projectId, latest.activeModeId) : undefined,\n placements: bindPlacementsToActivePageLocation(latest),\n activate: activation.map((placement) => placement.identity),\n };\n let layout: ReturnType<typeof reconcileOwnedWidgetLayout>;\n // A restored cache needs the complete owned set; a delta belongs to the previous scope.\n if (source === \"scope-restore\" || input.layout.getPersistenceScope() !== previousScope) {\n layout = reconcileOwnedWidgetLayout(layoutInput);\n } else {\n layout = applyOwnedWidgetLayoutReconciliation({\n ...layoutInput,\n remove: latest.reconciliation.remove.map((placement) => placement.identity),\n });\n }\n input.layout.restoreLayout(layout);\n syncOwnedPanelMenus(input.layout);\n if (source === \"transition\") {\n for (const placement of activation) input.revealRegion?.(placement.region);\n }\n });\n};\nexport const connectWorkbenchPageRuntime = (input: ConnectWorkbenchPageRuntimeInput) => {\n let applyingTransition = false;\n const runtime = getWorkbenchPageRegistryInternals(input.registry).connectRuntime((state) => {\n const storeBeforeTransition = input.registry.store.getState();\n applyingTransition = true;\n try {\n applyPageState(input, state, \"transition\", storeBeforeTransition);\n } finally {\n applyingTransition = false;\n }\n });\n const scope = input.layout.onDidChangePersistenceScope(() => {\n if (!applyingTransition) applyPageState(input, input.registry.store.getState(), \"scope-restore\");\n });\n return createDisposable(() => {\n scope.dispose();\n runtime.dispose();\n });\n};\nconst toTabState = (open: WorkbenchPagePlacementInput[\"open\"]) => {\n if (!open) return {};\n if (open === \"pin\") return { pinned: true, tabRetention: \"persistent\" as const };\n return { pinned: false, tabRetention: \"preview\" as const };\n};\nconst toWidgetPlacement = (\n input: WorkbenchPagePlacementInput,\n layout: LayoutModel,\n views: WorkbenchViewRegistry,\n): WorkbenchWidgetPlacement => {\n const resource = input.resource;\n const view = views.getView(input.viewId);\n if (!view) throw new Error(`Workbench page view is not registered: ${input.viewId}`);\n const panelId = pagePlacementContributionId(input.pageId, input.slotId);\n const panel = layout.getWidget(panelId);\n if (!panel) throw new Error(`Workbench page placement is not registered: ${input.pageId}.${input.slotId}`);\n return {\n ...createPlacement(`workbench.page.${encodeURIComponent(placementIdentityKey(input.identity))}`, panel, {\n viewId: input.viewId,\n title: resource?.label ?? view.title ?? panel.title,\n role: input.role === \"primary\" ? \"location\" : \"sub-panel\",\n closable: input.closable,\n ...(resource ? { resource } : {}),\n ...toTabState(input.open),\n }),\n ...(input.section ? { section: input.section } : {}),\n };\n};\nexport interface CreateLiveWorkbenchPageRegistryInput {\n loadModeLayout?: ConnectWorkbenchPageRuntimeInput[\"loadModeLayout\"];\n restorePageState?: CreateWorkbenchPageRegistryInput<WorkbenchWidgetPlacement>[\"restorePageState\"];\n beforeApply?(state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>): void;\n revealRegion?(region: WorkbenchRegion): void;\n layout: LayoutModel;\n modePlacements: WorkbenchModePlacementRegistry;\n shellPlacements: WorkbenchShellPlacementRegistry;\n modes: WorkbenchModeRegistry;\n resources?: WorkbenchPageResourceCodec;\n views: WorkbenchViewRegistry;\n viewMenus?: WorkbenchViewMenuRegistry;\n}\nexport const createLiveWorkbenchPageRegistry = (input: CreateLiveWorkbenchPageRegistryInput) => {\n const resources = input.resources ?? defaultPageResourceCodec;\n const registry = createWorkbenchPageRegistry<WorkbenchWidgetPlacement>({\n restorePageState: input.restorePageState,\n validateMode: (modeId) => {\n if (!input.modes.getMode(modeId)) throw new Error(`Workbench mode not registered: ${modeId}`);\n },\n resolveShellPlacements: (context) => input.shellPlacements.resolvePlacements(context),\n resolveModePlacements: (modeId, location, projectId, pageId) =>\n input.modePlacements.resolvePlacements(modeId, projectId ? { modeId, location, projectId, pageId } : undefined),\n resolvePagePlacement: (placement) => toWidgetPlacement(placement, input.layout, input.views),\n resources,\n valuesEqual: (left, right) => JSON.stringify(left) === JSON.stringify(right),\n registerPagePlacements: (page) => {\n const registrations = pagePlacementDeclarations(page).map((slot) => {\n const viewId = contributionRefId(slot.item.kind === \"view\" ? slot.item.view : slot.item.binding.view);\n if (!viewId) throw new Error(`Workbench page slot view is not registered: ${page.id}.${slot.id}`);\n const closable = isPageSlotClosable(slot);\n return registerWorkbenchViewPlacement(\n input.layout,\n input.views,\n {\n ...slot,\n id: pagePlacementContributionId(page.id, slot.id),\n viewId,\n role: slot.role === \"primary\" ? \"location\" : \"sub-panel\",\n singleton: slot.item.kind === \"view\" || slot.item.binding.cardinality !== \"many\",\n closable,\n },\n input.viewMenus,\n );\n });\n return createDisposable(() => {\n for (const registration of registrations.reverse()) registration.dispose();\n });\n },\n });\n connectWorkbenchPageRuntime({\n loadModeLayout: input.loadModeLayout,\n beforeApply: (state) => {\n input.beforeApply?.(state);\n const shell = getOwnedPlacementPreparation(input.shellPlacements);\n shell.apply(\n shell.adopt!(\n state.activeModeId ?? \"\",\n state.placements.map((placement) => ({ ...placement.value, placementIdentity: placement.identity })),\n ),\n );\n const mode = getOwnedPlacementPreparation(input.modePlacements);\n if (state.projectId !== registry.store.getState().projectId) mode.apply(createOwnedPlacementState());\n if (state.activeModeId)\n mode.apply(\n mode.adopt!(\n state.activeModeId,\n state.placements.map((placement) => ({ ...placement.value, placementIdentity: placement.identity })),\n ),\n );\n },\n revealRegion: input.revealRegion,\n layout: input.layout,\n modes: input.modes,\n registry,\n });\n getOwnedPlacementPreparation(input.modePlacements).connectRuntime(() =>\n getWorkbenchPageRegistryInternals(registry).refreshModePlacements(),\n );\n getOwnedPlacementPreparation(input.shellPlacements).connectRuntime(() =>\n getWorkbenchPageRegistryInternals(registry).refreshShellPlacements(),\n );\n return registry;\n};\n","import type { PageLocation } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchLayout } from \"../../registries/layout/layout-types\";\nimport { pageSlots } from \"../../registries/pages/page-main\";\nimport type {\n WorkbenchPageContribution,\n WorkbenchPageRuntimeState,\n WorkbenchPageSlotInstance,\n} from \"../../registries/pages/page-registry-types\";\nimport { SINGLE_RESOURCE_INSTANCE_KEY } from \"../../registries/placements/placement-instance-key\";\nimport { resourceMatchesConstraint } from \"../../shared/contributions/reference-id\";\nimport type { createWorkbenchInput, WorkbenchPagePersistenceScopeInput } from \"../../workbench-core-types\";\n\n// The layout already persists instance resources, retention, and selection. Rebuild\n// the page owner's state from that cache instead of storing a second copy.\nexport const pageStateFromLayout = (\n page: WorkbenchPageContribution,\n layout: WorkbenchLayout,\n): WorkbenchPageRuntimeState => {\n const placements = Object.values(layout.regions).flatMap((region) => region.widgets);\n const openStaticSlotIds: string[] = [];\n const resourceInstances: Record<string, WorkbenchPageSlotInstance[]> = {};\n let activePrimaryInstanceKey: string | undefined;\n for (const slot of pageSlots(page)) {\n const matching = placements.filter(\n (placement) =>\n placement.placementIdentity?.kind === \"page\" &&\n placement.placementIdentity.pageId === page.id &&\n placement.placementIdentity.slotId === slot.id,\n );\n if (slot.item.kind === \"view\") {\n if (matching.length) openStaticSlotIds.push(slot.id);\n continue;\n }\n const binding = slot.item.binding;\n const instances = matching.flatMap((placement) => {\n const identity = placement.placementIdentity;\n if (!identity || !placement.resource || !resourceMatchesConstraint(binding, placement.resource)) return [];\n return [\n {\n instanceKey: binding.cardinality === \"one\" ? SINGLE_RESOURCE_INSTANCE_KEY : identity.instanceKey,\n resource: placement.resource,\n ...(placement.section ? { section: placement.section } : {}),\n ...(binding.cardinality === \"many\"\n ? { open: placement.tabRetention === \"preview\" ? (\"preview\" as const) : (\"pin\" as const) }\n : {}),\n },\n ];\n });\n resourceInstances[slot.id] = binding.cardinality === \"one\" ? instances.slice(-1) : instances;\n if (slot.role === \"primary\") {\n const active = matching.find((placement) => layout.activeLocationWidgetId === placement.widgetId);\n activePrimaryInstanceKey = active\n ? instances.find((instance) => instance.resource === active.resource)?.instanceKey\n : undefined;\n }\n }\n return { openStaticSlotIds, resourceInstances, activePrimaryInstanceKey };\n};\n\nexport const loadWorkbenchLocationLayout = (\n input: createWorkbenchInput,\n context: WorkbenchPagePersistenceScopeInput,\n) => {\n const scope = input.resolvePagePersistenceScope?.(context).scope;\n return input.persistence?.getSnapshot(scope)?.layout ?? input.layoutPersistence?.getLayout(scope);\n};\n\nexport const createPageStateRestorer =\n (input: createWorkbenchInput) => (page: WorkbenchPageContribution, location: PageLocation, projectId: string) => {\n const layout = loadWorkbenchLocationLayout(input, {\n modeId: page.modeId,\n pageId: page.id,\n projectId,\n resource: location.resource,\n });\n if (\n !layout ||\n !Object.values(layout.regions).some((region) =>\n region.widgets.some(\n (placement) => placement.placementIdentity?.kind === \"page\" && placement.placementIdentity.pageId === page.id,\n ),\n )\n )\n return undefined;\n return pageStateFromLayout(page, layout);\n };\n","import { type ResourceRef, resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutPersistenceAdapter } from \"../../registries/layout/layout-model-types\";\nimport {\n type WorkbenchLayout,\n type WorkbenchWidgetPlacement,\n workbenchRegions,\n} from \"../../registries/layout/layout-types\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport type { createWorkbenchInput } from \"../../workbench-core-types\";\n\nconst selectPlacements = (layout: WorkbenchLayout, include: (placement: WorkbenchWidgetPlacement) => boolean) => {\n const regions = { ...layout.regions };\n for (const id of workbenchRegions) {\n const region = layout.regions[id];\n const widgets = region.widgets.filter(include);\n regions[id] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((widget) => widget.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n return { ...layout, regions };\n};\nconst modeScope = (projectId: string | undefined, modeId: string) =>\n `workbench-mode:${JSON.stringify([projectId ?? null, modeId])}`;\n\n/** Page caches hold page and shell placements. Shared mode choices have one project/mode owner. */\nexport const createWorkbenchLayoutCache = (input: createWorkbenchInput) => {\n // The persistence adapter does not enumerate keys. Track only scopes visited\n // by this workbench so live removal can edit their existing cached layouts.\n const scopes = new Set<string | undefined>();\n const adapter: LayoutPersistenceAdapter | undefined = input.persistence\n ? {\n getLayout: (scope) => input.persistence?.getSnapshot(scope)?.layout,\n setLayout: (layout, scope) => input.persistence?.setSnapshot({ layout }, scope),\n flush: input.persistence.flush,\n dispose: input.persistence.dispose,\n }\n : input.layoutPersistence;\n const read = (scope?: string) => {\n scopes.add(scope);\n return runWorkbenchEffect(`layout cache read for ${scope ?? \"unscoped\"}`, () => adapter?.getLayout(scope));\n };\n const write = (layout: WorkbenchLayout, scope?: string) => {\n scopes.add(scope);\n return runWorkbenchEffect(`layout cache write for ${scope ?? \"unscoped\"}`, () => adapter?.setLayout(layout, scope));\n };\n return {\n removeResource(resource: ResourceRef) {\n for (const scope of scopes) {\n const layout = read(scope);\n if (layout)\n write(\n selectPlacements(layout, (placement) => resourceKey(placement.resource) !== resourceKey(resource)),\n scope,\n );\n }\n },\n layout: adapter\n ? {\n ...adapter,\n getLayout: read,\n setLayout: (layout: WorkbenchLayout, scope?: string) => {\n const snapshot = selectPlacements(layout, (p) => p.placementIdentity?.kind !== \"mode\");\n for (const id of workbenchRegions) {\n snapshot.regions[id].savedWidgetOrder = layout.regions[id].widgets.map((widget) => widget.widgetId);\n }\n return write(snapshot, scope);\n },\n }\n : undefined,\n readMode: (projectId: string | undefined, modeId: string) => read(modeScope(projectId, modeId)),\n saveMode: (projectId: string | undefined, modeId: string, layout: WorkbenchLayout) =>\n write(\n selectPlacements(layout, (p) => p.placementIdentity?.kind === \"mode\" && p.placementIdentity.modeId === modeId),\n modeScope(projectId, modeId),\n ),\n };\n};\n","import type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport type { WorkbenchRegion } from \"../../registries/layout/layout-types\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport type { WorkbenchSidePanelController, WorkbenchSidePanelMode } from \"../side-panel/side-panel-controller\";\n\nexport type WorkbenchSidePanelPresentation = WorkbenchSidePanelMode;\n\nexport type WorkbenchShellOpenRegion = \"sidenav\" | \"secondary\" | \"side\";\n\nexport interface WorkbenchShellRegionState {\n open: boolean;\n size?: number;\n}\n\nexport interface WorkbenchShellController {\n getRegionState(region: WorkbenchRegion): WorkbenchShellRegionState;\n setRegionOpen(region: WorkbenchShellOpenRegion, open: boolean): void;\n setRegionSize(region: WorkbenchRegion, size: number): void;\n getSidePanelPresentation(): WorkbenchSidePanelPresentation;\n setSidePanelPresentation(presentation: WorkbenchSidePanelPresentation): void;\n onDidChange(listener: () => void): Disposable;\n}\n\nexport const createWorkbenchShellController = (input: {\n layout: LayoutModel;\n sidePanel: WorkbenchSidePanelController;\n}): WorkbenchShellController => ({\n getRegionState(region) {\n const state = input.layout.getLayout().regions[region];\n return { open: state.visible, size: state.size };\n },\n\n setRegionOpen(region, open) {\n if (region === \"side\") {\n if (!open) input.sidePanel.setMode(\"closed\");\n else if (input.sidePanel.getMode() === \"closed\") input.sidePanel.setMode(\"attached\");\n return;\n }\n input.layout.setRegionVisible(region, open);\n },\n\n setRegionSize(region, size) {\n input.layout.setRegionSize(region, size);\n },\n\n getSidePanelPresentation: input.sidePanel.getMode,\n setSidePanelPresentation: input.sidePanel.setMode,\n\n onDidChange(listener) {\n // The Side Panel mode lives in the layout, so one change can reach both sources.\n // A mode policy change moves the panel without a layout change.\n let layout = input.layout.getLayout();\n let sidePanelMode = input.sidePanel.getMode();\n const notify = () => {\n const nextLayout = input.layout.getLayout();\n const nextSidePanelMode = input.sidePanel.getMode();\n if (nextLayout === layout && nextSidePanelMode === sidePanelMode) return;\n layout = nextLayout;\n sidePanelMode = nextSidePanelMode;\n listener();\n };\n const unsubscribeLayout = input.layout.store.subscribeSelector((state) => state.layout, notify);\n const sidePanelSubscription = input.sidePanel.onDidChange(notify);\n return createDisposable(() => {\n unsubscribeLayout();\n sidePanelSubscription.dispose();\n });\n },\n});\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { LayoutModel } from \"../../registries/layout/layout-model\";\nimport { getAnchorResource, reconcileAnchors } from \"../../registries/layout/surface-reconcile\";\nimport type { ResourceRef, ResourceRegistry } from \"../../registries/resources/resource-registry\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\n// Default scope predicate derived from the scoped resource providers. A detached\n// resource stays in scope while a provider for its kind still lists it under the active\n// primary; kinds with no provider can't be scoped, so they are kept. This makes the\n// detached-disconnect behaviour fall out of how providers filter their candidates —\n// no per-app wiring needed (apps can still inject a custom predicate).\n//\n// It deliberately ignores the `primary` argument the coordinator passes: scoping is read\n// from the registry's own `getPrimary` closure (which already reflects the live primary),\n// so the candidate list and this predicate cannot drift to different primaries.\nexport const createScopedIsInScope = (resources: ResourceRegistry) => (resource: ResourceRef) => {\n const hasProvider = resources.listProviders().some((provider) => provider.kind === resource.type);\n if (!hasProvider) return true;\n return resources.listResources(\"\").some((entry) => resourceKey(entry.resource) === resourceKey(resource));\n};\nexport interface CreatePrimaryCoordinatorInput {\n layout: LayoutModel;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scope. Injected (no baked default) so apps decide the disconnect policy; the core\n // default keeps detached anchors (() => true) until scoped providers land.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n// Keeps the secondary resource anchors consistent with the primary (main) resource.\n// On a primary change, derived anchors clear (they re-scope to the new primary) and\n// detached anchors disconnect once they fall outside the new primary's scope. The\n// primary anchor is never mutated, so the selector keyed on the main region's active\n// resource cannot re-fire — the reconciliation is feedback-loop safe by construction.\nexport const createPrimaryCoordinator = ({ layout, isInScope }: CreatePrimaryCoordinatorInput): Disposable => {\n let changingPersistenceScope = false;\n const willChangeScope = layout.onWillChangePersistenceScope(() => {\n changingPersistenceScope = true;\n });\n const didChangeScope = layout.onDidChangePersistenceScope(() => {\n changingPersistenceScope = false;\n });\n const unsubscribe = layout.store.subscribe((state, previous) => {\n const primary = getAnchorResource(state.layout, \"primary\");\n const previousPrimaryKey = resourceKey(getAnchorResource(previous.layout, \"primary\"));\n if (resourceKey(primary) === previousPrimaryKey || changingPersistenceScope) return;\n // Reconcile only placements that belonged to the Location that is leaving.\n // Another listener may synchronously populate the new Location before this\n // callback runs; clearing the live region would delete that new content too.\n for (const action of reconcileAnchors({ layout: previous.layout, primary, isInScope })) {\n if (action.action !== \"clear\") continue;\n layout.removeWidgetPlacement(action.widgetId);\n }\n });\n return createDisposable(() => {\n unsubscribe();\n willChangeScope.dispose();\n didChangeScope.dispose();\n });\n};\n","import type { WorkbenchShellOpenRegion } from \"./controllers/shell/shell-controller\";\nimport type { KeybindingSequence } from \"./registries/keybindings/keybinding-registry\";\nimport { workbenchCommandPaletteMenuPath } from \"./registries/menus/workbench-menu-paths\";\nimport type { WorkbenchCore } from \"./workbench-core\";\n\nconst SIDENAV_PANEL_ID = \"sidenav\";\n\nconst togglePanel = (workbench: WorkbenchCore, region: WorkbenchShellOpenRegion) => {\n workbench.shell.setRegionOpen(region, !workbench.shell.getRegionState(region).open);\n};\n\ninterface BuiltinCommand {\n id: string;\n label: string;\n icon: string;\n keybinding: KeybindingSequence;\n execute: (workbench: WorkbenchCore) => void;\n}\n\n// Defaults use `Mod` so a single chord works on macOS (Cmd), Windows, and\n// Linux (Ctrl). The command palette intentionally claims the browser print\n// chord. Other built-ins must avoid the reserved table in `pstdio-extensions`.\nconst builtinCommands: BuiltinCommand[] = [\n {\n id: \"workbench.toggleCommandPalette\",\n label: \"Toggle Command Palette\",\n icon: \"Command\",\n keybinding: \"Mod+P\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.toggle(),\n },\n {\n id: \"workbench.action.showCommands\",\n label: \"Run Command\",\n icon: \"Terminal\",\n keybinding: \"Alt+Shift+K\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ initialQuery: \"> \" }),\n },\n {\n id: \"workbench.action.changeTheme\",\n label: \"Change Theme\",\n icon: \"Palette\",\n keybinding: \"Alt+Shift+T\",\n execute: (workbench: WorkbenchCore) => workbench.commandPalette.open({ view: \"theme\" }),\n },\n {\n id: \"workbench.action.navigateBack\",\n label: \"Navigate Back\",\n icon: \"ArrowLeft\",\n keybinding: \"Alt+Shift+ArrowLeft\",\n execute: (workbench: WorkbenchCore) => {\n workbench.pageLocations.goBack();\n },\n },\n {\n id: \"workbench.action.navigateForward\",\n label: \"Navigate Forward\",\n icon: \"ArrowRight\",\n keybinding: \"Alt+Shift+ArrowRight\",\n execute: (workbench: WorkbenchCore) => {\n workbench.pageLocations.goForward();\n },\n },\n {\n id: \"workbench.toggleSideBar\",\n label: \"Toggle Sidenav\",\n icon: \"PanelLeft\",\n keybinding: \"Mod+B\",\n execute: (workbench: WorkbenchCore) => togglePanel(workbench, SIDENAV_PANEL_ID),\n },\n];\n\nexport const registerWorkbenchBuiltIns = (workbench: WorkbenchCore) => {\n for (const command of builtinCommands) {\n workbench.commands.registerCommand(\n {\n id: command.id,\n label: command.label,\n category: \"Workbench\",\n icon: command.icon,\n when: \"!inputFocus\",\n },\n { execute: () => command.execute(workbench) },\n );\n workbench.keybindings.registerKeybinding({\n action: { kind: \"command\", commandId: command.id },\n keybinding: command.keybinding,\n when: \"!inputFocus\",\n });\n workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, {\n commandId: command.id,\n group: \"Workbench\",\n });\n }\n};\n","import { createWorkbenchCompositionController } from \"./controllers/composition/composition-controller\";\nimport { createOwnedAddablePanels } from \"./controllers/composition/owned-addable-panels\";\nimport { createPrimaryCoordinator, createScopedIsInScope } from \"./controllers/primary-coordinator/primary-coordinator\";\nimport { workbenchViewIdContextKey } from \"./registries/views/view-registry\";\nimport { registerWorkbenchBuiltIns } from \"./workbench-built-ins\";\nimport type { createWorkbenchInput, WorkbenchCore } from \"./workbench-core-types\";\n\nexport const createCoreCompositionController = (resolveCore: () => WorkbenchCore) =>\n createWorkbenchCompositionController({\n getActiveMode: () => {\n const core = resolveCore();\n const modeId = core.modes.getActiveModeId();\n return modeId ? core.modes.getMode(modeId) : undefined;\n },\n getLayout: () => resolveCore().layout.getLayout(),\n getResource: () => resolveCore().getPrimaryResource(),\n listWidgets: () => resolveCore().layout.listWidgets(),\n listOwnedAddablePanels: ({ layout, mode, region, resource }) => {\n const core = resolveCore();\n return createOwnedAddablePanels(core, { layout, modeId: mode?.id, region, resource });\n },\n });\n\nexport const connectWorkbenchCoreState = (core: WorkbenchCore, input: createWorkbenchInput) => {\n core.layout.store.subscribe((state) => {\n const activeRegion = core.focus.getActiveRegion();\n if (activeRegion && !state.layout.regions[activeRegion].visible) core.focus.clearFocus();\n });\n core.layout.store.subscribeSelector(\n (state) => {\n const activeId = state.layout.activeWidgetId;\n if (!activeId) return undefined;\n return Object.values(state.layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === activeId)?.viewId;\n },\n (viewId) => {\n if (viewId) core.context.set(workbenchViewIdContextKey, viewId);\n else core.context.delete(workbenchViewIdContextKey);\n },\n { fireImmediately: true },\n );\n\n createPrimaryCoordinator({\n layout: core.layout,\n isInScope: input.isInScope ?? createScopedIsInScope(core.resources),\n });\n registerWorkbenchBuiltIns(core);\n};\n\nexport const activeWorkbenchResource = (core: WorkbenchCore) => {\n const activeWidgetId = core.layout.getLayout().activeWidgetId;\n if (!activeWidgetId) return undefined;\n for (const region of Object.values(core.layout.getLayout().regions)) {\n const placement = region.widgets.find((candidate) => candidate.widgetId === activeWidgetId);\n if (placement) return placement.resource;\n }\n return undefined;\n};\n\nexport const primaryWorkbenchResource = (core: WorkbenchCore) => core.pages.store.getState().location?.resource;\n","import {\n createNavigationTreeRegistry,\n type NavigationTreeMoveContext,\n} from \"./registries/navigation/navigation-tree-registry\";\nimport type { TreeNode } from \"./registries/renderers/tree-renderer-types\";\nimport type { createCoreRenderers } from \"./workbench-core-renderers\";\n\nexport const createWorkbenchNavigationTrees = (renderers: ReturnType<typeof createCoreRenderers>) =>\n createNavigationTreeRegistry({\n subscribeViewRefresh: (viewId, listener) =>\n renderers.onDidRefresh(({ treeId }) => {\n if (treeId === viewId) listener();\n }),\n getViewDefaultExpandedSectionIds: (viewId) => renderers.getTreeRenderer(viewId)?.defaultExpandedSectionIds,\n getViewSections: (viewId, context) => renderers.getBody(viewId, { ...context, viewId }),\n getViewChildren: (viewId, node, context) => renderers.getChildren(viewId, node, { ...context, viewId }),\n moveViewNode: (viewId, source, target, context) => moveNavigationNode(renderers, viewId, source, target, context),\n });\n\nconst moveNavigationNode = async (\n renderers: ReturnType<typeof createCoreRenderers>,\n viewId: string,\n source: TreeNode,\n target: TreeNode | undefined,\n context: NavigationTreeMoveContext,\n) => {\n await renderers.getTreeRenderer(viewId)?.moveNode?.(source, target, {\n ...context,\n viewId,\n state: renderers.getTreeState(viewId),\n refresh: () => renderers.refresh(viewId),\n setSelectedNode: (nodeId) => renderers.setSelectedNode(viewId, nodeId),\n });\n};\n","import { createControlsRendererRegistry } from \"./registries/renderers/controls-renderer-registry\";\nimport { createDataTableRendererRegistry } from \"./registries/renderers/data-table-renderer-registry\";\nimport { createFileRendererRegistry } from \"./registries/renderers/file-renderer-registry\";\nimport { createKanbanRendererRegistry } from \"./registries/renderers/kanban-renderer-registry\";\nimport { createWorkbenchRendererRegistry } from \"./registries/renderers/renderer-registry\";\nimport { createTreeRendererRegistry } from \"./registries/renderers/tree-renderer-registry\";\nimport type { createWorkbenchInput, WorkbenchRenderers } from \"./workbench-core-types\";\n\nexport const createCoreRenderers = (input: createWorkbenchInput): WorkbenchRenderers => {\n const rendererRegistry = createWorkbenchRendererRegistry();\n return {\n ...rendererRegistry,\n ...createTreeRendererRegistry({ rendererRegistry, persistence: input.treePersistence }),\n ...createKanbanRendererRegistry({ rendererRegistry }),\n ...createDataTableRendererRegistry({ rendererRegistry }),\n ...createFileRendererRegistry({ rendererRegistry }),\n ...createControlsRendererRegistry({ rendererRegistry }),\n };\n};\n","import type { ContributionMetadata } from \"../../shared/contributions/metadata\";\nimport type { ControlsRendererRegistry } from \"../renderers/controls-renderer-registry\";\nimport type { DataTableRendererRegistry } from \"../renderers/data-table-renderer-registry\";\nimport type { FileRendererRegistry } from \"../renderers/file-renderer-registry\";\nimport type { KanbanRendererRegistry } from \"../renderers/kanban-renderer-registry\";\nimport type { WorkbenchRendererRegistry } from \"../renderers/renderer-registry\";\nimport type { TreeRendererRegistry } from \"../renderers/tree-renderer-registry\";\nimport type { WorkbenchViewContribution } from \"./view-registry\";\n\ntype ViewBodyRegistries = Pick<WorkbenchRendererRegistry, \"refreshRenderer\" | \"registerRenderer\"> &\n Pick<TreeRendererRegistry, \"refresh\" | \"registerTreeRenderer\"> &\n Pick<KanbanRendererRegistry, \"refreshKanbanRenderer\" | \"registerKanbanRenderer\"> &\n Pick<DataTableRendererRegistry, \"refreshDataTableRenderer\" | \"registerDataTableRenderer\"> &\n Pick<FileRendererRegistry, \"refreshFileRenderer\" | \"registerFileRenderer\"> &\n Pick<ControlsRendererRegistry, \"refreshControlsRenderer\" | \"registerControlsRenderer\">;\n\nconst refreshable = <T extends { dispose(): void }>(registration: T, refresh: (input?: unknown) => void) => ({\n dispose: () => registration.dispose(),\n refresh,\n});\n\nexport const createWorkbenchViewBodyRegistration =\n (registries: ViewBodyRegistries) => (view: WorkbenchViewContribution, metadata?: ContributionMetadata) => {\n const body = view.body;\n if (body.kind === \"react\") {\n return refreshable(registries.registerRenderer({ id: view.id, render: body.render }), () =>\n registries.refreshRenderer(view.id),\n );\n }\n if (body.kind === \"tree\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerTreeRenderer({ ...definition, id: view.id, title: view.title, icon: view.icon }, metadata),\n () => registries.refresh(view.id),\n );\n }\n if (body.kind === \"file\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerFileRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n (input) =>\n registries.refreshFileRenderer(view.id, input as Parameters<FileRendererRegistry[\"refreshFileRenderer\"]>[1]),\n );\n }\n if (body.kind === \"controls\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerControlsRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshControlsRenderer(view.id),\n );\n }\n if (body.kind === \"kanban\") {\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerKanbanRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshKanbanRenderer(view.id),\n );\n }\n\n const { kind: _kind, ...definition } = body;\n return refreshable(\n registries.registerDataTableRenderer({ ...definition, id: view.id, title: view.title }, metadata),\n () => registries.refreshDataTableRenderer(view.id),\n );\n };\n","import { createStatusBarRegistry } from \"./registries/status-bar/status-bar-registry\";\nimport { createWorkbenchViewMenuRegistry } from \"./registries/view-menus/view-menu-registry\";\nimport { createWorkbenchViewBodyRegistration } from \"./registries/views/view-body-registration\";\nimport { createViewRegistry } from \"./registries/views/view-registry\";\nimport type { createWorkbenchInput, WorkbenchRenderers } from \"./workbench-core-types\";\n\nexport const createCoreViews = (input: createWorkbenchInput, renderers: WorkbenchRenderers) => {\n const views = createViewRegistry({ registerBody: createWorkbenchViewBodyRegistration(renderers) });\n return {\n views,\n viewMenus: createWorkbenchViewMenuRegistry({ views }),\n statusBar: createStatusBarRegistry({\n hasView: (viewId) => Boolean(views.getView(viewId)),\n persistence: input.statusBarPersistence,\n }),\n };\n};\n","import type { ResourceRef } from \"./registries/resources/resource-registry\";\nimport type { ContributionMetadata, ContributionSource } from \"./shared/contributions/metadata\";\nimport type { Disposable } from \"./shared/disposable\";\nimport { createDisposable } from \"./shared/disposable\";\nimport type { WorkbenchCore, WorkbenchModuleContribution, WorkbenchModuleContributionContext } from \"./workbench-core\";\n\ntype WorkbenchModuleActivationResult = Disposable | readonly Disposable[] | undefined;\n\nconst withModuleMetadata = (\n input: { ownerId: string; source: ContributionSource },\n metadata?: ContributionMetadata,\n) => ({\n ...metadata,\n source: input.source,\n ownerId: input.ownerId,\n});\n\nexport const toDisposables = (result: WorkbenchModuleActivationResult) => {\n if (!result) return [] as Disposable[];\n return Array.isArray(result) ? [...result] : [result as Disposable];\n};\n\nexport const disposeDisposables = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\n\ninterface CreateModuleContextInput {\n contextScopeId: string;\n ownerId: string;\n source: ContributionSource;\n track(disposable: Disposable): void;\n}\n\nexport const createModuleContext = (\n core: WorkbenchCore,\n input: CreateModuleContextInput,\n): WorkbenchModuleContributionContext => {\n // Contributions may share an owner, but each module or mode owns its context lifetime.\n const contextScope = core.context.createScope(input.contextScopeId);\n input.track(contextScope);\n\n const track = <TDisposable extends Disposable>(disposable: TDisposable) => {\n input.track(disposable);\n return disposable;\n };\n\n const {\n openPanel: _openPanel,\n openWidget: _openWidget,\n registerPanel: _registerPanel,\n registerPanelMenu: _registerPanelMenu,\n registerPlaceholder: _registerPlaceholder,\n registerWidget: _registerWidget,\n ...moduleLayout\n } = core.layout;\n return {\n ...core,\n registerChildModule: (module: WorkbenchModuleContribution) => track(core.registerModule(module)),\n onDidChangePrimaryResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangePrimaryResource(listener)),\n onDidChangeActiveResource: (listener: (resource: ResourceRef | undefined) => void) =>\n track(core.onDidChangeActiveResource(listener)),\n breadcrumbs: {\n ...core.breadcrumbs,\n setItems: (items) => track(core.breadcrumbs.setItems(items)),\n onDidChange: (listener) => track(core.breadcrumbs.onDidChange(listener)),\n },\n commandPalette: {\n ...core.commandPalette,\n onDidChange: (listener) => track(core.commandPalette.onDidChange(listener)),\n },\n context: {\n ...core.context,\n set: (key, value) => contextScope.set(key, value),\n delete: (key) => contextScope.delete(key),\n createScope: (ownerId) => track(core.context.createScope(ownerId)),\n },\n focus: {\n ...core.focus,\n onDidChange: (listener) => track(core.focus.onDidChange(listener)),\n },\n commands: {\n ...core.commands,\n registerCommand: (command, handler, metadata) =>\n track(core.commands.registerCommand(command, handler, withModuleMetadata(input, metadata))),\n onDidExecuteError: (listener) => track(core.commands.onDidExecuteError(listener)),\n },\n keybindings: {\n ...core.keybindings,\n registerKeybinding: (keybinding, metadata) =>\n track(core.keybindings.registerKeybinding(keybinding, withModuleMetadata(input, metadata))),\n },\n layout: {\n ...moduleLayout,\n registerMenuItem: (path, item, metadata) =>\n track(core.layout.registerMenuItem(path, item, withModuleMetadata(input, metadata))),\n onWillChangePersistenceScope: (listener) => track(core.layout.onWillChangePersistenceScope(listener)),\n onDidChangePersistenceScope: (listener) => track(core.layout.onDidChangePersistenceScope(listener)),\n },\n modes: {\n ...core.modes,\n registerMode: (mode) =>\n track(\n core.modes.registerMode({\n ...mode,\n activate: () => {\n const modeDisposables: Disposable[] = [];\n const modeContext = createModuleContext(core, {\n ...input,\n contextScopeId: `mode:${mode.id}`,\n track: (disposable) => modeDisposables.push(disposable),\n });\n const returnedDisposables = toDisposables(mode.activate(modeContext));\n return createDisposable(() => disposeDisposables([...modeDisposables, ...returnedDisposables]));\n },\n }),\n ),\n onDidChangeActive: (listener) => track(core.modes.onDidChangeActive(listener)),\n },\n modePlacements: {\n ...core.modePlacements,\n registerPlacement: (placement) => track(core.modePlacements.registerPlacement(placement)),\n onDidChange: (listener) => track(core.modePlacements.onDidChange(listener)),\n },\n shellPlacements: {\n ...core.shellPlacements,\n registerPlacement: (placement) => track(core.shellPlacements.registerPlacement(placement)),\n onDidChange: (listener) => track(core.shellPlacements.onDidChange(listener)),\n },\n navigation: {\n ...core.navigation,\n registerParser: (parser, metadata) =>\n track(core.navigation.registerParser(parser, withModuleMetadata(input, metadata))),\n },\n navigationTrees: {\n ...core.navigationTrees,\n registerContribution: (contribution) => track(core.navigationTrees.registerContribution(contribution)),\n onDidChange: (listener) => track(core.navigationTrees.onDidChange(listener)),\n },\n notifications: {\n ...core.notifications,\n show: (notification, metadata) => core.notifications.show(notification, withModuleMetadata(input, metadata)),\n },\n overlays: {\n ...core.overlays,\n registerOverlay: (overlay) => track(core.overlays.registerOverlay(overlay)),\n },\n placeholders: {\n ...core.placeholders,\n registerPlaceholder: (placeholder, metadata) =>\n track(core.placeholders.registerPlaceholder(placeholder, withModuleMetadata(input, metadata))),\n },\n pages: {\n ...core.pages,\n registerPage: (page) => track(core.pages.registerPage(page)),\n },\n panelMenuState: {\n ...core.panelMenuState,\n onDidChange: (listener) => track(core.panelMenuState.onDidChange(listener)),\n },\n preferences: {\n ...core.preferences,\n registerSchema: (schema, metadata) =>\n track(core.preferences.registerSchema(schema, withModuleMetadata(input, metadata))),\n },\n resources: {\n ...core.resources,\n onWillRemove: (listener) => track(core.resources.onWillRemove(listener)),\n registerKind: (kind, metadata) => track(core.resources.registerKind(kind, withModuleMetadata(input, metadata))),\n registerHierarchyProvider: (provider) => track(core.resources.registerHierarchyProvider(provider)),\n registerProvider: (provider) => track(core.resources.registerProvider(provider)),\n },\n views: {\n ...core.views,\n registerView: (view, metadata) => track(core.views.registerView(view, withModuleMetadata(input, metadata))),\n },\n viewMenus: {\n ...core.viewMenus,\n registerViewMenu: (menu) => track(core.viewMenus.registerViewMenu(menu)),\n },\n settings: {\n ...core.settings,\n registerSection: (section, metadata) =>\n track(core.settings.registerSection(section, withModuleMetadata(input, metadata))),\n registerPanel: (panel, metadata) =>\n track(core.settings.registerPanel(panel, withModuleMetadata(input, metadata))),\n },\n statusBar: {\n ...core.statusBar,\n registerItem: (item) => track(core.statusBar.registerItem(item)),\n },\n statuses: {\n ...core.statuses,\n registerStatusSet: (statusSet, metadata) =>\n track(core.statuses.registerStatusSet(statusSet, withModuleMetadata(input, metadata))),\n },\n shell: {\n ...core.shell,\n onDidChange: (listener) => track(core.shell.onDidChange(listener)),\n },\n sidePanel: {\n ...core.sidePanel,\n onDidChange: (listener) => track(core.sidePanel.onDidChange(listener)),\n },\n themes: {\n ...core.themes,\n register: (themes) => track(core.themes.register(themes)),\n },\n fileIconThemes: {\n ...core.fileIconThemes,\n register: (themes) => track(core.fileIconThemes.register(themes)),\n },\n } satisfies WorkbenchModuleContributionContext;\n};\n","import { createDisposable, type Disposable } from \"./shared/disposable\";\nimport type { WorkbenchCore } from \"./workbench-core-types\";\nimport { createModuleContext, disposeDisposables, toDisposables } from \"./workbench-module-context\";\n\nexport const createWorkbenchModuleRegistry = (\n resolveCore: () => WorkbenchCore,\n): Pick<WorkbenchCore, \"registerModule\" | \"unregisterModule\"> => {\n const moduleRecords = new Map<string, { disposable: Disposable }>();\n return {\n registerModule(module) {\n if (moduleRecords.has(module.id)) throw new Error(`Workbench module already registered: ${module.id}`);\n\n const disposables: Disposable[] = [];\n let registration: Disposable;\n\n registration = createDisposable(() => {\n if (moduleRecords.get(module.id)?.disposable !== registration) return;\n moduleRecords.delete(module.id);\n disposeDisposables(disposables);\n });\n\n const record = { disposable: registration };\n\n moduleRecords.set(module.id, record);\n\n try {\n const context = createModuleContext(resolveCore(), {\n contextScopeId: `module:${module.id}`,\n ownerId: module.ownerId ?? module.id,\n source: module.source ?? \"module\",\n track: (disposable) => {\n disposables.push(disposable);\n },\n });\n disposables.push(...toDisposables(module.activate(context)));\n } catch (error) {\n record.disposable.dispose();\n throw error;\n }\n\n return record.disposable;\n },\n\n unregisterModule(moduleId) {\n moduleRecords.get(moduleId)?.disposable.dispose();\n },\n };\n};\n","import { defaultPageResourceCodec, workbenchPages } from \"@pstdio/sdk/extensions\";\nimport { createWorkbenchBreadcrumbController } from \"./controllers/breadcrumbs/breadcrumb-registry\";\nimport { createWorkbenchCommandPaletteController } from \"./controllers/command-palette/command-palette-controller\";\nimport { registerArrangementCommands } from \"./controllers/composition/arrangement-commands\";\nimport { createPanelArrangement } from \"./controllers/composition/panel-arrangement\";\nimport { createPlacementCloseController } from \"./controllers/composition/placement-close-controller\";\nimport { createPlacementPinController } from \"./controllers/composition/placement-pin-controller\";\nimport { createLayoutResetController } from \"./controllers/composition/reset-workbench-layout\";\nimport { removeWorkbenchResource } from \"./controllers/composition/resource-removal\";\nimport { createWorkbenchFocusController } from \"./controllers/focus/focus-controller\";\nimport { connectWorkbenchPageBreadcrumbs } from \"./controllers/page-location/page-breadcrumbs\";\nimport { createWorkbenchPageLocationController } from \"./controllers/page-location/page-location-controller\";\nimport {\n createMemoryWorkbenchPageLocationBrowser,\n createMemoryWorkbenchPageLocationPersistence,\n} from \"./controllers/page-location/page-location-memory\";\nimport { createLiveWorkbenchPageRegistry } from \"./controllers/page-runtime/page-runtime\";\nimport {\n createPageStateRestorer,\n loadWorkbenchLocationLayout,\n} from \"./controllers/page-runtime/page-state-restoration\";\nimport { createWorkbenchLayoutCache } from \"./controllers/page-runtime/workbench-layout-cache\";\nimport { createWorkbenchPanelMenuStateController } from \"./controllers/panel-menus/panel-menu-state-controller\";\nimport { createWorkbenchShellController } from \"./controllers/shell/shell-controller\";\nimport { createWorkbenchSidePanelController } from \"./controllers/side-panel/side-panel-controller\";\nimport { createWorkbenchTerminalController } from \"./controllers/terminal/terminal-controller\";\nimport { createCommandPaletteResourceRegistry } from \"./registries/command-palette-resources/command-palette-resource-registry\";\nimport { createCommandRegistry } from \"./registries/commands/command-registry\";\nimport { createKeybindingRegistry } from \"./registries/keybindings/keybinding-registry\";\nimport { createLayoutModel } from \"./registries/layout/layout-model\";\nimport type { LayoutPersistenceAdapter } from \"./registries/layout/layout-model-types\";\nimport type { WorkbenchWidgetPlacement } from \"./registries/layout/layout-types\";\nimport { createMenuRegistry } from \"./registries/menus/menu-registry\";\nimport { createWorkbenchModePlacementRegistry } from \"./registries/modes/mode-placement-registry\";\nimport { createWorkbenchModeRegistry } from \"./registries/modes/mode-registry\";\nimport type { createNavigationTreeRegistry } from \"./registries/navigation/navigation-tree-registry\";\nimport { createNotificationRegistry } from \"./registries/notifications/notification-registry\";\nimport { createWorkbenchOverlayRegistry } from \"./registries/overlays/overlay-registry\";\nimport type { WorkbenchPageRegistryStoreState } from \"./registries/pages/page-registry\";\nimport { createWorkbenchPlaceholderRegistry } from \"./registries/placeholders/placeholder-registry\";\nimport { createWorkbenchShellPlacementRegistry } from \"./registries/placements/shell-placement-registry\";\nimport { createPreferenceRegistry } from \"./registries/preferences/preference-registry\";\nimport { createResourceRegistry } from \"./registries/resources/resource-registry\";\nimport { createSettingsRegistry } from \"./registries/settings/settings-registry\";\nimport { createStatusRegistry } from \"./registries/statuses/status-registry\";\nimport { createFileIconThemeRegistry } from \"./registries/themes/file-icon-theme-registry\";\nimport { createThemeRegistry } from \"./registries/themes/theme-registry\";\nimport { createContextKeyService } from \"./shared/context/context-key-service\";\nimport { createDisposable } from \"./shared/disposable\";\nimport {\n activeWorkbenchResource,\n connectWorkbenchCoreState,\n createCoreCompositionController,\n primaryWorkbenchResource,\n} from \"./workbench-core-connections\";\nimport { createCoreNavigationRegistry, revealPanelRegion } from \"./workbench-core-navigation\";\nimport { createWorkbenchNavigationTrees } from \"./workbench-core-navigation-trees\";\nimport { createCoreRenderers } from \"./workbench-core-renderers\";\nimport type { createWorkbenchInput, WorkbenchCore } from \"./workbench-core-types\";\nimport { createCoreViews } from \"./workbench-core-views\";\nimport { createWorkbenchModuleRegistry } from \"./workbench-module-registry\";\nimport { setWorkbenchRenderers } from \"./workbench-renderers\";\n\nexport * from \"./workbench-core-types\";\n\nconst createPagePersistenceScopeHandler = (\n input: createWorkbenchInput,\n layout: Pick<ReturnType<typeof createLayoutModel>, \"getPersistenceScope\" | \"setPersistenceScope\">,\n panelMenuState: ReturnType<typeof createWorkbenchPanelMenuStateController>,\n) => {\n const resolveScope = input.resolvePagePersistenceScope;\n if (!resolveScope) return undefined;\n return (state: WorkbenchPageRegistryStoreState<WorkbenchWidgetPlacement>) => {\n const resolved = resolveScope({\n currentScope: layout.getPersistenceScope(),\n modeId: state.activeModeId,\n pageId: state.activePageId,\n projectId: state.projectId,\n resource: state.location?.resource,\n });\n panelMenuState.setPersistenceScope(resolved.scope);\n layout.setPersistenceScope(resolved.scope, { carryRegionState: resolved.carryRegions });\n };\n};\n\nconst createPageLocations = (\n input: createWorkbenchInput,\n registry: ReturnType<typeof createLiveWorkbenchPageRegistry>,\n navigationTrees: ReturnType<typeof createNavigationTreeRegistry>,\n modes: ReturnType<typeof createWorkbenchModeRegistry>,\n) =>\n createWorkbenchPageLocationController({\n registry,\n browser: input.pageLocationBrowser ?? createMemoryWorkbenchPageLocationBrowser(),\n navigationTrees,\n modes,\n persistence: input.pageLocationPersistence ?? createMemoryWorkbenchPageLocationPersistence(),\n startPage: input.startPage ?? workbenchPages.start,\n });\n\nconst disposeLayoutPersistence = (persistence: LayoutPersistenceAdapter | undefined) => {\n // Save pending writes before the adapter releases its resources.\n persistence?.flush?.();\n persistence?.dispose?.();\n};\n\nexport const createWorkbench = (input: createWorkbenchInput = {}) => {\n const context = createContextKeyService();\n const commands = createCommandRegistry({ context });\n const renderers = createCoreRenderers(input);\n\n const layoutCache = createWorkbenchLayoutCache(input);\n const cachedInput = { ...input, persistence: undefined, layoutPersistence: layoutCache.layout };\n const locationAwareLayout = createLayoutModel({\n defaultRegionVisibility: {\n ...input.defaultPanelOpenByRegionId,\n side: (input.initialSidePanelMode ?? \"floating\") !== \"closed\",\n },\n // The active mode owns region policy; the host input is the fallback. Resolved\n // lazily because the mode registry is created after the layout model.\n getRegionSettings: (regionId) => {\n const activeModeId = core?.modes.getActiveModeId();\n const activeMode = activeModeId ? core?.modes.getMode(activeModeId) : undefined;\n return { ...input.regionSettings?.[regionId], ...activeMode?.regionSettings?.[regionId] };\n },\n persistence: layoutCache.layout,\n });\n\n const { establishLocation, ...layoutModel } = locationAwareLayout;\n\n const layout = {\n ...layoutModel,\n ...createMenuRegistry({ commands }),\n };\n\n const focus = createWorkbenchFocusController({\n context,\n isRegionFocusable: (region) => layout.getLayout().regions[region].visible,\n });\n\n const { views, viewMenus, statusBar } = createCoreViews(input, renderers);\n const pageResources = input.pageResources ?? defaultPageResourceCodec;\n\n const modePlacements = createWorkbenchModePlacementRegistry({\n loadLayout: (context) => layoutCache.readMode(context.projectId, context.modeId),\n getProjectId: () => core?.pages.store.getState().projectId,\n views,\n viewMenus,\n getPanel: layout.getWidget,\n registerPanel: layout,\n });\n\n const shellPlacements = createWorkbenchShellPlacementRegistry({\n views,\n viewMenus,\n getPanel: layout.getWidget,\n registerPanel: layout,\n activatePanel: layout.activatePanel,\n getLayout: layout.getLayout,\n getScope: layout.getPersistenceScope,\n resolveScope: input.resolvePagePersistenceScope\n ? (context) =>\n input.resolvePagePersistenceScope!({\n ...context,\n currentScope: layout.getPersistenceScope(),\n resource: context.location?.resource,\n }).scope\n : undefined,\n loadLayout: (context) =>\n loadWorkbenchLocationLayout(cachedInput, { ...context, resource: context.location?.resource }),\n enteredWithPersistedLayout: layout.enteredWithPersistedLayout,\n onDidChangePersistenceScope: layout.onDidChangePersistenceScope,\n });\n\n const navigationTrees = createWorkbenchNavigationTrees(renderers);\n\n const overlays = createWorkbenchOverlayRegistry({ layout, views, viewMenus });\n const placeholders = createWorkbenchPlaceholderRegistry({ layout, views });\n const breadcrumbs = createWorkbenchBreadcrumbController();\n const panelMenuState = createWorkbenchPanelMenuStateController({\n persistence: input.panelMenuStatePersistence,\n });\n\n const resources = createResourceRegistry({\n remove: (resource, retained) => {\n removeWorkbenchResource(core, resource, retained);\n layoutCache.removeResource(resource);\n },\n getPrimary: () => core.getPrimaryResource(),\n resolveView: views.getView,\n });\n\n let core: WorkbenchCore;\n\n const modes = createWorkbenchModeRegistry({\n establishLocation,\n layout,\n resolveContext: () => core,\n });\n\n const sidePanel = createWorkbenchSidePanelController({\n getFloatingPanels: () => {\n const activeModeId = modes.getActiveModeId();\n return (\n (activeModeId ? modes.getMode(activeModeId)?.floatingPanels : undefined) ?? input.floatingPanels ?? \"visible\"\n );\n },\n onDidChangePolicy: modes.onDidChangeActive,\n initialMode: input.initialSidePanelMode,\n layout,\n });\n const shell = createWorkbenchShellController({ layout, sidePanel });\n\n const pages = createLiveWorkbenchPageRegistry({\n loadModeLayout: layoutCache.readMode,\n beforeApply: createPagePersistenceScopeHandler(input, layout, panelMenuState),\n restorePageState: createPageStateRestorer(cachedInput),\n\n revealRegion: (region) => revealPanelRegion(core, region),\n layout,\n modePlacements,\n modes,\n shellPlacements,\n views,\n viewMenus,\n resources: pageResources,\n });\n\n const pageLocations = createPageLocations(input, pages, navigationTrees, modes);\n\n const composition = createCoreCompositionController(() => core);\n const navigation = createCoreNavigationRegistry(() => core);\n\n core = {\n closePlacement: createPlacementCloseController(() => core),\n pinPlacement: createPlacementPinController(() => core),\n ...createPanelArrangement(() => core),\n ...createLayoutResetController(() => core),\n breadcrumbs,\n commandPalette: createWorkbenchCommandPaletteController(),\n commands,\n composition,\n context,\n focus,\n host: {\n getSnapshot: () => ({ layout: layout.getLayout() }),\n restoreSnapshot: (snapshot) => layout.restoreLayout(snapshot.layout),\n setPersistenceScope: (scope, scopeInput = {}) =>\n layout.setPersistenceScope(scope, { carryRegionState: scopeInput.carryRegions }),\n getPersistenceScope: layout.getPersistenceScope,\n },\n keybindings: createKeybindingRegistry({ commands, context }),\n layout,\n modes,\n modePlacements,\n shellPlacements,\n notifications: createNotificationRegistry(),\n overlays,\n placeholders,\n pageLocations,\n pages,\n navigation,\n navigationTrees,\n panelMenuState,\n preferences: createPreferenceRegistry({ persistence: input.preferencePersistence }),\n treeViews: {\n getTreeState: renderers.getTreeState,\n setNodeExpanded: renderers.setNodeExpanded,\n setSectionExpanded: renderers.setSectionExpanded,\n setSelectedNode: renderers.setSelectedNode,\n },\n commandPaletteResources: createCommandPaletteResourceRegistry(),\n resources,\n views,\n viewMenus,\n settings: createSettingsRegistry({ hasView: (viewId) => Boolean(views.getView(viewId)) }),\n statusBar,\n statuses: createStatusRegistry(),\n shell,\n sidePanel,\n terminal: createWorkbenchTerminalController(),\n themes: createThemeRegistry(),\n fileIconThemes: createFileIconThemeRegistry(),\n\n getActiveResource() {\n return activeWorkbenchResource(core);\n },\n\n async dispose() {\n disposeLayoutPersistence(layoutCache.layout);\n await Promise.all([views.reads.dispose(), core.terminal.dispose()]);\n },\n\n onDidChangeActiveResource(listener) {\n return createDisposable(\n core.layout.store.subscribeSelector(\n (state) => state.layout.activeResourceKey,\n () => listener(core.getActiveResource()),\n ),\n );\n },\n\n getPrimaryResource() {\n return primaryWorkbenchResource(core);\n },\n\n onDidChangePrimaryResource(listener) {\n return createDisposable(\n core.pages.store.subscribeSelector(\n (state) => state.location?.resource,\n () => listener(core.getPrimaryResource()),\n ),\n );\n },\n\n registerChildModule(module) {\n return core.registerModule(module);\n },\n\n ...createWorkbenchModuleRegistry(() => core),\n };\n\n setWorkbenchRenderers(core, renderers);\n registerArrangementCommands(core);\n layout.store.subscribe(() => {\n const state = pages.store.getState();\n if (state.activeModeId) layoutCache.saveMode(state.projectId, state.activeModeId, layout.getLayout());\n });\n const breadcrumbSources = { breadcrumbs, locations: pageLocations, pages, navigationTrees, modes };\n connectWorkbenchPageBreadcrumbs({ ...breadcrumbSources, resources: pageResources });\n connectWorkbenchCoreState(core, input);\n\n return core;\n};\n"],"mappings":"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"}