@pstdio/workbench 0.7.1 → 0.9.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.
Files changed (44) hide show
  1. package/README.md +39 -317
  2. package/dist/extensions.d.ts +1492 -698
  3. package/dist/extensions.js +1679 -1776
  4. package/dist/extensions.js.map +1 -1
  5. package/dist/file-renderer-view-kfJRY3yR.js +515 -0
  6. package/dist/file-renderer-view-kfJRY3yR.js.map +1 -0
  7. package/dist/index.d.ts +724 -599
  8. package/dist/index.js +5151 -2369
  9. package/dist/index.js.map +1 -1
  10. package/dist/react.d.ts +673 -550
  11. package/dist/react.js +3585 -3335
  12. package/dist/react.js.map +1 -1
  13. package/dist/storage.d.ts +120 -155
  14. package/dist/storage.js +135 -149
  15. package/dist/storage.js.map +1 -1
  16. package/dist/webview-runtime.d.ts +2 -5
  17. package/dist/webview-runtime.js +3 -3
  18. package/dist/webview-runtime.js.map +1 -1
  19. package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
  20. package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
  21. package/dist/workbench-renderers-DmsrBGC7.js +960 -0
  22. package/dist/workbench-renderers-DmsrBGC7.js.map +1 -0
  23. package/dist/workspaces-DJwFj8uq.js +1872 -0
  24. package/dist/workspaces-DJwFj8uq.js.map +1 -0
  25. package/package.json +6 -41
  26. package/dist/composition-resolver-types-CWykPyEK.js +0 -241
  27. package/dist/composition-resolver-types-CWykPyEK.js.map +0 -1
  28. package/dist/file-renderer-view-B6_iR4EN.js +0 -496
  29. package/dist/file-renderer-view-B6_iR4EN.js.map +0 -1
  30. package/dist/file-section-navigation-CfYqVObc.js +0 -30
  31. package/dist/file-section-navigation-CfYqVObc.js.map +0 -1
  32. package/dist/icon-B9XolQG8.js +0 -35
  33. package/dist/icon-B9XolQG8.js.map +0 -1
  34. package/dist/layout-types-DMoZz38-.js +0 -100
  35. package/dist/layout-types-DMoZz38-.js.map +0 -1
  36. package/dist/surface-map-C1pOTUmF.js +0 -52
  37. package/dist/surface-map-C1pOTUmF.js.map +0 -1
  38. package/dist/testing.d.ts +0 -2284
  39. package/dist/testing.js +0 -58
  40. package/dist/testing.js.map +0 -1
  41. package/dist/workbench-built-ins-BncLJfQA.js +0 -1175
  42. package/dist/workbench-built-ins-BncLJfQA.js.map +0 -1
  43. package/dist/workbench-menu-paths-Bb0ICxeG.js +0 -20
  44. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +0 -1
