@pstdio/workbench 0.44.0-nightly.20261017030225 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions.d.ts +163 -1040
- package/dist/extensions.js +1194 -808
- package/dist/extensions.js.map +1 -1
- package/dist/{file-renderer-view-r1qeAkQT.js → file-renderer-view-C5dyoQQW.js} +211 -214
- package/dist/file-renderer-view-C5dyoQQW.js.map +1 -0
- package/dist/{index-zQfxsv7O.d.ts → index-8x-QT7wg.d.ts} +1994 -533
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2052 -2002
- package/dist/index.js.map +1 -1
- package/dist/{kanban-presentation-BtBGjJnW.d.ts → kanban-presentation-pexk_oCY.d.ts} +1 -1
- package/dist/layout-tab-presentation-Bz6EgFEa.js +15 -0
- package/dist/layout-tab-presentation-Bz6EgFEa.js.map +1 -0
- package/dist/{navigation-tree-registry-CIwRvLFJ.js → navigation-tree-registry-C5l3eO3n.js} +2 -2
- package/dist/{navigation-tree-registry-CIwRvLFJ.js.map → navigation-tree-registry-C5l3eO3n.js.map} +1 -1
- package/dist/react-C-HbdPSw.js +8881 -0
- package/dist/react-C-HbdPSw.js.map +1 -0
- package/dist/react.d.ts +75 -29
- package/dist/react.js +2 -2
- package/dist/storage.d.ts +3 -2
- package/dist/storage.js +142 -123
- package/dist/storage.js.map +1 -1
- package/dist/webview-runtime.js +1 -1
- package/dist/workbench-renderers-Bz_dLyHW.js +4775 -0
- package/dist/workbench-renderers-Bz_dLyHW.js.map +1 -0
- package/package.json +3 -3
- package/dist/file-renderer-view-r1qeAkQT.js.map +0 -1
- package/dist/react-CoeiP5wi.js +0 -10939
- package/dist/react-CoeiP5wi.js.map +0 -1
- package/dist/workbench-renderers-Bj4sazP5.js +0 -976
- package/dist/workbench-renderers-Bj4sazP5.js.map +0 -1
package/dist/extensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","names":["KanbanRendererContribution","KanbanRendererFilterState","KanbanRendererSettings","ViewFieldKind","ViewFilterGroup","ViewFilterRule","ViewSort","FieldKinds","Partial","Record","Ordering","legacyRuleFor","attributeId","values","kind","condition","value","viewFilterFromLegacyFilters","filters","kinds","conjunction","rules","Object","entries","flatMap","rule","length","undefined","viewSortsFromLegacyOrdering","ordering","direction","legacyFiltersFromViewFilter","filter","Array","isArray","legacyOrderingFromSorts","sorts","KanbanViewDefaults","Pick","normalizeKanbanViewDefaults","body","fromEntries","attributes","map","field","id","type","defaultSettings","defaultFilter","defaultFilters","defaultSorts","defaultViews","settings","view","viewOrdering","viewSettings","LocalizedString","$l10n","default","Localizable","T","l10n","key","defaultValue","undefined","isLocalizedString","value","isLocalizedString","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","WEBVIEW_DECLARABLE_CAPABILITIES","WEBVIEW_HOST_CAPABILITIES","WEBVIEW_HOST_CAPABILITY_VERSION","WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES","WebviewHostCapability","WebviewScopedDeclarableCapability","HostCapabilityRequest","WebviewDeclarableCapability","WebviewCapabilityDiagnosticCode","WebviewCapabilityDiagnostic","capability","code","message","severity","HostCapability","params","TParams","Promise","TResult","HostCapabilityRegistry","Partial","Record","CreateHostCapabilityGateInput","capabilities","declaredCapabilities","onDiagnostic","diagnostic","publicCapabilityNames","Set","scopedCapabilityNames","isPublicCapability","name","has","isScopedCapability","parseWebviewCapabilityDeclaration","nameAndScope","versionText","split","scopeIndex","indexOf","slice","scope","undefined","version","Number","validateDeclarationShape","parsed","ReturnType","Boolean","unsupportedCapability","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","diagnostics","allowed","allowedScopes","Map","add","declaration","push","scopes","get","set","validateWebviewCapabilityNames","requestScope","request","mount","length","createHostCapabilityGate","input","emit","deny","Error","call","method","handler","RuntimeErrorPayload","isRecord","value","Record","safeStringify","json","JSON","stringify","length","String","normalizeRuntimeError","Error","message","stack","undefined","isRecord","extensionIframeAllow","capabilities","some","capability","ThemePreference","collectChakraThemeVariables","document","computed","getComputedStyle","documentElement","variables","Record","index","length","name","item","startsWith","getPropertyValue","trim","resolveActiveTheme","fallback","value","getAttribute","colorMode","postThemeToFrame","iframe","HTMLIFrameElement","theme","contentWindow","postMessage","type","CSSProperties","useEffect","useRef","useState","host","ExtensionViewDescriptor","HostCapabilityRegistry","HostCapabilityRequest","HostEventMessage","ThemePreference","WebviewCapabilityDiagnostic","createHostCapabilityGate","normalizeRuntimeError","HostEventPublisher","extensionIframeAllow","collectChakraThemeVariables","resolveActiveTheme","ExtensionFrameProps","view","props","theme","capabilities","hostEvents","onReady","onError","error","message","stack","onDiagnostics","diagnostics","title","GuestRemote","init","moduleUrl","styles","themeVariables","Record","extensionId","Promise","themeUpdate","variables","propsUpdate","hostEvent","iframeStyle","border","display","flex","height","minHeight","width","frameShellStyle","position","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","extensionProps","iframeRef","HTMLIFrameElement","remoteRef","initializedRef","connectedWindowRef","Window","propsRef","themeRef","capabilitiesRef","hostEventsRef","declaredCapabilitiesRef","webview","onReadyRef","onErrorRef","onDiagnosticsRef","frameEpoch","setFrameEpoch","current","iframe","onFrameLoad","contentWindow","epoch","addEventListener","removeLoadListener","removeEventListener","stylesAtConnect","moduleUrlAtConnect","reportDiagnostics","length","createCapabilityGate","declaredCapabilities","onDiagnostic","diagnostic","hostApi","ready","runtimeError","payload","call","request","connect","connection","location","replace","runtimeUrl","then","conn","remote","bind","catch","unbind","window","MutationObserver","frame","schedule","cancelAnimationFrame","requestAnimationFrame","observer","options","attributeFilter","attributes","observe","document","documentElement","body","disconnect","label","colorScheme","WebviewCapabilityDiagnostic","EXTENSION_HOST_LOG_PREFIX","ExtensionHostDiagnostic","event","extensionId","contributionId","projectId","code","capability","message","stack","logExtensionHostDiagnostic","diagnostic","write","console","info","JSON","stringify","createWebviewDiagnostics","view","id","log","onReady","onError","error","onDiagnostics","diagnostics","HostEventMessage","HostEventPublisher","emit","message","bind","sink","onDisconnect","listener","unbind","createHostEventPublisher","pending","disconnectListeners","Set","push","next","length","shift","add","delete","Box","Center","Stack","Text","resolvePageParams","createWebviewDiagnostics","ExtensionFrame","ExtensionFrameProps","useEffect","useState","WorkbenchCore","BridgeWebviewFrameProps","Omit","workbench","BridgeWebviewFrame","props","$","_c","frameProps","view","pageState","setPageState","pages","store","getState","t0","subscribe","state","t1","t2","t3","activePageId","location","page","getPage","undefined","params","t4","pageLocation","pageParams","pageProps","error","setError","t5","diagnostics","t6","t7","t8","t9","onReady","t10","nextError","onError","message","t11","onDiagnostics","t12","_c","TerminalHostEvent","TerminalSessionOperation","TerminalSessionResult","HostCapability","HostEventPublisher","WorkbenchTerminalController","TERMINAL_SESSION_EVENT_SCOPE","CreateTerminalSessionCapabilityInput","terminal","hostEvents","createTerminalSessionCapability","input","emit","payload","scope","params","operation","sessionId","open","request","write","data","accepted","resize","cols","rows","kill","signal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","subscribe","onData","chunk","kind","onExit","exit","code","onDisconnect","PreferenceScopeRef","PreferenceValue","WorkbenchCore","WebviewOwnedPreferences","get","name","scope","Promise","set","value","createWebviewPreferencesCapabilities","input","workbench","extensionId","ownedPreferences","warn","message","registry","preferences","owner","Error","registered","schema","getSchema","ownerId","console","Boolean","preferences.get","params","getValue","getOwnedValue","preferences.set","stored","setValue","then","setOwnedValue","HostCapabilityRegistry","HostEventPublisher","NavigationTarget","WorkbenchCore","WorkbenchPanelInstance","createTerminalSessionCapability","createWebviewPreferencesCapabilities","WebviewOwnedPreferences","CreateWorkbenchWebviewHostCapabilitiesInput","dispatchKeyboardEvent","event","KeyboardEventInit","workbench","placement","extensionId","ownedPreferences","warn","message","hostEvents","dispatchDocumentKeyboardEvent","params","document","KeyboardEvent","bubbles","cancelable","dispatchEvent","createWorkbenchWebviewHostCapabilities","input","placementIdentity","placement.close","undefined","Array","isArray","Object","keys","length","Error","closePlacement","commands.execute","request","commandId","commands","executeCommand","page.params.update","state","pages","store","getState","location","page","patch","Parameters","pageLocations","updateParams","navigation.open","target","navigation","openTarget","notification.show","notification","notifications","show","level","title","host.dispatchKeyboardEvent","terminal","HostCapabilityRegistry","ThemePreference","createHostEventPublisher","HostEventPublisher","WorkbenchCore","WorkbenchPanelInstance","WorkbenchPanelRenderInput","WorkbenchRendererRegistration","BridgeWebviewFrame","createWorkbenchWebviewHostCapabilities","BridgeWebviewRenderContext","workbench","webviewId","extensionId","placement","hostEvents","CreateBridgeWebviewHostCapabilities","context","CreateBridgeWebviewProps","CreateBridgeWebviewTheme","CreateBridgeWebviewRendererInput","createHostCapabilities","createProps","createTheme","BRIDGE_WEBVIEW_RENDERER_ID","BridgeWebviewConfig","title","runtimeUrl","moduleUrl","styles","capabilities","isBridgeWebviewConfig","value","Array","isArray","config","Partial","createPlacementProps","resource","createLightTheme","hostEventPublishersByWorkbench","WeakMap","Map","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","get","set","key","instanceId","renderBridgeWebviewFrame","input","ownerId","webview","id","label","renderBridgeWebview","panel","panelId","undefined","createBridgeWebviewRenderer","render","renderInput","LocalizableString","isLocalizedString","Localizable","text","value","fallback","undefined","default","$l10n","text","isLocalizedString","NavigationTarget","ExtensionNavigationTarget","isNavigationTarget","qualifyNavigationTarget","NavigationTargetCommand","ToWorkbenchNavigationTargetInput","commandIdOf","command","Extract","kind","commandTargetOf","target","extensionId","projectId","toCommandTarget","input","override","commandId","id","args","params","NavigationOperation","toWorkbenchNavigationTarget","Error","targets","map","item","CommandExecuteResponse","unwrapCommandValue","result","response","Partial","outcome","status","value","Error","reason","error","message","WorkbenchExtensionMetadata","text","WorkbenchCommandExecutionContext","WorkbenchExtensionCommandContext","runResourceMutation","context","command","params","Record","execution","persist","Promise","mutation","resourceMutation","id","idParam","resource","type","resourceType","extensionId","projectId","kind","workbench","commandPalette","requestConfirmation","title","rawLabel","labelParam","undefined","trim","preview","resources","begin","removed","label","result","commit","error","rollback","text","CommandExecuteRequest","CommandExecuteResponse","WorkbenchExtensionMetadata","ResourceRef","WorkbenchCommandExecutionContext","WorkbenchModuleContext","unwrapCommandValue","toWorkbenchNavigationTarget","runResourceMutation","WorkbenchExtensionCommandContext","metadata","Pick","executeCommand","commandId","body","signal","AbortSignal","Promise","prepareCommandArgs","args","context","onArgsChange","projectId","workbench","ExecuteWorkbenchExtensionCommandInput","workspaceId","Record","params","resource","slot","createExtensionSlot","input","id","kind","NonNullable","executeWorkbenchExtensionCommandResponse","response","source","outcome","Partial","status","target","navigationRequests","navigation","openTarget","error","notifications","show","level","title","message","Error","String","executeWorkbenchExtensionCommand","persist","command","commands","find","candidate","WorkbenchExtensionCommandPaletteResourceRecord","NavigationTarget","ResourceRef","text","CommandPaletteResourceResult","Disposable","toWorkbenchNavigationTarget","WorkbenchExtensionCommandContext","executeWorkbenchExtensionCommand","ResourceItem","id","label","description","icon","keywords","target","ProviderQueryResult","items","isProviderQueryResult","value","Array","isArray","commandIdOf","command","Extract","kind","extensionId","activateTarget","context","record","item","params","workbench","commandPaletteResources","refresh","navigation","openTarget","targetResource","resource","targets","find","step","undefined","toResult","groupLabel","projectId","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","title","push","registerProvider","refreshEventIds","query","limit","signal","activeResource","getActiveResource","queryHandlerId","modeId","modes","getActiveModeId","providerId","map","dispose","index","length","text","WorkbenchExtensionControlsRendererRecord","controlsQueryResultSchema","text","Disposable","ResourceRef","WorkbenchExtensionCommandContext","createExtensionSlot","executeWorkbenchExtensionCommand","localize","value","fallback","Parameters","WorkbenchExtensionControlsAdapter","resolveResource","record","registerControlsRenderer","context","adapter","slot","id","kind","projectId","controlsRendererId","run","commandId","params","Record","resource","signal","AbortSignal","pageParams","PageParams","renderer","rendererId","invocation","placement","metadata","Promise","resolve","undefined","workbench","views","registerView","title","icon","body","emptyTitle","emptyDescription","defaultValues","executeQuery","queryHandlerId","result","safeParse","success","fields","error","issues","map","issue","path","join","message","Error","extensionId","data","updateValue","valueChangeHandlerId","controlId","values","then","apply","applyHandlerId","reset","resetHandlerId","controlIds","registerWorkbenchExtensionControlsRenderers","records","disposables","push","dispose","index","length","localize","text","Localizable","commandRefId","CommandParamSchema","LocalizableText","ParamLocalizer","value","fallback","ContributedParamSchema","Record","type","label","description","options","localizeParamSchema","params","localize","ownerExtensionId","undefined","Object","fromEntries","entries","map","id","descriptor","Array","isArray","localizeOptionSource","source","command","extensionId","valueField","labelField","commandId","WorkbenchExtensionDataTableRendererRecord","text","localizeParamSchema","mapViewToolbarActions","record","Pick","toolbarActions","map","action","id","label","icon","presentation","commandId","args","params","input","extensionId","submitLabel","disabled","when","text","DataTableRendererSettings","dataTableBuiltInViews","WorkbenchExtensionDataTableRendererRecord","text","createElement","CollectionViewsProvider","DataTableRendererColumn","DataTableRendererQueryResult","DataTableRendererRow","Disposable","ResourceRef","WorkbenchIcon","WorkbenchExtensionCommandContext","createExtensionSlot","executeWorkbenchExtensionCommand","mapViewToolbarActions","localize","value","fallback","Parameters","WorkbenchExtensionDataTableRendererAdapter","resolveRowResource","record","row","id","values","Record","resource","createViewsProvider","WireColumn","NonNullable","toColumn","column","label","description","undefined","icon","name","size","isQueryResult","rows","Array","columns","Boolean","isArray","toRow","registerRenderer","context","adapter","builtIns","originalRows","WeakMap","slot","kind","projectId","dataTableRendererId","run","commandId","params","modeId","signal","AbortSignal","pageParams","PageParams","renderer","rendererId","invocation","placement","metadata","workbench","views","registerView","title","body","resourceKind","toolbarActions","map","initialPageSize","pageSizeOptions","defaultSettings","settings","defaultFilter","defaultSorts","defaultViews","view","defaultActiveViewId","viewsProvider","selectionMode","selectionActions","action","destructive","rowIds","then","emptyTitle","emptyDescription","executeQuery","filter","sorts","queryHandlerId","mapped","set","rowActions","rowId","refreshView","onRowActivate","rowActivationHandlerId","get","registerWorkbenchExtensionDataTableRenderers","records","disposables","dispose","index","length","text","isQueryResult","ExtensionCommandPaletteContribution","ExtensionMenuContribution","WorkbenchExtensionMetadata","isLocalizedString","Localizable","Command","MenuItem","MenuPath","localizeParamSchema","placementOrder","first","default","last","Record","NonNullable","ExtensionContributionPlacement","WorkbenchExtensionMenuSlotConfig","menuPath","group","overflowLabel","WorkbenchExtensionMenuWhenBuilder","contribution","WorkbenchExtensionStringResolver","value","extensionId","WorkbenchExtensionMenuRegistration","command","menuItem","targetCommandId","WorkbenchExtensionCommandPaletteRegistration","UnresolvedWorkbenchExtensionMenuContribution","targetId","emptyWorkbenchExtensionMetadata","commands","commandPaletteContributions","diagnostics","extensions","menuContributions","modes","pages","views","viewMenus","placements","resourceKinds","navigationItems","navigationTrees","statusBarItems","statuses","settingsPanels","settingsDefinitions","CommandContributionMetadata","Pick","defaultWorkbenchExtensionCommandId","id","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","placement","index","text","undefined","$l10n","createMenuItem","input","commandId","slot","when","resolveString","sourceCommandId","label","icon","args","params","order","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","metadata","menuSlotsById","ReadonlyMap","menuTargetsById","createCommandId","createWhenExpression","registrations","unresolved","forEach","target","get","slotId","push","find","candidate","category","description","buildWorkbenchExtensionCommandPaletteRegistrations","CommandExecuteRequest","CommandExecuteResponse","resourceKey","text","Disposable","FileRendererContent","FileRendererRefreshEnvelope","FileRendererRefreshOrigin","ResourceRef","WorkbenchModuleContext","InternalWorkbenchExtensionMetadata","WorkbenchExtensionMetadata","executeWorkbenchExtensionCommand","FileRendererRecord","NonNullable","RegisterWorkbenchExtensionFileRenderersInput","executeCommand","commandId","body","signal","AbortSignal","Promise","metadata","projectId","workbench","slotContext","input","rendererId","resource","id","kind","const","context","resourceType","type","resourceId","executeFileCommand","extra","Record","pageParams","PageParams","ext","params","renderer","invocation","placement","slot","revisionFromValue","value","undefined","revision","fileRendererRefreshEnvelopeFromCommand","response","origin","fileRendererOrigin","candidate","Partial","instanceId","operationId","fileRendererResourceKey","outcome","registerFileRenderer","record","views","registerView","title","icon","resourceKind","load","result","loadHandlerId","save","saveHandlerId","content","registerWorkbenchExtensionFileRenderers","disposables","fileRenderers","push","dispose","index","length","slotContext","text","CollectionBadgeItem","KanbanRendererRow","toWorkbenchNavigationTarget","collectionBadgeTarget","row","itemsAttributeId","itemId","extensionId","projectId","items","attributes","item","find","id","target","undefined","KanbanRendererBoardColumnConfig","WireBoardColumnConfig","WorkbenchExtensionKanbanRendererRecord","createElement","WorkbenchIcon","ReactKanbanRendererContribution","KanbanRendererContribution","WorkbenchExtensionCommandContext","Localizer","ResolveStatusOptions","BoardColumnConfig","ReturnType","NonNullable","createBoardActionIcon","icon","BoardActionIcon","props","size","name","toWorkbenchBoardColumnConfig","config","localize","color","canDragIn","canDragOut","canCreate","actions","map","action","id","label","statusSetId","record","ref","Parameters","extensionId","createStatusOptionsResolver","context","sources","Map","existing","get","source","getSnapshot","workbench","statuses","getStatuses","status","value","subscribe","listener","store","subscribeSelector","state","values","set","load","catch","undefined","statusColorConfig","attributes","groupingAttributeId","groupKey","attribute","find","candidate","type","kind","KanbanRendererBoardColumnConfig","WireBoardColumnConfig","WorkbenchExtensionKanbanRendererRecord","EnumOptions","KanbanRendererCreateField","KanbanRendererCreateFieldType","ResourceRef","ReactAttributeDescriptor","AttributeDescriptor","ReactKanbanRendererContribution","KanbanRendererContribution","WorkbenchExtensionCommandContext","createExtensionSlot","executeWorkbenchExtensionCommand","KanbanRendererRow","Awaited","ReturnType","RowAction","NonNullable","QueryResult","attributes","boardColumnConfigs","Record","rows","Localizer","value","fallback","MutableAttributeSource","source","set","UnknownDisplayReporter","attributeId","kind","ResolveStatusOptions","statuses","Extract","isQueryResult","Array","isArray","localizeAttributes","record","localize","decorate","attribute","resolveStatusOptions","reportUnknownDisplay","map","display","knownDisplay","itemsAttributeId","const","undefined","id","resolveType","type","options","option","label","base","createMutableAttributeSource","initial","snapshot","listeners","Set","signature","JSON","stringify","getSnapshot","subscribe","listener","add","delete","nextSignature","isExtensionResource","resource","Boolean","defaultResolveRowResource","_","row","defaultResolveRowActionResource","fromRow","resourceKind","title","toWorkbenchRow","resolveResource","candidate","mergeParams","items","Object","assign","filter","item","asParams","hasCommandParameters","params","keys","length","CREATE_FIELD_TYPES","ReadonlySet","toCreateField","descriptor","has","icon","optional","placeholder","multiple","accept","description","required","defaultValue","toCreateFields","entries","createRow","flatMap","field","createKanbanRendererSlot","context","projectId","kanbanRendererId","executeKanbanRendererCommand","commandId","signal","AbortSignal","pageParams","PageParams","commandResource","workbench","getPrimaryResource","renderer","rendererId","invocation","placement","slot","metadata","kanbanRendererRowActionCommandId","action","registerRowActionCommands","rowActions","target","commands","getCommand","command","registerCommand","execute","args","executionContext","runDefaultRowAction","rowId","commandPalette","requestParams","Promise","resolve","executeCommand","then","asParams","KanbanRendererBoardColumnConfig","WireBoardColumnConfig","renderBadgeListDisplay","kanbanBuiltInViews","legacyFiltersFromViewFilter","legacyOrderingFromSorts","WorkbenchExtensionKanbanRendererRecord","text","createElement","Disposable","KanbanRendererCreateSubmission","KanbanRendererQueryState","ResourceRef","WorkbenchIcon","ReactAttributeDescriptor","AttributeDescriptor","WorkbenchExtensionCommandContext","collectionBadgeTarget","WorkbenchExtensionKanbanRendererAdapter","createStatusOptionsResolver","statusColorConfig","toWorkbenchBoardColumnConfig","createMutableAttributeSource","defaultResolveRowActionResource","defaultResolveRowResource","executeKanbanRendererCommand","isQueryResult","KanbanRendererRow","Localizer","mergeParams","registerRowActionCommands","runDefaultRowAction","toCreateFields","toWorkbenchRow","mapViewToolbarActions","ColumnConfigRecord","Record","createRowActionIcon","icon","name","size","undefined","toCreateRowConfig","record","localize","createRow","title","submitLabel","fields","labels","cancel","properties","submitError","removeFile","submitWithoutOpening","toRowClick","context","adapter","resolveRowResource","row","toActivatedRow","rowActivationHandlerId","resource","onRowClick","toCreateRowHandler","runMutation","commandId","params","Promise","activateCreatedRow","contribution","submission","values","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","openCreatedRow","Partial","id","attributes","toRowContextMenuActions","resolveRowActionResource","actions","rowActions","length","map","action","runDefault","key","label","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","records","disposables","resolveLabel","value","fallback","Parameters","decorate","attribute","withBuiltInDisplay","display","kind","render","target","itemsAttributeId","extensionId","projectId","workbench","navigation","openTarget","decorateAttribute","afterMutation","onAfterMutation","then","result","resolveStatusOptions","reportUnknownDisplay","attributeId","notifications","show","level","message","wireAttributes","builtIns","columnGrouping","settings","originalRows","WeakMap","columnConfigs","latestQueryId","rowCache","Map","signature","rowResource","get","onRowActivate","push","views","registerView","body","resourceKind","toolbarActions","listRowActions","storageScope","source","defaultSettings","defaultFilter","defaultSorts","viewsProvider","createViewsProvider","defaultViews","view","defaultActiveViewId","emptyTitle","emptyDescription","hideToolbar","getBoardColumnConfig","groupKey","executeQuery","state","signal","queryId","queryHandlerId","ordering","sorts","filter","filters","pageParams","mapRows","rows","nextCache","candidate","JSON","stringify","cached","mapped","set","Array","isArray","nextAttributes","boardColumnConfigs","onAttributeChange","attributeChangeHandlerId","rowId","onMove","moveHandlerId","move","onReorder","reorderHandlerId","beforeRowId","onCreateRow","onColumnAction","columnActionHandlerId","actionId","getRowContextMenuActions","dispose","index","text","TreeContext","executeWorkbenchExtensionCommand","ExtensionTreeNode","ExtensionTreeRendererRecord","ExtensionTreeResource","RegisterWorkbenchExtensionTreeRenderersInput","slotContext","input","modeId","projectId","resource","treeId","id","kind","const","context","resourceType","type","resourceId","createQueryParams","record","ctx","node","workbench","modes","getActiveModeId","renderer","rendererId","pageParams","invocation","placement","state","filter","executeCallback","commandId","params","Record","signal","AbortSignal","slot","executeTreeActionCommand","rendererParams","metadata","TreeContext","TreeNode","InternalWorkbenchExtensionMetadata","WorkbenchExtensionMetadata","ExtensionTreeRendererRecord","ExtensionTreeViewRecord","HostTreeDefaultNodesInput","ctx","record","panel","HostTreeDefaultNodesResolver","input","Promise","ResolveHostTreeDefaultInput","treeViews","ResolveHostTreeHeaderInput","getHostTreeHeaderNodes","ResolveHostTreeFooterInput","getHostTreeFooterNodes","treeViewsFor","metadata","panels","flatMap","panelMenus","filter","renderer","kind","id","resolveTreeView","viewId","find","length","undefined","resolveHostTreeHeaderNodes","hostTreeHeader","resolveHostTreeFooterNodes","hostTreeFooter","CommandExecuteRequest","commandRefId","text","Disposable","NavigationTarget","ResourceRef","TreeAction","TreeContext","TreeNode","TreeViewSection","WorkbenchModuleContext","toWorkbenchNavigationTarget","InternalWorkbenchExtensionMetadata","WorkbenchExtensionMetadata","localizeParamSchema","createQueryParams","executeCallback","executeTreeActionCommand","ExtensionTreeAction","ExtensionTreeNode","ExtensionTreeRendererRecord","ExtensionTreeResource","ExtensionTreeSection","ExtensionTreeTarget","TargetCommandArgs","HostTreeDefaultNodesResolver","resolveHostTreeFooterNodes","resolveHostTreeHeaderNodes","treeViewsFor","RegisterWorkbenchExtensionTreeRenderersInput","executeCommand","commandId","body","Promise","getHostTreeFooterNodes","getHostTreeHeaderNodes","metadata","projectId","resolveNodeResource","resource","workbench","toActionParams","params","fallback","Record","Array","isArray","toRecordParams","undefined","createTreeMapper","input","record","originalNodes","WeakMap","runnerCommandId","id","resolveResource","resolved","mapEmptyState","section","emptyState","title","description","icon","mapTarget","target","node","ctx","commandTargetOf","commandTarget","Extract","kind","const","args","command","extensionId","nodeId","treeId","mapAction","action","resourceMutation","commands","find","label","submitLabel","when","disabled","run","actionParams","refresh","mapNode","mapped","selected","iconColor","badge","iconTooltip","tooltip","rowVariant","actions","map","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","canDrag","canDrop","set","mapSections","sections","nodes","mapNodes","isTreeSectionArray","value","every","isTreeNodeArray","hostNodeSection","length","canReorder","registerTree","mapper","treeViews","commandDisposable","registerCommand","execute","rawArgs","result","view","views","listViews","refreshView","treeDisposable","registerView","searchable","searchPlaceholder","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","hostHeader","headerHandlerId","signal","extensionHeader","getBody","bodyHandlerId","getFooter","hostFooter","footerHandlerId","extensionFooter","moveNode","moveHandlerId","source","originalSource","get","originalTarget","position","getChildren","childrenHandlerId","originalNode","dispose","registerWorkbenchExtensionTreeRenderers","disposables","treeRenderers","push","index","text","WorkbenchExtensionMetadata","NavigationTarget","ExtensionNavigationTarget","contributionRefId","text","Disposable","NavigationTreeOwner","NavigationTreeSlot","TreeNode","TreeViewSection","WorkbenchModuleContext","navigationSlotRootSectionId","toWorkbenchNavigationTarget","NavigationItem","NavigationTree","RegisterWorkbenchExtensionNavigationItemsInput","createWhenExpression","when","metadata","Pick","workbench","toOwner","ref","kind","id","extensionId","isVisible","item","expression","context","matches","toNode","label","icon","canHide","canReorder","target","action","toSections","items","sections","Map","group","undefined","slot","section","get","collapsible","Boolean","nodes","push","set","values","groupItems","groups","owner","key","defaultExpandedGroupIds","Set","flatMap","registerItems","input","navigationItems","map","first","resourceDependent","some","resourceType","length","navigationTrees","registerContribution","sourceExtensionId","declarationIndex","indexOf","defaultExpandedSectionIds","resolveResource","getSections","listActions","category","registerTrees","tree","viewId","view","idScope","resourceScope","registerWorkbenchExtensionNavigationItems","text","NavigationTarget","ExtensionNavigationTarget","commandRefId","ExtensionKeybindingRecord","WorkbenchModuleContext","toWorkbenchNavigationTarget","KeybindingPlatform","NonNullable","currentPlatform","navigator","undefined","platform","userAgent","toLowerCase","includes","resolveExtensionKeybindingChord","binding","platformOverrides","key","registerWorkbenchExtensionKeybindings","input","bindings","createWhenExpression","when","workbench","map","keybindings","registerKeybinding","sourceExtensionId","extensionId","action","commandIdOf","command","id","keybinding","WorkbenchExtensionMetadata","ContributionKind","contributionRefId","MetadataRef","extensionId","kind","id","toWorkbenchWhenExpression","when","undefined","ids","value","Array","isArray","map","ref","mode","source","viewId","view","resourceType","metadata","WorkbenchExtensionMetadata","contributionRefId","WorkbenchPageMain","WorkbenchPageSlot","InternalWorkbenchExtensionMetadata","WorkbenchExtensionTabMetadata","MetadataPage","PagePresentationInput","extensionId","placementId","createTab","metadata","pageSlot","slot","input","tab","undefined","pageMain","main","kind","toInternalWorkbenchPages","pages","map","page","id","ref","localId","title","path","document","params","modeId","mode","resource","slots","icon","parent","parentId","WorkbenchExtensionMetadata","commandRefId","contributionRefId","ParamObjectSchema","InternalWorkbenchExtensionMetadata","toWorkbenchWhenExpression","toInternalWorkbenchPages","WorkbenchExtensionTabMetadata","MetadataView","resourceKindForView","metadata","viewId","bindings","pages","flatMap","page","main","kind","resource","view","slots","slot","item","binding","push","placements","placement","find","kinds","id","viewBody","body","webview","renderer","panelMenus","owner","viewMenus","menu","views","candidate","extensionId","ownerPanelId","title","side","group","hostTreeHeader","hostTreeFooter","panels","map","menus","icon","length","undefined","commandActions","command","actions","T","action","commandId","kanbanRenderers","resourceKind","createRow","submitLabel","columnParam","params","attributesParam","labels","attachments","resourceParam","fileParam","rowActions","toolbarActions","dataTableRenderers","selectionActions","treeRenderers","fileRenderers","controlsRenderers","modes","mode","modeId","label","panelRegions","regions","regionSettings","floatingPanels","defaultTheme","chrome","Object","fromEntries","entries","region","toInternalWorkbenchExtensionMetadata","input","createTab","adaptedPanels","extensions","commands","menuContributions","commandPaletteContributions","ref","localId","order","movableTo","mountStrategy","hiddenByDefault","headerBorderBottom","tab","placementId","resourceKinds","menuSlots","external","access","resourceHierarchyProviders","record","settingsSections","settingsPanels","panel","slotId","scope","includes","const","section","commandPaletteResources","keybindings","settingsDefinitions","statuses","statusBarItems","endsWith","when","diagnostics","WorkbenchExtensionMetadata","Disposable","FileRendererRefreshEnvelope","WorkbenchModuleContext","WorkbenchExtensionRendererKind","RendererRefreshTarget","id","kind","WorkbenchExtensionRefreshEvent","RegisterWorkbenchExtensionRendererRefreshEventsInput","metadata","subscribe","listener","event","workbench","refreshWorkbenchExtensionRenderer","target","envelope","views","refreshView","undefined","rendererRefreshTargets","targets","Map","add","renderer","refreshEventIds","eventId","Set","eventTargets","get","some","push","set","view","body","registerWorkbenchExtensionRendererRefreshEvents","input","refreshOpenWorkbenchExtensionWebviews","getView","CommandExecuteRequest","NavigationTarget","WebviewCommandsExecuteParams","HostCapabilityRegistry","toWorkbenchNavigationTarget","createExtensionSlot","executeWorkbenchExtensionCommandResponse","CreateBridgeWebviewHostCapabilities","createWorkbenchWebviewHostCapabilities","ExtensionWebviewSlotKind","NonNullable","ExtensionWebviewFileCapabilities","delete","params","Promise","list","upload","ExtensionWebviewArtifactCapabilities","read","context","webviewId","CreateExtensionWebviewHostCapabilitiesInput","artifacts","executeCommand","commandId","body","extensionIdForWebview","files","projectId","slotKind","createExtensionWebviewHostCapabilities","input","base","workbench","placement","extensionId","hostEvents","request","target","Error","navigation","openTarget","resource","workspaceId","metadata","slot","id","kind","panelId","artifacts.read","WorkbenchExtensionMetadata","text","BridgeWebviewConfig","WorkbenchWebview","Extract","kind","toBridgeWebviewConfig","webview","title","undefined","runtimeUrl","moduleUrl","styles","capabilities","text","CommandExecuteRequest","HostCapabilityRegistry","text","createElement","Disposable","PreferencePropertySchema","PreferenceScope","PreferenceValue","WorkflowStatusSettings","CreateBridgeWebviewHostCapabilities","getBridgeWebviewHostEventPublisher","renderBridgeWebviewFrame","createExtensionWebviewHostCapabilities","toBridgeWebviewConfig","executeWorkbenchExtensionCommand","WorkbenchExtensionCommandContext","InternalRegisterWorkbenchExtensionContributionsInput","settingsSectionIdDefault","extensionSettingsOrderBase","statusesSettingsOrder","asPreferenceValue","value","undefined","preferenceScope","scope","withHostCapabilityOverrides","createBase","createOverrides","context","createExtensionHostCapabilities","input","slotKind","NonNullable","createWebviewHostCapabilities","artifacts","webviewArtifacts","executeCommand","extensionIdForWebview","webviewId","metadata","panels","find","panel","id","extensionId","files","webviewFiles","projectId","createWebviewHostCapabilityOverrides","registerWebviewPanels","flatMap","webview","workbench","views","registerView","title","icon","body","kind","render","renderInput","settingsPanels","some","settingsPanel","instance","panelId","viewId","renderWebview","placement","hostEvents","createHostCapabilities","createProps","createWebviewProps","resource","createTheme","createWebviewTheme","ownerId","viewMenuPlacementPriority","first","default","last","const","registerViewMenus","panelMenus","map","menu","index","viewMenus","registerViewMenu","ownerViewId","ownerPanelId","side","priority","statusResult","Array","isArray","statuses","Error","registerStatuses","records","length","settingsViewId","disposables","record","registerStatusSet","actions","action","label","query","queryHandlerId","params","save","saveHandlerId","push","settings","registerPanel","order","section","settingsSectionId","registerSettings","sectionId","getSection","registerSection","settingsSectionTitle","sections","settingsSections","sort","left","right","localeCompare","definitions","Map","settingsDefinitions","setting","key","propertiesByOwner","Record","values","properties","get","Object","create","type","enum","description","set","preferences","registerSchema","entries","slotId","text","WorkbenchExtensionMetadata","isNavigationTarget","resourceKey","text","Disposable","WorkbenchPanelTab","WorkbenchTabSnapshot","toWorkbenchNavigationTarget","executeWorkbenchExtensionCommand","RegisterWorkbenchExtensionContributionsInput","WorkbenchExtensionRefreshEvent","MetadataPlacement","MetadataPageSlot","WorkbenchExtensionTabMetadata","NonNullable","extensionId","placementId","isRecord","value","Record","Boolean","Array","isArray","navigationAction","projectId","undefined","toSnapshot","indicator","icon","String","color","label","Parameters","menu","flatMap","candidate","id","rows","row","target","action","iconColor","selected","disabled","kind","const","createWorkbenchExtensionTabPresentation","input","metadata","snapshots","Map","instances","loading","Promise","listeners","Set","refreshEvents","refreshEventIds","revision","load","instance","set","instanceId","pending","get","resource","currentRevision","pendingLoad","resolve","queryHandlerId","params","renderer","rendererId","invocation","placement","then","delete","listener","finally","getSnapshot","has","catch","subscribe","add","resourceSubscription","workbench","resources","preview","subscribeRefresh","affected","values","filter","length","all","map","refreshSubscription","subscribeRefreshEvents","event","disposable","dispose","text","WorkbenchExtensionMetadata","matchesResourceWhen","text","Disposable","WorkbenchCommandExecutionContext","workbenchCommandPaletteMenuPath","registerWorkbenchExtensionCommandPaletteResources","registerWorkbenchExtensionControlsRenderers","registerWorkbenchExtensionDataTableRenderers","buildWorkbenchExtensionCommandPaletteRegistrations","buildWorkbenchExtensionMenuRegistrations","registerWorkbenchExtensionFileRenderers","registerWorkbenchExtensionKanbanRenderers","registerWorkbenchExtensionNavigationItems","localizeParamSchema","registerWorkbenchExtensionTreeRenderers","createExtensionSlot","executeWorkbenchExtensionCommand","WorkbenchExtensionCommandContext","InternalRegisterWorkbenchExtensionContributionsInput","RegisterWorkbenchExtensionContributionsInput","registerWorkbenchExtensionKeybindings","toInternalWorkbenchExtensionMetadata","registerWorkbenchExtensionRendererRefreshEvents","registerSettings","registerStatuses","registerViewMenus","registerWebviewPanels","createWorkbenchExtensionTabPresentation","disposeAll","disposables","index","length","dispose","asParams","value","Record","Array","isArray","undefined","prepareCommandArgs","context","commandId","args","executionContext","onArgsChange","registerCommands","metadata","Pick","commands","map","command","workbench","registerCommand","id","label","title","description","params","extensionId","resourceMutation","prepareArgs","execute","resource","signal","menuCommandResource","input","getPrimaryResource","registerMenus","menuSlotsById","registrations","menuTargetsById","createWhenExpression","createMenuWhenExpression","defaultRegistrations","menuItem","menuPath","registration","menuItems","resolvedRegistrations","menuRegistrations","flatMap","targetCommandId","contribution","slot","slotId","kind","projectId","panelId","layout","registerMenuItem","registerCommandPaletteContributions","isVisible","when","type","matchesActiveMode","mode","modes","active","getActiveModeId","includes","registerStatusBarItems","statusBarItems","item","statusBar","registerItem","viewId","order","registerPages","pages","page","registerPage","registerResourceKinds","resourceKinds","resources","registerKind","icon","registerModes","registerMode","modeId","panels","panelRegions","regionSettings","floatingPanels","defaultTheme","chrome","activate","registerModePlacements","placements","placement","modePlacements","registerPlacement","registerWorkbenchExtensionContributions","sourceInput","createTab","push","bindings","keybindings","createKeybindingWhenExpression","resolveNodeResource","resolveTreeNodeResource","controlsRenderers","kanbanRenderers","kanbanAdapter","dataTableRenderers","dataTableAdapter","commandPaletteResources","createNavigationWhenExpression","subscribeRefreshEvents","subscribe","error","text","workbenchCommandPaletteMenuPath","navigationSlotRootSectionId","WorkflowStatusSettings","dataTableBuiltInViews","WorkbenchIcon","kanbanBuiltInViews","controlsQueryResultSchema","legacyFiltersFromViewFilter","filters","filter","rule","legacyOrderingFromSorts","sorts","isLocalizedString$1","value","publicCapabilityNames","WEBVIEW_HOST_CAPABILITIES","WEBVIEW_DECLARABLE_CAPABILITIES","scopedCapabilityNames","WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES","isPublicCapability","name","isScopedCapability","parseWebviewCapabilityDeclaration","nameAndScope","versionText","capability","scopeIndex","WEBVIEW_HOST_CAPABILITY_VERSION","validateDeclarationShape","parsed","unsupportedCapability","unsupportedVersion","version","undeclaredCapability","validateWebviewCapabilityDeclarations","diagnostics","allowed","allowedScopes","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","capabilities","declaration","declaredCapabilities","scopes","requestScope","params","request","createHostCapabilityGate","input","emit","diagnostic","deny","scope","handler","isRecord$1","safeStringify","json","normalizeRuntimeError","message","stack","extensionIframeAllow","collectChakraThemeVariables","computed","variables","index","resolveActiveTheme","fallback","colorMode","iframeStyle","frameShellStyle","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","extensionProps","props","iframeRef","useRef","remoteRef","initializedRef","connectedWindowRef","propsRef","themeRef","theme","capabilitiesRef","hostEventsRef","hostEvents","declaredCapabilitiesRef","view","onReadyRef","onReady","onErrorRef","onError","onDiagnosticsRef","onDiagnostics","frameEpoch","setFrameEpoch","useState","useEffect","iframe","onFrameLoad","epoch","removeLoadListener","stylesAtConnect","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","payload","connection","host","remote","conn","error","remote_0","message_0","frame","observer","options","title","EXTENSION_HOST_LOG_PREFIX","logExtensionHostDiagnostic","createWebviewDiagnostics","log","write","createHostEventPublisher","sink","pending","disconnectListeners","next","listener","BridgeWebviewFrame","$","c","frameProps","workbench","pageState","setPageState","t0","state","t1","t2","t3","page","resolvePageParams","t4","pageProps","setError","t5","t6","Center","Stack","Text","t7","t8","t9","t10","nextError","t11","t12","Box","TERMINAL_SESSION_EVENT_SCOPE","createTerminalSessionCapability","operation","terminal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","sessionId","exit","createWebviewPreferencesCapabilities","registry","owner","registered","schema","stored","dispatchDocumentKeyboardEvent","event","createWorkbenchWebviewHostCapabilities","patch","notification","createLightTheme","hostEventPublishersByWorkbench","getBridgeWebviewHostEventPublisher","hostEventsByWidget","key","instance","renderBridgeWebviewFrame","ownerId","context","webview","createProps","createTheme","createHostCapabilities","text$1","toCommandTarget","override","target","command","extensionId","toWorkbenchNavigationTarget","isNavigationTarget","qualifyNavigationTarget","item","unwrapCommandValue","response","result","runResourceMutation","mutation","persist","id","execution","resource","rawLabel","preview","createExtensionSlot","executeWorkbenchExtensionCommandResponse","commandId","outcome","executeWorkbenchExtensionCommand","candidate","isProviderQueryResult","commandIdOf","activateTarget","record","targetResource","step","toResult","groupLabel","registerWorkbenchExtensionCommandPaletteResources","disposables","records","activeResource","localize$1","registerControlsRenderer","slot","run","pageParams","adapter","signal","fields","issue","registerWorkbenchExtensionControlsRenderers","localizeParamSchema","descriptor","localizeOptionSource","ownerExtensionId","localize","source","commandRefId","mapViewToolbarActions","action","toColumn","column","createElement","isQueryResult$1","toRow","row","registerRenderer","builtIns","originalRows","modeId","rows","mapped","registerWorkbenchExtensionDataTableRenderers","placementOrder","emptyWorkbenchExtensionMetadata","defaultWorkbenchExtensionCommandId","contribution","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","text","isLocalizedString","createMenuItem","resolveString","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","registrations","unresolved","metadata","menuTargetsById","menuSlotsById","createCommandId","createWhenExpression","buildWorkbenchExtensionCommandPaletteRegistrations","slotContext$1","executeFileCommand","ext","extra","revisionFromValue","revision","fileRendererRefreshEnvelopeFromCommand","body","origin","resourceKey","registerFileRenderer","registerWorkbenchExtensionFileRenderers","collectionBadgeTarget","itemsAttributeId","itemId","createBoardActionIcon","icon","toWorkbenchBoardColumnConfig","config","statusSetId","ref","createStatusOptionsResolver","sources","existing","status","statusColorConfig","attribute","attributes","groupingAttributeId","groupKey","isQueryResult","localizeAttributes","display","knownDisplay","reportUnknownDisplay","resolveType","type","resolveStatusOptions","option","decorate","createMutableAttributeSource","snapshot","initial","listeners","signature","nextSignature","isExtensionResource","defaultResolveRowResource","defaultResolveRowActionResource","fromRow","toWorkbenchRow","resolveResource","mergeParams","items","asParams$1","hasCommandParameters","CREATE_FIELD_TYPES","toCreateField","optional","toCreateFields","field","createKanbanRendererSlot","executeKanbanRendererCommand","commandResource","kanbanRendererRowActionCommandId","registerRowActionCommands","args","executionContext","runDefaultRowAction","label","createRowActionIcon","toCreateRowConfig","toRowClick","resolveRowResource","toActivatedRow","toCreateRowHandler","submission","created","runMutation","activateCreatedRow","toRowContextMenuActions","actions","resolveRowActionResource","runDefault","registerWorkbenchExtensionKanbanRenderers","withBuiltInDisplay","renderBadgeListDisplay","afterMutation","attributeId","kind","wireAttributes","columnGrouping","columnConfigs","latestQueryId","rowCache","rowResource","onRowActivate","queryId","mapRows","nextCache","cached","nextAttributes","move","slotContext","createQueryParams","ctx","node","executeCallback","renderer","executeTreeActionCommand","treeViewsFor","panel","resolveTreeView","panels","resolveHostTreeHeaderNodes","treeViews","getHostTreeHeaderNodes","resolveHostTreeFooterNodes","getHostTreeFooterNodes","toActionParams","toRecordParams","createTreeMapper","originalNodes","runnerCommandId","mapEmptyState","section","mapTarget","commandTarget","mapAction","actionParams","mapNode","child","nodes","sections","isTreeSectionArray","isTreeNodeArray","hostNodeSection","registerTree","mapper","commandDisposable","rawArgs","treeDisposable","hostHeader","extensionHeader","hostFooter","originalSource","originalTarget","originalNode","registerWorkbenchExtensionTreeRenderers","toOwner","contributionRefId","isVisible","expression","toNode","toSections","groupItems","groups","defaultExpandedGroupIds","registerItems","first","resourceDependent","registerTrees","viewId","tree","declarationIndex","registerWorkbenchExtensionNavigationItems","currentPlatform","platform","resolveExtensionKeybindingChord","binding","registerWorkbenchExtensionKeybindings","toWorkbenchWhenExpression","when","ids","pageSlot","pageMain","main","toInternalWorkbenchPages","resourceKindForView","bindings","placement","viewBody","panelMenus","menu","menus","commandActions","kanbanRenderers","dataTableRenderers","treeRenderers","fileRenderers","controlsRenderers","modes","mode","region","toInternalWorkbenchExtensionMetadata","adaptedPanels","refreshWorkbenchExtensionRenderer","envelope","rendererRefreshTargets","targets","add","eventId","eventTargets","registerWorkbenchExtensionRendererRefreshEvents","refreshOpenWorkbenchExtensionWebviews","createExtensionWebviewHostCapabilities","toBridgeWebviewConfig","settingsSectionIdDefault","extensionSettingsOrderBase","statusesSettingsOrder","asPreferenceValue","preferenceScope","withHostCapabilityOverrides","createOverrides","createBase","createExtensionHostCapabilities","webviewId","registerWebviewPanels","slotKind","settingsPanel","renderInput","viewMenuPlacementPriority","registerViewMenus","statusResult","registerStatuses","settingsViewId","registerSettings","sectionId","left","right","definitions","setting","propertiesByOwner","properties","isRecord","navigationAction","toSnapshot","indicator","projectId","createWorkbenchExtensionTabPresentation","snapshots","instances","loading","refreshEvents","load","currentRevision","pendingLoad","resourceSubscription","affected","refreshSubscription","disposeAll","asParams","prepareCommandArgs","onArgsChange","registerCommands","menuCommandResource","registerMenus","defaultRegistrations","registration","menuPath","menuItem","registerCommandPaletteContributions","matchesResourceWhen","matchesActiveMode","active","registerStatusBarItems","registerPages","registerResourceKinds","registerModes","registerModePlacements","registerWorkbenchExtensionContributions","sourceInput"],"sources":["../../pstdio-api-contracts/src/extensions/collection-view-legacy.ts","../../pstdio-api-contracts/src/extension-kernel/l10n.ts","../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/iframe-permissions.ts","../../pstdio-extensions/src/bridge/host/theme.ts","../../pstdio-extensions/src/bridge/host/extension-frame.tsx","../../pstdio-extensions/src/bridge/host/host-diagnostics.ts","../../pstdio-extensions/src/bridge/host/host-event-publisher.ts","../src/extensions/bridge/bridge-webview-frame.tsx","../src/extensions/bridge/terminal-session-capability.ts","../src/extensions/bridge/webview-preferences-capability.ts","../src/extensions/bridge/webview-host-capabilities.ts","../src/extensions/bridge/bridge-webview-renderer.tsx","../../pstdio-extensions/src/workbench/shared/localization.ts","../src/extensions/host/extension-navigation-target.ts","../src/extensions/host/command-response.ts","../src/extensions/host/workbench-resource-mutation.ts","../src/extensions/host/workbench-extension-command.ts","../src/extensions/contributions/command-palette-resource-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.ts","../src/extensions/contributions/param-schema-localization.ts","../src/extensions/contributions/view-toolbar-actions.ts","../src/extensions/contributions/data-table-renderer-contributions.ts","../src/extensions/contributions/extension-contributions.ts","../src/extensions/contributions/file-renderer-contributions.ts","../src/extensions/contributions/collection-badge-navigation.ts","../src/extensions/contributions/kanban-renderer-board-config.ts","../src/extensions/contributions/kanban-renderer-contribution-helpers.ts","../src/extensions/contributions/kanban-renderer-contributions.ts","../src/extensions/contributions/tree-renderer-callbacks.ts","../src/extensions/contributions/tree-renderer-host-defaults.ts","../src/extensions/contributions/tree-renderer-contributions.ts","../src/extensions/contributions/navigation-item-contributions.ts","../src/extensions/host/workbench-extension-keybindings.ts","../src/extensions/host/workbench-extension-metadata-ref.ts","../src/extensions/host/workbench-extension-page-metadata.ts","../src/extensions/host/workbench-extension-metadata-adapter.ts","../src/extensions/host/workbench-extension-refresh.ts","../src/extensions/bridge/webview-command-capabilities.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/host/workbench-extension-surfaces.ts","../src/extensions/host/workbench-extension-tab-presentation.ts","../src/extensions/host/workbench-extension-host.ts"],"sourcesContent":["// Converts the deprecated kanban view fields (`filters`, `defaultFilters`, `settings.ordering`).\n// Remove this file with them in the next breaking extension API release.\nimport type {\n KanbanRendererContribution,\n KanbanRendererFilterState,\n KanbanRendererSettings,\n ViewFieldKind,\n ViewFilterGroup,\n ViewFilterRule,\n ViewSort,\n} from \"../extension-kernel/types\";\n\ntype FieldKinds = Partial<Record<string, ViewFieldKind>>;\ntype Ordering = KanbanRendererSettings[\"ordering\"];\n\n/** Deprecated filter maps use exact membership, with OR within each field's selected values. */\nexport const legacyRuleFor = (\n attributeId: string,\n values: string[],\n kind: ViewFieldKind | undefined,\n): ViewFilterRule => ({\n attributeId,\n condition: kind === \"enum-multi\" ? \"has-any-of\" : \"is-any-of\",\n value: [...values],\n});\n\nexport const viewFilterFromLegacyFilters = (\n filters: KanbanRendererFilterState | undefined,\n kinds: FieldKinds = {},\n): ViewFilterGroup => ({\n conjunction: \"and\",\n rules: Object.entries(filters ?? {}).flatMap(([attributeId, values]) => {\n const rule = values.length > 0 ? legacyRuleFor(attributeId, values, kinds[attributeId]) : undefined;\n return rule ? [rule] : [];\n }),\n});\n\nexport const viewSortsFromLegacyOrdering = (ordering: Ordering | undefined): ViewSort[] =>\n !ordering || ordering.attributeId === \"manual\"\n ? []\n : [{ attributeId: ordering.attributeId, direction: ordering.direction }];\n\n/**\n * Root \"any of\" rules joined by \"and\" are each necessary, so narrowing a query by one of them never\n * drops a row the view shows. Every other rule is left to the renderer.\n */\nexport const legacyFiltersFromViewFilter = (filter: ViewFilterGroup) => {\n const filters: KanbanRendererFilterState = {};\n if (filter.conjunction !== \"and\") return filters;\n for (const rule of filter.rules) {\n if (filters[rule.attributeId]) continue;\n if (rule.condition !== \"is-any-of\" && rule.condition !== \"has-any-of\") continue;\n if (Array.isArray(rule.value) && rule.value.length > 0) filters[rule.attributeId] = [...rule.value];\n }\n return filters;\n};\n\nexport const legacyOrderingFromSorts = (sorts: ViewSort[]): Ordering =>\n sorts[0] ? { ...sorts[0] } : { attributeId: \"manual\", direction: \"asc\" };\n\ntype KanbanViewDefaults = Pick<\n KanbanRendererContribution,\n \"attributes\" | \"defaultSettings\" | \"defaultFilter\" | \"defaultFilters\" | \"defaultSorts\" | \"defaultViews\"\n>;\n\n/** Reads a contribution's view defaults once, so hosts only ever see `filter` and `sorts`. */\nexport const normalizeKanbanViewDefaults = (body: KanbanViewDefaults) => {\n const kinds: FieldKinds = Object.fromEntries((body.attributes ?? []).map((field) => [field.id, field.type.kind]));\n const { ordering, ...defaultSettings } = body.defaultSettings ?? {};\n return {\n defaultSettings,\n defaultFilter: body.defaultFilter ?? viewFilterFromLegacyFilters(body.defaultFilters, kinds),\n defaultSorts: body.defaultSorts ?? viewSortsFromLegacyOrdering(ordering),\n defaultViews: body.defaultViews?.map(({ filters, settings, ...view }) => {\n const { ordering: viewOrdering, ...viewSettings } = settings;\n return {\n ...view,\n settings: viewSettings,\n filter: view.filter ?? viewFilterFromLegacyFilters(filters, kinds),\n sorts: view.sorts ?? viewSortsFromLegacyOrdering(viewOrdering),\n };\n }),\n };\n};\n","export interface LocalizedString {\n readonly $l10n: string;\n readonly default?: string;\n}\n\nexport type Localizable<T extends string = string> = T | LocalizedString;\n\nexport const l10n = (key: string, defaultValue?: string) => ({\n $l10n: key,\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n});\n\nexport const isLocalizedString = (value: unknown): value is LocalizedString =>\n typeof value === \"object\" &&\n value !== null &&\n \"$l10n\" in value &&\n typeof (value as { $l10n?: unknown }).$l10n === \"string\";\n","import {\n ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n WEBVIEW_DECLARABLE_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITY_VERSION,\n WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES,\n type WebviewHostCapability,\n type WebviewScopedDeclarableCapability,\n} from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRequest } from \"./index\";\n\nexport {\n ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n WEBVIEW_DECLARABLE_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITY_VERSION,\n WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES,\n type WebviewDeclarableCapability,\n type WebviewHostCapability,\n type WebviewScopedDeclarableCapability,\n} from \"@pstdio/sdk/extensions\";\n\nexport type WebviewCapabilityDiagnosticCode =\n | \"undeclared_webview_capability\"\n | \"unsupported_webview_capability\"\n | \"unsupported_webview_capability_version\";\n\nexport interface WebviewCapabilityDiagnostic {\n capability: string;\n code: WebviewCapabilityDiagnosticCode;\n message: string;\n severity: \"error\";\n}\n\nexport type HostCapability<TParams = unknown, TResult = unknown> = (params: TParams) => Promise<TResult> | TResult;\nexport type HostCapabilityRegistry = Partial<Record<WebviewHostCapability, HostCapability>>;\n\ninterface CreateHostCapabilityGateInput {\n capabilities: HostCapabilityRegistry;\n declaredCapabilities?: readonly string[];\n onDiagnostic?: (diagnostic: WebviewCapabilityDiagnostic) => void;\n}\n\nconst publicCapabilityNames = new Set<string>([...WEBVIEW_HOST_CAPABILITIES, ...WEBVIEW_DECLARABLE_CAPABILITIES]);\nconst scopedCapabilityNames = new Set<string>(WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability | \"clipboard.write\" =>\n publicCapabilityNames.has(name);\n\nconst isScopedCapability = (name: string): name is WebviewScopedDeclarableCapability => scopedCapabilityNames.has(name);\n\nexport const parseWebviewCapabilityDeclaration = (capability: string) => {\n const [nameAndScope = \"\", versionText] = capability.split(\"@\");\n const scopeIndex = nameAndScope.indexOf(\":\");\n const name = scopeIndex === -1 ? nameAndScope : nameAndScope.slice(0, scopeIndex);\n const scope = scopeIndex === -1 ? undefined : nameAndScope.slice(scopeIndex + 1);\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name, scope, version };\n};\n\n// A scoped capability needs `name:scope`; every other capability must stay bare.\nconst validateDeclarationShape = (parsed: ReturnType<typeof parseWebviewCapabilityDeclaration>) => {\n if (isScopedCapability(parsed.name)) return Boolean(parsed.scope);\n return parsed.scope === undefined;\n};\n\nconst unsupportedCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability\",\n message: `Unsupported webview capability: ${capability}`,\n severity: \"error\",\n});\n\nconst unsupportedVersion = (capability: string, name: string, version: number): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability_version\",\n message: `Unsupported webview capability version: ${name}@${version.toString()} (supported: ${WEBVIEW_HOST_CAPABILITY_VERSION.toString()})`,\n severity: \"error\",\n});\n\nconst undeclaredCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"undeclared_webview_capability\",\n message: `Webview did not declare host capability: ${capability}`,\n severity: \"error\",\n});\n\nexport const validateWebviewCapabilityDeclarations = (\n declaredCapabilities: readonly string[] | undefined,\n capabilities: HostCapabilityRegistry = {},\n) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n const allowed = new Set<WebviewHostCapability>();\n const allowedScopes = new Map<WebviewHostCapability, Set<string>>();\n\n // Always-available capabilities never need a declaration — enable them wherever the\n // host implements them.\n for (const name of ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES) {\n if (capabilities[name]) allowed.add(name);\n }\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseWebviewCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name) || !validateDeclarationShape(parsed)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n continue;\n }\n // Browser permissions are delegated by the iframe, not routed through the bridge.\n if (parsed.name === \"clipboard.write\") continue;\n if (!capabilities[parsed.name as WebviewHostCapability]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.scope === undefined) {\n allowed.add(parsed.name as WebviewHostCapability);\n continue;\n }\n const scopes = allowedScopes.get(parsed.name) ?? new Set<string>();\n scopes.add(parsed.scope);\n allowedScopes.set(parsed.name, scopes);\n }\n\n return { allowed, allowedScopes, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseWebviewCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name) || !validateDeclarationShape(parsed)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n }\n }\n\n return diagnostics;\n};\n\n// Scoped capabilities carry their grant in the params: artifacts.read names the\n// mount it reads. The gate compares that value against the declared scopes.\nconst requestScope = (request: HostCapabilityRequest) => {\n const params = request.params as { mount?: unknown } | undefined;\n return typeof params?.mount === \"string\" && params.mount.length > 0 ? params.mount : undefined;\n};\n\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, allowedScopes, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n const deny = (diagnostic: WebviewCapabilityDiagnostic) => {\n emit(diagnostic);\n return new Error(diagnostic.message);\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method) || request.method === \"clipboard.write\")\n throw deny(unsupportedCapability(request.method));\n\n if (isScopedCapability(request.method)) {\n const scope = requestScope(request);\n if (!scope) throw deny(unsupportedCapability(request.method));\n // The denial names the exact declaration the webview is missing.\n if (!allowedScopes.get(request.method)?.has(scope)) {\n throw deny(undeclaredCapability(`${request.method}:${scope}`));\n }\n } else if (!allowed.has(request.method)) {\n throw deny(undeclaredCapability(request.method));\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) throw deny(unsupportedCapability(request.method));\n\n return await handler(request.params);\n },\n };\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","export const extensionIframeAllow = (capabilities: readonly string[] = []) =>\n capabilities.some((capability) => capability === \"clipboard.write\" || capability === \"clipboard.write@1\")\n ? \"fullscreen; clipboard-write\"\n : \"fullscreen\";\n","import type { ThemePreference } from \"../contract\";\n\nexport const collectChakraThemeVariables = () => {\n if (typeof document === \"undefined\") return {};\n\n const computed = getComputedStyle(document.documentElement);\n const variables: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) {\n const name = computed.item(index);\n if (name.startsWith(\"--chakra-\")) {\n variables[name] = computed.getPropertyValue(name).trim();\n }\n }\n return variables;\n};\n\nexport const resolveActiveTheme = (fallback: ThemePreference): ThemePreference => {\n if (typeof document === \"undefined\") return fallback;\n const value = document.documentElement.getAttribute(\"data-theme\");\n if (value === \"dark\" || value === \"light\") return value;\n\n const colorMode = document.documentElement.getAttribute(\"data-color-mode\");\n return colorMode === \"dark\" || colorMode === \"light\" ? colorMode : fallback;\n};\n\nexport const postThemeToFrame = (\n iframe: HTMLIFrameElement | null,\n theme: ThemePreference,\n variables: Record<string, string>,\n) => {\n iframe?.contentWindow?.postMessage({ type: \"pstdio.theme\", theme, variables }, \"*\");\n};\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { host } from \"rimless\";\nimport type {\n ExtensionViewDescriptor,\n HostCapabilityRegistry,\n HostCapabilityRequest,\n HostEventMessage,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"../contract\";\nimport { createHostCapabilityGate } from \"../contract\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\nimport type { HostEventPublisher } from \"./host-event-publisher\";\nimport { extensionIframeAllow } from \"./iframe-permissions\";\nimport { collectChakraThemeVariables, resolveActiveTheme } from \"./theme\";\n\nexport interface ExtensionFrameProps {\n view: ExtensionViewDescriptor;\n props: unknown;\n theme: ThemePreference;\n capabilities?: HostCapabilityRegistry;\n /** Publisher whose emitted events are forwarded into the guest once connected. */\n hostEvents?: HostEventPublisher;\n onReady?: () => void;\n /** Reports a load or runtime failure. The frame draws no error UI; the caller shows the failure once. */\n onError?: (error: { message: string; stack?: string }) => void;\n onDiagnostics?: (diagnostics: WebviewCapabilityDiagnostic[]) => void;\n title?: string;\n}\n\ntype GuestRemote = {\n init: (message: {\n moduleUrl: string;\n styles: string[];\n props: unknown;\n theme: ThemePreference;\n themeVariables: Record<string, string>;\n extensionId: string;\n }) => Promise<void>;\n themeUpdate: (message: { theme: ThemePreference; variables: Record<string, string> }) => void;\n propsUpdate: (message: { props: unknown }) => void;\n hostEvent?: (message: HostEventMessage) => void;\n};\n\nconst iframeStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n flex: \"1 1 0%\",\n height: \"100%\",\n minHeight: 0,\n width: \"100%\",\n};\n\nconst frameShellStyle: CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n minHeight: 0,\n position: \"relative\",\n width: \"100%\",\n};\n\nexport const EXTENSION_IFRAME_SANDBOX = \"allow-scripts allow-forms allow-popups\";\n\nexport const ExtensionFrame = (props: ExtensionFrameProps) => {\n const {\n view,\n props: extensionProps,\n theme,\n capabilities,\n hostEvents,\n onReady,\n onError,\n onDiagnostics,\n title,\n } = props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const remoteRef = useRef<GuestRemote | null>(null);\n const initializedRef = useRef(false);\n // The connection belongs to one browsing context. Navigation keeps the iframe's\n // WindowProxy, so a different contentWindow means the runtime document is gone.\n const connectedWindowRef = useRef<Window | null>(null);\n const propsRef = useRef(extensionProps);\n const themeRef = useRef(theme);\n const capabilitiesRef = useRef(capabilities);\n const hostEventsRef = useRef(hostEvents);\n const declaredCapabilitiesRef = useRef(view.webview.capabilities);\n const onReadyRef = useRef(onReady);\n const onErrorRef = useRef(onError);\n const onDiagnosticsRef = useRef(onDiagnostics);\n // Bumped when the browser reloads the iframe (e.g. a DOM reparent while the Side\n // Panel floats). The bump remounts a fresh iframe so a single clean connection\n // owns the new browsing context.\n const [frameEpoch, setFrameEpoch] = useState(0);\n\n propsRef.current = extensionProps;\n themeRef.current = theme;\n capabilitiesRef.current = capabilities;\n hostEventsRef.current = hostEvents;\n declaredCapabilitiesRef.current = view.webview.capabilities;\n onReadyRef.current = onReady;\n onErrorRef.current = onError;\n onDiagnosticsRef.current = onDiagnostics;\n\n // Connect once per browsing context. React StrictMode dev double-mount and parent\n // re-renders with unstable prop references (e.g. `webview.styles` rebuilt by `.map`)\n // would otherwise tear down the live connection while the iframe keeps its state,\n // leaving guest-to-host RPCs with no listener.\n // biome-ignore lint/correctness/useExhaustiveDependencies: frameEpoch remounts the iframe this effect reads through iframeRef.\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n // Reinserting the iframe (a DOM move without moveBefore, or StrictMode's dev-only\n // remount of a moved host) replaces its browsing context with about:blank because\n // the src attribute is empty. This can happen before the runtime finishes loading,\n // so compare browsing contexts instead of counting loads. Remount a fresh iframe\n // and connection when the context changed.\n const onFrameLoad = () => {\n if (iframe.contentWindow !== connectedWindowRef.current) setFrameEpoch((epoch) => epoch + 1);\n };\n iframe.addEventListener(\"load\", onFrameLoad);\n const removeLoadListener = () => iframe.removeEventListener(\"load\", onFrameLoad);\n\n if (iframe.contentWindow === connectedWindowRef.current) return removeLoadListener;\n connectedWindowRef.current = iframe.contentWindow;\n\n // Snapshot styles at connect time so subsequent parent re-renders that produce a\n // new array reference don't affect what we send in init.\n const stylesAtConnect = view.webview.styles;\n const moduleUrlAtConnect = view.webview.moduleUrl;\n\n const reportDiagnostics = (diagnostics: WebviewCapabilityDiagnostic[]) => {\n if (diagnostics.length > 0) onDiagnosticsRef.current?.(diagnostics);\n };\n\n const createCapabilityGate = () =>\n createHostCapabilityGate({\n capabilities: capabilitiesRef.current ?? {},\n declaredCapabilities: declaredCapabilitiesRef.current,\n onDiagnostic: (diagnostic) => reportDiagnostics([diagnostic]),\n });\n\n reportDiagnostics(createCapabilityGate().diagnostics);\n\n const hostApi = {\n ready: () => {\n // no-op; init fires from host.connect().then() below.\n },\n runtimeError: (payload: { message: string; stack?: string }) => {\n onErrorRef.current?.(payload);\n },\n call: async (request: HostCapabilityRequest) => {\n return await createCapabilityGate().call(request);\n },\n };\n\n const connect = () => {\n initializedRef.current = false;\n remoteRef.current = null;\n\n const connection = host.connect(iframe, hostApi);\n // A sandboxed iframe without allow-same-origin posts messages with origin \"null\".\n // Leaving the iframe src attribute empty lets rimless validate the guest by\n // contentWindow identity while still loading the API-owned runtime document.\n iframe.contentWindow?.location.replace(view.webview.runtimeUrl);\n\n connection\n .then(async (conn) => {\n if (iframeRef.current !== iframe) return;\n const remote = conn.remote as GuestRemote;\n remoteRef.current = remote;\n hostEventsRef.current?.bind((message) => remote.hostEvent?.(message));\n\n await remote.init({\n moduleUrl: moduleUrlAtConnect,\n styles: stylesAtConnect,\n props: propsRef.current,\n theme: resolveActiveTheme(themeRef.current),\n themeVariables: collectChakraThemeVariables(),\n extensionId: view.extensionId,\n });\n if (iframeRef.current !== iframe) return;\n initializedRef.current = true;\n onReadyRef.current?.();\n })\n .catch((error) => {\n if (iframeRef.current !== iframe) return;\n onErrorRef.current?.(normalizeRuntimeError(error));\n });\n };\n\n connect();\n\n // Intentionally no connection.close() in cleanup. The iframe runtime handshakes once\n // at iframe load and binds to that connection ID. Closing during React StrictMode's\n // dev-only cleanup would leave the live iframe with no host listener.\n return removeLoadListener;\n }, [frameEpoch, view.extensionId, view.webview.runtimeUrl, view.webview.moduleUrl, view.webview.styles]);\n\n // Re-renders may hand the frame a fresh publisher (renderers rebuild their\n // capability context per render); route it to the live connection.\n useEffect(() => {\n const remote = remoteRef.current;\n if (!remote || !hostEvents) return;\n hostEvents.bind((message) => remote.hostEvent?.(message));\n // Release the sink so a replaced publisher stops referencing this remote\n // and returns to buffering.\n return () => hostEvents.unbind();\n }, [hostEvents]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.propsUpdate({ props: extensionProps });\n }, [extensionProps]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(theme),\n variables: collectChakraThemeVariables(),\n });\n }, [theme]);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof MutationObserver === \"undefined\") return;\n\n let frame: number | null = null;\n const schedule = () => {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = null;\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(themeRef.current),\n variables: collectChakraThemeVariables(),\n });\n });\n };\n\n const observer = new MutationObserver(schedule);\n const options = { attributeFilter: [\"class\", \"data-color-mode\", \"data-theme\", \"style\"], attributes: true };\n observer.observe(document.documentElement, options);\n observer.observe(document.body, options);\n\n return () => {\n observer.disconnect();\n if (frame !== null) cancelAnimationFrame(frame);\n };\n }, []);\n\n return (\n <div style={frameShellStyle}>\n <iframe\n // A new runtime or module needs its own browsing context and bridge handshake.\n key={`${frameEpoch}\\n${view.webview.runtimeUrl}\\n${view.webview.moduleUrl}`}\n ref={iframeRef}\n title={title ?? view.label}\n allow={extensionIframeAllow(view.webview.capabilities)}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n // Match the host theme so the empty/loading iframe paints the right canvas\n // instead of flashing the default light background while the guest connects.\n style={{ ...iframeStyle, colorScheme: theme }}\n onError={() => {\n onErrorRef.current?.({ message: `Failed to load extension runtime at ${view.webview.runtimeUrl}` });\n }}\n />\n </div>\n );\n};\n","import type { WebviewCapabilityDiagnostic } from \"../contract\";\n\nexport const EXTENSION_HOST_LOG_PREFIX = \"[pstdio.extension-host] \";\n\nexport interface ExtensionHostDiagnostic {\n event: \"webview-ready\" | \"webview-error\" | \"webview-diagnostic\" | \"registration-ready\" | \"registration-error\";\n extensionId?: string;\n contributionId?: string;\n projectId?: string;\n code?: string;\n capability?: string;\n message?: string;\n stack?: string;\n}\n\nexport const logExtensionHostDiagnostic = (diagnostic: ExtensionHostDiagnostic, write = console.info) => {\n write(`${EXTENSION_HOST_LOG_PREFIX}${JSON.stringify(diagnostic)}`);\n};\n\nexport const createWebviewDiagnostics = (\n view: { extensionId: string; id: string },\n write?: (message: string) => void,\n) => {\n const log = (diagnostic: ExtensionHostDiagnostic) =>\n logExtensionHostDiagnostic({ extensionId: view.extensionId, contributionId: view.id, ...diagnostic }, write);\n return {\n onReady: () => log({ event: \"webview-ready\" }),\n onError: (error: { message: string; stack?: string }) => log({ event: \"webview-error\", ...error }),\n onDiagnostics: (diagnostics: WebviewCapabilityDiagnostic[]) => {\n for (const diagnostic of diagnostics) log({ event: \"webview-diagnostic\", ...diagnostic });\n },\n };\n};\n","import type { HostEventMessage } from \"../contract\";\n\n/**\n * Host-side fan-in for events pushed into one guest webview. Capability\n * implementations `emit` while the frame owns the transport: events emitted\n * before the guest connection is up are buffered and flushed on `bind`.\n */\nexport interface HostEventPublisher {\n emit(message: HostEventMessage): void;\n bind(sink: (message: HostEventMessage) => void): void;\n onDisconnect(listener: () => void): () => void;\n /** Drop the current sink and return to buffering until the next bind. */\n unbind(): void;\n}\n\nexport const createHostEventPublisher = (): HostEventPublisher => {\n let sink: ((message: HostEventMessage) => void) | null = null;\n const pending: HostEventMessage[] = [];\n const disconnectListeners = new Set<() => void>();\n\n return {\n emit(message) {\n if (sink) sink(message);\n else pending.push(message);\n },\n bind(next) {\n sink = next;\n while (pending.length > 0) next(pending.shift() as HostEventMessage);\n },\n onDisconnect(listener) {\n disconnectListeners.add(listener);\n return () => disconnectListeners.delete(listener);\n },\n unbind() {\n sink = null;\n for (const listener of disconnectListeners) listener();\n },\n };\n};\n","import { Box, Center, Stack, Text } from \"@chakra-ui/react\";\nimport { resolvePageParams } from \"@pstdio/sdk/extensions\";\nimport { createWebviewDiagnostics, ExtensionFrame, type ExtensionFrameProps } from \"pstdio-extensions/bridge/host\";\nimport { useEffect, useState } from \"react\";\nimport type { WorkbenchCore } from \"../../core\";\n\ntype BridgeWebviewFrameProps = Omit<ExtensionFrameProps, \"onDiagnostics\" | \"onError\" | \"onReady\"> & {\n workbench: WorkbenchCore;\n};\n\n/** A bridged webview that shows one failure message, in theme colors, when it cannot load. */\nexport const BridgeWebviewFrame = (props: BridgeWebviewFrameProps) => {\n const { view, workbench, ...frameProps } = props;\n const [pageState, setPageState] = useState(workbench.pages.store.getState);\n useEffect(() => workbench.pages.store.subscribe((state) => setPageState(state)), [workbench]);\n const page = pageState.activePageId ? workbench.pages.getPage(pageState.activePageId) : undefined;\n const pageProps = {\n pageLocation: pageState.location,\n pageParams: resolvePageParams(page?.params, pageState.location?.params),\n };\n const [error, setError] = useState<string | null>(null);\n const diagnostics = createWebviewDiagnostics(view);\n\n return (\n <Box position=\"relative\" width=\"100%\" height=\"100%\" minH=\"0\" display=\"flex\" flexDirection=\"column\">\n {error ? (\n <Center position=\"absolute\" inset=\"0\" px=\"md\" zIndex={1} bg=\"bg\">\n <Stack gap=\"xs\" maxW=\"md\" textAlign=\"center\">\n <Text textStyle=\"paragraph/S/medium\" color=\"fg.error\">\n Extension view failed to load.\n </Text>\n <Text textStyle=\"paragraph/XS/regular\" color=\"fg.muted\">\n {error}\n </Text>\n </Stack>\n </Center>\n ) : null}\n <ExtensionFrame\n view={view}\n {...frameProps}\n props={{ ...(frameProps.props as object), ...pageProps }}\n onReady={() => {\n diagnostics.onReady();\n setError(null);\n }}\n onDiagnostics={diagnostics.onDiagnostics}\n onError={(nextError) => {\n diagnostics.onError(nextError);\n setError(nextError.message);\n }}\n />\n </Box>\n );\n};\n","import type { TerminalHostEvent, TerminalSessionOperation, TerminalSessionResult } from \"@pstdio/sdk/api\";\nimport type { HostCapability } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { WorkbenchTerminalController } from \"../../core\";\n\nexport const TERMINAL_SESSION_EVENT_SCOPE = \"terminal.session\";\n\ninterface CreateTerminalSessionCapabilityInput {\n terminal: WorkbenchTerminalController;\n hostEvents: HostEventPublisher;\n}\n\n/**\n * Host side of the `terminal.session` webview capability. Sessions live in the\n * workbench terminal controller; only serializable operation payloads and session\n * ids cross the webview boundary. Output/exit events flow through the host event\n * publisher under the `terminal.session` scope.\n */\nexport const createTerminalSessionCapability = (input: CreateTerminalSessionCapabilityInput): HostCapability => {\n const { terminal, hostEvents } = input;\n\n const emit = (payload: TerminalHostEvent) => {\n hostEvents.emit({ scope: TERMINAL_SESSION_EVENT_SCOPE, payload });\n };\n\n return async (params) => {\n const operation = params as TerminalSessionOperation;\n\n switch (operation.operation) {\n case \"open\": {\n const { sessionId } = await terminal.open({ request: operation.request });\n return { operation: \"open\", sessionId } satisfies TerminalSessionResult;\n }\n case \"write\":\n terminal.write({ sessionId: operation.sessionId, data: operation.data });\n return { operation: \"write\", accepted: true } satisfies TerminalSessionResult;\n case \"resize\":\n terminal.resize({ sessionId: operation.sessionId, cols: operation.cols, rows: operation.rows });\n return { operation: \"resize\", accepted: true } satisfies TerminalSessionResult;\n case \"kill\":\n await terminal.kill({ sessionId: operation.sessionId, signal: operation.signal });\n return { operation: \"kill\", accepted: true } satisfies TerminalSessionResult;\n case \"subscribe\": {\n const { sessionId } = operation;\n let unsubscribeTerminal = () => {};\n let unsubscribeDisconnect = () => {};\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n unsubscribeTerminal();\n unsubscribeDisconnect();\n };\n\n unsubscribeTerminal = terminal.subscribe(sessionId, {\n onData: (chunk) => emit({ sessionId, kind: \"data\", chunk }),\n onExit: (exit) => {\n emit({ sessionId, kind: \"exit\", code: exit.code, signal: exit.signal });\n close();\n },\n });\n unsubscribeDisconnect = hostEvents.onDisconnect(close);\n return { operation: \"subscribe\", accepted: true } satisfies TerminalSessionResult;\n }\n }\n };\n};\n","import type { PreferenceScopeRef, PreferenceValue, WorkbenchCore } from \"../../core\";\n\nexport interface WebviewOwnedPreferences {\n get(name: string, scope?: PreferenceScopeRef): Promise<PreferenceValue | undefined> | PreferenceValue | undefined;\n set(name: string, value: PreferenceValue, scope: PreferenceScopeRef): Promise<void> | void;\n}\n\nexport const createWebviewPreferencesCapabilities = (input: {\n workbench: WorkbenchCore;\n extensionId?: string;\n ownedPreferences?: WebviewOwnedPreferences;\n warn?: (message: string) => void;\n}) => {\n const registry = input.workbench.preferences;\n const owner = () => {\n if (!input.extensionId) throw new Error(\"Preferences require the calling extension identity\");\n return input.extensionId;\n };\n const registered = (name: string) => {\n const schema = registry.getSchema(name);\n if (schema && input.extensionId && schema.ownerId !== \"workbench.core\" && schema.ownerId !== input.extensionId)\n (input.warn ?? console.warn)(\n `Cross-extension preference access to ${name} is deprecated. Use preferences owned by ${input.extensionId}.`,\n );\n return Boolean(schema);\n };\n return {\n \"preferences.get\": (params: unknown) => {\n const { name, scope } = params as { name: string; scope?: PreferenceScopeRef };\n if (registered(name)) return registry.getValue(name, scope);\n owner();\n return input.ownedPreferences?.get(name, scope) ?? registry.getOwnedValue(owner(), name, scope);\n },\n \"preferences.set\": (params: unknown) => {\n const {\n name,\n value,\n scope = { scope: \"user\" },\n } = params as { name: string; value: PreferenceValue; scope?: PreferenceScopeRef };\n if (scope.scope === \"default\") throw new Error(\"preference_scope_read_only\");\n if (registered(name)) {\n const stored = registry.setValue(name, value, scope);\n return stored instanceof Promise ? stored.then(() => ({ name, value })) : { name, value };\n }\n owner();\n const stored = input.ownedPreferences\n ? input.ownedPreferences.set(name, value, scope)\n : registry.setOwnedValue(owner(), name, value, scope);\n return stored instanceof Promise ? stored.then(() => ({ name, value })) : { name, value };\n },\n };\n};\n","import type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { NavigationTarget, WorkbenchCore, WorkbenchPanelInstance } from \"../../core\";\nimport { createTerminalSessionCapability } from \"./terminal-session-capability\";\nimport { createWebviewPreferencesCapabilities, type WebviewOwnedPreferences } from \"./webview-preferences-capability\";\n\ninterface CreateWorkbenchWebviewHostCapabilitiesInput {\n dispatchKeyboardEvent?: (event: KeyboardEventInit) => void;\n workbench: WorkbenchCore;\n placement?: WorkbenchPanelInstance;\n extensionId?: string;\n ownedPreferences?: WebviewOwnedPreferences;\n warn?: (message: string) => void;\n /** Event channel into the guest; terminal.session is only offered when present. */\n hostEvents?: HostEventPublisher;\n}\n\nconst dispatchDocumentKeyboardEvent = (params: KeyboardEventInit) => {\n if (typeof document === \"undefined\") return;\n const event = new KeyboardEvent(\"keydown\", { ...params, bubbles: true, cancelable: true });\n document.dispatchEvent(event);\n};\n\nexport const createWorkbenchWebviewHostCapabilities = (input: CreateWorkbenchWebviewHostCapabilitiesInput) =>\n ({\n ...(input.placement?.placementIdentity\n ? {\n \"placement.close\": (params: unknown) => {\n if (\n params !== undefined &&\n (typeof params !== \"object\" || params === null || Array.isArray(params) || Object.keys(params).length > 0)\n ) {\n throw new Error(\"placement.close takes no parameters; the host supplies the calling placement.\");\n }\n input.workbench.closePlacement(input.placement!.placementIdentity!);\n },\n }\n : {}),\n \"commands.execute\": (params: unknown) => {\n const request = params as { commandId: string; params?: unknown };\n return input.workbench.commands.executeCommand(request.commandId, request.params);\n },\n \"page.params.update\": (params: unknown) => {\n const state = input.workbench.pages.store.getState();\n if (!state.location) throw new Error(\"page_params_no_page\");\n if (!input.extensionId || input.extensionId !== state.location.page.extensionId)\n throw new Error(\"page_params_not_owner\");\n const patch = (params as { params: Parameters<WorkbenchCore[\"pageLocations\"][\"updateParams\"]>[0] }).params;\n return { location: input.workbench.pageLocations.updateParams(patch) };\n },\n \"navigation.open\": (params: unknown) => {\n const request = params as { target?: NavigationTarget };\n if (!request.target) throw new Error(\"navigation.open requires a target.\");\n return input.workbench.navigation.openTarget(request.target);\n },\n \"notification.show\": (params: unknown) => {\n const notification = params as Parameters<WorkbenchCore[\"notifications\"][\"show\"]>[0];\n return input.workbench.notifications.show({\n level: notification.level,\n message: notification.message,\n title: notification.title,\n });\n },\n ...createWebviewPreferencesCapabilities(input),\n \"host.dispatchKeyboardEvent\": (params: unknown) =>\n (input.dispatchKeyboardEvent ?? dispatchDocumentKeyboardEvent)(params as KeyboardEventInit),\n ...(input.hostEvents\n ? {\n \"terminal.session\": createTerminalSessionCapability({\n terminal: input.workbench.terminal,\n hostEvents: input.hostEvents,\n }),\n }\n : {}),\n }) satisfies HostCapabilityRegistry;\n","import type { HostCapabilityRegistry, ThemePreference } from \"pstdio-extensions/bridge/contract\";\nimport { createHostEventPublisher, type HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type {\n WorkbenchCore,\n WorkbenchPanelInstance,\n WorkbenchPanelRenderInput,\n WorkbenchRendererRegistration,\n} from \"../../core\";\nimport { BridgeWebviewFrame } from \"./bridge-webview-frame\";\nimport { createWorkbenchWebviewHostCapabilities } from \"./webview-host-capabilities\";\n\nexport interface BridgeWebviewRenderContext {\n workbench: WorkbenchCore;\n webviewId: string;\n extensionId?: string;\n placement: WorkbenchPanelInstance;\n /** Channel for pushing host events (e.g. terminal output) into this webview. */\n hostEvents: HostEventPublisher;\n}\n\n// How guest capability calls reach the host. Hosts inject this to swap the workbench-native\n// wiring for their own — e.g. the dashboard routes `commands.execute` through its REST API.\nexport type CreateBridgeWebviewHostCapabilities = (context: BridgeWebviewRenderContext) => HostCapabilityRegistry;\n\n// What the host pushes into the guest's props store. Hosts inject this to forward dynamic\n// data — e.g. the dashboard forwards extension command outcomes and theme preference.\nexport type CreateBridgeWebviewProps = (context: BridgeWebviewRenderContext) => unknown;\nexport type CreateBridgeWebviewTheme = (context: BridgeWebviewRenderContext) => ThemePreference;\n\ninterface CreateBridgeWebviewRendererInput {\n createHostCapabilities?: CreateBridgeWebviewHostCapabilities;\n createProps?: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n}\n\nexport const BRIDGE_WEBVIEW_RENDERER_ID = \"webview:bridge\";\n\nexport interface BridgeWebviewConfig {\n title?: string;\n runtimeUrl: string;\n moduleUrl: string;\n styles?: string[];\n capabilities?: string[];\n}\n\nconst isBridgeWebviewConfig = (value: unknown): value is BridgeWebviewConfig => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const config = value as Partial<BridgeWebviewConfig>;\n return typeof config.runtimeUrl === \"string\" && typeof config.moduleUrl === \"string\";\n};\n\nconst createPlacementProps: CreateBridgeWebviewProps = ({ placement }) => ({\n placement,\n resource: placement.resource,\n});\n\nconst createLightTheme: CreateBridgeWebviewTheme = () => \"light\";\n\nconst hostEventPublishersByWorkbench = new WeakMap<WorkbenchCore, Map<string, HostEventPublisher>>();\n\nexport const getBridgeWebviewHostEventPublisher = (workbench: WorkbenchCore, instance: WorkbenchPanelInstance) => {\n let hostEventsByWidget = hostEventPublishersByWorkbench.get(workbench);\n if (!hostEventsByWidget) {\n hostEventsByWidget = new Map();\n hostEventPublishersByWorkbench.set(workbench, hostEventsByWidget);\n }\n\n const key = instance.instanceId;\n let hostEvents = hostEventsByWidget.get(key);\n if (!hostEvents) {\n hostEvents = createHostEventPublisher();\n hostEventsByWidget.set(key, hostEvents);\n }\n\n return hostEvents;\n};\n\nexport const renderBridgeWebviewFrame = (input: {\n context: BridgeWebviewRenderContext;\n createHostCapabilities: CreateBridgeWebviewHostCapabilities;\n createProps: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n ownerId?: string;\n title: string;\n webview: BridgeWebviewConfig;\n}) => {\n const {\n context,\n createHostCapabilities,\n createProps,\n createTheme = createLightTheme,\n ownerId,\n title,\n webview,\n } = input;\n return (\n <BridgeWebviewFrame\n view={{\n extensionId: ownerId ?? \"workbench\",\n id: context.webviewId,\n label: webview.title ?? title,\n webview: {\n capabilities: webview.capabilities,\n moduleUrl: webview.moduleUrl,\n runtimeUrl: webview.runtimeUrl,\n styles: webview.styles ?? [],\n },\n }}\n props={createProps(context)}\n workbench={context.workbench}\n theme={createTheme(context)}\n capabilities={createHostCapabilities({ ...context, extensionId: ownerId ?? context.extensionId })}\n hostEvents={context.hostEvents}\n />\n );\n};\n\nconst renderBridgeWebview = (\n input: WorkbenchPanelRenderInput,\n createHostCapabilities: CreateBridgeWebviewHostCapabilities,\n createProps: CreateBridgeWebviewProps,\n createTheme: CreateBridgeWebviewTheme,\n) => {\n const { workbench, panel, instance } = input;\n const webview = isBridgeWebviewConfig(panel.config) ? panel.config : null;\n if (!webview) return null;\n\n return renderBridgeWebviewFrame({\n context: {\n workbench,\n webviewId: instance.panelId,\n placement: instance,\n hostEvents: getBridgeWebviewHostEventPublisher(workbench, instance),\n },\n createHostCapabilities,\n createProps,\n createTheme,\n ownerId: \"ownerId\" in panel ? panel.ownerId : undefined,\n title: panel.title,\n webview,\n });\n};\n\nexport const createBridgeWebviewRenderer = (input: CreateBridgeWebviewRendererInput = {}) => {\n const createHostCapabilities = input.createHostCapabilities ?? createWorkbenchWebviewHostCapabilities;\n const createProps = input.createProps ?? createPlacementProps;\n const createTheme = input.createTheme ?? createLightTheme;\n\n return {\n id: BRIDGE_WEBVIEW_RENDERER_ID,\n render: (renderInput) => renderBridgeWebview(renderInput, createHostCapabilities, createProps, createTheme),\n } satisfies WorkbenchRendererRegistration;\n};\n","import type { LocalizableString } from \"pstdio-api-contracts\";\nimport { isLocalizedString, type Localizable } from \"pstdio-api-contracts/extension-kernel\";\n\nexport const text = (value: Localizable<string> | LocalizableString | undefined, fallback = \"\") => {\n if (value === undefined) return fallback;\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n","import {\n type NavigationTarget as ExtensionNavigationTarget,\n isNavigationTarget,\n qualifyNavigationTarget,\n} from \"@pstdio/sdk/extensions\";\nimport type { NavigationTarget, NavigationTargetCommand } from \"../../core\";\n\nexport interface ToWorkbenchNavigationTargetInput {\n commandIdOf?(\n command: Extract<ExtensionNavigationTarget, { kind: \"command\" }>[\"target\"][\"command\"],\n ): string | undefined;\n commandTargetOf?(target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>): NavigationTargetCommand;\n extensionId?: string;\n projectId?: string;\n}\n\nconst toCommandTarget = (\n target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>,\n input: ToWorkbenchNavigationTargetInput,\n) => {\n const override = input.commandTargetOf?.(target);\n if (override) return override;\n const command = target.target.command;\n const extensionId = command.extensionId ?? input.extensionId;\n const commandId =\n input.commandIdOf?.(command) ??\n (extensionId && extensionId !== \"pstdio\" ? `${extensionId}.command.${command.id}` : command.id);\n return { kind: \"command\", commandId, args: target.target.params } satisfies NavigationTargetCommand;\n};\n\n// The return type stays explicit: the compound branch recurses, and TypeScript\n// cannot infer the return type of a self-referencing function.\ntype NavigationOperation = Extract<ExtensionNavigationTarget, { kind: \"page\" | \"panel\" }>;\nexport function toWorkbenchNavigationTarget(\n target: NavigationOperation,\n input?: ToWorkbenchNavigationTargetInput,\n): NavigationOperation;\nexport function toWorkbenchNavigationTarget(\n target: ExtensionNavigationTarget,\n input?: ToWorkbenchNavigationTargetInput,\n): NavigationTarget;\nexport function toWorkbenchNavigationTarget(\n target: ExtensionNavigationTarget,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget {\n if (!isNavigationTarget(target)) throw new Error(\"Invalid navigation target.\");\n if (input.extensionId) target = qualifyNavigationTarget(target, input.extensionId, input.projectId);\n if (target.kind === \"command\") return toCommandTarget(target, input);\n if (target.kind === \"href\") return target;\n if (target.kind === \"page\") return target;\n if (target.kind === \"panel\") return target;\n return {\n kind: \"compound\",\n targets: target.targets.map((item) => toWorkbenchNavigationTarget(item, input)),\n };\n}\n","import type { CommandExecuteResponse } from \"@pstdio/sdk/api\";\n\nexport const unwrapCommandValue = (result: unknown) => {\n const response = result as Partial<CommandExecuteResponse> | undefined;\n if (!response?.outcome) return result;\n if (response.outcome.status === \"success\") return response.outcome.value;\n throw new Error(response.outcome.reason ?? response.outcome.error?.message ?? \"Extension command failed.\");\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { WorkbenchCommandExecutionContext } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"./workbench-extension-command\";\n\nexport const runResourceMutation = async (\n context: WorkbenchExtensionCommandContext,\n command: WorkbenchExtensionMetadata[\"commands\"][number],\n params: Record<string, unknown> | undefined,\n execution: WorkbenchCommandExecutionContext | undefined,\n persist: () => Promise<unknown>,\n) => {\n const mutation = command.resourceMutation;\n if (!mutation) return persist();\n const id = params?.[mutation.idParam] ?? execution?.resource?.id;\n if (typeof id !== \"string\") return persist();\n const resource = { type: mutation.resourceType, id, extensionId: command.extensionId, projectId: context.projectId };\n if (mutation.kind === \"remove\") {\n if (!(await context.workbench.commandPalette.requestConfirmation(text(command.title, \"Delete\")))) return;\n }\n const rawLabel = mutation.kind === \"rename\" ? params?.[mutation.labelParam] : undefined;\n // Leave invalid input to the command; never display a title that it cannot save.\n if (mutation.kind === \"rename\" && (typeof rawLabel !== \"string\" || !rawLabel.trim())) return persist();\n const preview = context.workbench.resources.preview.begin(\n resource,\n mutation.kind === \"remove\" ? { removed: true } : { label: (rawLabel as string).trim() },\n );\n try {\n const result = await context.workbench.resources.preview.persist(resource, persist);\n await preview.commit();\n return result;\n } catch (error) {\n preview.rollback();\n throw error;\n }\n};\n","import type { CommandExecuteRequest, CommandExecuteResponse, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { ResourceRef, WorkbenchCommandExecutionContext, WorkbenchModuleContext } from \"../../core\";\nimport { unwrapCommandValue } from \"./command-response\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\nimport { runResourceMutation } from \"./workbench-resource-mutation\";\nexport interface WorkbenchExtensionCommandContext {\n metadata?: Pick<WorkbenchExtensionMetadata, \"commands\">;\n executeCommand(commandId: string, body: CommandExecuteRequest, signal?: AbortSignal): Promise<unknown> | unknown;\n prepareCommandArgs?(\n commandId: string,\n args: unknown,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n ): Promise<unknown> | unknown;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\nexport interface ExecuteWorkbenchExtensionCommandInput {\n workspaceId?: string;\n signal?: AbortSignal;\n metadata?: Record<string, unknown>;\n params?: Record<string, unknown>;\n resource?: ResourceRef;\n slot?: CommandExecuteRequest[\"slot\"];\n}\nexport const createExtensionSlot = (input: {\n context?: Record<string, unknown>;\n id: string;\n kind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\n projectId: string;\n}) => ({\n id: input.id,\n kind: input.kind,\n context: { projectId: input.projectId, ...(input.context ?? {}) },\n});\nexport const executeWorkbenchExtensionCommandResponse = async (\n context: Pick<WorkbenchExtensionCommandContext, \"executeCommand\" | \"projectId\"> & {\n workbench: Pick<WorkbenchModuleContext, \"navigation\" | \"notifications\">;\n },\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const resource = input.resource;\n const response = await context.executeCommand(\n commandId,\n {\n projectId: context.projectId,\n ...(input.workspaceId ? { workspaceId: input.workspaceId } : {}),\n ...(input.params ? { params: input.params } : {}),\n ...(resource ? { resource } : {}),\n ...(input.slot ? { slot: input.slot } : {}),\n source: \"dashboard\",\n ...(input.metadata ? { metadata: input.metadata } : {}),\n },\n input.signal,\n );\n unwrapCommandValue(response);\n const outcome = (response as Partial<CommandExecuteResponse> | undefined)?.outcome;\n if (outcome?.status === \"success\") {\n for (const target of outcome.navigationRequests ?? []) {\n try {\n await context.workbench.navigation.openTarget(toWorkbenchNavigationTarget(target));\n } catch (error) {\n context.workbench.notifications.show({\n level: \"warning\",\n title: \"Command completed, but navigation failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n return response;\n};\nexport const executeWorkbenchExtensionCommand = async (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const persist = async () =>\n unwrapCommandValue(await executeWorkbenchExtensionCommandResponse(context, commandId, input));\n const command = context.metadata?.commands.find((candidate) => candidate.id === commandId);\n return command\n ? runResourceMutation(context, command, input.params, { resource: input.resource }, persist)\n : persist();\n};\n","import type { WorkbenchExtensionCommandPaletteResourceRecord } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { CommandPaletteResourceResult, Disposable } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\ninterface ResourceItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n target: NavigationTarget;\n}\ninterface ProviderQueryResult {\n items?: ResourceItem[];\n}\nconst isProviderQueryResult = (value: unknown): value is ProviderQueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst commandIdOf = (\n command: Extract<\n NavigationTarget,\n {\n kind: \"command\";\n }\n >[\"target\"][\"command\"],\n extensionId: string,\n) => `${command.extensionId ?? extensionId}.command.${command.id}`;\nconst activateTarget = async (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n item: ResourceItem,\n) => {\n const { target } = item;\n if (target.kind === \"command\") {\n await executeWorkbenchExtensionCommand(context, commandIdOf(target.target.command, record.extensionId), {\n params: target.target.params,\n });\n // A selected command may mutate extension data; refresh providers so a reopened\n // palette reflects the change without an app reload.\n context.workbench.commandPaletteResources.refresh();\n return;\n }\n await context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(target, {\n extensionId: record.extensionId,\n }),\n );\n};\nconst targetResource = (target: NavigationTarget): ResourceRef | undefined => {\n if (target.kind === \"page\" || target.kind === \"panel\") return target.resource;\n if (target.kind === \"compound\") return target.targets.find((step) => step.resource)?.resource;\n return undefined;\n};\nconst toResult = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n groupLabel: string,\n item: ResourceItem,\n): CommandPaletteResourceResult => ({\n id: `${record.id}:${item.id}`,\n resource: (() => {\n const resource = targetResource(item.target);\n return resource\n ? {\n ...resource,\n projectId: resource.projectId ?? context.projectId,\n extensionId: resource.extensionId ?? record.extensionId,\n }\n : undefined;\n })(),\n label: item.label,\n description: item.description,\n icon: item.icon,\n keywords: item.keywords,\n group: groupLabel,\n activate: () => activateTarget(context, record, item),\n});\nexport const registerWorkbenchExtensionCommandPaletteResources = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionCommandPaletteResourceRecord[],\n) => {\n const disposables: Disposable[] = [];\n for (const record of records) {\n const groupLabel = text(record.title, record.id);\n disposables.push(\n context.workbench.commandPaletteResources.registerProvider({\n id: record.id,\n title: groupLabel,\n refreshEventIds: record.refreshEventIds,\n query: async ({ query, limit, signal }) => {\n const activeResource = context.workbench.getActiveResource();\n const value = await executeWorkbenchExtensionCommand(context, record.queryHandlerId, {\n signal,\n params: {\n projectId: context.projectId,\n modeId: context.workbench.modes.getActiveModeId(),\n activeResource: activeResource,\n providerId: record.id,\n query,\n limit,\n },\n });\n if (!isProviderQueryResult(value)) return [];\n return (value.items ?? []).map((item) => toResult(context, record, groupLabel, item));\n },\n }),\n );\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { WorkbenchExtensionControlsRendererRecord } from \"pstdio-api-contracts\";\nimport { controlsQueryResultSchema } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, ResourceRef } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\nexport interface WorkbenchExtensionControlsAdapter {\n /** Supply a fallback resource when the widget placement carries none. */\n resolveResource?: (record: WorkbenchExtensionControlsRendererRecord) => ResourceRef | undefined;\n}\nconst registerControlsRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionControlsRendererRecord,\n adapter: WorkbenchExtensionControlsAdapter,\n) => {\n const slot = createExtensionSlot({\n id: record.id,\n kind: \"renderer\",\n projectId: context.projectId,\n context: { controlsRendererId: record.id },\n });\n const run = (\n commandId: string | undefined,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n ) =>\n commandId\n ? executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n ...(pageParams ? { pageParams } : {}),\n projectId: context.projectId,\n ...(resource ? { resource: resource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n signal,\n slot,\n metadata: { controlsRendererId: record.id },\n })\n : Promise.resolve(undefined);\n return context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"controls\",\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n defaultValues: record.defaultValues,\n executeQuery: async (resource, signal, pageParams) => {\n const value = await run(\n record.queryHandlerId,\n {},\n resource ?? adapter.resolveResource?.(record),\n signal,\n pageParams,\n );\n const result = controlsQueryResultSchema.safeParse(value);\n if (!result.success) {\n const fields = result.error.issues\n .map((issue) => `body.query.${issue.path.join(\".\")}: ${issue.message}`)\n .join(\"; \");\n throw new Error(\n `Extension \"${record.extensionId}\" view \"${record.id}\" has invalid controls. Expected serializable control declarations. ${fields}`,\n );\n }\n return result.data;\n },\n updateValue: record.valueChangeHandlerId\n ? ({ controlId, value, values, resource }) =>\n run(record.valueChangeHandlerId, { controlId, value, values }, resource).then(() => undefined)\n : undefined,\n apply: record.applyHandlerId\n ? ({ values, resource }) => run(record.applyHandlerId, { values }, resource).then(() => undefined)\n : undefined,\n reset: record.resetHandlerId\n ? ({ controlIds, resource }) => run(record.resetHandlerId, { controlIds }, resource).then(() => undefined)\n : undefined,\n },\n });\n};\n// Bridges serializable controls renderer metadata into live workbench controls renderers\n// (wiring each query/update/apply/reset command id to command execution), and registers a\n// panel widget for every panel that places one.\nexport const registerWorkbenchExtensionControlsRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionControlsRendererRecord[],\n adapter: WorkbenchExtensionControlsAdapter = {},\n): Disposable => {\n const disposables: Disposable[] = [];\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { Localizable } from \"@pstdio/sdk/extensions\";\nimport { commandRefId } from \"@pstdio/sdk/extensions\";\nimport type { CommandParamSchema } from \"../../core\";\n\ntype LocalizableText = Localizable<string> | undefined;\ntype ParamLocalizer = (value: LocalizableText, fallback?: string) => string;\n\ntype ContributedParamSchema =\n | Record<string, { type: string; label?: LocalizableText; description?: LocalizableText; options?: unknown }>\n | undefined;\n\n/**\n * Contribution params carry `Localizable` labels; the workbench's command\n * surfaces render plain strings. Resolve at the boundary so no l10n object\n * reaches a renderer and gets stringified as \"[object Object]\".\n */\nexport const localizeParamSchema = (\n params: ContributedParamSchema,\n localize: ParamLocalizer,\n ownerExtensionId?: string,\n) => {\n if (!params) return undefined;\n\n return Object.fromEntries(\n Object.entries(params).map(([id, descriptor]) => [\n id,\n {\n ...descriptor,\n ...(descriptor.options && !Array.isArray(descriptor.options)\n ? { options: localizeOptionSource(descriptor.options, ownerExtensionId) }\n : {}),\n label: descriptor.label === undefined ? undefined : localize(descriptor.label, id),\n description: descriptor.description === undefined ? undefined : localize(descriptor.description),\n },\n ]),\n ) as CommandParamSchema;\n};\n\nconst localizeOptionSource = (value: unknown, ownerExtensionId?: string) => {\n const source = value as {\n command: { id: string; extensionId?: string };\n valueField: string;\n labelField: string;\n params?: Record<string, unknown>;\n };\n return {\n valueField: source.valueField,\n labelField: source.labelField,\n params: source.params,\n commandId: commandRefId({\n id: source.command.id,\n extensionId: source.command.extensionId ?? ownerExtensionId ?? \"pstdio\",\n }),\n };\n};\n","import type { WorkbenchExtensionDataTableRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { localizeParamSchema } from \"./param-schema-localization\";\n\nexport const mapViewToolbarActions = (\n record: Pick<WorkbenchExtensionDataTableRendererRecord, \"toolbarActions\" | \"extensionId\">,\n) =>\n record.toolbarActions?.map((action) => ({\n id: action.id,\n label: text(action.label, action.id),\n icon: action.icon,\n presentation: action.presentation,\n commandId: action.commandId,\n args: action.params,\n params: localizeParamSchema(action.input, text, record.extensionId),\n submitLabel: action.submitLabel,\n disabled: action.disabled,\n when: action.when,\n }));\n","import type { DataTableRendererSettings } from \"@pstdio/sdk/extensions\";\nimport { dataTableBuiltInViews, type WorkbenchExtensionDataTableRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type {\n CollectionViewsProvider,\n DataTableRendererColumn,\n DataTableRendererQueryResult,\n DataTableRendererRow,\n Disposable,\n ResourceRef,\n} from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nimport { mapViewToolbarActions } from \"./view-toolbar-actions\";\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\n\nexport interface WorkbenchExtensionDataTableRendererAdapter {\n resolveRowResource?: (\n record: WorkbenchExtensionDataTableRendererRecord,\n row: { id: string; values: Record<string, unknown>; resource?: ResourceRef },\n ) => ResourceRef | undefined;\n /** Shared saved views for the table, such as the dashboard's project views. */\n createViewsProvider?: (\n record: WorkbenchExtensionDataTableRendererRecord,\n ) => CollectionViewsProvider<DataTableRendererSettings>;\n}\ntype WireColumn = NonNullable<WorkbenchExtensionDataTableRendererRecord[\"columns\"]>[number];\nconst toColumn = (column: WireColumn): DataTableRendererColumn => ({\n ...column,\n label: localize(column.label, column.id),\n description: column.description ? localize(column.description) : undefined,\n icon: column.icon ? createElement(WorkbenchIcon, { name: column.icon, size: 14 }) : undefined,\n});\nconst isQueryResult = (\n value: unknown,\n): value is {\n rows: Array<{\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n }>;\n columns?: WorkbenchExtensionDataTableRendererRecord[\"columns\"];\n} =>\n Boolean(\n value &&\n typeof value === \"object\" &&\n Array.isArray(\n (\n value as {\n rows?: unknown;\n }\n ).rows,\n ),\n );\nconst toRow = (row: { id: string; values: Record<string, unknown>; resource?: ResourceRef }): DataTableRendererRow => ({\n id: row.id,\n values: row.values,\n resource: row.resource ? row.resource : undefined,\n});\nconst registerRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionDataTableRendererRecord,\n adapter: WorkbenchExtensionDataTableRendererAdapter,\n) => {\n const builtIns = dataTableBuiltInViews(record);\n const originalRows = new WeakMap<DataTableRendererRow, Parameters<typeof toRow>[0]>();\n const slot = createExtensionSlot({\n id: record.id,\n kind: \"dataTableRenderer\",\n projectId: context.projectId,\n context: { dataTableRendererId: record.id },\n });\n const run = (\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n modeId?: string,\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n ) =>\n executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n ...(pageParams ? { pageParams } : {}),\n projectId: context.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource: resource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n signal,\n slot,\n metadata: { dataTableRendererId: record.id },\n });\n return context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"dataTable\",\n resourceKind: record.resourceKind,\n toolbarActions: mapViewToolbarActions(record),\n columns: record.columns?.map(toColumn),\n initialPageSize: record.initialPageSize,\n pageSizeOptions: record.pageSizeOptions,\n defaultSettings: builtIns.settings,\n defaultFilter: record.defaultFilter,\n defaultSorts: record.defaultSorts,\n defaultViews: builtIns.views.map((view) => ({ ...view, title: localize(view.title, view.id) })),\n defaultActiveViewId: record.defaultActiveViewId,\n viewsProvider: adapter.createViewsProvider?.(record),\n selectionMode: record.selectionMode,\n selectionActions: record.selectionActions?.map((action) => ({\n id: action.id,\n commandId: action.commandId,\n label: localize(action.label, action.id),\n icon: action.icon ? createElement(WorkbenchIcon, { name: action.icon, size: 16 }) : undefined,\n destructive: action.destructive,\n run: (rows) => run(action.commandId, { rowIds: rows.map((row) => row.id) }).then(() => undefined),\n })),\n emptyTitle: record.emptyTitle ? localize(record.emptyTitle) : undefined,\n emptyDescription: record.emptyDescription ? localize(record.emptyDescription) : undefined,\n executeQuery: async ({ resource, modeId, filter, sorts, settings, pageParams }, signal) => {\n const value = await run(\n record.queryHandlerId,\n { filter, sorts, settings },\n resource,\n modeId,\n signal,\n pageParams,\n );\n if (!isQueryResult(value)) return { rows: [] };\n const rows = value.rows.map((row) => {\n const mapped = toRow(row);\n if (adapter.resolveRowResource) mapped.resource = adapter.resolveRowResource(record, row);\n originalRows.set(mapped, row);\n return mapped;\n });\n return {\n rows,\n columns: value.columns?.map(toColumn),\n } satisfies DataTableRendererQueryResult;\n },\n rowActions: record.rowActions?.map((action) => ({\n id: action.id,\n commandId: action.commandId,\n label: localize(action.label, action.id),\n icon: action.icon ? createElement(WorkbenchIcon, { name: action.icon, size: 16 }) : undefined,\n destructive: action.destructive,\n run: async (row) => {\n await run(action.commandId, { rowId: row.id }, row.resource);\n context.workbench.views.refreshView(record.id);\n },\n })),\n onRowActivate: record.rowActivationHandlerId\n ? async (row) => {\n await run(record.rowActivationHandlerId!, { row: originalRows.get(row) ?? row }, row.resource);\n }\n : undefined,\n },\n });\n};\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n adapter: WorkbenchExtensionDataTableRendererAdapter = {},\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record, adapter));\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type {\n ExtensionCommandPaletteContribution,\n ExtensionMenuContribution,\n WorkbenchExtensionMetadata,\n} from \"@pstdio/sdk/api\";\nimport { isLocalizedString, type Localizable } from \"@pstdio/sdk/extensions\";\nimport type { Command, MenuItem, MenuPath } from \"../../core\";\nimport { localizeParamSchema } from \"./param-schema-localization\";\n\nexport type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\n\nconst placementOrder = { first: 0, default: 1, last: 2 } satisfies Record<\n NonNullable<ExtensionMenuContribution[\"placement\"] | ExtensionCommandPaletteContribution[\"placement\"]>,\n number\n>;\ntype ExtensionContributionPlacement = keyof typeof placementOrder;\n\nexport interface WorkbenchExtensionMenuSlotConfig {\n menuPath: MenuPath;\n group?: string;\n overflowLabel?: string;\n}\n\nexport type WorkbenchExtensionMenuWhenBuilder = (contribution: ExtensionMenuContribution) => string | undefined;\nexport type WorkbenchExtensionStringResolver = (value: Localizable<string> | undefined, extensionId: string) => string;\n\nexport interface WorkbenchExtensionMenuRegistration {\n command: Command;\n contribution: ExtensionMenuContribution;\n menuItem: MenuItem;\n menuPath: MenuPath;\n targetCommandId: string;\n}\n\nexport interface WorkbenchExtensionCommandPaletteRegistration {\n command: Command;\n contribution: ExtensionCommandPaletteContribution;\n menuItem: MenuItem;\n targetCommandId: string;\n}\n\nexport interface UnresolvedWorkbenchExtensionMenuContribution {\n contribution: ExtensionMenuContribution;\n targetId: string;\n}\n\nexport const emptyWorkbenchExtensionMetadata = {\n commands: [],\n commandPaletteContributions: [],\n diagnostics: [],\n extensions: [],\n menuContributions: [],\n modes: [],\n pages: [],\n views: [],\n viewMenus: [],\n placements: [],\n resourceKinds: [],\n navigationItems: [],\n navigationTrees: [],\n statusBarItems: [],\n statuses: [],\n settingsPanels: [],\n settingsDefinitions: [],\n} satisfies WorkbenchExtensionMetadata;\n\ntype CommandContributionMetadata = Pick<\n WorkbenchExtensionMetadata,\n \"commands\" | \"commandPaletteContributions\" | \"menuContributions\"\n>;\n\nconst defaultWorkbenchExtensionCommandId = (contribution: ExtensionMenuContribution) =>\n `workbench.extension.menu.${contribution.id}`;\n\nconst defaultWorkbenchExtensionPaletteCommandId = (contribution: ExtensionCommandPaletteContribution) =>\n `workbench.extension.palette.${contribution.id}`;\n\nconst contributionOrder = (contribution: { placement?: ExtensionContributionPlacement }, index: number) =>\n placementOrder[contribution.placement ?? \"default\"] * 1000 + index;\n\nconst text: WorkbenchExtensionStringResolver = (value) => {\n if (value === undefined) return \"\";\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n\nconst createMenuItem = (input: {\n contribution: ExtensionMenuContribution;\n commandId: string;\n index: number;\n slot: WorkbenchExtensionMenuSlotConfig;\n when?: string;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString, slot, when } = input;\n\n return {\n commandId,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: slot.group ?? contribution.group,\n args: contribution.params,\n overflowLabel: slot.overflowLabel,\n order: contributionOrder(contribution, index),\n when,\n } satisfies MenuItem;\n};\n\nconst createPaletteItem = (input: {\n contribution: ExtensionCommandPaletteContribution;\n commandId: string;\n index: number;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString } = input;\n\n return {\n commandId,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: contribution.group,\n args: contribution.params,\n order: contributionOrder(contribution, index),\n } satisfies MenuItem;\n};\n\nexport const buildWorkbenchExtensionMenuRegistrations = (input: {\n metadata: CommandContributionMetadata;\n menuSlotsById: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n menuTargetsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n createCommandId?: (contribution: ExtensionMenuContribution) => string;\n createWhenExpression?: WorkbenchExtensionMenuWhenBuilder;\n resolveString?: WorkbenchExtensionStringResolver;\n}) => {\n const {\n createCommandId = defaultWorkbenchExtensionCommandId,\n createWhenExpression,\n menuSlotsById,\n menuTargetsById,\n metadata,\n resolveString = text,\n } = input;\n const registrations: WorkbenchExtensionMenuRegistration[] = [];\n const unresolved: UnresolvedWorkbenchExtensionMenuContribution[] = [];\n\n metadata.menuContributions.forEach((contribution, index) => {\n const slot = contribution.target\n ? menuTargetsById?.get(contribution.target)\n : menuSlotsById.get(contribution.slotId);\n if (!slot) {\n unresolved.push({ contribution, targetId: contribution.target ?? contribution.slotId });\n return;\n }\n\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: localizeParamSchema(\n command?.params,\n (value) => resolveString(value, command?.extensionId ?? contribution.extensionId),\n command?.extensionId,\n ),\n },\n contribution,\n menuItem: createMenuItem({\n commandId,\n contribution,\n index,\n resolveString,\n slot,\n when: createWhenExpression?.(contribution),\n }),\n menuPath: slot.menuPath,\n targetCommandId: contribution.commandId,\n });\n });\n\n return { registrations, unresolved };\n};\n\nexport const buildWorkbenchExtensionCommandPaletteRegistrations = (input: {\n metadata: CommandContributionMetadata;\n createCommandId?: (contribution: ExtensionCommandPaletteContribution) => string;\n resolveString?: WorkbenchExtensionStringResolver;\n}) => {\n const { createCommandId = defaultWorkbenchExtensionPaletteCommandId, metadata, resolveString = text } = input;\n const registrations: WorkbenchExtensionCommandPaletteRegistration[] = [];\n\n (metadata.commandPaletteContributions ?? []).forEach((contribution, index) => {\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: localizeParamSchema(\n command?.params,\n (value) => resolveString(value, command?.extensionId ?? contribution.extensionId),\n command?.extensionId,\n ),\n },\n contribution,\n menuItem: createPaletteItem({ commandId, contribution, index, resolveString }),\n targetCommandId: contribution.commandId,\n });\n });\n\n return registrations;\n};\n","import type { CommandExecuteRequest, CommandExecuteResponse } from \"@pstdio/sdk/api\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n FileRendererContent,\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n ResourceRef,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\ntype FileRendererRecord = NonNullable<WorkbenchExtensionMetadata[\"fileRenderers\"]>[number];\nexport interface RegisterWorkbenchExtensionFileRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest, signal?: AbortSignal): Promise<unknown> | unknown;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\n\nconst slotContext = (input: { projectId: string; rendererId: string; resource?: ResourceRef }) => ({\n id: input.rendererId,\n kind: \"renderer\" as const,\n context: {\n projectId: input.projectId,\n ...(input.resource ? { resourceType: input.resource.type, resourceId: input.resource.id } : {}),\n },\n});\nconst executeFileCommand = async (\n input: RegisterWorkbenchExtensionFileRenderersInput,\n rendererId: string,\n commandId: string,\n resource: ResourceRef | undefined,\n extra: Record<string, unknown> = {},\n metadata?: CommandExecuteRequest[\"metadata\"],\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n) => {\n const ext = resource;\n return executeWorkbenchExtensionCommand(input, commandId, {\n params: {\n renderer: {\n rendererId,\n ...(pageParams ? { pageParams } : {}),\n projectId: input.projectId,\n ...(ext ? { resource: ext } : {}),\n invocation: { placement: \"visible\" },\n },\n ...extra,\n },\n resource: ext,\n signal,\n slot: slotContext({ projectId: input.projectId, rendererId, resource: ext }),\n ...(metadata ? { metadata } : {}),\n });\n};\nconst revisionFromValue = (value: unknown) => {\n if (!value || typeof value !== \"object\") return undefined;\n const revision = (\n value as {\n revision?: unknown;\n }\n ).revision;\n return typeof revision === \"string\" ? revision : undefined;\n};\nexport const fileRendererRefreshEnvelopeFromCommand = (\n body: CommandExecuteRequest,\n response: CommandExecuteResponse,\n): FileRendererRefreshEnvelope | undefined => {\n const metadata = body.metadata;\n const origin = metadata?.fileRendererOrigin;\n if (!origin || typeof origin !== \"object\") return undefined;\n const candidate = origin as Partial<FileRendererRefreshOrigin>;\n if (\n typeof candidate.rendererId !== \"string\" ||\n typeof candidate.instanceId !== \"string\" ||\n typeof candidate.operationId !== \"string\"\n ) {\n return undefined;\n }\n const resourceKey = metadata?.fileRendererResourceKey;\n const revision = revisionFromValue(response.outcome.value);\n return {\n origin: {\n rendererId: candidate.rendererId,\n instanceId: candidate.instanceId,\n operationId: candidate.operationId,\n },\n ...(typeof resourceKey === \"string\" ? { resourceKey } : {}),\n ...(revision ? { revision } : {}),\n };\n};\nconst registerFileRenderer = (input: RegisterWorkbenchExtensionFileRenderersInput, record: FileRendererRecord) =>\n input.workbench.views.registerView({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"file\",\n resourceKind: record.resourceKind,\n load: async (resource, signal, pageParams) => {\n const result = await executeFileCommand(\n input,\n record.id,\n record.loadHandlerId,\n resource,\n {},\n undefined,\n signal,\n pageParams,\n );\n return (result ?? {}) as FileRendererContent;\n },\n save: record.saveHandlerId\n ? async (resource, content, origin) => {\n const result = await executeFileCommand(\n input,\n record.id,\n record.saveHandlerId as string,\n resource,\n { content },\n {\n ...(origin ? { fileRendererOrigin: origin } : {}),\n ...(resourceKey(resource) ? { fileRendererResourceKey: resourceKey(resource) } : {}),\n },\n );\n const revision = revisionFromValue(result);\n return revision ? { revision } : undefined;\n }\n : undefined,\n },\n });\nexport const registerWorkbenchExtensionFileRenderers = (input: RegisterWorkbenchExtensionFileRenderersInput) => {\n const disposables: Disposable[] = [];\n for (const record of input.metadata.fileRenderers ?? []) {\n disposables.push(registerFileRenderer(input, record));\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { CollectionBadgeItem } from \"@pstdio/sdk/extensions\";\nimport type { KanbanRendererRow } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\n\nexport const collectionBadgeTarget = (\n row: KanbanRendererRow,\n itemsAttributeId: string,\n itemId: string,\n extensionId: string,\n projectId: string,\n) => {\n const items = row.attributes[itemsAttributeId] as CollectionBadgeItem[] | undefined;\n const item = items?.find((item) => item.id === itemId);\n return item?.target ? toWorkbenchNavigationTarget(item.target, { extensionId, projectId }) : undefined;\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport { createElement } from \"react\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type { ReactKanbanRendererContribution as KanbanRendererContribution } from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport type { Localizer, ResolveStatusOptions } from \"./kanban-renderer-contribution-helpers\";\n\ntype BoardColumnConfig = ReturnType<NonNullable<KanbanRendererContribution[\"getBoardColumnConfig\"]>>;\n\nconst createBoardActionIcon = (icon: string | undefined) => {\n const BoardActionIcon = (props: { size?: number | string }) =>\n createElement(WorkbenchIcon, { name: icon ?? \"MoreHorizontal\", ...props });\n return BoardActionIcon;\n};\n\nexport const toWorkbenchBoardColumnConfig = (config: WireBoardColumnConfig | undefined, localize: Localizer) =>\n ({\n color: config?.color,\n canDragIn: config?.canDragIn,\n canDragOut: config?.canDragOut,\n canCreate: config?.canCreate,\n actions: config?.actions?.map((action) => ({\n id: action.id,\n label: localize(action.label, action.id),\n icon: createBoardActionIcon(action.icon),\n })),\n }) satisfies BoardColumnConfig;\n\nconst statusSetId = (record: WorkbenchExtensionKanbanRendererRecord, ref: Parameters<ResolveStatusOptions>[0]) =>\n `${ref.extensionId ?? record.extensionId}.status.${ref.id}`;\n\nexport const createStatusOptionsResolver = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n): ResolveStatusOptions => {\n const sources = new Map<string, ReturnType<ResolveStatusOptions>>();\n return (ref) => {\n const id = statusSetId(record, ref);\n const existing = sources.get(id);\n if (existing) return existing;\n\n const source = {\n getSnapshot: () =>\n (context.workbench.statuses.getStatuses(id) ?? []).map((status) => ({\n value: status.id,\n label: status.label,\n color: status.color,\n icon: status.icon,\n })),\n subscribe: (listener: () => void) =>\n context.workbench.statuses.store.subscribeSelector((state) => state.values[id], listener),\n };\n sources.set(id, source);\n void context.workbench.statuses.load(id).catch(() => undefined);\n return source;\n };\n};\n\nexport const statusColorConfig = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"],\n groupingAttributeId: string | undefined,\n groupKey: string,\n): WireBoardColumnConfig | undefined => {\n const attribute = attributes?.find((candidate) => candidate.id === groupingAttributeId);\n if (attribute?.type.kind !== \"status\") return undefined;\n const id = statusSetId(record, attribute.type.statuses);\n const status = context.workbench.statuses.getStatuses(id)?.find((candidate) => candidate.id === groupKey);\n return status ? { color: status.color } : undefined;\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport type { EnumOptions, KanbanRendererCreateField, KanbanRendererCreateFieldType, ResourceRef } from \"../../core\";\nimport type {\n ReactAttributeDescriptor as AttributeDescriptor,\n ReactKanbanRendererContribution as KanbanRendererContribution,\n} from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nexport type KanbanRendererRow = Awaited<ReturnType<KanbanRendererContribution[\"executeQuery\"]>>[number];\nexport type RowAction = NonNullable<WorkbenchExtensionKanbanRendererRecord[\"rowActions\"]>[number];\nexport type QueryResult = {\n attributes?: WorkbenchExtensionKanbanRendererRecord[\"attributes\"];\n boardColumnConfigs?: Record<string, WireBoardColumnConfig>;\n rows?: unknown[];\n};\nexport type Localizer = (value: unknown, fallback?: string) => string;\nexport interface MutableAttributeSource {\n source: KanbanRendererContribution[\"attributes\"];\n set(attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined): void;\n}\ntype UnknownDisplayReporter = (attributeId: string, kind: string) => void;\nexport type ResolveStatusOptions = (\n statuses: Extract<\n NonNullable<WorkbenchExtensionKanbanRendererRecord[\"attributes\"]>[number][\"type\"],\n {\n kind: \"status\";\n }\n >[\"statuses\"],\n) => EnumOptions;\nexport const isQueryResult = (value: unknown): value is QueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst localizeAttributes = (\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n resolveStatusOptions: ResolveStatusOptions,\n reportUnknownDisplay?: UnknownDisplayReporter,\n): AttributeDescriptor[] =>\n (attributes ?? []).map((attribute) => {\n const display = attribute.display;\n const knownDisplay =\n display?.kind === \"badge-list\" && typeof display.itemsAttributeId === \"string\"\n ? { kind: \"badge-list\" as const, itemsAttributeId: display.itemsAttributeId }\n : undefined;\n if (display && !knownDisplay) reportUnknownDisplay?.(attribute.id, display.kind);\n const resolveType = () => {\n const { type } = attribute;\n if (type.kind === \"status\") return { kind: \"enum\" as const, options: resolveStatusOptions(type.statuses) };\n if (type.kind !== \"enum\" && type.kind !== \"enum-multi\") return type;\n return {\n ...type,\n options: Array.isArray(type.options)\n ? type.options.map((option) => ({ ...option, label: localize(option.label, option.value) }))\n : type.options,\n };\n };\n const base: AttributeDescriptor = {\n ...attribute,\n label: localize(attribute.label, attribute.id),\n type: resolveType(),\n display: knownDisplay,\n };\n return decorate(record, base);\n });\nexport const createMutableAttributeSource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n initial: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n resolveStatusOptions: ResolveStatusOptions = () => [],\n reportUnknownDisplay?: UnknownDisplayReporter,\n): MutableAttributeSource => {\n let snapshot = localizeAttributes(record, initial, localize, decorate, resolveStatusOptions, reportUnknownDisplay);\n const listeners = new Set<() => void>();\n let signature = JSON.stringify(initial);\n return {\n source: {\n getSnapshot: () => snapshot,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n },\n set(attributes) {\n const nextSignature = JSON.stringify(attributes);\n if (nextSignature === signature) return;\n signature = nextSignature;\n snapshot = localizeAttributes(record, attributes, localize, decorate, resolveStatusOptions, reportUnknownDisplay);\n for (const listener of listeners) listener();\n },\n };\n};\nconst isExtensionResource = (resource: unknown): resource is ResourceRef =>\n Boolean(\n resource &&\n typeof resource === \"object\" &&\n typeof (\n resource as {\n type?: unknown;\n }\n ).type === \"string\" &&\n typeof (\n resource as {\n id?: unknown;\n }\n ).id === \"string\",\n );\nexport const defaultResolveRowResource = (_: WorkbenchExtensionKanbanRendererRecord, row: KanbanRendererRow) => {\n const { resource } = row;\n if (isExtensionResource(resource)) return resource;\n return undefined;\n};\nexport const defaultResolveRowActionResource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n) => {\n const fromRow = defaultResolveRowResource(record, row);\n if (fromRow) return fromRow;\n if (!record.resourceKind) return undefined;\n return {\n type: record.resourceKind,\n id: row.id,\n label: row.title,\n };\n};\nexport const toWorkbenchRow = (row: unknown, resolveResource: (row: KanbanRendererRow) => ResourceRef | undefined) => {\n const candidate = row as KanbanRendererRow;\n const resource = resolveResource(candidate);\n return resource === undefined ? candidate : ({ ...candidate, resource } as KanbanRendererRow);\n};\nexport const mergeParams = (...items: Array<Record<string, unknown> | undefined>) =>\n Object.assign({}, ...items.filter((item): item is Record<string, unknown> => Boolean(item)));\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\nconst hasCommandParameters = (params: Record<string, unknown> | undefined) => Object.keys(params ?? {}).length > 0;\nconst CREATE_FIELD_TYPES: ReadonlySet<string> = new Set<KanbanRendererCreateFieldType>([\n \"text\",\n \"longtext\",\n \"markdown\",\n \"number\",\n \"boolean\",\n \"select\",\n \"multi-select\",\n \"files\",\n]);\nconst toCreateField = (\n id: string,\n descriptor: NonNullable<NonNullable<WorkbenchExtensionKanbanRendererRecord[\"createRow\"]>[\"params\"]>[string],\n localize: Localizer,\n): KanbanRendererCreateField | undefined => {\n if (!CREATE_FIELD_TYPES.has(descriptor.type)) return undefined;\n const options =\n \"options\" in descriptor && Array.isArray(descriptor.options)\n ? (descriptor.options as Array<{\n value: string;\n label: string;\n icon?: string;\n }>)\n : [];\n const optional = descriptor as {\n placeholder?: unknown;\n multiple?: unknown;\n accept?: unknown;\n };\n return {\n id,\n label: localize(descriptor.label, id),\n description: descriptor.description === undefined ? undefined : localize(descriptor.description),\n placeholder: optional.placeholder === undefined ? undefined : localize(optional.placeholder),\n type: descriptor.type as KanbanRendererCreateFieldType,\n required: descriptor.required === true,\n defaultValue: descriptor.defaultValue,\n options:\n descriptor.type === \"select\" || descriptor.type === \"multi-select\"\n ? options.map((option) => ({\n value: option.value,\n label: localize(option.label, option.value),\n icon: option.icon,\n }))\n : undefined,\n multiple: descriptor.type === \"files\" ? optional.multiple !== false : undefined,\n accept: descriptor.type === \"files\" && typeof optional.accept === \"string\" ? optional.accept : undefined,\n };\n};\nexport const toCreateFields = (record: WorkbenchExtensionKanbanRendererRecord, localize: Localizer) =>\n Object.entries(record.createRow?.params ?? {}).flatMap(([id, descriptor]) => {\n const field = toCreateField(id, descriptor, localize);\n return field ? [field] : [];\n });\nconst createKanbanRendererSlot = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n) =>\n createExtensionSlot({\n id: record.id,\n kind: \"kanbanRenderer\",\n projectId: context.projectId,\n context: { kanbanRendererId: record.id },\n });\nexport const executeKanbanRendererCommand = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n) => {\n const commandResource = resource ?? context.workbench.getPrimaryResource();\n return executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n ...(pageParams ? { pageParams } : {}),\n projectId: context.projectId,\n ...(commandResource ? { resource: commandResource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource: commandResource,\n signal,\n slot: createKanbanRendererSlot(context, record),\n metadata: { kanbanRendererId: record.id },\n });\n};\nconst kanbanRendererRowActionCommandId = (record: WorkbenchExtensionKanbanRendererRecord, action: RowAction) =>\n `workbench.extension.kanbanRenderer.${record.id}.rowAction.${action.id}`;\nexport const registerRowActionCommands = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n localize: Localizer,\n) =>\n (record.rowActions ?? []).map((action) => {\n const target = context.workbench.commands.getCommand(action.commandId)?.command;\n return context.workbench.commands.registerCommand(\n {\n id: kanbanRendererRowActionCommandId(record, action),\n label: localize(action.label, action.id),\n icon: action.icon,\n params: target?.params,\n },\n {\n execute: (args, executionContext) =>\n executeKanbanRendererCommand(\n context,\n record,\n action.commandId,\n mergeParams(asParams(args)),\n executionContext?.resource,\n ),\n },\n );\n });\nexport const runDefaultRowAction = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n action: RowAction,\n row: KanbanRendererRow,\n resource: ResourceRef | undefined,\n localize: Localizer,\n) => {\n const commandId = kanbanRendererRowActionCommandId(record, action);\n const command = context.workbench.commands.getCommand(commandId);\n const args = { rowId: row.id };\n const executionContext = resource ? { resource } : undefined;\n const label = localize(action.label, action.id);\n if (command && hasCommandParameters(command.command.params)) {\n context.workbench.commandPalette.requestParams({ record: command, label, args, context: executionContext });\n return Promise.resolve();\n }\n if (command)\n return context.workbench.commands.executeCommand(command.command.id, args, executionContext).then(() => undefined);\n return executeKanbanRendererCommand(context, record, action.commandId, args, resource).then(() => undefined);\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport { renderBadgeListDisplay } from \"@pstdio/ui/kanban-renderer\";\nimport {\n kanbanBuiltInViews,\n legacyFiltersFromViewFilter,\n legacyOrderingFromSorts,\n type WorkbenchExtensionKanbanRendererRecord,\n} from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type { Disposable, KanbanRendererCreateSubmission, KanbanRendererQueryState, ResourceRef } from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type { ReactAttributeDescriptor as AttributeDescriptor } from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { collectionBadgeTarget } from \"./collection-badge-navigation\";\nimport type { WorkbenchExtensionKanbanRendererAdapter } from \"./kanban-renderer-adapter\";\nimport {\n createStatusOptionsResolver,\n statusColorConfig,\n toWorkbenchBoardColumnConfig,\n} from \"./kanban-renderer-board-config\";\nimport {\n createMutableAttributeSource,\n defaultResolveRowActionResource,\n defaultResolveRowResource,\n executeKanbanRendererCommand,\n isQueryResult,\n type KanbanRendererRow,\n type Localizer,\n mergeParams,\n registerRowActionCommands,\n runDefaultRowAction,\n toCreateFields,\n toWorkbenchRow,\n} from \"./kanban-renderer-contribution-helpers\";\nimport { mapViewToolbarActions } from \"./view-toolbar-actions\";\n\ntype ColumnConfigRecord = Record<string, WireBoardColumnConfig>;\n\nconst createRowActionIcon = (icon: string | undefined) =>\n icon ? createElement(WorkbenchIcon, { name: icon, size: 16 }) : undefined;\n\nconst toCreateRowConfig = (record: WorkbenchExtensionKanbanRendererRecord, localize: Localizer) => {\n if (!record.createRow) return undefined;\n return {\n title: localize(record.createRow.title, \"Create row\"),\n submitLabel: localize(record.createRow.submitLabel, \"Create\"),\n fields: toCreateFields(record, localize),\n labels: {\n cancel: localize(record.createRow.labels?.cancel, \"Cancel\"),\n properties: localize(record.createRow.labels?.properties, \"Properties\"),\n submitError: localize(record.createRow.labels?.submitError, \"Could not create resource.\"),\n removeFile: localize(record.createRow.labels?.removeFile, \"Remove file\"),\n submitWithoutOpening: localize(undefined, \"Create without opening\"),\n },\n };\n};\n\nconst toRowClick = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n resolveRowResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\n toActivatedRow: (row: KanbanRendererRow) => KanbanRendererRow,\n) => {\n if (record.rowActivationHandlerId) {\n return async (row: KanbanRendererRow) => {\n const resource = resolveRowResource(record, row);\n await executeKanbanRendererCommand(\n context,\n record,\n record.rowActivationHandlerId!,\n { row: toActivatedRow(row) },\n resource,\n );\n };\n }\n if (!adapter.onRowClick) return undefined;\n return (row: KanbanRendererRow) => adapter.onRowClick?.({ record, row, resource: resolveRowResource(record, row) });\n};\n\nconst toCreateRowHandler = (\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n runMutation: (\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n ) => Promise<unknown>,\n activateCreatedRow: ((row: KanbanRendererRow) => Promise<void> | void) | undefined,\n) => {\n const contribution = record.createRow;\n if (!contribution) return undefined;\n return async (submission: KanbanRendererCreateSubmission) => {\n const params = mergeParams(\n submission.values,\n contribution.columnParam ? { [contribution.columnParam]: submission.columnId } : undefined,\n contribution.attributesParam ? { [contribution.attributesParam]: submission.attributeValues } : undefined,\n );\n const created = await runMutation(record, contribution.commandId, params);\n await adapter.onAfterCreate?.({ record, created, submission });\n if (submission.openCreatedRow === false || !activateCreatedRow || typeof created !== \"object\" || created === null)\n return;\n const row = created as Partial<KanbanRendererRow>;\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") return;\n await activateCreatedRow({ ...row, id: row.id, title: row.title, attributes: row.attributes ?? {} });\n };\n};\n\nconst toRowContextMenuActions = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n localize: Localizer,\n resolveRowActionResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\n) => {\n const actions = record.rowActions;\n if (!actions?.length) return undefined;\n return (row: KanbanRendererRow) =>\n actions.map((action) => {\n const resource = resolveRowActionResource(record, row);\n const runDefault = () => runDefaultRowAction(context, record, action, row, resource, localize);\n return {\n key: action.id,\n label: localize(action.label, action.id),\n commandId: action.commandId,\n icon: createRowActionIcon(action.icon),\n onClick: () =>\n adapter.executeRowAction\n ? adapter.executeRowAction({ record, action, row, resource, runDefault })\n : runDefault(),\n };\n });\n};\n\nexport const registerWorkbenchExtensionKanbanRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionKanbanRendererRecord[],\n adapter: WorkbenchExtensionKanbanRendererAdapter = {},\n) => {\n const disposables: Disposable[] = [];\n const localize: Localizer =\n adapter.resolveLabel ?? ((value, fallback) => text(value as Parameters<typeof text>[0], fallback));\n const decorate = (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => {\n const withBuiltInDisplay =\n attribute.display?.kind === \"badge-list\"\n ? {\n ...attribute,\n render: (value: unknown, row: KanbanRendererRow) =>\n renderBadgeListDisplay(attribute, value, row, undefined, (id) => {\n if (attribute.display?.kind !== \"badge-list\") return;\n const target = collectionBadgeTarget(\n row,\n attribute.display.itemsAttributeId,\n id,\n record.extensionId,\n context.projectId,\n );\n return target\n ? () => {\n void context.workbench.navigation.openTarget(target);\n }\n : undefined;\n }),\n }\n : attribute;\n return adapter.decorateAttribute?.(record, withBuiltInDisplay) ?? withBuiltInDisplay;\n };\n const resolveRowResource = adapter.resolveRowResource ?? defaultResolveRowResource;\n const resolveRowActionResource = adapter.resolveRowActionResource ?? defaultResolveRowActionResource;\n const afterMutation = adapter.onAfterMutation ?? (() => {});\n\n const runMutation = (\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n ) =>\n executeKanbanRendererCommand(context, record, commandId, params).then((result) => {\n afterMutation(record);\n return result;\n });\n\n for (const record of records) {\n const resolveStatusOptions = createStatusOptionsResolver(context, record);\n const reportUnknownDisplay = (attributeId: string, kind: string) =>\n context.workbench.notifications.show({\n id: `workbench.extension.${record.extensionId}.kanban.${record.id}.display.${attributeId}`,\n level: \"error\",\n title: \"Extension display is not available\",\n message: `Attribute \"${attributeId}\" in renderer \"${record.id}\" uses unknown display kind \"${kind}\".`,\n });\n const attributes = createMutableAttributeSource(\n record,\n record.attributes,\n localize,\n decorate,\n resolveStatusOptions,\n reportUnknownDisplay,\n );\n let wireAttributes = record.attributes;\n const builtIns = kanbanBuiltInViews(record);\n let columnGrouping = builtIns.settings.columnGrouping;\n const originalRows = new WeakMap<KanbanRendererRow, KanbanRendererRow>();\n let columnConfigs: ColumnConfigRecord | undefined;\n let latestQueryId = 0;\n let rowCache = new Map<string, { signature: string; row: KanbanRendererRow }>();\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, row);\n const toActivatedRow = (row: KanbanRendererRow) => originalRows.get(row) ?? row;\n const onRowActivate = toRowClick(context, record, adapter, resolveRowResource, toActivatedRow);\n\n disposables.push(...registerRowActionCommands(context, record, localize));\n disposables.push(\n context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"kanban\",\n resourceKind: record.resourceKind,\n toolbarActions: mapViewToolbarActions(record),\n listRowActions: () =>\n (record.rowActions ?? []).map((action) => ({\n commandId: action.commandId,\n label: localize(action.label, action.id),\n })),\n storageScope: context.projectId,\n attributes: attributes.source,\n defaultSettings: builtIns.settings,\n defaultFilter: record.defaultFilter,\n defaultSorts: record.defaultSorts,\n viewsProvider: adapter.createViewsProvider?.(record),\n defaultViews: builtIns.views.map((view) => ({ ...view, title: localize(view.title, view.id) })),\n defaultActiveViewId: record.defaultActiveViewId,\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n hideToolbar: record.hideToolbar,\n createRow: toCreateRowConfig(record, localize),\n getBoardColumnConfig: (groupKey) =>\n toWorkbenchBoardColumnConfig(\n columnConfigs?.[groupKey] ?? statusColorConfig(context, record, wireAttributes, columnGrouping, groupKey),\n localize,\n ),\n onRowActivate,\n executeQuery: async (state: KanbanRendererQueryState, signal) => {\n latestQueryId += 1;\n const queryId = latestQueryId;\n const value = await executeKanbanRendererCommand(\n context,\n record,\n record.queryHandlerId,\n {\n // Old extensions still read `filters` and `settings.ordering`; both are derived from the view.\n settings: { ...state.settings, ordering: legacyOrderingFromSorts(state.sorts) },\n filter: state.filter,\n sorts: state.sorts,\n filters: legacyFiltersFromViewFilter(state.filter),\n },\n undefined,\n signal,\n state.pageParams,\n );\n const mapRows = (rows: unknown[]) => {\n const nextCache = new Map<string, { signature: string; row: KanbanRendererRow }>();\n const result = rows.map((row) => {\n const candidate = row as KanbanRendererRow;\n const signature = JSON.stringify(row);\n const cached = rowCache.get(candidate.id);\n const mapped = cached?.signature === signature ? cached.row : toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, candidate);\n nextCache.set(mapped.id, { signature, row: mapped });\n return mapped;\n });\n if (queryId === latestQueryId) rowCache = nextCache;\n return result;\n };\n if (queryId !== latestQueryId) {\n if (Array.isArray(value)) return mapRows(value);\n return isQueryResult(value) ? mapRows(value.rows ?? []) : [];\n }\n\n columnGrouping = state.settings.columnGrouping;\n if (Array.isArray(value)) return mapRows(value);\n if (!isQueryResult(value)) return [];\n const nextAttributes = value.attributes ?? wireAttributes;\n wireAttributes = nextAttributes;\n attributes.set(nextAttributes);\n columnConfigs = value.boardColumnConfigs;\n return mapRows(value.rows ?? []);\n },\n onAttributeChange: record.attributeChangeHandlerId\n ? (rowId, attributeId, value) =>\n runMutation(record, record.attributeChangeHandlerId!, {\n rowId,\n attributeId,\n value,\n }).then(() => undefined)\n : undefined,\n onMove: record.moveHandlerId\n ? (move) => runMutation(record, record.moveHandlerId!, { ...move }).then(() => undefined)\n : undefined,\n onReorder: record.reorderHandlerId\n ? (rowId, beforeRowId) =>\n runMutation(record, record.reorderHandlerId!, { rowId, beforeRowId }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(\n record,\n adapter,\n runMutation,\n record.rowActivationHandlerId ? onRowActivate : undefined,\n ),\n onColumnAction: record.columnActionHandlerId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionHandlerId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(\n context,\n record,\n adapter,\n localize,\n resolveRowActionResource,\n ),\n },\n }),\n );\n }\n\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { TreeContext } from \"../../core\";\nimport { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nimport type {\n ExtensionTreeNode,\n ExtensionTreeRendererRecord,\n ExtensionTreeResource,\n} from \"./tree-renderer-contribution-types\";\nimport type { RegisterWorkbenchExtensionTreeRenderersInput } from \"./tree-renderer-contributions\";\n\nconst slotContext = (input: {\n modeId?: string;\n projectId: string;\n resource?: ExtensionTreeResource;\n treeId: string;\n}) => ({\n id: input.treeId,\n kind: \"renderer\" as const,\n context: {\n projectId: input.projectId,\n treeId: input.treeId,\n ...(input.modeId ? { modeId: input.modeId } : {}),\n ...(input.resource ? { resourceType: input.resource.type, resourceId: input.resource.id } : {}),\n },\n});\nexport const createQueryParams = (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n ctx: TreeContext,\n node?: ExtensionTreeNode,\n) => {\n const resource = ctx.resource;\n const modeId = input.workbench.modes.getActiveModeId();\n return {\n renderer: {\n rendererId: record.id,\n ...(ctx.pageParams ? { pageParams: ctx.pageParams } : {}),\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n state: ctx.state,\n ...(ctx.filter ? { filter: ctx.filter } : {}),\n ...(node ? { node } : {}),\n };\n};\nexport const executeCallback = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n signal?: AbortSignal,\n) => {\n const renderer = params.renderer as\n | {\n modeId?: string;\n resource?: ExtensionTreeResource;\n }\n | undefined;\n const resource = renderer?.resource;\n return executeWorkbenchExtensionCommand(input, commandId, {\n params,\n signal,\n resource,\n slot: slotContext({\n modeId: renderer?.modeId,\n projectId: input.projectId,\n resource,\n treeId: record.id,\n }),\n });\n};\nexport const executeTreeActionCommand = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown> | undefined,\n resource: ExtensionTreeResource | undefined,\n) => {\n const modeId = input.workbench.modes.getActiveModeId();\n const rendererParams = {\n ...(params ?? {}),\n renderer: {\n rendererId: record.id,\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n };\n return executeWorkbenchExtensionCommand(input, commandId, {\n params: rendererParams,\n resource,\n slot: slotContext({ modeId, projectId: input.projectId, resource, treeId: record.id }),\n metadata: { treeId: record.id },\n });\n};\n","import type { TreeContext, TreeNode } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport type { ExtensionTreeRendererRecord, ExtensionTreeViewRecord } from \"./tree-renderer-contribution-types\";\n\nexport interface HostTreeDefaultNodesInput {\n ctx: TreeContext;\n record: ExtensionTreeRendererRecord;\n panel: ExtensionTreeViewRecord;\n}\n\nexport type HostTreeDefaultNodesResolver = (input: HostTreeDefaultNodesInput) => Promise<TreeNode[]> | TreeNode[];\n\ninterface ResolveHostTreeDefaultInput {\n ctx: TreeContext;\n record: ExtensionTreeRendererRecord;\n treeViews: ExtensionTreeViewRecord[];\n}\n\ninterface ResolveHostTreeHeaderInput extends ResolveHostTreeDefaultInput {\n getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;\n}\n\ninterface ResolveHostTreeFooterInput extends ResolveHostTreeDefaultInput {\n getHostTreeFooterNodes?: HostTreeDefaultNodesResolver;\n}\n\nexport const treeViewsFor = (\n metadata: WorkbenchExtensionMetadata,\n record: ExtensionTreeRendererRecord,\n): ExtensionTreeViewRecord[] =>\n metadata.panels\n .flatMap((panel) => [panel, ...(panel.panelMenus ?? [])])\n .filter((panel) => panel.renderer?.kind === \"tree\" && panel.renderer.id === record.id);\n\nconst resolveTreeView = (panels: ExtensionTreeViewRecord[], ctx: TreeContext) => {\n if (ctx.viewId) return panels.find((panel) => panel.id === ctx.viewId);\n return panels.length === 1 ? panels[0] : undefined;\n};\n\nexport const resolveHostTreeHeaderNodes = async (input: ResolveHostTreeHeaderInput) => {\n const { ctx, getHostTreeHeaderNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeHeader\" in panel) || panel.hostTreeHeader !== \"default\") return [];\n return (await getHostTreeHeaderNodes?.({ ctx, record, panel })) ?? [];\n};\n\nexport const resolveHostTreeFooterNodes = async (input: ResolveHostTreeFooterInput) => {\n const { ctx, getHostTreeFooterNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeFooter\" in panel) || panel.hostTreeFooter !== \"default\") return [];\n return (await getHostTreeFooterNodes?.({ ctx, record, panel })) ?? [];\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport { commandRefId } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n NavigationTarget,\n ResourceRef,\n TreeAction,\n TreeContext,\n TreeNode,\n TreeViewSection,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\n\nimport { localizeParamSchema } from \"./param-schema-localization\";\nimport { createQueryParams, executeCallback, executeTreeActionCommand } from \"./tree-renderer-callbacks\";\nimport type {\n ExtensionTreeAction,\n ExtensionTreeNode,\n ExtensionTreeRendererRecord,\n ExtensionTreeResource,\n ExtensionTreeSection,\n ExtensionTreeTarget,\n TargetCommandArgs,\n} from \"./tree-renderer-contribution-types\";\nimport {\n type HostTreeDefaultNodesResolver,\n resolveHostTreeFooterNodes,\n resolveHostTreeHeaderNodes,\n treeViewsFor,\n} from \"./tree-renderer-host-defaults\";\nexport interface RegisterWorkbenchExtensionTreeRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n getHostTreeFooterNodes?: HostTreeDefaultNodesResolver;\n getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n /**\n * Host canonicalization for node resources. A host that gives extension\n * resources its own URIs (layout scopes, history, and hierarchy key on the\n * URI) must convert tree node resources the same way, or the same resource\n * gets a second identity when opened from a tree.\n */\n resolveNodeResource?: (resource: ExtensionTreeResource) => ResourceRef;\n workbench: WorkbenchModuleContext;\n}\nconst toActionParams = (params: unknown, fallback: Record<string, unknown> | undefined) => {\n if (params && typeof params === \"object\" && !Array.isArray(params)) return params as Record<string, unknown>;\n return fallback;\n};\nconst toRecordParams = (params: object | undefined) =>\n params && !Array.isArray(params) ? (params as Record<string, unknown>) : undefined;\nconst createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\n const resolveResource: (resource: ExtensionTreeResource) => ResourceRef = (resource) => {\n const resolved = input.resolveNodeResource?.(resource);\n return resolved ?? resource;\n };\n const mapEmptyState = (section: ExtensionTreeSection): TreeViewSection[\"emptyState\"] => {\n if (!section.emptyState) return undefined;\n return {\n title: text(section.emptyState.title),\n description: text(section.emptyState.description),\n icon: section.emptyState.icon,\n };\n };\n const mapTarget = (\n target: ExtensionTreeTarget | undefined,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): NavigationTarget | undefined => {\n if (!target) return undefined;\n const commandTargetOf = (\n commandTarget: Extract<\n ExtensionTreeTarget,\n {\n kind: \"command\";\n }\n >,\n ) => ({\n kind: \"command\" as const,\n commandId: runnerCommandId,\n args: {\n commandId: `${commandTarget.target.command.extensionId ?? record.extensionId}.command.${commandTarget.target.command.id}`,\n ...(node ? { nodeId: node.id } : {}),\n params: commandTarget.target.params,\n resource: node?.resource ?? ctx.resource,\n treeId: record.id,\n } satisfies TargetCommandArgs,\n });\n return toWorkbenchNavigationTarget(target, {\n commandTargetOf,\n extensionId: record.extensionId,\n projectId: input.projectId,\n });\n };\n const mapAction = (\n action: ExtensionTreeAction,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): TreeAction => {\n const commandId = action.command\n ? commandRefId({ ...action.command, extensionId: action.command.extensionId ?? record.extensionId })\n : undefined;\n return {\n id: action.id,\n resourceMutation: input.metadata.commands.find((command) => command.id === commandId)?.resourceMutation,\n label: text(action.label),\n icon: action.icon,\n args: toRecordParams(action.params),\n params: localizeParamSchema(action.input, text, record.extensionId),\n submitLabel: action.submitLabel,\n when: action.when,\n disabled: action.disabled,\n // Actions mutate tree data (create/delete/...), so refresh afterwards. Plain\n // node-target navigation runs through the runner command and must not refetch.\n run: commandId\n ? async (params) => {\n const actionParams = toActionParams(params, toRecordParams(action.params));\n if (action.command?.extensionId === \"pstdio\") {\n await input.workbench.commands.executeCommand(commandId, actionParams, {\n resource: node?.resource ?? ctx.resource,\n });\n return;\n }\n await executeTreeActionCommand(input, record, commandId, actionParams, node?.resource ?? ctx.resource);\n ctx.refresh();\n }\n : undefined,\n };\n };\n const mapNode = (node: ExtensionTreeNode, ctx: TreeContext): TreeNode => {\n const mapped: TreeNode = {\n id: node.id,\n selected: node.selected,\n label: text(node.label),\n icon: node.icon,\n iconColor: node.iconColor,\n badge: node.badge,\n iconTooltip: node.iconTooltip,\n tooltip: node.tooltip,\n resource: node.resource ? resolveResource(node.resource) : undefined,\n target: mapTarget(node.target, node, ctx),\n rowVariant: node.rowVariant,\n actions: node.actions?.map((action) => mapAction(action, node, ctx)),\n contextMenuActions: node.contextMenuActions?.map((action) => mapAction(action, node, ctx)),\n collapsible: node.collapsible,\n disabled: node.disabled,\n children: node.children?.map((child) => mapNode(child, ctx)),\n description: node.description,\n contextValue: node.contextValue,\n hiddenByDefault: node.hiddenByDefault,\n canHide: node.canHide,\n canDrag: node.canDrag,\n canDrop: node.canDrop,\n };\n originalNodes.set(mapped, node);\n return mapped;\n };\n const mapSections = (sections: ExtensionTreeSection[], ctx: TreeContext): TreeViewSection[] =>\n sections.map((section) => ({\n id: section.id,\n label: text(section.label),\n actions: section.actions?.map((action) => mapAction(action, undefined, ctx)),\n collapsible: section.collapsible,\n emptyState: mapEmptyState(section),\n nodes: section.nodes.map((node) => mapNode(node, ctx)),\n hiddenByDefault: section.hiddenByDefault,\n canHide: section.canHide,\n }));\n const mapNodes = (nodes: ExtensionTreeNode[], ctx: TreeContext): TreeNode[] =>\n nodes.map((node) => mapNode(node, ctx));\n return { mapNodes, mapSections, originalNodes, runnerCommandId };\n};\nconst isTreeSectionArray = (value: unknown): value is ExtensionTreeSection[] =>\n Array.isArray(value) && value.every((section) => section && typeof section === \"object\" && \"nodes\" in section);\nconst isTreeNodeArray = (value: unknown): value is ExtensionTreeNode[] =>\n Array.isArray(value) && value.every((node) => node && typeof node === \"object\" && \"id\" in node);\nconst hostNodeSection = (id: string, nodes: TreeNode[]): TreeViewSection[] =>\n nodes.length > 0 ? [{ id, nodes, canReorder: false }] : [];\nconst registerTree = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const mapper = createTreeMapper(input, record);\n const treeViews = treeViewsFor(input.metadata, record);\n const commandDisposable = input.workbench.commands.registerCommand(\n { id: mapper.runnerCommandId, label: `${text(record.title, record.id)} tree command` },\n {\n execute: async (rawArgs) => {\n const args = rawArgs as TargetCommandArgs;\n const result = await executeTreeActionCommand(input, record, args.commandId, args.params, args.resource);\n for (const view of input.workbench.views.listViews()) {\n if (view.body.kind === \"file\") input.workbench.views.refreshView(view.id);\n }\n return result;\n },\n },\n );\n const treeDisposable = input.workbench.views.registerView({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"tree\",\n searchable: record.searchable,\n searchPlaceholder: text(record.searchPlaceholder, \"Search files\"),\n defaultExpandedNodeIds: record.defaultExpandedNodeIds,\n defaultExpandedSectionIds: record.defaultExpandedSectionIds,\n getHeader: async (ctx) => {\n const hostHeader = await resolveHostTreeHeaderNodes({\n ctx,\n getHostTreeHeaderNodes: input.getHostTreeHeaderNodes,\n record,\n treeViews,\n });\n if (!record.headerHandlerId) return hostNodeSection(`${record.id}:host-header`, hostHeader);\n const result = await executeCallback(\n input,\n record,\n record.headerHandlerId,\n createQueryParams(input, record, ctx),\n ctx.signal,\n );\n const extensionHeader = isTreeSectionArray(result) ? mapper.mapSections(result, ctx) : [];\n return [...hostNodeSection(`${record.id}:host-header`, hostHeader), ...extensionHeader];\n },\n getBody: async (ctx) => {\n const result = await executeCallback(\n input,\n record,\n record.bodyHandlerId,\n createQueryParams(input, record, ctx),\n ctx.signal,\n );\n if (!isTreeSectionArray(result)) return [];\n return mapper.mapSections(result, ctx);\n },\n getFooter: async (ctx) => {\n const hostFooter = await resolveHostTreeFooterNodes({\n ctx,\n getHostTreeFooterNodes: input.getHostTreeFooterNodes,\n record,\n treeViews,\n });\n if (!record.footerHandlerId) return hostNodeSection(`${record.id}:host-footer`, hostFooter);\n const result = await executeCallback(\n input,\n record,\n record.footerHandlerId,\n createQueryParams(input, record, ctx),\n ctx.signal,\n );\n const extensionFooter = isTreeSectionArray(result) ? mapper.mapSections(result, ctx) : [];\n return [...extensionFooter, ...hostNodeSection(`${record.id}:host-footer`, hostFooter)];\n },\n moveNode: record.moveHandlerId\n ? async (source, target, ctx) => {\n const originalSource = mapper.originalNodes.get(source);\n const originalTarget = target ? mapper.originalNodes.get(target) : undefined;\n if (!originalSource?.canDrag || (target && !originalTarget?.canDrop)) return;\n await executeCallback(input, record, record.moveHandlerId!, {\n ...createQueryParams(input, record, ctx),\n source: originalSource,\n target: originalTarget,\n position: ctx.position ?? \"inside\",\n });\n ctx.refresh();\n }\n : undefined,\n getChildren: async (node, ctx) => {\n if (!record.childrenHandlerId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node);\n if (!originalNode) return node.children ?? [];\n const result = await executeCallback(\n input,\n record,\n record.childrenHandlerId,\n createQueryParams(input, record, ctx, originalNode),\n ctx.signal,\n );\n return isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n },\n },\n });\n return {\n dispose() {\n treeDisposable.dispose();\n commandDisposable.dispose();\n },\n };\n};\nexport const registerWorkbenchExtensionTreeRenderers = (input: RegisterWorkbenchExtensionTreeRenderersInput) => {\n const disposables: Disposable[] = [];\n for (const record of input.metadata.treeRenderers ?? []) {\n disposables.push(registerTree(input, record));\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n NavigationTreeOwner,\n NavigationTreeSlot,\n TreeNode,\n TreeViewSection,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { navigationSlotRootSectionId } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\n\ntype NavigationItem = WorkbenchExtensionMetadata[\"navigationItems\"][number];\ntype NavigationTree = WorkbenchExtensionMetadata[\"navigationTrees\"][number];\n\nexport interface RegisterWorkbenchExtensionNavigationItemsInput {\n createWhenExpression?: (when: NavigationItem[\"when\"]) => string | undefined;\n metadata: Pick<WorkbenchExtensionMetadata, \"navigationItems\" | \"navigationTrees\">;\n workbench: WorkbenchModuleContext;\n}\n\nconst toOwner = (ref: NavigationItem[\"owner\"] | NavigationTree[\"owner\"]): NavigationTreeOwner => ({\n kind: ref.kind,\n id: contributionRefId(ref),\n extensionId: ref.extensionId,\n});\n\nconst isVisible = (\n workbench: WorkbenchModuleContext,\n item: NavigationItem,\n createWhenExpression: RegisterWorkbenchExtensionNavigationItemsInput[\"createWhenExpression\"],\n) => {\n const expression = createWhenExpression?.(item.when);\n if (!expression) return true;\n return workbench.context.matches(expression);\n};\n\nconst toNode = (item: NavigationItem): TreeNode => ({\n id: item.id,\n label: text(item.label, item.id),\n icon: item.icon,\n canHide: true,\n canReorder: true,\n target: toWorkbenchNavigationTarget(item.action as ExtensionNavigationTarget, { extensionId: item.extensionId }),\n});\n\nconst toSections = (\n workbench: WorkbenchModuleContext,\n items: NavigationItem[],\n createWhenExpression: RegisterWorkbenchExtensionNavigationItemsInput[\"createWhenExpression\"],\n) => {\n const sections = new Map<string, TreeViewSection>();\n for (const item of items) {\n if (!isVisible(workbench, item, createWhenExpression)) continue;\n const label = item.group || undefined;\n const id = label ? `${item.extensionId}:${label}` : navigationSlotRootSectionId(item.slot as NavigationTreeSlot);\n const section = sections.get(id) ?? {\n id,\n label,\n collapsible: Boolean(label),\n canHide: true,\n canReorder: true,\n nodes: [],\n };\n section.nodes.push(toNode(item));\n sections.set(id, section);\n }\n return [...sections.values()];\n};\n\nconst groupItems = (items: NavigationItem[]) => {\n const groups = new Map<string, NavigationItem[]>();\n for (const item of items) {\n const owner = toOwner(item.owner);\n const key = `${item.extensionId}:${owner.kind}:${owner.id}:${item.slot}`;\n groups.set(key, [...(groups.get(key) ?? []), item]);\n }\n return [...groups.values()];\n};\n\nconst defaultExpandedGroupIds = (items: NavigationItem[]) => [\n ...new Set(items.flatMap((item) => (item.group ? [`${item.extensionId}:${item.group}`] : []))),\n];\n\nconst registerItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n groupItems(input.metadata.navigationItems).map((items) => {\n const first = items[0]!;\n const resourceDependent = items.some((item) => item.when?.resourceType?.length || item.when?.metadata);\n return input.workbench.navigationTrees.registerContribution({\n id: `${first.extensionId}.navigation-items.${first.owner.kind}.${contributionRefId(first.owner)}.${first.slot}`,\n owner: toOwner(first.owner),\n sourceExtensionId: first.extensionId,\n declarationIndex: input.metadata.navigationItems.indexOf(first),\n slot: first.slot,\n defaultExpandedSectionIds: defaultExpandedGroupIds(items),\n ...(!resourceDependent ? { resolveResource: () => undefined } : {}),\n getSections: () => toSections(input.workbench, items, input.createWhenExpression),\n listActions: () =>\n items.map((item) => ({\n label: text(item.label, item.id),\n category: item.group || undefined,\n action: toWorkbenchNavigationTarget(item.action as ExtensionNavigationTarget, {\n extensionId: item.extensionId,\n }),\n })),\n });\n });\n\nconst registerTrees = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n input.metadata.navigationTrees.map((tree, declarationIndex) => {\n const viewId = contributionRefId(tree.view);\n return input.workbench.navigationTrees.registerContribution({\n id: tree.id,\n idScope: tree.id,\n owner: toOwner(tree.owner),\n sourceExtensionId: tree.extensionId,\n declarationIndex: input.metadata.navigationItems.length + declarationIndex,\n slot: tree.slot as NavigationTreeSlot,\n viewId,\n ...(tree.resourceScope === \"project\" ? { resolveResource: () => undefined } : {}),\n });\n });\n\nexport const registerWorkbenchExtensionNavigationItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n [...registerItems(input), ...registerTrees(input)] satisfies Disposable[];\n","import type { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { commandRefId } from \"@pstdio/sdk/extensions\";\nimport type { ExtensionKeybindingRecord } from \"pstdio-api-contracts\";\nimport type { WorkbenchModuleContext } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\n\ntype KeybindingPlatform = keyof NonNullable<ExtensionKeybindingRecord[\"platformOverrides\"]>;\n\nconst currentPlatform = (): KeybindingPlatform | undefined => {\n if (typeof navigator === \"undefined\") return undefined;\n const platform = `${navigator.platform} ${navigator.userAgent}`.toLowerCase();\n if (platform.includes(\"mac\")) return \"mac\";\n if (platform.includes(\"win\")) return \"win\";\n if (platform.includes(\"linux\")) return \"linux\";\n return undefined;\n};\n\nexport const resolveExtensionKeybindingChord = (binding: ExtensionKeybindingRecord, platform = currentPlatform()) =>\n (platform ? binding.platformOverrides?.[platform] : undefined) ?? binding.key;\n\nexport const registerWorkbenchExtensionKeybindings = (input: {\n bindings: ExtensionKeybindingRecord[];\n createWhenExpression?: (when: ExtensionKeybindingRecord[\"when\"]) => string | undefined;\n workbench: WorkbenchModuleContext;\n}) =>\n input.bindings.map((binding) =>\n input.workbench.keybindings.registerKeybinding({\n sourceExtensionId: binding.extensionId,\n action: toWorkbenchNavigationTarget(binding.action as ExtensionNavigationTarget, {\n commandIdOf: (command) =>\n command.extensionId ? commandRefId({ extensionId: command.extensionId, id: command.id }) : undefined,\n }),\n keybinding: resolveExtensionKeybindingChord(binding),\n when: input.createWhenExpression?.(binding.when),\n }),\n );\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { type ContributionKind, contributionRefId } from \"@pstdio/sdk/extensions\";\n\nexport type MetadataRef = { extensionId: string; kind: ContributionKind; id: string };\n\nexport const toWorkbenchWhenExpression = (\n when:\n | WorkbenchExtensionMetadata[\"navigationItems\"][number][\"when\"]\n | WorkbenchExtensionMetadata[\"statusBarItems\"][number][\"when\"],\n) => {\n if (!when) return undefined;\n const ids = (value: MetadataRef | MetadataRef[] | undefined) => {\n if (!value) return undefined;\n return Array.isArray(value) ? value.map((ref) => contributionRefId(ref)) : contributionRefId(value);\n };\n return {\n mode: ids(when.mode as MetadataRef | MetadataRef[] | undefined),\n source: when.source,\n viewId: ids(when.view as MetadataRef | MetadataRef[] | undefined),\n resourceType: when.resourceType?.map((ref) => ref.id),\n metadata: when.metadata,\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageMain, WorkbenchPageSlot } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\n\nimport type { WorkbenchExtensionTabMetadata } from \"./workbench-extension-tab-presentation\";\n\ntype MetadataPage = WorkbenchExtensionMetadata[\"pages\"][number];\ninterface PagePresentationInput {\n extensionId: string;\n placementId: string;\n createTab?(metadata: WorkbenchExtensionTabMetadata): WorkbenchPageSlot[\"tab\"];\n}\nconst pageSlot = (slot: MetadataPage[\"slots\"][number], input: PagePresentationInput): WorkbenchPageSlot => ({\n ...slot,\n tab:\n slot.tab && input.createTab\n ? input.createTab({ ...slot.tab, extensionId: input.extensionId, placementId: input.placementId })\n : undefined,\n});\nconst pageMain = (main: MetadataPage[\"main\"], input: PagePresentationInput): WorkbenchPageMain => {\n if (main.kind === \"panels\") return main;\n return {\n ...main,\n tab:\n main.tab && input.createTab\n ? input.createTab({ ...main.tab, extensionId: input.extensionId, placementId: input.placementId })\n : undefined,\n };\n};\nexport const toInternalWorkbenchPages = (\n metadata: WorkbenchExtensionMetadata,\n createTab?: PagePresentationInput[\"createTab\"],\n): InternalWorkbenchExtensionMetadata[\"pages\"] =>\n metadata.pages.map((page) => ({\n id: page.id,\n ref: { extensionId: page.extensionId, kind: \"page\", id: page.localId },\n title: page.title,\n path: page.path,\n document: page.document,\n params: page.params,\n modeId: contributionRefId(page.mode),\n resource: page.resource,\n main: pageMain(page.main, { extensionId: page.extensionId, placementId: `${page.id}.$main`, createTab }),\n slots: page.slots.map((slot) =>\n pageSlot(slot, { extensionId: page.extensionId, placementId: `${page.id}.${slot.id}`, createTab }),\n ),\n ...(page.icon ? { icon: page.icon } : {}),\n ...(page.parent ? { parentId: contributionRefId(page.parent) } : {}),\n }));\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { commandRefId, contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { ParamObjectSchema } from \"pstdio-api-contracts\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\nimport { toWorkbenchWhenExpression } from \"./workbench-extension-metadata-ref\";\nimport { toInternalWorkbenchPages } from \"./workbench-extension-page-metadata\";\nimport type { WorkbenchExtensionTabMetadata } from \"./workbench-extension-tab-presentation\";\n\ntype MetadataView = WorkbenchExtensionMetadata[\"views\"][number];\nconst resourceKindForView = (metadata: WorkbenchExtensionMetadata, viewId: string) => {\n const bindings = metadata.pages.flatMap((page) => [\n ...(page.main.kind === \"view\" && page.resource ? [{ ...page.resource, view: page.main.view }] : []),\n ...page.slots.flatMap((slot) => (slot.item.kind === \"binding\" ? [slot.item.binding] : [])),\n ]);\n bindings.push(\n ...metadata.placements.flatMap((placement) => (placement.item.kind === \"binding\" ? [placement.item.binding] : [])),\n );\n return bindings.find((binding) => contributionRefId(binding.view) === viewId)?.kinds[0]?.id;\n};\nconst viewBody = (view: MetadataView) =>\n view.body.kind === \"webview\" ? { webview: view.body.webview } : { renderer: { kind: view.body.kind, id: view.id } };\nconst panelMenus = (metadata: WorkbenchExtensionMetadata, owner: MetadataView) =>\n metadata.viewMenus.flatMap((menu) => {\n if (contributionRefId(menu.owner) !== owner.id) return [];\n const view = metadata.views.find((candidate) => candidate.id === contributionRefId(menu.view));\n if (!view) return [];\n return [\n {\n id: menu.id,\n extensionId: menu.extensionId,\n ownerPanelId: owner.id,\n viewId: view.id,\n title: view.title,\n side: menu.side,\n group: menu.group,\n placement: menu.placement,\n hostTreeHeader: menu.hostTreeHeader,\n hostTreeFooter: menu.hostTreeFooter,\n ...viewBody(view),\n },\n ];\n });\nconst panels = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"panels\"] =>\n metadata.views.map((view) => {\n const menus = panelMenus(metadata, view);\n return {\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n panelMenus: menus.length > 0 ? menus : undefined,\n ...viewBody(view),\n };\n });\nconst commandActions = <\n T extends {\n command: {\n extensionId: string;\n id: string;\n };\n },\n>(\n actions: T[] | undefined,\n) => actions?.map(({ command, ...action }) => ({ ...action, commandId: commandRefId(command) }));\nconst kanbanRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"kanbanRenderers\"] =>\n metadata.views.flatMap((view) => {\n const body = view.body;\n if (body.kind !== \"kanban\") return [];\n return [\n {\n ...body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: body.resourceKind ?? resourceKindForView(metadata, view.id),\n createRow: body.createRow\n ? {\n title: body.createRow.title,\n submitLabel: body.createRow.submitLabel,\n columnParam: body.createRow.columnParam,\n params: body.createRow.params as ParamObjectSchema | undefined,\n attributesParam: body.createRow.attributesParam,\n labels: body.createRow.labels,\n commandId: commandRefId(body.createRow.command),\n attachments: body.createRow.attachments\n ? {\n resourceParam: body.createRow.attachments.resourceParam,\n fileParam: body.createRow.attachments.fileParam,\n commandId: commandRefId(body.createRow.attachments.command),\n }\n : undefined,\n }\n : undefined,\n rowActions: commandActions(body.rowActions),\n toolbarActions: commandActions(body.toolbarActions),\n },\n ];\n });\nconst dataTableRenderers = (\n metadata: WorkbenchExtensionMetadata,\n): InternalWorkbenchExtensionMetadata[\"dataTableRenderers\"] =>\n metadata.views.flatMap((view) => {\n const body = view.body;\n if (body.kind !== \"dataTable\") return [];\n return [\n {\n ...body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: body.resourceKind ?? resourceKindForView(metadata, view.id),\n selectionActions: commandActions(body.selectionActions),\n rowActions: commandActions(body.rowActions),\n toolbarActions: commandActions(body.toolbarActions),\n },\n ];\n });\nconst treeRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"treeRenderers\"] =>\n metadata.views.flatMap((view) =>\n view.body.kind === \"tree\"\n ? [\n {\n ...view.body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: view.body.resourceKind ?? resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\nconst fileRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"fileRenderers\"] =>\n metadata.views.flatMap((view) =>\n view.body.kind === \"file\"\n ? [\n {\n ...view.body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: view.body.resourceKind ?? resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\nconst controlsRenderers = (\n metadata: WorkbenchExtensionMetadata,\n): InternalWorkbenchExtensionMetadata[\"controlsRenderers\"] =>\n metadata.views.flatMap((view) =>\n view.body.kind === \"controls\"\n ? [\n {\n ...view.body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: view.body.resourceKind ?? resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\nconst modes = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"modes\"] =>\n metadata.modes.map((mode) => ({\n id: mode.id,\n extensionId: mode.extensionId,\n modeId: mode.id,\n label: mode.label,\n icon: mode.icon,\n panelRegions: mode.regions,\n regionSettings: mode.regionSettings,\n floatingPanels: mode.floatingPanels,\n ...(mode.defaultTheme ? { defaultTheme: contributionRefId(mode.defaultTheme) } : {}),\n ...(mode.chrome\n ? {\n chrome: Object.fromEntries(\n Object.entries(mode.chrome).map(([region, view]) => [\n region,\n view === false ? false : contributionRefId(view),\n ]),\n ),\n }\n : {}),\n }));\nexport const toInternalWorkbenchExtensionMetadata = (\n metadata: WorkbenchExtensionMetadata,\n input: {\n createTab?(\n metadata: WorkbenchExtensionTabMetadata,\n ): InternalWorkbenchExtensionMetadata[\"placements\"][number][\"tab\"];\n } = {},\n): InternalWorkbenchExtensionMetadata => {\n const adaptedPanels = panels(metadata);\n return {\n extensions: metadata.extensions,\n commands: metadata.commands,\n menuContributions: metadata.menuContributions,\n commandPaletteContributions: metadata.commandPaletteContributions,\n modes: modes(metadata),\n pages: toInternalWorkbenchPages(metadata, input.createTab),\n placements: metadata.placements.map((placement) => ({\n id: placement.id,\n ref: { extensionId: placement.extensionId, kind: \"placement\", id: placement.localId },\n modeId: contributionRefId(placement.mode),\n item: placement.item,\n region: placement.region,\n order: placement.order,\n movableTo: placement.movableTo,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n headerBorderBottom: placement.headerBorderBottom,\n tab:\n placement.tab && input.createTab\n ? input.createTab({\n ...placement.tab,\n extensionId: placement.extensionId,\n placementId: placement.id,\n })\n : undefined,\n })),\n panels: adaptedPanels,\n resourceKinds: metadata.resourceKinds.map((kind) => ({\n id: kind.id,\n extensionId: kind.extensionId,\n label: kind.label,\n icon: kind.icon,\n menuSlots: Object.fromEntries(\n (kind.menuSlots ?? []).map((slot) => [\n slot.id,\n {\n placement: slot.placement,\n label: slot.label,\n external: slot.access === \"public\",\n order: slot.order,\n },\n ]),\n ),\n })),\n resourceHierarchyProviders: (metadata.resourceHierarchyProviders ?? []).map((record) => ({\n id: record.id,\n extensionId: record.extensionId,\n resourceKind: record.resourceKind.id,\n })),\n settingsSections: metadata.settingsSections ?? [],\n settingsPanels: metadata.settingsPanels.flatMap((panel) => {\n const view = metadata.views.find((candidate) => candidate.id === contributionRefId(panel.view));\n if (!view) return [];\n return [\n {\n id: panel.id,\n viewId: view.id,\n extensionId: panel.extensionId,\n slotId: panel.slot.id,\n scope: panel.slot.id.includes(\"global\") ? (\"global\" as const) : (\"project\" as const),\n title: view.title,\n icon: view.icon,\n section: panel.section ? contributionRefId(panel.section) : undefined,\n },\n ];\n }),\n kanbanRenderers: kanbanRenderers(metadata),\n dataTableRenderers: dataTableRenderers(metadata),\n commandPaletteResources: metadata.commandPaletteResources ?? [],\n treeRenderers: treeRenderers(metadata),\n fileRenderers: fileRenderers(metadata),\n controlsRenderers: controlsRenderers(metadata),\n keybindings: metadata.keybindings ?? [],\n settingsDefinitions: metadata.settingsDefinitions ?? [],\n statuses: metadata.statuses,\n statusBarItems: metadata.statusBarItems.map((item) => ({\n id: item.id,\n extensionId: item.extensionId,\n viewId: contributionRefId(item.view),\n slot: item.slot.id.endsWith(\"leading\") ? \"leading\" : \"trailing\",\n order: item.order,\n when: toWorkbenchWhenExpression(item.when),\n })),\n diagnostics: metadata.diagnostics,\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { Disposable, FileRendererRefreshEnvelope, WorkbenchModuleContext } from \"../../core\";\n\nexport type WorkbenchExtensionRendererKind = \"tree\" | \"file\" | \"controls\" | \"dataTable\" | \"kanban\";\n\ninterface RendererRefreshTarget {\n id: string;\n kind: WorkbenchExtensionRendererKind;\n}\n\nexport interface WorkbenchExtensionRefreshEvent extends FileRendererRefreshEnvelope {\n id: string;\n}\n\nexport interface RegisterWorkbenchExtensionRendererRefreshEventsInput {\n metadata: WorkbenchExtensionMetadata;\n subscribe: (listener: (event: WorkbenchExtensionRefreshEvent) => void) => Disposable;\n workbench: WorkbenchModuleContext;\n}\n\nexport const refreshWorkbenchExtensionRenderer = (\n workbench: WorkbenchModuleContext,\n target: RendererRefreshTarget,\n envelope: FileRendererRefreshEnvelope = {},\n) => {\n workbench.views.refreshView(target.id, target.kind === \"file\" ? envelope : undefined);\n};\n\nconst rendererRefreshTargets = (metadata: WorkbenchExtensionMetadata) => {\n const targets = new Map<string, RendererRefreshTarget[]>();\n const add = (kind: WorkbenchExtensionRendererKind, renderer: { id: string; refreshEventIds?: string[] }) => {\n for (const eventId of new Set(renderer.refreshEventIds ?? [])) {\n const eventTargets = targets.get(eventId) ?? [];\n if (!eventTargets.some((target) => target.kind === kind && target.id === renderer.id)) {\n eventTargets.push({ id: renderer.id, kind });\n }\n targets.set(eventId, eventTargets);\n }\n };\n\n for (const view of metadata.views) {\n if (view.body.kind === \"webview\") continue;\n add(view.body.kind, { id: view.id, refreshEventIds: view.body.refreshEventIds });\n }\n return targets;\n};\n\nexport const registerWorkbenchExtensionRendererRefreshEvents = (\n input: RegisterWorkbenchExtensionRendererRefreshEventsInput,\n) => {\n const targets = rendererRefreshTargets(input.metadata);\n return input.subscribe((event) => {\n const { id, ...envelope } = event;\n for (const target of targets.get(id) ?? []) refreshWorkbenchExtensionRenderer(input.workbench, target, envelope);\n });\n};\n\nexport const refreshOpenWorkbenchExtensionWebviews = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n) => {\n for (const view of metadata.views) {\n if (view.body.kind !== \"webview\") continue;\n if (workbench.views.getView(view.id)) workbench.views.refreshView(view.id);\n }\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget, WebviewCommandsExecuteParams } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommandResponse } from \"../host/workbench-extension-command\";\nimport type { CreateBridgeWebviewHostCapabilities } from \"./bridge-webview-renderer\";\nimport { createWorkbenchWebviewHostCapabilities } from \"./webview-host-capabilities\";\n\ntype ExtensionWebviewSlotKind = NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\nexport interface ExtensionWebviewFileCapabilities {\n delete(params: unknown): Promise<unknown> | unknown;\n list(params: unknown): Promise<unknown> | unknown;\n upload(params: unknown): Promise<unknown> | unknown;\n}\nexport interface ExtensionWebviewArtifactCapabilities {\n read(\n params: unknown,\n context: {\n webviewId: string;\n },\n ): Promise<unknown> | unknown;\n}\ninterface CreateExtensionWebviewHostCapabilitiesInput {\n artifacts?: ExtensionWebviewArtifactCapabilities;\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n extensionIdForWebview(webviewId: string): string | undefined;\n files?: ExtensionWebviewFileCapabilities;\n projectId: string;\n slotKind: ExtensionWebviewSlotKind;\n}\nexport const createExtensionWebviewHostCapabilities =\n (input: CreateExtensionWebviewHostCapabilitiesInput): CreateBridgeWebviewHostCapabilities =>\n (context) => {\n const base = createWorkbenchWebviewHostCapabilities({\n workbench: context.workbench,\n placement: context.placement,\n extensionId: context.extensionId ?? input.extensionIdForWebview(context.webviewId),\n hostEvents: context.hostEvents,\n });\n return {\n ...base,\n \"navigation.open\": (params) => {\n const request = params as {\n target?: NavigationTarget;\n };\n if (!request.target) throw new Error(\"navigation.open requires a target.\");\n return context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(request.target, {\n extensionId: input.extensionIdForWebview(context.webviewId),\n projectId: input.projectId,\n }),\n );\n },\n \"commands.execute\": async (params) => {\n const request = params as WebviewCommandsExecuteParams;\n const resource = request.resource ?? context.placement.resource;\n return executeWorkbenchExtensionCommandResponse({ ...input, workbench: context.workbench }, request.commandId, {\n ...(request.params ? { params: request.params } : {}),\n ...(request.workspaceId ? { workspaceId: request.workspaceId } : {}),\n ...(request.metadata ? { metadata: request.metadata } : {}),\n ...(resource ? { resource } : {}),\n slot: createExtensionSlot({\n id: context.webviewId,\n kind: input.slotKind,\n projectId: input.projectId,\n context: { panelId: context.webviewId },\n }),\n });\n },\n ...(input.files\n ? {\n \"files.upload\": input.files.upload,\n \"files.list\": input.files.list,\n \"files.delete\": input.files.delete,\n }\n : {}),\n ...(input.artifacts\n ? {\n // The image-url grant is bound to the requesting webview, so the host\n // resolves the webview id instead of trusting the guest to name one.\n \"artifacts.read\": (params: unknown) => input.artifacts!.read(params, { webviewId: context.webviewId }),\n }\n : {}),\n } satisfies HostCapabilityRegistry;\n };\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { BridgeWebviewConfig } from \"./bridge-webview-renderer\";\n\ntype WorkbenchWebview = Extract<WorkbenchExtensionMetadata[\"views\"][number][\"body\"], { kind: \"webview\" }>[\"webview\"];\n\nexport const toBridgeWebviewConfig = (webview: WorkbenchWebview): BridgeWebviewConfig => {\n const title = text(webview.title);\n return {\n title: title || undefined,\n runtimeUrl: webview.runtimeUrl,\n moduleUrl: webview.moduleUrl,\n styles: webview.styles,\n capabilities: webview.capabilities,\n };\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type { Disposable, PreferencePropertySchema, PreferenceScope, PreferenceValue } from \"../../core\";\nimport { WorkflowStatusSettings } from \"../../react/statuses/workflow-status-settings\";\nimport {\n type CreateBridgeWebviewHostCapabilities,\n getBridgeWebviewHostEventPublisher,\n renderBridgeWebviewFrame,\n} from \"../bridge/bridge-webview-renderer\";\nimport { createExtensionWebviewHostCapabilities } from \"../bridge/webview-command-capabilities\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\nimport { executeWorkbenchExtensionCommand, type WorkbenchExtensionCommandContext } from \"./workbench-extension-command\";\nimport type { InternalRegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nconst settingsSectionIdDefault = \"extensions\";\nconst extensionSettingsOrderBase = 1_000;\nconst statusesSettingsOrder = 25;\n\nconst asPreferenceValue = (value: unknown): PreferenceValue | undefined =>\n value === undefined ? undefined : (value as PreferenceValue);\n\nconst preferenceScope = (scope: \"global\" | \"project\"): PreferenceScope => (scope === \"global\" ? \"user\" : \"project\");\n\nconst withHostCapabilityOverrides = (\n createBase: CreateBridgeWebviewHostCapabilities,\n createOverrides: CreateBridgeWebviewHostCapabilities | undefined,\n): CreateBridgeWebviewHostCapabilities => {\n if (!createOverrides) return createBase;\n return (context) =>\n ({\n ...createBase(context),\n ...createOverrides(context),\n }) satisfies HostCapabilityRegistry;\n};\n\nconst createExtensionHostCapabilities = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n slotKind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"],\n) => {\n const createBase =\n input.createWebviewHostCapabilities ??\n createExtensionWebviewHostCapabilities({\n artifacts: input.webviewArtifacts,\n executeCommand: input.executeCommand,\n extensionIdForWebview: (webviewId) => input.metadata.panels.find((panel) => panel.id === webviewId)?.extensionId,\n files: input.webviewFiles,\n projectId: input.projectId,\n slotKind,\n });\n\n return withHostCapabilityOverrides(createBase, input.createWebviewHostCapabilityOverrides);\n};\n\nexport const registerWebviewPanels = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n return input.metadata.panels.flatMap((panel) => {\n if (!panel.webview) return [];\n const webview = toBridgeWebviewConfig(panel.webview);\n return [\n input.workbench.views.registerView({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n body: {\n kind: \"react\",\n render: (renderInput) => {\n const slotKind = input.metadata.settingsPanels.some(\n (settingsPanel) => settingsPanel.id === renderInput.instance.panelId && settingsPanel.viewId === panel.id,\n )\n ? \"settings\"\n : \"panel\";\n return (\n input.renderWebview?.(renderInput) ??\n renderBridgeWebviewFrame({\n context: {\n workbench: renderInput.workbench,\n webviewId: panel.id,\n placement: renderInput.instance,\n hostEvents: getBridgeWebviewHostEventPublisher(renderInput.workbench, renderInput.instance),\n },\n createHostCapabilities: createExtensionHostCapabilities(input, slotKind),\n createProps:\n input.createWebviewProps ?? (({ placement }) => ({ placement, resource: placement.resource })),\n createTheme: input.createWebviewTheme,\n ownerId: panel.extensionId,\n title: text(panel.title, panel.id),\n webview,\n })\n );\n },\n },\n }),\n ];\n });\n};\n\nconst viewMenuPlacementPriority = { first: 1_000_000, default: 0, last: -1_000_000 } as const;\n\nexport const registerViewMenus = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.panels\n .flatMap((panel) => panel.panelMenus ?? [])\n .map((menu, index) =>\n input.workbench.viewMenus.registerViewMenu({\n id: menu.id,\n ownerViewId: menu.ownerPanelId,\n viewId: menu.viewId,\n side: menu.side,\n priority: viewMenuPlacementPriority[menu.placement ?? \"default\"] - index,\n }),\n );\n\nconst statusResult = (value: unknown) => {\n if (!value || typeof value !== \"object\" || !(\"statuses\" in value) || !Array.isArray(value.statuses)) {\n throw new Error(\"Status provider returned an invalid response\");\n }\n return value.statuses;\n};\n\nexport const registerStatuses = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const records = input.metadata.statuses ?? [];\n if (records.length === 0) return [] as Disposable[];\n const settingsViewId = \"workbench.extension-statuses.settings\";\n const disposables = records.map((record, index) =>\n input.workbench.statuses.registerStatusSet(\n {\n id: record.id,\n title: text(record.title, record.id),\n actions: record.actions?.map((action) => ({\n id: action.id,\n label: text(action.label, action.id),\n icon: action.icon,\n })),\n query: async () =>\n statusResult(await executeWorkbenchExtensionCommand(context, record.queryHandlerId, { params: {} })) as never,\n save: record.saveHandlerId\n ? async (statuses) =>\n statusResult(\n await executeWorkbenchExtensionCommand(context, record.saveHandlerId!, { params: { statuses } }),\n ) as never\n : undefined,\n },\n { ownerId: record.extensionId, priority: -index },\n ),\n );\n disposables.push(\n input.workbench.views.registerView({\n id: settingsViewId,\n title: \"Statuses\",\n body: {\n kind: \"react\",\n render: () => createElement(WorkflowStatusSettings, { workbench: input.workbench }),\n },\n }),\n );\n disposables.push(\n input.workbench.settings.registerPanel({\n id: \"workbench.statuses\",\n title: \"Statuses\",\n icon: \"list-checks\",\n kind: \"view\",\n order: statusesSettingsOrder,\n section: input.settingsSectionId ?? settingsSectionIdDefault,\n scope: \"project\",\n viewId: settingsViewId,\n }),\n );\n return disposables;\n};\n\nexport const registerSettings = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n const sectionId = input.settingsSectionId ?? settingsSectionIdDefault;\n\n if (!input.workbench.settings.getSection(sectionId)) {\n disposables.push(\n input.workbench.settings.registerSection({ id: sectionId, title: input.settingsSectionTitle ?? \"Extensions\" }),\n );\n }\n\n const sections = [...input.metadata.settingsSections].sort(\n (left, right) =>\n (left.order ?? 0) - (right.order ?? 0) ||\n left.extensionId.localeCompare(right.extensionId) ||\n left.id.localeCompare(right.id),\n );\n for (const section of sections) {\n disposables.push(\n input.workbench.settings.registerSection({\n id: section.id,\n title: text(section.title, section.id),\n order: section.order,\n scope: section.scope,\n }),\n );\n }\n\n // Keep the existing last-definition-wins rule for shared legacy names.\n const definitions = new Map(input.metadata.settingsDefinitions.map((setting) => [setting.key, setting]));\n const propertiesByOwner = new Map<string, Record<string, PreferencePropertySchema>>();\n for (const setting of definitions.values()) {\n const properties = propertiesByOwner.get(setting.extensionId) ?? Object.create(null);\n properties[setting.key] = {\n type: setting.type,\n scope: preferenceScope(setting.scope),\n default: asPreferenceValue(setting.default),\n enum: setting.enum as PreferenceValue[] | undefined,\n description: text(setting.description),\n } satisfies PreferencePropertySchema;\n propertiesByOwner.set(setting.extensionId, properties);\n }\n for (const [ownerId, properties] of propertiesByOwner) {\n disposables.push(input.workbench.preferences.registerSchema({ properties }, { ownerId }));\n }\n\n const panels = [...input.metadata.settingsPanels].sort(\n (left, right) => left.extensionId.localeCompare(right.extensionId) || left.id.localeCompare(right.id),\n );\n for (const [index, panel] of panels.entries()) {\n if (panel.slotId === \"extension.settings\") continue;\n disposables.push(\n input.workbench.settings.registerPanel({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n kind: \"view\",\n order: extensionSettingsOrderBase + index,\n section: panel.section ?? sectionId,\n scope: panel.scope,\n viewId: panel.viewId,\n }),\n );\n }\n\n return disposables;\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { isNavigationTarget, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, WorkbenchPanelTab, WorkbenchTabSnapshot } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\nimport { executeWorkbenchExtensionCommand } from \"./workbench-extension-command\";\nimport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\nimport type { WorkbenchExtensionRefreshEvent } from \"./workbench-extension-refresh\";\n\ntype MetadataPlacement = WorkbenchExtensionMetadata[\"placements\"][number];\ntype MetadataPageSlot = WorkbenchExtensionMetadata[\"pages\"][number][\"slots\"][number];\nexport type WorkbenchExtensionTabMetadata = NonNullable<MetadataPlacement[\"tab\"] | MetadataPageSlot[\"tab\"]> & {\n extensionId: string;\n placementId: string;\n};\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value && typeof value === \"object\" && !Array.isArray(value));\nconst navigationAction = (value: unknown, extensionId: string, projectId: string) =>\n isNavigationTarget(value) ? toWorkbenchNavigationTarget(value, { extensionId, projectId }) : undefined;\nconst toSnapshot = (value: unknown, extensionId: string, projectId: string): WorkbenchTabSnapshot => {\n if (!isRecord(value)) return {};\n const indicator = isRecord(value.indicator)\n ? {\n icon: String(value.indicator.icon ?? \"\"),\n color: typeof value.indicator.color === \"string\" ? value.indicator.color : undefined,\n label: text(value.indicator.label as Parameters<typeof text>[0]),\n }\n : undefined;\n const menu = Array.isArray(value.menu)\n ? value.menu.flatMap((candidate) => {\n if (!isRecord(candidate) || typeof candidate.id !== \"string\" || !Array.isArray(candidate.rows)) return [];\n return [\n {\n id: candidate.id,\n rows: candidate.rows.flatMap((row) => {\n if (!isRecord(row) || typeof row.id !== \"string\") return [];\n const target = navigationAction(row.action, extensionId, projectId);\n return [\n {\n id: row.id,\n label: text(row.label as Parameters<typeof text>[0], row.id),\n icon: typeof row.icon === \"string\" ? row.icon : undefined,\n iconColor: typeof row.iconColor === \"string\" ? row.iconColor : undefined,\n selected: row.selected === true,\n disabled: row.disabled === true,\n action: target ? { kind: \"navigation\" as const, target } : undefined,\n },\n ];\n }),\n },\n ];\n })\n : undefined;\n return {\n label: text(value.label as Parameters<typeof text>[0]),\n icon: typeof value.icon === \"string\" ? value.icon : undefined,\n indicator: indicator?.icon ? indicator : undefined,\n menu,\n };\n};\nexport const createWorkbenchExtensionTabPresentation = (\n input: RegisterWorkbenchExtensionContributionsInput,\n metadata: WorkbenchExtensionTabMetadata,\n): WorkbenchPanelTab => {\n const snapshots = new Map<string, WorkbenchTabSnapshot>();\n const instances = new Map<string, Parameters<WorkbenchPanelTab[\"getSnapshot\"]>[0]>();\n const loading = new Map<string, Promise<void>>();\n const listeners = new Set<() => void>();\n const refreshEvents = new Set(metadata.refreshEventIds ?? []);\n let revision = 0;\n const load = (instance: Parameters<WorkbenchPanelTab[\"getSnapshot\"]>[0]): Promise<void> => {\n instances.set(instance.instanceId, instance);\n const pending = loading.get(instance.instanceId);\n if (pending) return pending;\n const resource = instance.resource;\n const currentRevision = revision;\n const pendingLoad = Promise.resolve(\n executeWorkbenchExtensionCommand(input, metadata.queryHandlerId, {\n resource,\n params: {\n renderer: {\n rendererId: metadata.placementId,\n projectId: input.projectId,\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n },\n }),\n )\n .then(async (value) => {\n if (currentRevision !== revision) {\n loading.delete(instance.instanceId);\n await load(instance);\n return;\n }\n snapshots.set(instance.instanceId, toSnapshot(value, metadata.extensionId, input.projectId));\n for (const listener of listeners) listener();\n })\n .finally(() => {\n if (loading.get(instance.instanceId) === pendingLoad) loading.delete(instance.instanceId);\n });\n loading.set(instance.instanceId, pendingLoad);\n return pendingLoad;\n };\n return {\n refreshEvents: metadata.refreshEventIds,\n getSnapshot(instance) {\n if (!snapshots.has(instance.instanceId)) void load(instance).catch(() => undefined);\n return snapshots.get(instance.instanceId) ?? {};\n },\n subscribe(listener) {\n listeners.add(listener);\n const resourceSubscription = input.workbench.resources.preview.subscribeRefresh(async (resource) => {\n const affected = [...instances.values()].filter(\n (instance) => instance.resource && resourceKey(instance.resource) === resourceKey(resource),\n );\n if (!affected.length) return;\n revision++;\n await Promise.all(affected.map(load));\n });\n const refreshSubscription = input.subscribeRefreshEvents?.((event: WorkbenchExtensionRefreshEvent) => {\n if (!refreshEvents.has(event.id)) return;\n revision++;\n for (const instance of instances.values()) void load(instance).catch(() => undefined);\n });\n const disposable: Disposable = {\n dispose() {\n listeners.delete(listener);\n refreshSubscription?.dispose();\n resourceSubscription.dispose();\n },\n };\n return disposable;\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { matchesResourceWhen } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, WorkbenchCommandExecutionContext } from \"../../core\";\nimport { workbenchCommandPaletteMenuPath } from \"../../core\";\nimport { registerWorkbenchExtensionCommandPaletteResources } from \"../contributions/command-palette-resource-contributions\";\nimport { registerWorkbenchExtensionControlsRenderers } from \"../contributions/controls-renderer-contributions\";\nimport { registerWorkbenchExtensionDataTableRenderers } from \"../contributions/data-table-renderer-contributions\";\nimport {\n buildWorkbenchExtensionCommandPaletteRegistrations,\n buildWorkbenchExtensionMenuRegistrations,\n} from \"../contributions/extension-contributions\";\nimport { registerWorkbenchExtensionFileRenderers } from \"../contributions/file-renderer-contributions\";\nimport { registerWorkbenchExtensionKanbanRenderers } from \"../contributions/kanban-renderer-contributions\";\nimport { registerWorkbenchExtensionNavigationItems } from \"../contributions/navigation-item-contributions\";\nimport { localizeParamSchema } from \"../contributions/param-schema-localization\";\nimport { registerWorkbenchExtensionTreeRenderers } from \"../contributions/tree-renderer-contributions\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n type WorkbenchExtensionCommandContext,\n} from \"./workbench-extension-command\";\nimport type {\n InternalRegisterWorkbenchExtensionContributionsInput,\n RegisterWorkbenchExtensionContributionsInput,\n} from \"./workbench-extension-host-types\";\nimport { registerWorkbenchExtensionKeybindings } from \"./workbench-extension-keybindings\";\n\nexport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nimport { toInternalWorkbenchExtensionMetadata } from \"./workbench-extension-metadata-adapter\";\nimport { registerWorkbenchExtensionRendererRefreshEvents } from \"./workbench-extension-refresh\";\nimport {\n registerSettings,\n registerStatuses,\n registerViewMenus,\n registerWebviewPanels,\n} from \"./workbench-extension-surfaces\";\nimport { createWorkbenchExtensionTabPresentation } from \"./workbench-extension-tab-presentation\";\n\nconst disposeAll = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\nconst prepareCommandArgs = (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n args: unknown,\n executionContext?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n) => context.prepareCommandArgs?.(commandId, args, executionContext, onArgsChange) ?? args;\nconst registerCommands = (\n context: WorkbenchExtensionCommandContext,\n metadata: Pick<WorkbenchExtensionMetadata, \"commands\">,\n) =>\n metadata.commands.map((command) =>\n context.workbench.commands.registerCommand(\n {\n id: command.id,\n label: text(command.title, command.id),\n description: text(command.description),\n params: localizeParamSchema(command.params, text, command.extensionId),\n resourceMutation: command.resourceMutation,\n },\n {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, command.id, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, command.id, {\n params: asParams(args),\n resource: executionContext?.resource,\n signal: executionContext?.signal,\n }),\n },\n ),\n );\nconst menuCommandResource = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n executionContext: WorkbenchCommandExecutionContext | undefined,\n) => executionContext?.resource ?? input.workbench.getPrimaryResource();\nconst registerMenus = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n if (!input.menuSlotsById) return [] as Disposable[];\n const { registrations } = buildWorkbenchExtensionMenuRegistrations({\n metadata: input.metadata,\n menuSlotsById: input.menuSlotsById,\n menuTargetsById: input.menuTargetsById,\n createWhenExpression: input.createMenuWhenExpression,\n });\n const defaultRegistrations = registrations.map(({ menuItem, menuPath, ...registration }) => ({\n ...registration,\n menuItems: [{ menuItem, menuPath }],\n }));\n const resolvedRegistrations = input.menuRegistrations ?? defaultRegistrations;\n return resolvedRegistrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, registration.targetCommandId, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, registration.targetCommandId, {\n params: { ...(registration.contribution.params ?? {}), ...(asParams(args) ?? {}) },\n resource: menuCommandResource(input, executionContext),\n slot: createExtensionSlot({\n id: registration.contribution.slotId,\n kind: \"menu\",\n projectId: input.projectId,\n context: { panelId: registration.contribution.id },\n }),\n }),\n }),\n ...registration.menuItems.map(({ menuPath, menuItem }) =>\n input.workbench.layout.registerMenuItem(menuPath, menuItem),\n ),\n ]);\n};\nconst registerCommandPaletteContributions = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const registrations = buildWorkbenchExtensionCommandPaletteRegistrations({ metadata: input.metadata });\n return registrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, registration.targetCommandId, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, registration.targetCommandId, {\n params: { ...(registration.contribution.params ?? {}), ...(asParams(args) ?? {}) },\n resource: menuCommandResource(input, executionContext),\n slot: createExtensionSlot({\n id: \"workbench.commandPalette\",\n kind: \"menu\",\n projectId: input.projectId,\n context: { panelId: registration.contribution.id },\n }),\n }),\n isVisible: () => matchesResourceWhen(registration.contribution.when, input.workbench.getPrimaryResource()?.type),\n }),\n input.workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, registration.menuItem),\n ]);\n};\nconst matchesActiveMode = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n when:\n | {\n mode?: string | string[];\n }\n | undefined,\n) => {\n const modes = when?.mode;\n if (!modes) return true;\n const active = input.workbench.modes.getActiveModeId() ?? \"\";\n return Array.isArray(modes) ? modes.includes(active) : modes === active;\n};\nconst registerStatusBarItems = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n (input.metadata.statusBarItems ?? []).map((item) =>\n input.workbench.statusBar.registerItem({\n id: item.id,\n viewId: item.viewId,\n slot: item.slot,\n order: item.order,\n isVisible: () =>\n matchesActiveMode(\n input,\n item.when as\n | {\n mode?: string | string[];\n }\n | undefined,\n ),\n }),\n );\nconst registerPages = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.pages.map((page) => input.workbench.pages.registerPage(page));\nconst registerResourceKinds = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.resourceKinds.map((kind) =>\n input.workbench.resources.registerKind({\n kind: kind.id,\n label: text(kind.label, kind.id),\n icon: kind.icon ?? \"FileText\",\n }),\n );\nconst registerModes = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.modes.map((mode) =>\n input.workbench.modes.registerMode({\n id: mode.modeId,\n label: text(mode.label, mode.modeId),\n panels: mode.panelRegions,\n regionSettings: mode.regionSettings,\n floatingPanels: mode.floatingPanels,\n defaultTheme: mode.defaultTheme,\n chrome: mode.chrome,\n activate: () => undefined,\n }),\n );\nconst registerModePlacements = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.placements.map((placement) => input.workbench.modePlacements.registerPlacement(placement));\nexport const registerWorkbenchExtensionContributions = (sourceInput: RegisterWorkbenchExtensionContributionsInput) => {\n const input: InternalRegisterWorkbenchExtensionContributionsInput = {\n ...sourceInput,\n metadata: toInternalWorkbenchExtensionMetadata(sourceInput.metadata, {\n createTab: (metadata) => createWorkbenchExtensionTabPresentation(sourceInput, metadata),\n }),\n };\n const disposables: Disposable[] = [];\n const context: WorkbenchExtensionCommandContext = input;\n try {\n disposables.push(...registerCommands(context, input.metadata));\n disposables.push(\n ...registerWorkbenchExtensionKeybindings({\n bindings: input.metadata.keybindings,\n createWhenExpression: input.createKeybindingWhenExpression,\n workbench: input.workbench,\n }),\n );\n disposables.push(...registerMenus(input, context));\n disposables.push(...registerCommandPaletteContributions(input, context));\n disposables.push(\n registerWorkbenchExtensionTreeRenderers({ ...input, resolveNodeResource: input.resolveTreeNodeResource }),\n );\n disposables.push(registerWorkbenchExtensionFileRenderers(input));\n disposables.push(registerWorkbenchExtensionControlsRenderers(context, input.metadata.controlsRenderers ?? []));\n disposables.push(...registerWebviewPanels(input));\n disposables.push(...registerSettings(input));\n // Status-backed renderers query their provider while they register. Providers\n // must exist first so the renderer's live option source can load immediately.\n disposables.push(...registerStatuses(input, context));\n disposables.push(\n registerWorkbenchExtensionKanbanRenderers(context, input.metadata.kanbanRenderers ?? [], input.kanbanAdapter),\n );\n disposables.push(\n registerWorkbenchExtensionDataTableRenderers(\n context,\n input.metadata.dataTableRenderers ?? [],\n input.dataTableAdapter,\n ),\n );\n disposables.push(...registerViewMenus(input));\n disposables.push(\n registerWorkbenchExtensionCommandPaletteResources(context, input.metadata.commandPaletteResources ?? []),\n );\n disposables.push(\n ...registerWorkbenchExtensionNavigationItems({\n createWhenExpression: sourceInput.createNavigationWhenExpression,\n metadata: sourceInput.metadata,\n workbench: sourceInput.workbench,\n }),\n );\n if (sourceInput.subscribeRefreshEvents) {\n disposables.push(\n registerWorkbenchExtensionRendererRefreshEvents({\n metadata: sourceInput.metadata,\n subscribe: sourceInput.subscribeRefreshEvents,\n workbench: sourceInput.workbench,\n }),\n );\n }\n disposables.push(...registerStatusBarItems(input));\n disposables.push(...registerResourceKinds(input));\n disposables.push(...registerPages(input));\n disposables.push(...registerModes(input));\n disposables.push(...registerModePlacements(input));\n return {\n dispose() {\n disposeAll(disposables);\n },\n };\n } catch (error) {\n disposeAll(disposables);\n throw error;\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extensions.js","names":["LocalizedString","$l10n","default","Localizable","T","l10n","key","defaultValue","undefined","isLocalizedString","value","isLocalizedString","isNavigationHref","isFileSourcePosition","NavigationTarget","ResourceRef","isRecord","value","Record","Boolean","Array","isArray","isContributionRef","kind","id","isResource","type","isOpenIntent","undefined","isPageTarget","ancestors","Set","page","has","resource","section","position","open","parent","next","add","isPanelTarget","panel","validPanel","isItemTarget","Exclude","href","target","command","params","isNavigationTarget","targets","length","every","withExtensionOwner","extensionId","ref","Ref","toPageTarget","Extract","projectId","qualifyResource","qualifyNavigationTarget","Error","map","item","isRecord","isFileSourcePosition","isNavigationTarget","SerializedError","serializeCommandError","error","ancestors","shape","value","Error","name","message","stack","cause","undefined","shapes","WeakMap","ReturnType","errorShape","existing","get","result","set","source","String","JSON","parse","stringify","this","_key","normalized","length","at","pop","includes","push","WebviewHostCapability","WebviewScopedDeclarableCapability","WEBVIEW_DECLARABLE_CAPABILITIES","WEBVIEW_HOST_CAPABILITIES","WEBVIEW_HOST_CAPABILITY_VERSION","WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES","HostCapabilityRequest","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","WebviewDeclarableCapability","WebviewCapabilityDiagnosticCode","WebviewCapabilityDiagnostic","capability","code","message","severity","HostCapability","params","TParams","Promise","TResult","HostCapabilityRegistry","Partial","Record","CreateHostCapabilityGateInput","capabilities","declaredCapabilities","onDiagnostic","diagnostic","publicCapabilityNames","Set","scopedCapabilityNames","isPublicCapability","name","has","isScopedCapability","parseWebviewCapabilityDeclaration","nameAndScope","versionText","split","scopeIndex","indexOf","slice","scope","undefined","version","Number","validateDeclarationShape","parsed","ReturnType","Boolean","unsupportedCapability","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","diagnostics","allowed","allowedScopes","Map","declaration","push","add","scopes","get","set","validateWebviewCapabilityNames","requestScope","request","mount","length","createHostCapabilityGate","input","emit","deny","Object","assign","Error","data","call","method","handler","WebviewHostProps","createWebviewHostProps","props","Partial","Record","locale","projectId","themePreference","resource","pageLocation","pageParams","translations","defaultLocale","bundle","defaultBundle","RuntimeErrorPayload","isRecord","value","Record","safeStringify","json","JSON","stringify","length","String","normalizeRuntimeError","Error","message","stack","undefined","isRecord","HostCapabilityReply","normalizeRuntimeError","capabilityReply","run","ok","value","error","details","code","message","data","extensionIframeAllow","capabilities","some","capability","ThemePreference","collectChakraThemeVariables","document","computed","getComputedStyle","documentElement","variables","Record","index","length","name","item","startsWith","getPropertyValue","trim","resolveActiveTheme","fallback","value","getAttribute","colorMode","postThemeToFrame","iframe","HTMLIFrameElement","theme","contentWindow","postMessage","type","WebviewHostProps","CSSProperties","useEffect","useRef","useState","host","ExtensionViewDescriptor","GuestApi","HostApi","HostCapabilityRegistry","HostCapabilityRequest","ThemePreference","WebviewCapabilityDiagnostic","createHostCapabilityGate","createWebviewHostProps","normalizeRuntimeError","capabilityReply","HostEventPublisher","extensionIframeAllow","collectChakraThemeVariables","resolveActiveTheme","ExtensionFrameProps","view","props","Partial","Record","theme","capabilities","onKeyboardEvent","event","WebviewKeyboardEventParams","hostEvents","onReady","onError","error","message","stack","onDiagnostics","diagnostics","title","GuestRemote","Pick","hostEvent","iframeStyle","border","display","flex","height","minHeight","width","frameShellStyle","position","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","extensionProps","iframeRef","HTMLIFrameElement","remoteRef","initializedRef","connectedWindowRef","Window","propsRef","themeRef","capabilitiesRef","onKeyboardEventRef","hostEventsRef","declaredCapabilitiesRef","webview","onReadyRef","onErrorRef","onDiagnosticsRef","frameEpoch","setFrameEpoch","current","iframe","onFrameLoad","contentWindow","epoch","addEventListener","removeLoadListener","removeEventListener","stylesAtConnect","styles","moduleUrlAtConnect","moduleUrl","reportDiagnostics","length","createCapabilityGate","declaredCapabilities","onDiagnostic","diagnostic","hostApi","dispatchKeyboardEvent","document","dispatchEvent","KeyboardEvent","bubbles","cancelable","ready","runtimeError","payload","call","request","connect","connection","location","replace","runtimeUrl","then","conn","remote","bind","init","themeVariables","extensionId","catch","unbind","propsUpdate","themeUpdate","variables","window","MutationObserver","frame","schedule","cancelAnimationFrame","requestAnimationFrame","observer","options","attributeFilter","attributes","observe","documentElement","body","disconnect","label","colorScheme","WebviewCapabilityDiagnostic","EXTENSION_HOST_LOG_PREFIX","ExtensionHostDiagnostic","event","extensionId","contributionId","projectId","code","capability","message","stack","logExtensionHostDiagnostic","diagnostic","write","console","info","JSON","stringify","createWebviewDiagnostics","view","id","log","onReady","onError","error","onDiagnostics","diagnostics","HostEventMessage","HostEventPublisher","emit","message","bind","sink","onDisconnect","listener","unbind","createHostEventPublisher","pending","disconnectListeners","Set","push","next","length","shift","add","delete","Box","Center","Stack","Text","resolvePageParams","createWebviewDiagnostics","ExtensionFrame","ExtensionFrameProps","useEffect","useState","WorkbenchCore","BridgeWebviewFrameProps","Omit","workbench","BridgeWebviewFrame","props","$","_c","frameProps","view","pageState","setPageState","pages","store","getState","t0","subscribe","state","t1","t2","t3","activePageId","location","page","getPage","undefined","params","t4","pageLocation","pageParams","pageProps","error","setError","t5","diagnostics","t6","t7","t8","onReady","t9","nextError","onError","message","t10","onDiagnostics","t11","_c","TerminalHostEvent","TerminalSessionOperation","TerminalSessionResult","HostCapability","HostEventPublisher","WorkbenchTerminalController","TERMINAL_SESSION_EVENT_SCOPE","CreateTerminalSessionCapabilityInput","terminal","hostEvents","createTerminalSessionCapability","input","emit","payload","scope","params","operation","sessionId","open","request","write","data","accepted","resize","cols","rows","kill","signal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","subscribe","onData","chunk","kind","onExit","exit","code","onDisconnect","extensionResourceRefSchema","jsonObjectSchema","isNavigationTarget","NavigationTarget","z","action","discriminatedUnion","object","kind","literal","id","string","label","target","custom","primary","boolean","optional","command","params","destructive","href","webviewNotificationActionParamsSchema","title","min","body","enum","priority","related","array","actions","dedupeKey","expiresAt","snoozedUntil","metadata","isNavigationTarget","extensionResourceRefSchema","jsonObjectSchema","pageParamValueSchema","WebviewHostCapability","WebviewHostCapabilityParams","isNavigationTarget","NavigationTarget","z","webviewNotificationActionParamsSchema","WebviewHostCapabilityError","Error","constructor","code","message","data","Record","name","identifier","string","min","empty","object","strict","optional","command","commandId","params","workspaceId","resource","metadata","streamId","scope","enum","scopeId","preference","notificationIdentity","id","dedupeKey","status","refine","input","undefined","binary","union","instanceof","Uint8Array","ArrayBuffer","fileScope","type","terminalId","sessionId","terminalRequest","cols","number","int","positive","rows","array","cwd","env","record","schemas","discriminatedUnion","extend","operation","literal","bytes","target","custom","nullable","title","level","value","boolean","key","unknown","request","signal","mimeType","op","mount","prefix","path","ZodType","parseWebviewCapabilityParams","capability","Capability","result","safeParse","success","issues","error","map","issue","String","isNavigationTarget","CommandExecutionResult","CommandStreamClientEvent","CommandOutcome","WebviewCommandsExecuteParams","WebviewCommandsStreamParams","commandExecutionResultSchema","serializeCommandError","HostEventPublisher","errorOutcome","code","reason","ok","status","failureOutcome","error","serialized","message","cause","undefined","fail","Object","assign","Error","MAX_STREAMS","MAX_UNREAD_BYTES","withFrameSignal","hostEvents","run","signal","AbortSignal","Promise","T","controller","AbortController","unsubscribe","onDisconnect","abort","StreamCapabilityDeps","stream","input","AsyncIterable","publish","response","createWebviewCommandStreamHandler","streams","Map","unread","stop","emit","deps","streamId","operation","get","state","Number","isSafeInteger","bytes","has","size","ended","payload","scope","finish","outcome","notify","delete","type","set","_","_streamId","commandId","body","receive","event","parse","TextEncoder","encode","JSON","stringify","data","byteLength","accepted","const","CommandOutcomeError","validatedCommandOutcomeSchema","MaybePromise","WebviewHostCapability","WebviewHostCapabilityParams","HostCapability","HostEventPublisher","z","ExtensionWebviewHostAdapters","createTerminalSessionCapability","parseWebviewCapabilityParams","WebviewHostCapabilityError","createWebviewCommandStreamHandler","withFrameSignal","commandResponse","object","outcome","passthrough","streamHandlers","WeakMap","ReturnType","streamHandler","events","handler","get","set","after","result","T","done","Promise","then","capability","name","Name","run","params","input","commandExecution","adapters","executeCommand","hostEvents","undefined","request","response","signal","resolve","parse","error","commandStreaming","streamCommand","stream","publish","commandCompleted","createExtensionWebviewHostCapabilities","navigation","pageParams","placement","notifications","settings","preferences","files","artifacts","terminal","terminalCapability","open","target","location","update","value","close","show","type","level","title","message","create","status","scope","all","key","delete","upload","list","read","Record","NavigationTarget","ExtensionNavigationTarget","isNavigationTarget","qualifyNavigationTarget","NavigationTargetCommand","WorkbenchPanelRegion","ToWorkbenchNavigationTargetInput","commandIdOf","command","Extract","kind","commandTargetOf","target","extensionId","projectId","region","toCommandTarget","input","override","commandId","id","args","params","NavigationOperation","toWorkbenchNavigationTarget","Error","targets","map","item","PreferenceScopeRef","PreferenceValue","WorkbenchCore","WebviewOwnedPreferences","get","name","scope","Promise","set","value","createWebviewPreferencesAdapter","input","workbench","extensionId","ownedPreferences","warn","message","registry","preferences","owner","Error","registered","schema","getSchema","ownerId","console","Boolean","getValue","getOwnedValue","setValue","setOwnedValue","HostEventPublisher","WorkbenchCore","WorkbenchPanelInstance","toWorkbenchNavigationTarget","ExtensionWebviewHostAdapters","createExtensionWebviewHostCapabilities","createWebviewPreferencesAdapter","WebviewOwnedPreferences","CreateWorkbenchWebviewHostAdaptersInput","workbench","placement","extensionId","projectId","ownedPreferences","warn","message","hostEvents","createWorkbenchWebviewHostAdapters","input","executeCommand","request","signal","outcome","ok","status","value","commands","commandId","params","resource","placementIdentity","close","closePlacement","undefined","pageParams","update","patch","state","pages","store","getState","location","Error","page","pageLocations","updateParams","navigation","open","target","openTarget","notifications","show","notice","level","type","metadata","title","preferences","terminal","createWorkbenchWebviewHostCapabilities","WebviewHostProps","ThemePreference","createHostEventPublisher","HostEventPublisher","WorkbenchCore","WorkbenchPanelInstance","WorkbenchPanelRenderInput","WorkbenchRendererRegistration","BridgeWebviewFrame","ExtensionWebviewHostAdapters","createExtensionWebviewHostCapabilities","createWorkbenchWebviewHostAdapters","BridgeWebviewRenderContext","workbench","webviewId","extensionId","placement","hostEvents","CreateBridgeWebviewHostAdapters","context","CreateBridgeWebviewProps","Partial","Record","CreateBridgeWebviewTheme","CreateBridgeWebviewRendererInput","createHostAdapters","createProps","createTheme","BRIDGE_WEBVIEW_RENDERER_ID","BridgeWebviewConfig","title","runtimeUrl","moduleUrl","styles","capabilities","isBridgeWebviewConfig","value","Array","isArray","config","createPlacementProps","resource","createLightTheme","hostEventPublishersByWorkbench","WeakMap","Map","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","get","set","key","instanceId","renderBridgeWebviewFrame","input","ownerId","webview","id","label","renderBridgeWebview","panel","panelId","undefined","createBridgeWebviewRenderer","render","renderInput","LocalizableString","isLocalizedString","Localizable","text","value","fallback","undefined","default","$l10n","text","isLocalizedString","CommandExecutionResult","getCommandValue","unwrapCommandValue","result","response","Partial","outcome","WorkbenchExtensionMetadata","text","WorkbenchCommandExecutionContext","WorkbenchExtensionCommandContext","runResourceMutation","context","command","params","Record","execution","persist","Promise","mutation","resourceMutation","id","idParam","resource","type","resourceType","extensionId","projectId","kind","workbench","commandPalette","requestConfirmation","title","rawLabel","labelParam","undefined","trim","preview","resources","begin","removed","label","result","commit","error","rollback","text","CommandExecuteRequest","CommandExecutionResult","WorkbenchExtensionMetadata","ResourceRef","WorkbenchCommandExecutionContext","WorkbenchModuleContext","WorkbenchPanelRegion","unwrapCommandValue","toWorkbenchNavigationTarget","runResourceMutation","WorkbenchExtensionCommandContext","metadata","Pick","executeCommand","commandId","body","signal","AbortSignal","Promise","prepareCommandArgs","args","context","onArgsChange","projectId","workbench","ExecuteWorkbenchExtensionCommandInput","region","workspaceId","Record","params","resource","slot","createExtensionSlot","input","id","kind","NonNullable","executeWorkbenchExtensionCommandResponse","response","source","outcome","Partial","status","target","navigationRequests","navigation","openTarget","error","notifications","show","level","title","message","Error","String","executeWorkbenchExtensionCommand","persist","command","commands","find","candidate","WorkbenchExtensionCommandPaletteResourceRecord","NavigationTarget","ResourceRef","text","CommandPaletteResourceResult","Disposable","toWorkbenchNavigationTarget","WorkbenchExtensionCommandContext","executeWorkbenchExtensionCommand","ResourceItem","id","label","description","icon","keywords","target","ProviderQueryResult","items","isProviderQueryResult","value","Array","isArray","commandIdOf","command","Extract","kind","extensionId","activateTarget","context","record","item","params","workbench","commandPaletteResources","refresh","navigation","openTarget","targetResource","resource","targets","find","step","undefined","toResult","groupLabel","projectId","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","title","push","registerProvider","refreshEventIds","query","limit","signal","activeResource","getActiveResource","queryHandlerId","modeId","modes","getActiveModeId","providerId","map","dispose","index","length","text","WorkbenchExtensionControlsRendererRecord","controlsQueryResultSchema","text","Disposable","ResourceRef","WorkbenchExtensionCommandContext","createExtensionSlot","executeWorkbenchExtensionCommand","localize","value","fallback","Parameters","WorkbenchExtensionControlsAdapter","resolveResource","record","registerControlsRenderer","context","adapter","slot","id","kind","projectId","controlsRendererId","run","commandId","params","Record","resource","signal","AbortSignal","pageParams","PageParams","renderer","rendererId","invocation","placement","metadata","Promise","resolve","undefined","workbench","views","registerView","title","icon","body","emptyTitle","emptyDescription","defaultValues","executeQuery","queryHandlerId","result","safeParse","success","fields","error","issues","map","issue","path","join","message","Error","extensionId","data","updateValue","valueChangeHandlerId","controlId","values","then","apply","applyHandlerId","reset","resetHandlerId","controlIds","registerWorkbenchExtensionControlsRenderers","records","disposables","push","dispose","index","length","localize","text","Localizable","commandRefId","CommandParamSchema","LocalizableText","ParamLocalizer","value","fallback","ContributedParamSchema","Record","type","label","description","options","localizeParamSchema","params","localize","ownerExtensionId","undefined","Object","fromEntries","entries","map","id","descriptor","Array","isArray","localizeOptionSource","source","command","extensionId","valueField","labelField","commandId","WorkbenchExtensionDataTableRendererRecord","text","localizeParamSchema","mapViewToolbarActions","record","Pick","toolbarActions","map","action","id","label","icon","presentation","commandId","args","params","input","extensionId","submitLabel","disabled","when","text","DataTableRendererSettings","dataTableBuiltInViews","WorkbenchExtensionDataTableRendererRecord","text","createElement","CollectionViewsProvider","DataTableRendererColumn","DataTableRendererQueryResult","DataTableRendererRow","Disposable","ResourceRef","WorkbenchIcon","WorkbenchExtensionCommandContext","createExtensionSlot","executeWorkbenchExtensionCommand","mapViewToolbarActions","localize","value","fallback","Parameters","WorkbenchExtensionDataTableRendererAdapter","resolveRowResource","record","row","id","values","Record","resource","createViewsProvider","WireColumn","NonNullable","toColumn","column","label","description","undefined","icon","name","size","isQueryResult","rows","Array","columns","Boolean","isArray","toRow","registerRenderer","context","adapter","builtIns","originalRows","WeakMap","slot","kind","projectId","dataTableRendererId","run","commandId","params","modeId","signal","AbortSignal","pageParams","PageParams","renderer","rendererId","invocation","placement","metadata","workbench","views","registerView","title","body","resourceKind","toolbarActions","map","initialPageSize","pageSizeOptions","defaultSettings","settings","defaultFilter","defaultSorts","defaultViews","view","defaultActiveViewId","viewsProvider","selectionMode","selectionActions","action","destructive","rowIds","then","emptyTitle","emptyDescription","executeQuery","filter","sorts","queryHandlerId","mapped","set","rowActions","rowId","refreshView","onRowActivate","rowActivationHandlerId","get","registerWorkbenchExtensionDataTableRenderers","records","disposables","dispose","index","length","text","isQueryResult","ExtensionCommandPaletteContribution","ExtensionMenuContribution","WorkbenchExtensionMetadata","isLocalizedString","Localizable","Command","MenuItem","MenuPath","localizeParamSchema","placementOrder","first","default","last","Record","NonNullable","ExtensionContributionPlacement","WorkbenchExtensionMenuSlotConfig","menuPath","group","overflowLabel","resourceGroup","id","label","WorkbenchExtensionMenuWhenBuilder","contribution","WorkbenchExtensionStringResolver","value","extensionId","WorkbenchExtensionMenuRegistration","command","menuItem","targetCommandId","WorkbenchExtensionCommandPaletteRegistration","UnresolvedWorkbenchExtensionMenuContribution","targetId","emptyWorkbenchExtensionMetadata","commands","commandPaletteContributions","diagnostics","extensions","menuContributions","modes","pages","views","viewMenus","placements","resourceKinds","navigationItems","navigationTrees","statusBarItems","settingsPanels","settingsDefinitions","CommandContributionMetadata","Pick","defaultWorkbenchExtensionCommandId","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","placement","index","text","undefined","$l10n","createMenuItem","input","commandId","slot","when","disabledWhen","resolveString","sourceCommandId","icon","args","params","order","disabledReason","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","metadata","menuSlotsById","ReadonlyMap","menuTargetsById","createCommandId","createWhenExpression","registrations","unresolved","forEach","target","get","slotId","push","find","candidate","category","resourceMutation","description","buildWorkbenchExtensionCommandPaletteRegistrations","CommandExecuteRequest","CommandExecutionResult","resourceKey","text","Disposable","FileRendererContent","FileRendererRefreshEnvelope","FileRendererRefreshOrigin","ResourceRef","WorkbenchModuleContext","unwrapCommandValue","InternalWorkbenchExtensionMetadata","WorkbenchExtensionMetadata","executeWorkbenchExtensionCommandResponse","attachFileStorageVersions","fileStorageVersions","FileRendererRecord","NonNullable","RegisterWorkbenchExtensionFileRenderersInput","executeCommand","commandId","body","signal","AbortSignal","Promise","metadata","projectId","workbench","slotContext","input","rendererId","resource","id","kind","const","context","resourceType","type","resourceId","executeFileCommand","extra","Record","pageParams","PageParams","ext","params","renderer","invocation","placement","slot","revisionFromValue","value","undefined","revision","fileRendererRefreshEnvelopeFromCommand","response","origin","fileRendererOrigin","candidate","Partial","instanceId","operationId","fileRendererResourceKey","outcome","ok","registerFileRenderer","record","views","registerView","title","icon","resourceKind","load","result","loadHandlerId","save","saveHandlerId","content","loaded","registerWorkbenchExtensionFileRenderers","disposables","fileRenderers","push","dispose","index","length","slotContext","text","CollectionBadgeItem","KanbanRendererRow","toWorkbenchNavigationTarget","collectionBadgeTarget","row","itemsAttributeId","itemId","extensionId","projectId","items","attributes","item","find","id","target","undefined","KanbanRendererBoardColumnConfig","WireBoardColumnConfig","createElement","WorkbenchIcon","ReactKanbanRendererContribution","KanbanRendererContribution","Localizer","BoardColumnConfig","ReturnType","NonNullable","createBoardActionIcon","icon","BoardActionIcon","props","size","name","toWorkbenchBoardColumnConfig","config","localize","color","canDragIn","canDragOut","canCreate","actions","map","action","id","label","KanbanRendererBoardColumnConfig","WireBoardColumnConfig","WorkbenchExtensionKanbanRendererRecord","KanbanRendererCreateField","KanbanRendererCreateFieldType","ResourceRef","ReactAttributeDescriptor","AttributeDescriptor","ReactKanbanRendererContribution","KanbanRendererContribution","WorkbenchExtensionCommandContext","createExtensionSlot","executeWorkbenchExtensionCommand","KanbanRendererRow","Awaited","ReturnType","RowAction","NonNullable","QueryResult","attributes","boardColumnConfigs","Record","rows","Localizer","value","fallback","MutableAttributeSource","source","set","UnknownDisplayReporter","attributeId","kind","isQueryResult","Array","isArray","localizeAttributes","record","localize","decorate","attribute","reportUnknownDisplay","map","display","knownDisplay","itemsAttributeId","const","undefined","id","resolveType","type","options","option","label","base","createMutableAttributeSource","initial","snapshot","listeners","Set","signature","JSON","stringify","getSnapshot","subscribe","listener","add","delete","nextSignature","isExtensionResource","resource","Boolean","defaultResolveRowResource","_","row","defaultResolveRowActionResource","fromRow","resourceKind","title","toWorkbenchRow","resolveResource","candidate","mergeParams","items","Object","assign","filter","item","asParams","hasCommandParameters","params","keys","length","CREATE_FIELD_TYPES","ReadonlySet","toCreateField","descriptor","has","icon","optional","placeholder","multiple","accept","description","required","defaultValue","toCreateFields","entries","createRow","flatMap","field","createKanbanRendererSlot","context","projectId","kanbanRendererId","executeKanbanRendererCommand","commandId","signal","AbortSignal","pageParams","PageParams","commandResource","workbench","getPrimaryResource","renderer","rendererId","invocation","placement","slot","metadata","kanbanRendererRowActionCommandId","action","registerRowActionCommands","rowActions","target","commands","getCommand","command","registerCommand","execute","args","executionContext","runDefaultRowAction","rowId","commandPalette","requestParams","Promise","resolve","executeCommand","then","asParams","KanbanRendererBoardColumnConfig","WireBoardColumnConfig","renderBadgeListDisplay","kanbanBuiltInViews","WorkbenchExtensionKanbanRendererRecord","text","createElement","Disposable","KanbanRendererCreateSubmission","KanbanRendererQueryState","ResourceRef","WorkbenchIcon","ReactAttributeDescriptor","AttributeDescriptor","WorkbenchExtensionCommandContext","collectionBadgeTarget","WorkbenchExtensionKanbanRendererAdapter","toWorkbenchBoardColumnConfig","createMutableAttributeSource","defaultResolveRowActionResource","defaultResolveRowResource","executeKanbanRendererCommand","isQueryResult","KanbanRendererRow","Localizer","mergeParams","registerRowActionCommands","runDefaultRowAction","toCreateFields","toWorkbenchRow","mapViewToolbarActions","ColumnConfigRecord","Record","createRowActionIcon","icon","name","size","undefined","toCreateRowConfig","record","localize","createRow","title","submitLabel","fields","labels","cancel","properties","submitError","removeFile","submitWithoutOpening","toRowClick","context","adapter","resolveRowResource","row","toActivatedRow","rowActivationHandlerId","resource","onRowClick","toCreateRowHandler","runMutation","commandId","params","Promise","activateCreatedRow","contribution","submission","values","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","openCreatedRow","Partial","id","attributes","toRowContextMenuActions","resolveRowActionResource","actions","rowActions","length","map","action","runDefault","key","label","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","records","disposables","resolveLabel","value","fallback","Parameters","decorate","attribute","withBuiltInDisplay","display","kind","render","target","itemsAttributeId","extensionId","projectId","workbench","navigation","openTarget","decorateAttribute","afterMutation","onAfterMutation","then","result","reportUnknownDisplay","attributeId","notifications","show","level","message","wireAttributes","builtIns","originalRows","WeakMap","columnConfigs","latestQueryId","rowCache","Map","signature","rowResource","get","onRowActivate","push","views","registerView","body","resourceKind","toolbarActions","listRowActions","storageScope","source","defaultSettings","settings","defaultFilter","defaultSorts","viewsProvider","createViewsProvider","defaultViews","view","defaultActiveViewId","emptyTitle","emptyDescription","hideToolbar","getBoardColumnConfig","groupKey","executeQuery","state","signal","queryId","queryHandlerId","filter","sorts","pageParams","mapRows","rows","nextCache","candidate","JSON","stringify","cached","mapped","set","Array","isArray","nextAttributes","boardColumnConfigs","onAttributeChange","attributeChangeHandlerId","rowId","onMove","moveHandlerId","move","onCreateRow","onColumnAction","columnActionHandlerId","actionId","getRowContextMenuActions","dispose","index","text","TreeContext","executeWorkbenchExtensionCommand","ExtensionTreeNode","ExtensionTreeRendererRecord","ExtensionTreeResource","RegisterWorkbenchExtensionTreeRenderersInput","slotContext","input","modeId","projectId","resource","treeId","id","kind","const","context","resourceType","type","resourceId","createQueryParams","record","ctx","node","workbench","modes","getActiveModeId","renderer","rendererId","pageParams","invocation","placement","state","filter","executeCallback","commandId","params","Record","signal","AbortSignal","slot","executeTreeActionCommand","rendererParams","metadata","TreeContext","TreeNode","InternalWorkbenchExtensionMetadata","WorkbenchExtensionMetadata","ExtensionTreeRendererRecord","ExtensionTreeViewRecord","HostTreeDefaultNodesInput","ctx","record","panel","HostTreeDefaultNodesResolver","input","Promise","ResolveHostTreeDefaultInput","treeViews","ResolveHostTreeHeaderInput","getHostTreeHeaderNodes","ResolveHostTreeFooterInput","getHostTreeFooterNodes","treeViewsFor","metadata","panels","flatMap","panelMenus","filter","renderer","kind","id","resolveTreeView","viewId","find","length","undefined","resolveHostTreeHeaderNodes","hostTreeHeader","resolveHostTreeFooterNodes","hostTreeFooter","CommandExecuteRequest","commandRefId","text","Disposable","NavigationTarget","ResourceRef","TreeAction","TreeContext","TreeNode","TreeViewSection","WorkbenchModuleContext","toWorkbenchNavigationTarget","InternalWorkbenchExtensionMetadata","WorkbenchExtensionMetadata","localizeParamSchema","createQueryParams","executeCallback","executeTreeActionCommand","ExtensionTreeAction","ExtensionTreeNode","ExtensionTreeRendererRecord","ExtensionTreeResource","ExtensionTreeSection","ExtensionTreeTarget","TargetCommandArgs","HostTreeDefaultNodesResolver","resolveHostTreeFooterNodes","resolveHostTreeHeaderNodes","treeViewsFor","RegisterWorkbenchExtensionTreeRenderersInput","executeCommand","commandId","body","Promise","getHostTreeFooterNodes","getHostTreeHeaderNodes","metadata","projectId","resolveNodeResource","resource","workbench","toActionParams","params","fallback","Record","Array","isArray","toRecordParams","undefined","createTreeMapper","input","record","originalNodes","WeakMap","runnerCommandId","id","resolveResource","resolved","mapEmptyState","section","emptyState","title","description","icon","mapTarget","target","node","ctx","commandTargetOf","commandTarget","Extract","kind","const","args","command","extensionId","nodeId","treeId","mapAction","action","resourceMutation","commands","find","label","submitLabel","when","disabled","run","actionParams","refresh","mapNode","mapped","selected","iconColor","badge","iconTooltip","tooltip","rowVariant","actions","map","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","canDrag","canDrop","set","mapSections","sections","nodes","mapNodes","isTreeSectionArray","value","every","isTreeNodeArray","hostNodeSection","length","canReorder","registerTree","mapper","treeViews","commandDisposable","registerCommand","execute","rawArgs","result","view","views","listViews","refreshView","treeDisposable","registerView","searchable","searchPlaceholder","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","hostHeader","headerHandlerId","signal","extensionHeader","getBody","bodyHandlerId","getFooter","hostFooter","footerHandlerId","extensionFooter","moveNode","moveHandlerId","source","originalSource","get","originalTarget","position","getChildren","childrenHandlerId","originalNode","dispose","registerWorkbenchExtensionTreeRenderers","disposables","treeRenderers","push","index","text","WorkbenchExtensionMetadata","NavigationTarget","ExtensionNavigationTarget","contributionRefId","text","Disposable","NavigationTreeOwner","NavigationTreeSlot","TreeNode","TreeViewSection","WorkbenchModuleContext","navigationSlotRootSectionId","toWorkbenchNavigationTarget","NavigationItem","NavigationTree","RegisterWorkbenchExtensionNavigationItemsInput","createWhenExpression","when","metadata","Pick","workbench","toOwner","ref","kind","id","extensionId","isVisible","item","expression","context","matches","toNode","label","icon","canHide","canReorder","target","action","toSections","items","sections","Map","group","undefined","slot","section","get","collapsible","Boolean","nodes","push","set","values","groupItems","groups","owner","key","defaultExpandedGroupIds","Set","flatMap","registerItems","input","navigationItems","map","first","resourceDependent","some","resourceType","length","navigationTrees","registerContribution","sourceExtensionId","declarationIndex","indexOf","defaultExpandedSectionIds","resolveResource","getSections","listActions","category","registerTrees","tree","viewId","view","idScope","resourceScope","registerWorkbenchExtensionNavigationItems","text","relatedResourceOpeningSchema","text","unwrapCommandValue","InternalRegisterWorkbenchExtensionContributionsInput","registerResourceKinds","input","metadata","resourceKinds","map","kind","workbench","resources","registerKind","id","extensionId","label","icon","relatedOpenings","relatedOpeningsCommand","resource","signal","response","executeCommand","projectId","source","throwIfAborted","openings","array","parse","opening","undefined","text","NavigationTarget","ExtensionNavigationTarget","commandRefId","ExtensionKeybindingRecord","WorkbenchModuleContext","toWorkbenchNavigationTarget","KeybindingPlatform","NonNullable","currentPlatform","navigator","undefined","platform","userAgent","toLowerCase","includes","resolveExtensionKeybindingChord","binding","platformOverrides","key","registerWorkbenchExtensionKeybindings","input","bindings","createWhenExpression","when","workbench","map","keybindings","registerKeybinding","sourceExtensionId","extensionId","action","commandIdOf","command","id","keybinding","WorkbenchExtensionMetadata","ContributionKind","contributionRefId","MetadataRef","extensionId","kind","id","toWorkbenchWhenExpression","when","undefined","ids","value","Array","isArray","map","ref","mode","source","viewId","view","resourceType","metadata","WorkbenchExtensionMetadata","contributionRefId","WorkbenchPageMain","WorkbenchPageSlot","InternalWorkbenchExtensionMetadata","WorkbenchExtensionTabMetadata","MetadataPage","PagePresentationInput","extensionId","placementId","createTab","metadata","pageSlot","slot","input","tab","undefined","pageMain","main","kind","toInternalWorkbenchPages","pages","map","page","id","ref","localId","title","path","document","params","modeId","mode","resource","slots","icon","parent","parentId","WorkbenchExtensionMetadata","commandRefId","contributionRefId","ParamObjectSchema","InternalWorkbenchExtensionMetadata","toWorkbenchWhenExpression","toInternalWorkbenchPages","WorkbenchExtensionTabMetadata","MetadataView","resourceKindForView","metadata","viewId","bindings","pages","flatMap","page","main","kind","resource","view","slots","slot","item","binding","push","placements","placement","find","kinds","id","viewBody","body","webview","renderer","panelMenus","owner","viewMenus","menu","views","candidate","extensionId","ownerPanelId","title","side","group","hostTreeHeader","hostTreeFooter","panels","map","menus","icon","length","undefined","commandActions","command","actions","T","action","commandId","kanbanRenderers","resourceKind","createRow","submitLabel","columnParam","params","attributesParam","labels","attachments","resourceParam","fileParam","rowActions","toolbarActions","dataTableRenderers","selectionActions","treeRenderers","fileRenderers","controlsRenderers","modes","mode","modeId","label","panelRegions","regions","regionSettings","floatingPanels","defaultTheme","chrome","Object","fromEntries","entries","region","toInternalWorkbenchExtensionMetadata","input","createTab","adaptedPanels","extensions","commands","menuContributions","commandPaletteContributions","ref","localId","order","movableTo","mountStrategy","hiddenByDefault","headerBorderBottom","tab","placementId","resourceKinds","relatedOpeningsCommand","menuSlots","external","access","resourceHierarchyProviders","record","settingsSections","settingsPanels","panel","slotId","scope","includes","const","section","commandPaletteResources","keybindings","settingsDefinitions","statusBarItems","endsWith","when","diagnostics","WorkbenchExtensionMetadata","Disposable","FileRendererRefreshEnvelope","WorkbenchModuleContext","WorkbenchExtensionRendererKind","RendererRefreshTarget","id","kind","WorkbenchExtensionRefreshEvent","RegisterWorkbenchExtensionRendererRefreshEventsInput","metadata","subscribe","listener","event","workbench","refreshWorkbenchExtensionRenderer","target","envelope","views","refreshView","undefined","rendererRefreshTargets","targets","Map","add","renderer","refreshEventIds","eventId","Set","eventTargets","get","some","push","set","view","body","registerWorkbenchExtensionRendererRefreshEvents","input","refreshOpenWorkbenchExtensionWebviews","getView","CommandExecuteRequest","WebviewArtifactsReadParams","WebviewHostCapabilityResults","createExtensionSlot","executeWorkbenchExtensionCommandResponse","CreateBridgeWebviewHostAdapters","ExtensionWebviewFilesAdapter","createWorkbenchWebviewHostAdapters","ExtensionWebviewSlotKind","NonNullable","ExtensionWebviewFileCapabilities","ExtensionWebviewArtifactCapabilities","read","params","context","webviewId","Promise","CreateWorkbenchExtensionWebviewAdaptersInput","artifacts","executeCommand","commandId","body","signal","AbortSignal","extensionIdForWebview","files","projectId","slotKind","createWorkbenchExtensionWebviewAdapters","input","extensionId","request","resource","placement","workbench","workspaceId","metadata","slot","id","kind","panelId","undefined","WorkbenchExtensionMetadata","text","BridgeWebviewConfig","WorkbenchWebview","Extract","kind","toBridgeWebviewConfig","webview","title","undefined","runtimeUrl","moduleUrl","styles","capabilities","text","CommandExecuteRequest","text","Disposable","PreferencePropertySchema","PreferenceScope","PreferenceValue","CreateBridgeWebviewHostAdapters","getBridgeWebviewHostEventPublisher","renderBridgeWebviewFrame","createWorkbenchExtensionWebviewAdapters","toBridgeWebviewConfig","InternalRegisterWorkbenchExtensionContributionsInput","settingsSectionIdDefault","extensionSettingsOrderBase","asPreferenceValue","value","undefined","preferenceScope","scope","createExtensionHostAdapters","input","slotKind","NonNullable","createBase","artifacts","webviewArtifacts","executeCommand","extensionIdForWebview","webviewId","metadata","panels","find","panel","id","extensionId","files","webviewFiles","projectId","context","createWebviewHostAdapters","registerWebviewPanels","flatMap","webview","workbench","views","registerView","title","icon","body","kind","render","renderInput","settingsPanels","some","settingsPanel","instance","panelId","viewId","renderWebview","placement","hostEvents","createHostAdapters","createProps","createWebviewProps","resource","createTheme","createWebviewTheme","ownerId","viewMenuPlacementPriority","first","default","last","const","registerViewMenus","panelMenus","map","menu","index","viewMenus","registerViewMenu","ownerViewId","ownerPanelId","side","priority","registerSettings","disposables","sectionId","settingsSectionId","settings","getSection","push","registerSection","settingsSectionTitle","sections","settingsSections","sort","left","right","order","localeCompare","section","definitions","Map","settingsDefinitions","setting","key","propertiesByOwner","Record","values","properties","get","Object","create","type","enum","description","set","preferences","registerSchema","entries","slotId","registerPanel","text","WorkbenchExtensionMetadata","isNavigationTarget","resourceKey","text","Disposable","WorkbenchPanelTab","WorkbenchTabSnapshot","toWorkbenchNavigationTarget","executeWorkbenchExtensionCommand","RegisterWorkbenchExtensionContributionsInput","WorkbenchExtensionRefreshEvent","MetadataPlacement","MetadataPageSlot","WorkbenchExtensionTabMetadata","NonNullable","extensionId","placementId","isRecord","value","Record","Boolean","Array","isArray","navigationAction","projectId","undefined","toRows","flatMap","row","id","target","action","label","Parameters","icon","iconColor","selected","disabled","kind","const","toSnapshot","indicator","String","color","menu","candidate","rows","createWorkbenchExtensionTabPresentation","input","metadata","snapshots","Map","instances","loading","Promise","listeners","Set","refreshEvents","refreshEventIds","revision","load","instance","set","instanceId","pending","get","resource","currentRevision","pendingLoad","resolve","queryHandlerId","params","renderer","rendererId","invocation","placement","then","delete","listener","finally","getSnapshot","has","catch","subscribe","add","resourceSubscription","workbench","resources","preview","subscribeRefresh","affected","values","filter","length","all","map","refreshSubscription","subscribeRefreshEvents","event","disposable","dispose","text","WorkbenchExtensionMetadata","matchesResourceWhen","text","Disposable","WorkbenchCommandExecutionContext","workbenchCommandPaletteMenuPath","registerWorkbenchExtensionCommandPaletteResources","registerWorkbenchExtensionControlsRenderers","registerWorkbenchExtensionDataTableRenderers","buildWorkbenchExtensionCommandPaletteRegistrations","buildWorkbenchExtensionMenuRegistrations","registerWorkbenchExtensionFileRenderers","registerWorkbenchExtensionKanbanRenderers","registerWorkbenchExtensionNavigationItems","localizeParamSchema","registerWorkbenchExtensionTreeRenderers","registerResourceKinds","createExtensionSlot","executeWorkbenchExtensionCommand","WorkbenchExtensionCommandContext","InternalRegisterWorkbenchExtensionContributionsInput","RegisterWorkbenchExtensionContributionsInput","registerWorkbenchExtensionKeybindings","toInternalWorkbenchExtensionMetadata","registerWorkbenchExtensionRendererRefreshEvents","registerSettings","registerViewMenus","registerWebviewPanels","createWorkbenchExtensionTabPresentation","disposeAll","disposables","index","length","dispose","asParams","value","Record","Array","isArray","undefined","prepareCommandArgs","context","commandId","args","executionContext","onArgsChange","registerCommands","metadata","Pick","commands","map","command","workbench","registerCommand","id","label","title","description","params","extensionId","resourceMutation","prepareArgs","execute","resource","signal","region","menuCommandResource","input","getPrimaryResource","registerMenus","menuSlotsById","registrations","menuTargetsById","createWhenExpression","createMenuWhenExpression","defaultRegistrations","menuItem","menuPath","registration","menuItems","resolvedRegistrations","menuRegistrations","flatMap","targetCommandId","contribution","slot","slotId","kind","projectId","panelId","layout","registerMenuItem","registerCommandPaletteContributions","isVisible","when","type","matchesActiveMode","mode","modes","active","getActiveModeId","includes","registerStatusBarItems","statusBarItems","item","statusBar","registerItem","viewId","order","registerPages","pages","page","registerPage","registerModes","registerMode","modeId","panels","panelRegions","regionSettings","floatingPanels","defaultTheme","chrome","activate","registerModePlacements","placements","placement","modePlacements","registerPlacement","registerWorkbenchExtensionContributions","sourceInput","createTab","push","bindings","keybindings","createKeybindingWhenExpression","resolveNodeResource","resolveTreeNodeResource","controlsRenderers","kanbanRenderers","kanbanAdapter","dataTableRenderers","dataTableAdapter","commandPaletteResources","createNavigationWhenExpression","subscribeRefreshEvents","subscribe","error","text","isFileSourcePosition$1","workbenchCommandPaletteMenuPath","jsonObjectSchema","validatedCommandOutcomeSchema","WEBVIEW_DECLARABLE_CAPABILITIES","relatedResourceOpeningSchema","dataTableBuiltInViews","commandExecutionResultSchema","controlsQueryResultSchema","WEBVIEW_HOST_CAPABILITIES","kanbanBuiltInViews","WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES","extensionResourceRefSchema","isNavigationHref","resolvePageParams","pageParamValueSchema","navigationSlotRootSectionId","attachFileStorageVersions","WorkbenchIcon","fileStorageVersions","isLocalizedString$1","value","isRecord$2","isContributionRef","kind","isResource","isOpenIntent","isPageTarget","ancestors","next","isPanelTarget","panel","isItemTarget","isNavigationTarget$1","target","withExtensionOwner","ref","extensionId","toPageTarget","qualifyResource","projectId","resource","qualifyNavigationTarget","item","serializeCommandError","shape","shapes","errorShape","existing","result","source","error","normalized","publicCapabilityNames","scopedCapabilityNames","isPublicCapability","name","isScopedCapability","parseWebviewCapabilityDeclaration","nameAndScope","versionText","capability","scopeIndex","validateDeclarationShape","parsed","unsupportedCapability","unsupportedVersion","version","undeclaredCapability","validateWebviewCapabilityDeclarations","diagnostics","allowed","allowedScopes","declaration","declaredCapabilities","capabilities","scopes","requestScope","params","request","createHostCapabilityGate","input","emit","diagnostic","deny","scope","handler","createWebviewHostProps","locale","props","isRecord$1","safeStringify","json","normalizeRuntimeError","message","stack","capabilityReply","run","details","extensionIframeAllow","collectChakraThemeVariables","computed","variables","index","resolveActiveTheme","fallback","colorMode","iframeStyle","frameShellStyle","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","extensionProps","iframeRef","useRef","remoteRef","initializedRef","connectedWindowRef","propsRef","themeRef","theme","capabilitiesRef","onKeyboardEventRef","onKeyboardEvent","hostEventsRef","hostEvents","declaredCapabilitiesRef","view","onReadyRef","onReady","onErrorRef","onError","onDiagnosticsRef","onDiagnostics","frameEpoch","setFrameEpoch","useState","useEffect","iframe","onFrameLoad","epoch","removeLoadListener","stylesAtConnect","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","event","payload","connection","host","remote","conn","remote_0","message_0","frame","observer","options","title","EXTENSION_HOST_LOG_PREFIX","logExtensionHostDiagnostic","createWebviewDiagnostics","log","write","createHostEventPublisher","sink","pending","disconnectListeners","listener","BridgeWebviewFrame","$","c","frameProps","workbench","pageState","setPageState","t0","state","t1","t2","t3","page","t4","pageProps","setError","t5","t6","Center","Stack","Text","t7","t8","t9","nextError","t10","t11","Box","TERMINAL_SESSION_EVENT_SCOPE","createTerminalSessionCapability","operation","terminal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","sessionId","exit","action","z","webviewNotificationActionParamsSchema","WebviewHostCapabilityError","code","data","identifier","empty","command","streamId","preference","notificationIdentity","binary","fileScope","terminalId","terminalRequest","schemas","parseWebviewCapabilityParams","issue","errorOutcome","failureOutcome","serialized","fail","MAX_STREAMS","MAX_UNREAD_BYTES","withFrameSignal","controller","unsubscribe","createWebviewCommandStreamHandler","streams","ended","finish","notify","_","_streamId","body","receive","response","deps","commandResponse","streamHandlers","streamHandler","events","after","done","commandExecution","adapters","executeCommand","signal","CommandOutcomeError","commandStreaming","streamCommand","createExtensionWebviewHostCapabilities","terminalCapability","navigation","pageParams","location","placement","notifications","preferences","settings","files","artifacts","toCommandTarget","override","toWorkbenchNavigationTarget","isNavigationTarget","createWebviewPreferencesAdapter","registry","owner","registered","schema","createWorkbenchWebviewHostAdapters","patch","notice","createWorkbenchWebviewHostCapabilities","createLightTheme","hostEventPublishersByWorkbench","getBridgeWebviewHostEventPublisher","hostEventsByWidget","key","instance","renderBridgeWebviewFrame","ownerId","context","webview","createProps","createTheme","createHostAdapters","text$1","unwrapCommandValue","getCommandValue","runResourceMutation","mutation","persist","id","execution","rawLabel","preview","createExtensionSlot","executeWorkbenchExtensionCommandResponse","commandId","outcome","executeWorkbenchExtensionCommand","candidate","isProviderQueryResult","commandIdOf","activateTarget","record","targetResource","step","toResult","groupLabel","registerWorkbenchExtensionCommandPaletteResources","disposables","records","activeResource","localize$1","registerControlsRenderer","slot","adapter","fields","registerWorkbenchExtensionControlsRenderers","localizeParamSchema","descriptor","localizeOptionSource","ownerExtensionId","localize","commandRefId","mapViewToolbarActions","toColumn","column","createElement","isQueryResult$1","toRow","row","registerRenderer","builtIns","originalRows","modeId","rows","mapped","registerWorkbenchExtensionDataTableRenderers","placementOrder","emptyWorkbenchExtensionMetadata","defaultWorkbenchExtensionCommandId","contribution","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","text","isLocalizedString","createMenuItem","resolveString","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","registrations","unresolved","metadata","menuTargetsById","menuSlotsById","createCommandId","createWhenExpression","buildWorkbenchExtensionCommandPaletteRegistrations","slotContext$1","executeFileCommand","ext","extra","revisionFromValue","revision","fileRendererRefreshEnvelopeFromCommand","origin","resourceKey","registerFileRenderer","loaded","registerWorkbenchExtensionFileRenderers","collectionBadgeTarget","itemsAttributeId","itemId","createBoardActionIcon","icon","toWorkbenchBoardColumnConfig","config","isQueryResult","localizeAttributes","attributes","display","attribute","knownDisplay","reportUnknownDisplay","resolveType","type","option","decorate","createMutableAttributeSource","snapshot","initial","listeners","signature","nextSignature","isExtensionResource","defaultResolveRowResource","defaultResolveRowActionResource","fromRow","toWorkbenchRow","resolveResource","mergeParams","items","asParams$1","hasCommandParameters","CREATE_FIELD_TYPES","toCreateField","optional","toCreateFields","field","createKanbanRendererSlot","executeKanbanRendererCommand","commandResource","kanbanRendererRowActionCommandId","registerRowActionCommands","args","executionContext","runDefaultRowAction","label","createRowActionIcon","toCreateRowConfig","toRowClick","resolveRowResource","toActivatedRow","toCreateRowHandler","submission","created","runMutation","activateCreatedRow","toRowContextMenuActions","actions","resolveRowActionResource","runDefault","registerWorkbenchExtensionKanbanRenderers","withBuiltInDisplay","renderBadgeListDisplay","afterMutation","attributeId","wireAttributes","columnConfigs","latestQueryId","rowCache","rowResource","onRowActivate","groupKey","queryId","mapRows","nextCache","cached","nextAttributes","move","slotContext","createQueryParams","ctx","node","executeCallback","renderer","executeTreeActionCommand","treeViewsFor","resolveTreeView","panels","resolveHostTreeHeaderNodes","treeViews","getHostTreeHeaderNodes","resolveHostTreeFooterNodes","getHostTreeFooterNodes","toActionParams","toRecordParams","createTreeMapper","originalNodes","runnerCommandId","mapEmptyState","section","mapTarget","commandTarget","mapAction","actionParams","mapNode","child","nodes","sections","isTreeSectionArray","isTreeNodeArray","hostNodeSection","registerTree","mapper","commandDisposable","rawArgs","treeDisposable","hostHeader","extensionHeader","hostFooter","originalSource","originalTarget","originalNode","registerWorkbenchExtensionTreeRenderers","toOwner","contributionRefId","isVisible","expression","toNode","toSections","groupItems","groups","defaultExpandedGroupIds","registerItems","first","resourceDependent","registerTrees","viewId","tree","declarationIndex","registerWorkbenchExtensionNavigationItems","registerResourceKinds","opening","currentPlatform","platform","resolveExtensionKeybindingChord","binding","registerWorkbenchExtensionKeybindings","toWorkbenchWhenExpression","when","ids","pageSlot","pageMain","main","toInternalWorkbenchPages","resourceKindForView","bindings","viewBody","panelMenus","menu","menus","commandActions","kanbanRenderers","dataTableRenderers","treeRenderers","fileRenderers","controlsRenderers","modes","mode","region","toInternalWorkbenchExtensionMetadata","adaptedPanels","refreshWorkbenchExtensionRenderer","envelope","rendererRefreshTargets","targets","add","eventId","eventTargets","registerWorkbenchExtensionRendererRefreshEvents","refreshOpenWorkbenchExtensionWebviews","createWorkbenchExtensionWebviewAdapters","toBridgeWebviewConfig","settingsSectionIdDefault","extensionSettingsOrderBase","asPreferenceValue","preferenceScope","createExtensionHostAdapters","createBase","webviewId","registerWebviewPanels","slotKind","settingsPanel","renderInput","viewMenuPlacementPriority","registerViewMenus","registerSettings","sectionId","left","right","definitions","setting","propertiesByOwner","properties","isRecord","navigationAction","toRows","toSnapshot","indicator","createWorkbenchExtensionTabPresentation","snapshots","instances","loading","refreshEvents","load","currentRevision","pendingLoad","resourceSubscription","affected","refreshSubscription","disposeAll","asParams","prepareCommandArgs","onArgsChange","registerCommands","menuCommandResource","registerMenus","defaultRegistrations","registration","menuPath","menuItem","registerCommandPaletteContributions","matchesResourceWhen","matchesActiveMode","active","registerStatusBarItems","registerPages","registerModes","registerModePlacements","registerWorkbenchExtensionContributions","sourceInput"],"sources":["../../pstdio-api-contracts/src/extension-kernel/l10n.ts","../../pstdio-api-contracts/src/extension-kernel/navigation.ts","../../pstdio-api-contracts/src/extension-kernel/serialize-error.ts","../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/contract/host-props.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/capability-reply.ts","../../pstdio-extensions/src/bridge/host/iframe-permissions.ts","../../pstdio-extensions/src/bridge/host/theme.ts","../../pstdio-extensions/src/bridge/host/extension-frame.tsx","../../pstdio-extensions/src/bridge/host/host-diagnostics.ts","../../pstdio-extensions/src/bridge/host/host-event-publisher.ts","../src/extensions/bridge/bridge-webview-frame.tsx","../src/extensions/bridge/terminal-session-capability.ts","../src/extensions/bridge/webview-notification-params.ts","../src/extensions/bridge/webview-capability-params.ts","../src/extensions/bridge/webview-command-streams.ts","../src/extensions/bridge/extension-webview-host-capabilities.ts","../src/extensions/host/extension-navigation-target.ts","../src/extensions/bridge/webview-preferences-capability.ts","../src/extensions/bridge/webview-host-capabilities.ts","../src/extensions/bridge/bridge-webview-renderer.tsx","../../pstdio-extensions/src/workbench/shared/localization.ts","../src/extensions/host/command-response.ts","../src/extensions/host/workbench-resource-mutation.ts","../src/extensions/host/workbench-extension-command.ts","../src/extensions/contributions/command-palette-resource-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.ts","../src/extensions/contributions/param-schema-localization.ts","../src/extensions/contributions/view-toolbar-actions.ts","../src/extensions/contributions/data-table-renderer-contributions.ts","../src/extensions/contributions/extension-contributions.ts","../src/extensions/contributions/file-renderer-contributions.ts","../src/extensions/contributions/collection-badge-navigation.ts","../src/extensions/contributions/kanban-renderer-board-config.ts","../src/extensions/contributions/kanban-renderer-contribution-helpers.ts","../src/extensions/contributions/kanban-renderer-contributions.ts","../src/extensions/contributions/tree-renderer-callbacks.ts","../src/extensions/contributions/tree-renderer-host-defaults.ts","../src/extensions/contributions/tree-renderer-contributions.ts","../src/extensions/contributions/navigation-item-contributions.ts","../src/extensions/host/resource-kind-contributions.ts","../src/extensions/host/workbench-extension-keybindings.ts","../src/extensions/host/workbench-extension-metadata-ref.ts","../src/extensions/host/workbench-extension-page-metadata.ts","../src/extensions/host/workbench-extension-metadata-adapter.ts","../src/extensions/host/workbench-extension-refresh.ts","../src/extensions/bridge/webview-command-capabilities.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/host/workbench-extension-surfaces.ts","../src/extensions/host/workbench-extension-tab-presentation.ts","../src/extensions/host/workbench-extension-host.ts"],"sourcesContent":["export interface LocalizedString {\n readonly $l10n: string;\n readonly default?: string;\n}\n\nexport type Localizable<T extends string = string> = T | LocalizedString;\n\nexport const l10n = (key: string, defaultValue?: string) => ({\n $l10n: key,\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n});\n\nexport const isLocalizedString = (value: unknown): value is LocalizedString =>\n typeof value === \"object\" &&\n value !== null &&\n \"$l10n\" in value &&\n typeof (value as { $l10n?: unknown }).$l10n === \"string\";\n","import { isNavigationHref } from \"./navigation-href\";\nimport { isFileSourcePosition } from \"./source-position\";\nimport type { NavigationTarget } from \"./types/navigation-target\";\nimport type { ResourceRef } from \"./types/resources\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n\nconst isContributionRef = (value: unknown, kind: string) =>\n isRecord(value) && value.kind === kind && typeof value.id === \"string\";\n\nconst isResource = (value: unknown) =>\n isRecord(value) && typeof value.type === \"string\" && typeof value.id === \"string\";\n\nconst isOpenIntent = (value: unknown) => value === undefined || value === \"preview\" || value === \"pin\";\n\nconst isPageTarget = (value: unknown, ancestors = new Set<unknown>()): boolean => {\n if (!isRecord(value) || value.kind !== \"page\" || !isContributionRef(value.page, \"page\")) return false;\n if (ancestors.has(value)) return false;\n if (value.resource !== undefined && !isResource(value.resource)) return false;\n if (value.section !== undefined && !isRecord(value.section)) return false;\n if (value.position !== undefined && (!isFileSourcePosition(value.position) || value.section !== undefined))\n return false;\n if (!isOpenIntent(value.open)) return false;\n if (value.parent === undefined) return true;\n const next = new Set(ancestors);\n next.add(value);\n return isPageTarget(value.parent, next);\n};\n\nconst isPanelTarget = (value: unknown) => {\n if (!isRecord(value) || value.kind !== \"panel\" || !isRecord(value.panel)) return false;\n const panel = value.panel;\n const validPanel =\n isContributionRef(panel, \"placement\") ||\n (panel.kind === \"page-slot\" && isContributionRef(panel.page, \"page\") && typeof panel.id === \"string\");\n return validPanel && (value.resource === undefined || isResource(value.resource)) && isOpenIntent(value.open);\n};\n\nconst isItemTarget = (value: unknown): value is Exclude<NavigationTarget, { kind: \"compound\" }> => {\n if (!isRecord(value)) return false;\n if (value.kind === \"page\") return isPageTarget(value);\n if (value.kind === \"panel\") return isPanelTarget(value);\n if (value.kind === \"href\") return isNavigationHref(value.href);\n return (\n value.kind === \"command\" &&\n isRecord(value.target) &&\n isContributionRef(value.target.command, \"command\") &&\n (value.target.params === undefined || isRecord(value.target.params))\n );\n};\n\nexport const isNavigationTarget = (value: unknown): value is NavigationTarget => {\n if (isItemTarget(value)) return true;\n if (!isRecord(value) || value.kind !== \"compound\" || !Array.isArray(value.targets) || value.targets.length === 0) {\n return false;\n }\n return value.targets.every((target) => isPageTarget(target) || isPanelTarget(target));\n};\n\nconst withExtensionOwner = <Ref extends { extensionId?: string }>(ref: Ref, extensionId: string | undefined): Ref =>\n ref.extensionId !== undefined || extensionId === undefined ? ref : ({ ...ref, extensionId } as Ref);\n\nconst toPageTarget = (\n target: Extract<NavigationTarget, { kind: \"page\" }>,\n extensionId: string | undefined,\n projectId?: string,\n): Extract<NavigationTarget, { kind: \"page\" }> => ({\n ...target,\n page: withExtensionOwner(target.page, extensionId),\n ...(target.resource ? { resource: qualifyResource(target.resource, extensionId, projectId) } : {}),\n ...(target.parent ? { parent: toPageTarget(target.parent, extensionId, projectId) } : {}),\n});\n\nconst qualifyResource = (resource: ResourceRef, extensionId?: string, projectId?: string) => ({\n ...resource,\n extensionId: resource.extensionId ?? extensionId,\n projectId: resource.projectId ?? projectId,\n});\n\nexport const qualifyNavigationTarget = (\n target: NavigationTarget,\n extensionId: string,\n projectId?: string,\n): NavigationTarget => {\n if (!isNavigationTarget(target)) throw new Error(\"Invalid navigation target.\");\n if (target.kind === \"page\") return toPageTarget(target, extensionId, projectId);\n if (target.kind === \"panel\")\n return {\n ...target,\n panel:\n target.panel.kind === \"page-slot\"\n ? { ...target.panel, page: withExtensionOwner(target.panel.page, extensionId) }\n : withExtensionOwner(target.panel, extensionId),\n ...(target.resource ? { resource: qualifyResource(target.resource, extensionId, projectId) } : {}),\n };\n if (target.kind === \"command\")\n return { ...target, target: { ...target.target, command: withExtensionOwner(target.target.command, extensionId) } };\n if (target.kind === \"href\") return target;\n return {\n ...target,\n targets: target.targets.map(\n (item) =>\n qualifyNavigationTarget(item, extensionId, projectId) as Extract<NavigationTarget, { kind: \"page\" | \"panel\" }>,\n ),\n };\n};\n","import type { SerializedError } from \"./types/commands\";\n\nexport const serializeCommandError = (error: unknown) => {\n const ancestors: object[] = [];\n const shape = (value: Error) => ({\n ...value,\n name: value.name,\n message: value.message,\n ...(value.stack ? { stack: value.stack } : {}),\n ...(value.cause !== undefined ? { cause: value.cause } : {}),\n });\n const shapes = new WeakMap<Error, ReturnType<typeof shape>>();\n const errorShape = (value: Error) => {\n const existing = shapes.get(value);\n if (existing) return existing;\n const result = shape(value);\n shapes.set(value, result);\n return result;\n };\n const source = error instanceof Error ? errorShape(error) : { message: String(error) };\n const result: SerializedError = JSON.parse(\n JSON.stringify(source, function (this: unknown, _key, value: unknown) {\n const normalized = value instanceof Error ? errorShape(value) : value;\n if (typeof normalized === \"bigint\") return String(normalized);\n if (normalized && typeof normalized === \"object\") {\n while (ancestors.length && ancestors.at(-1) !== this) ancestors.pop();\n if (ancestors.includes(normalized)) return \"[Circular]\";\n ancestors.push(normalized);\n }\n return normalized;\n }),\n );\n return result;\n};\n","import type { WebviewHostCapability, WebviewScopedDeclarableCapability } from \"pstdio-api-contracts\";\nimport {\n WEBVIEW_DECLARABLE_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITY_VERSION,\n WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES,\n} from \"pstdio-api-contracts\";\nimport type { HostCapabilityRequest } from \"./index\";\n\nexport {\n ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n WEBVIEW_DECLARABLE_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITY_VERSION,\n WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES,\n type WebviewDeclarableCapability,\n type WebviewHostCapability,\n type WebviewScopedDeclarableCapability,\n} from \"pstdio-api-contracts\";\n\nexport type WebviewCapabilityDiagnosticCode =\n | \"undeclared_webview_capability\"\n | \"unsupported_webview_capability\"\n | \"unsupported_webview_capability_version\";\n\nexport interface WebviewCapabilityDiagnostic {\n capability: string;\n code: WebviewCapabilityDiagnosticCode;\n message: string;\n severity: \"error\";\n}\n\nexport type HostCapability<TParams = unknown, TResult = unknown> = (params: TParams) => Promise<TResult> | TResult;\nexport type HostCapabilityRegistry = Partial<Record<WebviewHostCapability, HostCapability>>;\n\ninterface CreateHostCapabilityGateInput {\n capabilities: HostCapabilityRegistry;\n declaredCapabilities?: readonly string[];\n onDiagnostic?: (diagnostic: WebviewCapabilityDiagnostic) => void;\n}\n\nconst publicCapabilityNames = new Set<string>([...WEBVIEW_HOST_CAPABILITIES, ...WEBVIEW_DECLARABLE_CAPABILITIES]);\nconst scopedCapabilityNames = new Set<string>(WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability | \"clipboard.write\" =>\n publicCapabilityNames.has(name);\n\nconst isScopedCapability = (name: string): name is WebviewScopedDeclarableCapability => scopedCapabilityNames.has(name);\n\nexport const parseWebviewCapabilityDeclaration = (capability: string) => {\n const [nameAndScope = \"\", versionText] = capability.split(\"@\");\n const scopeIndex = nameAndScope.indexOf(\":\");\n const name = scopeIndex === -1 ? nameAndScope : nameAndScope.slice(0, scopeIndex);\n const scope = scopeIndex === -1 ? undefined : nameAndScope.slice(scopeIndex + 1);\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name, scope, version };\n};\n\n// A scoped capability needs `name:scope`; every other capability must stay bare.\nconst validateDeclarationShape = (parsed: ReturnType<typeof parseWebviewCapabilityDeclaration>) => {\n if (isScopedCapability(parsed.name)) return Boolean(parsed.scope);\n return parsed.scope === undefined;\n};\n\nconst unsupportedCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability\",\n message: `Unsupported webview capability: ${capability}`,\n severity: \"error\",\n});\n\nconst unsupportedVersion = (capability: string, name: string, version: number): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability_version\",\n message: `Unsupported webview capability version: ${name}@${version.toString()} (supported: ${WEBVIEW_HOST_CAPABILITY_VERSION.toString()})`,\n severity: \"error\",\n});\n\nconst undeclaredCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"undeclared_webview_capability\",\n message: `Webview did not declare host capability: ${capability}`,\n severity: \"error\",\n});\n\nexport const validateWebviewCapabilityDeclarations = (\n declaredCapabilities: readonly string[] | undefined,\n capabilities: HostCapabilityRegistry = {},\n) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n const allowed = new Set<WebviewHostCapability>();\n const allowedScopes = new Map<WebviewHostCapability, Set<string>>();\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseWebviewCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name) || !validateDeclarationShape(parsed)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n continue;\n }\n // Browser permissions are delegated by the iframe, not routed through the bridge.\n if (parsed.name === \"clipboard.write\") continue;\n if (!capabilities[parsed.name as WebviewHostCapability]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.scope === undefined) {\n allowed.add(parsed.name as WebviewHostCapability);\n continue;\n }\n const scopes = allowedScopes.get(parsed.name) ?? new Set<string>();\n scopes.add(parsed.scope);\n allowedScopes.set(parsed.name, scopes);\n }\n\n return { allowed, allowedScopes, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseWebviewCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name) || !validateDeclarationShape(parsed)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n }\n }\n\n return diagnostics;\n};\n\n// Scoped capabilities carry their grant in the params: artifacts.read names the\n// mount it reads. The gate compares that value against the declared scopes.\nconst requestScope = (request: HostCapabilityRequest) => {\n const params = request.params as { mount?: unknown } | undefined;\n return typeof params?.mount === \"string\" && params.mount.length > 0 ? params.mount : undefined;\n};\n\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, allowedScopes, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n const deny = (diagnostic: WebviewCapabilityDiagnostic) => {\n emit(diagnostic);\n return Object.assign(new Error(diagnostic.message), {\n code: diagnostic.code,\n data: { capability: diagnostic.capability },\n });\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method) || request.method === \"clipboard.write\")\n throw deny(unsupportedCapability(request.method));\n\n if (isScopedCapability(request.method)) {\n const scope = requestScope(request);\n if (!scope) throw deny(unsupportedCapability(request.method));\n // The denial names the exact declaration the webview is missing.\n if (!allowedScopes.get(request.method)?.has(scope)) {\n throw deny(undeclaredCapability(`${request.method}:${scope}`));\n }\n } else if (!allowed.has(request.method)) {\n throw deny(undeclaredCapability(request.method));\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) throw deny(unsupportedCapability(request.method));\n\n return await handler(request.params);\n },\n };\n};\n","import type { WebviewHostProps } from \"pstdio-api-contracts/extension-kernel\";\n\nexport const createWebviewHostProps = (props: Partial<WebviewHostProps> & Record<string, unknown> = {}) => {\n const locale = props.locale ?? \"en\";\n return {\n ...props,\n projectId: props.projectId,\n themePreference: props.themePreference ?? \"system\",\n locale,\n resource: props.resource,\n pageLocation: props.pageLocation,\n pageParams: props.pageParams ?? {},\n translations: props.translations ?? { locale, defaultLocale: locale, bundle: {}, defaultBundle: {} },\n } satisfies WebviewHostProps;\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","import type { HostCapabilityReply } from \"../contract\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\n\n/** Keep error details in an ordinary RPC value so nested data survives serialization. */\nexport const capabilityReply = async (run: () => unknown) => {\n try {\n return { ok: true, value: await run() } satisfies HostCapabilityReply;\n } catch (error) {\n const details = error !== null && typeof error === \"object\" ? error : {};\n return {\n ok: false,\n error: {\n code: \"code\" in details && typeof details.code === \"string\" ? details.code : \"webview_capability_failed\",\n message: normalizeRuntimeError(error).message,\n ...(\"data\" in details ? { data: details.data } : {}),\n },\n } satisfies HostCapabilityReply;\n }\n};\n","export const extensionIframeAllow = (capabilities: readonly string[] = []) =>\n capabilities.some((capability) => capability === \"clipboard.write\" || capability === \"clipboard.write@1\")\n ? \"fullscreen; clipboard-write\"\n : \"fullscreen\";\n","import type { ThemePreference } from \"../contract\";\n\nexport const collectChakraThemeVariables = () => {\n if (typeof document === \"undefined\") return {};\n\n const computed = getComputedStyle(document.documentElement);\n const variables: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) {\n const name = computed.item(index);\n if (name.startsWith(\"--chakra-\")) {\n variables[name] = computed.getPropertyValue(name).trim();\n }\n }\n return variables;\n};\n\nexport const resolveActiveTheme = (fallback: ThemePreference): ThemePreference => {\n if (typeof document === \"undefined\") return fallback;\n const value = document.documentElement.getAttribute(\"data-theme\");\n if (value === \"dark\" || value === \"light\") return value;\n\n const colorMode = document.documentElement.getAttribute(\"data-color-mode\");\n return colorMode === \"dark\" || colorMode === \"light\" ? colorMode : fallback;\n};\n\nexport const postThemeToFrame = (\n iframe: HTMLIFrameElement | null,\n theme: ThemePreference,\n variables: Record<string, string>,\n) => {\n iframe?.contentWindow?.postMessage({ type: \"pstdio.theme\", theme, variables }, \"*\");\n};\n","import type { WebviewHostProps } from \"pstdio-api-contracts/extension-kernel\";\nimport { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { host } from \"rimless\";\nimport type {\n ExtensionViewDescriptor,\n GuestApi,\n HostApi,\n HostCapabilityRegistry,\n HostCapabilityRequest,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"../contract\";\nimport { createHostCapabilityGate } from \"../contract\";\nimport { createWebviewHostProps } from \"../contract/host-props\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\nimport { capabilityReply } from \"./capability-reply\";\nimport type { HostEventPublisher } from \"./host-event-publisher\";\nimport { extensionIframeAllow } from \"./iframe-permissions\";\nimport { collectChakraThemeVariables, resolveActiveTheme } from \"./theme\";\n\nexport interface ExtensionFrameProps {\n view: ExtensionViewDescriptor;\n props: Partial<WebviewHostProps> & Record<string, unknown>;\n theme: ThemePreference;\n capabilities?: HostCapabilityRegistry;\n /** Private guest shortcut forwarding, outside extension capability grants. */\n onKeyboardEvent?: (event: import(\"pstdio-api-contracts\").WebviewKeyboardEventParams) => void;\n /** Publisher whose emitted events are forwarded into the guest once connected. */\n hostEvents?: HostEventPublisher;\n onReady?: () => void;\n /** Reports a load or runtime failure. The frame draws no error UI; the caller shows the failure once. */\n onError?: (error: { message: string; stack?: string }) => void;\n onDiagnostics?: (diagnostics: WebviewCapabilityDiagnostic[]) => void;\n title?: string;\n}\n\ntype GuestRemote = Pick<HostApi, \"init\" | \"themeUpdate\" | \"propsUpdate\"> & {\n hostEvent?: HostApi[\"hostEvent\"];\n};\n\nconst iframeStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n flex: \"1 1 0%\",\n height: \"100%\",\n minHeight: 0,\n width: \"100%\",\n};\n\nconst frameShellStyle: CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n minHeight: 0,\n position: \"relative\",\n width: \"100%\",\n};\n\nexport const EXTENSION_IFRAME_SANDBOX = \"allow-scripts allow-forms allow-popups\";\n\nexport const ExtensionFrame = (props: ExtensionFrameProps) => {\n const {\n view,\n props: extensionProps,\n theme,\n capabilities,\n onKeyboardEvent,\n hostEvents,\n onReady,\n onError,\n onDiagnostics,\n title,\n } = props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const remoteRef = useRef<GuestRemote | null>(null);\n const initializedRef = useRef(false);\n // The connection belongs to one browsing context. Navigation keeps the iframe's\n // WindowProxy, so a different contentWindow means the runtime document is gone.\n const connectedWindowRef = useRef<Window | null>(null);\n const propsRef = useRef(createWebviewHostProps(extensionProps));\n const themeRef = useRef(theme);\n const capabilitiesRef = useRef(capabilities);\n const onKeyboardEventRef = useRef(onKeyboardEvent);\n const hostEventsRef = useRef(hostEvents);\n const declaredCapabilitiesRef = useRef(view.webview.capabilities);\n const onReadyRef = useRef(onReady);\n const onErrorRef = useRef(onError);\n const onDiagnosticsRef = useRef(onDiagnostics);\n // Bumped when the browser reloads the iframe (e.g. a DOM reparent while the Side\n // Panel floats). The bump remounts a fresh iframe so a single clean connection\n // owns the new browsing context.\n const [frameEpoch, setFrameEpoch] = useState(0);\n\n propsRef.current = createWebviewHostProps(extensionProps);\n themeRef.current = theme;\n capabilitiesRef.current = capabilities;\n onKeyboardEventRef.current = onKeyboardEvent;\n hostEventsRef.current = hostEvents;\n declaredCapabilitiesRef.current = view.webview.capabilities;\n onReadyRef.current = onReady;\n onErrorRef.current = onError;\n onDiagnosticsRef.current = onDiagnostics;\n\n // Connect once per browsing context. React StrictMode dev double-mount and parent\n // re-renders with unstable prop references (e.g. `webview.styles` rebuilt by `.map`)\n // would otherwise tear down the live connection while the iframe keeps its state,\n // leaving guest-to-host RPCs with no listener.\n // biome-ignore lint/correctness/useExhaustiveDependencies: frameEpoch remounts the iframe this effect reads through iframeRef.\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n // Reinserting the iframe (a DOM move without moveBefore, or StrictMode's dev-only\n // remount of a moved host) replaces its browsing context with about:blank because\n // the src attribute is empty. This can happen before the runtime finishes loading,\n // so compare browsing contexts instead of counting loads. Remount a fresh iframe\n // and connection when the context changed.\n const onFrameLoad = () => {\n if (iframe.contentWindow !== connectedWindowRef.current) setFrameEpoch((epoch) => epoch + 1);\n };\n iframe.addEventListener(\"load\", onFrameLoad);\n const removeLoadListener = () => iframe.removeEventListener(\"load\", onFrameLoad);\n\n if (iframe.contentWindow === connectedWindowRef.current) return removeLoadListener;\n connectedWindowRef.current = iframe.contentWindow;\n\n // Snapshot styles at connect time so subsequent parent re-renders that produce a\n // new array reference don't affect what we send in init.\n const stylesAtConnect = view.webview.styles;\n const moduleUrlAtConnect = view.webview.moduleUrl;\n\n const reportDiagnostics = (diagnostics: WebviewCapabilityDiagnostic[]) => {\n if (diagnostics.length > 0) onDiagnosticsRef.current?.(diagnostics);\n };\n\n const createCapabilityGate = () =>\n createHostCapabilityGate({\n capabilities: capabilitiesRef.current ?? {},\n declaredCapabilities: declaredCapabilitiesRef.current,\n onDiagnostic: (diagnostic) => reportDiagnostics([diagnostic]),\n });\n\n reportDiagnostics(createCapabilityGate().diagnostics);\n\n const hostApi = {\n dispatchKeyboardEvent: async (event: import(\"pstdio-api-contracts\").WebviewKeyboardEventParams) => {\n if (onKeyboardEventRef.current) return onKeyboardEventRef.current(event);\n document.dispatchEvent(new KeyboardEvent(\"keydown\", { ...event, bubbles: true, cancelable: true }));\n },\n ready: () => {\n // no-op; init fires from host.connect().then() below.\n },\n runtimeError: (payload: { message: string; stack?: string }) => {\n onErrorRef.current?.(payload);\n },\n call: async (request: HostCapabilityRequest) => {\n return await capabilityReply(() => createCapabilityGate().call(request));\n },\n } satisfies GuestApi;\n\n const connect = () => {\n initializedRef.current = false;\n remoteRef.current = null;\n\n const connection = host.connect(iframe, hostApi);\n // A sandboxed iframe without allow-same-origin posts messages with origin \"null\".\n // Leaving the iframe src attribute empty lets rimless validate the guest by\n // contentWindow identity while still loading the API-owned runtime document.\n iframe.contentWindow?.location.replace(view.webview.runtimeUrl);\n\n connection\n .then(async (conn) => {\n if (iframeRef.current !== iframe) return;\n const remote = conn.remote as GuestRemote;\n remoteRef.current = remote;\n hostEventsRef.current?.bind((message) => remote.hostEvent?.(message));\n\n await remote.init({\n moduleUrl: moduleUrlAtConnect,\n styles: stylesAtConnect,\n props: propsRef.current,\n theme: resolveActiveTheme(themeRef.current),\n themeVariables: collectChakraThemeVariables(),\n extensionId: view.extensionId,\n });\n if (iframeRef.current !== iframe) return;\n initializedRef.current = true;\n onReadyRef.current?.();\n })\n .catch((error) => {\n if (iframeRef.current !== iframe) return;\n onErrorRef.current?.(normalizeRuntimeError(error));\n });\n };\n\n connect();\n\n // Intentionally no connection.close() in cleanup. The iframe runtime handshakes once\n // at iframe load and binds to that connection ID. Closing during React StrictMode's\n // dev-only cleanup would leave the live iframe with no host listener.\n return removeLoadListener;\n }, [frameEpoch, view.extensionId, view.webview.runtimeUrl, view.webview.moduleUrl, view.webview.styles]);\n\n // Re-renders may hand the frame a fresh publisher (renderers rebuild their\n // capability context per render); route it to the live connection.\n useEffect(() => {\n const remote = remoteRef.current;\n if (!remote || !hostEvents) return;\n hostEvents.bind((message) => remote.hostEvent?.(message));\n // Release the sink so a replaced publisher stops referencing this remote\n // and returns to buffering.\n return () => hostEvents.unbind();\n }, [hostEvents]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.propsUpdate({ props: createWebviewHostProps(extensionProps) });\n }, [extensionProps]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(theme),\n variables: collectChakraThemeVariables(),\n });\n }, [theme]);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof MutationObserver === \"undefined\") return;\n\n let frame: number | null = null;\n const schedule = () => {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = null;\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(themeRef.current),\n variables: collectChakraThemeVariables(),\n });\n });\n };\n\n const observer = new MutationObserver(schedule);\n const options = { attributeFilter: [\"class\", \"data-color-mode\", \"data-theme\", \"style\"], attributes: true };\n observer.observe(document.documentElement, options);\n observer.observe(document.body, options);\n\n return () => {\n observer.disconnect();\n if (frame !== null) cancelAnimationFrame(frame);\n };\n }, []);\n\n return (\n <div style={frameShellStyle}>\n <iframe\n // A new runtime or module needs its own browsing context and bridge handshake.\n key={`${frameEpoch}\\n${view.webview.runtimeUrl}\\n${view.webview.moduleUrl}`}\n ref={iframeRef}\n title={title ?? view.label}\n allow={extensionIframeAllow(view.webview.capabilities)}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n // Match the host theme so the empty/loading iframe paints the right canvas\n // instead of flashing the default light background while the guest connects.\n style={{ ...iframeStyle, colorScheme: theme }}\n onError={() => {\n onErrorRef.current?.({ message: `Failed to load extension runtime at ${view.webview.runtimeUrl}` });\n }}\n />\n </div>\n );\n};\n","import type { WebviewCapabilityDiagnostic } from \"../contract\";\n\nexport const EXTENSION_HOST_LOG_PREFIX = \"[pstdio.extension-host] \";\n\nexport interface ExtensionHostDiagnostic {\n event: \"webview-ready\" | \"webview-error\" | \"webview-diagnostic\" | \"registration-ready\" | \"registration-error\";\n extensionId?: string;\n contributionId?: string;\n projectId?: string;\n code?: string;\n capability?: string;\n message?: string;\n stack?: string;\n}\n\nexport const logExtensionHostDiagnostic = (diagnostic: ExtensionHostDiagnostic, write = console.info) => {\n write(`${EXTENSION_HOST_LOG_PREFIX}${JSON.stringify(diagnostic)}`);\n};\n\nexport const createWebviewDiagnostics = (\n view: { extensionId: string; id: string },\n write?: (message: string) => void,\n) => {\n const log = (diagnostic: ExtensionHostDiagnostic) =>\n logExtensionHostDiagnostic({ extensionId: view.extensionId, contributionId: view.id, ...diagnostic }, write);\n return {\n onReady: () => log({ event: \"webview-ready\" }),\n onError: (error: { message: string; stack?: string }) => log({ event: \"webview-error\", ...error }),\n onDiagnostics: (diagnostics: WebviewCapabilityDiagnostic[]) => {\n for (const diagnostic of diagnostics) log({ event: \"webview-diagnostic\", ...diagnostic });\n },\n };\n};\n","import type { HostEventMessage } from \"../contract\";\n\n/**\n * Host-side fan-in for events pushed into one guest webview. Capability\n * implementations `emit` while the frame owns the transport: events emitted\n * before the guest connection is up are buffered and flushed on `bind`.\n */\nexport interface HostEventPublisher {\n emit(message: HostEventMessage): void;\n bind(sink: (message: HostEventMessage) => void): void;\n onDisconnect(listener: () => void): () => void;\n /** Drop the current sink and return to buffering until the next bind. */\n unbind(): void;\n}\n\nexport const createHostEventPublisher = (): HostEventPublisher => {\n let sink: ((message: HostEventMessage) => void) | null = null;\n const pending: HostEventMessage[] = [];\n const disconnectListeners = new Set<() => void>();\n\n return {\n emit(message) {\n if (sink) sink(message);\n else pending.push(message);\n },\n bind(next) {\n sink = next;\n while (pending.length > 0) next(pending.shift() as HostEventMessage);\n },\n onDisconnect(listener) {\n disconnectListeners.add(listener);\n return () => disconnectListeners.delete(listener);\n },\n unbind() {\n sink = null;\n for (const listener of disconnectListeners) listener();\n },\n };\n};\n","import { Box, Center, Stack, Text } from \"@chakra-ui/react\";\nimport { resolvePageParams } from \"pstdio-api-contracts\";\nimport { createWebviewDiagnostics, ExtensionFrame, type ExtensionFrameProps } from \"pstdio-extensions/bridge/host\";\nimport { useEffect, useState } from \"react\";\nimport type { WorkbenchCore } from \"../../core\";\n\ntype BridgeWebviewFrameProps = Omit<ExtensionFrameProps, \"onDiagnostics\" | \"onError\" | \"onReady\"> & {\n workbench: WorkbenchCore;\n};\n\n/** A bridged webview that shows one failure message, in theme colors, when it cannot load. */\nexport const BridgeWebviewFrame = (props: BridgeWebviewFrameProps) => {\n const { view, workbench, ...frameProps } = props;\n const [pageState, setPageState] = useState(workbench.pages.store.getState);\n useEffect(() => workbench.pages.store.subscribe((state) => setPageState(state)), [workbench]);\n const page = pageState.activePageId ? workbench.pages.getPage(pageState.activePageId) : undefined;\n const pageProps = {\n pageLocation: pageState.location,\n pageParams: resolvePageParams(page?.params, pageState.location?.params),\n };\n const [error, setError] = useState<string | null>(null);\n const diagnostics = createWebviewDiagnostics(view);\n\n return (\n <Box position=\"relative\" width=\"100%\" height=\"100%\" minH=\"0\" display=\"flex\" flexDirection=\"column\">\n {error ? (\n <Center position=\"absolute\" inset=\"0\" px=\"md\" zIndex={1} bg=\"bg\">\n <Stack gap=\"xs\" maxW=\"md\" textAlign=\"center\">\n <Text textStyle=\"paragraph/S/medium\" color=\"fg.error\">\n Extension view failed to load.\n </Text>\n <Text textStyle=\"paragraph/XS/regular\" color=\"fg.muted\">\n {error}\n </Text>\n </Stack>\n </Center>\n ) : null}\n <ExtensionFrame\n view={view}\n {...frameProps}\n props={{ ...frameProps.props, ...pageProps }}\n onReady={() => {\n diagnostics.onReady();\n setError(null);\n }}\n onDiagnostics={diagnostics.onDiagnostics}\n onError={(nextError) => {\n diagnostics.onError(nextError);\n setError(nextError.message);\n }}\n />\n </Box>\n );\n};\n","import type { TerminalHostEvent, TerminalSessionOperation, TerminalSessionResult } from \"@pstdio/sdk/api\";\nimport type { HostCapability } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { WorkbenchTerminalController } from \"../../core\";\n\nexport const TERMINAL_SESSION_EVENT_SCOPE = \"terminal.session\";\n\ninterface CreateTerminalSessionCapabilityInput {\n terminal: WorkbenchTerminalController;\n hostEvents: HostEventPublisher;\n}\n\n/**\n * Host side of the `terminal.session` webview capability. Sessions live in the\n * workbench terminal controller; only serializable operation payloads and session\n * ids cross the webview boundary. Output/exit events flow through the host event\n * publisher under the `terminal.session` scope.\n */\nexport const createTerminalSessionCapability = (input: CreateTerminalSessionCapabilityInput): HostCapability => {\n const { terminal, hostEvents } = input;\n\n const emit = (payload: TerminalHostEvent) => {\n hostEvents.emit({ scope: TERMINAL_SESSION_EVENT_SCOPE, payload });\n };\n\n return async (params) => {\n const operation = params as TerminalSessionOperation;\n\n switch (operation.operation) {\n case \"open\": {\n const { sessionId } = await terminal.open({ request: operation.request });\n return { operation: \"open\", sessionId } satisfies TerminalSessionResult;\n }\n case \"write\":\n terminal.write({ sessionId: operation.sessionId, data: operation.data });\n return { operation: \"write\", accepted: true } satisfies TerminalSessionResult;\n case \"resize\":\n terminal.resize({ sessionId: operation.sessionId, cols: operation.cols, rows: operation.rows });\n return { operation: \"resize\", accepted: true } satisfies TerminalSessionResult;\n case \"kill\":\n await terminal.kill({ sessionId: operation.sessionId, signal: operation.signal });\n return { operation: \"kill\", accepted: true } satisfies TerminalSessionResult;\n case \"subscribe\": {\n const { sessionId } = operation;\n let unsubscribeTerminal = () => {};\n let unsubscribeDisconnect = () => {};\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n unsubscribeTerminal();\n unsubscribeDisconnect();\n };\n\n unsubscribeTerminal = terminal.subscribe(sessionId, {\n onData: (chunk) => emit({ sessionId, kind: \"data\", chunk }),\n onExit: (exit) => {\n emit({ sessionId, kind: \"exit\", code: exit.code, signal: exit.signal });\n close();\n },\n });\n unsubscribeDisconnect = hostEvents.onDisconnect(close);\n return { operation: \"subscribe\", accepted: true } satisfies TerminalSessionResult;\n }\n }\n };\n};\n","import { extensionResourceRefSchema, jsonObjectSchema } from \"pstdio-api-contracts\";\nimport { isNavigationTarget, type NavigationTarget } from \"pstdio-api-contracts/extension-kernel\";\nimport { z } from \"zod\";\n\nconst action = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"navigate\"),\n id: z.string(),\n label: z.string(),\n target: z.custom<NavigationTarget>(isNavigationTarget, \"Invalid navigation target.\"),\n primary: z.boolean().optional(),\n }),\n z.object({\n kind: z.literal(\"command\"),\n id: z.string(),\n label: z.string(),\n command: z.string(),\n params: jsonObjectSchema.optional(),\n primary: z.boolean().optional(),\n destructive: z.boolean().optional(),\n }),\n z.object({\n kind: z.literal(\"url\"),\n id: z.string(),\n label: z.string(),\n href: z.string(),\n primary: z.boolean().optional(),\n }),\n]);\n\nexport const webviewNotificationActionParamsSchema = z.object({\n title: z.string().min(1),\n body: z.string().optional(),\n kind: z.enum([\"needs_review\", \"ready_to_merge\", \"blocked\", \"approval_required\", \"failed\", \"info\"]),\n priority: z.enum([\"low\", \"normal\", \"high\", \"urgent\"]).optional(),\n target: extensionResourceRefSchema.optional(),\n related: z.array(extensionResourceRefSchema).optional(),\n actions: z.array(action).optional(),\n dedupeKey: z.string().optional(),\n expiresAt: z.string().optional(),\n snoozedUntil: z.string().optional(),\n metadata: jsonObjectSchema.optional(),\n});\n","import { extensionResourceRefSchema, jsonObjectSchema, pageParamValueSchema } from \"pstdio-api-contracts\";\nimport type { WebviewHostCapability, WebviewHostCapabilityParams } from \"pstdio-api-contracts/extension-kernel\";\nimport { isNavigationTarget, type NavigationTarget } from \"pstdio-api-contracts/extension-kernel\";\nimport { z } from \"zod\";\nimport { webviewNotificationActionParamsSchema } from \"./webview-notification-params\";\n\nexport class WebviewHostCapabilityError extends Error {\n constructor(\n public code: string,\n message: string,\n public data: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"WebviewHostCapabilityError\";\n }\n}\n\nconst identifier = z.string().min(1);\nconst empty = z.object({}).strict().optional();\nconst command = z.object({\n commandId: identifier,\n params: jsonObjectSchema.optional(),\n workspaceId: identifier.optional(),\n resource: extensionResourceRefSchema.optional(),\n metadata: jsonObjectSchema.optional(),\n});\nconst streamId = { streamId: identifier };\nconst scope = z.object({\n scope: z.enum([\"default\", \"user\", \"project\", \"workspace\", \"extension\", \"session\"]),\n scopeId: z.string().optional(),\n});\nconst preference = z.object({ name: identifier, scope: scope.optional() });\nconst notificationIdentity = z\n .object({\n id: identifier.optional(),\n dedupeKey: z.string().optional(),\n status: z.enum([\"done\", \"dismissed\", \"expired\"]).optional(),\n })\n .refine(\n (input) => input.id !== undefined || input.dedupeKey !== undefined,\n \"Provide a notification ID or dedupe key.\",\n );\nconst binary = z.union([z.instanceof(Uint8Array), z.instanceof(ArrayBuffer)]);\nconst fileScope = z.object({ type: identifier, id: z.string().optional() });\nconst terminalId = { sessionId: identifier };\nconst terminalRequest = z.object({\n cols: z.number().int().positive(),\n rows: z.number().int().positive(),\n command: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n});\n\nconst schemas = {\n \"commands.execute\": command,\n \"commands.stream\": z.discriminatedUnion(\"operation\", [\n command.extend({ ...streamId, operation: z.literal(\"start\") }),\n z.object({ ...streamId, operation: z.literal(\"cancel\") }),\n z.object({ ...streamId, operation: z.literal(\"ack\"), bytes: z.number().int().positive() }),\n ]),\n \"navigation.open\": z.object({ target: z.custom<NavigationTarget>(isNavigationTarget, \"Invalid navigation target.\") }),\n \"page.params.update\": z.object({ params: z.record(z.string(), pageParamValueSchema.nullable()) }),\n \"placement.close\": empty,\n \"notification.show\": z.union([\n z.object({\n type: z.enum([\"info\", \"success\", \"warning\", \"error\"]),\n title: z.string().optional(),\n message: z.string(),\n metadata: jsonObjectSchema.optional(),\n }),\n z.object({\n level: z.enum([\"info\", \"success\", \"warning\", \"error\"]),\n title: z.string().optional(),\n message: z.string().optional(),\n }),\n ]),\n \"notification.action\": webviewNotificationActionParamsSchema,\n \"notification.resolve\": notificationIdentity,\n \"notification.dismiss\": notificationIdentity,\n \"preferences.get\": preference,\n \"preferences.set\": preference.extend({\n value: z.union([\n z.boolean(),\n z.number(),\n z.string(),\n z.array(z.string()),\n z.array(z.number()),\n z.array(z.boolean()),\n jsonObjectSchema,\n ]),\n }),\n \"extension.settings.all\": empty,\n \"extension.settings.get\": z.object({ key: identifier }),\n \"extension.settings.set\": z.object({ key: identifier, value: z.unknown() }),\n \"extension.settings.delete\": z.object({ key: identifier }),\n \"terminal.session\": z.discriminatedUnion(\"operation\", [\n z.object({ operation: z.literal(\"open\"), request: terminalRequest }),\n z.object({ ...terminalId, operation: z.literal(\"write\"), data: z.union([z.string(), z.instanceof(Uint8Array)]) }),\n z.object({\n ...terminalId,\n operation: z.literal(\"resize\"),\n cols: z.number().int().positive(),\n rows: z.number().int().positive(),\n }),\n z.object({ ...terminalId, operation: z.literal(\"kill\"), signal: z.string().optional() }),\n z.object({ ...terminalId, operation: z.literal(\"subscribe\") }),\n ]),\n \"files.upload\": z.object({\n name: identifier,\n data: binary,\n mimeType: z.string().optional(),\n scope: fileScope.optional(),\n }),\n \"files.list\": z.object({ scope: fileScope.optional() }),\n \"files.delete\": z.object({ id: identifier }),\n \"artifacts.read\": z.discriminatedUnion(\"op\", [\n z.object({ op: z.literal(\"list\"), mount: identifier, prefix: z.string().optional() }),\n z.object({ op: z.literal(\"readText\"), mount: identifier, path: z.string() }),\n z.object({ op: z.literal(\"imageUrl\"), mount: identifier, path: z.string() }),\n ]),\n} satisfies Record<WebviewHostCapability, z.ZodType>;\n\nexport const parseWebviewCapabilityParams = <Capability extends WebviewHostCapability>(\n capability: Capability,\n input: unknown,\n) => {\n const result = schemas[capability].safeParse(input);\n if (!result.success)\n throw new WebviewHostCapabilityError(\"invalid_params\", `Invalid parameters for ${capability}.`, {\n capability,\n issues: result.error.issues.map((issue) => ({ path: issue.path.map(String), message: issue.message })),\n });\n return result.data as WebviewHostCapabilityParams[Capability];\n};\n","import type { CommandExecutionResult } from \"@pstdio/sdk/api\";\nimport type { CommandStreamClientEvent } from \"@pstdio/sdk/client\";\nimport type { CommandOutcome, WebviewCommandsExecuteParams, WebviewCommandsStreamParams } from \"@pstdio/sdk/extensions\";\nimport { commandExecutionResultSchema } from \"pstdio-api-contracts\";\nimport { serializeCommandError } from \"pstdio-api-contracts/extension-kernel\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\n\nconst errorOutcome = (code: string, reason = code): CommandOutcome => ({ ok: false, status: \"error\", code, reason });\nconst failureOutcome = (error: unknown) => {\n const serialized = serializeCommandError(error);\n return {\n ok: false,\n status: \"error\",\n code: (error as { code?: string })?.code ?? \"command_stream_disconnected\",\n reason: serialized.message,\n error: serialized,\n ...(serialized.cause !== undefined ? { cause: serialized.cause } : {}),\n } satisfies CommandOutcome;\n};\nconst fail = (code: string) => Object.assign(new Error(code), { code });\nconst MAX_STREAMS = 16;\nconst MAX_UNREAD_BYTES = 8 * 1024 * 1024;\n\nexport const withFrameSignal = async <T>(hostEvents: HostEventPublisher, run: (signal: AbortSignal) => Promise<T>) => {\n const controller = new AbortController();\n const unsubscribe = hostEvents.onDisconnect(() => controller.abort());\n try {\n return await run(controller.signal);\n } finally {\n unsubscribe();\n }\n};\n\ninterface StreamCapabilityDeps {\n stream(input: WebviewCommandsExecuteParams, signal: AbortSignal): AsyncIterable<CommandStreamClientEvent>;\n publish?(response: CommandExecutionResult): void;\n}\n\n/** State belongs to a frame, across React renders and bridge reconnects. */\nexport const createWebviewCommandStreamHandler = (hostEvents: HostEventPublisher) => {\n const streams = new Map<string, { unread: number; stop: (code: string, emit?: boolean) => void }>();\n return async (input: WebviewCommandsStreamParams, deps: StreamCapabilityDeps) => {\n const { streamId } = input;\n if (input.operation === \"cancel\") streams.get(streamId)?.stop(\"command_stream_cancelled\");\n else if (input.operation === \"ack\") {\n const state = streams.get(streamId);\n if (state && Number.isSafeInteger(input.bytes) && input.bytes > 0 && input.bytes <= state.unread)\n state.unread -= input.bytes;\n } else {\n if (streams.has(streamId)) throw fail(\"command_stream_duplicate\");\n if (streams.size >= MAX_STREAMS) throw fail(\"command_stream_limit\");\n const controller = new AbortController();\n let ended = false;\n let unsubscribe = () => {};\n const emit = (payload: object) =>\n hostEvents.emit({ scope: \"commands.stream\", payload: { streamId, ...payload } });\n const finish = (outcome: CommandOutcome, notify = true) => {\n if (ended) return;\n ended = true;\n streams.delete(streamId);\n unsubscribe();\n controller.abort();\n if (notify) emit({ type: \"end\", outcome });\n };\n const state = { unread: 0, stop: (code: string, notify = true) => finish(errorOutcome(code), notify) };\n streams.set(streamId, state);\n unsubscribe = hostEvents.onDisconnect(() => state.stop(\"command_stream_cancelled\", false));\n const { operation: _, streamId: _streamId, commandId, ...body } = input;\n const receive = (event: CommandStreamClientEvent) => {\n if (event.type === \"end\") {\n const response = commandExecutionResultSchema.parse(event.response);\n deps.publish?.(response);\n finish(response.outcome);\n return;\n }\n state.unread += new TextEncoder().encode(JSON.stringify(event.data)).byteLength;\n if (state.unread > MAX_UNREAD_BYTES) state.stop(\"command_stream_overflow\");\n else emit(event);\n };\n const run = async () => {\n try {\n for await (const event of deps.stream({ commandId, ...body }, controller.signal)) {\n if (ended) break;\n receive(event);\n }\n if (!ended) state.stop(\"command_stream_disconnected\");\n } catch (error) {\n finish(failureOutcome(error));\n }\n };\n void run();\n }\n return { operation: input.operation, accepted: true as const };\n };\n};\n","import { CommandOutcomeError } from \"@pstdio/sdk/extensions\";\nimport { validatedCommandOutcomeSchema } from \"pstdio-api-contracts\";\nimport type {\n MaybePromise,\n WebviewHostCapability,\n WebviewHostCapabilityParams,\n} from \"pstdio-api-contracts/extension-kernel\";\nimport type { HostCapability } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport { z } from \"zod\";\nimport type { ExtensionWebviewHostAdapters } from \"./extension-webview-host-adapters\";\nimport { createTerminalSessionCapability } from \"./terminal-session-capability\";\nimport { parseWebviewCapabilityParams, WebviewHostCapabilityError } from \"./webview-capability-params\";\nimport { createWebviewCommandStreamHandler, withFrameSignal } from \"./webview-command-streams\";\n\nconst commandResponse = z.object({ outcome: validatedCommandOutcomeSchema }).passthrough();\nconst streamHandlers = new WeakMap<HostEventPublisher, ReturnType<typeof createWebviewCommandStreamHandler>>();\nconst streamHandler = (events: HostEventPublisher) => {\n let handler = streamHandlers.get(events);\n if (!handler) {\n handler = createWebviewCommandStreamHandler(events);\n streamHandlers.set(events, handler);\n }\n return handler;\n};\nconst after = <T>(result: MaybePromise<T>, done: () => unknown) =>\n result instanceof Promise ? result.then(done) : done();\n\nconst capability =\n <Name extends WebviewHostCapability>(\n name: Name,\n run: ((params: WebviewHostCapabilityParams[Name]) => unknown) | undefined,\n ) =>\n (input: unknown) => {\n if (!run)\n throw new WebviewHostCapabilityError(\"unsupported\", `The host does not support ${name}.`, { capability: name });\n return run(parseWebviewCapabilityParams(name, input));\n };\n\nconst commandExecution = (adapters: ExtensionWebviewHostAdapters) => {\n const { executeCommand, hostEvents } = adapters;\n if (!executeCommand) return undefined;\n return async (request: WebviewHostCapabilityParams[\"commands.execute\"]) => {\n try {\n const response = hostEvents\n ? await withFrameSignal(hostEvents, (signal) => Promise.resolve(executeCommand(request, signal)))\n : await executeCommand(request);\n return commandResponse.parse(response);\n } catch (error) {\n if (error instanceof CommandOutcomeError) return commandResponse.parse({ outcome: error.outcome });\n throw error;\n }\n };\n};\nconst commandStreaming = (adapters: ExtensionWebviewHostAdapters) => {\n const { streamCommand, hostEvents } = adapters;\n if (!streamCommand || !hostEvents) return undefined;\n return (request: WebviewHostCapabilityParams[\"commands.stream\"]) =>\n streamHandler(hostEvents)(request, { stream: streamCommand, publish: adapters.commandCompleted });\n};\n\nexport const createExtensionWebviewHostCapabilities = (adapters: ExtensionWebviewHostAdapters) => {\n const {\n hostEvents,\n navigation,\n pageParams,\n placement,\n notifications,\n settings,\n preferences,\n files,\n artifacts,\n terminal,\n } = adapters;\n const terminalCapability =\n terminal && hostEvents ? createTerminalSessionCapability({ terminal, hostEvents }) : undefined;\n return {\n \"commands.execute\": capability(\"commands.execute\", commandExecution(adapters)),\n \"commands.stream\": capability(\"commands.stream\", commandStreaming(adapters)),\n \"navigation.open\": capability(\n \"navigation.open\",\n navigation && ((request) => after(navigation.open(request.target), () => undefined)),\n ),\n \"page.params.update\": capability(\n \"page.params.update\",\n pageParams &&\n ((request) => {\n const location = pageParams.update(request.params);\n return location instanceof Promise ? location.then((value) => ({ location: value })) : { location };\n }),\n ),\n \"placement.close\": capability(\"placement.close\", placement && (() => placement.close())),\n \"notification.show\": capability(\n \"notification.show\",\n notifications?.show &&\n ((request) =>\n after(\n notifications.show!(\n \"type\" in request\n ? request\n : {\n type: request.level,\n ...(request.title === undefined ? {} : { title: request.title }),\n message: request.message ?? \"\",\n },\n ),\n () => undefined,\n )),\n ),\n \"notification.action\": capability(\n \"notification.action\",\n notifications?.create && ((request) => notifications.create!(request)),\n ),\n \"notification.resolve\": capability(\n \"notification.resolve\",\n notifications?.resolve && ((request) => notifications.resolve!({ ...request, status: request.status ?? \"done\" })),\n ),\n \"notification.dismiss\": capability(\n \"notification.dismiss\",\n notifications?.resolve && ((request) => notifications.resolve!({ ...request, status: \"dismissed\" })),\n ),\n \"preferences.get\": capability(\n \"preferences.get\",\n preferences && ((request) => preferences.get(request.name, request.scope)),\n ),\n \"preferences.set\": capability(\n \"preferences.set\",\n preferences &&\n ((request) => {\n const scope = request.scope ?? { scope: \"user\" };\n if (scope.scope === \"default\")\n throw new WebviewHostCapabilityError(\n \"preference_scope_read_only\",\n \"Default preferences are read-only.\",\n {},\n );\n return after(preferences.set(request.name, request.value, scope), () => ({\n name: request.name,\n value: request.value,\n }));\n }),\n ),\n \"extension.settings.all\": capability(\"extension.settings.all\", settings && (() => settings.all())),\n \"extension.settings.get\": capability(\n \"extension.settings.get\",\n settings && ((request) => settings.get(request.key)),\n ),\n \"extension.settings.set\": capability(\n \"extension.settings.set\",\n settings &&\n (async (request) => ({ key: request.key, value: (await settings.set(request.key, request.value)).value })),\n ),\n \"extension.settings.delete\": capability(\n \"extension.settings.delete\",\n settings && ((request) => settings.delete(request.key)),\n ),\n \"terminal.session\": capability(\n \"terminal.session\",\n terminalCapability && ((request) => terminalCapability(request)),\n ),\n \"files.upload\": capability(\"files.upload\", files && ((request) => files.upload(request))),\n \"files.list\": capability(\"files.list\", files && ((request) => files.list(request))),\n \"files.delete\": capability(\"files.delete\", files && ((request) => files.delete(request))),\n \"artifacts.read\": capability(\"artifacts.read\", artifacts && ((request) => artifacts.read(request))),\n } satisfies Record<WebviewHostCapability, HostCapability>;\n};\n","import { type NavigationTarget as ExtensionNavigationTarget, isNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { qualifyNavigationTarget } from \"pstdio-api-contracts\";\nimport type { NavigationTarget, NavigationTargetCommand, WorkbenchPanelRegion } from \"../../core\";\n\nexport interface ToWorkbenchNavigationTargetInput {\n commandIdOf?(\n command: Extract<ExtensionNavigationTarget, { kind: \"command\" }>[\"target\"][\"command\"],\n ): string | undefined;\n commandTargetOf?(target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>): NavigationTargetCommand;\n extensionId?: string;\n projectId?: string;\n region?: WorkbenchPanelRegion;\n}\n\nconst toCommandTarget = (\n target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>,\n input: ToWorkbenchNavigationTargetInput,\n) => {\n const override = input.commandTargetOf?.(target);\n if (override) return { ...override, ...(input.region ? { region: input.region } : {}) };\n const command = target.target.command;\n const extensionId = command.extensionId ?? input.extensionId;\n const commandId =\n input.commandIdOf?.(command) ??\n (extensionId && extensionId !== \"pstdio\" ? `${extensionId}.command.${command.id}` : command.id);\n return {\n kind: \"command\",\n commandId,\n args: target.target.params,\n ...(input.region ? { region: input.region } : {}),\n } satisfies NavigationTargetCommand;\n};\n\n// The return type stays explicit: the compound branch recurses, and TypeScript\n// cannot infer the return type of a self-referencing function.\ntype NavigationOperation = Extract<ExtensionNavigationTarget, { kind: \"page\" | \"panel\" }>;\nexport function toWorkbenchNavigationTarget(\n target: NavigationOperation,\n input?: ToWorkbenchNavigationTargetInput,\n): NavigationOperation;\nexport function toWorkbenchNavigationTarget(\n target: ExtensionNavigationTarget,\n input?: ToWorkbenchNavigationTargetInput,\n): NavigationTarget;\nexport function toWorkbenchNavigationTarget(\n target: ExtensionNavigationTarget,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget {\n if (!isNavigationTarget(target)) throw new Error(\"Invalid navigation target.\");\n if (input.extensionId) target = qualifyNavigationTarget(target, input.extensionId, input.projectId);\n if (target.kind === \"command\") return toCommandTarget(target, input);\n if (target.kind === \"href\") return target;\n if (target.kind === \"page\") return target;\n if (target.kind === \"panel\") return { ...target, ...(input.region ? { region: input.region } : {}) };\n return {\n kind: \"compound\",\n targets: target.targets.map((item) => toWorkbenchNavigationTarget(item, input)),\n };\n}\n","import type { PreferenceScopeRef, PreferenceValue, WorkbenchCore } from \"../../core\";\n\nexport interface WebviewOwnedPreferences {\n get(name: string, scope?: PreferenceScopeRef): Promise<PreferenceValue | undefined> | PreferenceValue | undefined;\n set(name: string, value: PreferenceValue, scope: PreferenceScopeRef): Promise<void> | void;\n}\n\nexport const createWebviewPreferencesAdapter = (input: {\n workbench: WorkbenchCore;\n extensionId?: string;\n ownedPreferences?: WebviewOwnedPreferences;\n warn?: (message: string) => void;\n}) => {\n const registry = input.workbench.preferences;\n const owner = () => {\n if (!input.extensionId) throw new Error(\"Preferences require the calling extension identity\");\n return input.extensionId;\n };\n const registered = (name: string) => {\n const schema = registry.getSchema(name);\n if (schema && input.extensionId && schema.ownerId !== \"workbench.core\" && schema.ownerId !== input.extensionId)\n (input.warn ?? console.warn)(\n `Cross-extension preference access to ${name} is deprecated. Use preferences owned by ${input.extensionId}.`,\n );\n return Boolean(schema);\n };\n return {\n get: (name: string, scope?: PreferenceScopeRef) => {\n if (registered(name)) return registry.getValue(name, scope);\n owner();\n return input.ownedPreferences?.get(name, scope) ?? registry.getOwnedValue(owner(), name, scope);\n },\n set: (name: string, value: PreferenceValue, scope: PreferenceScopeRef) => {\n if (scope.scope === \"default\") throw new Error(\"preference_scope_read_only\");\n if (registered(name)) {\n return registry.setValue(name, value, scope);\n }\n owner();\n return input.ownedPreferences\n ? input.ownedPreferences.set(name, value, scope)\n : registry.setOwnedValue(owner(), name, value, scope);\n },\n };\n};\n","import type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { WorkbenchCore, WorkbenchPanelInstance } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { ExtensionWebviewHostAdapters } from \"./extension-webview-host-adapters\";\nimport { createExtensionWebviewHostCapabilities } from \"./extension-webview-host-capabilities\";\nimport { createWebviewPreferencesAdapter, type WebviewOwnedPreferences } from \"./webview-preferences-capability\";\n\ninterface CreateWorkbenchWebviewHostAdaptersInput {\n workbench: WorkbenchCore;\n placement?: WorkbenchPanelInstance;\n extensionId?: string;\n projectId?: string;\n ownedPreferences?: WebviewOwnedPreferences;\n warn?: (message: string) => void;\n hostEvents?: HostEventPublisher;\n}\n\nexport const createWorkbenchWebviewHostAdapters = (input: CreateWorkbenchWebviewHostAdaptersInput) => {\n const { workbench, placement, extensionId, projectId, hostEvents } = input;\n return {\n hostEvents,\n executeCommand: async (request, signal) => ({\n outcome: {\n ok: true,\n status: \"success\",\n value: await workbench.commands.executeCommand(request.commandId, request.params, {\n resource: request.resource,\n signal,\n }),\n },\n }),\n placement: placement?.placementIdentity\n ? { close: () => workbench.closePlacement(placement.placementIdentity!) }\n : undefined,\n pageParams: {\n update: (patch) => {\n const state = workbench.pages.store.getState();\n if (!state.location) throw new Error(\"page_params_no_page\");\n if (!extensionId || extensionId !== state.location.page.extensionId) throw new Error(\"page_params_not_owner\");\n return workbench.pageLocations.updateParams(patch);\n },\n },\n navigation: {\n open: (target) =>\n workbench.navigation.openTarget(toWorkbenchNavigationTarget(target, { extensionId, projectId })),\n },\n notifications: {\n show: (notice) =>\n workbench.notifications.show({\n level: notice.type,\n metadata: notice.metadata,\n title: notice.title ?? notice.message,\n message: notice.title === undefined ? undefined : notice.message,\n }),\n },\n preferences: createWebviewPreferencesAdapter(input),\n terminal: workbench.terminal,\n } satisfies ExtensionWebviewHostAdapters;\n};\n\nexport const createWorkbenchWebviewHostCapabilities = (input: CreateWorkbenchWebviewHostAdaptersInput) =>\n createExtensionWebviewHostCapabilities(createWorkbenchWebviewHostAdapters(input));\n","import type { WebviewHostProps } from \"pstdio-api-contracts/extension-kernel\";\nimport type { ThemePreference } from \"pstdio-extensions/bridge/contract\";\nimport { createHostEventPublisher, type HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type {\n WorkbenchCore,\n WorkbenchPanelInstance,\n WorkbenchPanelRenderInput,\n WorkbenchRendererRegistration,\n} from \"../../core\";\nimport { BridgeWebviewFrame } from \"./bridge-webview-frame\";\nimport type { ExtensionWebviewHostAdapters } from \"./extension-webview-host-adapters\";\nimport { createExtensionWebviewHostCapabilities } from \"./extension-webview-host-capabilities\";\nimport { createWorkbenchWebviewHostAdapters } from \"./webview-host-capabilities\";\n\nexport interface BridgeWebviewRenderContext {\n workbench: WorkbenchCore;\n webviewId: string;\n extensionId?: string;\n placement: WorkbenchPanelInstance;\n /** Channel for pushing host events (e.g. terminal output) into this webview. */\n hostEvents: HostEventPublisher;\n}\n\n// Hosts supply services. The shared factory owns capability routing, validation and results.\nexport type CreateBridgeWebviewHostAdapters = (context: BridgeWebviewRenderContext) => ExtensionWebviewHostAdapters;\n\n// What the host pushes into the guest's props store. Hosts inject this to forward dynamic\n// data — e.g. the dashboard forwards extension command outcomes and theme preference.\nexport type CreateBridgeWebviewProps = (\n context: BridgeWebviewRenderContext,\n) => Partial<WebviewHostProps> & Record<string, unknown>;\nexport type CreateBridgeWebviewTheme = (context: BridgeWebviewRenderContext) => ThemePreference;\n\ninterface CreateBridgeWebviewRendererInput {\n createHostAdapters?: CreateBridgeWebviewHostAdapters;\n createProps?: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n}\n\nexport const BRIDGE_WEBVIEW_RENDERER_ID = \"webview:bridge\";\n\nexport interface BridgeWebviewConfig {\n title?: string;\n runtimeUrl: string;\n moduleUrl: string;\n styles?: string[];\n capabilities?: string[];\n}\n\nconst isBridgeWebviewConfig = (value: unknown): value is BridgeWebviewConfig => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const config = value as Partial<BridgeWebviewConfig>;\n return typeof config.runtimeUrl === \"string\" && typeof config.moduleUrl === \"string\";\n};\n\nconst createPlacementProps: CreateBridgeWebviewProps = ({ placement }) => ({\n placement,\n resource: placement.resource,\n});\n\nconst createLightTheme: CreateBridgeWebviewTheme = () => \"light\";\n\nconst hostEventPublishersByWorkbench = new WeakMap<WorkbenchCore, Map<string, HostEventPublisher>>();\n\nexport const getBridgeWebviewHostEventPublisher = (workbench: WorkbenchCore, instance: WorkbenchPanelInstance) => {\n let hostEventsByWidget = hostEventPublishersByWorkbench.get(workbench);\n if (!hostEventsByWidget) {\n hostEventsByWidget = new Map();\n hostEventPublishersByWorkbench.set(workbench, hostEventsByWidget);\n }\n\n const key = instance.instanceId;\n let hostEvents = hostEventsByWidget.get(key);\n if (!hostEvents) {\n hostEvents = createHostEventPublisher();\n hostEventsByWidget.set(key, hostEvents);\n }\n\n return hostEvents;\n};\n\nexport const renderBridgeWebviewFrame = (input: {\n context: BridgeWebviewRenderContext;\n createHostAdapters: CreateBridgeWebviewHostAdapters;\n createProps: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n ownerId?: string;\n title: string;\n webview: BridgeWebviewConfig;\n}) => {\n const { context, createHostAdapters, createProps, createTheme = createLightTheme, ownerId, title, webview } = input;\n return (\n <BridgeWebviewFrame\n view={{\n extensionId: ownerId ?? \"workbench\",\n id: context.webviewId,\n label: webview.title ?? title,\n webview: {\n capabilities: webview.capabilities,\n moduleUrl: webview.moduleUrl,\n runtimeUrl: webview.runtimeUrl,\n styles: webview.styles ?? [],\n },\n }}\n props={createProps(context)}\n workbench={context.workbench}\n theme={createTheme(context)}\n capabilities={createExtensionWebviewHostCapabilities(\n createHostAdapters({ ...context, extensionId: ownerId ?? context.extensionId }),\n )}\n hostEvents={context.hostEvents}\n />\n );\n};\n\nconst renderBridgeWebview = (\n input: WorkbenchPanelRenderInput,\n createHostAdapters: CreateBridgeWebviewHostAdapters,\n createProps: CreateBridgeWebviewProps,\n createTheme: CreateBridgeWebviewTheme,\n) => {\n const { workbench, panel, instance } = input;\n const webview = isBridgeWebviewConfig(panel.config) ? panel.config : null;\n if (!webview) return null;\n\n return renderBridgeWebviewFrame({\n context: {\n workbench,\n webviewId: instance.panelId,\n placement: instance,\n hostEvents: getBridgeWebviewHostEventPublisher(workbench, instance),\n },\n createHostAdapters,\n createProps,\n createTheme,\n ownerId: \"ownerId\" in panel ? panel.ownerId : undefined,\n title: panel.title,\n webview,\n });\n};\n\nexport const createBridgeWebviewRenderer = (input: CreateBridgeWebviewRendererInput = {}) => {\n const createHostAdapters = input.createHostAdapters ?? createWorkbenchWebviewHostAdapters;\n const createProps = input.createProps ?? createPlacementProps;\n const createTheme = input.createTheme ?? createLightTheme;\n\n return {\n id: BRIDGE_WEBVIEW_RENDERER_ID,\n render: (renderInput) => renderBridgeWebview(renderInput, createHostAdapters, createProps, createTheme),\n } satisfies WorkbenchRendererRegistration;\n};\n","import type { LocalizableString } from \"pstdio-api-contracts\";\nimport { isLocalizedString, type Localizable } from \"pstdio-api-contracts/extension-kernel\";\n\nexport const text = (value: Localizable<string> | LocalizableString | undefined, fallback = \"\") => {\n if (value === undefined) return fallback;\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n","import type { CommandExecutionResult } from \"@pstdio/sdk/api\";\nimport { getCommandValue } from \"@pstdio/sdk/extensions\";\n\nexport const unwrapCommandValue = (result: unknown) => {\n const response = result as Partial<CommandExecutionResult> | undefined;\n if (!response?.outcome) return result;\n return getCommandValue(response.outcome);\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { WorkbenchCommandExecutionContext } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"./workbench-extension-command\";\n\nexport const runResourceMutation = async (\n context: WorkbenchExtensionCommandContext,\n command: WorkbenchExtensionMetadata[\"commands\"][number],\n params: Record<string, unknown> | undefined,\n execution: WorkbenchCommandExecutionContext | undefined,\n persist: () => Promise<unknown>,\n) => {\n const mutation = command.resourceMutation;\n if (!mutation) return persist();\n const id = params?.[mutation.idParam] ?? execution?.resource?.id;\n if (typeof id !== \"string\") return persist();\n const resource = { type: mutation.resourceType, id, extensionId: command.extensionId, projectId: context.projectId };\n if (mutation.kind === \"remove\") {\n if (!(await context.workbench.commandPalette.requestConfirmation(text(command.title, \"Delete\")))) return;\n }\n const rawLabel = mutation.kind === \"rename\" ? params?.[mutation.labelParam] : undefined;\n // Leave invalid input to the command; never display a title that it cannot save.\n if (mutation.kind === \"rename\" && (typeof rawLabel !== \"string\" || !rawLabel.trim())) return persist();\n const preview = context.workbench.resources.preview.begin(\n resource,\n mutation.kind === \"remove\" ? { removed: true } : { label: (rawLabel as string).trim() },\n );\n try {\n const result = await context.workbench.resources.preview.persist(resource, persist);\n await preview.commit();\n return result;\n } catch (error) {\n preview.rollback();\n throw error;\n }\n};\n","import type { CommandExecuteRequest, CommandExecutionResult, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type {\n ResourceRef,\n WorkbenchCommandExecutionContext,\n WorkbenchModuleContext,\n WorkbenchPanelRegion,\n} from \"../../core\";\nimport { unwrapCommandValue } from \"./command-response\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\nimport { runResourceMutation } from \"./workbench-resource-mutation\";\nexport interface WorkbenchExtensionCommandContext {\n metadata?: Pick<WorkbenchExtensionMetadata, \"commands\">;\n executeCommand(commandId: string, body: CommandExecuteRequest, signal?: AbortSignal): Promise<unknown> | unknown;\n prepareCommandArgs?(\n commandId: string,\n args: unknown,\n context?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n ): Promise<unknown> | unknown;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\nexport interface ExecuteWorkbenchExtensionCommandInput {\n region?: WorkbenchPanelRegion;\n workspaceId?: string;\n signal?: AbortSignal;\n metadata?: Record<string, unknown>;\n params?: Record<string, unknown>;\n resource?: ResourceRef;\n slot?: CommandExecuteRequest[\"slot\"];\n}\nexport const createExtensionSlot = (input: {\n context?: Record<string, unknown>;\n id: string;\n kind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\n projectId: string;\n}) => ({\n id: input.id,\n kind: input.kind,\n context: { projectId: input.projectId, ...(input.context ?? {}) },\n});\nexport const executeWorkbenchExtensionCommandResponse = async (\n context: Pick<WorkbenchExtensionCommandContext, \"executeCommand\" | \"projectId\"> & {\n workbench: Pick<WorkbenchModuleContext, \"navigation\" | \"notifications\">;\n },\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const resource = input.resource;\n const response = await context.executeCommand(\n commandId,\n {\n projectId: context.projectId,\n ...(input.workspaceId ? { workspaceId: input.workspaceId } : {}),\n ...(input.params ? { params: input.params } : {}),\n ...(resource ? { resource } : {}),\n ...(input.slot ? { slot: input.slot } : {}),\n source: \"dashboard\",\n ...(input.metadata ? { metadata: input.metadata } : {}),\n },\n input.signal,\n );\n const outcome = (response as Partial<CommandExecutionResult> | undefined)?.outcome;\n if (outcome?.status === \"success\") {\n for (const target of outcome.navigationRequests ?? []) {\n try {\n await context.workbench.navigation.openTarget(toWorkbenchNavigationTarget(target, { region: input.region }));\n } catch (error) {\n context.workbench.notifications.show({\n level: \"warning\",\n title: \"Command completed, but navigation failed\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n return response;\n};\nexport const executeWorkbenchExtensionCommand = async (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const persist = async () =>\n unwrapCommandValue(await executeWorkbenchExtensionCommandResponse(context, commandId, input));\n const command = context.metadata?.commands.find((candidate) => candidate.id === commandId);\n return command\n ? runResourceMutation(context, command, input.params, { resource: input.resource }, persist)\n : persist();\n};\n","import type { WorkbenchExtensionCommandPaletteResourceRecord } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget, ResourceRef } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { CommandPaletteResourceResult, Disposable } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\ninterface ResourceItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n target: NavigationTarget;\n}\ninterface ProviderQueryResult {\n items?: ResourceItem[];\n}\nconst isProviderQueryResult = (value: unknown): value is ProviderQueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst commandIdOf = (\n command: Extract<\n NavigationTarget,\n {\n kind: \"command\";\n }\n >[\"target\"][\"command\"],\n extensionId: string,\n) => `${command.extensionId ?? extensionId}.command.${command.id}`;\nconst activateTarget = async (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n item: ResourceItem,\n) => {\n const { target } = item;\n if (target.kind === \"command\") {\n await executeWorkbenchExtensionCommand(context, commandIdOf(target.target.command, record.extensionId), {\n params: target.target.params,\n });\n // A selected command may mutate extension data; refresh providers so a reopened\n // palette reflects the change without an app reload.\n context.workbench.commandPaletteResources.refresh();\n return;\n }\n await context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(target, {\n extensionId: record.extensionId,\n }),\n );\n};\nconst targetResource = (target: NavigationTarget): ResourceRef | undefined => {\n if (target.kind === \"page\" || target.kind === \"panel\") return target.resource;\n if (target.kind === \"compound\") return target.targets.find((step) => step.resource)?.resource;\n return undefined;\n};\nconst toResult = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n groupLabel: string,\n item: ResourceItem,\n): CommandPaletteResourceResult => ({\n id: `${record.id}:${item.id}`,\n resource: (() => {\n const resource = targetResource(item.target);\n return resource\n ? {\n ...resource,\n projectId: resource.projectId ?? context.projectId,\n extensionId: resource.extensionId ?? record.extensionId,\n }\n : undefined;\n })(),\n label: item.label,\n description: item.description,\n icon: item.icon,\n keywords: item.keywords,\n group: groupLabel,\n activate: () => activateTarget(context, record, item),\n});\nexport const registerWorkbenchExtensionCommandPaletteResources = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionCommandPaletteResourceRecord[],\n) => {\n const disposables: Disposable[] = [];\n for (const record of records) {\n const groupLabel = text(record.title, record.id);\n disposables.push(\n context.workbench.commandPaletteResources.registerProvider({\n id: record.id,\n title: groupLabel,\n refreshEventIds: record.refreshEventIds,\n query: async ({ query, limit, signal }) => {\n const activeResource = context.workbench.getActiveResource();\n const value = await executeWorkbenchExtensionCommand(context, record.queryHandlerId, {\n signal,\n params: {\n projectId: context.projectId,\n modeId: context.workbench.modes.getActiveModeId(),\n activeResource: activeResource,\n providerId: record.id,\n query,\n limit,\n },\n });\n if (!isProviderQueryResult(value)) return [];\n return (value.items ?? []).map((item) => toResult(context, record, groupLabel, item));\n },\n }),\n );\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { WorkbenchExtensionControlsRendererRecord } from \"pstdio-api-contracts\";\nimport { controlsQueryResultSchema } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, ResourceRef } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\nexport interface WorkbenchExtensionControlsAdapter {\n /** Supply a fallback resource when the widget placement carries none. */\n resolveResource?: (record: WorkbenchExtensionControlsRendererRecord) => ResourceRef | undefined;\n}\nconst registerControlsRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionControlsRendererRecord,\n adapter: WorkbenchExtensionControlsAdapter,\n) => {\n const slot = createExtensionSlot({\n id: record.id,\n kind: \"renderer\",\n projectId: context.projectId,\n context: { controlsRendererId: record.id },\n });\n const run = (\n commandId: string | undefined,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n ) =>\n commandId\n ? executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n ...(pageParams ? { pageParams } : {}),\n projectId: context.projectId,\n ...(resource ? { resource: resource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n signal,\n slot,\n metadata: { controlsRendererId: record.id },\n })\n : Promise.resolve(undefined);\n return context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"controls\",\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n defaultValues: record.defaultValues,\n executeQuery: async (resource, signal, pageParams) => {\n const value = await run(\n record.queryHandlerId,\n {},\n resource ?? adapter.resolveResource?.(record),\n signal,\n pageParams,\n );\n const result = controlsQueryResultSchema.safeParse(value);\n if (!result.success) {\n const fields = result.error.issues\n .map((issue) => `body.query.${issue.path.join(\".\")}: ${issue.message}`)\n .join(\"; \");\n throw new Error(\n `Extension \"${record.extensionId}\" view \"${record.id}\" has invalid controls. Expected serializable control declarations. ${fields}`,\n );\n }\n return result.data;\n },\n updateValue: record.valueChangeHandlerId\n ? ({ controlId, value, values, resource }) =>\n run(record.valueChangeHandlerId, { controlId, value, values }, resource).then(() => undefined)\n : undefined,\n apply: record.applyHandlerId\n ? ({ values, resource }) => run(record.applyHandlerId, { values }, resource).then(() => undefined)\n : undefined,\n reset: record.resetHandlerId\n ? ({ controlIds, resource }) => run(record.resetHandlerId, { controlIds }, resource).then(() => undefined)\n : undefined,\n },\n });\n};\n// Bridges serializable controls renderer metadata into live workbench controls renderers\n// (wiring each query/update/apply/reset command id to command execution), and registers a\n// panel widget for every panel that places one.\nexport const registerWorkbenchExtensionControlsRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionControlsRendererRecord[],\n adapter: WorkbenchExtensionControlsAdapter = {},\n): Disposable => {\n const disposables: Disposable[] = [];\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { Localizable } from \"@pstdio/sdk/extensions\";\nimport { commandRefId } from \"@pstdio/sdk/extensions\";\nimport type { CommandParamSchema } from \"../../core\";\n\ntype LocalizableText = Localizable<string> | undefined;\ntype ParamLocalizer = (value: LocalizableText, fallback?: string) => string;\n\ntype ContributedParamSchema =\n | Record<string, { type: string; label?: LocalizableText; description?: LocalizableText; options?: unknown }>\n | undefined;\n\n/**\n * Contribution params carry `Localizable` labels; the workbench's command\n * surfaces render plain strings. Resolve at the boundary so no l10n object\n * reaches a renderer and gets stringified as \"[object Object]\".\n */\nexport const localizeParamSchema = (\n params: ContributedParamSchema,\n localize: ParamLocalizer,\n ownerExtensionId?: string,\n) => {\n if (!params) return undefined;\n\n return Object.fromEntries(\n Object.entries(params).map(([id, descriptor]) => [\n id,\n {\n ...descriptor,\n ...(descriptor.options && !Array.isArray(descriptor.options)\n ? { options: localizeOptionSource(descriptor.options, ownerExtensionId) }\n : {}),\n label: descriptor.label === undefined ? undefined : localize(descriptor.label, id),\n description: descriptor.description === undefined ? undefined : localize(descriptor.description),\n },\n ]),\n ) as CommandParamSchema;\n};\n\nconst localizeOptionSource = (value: unknown, ownerExtensionId?: string) => {\n const source = value as {\n command: { id: string; extensionId?: string };\n valueField: string;\n labelField: string;\n params?: Record<string, unknown>;\n };\n return {\n valueField: source.valueField,\n labelField: source.labelField,\n params: source.params,\n commandId: commandRefId({\n id: source.command.id,\n extensionId: source.command.extensionId ?? ownerExtensionId ?? \"pstdio\",\n }),\n };\n};\n","import type { WorkbenchExtensionDataTableRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { localizeParamSchema } from \"./param-schema-localization\";\n\nexport const mapViewToolbarActions = (\n record: Pick<WorkbenchExtensionDataTableRendererRecord, \"toolbarActions\" | \"extensionId\">,\n) =>\n record.toolbarActions?.map((action) => ({\n id: action.id,\n label: text(action.label, action.id),\n icon: action.icon,\n presentation: action.presentation,\n commandId: action.commandId,\n args: action.params,\n params: localizeParamSchema(action.input, text, record.extensionId),\n submitLabel: action.submitLabel,\n disabled: action.disabled,\n when: action.when,\n }));\n","import type { DataTableRendererSettings } from \"@pstdio/sdk/extensions\";\nimport { dataTableBuiltInViews, type WorkbenchExtensionDataTableRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type {\n CollectionViewsProvider,\n DataTableRendererColumn,\n DataTableRendererQueryResult,\n DataTableRendererRow,\n Disposable,\n ResourceRef,\n} from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nimport { mapViewToolbarActions } from \"./view-toolbar-actions\";\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\n\nexport interface WorkbenchExtensionDataTableRendererAdapter {\n resolveRowResource?: (\n record: WorkbenchExtensionDataTableRendererRecord,\n row: { id: string; values: Record<string, unknown>; resource?: ResourceRef },\n ) => ResourceRef | undefined;\n /** Shared saved views for the table, such as the dashboard's project views. */\n createViewsProvider?: (\n record: WorkbenchExtensionDataTableRendererRecord,\n ) => CollectionViewsProvider<DataTableRendererSettings>;\n}\ntype WireColumn = NonNullable<WorkbenchExtensionDataTableRendererRecord[\"columns\"]>[number];\nconst toColumn = (column: WireColumn): DataTableRendererColumn => ({\n ...column,\n label: localize(column.label, column.id),\n description: column.description ? localize(column.description) : undefined,\n icon: column.icon ? createElement(WorkbenchIcon, { name: column.icon, size: 14 }) : undefined,\n});\nconst isQueryResult = (\n value: unknown,\n): value is {\n rows: Array<{\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n }>;\n columns?: WorkbenchExtensionDataTableRendererRecord[\"columns\"];\n} =>\n Boolean(\n value &&\n typeof value === \"object\" &&\n Array.isArray(\n (\n value as {\n rows?: unknown;\n }\n ).rows,\n ),\n );\nconst toRow = (row: { id: string; values: Record<string, unknown>; resource?: ResourceRef }): DataTableRendererRow => ({\n id: row.id,\n values: row.values,\n resource: row.resource ? row.resource : undefined,\n});\nconst registerRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionDataTableRendererRecord,\n adapter: WorkbenchExtensionDataTableRendererAdapter,\n) => {\n const builtIns = dataTableBuiltInViews(record);\n const originalRows = new WeakMap<DataTableRendererRow, Parameters<typeof toRow>[0]>();\n const slot = createExtensionSlot({\n id: record.id,\n kind: \"dataTableRenderer\",\n projectId: context.projectId,\n context: { dataTableRendererId: record.id },\n });\n const run = (\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n modeId?: string,\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n ) =>\n executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n ...(pageParams ? { pageParams } : {}),\n projectId: context.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource: resource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n signal,\n slot,\n metadata: { dataTableRendererId: record.id },\n });\n return context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"dataTable\",\n resourceKind: record.resourceKind,\n toolbarActions: mapViewToolbarActions(record),\n columns: record.columns?.map(toColumn),\n initialPageSize: record.initialPageSize,\n pageSizeOptions: record.pageSizeOptions,\n defaultSettings: builtIns.settings,\n defaultFilter: record.defaultFilter,\n defaultSorts: record.defaultSorts,\n defaultViews: builtIns.views.map((view) => ({ ...view, title: localize(view.title, view.id) })),\n defaultActiveViewId: record.defaultActiveViewId,\n viewsProvider: adapter.createViewsProvider?.(record),\n selectionMode: record.selectionMode,\n selectionActions: record.selectionActions?.map((action) => ({\n id: action.id,\n commandId: action.commandId,\n label: localize(action.label, action.id),\n icon: action.icon ? createElement(WorkbenchIcon, { name: action.icon, size: 16 }) : undefined,\n destructive: action.destructive,\n run: (rows) => run(action.commandId, { rowIds: rows.map((row) => row.id) }).then(() => undefined),\n })),\n emptyTitle: record.emptyTitle ? localize(record.emptyTitle) : undefined,\n emptyDescription: record.emptyDescription ? localize(record.emptyDescription) : undefined,\n executeQuery: async ({ resource, modeId, filter, sorts, settings, pageParams }, signal) => {\n const value = await run(\n record.queryHandlerId,\n { filter, sorts, settings },\n resource,\n modeId,\n signal,\n pageParams,\n );\n if (!isQueryResult(value)) return { rows: [] };\n const rows = value.rows.map((row) => {\n const mapped = toRow(row);\n if (adapter.resolveRowResource) mapped.resource = adapter.resolveRowResource(record, row);\n originalRows.set(mapped, row);\n return mapped;\n });\n return {\n rows,\n columns: value.columns?.map(toColumn),\n } satisfies DataTableRendererQueryResult;\n },\n rowActions: record.rowActions?.map((action) => ({\n id: action.id,\n commandId: action.commandId,\n label: localize(action.label, action.id),\n icon: action.icon ? createElement(WorkbenchIcon, { name: action.icon, size: 16 }) : undefined,\n destructive: action.destructive,\n run: async (row) => {\n await run(action.commandId, { rowId: row.id }, row.resource);\n context.workbench.views.refreshView(record.id);\n },\n })),\n onRowActivate: record.rowActivationHandlerId\n ? async (row) => {\n await run(record.rowActivationHandlerId!, { row: originalRows.get(row) ?? row }, row.resource);\n }\n : undefined,\n },\n });\n};\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n adapter: WorkbenchExtensionDataTableRendererAdapter = {},\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record, adapter));\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type {\n ExtensionCommandPaletteContribution,\n ExtensionMenuContribution,\n WorkbenchExtensionMetadata,\n} from \"@pstdio/sdk/api\";\nimport { isLocalizedString, type Localizable } from \"@pstdio/sdk/extensions\";\nimport type { Command, MenuItem, MenuPath } from \"../../core\";\nimport { localizeParamSchema } from \"./param-schema-localization\";\n\nexport type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\n\nconst placementOrder = { first: 0, default: 1, last: 2 } satisfies Record<\n NonNullable<ExtensionMenuContribution[\"placement\"] | ExtensionCommandPaletteContribution[\"placement\"]>,\n number\n>;\ntype ExtensionContributionPlacement = keyof typeof placementOrder;\n\nexport interface WorkbenchExtensionMenuSlotConfig {\n menuPath: MenuPath;\n group?: string;\n overflowLabel?: string;\n resourceGroup?: { id: string; label: string };\n}\n\nexport type WorkbenchExtensionMenuWhenBuilder = (contribution: ExtensionMenuContribution) => string | undefined;\nexport type WorkbenchExtensionStringResolver = (value: Localizable<string> | undefined, extensionId: string) => string;\n\nexport interface WorkbenchExtensionMenuRegistration {\n command: Command;\n contribution: ExtensionMenuContribution;\n menuItem: MenuItem;\n menuPath: MenuPath;\n targetCommandId: string;\n}\n\nexport interface WorkbenchExtensionCommandPaletteRegistration {\n command: Command;\n contribution: ExtensionCommandPaletteContribution;\n menuItem: MenuItem;\n targetCommandId: string;\n}\n\nexport interface UnresolvedWorkbenchExtensionMenuContribution {\n contribution: ExtensionMenuContribution;\n targetId: string;\n}\n\nexport const emptyWorkbenchExtensionMetadata = {\n commands: [],\n commandPaletteContributions: [],\n diagnostics: [],\n extensions: [],\n menuContributions: [],\n modes: [],\n pages: [],\n views: [],\n viewMenus: [],\n placements: [],\n resourceKinds: [],\n navigationItems: [],\n navigationTrees: [],\n statusBarItems: [],\n settingsPanels: [],\n settingsDefinitions: [],\n} satisfies WorkbenchExtensionMetadata;\n\ntype CommandContributionMetadata = Pick<\n WorkbenchExtensionMetadata,\n \"commands\" | \"commandPaletteContributions\" | \"menuContributions\"\n>;\n\nconst defaultWorkbenchExtensionCommandId = (contribution: ExtensionMenuContribution) =>\n `workbench.extension.menu.${contribution.id}`;\n\nconst defaultWorkbenchExtensionPaletteCommandId = (contribution: ExtensionCommandPaletteContribution) =>\n `workbench.extension.palette.${contribution.id}`;\n\nconst contributionOrder = (contribution: { placement?: ExtensionContributionPlacement }, index: number) =>\n placementOrder[contribution.placement ?? \"default\"] * 1000 + index;\n\nconst text: WorkbenchExtensionStringResolver = (value) => {\n if (value === undefined) return \"\";\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n\nconst createMenuItem = (input: {\n contribution: ExtensionMenuContribution;\n commandId: string;\n index: number;\n slot: WorkbenchExtensionMenuSlotConfig;\n when?: string;\n disabledWhen?: string;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString, slot, when, disabledWhen } = input;\n\n return {\n commandId,\n id: contribution.id,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: slot.group ?? contribution.group,\n resourceGroup: slot.resourceGroup,\n args: contribution.params,\n overflowLabel: slot.overflowLabel,\n order: contributionOrder(contribution, index),\n when,\n disabledWhen,\n disabledReason: resolveString(contribution.disabledReason, contribution.extensionId),\n } satisfies MenuItem;\n};\n\nconst createPaletteItem = (input: {\n contribution: ExtensionCommandPaletteContribution;\n commandId: string;\n index: number;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString } = input;\n\n return {\n commandId,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: contribution.group,\n args: contribution.params,\n order: contributionOrder(contribution, index),\n } satisfies MenuItem;\n};\n\nexport const buildWorkbenchExtensionMenuRegistrations = (input: {\n metadata: CommandContributionMetadata;\n menuSlotsById: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n menuTargetsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n createCommandId?: (contribution: ExtensionMenuContribution) => string;\n createWhenExpression?: WorkbenchExtensionMenuWhenBuilder;\n resolveString?: WorkbenchExtensionStringResolver;\n}) => {\n const {\n createCommandId = defaultWorkbenchExtensionCommandId,\n createWhenExpression,\n menuSlotsById,\n menuTargetsById,\n metadata,\n resolveString = text,\n } = input;\n const registrations: WorkbenchExtensionMenuRegistration[] = [];\n const unresolved: UnresolvedWorkbenchExtensionMenuContribution[] = [];\n\n metadata.menuContributions.forEach((contribution, index) => {\n const slot = contribution.target\n ? menuTargetsById?.get(contribution.target)\n : menuSlotsById.get(contribution.slotId);\n if (!slot) {\n unresolved.push({ contribution, targetId: contribution.target ?? contribution.slotId });\n return;\n }\n\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n resourceMutation: command?.resourceMutation,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: localizeParamSchema(\n command?.params,\n (value) => resolveString(value, command?.extensionId ?? contribution.extensionId),\n command?.extensionId,\n ),\n },\n contribution,\n menuItem: createMenuItem({\n commandId,\n contribution,\n index,\n resolveString,\n slot,\n when: createWhenExpression?.(contribution),\n disabledWhen: contribution.disabledWhen\n ? createWhenExpression?.({ ...contribution, when: contribution.disabledWhen })\n : undefined,\n }),\n menuPath: slot.menuPath,\n targetCommandId: contribution.commandId,\n });\n });\n\n return { registrations, unresolved };\n};\n\nexport const buildWorkbenchExtensionCommandPaletteRegistrations = (input: {\n metadata: CommandContributionMetadata;\n createCommandId?: (contribution: ExtensionCommandPaletteContribution) => string;\n resolveString?: WorkbenchExtensionStringResolver;\n}) => {\n const { createCommandId = defaultWorkbenchExtensionPaletteCommandId, metadata, resolveString = text } = input;\n const registrations: WorkbenchExtensionCommandPaletteRegistration[] = [];\n\n (metadata.commandPaletteContributions ?? []).forEach((contribution, index) => {\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: localizeParamSchema(\n command?.params,\n (value) => resolveString(value, command?.extensionId ?? contribution.extensionId),\n command?.extensionId,\n ),\n },\n contribution,\n menuItem: createPaletteItem({ commandId, contribution, index, resolveString }),\n targetCommandId: contribution.commandId,\n });\n });\n\n return registrations;\n};\n","import type { CommandExecuteRequest, CommandExecutionResult } from \"@pstdio/sdk/api\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n FileRendererContent,\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n ResourceRef,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { unwrapCommandValue } from \"../host/command-response\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport { executeWorkbenchExtensionCommandResponse } from \"../host/workbench-extension-command\";\nimport { attachFileStorageVersions, fileStorageVersions } from \"./file-storage-versions\";\n\ntype FileRendererRecord = NonNullable<WorkbenchExtensionMetadata[\"fileRenderers\"]>[number];\nexport interface RegisterWorkbenchExtensionFileRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest, signal?: AbortSignal): Promise<unknown> | unknown;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\n\nconst slotContext = (input: { projectId: string; rendererId: string; resource?: ResourceRef }) => ({\n id: input.rendererId,\n kind: \"renderer\" as const,\n context: {\n projectId: input.projectId,\n ...(input.resource ? { resourceType: input.resource.type, resourceId: input.resource.id } : {}),\n },\n});\nconst executeFileCommand = async (\n input: RegisterWorkbenchExtensionFileRenderersInput,\n rendererId: string,\n commandId: string,\n resource: ResourceRef | undefined,\n extra: Record<string, unknown> = {},\n metadata?: CommandExecuteRequest[\"metadata\"],\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n) => {\n const ext = resource;\n return executeWorkbenchExtensionCommandResponse(input, commandId, {\n params: {\n renderer: {\n rendererId,\n ...(pageParams ? { pageParams } : {}),\n projectId: input.projectId,\n ...(ext ? { resource: ext } : {}),\n invocation: { placement: \"visible\" },\n },\n ...extra,\n },\n resource: ext,\n signal,\n slot: slotContext({ projectId: input.projectId, rendererId, resource: ext }),\n ...(metadata ? { metadata } : {}),\n });\n};\nconst revisionFromValue = (value: unknown) => {\n if (!value || typeof value !== \"object\") return undefined;\n const revision = (\n value as {\n revision?: unknown;\n }\n ).revision;\n return typeof revision === \"string\" ? revision : undefined;\n};\nexport const fileRendererRefreshEnvelopeFromCommand = (\n body: CommandExecuteRequest,\n response: CommandExecutionResult,\n): FileRendererRefreshEnvelope | undefined => {\n const metadata = body.metadata;\n const origin = metadata?.fileRendererOrigin;\n if (!origin || typeof origin !== \"object\") return undefined;\n const candidate = origin as Partial<FileRendererRefreshOrigin>;\n if (\n typeof candidate.rendererId !== \"string\" ||\n typeof candidate.instanceId !== \"string\" ||\n typeof candidate.operationId !== \"string\"\n ) {\n return undefined;\n }\n const resourceKey = metadata?.fileRendererResourceKey;\n const revision = response.outcome.ok ? revisionFromValue(response.outcome.value) : undefined;\n return {\n origin: {\n rendererId: candidate.rendererId,\n instanceId: candidate.instanceId,\n operationId: candidate.operationId,\n },\n ...(typeof resourceKey === \"string\" ? { resourceKey } : {}),\n ...(revision ? { revision } : {}),\n };\n};\nconst registerFileRenderer = (input: RegisterWorkbenchExtensionFileRenderersInput, record: FileRendererRecord) =>\n input.workbench.views.registerView({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"file\",\n resourceKind: record.resourceKind,\n load: async (resource, signal, pageParams) => {\n const result = await executeFileCommand(\n input,\n record.id,\n record.loadHandlerId,\n resource,\n {},\n { fileStorageVersions: {} },\n signal,\n pageParams,\n );\n return attachFileStorageVersions((unwrapCommandValue(result) ?? {}) as FileRendererContent, result);\n },\n save: record.saveHandlerId\n ? async (resource, content, origin, loaded) => {\n const result = await executeFileCommand(\n input,\n record.id,\n record.saveHandlerId as string,\n resource,\n { content },\n {\n fileStorageVersions: fileStorageVersions(loaded),\n ...(origin ? { fileRendererOrigin: origin } : {}),\n ...(resourceKey(resource) ? { fileRendererResourceKey: resourceKey(resource) } : {}),\n },\n );\n const revision = revisionFromValue(unwrapCommandValue(result));\n return attachFileStorageVersions(revision ? { revision } : {}, result);\n }\n : undefined,\n },\n });\nexport const registerWorkbenchExtensionFileRenderers = (input: RegisterWorkbenchExtensionFileRenderersInput) => {\n const disposables: Disposable[] = [];\n for (const record of input.metadata.fileRenderers ?? []) {\n disposables.push(registerFileRenderer(input, record));\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { CollectionBadgeItem } from \"@pstdio/sdk/extensions\";\nimport type { KanbanRendererRow } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\n\nexport const collectionBadgeTarget = (\n row: KanbanRendererRow,\n itemsAttributeId: string,\n itemId: string,\n extensionId: string,\n projectId: string,\n) => {\n const items = row.attributes[itemsAttributeId] as CollectionBadgeItem[] | undefined;\n const item = items?.find((item) => item.id === itemId);\n return item?.target ? toWorkbenchNavigationTarget(item.target, { extensionId, projectId }) : undefined;\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport { createElement } from \"react\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type { ReactKanbanRendererContribution as KanbanRendererContribution } from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { Localizer } from \"./kanban-renderer-contribution-helpers\";\n\ntype BoardColumnConfig = ReturnType<NonNullable<KanbanRendererContribution[\"getBoardColumnConfig\"]>>;\n\nconst createBoardActionIcon = (icon: string | undefined) => {\n const BoardActionIcon = (props: { size?: number | string }) =>\n createElement(WorkbenchIcon, { name: icon ?? \"MoreHorizontal\", ...props });\n return BoardActionIcon;\n};\n\nexport const toWorkbenchBoardColumnConfig = (config: WireBoardColumnConfig | undefined, localize: Localizer) =>\n ({\n color: config?.color,\n canDragIn: config?.canDragIn,\n canDragOut: config?.canDragOut,\n canCreate: config?.canCreate,\n actions: config?.actions?.map((action) => ({\n id: action.id,\n label: localize(action.label, action.id),\n icon: createBoardActionIcon(action.icon),\n })),\n }) satisfies BoardColumnConfig;\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport type { KanbanRendererCreateField, KanbanRendererCreateFieldType, ResourceRef } from \"../../core\";\nimport type {\n ReactAttributeDescriptor as AttributeDescriptor,\n ReactKanbanRendererContribution as KanbanRendererContribution,\n} from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nexport type KanbanRendererRow = Awaited<ReturnType<KanbanRendererContribution[\"executeQuery\"]>>[number];\nexport type RowAction = NonNullable<WorkbenchExtensionKanbanRendererRecord[\"rowActions\"]>[number];\nexport type QueryResult = {\n attributes?: WorkbenchExtensionKanbanRendererRecord[\"attributes\"];\n boardColumnConfigs?: Record<string, WireBoardColumnConfig>;\n rows?: unknown[];\n};\nexport type Localizer = (value: unknown, fallback?: string) => string;\nexport interface MutableAttributeSource {\n source: KanbanRendererContribution[\"attributes\"];\n set(attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined): void;\n}\ntype UnknownDisplayReporter = (attributeId: string, kind: string) => void;\nexport const isQueryResult = (value: unknown): value is QueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst localizeAttributes = (\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n reportUnknownDisplay?: UnknownDisplayReporter,\n): AttributeDescriptor[] =>\n (attributes ?? []).map((attribute) => {\n const display = attribute.display;\n const knownDisplay =\n display?.kind === \"badge-list\" && typeof display.itemsAttributeId === \"string\"\n ? { kind: \"badge-list\" as const, itemsAttributeId: display.itemsAttributeId }\n : undefined;\n if (display && !knownDisplay) reportUnknownDisplay?.(attribute.id, display.kind);\n const resolveType = () => {\n const { type } = attribute;\n if (type.kind !== \"enum\" && type.kind !== \"enum-multi\") return type;\n return {\n ...type,\n options: Array.isArray(type.options)\n ? type.options.map((option) => ({ ...option, label: localize(option.label, option.value) }))\n : type.options,\n };\n };\n const base: AttributeDescriptor = {\n ...attribute,\n label: localize(attribute.label, attribute.id),\n type: resolveType(),\n display: knownDisplay,\n };\n return decorate(record, base);\n });\nexport const createMutableAttributeSource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n initial: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n reportUnknownDisplay?: UnknownDisplayReporter,\n): MutableAttributeSource => {\n let snapshot = localizeAttributes(record, initial, localize, decorate, reportUnknownDisplay);\n const listeners = new Set<() => void>();\n let signature = JSON.stringify(initial);\n return {\n source: {\n getSnapshot: () => snapshot,\n subscribe: (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n },\n set(attributes) {\n const nextSignature = JSON.stringify(attributes);\n if (nextSignature === signature) return;\n signature = nextSignature;\n snapshot = localizeAttributes(record, attributes, localize, decorate, reportUnknownDisplay);\n for (const listener of listeners) listener();\n },\n };\n};\nconst isExtensionResource = (resource: unknown): resource is ResourceRef =>\n Boolean(\n resource &&\n typeof resource === \"object\" &&\n typeof (\n resource as {\n type?: unknown;\n }\n ).type === \"string\" &&\n typeof (\n resource as {\n id?: unknown;\n }\n ).id === \"string\",\n );\nexport const defaultResolveRowResource = (_: WorkbenchExtensionKanbanRendererRecord, row: KanbanRendererRow) => {\n const { resource } = row;\n if (isExtensionResource(resource)) return resource;\n return undefined;\n};\nexport const defaultResolveRowActionResource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n) => {\n const fromRow = defaultResolveRowResource(record, row);\n if (fromRow) return fromRow;\n if (!record.resourceKind) return undefined;\n return {\n type: record.resourceKind,\n id: row.id,\n label: row.title,\n };\n};\nexport const toWorkbenchRow = (row: unknown, resolveResource: (row: KanbanRendererRow) => ResourceRef | undefined) => {\n const candidate = row as KanbanRendererRow;\n const resource = resolveResource(candidate);\n return resource === undefined ? candidate : ({ ...candidate, resource } as KanbanRendererRow);\n};\nexport const mergeParams = (...items: Array<Record<string, unknown> | undefined>) =>\n Object.assign({}, ...items.filter((item): item is Record<string, unknown> => Boolean(item)));\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\nconst hasCommandParameters = (params: Record<string, unknown> | undefined) => Object.keys(params ?? {}).length > 0;\nconst CREATE_FIELD_TYPES: ReadonlySet<string> = new Set<KanbanRendererCreateFieldType>([\n \"text\",\n \"longtext\",\n \"markdown\",\n \"number\",\n \"boolean\",\n \"select\",\n \"multi-select\",\n \"files\",\n]);\nconst toCreateField = (\n id: string,\n descriptor: NonNullable<NonNullable<WorkbenchExtensionKanbanRendererRecord[\"createRow\"]>[\"params\"]>[string],\n localize: Localizer,\n): KanbanRendererCreateField | undefined => {\n if (!CREATE_FIELD_TYPES.has(descriptor.type)) return undefined;\n const options =\n \"options\" in descriptor && Array.isArray(descriptor.options)\n ? (descriptor.options as Array<{\n value: string;\n label: string;\n icon?: string;\n }>)\n : [];\n const optional = descriptor as {\n placeholder?: unknown;\n multiple?: unknown;\n accept?: unknown;\n };\n return {\n id,\n label: localize(descriptor.label, id),\n description: descriptor.description === undefined ? undefined : localize(descriptor.description),\n placeholder: optional.placeholder === undefined ? undefined : localize(optional.placeholder),\n type: descriptor.type as KanbanRendererCreateFieldType,\n required: descriptor.required === true,\n defaultValue: descriptor.defaultValue,\n options:\n descriptor.type === \"select\" || descriptor.type === \"multi-select\"\n ? options.map((option) => ({\n value: option.value,\n label: localize(option.label, option.value),\n icon: option.icon,\n }))\n : undefined,\n multiple: descriptor.type === \"files\" ? optional.multiple !== false : undefined,\n accept: descriptor.type === \"files\" && typeof optional.accept === \"string\" ? optional.accept : undefined,\n };\n};\nexport const toCreateFields = (record: WorkbenchExtensionKanbanRendererRecord, localize: Localizer) =>\n Object.entries(record.createRow?.params ?? {}).flatMap(([id, descriptor]) => {\n const field = toCreateField(id, descriptor, localize);\n return field ? [field] : [];\n });\nconst createKanbanRendererSlot = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n) =>\n createExtensionSlot({\n id: record.id,\n kind: \"kanbanRenderer\",\n projectId: context.projectId,\n context: { kanbanRendererId: record.id },\n });\nexport const executeKanbanRendererCommand = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n signal?: AbortSignal,\n pageParams?: import(\"@pstdio/sdk/extensions\").PageParams,\n) => {\n const commandResource = resource ?? context.workbench.getPrimaryResource();\n return executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n ...(pageParams ? { pageParams } : {}),\n projectId: context.projectId,\n ...(commandResource ? { resource: commandResource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource: commandResource,\n signal,\n slot: createKanbanRendererSlot(context, record),\n metadata: { kanbanRendererId: record.id },\n });\n};\nconst kanbanRendererRowActionCommandId = (record: WorkbenchExtensionKanbanRendererRecord, action: RowAction) =>\n `workbench.extension.kanbanRenderer.${record.id}.rowAction.${action.id}`;\nexport const registerRowActionCommands = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n localize: Localizer,\n) =>\n (record.rowActions ?? []).map((action) => {\n const target = context.workbench.commands.getCommand(action.commandId)?.command;\n return context.workbench.commands.registerCommand(\n {\n id: kanbanRendererRowActionCommandId(record, action),\n label: localize(action.label, action.id),\n icon: action.icon,\n params: target?.params,\n },\n {\n execute: (args, executionContext) =>\n executeKanbanRendererCommand(\n context,\n record,\n action.commandId,\n mergeParams(asParams(args)),\n executionContext?.resource,\n ),\n },\n );\n });\nexport const runDefaultRowAction = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n action: RowAction,\n row: KanbanRendererRow,\n resource: ResourceRef | undefined,\n localize: Localizer,\n) => {\n const commandId = kanbanRendererRowActionCommandId(record, action);\n const command = context.workbench.commands.getCommand(commandId);\n const args = { rowId: row.id };\n const executionContext = resource ? { resource } : undefined;\n const label = localize(action.label, action.id);\n if (command && hasCommandParameters(command.command.params)) {\n context.workbench.commandPalette.requestParams({ record: command, label, args, context: executionContext });\n return Promise.resolve();\n }\n if (command)\n return context.workbench.commands.executeCommand(command.command.id, args, executionContext).then(() => undefined);\n return executeKanbanRendererCommand(context, record, action.commandId, args, resource).then(() => undefined);\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport { renderBadgeListDisplay } from \"@pstdio/ui/kanban-renderer\";\nimport { kanbanBuiltInViews, type WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type { Disposable, KanbanRendererCreateSubmission, KanbanRendererQueryState, ResourceRef } from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type { ReactAttributeDescriptor as AttributeDescriptor } from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { collectionBadgeTarget } from \"./collection-badge-navigation\";\nimport type { WorkbenchExtensionKanbanRendererAdapter } from \"./kanban-renderer-adapter\";\nimport { toWorkbenchBoardColumnConfig } from \"./kanban-renderer-board-config\";\nimport {\n createMutableAttributeSource,\n defaultResolveRowActionResource,\n defaultResolveRowResource,\n executeKanbanRendererCommand,\n isQueryResult,\n type KanbanRendererRow,\n type Localizer,\n mergeParams,\n registerRowActionCommands,\n runDefaultRowAction,\n toCreateFields,\n toWorkbenchRow,\n} from \"./kanban-renderer-contribution-helpers\";\nimport { mapViewToolbarActions } from \"./view-toolbar-actions\";\n\ntype ColumnConfigRecord = Record<string, WireBoardColumnConfig>;\n\nconst createRowActionIcon = (icon: string | undefined) =>\n icon ? createElement(WorkbenchIcon, { name: icon, size: 16 }) : undefined;\n\nconst toCreateRowConfig = (record: WorkbenchExtensionKanbanRendererRecord, localize: Localizer) => {\n if (!record.createRow) return undefined;\n return {\n title: localize(record.createRow.title, \"Create row\"),\n submitLabel: localize(record.createRow.submitLabel, \"Create\"),\n fields: toCreateFields(record, localize),\n labels: {\n cancel: localize(record.createRow.labels?.cancel, \"Cancel\"),\n properties: localize(record.createRow.labels?.properties, \"Properties\"),\n submitError: localize(record.createRow.labels?.submitError, \"Could not create resource.\"),\n removeFile: localize(record.createRow.labels?.removeFile, \"Remove file\"),\n submitWithoutOpening: localize(undefined, \"Create without opening\"),\n },\n };\n};\n\nconst toRowClick = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n resolveRowResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\n toActivatedRow: (row: KanbanRendererRow) => KanbanRendererRow,\n) => {\n if (record.rowActivationHandlerId) {\n return async (row: KanbanRendererRow) => {\n const resource = resolveRowResource(record, row);\n await executeKanbanRendererCommand(\n context,\n record,\n record.rowActivationHandlerId!,\n { row: toActivatedRow(row) },\n resource,\n );\n };\n }\n if (!adapter.onRowClick) return undefined;\n return (row: KanbanRendererRow) => adapter.onRowClick?.({ record, row, resource: resolveRowResource(record, row) });\n};\n\nconst toCreateRowHandler = (\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n runMutation: (\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n ) => Promise<unknown>,\n activateCreatedRow: ((row: KanbanRendererRow) => Promise<void> | void) | undefined,\n) => {\n const contribution = record.createRow;\n if (!contribution) return undefined;\n return async (submission: KanbanRendererCreateSubmission) => {\n const params = mergeParams(\n submission.values,\n contribution.columnParam ? { [contribution.columnParam]: submission.columnId } : undefined,\n contribution.attributesParam ? { [contribution.attributesParam]: submission.attributeValues } : undefined,\n );\n const created = await runMutation(record, contribution.commandId, params);\n await adapter.onAfterCreate?.({ record, created, submission });\n if (submission.openCreatedRow === false || !activateCreatedRow || typeof created !== \"object\" || created === null)\n return;\n const row = created as Partial<KanbanRendererRow>;\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") return;\n await activateCreatedRow({ ...row, id: row.id, title: row.title, attributes: row.attributes ?? {} });\n };\n};\n\nconst toRowContextMenuActions = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n localize: Localizer,\n resolveRowActionResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\n) => {\n const actions = record.rowActions;\n if (!actions?.length) return undefined;\n return (row: KanbanRendererRow) =>\n actions.map((action) => {\n const resource = resolveRowActionResource(record, row);\n const runDefault = () => runDefaultRowAction(context, record, action, row, resource, localize);\n return {\n key: action.id,\n label: localize(action.label, action.id),\n commandId: action.commandId,\n icon: createRowActionIcon(action.icon),\n onClick: () =>\n adapter.executeRowAction\n ? adapter.executeRowAction({ record, action, row, resource, runDefault })\n : runDefault(),\n };\n });\n};\n\nexport const registerWorkbenchExtensionKanbanRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionKanbanRendererRecord[],\n adapter: WorkbenchExtensionKanbanRendererAdapter = {},\n) => {\n const disposables: Disposable[] = [];\n const localize: Localizer =\n adapter.resolveLabel ?? ((value, fallback) => text(value as Parameters<typeof text>[0], fallback));\n const decorate = (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => {\n const withBuiltInDisplay =\n attribute.display?.kind === \"badge-list\"\n ? {\n ...attribute,\n render: (value: unknown, row: KanbanRendererRow) =>\n renderBadgeListDisplay(attribute, value, row, undefined, (id) => {\n if (attribute.display?.kind !== \"badge-list\") return;\n const target = collectionBadgeTarget(\n row,\n attribute.display.itemsAttributeId,\n id,\n record.extensionId,\n context.projectId,\n );\n return target\n ? () => {\n void context.workbench.navigation.openTarget(target);\n }\n : undefined;\n }),\n }\n : attribute;\n return adapter.decorateAttribute?.(record, withBuiltInDisplay) ?? withBuiltInDisplay;\n };\n const resolveRowResource = adapter.resolveRowResource ?? defaultResolveRowResource;\n const resolveRowActionResource = adapter.resolveRowActionResource ?? defaultResolveRowActionResource;\n const afterMutation = adapter.onAfterMutation ?? (() => {});\n\n const runMutation = (\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n ) =>\n executeKanbanRendererCommand(context, record, commandId, params).then((result) => {\n afterMutation(record);\n return result;\n });\n\n for (const record of records) {\n const reportUnknownDisplay = (attributeId: string, kind: string) =>\n context.workbench.notifications.show({\n id: `workbench.extension.${record.extensionId}.kanban.${record.id}.display.${attributeId}`,\n level: \"error\",\n title: \"Extension display is not available\",\n message: `Attribute \"${attributeId}\" in renderer \"${record.id}\" uses unknown display kind \"${kind}\".`,\n });\n const attributes = createMutableAttributeSource(\n record,\n record.attributes,\n localize,\n decorate,\n reportUnknownDisplay,\n );\n let wireAttributes = record.attributes;\n const builtIns = kanbanBuiltInViews(record);\n const originalRows = new WeakMap<KanbanRendererRow, KanbanRendererRow>();\n let columnConfigs: ColumnConfigRecord | undefined;\n let latestQueryId = 0;\n let rowCache = new Map<string, { signature: string; row: KanbanRendererRow }>();\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, row);\n const toActivatedRow = (row: KanbanRendererRow) => originalRows.get(row) ?? row;\n const onRowActivate = toRowClick(context, record, adapter, resolveRowResource, toActivatedRow);\n\n disposables.push(...registerRowActionCommands(context, record, localize));\n disposables.push(\n context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"kanban\",\n resourceKind: record.resourceKind,\n toolbarActions: mapViewToolbarActions(record),\n listRowActions: () =>\n (record.rowActions ?? []).map((action) => ({\n commandId: action.commandId,\n label: localize(action.label, action.id),\n })),\n storageScope: context.projectId,\n attributes: attributes.source,\n defaultSettings: builtIns.settings,\n defaultFilter: record.defaultFilter,\n defaultSorts: record.defaultSorts,\n viewsProvider: adapter.createViewsProvider?.(record),\n defaultViews: builtIns.views.map((view) => ({ ...view, title: localize(view.title, view.id) })),\n defaultActiveViewId: record.defaultActiveViewId,\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n hideToolbar: record.hideToolbar,\n createRow: toCreateRowConfig(record, localize),\n getBoardColumnConfig: (groupKey) => toWorkbenchBoardColumnConfig(columnConfigs?.[groupKey], localize),\n onRowActivate,\n executeQuery: async (state: KanbanRendererQueryState, signal) => {\n latestQueryId += 1;\n const queryId = latestQueryId;\n const value = await executeKanbanRendererCommand(\n context,\n record,\n record.queryHandlerId,\n {\n settings: state.settings,\n filter: state.filter,\n sorts: state.sorts,\n },\n undefined,\n signal,\n state.pageParams,\n );\n const mapRows = (rows: unknown[]) => {\n const nextCache = new Map<string, { signature: string; row: KanbanRendererRow }>();\n const result = rows.map((row) => {\n const candidate = row as KanbanRendererRow;\n const signature = JSON.stringify(row);\n const cached = rowCache.get(candidate.id);\n const mapped = cached?.signature === signature ? cached.row : toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, candidate);\n nextCache.set(mapped.id, { signature, row: mapped });\n return mapped;\n });\n if (queryId === latestQueryId) rowCache = nextCache;\n return result;\n };\n if (queryId !== latestQueryId) {\n if (Array.isArray(value)) return mapRows(value);\n return isQueryResult(value) ? mapRows(value.rows ?? []) : [];\n }\n\n if (Array.isArray(value)) return mapRows(value);\n if (!isQueryResult(value)) return [];\n const nextAttributes = value.attributes ?? wireAttributes;\n wireAttributes = nextAttributes;\n attributes.set(nextAttributes);\n columnConfigs = value.boardColumnConfigs;\n return mapRows(value.rows ?? []);\n },\n onAttributeChange: record.attributeChangeHandlerId\n ? (rowId, attributeId, value) =>\n runMutation(record, record.attributeChangeHandlerId!, {\n rowId,\n attributeId,\n value,\n }).then(() => undefined)\n : undefined,\n onMove: record.moveHandlerId\n ? (move) => runMutation(record, record.moveHandlerId!, { ...move }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(\n record,\n adapter,\n runMutation,\n record.rowActivationHandlerId ? onRowActivate : undefined,\n ),\n onColumnAction: record.columnActionHandlerId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionHandlerId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(\n context,\n record,\n adapter,\n localize,\n resolveRowActionResource,\n ),\n },\n }),\n );\n }\n\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { TreeContext } from \"../../core\";\nimport { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nimport type {\n ExtensionTreeNode,\n ExtensionTreeRendererRecord,\n ExtensionTreeResource,\n} from \"./tree-renderer-contribution-types\";\nimport type { RegisterWorkbenchExtensionTreeRenderersInput } from \"./tree-renderer-contributions\";\n\nconst slotContext = (input: {\n modeId?: string;\n projectId: string;\n resource?: ExtensionTreeResource;\n treeId: string;\n}) => ({\n id: input.treeId,\n kind: \"renderer\" as const,\n context: {\n projectId: input.projectId,\n treeId: input.treeId,\n ...(input.modeId ? { modeId: input.modeId } : {}),\n ...(input.resource ? { resourceType: input.resource.type, resourceId: input.resource.id } : {}),\n },\n});\nexport const createQueryParams = (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n ctx: TreeContext,\n node?: ExtensionTreeNode,\n) => {\n const resource = ctx.resource;\n const modeId = input.workbench.modes.getActiveModeId();\n return {\n renderer: {\n rendererId: record.id,\n ...(ctx.pageParams ? { pageParams: ctx.pageParams } : {}),\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n state: ctx.state,\n ...(ctx.filter ? { filter: ctx.filter } : {}),\n ...(node ? { node } : {}),\n };\n};\nexport const executeCallback = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n signal?: AbortSignal,\n) => {\n const renderer = params.renderer as\n | {\n modeId?: string;\n resource?: ExtensionTreeResource;\n }\n | undefined;\n const resource = renderer?.resource;\n return executeWorkbenchExtensionCommand(input, commandId, {\n params,\n signal,\n resource,\n slot: slotContext({\n modeId: renderer?.modeId,\n projectId: input.projectId,\n resource,\n treeId: record.id,\n }),\n });\n};\nexport const executeTreeActionCommand = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown> | undefined,\n resource: ExtensionTreeResource | undefined,\n) => {\n const modeId = input.workbench.modes.getActiveModeId();\n const rendererParams = {\n ...(params ?? {}),\n renderer: {\n rendererId: record.id,\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n };\n return executeWorkbenchExtensionCommand(input, commandId, {\n params: rendererParams,\n resource,\n slot: slotContext({ modeId, projectId: input.projectId, resource, treeId: record.id }),\n metadata: { treeId: record.id },\n });\n};\n","import type { TreeContext, TreeNode } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport type { ExtensionTreeRendererRecord, ExtensionTreeViewRecord } from \"./tree-renderer-contribution-types\";\n\nexport interface HostTreeDefaultNodesInput {\n ctx: TreeContext;\n record: ExtensionTreeRendererRecord;\n panel: ExtensionTreeViewRecord;\n}\n\nexport type HostTreeDefaultNodesResolver = (input: HostTreeDefaultNodesInput) => Promise<TreeNode[]> | TreeNode[];\n\ninterface ResolveHostTreeDefaultInput {\n ctx: TreeContext;\n record: ExtensionTreeRendererRecord;\n treeViews: ExtensionTreeViewRecord[];\n}\n\ninterface ResolveHostTreeHeaderInput extends ResolveHostTreeDefaultInput {\n getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;\n}\n\ninterface ResolveHostTreeFooterInput extends ResolveHostTreeDefaultInput {\n getHostTreeFooterNodes?: HostTreeDefaultNodesResolver;\n}\n\nexport const treeViewsFor = (\n metadata: WorkbenchExtensionMetadata,\n record: ExtensionTreeRendererRecord,\n): ExtensionTreeViewRecord[] =>\n metadata.panels\n .flatMap((panel) => [panel, ...(panel.panelMenus ?? [])])\n .filter((panel) => panel.renderer?.kind === \"tree\" && panel.renderer.id === record.id);\n\nconst resolveTreeView = (panels: ExtensionTreeViewRecord[], ctx: TreeContext) => {\n if (ctx.viewId) return panels.find((panel) => panel.id === ctx.viewId);\n return panels.length === 1 ? panels[0] : undefined;\n};\n\nexport const resolveHostTreeHeaderNodes = async (input: ResolveHostTreeHeaderInput) => {\n const { ctx, getHostTreeHeaderNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeHeader\" in panel) || panel.hostTreeHeader !== \"default\") return [];\n return (await getHostTreeHeaderNodes?.({ ctx, record, panel })) ?? [];\n};\n\nexport const resolveHostTreeFooterNodes = async (input: ResolveHostTreeFooterInput) => {\n const { ctx, getHostTreeFooterNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeFooter\" in panel) || panel.hostTreeFooter !== \"default\") return [];\n return (await getHostTreeFooterNodes?.({ ctx, record, panel })) ?? [];\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport { commandRefId } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n NavigationTarget,\n ResourceRef,\n TreeAction,\n TreeContext,\n TreeNode,\n TreeViewSection,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\n\nimport { localizeParamSchema } from \"./param-schema-localization\";\nimport { createQueryParams, executeCallback, executeTreeActionCommand } from \"./tree-renderer-callbacks\";\nimport type {\n ExtensionTreeAction,\n ExtensionTreeNode,\n ExtensionTreeRendererRecord,\n ExtensionTreeResource,\n ExtensionTreeSection,\n ExtensionTreeTarget,\n TargetCommandArgs,\n} from \"./tree-renderer-contribution-types\";\nimport {\n type HostTreeDefaultNodesResolver,\n resolveHostTreeFooterNodes,\n resolveHostTreeHeaderNodes,\n treeViewsFor,\n} from \"./tree-renderer-host-defaults\";\nexport interface RegisterWorkbenchExtensionTreeRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n getHostTreeFooterNodes?: HostTreeDefaultNodesResolver;\n getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n /**\n * Host canonicalization for node resources. A host that gives extension\n * resources its own URIs (layout scopes, history, and hierarchy key on the\n * URI) must convert tree node resources the same way, or the same resource\n * gets a second identity when opened from a tree.\n */\n resolveNodeResource?: (resource: ExtensionTreeResource) => ResourceRef;\n workbench: WorkbenchModuleContext;\n}\nconst toActionParams = (params: unknown, fallback: Record<string, unknown> | undefined) => {\n if (params && typeof params === \"object\" && !Array.isArray(params)) return params as Record<string, unknown>;\n return fallback;\n};\nconst toRecordParams = (params: object | undefined) =>\n params && !Array.isArray(params) ? (params as Record<string, unknown>) : undefined;\nconst createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\n const resolveResource: (resource: ExtensionTreeResource) => ResourceRef = (resource) => {\n const resolved = input.resolveNodeResource?.(resource);\n return resolved ?? resource;\n };\n const mapEmptyState = (section: ExtensionTreeSection): TreeViewSection[\"emptyState\"] => {\n if (!section.emptyState) return undefined;\n return {\n title: text(section.emptyState.title),\n description: text(section.emptyState.description),\n icon: section.emptyState.icon,\n };\n };\n const mapTarget = (\n target: ExtensionTreeTarget | undefined,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): NavigationTarget | undefined => {\n if (!target) return undefined;\n const commandTargetOf = (\n commandTarget: Extract<\n ExtensionTreeTarget,\n {\n kind: \"command\";\n }\n >,\n ) => ({\n kind: \"command\" as const,\n commandId: runnerCommandId,\n args: {\n commandId: `${commandTarget.target.command.extensionId ?? record.extensionId}.command.${commandTarget.target.command.id}`,\n ...(node ? { nodeId: node.id } : {}),\n params: commandTarget.target.params,\n resource: node?.resource ?? ctx.resource,\n treeId: record.id,\n } satisfies TargetCommandArgs,\n });\n return toWorkbenchNavigationTarget(target, {\n commandTargetOf,\n extensionId: record.extensionId,\n projectId: input.projectId,\n });\n };\n const mapAction = (\n action: ExtensionTreeAction,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): TreeAction => {\n const commandId = action.command\n ? commandRefId({ ...action.command, extensionId: action.command.extensionId ?? record.extensionId })\n : undefined;\n return {\n id: action.id,\n resourceMutation: input.metadata.commands.find((command) => command.id === commandId)?.resourceMutation,\n label: text(action.label),\n icon: action.icon,\n args: toRecordParams(action.params),\n params: localizeParamSchema(action.input, text, record.extensionId),\n submitLabel: action.submitLabel,\n when: action.when,\n disabled: action.disabled,\n // Actions mutate tree data (create/delete/...), so refresh afterwards. Plain\n // node-target navigation runs through the runner command and must not refetch.\n run: commandId\n ? async (params) => {\n const actionParams = toActionParams(params, toRecordParams(action.params));\n if (action.command?.extensionId === \"pstdio\") {\n await input.workbench.commands.executeCommand(commandId, actionParams, {\n resource: node?.resource ?? ctx.resource,\n });\n return;\n }\n await executeTreeActionCommand(input, record, commandId, actionParams, node?.resource ?? ctx.resource);\n ctx.refresh();\n }\n : undefined,\n };\n };\n const mapNode = (node: ExtensionTreeNode, ctx: TreeContext): TreeNode => {\n const mapped: TreeNode = {\n id: node.id,\n selected: node.selected,\n label: text(node.label),\n icon: node.icon,\n iconColor: node.iconColor,\n badge: node.badge,\n iconTooltip: node.iconTooltip,\n tooltip: node.tooltip,\n resource: node.resource ? resolveResource(node.resource) : undefined,\n target: mapTarget(node.target, node, ctx),\n rowVariant: node.rowVariant,\n actions: node.actions?.map((action) => mapAction(action, node, ctx)),\n contextMenuActions: node.contextMenuActions?.map((action) => mapAction(action, node, ctx)),\n collapsible: node.collapsible,\n disabled: node.disabled,\n children: node.children?.map((child) => mapNode(child, ctx)),\n description: node.description,\n contextValue: node.contextValue,\n hiddenByDefault: node.hiddenByDefault,\n canHide: node.canHide,\n canDrag: node.canDrag,\n canDrop: node.canDrop,\n };\n originalNodes.set(mapped, node);\n return mapped;\n };\n const mapSections = (sections: ExtensionTreeSection[], ctx: TreeContext): TreeViewSection[] =>\n sections.map((section) => ({\n id: section.id,\n label: text(section.label),\n actions: section.actions?.map((action) => mapAction(action, undefined, ctx)),\n collapsible: section.collapsible,\n emptyState: mapEmptyState(section),\n nodes: section.nodes.map((node) => mapNode(node, ctx)),\n hiddenByDefault: section.hiddenByDefault,\n canHide: section.canHide,\n }));\n const mapNodes = (nodes: ExtensionTreeNode[], ctx: TreeContext): TreeNode[] =>\n nodes.map((node) => mapNode(node, ctx));\n return { mapNodes, mapSections, originalNodes, runnerCommandId };\n};\nconst isTreeSectionArray = (value: unknown): value is ExtensionTreeSection[] =>\n Array.isArray(value) && value.every((section) => section && typeof section === \"object\" && \"nodes\" in section);\nconst isTreeNodeArray = (value: unknown): value is ExtensionTreeNode[] =>\n Array.isArray(value) && value.every((node) => node && typeof node === \"object\" && \"id\" in node);\nconst hostNodeSection = (id: string, nodes: TreeNode[]): TreeViewSection[] =>\n nodes.length > 0 ? [{ id, nodes, canReorder: false }] : [];\nconst registerTree = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const mapper = createTreeMapper(input, record);\n const treeViews = treeViewsFor(input.metadata, record);\n const commandDisposable = input.workbench.commands.registerCommand(\n { id: mapper.runnerCommandId, label: `${text(record.title, record.id)} tree command` },\n {\n execute: async (rawArgs) => {\n const args = rawArgs as TargetCommandArgs;\n const result = await executeTreeActionCommand(input, record, args.commandId, args.params, args.resource);\n for (const view of input.workbench.views.listViews()) {\n if (view.body.kind === \"file\") input.workbench.views.refreshView(view.id);\n }\n return result;\n },\n },\n );\n const treeDisposable = input.workbench.views.registerView({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"tree\",\n searchable: record.searchable,\n searchPlaceholder: text(record.searchPlaceholder, \"Search files\"),\n defaultExpandedNodeIds: record.defaultExpandedNodeIds,\n defaultExpandedSectionIds: record.defaultExpandedSectionIds,\n getHeader: async (ctx) => {\n const hostHeader = await resolveHostTreeHeaderNodes({\n ctx,\n getHostTreeHeaderNodes: input.getHostTreeHeaderNodes,\n record,\n treeViews,\n });\n if (!record.headerHandlerId) return hostNodeSection(`${record.id}:host-header`, hostHeader);\n const result = await executeCallback(\n input,\n record,\n record.headerHandlerId,\n createQueryParams(input, record, ctx),\n ctx.signal,\n );\n const extensionHeader = isTreeSectionArray(result) ? mapper.mapSections(result, ctx) : [];\n return [...hostNodeSection(`${record.id}:host-header`, hostHeader), ...extensionHeader];\n },\n getBody: async (ctx) => {\n const result = await executeCallback(\n input,\n record,\n record.bodyHandlerId,\n createQueryParams(input, record, ctx),\n ctx.signal,\n );\n if (!isTreeSectionArray(result)) return [];\n return mapper.mapSections(result, ctx);\n },\n getFooter: async (ctx) => {\n const hostFooter = await resolveHostTreeFooterNodes({\n ctx,\n getHostTreeFooterNodes: input.getHostTreeFooterNodes,\n record,\n treeViews,\n });\n if (!record.footerHandlerId) return hostNodeSection(`${record.id}:host-footer`, hostFooter);\n const result = await executeCallback(\n input,\n record,\n record.footerHandlerId,\n createQueryParams(input, record, ctx),\n ctx.signal,\n );\n const extensionFooter = isTreeSectionArray(result) ? mapper.mapSections(result, ctx) : [];\n return [...extensionFooter, ...hostNodeSection(`${record.id}:host-footer`, hostFooter)];\n },\n moveNode: record.moveHandlerId\n ? async (source, target, ctx) => {\n const originalSource = mapper.originalNodes.get(source);\n const originalTarget = target ? mapper.originalNodes.get(target) : undefined;\n if (!originalSource?.canDrag || (target && !originalTarget?.canDrop)) return;\n await executeCallback(input, record, record.moveHandlerId!, {\n ...createQueryParams(input, record, ctx),\n source: originalSource,\n target: originalTarget,\n position: ctx.position ?? \"inside\",\n });\n ctx.refresh();\n }\n : undefined,\n getChildren: async (node, ctx) => {\n if (!record.childrenHandlerId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node);\n if (!originalNode) return node.children ?? [];\n const result = await executeCallback(\n input,\n record,\n record.childrenHandlerId,\n createQueryParams(input, record, ctx, originalNode),\n ctx.signal,\n );\n return isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n },\n },\n });\n return {\n dispose() {\n treeDisposable.dispose();\n commandDisposable.dispose();\n },\n };\n};\nexport const registerWorkbenchExtensionTreeRenderers = (input: RegisterWorkbenchExtensionTreeRenderersInput) => {\n const disposables: Disposable[] = [];\n for (const record of input.metadata.treeRenderers ?? []) {\n disposables.push(registerTree(input, record));\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n NavigationTreeOwner,\n NavigationTreeSlot,\n TreeNode,\n TreeViewSection,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { navigationSlotRootSectionId } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\n\ntype NavigationItem = WorkbenchExtensionMetadata[\"navigationItems\"][number];\ntype NavigationTree = WorkbenchExtensionMetadata[\"navigationTrees\"][number];\n\nexport interface RegisterWorkbenchExtensionNavigationItemsInput {\n createWhenExpression?: (when: NavigationItem[\"when\"]) => string | undefined;\n metadata: Pick<WorkbenchExtensionMetadata, \"navigationItems\" | \"navigationTrees\">;\n workbench: WorkbenchModuleContext;\n}\n\nconst toOwner = (ref: NavigationItem[\"owner\"] | NavigationTree[\"owner\"]): NavigationTreeOwner => ({\n kind: ref.kind,\n id: contributionRefId(ref),\n extensionId: ref.extensionId,\n});\n\nconst isVisible = (\n workbench: WorkbenchModuleContext,\n item: NavigationItem,\n createWhenExpression: RegisterWorkbenchExtensionNavigationItemsInput[\"createWhenExpression\"],\n) => {\n const expression = createWhenExpression?.(item.when);\n if (!expression) return true;\n return workbench.context.matches(expression);\n};\n\nconst toNode = (item: NavigationItem): TreeNode => ({\n id: item.id,\n label: text(item.label, item.id),\n icon: item.icon,\n canHide: true,\n canReorder: true,\n target: toWorkbenchNavigationTarget(item.action as ExtensionNavigationTarget, { extensionId: item.extensionId }),\n});\n\nconst toSections = (\n workbench: WorkbenchModuleContext,\n items: NavigationItem[],\n createWhenExpression: RegisterWorkbenchExtensionNavigationItemsInput[\"createWhenExpression\"],\n) => {\n const sections = new Map<string, TreeViewSection>();\n for (const item of items) {\n if (!isVisible(workbench, item, createWhenExpression)) continue;\n const label = item.group || undefined;\n const id = label ? `${item.extensionId}:${label}` : navigationSlotRootSectionId(item.slot as NavigationTreeSlot);\n const section = sections.get(id) ?? {\n id,\n label,\n collapsible: Boolean(label),\n canHide: true,\n canReorder: true,\n nodes: [],\n };\n section.nodes.push(toNode(item));\n sections.set(id, section);\n }\n return [...sections.values()];\n};\n\nconst groupItems = (items: NavigationItem[]) => {\n const groups = new Map<string, NavigationItem[]>();\n for (const item of items) {\n const owner = toOwner(item.owner);\n const key = `${item.extensionId}:${owner.kind}:${owner.id}:${item.slot}`;\n groups.set(key, [...(groups.get(key) ?? []), item]);\n }\n return [...groups.values()];\n};\n\nconst defaultExpandedGroupIds = (items: NavigationItem[]) => [\n ...new Set(items.flatMap((item) => (item.group ? [`${item.extensionId}:${item.group}`] : []))),\n];\n\nconst registerItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n groupItems(input.metadata.navigationItems).map((items) => {\n const first = items[0]!;\n const resourceDependent = items.some((item) => item.when?.resourceType?.length || item.when?.metadata);\n return input.workbench.navigationTrees.registerContribution({\n id: `${first.extensionId}.navigation-items.${first.owner.kind}.${contributionRefId(first.owner)}.${first.slot}`,\n owner: toOwner(first.owner),\n sourceExtensionId: first.extensionId,\n declarationIndex: input.metadata.navigationItems.indexOf(first),\n slot: first.slot,\n defaultExpandedSectionIds: defaultExpandedGroupIds(items),\n ...(!resourceDependent ? { resolveResource: () => undefined } : {}),\n getSections: () => toSections(input.workbench, items, input.createWhenExpression),\n listActions: () =>\n items.map((item) => ({\n label: text(item.label, item.id),\n category: item.group || undefined,\n action: toWorkbenchNavigationTarget(item.action as ExtensionNavigationTarget, {\n extensionId: item.extensionId,\n }),\n })),\n });\n });\n\nconst registerTrees = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n input.metadata.navigationTrees.map((tree, declarationIndex) => {\n const viewId = contributionRefId(tree.view);\n return input.workbench.navigationTrees.registerContribution({\n id: tree.id,\n idScope: tree.id,\n owner: toOwner(tree.owner),\n sourceExtensionId: tree.extensionId,\n declarationIndex: input.metadata.navigationItems.length + declarationIndex,\n slot: tree.slot as NavigationTreeSlot,\n viewId,\n ...(tree.resourceScope === \"project\" ? { resolveResource: () => undefined } : {}),\n });\n });\n\nexport const registerWorkbenchExtensionNavigationItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n [...registerItems(input), ...registerTrees(input)] satisfies Disposable[];\n","import { relatedResourceOpeningSchema } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { unwrapCommandValue } from \"./command-response\";\nimport type { InternalRegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nexport const registerResourceKinds = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.resourceKinds.map((kind) =>\n input.workbench.resources.registerKind({\n kind: kind.id,\n extensionId: kind.extensionId,\n label: text(kind.label, kind.id),\n icon: kind.icon ?? \"FileText\",\n relatedOpenings: kind.relatedOpeningsCommand\n ? async (resource, signal) => {\n const response = await input.executeCommand(\n kind.relatedOpeningsCommand!,\n { projectId: input.projectId, resource, source: \"dashboard\" },\n signal,\n );\n signal.throwIfAborted();\n // Selection commands return data. Their navigation requests cannot steal source focus.\n const openings = relatedResourceOpeningSchema.array().parse(unwrapCommandValue(response));\n return openings.map((opening) => ({\n ...opening,\n resource: {\n ...opening.resource,\n projectId: opening.resource.projectId ?? input.projectId,\n extensionId: opening.resource.extensionId ?? kind.extensionId,\n },\n }));\n }\n : undefined,\n }),\n );\n","import type { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { commandRefId } from \"@pstdio/sdk/extensions\";\nimport type { ExtensionKeybindingRecord } from \"pstdio-api-contracts\";\nimport type { WorkbenchModuleContext } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\n\ntype KeybindingPlatform = keyof NonNullable<ExtensionKeybindingRecord[\"platformOverrides\"]>;\n\nconst currentPlatform = (): KeybindingPlatform | undefined => {\n if (typeof navigator === \"undefined\") return undefined;\n const platform = `${navigator.platform} ${navigator.userAgent}`.toLowerCase();\n if (platform.includes(\"mac\")) return \"mac\";\n if (platform.includes(\"win\")) return \"win\";\n if (platform.includes(\"linux\")) return \"linux\";\n return undefined;\n};\n\nexport const resolveExtensionKeybindingChord = (binding: ExtensionKeybindingRecord, platform = currentPlatform()) =>\n (platform ? binding.platformOverrides?.[platform] : undefined) ?? binding.key;\n\nexport const registerWorkbenchExtensionKeybindings = (input: {\n bindings: ExtensionKeybindingRecord[];\n createWhenExpression?: (when: ExtensionKeybindingRecord[\"when\"]) => string | undefined;\n workbench: WorkbenchModuleContext;\n}) =>\n input.bindings.map((binding) =>\n input.workbench.keybindings.registerKeybinding({\n sourceExtensionId: binding.extensionId,\n action: toWorkbenchNavigationTarget(binding.action as ExtensionNavigationTarget, {\n commandIdOf: (command) =>\n command.extensionId ? commandRefId({ extensionId: command.extensionId, id: command.id }) : undefined,\n }),\n keybinding: resolveExtensionKeybindingChord(binding),\n when: input.createWhenExpression?.(binding.when),\n }),\n );\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { type ContributionKind, contributionRefId } from \"@pstdio/sdk/extensions\";\n\nexport type MetadataRef = { extensionId: string; kind: ContributionKind; id: string };\n\nexport const toWorkbenchWhenExpression = (\n when:\n | WorkbenchExtensionMetadata[\"navigationItems\"][number][\"when\"]\n | WorkbenchExtensionMetadata[\"statusBarItems\"][number][\"when\"],\n) => {\n if (!when) return undefined;\n const ids = (value: MetadataRef | MetadataRef[] | undefined) => {\n if (!value) return undefined;\n return Array.isArray(value) ? value.map((ref) => contributionRefId(ref)) : contributionRefId(value);\n };\n return {\n mode: ids(when.mode as MetadataRef | MetadataRef[] | undefined),\n source: when.source,\n viewId: ids(when.view as MetadataRef | MetadataRef[] | undefined),\n resourceType: when.resourceType?.map((ref) => ref.id),\n metadata: when.metadata,\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchPageMain, WorkbenchPageSlot } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\n\nimport type { WorkbenchExtensionTabMetadata } from \"./workbench-extension-tab-presentation\";\n\ntype MetadataPage = WorkbenchExtensionMetadata[\"pages\"][number];\ninterface PagePresentationInput {\n extensionId: string;\n placementId: string;\n createTab?(metadata: WorkbenchExtensionTabMetadata): WorkbenchPageSlot[\"tab\"];\n}\nconst pageSlot = (slot: MetadataPage[\"slots\"][number], input: PagePresentationInput): WorkbenchPageSlot => ({\n ...slot,\n tab:\n slot.tab && input.createTab\n ? input.createTab({ ...slot.tab, extensionId: input.extensionId, placementId: input.placementId })\n : undefined,\n});\nconst pageMain = (main: MetadataPage[\"main\"], input: PagePresentationInput): WorkbenchPageMain => {\n if (main.kind === \"panels\") return main;\n return {\n ...main,\n tab:\n main.tab && input.createTab\n ? input.createTab({ ...main.tab, extensionId: input.extensionId, placementId: input.placementId })\n : undefined,\n };\n};\nexport const toInternalWorkbenchPages = (\n metadata: WorkbenchExtensionMetadata,\n createTab?: PagePresentationInput[\"createTab\"],\n): InternalWorkbenchExtensionMetadata[\"pages\"] =>\n metadata.pages.map((page) => ({\n id: page.id,\n ref: { extensionId: page.extensionId, kind: \"page\", id: page.localId },\n title: page.title,\n path: page.path,\n document: page.document,\n params: page.params,\n modeId: contributionRefId(page.mode),\n resource: page.resource,\n main: pageMain(page.main, { extensionId: page.extensionId, placementId: `${page.id}.$main`, createTab }),\n slots: page.slots.map((slot) =>\n pageSlot(slot, { extensionId: page.extensionId, placementId: `${page.id}.${slot.id}`, createTab }),\n ),\n ...(page.icon ? { icon: page.icon } : {}),\n ...(page.parent ? { parentId: contributionRefId(page.parent) } : {}),\n }));\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { commandRefId, contributionRefId } from \"@pstdio/sdk/extensions\";\nimport type { ParamObjectSchema } from \"pstdio-api-contracts\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\nimport { toWorkbenchWhenExpression } from \"./workbench-extension-metadata-ref\";\nimport { toInternalWorkbenchPages } from \"./workbench-extension-page-metadata\";\nimport type { WorkbenchExtensionTabMetadata } from \"./workbench-extension-tab-presentation\";\n\ntype MetadataView = WorkbenchExtensionMetadata[\"views\"][number];\nconst resourceKindForView = (metadata: WorkbenchExtensionMetadata, viewId: string) => {\n const bindings = metadata.pages.flatMap((page) => [\n ...(page.main.kind === \"view\" && page.resource ? [{ ...page.resource, view: page.main.view }] : []),\n ...page.slots.flatMap((slot) => (slot.item.kind === \"binding\" ? [slot.item.binding] : [])),\n ]);\n bindings.push(\n ...metadata.placements.flatMap((placement) => (placement.item.kind === \"binding\" ? [placement.item.binding] : [])),\n );\n return bindings.find((binding) => contributionRefId(binding.view) === viewId)?.kinds[0]?.id;\n};\nconst viewBody = (view: MetadataView) =>\n view.body.kind === \"webview\" ? { webview: view.body.webview } : { renderer: { kind: view.body.kind, id: view.id } };\nconst panelMenus = (metadata: WorkbenchExtensionMetadata, owner: MetadataView) =>\n metadata.viewMenus.flatMap((menu) => {\n if (contributionRefId(menu.owner) !== owner.id) return [];\n const view = metadata.views.find((candidate) => candidate.id === contributionRefId(menu.view));\n if (!view) return [];\n return [\n {\n id: menu.id,\n extensionId: menu.extensionId,\n ownerPanelId: owner.id,\n viewId: view.id,\n title: view.title,\n side: menu.side,\n group: menu.group,\n placement: menu.placement,\n hostTreeHeader: menu.hostTreeHeader,\n hostTreeFooter: menu.hostTreeFooter,\n ...viewBody(view),\n },\n ];\n });\nconst panels = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"panels\"] =>\n metadata.views.map((view) => {\n const menus = panelMenus(metadata, view);\n return {\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n panelMenus: menus.length > 0 ? menus : undefined,\n ...viewBody(view),\n };\n });\nconst commandActions = <\n T extends {\n command: {\n extensionId: string;\n id: string;\n };\n },\n>(\n actions: T[] | undefined,\n) => actions?.map(({ command, ...action }) => ({ ...action, commandId: commandRefId(command) }));\nconst kanbanRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"kanbanRenderers\"] =>\n metadata.views.flatMap((view) => {\n const body = view.body;\n if (body.kind !== \"kanban\") return [];\n return [\n {\n ...body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: body.resourceKind ?? resourceKindForView(metadata, view.id),\n createRow: body.createRow\n ? {\n title: body.createRow.title,\n submitLabel: body.createRow.submitLabel,\n columnParam: body.createRow.columnParam,\n params: body.createRow.params as ParamObjectSchema | undefined,\n attributesParam: body.createRow.attributesParam,\n labels: body.createRow.labels,\n commandId: commandRefId(body.createRow.command),\n attachments: body.createRow.attachments\n ? {\n resourceParam: body.createRow.attachments.resourceParam,\n fileParam: body.createRow.attachments.fileParam,\n commandId: commandRefId(body.createRow.attachments.command),\n }\n : undefined,\n }\n : undefined,\n rowActions: commandActions(body.rowActions),\n toolbarActions: commandActions(body.toolbarActions),\n },\n ];\n });\nconst dataTableRenderers = (\n metadata: WorkbenchExtensionMetadata,\n): InternalWorkbenchExtensionMetadata[\"dataTableRenderers\"] =>\n metadata.views.flatMap((view) => {\n const body = view.body;\n if (body.kind !== \"dataTable\") return [];\n return [\n {\n ...body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: body.resourceKind ?? resourceKindForView(metadata, view.id),\n selectionActions: commandActions(body.selectionActions),\n rowActions: commandActions(body.rowActions),\n toolbarActions: commandActions(body.toolbarActions),\n },\n ];\n });\nconst treeRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"treeRenderers\"] =>\n metadata.views.flatMap((view) =>\n view.body.kind === \"tree\"\n ? [\n {\n ...view.body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: view.body.resourceKind ?? resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\nconst fileRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"fileRenderers\"] =>\n metadata.views.flatMap((view) =>\n view.body.kind === \"file\"\n ? [\n {\n ...view.body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: view.body.resourceKind ?? resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\nconst controlsRenderers = (\n metadata: WorkbenchExtensionMetadata,\n): InternalWorkbenchExtensionMetadata[\"controlsRenderers\"] =>\n metadata.views.flatMap((view) =>\n view.body.kind === \"controls\"\n ? [\n {\n ...view.body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: view.body.resourceKind ?? resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\nconst modes = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"modes\"] =>\n metadata.modes.map((mode) => ({\n id: mode.id,\n extensionId: mode.extensionId,\n modeId: mode.id,\n label: mode.label,\n icon: mode.icon,\n panelRegions: mode.regions,\n regionSettings: mode.regionSettings,\n floatingPanels: mode.floatingPanels,\n ...(mode.defaultTheme ? { defaultTheme: contributionRefId(mode.defaultTheme) } : {}),\n ...(mode.chrome\n ? {\n chrome: Object.fromEntries(\n Object.entries(mode.chrome).map(([region, view]) => [\n region,\n view === false ? false : contributionRefId(view),\n ]),\n ),\n }\n : {}),\n }));\nexport const toInternalWorkbenchExtensionMetadata = (\n metadata: WorkbenchExtensionMetadata,\n input: {\n createTab?(\n metadata: WorkbenchExtensionTabMetadata,\n ): InternalWorkbenchExtensionMetadata[\"placements\"][number][\"tab\"];\n } = {},\n): InternalWorkbenchExtensionMetadata => {\n const adaptedPanels = panels(metadata);\n return {\n extensions: metadata.extensions,\n commands: metadata.commands,\n menuContributions: metadata.menuContributions,\n commandPaletteContributions: metadata.commandPaletteContributions,\n modes: modes(metadata),\n pages: toInternalWorkbenchPages(metadata, input.createTab),\n placements: metadata.placements.map((placement) => ({\n id: placement.id,\n ref: { extensionId: placement.extensionId, kind: \"placement\", id: placement.localId },\n modeId: contributionRefId(placement.mode),\n item: placement.item,\n region: placement.region,\n order: placement.order,\n movableTo: placement.movableTo,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n headerBorderBottom: placement.headerBorderBottom,\n tab:\n placement.tab && input.createTab\n ? input.createTab({\n ...placement.tab,\n extensionId: placement.extensionId,\n placementId: placement.id,\n })\n : undefined,\n })),\n panels: adaptedPanels,\n resourceKinds: metadata.resourceKinds.map((kind) => ({\n id: kind.id,\n relatedOpeningsCommand: kind.relatedOpeningsCommand,\n extensionId: kind.extensionId,\n label: kind.label,\n icon: kind.icon,\n menuSlots: Object.fromEntries(\n (kind.menuSlots ?? []).map((slot) => [\n slot.id,\n {\n placement: slot.placement,\n label: slot.label,\n external: slot.access === \"public\",\n order: slot.order,\n },\n ]),\n ),\n })),\n resourceHierarchyProviders: (metadata.resourceHierarchyProviders ?? []).map((record) => ({\n id: record.id,\n extensionId: record.extensionId,\n resourceKind: record.resourceKind.id,\n })),\n settingsSections: metadata.settingsSections ?? [],\n settingsPanels: metadata.settingsPanels.flatMap((panel) => {\n const view = metadata.views.find((candidate) => candidate.id === contributionRefId(panel.view));\n if (!view) return [];\n return [\n {\n id: panel.id,\n viewId: view.id,\n extensionId: panel.extensionId,\n slotId: panel.slot.id,\n scope: panel.slot.id.includes(\"global\") ? (\"global\" as const) : (\"project\" as const),\n title: view.title,\n icon: view.icon,\n section: panel.section ? contributionRefId(panel.section) : undefined,\n },\n ];\n }),\n kanbanRenderers: kanbanRenderers(metadata),\n dataTableRenderers: dataTableRenderers(metadata),\n commandPaletteResources: metadata.commandPaletteResources ?? [],\n treeRenderers: treeRenderers(metadata),\n fileRenderers: fileRenderers(metadata),\n controlsRenderers: controlsRenderers(metadata),\n keybindings: metadata.keybindings ?? [],\n settingsDefinitions: metadata.settingsDefinitions ?? [],\n statusBarItems: metadata.statusBarItems.map((item) => ({\n id: item.id,\n extensionId: item.extensionId,\n viewId: contributionRefId(item.view),\n slot: item.slot.id.endsWith(\"leading\") ? \"leading\" : \"trailing\",\n order: item.order,\n when: toWorkbenchWhenExpression(item.when),\n })),\n diagnostics: metadata.diagnostics,\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { Disposable, FileRendererRefreshEnvelope, WorkbenchModuleContext } from \"../../core\";\n\nexport type WorkbenchExtensionRendererKind = \"tree\" | \"file\" | \"controls\" | \"dataTable\" | \"kanban\";\n\ninterface RendererRefreshTarget {\n id: string;\n kind: WorkbenchExtensionRendererKind;\n}\n\nexport interface WorkbenchExtensionRefreshEvent extends FileRendererRefreshEnvelope {\n id: string;\n}\n\nexport interface RegisterWorkbenchExtensionRendererRefreshEventsInput {\n metadata: WorkbenchExtensionMetadata;\n subscribe: (listener: (event: WorkbenchExtensionRefreshEvent) => void) => Disposable;\n workbench: WorkbenchModuleContext;\n}\n\nexport const refreshWorkbenchExtensionRenderer = (\n workbench: WorkbenchModuleContext,\n target: RendererRefreshTarget,\n envelope: FileRendererRefreshEnvelope = {},\n) => {\n workbench.views.refreshView(target.id, target.kind === \"file\" ? envelope : undefined);\n};\n\nconst rendererRefreshTargets = (metadata: WorkbenchExtensionMetadata) => {\n const targets = new Map<string, RendererRefreshTarget[]>();\n const add = (kind: WorkbenchExtensionRendererKind, renderer: { id: string; refreshEventIds?: string[] }) => {\n for (const eventId of new Set(renderer.refreshEventIds ?? [])) {\n const eventTargets = targets.get(eventId) ?? [];\n if (!eventTargets.some((target) => target.kind === kind && target.id === renderer.id)) {\n eventTargets.push({ id: renderer.id, kind });\n }\n targets.set(eventId, eventTargets);\n }\n };\n\n for (const view of metadata.views) {\n if (view.body.kind === \"webview\") continue;\n add(view.body.kind, { id: view.id, refreshEventIds: view.body.refreshEventIds });\n }\n return targets;\n};\n\nexport const registerWorkbenchExtensionRendererRefreshEvents = (\n input: RegisterWorkbenchExtensionRendererRefreshEventsInput,\n) => {\n const targets = rendererRefreshTargets(input.metadata);\n return input.subscribe((event) => {\n const { id, ...envelope } = event;\n for (const target of targets.get(id) ?? []) refreshWorkbenchExtensionRenderer(input.workbench, target, envelope);\n });\n};\n\nexport const refreshOpenWorkbenchExtensionWebviews = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n) => {\n for (const view of metadata.views) {\n if (view.body.kind !== \"webview\") continue;\n if (workbench.views.getView(view.id)) workbench.views.refreshView(view.id);\n }\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { WebviewArtifactsReadParams, WebviewHostCapabilityResults } from \"pstdio-api-contracts/extension-kernel\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommandResponse } from \"../host/workbench-extension-command\";\nimport type { CreateBridgeWebviewHostAdapters } from \"./bridge-webview-renderer\";\nimport type { ExtensionWebviewFilesAdapter } from \"./extension-webview-host-adapters\";\nimport { createWorkbenchWebviewHostAdapters } from \"./webview-host-capabilities\";\n\ntype ExtensionWebviewSlotKind = NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\nexport type ExtensionWebviewFileCapabilities = ExtensionWebviewFilesAdapter;\nexport interface ExtensionWebviewArtifactCapabilities {\n read(\n params: WebviewArtifactsReadParams,\n context: { webviewId: string },\n ): Promise<WebviewHostCapabilityResults[\"artifacts.read\"]> | WebviewHostCapabilityResults[\"artifacts.read\"];\n}\ninterface CreateWorkbenchExtensionWebviewAdaptersInput {\n artifacts?: ExtensionWebviewArtifactCapabilities;\n executeCommand(commandId: string, body: CommandExecuteRequest, signal?: AbortSignal): Promise<unknown> | unknown;\n extensionIdForWebview(webviewId: string): string | undefined;\n files?: ExtensionWebviewFileCapabilities;\n projectId: string;\n slotKind: ExtensionWebviewSlotKind;\n}\n\nexport const createWorkbenchExtensionWebviewAdapters =\n (input: CreateWorkbenchExtensionWebviewAdaptersInput): CreateBridgeWebviewHostAdapters =>\n (context) => {\n const extensionId = context.extensionId ?? input.extensionIdForWebview(context.webviewId);\n return {\n ...createWorkbenchWebviewHostAdapters({ ...context, extensionId, projectId: input.projectId }),\n executeCommand: (request, signal) => {\n const resource = request.resource ?? context.placement.resource;\n return executeWorkbenchExtensionCommandResponse({ ...input, workbench: context.workbench }, request.commandId, {\n params: request.params,\n workspaceId: request.workspaceId,\n metadata: request.metadata,\n resource,\n signal,\n slot: createExtensionSlot({\n id: context.webviewId,\n kind: input.slotKind,\n projectId: input.projectId,\n context: { panelId: context.webviewId },\n }),\n });\n },\n files: input.files,\n artifacts: input.artifacts\n ? { read: (params) => input.artifacts!.read(params, { webviewId: context.webviewId }) }\n : undefined,\n };\n };\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { BridgeWebviewConfig } from \"./bridge-webview-renderer\";\n\ntype WorkbenchWebview = Extract<WorkbenchExtensionMetadata[\"views\"][number][\"body\"], { kind: \"webview\" }>[\"webview\"];\n\nexport const toBridgeWebviewConfig = (webview: WorkbenchWebview): BridgeWebviewConfig => {\n const title = text(webview.title);\n return {\n title: title || undefined,\n runtimeUrl: webview.runtimeUrl,\n moduleUrl: webview.moduleUrl,\n styles: webview.styles,\n capabilities: webview.capabilities,\n };\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, PreferencePropertySchema, PreferenceScope, PreferenceValue } from \"../../core\";\nimport {\n type CreateBridgeWebviewHostAdapters,\n getBridgeWebviewHostEventPublisher,\n renderBridgeWebviewFrame,\n} from \"../bridge/bridge-webview-renderer\";\nimport { createWorkbenchExtensionWebviewAdapters } from \"../bridge/webview-command-capabilities\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\nimport type { InternalRegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nconst settingsSectionIdDefault = \"extensions\";\nconst extensionSettingsOrderBase = 1_000;\n\nconst asPreferenceValue = (value: unknown): PreferenceValue | undefined =>\n value === undefined ? undefined : (value as PreferenceValue);\n\nconst preferenceScope = (scope: \"global\" | \"project\"): PreferenceScope => (scope === \"global\" ? \"user\" : \"project\");\n\nconst createExtensionHostAdapters = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n slotKind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"],\n): CreateBridgeWebviewHostAdapters => {\n const createBase = createWorkbenchExtensionWebviewAdapters({\n artifacts: input.webviewArtifacts,\n executeCommand: input.executeCommand,\n extensionIdForWebview: (webviewId) => input.metadata.panels.find((panel) => panel.id === webviewId)?.extensionId,\n files: input.webviewFiles,\n projectId: input.projectId,\n slotKind,\n });\n return (context) => ({ ...createBase(context), ...input.createWebviewHostAdapters?.(context) });\n};\n\nexport const registerWebviewPanels = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n return input.metadata.panels.flatMap((panel) => {\n if (!panel.webview) return [];\n const webview = toBridgeWebviewConfig(panel.webview);\n return [\n input.workbench.views.registerView({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n body: {\n kind: \"react\",\n render: (renderInput) => {\n const slotKind = input.metadata.settingsPanels.some(\n (settingsPanel) => settingsPanel.id === renderInput.instance.panelId && settingsPanel.viewId === panel.id,\n )\n ? \"settings\"\n : \"panel\";\n return (\n input.renderWebview?.(renderInput) ??\n renderBridgeWebviewFrame({\n context: {\n workbench: renderInput.workbench,\n webviewId: panel.id,\n placement: renderInput.instance,\n hostEvents: getBridgeWebviewHostEventPublisher(renderInput.workbench, renderInput.instance),\n },\n createHostAdapters: createExtensionHostAdapters(input, slotKind),\n createProps:\n input.createWebviewProps ?? (({ placement }) => ({ placement, resource: placement.resource })),\n createTheme: input.createWebviewTheme,\n ownerId: panel.extensionId,\n title: text(panel.title, panel.id),\n webview,\n })\n );\n },\n },\n }),\n ];\n });\n};\n\nconst viewMenuPlacementPriority = { first: 1_000_000, default: 0, last: -1_000_000 } as const;\n\nexport const registerViewMenus = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.panels\n .flatMap((panel) => panel.panelMenus ?? [])\n .map((menu, index) =>\n input.workbench.viewMenus.registerViewMenu({\n id: menu.id,\n ownerViewId: menu.ownerPanelId,\n viewId: menu.viewId,\n side: menu.side,\n priority: viewMenuPlacementPriority[menu.placement ?? \"default\"] - index,\n }),\n );\n\nexport const registerSettings = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n const sectionId = input.settingsSectionId ?? settingsSectionIdDefault;\n\n if (!input.workbench.settings.getSection(sectionId)) {\n disposables.push(\n input.workbench.settings.registerSection({ id: sectionId, title: input.settingsSectionTitle ?? \"Extensions\" }),\n );\n }\n\n const sections = [...input.metadata.settingsSections].sort(\n (left, right) =>\n (left.order ?? 0) - (right.order ?? 0) ||\n left.extensionId.localeCompare(right.extensionId) ||\n left.id.localeCompare(right.id),\n );\n for (const section of sections) {\n disposables.push(\n input.workbench.settings.registerSection({\n id: section.id,\n title: text(section.title, section.id),\n order: section.order,\n scope: section.scope,\n }),\n );\n }\n\n // Keep the existing last-definition-wins rule for shared legacy names.\n const definitions = new Map(input.metadata.settingsDefinitions.map((setting) => [setting.key, setting]));\n const propertiesByOwner = new Map<string, Record<string, PreferencePropertySchema>>();\n for (const setting of definitions.values()) {\n const properties = propertiesByOwner.get(setting.extensionId) ?? Object.create(null);\n properties[setting.key] = {\n type: setting.type,\n scope: preferenceScope(setting.scope),\n default: asPreferenceValue(setting.default),\n enum: setting.enum as PreferenceValue[] | undefined,\n description: text(setting.description),\n } satisfies PreferencePropertySchema;\n propertiesByOwner.set(setting.extensionId, properties);\n }\n for (const [ownerId, properties] of propertiesByOwner) {\n disposables.push(input.workbench.preferences.registerSchema({ properties }, { ownerId }));\n }\n\n const panels = [...input.metadata.settingsPanels].sort(\n (left, right) => left.extensionId.localeCompare(right.extensionId) || left.id.localeCompare(right.id),\n );\n for (const [index, panel] of panels.entries()) {\n if (panel.slotId === \"extension.settings\") continue;\n disposables.push(\n input.workbench.settings.registerPanel({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n kind: \"view\",\n order: extensionSettingsOrderBase + index,\n section: panel.section ?? sectionId,\n scope: panel.scope,\n viewId: panel.viewId,\n }),\n );\n }\n\n return disposables;\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { isNavigationTarget, resourceKey } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, WorkbenchPanelTab, WorkbenchTabSnapshot } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\nimport { executeWorkbenchExtensionCommand } from \"./workbench-extension-command\";\nimport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\nimport type { WorkbenchExtensionRefreshEvent } from \"./workbench-extension-refresh\";\n\ntype MetadataPlacement = WorkbenchExtensionMetadata[\"placements\"][number];\ntype MetadataPageSlot = WorkbenchExtensionMetadata[\"pages\"][number][\"slots\"][number];\nexport type WorkbenchExtensionTabMetadata = NonNullable<MetadataPlacement[\"tab\"] | MetadataPageSlot[\"tab\"]> & {\n extensionId: string;\n placementId: string;\n};\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value && typeof value === \"object\" && !Array.isArray(value));\nconst navigationAction = (value: unknown, extensionId: string, projectId: string) =>\n isNavigationTarget(value) ? toWorkbenchNavigationTarget(value, { extensionId, projectId }) : undefined;\nconst toRows = (value: unknown, extensionId: string, projectId: string) =>\n Array.isArray(value)\n ? value.flatMap((row) => {\n if (!isRecord(row) || typeof row.id !== \"string\") return [];\n const target = navigationAction(row.action, extensionId, projectId);\n return [\n {\n id: row.id,\n label: text(row.label as Parameters<typeof text>[0], row.id),\n icon: typeof row.icon === \"string\" ? row.icon : undefined,\n iconColor: typeof row.iconColor === \"string\" ? row.iconColor : undefined,\n selected: row.selected === true,\n disabled: row.disabled === true,\n action: target ? { kind: \"navigation\" as const, target } : undefined,\n },\n ];\n })\n : [];\nconst toSnapshot = (value: unknown, extensionId: string, projectId: string): WorkbenchTabSnapshot => {\n if (!isRecord(value)) return {};\n const indicator = isRecord(value.indicator)\n ? {\n icon: String(value.indicator.icon ?? \"\"),\n color: typeof value.indicator.color === \"string\" ? value.indicator.color : undefined,\n label: text(value.indicator.label as Parameters<typeof text>[0]),\n }\n : undefined;\n const menu = Array.isArray(value.menu)\n ? value.menu.flatMap((candidate) => {\n if (!isRecord(candidate) || typeof candidate.id !== \"string\" || !Array.isArray(candidate.rows)) return [];\n return [\n {\n id: candidate.id,\n label: text(candidate.label as Parameters<typeof text>[0]),\n rows: toRows(candidate.rows, extensionId, projectId),\n },\n ];\n })\n : undefined;\n return {\n label: text(value.label as Parameters<typeof text>[0]),\n icon: typeof value.icon === \"string\" ? value.icon : undefined,\n indicator: indicator?.icon ? indicator : undefined,\n menu,\n };\n};\nexport const createWorkbenchExtensionTabPresentation = (\n input: RegisterWorkbenchExtensionContributionsInput,\n metadata: WorkbenchExtensionTabMetadata,\n): WorkbenchPanelTab => {\n const snapshots = new Map<string, WorkbenchTabSnapshot>();\n const instances = new Map<string, Parameters<WorkbenchPanelTab[\"getSnapshot\"]>[0]>();\n const loading = new Map<string, Promise<void>>();\n const listeners = new Set<() => void>();\n const refreshEvents = new Set(metadata.refreshEventIds ?? []);\n let revision = 0;\n const load = (instance: Parameters<WorkbenchPanelTab[\"getSnapshot\"]>[0]): Promise<void> => {\n instances.set(instance.instanceId, instance);\n const pending = loading.get(instance.instanceId);\n if (pending) return pending;\n const resource = instance.resource;\n const currentRevision = revision;\n const pendingLoad = Promise.resolve(\n executeWorkbenchExtensionCommand(input, metadata.queryHandlerId, {\n resource,\n params: {\n renderer: {\n rendererId: metadata.placementId,\n projectId: input.projectId,\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n },\n }),\n )\n .then(async (value) => {\n if (currentRevision !== revision) {\n loading.delete(instance.instanceId);\n await load(instance);\n return;\n }\n snapshots.set(instance.instanceId, toSnapshot(value, metadata.extensionId, input.projectId));\n for (const listener of listeners) listener();\n })\n .finally(() => {\n if (loading.get(instance.instanceId) === pendingLoad) loading.delete(instance.instanceId);\n });\n loading.set(instance.instanceId, pendingLoad);\n return pendingLoad;\n };\n return {\n refreshEvents: metadata.refreshEventIds,\n getSnapshot(instance) {\n if (!snapshots.has(instance.instanceId)) void load(instance).catch(() => undefined);\n return snapshots.get(instance.instanceId) ?? {};\n },\n subscribe(listener) {\n listeners.add(listener);\n const resourceSubscription = input.workbench.resources.preview.subscribeRefresh(async (resource) => {\n const affected = [...instances.values()].filter(\n (instance) => instance.resource && resourceKey(instance.resource) === resourceKey(resource),\n );\n if (!affected.length) return;\n revision++;\n await Promise.all(affected.map(load));\n });\n const refreshSubscription = input.subscribeRefreshEvents?.((event: WorkbenchExtensionRefreshEvent) => {\n if (!refreshEvents.has(event.id)) return;\n revision++;\n for (const instance of instances.values()) void load(instance).catch(() => undefined);\n });\n const disposable: Disposable = {\n dispose() {\n listeners.delete(listener);\n refreshSubscription?.dispose();\n resourceSubscription.dispose();\n },\n };\n return disposable;\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { matchesResourceWhen } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, WorkbenchCommandExecutionContext } from \"../../core\";\nimport { workbenchCommandPaletteMenuPath } from \"../../core\";\nimport { registerWorkbenchExtensionCommandPaletteResources } from \"../contributions/command-palette-resource-contributions\";\nimport { registerWorkbenchExtensionControlsRenderers } from \"../contributions/controls-renderer-contributions\";\nimport { registerWorkbenchExtensionDataTableRenderers } from \"../contributions/data-table-renderer-contributions\";\nimport {\n buildWorkbenchExtensionCommandPaletteRegistrations,\n buildWorkbenchExtensionMenuRegistrations,\n} from \"../contributions/extension-contributions\";\nimport { registerWorkbenchExtensionFileRenderers } from \"../contributions/file-renderer-contributions\";\nimport { registerWorkbenchExtensionKanbanRenderers } from \"../contributions/kanban-renderer-contributions\";\nimport { registerWorkbenchExtensionNavigationItems } from \"../contributions/navigation-item-contributions\";\nimport { localizeParamSchema } from \"../contributions/param-schema-localization\";\nimport { registerWorkbenchExtensionTreeRenderers } from \"../contributions/tree-renderer-contributions\";\nimport { registerResourceKinds } from \"./resource-kind-contributions\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n type WorkbenchExtensionCommandContext,\n} from \"./workbench-extension-command\";\nimport type {\n InternalRegisterWorkbenchExtensionContributionsInput,\n RegisterWorkbenchExtensionContributionsInput,\n} from \"./workbench-extension-host-types\";\nimport { registerWorkbenchExtensionKeybindings } from \"./workbench-extension-keybindings\";\n\nexport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nimport { toInternalWorkbenchExtensionMetadata } from \"./workbench-extension-metadata-adapter\";\nimport { registerWorkbenchExtensionRendererRefreshEvents } from \"./workbench-extension-refresh\";\nimport { registerSettings, registerViewMenus, registerWebviewPanels } from \"./workbench-extension-surfaces\";\nimport { createWorkbenchExtensionTabPresentation } from \"./workbench-extension-tab-presentation\";\n\nconst disposeAll = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\nconst prepareCommandArgs = (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n args: unknown,\n executionContext?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n) => context.prepareCommandArgs?.(commandId, args, executionContext, onArgsChange) ?? args;\nconst registerCommands = (\n context: WorkbenchExtensionCommandContext,\n metadata: Pick<WorkbenchExtensionMetadata, \"commands\">,\n) =>\n metadata.commands.map((command) =>\n context.workbench.commands.registerCommand(\n {\n id: command.id,\n label: text(command.title, command.id),\n description: text(command.description),\n params: localizeParamSchema(command.params, text, command.extensionId),\n resourceMutation: command.resourceMutation,\n },\n {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, command.id, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, command.id, {\n params: asParams(args),\n resource: executionContext?.resource,\n signal: executionContext?.signal,\n region: executionContext?.region,\n }),\n },\n ),\n );\nconst menuCommandResource = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n executionContext: WorkbenchCommandExecutionContext | undefined,\n) => executionContext?.resource ?? input.workbench.getPrimaryResource();\nconst registerMenus = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n if (!input.menuSlotsById) return [] as Disposable[];\n const { registrations } = buildWorkbenchExtensionMenuRegistrations({\n metadata: input.metadata,\n menuSlotsById: input.menuSlotsById,\n menuTargetsById: input.menuTargetsById,\n createWhenExpression: input.createMenuWhenExpression,\n });\n const defaultRegistrations = registrations.map(({ menuItem, menuPath, ...registration }) => ({\n ...registration,\n menuItems: [{ menuItem, menuPath }],\n }));\n const resolvedRegistrations = input.menuRegistrations ?? defaultRegistrations;\n return resolvedRegistrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, registration.targetCommandId, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, registration.targetCommandId, {\n params: { ...(registration.contribution.params ?? {}), ...(asParams(args) ?? {}) },\n resource: menuCommandResource(input, executionContext),\n slot: createExtensionSlot({\n id: registration.contribution.slotId,\n kind: \"menu\",\n projectId: input.projectId,\n context: { panelId: registration.contribution.id },\n }),\n }),\n }),\n ...registration.menuItems.map(({ menuPath, menuItem }) =>\n input.workbench.layout.registerMenuItem(menuPath, menuItem),\n ),\n ]);\n};\nconst registerCommandPaletteContributions = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const registrations = buildWorkbenchExtensionCommandPaletteRegistrations({ metadata: input.metadata });\n return registrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, registration.targetCommandId, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, registration.targetCommandId, {\n params: { ...(registration.contribution.params ?? {}), ...(asParams(args) ?? {}) },\n resource: menuCommandResource(input, executionContext),\n slot: createExtensionSlot({\n id: \"workbench.commandPalette\",\n kind: \"menu\",\n projectId: input.projectId,\n context: { panelId: registration.contribution.id },\n }),\n }),\n isVisible: () => matchesResourceWhen(registration.contribution.when, input.workbench.getPrimaryResource()?.type),\n }),\n input.workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, registration.menuItem),\n ]);\n};\nconst matchesActiveMode = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n when:\n | {\n mode?: string | string[];\n }\n | undefined,\n) => {\n const modes = when?.mode;\n if (!modes) return true;\n const active = input.workbench.modes.getActiveModeId() ?? \"\";\n return Array.isArray(modes) ? modes.includes(active) : modes === active;\n};\nconst registerStatusBarItems = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n (input.metadata.statusBarItems ?? []).map((item) =>\n input.workbench.statusBar.registerItem({\n id: item.id,\n viewId: item.viewId,\n slot: item.slot,\n order: item.order,\n isVisible: () =>\n matchesActiveMode(\n input,\n item.when as\n | {\n mode?: string | string[];\n }\n | undefined,\n ),\n }),\n );\nconst registerPages = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.pages.map((page) => input.workbench.pages.registerPage(page));\nconst registerModes = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.modes.map((mode) =>\n input.workbench.modes.registerMode({\n id: mode.modeId,\n label: text(mode.label, mode.modeId),\n panels: mode.panelRegions,\n regionSettings: mode.regionSettings,\n floatingPanels: mode.floatingPanels,\n defaultTheme: mode.defaultTheme,\n chrome: mode.chrome,\n activate: () => undefined,\n }),\n );\nconst registerModePlacements = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.placements.map((placement) => input.workbench.modePlacements.registerPlacement(placement));\nexport const registerWorkbenchExtensionContributions = (sourceInput: RegisterWorkbenchExtensionContributionsInput) => {\n const input: InternalRegisterWorkbenchExtensionContributionsInput = {\n ...sourceInput,\n metadata: toInternalWorkbenchExtensionMetadata(sourceInput.metadata, {\n createTab: (metadata) => createWorkbenchExtensionTabPresentation(sourceInput, metadata),\n }),\n };\n const disposables: Disposable[] = [];\n const context: WorkbenchExtensionCommandContext = input;\n try {\n disposables.push(...registerCommands(context, input.metadata));\n disposables.push(\n ...registerWorkbenchExtensionKeybindings({\n bindings: input.metadata.keybindings,\n createWhenExpression: input.createKeybindingWhenExpression,\n workbench: input.workbench,\n }),\n );\n disposables.push(...registerMenus(input, context));\n disposables.push(...registerCommandPaletteContributions(input, context));\n disposables.push(\n registerWorkbenchExtensionTreeRenderers({ ...input, resolveNodeResource: input.resolveTreeNodeResource }),\n );\n disposables.push(registerWorkbenchExtensionFileRenderers(input));\n disposables.push(registerWorkbenchExtensionControlsRenderers(context, input.metadata.controlsRenderers ?? []));\n disposables.push(...registerWebviewPanels(input));\n disposables.push(...registerSettings(input));\n // Status-backed renderers query their provider while they register. Providers\n // must exist first so the renderer's live option source can load immediately.\n disposables.push(\n registerWorkbenchExtensionKanbanRenderers(context, input.metadata.kanbanRenderers ?? [], input.kanbanAdapter),\n );\n disposables.push(\n registerWorkbenchExtensionDataTableRenderers(\n context,\n input.metadata.dataTableRenderers ?? [],\n input.dataTableAdapter,\n ),\n );\n disposables.push(...registerViewMenus(input));\n disposables.push(\n registerWorkbenchExtensionCommandPaletteResources(context, input.metadata.commandPaletteResources ?? []),\n );\n disposables.push(\n ...registerWorkbenchExtensionNavigationItems({\n createWhenExpression: sourceInput.createNavigationWhenExpression,\n metadata: sourceInput.metadata,\n workbench: sourceInput.workbench,\n }),\n );\n if (sourceInput.subscribeRefreshEvents) {\n disposables.push(\n registerWorkbenchExtensionRendererRefreshEvents({\n metadata: sourceInput.metadata,\n subscribe: sourceInput.subscribeRefreshEvents,\n workbench: sourceInput.workbench,\n }),\n );\n }\n disposables.push(...registerStatusBarItems(input));\n disposables.push(...registerResourceKinds(input));\n disposables.push(...registerPages(input));\n disposables.push(...registerModes(input));\n disposables.push(...registerModePlacements(input));\n return {\n dispose() {\n disposeAll(disposables);\n },\n };\n } catch (error) {\n disposeAll(disposables);\n throw error;\n }\n};\n"],"mappings":"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"}
|