@pstdio/workbench 0.44.0 → 0.45.0-nightly.20261020145025
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 +30 -4
- package/dist/extensions.js +878 -771
- package/dist/extensions.js.map +1 -1
- package/dist/{file-renderer-view-C5dyoQQW.js → file-renderer-view-c0hGcYy9.js} +47 -47
- package/dist/{file-renderer-view-C5dyoQQW.js.map → file-renderer-view-c0hGcYy9.js.map} +1 -1
- package/dist/{index-8x-QT7wg.d.ts → index-B2IdtXpS.d.ts} +342 -6
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2062 -1812
- package/dist/index.js.map +1 -1
- package/dist/{kanban-presentation-pexk_oCY.d.ts → kanban-presentation-C7JHKKGw.d.ts} +1 -1
- package/dist/navigation-tree-registry-1h3dEi30.js +135 -0
- package/dist/navigation-tree-registry-1h3dEi30.js.map +1 -0
- package/dist/{react-C-HbdPSw.js → react-QSItpi3d.js} +3629 -3041
- package/dist/react-QSItpi3d.js.map +1 -0
- package/dist/react.d.ts +18 -5
- package/dist/react.js +2 -2
- package/dist/storage.d.ts +1 -1
- package/dist/webview-runtime.js +1 -1
- package/dist/{workbench-renderers-Bz_dLyHW.js → workbench-renderers-B1Qp-9yW.js} +1663 -1300
- package/dist/workbench-renderers-B1Qp-9yW.js.map +1 -0
- package/package.json +3 -3
- package/dist/navigation-tree-registry-C5l3eO3n.js +0 -120
- package/dist/navigation-tree-registry-C5l3eO3n.js.map +0 -1
- package/dist/react-C-HbdPSw.js.map +0 -1
- package/dist/workbench-renderers-Bz_dLyHW.js.map +0 -1
package/dist/extensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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","EXTENSION_EVENTS_SCOPE","RESOURCE_ACTIONS_EVENTS_SCOPE","artifactMountId","mount","id","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","WebviewPointerEvent","createHostCapabilityGate","createWebviewHostProps","normalizeRuntimeError","capabilityReply","HostEventPublisher","extensionIframeAllow","collectChakraThemeVariables","resolveActiveTheme","ExtensionFrameProps","sizing","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","contentWidth","setContentWidth","current","iframe","onFrameLoad","contentWindow","epoch","addEventListener","removeLoadListener","removeEventListener","stylesAtConnect","styles","moduleUrlAtConnect","moduleUrl","reportDiagnostics","length","createCapabilityGate","declaredCapabilities","onDiagnostic","diagnostic","hostApi","dispatchPointerEvent","isConnected","type","bounds","getBoundingClientRect","dispatchEvent","PointerEvent","bubbles","composed","cancelable","clientX","left","clientWidth","clientY","top","clientHeight","contentWidthChanged","Number","isFinite","dispatchKeyboardEvent","document","KeyboardEvent","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","sizing","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","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","harnessId","model","discriminatedUnion","operation","literal","key","extend","bytes","target","custom","nullable","title","level","value","boolean","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","readHarnesses","harnesses","read","bind","resourceActions","open","target","location","update","value","close","show","type","level","title","message","create","status","scope","all","key","delete","upload","list","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","WebviewHostCapabilityParams","RESOURCE_ACTIONS_EVENTS_SCOPE","HostEventPublisher","WorkbenchCore","orderMenuEntries","resolveMenuEntries","resolveResourceActionMenu","subscribeResourceActionChanges","createChangeNotifier","workbench","hostEvents","stop","pending","emit","queueMicrotask","scope","payload","type","unsubscribe","stopOnDisconnect","onDisconnect","undefined","createWebviewResourceActions","projectId","watchChanges","input","menu","resource","entries","operation","entry","find","id","key","run","disabled","Error","map","label","commandId","icon","iconSrc","description","isDisabled","separatorBefore","group","HostEventPublisher","WorkbenchCore","WorkbenchPanelInstance","toWorkbenchNavigationTarget","ExtensionWebviewHostAdapters","createExtensionWebviewHostCapabilities","createWebviewPreferencesAdapter","WebviewOwnedPreferences","createWebviewResourceActions","CreateWorkbenchWebviewHostAdaptersInput","workbench","placement","extensionId","projectId","ownedPreferences","warn","message","hostEvents","createWorkbenchWebviewHostAdapters","input","resourceActions","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","type","captureActionError","title","instanceId","level","metadata","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","sizing","ownerId","webview","id","label","renderBridgeWebview","panel","region","undefined","panelId","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","resolveCommandResourceParams","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","reportNavigationError","notifications","captureActionError","response","source","outcome","Partial","status","target","navigationRequests","navigation","openTarget","error","executeWorkbenchExtensionCommand","command","commands","find","candidate","persist","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","KanbanRendererRow","WireRow","renderBadgeListDisplay","kanbanBuiltInViews","WorkbenchExtensionKanbanRendererRecord","text","createElement","Disposable","KanbanRendererCreateSubmission","KanbanRendererQueryState","ResourceRef","WorkbenchIcon","ReactAttributeDescriptor","AttributeDescriptor","toWorkbenchNavigationTarget","WorkbenchExtensionCommandContext","collectionBadgeTarget","WorkbenchExtensionKanbanRendererAdapter","toWorkbenchBoardColumnConfig","createMutableAttributeSource","defaultResolveRowActionResource","defaultResolveRowResource","executeKanbanRendererCommand","isQueryResult","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","text","ResourceRef","ExtensionTreeRendererRecord","extensionTreeStructure","record","resource","structure","map","section","id","label","collapsible","hiddenByDefault","canHide","loading","resourceNode","nodes","type","icon","selected","text","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","extensionTreeStructure","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","getStructure","structure","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","sizing","region","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","panelHeaders","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","isNavigationHref","isFileSourcePosition$1","jsonObjectSchema","pageParamValueSchema","validatedCommandOutcomeSchema","WEBVIEW_DECLARABLE_CAPABILITIES","kanbanBuiltInViews","dataTableBuiltInViews","WEBVIEW_HOST_CAPABILITIES","relatedResourceOpeningSchema","WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES","controlsQueryResultSchema","resolvePageParams","extensionResourceRefSchema","commandExecutionResultSchema","navigationSlotRootSectionId","resolveCommandResourceParams","resolveResourceActionMenu","resolveMenuEntries","attachFileStorageVersions","subscribeResourceActionChanges","fileStorageVersions","orderMenuEntries","WorkbenchIcon","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","RESOURCE_ACTIONS_EVENTS_SCOPE","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","contentWidth","setContentWidth","useEffect","iframe","onFrameLoad","epoch","removeLoadListener","stylesAtConnect","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","event","bounds","sizing","width","event_0","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","t7","Center","Stack","Text","t8","t9","t10","nextError","t11","t12","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","readHarnesses","navigation","pageParams","location","placement","notifications","preferences","settings","files","artifacts","toCommandTarget","override","toWorkbenchNavigationTarget","isNavigationTarget","createWebviewPreferencesAdapter","registry","owner","registered","schema","createChangeNotifier","stop","stopOnDisconnect","createWebviewResourceActions","watchChanges","menu","entries","entry","id","createWorkbenchWebviewHostAdapters","patch","notice","createWorkbenchWebviewHostCapabilities","createLightTheme","hostEventPublishersByWorkbench","getBridgeWebviewHostEventPublisher","hostEventsByWidget","key","instance","renderBridgeWebviewFrame","ownerId","context","webview","createProps","createTheme","createHostAdapters","text$1","unwrapCommandValue","getCommandValue","runResourceMutation","mutation","persist","execution","rawLabel","preview","createExtensionSlot","executeWorkbenchExtensionCommandResponse","reportNavigationError","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","extensionTreeStructure","section","toActionParams","toRecordParams","createTreeMapper","originalNodes","runnerCommandId","mapEmptyState","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","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-api-contracts/src/extension-kernel/webview-protocol.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-resource-actions.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-structure.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","export const EXTENSION_EVENTS_SCOPE = \"extension.events\";\n/** Host event sent with `{ type: \"changed\" }` after a listed resource's actions may have changed. */\nexport const RESOURCE_ACTIONS_EVENTS_SCOPE = \"resources.actions\";\n\nexport const artifactMountId = (mount: string | { id: string }) => (typeof mount === \"string\" ? mount : mount.id);\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 WebviewPointerEvent,\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 sizing?: \"content-width\";\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 sizing,\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 const [contentWidth, setContentWidth] = 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 dispatchPointerEvent: (event: WebviewPointerEvent) => {\n if (iframeRef.current !== iframe || !iframe.isConnected) return;\n if (event.type !== \"pointerdown\" && event.type !== \"click\") return;\n const bounds = iframe.getBoundingClientRect();\n if (!bounds.width || !bounds.height) return;\n // Outside-interaction layers need the host iframe as their target, including\n // when the iframe belongs to the menu itself. Guest DOM stays sandboxed.\n iframe.dispatchEvent(\n new PointerEvent(event.type, {\n ...event,\n bubbles: true,\n composed: true,\n cancelable: true,\n clientX: bounds.left + event.clientX * (bounds.width / iframe.clientWidth),\n clientY: bounds.top + event.clientY * (bounds.height / iframe.clientHeight),\n }),\n );\n },\n contentWidthChanged: (width: number) => {\n if (sizing === \"content-width\" && Number.isFinite(width) && width >= 0) setContentWidth(width);\n },\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 sizing,\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, sizing, 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, width: sizing === \"content-width\" ? contentWidth : \"100%\" }}>\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\n position=\"relative\"\n width={props.sizing ? \"max-content\" : \"full\"}\n height=\"full\"\n minH=\"0\"\n display=\"flex\"\n flexDirection=\"column\"\n >\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 \"harnesses.read\": z.object({ harnessId: identifier.optional(), model: z.string().optional() }),\n \"resources.actions\": z.discriminatedUnion(\"operation\", [\n z.object({ operation: z.literal(\"list\"), resource: extensionResourceRefSchema }),\n z.object({ operation: z.literal(\"execute\"), resource: extensionResourceRefSchema, key: identifier }),\n ]),\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 const readHarnesses = adapters.harnesses?.read.bind(adapters.harnesses);\n return {\n \"harnesses.read\": capability(\"harnesses.read\", readHarnesses),\n \"resources.actions\": capability(\"resources.actions\", adapters.resourceActions),\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 { WebviewHostCapabilityParams } from \"pstdio-api-contracts/extension-kernel\";\nimport { RESOURCE_ACTIONS_EVENTS_SCOPE } from \"pstdio-api-contracts/extension-kernel\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { WorkbenchCore } from \"../../core\";\nimport { orderMenuEntries, resolveMenuEntries } from \"../../react/menus/menu-entries\";\nimport { resolveResourceActionMenu, subscribeResourceActionChanges } from \"../../react/menus/resource-action-menu\";\n\n// Tells a frame to list again once actions may have changed. The subscription\n// starts on the first list and ends when the frame disconnects.\nconst createChangeNotifier = (workbench: WorkbenchCore, hostEvents: HostEventPublisher | undefined) => {\n let stop: (() => void) | undefined;\n let pending = false;\n const emit = () => {\n if (pending) return;\n pending = true;\n queueMicrotask(() => {\n pending = false;\n hostEvents?.emit({ scope: RESOURCE_ACTIONS_EVENTS_SCOPE, payload: { type: \"changed\" } });\n });\n };\n return () => {\n if (!hostEvents || stop) return;\n const unsubscribe = subscribeResourceActionChanges(workbench, emit);\n const stopOnDisconnect = hostEvents.onDisconnect(() => stop?.());\n stop = () => {\n unsubscribe();\n stopOnDisconnect();\n stop = undefined;\n };\n };\n};\n\nexport const createWebviewResourceActions = (\n workbench: WorkbenchCore,\n projectId: string | undefined,\n hostEvents: HostEventPublisher | undefined,\n) => {\n const watchChanges = createChangeNotifier(workbench, hostEvents);\n return async (input: WebviewHostCapabilityParams[\"resources.actions\"]) => {\n // The host owns the project scope; webviews cannot reach another project's resources.\n const menu = resolveResourceActionMenu(workbench, projectId ? { ...input.resource, projectId } : input.resource);\n const entries = menu ? orderMenuEntries(resolveMenuEntries(menu)) : [];\n if (input.operation === \"execute\") {\n const entry = entries.find(({ id }) => id === input.key);\n if (!entry?.run || entry.disabled) throw new Error(\"This resource action is no longer available.\");\n await entry.run();\n return [];\n }\n watchChanges();\n return entries.map((entry) => ({\n key: entry.id,\n label: entry.label,\n commandId: entry.commandId,\n icon: entry.icon,\n iconSrc: entry.iconSrc,\n description: entry.description,\n isDisabled: entry.disabled,\n separatorBefore: entry.separatorBefore,\n group: entry.group ?? menu?.group,\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\";\nimport { createWebviewResourceActions } from \"./webview-resource-actions\";\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 resourceActions: createWebviewResourceActions(workbench, projectId, hostEvents),\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 if (notice.type === \"error\") {\n workbench.notifications.captureActionError(\n notice.title ?? \"Extension action\",\n placement?.instanceId,\n )(new Error(notice.message));\n return;\n }\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 },\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 sizing?: \"content-width\";\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 sizing={input.sizing}\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 sizing: panel.region === \"status\" ? \"content-width\" : undefined,\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 { resolveCommandResourceParams } from \"../../core/registries/commands/command-resource-params\";\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 reportNavigationError = context.workbench.notifications.captureActionError(\"Open command result\");\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 reportNavigationError(error);\n }\n }\n }\n return response;\n};\nexport const executeWorkbenchExtensionCommand = async (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const command = context.metadata?.commands.find((candidate) => candidate.id === commandId);\n const params = command\n ? { ...resolveCommandResourceParams(command.params, input.params, { resource: input.resource }), ...input.params }\n : input.params;\n const persist = async () =>\n unwrapCommandValue(await executeWorkbenchExtensionCommandResponse(context, commandId, { ...input, params }));\n return command ? runResourceMutation(context, command, params, { resource: input.resource }, persist) : 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 {\n KanbanRendererBoardColumnConfig as WireBoardColumnConfig,\n KanbanRendererRow as WireRow,\n} 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 { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\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 target = (row as WireRow).target;\n const mapped =\n cached?.signature === signature\n ? cached.row\n : {\n ...toWorkbenchRow(row, rowResource),\n ...(target\n ? {\n target: toWorkbenchNavigationTarget(target, {\n extensionId: record.extensionId,\n projectId: context.projectId,\n }),\n }\n : {}),\n };\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 { text } from \"pstdio-extensions/workbench\";\nimport type { ResourceRef } from \"../../core\";\nimport type { ExtensionTreeRendererRecord } from \"./tree-renderer-contribution-types\";\n\nexport const extensionTreeStructure = (record: ExtensionTreeRendererRecord, resource?: ResourceRef) =>\n (record.structure ?? []).map((section) => ({\n id: section.id,\n label: text(section.label),\n collapsible: section.collapsible,\n hiddenByDefault: section.hiddenByDefault,\n canHide: section.canHide,\n loading: !section.resourceNode,\n nodes:\n section.resourceNode && resource\n ? [\n {\n id: section.resourceNode.id,\n label: resource.label ?? resource.id ?? resource.type,\n icon: section.resourceNode.icon,\n resource,\n selected: true,\n },\n ]\n : [],\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\";\nimport { extensionTreeStructure } from \"./tree-renderer-structure\";\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 getStructure: record.structure ? (ctx) => extensionTreeStructure(record, ctx.resource) : undefined,\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 sizing: renderInput.panel.region === \"status\" ? \"content-width\" : undefined,\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 panelHeaders: \"legacy\",\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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"}
|