@@ -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 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 { 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","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","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-api-contracts/src/extension-kernel/l10n.ts","../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/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-extensions/src/workbench/shared/localization.ts","../src/extensions/host/extension-navigation-target.ts","../src/extensions/host/command-response.ts","../src/extensions/host/workbench-extension-command.ts","../src/extensions/contributions/command-palette-resource-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.ts","../src/extensions/contributions/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-contributions.ts","../src/extensions/host/workbench-extension-metadata-ref.ts","../src/extensions/contributions/navigation-item-contributions.ts","../src/extensions/host/workbench-extension-keybindings.ts","../src/extensions/host/workbench-extension-page-metadata.ts","../src/extensions/host/workbench-extension-metadata-adapter.ts","../src/extensions/host/workbench-extension-refresh.ts","../src/extensions/bridge/webview-command-capabilities.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/host/workbench-extension-surfaces.ts","../src/extensions/host/workbench-extension-tab-presentation.ts","../src/extensions/host/workbench-extension-host.ts"],"sourcesContent":["export interface LocalizedString {\n readonly $l10n: string;\n readonly default?: string;\n}\n\nexport type Localizable<T extends string = string> = T | LocalizedString;\n\nexport const l10n = (key: string, defaultValue?: string) => ({\n $l10n: key,\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n});\n\nexport const isLocalizedString = (value: unknown): value is LocalizedString =>\n typeof value === \"object\" &&\n value !== null &&\n \"$l10n\" in value &&\n typeof (value as { $l10n?: unknown }).$l10n === \"string\";\n","import {\n ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITY_VERSION,\n WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES,\n type WebviewHostCapability,\n type WebviewScopedDeclarableCapability,\n} from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRequest } from \"./index\";\n\nexport {\n ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n WEBVIEW_DECLARABLE_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITIES,\n WEBVIEW_HOST_CAPABILITY_VERSION,\n WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES,\n type WebviewDeclarableCapability,\n type WebviewHostCapability,\n type WebviewScopedDeclarableCapability,\n} from \"@pstdio/sdk/extensions\";\n\nexport type WebviewCapabilityDiagnosticCode =\n | \"undeclared_webview_capability\"\n | \"unsupported_webview_capability\"\n | \"unsupported_webview_capability_version\";\n\nexport interface WebviewCapabilityDiagnostic {\n capability: string;\n code: WebviewCapabilityDiagnosticCode;\n message: string;\n severity: \"error\";\n}\n\nexport type HostCapability<TParams = unknown, TResult = unknown> = (params: TParams) => Promise<TResult> | TResult;\nexport type HostCapabilityRegistry = Partial<Record<WebviewHostCapability, HostCapability>>;\n\ninterface CreateHostCapabilityGateInput {\n capabilities: HostCapabilityRegistry;\n declaredCapabilities?: readonly string[];\n onDiagnostic?: (diagnostic: WebviewCapabilityDiagnostic) => void;\n}\n\nconst publicCapabilityNames = new Set<string>(WEBVIEW_HOST_CAPABILITIES);\nconst scopedCapabilityNames = new Set<string>(WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability => publicCapabilityNames.has(name);\n\nconst isScopedCapability = (name: string): name is WebviewScopedDeclarableCapability => scopedCapabilityNames.has(name);\n\nexport const parseWebviewCapabilityDeclaration = (capability: string) => {\n const [nameAndScope = \"\", versionText] = capability.split(\"@\");\n const scopeIndex = nameAndScope.indexOf(\":\");\n const name = scopeIndex === -1 ? nameAndScope : nameAndScope.slice(0, scopeIndex);\n const scope = scopeIndex === -1 ? undefined : nameAndScope.slice(scopeIndex + 1);\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name, scope, version };\n};\n\n// A scoped capability needs `name:scope`; every other capability must stay bare.\nconst validateDeclarationShape = (parsed: ReturnType<typeof parseWebviewCapabilityDeclaration>) => {\n if (isScopedCapability(parsed.name)) return Boolean(parsed.scope);\n return parsed.scope === undefined;\n};\n\nconst unsupportedCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability\",\n message: `Unsupported webview capability: ${capability}`,\n severity: \"error\",\n});\n\nconst unsupportedVersion = (capability: string, name: string, version: number): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability_version\",\n message: `Unsupported webview capability version: ${name}@${version.toString()} (supported: ${WEBVIEW_HOST_CAPABILITY_VERSION.toString()})`,\n severity: \"error\",\n});\n\nconst undeclaredCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"undeclared_webview_capability\",\n message: `Webview did not declare host capability: ${capability}`,\n severity: \"error\",\n});\n\nexport const validateWebviewCapabilityDeclarations = (\n declaredCapabilities: readonly string[] | undefined,\n capabilities: HostCapabilityRegistry = {},\n) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n const allowed = new Set<WebviewHostCapability>();\n const allowedScopes = new Map<WebviewHostCapability, Set<string>>();\n\n // Always-available capabilities never need a declaration — enable them wherever the\n // host implements them.\n for (const name of ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES) {\n if (capabilities[name]) allowed.add(name);\n }\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseWebviewCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name) || !validateDeclarationShape(parsed)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n continue;\n }\n if (!capabilities[parsed.name]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.scope === undefined) {\n allowed.add(parsed.name);\n continue;\n }\n const scopes = allowedScopes.get(parsed.name) ?? new Set<string>();\n scopes.add(parsed.scope);\n allowedScopes.set(parsed.name, scopes);\n }\n\n return { allowed, allowedScopes, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseWebviewCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name) || !validateDeclarationShape(parsed)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n }\n }\n\n return diagnostics;\n};\n\n// Scoped capabilities carry their grant in the params: artifacts.read names the\n// mount it reads. The gate compares that value against the declared scopes.\nconst requestScope = (request: HostCapabilityRequest) => {\n const params = request.params as { mount?: unknown } | undefined;\n return typeof params?.mount === \"string\" && params.mount.length > 0 ? params.mount : undefined;\n};\n\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, allowedScopes, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n const deny = (diagnostic: WebviewCapabilityDiagnostic) => {\n emit(diagnostic);\n return new Error(diagnostic.message);\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method)) throw deny(unsupportedCapability(request.method));\n\n if (isScopedCapability(request.method)) {\n const scope = requestScope(request);\n if (!scope) throw deny(unsupportedCapability(request.method));\n // The denial names the exact declaration the webview is missing.\n if (!allowedScopes.get(request.method)?.has(scope)) {\n throw deny(undeclaredCapability(`${request.method}:${scope}`));\n }\n } else if (!allowed.has(request.method)) {\n throw deny(undeclaredCapability(request.method));\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) throw deny(unsupportedCapability(request.method));\n\n return await handler(request.params);\n },\n };\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","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 loadedFrameRef = useRef<HTMLIFrameElement | null>(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 // second load means the runtime document is gone, even if guest initialization\n // has not finished. Remount a fresh iframe and connection. 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 (loadedFrameRef.current === iframe) setFrameEpoch((epoch) => epoch + 1);\n else loadedFrameRef.current = iframe;\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 if (iframeRef.current !== iframe) return;\n const remote = conn.remote as GuestRemote;\n remoteRef.current = remote;\n hostEventsRef.current?.bind((message) => remote.hostEvent?.(message));\n\n await remote.init({\n moduleUrl: moduleUrlAtConnect,\n styles: stylesAtConnect,\n props: propsRef.current,\n theme: resolveActiveTheme(themeRef.current),\n themeVariables: collectChakraThemeVariables(),\n extensionId: view.extensionId,\n });\n if (iframeRef.current !== iframe) return;\n initializedRef.current = true;\n setRuntimeError(null);\n onReadyRef.current?.();\n })\n .catch((error) => {\n if (iframeRef.current !== iframe) return;\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 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 { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport type { HostEventPublisher } from \"pstdio-extensions/bridge/host\";\nimport type {\n NavigationTarget,\n PreferenceScopeRef,\n PreferenceValue,\n WorkbenchCore,\n WorkbenchPanelInstance,\n} from \"../../core\";\nimport { createTerminalSessionCapability } from \"./terminal-session-capability\";\n\ninterface CreateWorkbenchWebviewHostCapabilitiesInput {\n dispatchKeyboardEvent?: (event: KeyboardEventInit) => void;\n workbench: WorkbenchCore;\n placement?: WorkbenchPanelInstance;\n /** Event channel into the guest; terminal.session is only offered when present. */\n hostEvents?: HostEventPublisher;\n}\n\nconst dispatchDocumentKeyboardEvent = (params: KeyboardEventInit) => {\n if (typeof document === \"undefined\") return;\n const event = new KeyboardEvent(\"keydown\", { ...params, bubbles: true, cancelable: true });\n document.dispatchEvent(event);\n};\n\nexport const createWorkbenchWebviewHostCapabilities = (input: CreateWorkbenchWebviewHostCapabilitiesInput) =>\n ({\n ...(input.placement?.placementIdentity\n ? {\n \"placement.close\": (params: unknown) => {\n if (\n params !== undefined &&\n (typeof params !== \"object\" || params === null || Array.isArray(params) || Object.keys(params).length > 0)\n ) {\n throw new Error(\"placement.close takes no parameters; the host supplies the calling placement.\");\n }\n input.workbench.closePlacement(input.placement!.placementIdentity!);\n },\n }\n : {}),\n \"commands.execute\": (params: unknown) => {\n const request = params as { commandId: string; params?: unknown };\n return input.workbench.commands.executeCommand(request.commandId, request.params);\n },\n \"navigation.open\": (params: unknown) => {\n const request = params as { target?: NavigationTarget };\n if (!request.target) throw new Error(\"navigation.open requires a target.\");\n return input.workbench.navigation.openTarget(request.target);\n },\n \"notification.show\": (params: unknown) => {\n const notification = params as Parameters<WorkbenchCore[\"notifications\"][\"show\"]>[0];\n return input.workbench.notifications.show({\n level: notification.level,\n message: notification.message,\n title: notification.title,\n });\n },\n \"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 { 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 { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport type { NavigationTarget, NavigationTargetCommand } from \"../../core\";\n\nexport interface ToWorkbenchNavigationTargetInput {\n commandIdOf?(\n command: Extract<ExtensionNavigationTarget, { kind: \"command\" }>[\"target\"][\"command\"],\n ): string | undefined;\n commandTargetOf?(target: Extract<ExtensionNavigationTarget, { kind: \"command\" }>): NavigationTargetCommand;\n extensionId?: string;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n\nconst isContributionRef = (value: unknown, kind: string) =>\n isRecord(value) && value.kind === kind && typeof value.id === \"string\";\n\nconst isResource = (value: unknown) =>\n isRecord(value) && typeof value.type === \"string\" && typeof value.id === \"string\";\n\nconst isOpenIntent = (value: unknown) => value === undefined || value === \"preview\" || value === \"pin\";\n\nconst isPageTarget = (value: unknown, ancestors = new Set<unknown>()): boolean => {\n if (!isRecord(value) || value.kind !== \"page\" || !isContributionRef(value.page, \"page\")) return false;\n if (ancestors.has(value)) return false;\n if (value.resource !== undefined && !isResource(value.resource)) return false;\n if (value.section !== undefined && !isRecord(value.section)) return false;\n if (!isOpenIntent(value.open)) return false;\n if (value.parent === undefined) return true;\n const next = new Set(ancestors);\n next.add(value);\n return isPageTarget(value.parent, next);\n};\n\nconst isPanelTarget = (value: unknown) => {\n if (!isRecord(value) || value.kind !== \"panel\" || !isRecord(value.panel)) return false;\n const panel = value.panel;\n const validPanel =\n isContributionRef(panel, \"placement\") ||\n (panel.kind === \"page-slot\" && isContributionRef(panel.page, \"page\") && typeof panel.id === \"string\");\n return validPanel && (value.resource === undefined || isResource(value.resource)) && isOpenIntent(value.open);\n};\n\nconst isItemTarget = (value: unknown): value is Exclude<ExtensionNavigationTarget, { kind: \"compound\" }> => {\n if (!isRecord(value)) return false;\n if (value.kind === \"page\") return isPageTarget(value);\n if (value.kind === \"panel\") return isPanelTarget(value);\n if (value.kind === \"href\") return 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 if (!isRecord(value) || value.kind !== \"compound\" || !Array.isArray(value.targets) || value.targets.length === 0) {\n return false;\n }\n return value.targets.every((target) => isPageTarget(target) || isPanelTarget(target));\n};\n\nconst 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 withExtensionOwner = <Ref extends { extensionId?: string }>(ref: Ref, extensionId: string | undefined): Ref =>\n ref.extensionId !== undefined || extensionId === undefined ? ref : ({ ...ref, extensionId } as Ref);\n\nconst toPageTarget = (\n target: Extract<ExtensionNavigationTarget, { kind: \"page\" }>,\n extensionId: string | undefined,\n): Extract<ExtensionNavigationTarget, { kind: \"page\" }> => ({\n ...target,\n page: withExtensionOwner(target.page, extensionId),\n ...(target.parent ? { parent: toPageTarget(target.parent, extensionId) } : {}),\n});\n\n// The return type stays explicit: the compound branch recurses, and TypeScript\n// cannot infer the return type of a self-referencing function.\ntype NavigationOperation = Extract<ExtensionNavigationTarget, { kind: \"page\" | \"panel\" }>;\nexport function toWorkbenchNavigationTarget(\n target: NavigationOperation,\n input?: ToWorkbenchNavigationTargetInput,\n): NavigationOperation;\nexport function toWorkbenchNavigationTarget(\n target: ExtensionNavigationTarget,\n input?: ToWorkbenchNavigationTargetInput,\n): NavigationTarget;\nexport function toWorkbenchNavigationTarget(\n target: ExtensionNavigationTarget,\n input: ToWorkbenchNavigationTargetInput = {},\n): NavigationTarget {\n if (target.kind === \"command\") return toCommandTarget(target, input);\n if (target.kind === \"href\") return target;\n if (target.kind === \"page\") return toPageTarget(target, input.extensionId);\n if (target.kind === \"panel\") {\n return {\n ...target,\n panel:\n target.panel.kind === \"page-slot\"\n ? { ...target.panel, page: withExtensionOwner(target.panel.page, input.extensionId) }\n : withExtensionOwner(target.panel, input.extensionId),\n };\n }\n return {\n kind: \"compound\",\n targets: target.targets.map((item) => toWorkbenchNavigationTarget(item, input)),\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 { 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 { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef, WorkbenchCommandExecutionContext, WorkbenchModuleContext } from \"../../core\";\nimport { unwrapCommandValue } from \"./command-response\";\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}\nexport interface ExecuteWorkbenchExtensionCommandInput {\n metadata?: Record<string, unknown>;\n params?: Record<string, unknown>;\n resource?: ResourceRef;\n slot?: CommandExecuteRequest[\"slot\"];\n}\nexport const createExtensionSlot = (input: {\n context?: Record<string, unknown>;\n id: string;\n kind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\n projectId: string;\n}) => ({\n id: input.id,\n kind: input.kind,\n context: { projectId: input.projectId, ...(input.context ?? {}) },\n});\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst deletedResourceId = (value: unknown) => {\n if (!isRecord(value) || value.deleted !== true) return undefined;\n return typeof value.id === \"string\" ? value.id : undefined;\n};\nconst handleDeletedResource = async (\n context: WorkbenchExtensionCommandContext,\n resource: ResourceRef | undefined,\n value: unknown,\n) => {\n if (!resource || deletedResourceId(value) !== (resource.id ?? resourceKey(resource))) return;\n if (resourceKey(context.workbench.getPrimaryResource()) !== resourceKey(resource)) return;\n const result = context.workbench.pageLocations.navigateToParent();\n if (!result.ok) throw new Error(result.diagnostic.message);\n};\nexport const executeWorkbenchExtensionCommand = async (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n input: ExecuteWorkbenchExtensionCommandInput = {},\n) => {\n const resource = 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 { 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 { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\ninterface ResourceItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n target: NavigationTarget;\n}\ninterface ProviderQueryResult {\n items?: ResourceItem[];\n}\nconst isProviderQueryResult = (value: unknown): value is ProviderQueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst commandIdOf = (\n command: Extract<\n NavigationTarget,\n {\n kind: \"command\";\n }\n >[\"target\"][\"command\"],\n extensionId: string,\n) => `${command.extensionId ?? extensionId}.command.${command.id}`;\nconst activateTarget = async (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionCommandPaletteResourceRecord,\n item: ResourceItem,\n) => {\n const { target } = item;\n if (target.kind === \"command\") {\n await executeWorkbenchExtensionCommand(context, commandIdOf(target.target.command, record.extensionId), {\n params: target.target.params,\n });\n // A selected command may mutate extension data; refresh providers so a reopened\n // palette reflects the change without an app reload.\n context.workbench.commandPaletteResources.refresh();\n return;\n }\n await context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(target, {\n extensionId: record.extensionId,\n }),\n );\n};\nconst 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});\nexport const registerWorkbenchExtensionCommandPaletteResources = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionCommandPaletteResourceRecord[],\n) => {\n const disposables: Disposable[] = [];\n for (const record of records) {\n const groupLabel = text(record.title, record.id);\n disposables.push(\n context.workbench.commandPaletteResources.registerProvider({\n id: record.id,\n title: groupLabel,\n refreshEventIds: record.refreshEventIds,\n query: async ({ query, limit }) => {\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: activeResource,\n providerId: record.id,\n query,\n limit,\n },\n });\n if (!isProviderQueryResult(value)) return [];\n return (value.items ?? []).map((item) => toResult(context, record, groupLabel, item));\n },\n }),\n );\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { WorkbenchExtensionControlsRendererRecord } from \"pstdio-api-contracts\";\nimport { controlsQueryResultSchema } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, ResourceRef } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\nexport interface WorkbenchExtensionControlsAdapter {\n /** Supply a fallback resource when the widget placement carries none. */\n resolveResource?: (record: WorkbenchExtensionControlsRendererRecord) => ResourceRef | undefined;\n}\nconst registerControlsRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionControlsRendererRecord,\n adapter: WorkbenchExtensionControlsAdapter,\n) => {\n const slot = createExtensionSlot({\n id: record.id,\n kind: \"renderer\",\n projectId: context.projectId,\n context: { controlsRendererId: record.id },\n });\n const run = (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: resource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n slot,\n metadata: { controlsRendererId: record.id },\n })\n : Promise.resolve(undefined);\n return context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"controls\",\n emptyTitle: localize(record.emptyTitle, \"\"),\n emptyDescription: localize(record.emptyDescription, \"\"),\n defaultValues: record.defaultValues,\n executeQuery: async (resource) => {\n const value = await run(record.queryHandlerId, {}, resource ?? adapter.resolveResource?.(record));\n const result = controlsQueryResultSchema.safeParse(value);\n if (!result.success) {\n const fields = result.error.issues\n .map((issue) => `body.query.${issue.path.join(\".\")}: ${issue.message}`)\n .join(\"; \");\n throw new Error(\n `Extension \"${record.extensionId}\" view \"${record.id}\" has invalid controls. Expected serializable control declarations. ${fields}`,\n );\n }\n return result.data;\n },\n updateValue: record.valueChangeHandlerId\n ? ({ controlId, value, values, resource }) =>\n run(record.valueChangeHandlerId, { controlId, value, values }, resource).then(() => undefined)\n : undefined,\n apply: record.applyHandlerId\n ? ({ values, resource }) => run(record.applyHandlerId, { values }, resource).then(() => undefined)\n : undefined,\n reset: record.resetHandlerId\n ? ({ controlIds, resource }) => run(record.resetHandlerId, { controlIds }, resource).then(() => undefined)\n : undefined,\n },\n });\n};\n// Bridges serializable controls renderer metadata into live workbench controls renderers\n// (wiring each query/update/apply/reset command id to command execution), and registers a\n// panel widget for every panel that places one.\nexport const registerWorkbenchExtensionControlsRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionControlsRendererRecord[],\n adapter: WorkbenchExtensionControlsAdapter = {},\n): Disposable => {\n const disposables: Disposable[] = [];\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { 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 { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\n\nconst localize = (value: unknown, fallback = \"\") => text(value as Parameters<typeof text>[0], fallback);\ntype WireColumn = NonNullable<WorkbenchExtensionDataTableRendererRecord[\"columns\"]>[number];\nconst toColumn = (column: WireColumn): DataTableRendererColumn => ({\n ...column,\n label: localize(column.label, column.id),\n description: column.description ? localize(column.description) : undefined,\n icon: column.icon ? createElement(WorkbenchIcon, { name: column.icon, size: 14 }) : undefined,\n});\nconst isQueryResult = (\n value: unknown,\n): value is {\n rows: Array<{\n id: string;\n values: Record<string, unknown>;\n resource?: ResourceRef;\n }>;\n columns?: WorkbenchExtensionDataTableRendererRecord[\"columns\"];\n} =>\n Boolean(\n value &&\n typeof value === \"object\" &&\n Array.isArray(\n (\n value as {\n rows?: unknown;\n }\n ).rows,\n ),\n );\nconst toRow = (row: { id: string; values: Record<string, unknown>; resource?: ResourceRef }): DataTableRendererRow => ({\n id: row.id,\n values: row.values,\n resource: row.resource ? row.resource : undefined,\n});\nconst registerRenderer = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionDataTableRendererRecord,\n) => {\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: resource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource,\n slot,\n metadata: { dataTableRendererId: record.id },\n });\n return context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"dataTable\",\n resourceKind: record.resourceKind,\n 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.views.refreshView(record.id);\n },\n })),\n onRowActivate: record.rowActivationHandlerId\n ? async (row) => {\n const result = await run(\n record.rowActivationHandlerId!,\n { row: originalRows.get(row) ?? row },\n row.resource,\n );\n const target = toWorkbenchNavigationTargetResult(result, { extensionId: record.extensionId });\n if (target) await context.workbench.navigation.openTarget(target);\n }\n : undefined,\n },\n });\n};\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record));\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 pages: [],\n views: [],\n viewMenus: [],\n placements: [],\n resourceKinds: [],\n navigationItems: [],\n navigationTrees: [],\n statusBarItems: [],\n statuses: [],\n settingsPanels: [],\n settingsDefinitions: [],\n} satisfies WorkbenchExtensionMetadata;\n\ntype CommandContributionMetadata = Pick<\n WorkbenchExtensionMetadata,\n \"commands\" | \"commandPaletteContributions\" | \"menuContributions\"\n>;\n\nconst defaultWorkbenchExtensionCommandId = (contribution: ExtensionMenuContribution) =>\n `workbench.extension.menu.${contribution.id}`;\n\nconst defaultWorkbenchExtensionPaletteCommandId = (contribution: ExtensionCommandPaletteContribution) =>\n `workbench.extension.palette.${contribution.id}`;\n\nconst contributionOrder = (contribution: { placement?: ExtensionContributionPlacement }, index: number) =>\n placementOrder[contribution.placement ?? \"default\"] * 1000 + index;\n\nconst text: WorkbenchExtensionStringResolver = (value) => {\n if (value === undefined) return \"\";\n if (!isLocalizedString(value)) return value;\n return value.default ?? value.$l10n;\n};\n\nconst createMenuItem = (input: {\n contribution: ExtensionMenuContribution;\n commandId: string;\n index: number;\n slot: WorkbenchExtensionMenuSlotConfig;\n when?: string;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString, slot, when } = input;\n\n return {\n commandId,\n sourceCommandId: contribution.commandId,\n label: resolveString(contribution.label, contribution.extensionId),\n icon: contribution.icon,\n group: slot.group ?? contribution.group,\n args: contribution.params,\n overflowLabel: slot.overflowLabel,\n order: contributionOrder(contribution, index),\n when,\n } satisfies MenuItem;\n};\n\nconst createPaletteItem = (input: {\n contribution: ExtensionCommandPaletteContribution;\n commandId: string;\n index: number;\n resolveString: WorkbenchExtensionStringResolver;\n}) => {\n const { commandId, contribution, index, resolveString } = input;\n\n return {\n commandId,\n 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 { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n FileRendererContent,\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n ResourceRef,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { unwrapCommandValue } from \"../host/command-response\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\n\ntype FileRendererRecord = NonNullable<WorkbenchExtensionMetadata[\"fileRenderers\"]>[number];\nexport interface RegisterWorkbenchExtensionFileRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n workbench: WorkbenchModuleContext;\n}\n\nconst slotContext = (input: { projectId: string; rendererId: string; resource?: ResourceRef }) => ({\n id: input.rendererId,\n kind: \"renderer\" as const,\n context: {\n projectId: input.projectId,\n ...(input.resource ? { resourceType: input.resource.type, resourceId: input.resource.id } : {}),\n },\n});\nconst executeFileCommand = async (\n input: RegisterWorkbenchExtensionFileRenderersInput,\n rendererId: string,\n commandId: string,\n resource: ResourceRef | undefined,\n extra: Record<string, unknown> = {},\n metadata?: CommandExecuteRequest[\"metadata\"],\n) => {\n const ext = 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};\nconst revisionFromValue = (value: unknown) => {\n if (!value || typeof value !== \"object\") return undefined;\n const revision = (\n value as {\n revision?: unknown;\n }\n ).revision;\n return typeof revision === \"string\" ? revision : undefined;\n};\nexport const fileRendererRefreshEnvelopeFromCommand = (\n body: CommandExecuteRequest,\n response: CommandExecuteResponse,\n): FileRendererRefreshEnvelope | undefined => {\n const metadata = body.metadata;\n const origin = metadata?.fileRendererOrigin;\n if (!origin || typeof origin !== \"object\") return undefined;\n const candidate = origin as Partial<FileRendererRefreshOrigin>;\n if (\n typeof candidate.rendererId !== \"string\" ||\n typeof candidate.instanceId !== \"string\" ||\n typeof candidate.operationId !== \"string\"\n ) {\n return undefined;\n }\n const resourceKey = metadata?.fileRendererResourceKey;\n const revision = revisionFromValue(response.outcome.value);\n return {\n origin: {\n rendererId: candidate.rendererId,\n instanceId: candidate.instanceId,\n operationId: candidate.operationId,\n },\n ...(typeof resourceKey === \"string\" ? { resourceKey } : {}),\n ...(revision ? { revision } : {}),\n };\n};\nconst registerFileRenderer = (input: RegisterWorkbenchExtensionFileRenderersInput, record: FileRendererRecord) =>\n input.workbench.views.registerView({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"file\",\n resourceKind: record.resourceKind,\n load: async (resource) => {\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 ...(resourceKey(resource) ? { fileRendererResourceKey: resourceKey(resource) } : {}),\n },\n );\n const revision = revisionFromValue(result);\n return revision ? { revision } : undefined;\n }\n : undefined,\n },\n });\nexport const registerWorkbenchExtensionFileRenderers = (input: RegisterWorkbenchExtensionFileRenderersInput) => {\n const disposables: Disposable[] = [];\n for (const record of input.metadata.fileRenderers ?? []) {\n disposables.push(registerFileRenderer(input, record));\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport type { EnumOptions, KanbanRendererCreateField, KanbanRendererCreateFieldType, ResourceRef } from \"../../core\";\nimport type {\n ReactAttributeDescriptor as AttributeDescriptor,\n ReactKanbanRendererContribution as KanbanRendererContribution,\n} from \"../../react/renderers/kanban/kanban-presentation\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport { createExtensionSlot, executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nexport type KanbanRendererRow = Awaited<ReturnType<KanbanRendererContribution[\"executeQuery\"]>>[number];\nexport type RowAction = NonNullable<WorkbenchExtensionKanbanRendererRecord[\"rowActions\"]>[number];\nexport type QueryResult = {\n attributes?: WorkbenchExtensionKanbanRendererRecord[\"attributes\"];\n boardColumnConfigs?: Record<string, WireBoardColumnConfig>;\n rows?: unknown[];\n};\nexport type Localizer = (value: unknown, fallback?: string) => string;\nexport interface MutableAttributeSource {\n source: KanbanRendererContribution[\"attributes\"];\n set(attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined): void;\n}\ntype UnknownDisplayReporter = (attributeId: string, kind: string) => void;\nexport type ResolveStatusOptions = (\n statuses: Extract<\n NonNullable<WorkbenchExtensionKanbanRendererRecord[\"attributes\"]>[number][\"type\"],\n {\n kind: \"status\";\n }\n >[\"statuses\"],\n) => EnumOptions;\nexport const isQueryResult = (value: unknown): value is QueryResult =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst localizeAttributes = (\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n resolveStatusOptions: ResolveStatusOptions,\n reportUnknownDisplay?: UnknownDisplayReporter,\n): AttributeDescriptor[] =>\n (attributes ?? []).map((attribute) => {\n const display = attribute.display;\n const knownDisplay =\n display?.kind === \"badge-list\" && typeof display.itemsAttributeId === \"string\"\n ? { kind: \"badge-list\" as const, itemsAttributeId: display.itemsAttributeId }\n : undefined;\n if (display && !knownDisplay) reportUnknownDisplay?.(attribute.id, display.kind);\n const 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 display: knownDisplay,\n };\n return decorate(record, base);\n });\nexport const createMutableAttributeSource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n initial: WorkbenchExtensionKanbanRendererRecord[\"attributes\"] | undefined,\n localize: Localizer,\n decorate: (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => AttributeDescriptor,\n resolveStatusOptions: ResolveStatusOptions = () => [],\n reportUnknownDisplay?: UnknownDisplayReporter,\n): MutableAttributeSource => {\n let snapshot = localizeAttributes(record, initial, localize, decorate, resolveStatusOptions, reportUnknownDisplay);\n const listeners = new Set<() => void>();\n 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, reportUnknownDisplay);\n for (const listener of listeners) listener();\n },\n };\n};\nconst isExtensionResource = (resource: unknown): resource is ResourceRef =>\n Boolean(\n resource &&\n typeof resource === \"object\" &&\n typeof (\n resource as {\n type?: unknown;\n }\n ).type === \"string\" &&\n typeof (\n resource as {\n id?: unknown;\n }\n ).id === \"string\",\n );\nexport const defaultResolveRowResource = (_: WorkbenchExtensionKanbanRendererRecord, row: KanbanRendererRow) => {\n const { resource } = row;\n if (isExtensionResource(resource)) return resource;\n return undefined;\n};\nexport const defaultResolveRowActionResource = (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n) => {\n const fromRow = defaultResolveRowResource(record, row);\n if (fromRow) return fromRow;\n if (!record.resourceKind) return undefined;\n return {\n type: record.resourceKind,\n id: row.id,\n label: row.title,\n };\n};\nexport const toWorkbenchRow = (row: unknown, resolveResource: (row: KanbanRendererRow) => ResourceRef | undefined) => {\n const candidate = row as KanbanRendererRow;\n const resource = resolveResource(candidate);\n return resource === undefined ? candidate : ({ ...candidate, resource } as KanbanRendererRow);\n};\nexport const mergeParams = (...items: Array<Record<string, unknown> | undefined>) =>\n Object.assign({}, ...items.filter((item): item is Record<string, unknown> => Boolean(item)));\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\nconst hasCommandParameters = (params: Record<string, unknown> | undefined) => Object.keys(params ?? {}).length > 0;\nconst CREATE_FIELD_TYPES: ReadonlySet<string> = new Set<KanbanRendererCreateFieldType>([\n \"text\",\n \"longtext\",\n \"markdown\",\n \"number\",\n \"boolean\",\n \"select\",\n \"multi-select\",\n \"files\",\n]);\nconst toCreateField = (\n id: string,\n descriptor: NonNullable<NonNullable<WorkbenchExtensionKanbanRendererRecord[\"createRow\"]>[\"params\"]>[string],\n localize: Localizer,\n): KanbanRendererCreateField | undefined => {\n if (!CREATE_FIELD_TYPES.has(descriptor.type)) return undefined;\n const options =\n \"options\" in descriptor && Array.isArray(descriptor.options)\n ? (descriptor.options as Array<{\n value: string;\n label: string;\n icon?: string;\n }>)\n : [];\n const optional = descriptor as {\n placeholder?: unknown;\n multiple?: unknown;\n accept?: unknown;\n };\n return {\n id,\n label: localize(descriptor.label, id),\n description: descriptor.description === undefined ? undefined : localize(descriptor.description),\n placeholder: optional.placeholder === undefined ? undefined : localize(optional.placeholder),\n type: descriptor.type as KanbanRendererCreateFieldType,\n required: descriptor.required === true,\n defaultValue: descriptor.defaultValue,\n options:\n descriptor.type === \"select\" || descriptor.type === \"multi-select\"\n ? options.map((option) => ({\n value: option.value,\n label: localize(option.label, option.value),\n icon: option.icon,\n }))\n : undefined,\n multiple: descriptor.type === \"files\" ? optional.multiple !== false : undefined,\n accept: descriptor.type === \"files\" && typeof optional.accept === \"string\" ? optional.accept : undefined,\n };\n};\nexport const toCreateFields = (record: WorkbenchExtensionKanbanRendererRecord, localize: Localizer) =>\n Object.entries(record.createRow?.params ?? {}).flatMap(([id, descriptor]) => {\n const field = toCreateField(id, descriptor, localize);\n return field ? [field] : [];\n });\nconst createKanbanRendererSlot = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n) =>\n createExtensionSlot({\n id: record.id,\n kind: \"kanbanRenderer\",\n projectId: context.projectId,\n context: { kanbanRendererId: record.id },\n });\nexport const executeKanbanRendererCommand = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n resource?: ResourceRef,\n) => {\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: commandResource } : {}),\n invocation: { placement: \"visible\" },\n },\n ...params,\n },\n resource: commandResource,\n slot: createKanbanRendererSlot(context, record),\n metadata: { kanbanRendererId: record.id },\n });\n};\nconst kanbanRendererRowActionCommandId = (record: WorkbenchExtensionKanbanRendererRecord, action: RowAction) =>\n `workbench.extension.kanbanRenderer.${record.id}.rowAction.${action.id}`;\nexport const registerRowActionCommands = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n localize: Localizer,\n) =>\n (record.rowActions ?? []).map((action) => {\n const target = context.workbench.commands.getCommand(action.commandId)?.command;\n return context.workbench.commands.registerCommand(\n {\n id: kanbanRendererRowActionCommandId(record, action),\n label: localize(action.label, action.id),\n icon: action.icon,\n params: target?.params,\n },\n {\n execute: (args, executionContext) =>\n executeKanbanRendererCommand(\n context,\n record,\n action.commandId,\n mergeParams(asParams(args)),\n executionContext?.resource,\n ),\n },\n );\n });\nexport const runDefaultRowAction = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n action: RowAction,\n row: KanbanRendererRow,\n resource: ResourceRef | undefined,\n localize: Localizer,\n) => {\n const commandId = kanbanRendererRowActionCommandId(record, action);\n const command = context.workbench.commands.getCommand(commandId);\n const args = { rowId: row.id };\n const executionContext = resource ? { resource } : undefined;\n const label = localize(action.label, action.id);\n if (command && hasCommandParameters(command.command.params)) {\n context.workbench.commandPalette.requestParams({ record: command, label, args, context: executionContext });\n return Promise.resolve();\n }\n if (command)\n return context.workbench.commands.executeCommand(command.command.id, args, executionContext).then(() => undefined);\n return executeKanbanRendererCommand(context, record, action.commandId, args, resource).then(() => undefined);\n};\n","import type { KanbanRendererBoardColumnConfig as WireBoardColumnConfig } from \"@pstdio/sdk/extensions\";\nimport { renderBadgeListDisplay } from \"@pstdio/ui/kanban-renderer\";\nimport type { WorkbenchExtensionKanbanRendererRecord } from \"pstdio-api-contracts\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type { Disposable, KanbanRendererCreateSubmission, KanbanRendererQueryState, ResourceRef } from \"../../core\";\nimport { WorkbenchIcon } from \"../../react\";\nimport type {\n ReactAttributeDescriptor as AttributeDescriptor,\n ReactKanbanRendererContribution as KanbanRendererContribution,\n} from \"../../react/renderers/kanban/kanban-presentation\";\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 ResolveStatusOptions,\n type RowAction,\n registerRowActionCommands,\n runDefaultRowAction,\n toCreateFields,\n toWorkbenchRow,\n} from \"./kanban-renderer-contribution-helpers\";\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 * Handle a row click when the renderer has no declared activation handler.\n */\n onRowClick?: (input: {\n record: WorkbenchExtensionKanbanRendererRecord;\n row: KanbanRendererRow;\n resource: ResourceRef | undefined;\n }) => void;\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.views.refreshView(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 statusColorConfig = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n attributes: WorkbenchExtensionKanbanRendererRecord[\"attributes\"],\n groupingAttributeId: string | undefined,\n groupKey: string,\n): WireBoardColumnConfig | undefined => {\n const attribute = attributes?.find((candidate) => candidate.id === groupingAttributeId);\n if (attribute?.type.kind !== \"status\") return undefined;\n const id = statusSetId(record, attribute.type.statuses);\n const status = context.workbench.statuses.getStatuses(id)?.find((candidate) => candidate.id === groupKey);\n return status ? { color: status.color } : undefined;\n};\n\nconst initialColumnGrouping = (record: WorkbenchExtensionKanbanRendererRecord) => {\n if (record.defaultSettings?.columnGrouping) return record.defaultSettings.columnGrouping;\n const statusAttributes = record.attributes?.filter((attribute) => attribute.type.kind === \"status\") ?? [];\n return statusAttributes.length === 1 ? statusAttributes[0]?.id : 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, { extensionId: record.extensionId });\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 activateCreatedRow: ((row: KanbanRendererRow) => Promise<void> | void) | undefined,\n) => {\n const contribution = record.createRow;\n if (!contribution) return undefined;\n return async (submission: KanbanRendererCreateSubmission) => {\n const params = mergeParams(\n submission.values,\n contribution.columnParam ? { [contribution.columnParam]: submission.columnId } : undefined,\n contribution.attributesParam ? { [contribution.attributesParam]: submission.attributeValues } : undefined,\n );\n const created = await runMutation(record, contribution.commandId, params);\n await adapter.onAfterCreate?.({ record, created, submission });\n if (!activateCreatedRow || typeof created !== \"object\" || created === null) return;\n const row = created as Partial<KanbanRendererRow>;\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") return;\n await activateCreatedRow({ ...row, id: row.id, title: row.title, attributes: row.attributes ?? {} });\n };\n};\n\nconst toRowContextMenuActions = (\n context: WorkbenchExtensionCommandContext,\n record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n localize: Localizer,\n resolveRowActionResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\n) => {\n const actions = record.rowActions;\n if (!actions?.length) return undefined;\n return (row: KanbanRendererRow) =>\n actions.map((action) => {\n const resource = resolveRowActionResource(record, row);\n const runDefault = () => runDefaultRowAction(context, record, action, row, resource, localize);\n return {\n key: action.id,\n label: localize(action.label, action.id),\n commandId: action.commandId,\n icon: createRowActionIcon(action.icon),\n onClick: () =>\n adapter.executeRowAction\n ? adapter.executeRowAction({ record, action, row, resource, runDefault })\n : runDefault(),\n };\n });\n};\n\nexport const registerWorkbenchExtensionKanbanRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: readonly WorkbenchExtensionKanbanRendererRecord[],\n adapter: WorkbenchExtensionKanbanRendererAdapter = {},\n) => {\n const disposables: Disposable[] = [];\n const localize: Localizer =\n adapter.resolveLabel ?? ((value, fallback) => text(value as Parameters<typeof text>[0], fallback));\n const decorate = (record: WorkbenchExtensionKanbanRendererRecord, attribute: AttributeDescriptor) => {\n const withBuiltInDisplay =\n attribute.display?.kind === \"badge-list\"\n ? {\n ...attribute,\n render: (value: unknown, row: KanbanRendererRow) => renderBadgeListDisplay(attribute, value, row),\n }\n : attribute;\n return adapter.decorateAttribute?.(record, withBuiltInDisplay) ?? withBuiltInDisplay;\n };\n const resolveRowResource = adapter.resolveRowResource ?? defaultResolveRowResource;\n const resolveRowActionResource = adapter.resolveRowActionResource ?? defaultResolveRowActionResource;\n const afterMutation = adapter.onAfterMutation ?? (() => {});\n\n const runMutation = (\n record: WorkbenchExtensionKanbanRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n ) =>\n executeKanbanRendererCommand(context, record, commandId, params).then((result) => {\n afterMutation(record);\n return result;\n });\n\n for (const record of records) {\n const resolveStatusOptions = createStatusOptionsResolver(context, record);\n const reportUnknownDisplay = (attributeId: string, kind: string) =>\n context.workbench.notifications.show({\n id: `workbench.extension.${record.extensionId}.kanban.${record.id}.display.${attributeId}`,\n level: \"error\",\n title: \"Extension display is not available\",\n message: `Attribute \"${attributeId}\" in renderer \"${record.id}\" uses unknown display kind \"${kind}\".`,\n });\n const attributes = createMutableAttributeSource(\n record,\n record.attributes,\n localize,\n decorate,\n resolveStatusOptions,\n reportUnknownDisplay,\n );\n let wireAttributes = record.attributes;\n let columnGrouping = initialColumnGrouping(record);\n const originalRows = new WeakMap<KanbanRendererRow, KanbanRendererRow>();\n let columnConfigs: ColumnConfigRecord | undefined;\n let latestQueryId = 0;\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, row);\n const toActivatedRow = (row: KanbanRendererRow) => originalRows.get(row) ?? row;\n const onRowActivate = toRowClick(context, record, adapter, resolveRowResource, toActivatedRow);\n\n disposables.push(...registerRowActionCommands(context, record, localize));\n disposables.push(\n context.workbench.views.registerView({\n id: record.id,\n title: localize(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"kanban\",\n resourceKind: record.resourceKind,\n 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] ?? statusColorConfig(context, record, wireAttributes, columnGrouping, groupKey),\n localize,\n ),\n onRowActivate,\n executeQuery: async (state: KanbanRendererQueryState) => {\n latestQueryId += 1;\n const queryId = latestQueryId;\n const value = await executeKanbanRendererCommand(context, record, record.queryHandlerId, {\n settings: state.settings,\n filters: state.filters,\n });\n const mapRows = (rows: unknown[]) =>\n rows.map((row) => {\n const mapped = toWorkbenchRow(row, rowResource);\n originalRows.set(mapped, row as KanbanRendererRow);\n return mapped;\n });\n if (queryId !== latestQueryId) {\n if (Array.isArray(value)) return mapRows(value);\n return isQueryResult(value) ? mapRows(value.rows ?? []) : [];\n }\n\n columnGrouping = state.settings.columnGrouping;\n if (Array.isArray(value)) return mapRows(value);\n if (!isQueryResult(value)) return [];\n const nextAttributes = value.attributes ?? wireAttributes;\n wireAttributes = nextAttributes;\n attributes.set(nextAttributes);\n columnConfigs = value.boardColumnConfigs;\n return mapRows(value.rows ?? []);\n },\n onAttributeChange: record.attributeChangeHandlerId\n ? (rowId, attributeId, value) =>\n runMutation(record, record.attributeChangeHandlerId!, {\n rowId,\n attributeId,\n value,\n }).then(() => undefined)\n : undefined,\n onReorder: record.reorderHandlerId\n ? (rowId, beforeRowId) =>\n runMutation(record, record.reorderHandlerId!, { rowId, beforeRowId }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(\n record,\n adapter,\n runMutation,\n record.rowActivationHandlerId ? onRowActivate : undefined,\n ),\n onColumnAction: record.columnActionHandlerId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionHandlerId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(\n context,\n record,\n adapter,\n localize,\n resolveRowActionResource,\n ),\n },\n }),\n );\n }\n\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { 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 = (\n metadata: WorkbenchExtensionMetadata,\n record: ExtensionTreeRendererRecord,\n): ExtensionTreeViewRecord[] =>\n metadata.panels\n .flatMap((panel) => [panel, ...(panel.panelMenus ?? [])])\n .filter((panel) => panel.renderer?.kind === \"tree\" && panel.renderer.id === record.id);\n\nconst resolveTreeView = (panels: ExtensionTreeViewRecord[], ctx: TreeContext) => {\n if (ctx.viewId) return panels.find((panel) => panel.id === ctx.viewId);\n return panels.length === 1 ? panels[0] : undefined;\n};\n\nexport const resolveHostTreeHeaderNodes = async (input: ResolveHostTreeHeaderInput) => {\n const { ctx, getHostTreeHeaderNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeHeader\" in panel) || panel.hostTreeHeader !== \"default\") return [];\n return (await getHostTreeHeaderNodes?.({ ctx, record, panel })) ?? [];\n};\n\nexport const resolveHostTreeFooterNodes = async (input: ResolveHostTreeFooterInput) => {\n const { ctx, getHostTreeFooterNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeFooter\" in panel) || panel.hostTreeFooter !== \"default\") return [];\n return (await getHostTreeFooterNodes?.({ ctx, record, panel })) ?? [];\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport { 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 { unwrapCommandValue } from \"../host/command-response\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport type { InternalWorkbenchExtensionMetadata as WorkbenchExtensionMetadata } from \"../host/internal-workbench-extension-metadata\";\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\";\nexport interface RegisterWorkbenchExtensionTreeRenderersInput {\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n getHostTreeFooterNodes?: HostTreeDefaultNodesResolver;\n getHostTreeHeaderNodes?: HostTreeDefaultNodesResolver;\n metadata: WorkbenchExtensionMetadata;\n projectId: string;\n /**\n * Host canonicalization for node resources. A host that gives extension\n * resources its own URIs (layout scopes, history, and hierarchy key on the\n * URI) must convert tree node resources the same way, or the same resource\n * gets a second identity when opened from a tree.\n */\n resolveNodeResource?: (resource: ExtensionTreeResource) => ResourceRef;\n workbench: WorkbenchModuleContext;\n}\nconst 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});\nconst createQueryParams = (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n ctx: TreeContext,\n node?: ExtensionTreeNode,\n) => {\n const resource = ctx.resource;\n const modeId = input.workbench.modes.getActiveModeId();\n return {\n renderer: {\n rendererId: record.id,\n projectId: input.projectId,\n ...(modeId ? { modeId } : {}),\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n state: ctx.state,\n ...(ctx.filter ? { filter: ctx.filter } : {}),\n ...(node ? { node } : {}),\n };\n};\nconst executeCallback = async (\n input: RegisterWorkbenchExtensionTreeRenderersInput,\n record: ExtensionTreeRendererRecord,\n commandId: string,\n params: Record<string, unknown>,\n) => {\n const renderer = params.renderer as\n | {\n modeId?: string;\n resource?: ExtensionTreeResource;\n }\n | 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};\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};\nconst toActionParams = (params: unknown, fallback: Record<string, unknown> | undefined) => {\n if (params && typeof params === \"object\" && !Array.isArray(params)) return params as Record<string, unknown>;\n return fallback;\n};\nconst toRecordParams = (params: object | undefined) =>\n params && !Array.isArray(params) ? (params as Record<string, unknown>) : undefined;\nconst createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\n const resolveResource: (resource: ExtensionTreeResource) => ResourceRef = (resource) => {\n const resolved = input.resolveNodeResource?.(resource);\n return resolved ?? resource;\n };\n const mapEmptyState = (section: ExtensionTreeSection): TreeViewSection[\"emptyState\"] => {\n if (!section.emptyState) return undefined;\n return {\n title: text(section.emptyState.title),\n description: text(section.emptyState.description),\n icon: section.emptyState.icon,\n };\n };\n const mapTarget = (\n target: ExtensionTreeTarget | undefined,\n node: ExtensionTreeNode,\n ctx: TreeContext,\n ): NavigationTarget | undefined => {\n if (!target) return undefined;\n const commandTargetOf = (\n commandTarget: Extract<\n ExtensionTreeTarget,\n {\n kind: \"command\";\n }\n >,\n ) => ({\n kind: \"command\" as const,\n commandId: runnerCommandId,\n args: {\n commandId: `${commandTarget.target.command.extensionId ?? record.extensionId}.command.${commandTarget.target.command.id}`,\n nodeId: node.id,\n params: commandTarget.target.params,\n resource: node.resource ?? ctx.resource,\n treeId: record.id,\n } satisfies TargetCommandArgs,\n });\n return toWorkbenchNavigationTarget(target, {\n commandTargetOf,\n extensionId: record.extensionId,\n });\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 ?? ctx.resource,\n );\n ctx.refresh();\n }\n : undefined,\n };\n };\n const mapNode = (node: ExtensionTreeNode, ctx: TreeContext): TreeNode => {\n const mapped: TreeNode = {\n id: node.id,\n selected: node.selected,\n label: text(node.label),\n icon: node.icon,\n iconColor: node.iconColor,\n 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 const mapSections = (sections: ExtensionTreeSection[], ctx: TreeContext): TreeViewSection[] =>\n sections.map((section) => ({\n id: section.id,\n label: text(section.label),\n actions: section.actions?.map((action) => mapAction(action, undefined, ctx)),\n collapsible: section.collapsible,\n emptyState: mapEmptyState(section),\n nodes: section.nodes.map((node) => mapNode(node, ctx)),\n hiddenByDefault: section.hiddenByDefault,\n canHide: section.canHide,\n }));\n const mapNodes = (nodes: ExtensionTreeNode[], ctx: TreeContext): TreeNode[] =>\n nodes.map((node) => mapNode(node, ctx));\n return { mapNodes, mapSections, originalNodes, runnerCommandId };\n};\nconst isTreeSectionArray = (value: unknown): value is ExtensionTreeSection[] =>\n Array.isArray(value) && value.every((section) => section && typeof section === \"object\" && \"nodes\" in section);\nconst isTreeNodeArray = (value: unknown): value is ExtensionTreeNode[] =>\n Array.isArray(value) && value.every((node) => node && typeof node === \"object\" && \"id\" in node);\nconst hostNodeSection = (id: string, nodes: TreeNode[]): TreeViewSection[] =>\n nodes.length > 0 ? [{ id, nodes, canReorder: false }] : [];\nconst registerTree = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const mapper = createTreeMapper(input, record);\n const treeViews = treeViewsFor(input.metadata, record);\n const commandDisposable = input.workbench.commands.registerCommand(\n { id: mapper.runnerCommandId, label: `${text(record.title, record.id)} tree command` },\n {\n execute: async (rawArgs) => {\n const args = rawArgs as TargetCommandArgs;\n const result = await executeTreeActionCommand(input, record, args.commandId, args.params, args.resource);\n for (const view of input.workbench.views.listViews()) {\n if (view.body.kind === \"file\") input.workbench.views.refreshView(view.id);\n }\n return result;\n },\n },\n );\n const treeDisposable = input.workbench.views.registerView({\n id: record.id,\n title: text(record.title, record.id),\n icon: record.icon,\n body: {\n kind: \"tree\",\n searchable: record.searchable,\n searchPlaceholder: text(record.searchPlaceholder, \"Search files\"),\n defaultExpandedNodeIds: record.defaultExpandedNodeIds,\n defaultExpandedSectionIds: record.defaultExpandedSectionIds,\n getHeader: async (ctx) => {\n const hostHeader = await resolveHostTreeHeaderNodes({\n ctx,\n getHostTreeHeaderNodes: input.getHostTreeHeaderNodes,\n record,\n treeViews,\n });\n if (!record.headerHandlerId) return hostNodeSection(`${record.id}:host-header`, hostHeader);\n const result = await executeCallback(\n input,\n record,\n record.headerHandlerId,\n createQueryParams(input, record, ctx),\n );\n const extensionHeader = isTreeSectionArray(result) ? mapper.mapSections(result, ctx) : [];\n return [...hostNodeSection(`${record.id}:host-header`, hostHeader), ...extensionHeader];\n },\n getBody: async (ctx) => {\n const result = await executeCallback(\n input,\n record,\n record.bodyHandlerId,\n createQueryParams(input, record, ctx),\n );\n if (!isTreeSectionArray(result)) return [];\n return mapper.mapSections(result, ctx);\n },\n getFooter: async (ctx) => {\n const hostFooter = await resolveHostTreeFooterNodes({\n ctx,\n getHostTreeFooterNodes: input.getHostTreeFooterNodes,\n record,\n treeViews,\n });\n if (!record.footerHandlerId) return hostNodeSection(`${record.id}:host-footer`, hostFooter);\n const result = await executeCallback(\n input,\n record,\n record.footerHandlerId,\n createQueryParams(input, record, ctx),\n );\n const extensionFooter = isTreeSectionArray(result) ? mapper.mapSections(result, ctx) : [];\n return [...extensionFooter, ...hostNodeSection(`${record.id}:host-footer`, hostFooter)];\n },\n getChildren: async (node, ctx) => {\n if (!record.childrenHandlerId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node);\n if (!originalNode) return node.children ?? [];\n const result = await executeCallback(\n input,\n record,\n record.childrenHandlerId,\n createQueryParams(input, record, ctx, originalNode),\n );\n return isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n },\n },\n });\n return {\n dispose() {\n treeDisposable.dispose();\n commandDisposable.dispose();\n },\n };\n};\nexport const registerWorkbenchExtensionTreeRenderers = (input: RegisterWorkbenchExtensionTreeRenderersInput) => {\n const disposables: Disposable[] = [];\n for (const record of input.metadata.treeRenderers ?? []) {\n disposables.push(registerTree(input, record));\n }\n return {\n dispose() {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { 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 { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type {\n Disposable,\n NavigationTreeOwner,\n NavigationTreeSlot,\n TreeNode,\n TreeViewSection,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport { metadataRefId } from \"../host/workbench-extension-metadata-ref\";\n\ntype NavigationItem = WorkbenchExtensionMetadata[\"navigationItems\"][number];\ntype NavigationTree = WorkbenchExtensionMetadata[\"navigationTrees\"][number];\n\nexport interface RegisterWorkbenchExtensionNavigationItemsInput {\n createWhenExpression?: (when: NavigationItem[\"when\"]) => string | undefined;\n metadata: Pick<WorkbenchExtensionMetadata, \"navigationItems\" | \"navigationTrees\">;\n workbench: WorkbenchModuleContext;\n}\n\nconst toOwner = (ref: NavigationItem[\"owner\"] | NavigationTree[\"owner\"]): NavigationTreeOwner => ({\n kind: ref.kind,\n id: metadataRefId(ref),\n extensionId: ref.extensionId,\n});\n\nconst isVisible = (\n workbench: WorkbenchModuleContext,\n item: NavigationItem,\n createWhenExpression: RegisterWorkbenchExtensionNavigationItemsInput[\"createWhenExpression\"],\n) => {\n const expression = createWhenExpression?.(item.when);\n if (!expression) return true;\n return workbench.context.matches(expression);\n};\n\nconst toNode = (item: NavigationItem): TreeNode => ({\n id: item.id,\n label: text(item.label, item.id),\n icon: item.icon,\n canHide: true,\n canReorder: true,\n target: toWorkbenchNavigationTarget(item.action as ExtensionNavigationTarget, { extensionId: item.extensionId }),\n});\n\nconst toSections = (\n workbench: WorkbenchModuleContext,\n items: NavigationItem[],\n createWhenExpression: RegisterWorkbenchExtensionNavigationItemsInput[\"createWhenExpression\"],\n) => {\n const sections = new Map<string, TreeViewSection>();\n for (const item of items) {\n if (!isVisible(workbench, item, createWhenExpression)) continue;\n const label = item.group || undefined;\n const id = label ? `${item.extensionId}:${label}` : \"navigation.root\";\n const section = sections.get(id) ?? {\n id,\n label,\n collapsible: Boolean(label),\n canHide: true,\n canReorder: true,\n nodes: [],\n };\n section.nodes.push(toNode(item));\n sections.set(id, section);\n }\n return [...sections.values()];\n};\n\nconst groupItems = (items: NavigationItem[]) => {\n const groups = new Map<string, NavigationItem[]>();\n for (const item of items) {\n const owner = toOwner(item.owner);\n const key = `${item.extensionId}:${owner.kind}:${owner.id}:${item.slot}`;\n groups.set(key, [...(groups.get(key) ?? []), item]);\n }\n return [...groups.values()];\n};\n\nconst defaultExpandedGroupIds = (items: NavigationItem[]) => [\n ...new Set(items.flatMap((item) => (item.group ? [`${item.extensionId}:${item.group}`] : []))),\n];\n\nconst registerItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n groupItems(input.metadata.navigationItems).map((items) => {\n const first = items[0]!;\n return input.workbench.navigationTrees.registerContribution({\n id: `${first.extensionId}.navigation-items.${first.owner.kind}.${metadataRefId(first.owner)}.${first.slot}`,\n owner: toOwner(first.owner),\n sourceExtensionId: first.extensionId,\n declarationIndex: input.metadata.navigationItems.indexOf(first),\n slot: first.slot,\n defaultExpandedSectionIds: defaultExpandedGroupIds(items),\n getSections: () => toSections(input.workbench, items, input.createWhenExpression),\n });\n });\n\nconst registerTrees = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n input.metadata.navigationTrees.map((tree, declarationIndex) => {\n const viewId = metadataRefId(tree.view);\n return input.workbench.navigationTrees.registerContribution({\n id: tree.id,\n idScope: tree.id,\n owner: toOwner(tree.owner),\n sourceExtensionId: tree.extensionId,\n declarationIndex: input.metadata.navigationItems.length + declarationIndex,\n slot: tree.slot as NavigationTreeSlot,\n viewId,\n });\n });\n\nexport const registerWorkbenchExtensionNavigationItems = (input: RegisterWorkbenchExtensionNavigationItemsInput) =>\n [...registerItems(input), ...registerTrees(input)] satisfies Disposable[];\n","import type { NavigationTarget as ExtensionNavigationTarget } from \"@pstdio/sdk/extensions\";\nimport type { ExtensionKeybindingRecord } from \"pstdio-api-contracts\";\nimport type { WorkbenchModuleContext } from \"../../core\";\nimport { toWorkbenchNavigationTarget } from \"./extension-navigation-target\";\nimport { metadataCommandId } from \"./workbench-extension-metadata-ref\";\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 action: toWorkbenchNavigationTarget(binding.action as ExtensionNavigationTarget, {\n commandIdOf: (command) =>\n command.extensionId ? metadataCommandId({ extensionId: command.extensionId, id: command.id }) : undefined,\n }),\n keybinding: resolveExtensionKeybindingChord(binding),\n when: input.createWhenExpression?.(binding.when),\n }),\n );\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport type { WorkbenchPageMain, WorkbenchPageSlot } from \"../../core\";\nimport type { InternalWorkbenchExtensionMetadata } from \"./internal-workbench-extension-metadata\";\nimport { metadataRefId } from \"./workbench-extension-metadata-ref\";\nimport type { WorkbenchExtensionTabMetadata } from \"./workbench-extension-tab-presentation\";\n\ntype MetadataPage = WorkbenchExtensionMetadata[\"pages\"][number];\ninterface PagePresentationInput {\n extensionId: string;\n placementId: string;\n createTab?(metadata: WorkbenchExtensionTabMetadata): WorkbenchPageSlot[\"tab\"];\n}\nconst pageSlot = (slot: MetadataPage[\"slots\"][number], input: PagePresentationInput): WorkbenchPageSlot => ({\n ...slot,\n tab:\n slot.tab && input.createTab\n ? input.createTab({ ...slot.tab, extensionId: input.extensionId, placementId: input.placementId })\n : undefined,\n});\nconst pageMain = (main: MetadataPage[\"main\"], input: PagePresentationInput): WorkbenchPageMain => {\n if (main.kind === \"panels\") return main;\n return {\n ...main,\n tab:\n main.tab && input.createTab\n ? input.createTab({ ...main.tab, extensionId: input.extensionId, placementId: input.placementId })\n : undefined,\n };\n};\nexport const toInternalWorkbenchPages = (\n metadata: WorkbenchExtensionMetadata,\n createTab?: PagePresentationInput[\"createTab\"],\n): InternalWorkbenchExtensionMetadata[\"pages\"] =>\n metadata.pages.map((page) => ({\n id: page.id,\n ref: { extensionId: page.extensionId, kind: \"page\", id: page.localId },\n title: page.title,\n path: page.path,\n modeId: metadataRefId(page.mode),\n resource: page.resource,\n main: pageMain(page.main, { extensionId: page.extensionId, placementId: `${page.id}.$main`, createTab }),\n slots: page.slots.map((slot) =>\n pageSlot(slot, { extensionId: page.extensionId, placementId: `${page.id}.${slot.id}`, createTab }),\n ),\n ...(page.icon ? { icon: page.icon } : {}),\n ...(page.parent ? { parentId: metadataRefId(page.parent) } : {}),\n }));\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\";\nimport { toInternalWorkbenchPages } from \"./workbench-extension-page-metadata\";\nimport type { WorkbenchExtensionTabMetadata } from \"./workbench-extension-tab-presentation\";\n\ntype MetadataView = WorkbenchExtensionMetadata[\"views\"][number];\nconst resourceKindForView = (metadata: WorkbenchExtensionMetadata, viewId: string) => {\n const bindings = metadata.pages.flatMap((page) => [\n ...(page.main.kind === \"view\" && page.resource ? [{ ...page.resource, view: page.main.view }] : []),\n ...page.slots.flatMap((slot) => (slot.item.kind === \"binding\" ? [slot.item.binding] : [])),\n ]);\n bindings.push(\n ...metadata.placements.flatMap((placement) => (placement.item.kind === \"binding\" ? [placement.item.binding] : [])),\n );\n return bindings.find((binding) => metadataRefId(binding.view) === viewId)?.kinds[0]?.id;\n};\nconst viewBody = (view: MetadataView) =>\n view.body.kind === \"webview\" ? { webview: view.body.webview } : { renderer: { kind: view.body.kind, id: view.id } };\nconst panelMenus = (metadata: WorkbenchExtensionMetadata, owner: MetadataView) =>\n metadata.viewMenus.flatMap((menu) => {\n if (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 viewId: view.id,\n title: view.title,\n side: menu.side,\n group: menu.group,\n placement: menu.placement,\n hostTreeHeader: menu.hostTreeHeader,\n hostTreeFooter: menu.hostTreeFooter,\n ...viewBody(view),\n },\n ];\n });\nconst panels = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"panels\"] =>\n metadata.views.map((view) => {\n const menus = panelMenus(metadata, view);\n return {\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n panelMenus: menus.length > 0 ? menus : undefined,\n ...viewBody(view),\n };\n });\nconst commandActions = <\n T extends {\n command: {\n extensionId: string;\n id: string;\n };\n },\n>(\n actions: T[] | undefined,\n) => actions?.map(({ command, ...action }) => ({ ...action, commandId: metadataCommandId(command) }));\nconst kanbanRenderers = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"kanbanRenderers\"] =>\n metadata.views.flatMap((view) => {\n const body = view.body;\n if (body.kind !== \"kanban\") return [];\n return [\n {\n ...body,\n id: view.id,\n extensionId: view.extensionId,\n title: view.title,\n icon: view.icon,\n resourceKind: 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 });\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 });\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 );\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 );\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 );\nconst modes = (metadata: WorkbenchExtensionMetadata): InternalWorkbenchExtensionMetadata[\"modes\"] =>\n metadata.modes.map((mode) => ({\n id: mode.id,\n extensionId: mode.extensionId,\n modeId: mode.id,\n label: mode.label,\n icon: mode.icon,\n panelRegions: mode.regions,\n regionSettings: mode.regionSettings,\n floatingPanels: mode.floatingPanels,\n ...(mode.defaultTheme ? { defaultTheme: metadataRefId(mode.defaultTheme) } : {}),\n ...(mode.chrome\n ? {\n chrome: Object.fromEntries(\n Object.entries(mode.chrome).map(([region, view]) => [region, view === false ? false : metadataRefId(view)]),\n ),\n }\n : {}),\n }));\nexport const toInternalWorkbenchExtensionMetadata = (\n metadata: WorkbenchExtensionMetadata,\n input: {\n createTab?(\n metadata: WorkbenchExtensionTabMetadata,\n ): InternalWorkbenchExtensionMetadata[\"placements\"][number][\"tab\"];\n } = {},\n): InternalWorkbenchExtensionMetadata => {\n const adaptedPanels = panels(metadata);\n return {\n extensions: metadata.extensions,\n commands: metadata.commands,\n menuContributions: metadata.menuContributions,\n commandPaletteContributions: metadata.commandPaletteContributions,\n modes: modes(metadata),\n pages: toInternalWorkbenchPages(metadata, input.createTab),\n placements: metadata.placements.map((placement) => ({\n id: placement.id,\n ref: { extensionId: placement.extensionId, kind: \"placement\", id: placement.localId },\n modeId: metadataRefId(placement.mode),\n item: placement.item,\n region: placement.region,\n order: placement.order,\n movableTo: placement.movableTo,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n headerBorderBottom: placement.headerBorderBottom,\n tab:\n placement.tab && input.createTab\n ? input.createTab({\n ...placement.tab,\n extensionId: placement.extensionId,\n placementId: placement.id,\n })\n : undefined,\n })),\n panels: adaptedPanels,\n resourceKinds: metadata.resourceKinds.map((kind) => ({\n id: kind.id,\n extensionId: kind.extensionId,\n label: kind.label,\n icon: kind.icon,\n menuSlots: Object.fromEntries(\n (kind.menuSlots ?? []).map((slot) => [\n slot.id,\n {\n placement: slot.placement,\n label: slot.label,\n external: slot.access === \"public\",\n order: slot.order,\n },\n ]),\n ),\n })),\n resourceHierarchyProviders: (metadata.resourceHierarchyProviders ?? []).map((record) => ({\n id: record.id,\n extensionId: record.extensionId,\n resourceKind: record.resourceKind.id,\n })),\n settingsSections: metadata.settingsSections ?? [],\n settingsPanels: metadata.settingsPanels.flatMap((panel) => {\n const view = metadata.views.find((candidate) => candidate.id === metadataRefId(panel.view));\n if (!view) return [];\n return [\n {\n id: panel.id,\n viewId: view.id,\n extensionId: panel.extensionId,\n slotId: panel.slot.id,\n scope: panel.slot.id.includes(\"global\") ? (\"global\" as const) : (\"project\" as const),\n title: view.title,\n icon: view.icon,\n section: panel.section ? metadataRefId(panel.section) : undefined,\n },\n ];\n }),\n kanbanRenderers: kanbanRenderers(metadata),\n dataTableRenderers: dataTableRenderers(metadata),\n commandPaletteResources: metadata.commandPaletteResources ?? [],\n treeRenderers: treeRenderers(metadata),\n fileRenderers: fileRenderers(metadata),\n controlsRenderers: controlsRenderers(metadata),\n keybindings: metadata.keybindings ?? [],\n settingsDefinitions: metadata.settingsDefinitions ?? [],\n statuses: metadata.statuses,\n statusBarItems: metadata.statusBarItems.map((item) => ({\n id: item.id,\n extensionId: item.extensionId,\n viewId: 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 type { Disposable, FileRendererRefreshEnvelope, WorkbenchModuleContext } from \"../../core\";\n\nexport type WorkbenchExtensionRendererKind = \"tree\" | \"file\" | \"controls\" | \"dataTable\" | \"kanban\";\n\ninterface RendererRefreshTarget {\n id: string;\n kind: WorkbenchExtensionRendererKind;\n}\n\nexport interface WorkbenchExtensionRefreshEvent extends FileRendererRefreshEnvelope {\n id: string;\n}\n\nexport interface RegisterWorkbenchExtensionRendererRefreshEventsInput {\n metadata: WorkbenchExtensionMetadata;\n subscribe: (listener: (event: WorkbenchExtensionRefreshEvent) => void) => Disposable;\n workbench: WorkbenchModuleContext;\n}\n\nexport const refreshWorkbenchExtensionRenderer = (\n workbench: WorkbenchModuleContext,\n target: RendererRefreshTarget,\n envelope: FileRendererRefreshEnvelope = {},\n) => {\n workbench.views.refreshView(target.id, target.kind === \"file\" ? envelope : undefined);\n};\n\nconst rendererRefreshTargets = (metadata: WorkbenchExtensionMetadata) => {\n const targets = new Map<string, RendererRefreshTarget[]>();\n const add = (kind: WorkbenchExtensionRendererKind, renderer: { id: string; refreshEventIds?: string[] }) => {\n for (const eventId of new Set(renderer.refreshEventIds ?? [])) {\n const eventTargets = targets.get(eventId) ?? [];\n if (!eventTargets.some((target) => target.kind === kind && target.id === renderer.id)) {\n eventTargets.push({ id: renderer.id, kind });\n }\n targets.set(eventId, eventTargets);\n }\n };\n\n for (const view of metadata.views) {\n if (view.body.kind === \"webview\") continue;\n add(view.body.kind, { id: view.id, refreshEventIds: view.body.refreshEventIds });\n }\n return targets;\n};\n\nexport const registerWorkbenchExtensionRendererRefreshEvents = (\n input: RegisterWorkbenchExtensionRendererRefreshEventsInput,\n) => {\n const targets = rendererRefreshTargets(input.metadata);\n return input.subscribe((event) => {\n const { id, ...envelope } = event;\n for (const target of targets.get(id) ?? []) refreshWorkbenchExtensionRenderer(input.workbench, target, envelope);\n });\n};\n\nexport const refreshOpenWorkbenchExtensionWebviews = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n) => {\n for (const view of metadata.views) {\n if (view.body.kind !== \"webview\") continue;\n if (workbench.views.getView(view.id)) workbench.views.refreshView(view.id);\n }\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { NavigationTarget } from \"@pstdio/sdk/extensions\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport { toWorkbenchNavigationTarget } from \"../host/extension-navigation-target\";\nimport { createExtensionSlot } from \"../host/workbench-extension-command\";\nimport type { CreateBridgeWebviewHostCapabilities } from \"./bridge-webview-renderer\";\nimport { createWorkbenchWebviewHostCapabilities } from \"./webview-host-capabilities\";\n\ntype ExtensionWebviewSlotKind = NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"];\nexport interface ExtensionWebviewFileCapabilities {\n delete(params: unknown): Promise<unknown> | unknown;\n list(params: unknown): Promise<unknown> | unknown;\n upload(params: unknown): Promise<unknown> | unknown;\n}\nexport interface ExtensionWebviewArtifactCapabilities {\n read(\n params: unknown,\n context: {\n webviewId: string;\n },\n ): Promise<unknown> | unknown;\n}\ninterface CreateExtensionWebviewHostCapabilitiesInput {\n artifacts?: ExtensionWebviewArtifactCapabilities;\n executeCommand(commandId: string, body: CommandExecuteRequest): Promise<unknown> | unknown;\n extensionIdForWebview(webviewId: string): string | undefined;\n files?: ExtensionWebviewFileCapabilities;\n projectId: string;\n slotKind: ExtensionWebviewSlotKind;\n}\ntype WebviewCommandExecuteParams = {\n commandId: string;\n params?: Record<string, unknown>;\n resource?: CommandExecuteRequest[\"resource\"];\n};\nexport const createExtensionWebviewHostCapabilities =\n (input: CreateExtensionWebviewHostCapabilitiesInput): CreateBridgeWebviewHostCapabilities =>\n (context) => {\n const base = createWorkbenchWebviewHostCapabilities({\n workbench: context.workbench,\n placement: context.placement,\n hostEvents: context.hostEvents,\n });\n return {\n ...base,\n \"navigation.open\": (params) => {\n const request = params as {\n target?: NavigationTarget;\n };\n if (!request.target) throw new Error(\"navigation.open requires a target.\");\n return context.workbench.navigation.openTarget(\n toWorkbenchNavigationTarget(request.target, {\n extensionId: input.extensionIdForWebview(context.webviewId),\n }),\n );\n },\n \"commands.execute\": async (params) => {\n const request = params as WebviewCommandExecuteParams;\n const resource = request.resource ?? context.placement.resource;\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 ...(input.artifacts\n ? {\n // The image-url grant is bound to the requesting webview, so the host\n // resolves the webview id instead of trusting the guest to name one.\n \"artifacts.read\": (params: unknown) => input.artifacts!.read(params, { webviewId: context.webviewId }),\n }\n : {}),\n } satisfies HostCapabilityRegistry;\n };\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { BridgeWebviewConfig } from \"./bridge-webview-renderer\";\n\ntype WorkbenchWebview = Extract<WorkbenchExtensionMetadata[\"views\"][number][\"body\"], { kind: \"webview\" }>[\"webview\"];\n\nexport const toBridgeWebviewConfig = (webview: WorkbenchWebview): BridgeWebviewConfig => {\n const title = text(webview.title);\n return {\n title: title || undefined,\n runtimeUrl: webview.runtimeUrl,\n moduleUrl: webview.moduleUrl,\n styles: webview.styles,\n capabilities: webview.capabilities,\n };\n};\n","import type { CommandExecuteRequest } from \"@pstdio/sdk/api\";\nimport type { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport { createElement } from \"react\";\nimport type { Disposable, PreferencePropertySchema, PreferenceScope, PreferenceValue } from \"../../core\";\nimport { WorkflowStatusSettings } from \"../../react/statuses/workflow-status-settings\";\nimport {\n type CreateBridgeWebviewHostCapabilities,\n getBridgeWebviewHostEventPublisher,\n renderBridgeWebviewFrame,\n} from \"../bridge/bridge-webview-renderer\";\nimport { createExtensionWebviewHostCapabilities } from \"../bridge/webview-command-capabilities\";\nimport { toBridgeWebviewConfig } from \"../bridge/webview-contribution-config\";\nimport { executeWorkbenchExtensionCommand, type WorkbenchExtensionCommandContext } from \"./workbench-extension-command\";\nimport type { InternalRegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nconst settingsSectionIdDefault = \"extensions\";\nconst extensionSettingsOrderBase = 1_000;\nconst statusesSettingsOrder = 25;\n\nconst asPreferenceValue = (value: unknown): PreferenceValue | undefined =>\n value === undefined ? undefined : (value as PreferenceValue);\n\nconst preferenceScope = (scope: \"global\" | \"project\"): PreferenceScope => (scope === \"global\" ? \"user\" : \"project\");\n\nconst withHostCapabilityOverrides = (\n createBase: CreateBridgeWebviewHostCapabilities,\n createOverrides: CreateBridgeWebviewHostCapabilities | undefined,\n): CreateBridgeWebviewHostCapabilities => {\n if (!createOverrides) return createBase;\n return (context) =>\n ({\n ...createBase(context),\n ...createOverrides(context),\n }) satisfies HostCapabilityRegistry;\n};\n\nconst createExtensionHostCapabilities = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n slotKind: NonNullable<CommandExecuteRequest[\"slot\"]>[\"kind\"],\n) => {\n const createBase =\n input.createWebviewHostCapabilities ??\n createExtensionWebviewHostCapabilities({\n artifacts: input.webviewArtifacts,\n executeCommand: input.executeCommand,\n extensionIdForWebview: (webviewId) => input.metadata.panels.find((panel) => panel.id === webviewId)?.extensionId,\n files: input.webviewFiles,\n projectId: input.projectId,\n slotKind,\n });\n\n return withHostCapabilityOverrides(createBase, input.createWebviewHostCapabilityOverrides);\n};\n\nexport const registerWebviewPanels = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n return input.metadata.panels.flatMap((panel) => {\n if (!panel.webview) return [];\n const webview = toBridgeWebviewConfig(panel.webview);\n return [\n input.workbench.views.registerView({\n id: panel.id,\n title: text(panel.title, panel.id),\n icon: panel.icon,\n body: {\n kind: \"react\",\n render: (renderInput) => {\n const slotKind = input.metadata.settingsPanels.some(\n (settingsPanel) => settingsPanel.id === renderInput.instance.panelId && settingsPanel.viewId === panel.id,\n )\n ? \"settings\"\n : \"panel\";\n return (\n input.renderWebview?.(renderInput) ??\n renderBridgeWebviewFrame({\n context: {\n workbench: renderInput.workbench,\n webviewId: panel.id,\n placement: renderInput.instance,\n hostEvents: getBridgeWebviewHostEventPublisher(renderInput.workbench, renderInput.instance),\n },\n createHostCapabilities: createExtensionHostCapabilities(input, slotKind),\n createProps:\n input.createWebviewProps ?? (({ placement }) => ({ placement, resource: placement.resource })),\n createTheme: input.createWebviewTheme,\n ownerId: panel.extensionId,\n title: text(panel.title, panel.id),\n webview,\n })\n );\n },\n },\n }),\n ];\n });\n};\n\nconst viewMenuPlacementPriority = { first: 1_000_000, default: 0, last: -1_000_000 } as const;\n\nexport const registerViewMenus = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.panels\n .flatMap((panel) => panel.panelMenus ?? [])\n .map((menu, index) =>\n input.workbench.viewMenus.registerViewMenu({\n id: menu.id,\n ownerViewId: menu.ownerPanelId,\n viewId: menu.viewId,\n side: menu.side,\n priority: viewMenuPlacementPriority[menu.placement ?? \"default\"] - index,\n }),\n );\n\nconst statusResult = (value: unknown) => {\n if (!value || typeof value !== \"object\" || !(\"statuses\" in value) || !Array.isArray(value.statuses)) {\n throw new Error(\"Status provider returned an invalid response\");\n }\n return value.statuses;\n};\n\nexport const registerStatuses = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const records = input.metadata.statuses ?? [];\n if (records.length === 0) return [] as Disposable[];\n const settingsViewId = \"workbench.extension-statuses.settings\";\n const disposables = records.map((record, index) =>\n input.workbench.statuses.registerStatusSet(\n {\n id: record.id,\n title: text(record.title, record.id),\n actions: record.actions?.map((action) => ({\n id: action.id,\n label: text(action.label, action.id),\n icon: action.icon,\n })),\n query: async () =>\n statusResult(await executeWorkbenchExtensionCommand(context, record.queryHandlerId, { params: {} })) as never,\n save: record.saveHandlerId\n ? async (statuses) =>\n statusResult(\n await executeWorkbenchExtensionCommand(context, record.saveHandlerId!, { params: { statuses } }),\n ) as never\n : undefined,\n },\n { ownerId: record.extensionId, priority: -index },\n ),\n );\n disposables.push(\n input.workbench.views.registerView({\n id: settingsViewId,\n title: \"Statuses\",\n body: {\n kind: \"react\",\n render: () => createElement(WorkflowStatusSettings, { workbench: input.workbench }),\n },\n }),\n );\n disposables.push(\n input.workbench.settings.registerPanel({\n id: \"workbench.statuses\",\n title: \"Statuses\",\n icon: \"list-checks\",\n kind: \"view\",\n order: statusesSettingsOrder,\n section: input.settingsSectionId ?? settingsSectionIdDefault,\n scope: \"project\",\n viewId: settingsViewId,\n }),\n );\n return disposables;\n};\n\nexport const registerSettings = (input: InternalRegisterWorkbenchExtensionContributionsInput) => {\n const disposables: Disposable[] = [];\n const sectionId = input.settingsSectionId ?? settingsSectionIdDefault;\n\n if (!input.workbench.settings.getSection(sectionId)) {\n disposables.push(\n input.workbench.settings.registerSection({ id: sectionId, title: input.settingsSectionTitle ?? \"Extensions\" }),\n );\n }\n\n const sections = [...input.metadata.settingsSections].sort(\n (left, right) =>\n (left.order ?? 0) - (right.order ?? 0) ||\n left.extensionId.localeCompare(right.extensionId) ||\n left.id.localeCompare(right.id),\n );\n for (const section of sections) {\n disposables.push(\n input.workbench.settings.registerSection({\n id: section.id,\n title: text(section.title, section.id),\n order: section.order,\n scope: section.scope,\n }),\n );\n }\n\n 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: \"view\",\n order: extensionSettingsOrderBase + index,\n section: panel.section ?? sectionId,\n scope: panel.scope,\n viewId: panel.viewId,\n }),\n );\n }\n\n return disposables;\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, WorkbenchPanelTab, WorkbenchTabSnapshot } from \"../../core\";\nimport { toWorkbenchNavigationTargetResult } from \"./extension-navigation-target\";\nimport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\nimport type { WorkbenchExtensionRefreshEvent } from \"./workbench-extension-refresh\";\n\ntype MetadataPlacement = WorkbenchExtensionMetadata[\"placements\"][number];\ntype MetadataPageSlot = WorkbenchExtensionMetadata[\"pages\"][number][\"slots\"][number];\nexport type WorkbenchExtensionTabMetadata = NonNullable<MetadataPlacement[\"tab\"] | MetadataPageSlot[\"tab\"]> & {\n extensionId: string;\n placementId: string;\n};\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value && typeof value === \"object\" && !Array.isArray(value));\nconst toSnapshot = (value: unknown, extensionId: string): WorkbenchTabSnapshot => {\n if (!isRecord(value)) return {};\n const indicator = isRecord(value.indicator)\n ? {\n icon: String(value.indicator.icon ?? \"\"),\n color: typeof value.indicator.color === \"string\" ? value.indicator.color : undefined,\n label: text(value.indicator.label as Parameters<typeof text>[0]),\n }\n : undefined;\n const menu = Array.isArray(value.menu)\n ? value.menu.flatMap((candidate) => {\n if (!isRecord(candidate) || typeof candidate.id !== \"string\" || !Array.isArray(candidate.rows)) return [];\n return [\n {\n id: candidate.id,\n rows: candidate.rows.flatMap((row) => {\n if (!isRecord(row) || typeof row.id !== \"string\") return [];\n const target = toWorkbenchNavigationTargetResult(row.action, { extensionId });\n return [\n {\n id: row.id,\n label: text(row.label as Parameters<typeof text>[0], row.id),\n icon: typeof row.icon === \"string\" ? row.icon : undefined,\n iconColor: typeof row.iconColor === \"string\" ? row.iconColor : undefined,\n selected: row.selected === true,\n disabled: row.disabled === true,\n action: target ? { kind: \"navigation\" as const, target } : undefined,\n },\n ];\n }),\n },\n ];\n })\n : undefined;\n return {\n label: text(value.label as Parameters<typeof text>[0]),\n icon: typeof value.icon === \"string\" ? value.icon : undefined,\n indicator: indicator?.icon ? indicator : undefined,\n menu,\n };\n};\nexport const createWorkbenchExtensionTabPresentation = (\n input: RegisterWorkbenchExtensionContributionsInput,\n metadata: WorkbenchExtensionTabMetadata,\n): WorkbenchPanelTab => {\n const snapshots = new Map<string, WorkbenchTabSnapshot>();\n const loading = new Set<string>();\n const listeners = new Set<() => void>();\n const refreshEvents = new Set(metadata.refreshEventIds ?? []);\n const load = (instance: Parameters<WorkbenchPanelTab[\"getSnapshot\"]>[0]) => {\n if (loading.has(instance.instanceId)) return;\n loading.add(instance.instanceId);\n const resource = instance.resource\n ? {\n type: instance.resource.type,\n id: instance.resource.id ?? resourceKey(instance.resource),\n label: instance.resource.label,\n metadata: instance.resource.metadata,\n }\n : undefined;\n void Promise.resolve(\n input.executeCommand(metadata.queryHandlerId, {\n projectId: input.projectId,\n source: \"dashboard\",\n resource,\n params: {\n renderer: {\n rendererId: metadata.placementId,\n projectId: input.projectId,\n ...(resource ? { resource } : {}),\n invocation: { placement: \"visible\" },\n },\n },\n }),\n )\n .then((response) => {\n const value = isRecord(response) && isRecord(response.outcome) ? response.outcome.value : response;\n snapshots.set(instance.instanceId, toSnapshot(value, metadata.extensionId));\n for (const listener of listeners) listener();\n })\n .finally(() => loading.delete(instance.instanceId));\n };\n return {\n refreshEvents: metadata.refreshEventIds,\n getSnapshot(instance) {\n load(instance);\n return snapshots.get(instance.instanceId) ?? {};\n },\n subscribe(listener) {\n listeners.add(listener);\n const refreshSubscription = input.subscribeRefreshEvents?.((event: WorkbenchExtensionRefreshEvent) => {\n if (!refreshEvents.has(event.id)) return;\n snapshots.clear();\n listener();\n });\n const disposable: Disposable = {\n dispose() {\n listeners.delete(listener);\n refreshSubscription?.dispose();\n },\n };\n return disposable;\n },\n };\n};\n","import type { WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { matchesResourceWhen } from \"@pstdio/sdk/extensions\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, WorkbenchCommandExecutionContext } from \"../../core\";\nimport { workbenchCommandPaletteMenuPath } from \"../../core\";\nimport { registerWorkbenchExtensionCommandPaletteResources } from \"../contributions/command-palette-resource-contributions\";\nimport { registerWorkbenchExtensionControlsRenderers } from \"../contributions/controls-renderer-contributions\";\nimport { registerWorkbenchExtensionDataTableRenderers } from \"../contributions/data-table-renderer-contributions\";\nimport {\n buildWorkbenchExtensionCommandPaletteRegistrations,\n buildWorkbenchExtensionMenuRegistrations,\n} from \"../contributions/extension-contributions\";\nimport { registerWorkbenchExtensionFileRenderers } from \"../contributions/file-renderer-contributions\";\nimport { registerWorkbenchExtensionKanbanRenderers } from \"../contributions/kanban-renderer-contributions\";\nimport { registerWorkbenchExtensionNavigationItems } from \"../contributions/navigation-item-contributions\";\nimport { registerWorkbenchExtensionTreeRenderers } from \"../contributions/tree-renderer-contributions\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n type WorkbenchExtensionCommandContext,\n} from \"./workbench-extension-command\";\nimport type {\n InternalRegisterWorkbenchExtensionContributionsInput,\n RegisterWorkbenchExtensionContributionsInput,\n} from \"./workbench-extension-host-types\";\nimport { registerWorkbenchExtensionKeybindings } from \"./workbench-extension-keybindings\";\n\nexport type { RegisterWorkbenchExtensionContributionsInput } from \"./workbench-extension-host-types\";\n\nimport { toInternalWorkbenchExtensionMetadata } from \"./workbench-extension-metadata-adapter\";\nimport { registerWorkbenchExtensionRendererRefreshEvents } from \"./workbench-extension-refresh\";\nimport {\n registerSettings,\n registerStatuses,\n registerViewMenus,\n registerWebviewPanels,\n} from \"./workbench-extension-surfaces\";\nimport { createWorkbenchExtensionTabPresentation } from \"./workbench-extension-tab-presentation\";\n\nconst disposeAll = (disposables: Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) disposables[index]?.dispose();\n};\nconst asParams = (value: unknown): Record<string, unknown> | undefined =>\n value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\nconst prepareCommandArgs = (\n context: WorkbenchExtensionCommandContext,\n commandId: string,\n args: unknown,\n executionContext?: WorkbenchCommandExecutionContext,\n onArgsChange?: (args: unknown) => void,\n) => context.prepareCommandArgs?.(commandId, args, executionContext, onArgsChange) ?? args;\nconst registerCommands = (\n context: WorkbenchExtensionCommandContext,\n metadata: Pick<WorkbenchExtensionMetadata, \"commands\">,\n) =>\n metadata.commands.map((command) =>\n context.workbench.commands.registerCommand(\n {\n id: command.id,\n label: text(command.title, command.id),\n description: text(command.description),\n params: 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 );\nconst menuCommandResource = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n executionContext: WorkbenchCommandExecutionContext | undefined,\n) => executionContext?.resource ?? input.workbench.getPrimaryResource();\nconst registerMenus = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n if (!input.menuSlotsById) return [] as Disposable[];\n const { registrations } = buildWorkbenchExtensionMenuRegistrations({\n metadata: input.metadata,\n menuSlotsById: input.menuSlotsById,\n menuTargetsById: input.menuTargetsById,\n createWhenExpression: input.createMenuWhenExpression,\n });\n const defaultRegistrations = registrations.map(({ menuItem, menuPath, ...registration }) => ({\n ...registration,\n menuItems: [{ menuItem, menuPath }],\n }));\n const resolvedRegistrations = input.menuRegistrations ?? defaultRegistrations;\n return resolvedRegistrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, registration.targetCommandId, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, registration.targetCommandId, {\n params: { ...(registration.contribution.params ?? {}), ...(asParams(args) ?? {}) },\n resource: menuCommandResource(input, executionContext),\n slot: createExtensionSlot({\n id: registration.contribution.slotId,\n kind: \"menu\",\n projectId: input.projectId,\n context: { panelId: registration.contribution.id },\n }),\n }),\n }),\n ...registration.menuItems.map(({ menuPath, menuItem }) =>\n input.workbench.layout.registerMenuItem(menuPath, menuItem),\n ),\n ]);\n};\nconst registerCommandPaletteContributions = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n context: WorkbenchExtensionCommandContext,\n) => {\n const registrations = buildWorkbenchExtensionCommandPaletteRegistrations({ metadata: input.metadata });\n return registrations.flatMap((registration) => [\n input.workbench.commands.registerCommand(registration.command, {\n prepareArgs: (args, executionContext, onArgsChange) =>\n prepareCommandArgs(context, registration.targetCommandId, args, executionContext, onArgsChange),\n execute: (args, executionContext) =>\n executeWorkbenchExtensionCommand(context, registration.targetCommandId, {\n params: { ...(registration.contribution.params ?? {}), ...(asParams(args) ?? {}) },\n resource: menuCommandResource(input, executionContext),\n slot: createExtensionSlot({\n id: \"workbench.commandPalette\",\n kind: \"menu\",\n projectId: input.projectId,\n context: { panelId: registration.contribution.id },\n }),\n }),\n isVisible: () => matchesResourceWhen(registration.contribution.when, input.workbench.getPrimaryResource()?.type),\n }),\n input.workbench.layout.registerMenuItem(workbenchCommandPaletteMenuPath, registration.menuItem),\n ]);\n};\nconst matchesActiveMode = (\n input: InternalRegisterWorkbenchExtensionContributionsInput,\n when:\n | {\n mode?: string | string[];\n }\n | undefined,\n) => {\n const modes = when?.mode;\n if (!modes) return true;\n const active = input.workbench.modes.getActiveModeId() ?? \"\";\n return Array.isArray(modes) ? modes.includes(active) : modes === active;\n};\nconst registerStatusBarItems = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n (input.metadata.statusBarItems ?? []).map((item) =>\n input.workbench.statusBar.registerItem({\n id: item.id,\n viewId: item.viewId,\n slot: item.slot,\n order: item.order,\n isVisible: () =>\n matchesActiveMode(\n input,\n item.when as\n | {\n mode?: string | string[];\n }\n | undefined,\n ),\n }),\n );\nconst registerPages = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.pages.map((page) => input.workbench.pages.registerPage(page));\nconst registerResourceKinds = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.resourceKinds.map((kind) =>\n input.workbench.resources.registerKind({\n kind: kind.id,\n label: text(kind.label, kind.id),\n icon: kind.icon ?? \"FileText\",\n }),\n );\nconst registerModes = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.modes.map((mode) =>\n input.workbench.modes.registerMode({\n id: mode.modeId,\n label: text(mode.label, mode.modeId),\n panels: mode.panelRegions,\n regionSettings: mode.regionSettings,\n floatingPanels: mode.floatingPanels,\n defaultTheme: mode.defaultTheme,\n chrome: mode.chrome,\n activate: () => undefined,\n }),\n );\nconst registerModePlacements = (input: InternalRegisterWorkbenchExtensionContributionsInput) =>\n input.metadata.placements.map((placement) => input.workbench.modePlacements.registerPlacement(placement));\nexport const registerWorkbenchExtensionContributions = (sourceInput: RegisterWorkbenchExtensionContributionsInput) => {\n const input: InternalRegisterWorkbenchExtensionContributionsInput = {\n ...sourceInput,\n metadata: toInternalWorkbenchExtensionMetadata(sourceInput.metadata, {\n createTab: (metadata) => createWorkbenchExtensionTabPresentation(sourceInput, metadata),\n }),\n };\n const disposables: Disposable[] = [];\n const context: WorkbenchExtensionCommandContext = input;\n try {\n disposables.push(...registerCommands(context, input.metadata));\n disposables.push(\n ...registerWorkbenchExtensionKeybindings({\n bindings: input.metadata.keybindings,\n createWhenExpression: input.createKeybindingWhenExpression,\n workbench: input.workbench,\n }),\n );\n disposables.push(...registerMenus(input, context));\n disposables.push(...registerCommandPaletteContributions(input, context));\n disposables.push(\n registerWorkbenchExtensionTreeRenderers({ ...input, resolveNodeResource: input.resolveTreeNodeResource }),\n );\n disposables.push(registerWorkbenchExtensionFileRenderers(input));\n disposables.push(registerWorkbenchExtensionControlsRenderers(context, input.metadata.controlsRenderers ?? []));\n disposables.push(...registerWebviewPanels(input));\n disposables.push(...registerSettings(input));\n // Status-backed renderers query their provider while they register. Providers\n // must exist first so the renderer's live option source can load immediately.\n disposables.push(...registerStatuses(input, context));\n disposables.push(\n registerWorkbenchExtensionKanbanRenderers(context, input.metadata.kanbanRenderers ?? [], input.kanbanAdapter),\n );\n disposables.push(registerWorkbenchExtensionDataTableRenderers(context, input.metadata.dataTableRenderers ?? []));\n disposables.push(...registerViewMenus(input));\n disposables.push(\n registerWorkbenchExtensionCommandPaletteResources(context, input.metadata.commandPaletteResources ?? []),\n );\n disposables.push(\n ...registerWorkbenchExtensionNavigationItems({\n createWhenExpression: sourceInput.createNavigationWhenExpression,\n metadata: sourceInput.metadata,\n workbench: sourceInput.workbench,\n }),\n );\n if (sourceInput.subscribeRefreshEvents) {\n disposables.push(\n registerWorkbenchExtensionRendererRefreshEvents({\n metadata: sourceInput.metadata,\n subscribe: sourceInput.subscribeRefreshEvents,\n workbench: sourceInput.workbench,\n }),\n );\n }\n disposables.push(...registerStatusBarItems(input));\n disposables.push(...registerResourceKinds(input));\n disposables.push(...registerPages(input));\n disposables.push(...registerModes(input));\n disposables.push(...registerModePlacements(input));\n return {\n dispose() {\n disposeAll(disposables);\n },\n };\n } catch (error) {\n disposeAll(disposables);\n throw error;\n }\n};\n"],"names":["isLocalizedString","value","$l10n","publicCapabilityNames","Set","WEBVIEW_HOST_CAPABILITIES","scopedCapabilityNames","WEBVIEW_SCOPED_DECLARABLE_CAPABILITIES","isPublicCapability","name","has","isScopedCapability","parseWebviewCapabilityDeclaration","capability","nameAndScope","versionText","split","scopeIndex","indexOf","slice","scope","undefined","version","WEBVIEW_HOST_CAPABILITY_VERSION","Number","validateDeclarationShape","parsed","Boolean","unsupportedCapability","code","message","severity","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","declaredCapabilities","capabilities","diagnostics","allowed","allowedScopes","Map","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","add","declaration","push","scopes","get","set","requestScope","request","params","mount","length","createHostCapabilityGate","input","emit","diagnostic","onDiagnostic","deny","Error","call","method","handler","isRecord","safeStringify","json","JSON","stringify","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","loadedFrameRef","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","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","createWorkbenchWebviewHostCapabilities","placement","placementIdentity","placement.close","Array","isArray","Object","keys","workbench","closePlacement","commands.execute","commands","executeCommand","commandId","navigation.open","target","navigation","openTarget","notification.show","notification","notifications","show","level","preferences.get","preferences","getValue","preferences.set","setValue","host.dispatchKeyboardEvent","dispatchKeyboardEvent","logWebviewDiagnostics","webviewId","console","warn","logWebviewError","createLightTheme","hostEventPublishersByWorkbench","WeakMap","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","key","instanceId","renderBridgeWebviewFrame","context","createHostCapabilities","createProps","createTheme","ownerId","id","text","default","isContributionRef","isResource","type","isOpenIntent","isPageTarget","ancestors","page","resource","section","parent","isPanelTarget","panel","isItemTarget","href","command","isExtensionNavigationTarget","targets","every","toCommandTarget","override","commandTargetOf","commandIdOf","args","withExtensionOwner","ref","toPageTarget","toWorkbenchNavigationTarget","map","toWorkbenchNavigationTargetResult","unwrapCommandValue","result","response","outcome","status","reason","createExtensionSlot","projectId","deletedResourceId","deleted","handleDeletedResource","resourceKey","getPrimaryResource","pageLocations","navigateToParent","ok","executeWorkbenchExtensionCommand","slot","source","metadata","isProviderQueryResult","activateTarget","record","commandPaletteResources","refresh","toResult","groupLabel","description","icon","keywords","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","registerProvider","refreshEventIds","query","limit","activeResource","getActiveResource","queryHandlerId","modeId","modes","getActiveModeId","providerId","items","dispose","localize","registerControlsRenderer","adapter","controlsRendererId","run","renderer","rendererId","invocation","Promise","resolve","views","registerView","emptyTitle","emptyDescription","defaultValues","executeQuery","resolveResource","controlsQueryResultSchema","safeParse","success","fields","issues","issue","path","join","updateValue","valueChangeHandlerId","controlId","values","apply","applyHandlerId","reset","resetHandlerId","controlIds","registerWorkbenchExtensionControlsRenderers","toColumn","column","createElement","WorkbenchIcon","size","isQueryResult","toRow","row","registerRenderer","originalRows","dataTableRendererId","resourceKind","columns","initialPageSize","pageSizeOptions","selectionMode","selectionActions","action","destructive","rowIds","mapped","rowActions","rowId","refreshView","onRowActivate","rowActivationHandlerId","registerWorkbenchExtensionDataTableRenderers","placementOrder","first","last","emptyWorkbenchExtensionMetadata","commandPaletteContributions","extensions","menuContributions","pages","viewMenus","placements","resourceKinds","navigationItems","navigationTrees","statusBarItems","statuses","settingsPanels","settingsDefinitions","defaultWorkbenchExtensionCommandId","contribution","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","createMenuItem","resolveString","when","sourceCommandId","overflowLabel","order","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","createCommandId","createWhenExpression","menuSlotsById","menuTargetsById","registrations","unresolved","forEach","slotId","targetId","find","candidate","category","menuItem","menuPath","targetCommandId","buildWorkbenchExtensionCommandPaletteRegistrations","slotContext","resourceType","resourceId","executeFileCommand","extra","ext","revisionFromValue","revision","fileRendererRefreshEnvelopeFromCommand","origin","fileRendererOrigin","operationId","fileRendererResourceKey","registerFileRenderer","load","loadHandlerId","save","saveHandlerId","content","registerWorkbenchExtensionFileRenderers","fileRenderers","localizeAttributes","decorate","resolveStatusOptions","reportUnknownDisplay","attribute","knownDisplay","itemsAttributeId","base","option","createMutableAttributeSource","initial","snapshot","listeners","getSnapshot","isExtensionResource","defaultResolveRowResource","_","defaultResolveRowActionResource","fromRow","toWorkbenchRow","mergeParams","assign","filter","asParams","hasCommandParameters","CREATE_FIELD_TYPES","toCreateField","descriptor","optional","placeholder","required","defaultValue","multiple","accept","toCreateFields","entries","createRow","flatMap","field","createKanbanRendererSlot","kanbanRendererId","executeKanbanRendererCommand","commandResource","kanbanRendererRowActionCommandId","registerRowActionCommands","getCommand","registerCommand","execute","executionContext","runDefaultRowAction","commandPalette","requestParams","createBoardActionIcon","BoardActionIcon","toWorkbenchBoardColumnConfig","config","canDragIn","canDragOut","canCreate","actions","statusSetId","createStatusOptionsResolver","sources","existing","getStatuses","store","subscribeSelector","state","statusColorConfig","groupingAttributeId","groupKey","initialColumnGrouping","defaultSettings","columnGrouping","statusAttributes","createRowActionIcon","toCreateRowConfig","submitLabel","labels","cancel","properties","submitError","removeFile","toRowClick","resolveRowResource","toActivatedRow","onRowClick","toCreateRowHandler","runMutation","activateCreatedRow","submission","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","toRowContextMenuActions","resolveRowActionResource","runDefault","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","resolveLabel","withBuiltInDisplay","render","renderBadgeListDisplay","decorateAttribute","afterMutation","onAfterMutation","attributeId","wireAttributes","columnConfigs","latestQueryId","rowResource","storageScope","defaultFilters","defaultViews","defaultActiveViewId","hideToolbar","getBoardColumnConfig","queryId","settings","filters","mapRows","nextAttributes","boardColumnConfigs","onAttributeChange","attributeChangeHandlerId","onReorder","reorderHandlerId","beforeRowId","onCreateRow","onColumnAction","columnActionHandlerId","actionId","getRowContextMenuActions","localizeParamSchema","fromEntries","treeViewsFor","panels","panelMenus","resolveTreeView","ctx","viewId","resolveHostTreeHeaderNodes","getHostTreeHeaderNodes","treeViews","hostTreeHeader","resolveHostTreeFooterNodes","getHostTreeFooterNodes","hostTreeFooter","treeId","createQueryParams","node","executeCallback","executeTreeActionCommand","rendererParams","toActionParams","toRecordParams","createTreeMapper","originalNodes","runnerCommandId","resolveNodeResource","mapEmptyState","emptyState","mapTarget","commandTarget","nodeId","mapAction","disabled","mapNode","selected","iconColor","iconTooltip","rowVariant","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","mapNodes","nodes","mapSections","sections","isTreeSectionArray","isTreeNodeArray","hostNodeSection","canReorder","registerTree","mapper","commandDisposable","rawArgs","listViews","treeDisposable","searchable","searchPlaceholder","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","hostHeader","headerHandlerId","extensionHeader","getBody","bodyHandlerId","getFooter","hostFooter","footerHandlerId","getChildren","childrenHandlerId","originalNode","registerWorkbenchExtensionTreeRenderers","treeRenderers","metadataRefId","metadataCommandId","toInternalWhen","ids","mode","toWorkbenchWhenExpression","toOwner","isVisible","expression","matches","toNode","toSections","groupItems","groups","owner","defaultExpandedGroupIds","registerItems","registerContribution","sourceExtensionId","declarationIndex","getSections","registerTrees","tree","idScope","registerWorkbenchExtensionNavigationItems","currentPlatform","navigator","platform","userAgent","toLowerCase","includes","resolveExtensionKeybindingChord","binding","platformOverrides","registerWorkbenchExtensionKeybindings","bindings","keybindings","registerKeybinding","keybinding","pageSlot","tab","createTab","placementId","pageMain","main","toInternalWorkbenchPages","localId","slots","parentId","resourceKindForView","kinds","viewBody","menu","ownerPanelId","side","menus","commandActions","kanbanRenderers","attachments","resourceParam","fileParam","dataTableRenderers","controlsRenderers","panelRegions","regions","regionSettings","floatingPanels","defaultTheme","chrome","region","toInternalWorkbenchExtensionMetadata","adaptedPanels","movableTo","mountStrategy","headerBorderBottom","menuSlots","external","access","resourceHierarchyProviders","settingsSections","endsWith","refreshWorkbenchExtensionRenderer","envelope","rendererRefreshTargets","eventId","eventTargets","some","registerWorkbenchExtensionRendererRefreshEvents","refreshOpenWorkbenchExtensionWebviews","getView","createExtensionWebviewHostCapabilities","extensionIdForWebview","slotKind","panelId","files","upload","list","artifacts","artifacts.read","read","toBridgeWebviewConfig","settingsSectionIdDefault","extensionSettingsOrderBase","statusesSettingsOrder","asPreferenceValue","preferenceScope","withHostCapabilityOverrides","createBase","createOverrides","createExtensionHostCapabilities","createWebviewHostCapabilities","webviewArtifacts","webviewFiles","createWebviewHostCapabilityOverrides","registerWebviewPanels","renderInput","settingsPanel","renderWebview","createWebviewProps","createWebviewTheme","viewMenuPlacementPriority","registerViewMenus","registerViewMenu","ownerViewId","priority","statusResult","registerStatuses","settingsViewId","registerStatusSet","WorkflowStatusSettings","registerPanel","settingsSectionId","registerSettings","sectionId","getSection","registerSection","settingsSectionTitle","sort","left","right","localeCompare","setting","enum","registerSchema","toSnapshot","indicator","createWorkbenchExtensionTabPresentation","snapshots","loading","refreshEvents","finally","refreshSubscription","subscribeRefreshEvents","clear","disposeAll","prepareCommandArgs","onArgsChange","registerCommands","prepareArgs","menuCommandResource","registerMenus","createMenuWhenExpression","defaultRegistrations","registration","menuItems","menuRegistrations","layout","registerMenuItem","registerCommandPaletteContributions","matchesResourceWhen","workbenchCommandPaletteMenuPath","matchesActiveMode","active","registerStatusBarItems","statusBar","registerItem","registerPages","registerPage","registerResourceKinds","resources","registerKind","registerModes","registerMode","registerModePlacements","modePlacements","registerPlacement","registerWorkbenchExtensionContributions","sourceInput","createKeybindingWhenExpression","resolveTreeNodeResource","kanbanAdapter","createNavigationWhenExpression"],"mappings":"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"}