@pstdio/workbench 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/extensions.d.ts +325 -40
- package/dist/extensions.js +1813 -1439
- package/dist/extensions.js.map +1 -1
- package/dist/index.d.ts +193 -13
- package/dist/index.js +2429 -2014
- package/dist/index.js.map +1 -1
- package/dist/layout-types-DMoZz38-.js.map +1 -1
- package/dist/react.d.ts +178 -10
- package/dist/react.js +2008 -1917
- package/dist/react.js.map +1 -1
- package/dist/storage.d.ts +6 -2
- package/dist/testing.d.ts +167 -8
- package/dist/webview-runtime.js +1 -1
- package/dist/webview-runtime.js.map +1 -1
- package/dist/{workbench-built-ins-BncLJfQA.js → workbench-built-ins-BCJ6-fIM.js} +464 -466
- package/dist/workbench-built-ins-BCJ6-fIM.js.map +1 -0
- package/dist/workbench-menu-paths-D-e7iscN.js +43 -0
- package/dist/workbench-menu-paths-D-e7iscN.js.map +1 -0
- package/dist/workflow-status-settings-DLiu9FZ0.js +144 -0
- package/dist/workflow-status-settings-DLiu9FZ0.js.map +1 -0
- package/package.json +4 -4
- package/dist/icon-B9XolQG8.js +0 -35
- package/dist/icon-B9XolQG8.js.map +0 -1
- package/dist/workbench-built-ins-BncLJfQA.js.map +0 -1
- package/dist/workbench-menu-paths-Bb0ICxeG.js +0 -20
- package/dist/workbench-menu-paths-Bb0ICxeG.js.map +0 -1
package/dist/extensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sources":["../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/theme.ts","../../pstdio-extensions/src/bridge/host/extension-frame.tsx","../../pstdio-extensions/src/bridge/host/host-event-publisher.ts","../src/extensions/bridge/terminal-session-capability.ts","../src/extensions/bridge/webview-host-capabilities.ts","../src/extensions/bridge/bridge-webview-renderer.tsx","../../pstdio-api-contracts/src/extension-kernel/slots.ts","../../pstdio-api-contracts/src/extension-kernel/kernel-slots.ts","../../pstdio-api-contracts/src/extension-kernel/l10n.ts","../../pstdio-extensions/src/workbench/shared/localization.ts","../src/extensions/host/command-response.ts","../src/extensions/host/workbench-extension-command.ts","../src/extensions/host/extension-navigation-target.ts","../src/extensions/contributions/command-palette-resource-contributions.ts","../src/extensions/contributions/composition-contributions.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/contributions/panel-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.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/kanban-renderer-contribution-helpers.ts","../src/extensions/contributions/kanban-renderer-contributions.ts","../src/extensions/contributions/param-schema-localization.ts","../src/extensions/contributions/tree-renderer-host-defaults.ts","../src/extensions/contributions/tree-renderer-panels.ts","../src/extensions/contributions/tree-renderer-contributions.ts","../src/extensions/bridge/webview-command-capabilities.ts","../src/extensions/contributions/route-contributions.ts","../src/extensions/shared/workbench-targets.ts","../src/extensions/contributions/tree-item-contributions.ts","../src/extensions/host/workbench-extension-host.ts","../src/extensions/host/workbench-extension-refresh.ts"],"sourcesContent":["import type { HostCapabilityRequest } from \"./index\";\n\nexport const WEBVIEW_HOST_CAPABILITY_VERSION = 1;\n\n// Capabilities a webview must declare in its manifest before the bridge will route them.\nexport const WEBVIEW_DECLARABLE_CAPABILITIES = [\n \"commands.execute\",\n \"resource.open\",\n \"notification.show\",\n \"notification.action\",\n \"notification.resolve\",\n \"notification.dismiss\",\n \"preferences.get\",\n \"preferences.set\",\n \"extension.settings.all\",\n \"extension.settings.get\",\n \"extension.settings.set\",\n \"extension.settings.delete\",\n \"terminal.session\",\n \"files.upload\",\n \"files.list\",\n \"files.delete\",\n] as const;\n\n// Runtime plumbing the guest invokes on its own (e.g. keyboard forwarding). These are\n// enabled whenever the host implements them, with no manifest declaration required.\nexport const ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES = [\"host.dispatchKeyboardEvent\"] as const;\n\nexport const WEBVIEW_HOST_CAPABILITIES = [\n ...WEBVIEW_DECLARABLE_CAPABILITIES,\n ...ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n] as const;\n\nexport type WebviewHostCapability = (typeof WEBVIEW_HOST_CAPABILITIES)[number];\nexport type WebviewDeclarableCapability = (typeof WEBVIEW_DECLARABLE_CAPABILITIES)[number];\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);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability => publicCapabilityNames.has(name);\n\nconst parseCapabilityDeclaration = (capability: string) => {\n const [name, versionText] = capability.split(\"@\");\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name: name ?? \"\", version };\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\n // Always-available capabilities never need a declaration — enable them wherever the\n // host implements them.\n for (const name of ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES) {\n if (capabilities[name]) allowed.add(name);\n }\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\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 if (!capabilities[parsed.name]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n allowed.add(parsed.name);\n }\n\n return { allowed, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\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\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method)) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n if (!allowed.has(request.method)) {\n const diagnostic = undeclaredCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n return await handler(request.params);\n },\n };\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","import type { ThemePreference } from \"../contract\";\n\nexport const collectChakraThemeVariables = () => {\n if (typeof document === \"undefined\") return {};\n\n const computed = getComputedStyle(document.documentElement);\n const variables: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) {\n const name = computed.item(index);\n if (name.startsWith(\"--chakra-\")) {\n variables[name] = computed.getPropertyValue(name).trim();\n }\n }\n return variables;\n};\n\nexport const resolveActiveTheme = (fallback: ThemePreference): ThemePreference => {\n if (typeof document === \"undefined\") return fallback;\n const value = document.documentElement.getAttribute(\"data-theme\");\n if (value === \"dark\" || value === \"light\") return value;\n\n const colorMode = document.documentElement.getAttribute(\"data-color-mode\");\n return colorMode === \"dark\" || colorMode === \"light\" ? colorMode : fallback;\n};\n\nexport const postThemeToFrame = (\n iframe: HTMLIFrameElement | null,\n theme: ThemePreference,\n variables: Record<string, string>,\n) => {\n iframe?.contentWindow?.postMessage({ type: \"pstdio.theme\", theme, variables }, \"*\");\n};\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { host } from \"rimless\";\nimport type {\n ExtensionViewDescriptor,\n HostCapabilityRegistry,\n HostCapabilityRequest,\n HostEventMessage,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"../contract\";\nimport { createHostCapabilityGate } from \"../contract\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\nimport type { HostEventPublisher } from \"./host-event-publisher\";\nimport { collectChakraThemeVariables, resolveActiveTheme } from \"./theme\";\n\nexport interface ExtensionFrameProps {\n view: ExtensionViewDescriptor;\n props: unknown;\n theme: ThemePreference;\n capabilities?: HostCapabilityRegistry;\n /** Publisher whose emitted events are forwarded into the guest once connected. */\n hostEvents?: HostEventPublisher;\n onReady?: () => void;\n onError?: (error: { message: string; stack?: string }) => void;\n onDiagnostics?: (diagnostics: WebviewCapabilityDiagnostic[]) => void;\n title?: string;\n}\n\ntype GuestRemote = {\n init: (message: {\n moduleUrl: string;\n styles: string[];\n props: unknown;\n theme: ThemePreference;\n themeVariables: Record<string, string>;\n }) => Promise<void>;\n themeUpdate: (message: { theme: ThemePreference; variables: Record<string, string> }) => void;\n propsUpdate: (message: { props: unknown }) => void;\n hostEvent?: (message: HostEventMessage) => void;\n};\n\nconst iframeStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n flex: \"1 1 0%\",\n height: \"100%\",\n minHeight: 0,\n width: \"100%\",\n};\n\nconst frameShellStyle: CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n minHeight: 0,\n position: \"relative\",\n width: \"100%\",\n};\n\nconst errorOverlayStyle: CSSProperties = {\n alignItems: \"center\",\n background: \"rgba(255, 255, 255, 0.92)\",\n color: \"#7a1f12\",\n display: \"flex\",\n inset: 0,\n justifyContent: \"center\",\n padding: \"24px\",\n position: \"absolute\",\n textAlign: \"center\",\n zIndex: 1,\n};\n\nexport const EXTENSION_IFRAME_SANDBOX = \"allow-scripts allow-forms allow-popups\";\n\nexport const ExtensionFrame = (props: ExtensionFrameProps) => {\n const {\n view,\n props: extensionProps,\n theme,\n capabilities,\n hostEvents,\n onReady,\n onError,\n onDiagnostics,\n title,\n } = props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const remoteRef = useRef<GuestRemote | null>(null);\n const initializedRef = useRef(false);\n const connectedKeyRef = useRef<string | null>(null);\n const propsRef = useRef(extensionProps);\n const themeRef = useRef(theme);\n const capabilitiesRef = useRef(capabilities);\n const hostEventsRef = useRef(hostEvents);\n const declaredCapabilitiesRef = useRef(view.webview.capabilities);\n const onReadyRef = useRef(onReady);\n const onErrorRef = useRef(onError);\n const onDiagnosticsRef = useRef(onDiagnostics);\n const [runtimeError, setRuntimeError] = useState<string | null>(null);\n // Bumped when the browser reloads the iframe (e.g. a DOM reparent while the Side\n // Panel floats). The bump remounts a fresh iframe so a single clean connection\n // owns the new browsing context.\n const [frameEpoch, setFrameEpoch] = useState(0);\n\n propsRef.current = extensionProps;\n themeRef.current = theme;\n capabilitiesRef.current = capabilities;\n hostEventsRef.current = hostEvents;\n declaredCapabilitiesRef.current = view.webview.capabilities;\n onReadyRef.current = onReady;\n onErrorRef.current = onError;\n onDiagnosticsRef.current = onDiagnostics;\n\n // Connect once per iframe (keyed by runtime/module URL). React StrictMode dev double-mount and\n // parent re-renders with unstable prop references (e.g. `webview.styles` rebuilt by\n // `.map`) would otherwise tear down the live connection while the iframe keeps its\n // state, leaving guest-to-host RPCs with no listener.\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n // Moving the iframe in the DOM (e.g. the Side Panel switching between attached and\n // floating hosts) reloads it to about:blank because the src attribute is empty. A\n // load event after a completed boot therefore means the runtime document is gone;\n // bumping the epoch remounts a fresh iframe and re-runs this effect. The listener\n // attaches before the connected guard so StrictMode's dev-only remount cannot\n // leave the iframe without one.\n const onFrameLoad = () => {\n if (!initializedRef.current) return;\n setFrameEpoch((epoch) => epoch + 1);\n };\n iframe.addEventListener(\"load\", onFrameLoad);\n const removeLoadListener = () => iframe.removeEventListener(\"load\", onFrameLoad);\n\n const connectedKey = `${frameEpoch}\\n${view.webview.runtimeUrl}\\n${view.webview.moduleUrl}`;\n if (connectedKeyRef.current === connectedKey) return removeLoadListener;\n connectedKeyRef.current = connectedKey;\n\n // Snapshot styles at connect time so subsequent parent re-renders that produce a\n // new array reference don't affect what we send in init.\n const stylesAtConnect = view.webview.styles;\n const moduleUrlAtConnect = view.webview.moduleUrl;\n\n const reportDiagnostics = (diagnostics: WebviewCapabilityDiagnostic[]) => {\n if (diagnostics.length > 0) onDiagnosticsRef.current?.(diagnostics);\n };\n\n const createCapabilityGate = () =>\n createHostCapabilityGate({\n capabilities: capabilitiesRef.current ?? {},\n declaredCapabilities: declaredCapabilitiesRef.current,\n onDiagnostic: (diagnostic) => reportDiagnostics([diagnostic]),\n });\n\n reportDiagnostics(createCapabilityGate().diagnostics);\n\n const hostApi = {\n ready: () => {\n // no-op; init fires from host.connect().then() below.\n },\n runtimeError: (payload: { message: string; stack?: string }) => {\n setRuntimeError(payload.message);\n onErrorRef.current?.(payload);\n },\n call: async (request: HostCapabilityRequest) => {\n return await createCapabilityGate().call(request);\n },\n };\n\n const connect = () => {\n initializedRef.current = false;\n remoteRef.current = null;\n\n const connection = host.connect(iframe, hostApi);\n // A sandboxed iframe without allow-same-origin posts messages with origin \"null\".\n // Leaving the iframe src attribute empty lets rimless validate the guest by\n // contentWindow identity while still loading the API-owned runtime document.\n iframe.contentWindow?.location.replace(view.webview.runtimeUrl);\n\n connection\n .then(async (conn) => {\n 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 });\n initializedRef.current = true;\n setRuntimeError(null);\n onReadyRef.current?.();\n })\n .catch((error) => {\n const normalized = normalizeRuntimeError(error);\n setRuntimeError(normalized.message);\n onErrorRef.current?.(normalized);\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.webview.runtimeUrl, view.webview.moduleUrl, view.webview.styles]);\n\n // Re-renders may hand the frame a fresh publisher (renderers rebuild their\n // capability context per render); route it to the live connection.\n useEffect(() => {\n const remote = remoteRef.current;\n if (!remote || !hostEvents) return;\n hostEvents.bind((message) => remote.hostEvent?.(message));\n // Release the sink so a replaced publisher stops referencing this remote\n // and returns to buffering.\n return () => hostEvents.unbind();\n }, [hostEvents]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.propsUpdate({ props: extensionProps });\n }, [extensionProps]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(theme),\n variables: collectChakraThemeVariables(),\n });\n }, [theme]);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof MutationObserver === \"undefined\") return;\n\n let frame: number | null = null;\n const schedule = () => {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = null;\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(themeRef.current),\n variables: collectChakraThemeVariables(),\n });\n });\n };\n\n const observer = new MutationObserver(schedule);\n const options = { attributeFilter: [\"class\", \"data-color-mode\", \"data-theme\", \"style\"], attributes: true };\n observer.observe(document.documentElement, options);\n observer.observe(document.body, options);\n\n return () => {\n observer.disconnect();\n if (frame !== null) cancelAnimationFrame(frame);\n };\n }, []);\n\n return (\n <div style={frameShellStyle}>\n {runtimeError ? (\n <div role=\"alert\" style={errorOverlayStyle}>\n <div>\n <strong>Extension view failed to load.</strong>\n <div>{runtimeError}</div>\n </div>\n </div>\n ) : null}\n <iframe\n key={frameEpoch}\n ref={iframeRef}\n title={title ?? view.label}\n allow=\"fullscreen\"\n allowFullScreen\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 // Moving the iframe in the DOM (e.g. the Side Panel switching between attached\n // and floating hosts) reloads it to about:blank because the src attribute is\n // empty. A load event after a completed boot therefore means the runtime\n // document is gone; bumping the epoch remounts a fresh iframe and reconnects.\n onLoad={() => {\n if (initializedRef.current) setFrameEpoch((epoch) => epoch + 1);\n }}\n onError={() => {\n const message = `Failed to load extension runtime at ${view.webview.runtimeUrl}`;\n setRuntimeError(message);\n onErrorRef.current?.({ message });\n }}\n />\n </div>\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 type { TerminalHostEvent, TerminalSessionOperation, TerminalSessionResult } from \"@pstdio/sdk/api\";\nimport type { HostCapability } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { WorkbenchTerminalController } from \"../../core\";\n\nexport const TERMINAL_SESSION_EVENT_SCOPE = \"terminal.session\";\n\ninterface CreateTerminalSessionCapabilityInput {\n terminal: WorkbenchTerminalController;\n hostEvents: HostEventPublisher;\n}\n\n/**\n * Host side of the `terminal.session` webview capability. Sessions live in the\n * workbench terminal controller; only serializable operation payloads and session\n * ids cross the webview boundary. Output/exit events flow through the host event\n * publisher under the `terminal.session` scope.\n */\nexport const createTerminalSessionCapability = (input: CreateTerminalSessionCapabilityInput): HostCapability => {\n const { terminal, hostEvents } = input;\n\n const emit = (payload: TerminalHostEvent) => {\n hostEvents.emit({ scope: TERMINAL_SESSION_EVENT_SCOPE, payload });\n };\n\n return async (params) => {\n const operation = params as TerminalSessionOperation;\n\n switch (operation.operation) {\n case \"open\": {\n const { sessionId } = await terminal.open({ request: operation.request });\n return { operation: \"open\", sessionId } satisfies TerminalSessionResult;\n }\n case \"write\":\n terminal.write({ sessionId: operation.sessionId, data: operation.data });\n return { operation: \"write\", accepted: true } satisfies TerminalSessionResult;\n case \"resize\":\n terminal.resize({ sessionId: operation.sessionId, cols: operation.cols, rows: operation.rows });\n return { operation: \"resize\", accepted: true } satisfies TerminalSessionResult;\n case \"kill\":\n await terminal.kill({ sessionId: operation.sessionId, signal: operation.signal });\n return { operation: \"kill\", accepted: true } satisfies TerminalSessionResult;\n case \"subscribe\": {\n const { sessionId } = operation;\n let unsubscribeTerminal = () => {};\n let unsubscribeDisconnect = () => {};\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n unsubscribeTerminal();\n unsubscribeDisconnect();\n };\n\n unsubscribeTerminal = terminal.subscribe(sessionId, {\n onData: (chunk) => emit({ sessionId, kind: \"data\", chunk }),\n onExit: (exit) => {\n emit({ sessionId, kind: \"exit\", code: exit.code, signal: exit.signal });\n close();\n },\n });\n unsubscribeDisconnect = hostEvents.onDisconnect(close);\n return { operation: \"subscribe\", accepted: true } satisfies TerminalSessionResult;\n }\n }\n };\n};\n","import type { ExtensionResourceOpenIntent } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { PreferenceScopeRef, PreferenceValue, ResourceRef, WorkbenchCore } from \"../../core\";\nimport { createTerminalSessionCapability } from \"./terminal-session-capability\";\n\ninterface CreateWorkbenchWebviewHostCapabilitiesInput {\n dispatchKeyboardEvent?: (event: KeyboardEventInit) => void;\n workbench: WorkbenchCore;\n /** Event channel into the guest; terminal.session is only offered when present. */\n hostEvents?: HostEventPublisher;\n}\n\nconst dispatchDocumentKeyboardEvent = (params: KeyboardEventInit) => {\n if (typeof document === \"undefined\") return;\n const event = new KeyboardEvent(\"keydown\", { ...params, bubbles: true, cancelable: true });\n document.dispatchEvent(event);\n};\n\nexport const toOpenResourceInput = (input: ExtensionResourceOpenIntent | undefined) => {\n if (!input?.strategy || input.strategy === \"persistent\") return {};\n return { replaceActive: true };\n};\n\nexport const createWorkbenchWebviewHostCapabilities = (input: CreateWorkbenchWebviewHostCapabilitiesInput) =>\n ({\n \"commands.execute\": (params: unknown) => {\n const request = params as { commandId: string; params?: unknown };\n return input.workbench.commands.executeCommand(request.commandId, request.params);\n },\n \"resource.open\": (params: unknown) => {\n const request = params as { input?: ExtensionResourceOpenIntent; resource?: ResourceRef };\n if (!request.resource) throw new Error(\"resource.open requires a resource.\");\n return input.workbench.resources.openResource(request.resource, toOpenResourceInput(request.input));\n },\n \"notification.show\": (params: unknown) => {\n const notification = params as Parameters<WorkbenchCore[\"notifications\"][\"show\"]>[0];\n return input.workbench.notifications.show({\n level: notification.level,\n message: notification.message,\n title: notification.title,\n });\n },\n \"preferences.get\": (params: unknown) => {\n const request = params as { name: string; scope?: PreferenceScopeRef };\n return input.workbench.preferences.getValue(request.name, request.scope);\n },\n \"preferences.set\": (params: unknown) => {\n const request = params as { name: string; scope?: PreferenceScopeRef; value: PreferenceValue };\n input.workbench.preferences.setValue(request.name, request.value, request.scope ?? { scope: \"user\" });\n return { name: request.name, value: request.value };\n },\n \"host.dispatchKeyboardEvent\": (params: unknown) =>\n (input.dispatchKeyboardEvent ?? dispatchDocumentKeyboardEvent)(params as KeyboardEventInit),\n ...(input.hostEvents\n ? {\n \"terminal.session\": createTerminalSessionCapability({\n terminal: input.workbench.terminal,\n hostEvents: input.hostEvents,\n }),\n }\n : {}),\n }) satisfies HostCapabilityRegistry;\n","import type {\n HostCapabilityRegistry,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"pstdio-extensions/bridge/contract\";\nimport { createHostEventPublisher, ExtensionFrame, type HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type {\n WorkbenchCore,\n WorkbenchPanelInstance,\n WorkbenchPanelRenderInput,\n WorkbenchRendererRegistration,\n} from \"../../core\";\nimport { createWorkbenchWebviewHostCapabilities } from \"./webview-host-capabilities\";\n\nconst logWebviewDiagnostics = (webviewId: string, diagnostics: WebviewCapabilityDiagnostic[]) => {\n for (const diagnostic of diagnostics) {\n console.warn(`[workbench.webview:${webviewId}] ${diagnostic.code}/${diagnostic.capability}: ${diagnostic.message}`);\n }\n};\n\nconst logWebviewError = (webviewId: string, message: string) => {\n console.error(`[workbench.webview:${webviewId}] runtime error: ${message}`);\n};\n\nexport interface BridgeWebviewRenderContext {\n workbench: WorkbenchCore;\n webviewId: string;\n placement: WorkbenchPanelInstance;\n /** Channel for pushing host events (e.g. terminal output) into this webview. */\n hostEvents: HostEventPublisher;\n}\n\n// How guest capability calls reach the host. Hosts inject this to swap the workbench-native\n// wiring for their own — e.g. the dashboard routes `commands.execute` through its REST API.\nexport type CreateBridgeWebviewHostCapabilities = (context: BridgeWebviewRenderContext) => HostCapabilityRegistry;\n\n// What the host pushes into the guest's props store. Hosts inject this to forward dynamic\n// data — e.g. the dashboard forwards extension command outcomes and theme preference.\nexport type CreateBridgeWebviewProps = (context: BridgeWebviewRenderContext) => unknown;\nexport type CreateBridgeWebviewTheme = (context: BridgeWebviewRenderContext) => ThemePreference;\n\ninterface CreateBridgeWebviewRendererInput {\n createHostCapabilities?: CreateBridgeWebviewHostCapabilities;\n createProps?: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n}\n\nexport const BRIDGE_WEBVIEW_RENDERER_ID = \"webview:bridge\";\n\nexport interface BridgeWebviewConfig {\n title?: string;\n runtimeUrl: string;\n moduleUrl: string;\n styles?: string[];\n capabilities?: string[];\n}\n\nconst isBridgeWebviewConfig = (value: unknown): value is BridgeWebviewConfig => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const config = value as Partial<BridgeWebviewConfig>;\n return typeof config.runtimeUrl === \"string\" && typeof config.moduleUrl === \"string\";\n};\n\nconst createPlacementProps: CreateBridgeWebviewProps = ({ placement }) => ({\n placement,\n resource: placement.resource,\n});\n\nconst createLightTheme: CreateBridgeWebviewTheme = () => \"light\";\n\nconst hostEventPublishersByWorkbench = new WeakMap<WorkbenchCore, Map<string, HostEventPublisher>>();\n\nexport const getBridgeWebviewHostEventPublisher = (workbench: WorkbenchCore, instance: WorkbenchPanelInstance) => {\n let hostEventsByWidget = hostEventPublishersByWorkbench.get(workbench);\n if (!hostEventsByWidget) {\n hostEventsByWidget = new Map();\n hostEventPublishersByWorkbench.set(workbench, hostEventsByWidget);\n }\n\n const key = instance.instanceId;\n let hostEvents = hostEventsByWidget.get(key);\n if (!hostEvents) {\n hostEvents = createHostEventPublisher();\n hostEventsByWidget.set(key, hostEvents);\n }\n\n return hostEvents;\n};\n\nexport const renderBridgeWebviewFrame = (input: {\n context: BridgeWebviewRenderContext;\n createHostCapabilities: CreateBridgeWebviewHostCapabilities;\n createProps: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n ownerId?: string;\n title: string;\n webview: BridgeWebviewConfig;\n}) => {\n const {\n context,\n createHostCapabilities,\n createProps,\n createTheme = createLightTheme,\n ownerId,\n title,\n webview,\n } = input;\n return (\n <ExtensionFrame\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 theme={createTheme(context)}\n capabilities={createHostCapabilities(context)}\n hostEvents={context.hostEvents}\n onDiagnostics={(diagnostics) => logWebviewDiagnostics(context.webviewId, diagnostics)}\n onError={(error) => logWebviewError(context.webviewId, error.message)}\n />\n );\n};\n\nconst renderBridgeWebview = (\n input: WorkbenchPanelRenderInput,\n createHostCapabilities: CreateBridgeWebviewHostCapabilities,\n createProps: CreateBridgeWebviewProps,\n createTheme: CreateBridgeWebviewTheme,\n) => {\n const { workbench, panel, instance } = input;\n const webview = isBridgeWebviewConfig(panel.config) ? panel.config : null;\n if (!webview) return null;\n\n return renderBridgeWebviewFrame({\n context: {\n workbench,\n webviewId: instance.panelId,\n placement: instance,\n hostEvents: getBridgeWebviewHostEventPublisher(workbench, instance),\n },\n createHostCapabilities,\n createProps,\n createTheme,\n ownerId: \"ownerId\" in panel ? panel.ownerId : undefined,\n title: panel.title,\n webview,\n });\n};\n\nexport const createBridgeWebviewRenderer = (input: CreateBridgeWebviewRendererInput = {}) => {\n const createHostCapabilities = input.createHostCapabilities ?? createWorkbenchWebviewHostCapabilities;\n const createProps = input.createProps ?? createPlacementProps;\n const createTheme = input.createTheme ?? createLightTheme;\n\n return {\n id: BRIDGE_WEBVIEW_RENDERER_ID,\n render: (renderInput) => renderBridgeWebview(renderInput, createHostCapabilities, createProps, createTheme),\n } satisfies WorkbenchRendererRegistration;\n};\n","import type { Struct } from \"./types/json\";\nimport type { SlotOptions, SlotRef, UiSlotKind } from \"./types/slots\";\n\n/**\n * Define a host-owned UI slot that extension contributions can target.\n */\nexport const defineSlot = <TContext extends Struct = Struct, TKind extends UiSlotKind = UiSlotKind>(\n id: string,\n options: SlotOptions<TKind>,\n): SlotRef<TContext, TKind> => ({\n id,\n kind: options.kind,\n label: options.label,\n description: options.description,\n metadata: options.metadata,\n});\n","import { eventRef } from \"./refs\";\nimport { defineSlot } from \"./slots\";\nimport type { ExtensionWorkspace } from \"./types/context\";\nimport type { Struct } from \"./types/json\";\nimport type { ResourceAnchor } from \"./types/resources\";\n\n/** How a workspace's working tree is backed. `root` = the repo checkout itself; `cloud` is reserved. */\nexport type WorkspaceType = \"worktree\" | \"root\" | \"cloud\";\n\nexport interface WorkspaceProvisionPayload {\n projectId: string;\n workspaceId: string;\n workspace: ExtensionWorkspace;\n /** Absolute working directory to materialize files into — a worktree path or the repo root. */\n workspaceDir: string;\n repoPath: string;\n branch?: string;\n type: WorkspaceType;\n}\n\nexport interface SessionLifecyclePayload {\n projectId: string;\n sessionId: string;\n sessionStatus?: string;\n originalSessionId?: string;\n workspace?: ExtensionWorkspace;\n workspaceId?: string;\n worktreePath?: string;\n branch?: string;\n anchors?: ResourceAnchor[];\n}\n\nexport interface WorktreeRemovedPayload {\n projectId: string;\n repoPath?: string;\n worktreePath: string;\n workspace?: ExtensionWorkspace;\n workspaceId?: string;\n anchors?: ResourceAnchor[];\n}\n\nexport interface CommitPayload {\n projectId: string;\n repoPath?: string;\n worktreePath?: string;\n branch?: string;\n commitSha?: string;\n workspace?: ExtensionWorkspace;\n anchors?: ResourceAnchor[];\n}\n\nexport interface RebasePayload {\n projectId: string;\n repoPath?: string;\n worktreePath?: string;\n branch?: string;\n workspace?: ExtensionWorkspace;\n anchors?: ResourceAnchor[];\n}\n\nexport interface MergePayload extends CommitPayload {}\n\nexport interface ConflictPayload {\n projectId: string;\n operation: \"rebase\" | \"merge\";\n repoPath?: string;\n worktreePath?: string;\n branch?: string;\n workspace?: ExtensionWorkspace;\n anchors?: ResourceAnchor[];\n}\n\nexport const projectSlots = {\n sidenav: defineSlot<Struct, \"panel\">(\"project.sidenav\", { kind: \"panel\" }),\n headerPrimary: defineSlot<Struct, \"menu\">(\"project.headerPrimary\", { kind: \"menu\" }),\n headerOverflow: defineSlot<Struct, \"menu\">(\"project.headerOverflow\", { kind: \"menu\" }),\n settingsPanels: defineSlot<Struct, \"settings\">(\"project.settingsPanels\", { kind: \"settings\" }),\n};\n\nexport const sessionSlots = {\n headerPrimary: defineSlot<Struct, \"menu\">(\"session.headerPrimary\", { kind: \"menu\" }),\n headerOverflow: defineSlot<Struct, \"menu\">(\"session.headerOverflow\", { kind: \"menu\" }),\n transcriptActions: defineSlot<Struct, \"menu\">(\"session.transcriptActions\", { kind: \"menu\" }),\n};\n\nexport const workspaceSlots = {\n headerPrimary: defineSlot<Struct, \"menu\">(\"workspace.headerPrimary\", { kind: \"menu\" }),\n headerOverflow: defineSlot<Struct, \"menu\">(\"workspace.headerOverflow\", { kind: \"menu\" }),\n sidenav: defineSlot<Struct, \"panel\">(\"workspace.sidenav\", { kind: \"panel\" }),\n};\n\nexport const projectEvents = {\n opened: eventRef<{ projectId: string }>(\"project.opened\"),\n};\n\nexport const sessionEvents = {\n started: eventRef<SessionLifecyclePayload & { anchors?: ResourceAnchor[] }>(\"session.started\"),\n resumed: eventRef<SessionLifecyclePayload>(\"session.resumed\"),\n awaitingInput: eventRef<SessionLifecyclePayload>(\"session.awaitingInput\"),\n succeeded: eventRef<SessionLifecyclePayload>(\"session.succeeded\"),\n failed: eventRef<SessionLifecyclePayload>(\"session.failed\"),\n completed: eventRef<SessionLifecyclePayload & { anchors?: ResourceAnchor[] }>(\"session.completed\"),\n};\n\nexport const workspaceEvents = {\n created: eventRef<{ workspace: ExtensionWorkspace }>(\"workspace.created\"),\n /** Awaited: harness extensions sync their agent dir into the working tree. Gates workspace readiness. */\n provision: eventRef<WorkspaceProvisionPayload>(\"workspace.provision\"),\n /** Fire-and-forget after the workspace is ready: background setup (deps install, builds). */\n ready: eventRef<WorkspaceProvisionPayload>(\"workspace.ready\"),\n archived: eventRef<{ workspace: ExtensionWorkspace }>(\"workspace.archived\"),\n deleted: eventRef<{ workspace: ExtensionWorkspace }>(\"workspace.deleted\"),\n};\n\nexport const worktreeEvents = {\n removed: eventRef<WorktreeRemovedPayload>(\"worktree.removed\"),\n};\n\nexport const gitEvents = {\n committed: eventRef<CommitPayload>(\"git.committed\"),\n rebased: eventRef<RebasePayload>(\"git.rebased\"),\n merged: eventRef<MergePayload>(\"git.merged\"),\n conflicted: eventRef<ConflictPayload>(\"git.conflicted\"),\n};\n","export interface LocalizedString {\n readonly $l10n: string;\n readonly default?: string;\n}\n\nexport type Localizable<T extends string = string> = T | LocalizedString;\n\nexport const l10n = (key: string, defaultValue?: string) => ({\n $l10n: key,\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n});\n\nexport const isLocalizedString = (value: unknown): value is LocalizedString =>\n typeof value === \"object\" &&\n value !== null &&\n \"$l10n\" in value &&\n typeof (value as { $l10n?: unknown }).$l10n === \"string\";\n","import 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 { CommandExecuteResponse } from \"@pstdio/sdk/api\";\n\nexport const unwrapCommandValue = (result: unknown) => {\n const response = result as Partial<CommandExecuteResponse> | undefined;\n if (!response?.outcome) return result;\n if (response.outcome.status === \"success\") return response.outcome.value;\n throw new Error(response.outcome.reason ?? response.outcome.error?.message ?? \"Extension command failed.\");\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { ResourceRef, WorkbenchModuleContext } from \"../../core\";\nimport { unwrapCommandValue } from \"./command-response\";\n\nexport interface WorkbenchExtensionCommandContext {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\n\nexport interface ExecuteWorkbenchExtensionCommandInput {\n metadata?: Record<string, unknown>;\n params?: Record<string, unknown>;\n resource?: ResourceRef;\n slot?: CommandExecuteRequest[\"slot\"];\n}\n\nexport const toExtensionCommandResource = (resource: ResourceRef | undefined): CommandExecuteRequest[\"resource\"] => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nexport const toWorkbenchResource = (resource: NonNullable<CommandExecuteRequest[\"resource\"]>): ResourceRef => {\n const icon = (resource as { icon?: unknown }).icon;\n const metadata = resource.projectId ? { ...resource.metadata, projectId: resource.projectId } : resource.metadata;\n return {\n kind: resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`,\n id: resource.id,\n label: resource.label,\n icon: typeof icon === \"string\" ? icon : undefined,\n metadata,\n };\n};\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});\n\nexport const executeWorkbenchExtensionCommand = async (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const resource = toExtensionCommandResource(input.resource);\n const response = await context.executeCommand(commandId, {\n projectId: context.projectId,\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 return unwrapCommandValue(response);\n};\n","import type { ExtensionNavigationTarget, ExtensionPlacementStrategy } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTarget, NavigationTargetCommand, ResourceRef, WorkbenchRegion } from \"../../core\";\nimport { toWorkbenchResource } from \"./workbench-extension-command\";\n\nexport interface ExtensionNavigationSourcePlacement {\n instanceId: string;\n}\n\nexport interface ToWorkbenchNavigationTargetInput {\n commandIdOf?(command: unknown): string | undefined;\n commandTargetOf?(target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>): NavigationTargetCommand;\n resourceOf?(\n resource: Parameters<typeof toWorkbenchResource>[0],\n target: Extract<ExtensionNavigationTarget, { kind: \"resource\" }>,\n ): ResourceRef;\n sourcePlacement?: ExtensionNavigationSourcePlacement;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n\nconst isCommand = (value: unknown) => typeof value === \"string\" || (isRecord(value) && typeof value.id === \"string\");\n\nconst isResource = (value: unknown) =>\n isRecord(value) && typeof value.type === \"string\" && typeof value.id === \"string\";\n\nconst isResourceTarget = (target: Record<string, unknown>) => {\n if (!isResource(target.resource)) return false;\n if (target.input === undefined) return true;\n if (!isRecord(target.input)) return false;\n const strategy = target.input.strategy;\n return strategy === undefined || strategy === \"persistent\" || strategy === \"replace-active\";\n};\n\nconst isPanelTarget = (target: Record<string, unknown>) => {\n if (typeof target.panel !== \"string\") return false;\n if (target.input === undefined) return true;\n if (!isRecord(target.input)) return false;\n const strategy = target.input.strategy;\n const region = target.input.region;\n return (\n (region === undefined || typeof region === \"string\") &&\n (strategy === undefined ||\n strategy === \"persistent\" ||\n strategy === \"preview\" ||\n strategy === \"replace-active\" ||\n strategy === \"replace-invoking\")\n );\n};\n\nconst isItemTarget = (value: unknown): value is Exclude<ExtensionNavigationTarget, { kind: \"compound\" }> => {\n if (!isRecord(value)) return false;\n if (value.kind === \"resource\") return isResourceTarget(value);\n if (value.kind === \"panel\") return isPanelTarget(value);\n return value.kind === \"command\" && isCommand(value.command) && (value.params === undefined || isRecord(value.params));\n};\n\nexport const isExtensionNavigationTarget = (value: unknown): value is ExtensionNavigationTarget => {\n if (isItemTarget(value)) return true;\n return (\n isRecord(value) &&\n value.kind === \"compound\" &&\n Array.isArray(value.targets) &&\n value.targets.length > 0 &&\n value.targets.every(isItemTarget)\n );\n};\n\nconst toResourceInput = (\n strategy: \"persistent\" | \"replace-active\" | undefined,\n _sourcePlacement: ExtensionNavigationSourcePlacement | undefined,\n) => {\n if (!strategy || strategy === \"persistent\") return {};\n return { replaceActive: true };\n};\n\nconst toPanelInput = (\n input: { region?: string; strategy?: ExtensionPlacementStrategy } | undefined,\n sourcePlacement: ExtensionNavigationSourcePlacement | undefined,\n) => {\n const strategy = input?.strategy;\n const shared = input?.region ? { region: input.region as WorkbenchRegion } : {};\n if (!strategy) return shared;\n if (strategy === \"persistent\" || strategy === \"preview\" || strategy === \"replace-active\") {\n return { ...shared, strategy: { kind: strategy } } as const;\n }\n if (!sourcePlacement) throw new Error(\"replace-invoking requires a live source placement.\");\n return { ...shared, strategy: { kind: \"replace-panel\", instanceId: sourcePlacement.instanceId } } as const;\n};\n\nconst toCommandTarget = (\n target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>,\n input: ToWorkbenchNavigationTargetInput,\n) => {\n const override = input.commandTargetOf?.(target);\n if (override) return override;\n const commandId =\n input.commandIdOf?.(target.command) ?? (typeof target.command === \"string\" ? target.command : target.command.id);\n return { kind: \"command\", commandId, args: target.params } satisfies NavigationTargetCommand;\n};\n\n// The return type stays explicit: the compound branch recurses, and TypeScript\n// cannot infer the return type of a self-referencing function.\nexport const toWorkbenchNavigationTarget = (\n target: ExtensionNavigationTarget,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget => {\n if (target.kind === \"resource\") {\n // A section only means something with the caller's container context\n // (tree id, target node). Failing loudly beats silently dropping the\n // requested section.\n if (target.section && !input.resourceOf) {\n throw new Error(\"Resource targets with a section need a resourceOf translator that encodes the section.\");\n }\n return {\n kind: \"resource\",\n resource: input.resourceOf ? input.resourceOf(target.resource, target) : toWorkbenchResource(target.resource),\n input: toResourceInput(target.input?.strategy, input.sourcePlacement),\n };\n }\n if (target.kind === \"panel\") {\n return { kind: \"panel\", panelId: target.panel, input: toPanelInput(target.input, input.sourcePlacement) };\n }\n if (target.kind === \"command\") return toCommandTarget(target, input);\n return {\n kind: \"compound\",\n targets: target.targets.map(\n (item) => toWorkbenchNavigationTarget(item, input) as Exclude<NavigationTarget, { kind: \"compound\" }>,\n ),\n };\n};\n\nexport const toWorkbenchNavigationTargetResult = (\n value: unknown,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget | undefined => {\n if (value === undefined || value === null) return undefined;\n if (!isExtensionNavigationTarget(value)) throw new Error(\"Renderer callback returned an invalid navigation target.\");\n return toWorkbenchNavigationTarget(value, input);\n};\n","import type { WorkbenchExtensionCommandPaletteResourceRecord } from \"@pstdio/sdk/api\";\nimport type { ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { CommandPaletteResourceResult, Disposable } from \"../../core\";\nimport { FILE_SECTION_NAVIGATION_METADATA_KEY } from \"../../core/registries/renderers/file-section-navigation\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} 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: ExtensionNavigationTarget;\n}\n\ninterface ProviderQueryResult {\n items?: ResourceItem[];\n}\n\nconst isProviderQueryResult = (value: unknown): value is ProviderQueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst commandIdOf = (command: Extract<ExtensionNavigationTarget, { kind: \"command\" }>[\"command\"]) =>\n typeof command === \"string\" ? command : command.id;\n\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.command), { params: target.params });\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\n await context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(target, {\n resourceOf: (resource, resourceTarget) => {\n const resolved = toWorkbenchResource(resource);\n if (!resourceTarget.section) return resolved;\n return {\n ...resolved,\n metadata: {\n ...resolved.metadata,\n [FILE_SECTION_NAVIGATION_METADATA_KEY]: {\n treeId: record.id,\n targetNodeId: item.id,\n anchors: resourceTarget.section.anchors,\n },\n },\n };\n },\n }),\n );\n};\n\nconst toResult = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n groupLabel: string,\n item: ResourceItem,\n): CommandPaletteResourceResult => ({\n id: `${record.id}:${item.id}`,\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});\n\nexport const registerWorkbenchExtensionCommandPaletteResources = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionCommandPaletteResourceRecord[],\n) => {\n const disposables: Disposable[] = [];\n\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 }) => {\n const activeResource = context.workbench.getActiveResource();\n const value = await executeWorkbenchExtensionCommand(context, record.queryCommandId, {\n params: {\n projectId: context.projectId,\n modeId: context.workbench.modes.getActiveModeId(),\n activeResource: toExtensionCommandResource(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\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import { resolveComposition } from \"../../core/registries/layout/composition-resolver\";\nimport type {\n CompositionModeDefinition,\n CompositionPanelDefinition,\n CompositionResourceKindDefinition,\n CompositionResourcePanelEdge,\n DockedCompositionRegion,\n PersistedCompositionLayout,\n ResolvedComposition,\n ResolvedCompositionPlacement,\n WorkbenchComposition,\n} from \"../../core/registries/layout/composition-resolver-types\";\nimport { dockedCompositionRegions } from \"../../core/registries/layout/composition-resolver-types\";\nimport type { LayoutModel } from \"../../core/registries/layout/layout-model-types\";\nimport type { NotificationRegistry } from \"../../core/registries/notifications/notification-registry\";\nimport { createDisposable, type Disposable } from \"../../core/shared/disposable\";\n\n// The composition registry holds normalized PS-266 records for the workbench. It\n// registers capabilities and recipes only; every placement decision belongs to the\n// composition resolver.\nexport interface WorkbenchCompositionRegistry {\n registerResourceKind(definition: CompositionResourceKindDefinition): Disposable;\n registerPanelCapability(definition: CompositionPanelDefinition): Disposable;\n registerResourcePanel(edge: CompositionResourcePanelEdge): Disposable;\n registerModeComposition(definition: CompositionModeDefinition): Disposable;\n getComposition(): WorkbenchComposition;\n getModeComposition(modeId: string): CompositionModeDefinition | undefined;\n}\n\ninterface DeclaredPanelPlacement {\n for?: string;\n region: DockedCompositionRegion;\n allowedRegions?: readonly DockedCompositionRegion[];\n required?: boolean;\n defaultOpen?: boolean;\n pinned?: boolean;\n}\n\nexport const toPanelPlacements = (show: DeclaredPanelPlacement | readonly DeclaredPanelPlacement[] | undefined) => {\n if (!show) return [];\n const placements = Array.isArray(show) ? show : [show];\n return placements.map(({ for: resourceKind, ...placement }) => ({ ...placement, resourceKind }));\n};\n\nexport const createWorkbenchCompositionRegistry = (): WorkbenchCompositionRegistry => {\n const resourceKinds: CompositionResourceKindDefinition[] = [];\n const panels: CompositionPanelDefinition[] = [];\n const resourcePanels: CompositionResourcePanelEdge[] = [];\n const modes = new Map<string, CompositionModeDefinition>();\n\n const remove = <T>(list: T[], item: T) =>\n createDisposable(() => {\n const index = list.indexOf(item);\n if (index >= 0) list.splice(index, 1);\n });\n\n return {\n registerResourceKind(definition) {\n resourceKinds.push(definition);\n return remove(resourceKinds, definition);\n },\n registerPanelCapability(definition) {\n panels.push(definition);\n return remove(panels, definition);\n },\n registerResourcePanel(edge) {\n resourcePanels.push(edge);\n return remove(resourcePanels, edge);\n },\n registerModeComposition(definition) {\n modes.set(definition.id, definition);\n return createDisposable(() => {\n if (modes.get(definition.id) === definition) modes.delete(definition.id);\n });\n },\n getComposition: () => ({\n resourceKinds: [...resourceKinds],\n panels: [...panels],\n resourcePanels: [...resourcePanels],\n }),\n getModeComposition: (modeId) => modes.get(modeId),\n };\n};\n\ninterface CompositionReconcileContext {\n layout: LayoutModel;\n notifications: NotificationRegistry;\n}\n\nconst extractPersistedState = (\n layout: ReturnType<LayoutModel[\"getLayout\"]>,\n knownPanelIds: ReadonlySet<string>,\n): PersistedCompositionLayout => {\n const regions: PersistedCompositionLayout[\"regions\"] = {};\n for (const region of dockedCompositionRegions) {\n const state = layout.regions[region];\n const order = state.widgets\n .filter((placement) => knownPanelIds.has(placement.contributionId))\n .map((placement) => placement.contributionId);\n const active = state.widgets.find((placement) => placement.widgetId === state.activeWidgetId);\n regions[region] = {\n order,\n activePanelId: active && knownPanelIds.has(active.contributionId) ? active.contributionId : undefined,\n };\n }\n return { regions };\n};\n\nexport const listCompositionAddablePanels = (input: {\n registry: WorkbenchCompositionRegistry;\n modeId: string;\n layout: ReturnType<LayoutModel[\"getLayout\"]>;\n resourceKind?: string;\n}) => {\n const mode = input.registry.getModeComposition(input.modeId);\n if (!mode) return [];\n const composition = input.registry.getComposition();\n const knownPanelIds = new Set(composition.panels.map((panel) => panel.id));\n return resolveComposition({\n context: { modeId: input.modeId, resourceKind: input.resourceKind },\n mode,\n composition,\n persisted: extractPersistedState(input.layout, knownPanelIds),\n }).addablePanels;\n};\n\n// A panel declares only what it can render, so its role comes from where the recipe\n// puts it: main holds Locations, which tab beside each other, and every other docked\n// region holds Sub Panels of the active Location.\nconst placementRole = (region: DockedCompositionRegion) => (region === \"main\" ? \"location\" : \"sub-panel\");\n\n// Opens or corrects one resolved placement. A placement sitting in a region the\n// recipe no longer allows moves to the resolved region; a valid user move stays.\nconst applyPlacement = (ctx: CompositionReconcileContext, placement: ResolvedCompositionPlacement) => {\n const current = ctx.layout.getLayout();\n const existingRegion = dockedCompositionRegions.find((region) =>\n current.regions[region].widgets.some((candidate) => candidate.contributionId === placement.panelId),\n );\n const open = () =>\n ctx.layout.openWidget(placement.panelId, {\n region: placement.region,\n closable: !placement.required,\n pinned: placement.pinned,\n role: placementRole(placement.region),\n });\n\n if (!existingRegion) {\n if (placement.origin === \"persisted\" || placement.origin === \"default\" || placement.required) open();\n return;\n }\n if (!placement.allowedRegions.includes(existingRegion)) {\n open();\n return;\n }\n const existing = current.regions[existingRegion].widgets.find(\n (candidate) => candidate.contributionId === placement.panelId,\n );\n if (!existing) return;\n const role = placementRole(existingRegion);\n const closable = !placement.required;\n if ((existing.closable ?? true) !== closable || existing.pinned !== placement.pinned || existing.role !== role) {\n ctx.layout.updateWidgetPlacement(existing.widgetId, { closable, pinned: placement.pinned, role });\n }\n};\n\n// Restoring required structure must not steal the user's active tabs.\nconst restoreActiveTabs = (\n ctx: CompositionReconcileContext,\n activeBefore: ReadonlyMap<DockedCompositionRegion, string | undefined>,\n) => {\n for (const [region, activeWidgetId] of activeBefore) {\n if (!activeWidgetId) continue;\n const current = ctx.layout.getLayout().regions[region];\n if (current.activeWidgetId === activeWidgetId) continue;\n if (current.widgets.some((widget) => widget.widgetId === activeWidgetId)) {\n ctx.layout.setRegionActiveWidget(region, activeWidgetId);\n }\n }\n};\n\n// An unresolved required placement shows one diagnostic under a stable id and leaves\n// a usable location in main, so repeated reconciliation updates the same message.\nconst reportRequiredFallback = (ctx: CompositionReconcileContext, modeId: string, resolved: ResolvedComposition) => {\n const notificationId = compositionRequiredNotificationId(modeId);\n if (!resolved.requiredFallback) {\n ctx.notifications.dismiss(notificationId);\n return;\n }\n const fallbackPanelId = resolved.requiredFallback.panelId;\n const placed = ctx.layout\n .getLayout()\n .regions.main.widgets.some((placement) => placement.contributionId === fallbackPanelId);\n if (!placed) ctx.layout.openWidget(fallbackPanelId, { region: \"main\", pinned: true, role: \"location\" });\n ctx.notifications.show({\n id: notificationId,\n level: \"error\",\n title: \"A required panel could not be placed\",\n message: resolved.diagnostics.map((diagnostic) => diagnostic.message).join(\" \"),\n });\n};\n\nexport const compositionRequiredNotificationId = (modeId: string) => `workbench.composition.required.${modeId}`;\n\n// Applies the registered composition to the docked layout for one mode-resource\n// context. `seeding` says which job this call is doing, and only the mode registry\n// knows: it seeds a scope once, and reconciles on every later activation. Seeding\n// places the mode's whole recipe. Reconciling restores missing required structure,\n// enforces resolved closability, and keeps the user's optional choices, tab order, and\n// moves. Both report an unresolved required placement under a stable notification id,\n// so repeated reconciliation updates the same message instead of stacking toasts.\nexport const reconcileCompositionLayout = (\n ctx: CompositionReconcileContext,\n input: { registry: WorkbenchCompositionRegistry; modeId: string; resourceKind?: string; seeding?: boolean },\n) => {\n const mode = input.registry.getModeComposition(input.modeId);\n if (!mode) return undefined;\n const composition = input.registry.getComposition();\n const knownPanelIds = new Set(composition.panels.map((panel) => panel.id));\n const layout = ctx.layout.getLayout();\n const persisted = input.seeding ? undefined : extractPersistedState(layout, knownPanelIds);\n\n const resolved = resolveComposition({\n context: { modeId: input.modeId, resourceKind: input.resourceKind },\n mode,\n composition,\n persisted,\n });\n\n const activeBefore = new Map<DockedCompositionRegion, string | undefined>(\n dockedCompositionRegions.map((region) => [region, ctx.layout.getLayout().regions[region].activeWidgetId]),\n );\n\n for (const placement of resolved.placements) applyPlacement(ctx, placement);\n restoreActiveTabs(ctx, activeBefore);\n ctx.layout.reconcilePanelMenus();\n reportRequiredFallback(ctx, input.modeId, resolved);\n\n return resolved;\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 = NonNullable<WorkbenchExtensionMetadata[\"panels\"][number][\"webview\"]>;\n\nexport const toBridgeWebviewConfig = (webview: WorkbenchWebview): BridgeWebviewConfig => ({\n title: text(webview.title),\n runtimeUrl: webview.runtimeUrl,\n moduleUrl: webview.moduleUrl,\n styles: webview.styles,\n capabilities: webview.capabilities,\n});\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n WorkbenchModuleContext,\n WorkbenchPanelContribution,\n WorkbenchPanelMenuDefinition,\n} from \"../../core\";\nimport { BRIDGE_WEBVIEW_RENDERER_ID } from \"../bridge/bridge-webview-renderer\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\n\ntype ExtensionPanelRecord = WorkbenchExtensionMetadata[\"panels\"][number];\ntype ExtensionPanelMenu = NonNullable<ExtensionPanelRecord[\"panelMenus\"]>[number];\ntype ExtensionResourcePanels = WorkbenchExtensionMetadata[\"resourcePanels\"];\n\nexport interface RegisterWorkbenchExtensionPanelInput {\n contribution: WorkbenchPanelContribution;\n workbench: WorkbenchModuleContext;\n}\n\n// Panels keep manifest declaration order until the user reorders them.\nexport const declarationPriority = (declarationIndex = 0) => ({ priority: -declarationIndex });\n\n// A panel with an unscoped placement is available without a resource. Otherwise,\n// its own scoped placements and cross-extension edges define the kinds it serves.\nexport const panelResourceKinds = (\n panel: ExtensionPanelRecord,\n resourcePanels: ExtensionResourcePanels | undefined,\n) => {\n const show = panel.show ? (Array.isArray(panel.show) ? panel.show : [panel.show]) : [];\n if (show.some((placement) => placement.for === undefined)) return undefined;\n const kinds = [\n ...show.flatMap((placement) => (placement.for ? [placement.for] : [])),\n ...(resourcePanels ?? []).filter((edge) => edge.panel === panel.id).map((edge) => edge.resourceKind),\n ].filter((kind, index, all) => all.indexOf(kind) === index);\n return kinds.length > 0 ? kinds : undefined;\n};\n\nconst panelDefaultRegion = (panel: ExtensionPanelRecord) => {\n const show = panel.show ? (Array.isArray(panel.show) ? panel.show : [panel.show]) : [];\n return show[0]?.region ?? \"main\";\n};\n\n// Registers a metadata panel as a workbench widget. The widget's region is only the\n// fallback for direct opens; the composition resolver places the panel per active\n// mode-resource context and owns required-state closability.\nexport const toWorkbenchCompositionPanelContribution = (input: {\n panel: ExtensionPanelRecord;\n rendererId: string;\n declarationIndex: number;\n menuDeclarationOffset: number;\n resourcePanels?: ExtensionResourcePanels;\n config?: WorkbenchPanelContribution[\"config\"];\n}): WorkbenchPanelContribution => ({\n id: input.panel.id,\n title: text(input.panel.title, input.panel.id),\n icon: input.panel.icon,\n region: panelDefaultRegion(input.panel),\n rendererId: input.rendererId,\n singleton: true,\n resourceKinds: panelResourceKinds(input.panel, input.resourcePanels),\n panelMenus: toWorkbenchPanelMenus(input.panel.panelMenus, input.menuDeclarationOffset),\n config: input.config,\n ...declarationPriority(input.declarationIndex),\n});\n\n// Panel menus tie-break by manifest declaration order across every owner panel,\n// not just within one panel. Returns each panel's menu count prefix so callers\n// can hand every menu a unique declaration index in manifest order.\nexport const panelMenuDeclarationOffsets = <T extends { panelMenus?: readonly unknown[] }>(\n panels: readonly T[],\n): number[] => {\n const offsets: number[] = [];\n let total = 0;\n for (const panel of panels) {\n offsets.push(total);\n total += panel.panelMenus?.length ?? 0;\n }\n return offsets;\n};\n\nconst panelMenuRendererId = (menu: ExtensionPanelMenu) => {\n const rendererId = menu.renderer?.id ?? (menu.webview ? BRIDGE_WEBVIEW_RENDERER_ID : undefined);\n if (!rendererId) throw new Error(`Panel Menu has no renderer: ${menu.id}`);\n return rendererId;\n};\n\nconst menuPlacementBasePriority = { first: 1_000_000, default: 0, last: -1_000_000 } as const;\n\nexport const toWorkbenchPanelMenus = (\n menus: readonly ExtensionPanelMenu[] | undefined,\n declarationOffset = 0,\n): WorkbenchPanelMenuDefinition[] | undefined =>\n menus?.map((menu, index) => ({\n id: menu.id,\n title: text(menu.title, menu.id),\n side: menu.side,\n rendererId: panelMenuRendererId(menu),\n config: menu.webview ? toBridgeWebviewConfig(menu.webview) : undefined,\n priority: menuPlacementBasePriority[menu.placement ?? \"default\"] - (declarationOffset + index),\n }));\n\nexport const registerWorkbenchExtensionPanel = (input: RegisterWorkbenchExtensionPanelInput): Disposable =>\n input.workbench.layout.registerPanel(input.contribution);\n\nexport const panelRendererId = (\n panel: ExtensionPanelRecord,\n kind: NonNullable<ExtensionPanelRecord[\"renderer\"]>[\"kind\"],\n) => (panel.renderer?.kind === kind ? panel.renderer.id : undefined);\n","import type { WorkbenchExtensionControlsRendererRecord, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { ControlsQueryResult, Disposable, ResourceRef } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n} from \"../host/workbench-extension-command\";\nimport {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n toWorkbenchCompositionPanelContribution,\n} from \"./panel-contributions\";\n\ntype ControlsViewRecord = WorkbenchExtensionMetadata[\"panels\"][number];\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\n\nconst isQueryResult = (value: unknown): value is ControlsQueryResult =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport interface WorkbenchExtensionControlsAdapter {\n /** Supply a fallback resource when the widget placement carries none. */\n resolveResource?: (record: WorkbenchExtensionControlsRendererRecord) => ResourceRef | undefined;\n}\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 = (commandId: string | undefined, params: Record<string, unknown>, resource?: ResourceRef) =>\n commandId\n ? executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n projectId: context.projectId,\n ...(resource ? { resource: toExtensionCommandResource(resource) } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n slot,\n metadata: { controlsRendererId: record.id },\n })\n : Promise.resolve(undefined);\n\n return context.workbench.renderers.registerControlsRenderer({\n id: record.id,\n title: localize(record.title, record.id),\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n defaultValues: record.defaultValues,\n executeQuery: async (resource) => {\n const value = await run(record.queryHandlerId, {}, resource ?? adapter.resolveResource?.(record));\n return isQueryResult(value) ? value : {};\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// A panel that references a controls renderer places it into a panel — the widget is\n// keyed by the panel id and rendered by the referenced controls renderer, mirroring\n// tree/file renderer panel widgets.\nconst registerControlsViewWidget = (\n context: WorkbenchExtensionCommandContext,\n panel: ControlsViewRecord,\n index: number,\n menuDeclarationOffset: number,\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"],\n) => {\n const rendererId = panelRendererId(panel, \"controls\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels,\n }),\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 panels: ControlsViewRecord[],\n adapter: WorkbenchExtensionControlsAdapter = {},\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"] = [],\n): Disposable => {\n const disposables: Disposable[] = [];\n\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n const menuOffsets = panelMenuDeclarationOffsets(panels);\n panels.forEach((panel, index) => {\n const disposable = registerControlsViewWidget(context, panel, index, menuOffsets[index]!, resourcePanels);\n if (disposable) disposables.push(disposable);\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 { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { WorkbenchExtensionDataTableRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type {\n DataTableRendererColumn,\n DataTableRendererQueryResult,\n DataTableRendererRow,\n Disposable,\n ResourceRef,\n} from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport { toWorkbenchNavigationTargetResult } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\nimport {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n toWorkbenchCompositionPanelContribution,\n} from \"./panel-contributions\";\n\ntype DataTableViewRecord = WorkbenchExtensionMetadata[\"panels\"][number];\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\n\ntype WireColumn = NonNullable<WorkbenchExtensionDataTableRendererRecord[\"columns\"]>[number];\n\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});\n\nconst isQueryResult = (\n value: unknown,\n): value is {\n rows: Array<{ id: string; values: Record<string, unknown>; resource?: Parameters<typeof toWorkbenchResource>[0] }>;\n columns?: WorkbenchExtensionDataTableRendererRecord[\"columns\"];\n} => Boolean(value && typeof value === \"object\" && Array.isArray((value as { rows?: unknown }).rows));\n\nconst toRow = (row: {\n id: string;\n values: Record<string, unknown>;\n resource?: Parameters<typeof toWorkbenchResource>[0];\n}): DataTableRendererRow => ({\n id: row.id,\n values: row.values,\n resource: row.resource ? toWorkbenchResource(row.resource) : undefined,\n});\n\nconst registerRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionDataTableRendererRecord,\n) => {\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 = (commandId: string, params: Record<string, unknown>, resource?: ResourceRef, modeId?: string) =>\n executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n projectId: context.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource: toExtensionCommandResource(resource) } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n slot,\n metadata: { dataTableRendererId: record.id },\n });\n\n return context.workbench.renderers.registerDataTableRenderer({\n id: record.id,\n title: localize(record.title, record.id),\n resourceKind: record.resourceKind,\n columns: record.columns?.map(toColumn),\n initialPageSize: record.initialPageSize,\n pageSizeOptions: record.pageSizeOptions,\n selectionMode: record.selectionMode,\n selectionActions: record.selectionActions?.map((action) => ({\n id: action.id,\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 }) => {\n const value = await run(record.queryHandlerId, {}, resource, modeId);\n if (!isQueryResult(value)) return { rows: [] };\n const rows = value.rows.map((row) => {\n const mapped = toRow(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 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.renderers.refreshDataTableRenderer(record.id);\n },\n })),\n onRowActivate: record.rowActivationHandlerId\n ? async (row) => {\n const result = await run(record.rowActivationHandlerId!, { row: originalRows.get(row) ?? row }, row.resource);\n const target = toWorkbenchNavigationTargetResult(result);\n if (target) await context.workbench.navigation.openTarget(target);\n }\n : undefined,\n });\n};\n\nconst registerView = (\n context: WorkbenchExtensionCommandContext,\n panel: DataTableViewRecord,\n index: number,\n menuDeclarationOffset: number,\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"],\n) => {\n const rendererId = panelRendererId(panel, \"dataTable\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels,\n }),\n });\n};\n\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n panels: DataTableViewRecord[],\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"] = [],\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record));\n const menuOffsets = panelMenuDeclarationOffsets(panels);\n panels.forEach((panel, index) => {\n const disposable = registerView(context, panel, index, menuOffsets[index]!, resourcePanels);\n if (disposable) disposables.push(disposable);\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 {\n ExtensionCommandPaletteContribution,\n ExtensionMenuContribution,\n WorkbenchExtensionMetadata,\n} from \"@pstdio/sdk/api\";\nimport { isLocalizedString, type Localizable } from \"@pstdio/sdk/extensions\";\nimport type { Command, MenuItem, MenuPath, ResourceBrowseEntry, ResourceRef } from \"../../core\";\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 type WorkbenchExtensionRoute = WorkbenchExtensionMetadata[\"routes\"][number];\n\nexport interface WorkbenchExtensionRouteResourceInput {\n route: WorkbenchExtensionRoute;\n}\n\nexport interface WorkbenchExtensionMenuSlotConfig {\n menuPath: MenuPath;\n group?: string;\n overflowLabel?: string;\n}\n\nexport type WorkbenchExtensionMenuWhenBuilder = (contribution: ExtensionMenuContribution) => string | undefined;\nexport type WorkbenchExtensionStringResolver = (value: Localizable<string> | undefined, extensionId: string) => string;\n\nexport interface WorkbenchExtensionMenuRegistration {\n command: Command;\n contribution: ExtensionMenuContribution;\n menuItem: MenuItem;\n menuPath: MenuPath;\n targetCommandId: string;\n}\n\nexport interface WorkbenchExtensionCommandPaletteRegistration {\n command: Command;\n contribution: ExtensionCommandPaletteContribution;\n menuItem: MenuItem;\n targetCommandId: string;\n}\n\nexport const emptyWorkbenchExtensionMetadata = {\n commands: [],\n commandPaletteContributions: [],\n diagnostics: [],\n extensions: [],\n menuContributions: [],\n modes: [],\n routes: [],\n kanbanRenderers: [],\n dataTableRenderers: [],\n treeRenderers: [],\n fileRenderers: [],\n settingsPanels: [],\n settingsDefinitions: [],\n treeItems: [],\n panels: [],\n} satisfies WorkbenchExtensionMetadata;\n\nconst defaultWorkbenchExtensionCommandId = (contribution: ExtensionMenuContribution) =>\n `workbench.extension.menu.${contribution.id}`;\n\nconst defaultWorkbenchExtensionPaletteCommandId = (contribution: ExtensionCommandPaletteContribution) =>\n `workbench.extension.palette.${contribution.id}`;\n\nconst contributionOrder = (contribution: { placement?: ExtensionContributionPlacement }, index: number) =>\n placementOrder[contribution.placement ?? \"default\"] * 1000 + index;\n\nconst text: WorkbenchExtensionStringResolver = (value) => {\n if (value === undefined) return \"\";\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n\nconst createMenuItem = (input: {\n contribution: ExtensionMenuContribution;\n commandId: string;\n index: number;\n slot: WorkbenchExtensionMenuSlotConfig;\n when?: string;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString, slot, when } = input;\n\n return {\n commandId,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: slot.group ?? contribution.group,\n args: contribution.params,\n overflowLabel: slot.overflowLabel,\n order: contributionOrder(contribution, index),\n when,\n } satisfies MenuItem;\n};\n\nconst createPaletteItem = (input: {\n contribution: ExtensionCommandPaletteContribution;\n commandId: string;\n index: number;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString } = input;\n\n return {\n commandId,\n 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: WorkbenchExtensionMetadata;\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\n metadata.menuContributions.forEach((contribution, index) => {\n const slot = contribution.target\n ? menuTargetsById?.get(contribution.target)\n : menuSlotsById.get(contribution.slotId);\n if (!slot) return;\n\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: command?.params,\n },\n contribution,\n menuItem: createMenuItem({\n commandId,\n contribution,\n index,\n resolveString,\n slot,\n when: createWhenExpression?.(contribution),\n }),\n menuPath: slot.menuPath,\n targetCommandId: contribution.commandId,\n });\n });\n\n return registrations;\n};\n\nexport const buildWorkbenchExtensionCommandPaletteRegistrations = (input: {\n metadata: WorkbenchExtensionMetadata;\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: command?.params,\n },\n contribution,\n menuItem: createPaletteItem({ commandId, contribution, index, resolveString }),\n targetCommandId: contribution.commandId,\n });\n });\n\n return registrations;\n};\n\nexport const buildWorkbenchExtensionRouteEntries = (input: {\n metadata: WorkbenchExtensionMetadata | undefined;\n createResource: (resourceInput: WorkbenchExtensionRouteResourceInput) => ResourceRef;\n}) => {\n const { createResource, metadata } = input;\n if (!metadata) return [] as ResourceBrowseEntry[];\n\n return metadata.routes.map((route) => ({\n resource: createResource({ route }),\n }));\n};\n","import type { CommandExecuteRequest, CommandExecuteResponse, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\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 {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n toWorkbenchCompositionPanelContribution,\n} from \"./panel-contributions\";\n\ntype FileRendererRecord = NonNullable<WorkbenchExtensionMetadata[\"fileRenderers\"]>[number];\ntype ViewRecord = WorkbenchExtensionMetadata[\"panels\"][number];\n\nexport interface RegisterWorkbenchExtensionFileRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\n\ninterface ExtensionResource {\n type: string;\n id: string;\n label?: string;\n metadata?: Record<string, unknown>;\n}\n\nconst toExtensionResource = (resource: ResourceRef | undefined): ExtensionResource | undefined => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nconst slotContext = (input: { projectId: string; rendererId: string; resource?: ExtensionResource }) => ({\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});\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) => {\n const ext = toExtensionResource(resource);\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params: {\n renderer: {\n rendererId,\n projectId: input.projectId,\n ...(ext ? { resource: ext } : {}),\n invocation: { placement: \"visible\" },\n },\n ...extra,\n },\n resource: ext,\n slot: slotContext({ projectId: input.projectId, rendererId, resource: ext }),\n source: \"dashboard\",\n ...(metadata ? { metadata } : {}),\n });\n return unwrapCommandValue(result);\n};\n\nconst revisionFromValue = (value: unknown) => {\n if (!value || typeof value !== \"object\") return undefined;\n const revision = (value as { revision?: unknown }).revision;\n return typeof revision === \"string\" ? revision : undefined;\n};\n\nexport const fileRendererRefreshEnvelopeFromCommand = (\n body: CommandExecuteRequest,\n response: CommandExecuteResponse,\n): FileRendererRefreshEnvelope | undefined => {\n const metadata = body.metadata;\n const origin = metadata?.fileRendererOrigin;\n if (!origin || typeof origin !== \"object\") return undefined;\n const candidate = origin as Partial<FileRendererRefreshOrigin>;\n if (\n typeof candidate.rendererId !== \"string\" ||\n typeof candidate.instanceId !== \"string\" ||\n typeof candidate.operationId !== \"string\"\n ) {\n return undefined;\n }\n const resourceUri = metadata?.fileRendererResourceUri;\n const revision = revisionFromValue(response.outcome.value);\n return {\n origin: {\n rendererId: candidate.rendererId,\n instanceId: candidate.instanceId,\n operationId: candidate.operationId,\n },\n ...(typeof resourceUri === \"string\" ? { resourceUri } : {}),\n ...(revision ? { revision } : {}),\n };\n};\n\nconst registerFileRenderer = (input: RegisterWorkbenchExtensionFileRenderersInput, record: FileRendererRecord) =>\n input.workbench.renderers.registerFileRenderer({\n id: record.id,\n title: text(record.title, record.id),\n resourceKind: record.resourceKind,\n load: async (resource) => {\n const result = await executeFileCommand(input, record.id, record.loadHandlerId, resource);\n return (result ?? {}) as FileRendererContent;\n },\n save: record.saveHandlerId\n ? async (resource, content, origin) => {\n const result = await executeFileCommand(\n input,\n record.id,\n record.saveHandlerId as string,\n resource,\n { content },\n {\n ...(origin ? { fileRendererOrigin: origin } : {}),\n ...(resource?.uri ? { fileRendererResourceUri: resource.uri } : {}),\n },\n );\n const revision = revisionFromValue(result);\n return revision ? { revision } : undefined;\n }\n : undefined,\n });\n\nconst registerFileViewWidget = (\n input: RegisterWorkbenchExtensionFileRenderersInput,\n panel: ViewRecord,\n index: number,\n menuDeclarationOffset: number,\n) => {\n const rendererId = panelRendererId(panel, \"file\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels: input.metadata.resourcePanels,\n }),\n });\n};\n\nexport const registerWorkbenchExtensionFileRenderers = (input: RegisterWorkbenchExtensionFileRenderersInput) => {\n const disposables: Disposable[] = [];\n\n for (const record of input.metadata.fileRenderers ?? []) {\n disposables.push(registerFileRenderer(input, record));\n }\n\n const menuOffsets = panelMenuDeclarationOffsets(input.metadata.panels);\n input.metadata.panels.forEach((panel, index) => {\n const disposable = registerFileViewWidget(input, panel, index, menuOffsets[index]!);\n if (disposable) disposables.push(disposable);\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 { WorkbenchExtensionKanbanRendererRecord } from \"@pstdio/sdk/api\";\nimport type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type {\n AttributeDescriptor,\n KanbanRendererContribution,\n KanbanRendererCreateField,\n KanbanRendererCreateFieldType,\n ResourceRef,\n} from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\n\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;\n\nexport interface MutableAttributeSource {\n source: KanbanRendererContribution[\"attributes\"];\n set(attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined): void;\n}\n\nexport const isQueryResult = (value: unknown): value is QueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst localizeAttributes = (\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n): AttributeDescriptor[] =>\n (attributes ?? []).map((attribute) => {\n const base: AttributeDescriptor = {\n ...attribute,\n label: localize(attribute.label, attribute.id),\n type:\n attribute.type.kind === \"enum\" || attribute.type.kind === \"enum-multi\"\n ? {\n ...attribute.type,\n options: Array.isArray(attribute.type.options)\n ? attribute.type.options.map((option) => ({ ...option, label: localize(option.label, option.value) }))\n : attribute.type.options,\n }\n : attribute.type,\n };\n return decorate(record, base);\n });\n\nexport const createMutableAttributeSource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n initial: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n): MutableAttributeSource => {\n let snapshot = localizeAttributes(record, initial, localize, decorate);\n const listeners = new Set<() => void>();\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 snapshot = localizeAttributes(record, attributes, localize, decorate);\n for (const listener of listeners) listener();\n },\n };\n};\n\nconst isWorkbenchResource = (resource: unknown): resource is ResourceRef =>\n Boolean(resource && typeof resource === \"object\" && typeof (resource as { kind?: unknown }).kind === \"string\");\n\nconst isExtensionResource = (resource: unknown): resource is Parameters<typeof toWorkbenchResource>[0] =>\n Boolean(\n resource &&\n typeof resource === \"object\" &&\n typeof (resource as { type?: unknown }).type === \"string\" &&\n typeof (resource as { id?: unknown }).id === \"string\",\n );\n\nconst rowResourceUri = (kind: string, id: string) =>\n `pstdio://extension-resource/${encodeURIComponent(kind)}/${encodeURIComponent(id)}`;\n\nexport const defaultResolveRowResource = (_: WorkbenchExtensionKanbanRendererRecord, row: KanbanRendererRow) => {\n const { resource } = row;\n if (isWorkbenchResource(resource)) return resource;\n if (isExtensionResource(resource)) return toWorkbenchResource(resource);\n return undefined;\n};\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 kind: record.resourceKind,\n uri: rowResourceUri(record.resourceKind, row.id),\n id: row.id,\n label: row.title,\n };\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};\n\nexport const mergeParams = (...items: Array<Record<string, unknown> | undefined>) =>\n Object.assign({}, ...items.filter((item): item is Record<string, unknown> => Boolean(item)));\n\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n\nconst hasCommandParameters = (params: Record<string, unknown> | undefined) => Object.keys(params ?? {}).length > 0;\n\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]);\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\n const options =\n \"options\" in descriptor && Array.isArray(descriptor.options)\n ? (descriptor.options as Array<{ value: string; label: string; icon?: string }>)\n : [];\n const optional = descriptor as { placeholder?: unknown; multiple?: unknown; 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};\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 });\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 });\n\nexport const executeKanbanRendererCommand = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n) => {\n const commandResource = resource ?? context.workbench.getPrimaryResource();\n return executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n projectId: context.projectId,\n ...(commandResource ? { resource: toExtensionCommandResource(commandResource) } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource: commandResource,\n slot: createKanbanRendererSlot(context, record),\n metadata: { kanbanRendererId: record.id },\n });\n};\n\nconst kanbanRendererRowActionCommandId = (record: WorkbenchExtensionKanbanRendererRecord, action: RowAction) =>\n `workbench.extension.kanbanRenderer.${record.id}.rowAction.${action.id}`;\n\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 });\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\n if (command && hasCommandParameters(command.command.params)) {\n context.workbench.commandPalette.requestParams({ record: command, label, args, context: executionContext });\n return Promise.resolve();\n }\n\n if (command)\n return context.workbench.commands.executeCommand(command.command.id, args, executionContext).then(() => undefined);\n\n return executeKanbanRendererCommand(context, record, action.commandId, args, resource).then(() => undefined);\n};\n","import type {\n CommandExecuteRequest,\n WorkbenchExtensionKanbanRendererRecord,\n WorkbenchExtensionMetadata,\n} from \"@pstdio/sdk/api\";\nimport type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type {\n AttributeDescriptor,\n Disposable,\n KanbanRendererContribution,\n KanbanRendererCreateSubmission,\n KanbanRendererQueryState,\n ResourceRef,\n} from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport { toWorkbenchNavigationTargetResult } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createMutableAttributeSource,\n defaultResolveRowActionResource,\n defaultResolveRowResource,\n executeKanbanRendererCommand,\n isQueryResult,\n type KanbanRendererRow,\n type Localizer,\n mergeParams,\n type RowAction,\n registerRowActionCommands,\n runDefaultRowAction,\n toCreateFields,\n toWorkbenchRow,\n} from \"./kanban-renderer-contribution-helpers\";\nimport {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n toWorkbenchCompositionPanelContribution,\n} from \"./panel-contributions\";\n\ntype BoardColumnConfig = ReturnType<NonNullable<KanbanRendererContribution[\"getBoardColumnConfig\"]>>;\ntype ColumnConfigRecord = Record<string, WireBoardColumnConfig>;\n\nexport interface WorkbenchExtensionKanbanRendererAdapter {\n /** Override label resolution. Defaults to workbench's `text(value, fallback)`. */\n resolveLabel?: Localizer;\n /** Post-process an attribute descriptor (after localization). Defaults to identity. */\n decorateAttribute?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n attribute: AttributeDescriptor,\n ) => AttributeDescriptor;\n /**\n * Translate a row's transport-shaped resource (`{ type, id }`) into a workbench\n * `ResourceRef`. Defaults to the workbench `pstdio://extension-resource/...`\n * scheme — dashboard supplies its own. Returns `undefined` for rows that do not\n * carry an explicit resource.\n */\n resolveRowResource?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined;\n /**\n * Synthesize a `ResourceRef` for row-action execution context when the row does\n * not carry an explicit resource. Defaults to a `pstdio://extension-resource/`\n * fallback built from `record.resourceKind` and `row.id`.\n */\n resolveRowActionResource?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined;\n /**\n * Override the row-action runner. `runDefault` performs the workbench's standard\n * flow (look up the row-action command, request params if needed, execute it).\n */\n executeRowAction?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n action: RowAction;\n row: KanbanRendererRow;\n resource: ResourceRef | undefined;\n runDefault: () => Promise<void>;\n }) => void | Promise<void>;\n /**\n * Override the row click handler. When unset the panel layer falls back to\n * opening the row's resource via `ctx.resources.openResource` — set this to\n * intercept the click (e.g. swallow rejections when no presenter exists yet).\n */\n onRowClick?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n row: KanbanRendererRow;\n resource: ResourceRef | undefined;\n }) => void;\n /** Translate extension navigation resource targets into host resources. */\n resolveNavigationResource?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n resource: NonNullable<CommandExecuteRequest[\"resource\"]>,\n ) => ResourceRef;\n /** Called after a successful renderer-owned create form submission. */\n onAfterCreate?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n created: unknown;\n submission: KanbanRendererCreateSubmission;\n }) => void | Promise<void>;\n /**\n * Called after any mutation (attribute change, reorder, column action, default\n * create) resolves successfully. Hosts that drive refresh via the outer command\n * pipeline (testbench / workbench) leave this unset; dashboard supplies\n * `ctx.renderers.refreshKanbanRenderer(id)`.\n */\n onAfterMutation?: (record: WorkbenchExtensionKanbanRendererRecord) => void;\n}\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\nconst toWorkbenchBoardColumnConfig = (config: WireBoardColumnConfig | undefined, localize: Localizer) =>\n ({\n color: config?.color,\n canDragIn: config?.canDragIn,\n canDragOut: config?.canDragOut,\n canCreate: config?.canCreate,\n actions: config?.actions?.map((action) => ({\n id: action.id,\n label: localize(action.label, action.id),\n icon: createBoardActionIcon(action.icon),\n })),\n }) satisfies BoardColumnConfig;\n\nconst 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 },\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 const result = await executeKanbanRendererCommand(\n context,\n record,\n record.rowActivationHandlerId!,\n { row: toActivatedRow(row) },\n resource,\n );\n const target = toWorkbenchNavigationTargetResult(result, {\n resourceOf: adapter.resolveNavigationResource\n ? (resource) => adapter.resolveNavigationResource!(record, resource)\n : undefined,\n });\n if (target) await context.workbench.navigation.openTarget(target);\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) => {\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 };\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 panels: WorkbenchExtensionMetadata[\"panels\"] = [],\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"] = [],\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 = adapter.decorateAttribute ?? ((_, attribute) => attribute);\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 attributes = createMutableAttributeSource(record, record.attributes, localize, decorate);\n const originalRows = new WeakMap<KanbanRendererRow, KanbanRendererRow>();\n let columnConfigs: ColumnConfigRecord | undefined;\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, row);\n const toActivatedRow = (row: KanbanRendererRow) => originalRows.get(row) ?? row;\n\n disposables.push(...registerRowActionCommands(context, record, localize));\n disposables.push(\n context.workbench.renderers.registerKanbanRenderer({\n id: record.id,\n title: localize(record.title, record.id),\n resourceKind: record.resourceKind,\n storageScope: context.projectId,\n attributes: attributes.source,\n defaultSettings: record.defaultSettings,\n defaultFilters: record.defaultFilters,\n defaultViews: record.defaultViews?.map((view) => ({\n ...view,\n title: localize(view.title, view.id),\n })),\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: toRowClick(context, record, adapter, resolveRowResource, toActivatedRow),\n executeQuery: async (state: KanbanRendererQueryState) => {\n const value = await executeKanbanRendererCommand(context, record, record.queryHandlerId, {\n settings: state.settings,\n filters: state.filters,\n });\n if (Array.isArray(value)) {\n return value.map((row) => {\n const mapped = toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, row as KanbanRendererRow);\n return mapped;\n });\n }\n if (!isQueryResult(value)) return [];\n attributes.set(value.attributes);\n columnConfigs = value.boardColumnConfigs;\n return (value.rows ?? []).map((row) => {\n const mapped = toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, row as KanbanRendererRow);\n return mapped;\n });\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 onReorder: record.reorderHandlerId\n ? (rowId, beforeRowId) =>\n runMutation(record, record.reorderHandlerId!, { rowId, beforeRowId }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(record, adapter, runMutation),\n onColumnAction: record.columnActionHandlerId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionHandlerId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(context, record, adapter, localize, resolveRowActionResource),\n }),\n );\n }\n\n const menuOffsets = panelMenuDeclarationOffsets(panels);\n panels.forEach((panel, index) => {\n const rendererId = panelRendererId(panel, \"kanban\");\n if (!rendererId) return;\n disposables.push(\n registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuOffsets[index]!,\n resourcePanels,\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 { Localizable } 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 }>\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 = (params: ContributedParamSchema, localize: ParamLocalizer) => {\n if (!params) return undefined;\n\n return Object.fromEntries(\n Object.entries(params).map(([id, descriptor]) => [\n id,\n {\n ...descriptor,\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","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { TreeContext, TreeNode } from \"../../core\";\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 = (metadata: WorkbenchExtensionMetadata, record: ExtensionTreeRendererRecord) =>\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 { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { WorkbenchModuleContext } from \"../../core\";\nimport {\n panelRendererId,\n registerWorkbenchExtensionPanel,\n toWorkbenchCompositionPanelContribution,\n} from \"./panel-contributions\";\nimport type { ExtensionTreePanelRecord } from \"./tree-renderer-contribution-types\";\n\ninterface RegisterTreeViewWidgetInput {\n workbench: WorkbenchModuleContext;\n resourcePanels?: WorkbenchExtensionMetadata[\"resourcePanels\"];\n}\n\nexport const registerTreeViewWidget = (\n input: RegisterTreeViewWidgetInput,\n panel: ExtensionTreePanelRecord,\n index: number,\n menuDeclarationOffset: number,\n) => {\n const rendererId = panelRendererId(panel, \"tree\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels: input.resourcePanels,\n }),\n });\n};\n","import type { CommandExecuteRequest, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\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 { FILE_SECTION_NAVIGATION_METADATA_KEY } from \"../../core/registries/renderers/file-section-navigation\";\nimport { unwrapCommandValue } from \"../host/command-response\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport { panelMenuDeclarationOffsets } from \"./panel-contributions\";\nimport { localizeParamSchema } from \"./param-schema-localization\";\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 { registerTreeViewWidget } from \"./tree-renderer-panels\";\n\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}\n\nconst toExtensionResource = (resource: ResourceRef | undefined): ExtensionTreeResource | undefined => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nconst refId = (value: { id?: string } | string | undefined) => (typeof value === \"string\" ? value : value?.id);\n\nconst toWorkbenchResource = (\n resource: ExtensionTreeResource,\n sectionNavigation?: {\n treeId: string;\n targetNodeId: string;\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n },\n): ResourceRef => ({\n kind: resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`,\n id: resource.id,\n label: resource.label,\n metadata: sectionNavigation\n ? { ...resource.metadata, [FILE_SECTION_NAVIGATION_METADATA_KEY]: sectionNavigation }\n : resource.metadata,\n});\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});\n\nconst createQueryParams = (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n ctx: TreeContext,\n node?: ExtensionTreeNode,\n) => {\n const resource = toExtensionResource(ctx.resource);\n const modeId = input.workbench.modes.getActiveModeId();\n return {\n renderer: {\n rendererId: record.id,\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n state: input.workbench.renderers.getTreeState(record.id),\n ...(ctx.filter ? { filter: ctx.filter } : {}),\n ...(node ? { node } : {}),\n };\n};\n\nconst executeCallback = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n) => {\n const renderer = params.renderer as { modeId?: string; resource?: ExtensionTreeResource } | undefined;\n const resource = renderer?.resource;\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params,\n resource,\n slot: slotContext({\n modeId: renderer?.modeId,\n projectId: input.projectId,\n resource,\n treeId: record.id,\n }),\n source: \"dashboard\",\n });\n return unwrapCommandValue(result);\n};\n\nconst 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 const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params: rendererParams,\n resource,\n slot: slotContext({ modeId, projectId: input.projectId, resource, treeId: record.id }),\n source: \"dashboard\",\n metadata: { treeId: record.id },\n });\n return unwrapCommandValue(result);\n};\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};\n\nconst toRecordParams = (params: object | undefined) =>\n params && !Array.isArray(params) ? (params as Record<string, unknown>) : undefined;\n\nconst createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\n\n const resolveResource: typeof toWorkbenchResource = (resource, sectionNavigation) => {\n const resolved = input.resolveNodeResource?.(resource);\n if (!resolved) return toWorkbenchResource(resource, sectionNavigation);\n if (!sectionNavigation) return resolved;\n return {\n ...resolved,\n metadata: { ...resolved.metadata, [FILE_SECTION_NAVIGATION_METADATA_KEY]: sectionNavigation },\n };\n };\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\n const mapTarget = (\n target: ExtensionTreeTarget | undefined,\n node: ExtensionTreeNode,\n ctx: TreeContext,\n ): NavigationTarget | undefined => {\n if (!target) return undefined;\n const commandTargetOf = (commandTarget: Extract<ExtensionTreeTarget, { kind: \"command\" }>) => ({\n kind: \"command\" as const,\n commandId: runnerCommandId,\n args: {\n commandId: typeof commandTarget.command === \"string\" ? commandTarget.command : commandTarget.command.id,\n nodeId: node.id,\n params: commandTarget.params,\n resource: node.resource ?? toExtensionResource(ctx.resource),\n treeId: record.id,\n } satisfies TargetCommandArgs,\n });\n return toWorkbenchNavigationTarget(target, {\n commandTargetOf,\n resourceOf: (resource, resourceTarget) =>\n resolveResource(\n resource,\n resourceTarget.section\n ? { treeId: record.id, targetNodeId: node.id, anchors: resourceTarget.section.anchors }\n : undefined,\n ),\n });\n };\n\n const mapAction = (\n action: ExtensionTreeAction,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): TreeAction => {\n const commandId = refId(action.command);\n return {\n id: action.id,\n label: text(action.label),\n icon: action.icon,\n args: toRecordParams(action.params),\n params: localizeParamSchema(action.input, text),\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 await executeTreeActionCommand(\n input,\n record,\n commandId,\n toActionParams(params, toRecordParams(action.params)),\n node?.resource ?? toExtensionResource(ctx.resource),\n );\n input.workbench.renderers.refresh(record.id);\n }\n : undefined,\n };\n };\n\n const mapNode = (node: ExtensionTreeNode, ctx: TreeContext): TreeNode => {\n const mapped: TreeNode = {\n id: node.id,\n label: text(node.label),\n icon: node.icon,\n iconColor: node.iconColor,\n iconTooltip: node.iconTooltip,\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 };\n originalNodes.set(mapped, node);\n return mapped;\n };\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\n const mapNodes = (nodes: ExtensionTreeNode[], ctx: TreeContext): TreeNode[] =>\n nodes.map((node) => mapNode(node, ctx));\n\n return { mapNodes, mapSections, originalNodes, runnerCommandId };\n};\n\nconst isTreeSectionArray = (value: unknown): value is ExtensionTreeSection[] =>\n Array.isArray(value) && value.every((section) => section && typeof section === \"object\" && \"nodes\" in section);\n\nconst isTreeNodeArray = (value: unknown): value is ExtensionTreeNode[] =>\n Array.isArray(value) && value.every((node) => node && typeof node === \"object\" && \"id\" in node);\n\n// The node a command marks with `selected: true` (e.g. the open document in a\n// files tree) becomes the tree's highlighted selection.\nconst selectedNodeIdFromNodes = (nodes: ExtensionTreeNode[]): string | undefined => {\n for (const node of nodes) {\n if (node.selected) return node.id;\n const selectedChild = selectedNodeIdFromNodes(node.children ?? []);\n if (selectedChild) return selectedChild;\n }\n return undefined;\n};\n\nexport const selectedNodeIdFromSections = (sections: ExtensionTreeSection[]): string | undefined => {\n for (const section of sections) {\n const selectedNodeId = selectedNodeIdFromNodes(section.nodes);\n if (selectedNodeId) return selectedNodeId;\n }\n return undefined;\n};\n\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 if (args.nodeId) input.workbench.renderers.setSelectedNode(record.id, args.nodeId);\n const result = await executeTreeActionCommand(input, record, args.commandId, args.params, args.resource);\n for (const renderer of input.workbench.renderers.listFileRenderers()) {\n input.workbench.renderers.refreshFileRenderer(renderer.id);\n }\n return result;\n },\n },\n );\n\n const treeDisposable = input.workbench.renderers.registerTreeRenderer({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n searchable: record.searchable,\n searchPlaceholder: text(record.searchPlaceholder, \"Search files\"),\n defaultExpandedNodeIds: record.defaultExpandedNodeIds,\n defaultExpandedSectionIds: record.defaultExpandedSectionIds,\n getHeader: (ctx) =>\n resolveHostTreeHeaderNodes({ ctx, getHostTreeHeaderNodes: input.getHostTreeHeaderNodes, record, treeViews }),\n getBody: async (ctx) => {\n const result = await executeCallback(input, record, record.bodyHandlerId, createQueryParams(input, record, ctx));\n if (!isTreeSectionArray(result)) return [];\n const selectedNodeId = selectedNodeIdFromSections(result);\n if (selectedNodeId) input.workbench.renderers.setSelectedNode(record.id, selectedNodeId);\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 hostFooter;\n const result = await executeCallback(\n input,\n record,\n record.footerHandlerId,\n createQueryParams(input, record, ctx),\n );\n const extensionFooter = isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n return [...extensionFooter, ...hostFooter];\n },\n getChildren: async (node, ctx) => {\n if (!record.childrenHandlerId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node) ?? (node as unknown as ExtensionTreeNode);\n const result = await executeCallback(\n input,\n record,\n record.childrenHandlerId,\n createQueryParams(input, record, ctx, originalNode),\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};\n\nexport const registerWorkbenchExtensionTreeRenderers = (input: RegisterWorkbenchExtensionTreeRenderersInput) => {\n const disposables: Disposable[] = [];\n\n for (const record of input.metadata.treeRenderers ?? []) {\n disposables.push(registerTree(input, record));\n }\n\n const menuOffsets = panelMenuDeclarationOffsets(input.metadata.panels);\n input.metadata.panels.forEach((panel, index) => {\n const disposable = registerTreeViewWidget(\n { workbench: input.workbench, resourcePanels: input.metadata.resourcePanels },\n panel,\n index,\n menuOffsets[index]!,\n );\n if (disposable) disposables.push(disposable);\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 { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { ExtensionResourceOpenIntent } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport {\n createExtensionSlot,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\nimport type { CreateBridgeWebviewHostCapabilities } from \"./bridge-webview-renderer\";\nimport { createWorkbenchWebviewHostCapabilities, toOpenResourceInput } from \"./webview-host-capabilities\";\n\ntype ExtensionWebviewSlotKind = NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\n\nexport interface ExtensionWebviewFileCapabilities {\n delete(params: unknown): Promise<unknown> | unknown;\n list(params: unknown): Promise<unknown> | unknown;\n upload(params: unknown): Promise<unknown> | unknown;\n}\n\ninterface CreateExtensionWebviewHostCapabilitiesInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n files?: ExtensionWebviewFileCapabilities;\n projectId: string;\n slotKind: ExtensionWebviewSlotKind;\n}\n\ntype WebviewCommandExecuteParams = {\n commandId: string;\n params?: Record<string, unknown>;\n resource?: CommandExecuteRequest[\"resource\"];\n};\n\ntype WebviewResourceOpenParams = {\n resource?: CommandExecuteRequest[\"resource\"];\n input?: ExtensionResourceOpenIntent;\n};\n\nexport const createExtensionWebviewHostCapabilities =\n (input: CreateExtensionWebviewHostCapabilitiesInput): CreateBridgeWebviewHostCapabilities =>\n (context) => {\n const base = createWorkbenchWebviewHostCapabilities({\n workbench: context.workbench,\n hostEvents: context.hostEvents,\n });\n\n return {\n ...base,\n // Extension guests speak the SDK resource shape (`type`); normalize to the\n // workbench shape (`kind` + synthesized uri) the resource registry expects,\n // mirroring how commands.execute and tree targets normalize their resources.\n \"resource.open\": (params) => {\n const request = params as WebviewResourceOpenParams;\n if (!request.resource) throw new Error(\"resource.open requires a resource.\");\n return context.workbench.resources.openResource(\n toWorkbenchResource(request.resource),\n toOpenResourceInput(request.input),\n );\n },\n \"commands.execute\": async (params) => {\n const request = params as WebviewCommandExecuteParams;\n const resource = request.resource ?? toExtensionCommandResource(context.placement.resource);\n\n return input.executeCommand(request.commandId, {\n projectId: input.projectId,\n ...(request.params ? { params: request.params } : {}),\n ...(resource ? { resource } : {}),\n slot: createExtensionSlot({\n id: context.webviewId,\n kind: input.slotKind,\n projectId: input.projectId,\n context: { panelId: context.webviewId },\n }),\n source: \"dashboard\",\n });\n },\n ...(input.files\n ? {\n \"files.upload\": input.files.upload,\n \"files.list\": input.files.list,\n \"files.delete\": input.files.delete,\n }\n : {}),\n } satisfies HostCapabilityRegistry;\n };\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, ResourceRef, WorkbenchModuleContext } from \"../../core\";\nimport { BRIDGE_WEBVIEW_RENDERER_ID } from \"../bridge/bridge-webview-renderer\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\n\nexport interface RegisterWorkbenchExtensionRoutesInput {\n metadata: WorkbenchExtensionMetadata;\n routeResourceKind: string;\n workbench: WorkbenchModuleContext;\n}\n\nexport const routeResource = (\n route: WorkbenchExtensionMetadata[\"routes\"][number],\n routeResourceKind: string,\n): ResourceRef => ({\n kind: routeResourceKind,\n uri: `workbench://extension-route/${encodeURIComponent(route.id)}`,\n id: route.id,\n label: text(route.label, route.id),\n metadata: { extensionId: route.extensionId, extensionRouteId: route.id, path: route.path },\n});\n\nexport const routeFromResource = (metadata: WorkbenchExtensionMetadata, resource: ResourceRef) =>\n metadata.routes.find((route) => resource.id === route.id || resource.metadata?.extensionRouteId === route.id);\n\nexport const registerWorkbenchExtensionRoutes = (input: RegisterWorkbenchExtensionRoutesInput) => {\n if (input.metadata.routes.length === 0) return [] as Disposable[];\n const disposables: Disposable[] = [];\n if (!input.workbench.resources.getKind(input.routeResourceKind)) {\n disposables.push(\n input.workbench.resources.registerKind({\n kind: input.routeResourceKind,\n label: \"Extension route\",\n icon: \"Component\",\n }),\n );\n }\n\n for (const route of input.metadata.routes) {\n disposables.push(\n input.workbench.layout.registerPanel({\n id: route.id,\n title: text(route.label, route.id),\n region: \"main\",\n rendererId: BRIDGE_WEBVIEW_RENDERER_ID,\n singleton: true,\n config: toBridgeWebviewConfig(route.webview),\n }),\n );\n }\n\n disposables.push(\n input.workbench.resources.registerProvider({\n id: \"workbench.extension.routes\",\n kind: input.routeResourceKind,\n list: () => input.metadata.routes.map((route) => ({ resource: routeResource(route, input.routeResourceKind) })),\n }),\n input.workbench.resources.registerPresenter({\n id: \"workbench.extension.routes\",\n canOpen: (resource) =>\n resource.kind === input.routeResourceKind && Boolean(routeFromResource(input.metadata, resource)),\n open: (resource, openInput) => {\n const route = routeFromResource(input.metadata, resource)!;\n return input.workbench.layout.openPanel(route.id, {\n strategy: openInput.replaceActive ? { kind: \"replace-active\" } : { kind: \"persistent\" },\n title: text(route.label, route.id),\n });\n },\n }),\n );\n\n return disposables;\n};\n","import type { WorkbenchRegion } from \"../../core\";\n\nconst viewTargetRegions: Record<string, WorkbenchRegion> = {\n \"workbench.main\": \"main\",\n \"workbench.main.left\": \"main-left-menu\",\n \"workbench.main.right\": \"main-right-menu\",\n \"workbench.secondary\": \"secondary\",\n};\n\nconst treeTargetRegions: Record<string, WorkbenchRegion> = {\n \"workbench.left.tree\": \"sidenav\",\n \"workbench.main.left.tree\": \"main-left-menu\",\n \"workbench.main.right.tree\": \"main-right-menu\",\n};\n\nconst modeTargetRegions: Record<string, WorkbenchRegion> = {\n \"workbench.left\": \"sidenav\",\n \"workbench.main.left\": \"main-left-menu\",\n \"workbench.main\": \"main\",\n \"workbench.main.right\": \"main-right-menu\",\n \"workbench.secondary\": \"secondary\",\n};\n\nexport const resolveWorkbenchPanelRegion = (target: string | undefined): WorkbenchRegion =>\n target ? (viewTargetRegions[target] ?? \"main\") : \"main\";\n\nexport const resolveWorkbenchTreeRegion = (target: string | undefined): WorkbenchRegion =>\n target ? (treeTargetRegions[target] ?? \"sidenav\") : \"sidenav\";\n\nexport const resolveWorkbenchModeRegion = (target: string | undefined): WorkbenchRegion =>\n target ? (modeTargetRegions[target] ?? \"main\") : \"main\";\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, NavigationTarget, TreeNode, WorkbenchModuleContext } from \"../../core\";\nimport { resolveWorkbenchTreeRegion } from \"../shared/workbench-targets\";\nimport { routeResource } from \"./route-contributions\";\n\ntype TreeItem = NonNullable<WorkbenchExtensionMetadata[\"treeItems\"]>[number];\n\nexport interface RegisterWorkbenchExtensionTreeItemsInput {\n metadata: WorkbenchExtensionMetadata;\n openHref?: (href: string) => unknown;\n routeResourceKind: string;\n workbench: WorkbenchModuleContext;\n}\n\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n\nconst targetForTreeAction = (\n input: RegisterWorkbenchExtensionTreeItemsInput,\n item: TreeItem,\n): NavigationTarget | undefined => {\n if (item.action.kind === \"panel\") return { kind: \"panel\", panelId: item.action.panelId };\n const action = item.action;\n if (action.kind === \"route\") {\n const route = input.metadata.routes.find((candidate) => candidate.id === action.route);\n return route ? { kind: \"resource\", resource: routeResource(route, input.routeResourceKind) } : undefined;\n }\n if (action.kind === \"command\") {\n return { kind: \"command\", commandId: action.commandId, args: action.args };\n }\n if (action.kind === \"resource\") {\n // Browse-root tree items open a resource directly. The URI matches the\n // scheme extension tree renderer nodes use, so both surfaces share one\n // identity for the same resource.\n return {\n kind: \"resource\",\n resource: {\n kind: action.resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(action.resource.type)}/${encodeURIComponent(action.resource.id)}`,\n id: action.resource.id,\n label: action.resource.label ?? text(item.label, item.id),\n icon: item.icon,\n metadata: action.resource.metadata,\n },\n };\n }\n return { kind: \"command\", commandId: `workbench.extension.href.${item.id}`, args: { href: action.href } };\n};\n\nexport const registerWorkbenchExtensionTreeItems = (input: RegisterWorkbenchExtensionTreeItemsInput) => {\n const items = input.metadata.treeItems ?? [];\n if (items.length === 0) return [] as Disposable[];\n const disposables: Disposable[] = [];\n const targets = new Map<string, typeof items>();\n for (const item of items) targets.set(item.target, [...(targets.get(item.target) ?? []), item]);\n\n for (const [target, targetItems] of targets) {\n const rendererId = `workbench.extension.treeItems.${target}`;\n disposables.push(\n input.workbench.renderers.registerTreeRenderer({\n id: rendererId,\n title: \"Extensions\",\n getChildren: (node) => node.children ?? [],\n getBody: () => [\n {\n id: \"extensions\",\n label: \"Extensions\",\n nodes: targetItems.map(\n (item): TreeNode => ({\n id: item.id,\n label: text(item.label, item.id),\n icon: item.icon,\n target: targetForTreeAction(input, item),\n }),\n ),\n },\n ],\n }),\n input.workbench.layout.registerPanel({\n id: rendererId,\n title: \"Extensions\",\n region: resolveWorkbenchTreeRegion(target),\n rendererId,\n singleton: true,\n }),\n );\n }\n\n for (const item of items.filter((candidate) => candidate.action.kind === \"href\")) {\n const action = item.action;\n if (action.kind !== \"href\") continue;\n disposables.push(\n input.workbench.commands.registerCommand(\n { id: `workbench.extension.href.${item.id}`, label: text(item.label, item.id) },\n { execute: (args) => input.openHref?.((asParams(args)?.href as string) ?? action.href) },\n ),\n );\n }\n\n return disposables;\n};\n","import type { CommandExecuteRequest, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { matchesResourceWhen } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n PreferencePropertySchema,\n PreferenceScope,\n PreferenceValue,\n ResourceRef,\n WorkbenchCommandExecutionContext,\n WorkbenchModeActivationContext,\n WorkbenchModuleContext,\n WorkbenchPanelRegion,\n} from \"../../core\";\nimport { workbenchCommandPaletteMenuPath, workbenchPanelRegions } from \"../../core\";\nimport {\n BRIDGE_WEBVIEW_RENDERER_ID,\n type CreateBridgeWebviewHostCapabilities,\n type CreateBridgeWebviewProps,\n type CreateBridgeWebviewTheme,\n createBridgeWebviewRenderer,\n getBridgeWebviewHostEventPublisher,\n renderBridgeWebviewFrame,\n} from \"../bridge/bridge-webview-renderer\";\nimport {\n createExtensionWebviewHostCapabilities,\n type ExtensionWebviewFileCapabilities,\n} from \"../bridge/webview-command-capabilities\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\nimport { registerWorkbenchExtensionCommandPaletteResources } from \"../contributions/command-palette-resource-contributions\";\nimport {\n createWorkbenchCompositionRegistry,\n listCompositionAddablePanels,\n reconcileCompositionLayout,\n toPanelPlacements,\n type WorkbenchCompositionRegistry,\n} from \"../contributions/composition-contributions\";\nimport { registerWorkbenchExtensionDataTableRenderers } from \"../contributions/data-table-renderer-contributions\";\nimport {\n buildWorkbenchExtensionCommandPaletteRegistrations,\n buildWorkbenchExtensionMenuRegistrations,\n type WorkbenchExtensionMenuSlotConfig,\n type WorkbenchExtensionMenuWhenBuilder,\n} from \"../contributions/extension-contributions\";\nimport { registerWorkbenchExtensionFileRenderers } from \"../contributions/file-renderer-contributions\";\nimport { registerWorkbenchExtensionKanbanRenderers } from \"../contributions/kanban-renderer-contributions\";\nimport {\n panelMenuDeclarationOffsets,\n registerWorkbenchExtensionPanel,\n toWorkbenchCompositionPanelContribution,\n} from \"../contributions/panel-contributions\";\nimport { registerWorkbenchExtensionRoutes } from \"../contributions/route-contributions\";\nimport { registerWorkbenchExtensionTreeItems } from \"../contributions/tree-item-contributions\";\nimport { registerWorkbenchExtensionTreeRenderers } from \"../contributions/tree-renderer-contributions\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n type WorkbenchExtensionCommandContext,\n} from \"./workbench-extension-command\";\n\nexport interface RegisterWorkbenchExtensionContributionsInput {\n createMenuWhenExpression?: WorkbenchExtensionMenuWhenBuilder;\n createWebviewHostCapabilities?: CreateBridgeWebviewHostCapabilities;\n createWebviewHostCapabilityOverrides?: CreateBridgeWebviewHostCapabilities;\n createWebviewProps?: CreateBridgeWebviewProps;\n createWebviewTheme?: CreateBridgeWebviewTheme;\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n menuSlotsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n menuTargetsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n metadata: WorkbenchExtensionMetadata;\n openHref?: (href: string) => unknown;\n projectId: string;\n routeResourceKind?: string;\n settingsSectionId?: string;\n settingsSectionTitle?: string;\n webviewFiles?: ExtensionWebviewFileCapabilities;\n workbench: WorkbenchModuleContext;\n}\n\nconst routeResourceKindDefault = \"extension-route\";\nconst settingsSectionIdDefault = \"extensions\";\n\nconst disposeAll = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\n\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n\nconst asPreferenceValue = (value: unknown): PreferenceValue | undefined =>\n value === undefined ? undefined : (value as PreferenceValue);\n\nconst preferenceScope = (scope: \"global\" | \"project\"): PreferenceScope => (scope === \"global\" ? \"user\" : \"project\");\n\nconst withHostCapabilityOverrides = (\n createBase: CreateBridgeWebviewHostCapabilities,\n createOverrides: CreateBridgeWebviewHostCapabilities | undefined,\n): CreateBridgeWebviewHostCapabilities => {\n if (!createOverrides) return createBase;\n return (context) =>\n ({\n ...createBase(context),\n ...createOverrides(context),\n }) satisfies HostCapabilityRegistry;\n};\n\nconst createExtensionHostCapabilities = (\n input: RegisterWorkbenchExtensionContributionsInput,\n slotKind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"],\n) => {\n const createBase =\n input.createWebviewHostCapabilities ??\n createExtensionWebviewHostCapabilities({\n executeCommand: input.executeCommand,\n files: input.webviewFiles,\n projectId: input.projectId,\n slotKind,\n });\n\n return withHostCapabilityOverrides(createBase, input.createWebviewHostCapabilityOverrides);\n};\n\nconst registerBridgeRenderer = (input: RegisterWorkbenchExtensionContributionsInput, disposables: Disposable[]) => {\n if (input.workbench.renderers.getRenderer(BRIDGE_WEBVIEW_RENDERER_ID)) return;\n\n disposables.push(\n input.workbench.renderers.registerRenderer(\n createBridgeWebviewRenderer({\n createHostCapabilities: createExtensionHostCapabilities(input, \"panel\"),\n createProps: input.createWebviewProps,\n createTheme: input.createWebviewTheme,\n }),\n ),\n );\n};\n\nconst registerCommands = (context: WorkbenchExtensionCommandContext, metadata: WorkbenchExtensionMetadata) =>\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: command.params,\n },\n {\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, command.id, {\n params: asParams(args),\n resource: executionContext?.resource,\n }),\n },\n ),\n );\n\nconst menuCommandResource = (\n input: RegisterWorkbenchExtensionContributionsInput,\n executionContext: WorkbenchCommandExecutionContext | undefined,\n) => executionContext?.resource ?? input.workbench.getPrimaryResource();\n\nconst registerMenus = (\n input: RegisterWorkbenchExtensionContributionsInput,\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\n return registrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\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 input.workbench.layout.registerMenuItem(registration.menuPath, registration.menuItem),\n ]);\n};\n\nconst registerCommandPaletteContributions = (\n input: RegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const registrations = buildWorkbenchExtensionCommandPaletteRegistrations({ metadata: input.metadata });\n\n return registrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\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()?.kind),\n }),\n input.workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, registration.menuItem),\n ]);\n};\n\nconst registerWebviewPanels = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const menuOffsets = panelMenuDeclarationOffsets(input.metadata.panels);\n return input.metadata.panels.flatMap((panel, index) => {\n if (!panel.webview) return [];\n return [\n registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId: BRIDGE_WEBVIEW_RENDERER_ID,\n declarationIndex: index,\n menuDeclarationOffset: menuOffsets[index]!,\n resourcePanels: input.metadata.resourcePanels,\n config: toBridgeWebviewConfig(panel.webview),\n }),\n }),\n ];\n });\n};\n\n// Status items are chrome contributions: the host renders them in the status\n// surface and keeps them out of docked layout and persistence. A `when.mode`\n// expression scopes the item to its modes.\nconst registerStatusItems = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n for (const [index, item] of (input.metadata.statusItems ?? []).entries()) {\n if (!item.webview) continue;\n disposables.push(\n input.workbench.layout.registerWidget({\n id: item.id,\n title: text(item.title, item.id),\n region: \"status\",\n rendererId: BRIDGE_WEBVIEW_RENDERER_ID,\n closable: false,\n priority: -index,\n config: toBridgeWebviewConfig(item.webview),\n }),\n );\n const matchesMode = () => {\n const modes = item.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 };\n const sync = () => {\n const placed = input.workbench.layout\n .getLayout()\n .regions.status.widgets.find((placement) => placement.contributionId === item.id);\n if (matchesMode() && !placed) input.workbench.layout.openWidget(item.id, { region: \"status\" });\n else if (!matchesMode() && placed) input.workbench.layout.removeWidgetPlacement(placed.widgetId);\n };\n sync();\n disposables.push(input.workbench.modes.onDidChangeActive(sync));\n }\n return disposables;\n};\n\nconst registerSettings = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n const sectionId = input.settingsSectionId ?? settingsSectionIdDefault;\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 properties = Object.fromEntries(\n (input.metadata.settingsDefinitions ?? []).map((setting) => [\n setting.key,\n {\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 ]),\n );\n if (Object.keys(properties).length > 0) disposables.push(input.workbench.preferences.registerSchema({ properties }));\n\n for (const panel of input.metadata.settingsPanels) {\n disposables.push(\n input.workbench.settings.registerPanel({\n id: panel.id,\n title: text(panel.title, panel.id),\n kind: \"custom\",\n section: sectionId,\n scope: panel.scope,\n render: (renderInput) =>\n renderBridgeWebviewFrame({\n context: {\n workbench: renderInput.workbench,\n webviewId: panel.id,\n placement: { ...renderInput.instance, panelId: panel.id },\n hostEvents: getBridgeWebviewHostEventPublisher(renderInput.workbench, renderInput.instance),\n },\n createHostCapabilities: createExtensionHostCapabilities(input, \"settings\"),\n createProps: input.createWebviewProps ?? (({ placement }) => ({ placement, resource: placement.resource })),\n createTheme: input.createWebviewTheme,\n ownerId: panel.extensionId,\n title: text(panel.title, panel.id),\n webview: toBridgeWebviewConfig(panel.webview),\n }),\n }),\n );\n }\n\n return disposables;\n};\n\ninterface ResourceKindPresenterRecord {\n extensionId?: string;\n icon?: string;\n label?: string;\n surface: \"primary\" | \"secondary\" | \"attached\";\n}\n\ninterface ResourcePresenterPanel {\n edge?: NonNullable<WorkbenchExtensionMetadata[\"resourcePanels\"]>[number];\n panel: WorkbenchExtensionMetadata[\"panels\"][number];\n placement?: { for?: string; region: string };\n}\n\nconst collectResourceKindPresenterRecords = (metadata: WorkbenchExtensionMetadata) => {\n const records = new Map<string, ResourceKindPresenterRecord>();\n for (const kind of metadata.resourceKinds ?? []) {\n records.set(kind.id, {\n surface: kind.surface,\n extensionId: kind.extensionId,\n label: kind.label ? text(kind.label, kind.id) : undefined,\n icon: kind.icon,\n });\n }\n for (const renderer of metadata.kanbanRenderers ?? []) {\n if (renderer.resourceKind && !records.has(renderer.resourceKind)) {\n records.set(renderer.resourceKind, { surface: \"primary\" });\n }\n }\n return records;\n};\n\nconst resourcePresenterPanels = (\n metadata: WorkbenchExtensionMetadata,\n kind: string,\n ownerExtensionId: string | undefined,\n) => {\n const edges = (metadata.resourcePanels ?? []).filter((edge) => edge.resourceKind === kind);\n const panels: ResourcePresenterPanel[] = edges.flatMap((edge) => {\n const panel = metadata.panels.find((candidate) => candidate.id === edge.panel);\n return panel ? [{ edge, panel }] : [];\n });\n const edgePanelIds = new Set(panels.map(({ panel }) => panel.id));\n for (const panel of metadata.panels) {\n if (edgePanelIds.has(panel.id) || panel.extensionId !== ownerExtensionId) continue;\n const placements = panel.show ? (Array.isArray(panel.show) ? panel.show : [panel.show]) : [];\n const placement = placements.find((candidate) => candidate.for === kind);\n if (placement) panels.push({ panel, placement });\n }\n return panels;\n};\n\nconst placedPanelRegion = (input: RegisterWorkbenchExtensionContributionsInput, panelId: string) => {\n const layout = input.workbench.layout.getLayout();\n const dockedRegions = [\"sidenav\", \"main\", \"secondary\", \"side\"] as const;\n return dockedRegions.find((region) =>\n layout.regions[region].widgets.some((placement) => placement.contributionId === panelId),\n );\n};\n\nconst openResourcePresenter = (\n input: RegisterWorkbenchExtensionContributionsInput,\n panels: readonly ResourcePresenterPanel[],\n resource: ResourceRef,\n) => {\n const instances = panels.map(({ panel }) =>\n input.workbench.layout.openPanel(panel.id, {\n region: placedPanelRegion(input, panel.id),\n resource,\n title: resource.label ?? resource.id ?? resource.uri,\n strategy: { kind: \"persistent\" },\n }),\n );\n const primaryIndex = panels.findIndex(\n (entry) => entry.edge?.slot === \"primary\" || entry.placement?.region === \"main\",\n );\n return instances[primaryIndex >= 0 ? primaryIndex : 0]!;\n};\n\nconst registerResourceKindPresenter = (\n input: RegisterWorkbenchExtensionContributionsInput,\n kind: string,\n record: ResourceKindPresenterRecord,\n) => {\n const disposables: Disposable[] = [];\n if (!input.workbench.resources.getKind(kind)) {\n disposables.push(\n input.workbench.resources.registerKind({\n kind,\n label: record.label ?? kind,\n icon: record.icon ?? \"FileText\",\n surface: record.surface,\n }),\n );\n }\n const panels = resourcePresenterPanels(input.metadata, kind, record.extensionId);\n if (panels.length === 0) return disposables;\n disposables.push(\n input.workbench.resources.registerPresenter({\n id: `workbench.extension.resource.${kind}`,\n canOpen: (resource) => resource.kind === kind,\n // Reuse a placement where the composition resolver or the user put it.\n open: (resource) => openResourcePresenter(input, panels, resource),\n }),\n );\n return disposables;\n};\n\nconst registerResourcePresenters = (input: RegisterWorkbenchExtensionContributionsInput) =>\n [...collectResourceKindPresenterRecords(input.metadata)].flatMap(([kind, record]) =>\n registerResourceKindPresenter(input, kind, record),\n );\n\ntype WorkbenchExtensionModeRecord = WorkbenchExtensionMetadata[\"modes\"][number];\n\n// Registers the metadata composition (resource kinds, panel capabilities,\n// resource-panel edges, and mode recipes) so the composition resolver can place\n// panels per active mode-resource context.\nconst registerComposition = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const registry = createWorkbenchCompositionRegistry();\n const disposables: Disposable[] = [];\n for (const kind of input.metadata.resourceKinds ?? []) {\n disposables.push(\n registry.registerResourceKind({\n id: kind.id,\n extensionId: kind.extensionId,\n surface: kind.surface,\n slots: kind.slots,\n }),\n );\n }\n for (const panel of input.metadata.panels) {\n disposables.push(\n registry.registerPanelCapability({\n id: panel.id,\n extensionId: panel.extensionId,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n show: toPanelPlacements(panel.show),\n }),\n );\n }\n for (const edge of input.metadata.resourcePanels ?? []) {\n disposables.push(\n registry.registerResourcePanel({\n id: edge.id,\n extensionId: edge.extensionId,\n resourceKind: edge.resourceKind,\n panel: edge.panel,\n slot: edge.slot,\n }),\n );\n }\n for (const mode of input.metadata.modes) {\n disposables.push(\n registry.registerModeComposition({\n id: mode.modeId,\n extensionId: mode.extensionId,\n resources: mode.resources,\n modePanels: mode.modePanels,\n }),\n );\n }\n return { registry, disposables };\n};\n\nconst extensionResourceUri = (type: string, id: string) =>\n `pstdio://extension-resource/${encodeURIComponent(type)}/${encodeURIComponent(id)}`;\n\nconst toModeDefaultResource = (\n input: RegisterWorkbenchExtensionContributionsInput,\n defaultResource: WorkbenchExtensionModeRecord[\"defaultResource\"],\n) => {\n if (!defaultResource) return undefined;\n if (\"commandId\" in defaultResource) {\n return async () => {\n const result = (await input.executeCommand(defaultResource.commandId, { projectId: input.projectId })) as\n | { type?: string; id?: string; label?: string }\n | undefined;\n if (!result || typeof result.type !== \"string\" || typeof result.id !== \"string\") return undefined;\n return {\n kind: result.type,\n uri: extensionResourceUri(result.type, result.id),\n id: result.id,\n label: result.label,\n };\n };\n }\n return {\n kind: defaultResource.type,\n uri: extensionResourceUri(defaultResource.type, defaultResource.id),\n id: defaultResource.id,\n label: defaultResource.label,\n };\n};\n\nconst registerModes = (input: RegisterWorkbenchExtensionContributionsInput, registry: WorkbenchCompositionRegistry) =>\n input.metadata.modes.map((mode) => {\n // Seed and reconcile run the same composition pass with different jobs. The mode\n // registry seeds a scope once and reconciles on every later activation, so it — not\n // a guess about persisted state — decides when the recipe's optional placements open.\n const applyComposition = (ctx: WorkbenchModeActivationContext, seeding: boolean) => {\n reconcileCompositionLayout(\n { layout: ctx.layout, notifications: ctx.notifications },\n { registry, modeId: mode.modeId, resourceKind: ctx.navigator.getSelectedResource()?.kind, seeding },\n );\n // Reveal the Side Panel when the recipe placed something there so the mode's\n // declared layout is visible the first time it opens.\n if (ctx.layout.getLayout().regions.side.widgets.length > 0) ctx.shell.setSidePanelPresentation(\"attached\");\n };\n\n return input.workbench.modes.registerMode({\n id: mode.modeId,\n label: text(mode.label, mode.modeId),\n panels: mode.panelRegions,\n resourceKinds: Object.keys(mode.resources ?? {}),\n defaultResource: toModeDefaultResource(input, mode.defaultResource),\n listAddablePanels: ({ layout, resource }) =>\n listCompositionAddablePanels({\n registry,\n modeId: mode.modeId,\n layout,\n resourceKind: resource?.kind,\n }).filter((panel): panel is typeof panel & { region: WorkbenchPanelRegion } =>\n workbenchPanelRegions.includes(panel.region as WorkbenchPanelRegion),\n ),\n activate: () => undefined,\n seed: (ctx: WorkbenchModeActivationContext) => applyComposition(ctx, true),\n reconcile: (ctx: WorkbenchModeActivationContext) => applyComposition(ctx, false),\n });\n });\n\nexport const registerWorkbenchExtensionContributions = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n const context: WorkbenchExtensionCommandContext = input;\n\n registerBridgeRenderer(input, disposables);\n disposables.push(...registerCommands(context, input.metadata));\n disposables.push(...registerMenus(input, context));\n disposables.push(...registerCommandPaletteContributions(input, context));\n disposables.push(registerWorkbenchExtensionTreeRenderers(input));\n disposables.push(registerWorkbenchExtensionFileRenderers(input));\n disposables.push(...registerWebviewPanels(input));\n disposables.push(\n registerWorkbenchExtensionKanbanRenderers(\n context,\n input.metadata.kanbanRenderers ?? [],\n undefined,\n input.metadata.panels,\n input.metadata.resourcePanels,\n ),\n );\n disposables.push(\n registerWorkbenchExtensionDataTableRenderers(\n context,\n input.metadata.dataTableRenderers ?? [],\n input.metadata.panels,\n input.metadata.resourcePanels,\n ),\n );\n disposables.push(\n registerWorkbenchExtensionCommandPaletteResources(context, input.metadata.commandPaletteResources ?? []),\n );\n disposables.push(...registerSettings(input));\n disposables.push(\n ...registerWorkbenchExtensionRoutes({\n metadata: input.metadata,\n routeResourceKind: input.routeResourceKind ?? routeResourceKindDefault,\n workbench: input.workbench,\n }),\n );\n disposables.push(\n ...registerWorkbenchExtensionTreeItems({\n metadata: input.metadata,\n openHref: input.openHref,\n routeResourceKind: input.routeResourceKind ?? routeResourceKindDefault,\n workbench: input.workbench,\n }),\n );\n disposables.push(...registerStatusItems(input));\n disposables.push(...registerResourcePresenters(input));\n const composition = registerComposition(input);\n disposables.push(...composition.disposables);\n disposables.push(...registerModes(input, composition.registry));\n\n return {\n dispose() {\n disposeAll(disposables);\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n FileRendererRefreshEnvelope,\n WorkbenchModuleContext,\n WorkbenchPanelInstance,\n} 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 if (target.kind === \"tree\") workbench.renderers.refresh(target.id);\n if (target.kind === \"file\") workbench.renderers.refreshFileRenderer(target.id, envelope);\n if (target.kind === \"controls\") workbench.renderers.refreshControlsRenderer(target.id);\n if (target.kind === \"dataTable\") workbench.renderers.refreshDataTableRenderer(target.id);\n if (target.kind === \"kanban\") workbench.renderers.refreshKanbanRenderer(target.id);\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 renderer of metadata.treeRenderers ?? []) add(\"tree\", renderer);\n for (const renderer of metadata.fileRenderers ?? []) add(\"file\", renderer);\n for (const renderer of metadata.controlsRenderers ?? []) add(\"controls\", renderer);\n for (const renderer of metadata.dataTableRenderers ?? []) add(\"dataTable\", renderer);\n for (const renderer of metadata.kanbanRenderers ?? []) add(\"kanban\", renderer);\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\nconst findOpenPlacement = (workbench: WorkbenchModuleContext, panelId: string): WorkbenchPanelInstance | undefined => {\n return workbench.layout.listPanelInstances().find((candidate) => candidate.panelId === panelId);\n};\n\nconst restoreActiveWidget = (workbench: WorkbenchModuleContext, panelId: string | undefined) => {\n if (!panelId) return;\n try {\n workbench.layout.activatePanel(panelId);\n } catch {\n // The refreshed widget may have been closed by the command.\n }\n};\n\nexport const refreshOpenWorkbenchExtensionWebviews = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n) => {\n const activeWidgetId = workbench.layout.getLayout().activeWidgetId;\n\n for (const panel of metadata.panels) {\n if (!panel.webview) continue;\n const placement = findOpenPlacement(workbench, panel.id);\n if (!placement) continue;\n workbench.layout.openPanel(panel.id, {\n resource: placement.resource,\n title: text(panel.title, placement.title),\n strategy: { kind: \"replace-panel\", instanceId: placement.instanceId },\n });\n }\n\n for (const route of metadata.routes) {\n if (!route.webview) continue;\n const placement = findOpenPlacement(workbench, route.id);\n if (!placement) continue;\n workbench.layout.openPanel(route.id, {\n resource: placement.resource,\n title: text(route.label, placement.title),\n strategy: { kind: \"replace-panel\", instanceId: placement.instanceId },\n });\n }\n\n restoreActiveWidget(workbench, activeWidgetId);\n};\n"],"names":["WEBVIEW_HOST_CAPABILITY_VERSION","WEBVIEW_DECLARABLE_CAPABILITIES","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","WEBVIEW_HOST_CAPABILITIES","publicCapabilityNames","Set","isPublicCapability","name","has","parseCapabilityDeclaration","capability","versionText","split","version","undefined","Number","unsupportedCapability","code","message","severity","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","declaredCapabilities","capabilities","diagnostics","allowed","add","declaration","parsed","push","createHostCapabilityGate","input","emit","diagnostic","onDiagnostic","call","request","method","Error","handler","params","isRecord","value","safeStringify","json","JSON","stringify","length","String","normalizeRuntimeError","stack","collectChakraThemeVariables","document","computed","getComputedStyle","documentElement","variables","index","item","startsWith","getPropertyValue","trim","resolveActiveTheme","fallback","getAttribute","colorMode","iframeStyle","border","display","flex","height","minHeight","width","frameShellStyle","position","errorOverlayStyle","alignItems","background","color","inset","justifyContent","padding","textAlign","zIndex","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","props","view","extensionProps","theme","hostEvents","onReady","onError","onDiagnostics","title","iframeRef","useRef","remoteRef","initializedRef","connectedKeyRef","propsRef","themeRef","capabilitiesRef","hostEventsRef","declaredCapabilitiesRef","webview","onReadyRef","onErrorRef","onDiagnosticsRef","runtimeError","setRuntimeError","useState","frameEpoch","setFrameEpoch","current","useEffect","iframe","onFrameLoad","epoch","addEventListener","removeLoadListener","removeEventListener","connectedKey","runtimeUrl","moduleUrl","stylesAtConnect","styles","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","ready","payload","connect","connection","host","contentWindow","location","replace","then","conn","remote","bind","hostEvent","init","themeVariables","catch","error","normalized","unbind","propsUpdate","themeUpdate","window","MutationObserver","frame","schedule","cancelAnimationFrame","requestAnimationFrame","observer","options","attributeFilter","attributes","observe","body","disconnect","jsxs","jsx","label","colorScheme","createHostEventPublisher","sink","pending","disconnectListeners","next","shift","onDisconnect","listener","delete","TERMINAL_SESSION_EVENT_SCOPE","createTerminalSessionCapability","terminal","scope","operation","sessionId","open","write","data","accepted","resize","cols","rows","kill","signal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","subscribe","onData","chunk","kind","onExit","exit","dispatchDocumentKeyboardEvent","event","KeyboardEvent","bubbles","cancelable","dispatchEvent","toOpenResourceInput","strategy","replaceActive","createWorkbenchWebviewHostCapabilities","commands.execute","workbench","commands","executeCommand","commandId","resource.open","resource","resources","openResource","notification.show","notification","notifications","show","level","preferences.get","preferences","getValue","preferences.set","setValue","host.dispatchKeyboardEvent","dispatchKeyboardEvent","logWebviewDiagnostics","webviewId","console","warn","logWebviewError","BRIDGE_WEBVIEW_RENDERER_ID","isBridgeWebviewConfig","Array","isArray","config","createPlacementProps","placement","createLightTheme","hostEventPublishersByWorkbench","WeakMap","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","get","Map","set","key","instanceId","renderBridgeWebviewFrame","context","createHostCapabilities","createProps","createTheme","ownerId","extensionId","id","renderBridgeWebview","panel","panelId","createBridgeWebviewRenderer","render","renderInput","defineSlot","description","metadata","isLocalizedString","$l10n","text","default","unwrapCommandValue","result","response","outcome","status","reason","toExtensionCommandResource","type","uri","toWorkbenchResource","icon","projectId","encodeURIComponent","createExtensionSlot","executeWorkbenchExtensionCommand","slot","source","Boolean","isCommand","isResource","isResourceTarget","target","isPanelTarget","region","isItemTarget","command","isExtensionNavigationTarget","targets","every","toResourceInput","_sourcePlacement","toPanelInput","sourcePlacement","shared","toCommandTarget","override","commandTargetOf","commandIdOf","args","toWorkbenchNavigationTarget","section","resourceOf","map","toWorkbenchNavigationTargetResult","isProviderQueryResult","activateTarget","record","commandPaletteResources","refresh","navigation","openTarget","resourceTarget","resolved","FILE_SECTION_NAVIGATION_METADATA_KEY","treeId","targetNodeId","anchors","toResult","groupLabel","keywords","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","registerProvider","refreshEventIds","query","limit","activeResource","getActiveResource","queryCommandId","modeId","modes","getActiveModeId","providerId","items","dispose","toPanelPlacements","for","resourceKind","createWorkbenchCompositionRegistry","resourceKinds","panels","resourcePanels","remove","list","createDisposable","indexOf","splice","registerResourceKind","definition","registerPanelCapability","registerResourcePanel","edge","registerModeComposition","getComposition","getModeComposition","extractPersistedState","layout","knownPanelIds","regions","dockedCompositionRegions","state","order","widgets","filter","contributionId","active","find","widgetId","activeWidgetId","activePanelId","listCompositionAddablePanels","mode","registry","composition","resolveComposition","persisted","addablePanels","placementRole","applyPlacement","ctx","getLayout","existingRegion","some","candidate","openWidget","closable","required","pinned","role","origin","allowedRegions","includes","existing","updateWidgetPlacement","restoreActiveTabs","activeBefore","widget","setRegionActiveWidget","reportRequiredFallback","notificationId","compositionRequiredNotificationId","requiredFallback","dismiss","fallbackPanelId","main","join","reconcileCompositionLayout","seeding","placements","reconcilePanelMenus","toBridgeWebviewConfig","declarationPriority","declarationIndex","priority","panelResourceKinds","kinds","flatMap","all","panelDefaultRegion","toWorkbenchCompositionPanelContribution","rendererId","singleton","panelMenus","toWorkbenchPanelMenus","menuDeclarationOffset","panelMenuDeclarationOffsets","offsets","total","panelMenuRendererId","menu","renderer","menuPlacementBasePriority","first","last","menus","declarationOffset","side","registerWorkbenchExtensionPanel","registerPanel","contribution","panelRendererId","localize","isQueryResult","registerControlsRenderer","adapter","controlsRendererId","run","invocation","Promise","resolve","renderers","emptyTitle","emptyDescription","defaultValues","executeQuery","queryHandlerId","resolveResource","updateValue","valueChangeHandlerId","controlId","values","apply","applyHandlerId","reset","resetHandlerId","controlIds","registerControlsViewWidget","registerWorkbenchExtensionControlsRenderers","menuOffsets","forEach","disposable","toColumn","column","createElement","WorkbenchIcon","size","toRow","row","registerRenderer","originalRows","dataTableRendererId","registerDataTableRenderer","columns","initialPageSize","pageSizeOptions","selectionMode","selectionActions","action","destructive","rowIds","mapped","rowActions","rowId","refreshDataTableRenderer","onRowActivate","rowActivationHandlerId","registerView","registerWorkbenchExtensionDataTableRenderers","placementOrder","emptyWorkbenchExtensionMetadata","commandPaletteContributions","extensions","menuContributions","routes","kanbanRenderers","dataTableRenderers","treeRenderers","fileRenderers","settingsPanels","settingsDefinitions","treeItems","defaultWorkbenchExtensionCommandId","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","createMenuItem","resolveString","when","sourceCommandId","overflowLabel","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","createCommandId","createWhenExpression","menuSlotsById","menuTargetsById","registrations","slotId","category","menuItem","menuPath","targetCommandId","buildWorkbenchExtensionCommandPaletteRegistrations","buildWorkbenchExtensionRouteEntries","createResource","route","toExtensionResource","slotContext","resourceType","resourceId","executeFileCommand","extra","ext","revisionFromValue","revision","fileRendererRefreshEnvelopeFromCommand","fileRendererOrigin","operationId","resourceUri","fileRendererResourceUri","registerFileRenderer","load","loadHandlerId","save","saveHandlerId","content","registerFileViewWidget","registerWorkbenchExtensionFileRenderers","localizeAttributes","decorate","attribute","base","option","createMutableAttributeSource","initial","snapshot","listeners","getSnapshot","isWorkbenchResource","isExtensionResource","rowResourceUri","defaultResolveRowResource","_","defaultResolveRowActionResource","fromRow","toWorkbenchRow","mergeParams","Object","assign","asParams","hasCommandParameters","keys","CREATE_FIELD_TYPES","toCreateField","descriptor","optional","placeholder","defaultValue","multiple","accept","toCreateFields","entries","createRow","field","createKanbanRendererSlot","kanbanRendererId","executeKanbanRendererCommand","commandResource","getPrimaryResource","kanbanRendererRowActionCommandId","registerRowActionCommands","getCommand","registerCommand","execute","executionContext","runDefaultRowAction","commandPalette","requestParams","createBoardActionIcon","BoardActionIcon","toWorkbenchBoardColumnConfig","canDragIn","canDragOut","canCreate","actions","createRowActionIcon","toCreateRowConfig","submitLabel","fields","labels","cancel","properties","submitError","removeFile","toRowClick","resolveRowResource","toActivatedRow","resolveNavigationResource","onRowClick","toCreateRowHandler","runMutation","submission","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","toRowContextMenuActions","resolveRowActionResource","runDefault","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","resolveLabel","decorateAttribute","afterMutation","onAfterMutation","columnConfigs","rowResource","registerKanbanRenderer","storageScope","defaultSettings","defaultFilters","defaultViews","defaultActiveViewId","hideToolbar","getBoardColumnConfig","groupKey","settings","filters","boardColumnConfigs","onAttributeChange","attributeChangeHandlerId","attributeId","onReorder","reorderHandlerId","beforeRowId","onCreateRow","onColumnAction","columnActionHandlerId","actionId","getRowContextMenuActions","localizeParamSchema","fromEntries","treeViewsFor","resolveTreeView","viewId","resolveHostTreeHeaderNodes","getHostTreeHeaderNodes","treeViews","hostTreeHeader","resolveHostTreeFooterNodes","getHostTreeFooterNodes","hostTreeFooter","registerTreeViewWidget","refId","sectionNavigation","createQueryParams","node","getTreeState","executeCallback","executeTreeActionCommand","rendererParams","toActionParams","toRecordParams","createTreeMapper","originalNodes","runnerCommandId","resolveNodeResource","mapEmptyState","emptyState","mapTarget","commandTarget","nodeId","mapAction","disabled","mapNode","iconColor","iconTooltip","rowVariant","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","mapNodes","nodes","mapSections","sections","isTreeSectionArray","isTreeNodeArray","selectedNodeIdFromNodes","selected","selectedChild","selectedNodeIdFromSections","selectedNodeId","registerTree","mapper","commandDisposable","rawArgs","setSelectedNode","listFileRenderers","refreshFileRenderer","treeDisposable","registerTreeRenderer","searchable","searchPlaceholder","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","getBody","bodyHandlerId","getFooter","hostFooter","footerHandlerId","getChildren","childrenHandlerId","originalNode","registerWorkbenchExtensionTreeRenderers","createExtensionWebviewHostCapabilities","slotKind","files","upload","routeResource","routeResourceKind","extensionRouteId","path","routeFromResource","registerWorkbenchExtensionRoutes","getKind","registerKind","registerPresenter","canOpen","openInput","openPanel","treeTargetRegions","resolveWorkbenchTreeRegion","targetForTreeAction","href","registerWorkbenchExtensionTreeItems","targetItems","openHref","routeResourceKindDefault","settingsSectionIdDefault","disposeAll","asPreferenceValue","preferenceScope","withHostCapabilityOverrides","createBase","createOverrides","createExtensionHostCapabilities","createWebviewHostCapabilities","webviewFiles","createWebviewHostCapabilityOverrides","registerBridgeRenderer","getRenderer","createWebviewProps","createWebviewTheme","registerCommands","menuCommandResource","registerMenus","createMenuWhenExpression","registration","registerMenuItem","registerCommandPaletteContributions","isVisible","matchesResourceWhen","workbenchCommandPaletteMenuPath","registerWebviewPanels","registerStatusItems","statusItems","registerWidget","matchesMode","sync","placed","removeWidgetPlacement","onDidChangeActive","registerSettings","sectionId","settingsSectionId","getSection","registerSection","settingsSectionTitle","setting","enum","registerSchema","collectResourceKindPresenterRecords","surface","resourcePresenterPanels","ownerExtensionId","edgePanelIds","placedPanelRegion","openResourcePresenter","instances","primaryIndex","findIndex","entry","registerResourceKindPresenter","registerResourcePresenters","registerComposition","slots","modePanels","extensionResourceUri","toModeDefaultResource","defaultResource","registerModes","applyComposition","navigator","getSelectedResource","shell","setSidePanelPresentation","registerMode","panelRegions","listAddablePanels","workbenchPanelRegions","seed","reconcile","registerWorkbenchExtensionContributions","refreshWorkbenchExtensionRenderer","envelope","refreshControlsRenderer","refreshKanbanRenderer","rendererRefreshTargets","eventId","eventTargets","controlsRenderers","registerWorkbenchExtensionRendererRefreshEvents","findOpenPlacement","listPanelInstances","restoreActiveWidget","activatePanel","refreshOpenWorkbenchExtensionWebviews"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extensions.js","sources":["../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/theme.ts","../../pstdio-extensions/src/bridge/host/extension-frame.tsx","../../pstdio-extensions/src/bridge/host/host-event-publisher.ts","../src/extensions/bridge/terminal-session-capability.ts","../src/extensions/bridge/webview-host-capabilities.ts","../src/extensions/bridge/bridge-webview-renderer.tsx","../../pstdio-api-contracts/src/extension-kernel/builtin-refs.ts","../../pstdio-api-contracts/src/extension-kernel/refs.ts","../../pstdio-api-contracts/src/extension-kernel/slots.ts","../../pstdio-api-contracts/src/extension-kernel/kernel-slots.ts","../../pstdio-api-contracts/src/extension-kernel/l10n.ts","../../pstdio-extensions/src/workbench/shared/localization.ts","../src/extensions/host/command-response.ts","../src/extensions/host/workbench-extension-command.ts","../src/extensions/host/extension-navigation-target.ts","../src/extensions/contributions/command-palette-resource-contributions.ts","../src/extensions/contributions/composition-contributions.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/contributions/panel-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.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/kanban-renderer-contribution-helpers.ts","../src/extensions/contributions/kanban-renderer-contributions.ts","../src/extensions/contributions/param-schema-localization.ts","../src/extensions/contributions/tree-renderer-host-defaults.ts","../src/extensions/contributions/tree-renderer-panels.ts","../src/extensions/contributions/tree-renderer-contributions.ts","../src/extensions/contributions/navigation-item-contributions.ts","../src/extensions/host/workbench-extension-composition.ts","../src/extensions/host/workbench-extension-keybindings.ts","../src/extensions/host/workbench-extension-metadata-ref.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/host/workbench-extension-surfaces.ts","../src/extensions/host/workbench-extension-host.ts"],"sourcesContent":["import type { HostCapabilityRequest } from \"./index\";\n\nexport const WEBVIEW_HOST_CAPABILITY_VERSION = 1;\n\n// Capabilities a webview must declare in its manifest before the bridge will route them.\nexport const WEBVIEW_DECLARABLE_CAPABILITIES = [\n \"commands.execute\",\n \"resource.open\",\n \"notification.show\",\n \"notification.action\",\n \"notification.resolve\",\n \"notification.dismiss\",\n \"preferences.get\",\n \"preferences.set\",\n \"extension.settings.all\",\n \"extension.settings.get\",\n \"extension.settings.set\",\n \"extension.settings.delete\",\n \"terminal.session\",\n \"files.upload\",\n \"files.list\",\n \"files.delete\",\n] as const;\n\n// Runtime plumbing the guest invokes on its own (e.g. keyboard forwarding). These are\n// enabled whenever the host implements them, with no manifest declaration required.\nexport const ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES = [\"host.dispatchKeyboardEvent\"] as const;\n\nexport const WEBVIEW_HOST_CAPABILITIES = [\n ...WEBVIEW_DECLARABLE_CAPABILITIES,\n ...ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n] as const;\n\nexport type WebviewHostCapability = (typeof WEBVIEW_HOST_CAPABILITIES)[number];\nexport type WebviewDeclarableCapability = (typeof WEBVIEW_DECLARABLE_CAPABILITIES)[number];\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);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability => publicCapabilityNames.has(name);\n\nconst parseCapabilityDeclaration = (capability: string) => {\n const [name, versionText] = capability.split(\"@\");\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name: name ?? \"\", version };\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\n // Always-available capabilities never need a declaration — enable them wherever the\n // host implements them.\n for (const name of ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES) {\n if (capabilities[name]) allowed.add(name);\n }\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\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 if (!capabilities[parsed.name]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n allowed.add(parsed.name);\n }\n\n return { allowed, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\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\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method)) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n if (!allowed.has(request.method)) {\n const diagnostic = undeclaredCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n return await handler(request.params);\n },\n };\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","import type { ThemePreference } from \"../contract\";\n\nexport const collectChakraThemeVariables = () => {\n if (typeof document === \"undefined\") return {};\n\n const computed = getComputedStyle(document.documentElement);\n const variables: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) {\n const name = computed.item(index);\n if (name.startsWith(\"--chakra-\")) {\n variables[name] = computed.getPropertyValue(name).trim();\n }\n }\n return variables;\n};\n\nexport const resolveActiveTheme = (fallback: ThemePreference): ThemePreference => {\n if (typeof document === \"undefined\") return fallback;\n const value = document.documentElement.getAttribute(\"data-theme\");\n if (value === \"dark\" || value === \"light\") return value;\n\n const colorMode = document.documentElement.getAttribute(\"data-color-mode\");\n return colorMode === \"dark\" || colorMode === \"light\" ? colorMode : fallback;\n};\n\nexport const postThemeToFrame = (\n iframe: HTMLIFrameElement | null,\n theme: ThemePreference,\n variables: Record<string, string>,\n) => {\n iframe?.contentWindow?.postMessage({ type: \"pstdio.theme\", theme, variables }, \"*\");\n};\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { host } from \"rimless\";\nimport type {\n ExtensionViewDescriptor,\n HostCapabilityRegistry,\n HostCapabilityRequest,\n HostEventMessage,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"../contract\";\nimport { createHostCapabilityGate } from \"../contract\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\nimport type { HostEventPublisher } from \"./host-event-publisher\";\nimport { collectChakraThemeVariables, resolveActiveTheme } from \"./theme\";\n\nexport interface ExtensionFrameProps {\n view: ExtensionViewDescriptor;\n props: unknown;\n theme: ThemePreference;\n capabilities?: HostCapabilityRegistry;\n /** Publisher whose emitted events are forwarded into the guest once connected. */\n hostEvents?: HostEventPublisher;\n onReady?: () => void;\n onError?: (error: { message: string; stack?: string }) => void;\n onDiagnostics?: (diagnostics: WebviewCapabilityDiagnostic[]) => void;\n title?: string;\n}\n\ntype GuestRemote = {\n init: (message: {\n moduleUrl: string;\n styles: string[];\n props: unknown;\n theme: ThemePreference;\n themeVariables: Record<string, string>;\n extensionId: string;\n }) => Promise<void>;\n themeUpdate: (message: { theme: ThemePreference; variables: Record<string, string> }) => void;\n propsUpdate: (message: { props: unknown }) => void;\n hostEvent?: (message: HostEventMessage) => void;\n};\n\nconst iframeStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n flex: \"1 1 0%\",\n height: \"100%\",\n minHeight: 0,\n width: \"100%\",\n};\n\nconst frameShellStyle: CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n minHeight: 0,\n position: \"relative\",\n width: \"100%\",\n};\n\nconst errorOverlayStyle: CSSProperties = {\n alignItems: \"center\",\n background: \"rgba(255, 255, 255, 0.92)\",\n color: \"#7a1f12\",\n display: \"flex\",\n inset: 0,\n justifyContent: \"center\",\n padding: \"24px\",\n position: \"absolute\",\n textAlign: \"center\",\n zIndex: 1,\n};\n\nexport const EXTENSION_IFRAME_SANDBOX = \"allow-scripts allow-forms allow-popups\";\n\nexport const ExtensionFrame = (props: ExtensionFrameProps) => {\n const {\n view,\n props: extensionProps,\n theme,\n capabilities,\n hostEvents,\n onReady,\n onError,\n onDiagnostics,\n title,\n } = props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const remoteRef = useRef<GuestRemote | null>(null);\n const initializedRef = useRef(false);\n const connectedKeyRef = useRef<string | null>(null);\n const propsRef = useRef(extensionProps);\n const themeRef = useRef(theme);\n const capabilitiesRef = useRef(capabilities);\n const hostEventsRef = useRef(hostEvents);\n const declaredCapabilitiesRef = useRef(view.webview.capabilities);\n const onReadyRef = useRef(onReady);\n const onErrorRef = useRef(onError);\n const onDiagnosticsRef = useRef(onDiagnostics);\n const [runtimeError, setRuntimeError] = useState<string | null>(null);\n // Bumped when the browser reloads the iframe (e.g. a DOM reparent while the Side\n // Panel floats). The bump remounts a fresh iframe so a single clean connection\n // owns the new browsing context.\n const [frameEpoch, setFrameEpoch] = useState(0);\n\n propsRef.current = extensionProps;\n themeRef.current = theme;\n capabilitiesRef.current = capabilities;\n hostEventsRef.current = hostEvents;\n declaredCapabilitiesRef.current = view.webview.capabilities;\n onReadyRef.current = onReady;\n onErrorRef.current = onError;\n onDiagnosticsRef.current = onDiagnostics;\n\n // Connect once per iframe (keyed by runtime/module URL). React StrictMode dev double-mount and\n // parent re-renders with unstable prop references (e.g. `webview.styles` rebuilt by\n // `.map`) would otherwise tear down the live connection while the iframe keeps its\n // state, leaving guest-to-host RPCs with no listener.\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n // Moving the iframe in the DOM (e.g. the Side Panel switching between attached and\n // floating hosts) reloads it to about:blank because the src attribute is empty. A\n // load event after a completed boot therefore means the runtime document is gone;\n // bumping the epoch remounts a fresh iframe and re-runs this effect. The listener\n // attaches before the connected guard so StrictMode's dev-only remount cannot\n // leave the iframe without one.\n const onFrameLoad = () => {\n if (!initializedRef.current) return;\n setFrameEpoch((epoch) => epoch + 1);\n };\n iframe.addEventListener(\"load\", onFrameLoad);\n const removeLoadListener = () => iframe.removeEventListener(\"load\", onFrameLoad);\n\n const connectedKey = `${frameEpoch}\\n${view.webview.runtimeUrl}\\n${view.webview.moduleUrl}`;\n if (connectedKeyRef.current === connectedKey) return removeLoadListener;\n connectedKeyRef.current = connectedKey;\n\n // Snapshot styles at connect time so subsequent parent re-renders that produce a\n // new array reference don't affect what we send in init.\n const stylesAtConnect = view.webview.styles;\n const moduleUrlAtConnect = view.webview.moduleUrl;\n\n const reportDiagnostics = (diagnostics: WebviewCapabilityDiagnostic[]) => {\n if (diagnostics.length > 0) onDiagnosticsRef.current?.(diagnostics);\n };\n\n const createCapabilityGate = () =>\n createHostCapabilityGate({\n capabilities: capabilitiesRef.current ?? {},\n declaredCapabilities: declaredCapabilitiesRef.current,\n onDiagnostic: (diagnostic) => reportDiagnostics([diagnostic]),\n });\n\n reportDiagnostics(createCapabilityGate().diagnostics);\n\n const hostApi = {\n ready: () => {\n // no-op; init fires from host.connect().then() below.\n },\n runtimeError: (payload: { message: string; stack?: string }) => {\n setRuntimeError(payload.message);\n onErrorRef.current?.(payload);\n },\n call: async (request: HostCapabilityRequest) => {\n return await createCapabilityGate().call(request);\n },\n };\n\n const connect = () => {\n initializedRef.current = false;\n remoteRef.current = null;\n\n const connection = host.connect(iframe, hostApi);\n // A sandboxed iframe without allow-same-origin posts messages with origin \"null\".\n // Leaving the iframe src attribute empty lets rimless validate the guest by\n // contentWindow identity while still loading the API-owned runtime document.\n iframe.contentWindow?.location.replace(view.webview.runtimeUrl);\n\n connection\n .then(async (conn) => {\n 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 initializedRef.current = true;\n setRuntimeError(null);\n onReadyRef.current?.();\n })\n .catch((error) => {\n const normalized = normalizeRuntimeError(error);\n setRuntimeError(normalized.message);\n onErrorRef.current?.(normalized);\n });\n };\n\n connect();\n\n // Intentionally no connection.close() in cleanup. The iframe runtime handshakes once\n // at iframe load and binds to that connection ID. Closing during React StrictMode's\n // dev-only cleanup would leave the live iframe with no host listener.\n return removeLoadListener;\n }, [frameEpoch, view.extensionId, view.webview.runtimeUrl, view.webview.moduleUrl, view.webview.styles]);\n\n // Re-renders may hand the frame a fresh publisher (renderers rebuild their\n // capability context per render); route it to the live connection.\n useEffect(() => {\n const remote = remoteRef.current;\n if (!remote || !hostEvents) return;\n hostEvents.bind((message) => remote.hostEvent?.(message));\n // Release the sink so a replaced publisher stops referencing this remote\n // and returns to buffering.\n return () => hostEvents.unbind();\n }, [hostEvents]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.propsUpdate({ props: extensionProps });\n }, [extensionProps]);\n\n useEffect(() => {\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(theme),\n variables: collectChakraThemeVariables(),\n });\n }, [theme]);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof MutationObserver === \"undefined\") return;\n\n let frame: number | null = null;\n const schedule = () => {\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = null;\n if (!initializedRef.current) return;\n remoteRef.current?.themeUpdate({\n theme: resolveActiveTheme(themeRef.current),\n variables: collectChakraThemeVariables(),\n });\n });\n };\n\n const observer = new MutationObserver(schedule);\n const options = { attributeFilter: [\"class\", \"data-color-mode\", \"data-theme\", \"style\"], attributes: true };\n observer.observe(document.documentElement, options);\n observer.observe(document.body, options);\n\n return () => {\n observer.disconnect();\n if (frame !== null) cancelAnimationFrame(frame);\n };\n }, []);\n\n return (\n <div style={frameShellStyle}>\n {runtimeError ? (\n <div role=\"alert\" style={errorOverlayStyle}>\n <div>\n <strong>Extension view failed to load.</strong>\n <div>{runtimeError}</div>\n </div>\n </div>\n ) : null}\n <iframe\n key={frameEpoch}\n ref={iframeRef}\n title={title ?? view.label}\n allow=\"fullscreen\"\n allowFullScreen\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 // Moving the iframe in the DOM (e.g. the Side Panel switching between attached\n // and floating hosts) reloads it to about:blank because the src attribute is\n // empty. A load event after a completed boot therefore means the runtime\n // document is gone; bumping the epoch remounts a fresh iframe and reconnects.\n onLoad={() => {\n if (initializedRef.current) setFrameEpoch((epoch) => epoch + 1);\n }}\n onError={() => {\n const message = `Failed to load extension runtime at ${view.webview.runtimeUrl}`;\n setRuntimeError(message);\n onErrorRef.current?.({ message });\n }}\n />\n </div>\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 type { TerminalHostEvent, TerminalSessionOperation, TerminalSessionResult } from \"@pstdio/sdk/api\";\nimport type { HostCapability } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { WorkbenchTerminalController } from \"../../core\";\n\nexport const TERMINAL_SESSION_EVENT_SCOPE = \"terminal.session\";\n\ninterface CreateTerminalSessionCapabilityInput {\n terminal: WorkbenchTerminalController;\n hostEvents: HostEventPublisher;\n}\n\n/**\n * Host side of the `terminal.session` webview capability. Sessions live in the\n * workbench terminal controller; only serializable operation payloads and session\n * ids cross the webview boundary. Output/exit events flow through the host event\n * publisher under the `terminal.session` scope.\n */\nexport const createTerminalSessionCapability = (input: CreateTerminalSessionCapabilityInput): HostCapability => {\n const { terminal, hostEvents } = input;\n\n const emit = (payload: TerminalHostEvent) => {\n hostEvents.emit({ scope: TERMINAL_SESSION_EVENT_SCOPE, payload });\n };\n\n return async (params) => {\n const operation = params as TerminalSessionOperation;\n\n switch (operation.operation) {\n case \"open\": {\n const { sessionId } = await terminal.open({ request: operation.request });\n return { operation: \"open\", sessionId } satisfies TerminalSessionResult;\n }\n case \"write\":\n terminal.write({ sessionId: operation.sessionId, data: operation.data });\n return { operation: \"write\", accepted: true } satisfies TerminalSessionResult;\n case \"resize\":\n terminal.resize({ sessionId: operation.sessionId, cols: operation.cols, rows: operation.rows });\n return { operation: \"resize\", accepted: true } satisfies TerminalSessionResult;\n case \"kill\":\n await terminal.kill({ sessionId: operation.sessionId, signal: operation.signal });\n return { operation: \"kill\", accepted: true } satisfies TerminalSessionResult;\n case \"subscribe\": {\n const { sessionId } = operation;\n let unsubscribeTerminal = () => {};\n let unsubscribeDisconnect = () => {};\n let closed = false;\n const close = () => {\n if (closed) return;\n closed = true;\n unsubscribeTerminal();\n unsubscribeDisconnect();\n };\n\n unsubscribeTerminal = terminal.subscribe(sessionId, {\n onData: (chunk) => emit({ sessionId, kind: \"data\", chunk }),\n onExit: (exit) => {\n emit({ sessionId, kind: \"exit\", code: exit.code, signal: exit.signal });\n close();\n },\n });\n unsubscribeDisconnect = hostEvents.onDisconnect(close);\n return { operation: \"subscribe\", accepted: true } satisfies TerminalSessionResult;\n }\n }\n };\n};\n","import type { ExtensionResourceOpenIntent } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type { PreferenceScopeRef, PreferenceValue, ResourceRef, WorkbenchCore } from \"../../core\";\nimport { createTerminalSessionCapability } from \"./terminal-session-capability\";\n\ninterface CreateWorkbenchWebviewHostCapabilitiesInput {\n dispatchKeyboardEvent?: (event: KeyboardEventInit) => void;\n workbench: WorkbenchCore;\n /** Event channel into the guest; terminal.session is only offered when present. */\n hostEvents?: HostEventPublisher;\n}\n\nconst dispatchDocumentKeyboardEvent = (params: KeyboardEventInit) => {\n if (typeof document === \"undefined\") return;\n const event = new KeyboardEvent(\"keydown\", { ...params, bubbles: true, cancelable: true });\n document.dispatchEvent(event);\n};\n\nexport const toOpenResourceInput = (input: ExtensionResourceOpenIntent | undefined) => {\n if (!input?.strategy || input.strategy === \"persistent\") return {};\n return { replaceActive: true };\n};\n\nexport const createWorkbenchWebviewHostCapabilities = (input: CreateWorkbenchWebviewHostCapabilitiesInput) =>\n ({\n \"commands.execute\": (params: unknown) => {\n const request = params as { commandId: string; params?: unknown };\n return input.workbench.commands.executeCommand(request.commandId, request.params);\n },\n \"resource.open\": (params: unknown) => {\n const request = params as { input?: ExtensionResourceOpenIntent; resource?: ResourceRef };\n if (!request.resource) throw new Error(\"resource.open requires a resource.\");\n return input.workbench.resources.openResource(request.resource, toOpenResourceInput(request.input));\n },\n \"notification.show\": (params: unknown) => {\n const notification = params as Parameters<WorkbenchCore[\"notifications\"][\"show\"]>[0];\n return input.workbench.notifications.show({\n level: notification.level,\n message: notification.message,\n title: notification.title,\n });\n },\n \"preferences.get\": (params: unknown) => {\n const request = params as { name: string; scope?: PreferenceScopeRef };\n return input.workbench.preferences.getValue(request.name, request.scope);\n },\n \"preferences.set\": (params: unknown) => {\n const request = params as { name: string; scope?: PreferenceScopeRef; value: PreferenceValue };\n input.workbench.preferences.setValue(request.name, request.value, request.scope ?? { scope: \"user\" });\n return { name: request.name, value: request.value };\n },\n \"host.dispatchKeyboardEvent\": (params: unknown) =>\n (input.dispatchKeyboardEvent ?? dispatchDocumentKeyboardEvent)(params as KeyboardEventInit),\n ...(input.hostEvents\n ? {\n \"terminal.session\": createTerminalSessionCapability({\n terminal: input.workbench.terminal,\n hostEvents: input.hostEvents,\n }),\n }\n : {}),\n }) satisfies HostCapabilityRegistry;\n","import type {\n HostCapabilityRegistry,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"pstdio-extensions/bridge/contract\";\nimport { createHostEventPublisher, ExtensionFrame, type HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type {\n WorkbenchCore,\n WorkbenchPanelInstance,\n WorkbenchPanelRenderInput,\n WorkbenchRendererRegistration,\n} from \"../../core\";\nimport { createWorkbenchWebviewHostCapabilities } from \"./webview-host-capabilities\";\n\nconst logWebviewDiagnostics = (webviewId: string, diagnostics: WebviewCapabilityDiagnostic[]) => {\n for (const diagnostic of diagnostics) {\n console.warn(`[workbench.webview:${webviewId}] ${diagnostic.code}/${diagnostic.capability}: ${diagnostic.message}`);\n }\n};\n\nconst logWebviewError = (webviewId: string, message: string) => {\n console.error(`[workbench.webview:${webviewId}] runtime error: ${message}`);\n};\n\nexport interface BridgeWebviewRenderContext {\n workbench: WorkbenchCore;\n webviewId: string;\n placement: WorkbenchPanelInstance;\n /** Channel for pushing host events (e.g. terminal output) into this webview. */\n hostEvents: HostEventPublisher;\n}\n\n// How guest capability calls reach the host. Hosts inject this to swap the workbench-native\n// wiring for their own — e.g. the dashboard routes `commands.execute` through its REST API.\nexport type CreateBridgeWebviewHostCapabilities = (context: BridgeWebviewRenderContext) => HostCapabilityRegistry;\n\n// What the host pushes into the guest's props store. Hosts inject this to forward dynamic\n// data — e.g. the dashboard forwards extension command outcomes and theme preference.\nexport type CreateBridgeWebviewProps = (context: BridgeWebviewRenderContext) => unknown;\nexport type CreateBridgeWebviewTheme = (context: BridgeWebviewRenderContext) => ThemePreference;\n\ninterface CreateBridgeWebviewRendererInput {\n createHostCapabilities?: CreateBridgeWebviewHostCapabilities;\n createProps?: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n}\n\nexport const BRIDGE_WEBVIEW_RENDERER_ID = \"webview:bridge\";\n\nexport interface BridgeWebviewConfig {\n title?: string;\n runtimeUrl: string;\n moduleUrl: string;\n styles?: string[];\n capabilities?: string[];\n}\n\nconst isBridgeWebviewConfig = (value: unknown): value is BridgeWebviewConfig => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const config = value as Partial<BridgeWebviewConfig>;\n return typeof config.runtimeUrl === \"string\" && typeof config.moduleUrl === \"string\";\n};\n\nconst createPlacementProps: CreateBridgeWebviewProps = ({ placement }) => ({\n placement,\n resource: placement.resource,\n});\n\nconst createLightTheme: CreateBridgeWebviewTheme = () => \"light\";\n\nconst hostEventPublishersByWorkbench = new WeakMap<WorkbenchCore, Map<string, HostEventPublisher>>();\n\nexport const getBridgeWebviewHostEventPublisher = (workbench: WorkbenchCore, instance: WorkbenchPanelInstance) => {\n let hostEventsByWidget = hostEventPublishersByWorkbench.get(workbench);\n if (!hostEventsByWidget) {\n hostEventsByWidget = new Map();\n hostEventPublishersByWorkbench.set(workbench, hostEventsByWidget);\n }\n\n const key = instance.instanceId;\n let hostEvents = hostEventsByWidget.get(key);\n if (!hostEvents) {\n hostEvents = createHostEventPublisher();\n hostEventsByWidget.set(key, hostEvents);\n }\n\n return hostEvents;\n};\n\nexport const renderBridgeWebviewFrame = (input: {\n context: BridgeWebviewRenderContext;\n createHostCapabilities: CreateBridgeWebviewHostCapabilities;\n createProps: CreateBridgeWebviewProps;\n createTheme?: CreateBridgeWebviewTheme;\n ownerId?: string;\n title: string;\n webview: BridgeWebviewConfig;\n}) => {\n const {\n context,\n createHostCapabilities,\n createProps,\n createTheme = createLightTheme,\n ownerId,\n title,\n webview,\n } = input;\n return (\n <ExtensionFrame\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 theme={createTheme(context)}\n capabilities={createHostCapabilities(context)}\n hostEvents={context.hostEvents}\n onDiagnostics={(diagnostics) => logWebviewDiagnostics(context.webviewId, diagnostics)}\n onError={(error) => logWebviewError(context.webviewId, error.message)}\n />\n );\n};\n\nconst renderBridgeWebview = (\n input: WorkbenchPanelRenderInput,\n createHostCapabilities: CreateBridgeWebviewHostCapabilities,\n createProps: CreateBridgeWebviewProps,\n createTheme: CreateBridgeWebviewTheme,\n) => {\n const { workbench, panel, instance } = input;\n const webview = isBridgeWebviewConfig(panel.config) ? panel.config : null;\n if (!webview) return null;\n\n return renderBridgeWebviewFrame({\n context: {\n workbench,\n webviewId: instance.panelId,\n placement: instance,\n hostEvents: getBridgeWebviewHostEventPublisher(workbench, instance),\n },\n createHostCapabilities,\n createProps,\n createTheme,\n ownerId: \"ownerId\" in panel ? panel.ownerId : undefined,\n title: panel.title,\n webview,\n });\n};\n\nexport const createBridgeWebviewRenderer = (input: CreateBridgeWebviewRendererInput = {}) => {\n const createHostCapabilities = input.createHostCapabilities ?? createWorkbenchWebviewHostCapabilities;\n const createProps = input.createProps ?? createPlacementProps;\n const createTheme = input.createTheme ?? createLightTheme;\n\n return {\n id: BRIDGE_WEBVIEW_RENDERER_ID,\n render: (renderInput) => renderBridgeWebview(renderInput, createHostCapabilities, createProps, createTheme),\n } satisfies WorkbenchRendererRegistration;\n};\n","import type { ResourceKindDefinition } from \"./types/composition\";\nimport type { ContributionKind } from \"./types/contribution-identity\";\n\nconst hostRef = <Kind extends ContributionKind>(kind: Kind, id: string) => ({ extensionId: \"pstdio\", kind, id });\n\nexport const workbenchCommands = {\n switchMode: hostRef(\"command\", \"workbench.action.switchMode\"),\n};\n\nexport const workbenchModes = {\n project: hostRef(\"mode\", \"project\"),\n settings: hostRef(\"mode\", \"settings\"),\n};\n\nconst hostResourceKind = (\n id: string,\n label: string,\n menuSlots: ResourceKindDefinition[\"menuSlots\"],\n): ResourceKindDefinition => ({\n id,\n ref: hostRef(\"resource-kind\", id),\n surface: \"primary\",\n label,\n menuSlots,\n});\n\nconst headerMenuSlots = [\n { id: \"headerPrimary\", placement: \"header-primary\", access: \"public\" },\n { id: \"headerOverflow\", placement: \"header-overflow\", access: \"public\" },\n] as const;\n\nexport const workbenchResourceKindDefinitions = {\n project: hostResourceKind(\"project\", \"Extension\", headerMenuSlots),\n session: hostResourceKind(\"session\", \"Session\", headerMenuSlots),\n workspace: hostResourceKind(\"workspace\", \"Workspace\", headerMenuSlots),\n};\n\nexport const workbenchResourceKinds = {\n project: workbenchResourceKindDefinitions.project.ref,\n session: workbenchResourceKindDefinitions.session.ref,\n workspace: workbenchResourceKindDefinitions.workspace.ref,\n};\n\nexport const workbenchSlots = {\n projectNavigation: hostRef(\"navigation-item\", \"project.navigation\"),\n projectSettings: hostRef(\"settings-panel\", \"project.settings\"),\n statusBarLeading: hostRef(\"status-bar-item\", \"status-bar.leading\"),\n statusBarTrailing: hostRef(\"status-bar-item\", \"status-bar.trailing\"),\n};\n","import type { CommandRef } from \"./types/commands\";\nimport type { EventRef } from \"./types/events\";\nimport type { Struct } from \"./types/json\";\n\ninterface ExternalRefInput {\n extensionId: string;\n id: string;\n}\n\ninterface ExtensionOwner {\n publisher: string;\n name: string;\n}\n\ninterface CommandRefFactory {\n <TParams extends Struct = Struct, TResult = unknown>(input: ExternalRefInput): CommandRef<TParams, TResult>;\n forExtension(\n owner: ExtensionOwner,\n ): <TParams extends Struct = Struct, TResult = unknown>(id: string) => CommandRef<TParams, TResult>;\n}\n\nconst createCommandRef = <TParams extends Struct = Struct, TResult = unknown>(\n input: ExternalRefInput,\n): CommandRef<TParams, TResult> => ({ ...input, kind: \"command\" });\n\n/** Build a typed cross-extension command reference. */\nexport const commandRef: CommandRefFactory = Object.assign(createCommandRef, {\n forExtension:\n (owner: ExtensionOwner) =>\n <TParams extends Struct = Struct, TResult = unknown>(id: string): CommandRef<TParams, TResult> =>\n createCommandRef({ extensionId: `${owner.publisher}.${owner.name}`, id }),\n});\n\n/** Build a typed event reference from separate ownership and local identity. */\nexport const eventRef = <TPayload extends Struct = Struct>(input: ExternalRefInput): EventRef<TPayload> => ({\n ...input,\n kind: \"event\",\n});\n","import type { Struct } from \"./types/json\";\nimport type { SlotOptions, SlotRef, UiSlotKind } from \"./types/slots\";\n\n/**\n * Define a host-owned UI slot that extension contributions can target.\n */\nexport const defineSlot = <TContext extends Struct = Struct, TKind extends UiSlotKind = UiSlotKind>(\n id: string,\n options: SlotOptions<TKind>,\n): SlotRef<TContext, TKind> => ({\n id,\n kind: options.kind,\n label: options.label,\n description: options.description,\n metadata: options.metadata,\n});\n","import { workbenchResourceKinds } from \"./builtin-refs\";\nimport { eventRef } from \"./refs\";\nimport { defineSlot } from \"./slots\";\nimport type { Struct } from \"./types/json\";\nimport type { ResourceAnchor } from \"./types/resources\";\nimport type { ExtensionWorkspace } from \"./types/workspaces\";\n\nconst hostEventRef = <TPayload extends Struct>(id: string) => eventRef<TPayload>({ extensionId: \"pstdio\", id });\n\nconst resourceMenuSlotRef = (resourceKind: { id: string }, id: string) =>\n defineSlot<Struct, \"menu\">(`${resourceKind.id}.${id}`, { kind: \"menu\" });\n\n/** How a workspace's working tree is backed. `root` = the repo checkout itself; `cloud` is reserved. */\nexport type WorkspaceType = \"worktree\" | \"root\" | \"cloud\";\n\nexport interface WorkspaceProvisionPayload {\n projectId: string;\n workspaceId: string;\n workspace: ExtensionWorkspace;\n /** Absolute working directory to materialize files into — a worktree path or the repo root. */\n workspaceDir: string;\n repoPath: string;\n branch?: string;\n type: WorkspaceType;\n}\n\nexport interface SessionLifecyclePayload {\n projectId: string;\n sessionId: string;\n sessionStatus?: string;\n originalSessionId?: string;\n workspace?: ExtensionWorkspace;\n workspaceId?: string;\n worktreePath?: string;\n branch?: string;\n anchors?: ResourceAnchor[];\n}\n\nexport interface WorktreeRemovedPayload {\n projectId: string;\n repoPath?: string;\n worktreePath: string;\n workspace?: ExtensionWorkspace;\n workspaceId?: string;\n anchors?: ResourceAnchor[];\n}\n\nexport interface CommitPayload {\n projectId: string;\n repoPath?: string;\n worktreePath?: string;\n branch?: string;\n commitSha?: string;\n workspace?: ExtensionWorkspace;\n anchors?: ResourceAnchor[];\n}\n\nexport interface RebasePayload {\n projectId: string;\n repoPath?: string;\n worktreePath?: string;\n branch?: string;\n workspace?: ExtensionWorkspace;\n anchors?: ResourceAnchor[];\n}\n\nexport interface MergePayload extends CommitPayload {}\n\nexport interface ConflictPayload {\n projectId: string;\n operation: \"rebase\" | \"merge\";\n repoPath?: string;\n worktreePath?: string;\n branch?: string;\n workspace?: ExtensionWorkspace;\n anchors?: ResourceAnchor[];\n}\n\nexport const projectSlots = {\n sidenav: defineSlot<Struct, \"panel\">(\"project.sidenav\", { kind: \"panel\" }),\n headerPrimary: resourceMenuSlotRef(workbenchResourceKinds.project, \"headerPrimary\"),\n headerOverflow: resourceMenuSlotRef(workbenchResourceKinds.project, \"headerOverflow\"),\n settingsPanels: defineSlot<Struct, \"settings\">(\"project.settingsPanels\", { kind: \"settings\" }),\n};\n\nexport const sessionSlots = {\n headerPrimary: resourceMenuSlotRef(workbenchResourceKinds.session, \"headerPrimary\"),\n headerOverflow: resourceMenuSlotRef(workbenchResourceKinds.session, \"headerOverflow\"),\n};\n\nexport const workspaceSlots = {\n headerPrimary: resourceMenuSlotRef(workbenchResourceKinds.workspace, \"headerPrimary\"),\n headerOverflow: resourceMenuSlotRef(workbenchResourceKinds.workspace, \"headerOverflow\"),\n sidenav: defineSlot<Struct, \"panel\">(\"workspace.sidenav\", { kind: \"panel\" }),\n};\n\nexport const projectEvents = {\n opened: hostEventRef<{ projectId: string }>(\"project.opened\"),\n};\n\nexport const sessionEvents = {\n started: hostEventRef<SessionLifecyclePayload & { anchors?: ResourceAnchor[] }>(\"session.started\"),\n resumed: hostEventRef<SessionLifecyclePayload>(\"session.resumed\"),\n awaitingInput: hostEventRef<SessionLifecyclePayload>(\"session.awaitingInput\"),\n succeeded: hostEventRef<SessionLifecyclePayload>(\"session.succeeded\"),\n failed: hostEventRef<SessionLifecyclePayload>(\"session.failed\"),\n completed: hostEventRef<SessionLifecyclePayload & { anchors?: ResourceAnchor[] }>(\"session.completed\"),\n};\n\nexport const workspaceEvents = {\n created: hostEventRef<{ workspace: ExtensionWorkspace }>(\"workspace.created\"),\n /** Awaited: harness extensions sync their agent dir into the working tree. Gates workspace readiness. */\n provision: hostEventRef<WorkspaceProvisionPayload>(\"workspace.provision\"),\n /** Fire-and-forget after the workspace is ready: background setup (deps install, builds). */\n ready: hostEventRef<WorkspaceProvisionPayload>(\"workspace.ready\"),\n archived: hostEventRef<{ workspace: ExtensionWorkspace }>(\"workspace.archived\"),\n deleted: hostEventRef<{ workspace: ExtensionWorkspace }>(\"workspace.deleted\"),\n};\n\nexport const worktreeEvents = {\n removed: hostEventRef<WorktreeRemovedPayload>(\"worktree.removed\"),\n};\n\nexport const gitEvents = {\n committed: hostEventRef<CommitPayload>(\"git.committed\"),\n rebased: hostEventRef<RebasePayload>(\"git.rebased\"),\n merged: hostEventRef<MergePayload>(\"git.merged\"),\n conflicted: hostEventRef<ConflictPayload>(\"git.conflicted\"),\n};\n","export interface LocalizedString {\n readonly $l10n: string;\n readonly default?: string;\n}\n\nexport type Localizable<T extends string = string> = T | LocalizedString;\n\nexport const l10n = (key: string, defaultValue?: string) => ({\n $l10n: key,\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n});\n\nexport const isLocalizedString = (value: unknown): value is LocalizedString =>\n typeof value === \"object\" &&\n value !== null &&\n \"$l10n\" in value &&\n typeof (value as { $l10n?: unknown }).$l10n === \"string\";\n","import 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 { CommandExecuteResponse } from \"@pstdio/sdk/api\";\n\nexport const unwrapCommandValue = (result: unknown) => {\n const response = result as Partial<CommandExecuteResponse> | undefined;\n if (!response?.outcome) return result;\n if (response.outcome.status === \"success\") return response.outcome.value;\n throw new Error(response.outcome.reason ?? response.outcome.error?.message ?? \"Extension command failed.\");\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport {\n isWorkbenchViewHierarchyNode,\n type ResourceRef,\n type WorkbenchCommandExecutionContext,\n type WorkbenchModuleContext,\n} from \"../../core\";\nimport { unwrapCommandValue } from \"./command-response\";\n\nexport interface WorkbenchExtensionCommandContext {\n executeCommand(commandId: string, body: CommandExecuteRequest): 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}\n\nexport interface ExecuteWorkbenchExtensionCommandInput {\n metadata?: Record<string, unknown>;\n params?: Record<string, unknown>;\n resource?: ResourceRef;\n slot?: CommandExecuteRequest[\"slot\"];\n}\n\nexport const toExtensionCommandResource = (resource: ResourceRef | undefined): CommandExecuteRequest[\"resource\"] => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nexport const toWorkbenchResource = (resource: NonNullable<CommandExecuteRequest[\"resource\"]>): ResourceRef => {\n const icon = (resource as { icon?: unknown }).icon;\n const metadata = resource.projectId ? { ...resource.metadata, projectId: resource.projectId } : resource.metadata;\n return {\n kind: resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`,\n id: resource.id,\n label: resource.label,\n icon: typeof icon === \"string\" ? icon : undefined,\n metadata,\n };\n};\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});\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst deletedResourceId = (value: unknown) => {\n if (!isRecord(value) || value.deleted !== true) return undefined;\n return typeof value.id === \"string\" ? value.id : undefined;\n};\n\nconst handleDeletedResource = async (\n context: WorkbenchExtensionCommandContext,\n resource: ResourceRef | undefined,\n value: unknown,\n) => {\n if (!resource || deletedResourceId(value) !== (resource.id ?? resource.uri)) return;\n\n context.workbench.navigator.forgetResource(resource.uri);\n if (context.workbench.getPrimaryResource()?.uri !== resource.uri) return;\n\n const parent = context.workbench.resources.walkHierarchy(resource).at(-2);\n if (!parent) return;\n\n if (isWorkbenchViewHierarchyNode(parent)) {\n await context.workbench.views.openView(parent.viewId, { strategy: { kind: \"replace-active\" } });\n return;\n }\n await context.workbench.resources.openResource(parent, { replaceActive: true });\n};\n\nexport const executeWorkbenchExtensionCommand = async (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const resource = toExtensionCommandResource(input.resource);\n const response = await context.executeCommand(commandId, {\n projectId: context.projectId,\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 const value = unwrapCommandValue(response);\n await handleDeletedResource(context, input.resource, value);\n return value;\n};\n","import type { NavigationTarget as ExtensionNavigationTarget, ExtensionPlacementStrategy } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTarget, NavigationTargetCommand, ResourceRef } from \"../../core\";\nimport { toWorkbenchResource } from \"./workbench-extension-command\";\n\nexport interface ExtensionNavigationSourcePlacement {\n instanceId: string;\n}\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 resourceOf?(\n resource: Parameters<typeof toWorkbenchResource>[0],\n target: Extract<ExtensionNavigationTarget, { kind: \"resource\" }>,\n ): ResourceRef;\n sourcePlacement?: ExtensionNavigationSourcePlacement;\n}\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 isResourceTarget = (target: Record<string, unknown>) => {\n if (!isResource(target.resource)) return false;\n if (target.input === undefined) return true;\n if (!isRecord(target.input)) return false;\n const strategy = target.input.strategy;\n return strategy === undefined || strategy === \"persistent\" || strategy === \"replace-active\";\n};\n\nconst isViewTarget = (target: Record<string, unknown>) => {\n if (!isContributionRef(target.view, \"view\")) return false;\n if (target.input === undefined) return true;\n if (!isRecord(target.input)) return false;\n const strategy = target.input.strategy;\n return (\n strategy === undefined ||\n strategy === \"persistent\" ||\n strategy === \"preview\" ||\n strategy === \"replace-active\" ||\n strategy === \"replace-invoking\"\n );\n};\n\nconst isItemTarget = (value: unknown): value is Exclude<ExtensionNavigationTarget, { kind: \"compound\" }> => {\n if (!isRecord(value)) return false;\n if (value.kind === \"resource\") return isResourceTarget(value);\n if (value.kind === \"view\") return isViewTarget(value);\n if (value.kind === \"href\") return typeof value.href === \"string\";\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 isExtensionNavigationTarget = (value: unknown): value is ExtensionNavigationTarget => {\n if (isItemTarget(value)) return true;\n return (\n isRecord(value) &&\n value.kind === \"compound\" &&\n Array.isArray(value.targets) &&\n value.targets.length > 0 &&\n value.targets.every(isItemTarget)\n );\n};\n\nconst toResourceInput = (\n strategy: \"persistent\" | \"replace-active\" | undefined,\n _sourcePlacement: ExtensionNavigationSourcePlacement | undefined,\n) => {\n if (!strategy || strategy === \"persistent\") return {};\n return { replaceActive: true };\n};\n\nconst toViewInput = (\n input: { strategy?: ExtensionPlacementStrategy } | undefined,\n sourcePlacement: ExtensionNavigationSourcePlacement | undefined,\n) => {\n const strategy = input?.strategy;\n if (!strategy) return {};\n if (strategy === \"persistent\" || strategy === \"preview\" || strategy === \"replace-active\") {\n return { strategy: { kind: strategy } } as const;\n }\n if (!sourcePlacement) throw new Error(\"replace-invoking requires a live source placement.\");\n return { strategy: { kind: \"replace-panel\", instanceId: sourcePlacement.instanceId } } as const;\n};\n\nconst toCommandTarget = (\n target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>,\n input: ToWorkbenchNavigationTargetInput,\n) => {\n const override = input.commandTargetOf?.(target);\n if (override) return override;\n const command = target.target.command;\n const extensionId = command.extensionId ?? input.extensionId;\n const commandId =\n input.commandIdOf?.(command) ??\n (extensionId && extensionId !== \"pstdio\" ? `${extensionId}.command.${command.id}` : command.id);\n return { kind: \"command\", commandId, args: target.target.params } satisfies NavigationTargetCommand;\n};\n\nconst viewIdOf = (target: Extract<ExtensionNavigationTarget, { kind: \"view\" }>, extensionId: string | undefined) => {\n const owner = target.view.extensionId ?? extensionId;\n return owner ? `${owner}.view.${target.view.id}` : target.view.id;\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.\nexport const toWorkbenchNavigationTarget = (\n target: ExtensionNavigationTarget,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget => {\n if (target.kind === \"resource\") {\n // A section only means something with the caller's container context\n // (tree id, target node). Failing loudly beats silently dropping the\n // requested section.\n if (target.section && !input.resourceOf) {\n throw new Error(\"Resource targets with a section need a resourceOf translator that encodes the section.\");\n }\n return {\n kind: \"resource\",\n resource: input.resourceOf ? input.resourceOf(target.resource, target) : toWorkbenchResource(target.resource),\n input: toResourceInput(target.input?.strategy, input.sourcePlacement),\n };\n }\n if (target.kind === \"view\") {\n return {\n kind: \"view\",\n viewId: viewIdOf(target, input.extensionId),\n input: toViewInput(target.input, input.sourcePlacement),\n };\n }\n if (target.kind === \"command\") return toCommandTarget(target, input);\n if (target.kind === \"href\") return target;\n return {\n kind: \"compound\",\n targets: target.targets.map(\n (item) => toWorkbenchNavigationTarget(item, input) as Exclude<NavigationTarget, { kind: \"compound\" }>,\n ),\n };\n};\n\nexport const toWorkbenchNavigationTargetResult = (\n value: unknown,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget | undefined => {\n if (value === undefined || value === null) return undefined;\n if (!isExtensionNavigationTarget(value)) throw new Error(\"Renderer callback returned an invalid navigation target.\");\n return toWorkbenchNavigationTarget(value, input);\n};\n","import type { WorkbenchExtensionCommandPaletteResourceRecord } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { CommandPaletteResourceResult, Disposable } from \"../../core\";\nimport { FILE_SECTION_NAVIGATION_METADATA_KEY } from \"../../core/registries/renderers/file-section-navigation\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} 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}\n\ninterface ProviderQueryResult {\n items?: ResourceItem[];\n}\n\nconst isProviderQueryResult = (value: unknown): value is ProviderQueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst commandIdOf = (\n command: Extract<NavigationTarget, { kind: \"command\" }>[\"target\"][\"command\"],\n extensionId: string,\n) => `${command.extensionId ?? extensionId}.command.${command.id}`;\n\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\n await context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(target, {\n extensionId: record.extensionId,\n resourceOf: (resource, resourceTarget) => {\n const resolved = toWorkbenchResource(resource);\n if (!resourceTarget.section) return resolved;\n return {\n ...resolved,\n metadata: {\n ...resolved.metadata,\n [FILE_SECTION_NAVIGATION_METADATA_KEY]: {\n treeId: record.id,\n targetNodeId: item.id,\n anchors: resourceTarget.section.anchors,\n },\n },\n };\n },\n }),\n );\n};\n\nconst toResult = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n groupLabel: string,\n item: ResourceItem,\n): CommandPaletteResourceResult => ({\n id: `${record.id}:${item.id}`,\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});\n\nexport const registerWorkbenchExtensionCommandPaletteResources = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionCommandPaletteResourceRecord[],\n) => {\n const disposables: Disposable[] = [];\n\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 }) => {\n const activeResource = context.workbench.getActiveResource();\n const value = await executeWorkbenchExtensionCommand(context, record.queryHandlerId, {\n params: {\n projectId: context.projectId,\n modeId: context.workbench.modes.getActiveModeId(),\n activeResource: toExtensionCommandResource(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\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import { resolveComposition } from \"../../core/registries/layout/composition-resolver\";\nimport type {\n CompositionModeDefinition,\n CompositionPanelDefinition,\n CompositionResourceKindDefinition,\n CompositionResourcePanelEdge,\n DockedCompositionRegion,\n PersistedCompositionLayout,\n ResolvedComposition,\n ResolvedCompositionPlacement,\n WorkbenchComposition,\n} from \"../../core/registries/layout/composition-resolver-types\";\nimport { dockedCompositionRegions } from \"../../core/registries/layout/composition-resolver-types\";\nimport type { LayoutModel } from \"../../core/registries/layout/layout-model-types\";\nimport type { NotificationRegistry } from \"../../core/registries/notifications/notification-registry\";\nimport { createDisposable, type Disposable } from \"../../core/shared/disposable\";\n\n// The composition registry holds normalized PS-266 records for the workbench. It\n// registers capabilities and recipes only; every placement decision belongs to the\n// composition resolver.\nexport interface WorkbenchCompositionRegistry {\n registerResourceKind(definition: CompositionResourceKindDefinition): Disposable;\n registerPanelCapability(definition: CompositionPanelDefinition): Disposable;\n registerResourcePanel(edge: CompositionResourcePanelEdge): Disposable;\n registerModeComposition(definition: CompositionModeDefinition): Disposable;\n getComposition(): WorkbenchComposition;\n getModeComposition(modeId: string): CompositionModeDefinition | undefined;\n}\n\ninterface DeclaredPanelPlacement {\n for?: string;\n region: DockedCompositionRegion;\n allowedRegions?: readonly DockedCompositionRegion[];\n required?: boolean;\n defaultOpen?: boolean;\n pinned?: boolean;\n}\n\nexport const toPanelPlacements = (show: DeclaredPanelPlacement | readonly DeclaredPanelPlacement[] | undefined) => {\n if (!show) return [];\n const placements = Array.isArray(show) ? show : [show];\n return placements.map(({ for: resourceKind, ...placement }) => ({ ...placement, resourceKind }));\n};\n\nexport const createWorkbenchCompositionRegistry = (): WorkbenchCompositionRegistry => {\n const resourceKinds: CompositionResourceKindDefinition[] = [];\n const panels: CompositionPanelDefinition[] = [];\n const resourcePanels: CompositionResourcePanelEdge[] = [];\n const modes = new Map<string, CompositionModeDefinition>();\n\n const remove = <T>(list: T[], item: T) =>\n createDisposable(() => {\n const index = list.indexOf(item);\n if (index >= 0) list.splice(index, 1);\n });\n\n return {\n registerResourceKind(definition) {\n resourceKinds.push(definition);\n return remove(resourceKinds, definition);\n },\n registerPanelCapability(definition) {\n panels.push(definition);\n return remove(panels, definition);\n },\n registerResourcePanel(edge) {\n resourcePanels.push(edge);\n return remove(resourcePanels, edge);\n },\n registerModeComposition(definition) {\n modes.set(definition.id, definition);\n return createDisposable(() => {\n if (modes.get(definition.id) === definition) modes.delete(definition.id);\n });\n },\n getComposition: () => ({\n resourceKinds: [...resourceKinds],\n panels: [...panels],\n resourcePanels: [...resourcePanels],\n }),\n getModeComposition: (modeId) => modes.get(modeId),\n };\n};\n\ntype CompositionLayout = Pick<\n LayoutModel,\n \"getLayout\" | \"openWidget\" | \"reconcilePanelMenus\" | \"setRegionActiveWidget\" | \"updateWidgetPlacement\"\n>;\n\ninterface CompositionReconcileContext {\n layout: CompositionLayout;\n notifications: NotificationRegistry;\n}\n\nconst extractPersistedState = (\n layout: ReturnType<LayoutModel[\"getLayout\"]>,\n knownPanelIds: ReadonlySet<string>,\n): PersistedCompositionLayout => {\n const regions: PersistedCompositionLayout[\"regions\"] = {};\n for (const region of dockedCompositionRegions) {\n const state = layout.regions[region];\n const order = state.widgets\n .filter((placement) => knownPanelIds.has(placement.contributionId))\n .map((placement) => placement.contributionId);\n const active = state.widgets.find((placement) => placement.widgetId === state.activeWidgetId);\n regions[region] = {\n order,\n activePanelId: active && knownPanelIds.has(active.contributionId) ? active.contributionId : undefined,\n };\n }\n return { regions };\n};\n\nexport const listCompositionAddablePanels = (input: {\n registry: WorkbenchCompositionRegistry;\n modeId: string;\n layout: ReturnType<LayoutModel[\"getLayout\"]>;\n resourceKind?: string;\n}) => {\n const mode = input.registry.getModeComposition(input.modeId);\n if (!mode) return [];\n const composition = input.registry.getComposition();\n const knownPanelIds = new Set(composition.panels.map((panel) => panel.id));\n return resolveComposition({\n context: { modeId: input.modeId, resourceKind: input.resourceKind },\n mode,\n composition,\n persisted: extractPersistedState(input.layout, knownPanelIds),\n }).addablePanels;\n};\n\n// A panel declares only what it can render, so its role comes from where the recipe\n// puts it: main holds Locations, which tab beside each other, and every other docked\n// region holds Sub Panels of the active Location.\nconst placementRole = (region: DockedCompositionRegion) => (region === \"main\" ? \"location\" : \"sub-panel\");\n\n// Opens or corrects one resolved placement. A placement sitting in a region the\n// recipe no longer allows moves to the resolved region; a valid user move stays.\nconst applyPlacement = (ctx: CompositionReconcileContext, placement: ResolvedCompositionPlacement) => {\n const current = ctx.layout.getLayout();\n const existingRegion = dockedCompositionRegions.find((region) =>\n current.regions[region].widgets.some((candidate) => candidate.contributionId === placement.panelId),\n );\n const open = () =>\n ctx.layout.openWidget(placement.panelId, {\n region: placement.region,\n closable: !placement.required,\n pinned: placement.pinned,\n role: placementRole(placement.region),\n });\n\n if (!existingRegion) {\n if (placement.origin === \"persisted\" || placement.origin === \"default\" || placement.required) open();\n return;\n }\n if (!placement.allowedRegions.includes(existingRegion)) {\n open();\n return;\n }\n const existing = current.regions[existingRegion].widgets.find(\n (candidate) => candidate.contributionId === placement.panelId,\n );\n if (!existing) return;\n const role = placementRole(existingRegion);\n const closable = !placement.required;\n if ((existing.closable ?? true) !== closable || existing.pinned !== placement.pinned || existing.role !== role) {\n ctx.layout.updateWidgetPlacement(existing.widgetId, { closable, pinned: placement.pinned, role });\n }\n};\n\n// Restoring required structure must not steal the user's active tabs.\nconst restoreActiveTabs = (\n ctx: CompositionReconcileContext,\n activeBefore: ReadonlyMap<DockedCompositionRegion, string | undefined>,\n) => {\n for (const [region, activeWidgetId] of activeBefore) {\n if (!activeWidgetId) continue;\n const current = ctx.layout.getLayout().regions[region];\n if (current.activeWidgetId === activeWidgetId) continue;\n if (current.widgets.some((widget) => widget.widgetId === activeWidgetId)) {\n ctx.layout.setRegionActiveWidget(region, activeWidgetId);\n }\n }\n};\n\n// An unresolved required placement shows one diagnostic under a stable id and leaves\n// a usable location in main, so repeated reconciliation updates the same message.\nconst reportRequiredFallback = (ctx: CompositionReconcileContext, modeId: string, resolved: ResolvedComposition) => {\n const notificationId = compositionRequiredNotificationId(modeId);\n if (!resolved.requiredFallback) {\n ctx.notifications.dismiss(notificationId);\n return;\n }\n const fallbackPanelId = resolved.requiredFallback.panelId;\n const placed = ctx.layout\n .getLayout()\n .regions.main.widgets.some((placement) => placement.contributionId === fallbackPanelId);\n if (!placed) ctx.layout.openWidget(fallbackPanelId, { region: \"main\", pinned: true, role: \"location\" });\n ctx.notifications.show({\n id: notificationId,\n level: \"error\",\n title: \"A required panel could not be placed\",\n message: resolved.diagnostics.map((diagnostic) => diagnostic.message).join(\" \"),\n });\n};\n\nexport const compositionRequiredNotificationId = (modeId: string) => `workbench.composition.required.${modeId}`;\n\n// Applies the registered composition to the docked layout for one mode-resource\n// context. `seeding` says which job this call is doing, and only the mode registry\n// knows: it seeds a scope once, and reconciles on every later activation. Seeding\n// places the mode's whole recipe. Reconciling restores missing required structure,\n// enforces resolved closability, and keeps the user's optional choices, tab order, and\n// moves. Both report an unresolved required placement under a stable notification id,\n// so repeated reconciliation updates the same message instead of stacking toasts.\nexport const reconcileCompositionLayout = (\n ctx: CompositionReconcileContext,\n input: { registry: WorkbenchCompositionRegistry; modeId: string; resourceKind?: string; seeding?: boolean },\n) => {\n const mode = input.registry.getModeComposition(input.modeId);\n if (!mode) return undefined;\n const composition = input.registry.getComposition();\n const knownPanelIds = new Set(composition.panels.map((panel) => panel.id));\n const layout = ctx.layout.getLayout();\n const persisted = input.seeding ? undefined : extractPersistedState(layout, knownPanelIds);\n\n const resolved = resolveComposition({\n context: { modeId: input.modeId, resourceKind: input.resourceKind },\n mode,\n composition,\n persisted,\n });\n\n const activeBefore = new Map<DockedCompositionRegion, string | undefined>(\n dockedCompositionRegions.map((region) => [region, ctx.layout.getLayout().regions[region].activeWidgetId]),\n );\n\n for (const placement of resolved.placements) applyPlacement(ctx, placement);\n restoreActiveTabs(ctx, activeBefore);\n ctx.layout.reconcilePanelMenus();\n reportRequiredFallback(ctx, input.modeId, resolved);\n\n return resolved;\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 { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n WorkbenchModuleContext,\n WorkbenchPanelContribution,\n WorkbenchPanelMenuDefinition,\n WorkbenchViewContribution,\n} from \"../../core\";\nimport { BRIDGE_WEBVIEW_RENDERER_ID } from \"../bridge/bridge-webview-renderer\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\n\ntype ExtensionPanelRecord = WorkbenchExtensionMetadata[\"panels\"][number];\ntype ExtensionPanelMenu = NonNullable<ExtensionPanelRecord[\"panelMenus\"]>[number];\ntype ExtensionResourcePanels = WorkbenchExtensionMetadata[\"resourcePanels\"];\n\nexport interface WorkbenchExtensionViewDescriptor {\n id: string;\n title: string;\n icon?: string;\n}\n\nexport type WorkbenchExtensionViewInputResolver = (\n view: WorkbenchExtensionViewDescriptor,\n) => WorkbenchViewContribution[\"resolveInput\"];\n\nexport const resolveWorkbenchExtensionViewInput = (\n resolver: WorkbenchExtensionViewInputResolver | undefined,\n panel: ExtensionPanelRecord,\n) =>\n resolver?.({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n });\n\nexport interface RegisterWorkbenchExtensionPanelInput {\n contribution: WorkbenchPanelContribution;\n path?: string;\n aliases?: readonly string[];\n resolveInput?: WorkbenchViewContribution[\"resolveInput\"];\n workbench: WorkbenchModuleContext;\n}\n\n// Panels keep manifest declaration order until the user reorders them.\nexport const declarationPriority = (declarationIndex = 0) => ({ priority: -declarationIndex });\n\n// A panel with an unscoped placement is available without a resource. Otherwise,\n// its own scoped placements and cross-extension edges define the kinds it serves.\nexport const panelResourceKinds = (\n panel: ExtensionPanelRecord,\n resourcePanels: ExtensionResourcePanels | undefined,\n) => {\n const show = panel.show ? (Array.isArray(panel.show) ? panel.show : [panel.show]) : [];\n if (show.some((placement) => placement.for === undefined)) return undefined;\n const kinds = [\n ...show.flatMap((placement) => (placement.for ? [placement.for] : [])),\n ...(resourcePanels ?? []).filter((edge) => edge.panel === panel.id).map((edge) => edge.resourceKind),\n ].filter((kind, index, all) => all.indexOf(kind) === index);\n return kinds.length > 0 ? kinds : undefined;\n};\n\nconst panelDefaultRegion = (panel: ExtensionPanelRecord) => {\n const show = panel.show ? (Array.isArray(panel.show) ? panel.show : [panel.show]) : [];\n return show[0]?.region ?? \"main\";\n};\n\n// Registers a metadata panel as a workbench widget. The widget's region is only the\n// fallback for direct opens; the composition resolver places the panel per active\n// mode-resource context and owns required-state closability.\nexport const toWorkbenchCompositionPanelContribution = (input: {\n panel: ExtensionPanelRecord;\n rendererId: string;\n declarationIndex: number;\n menuDeclarationOffset: number;\n resourcePanels?: ExtensionResourcePanels;\n config?: WorkbenchPanelContribution[\"config\"];\n}): WorkbenchPanelContribution => ({\n id: input.panel.id,\n title: text(input.panel.title, input.panel.id),\n icon: input.panel.icon,\n region: panelDefaultRegion(input.panel),\n rendererId: input.rendererId,\n singleton: true,\n resourceKinds: panelResourceKinds(input.panel, input.resourcePanels),\n panelMenus: toWorkbenchPanelMenus(input.panel.panelMenus, input.menuDeclarationOffset),\n config: input.config,\n ...declarationPriority(input.declarationIndex),\n});\n\n// Panel menus tie-break by manifest declaration order across every owner panel,\n// not just within one panel. Returns each panel's menu count prefix so callers\n// can hand every menu a unique declaration index in manifest order.\nexport const panelMenuDeclarationOffsets = <T extends { panelMenus?: readonly unknown[] }>(\n panels: readonly T[],\n): number[] => {\n const offsets: number[] = [];\n let total = 0;\n for (const panel of panels) {\n offsets.push(total);\n total += panel.panelMenus?.length ?? 0;\n }\n return offsets;\n};\n\nconst panelMenuRendererId = (menu: ExtensionPanelMenu) => {\n const rendererId = menu.renderer?.id ?? (menu.webview ? BRIDGE_WEBVIEW_RENDERER_ID : undefined);\n if (!rendererId) throw new Error(`Panel Menu has no renderer: ${menu.id}`);\n return rendererId;\n};\n\nconst menuPlacementBasePriority = { first: 1_000_000, default: 0, last: -1_000_000 } as const;\n\nexport const toWorkbenchPanelMenus = (\n menus: readonly ExtensionPanelMenu[] | undefined,\n declarationOffset = 0,\n): WorkbenchPanelMenuDefinition[] | undefined =>\n menus?.map((menu, index) => ({\n id: menu.id,\n title: text(menu.title, menu.id),\n side: menu.side,\n rendererId: panelMenuRendererId(menu),\n config: menu.webview ? toBridgeWebviewConfig(menu.webview) : undefined,\n priority: menuPlacementBasePriority[menu.placement ?? \"default\"] - (declarationOffset + index),\n }));\n\nexport const registerWorkbenchExtensionPanel = (input: RegisterWorkbenchExtensionPanelInput): Disposable => {\n const panel = input.workbench.layout.registerPanel(input.contribution);\n let view: Disposable;\n try {\n view = input.workbench.views.registerView({\n id: input.contribution.id,\n panelId: input.contribution.id,\n title: input.contribution.title,\n icon: input.contribution.icon,\n path: input.path,\n aliases: input.aliases,\n resolveInput: input.resolveInput,\n });\n } catch (error) {\n panel.dispose();\n throw error;\n }\n return {\n dispose() {\n view.dispose();\n panel.dispose();\n },\n };\n};\n\nexport const panelRendererId = (\n panel: ExtensionPanelRecord,\n kind: NonNullable<ExtensionPanelRecord[\"renderer\"]>[\"kind\"],\n) => (panel.renderer?.kind === kind ? panel.renderer.id : undefined);\n","import type { WorkbenchExtensionControlsRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { ControlsQueryResult, Disposable, ResourceRef } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n} from \"../host/workbench-extension-command\";\nimport {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n resolveWorkbenchExtensionViewInput,\n toWorkbenchCompositionPanelContribution,\n type WorkbenchExtensionViewInputResolver,\n} from \"./panel-contributions\";\n\ntype ControlsViewRecord = WorkbenchExtensionMetadata[\"panels\"][number];\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\n\nconst isQueryResult = (value: unknown): value is ControlsQueryResult =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport interface WorkbenchExtensionControlsAdapter {\n /** Supply a fallback resource when the widget placement carries none. */\n resolveResource?: (record: WorkbenchExtensionControlsRendererRecord) => ResourceRef | undefined;\n resolveViewInput?: WorkbenchExtensionViewInputResolver;\n}\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 = (commandId: string | undefined, params: Record<string, unknown>, resource?: ResourceRef) =>\n commandId\n ? executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n projectId: context.projectId,\n ...(resource ? { resource: toExtensionCommandResource(resource) } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n slot,\n metadata: { controlsRendererId: record.id },\n })\n : Promise.resolve(undefined);\n\n return context.workbench.renderers.registerControlsRenderer({\n id: record.id,\n title: localize(record.title, record.id),\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n defaultValues: record.defaultValues,\n executeQuery: async (resource) => {\n const value = await run(record.queryHandlerId, {}, resource ?? adapter.resolveResource?.(record));\n return isQueryResult(value) ? value : {};\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// A panel that references a controls renderer places it into a panel — the widget is\n// keyed by the panel id and rendered by the referenced controls renderer, mirroring\n// tree/file renderer panel widgets.\nconst registerControlsViewWidget = (\n context: WorkbenchExtensionCommandContext,\n panel: ControlsViewRecord,\n index: number,\n menuDeclarationOffset: number,\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"],\n adapter: WorkbenchExtensionControlsAdapter,\n) => {\n const rendererId = panelRendererId(panel, \"controls\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n path: panel.path,\n aliases: panel.aliases,\n resolveInput: resolveWorkbenchExtensionViewInput(adapter.resolveViewInput, panel),\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels,\n }),\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 panels: ControlsViewRecord[],\n adapter: WorkbenchExtensionControlsAdapter = {},\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"] = [],\n): Disposable => {\n const disposables: Disposable[] = [];\n\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n const menuOffsets = panelMenuDeclarationOffsets(panels);\n panels.forEach((panel, index) => {\n const disposable = registerControlsViewWidget(context, panel, index, menuOffsets[index]!, resourcePanels, adapter);\n if (disposable) disposables.push(disposable);\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 { WorkbenchExtensionDataTableRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type {\n DataTableRendererColumn,\n DataTableRendererQueryResult,\n DataTableRendererRow,\n Disposable,\n ResourceRef,\n} from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport { toWorkbenchNavigationTargetResult } from \"../host/extension-navigation-target\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\nimport {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n resolveWorkbenchExtensionViewInput,\n toWorkbenchCompositionPanelContribution,\n type WorkbenchExtensionViewInputResolver,\n} from \"./panel-contributions\";\n\ntype DataTableViewRecord = WorkbenchExtensionMetadata[\"panels\"][number];\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\n\ntype WireColumn = NonNullable<WorkbenchExtensionDataTableRendererRecord[\"columns\"]>[number];\n\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});\n\nconst isQueryResult = (\n value: unknown,\n): value is {\n rows: Array<{ id: string; values: Record<string, unknown>; resource?: Parameters<typeof toWorkbenchResource>[0] }>;\n columns?: WorkbenchExtensionDataTableRendererRecord[\"columns\"];\n} => Boolean(value && typeof value === \"object\" && Array.isArray((value as { rows?: unknown }).rows));\n\nconst toRow = (row: {\n id: string;\n values: Record<string, unknown>;\n resource?: Parameters<typeof toWorkbenchResource>[0];\n}): DataTableRendererRow => ({\n id: row.id,\n values: row.values,\n resource: row.resource ? toWorkbenchResource(row.resource) : undefined,\n});\n\nconst registerRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionDataTableRendererRecord,\n) => {\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 = (commandId: string, params: Record<string, unknown>, resource?: ResourceRef, modeId?: string) =>\n executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n projectId: context.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource: toExtensionCommandResource(resource) } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n slot,\n metadata: { dataTableRendererId: record.id },\n });\n\n return context.workbench.renderers.registerDataTableRenderer({\n id: record.id,\n title: localize(record.title, record.id),\n resourceKind: record.resourceKind,\n columns: record.columns?.map(toColumn),\n initialPageSize: record.initialPageSize,\n pageSizeOptions: record.pageSizeOptions,\n selectionMode: record.selectionMode,\n selectionActions: record.selectionActions?.map((action) => ({\n id: action.id,\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 }) => {\n const value = await run(record.queryHandlerId, {}, resource, modeId);\n if (!isQueryResult(value)) return { rows: [] };\n const rows = value.rows.map((row) => {\n const mapped = toRow(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 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.renderers.refreshDataTableRenderer(record.id);\n },\n })),\n onRowActivate: record.rowActivationHandlerId\n ? async (row) => {\n const result = await run(record.rowActivationHandlerId!, { row: originalRows.get(row) ?? row }, row.resource);\n const target = toWorkbenchNavigationTargetResult(result, { extensionId: record.extensionId });\n if (target) await context.workbench.navigation.openTarget(target);\n }\n : undefined,\n });\n};\n\nconst registerView = (\n context: WorkbenchExtensionCommandContext,\n panel: DataTableViewRecord,\n index: number,\n menuDeclarationOffset: number,\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"],\n resolveViewInput?: WorkbenchExtensionViewInputResolver,\n) => {\n const rendererId = panelRendererId(panel, \"dataTable\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n path: panel.path,\n aliases: panel.aliases,\n resolveInput: resolveWorkbenchExtensionViewInput(resolveViewInput, panel),\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels,\n }),\n });\n};\n\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n panels: DataTableViewRecord[],\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"] = [],\n resolveViewInput?: WorkbenchExtensionViewInputResolver,\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record));\n const menuOffsets = panelMenuDeclarationOffsets(panels);\n panels.forEach((panel, index) => {\n const disposable = registerView(context, panel, index, menuOffsets[index]!, resourcePanels, resolveViewInput);\n if (disposable) disposables.push(disposable);\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 {\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\";\n\nexport type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\n\nconst placementOrder = { first: 0, default: 1, last: 2 } satisfies Record<\n NonNullable<ExtensionMenuContribution[\"placement\"] | ExtensionCommandPaletteContribution[\"placement\"]>,\n number\n>;\ntype ExtensionContributionPlacement = keyof typeof placementOrder;\n\nexport interface WorkbenchExtensionMenuSlotConfig {\n menuPath: MenuPath;\n group?: string;\n overflowLabel?: string;\n}\n\nexport type WorkbenchExtensionMenuWhenBuilder = (contribution: ExtensionMenuContribution) => string | undefined;\nexport type WorkbenchExtensionStringResolver = (value: Localizable<string> | undefined, extensionId: string) => string;\n\nexport interface WorkbenchExtensionMenuRegistration {\n command: Command;\n contribution: ExtensionMenuContribution;\n menuItem: MenuItem;\n menuPath: MenuPath;\n targetCommandId: string;\n}\n\nexport interface WorkbenchExtensionCommandPaletteRegistration {\n command: Command;\n contribution: ExtensionCommandPaletteContribution;\n menuItem: MenuItem;\n targetCommandId: string;\n}\n\nexport interface UnresolvedWorkbenchExtensionMenuContribution {\n contribution: ExtensionMenuContribution;\n targetId: string;\n}\n\nexport const emptyWorkbenchExtensionMetadata = {\n commands: [],\n commandPaletteContributions: [],\n diagnostics: [],\n extensions: [],\n menuContributions: [],\n modes: [],\n views: [],\n viewMenus: [],\n placements: [],\n resourceKinds: [],\n resourceViews: [],\n navigationItems: [],\n statusBarItems: [],\n statuses: [],\n settingsPanels: [],\n settingsDefinitions: [],\n} satisfies WorkbenchExtensionMetadata;\n\ntype CommandContributionMetadata = Pick<\n WorkbenchExtensionMetadata,\n \"commands\" | \"commandPaletteContributions\" | \"menuContributions\"\n>;\n\nconst defaultWorkbenchExtensionCommandId = (contribution: ExtensionMenuContribution) =>\n `workbench.extension.menu.${contribution.id}`;\n\nconst defaultWorkbenchExtensionPaletteCommandId = (contribution: ExtensionCommandPaletteContribution) =>\n `workbench.extension.palette.${contribution.id}`;\n\nconst contributionOrder = (contribution: { placement?: ExtensionContributionPlacement }, index: number) =>\n placementOrder[contribution.placement ?? \"default\"] * 1000 + index;\n\nconst text: WorkbenchExtensionStringResolver = (value) => {\n if (value === undefined) return \"\";\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n\nconst createMenuItem = (input: {\n contribution: ExtensionMenuContribution;\n commandId: string;\n index: number;\n slot: WorkbenchExtensionMenuSlotConfig;\n when?: string;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString, slot, when } = input;\n\n return {\n commandId,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: slot.group ?? contribution.group,\n args: contribution.params,\n overflowLabel: slot.overflowLabel,\n order: contributionOrder(contribution, index),\n when,\n } satisfies MenuItem;\n};\n\nconst createPaletteItem = (input: {\n contribution: ExtensionCommandPaletteContribution;\n commandId: string;\n index: number;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString } = input;\n\n return {\n commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: contribution.group,\n args: contribution.params,\n order: contributionOrder(contribution, index),\n } satisfies MenuItem;\n};\n\nexport const buildWorkbenchExtensionMenuRegistrations = (input: {\n metadata: CommandContributionMetadata;\n menuSlotsById: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n menuTargetsById?: ReadonlyMap<string, WorkbenchExtensionMenuSlotConfig>;\n createCommandId?: (contribution: ExtensionMenuContribution) => string;\n createWhenExpression?: WorkbenchExtensionMenuWhenBuilder;\n resolveString?: WorkbenchExtensionStringResolver;\n}) => {\n const {\n createCommandId = defaultWorkbenchExtensionCommandId,\n createWhenExpression,\n menuSlotsById,\n menuTargetsById,\n metadata,\n resolveString = text,\n } = input;\n const registrations: WorkbenchExtensionMenuRegistration[] = [];\n const unresolved: UnresolvedWorkbenchExtensionMenuContribution[] = [];\n\n metadata.menuContributions.forEach((contribution, index) => {\n const slot = contribution.target\n ? menuTargetsById?.get(contribution.target)\n : menuSlotsById.get(contribution.slotId);\n if (!slot) {\n unresolved.push({ contribution, targetId: contribution.target ?? contribution.slotId });\n return;\n }\n\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: command?.params,\n },\n contribution,\n menuItem: createMenuItem({\n commandId,\n contribution,\n index,\n resolveString,\n slot,\n when: createWhenExpression?.(contribution),\n }),\n menuPath: slot.menuPath,\n targetCommandId: contribution.commandId,\n });\n });\n\n return { registrations, unresolved };\n};\n\nexport const buildWorkbenchExtensionCommandPaletteRegistrations = (input: {\n metadata: CommandContributionMetadata;\n createCommandId?: (contribution: ExtensionCommandPaletteContribution) => string;\n resolveString?: WorkbenchExtensionStringResolver;\n}) => {\n const { createCommandId = defaultWorkbenchExtensionPaletteCommandId, metadata, resolveString = text } = input;\n const registrations: WorkbenchExtensionCommandPaletteRegistration[] = [];\n\n (metadata.commandPaletteContributions ?? []).forEach((contribution, index) => {\n const commandId = createCommandId(contribution);\n const command = metadata.commands.find((candidate) => candidate.id === contribution.commandId);\n\n registrations.push({\n command: {\n id: commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n category: contribution.group,\n description: command ? resolveString(command.description, command.extensionId) : undefined,\n icon: contribution.icon,\n params: command?.params,\n },\n contribution,\n menuItem: createPaletteItem({ commandId, contribution, index, resolveString }),\n targetCommandId: contribution.commandId,\n });\n });\n\n return registrations;\n};\n","import type { CommandExecuteRequest, CommandExecuteResponse } from \"@pstdio/sdk/api\";\nimport { 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 {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n resolveWorkbenchExtensionViewInput,\n toWorkbenchCompositionPanelContribution,\n type WorkbenchExtensionViewInputResolver,\n} from \"./panel-contributions\";\n\ntype FileRendererRecord = NonNullable<WorkbenchExtensionMetadata[\"fileRenderers\"]>[number];\ntype ViewRecord = WorkbenchExtensionMetadata[\"panels\"][number];\n\nexport interface RegisterWorkbenchExtensionFileRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n resolveViewInput?: WorkbenchExtensionViewInputResolver;\n workbench: WorkbenchModuleContext;\n}\n\ninterface ExtensionResource {\n type: string;\n id: string;\n label?: string;\n metadata?: Record<string, unknown>;\n}\n\nconst toExtensionResource = (resource: ResourceRef | undefined): ExtensionResource | undefined => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nconst slotContext = (input: { projectId: string; rendererId: string; resource?: ExtensionResource }) => ({\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});\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) => {\n const ext = toExtensionResource(resource);\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params: {\n renderer: {\n rendererId,\n projectId: input.projectId,\n ...(ext ? { resource: ext } : {}),\n invocation: { placement: \"visible\" },\n },\n ...extra,\n },\n resource: ext,\n slot: slotContext({ projectId: input.projectId, rendererId, resource: ext }),\n source: \"dashboard\",\n ...(metadata ? { metadata } : {}),\n });\n return unwrapCommandValue(result);\n};\n\nconst revisionFromValue = (value: unknown) => {\n if (!value || typeof value !== \"object\") return undefined;\n const revision = (value as { revision?: unknown }).revision;\n return typeof revision === \"string\" ? revision : undefined;\n};\n\nexport const fileRendererRefreshEnvelopeFromCommand = (\n body: CommandExecuteRequest,\n response: CommandExecuteResponse,\n): FileRendererRefreshEnvelope | undefined => {\n const metadata = body.metadata;\n const origin = metadata?.fileRendererOrigin;\n if (!origin || typeof origin !== \"object\") return undefined;\n const candidate = origin as Partial<FileRendererRefreshOrigin>;\n if (\n typeof candidate.rendererId !== \"string\" ||\n typeof candidate.instanceId !== \"string\" ||\n typeof candidate.operationId !== \"string\"\n ) {\n return undefined;\n }\n const resourceUri = metadata?.fileRendererResourceUri;\n const revision = revisionFromValue(response.outcome.value);\n return {\n origin: {\n rendererId: candidate.rendererId,\n instanceId: candidate.instanceId,\n operationId: candidate.operationId,\n },\n ...(typeof resourceUri === \"string\" ? { resourceUri } : {}),\n ...(revision ? { revision } : {}),\n };\n};\n\nconst registerFileRenderer = (input: RegisterWorkbenchExtensionFileRenderersInput, record: FileRendererRecord) =>\n input.workbench.renderers.registerFileRenderer({\n id: record.id,\n title: text(record.title, record.id),\n resourceKind: record.resourceKind,\n load: async (resource) => {\n const result = await executeFileCommand(input, record.id, record.loadHandlerId, resource);\n return (result ?? {}) as FileRendererContent;\n },\n save: record.saveHandlerId\n ? async (resource, content, origin) => {\n const result = await executeFileCommand(\n input,\n record.id,\n record.saveHandlerId as string,\n resource,\n { content },\n {\n ...(origin ? { fileRendererOrigin: origin } : {}),\n ...(resource?.uri ? { fileRendererResourceUri: resource.uri } : {}),\n },\n );\n const revision = revisionFromValue(result);\n return revision ? { revision } : undefined;\n }\n : undefined,\n });\n\nconst registerFileViewWidget = (\n input: RegisterWorkbenchExtensionFileRenderersInput,\n panel: ViewRecord,\n index: number,\n menuDeclarationOffset: number,\n) => {\n const rendererId = panelRendererId(panel, \"file\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n path: panel.path,\n aliases: panel.aliases,\n resolveInput: resolveWorkbenchExtensionViewInput(input.resolveViewInput, panel),\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels: input.metadata.resourcePanels,\n }),\n });\n};\n\nexport const registerWorkbenchExtensionFileRenderers = (input: RegisterWorkbenchExtensionFileRenderersInput) => {\n const disposables: Disposable[] = [];\n\n for (const record of input.metadata.fileRenderers ?? []) {\n disposables.push(registerFileRenderer(input, record));\n }\n\n const menuOffsets = panelMenuDeclarationOffsets(input.metadata.panels);\n input.metadata.panels.forEach((panel, index) => {\n const disposable = registerFileViewWidget(input, panel, index, menuOffsets[index]!);\n if (disposable) disposables.push(disposable);\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 { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport type {\n AttributeDescriptor,\n EnumOptions,\n KanbanRendererContribution,\n KanbanRendererCreateField,\n KanbanRendererCreateFieldType,\n ResourceRef,\n} from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\n\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;\n\nexport interface MutableAttributeSource {\n source: KanbanRendererContribution[\"attributes\"];\n set(attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined): void;\n}\n\nexport type ResolveStatusOptions = (\n statuses: Extract<\n NonNullable<WorkbenchExtensionKanbanRendererRecord[\"attributes\"]>[number][\"type\"],\n { kind: \"status\" }\n >[\"statuses\"],\n) => EnumOptions;\n\nexport const isQueryResult = (value: unknown): value is QueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst localizeAttributes = (\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n resolveStatusOptions: ResolveStatusOptions,\n): AttributeDescriptor[] =>\n (attributes ?? []).map((attribute) => {\n const base: AttributeDescriptor = {\n ...attribute,\n label: localize(attribute.label, attribute.id),\n type:\n attribute.type.kind === \"status\"\n ? { kind: \"enum\", options: resolveStatusOptions(attribute.type.statuses) }\n : attribute.type.kind === \"enum\" || attribute.type.kind === \"enum-multi\"\n ? {\n ...attribute.type,\n options: Array.isArray(attribute.type.options)\n ? attribute.type.options.map((option) => ({ ...option, label: localize(option.label, option.value) }))\n : attribute.type.options,\n }\n : attribute.type,\n };\n return decorate(record, base);\n });\n\nexport const createMutableAttributeSource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n initial: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n resolveStatusOptions: ResolveStatusOptions = () => [],\n): MutableAttributeSource => {\n let snapshot = localizeAttributes(record, initial, localize, decorate, resolveStatusOptions);\n const listeners = new Set<() => void>();\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 snapshot = localizeAttributes(record, attributes, localize, decorate, resolveStatusOptions);\n for (const listener of listeners) listener();\n },\n };\n};\n\nconst isWorkbenchResource = (resource: unknown): resource is ResourceRef =>\n Boolean(resource && typeof resource === \"object\" && typeof (resource as { kind?: unknown }).kind === \"string\");\n\nconst isExtensionResource = (resource: unknown): resource is Parameters<typeof toWorkbenchResource>[0] =>\n Boolean(\n resource &&\n typeof resource === \"object\" &&\n typeof (resource as { type?: unknown }).type === \"string\" &&\n typeof (resource as { id?: unknown }).id === \"string\",\n );\n\nconst rowResourceUri = (kind: string, id: string) =>\n `pstdio://extension-resource/${encodeURIComponent(kind)}/${encodeURIComponent(id)}`;\n\nexport const defaultResolveRowResource = (_: WorkbenchExtensionKanbanRendererRecord, row: KanbanRendererRow) => {\n const { resource } = row;\n if (isWorkbenchResource(resource)) return resource;\n if (isExtensionResource(resource)) return toWorkbenchResource(resource);\n return undefined;\n};\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 kind: record.resourceKind,\n uri: rowResourceUri(record.resourceKind, row.id),\n id: row.id,\n label: row.title,\n };\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};\n\nexport const mergeParams = (...items: Array<Record<string, unknown> | undefined>) =>\n Object.assign({}, ...items.filter((item): item is Record<string, unknown> => Boolean(item)));\n\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n\nconst hasCommandParameters = (params: Record<string, unknown> | undefined) => Object.keys(params ?? {}).length > 0;\n\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]);\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\n const options =\n \"options\" in descriptor && Array.isArray(descriptor.options)\n ? (descriptor.options as Array<{ value: string; label: string; icon?: string }>)\n : [];\n const optional = descriptor as { placeholder?: unknown; multiple?: unknown; 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};\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 });\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 });\n\nexport const executeKanbanRendererCommand = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n) => {\n const commandResource = resource ?? context.workbench.getPrimaryResource();\n return executeWorkbenchExtensionCommand(context, commandId, {\n params: {\n renderer: {\n rendererId: record.id,\n projectId: context.projectId,\n ...(commandResource ? { resource: toExtensionCommandResource(commandResource) } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource: commandResource,\n slot: createKanbanRendererSlot(context, record),\n metadata: { kanbanRendererId: record.id },\n });\n};\n\nconst kanbanRendererRowActionCommandId = (record: WorkbenchExtensionKanbanRendererRecord, action: RowAction) =>\n `workbench.extension.kanbanRenderer.${record.id}.rowAction.${action.id}`;\n\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 });\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\n if (command && hasCommandParameters(command.command.params)) {\n context.workbench.commandPalette.requestParams({ record: command, label, args, context: executionContext });\n return Promise.resolve();\n }\n\n if (command)\n return context.workbench.commands.executeCommand(command.command.id, args, executionContext).then(() => undefined);\n\n return executeKanbanRendererCommand(context, record, action.commandId, args, resource).then(() => undefined);\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type {\n AttributeDescriptor,\n Disposable,\n KanbanRendererContribution,\n KanbanRendererCreateSubmission,\n KanbanRendererQueryState,\n ResourceRef,\n} from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport { toWorkbenchNavigationTargetResult } from \"../host/extension-navigation-target\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createMutableAttributeSource,\n defaultResolveRowActionResource,\n defaultResolveRowResource,\n executeKanbanRendererCommand,\n isQueryResult,\n type KanbanRendererRow,\n type Localizer,\n mergeParams,\n type ResolveStatusOptions,\n type RowAction,\n registerRowActionCommands,\n runDefaultRowAction,\n toCreateFields,\n toWorkbenchRow,\n} from \"./kanban-renderer-contribution-helpers\";\nimport {\n panelMenuDeclarationOffsets,\n panelRendererId,\n registerWorkbenchExtensionPanel,\n resolveWorkbenchExtensionViewInput,\n toWorkbenchCompositionPanelContribution,\n type WorkbenchExtensionViewInputResolver,\n} from \"./panel-contributions\";\n\ntype BoardColumnConfig = ReturnType<NonNullable<KanbanRendererContribution[\"getBoardColumnConfig\"]>>;\ntype ColumnConfigRecord = Record<string, WireBoardColumnConfig>;\n\nexport interface WorkbenchExtensionKanbanRendererAdapter {\n /** Add host navigation state changes that must run before a panel view opens. */\n resolveViewInput?: WorkbenchExtensionViewInputResolver;\n /** Override label resolution. Defaults to workbench's `text(value, fallback)`. */\n resolveLabel?: Localizer;\n /** Post-process an attribute descriptor (after localization). Defaults to identity. */\n decorateAttribute?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n attribute: AttributeDescriptor,\n ) => AttributeDescriptor;\n /**\n * Translate a row's transport-shaped resource (`{ type, id }`) into a workbench\n * `ResourceRef`. Defaults to the workbench `pstdio://extension-resource/...`\n * scheme — dashboard supplies its own. Returns `undefined` for rows that do not\n * carry an explicit resource.\n */\n resolveRowResource?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined;\n /**\n * Synthesize a `ResourceRef` for row-action execution context when the row does\n * not carry an explicit resource. Defaults to a `pstdio://extension-resource/`\n * fallback built from `record.resourceKind` and `row.id`.\n */\n resolveRowActionResource?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined;\n /**\n * Override the row-action runner. `runDefault` performs the workbench's standard\n * flow (look up the row-action command, request params if needed, execute it).\n */\n executeRowAction?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n action: RowAction;\n row: KanbanRendererRow;\n resource: ResourceRef | undefined;\n runDefault: () => Promise<void>;\n }) => void | Promise<void>;\n /**\n * Override the row click handler. When unset the panel layer falls back to\n * opening the row's resource via `ctx.resources.openResource` — set this to\n * intercept the click (e.g. swallow rejections when no presenter exists yet).\n */\n onRowClick?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n row: KanbanRendererRow;\n resource: ResourceRef | undefined;\n }) => void;\n /** Translate extension navigation resource targets into host resources. */\n resolveNavigationResource?: (\n record: WorkbenchExtensionKanbanRendererRecord,\n resource: NonNullable<CommandExecuteRequest[\"resource\"]>,\n ) => ResourceRef;\n /** Called after a successful renderer-owned create form submission. */\n onAfterCreate?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n created: unknown;\n submission: KanbanRendererCreateSubmission;\n }) => void | Promise<void>;\n /**\n * Called after any mutation (attribute change, reorder, column action, default\n * create) resolves successfully. Hosts that drive refresh via the outer command\n * pipeline (testbench / workbench) leave this unset; dashboard supplies\n * `ctx.renderers.refreshKanbanRenderer(id)`.\n */\n onAfterMutation?: (record: WorkbenchExtensionKanbanRendererRecord) => void;\n}\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\nconst toWorkbenchBoardColumnConfig = (config: WireBoardColumnConfig | undefined, localize: Localizer) =>\n ({\n color: config?.color,\n canDragIn: config?.canDragIn,\n canDragOut: config?.canDragOut,\n canCreate: config?.canCreate,\n actions: config?.actions?.map((action) => ({\n id: action.id,\n label: localize(action.label, action.id),\n icon: createBoardActionIcon(action.icon),\n })),\n }) satisfies BoardColumnConfig;\n\nconst statusSetId = (record: WorkbenchExtensionKanbanRendererRecord, ref: Parameters<ResolveStatusOptions>[0]) =>\n `${ref.extensionId ?? record.extensionId}.status.${ref.id}`;\n\nconst createStatusOptionsResolver = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n): ResolveStatusOptions => {\n const sources = new Map<string, ReturnType<ResolveStatusOptions>>();\n return (ref) => {\n const id = statusSetId(record, ref);\n const existing = sources.get(id);\n if (existing) return existing;\n\n const source = {\n getSnapshot: () =>\n (context.workbench.statuses.getStatuses(id) ?? []).map((status) => ({\n value: status.id,\n label: status.label,\n color: status.color,\n icon: status.icon,\n })),\n subscribe: (listener: () => void) =>\n context.workbench.statuses.store.subscribeSelector((state) => state.values[id], listener),\n };\n sources.set(id, source);\n void context.workbench.statuses.load(id).catch(() => undefined);\n return source;\n };\n};\n\nconst statusColumnConfig = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"],\n groupKey: string,\n): WireBoardColumnConfig | undefined => {\n for (const attribute of attributes ?? []) {\n if (attribute.type.kind !== \"status\") continue;\n const id = statusSetId(record, attribute.type.statuses);\n const status = context.workbench.statuses.getStatuses(id)?.find((candidate) => candidate.id === groupKey);\n if (!status) continue;\n const set = context.workbench.statuses.getStatusSet(id);\n return {\n color: status.color,\n canCreate: status.board?.canCreate,\n canDragIn: status.board?.canDragIn,\n canDragOut: status.board?.canDragOut,\n actions: status.board?.actions?.flatMap((actionId) => {\n const action = set?.actions?.find((candidate) => candidate.id === actionId);\n return action ? [{ id: action.id, label: action.label, icon: action.icon }] : [];\n }),\n };\n }\n return undefined;\n};\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 },\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 const result = await executeKanbanRendererCommand(\n context,\n record,\n record.rowActivationHandlerId!,\n { row: toActivatedRow(row) },\n resource,\n );\n const target = toWorkbenchNavigationTargetResult(result, {\n extensionId: record.extensionId,\n resourceOf: adapter.resolveNavigationResource\n ? (resource) => adapter.resolveNavigationResource!(record, resource)\n : undefined,\n });\n if (target) await context.workbench.navigation.openTarget(target);\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) => {\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 };\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 panels: WorkbenchExtensionMetadata[\"panels\"] = [],\n resourcePanels: WorkbenchExtensionMetadata[\"resourcePanels\"] = [],\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 = adapter.decorateAttribute ?? ((_, attribute) => attribute);\n const resolveRowResource = adapter.resolveRowResource ?? defaultResolveRowResource;\n const resolveRowActionResource = adapter.resolveRowActionResource ?? defaultResolveRowActionResource;\n const afterMutation = adapter.onAfterMutation ?? (() => {});\n\n const runMutation = (\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n ) =>\n executeKanbanRendererCommand(context, record, commandId, params).then((result) => {\n afterMutation(record);\n return result;\n });\n\n for (const record of records) {\n const resolveStatusOptions = createStatusOptionsResolver(context, record);\n const attributes = createMutableAttributeSource(\n record,\n record.attributes,\n localize,\n decorate,\n resolveStatusOptions,\n );\n let wireAttributes = record.attributes;\n const originalRows = new WeakMap<KanbanRendererRow, KanbanRendererRow>();\n let columnConfigs: ColumnConfigRecord | undefined;\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, row);\n const toActivatedRow = (row: KanbanRendererRow) => originalRows.get(row) ?? row;\n\n disposables.push(...registerRowActionCommands(context, record, localize));\n disposables.push(\n context.workbench.renderers.registerKanbanRenderer({\n id: record.id,\n title: localize(record.title, record.id),\n resourceKind: record.resourceKind,\n storageScope: context.projectId,\n attributes: attributes.source,\n defaultSettings: record.defaultSettings,\n defaultFilters: record.defaultFilters,\n defaultViews: record.defaultViews?.map((view) => ({\n ...view,\n title: localize(view.title, view.id),\n })),\n defaultActiveViewId: record.defaultActiveViewId,\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n hideToolbar: record.hideToolbar,\n createRow: toCreateRowConfig(record, localize),\n getBoardColumnConfig: (groupKey) =>\n toWorkbenchBoardColumnConfig(\n columnConfigs?.[groupKey] ?? statusColumnConfig(context, record, wireAttributes, groupKey),\n localize,\n ),\n onRowActivate: toRowClick(context, record, adapter, resolveRowResource, toActivatedRow),\n executeQuery: async (state: KanbanRendererQueryState) => {\n const value = await executeKanbanRendererCommand(context, record, record.queryHandlerId, {\n settings: state.settings,\n filters: state.filters,\n });\n if (Array.isArray(value)) {\n return value.map((row) => {\n const mapped = toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, row as KanbanRendererRow);\n return mapped;\n });\n }\n if (!isQueryResult(value)) return [];\n const nextAttributes = value.attributes ?? wireAttributes;\n if (value.boardColumnConfigs && nextAttributes?.some((attribute) => attribute.type.kind === \"status\")) {\n throw new Error(`Status-backed Kanban renderer \"${record.id}\" cannot return boardColumnConfigs`);\n }\n wireAttributes = nextAttributes;\n attributes.set(nextAttributes);\n columnConfigs = value.boardColumnConfigs;\n return (value.rows ?? []).map((row) => {\n const mapped = toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, row as KanbanRendererRow);\n return mapped;\n });\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 onReorder: record.reorderHandlerId\n ? (rowId, beforeRowId) =>\n runMutation(record, record.reorderHandlerId!, { rowId, beforeRowId }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(record, adapter, runMutation),\n onColumnAction: record.columnActionHandlerId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionHandlerId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(context, record, adapter, localize, resolveRowActionResource),\n }),\n );\n }\n\n const menuOffsets = panelMenuDeclarationOffsets(panels);\n panels.forEach((panel, index) => {\n const rendererId = panelRendererId(panel, \"kanban\");\n if (!rendererId) return;\n disposables.push(\n registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n path: panel.path,\n aliases: panel.aliases,\n resolveInput: resolveWorkbenchExtensionViewInput(adapter.resolveViewInput, panel),\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuOffsets[index]!,\n resourcePanels,\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 { Localizable } 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 }>\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 = (params: ContributedParamSchema, localize: ParamLocalizer) => {\n if (!params) return undefined;\n\n return Object.fromEntries(\n Object.entries(params).map(([id, descriptor]) => [\n id,\n {\n ...descriptor,\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","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 = (metadata: WorkbenchExtensionMetadata, record: ExtensionTreeRendererRecord) =>\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 { WorkbenchModuleContext } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport {\n panelRendererId,\n registerWorkbenchExtensionPanel,\n resolveWorkbenchExtensionViewInput,\n toWorkbenchCompositionPanelContribution,\n type WorkbenchExtensionViewInputResolver,\n} from \"./panel-contributions\";\nimport type { ExtensionTreePanelRecord } from \"./tree-renderer-contribution-types\";\n\ninterface RegisterTreeViewWidgetInput {\n resourcePanels?: WorkbenchExtensionMetadata[\"resourcePanels\"];\n resolveViewInput?: WorkbenchExtensionViewInputResolver;\n workbench: WorkbenchModuleContext;\n}\n\nexport const registerTreeViewWidget = (\n input: RegisterTreeViewWidgetInput,\n panel: ExtensionTreePanelRecord,\n index: number,\n menuDeclarationOffset: number,\n) => {\n const rendererId = panelRendererId(panel, \"tree\");\n if (!rendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n path: panel.path,\n aliases: panel.aliases,\n resolveInput: resolveWorkbenchExtensionViewInput(input.resolveViewInput, panel),\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId,\n declarationIndex: index,\n menuDeclarationOffset: menuDeclarationOffset,\n resourcePanels: input.resourcePanels,\n }),\n });\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\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 { FILE_SECTION_NAVIGATION_METADATA_KEY } from \"../../core/registries/renderers/file-section-navigation\";\nimport { unwrapCommandValue } from \"../host/command-response\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\nimport { panelMenuDeclarationOffsets, type WorkbenchExtensionViewInputResolver } from \"./panel-contributions\";\nimport { localizeParamSchema } from \"./param-schema-localization\";\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 { registerTreeViewWidget } from \"./tree-renderer-panels\";\n\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 resolveViewInput?: WorkbenchExtensionViewInputResolver;\n workbench: WorkbenchModuleContext;\n}\n\nconst toExtensionResource = (resource: ResourceRef | undefined): ExtensionTreeResource | undefined => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nconst toWorkbenchResource = (\n resource: ExtensionTreeResource,\n sectionNavigation?: {\n treeId: string;\n targetNodeId: string;\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n },\n): ResourceRef => ({\n kind: resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`,\n id: resource.id,\n label: resource.label,\n metadata: sectionNavigation\n ? { ...resource.metadata, [FILE_SECTION_NAVIGATION_METADATA_KEY]: sectionNavigation }\n : resource.metadata,\n});\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});\n\nconst createQueryParams = (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n ctx: TreeContext,\n node?: ExtensionTreeNode,\n) => {\n const resource = toExtensionResource(ctx.resource);\n const modeId = input.workbench.modes.getActiveModeId();\n return {\n renderer: {\n rendererId: record.id,\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n state: input.workbench.renderers.getTreeState(record.id),\n ...(ctx.filter ? { filter: ctx.filter } : {}),\n ...(node ? { node } : {}),\n };\n};\n\nconst executeCallback = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n) => {\n const renderer = params.renderer as { modeId?: string; resource?: ExtensionTreeResource } | undefined;\n const resource = renderer?.resource;\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params,\n resource,\n slot: slotContext({\n modeId: renderer?.modeId,\n projectId: input.projectId,\n resource,\n treeId: record.id,\n }),\n source: \"dashboard\",\n });\n return unwrapCommandValue(result);\n};\n\nconst 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 const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params: rendererParams,\n resource,\n slot: slotContext({ modeId, projectId: input.projectId, resource, treeId: record.id }),\n source: \"dashboard\",\n metadata: { treeId: record.id },\n });\n return unwrapCommandValue(result);\n};\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};\n\nconst toRecordParams = (params: object | undefined) =>\n params && !Array.isArray(params) ? (params as Record<string, unknown>) : undefined;\n\nconst createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\n\n const resolveResource: typeof toWorkbenchResource = (resource, sectionNavigation) => {\n const resolved = input.resolveNodeResource?.(resource);\n if (!resolved) return toWorkbenchResource(resource, sectionNavigation);\n if (!sectionNavigation) return resolved;\n return {\n ...resolved,\n metadata: { ...resolved.metadata, [FILE_SECTION_NAVIGATION_METADATA_KEY]: sectionNavigation },\n };\n };\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\n const mapTarget = (\n target: ExtensionTreeTarget | undefined,\n node: ExtensionTreeNode,\n ctx: TreeContext,\n ): NavigationTarget | undefined => {\n if (!target) return undefined;\n const commandTargetOf = (commandTarget: Extract<ExtensionTreeTarget, { kind: \"command\" }>) => ({\n kind: \"command\" as const,\n commandId: runnerCommandId,\n args: {\n commandId: `${commandTarget.target.command.extensionId ?? record.extensionId}.command.${commandTarget.target.command.id}`,\n nodeId: node.id,\n params: commandTarget.target.params,\n resource: node.resource ?? toExtensionResource(ctx.resource),\n treeId: record.id,\n } satisfies TargetCommandArgs,\n });\n return toWorkbenchNavigationTarget(target, {\n commandTargetOf,\n extensionId: record.extensionId,\n resourceOf: (resource, resourceTarget) =>\n resolveResource(\n resource,\n resourceTarget.section\n ? { treeId: record.id, targetNodeId: node.id, anchors: resourceTarget.section.anchors }\n : undefined,\n ),\n });\n };\n\n const mapAction = (\n action: ExtensionTreeAction,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): TreeAction => {\n const commandId = action.command\n ? `${action.command.extensionId ?? record.extensionId}.command.${action.command.id}`\n : undefined;\n return {\n id: action.id,\n label: text(action.label),\n icon: action.icon,\n args: toRecordParams(action.params),\n params: localizeParamSchema(action.input, text),\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 await executeTreeActionCommand(\n input,\n record,\n commandId,\n toActionParams(params, toRecordParams(action.params)),\n node?.resource ?? toExtensionResource(ctx.resource),\n );\n input.workbench.renderers.refresh(record.id);\n }\n : undefined,\n };\n };\n\n const mapNode = (node: ExtensionTreeNode, ctx: TreeContext): TreeNode => {\n const mapped: TreeNode = {\n id: node.id,\n label: text(node.label),\n icon: node.icon,\n iconColor: node.iconColor,\n iconTooltip: node.iconTooltip,\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 };\n originalNodes.set(mapped, node);\n return mapped;\n };\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\n const mapNodes = (nodes: ExtensionTreeNode[], ctx: TreeContext): TreeNode[] =>\n nodes.map((node) => mapNode(node, ctx));\n\n return { mapNodes, mapSections, originalNodes, runnerCommandId };\n};\n\nconst isTreeSectionArray = (value: unknown): value is ExtensionTreeSection[] =>\n Array.isArray(value) && value.every((section) => section && typeof section === \"object\" && \"nodes\" in section);\n\nconst isTreeNodeArray = (value: unknown): value is ExtensionTreeNode[] =>\n Array.isArray(value) && value.every((node) => node && typeof node === \"object\" && \"id\" in node);\n\n// The node a command marks with `selected: true` (e.g. the open document in a\n// files tree) becomes the tree's highlighted selection.\nconst selectedNodeIdFromNodes = (nodes: ExtensionTreeNode[]): string | undefined => {\n for (const node of nodes) {\n if (node.selected) return node.id;\n const selectedChild = selectedNodeIdFromNodes(node.children ?? []);\n if (selectedChild) return selectedChild;\n }\n return undefined;\n};\n\nexport const selectedNodeIdFromSections = (sections: ExtensionTreeSection[]): string | undefined => {\n for (const section of sections) {\n const selectedNodeId = selectedNodeIdFromNodes(section.nodes);\n if (selectedNodeId) return selectedNodeId;\n }\n return undefined;\n};\n\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 if (args.nodeId) input.workbench.renderers.setSelectedNode(record.id, args.nodeId);\n const result = await executeTreeActionCommand(input, record, args.commandId, args.params, args.resource);\n for (const renderer of input.workbench.renderers.listFileRenderers()) {\n input.workbench.renderers.refreshFileRenderer(renderer.id);\n }\n return result;\n },\n },\n );\n\n const treeDisposable = input.workbench.renderers.registerTreeRenderer({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n searchable: record.searchable,\n searchPlaceholder: text(record.searchPlaceholder, \"Search files\"),\n defaultExpandedNodeIds: record.defaultExpandedNodeIds,\n defaultExpandedSectionIds: record.defaultExpandedSectionIds,\n getHeader: (ctx) =>\n resolveHostTreeHeaderNodes({ ctx, getHostTreeHeaderNodes: input.getHostTreeHeaderNodes, record, treeViews }),\n getBody: async (ctx) => {\n const result = await executeCallback(input, record, record.bodyHandlerId, createQueryParams(input, record, ctx));\n if (!isTreeSectionArray(result)) return [];\n const selectedNodeId = selectedNodeIdFromSections(result);\n if (selectedNodeId) input.workbench.renderers.setSelectedNode(record.id, selectedNodeId);\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 hostFooter;\n const result = await executeCallback(\n input,\n record,\n record.footerHandlerId,\n createQueryParams(input, record, ctx),\n );\n const extensionFooter = isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n return [...extensionFooter, ...hostFooter];\n },\n getChildren: async (node, ctx) => {\n if (!record.childrenHandlerId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node) ?? (node as unknown as ExtensionTreeNode);\n const result = await executeCallback(\n input,\n record,\n record.childrenHandlerId,\n createQueryParams(input, record, ctx, originalNode),\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};\n\nexport const registerWorkbenchExtensionTreeRenderers = (input: RegisterWorkbenchExtensionTreeRenderersInput) => {\n const disposables: Disposable[] = [];\n\n for (const record of input.metadata.treeRenderers ?? []) {\n disposables.push(registerTree(input, record));\n }\n\n const menuOffsets = panelMenuDeclarationOffsets(input.metadata.panels);\n input.metadata.panels.forEach((panel, index) => {\n const disposable = registerTreeViewWidget(\n {\n workbench: input.workbench,\n resourcePanels: input.metadata.resourcePanels,\n resolveViewInput: input.resolveViewInput,\n },\n panel,\n index,\n menuOffsets[index]!,\n );\n if (disposable) disposables.push(disposable);\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 { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, TreeNode, WorkbenchModuleContext, WorkbenchRegion } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\n\ntype NavigationItem = WorkbenchExtensionMetadata[\"navigationItems\"][number];\n\nexport interface RegisterWorkbenchExtensionNavigationItemsInput {\n metadata: Pick<WorkbenchExtensionMetadata, \"navigationItems\">;\n workbench: WorkbenchModuleContext;\n}\n\nconst regionForSlot = (slotId: string): WorkbenchRegion => {\n if (slotId.includes(\"main.right\")) return \"secondary\";\n if (slotId.includes(\"main.left\")) return \"sidenav\";\n return \"sidenav\";\n};\n\nconst byOrderAndId = (left: NavigationItem, right: NavigationItem) =>\n (left.order ?? 0) - (right.order ?? 0) || left.id.localeCompare(right.id);\n\nconst toNode = (item: NavigationItem): TreeNode => ({\n id: item.id,\n label: text(item.label, item.id),\n icon: item.icon,\n target: toWorkbenchNavigationTarget(item.action as ExtensionNavigationTarget, { extensionId: item.extensionId }),\n});\n\nconst groupItems = (items: NavigationItem[]) => {\n const groups = new Map<string, NavigationItem[]>();\n for (const item of items) {\n const group = item.group ?? \"Extensions\";\n groups.set(group, [...(groups.get(group) ?? []), item]);\n }\n return groups;\n};\n\nexport const registerWorkbenchExtensionNavigationItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) => {\n if (input.metadata.navigationItems.length === 0) return [] as Disposable[];\n const disposables: Disposable[] = [];\n const bySlot = new Map<string, NavigationItem[]>();\n for (const item of input.metadata.navigationItems) {\n bySlot.set(item.slot.id, [...(bySlot.get(item.slot.id) ?? []), item]);\n }\n\n for (const [slotId, items] of bySlot) {\n const rendererId = `workbench.extension.navigation.${slotId}`;\n const byGroup = groupItems([...items].sort(byOrderAndId));\n disposables.push(\n input.workbench.renderers.registerTreeRenderer({\n id: rendererId,\n title: \"Extensions\",\n getChildren: (node) => node.children ?? [],\n getBody: () =>\n [...byGroup].map(([group, groupItems]) => ({\n id: group,\n label: group,\n nodes: groupItems.map(toNode),\n })),\n }),\n input.workbench.layout.registerPanel({\n id: rendererId,\n title: \"Extensions\",\n region: regionForSlot(slotId),\n rendererId,\n singleton: true,\n }),\n );\n }\n\n return disposables;\n};\n","import { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, ResourceRef, WorkbenchModeActivationContext, WorkbenchPanelRegion } from \"../../core\";\nimport { workbenchPanelRegions } from \"../../core\";\nimport {\n createWorkbenchCompositionRegistry,\n listCompositionAddablePanels,\n reconcileCompositionLayout,\n toPanelPlacements,\n type WorkbenchCompositionRegistry,\n} from \"../contributions/composition-contributions\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\nimport type { InternalRegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\ninterface ResourceKindPresenterRecord {\n extensionId?: string;\n icon?: string;\n label?: string;\n surface: \"primary\" | \"secondary\" | \"attached\";\n}\n\ninterface ResourcePresenterPanel {\n edge?: InternalWorkbenchExtensionMetadata[\"resourcePanels\"][number];\n panel: InternalWorkbenchExtensionMetadata[\"panels\"][number];\n placement?: { for?: string; region: string };\n}\n\nconst collectResourceKindPresenterRecords = (metadata: InternalWorkbenchExtensionMetadata) => {\n const records = new Map<string, ResourceKindPresenterRecord>();\n for (const kind of metadata.resourceKinds ?? []) {\n records.set(kind.id, {\n surface: kind.surface,\n extensionId: kind.extensionId,\n label: kind.label ? text(kind.label, kind.id) : undefined,\n icon: kind.icon,\n });\n }\n for (const renderer of metadata.kanbanRenderers ?? []) {\n if (renderer.resourceKind && !records.has(renderer.resourceKind)) {\n records.set(renderer.resourceKind, { surface: \"primary\" });\n }\n }\n return records;\n};\n\nconst resourcePresenterPanels = (\n metadata: InternalWorkbenchExtensionMetadata,\n kind: string,\n ownerExtensionId: string | undefined,\n) => {\n const edges = (metadata.resourcePanels ?? []).filter((edge) => edge.resourceKind === kind);\n const panels: ResourcePresenterPanel[] = edges.flatMap((edge) => {\n const panel = metadata.panels.find((candidate) => candidate.id === edge.panel);\n return panel ? [{ edge, panel }] : [];\n });\n const edgePanelIds = new Set(panels.map(({ panel }) => panel.id));\n for (const panel of metadata.panels) {\n if (edgePanelIds.has(panel.id) || panel.extensionId !== ownerExtensionId) continue;\n const placements = panel.show ? (Array.isArray(panel.show) ? panel.show : [panel.show]) : [];\n const placement = placements.find((candidate) => candidate.for === kind);\n if (placement) panels.push({ panel, placement });\n }\n return panels;\n};\n\nconst placedPanelRegion = (input: InternalRegisterWorkbenchExtensionContributionsInput, panelId: string) => {\n const layout = input.workbench.layout.getLayout();\n const dockedRegions = [\"sidenav\", \"main\", \"secondary\", \"side\"] as const;\n return dockedRegions.find((region) =>\n layout.regions[region].widgets.some((placement) => placement.contributionId === panelId),\n );\n};\n\nconst openResourcePresenter = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n panels: readonly ResourcePresenterPanel[],\n resource: ResourceRef,\n) => {\n input.prepareResource?.(resource);\n const instances = panels.map(({ panel }) =>\n input.workbench.layout.openPanel(panel.id, {\n region: placedPanelRegion(input, panel.id),\n resource,\n title: resource.label ?? resource.id ?? resource.uri,\n strategy: { kind: \"persistent\" },\n }),\n );\n if (\n input.workbench.sidePanel.getMode() === \"closed\" &&\n panels.some(({ panel }) => placedPanelRegion(input, panel.id) === \"side\")\n ) {\n input.workbench.sidePanel.setMode(\"attached\");\n }\n const primaryIndex = panels.findIndex(\n (entry) => entry.edge?.slot === \"primary\" || entry.placement?.region === \"main\",\n );\n return instances[primaryIndex >= 0 ? primaryIndex : 0]!;\n};\n\nconst registerResourceKindPresenter = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n kind: string,\n record: ResourceKindPresenterRecord,\n) => {\n const disposables: Disposable[] = [];\n if (!input.workbench.resources.getKind(kind)) {\n disposables.push(\n input.workbench.resources.registerKind({\n kind,\n label: record.label ?? kind,\n icon: record.icon ?? \"FileText\",\n surface: record.surface,\n }),\n );\n }\n const panels = resourcePresenterPanels(input.metadata, kind, record.extensionId);\n if (panels.length === 0) return disposables;\n disposables.push(\n input.workbench.resources.registerPresenter({\n id: `workbench.extension.resource.${kind}`,\n canOpen: (resource) => resource.kind === kind,\n open: (resource) => openResourcePresenter(input, panels, resource),\n }),\n );\n return disposables;\n};\n\nexport const registerResourcePresenters = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n [...collectResourceKindPresenterRecords(input.metadata)].flatMap(([kind, record]) =>\n registerResourceKindPresenter(input, kind, record),\n );\n\nexport const registerComposition = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n const registry = createWorkbenchCompositionRegistry();\n const disposables: Disposable[] = [];\n for (const kind of input.metadata.resourceKinds ?? []) {\n disposables.push(\n registry.registerResourceKind({\n id: kind.id,\n extensionId: kind.extensionId,\n surface: kind.surface,\n slots: kind.slots,\n }),\n );\n }\n for (const panel of input.metadata.panels) {\n disposables.push(\n registry.registerPanelCapability({\n id: panel.id,\n extensionId: panel.extensionId,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n show: toPanelPlacements(panel.show),\n }),\n );\n }\n for (const edge of input.metadata.resourcePanels ?? []) {\n disposables.push(\n registry.registerResourcePanel({\n id: edge.id,\n extensionId: edge.extensionId,\n resourceKind: edge.resourceKind,\n panel: edge.panel,\n slot: edge.slot,\n }),\n );\n }\n for (const mode of input.metadata.modes) {\n disposables.push(\n registry.registerModeComposition({\n id: mode.modeId,\n extensionId: mode.extensionId,\n resources: mode.resources,\n modePanels: mode.modePanels,\n }),\n );\n }\n return { registry, disposables };\n};\n\ntype WorkbenchExtensionModeRecord = InternalWorkbenchExtensionMetadata[\"modes\"][number];\n\nconst extensionResourceUri = (type: string, id: string) =>\n `pstdio://extension-resource/${encodeURIComponent(type)}/${encodeURIComponent(id)}`;\n\nconst toModeDefaultResource = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n defaultResource: WorkbenchExtensionModeRecord[\"defaultResource\"],\n) => {\n if (!defaultResource) return undefined;\n if (\"commandId\" in defaultResource) {\n return async () => {\n const result = (await input.executeCommand(defaultResource.commandId, { projectId: input.projectId })) as\n | { type?: string; id?: string; label?: string }\n | undefined;\n if (!result || typeof result.type !== \"string\" || typeof result.id !== \"string\") return undefined;\n return {\n kind: result.type,\n uri: extensionResourceUri(result.type, result.id),\n id: result.id,\n label: result.label,\n };\n };\n }\n return {\n kind: defaultResource.type,\n uri: extensionResourceUri(defaultResource.type, defaultResource.id),\n id: defaultResource.id,\n label: defaultResource.label,\n };\n};\n\nexport const registerModes = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n registry: WorkbenchCompositionRegistry,\n) =>\n input.metadata.modes.map((mode) => {\n const applyComposition = (ctx: WorkbenchModeActivationContext, seeding: boolean) => {\n reconcileCompositionLayout(\n { layout: ctx.layout, notifications: ctx.notifications },\n { registry, modeId: mode.modeId, resourceKind: ctx.navigator.getSelectedResource()?.kind, seeding },\n );\n if (ctx.layout.getLayout().regions.side.widgets.length > 0) ctx.shell.setSidePanelPresentation(\"attached\");\n };\n\n return input.workbench.modes.registerMode({\n id: mode.modeId,\n label: text(mode.label, mode.modeId),\n panels: mode.panelRegions,\n resourceKinds: Object.keys(mode.resources ?? {}),\n defaultResource: toModeDefaultResource(input, mode.defaultResource),\n listAddablePanels: ({ layout, resource }) =>\n listCompositionAddablePanels({\n registry,\n modeId: mode.modeId,\n layout,\n resourceKind: resource?.kind,\n }).filter((panel): panel is typeof panel & { region: WorkbenchPanelRegion } =>\n workbenchPanelRegions.includes(panel.region as WorkbenchPanelRegion),\n ),\n activate: () => undefined,\n seed: (ctx: WorkbenchModeActivationContext) => applyComposition(ctx, true),\n reconcile: (ctx: WorkbenchModeActivationContext) => applyComposition(ctx, false),\n });\n });\n","import type { ExtensionKeybindingRecord } from \"pstdio-api-contracts\";\nimport type { WorkbenchModuleContext } from \"../../core\";\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 commandId: binding.commandId,\n keybinding: resolveExtensionKeybindingChord(binding),\n when: input.createWhenExpression?.(binding.when),\n args: binding.args,\n }),\n );\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { ContributionKind } from \"@pstdio/sdk/extensions\";\n\nexport type MetadataRef = { extensionId: string; kind: ContributionKind; id: string };\n\nexport const metadataRefId = (ref: MetadataRef) =>\n ref.extensionId === \"pstdio\" ? ref.id : `${ref.extensionId}.${ref.kind}.${ref.id}`;\n\nexport const metadataCommandId = (ref: { extensionId: string; id: string }) =>\n ref.extensionId === \"pstdio\" ? ref.id : `${ref.extensionId}.command.${ref.id}`;\n\nexport const toInternalWhen = (\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(metadataRefId) : metadataRefId(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\nexport const toWorkbenchWhenExpression = toInternalWhen;\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { ParamObjectSchema } from \"pstdio-api-contracts\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\nimport { metadataCommandId, metadataRefId, toInternalWhen } from \"./workbench-extension-metadata-ref\";\n\ntype MetadataView = WorkbenchExtensionMetadata[\"views\"][number];\n\nconst resourceKindForView = (metadata: WorkbenchExtensionMetadata, viewId: string) =>\n metadata.resourceViews.find((edge) => metadataRefId(edge.view) === viewId)?.resourceKind.id;\n\nconst panelPlacements = (metadata: WorkbenchExtensionMetadata, viewId: string) => {\n const direct = metadata.placements.flatMap((placement) =>\n placement.item.kind === \"view\" && metadataRefId(placement.item.view) === viewId\n ? [\n {\n region: placement.region,\n allowedRegions: placement.movableTo,\n required: placement.required,\n },\n ]\n : [],\n );\n const edges = metadata.resourceViews.filter((edge) => metadataRefId(edge.view) === viewId);\n const resource = edges.flatMap((edge) =>\n metadata.placements.flatMap((placement) =>\n placement.item.kind === \"resource-slot\" &&\n placement.item.slot.id === edge.slot.id &&\n placement.item.slot.resourceKind.id === edge.resourceKind.id\n ? [\n {\n for: edge.resourceKind.id,\n region: placement.region,\n allowedRegions: placement.movableTo,\n required: placement.required,\n },\n ]\n : [],\n ),\n );\n return [...direct, ...resource];\n};\n\nconst viewBody = (view: MetadataView) =>\n view.body.kind === \"webview\" ? { webview: view.body.webview } : { renderer: { kind: view.body.kind, id: view.id } };\n\nconst panelMenus = (metadata: WorkbenchExtensionMetadata, owner: MetadataView) =>\n metadata.viewMenus.flatMap((menu) => {\n if (metadataRefId(menu.owner) !== owner.id) return [];\n const view = metadata.views.find((candidate) => candidate.id === metadataRefId(menu.view));\n if (!view) return [];\n return [\n {\n id: menu.id,\n extensionId: menu.extensionId,\n ownerPanelId: owner.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 });\n\nconst panels = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"panels\"] =>\n metadata.views.map((view) => {\n const placements = panelPlacements(metadata, view.id);\n const menus = panelMenus(metadata, view);\n return {\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n path: view.path,\n icon: view.icon,\n show: placements.length === 0 ? undefined : placements.length === 1 ? placements[0] : placements,\n panelMenus: menus.length > 0 ? menus : undefined,\n ...viewBody(view),\n } as InternalWorkbenchExtensionMetadata[\"panels\"][number];\n });\n\nconst commandActions = <T extends { command: { extensionId: string; id: string } }>(actions: T[] | undefined) =>\n actions?.map(({ command, ...action }) => ({ ...action, commandId: metadataCommandId(command) }));\n\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: 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: metadataCommandId(body.createRow.command),\n attachments: body.createRow.attachments\n ? {\n resourceParam: body.createRow.attachments.resourceParam,\n fileParam: body.createRow.attachments.fileParam,\n commandId: metadataCommandId(body.createRow.attachments.command),\n }\n : undefined,\n }\n : undefined,\n rowActions: commandActions(body.rowActions),\n },\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: resourceKindForView(metadata, view.id),\n selectionActions: commandActions(body.selectionActions),\n rowActions: commandActions(body.rowActions),\n },\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: resourceKindForView(metadata, view.id),\n },\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: resourceKindForView(metadata, view.id),\n },\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: resourceKindForView(metadata, view.id),\n },\n ]\n : [],\n );\n\nconst modes = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"modes\"] =>\n metadata.modes.map((mode) => {\n const placements = metadata.placements.filter((placement) => metadataRefId(placement.mode) === mode.id);\n const panelRegions = [\n ...new Set(placements.flatMap((placement) => [placement.region, ...(placement.movableTo ?? [])])),\n ].filter((region) => region !== \"sidenav\");\n const modePanels = Object.fromEntries(\n placements.flatMap((placement) =>\n placement.item.kind === \"view\"\n ? [\n [\n metadataRefId(placement.item.view),\n {\n region: placement.region,\n allowedRegions: placement.movableTo,\n required: placement.required,\n defaultOpen: placement.required ? true : placement.defaultOpen,\n },\n ],\n ]\n : [],\n ),\n );\n const resources = Object.fromEntries(\n metadata.resourceKinds.flatMap((kind) => {\n const slots = Object.fromEntries(\n placements.flatMap((placement) =>\n placement.item.kind === \"resource-slot\" && placement.item.slot.resourceKind.id === kind.id\n ? [\n [\n placement.item.slot.id,\n {\n region: placement.region,\n allowedRegions: placement.movableTo,\n required: placement.required,\n defaultOpen: placement.required ? true : placement.defaultOpen,\n },\n ],\n ]\n : [],\n ),\n );\n return Object.keys(slots).length > 0 ? [[kind.id, { slots }]] : [];\n }),\n );\n return {\n id: mode.id,\n extensionId: mode.extensionId,\n modeId: mode.id,\n label: mode.label,\n icon: mode.icon,\n panelRegions: panelRegions.length > 0 ? panelRegions : undefined,\n resources,\n modePanels,\n } as InternalWorkbenchExtensionMetadata[\"modes\"][number];\n });\n\nexport const toInternalWorkbenchExtensionMetadata = (\n metadata: WorkbenchExtensionMetadata,\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 panels: adaptedPanels,\n resourceKinds: metadata.resourceKinds.map((kind) => ({\n id: kind.id,\n extensionId: kind.extensionId,\n surface: kind.surface,\n label: kind.label,\n icon: kind.icon,\n slots: Object.fromEntries(\n (kind.slots ?? []).map((slot) => [\n slot.id,\n { cardinality: slot.cardinality, external: slot.access === \"public\" },\n ]),\n ),\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 resourcePanels: metadata.resourceViews.map((edge) => ({\n id: edge.id,\n extensionId: edge.extensionId,\n resourceKind: edge.resourceKind.id,\n panel: metadataRefId(edge.view),\n slot: edge.slot.id,\n })),\n resourceHierarchyProviders: (metadata.resourceHierarchyProviders ?? []).map((record) => ({\n id: record.id,\n extensionId: record.extensionId,\n resourceKind: record.resourceKind.id,\n })),\n routes: [],\n treeItems: [],\n activityItems: (metadata.activityItems ?? []).map((item) => ({\n id: item.id,\n extensionId: item.extensionId,\n title: item.title,\n icon: item.icon,\n modes: item.modes.map(metadataRefId),\n placement: item.placement,\n commandId: metadataCommandId(item.command),\n params: item.params,\n })),\n settingsSections: metadata.settingsSections ?? [],\n settingsPanels: metadata.settingsPanels.flatMap((panel) => {\n const view = metadata.views.find((candidate) => candidate.id === metadataRefId(panel.view));\n if (!view || view.body.kind !== \"webview\") return [];\n return [\n {\n id: panel.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 ? metadataRefId(panel.section) : undefined,\n webview: view.body.webview,\n },\n ];\n }),\n kanbanRenderers: kanbanRenderers(metadata),\n dataTableRenderers: dataTableRenderers(metadata),\n commandPaletteResources: metadata.commandPaletteResources ?? [],\n treeRenderers: treeRenderers(metadata),\n fileRenderers: fileRenderers(metadata),\n controlsRenderers: controlsRenderers(metadata),\n keybindings: metadata.keybindings ?? [],\n settingsDefinitions: metadata.settingsDefinitions ?? [],\n statuses: metadata.statuses,\n statusBarItems: metadata.statusBarItems.map((item) => ({\n id: item.id,\n extensionId: item.extensionId,\n viewId: metadataRefId(item.view),\n slot: item.slot.id.endsWith(\"leading\") ? \"leading\" : \"trailing\",\n order: item.order,\n when: toInternalWhen(item.when),\n })),\n diagnostics: metadata.diagnostics,\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n FileRendererRefreshEnvelope,\n WorkbenchModuleContext,\n WorkbenchPanelInstance,\n} 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 if (target.kind === \"tree\") workbench.renderers.refresh(target.id);\n if (target.kind === \"file\") workbench.renderers.refreshFileRenderer(target.id, envelope);\n if (target.kind === \"controls\") workbench.renderers.refreshControlsRenderer(target.id);\n if (target.kind === \"dataTable\") workbench.renderers.refreshDataTableRenderer(target.id);\n if (target.kind === \"kanban\") workbench.renderers.refreshKanbanRenderer(target.id);\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\nconst findOpenPlacement = (workbench: WorkbenchModuleContext, panelId: string): WorkbenchPanelInstance | undefined => {\n return workbench.layout.listPanelInstances().find((candidate) => candidate.panelId === panelId);\n};\n\nconst restoreActiveWidget = (workbench: WorkbenchModuleContext, panelId: string | undefined) => {\n if (!panelId) return;\n try {\n workbench.layout.activatePanel(panelId);\n } catch {\n // The refreshed widget may have been closed by the command.\n }\n};\n\nexport const refreshOpenWorkbenchExtensionWebviews = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n) => {\n const activeWidgetId = workbench.layout.getLayout().activeWidgetId;\n\n for (const view of metadata.views) {\n if (view.body.kind !== \"webview\") continue;\n const placement = findOpenPlacement(workbench, view.id);\n if (!placement) continue;\n workbench.layout.openPanel(view.id, {\n resource: placement.resource,\n title: text(view.title, placement.title),\n strategy: { kind: \"replace-panel\", instanceId: placement.instanceId },\n });\n }\n\n restoreActiveWidget(workbench, activeWidgetId);\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { ExtensionResourceOpenIntent } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport {\n createExtensionSlot,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\nimport type { CreateBridgeWebviewHostCapabilities } from \"./bridge-webview-renderer\";\nimport { createWorkbenchWebviewHostCapabilities, toOpenResourceInput } from \"./webview-host-capabilities\";\n\ntype ExtensionWebviewSlotKind = NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\n\nexport interface ExtensionWebviewFileCapabilities {\n delete(params: unknown): Promise<unknown> | unknown;\n list(params: unknown): Promise<unknown> | unknown;\n upload(params: unknown): Promise<unknown> | unknown;\n}\n\ninterface CreateExtensionWebviewHostCapabilitiesInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n files?: ExtensionWebviewFileCapabilities;\n projectId: string;\n slotKind: ExtensionWebviewSlotKind;\n}\n\ntype WebviewCommandExecuteParams = {\n commandId: string;\n params?: Record<string, unknown>;\n resource?: CommandExecuteRequest[\"resource\"];\n};\n\ntype WebviewResourceOpenParams = {\n resource?: CommandExecuteRequest[\"resource\"];\n input?: ExtensionResourceOpenIntent;\n};\n\nexport const createExtensionWebviewHostCapabilities =\n (input: CreateExtensionWebviewHostCapabilitiesInput): CreateBridgeWebviewHostCapabilities =>\n (context) => {\n const base = createWorkbenchWebviewHostCapabilities({\n workbench: context.workbench,\n hostEvents: context.hostEvents,\n });\n\n return {\n ...base,\n // Extension guests speak the SDK resource shape (`type`); normalize to the\n // workbench shape (`kind` + synthesized uri) the resource registry expects,\n // mirroring how commands.execute and tree targets normalize their resources.\n \"resource.open\": (params) => {\n const request = params as WebviewResourceOpenParams;\n if (!request.resource) throw new Error(\"resource.open requires a resource.\");\n return context.workbench.resources.openResource(\n toWorkbenchResource(request.resource),\n toOpenResourceInput(request.input),\n );\n },\n \"commands.execute\": async (params) => {\n const request = params as WebviewCommandExecuteParams;\n const resource = request.resource ?? toExtensionCommandResource(context.placement.resource);\n\n return input.executeCommand(request.commandId, {\n projectId: input.projectId,\n ...(request.params ? { params: request.params } : {}),\n ...(resource ? { resource } : {}),\n slot: createExtensionSlot({\n id: context.webviewId,\n kind: input.slotKind,\n projectId: input.projectId,\n context: { panelId: context.webviewId },\n }),\n source: \"dashboard\",\n });\n },\n ...(input.files\n ? {\n \"files.upload\": input.files.upload,\n \"files.list\": input.files.list,\n \"files.delete\": input.files.delete,\n }\n : {}),\n } satisfies HostCapabilityRegistry;\n };\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type { Disposable, PreferencePropertySchema, PreferenceScope, PreferenceValue } from \"../../core\";\nimport { WorkflowStatusSettings } from \"../../react/statuses/workflow-status-settings\";\nimport {\n BRIDGE_WEBVIEW_RENDERER_ID,\n type CreateBridgeWebviewHostCapabilities,\n createBridgeWebviewRenderer,\n getBridgeWebviewHostEventPublisher,\n renderBridgeWebviewFrame,\n} from \"../bridge/bridge-webview-renderer\";\nimport { createExtensionWebviewHostCapabilities } from \"../bridge/webview-command-capabilities\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\nimport {\n panelMenuDeclarationOffsets,\n registerWorkbenchExtensionPanel,\n resolveWorkbenchExtensionViewInput,\n toWorkbenchCompositionPanelContribution,\n} from \"../contributions/panel-contributions\";\nimport { executeWorkbenchExtensionCommand, type WorkbenchExtensionCommandContext } from \"./workbench-extension-command\";\nimport type { InternalRegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nconst settingsSectionIdDefault = \"extensions\";\nconst extensionSettingsOrderBase = 1_000;\nconst statusesSettingsOrder = 25;\n\nconst asPreferenceValue = (value: unknown): PreferenceValue | undefined =>\n value === undefined ? undefined : (value as PreferenceValue);\n\nconst preferenceScope = (scope: \"global\" | \"project\"): PreferenceScope => (scope === \"global\" ? \"user\" : \"project\");\n\nconst withHostCapabilityOverrides = (\n createBase: CreateBridgeWebviewHostCapabilities,\n createOverrides: CreateBridgeWebviewHostCapabilities | undefined,\n): CreateBridgeWebviewHostCapabilities => {\n if (!createOverrides) return createBase;\n return (context) =>\n ({\n ...createBase(context),\n ...createOverrides(context),\n }) satisfies HostCapabilityRegistry;\n};\n\nconst createExtensionHostCapabilities = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n slotKind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"],\n) => {\n const createBase =\n input.createWebviewHostCapabilities ??\n createExtensionWebviewHostCapabilities({\n executeCommand: input.executeCommand,\n files: input.webviewFiles,\n projectId: input.projectId,\n slotKind,\n });\n\n return withHostCapabilityOverrides(createBase, input.createWebviewHostCapabilityOverrides);\n};\n\nexport const registerBridgeRenderer = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n if (input.workbench.renderers.getRenderer(BRIDGE_WEBVIEW_RENDERER_ID)) return [] as Disposable[];\n return [\n input.workbench.renderers.registerRenderer(\n createBridgeWebviewRenderer({\n createHostCapabilities: createExtensionHostCapabilities(input, \"panel\"),\n createProps: input.createWebviewProps,\n createTheme: input.createWebviewTheme,\n }),\n ),\n ];\n};\n\nexport const registerWebviewPanels = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n const menuOffsets = panelMenuDeclarationOffsets(input.metadata.panels);\n return input.metadata.panels.flatMap((panel, index) => {\n if (!panel.webview) return [];\n return [\n registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n path: panel.path,\n aliases: panel.aliases,\n resolveInput: resolveWorkbenchExtensionViewInput(input.resolveViewInput, panel),\n contribution: toWorkbenchCompositionPanelContribution({\n panel,\n rendererId: BRIDGE_WEBVIEW_RENDERER_ID,\n declarationIndex: index,\n menuDeclarationOffset: menuOffsets[index]!,\n resourcePanels: input.metadata.resourcePanels,\n config: toBridgeWebviewConfig(panel.webview),\n }),\n }),\n ];\n });\n};\n\nconst statusResult = (value: unknown) => {\n if (!value || typeof value !== \"object\" || !(\"statuses\" in value) || !Array.isArray(value.statuses)) {\n throw new Error(\"Status provider returned an invalid response\");\n }\n return value.statuses;\n};\n\nexport const registerStatuses = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const records = input.metadata.statuses ?? [];\n if (records.length === 0) return [] as Disposable[];\n const disposables = records.map((record, index) =>\n input.workbench.statuses.registerStatusSet(\n {\n id: record.id,\n title: text(record.title, record.id),\n actions: record.actions?.map((action) => ({\n id: action.id,\n label: text(action.label, action.id),\n icon: action.icon,\n })),\n query: async () =>\n statusResult(await executeWorkbenchExtensionCommand(context, record.queryHandlerId, { params: {} })) as never,\n save: record.saveHandlerId\n ? async (statuses) =>\n statusResult(\n await executeWorkbenchExtensionCommand(context, record.saveHandlerId!, { params: { statuses } }),\n ) as never\n : undefined,\n },\n { ownerId: record.extensionId, priority: -index },\n ),\n );\n disposables.push(\n input.workbench.settings.registerPanel({\n id: \"workbench.statuses\",\n title: \"Statuses\",\n icon: \"list-checks\",\n kind: \"custom\",\n order: statusesSettingsOrder,\n section: input.settingsSectionId ?? settingsSectionIdDefault,\n scope: \"project\",\n render: () => createElement(WorkflowStatusSettings, { workbench: input.workbench }),\n }),\n );\n return disposables;\n};\n\nexport const registerSettings = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n const sectionId = input.settingsSectionId ?? settingsSectionIdDefault;\n\n if (!input.workbench.settings.getSection(sectionId)) {\n disposables.push(\n input.workbench.settings.registerSection({ id: sectionId, title: input.settingsSectionTitle ?? \"Extensions\" }),\n );\n }\n\n const sections = [...input.metadata.settingsSections].sort(\n (left, right) =>\n (left.order ?? 0) - (right.order ?? 0) ||\n left.extensionId.localeCompare(right.extensionId) ||\n left.id.localeCompare(right.id),\n );\n for (const section of sections) {\n disposables.push(\n input.workbench.settings.registerSection({\n id: section.id,\n title: text(section.title, section.id),\n order: section.order,\n scope: section.scope,\n }),\n );\n }\n\n const properties = Object.fromEntries(\n (input.metadata.settingsDefinitions ?? []).map((setting) => [\n setting.key,\n {\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 ]),\n );\n if (Object.keys(properties).length > 0) disposables.push(input.workbench.preferences.registerSchema({ properties }));\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 disposables.push(\n input.workbench.settings.registerPanel({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n kind: \"custom\",\n order: extensionSettingsOrderBase + index,\n section: panel.section ?? sectionId,\n scope: panel.scope,\n render: (renderInput) =>\n renderBridgeWebviewFrame({\n context: {\n workbench: renderInput.workbench,\n webviewId: panel.id,\n placement: { ...renderInput.instance, panelId: panel.id },\n hostEvents: getBridgeWebviewHostEventPublisher(renderInput.workbench, renderInput.instance),\n },\n createHostCapabilities: createExtensionHostCapabilities(input, \"settings\"),\n createProps: input.createWebviewProps ?? (({ placement }) => ({ placement, resource: placement.resource })),\n createTheme: input.createWebviewTheme,\n ownerId: panel.extensionId,\n title: text(panel.title, panel.id),\n webview: toBridgeWebviewConfig(panel.webview),\n }),\n }),\n );\n }\n\n return disposables;\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 { registerWorkbenchExtensionTreeRenderers } from \"../contributions/tree-renderer-contributions\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n type WorkbenchExtensionCommandContext,\n} from \"./workbench-extension-command\";\nimport { registerComposition, registerModes, registerResourcePresenters } from \"./workbench-extension-composition\";\nimport type {\n InternalRegisterWorkbenchExtensionContributionsInput,\n RegisterWorkbenchExtensionContributionsInput,\n} from \"./workbench-extension-host-types\";\nimport { registerWorkbenchExtensionKeybindings } from \"./workbench-extension-keybindings\";\n\nexport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nimport { toInternalWorkbenchExtensionMetadata } from \"./workbench-extension-metadata-adapter\";\nimport { registerWorkbenchExtensionRendererRefreshEvents } from \"./workbench-extension-refresh\";\nimport {\n registerBridgeRenderer,\n registerSettings,\n registerStatuses,\n registerWebviewPanels,\n} from \"./workbench-extension-surfaces\";\n\nconst disposeAll = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\n\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n\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;\n\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: command.params,\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 }),\n },\n ),\n );\n\nconst menuCommandResource = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n executionContext: WorkbenchCommandExecutionContext | undefined,\n) => executionContext?.resource ?? input.workbench.getPrimaryResource();\n\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\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};\n\nconst registerCommandPaletteContributions = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const registrations = buildWorkbenchExtensionCommandPaletteRegistrations({ metadata: input.metadata });\n\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()?.kind),\n }),\n input.workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, registration.menuItem),\n ]);\n};\n\nconst matchesActiveMode = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n when: { mode?: string | string[] } | 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};\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: () => matchesActiveMode(input, item.when as { mode?: string | string[] } | undefined),\n }),\n );\n\nexport const registerWorkbenchExtensionContributions = (sourceInput: RegisterWorkbenchExtensionContributionsInput) => {\n const input: InternalRegisterWorkbenchExtensionContributionsInput = {\n ...sourceInput,\n metadata: toInternalWorkbenchExtensionMetadata(sourceInput.metadata),\n };\n const disposables: Disposable[] = [];\n const context: WorkbenchExtensionCommandContext = input;\n\n disposables.push(...registerBridgeRenderer(input));\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(\n registerWorkbenchExtensionControlsRenderers(\n context,\n input.metadata.controlsRenderers ?? [],\n input.metadata.panels,\n { resolveViewInput: input.resolveViewInput },\n input.metadata.resourcePanels,\n ),\n );\n disposables.push(...registerWebviewPanels(input));\n disposables.push(...registerSettings(input));\n // Status-backed renderers query their provider while they register. Providers\n // must exist first so the renderer's live option source can load immediately.\n disposables.push(...registerStatuses(input, context));\n disposables.push(\n registerWorkbenchExtensionKanbanRenderers(\n context,\n input.metadata.kanbanRenderers ?? [],\n { ...input.kanbanAdapter, resolveViewInput: input.resolveViewInput },\n input.metadata.panels,\n input.metadata.resourcePanels,\n ),\n );\n disposables.push(\n registerWorkbenchExtensionDataTableRenderers(\n context,\n input.metadata.dataTableRenderers ?? [],\n input.metadata.panels,\n input.metadata.resourcePanels,\n input.resolveViewInput,\n ),\n );\n disposables.push(\n registerWorkbenchExtensionCommandPaletteResources(context, input.metadata.commandPaletteResources ?? []),\n );\n disposables.push(\n ...registerWorkbenchExtensionNavigationItems({\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(...registerResourcePresenters(input));\n const composition = registerComposition(input);\n disposables.push(...composition.disposables);\n disposables.push(...registerModes(input, composition.registry));\n\n return {\n dispose() {\n disposeAll(disposables);\n },\n };\n};\n"],"names":["WEBVIEW_HOST_CAPABILITY_VERSION","WEBVIEW_DECLARABLE_CAPABILITIES","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","WEBVIEW_HOST_CAPABILITIES","publicCapabilityNames","Set","isPublicCapability","name","has","parseCapabilityDeclaration","capability","versionText","split","version","undefined","Number","unsupportedCapability","code","message","severity","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","declaredCapabilities","capabilities","diagnostics","allowed","add","declaration","parsed","push","createHostCapabilityGate","input","emit","diagnostic","onDiagnostic","call","request","method","Error","handler","params","isRecord","value","safeStringify","json","JSON","stringify","length","String","normalizeRuntimeError","stack","collectChakraThemeVariables","document","computed","getComputedStyle","documentElement","variables","index","item","startsWith","getPropertyValue","trim","resolveActiveTheme","fallback","getAttribute","colorMode","iframeStyle","border","display","flex","height","minHeight","width","frameShellStyle","position","errorOverlayStyle","alignItems","background","color","inset","justifyContent","padding","textAlign","zIndex","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","props","view","extensionProps","theme","hostEvents","onReady","onError","onDiagnostics","title","iframeRef","useRef","remoteRef","initializedRef","connectedKeyRef","propsRef","themeRef","capabilitiesRef","hostEventsRef","declaredCapabilitiesRef","webview","onReadyRef","onErrorRef","onDiagnosticsRef","runtimeError","setRuntimeError","useState","frameEpoch","setFrameEpoch","current","useEffect","iframe","onFrameLoad","epoch","addEventListener","removeLoadListener","removeEventListener","connectedKey","runtimeUrl","moduleUrl","stylesAtConnect","styles","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","ready","payload","connect","connection","host","contentWindow","location","replace","then","conn","remote","bind","hostEvent","init","themeVariables","extensionId","catch","error","normalized","unbind","propsUpdate","themeUpdate","window","MutationObserver","frame","schedule","cancelAnimationFrame","requestAnimationFrame","observer","options","attributeFilter","attributes","observe","body","disconnect","jsxs","jsx","label","colorScheme","createHostEventPublisher","sink","pending","disconnectListeners","next","shift","onDisconnect","listener","delete","TERMINAL_SESSION_EVENT_SCOPE","createTerminalSessionCapability","terminal","scope","operation","sessionId","open","write","data","accepted","resize","cols","rows","kill","signal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","subscribe","onData","chunk","kind","onExit","exit","dispatchDocumentKeyboardEvent","event","KeyboardEvent","bubbles","cancelable","dispatchEvent","toOpenResourceInput","strategy","replaceActive","createWorkbenchWebviewHostCapabilities","commands.execute","workbench","commands","executeCommand","commandId","resource.open","resource","resources","openResource","notification.show","notification","notifications","show","level","preferences.get","preferences","getValue","preferences.set","setValue","host.dispatchKeyboardEvent","dispatchKeyboardEvent","logWebviewDiagnostics","webviewId","console","warn","logWebviewError","BRIDGE_WEBVIEW_RENDERER_ID","isBridgeWebviewConfig","Array","isArray","config","createPlacementProps","placement","createLightTheme","hostEventPublishersByWorkbench","WeakMap","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","get","Map","set","key","instanceId","renderBridgeWebviewFrame","context","createHostCapabilities","createProps","createTheme","ownerId","id","renderBridgeWebview","panel","panelId","createBridgeWebviewRenderer","render","renderInput","hostRef","hostResourceKind","menuSlots","ref","surface","headerMenuSlots","access","workbenchResourceKindDefinitions","project","session","workspace","workbenchResourceKinds","createCommandRef","Object","assign","forExtension","owner","publisher","eventRef","defineSlot","description","metadata","hostEventRef","resourceMenuSlotRef","resourceKind","isLocalizedString","$l10n","text","default","unwrapCommandValue","result","response","outcome","status","reason","toExtensionCommandResource","type","uri","toWorkbenchResource","icon","projectId","encodeURIComponent","createExtensionSlot","deletedResourceId","deleted","handleDeletedResource","navigator","forgetResource","getPrimaryResource","parent","walkHierarchy","at","isWorkbenchViewHierarchyNode","views","openView","viewId","executeWorkbenchExtensionCommand","slot","source","Boolean","isContributionRef","isResource","isResourceTarget","target","isViewTarget","isItemTarget","href","command","isExtensionNavigationTarget","targets","every","toResourceInput","_sourcePlacement","toViewInput","sourcePlacement","toCommandTarget","override","commandTargetOf","commandIdOf","args","viewIdOf","toWorkbenchNavigationTarget","section","resourceOf","map","toWorkbenchNavigationTargetResult","isProviderQueryResult","activateTarget","record","commandPaletteResources","refresh","navigation","openTarget","resourceTarget","resolved","FILE_SECTION_NAVIGATION_METADATA_KEY","treeId","targetNodeId","anchors","toResult","groupLabel","keywords","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","registerProvider","refreshEventIds","query","limit","activeResource","getActiveResource","queryHandlerId","modeId","modes","getActiveModeId","providerId","items","dispose","toPanelPlacements","for","createWorkbenchCompositionRegistry","resourceKinds","panels","resourcePanels","remove","list","createDisposable","indexOf","splice","registerResourceKind","definition","registerPanelCapability","registerResourcePanel","edge","registerModeComposition","getComposition","getModeComposition","extractPersistedState","layout","knownPanelIds","regions","region","dockedCompositionRegions","state","order","widgets","filter","contributionId","active","find","widgetId","activeWidgetId","activePanelId","listCompositionAddablePanels","mode","registry","composition","resolveComposition","persisted","addablePanels","placementRole","applyPlacement","ctx","getLayout","existingRegion","some","candidate","openWidget","closable","required","pinned","role","origin","allowedRegions","includes","existing","updateWidgetPlacement","restoreActiveTabs","activeBefore","widget","setRegionActiveWidget","reportRequiredFallback","notificationId","compositionRequiredNotificationId","requiredFallback","dismiss","fallbackPanelId","main","join","reconcileCompositionLayout","seeding","placements","reconcilePanelMenus","toBridgeWebviewConfig","resolveWorkbenchExtensionViewInput","resolver","declarationPriority","declarationIndex","priority","panelResourceKinds","kinds","flatMap","all","panelDefaultRegion","toWorkbenchCompositionPanelContribution","rendererId","singleton","panelMenus","toWorkbenchPanelMenus","menuDeclarationOffset","panelMenuDeclarationOffsets","offsets","total","panelMenuRendererId","menu","renderer","menuPlacementBasePriority","first","last","menus","declarationOffset","side","registerWorkbenchExtensionPanel","registerPanel","contribution","registerView","path","aliases","resolveInput","panelRendererId","localize","isQueryResult","registerControlsRenderer","adapter","controlsRendererId","run","invocation","Promise","resolve","renderers","emptyTitle","emptyDescription","defaultValues","executeQuery","resolveResource","updateValue","valueChangeHandlerId","controlId","values","apply","applyHandlerId","reset","resetHandlerId","controlIds","registerControlsViewWidget","resolveViewInput","registerWorkbenchExtensionControlsRenderers","menuOffsets","forEach","disposable","toColumn","column","createElement","WorkbenchIcon","size","toRow","row","registerRenderer","originalRows","dataTableRendererId","registerDataTableRenderer","columns","initialPageSize","pageSizeOptions","selectionMode","selectionActions","action","destructive","rowIds","mapped","rowActions","rowId","refreshDataTableRenderer","onRowActivate","rowActivationHandlerId","registerWorkbenchExtensionDataTableRenderers","placementOrder","emptyWorkbenchExtensionMetadata","commandPaletteContributions","extensions","menuContributions","viewMenus","resourceViews","navigationItems","statusBarItems","statuses","settingsPanels","settingsDefinitions","defaultWorkbenchExtensionCommandId","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","createMenuItem","resolveString","when","sourceCommandId","overflowLabel","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","createCommandId","createWhenExpression","menuSlotsById","menuTargetsById","registrations","unresolved","slotId","targetId","category","menuItem","menuPath","targetCommandId","buildWorkbenchExtensionCommandPaletteRegistrations","toExtensionResource","slotContext","resourceType","resourceId","executeFileCommand","extra","ext","revisionFromValue","revision","fileRendererRefreshEnvelopeFromCommand","fileRendererOrigin","operationId","resourceUri","fileRendererResourceUri","registerFileRenderer","load","loadHandlerId","save","saveHandlerId","content","registerFileViewWidget","registerWorkbenchExtensionFileRenderers","fileRenderers","localizeAttributes","decorate","resolveStatusOptions","attribute","base","option","createMutableAttributeSource","initial","snapshot","listeners","getSnapshot","isWorkbenchResource","isExtensionResource","rowResourceUri","defaultResolveRowResource","_","defaultResolveRowActionResource","fromRow","toWorkbenchRow","mergeParams","asParams","hasCommandParameters","keys","CREATE_FIELD_TYPES","toCreateField","descriptor","optional","placeholder","defaultValue","multiple","accept","toCreateFields","entries","createRow","field","createKanbanRendererSlot","kanbanRendererId","executeKanbanRendererCommand","commandResource","kanbanRendererRowActionCommandId","registerRowActionCommands","getCommand","registerCommand","execute","executionContext","runDefaultRowAction","commandPalette","requestParams","createBoardActionIcon","BoardActionIcon","toWorkbenchBoardColumnConfig","canDragIn","canDragOut","canCreate","actions","statusSetId","createStatusOptionsResolver","sources","getStatuses","store","subscribeSelector","statusColumnConfig","groupKey","getStatusSet","board","actionId","createRowActionIcon","toCreateRowConfig","submitLabel","fields","labels","cancel","properties","submitError","removeFile","toRowClick","resolveRowResource","toActivatedRow","resolveNavigationResource","onRowClick","toCreateRowHandler","runMutation","submission","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","toRowContextMenuActions","resolveRowActionResource","runDefault","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","resolveLabel","decorateAttribute","afterMutation","onAfterMutation","wireAttributes","columnConfigs","rowResource","registerKanbanRenderer","storageScope","defaultSettings","defaultFilters","defaultViews","defaultActiveViewId","hideToolbar","getBoardColumnConfig","settings","filters","nextAttributes","boardColumnConfigs","onAttributeChange","attributeChangeHandlerId","attributeId","onReorder","reorderHandlerId","beforeRowId","onCreateRow","onColumnAction","columnActionHandlerId","getRowContextMenuActions","localizeParamSchema","fromEntries","treeViewsFor","resolveTreeView","resolveHostTreeHeaderNodes","getHostTreeHeaderNodes","treeViews","hostTreeHeader","resolveHostTreeFooterNodes","getHostTreeFooterNodes","hostTreeFooter","registerTreeViewWidget","sectionNavigation","createQueryParams","node","getTreeState","executeCallback","executeTreeActionCommand","rendererParams","toActionParams","toRecordParams","createTreeMapper","originalNodes","runnerCommandId","resolveNodeResource","mapEmptyState","emptyState","mapTarget","commandTarget","nodeId","mapAction","disabled","mapNode","iconColor","iconTooltip","rowVariant","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","mapNodes","nodes","mapSections","sections","isTreeSectionArray","isTreeNodeArray","selectedNodeIdFromNodes","selected","selectedChild","selectedNodeIdFromSections","selectedNodeId","registerTree","mapper","commandDisposable","rawArgs","setSelectedNode","listFileRenderers","refreshFileRenderer","treeDisposable","registerTreeRenderer","searchable","searchPlaceholder","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","getBody","bodyHandlerId","getFooter","hostFooter","footerHandlerId","getChildren","childrenHandlerId","originalNode","registerWorkbenchExtensionTreeRenderers","treeRenderers","regionForSlot","byOrderAndId","left","right","localeCompare","toNode","groupItems","groups","registerWorkbenchExtensionNavigationItems","bySlot","byGroup","sort","collectResourceKindPresenterRecords","kanbanRenderers","resourcePresenterPanels","ownerExtensionId","edgePanelIds","placedPanelRegion","openResourcePresenter","prepareResource","instances","openPanel","sidePanel","getMode","setMode","primaryIndex","findIndex","entry","registerResourceKindPresenter","getKind","registerKind","registerPresenter","canOpen","registerResourcePresenters","registerComposition","slots","modePanels","extensionResourceUri","toModeDefaultResource","defaultResource","registerModes","applyComposition","getSelectedResource","shell","setSidePanelPresentation","registerMode","panelRegions","listAddablePanels","workbenchPanelRegions","seed","reconcile","currentPlatform","platform","userAgent","toLowerCase","resolveExtensionKeybindingChord","binding","platformOverrides","registerWorkbenchExtensionKeybindings","bindings","keybindings","registerKeybinding","keybinding","metadataRefId","metadataCommandId","toInternalWhen","ids","toWorkbenchWhenExpression","resourceKindForView","panelPlacements","direct","movableTo","viewBody","ownerPanelId","commandActions","attachments","resourceParam","fileParam","dataTableRenderers","controlsRenderers","defaultOpen","toInternalWorkbenchExtensionMetadata","adaptedPanels","cardinality","external","resourceHierarchyProviders","routes","treeItems","activityItems","settingsSections","endsWith","refreshWorkbenchExtensionRenderer","envelope","refreshControlsRenderer","refreshKanbanRenderer","rendererRefreshTargets","eventId","eventTargets","registerWorkbenchExtensionRendererRefreshEvents","findOpenPlacement","listPanelInstances","restoreActiveWidget","activatePanel","refreshOpenWorkbenchExtensionWebviews","createExtensionWebviewHostCapabilities","slotKind","files","upload","settingsSectionIdDefault","extensionSettingsOrderBase","statusesSettingsOrder","asPreferenceValue","preferenceScope","withHostCapabilityOverrides","createBase","createOverrides","createExtensionHostCapabilities","createWebviewHostCapabilities","webviewFiles","createWebviewHostCapabilityOverrides","registerBridgeRenderer","getRenderer","createWebviewProps","createWebviewTheme","registerWebviewPanels","statusResult","registerStatuses","registerStatusSet","settingsSectionId","WorkflowStatusSettings","registerSettings","sectionId","getSection","registerSection","settingsSectionTitle","setting","enum","registerSchema","disposeAll","prepareCommandArgs","onArgsChange","registerCommands","prepareArgs","menuCommandResource","registerMenus","createMenuWhenExpression","defaultRegistrations","registration","menuItems","menuRegistrations","registerMenuItem","registerCommandPaletteContributions","isVisible","matchesResourceWhen","workbenchCommandPaletteMenuPath","matchesActiveMode","registerStatusBarItems","statusBar","registerItem","registerWorkbenchExtensionContributions","sourceInput","createKeybindingWhenExpression","resolveTreeNodeResource","kanbanAdapter","subscribeRefreshEvents"],"mappings":"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"}
|