@pstdio/workbench 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions.d.ts +31 -2
- package/dist/extensions.js +87 -73
- package/dist/extensions.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +10 -0
- package/dist/react.js +1210 -1187
- package/dist/react.js.map +1 -1
- package/dist/testing.d.ts +10 -0
- package/package.json +2 -2
package/dist/extensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sources":["../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/theme.ts","../../pstdio-extensions/src/bridge/host/extension-frame.tsx","../../pstdio-extensions/src/bridge/host/host-event-publisher.ts","../src/extensions/bridge/terminal-session-capability.ts","../src/extensions/bridge/webview-host-capabilities.ts","../src/extensions/bridge/bridge-webview-renderer.tsx","../../pstdio-api-contracts/src/extension-kernel/slots.ts","../../pstdio-api-contracts/src/extension-kernel/kernel-slots.ts","../../pstdio-api-contracts/src/extension-kernel/l10n.ts","../../pstdio-extensions/src/workbench/shared/localization.ts","../src/extensions/host/command-response.ts","../src/extensions/host/workbench-extension-command.ts","../src/extensions/contributions/command-palette-resource-contributions.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/contributions/panel-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.ts","../src/extensions/contributions/data-table-renderer-contributions.ts","../src/extensions/contributions/extension-contributions.ts","../src/extensions/contributions/file-renderer-contributions.ts","../src/extensions/contributions/kanban-renderer-contribution-helpers.ts","../src/extensions/contributions/kanban-renderer-contributions.ts","../src/extensions/contributions/param-schema-localization.ts","../src/extensions/contributions/tree-renderer-host-defaults.ts","../src/extensions/contributions/tree-renderer-panels.ts","../src/extensions/contributions/tree-renderer-contributions.ts","../src/extensions/bridge/webview-command-capabilities.ts","../src/extensions/contributions/route-contributions.ts","../src/extensions/shared/workbench-targets.ts","../src/extensions/contributions/tree-item-contributions.ts","../src/extensions/host/workbench-extension-host.ts","../src/extensions/host/workbench-extension-refresh.ts"],"sourcesContent":["import type { HostCapabilityRequest } from \"./index\";\n\nexport const WEBVIEW_HOST_CAPABILITY_VERSION = 1;\n\n// Capabilities a webview must declare in its manifest before the bridge will route them.\nexport const WEBVIEW_DECLARABLE_CAPABILITIES = [\n \"commands.execute\",\n \"resource.open\",\n \"notification.show\",\n \"notification.action\",\n \"notification.resolve\",\n \"notification.dismiss\",\n \"preferences.get\",\n \"preferences.set\",\n \"extension.settings.all\",\n \"extension.settings.get\",\n \"extension.settings.set\",\n \"extension.settings.delete\",\n \"terminal.session\",\n \"files.upload\",\n \"files.list\",\n \"files.delete\",\n] as const;\n\n// Runtime plumbing the guest invokes on its own (e.g. keyboard forwarding). These are\n// enabled whenever the host implements them, with no manifest declaration required.\nexport const ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES = [\"host.dispatchKeyboardEvent\"] as const;\n\nexport const WEBVIEW_HOST_CAPABILITIES = [\n ...WEBVIEW_DECLARABLE_CAPABILITIES,\n ...ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n] as const;\n\nexport type WebviewHostCapability = (typeof WEBVIEW_HOST_CAPABILITIES)[number];\nexport type WebviewDeclarableCapability = (typeof WEBVIEW_DECLARABLE_CAPABILITIES)[number];\n\nexport type WebviewCapabilityDiagnosticCode =\n | \"undeclared_webview_capability\"\n | \"unsupported_webview_capability\"\n | \"unsupported_webview_capability_version\";\n\nexport interface WebviewCapabilityDiagnostic {\n capability: string;\n code: WebviewCapabilityDiagnosticCode;\n message: string;\n severity: \"error\";\n}\n\nexport type HostCapability<TParams = unknown, TResult = unknown> = (params: TParams) => Promise<TResult> | TResult;\nexport type HostCapabilityRegistry = Partial<Record<WebviewHostCapability, HostCapability>>;\n\ninterface CreateHostCapabilityGateInput {\n capabilities: HostCapabilityRegistry;\n declaredCapabilities?: readonly string[];\n onDiagnostic?: (diagnostic: WebviewCapabilityDiagnostic) => void;\n}\n\nconst publicCapabilityNames = new Set<string>(WEBVIEW_HOST_CAPABILITIES);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability => publicCapabilityNames.has(name);\n\nconst parseCapabilityDeclaration = (capability: string) => {\n const [name, versionText] = capability.split(\"@\");\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name: name ?? \"\", version };\n};\n\nconst unsupportedCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability\",\n message: `Unsupported webview capability: ${capability}`,\n severity: \"error\",\n});\n\nconst unsupportedVersion = (capability: string, name: string, version: number): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability_version\",\n message: `Unsupported webview capability version: ${name}@${version.toString()} (supported: ${WEBVIEW_HOST_CAPABILITY_VERSION.toString()})`,\n severity: \"error\",\n});\n\nconst undeclaredCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"undeclared_webview_capability\",\n message: `Webview did not declare host capability: ${capability}`,\n severity: \"error\",\n});\n\nexport const validateWebviewCapabilityDeclarations = (\n declaredCapabilities: readonly string[] | undefined,\n capabilities: HostCapabilityRegistry = {},\n) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n const allowed = new Set<WebviewHostCapability>();\n\n // Always-available capabilities never need a declaration — enable them wherever the\n // host implements them.\n for (const name of ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES) {\n if (capabilities[name]) allowed.add(name);\n }\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n continue;\n }\n if (!capabilities[parsed.name]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n allowed.add(parsed.name);\n }\n\n return { allowed, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n }\n }\n\n return diagnostics;\n};\n\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method)) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n if (!allowed.has(request.method)) {\n const diagnostic = undeclaredCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n return await handler(request.params);\n },\n };\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","import type { ThemePreference } from \"../contract\";\n\nexport const collectChakraThemeVariables = () => {\n if (typeof document === \"undefined\") return {};\n\n const computed = getComputedStyle(document.documentElement);\n const variables: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) {\n const name = computed.item(index);\n if (name.startsWith(\"--chakra-\")) {\n variables[name] = computed.getPropertyValue(name).trim();\n }\n }\n return variables;\n};\n\nexport const resolveActiveTheme = (fallback: ThemePreference): ThemePreference => {\n if (typeof document === \"undefined\") return fallback;\n const value = document.documentElement.getAttribute(\"data-theme\");\n if (value === \"dark\" || value === \"light\") return value;\n\n const colorMode = document.documentElement.getAttribute(\"data-color-mode\");\n return colorMode === \"dark\" || colorMode === \"light\" ? colorMode : fallback;\n};\n\nexport const postThemeToFrame = (\n iframe: HTMLIFrameElement | null,\n theme: ThemePreference,\n variables: Record<string, string>,\n) => {\n iframe?.contentWindow?.postMessage({ type: \"pstdio.theme\", theme, variables }, \"*\");\n};\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { host } from \"rimless\";\nimport type {\n ExtensionViewDescriptor,\n HostCapabilityRegistry,\n HostCapabilityRequest,\n HostEventMessage,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"../contract\";\nimport { createHostCapabilityGate } from \"../contract\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\nimport type { HostEventPublisher } from \"./host-event-publisher\";\nimport { collectChakraThemeVariables, resolveActiveTheme } from \"./theme\";\n\nexport interface ExtensionFrameProps {\n view: ExtensionViewDescriptor;\n props: unknown;\n theme: ThemePreference;\n capabilities?: HostCapabilityRegistry;\n /** Publisher whose emitted events are forwarded into the guest once connected. */\n hostEvents?: HostEventPublisher;\n onReady?: () => void;\n onError?: (error: { message: string; stack?: string }) => void;\n onDiagnostics?: (diagnostics: WebviewCapabilityDiagnostic[]) => void;\n title?: string;\n}\n\ntype GuestRemote = {\n init: (message: {\n moduleUrl: string;\n styles: string[];\n props: unknown;\n theme: ThemePreference;\n themeVariables: Record<string, string>;\n }) => Promise<void>;\n themeUpdate: (message: { theme: ThemePreference; variables: Record<string, string> }) => void;\n propsUpdate: (message: { props: unknown }) => void;\n hostEvent?: (message: HostEventMessage) => void;\n};\n\nconst iframeStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n flex: \"1 1 0%\",\n height: \"100%\",\n minHeight: 0,\n width: \"100%\",\n};\n\nconst frameShellStyle: CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n minHeight: 0,\n position: \"relative\",\n width: \"100%\",\n};\n\nconst errorOverlayStyle: CSSProperties = {\n alignItems: \"center\",\n background: \"rgba(255, 255, 255, 0.92)\",\n color: \"#7a1f12\",\n display: \"flex\",\n inset: 0,\n justifyContent: \"center\",\n padding: \"24px\",\n position: \"absolute\",\n textAlign: \"center\",\n zIndex: 1,\n};\n\nexport const EXTENSION_IFRAME_SANDBOX = \"allow-scripts allow-forms allow-popups\";\n\nexport const ExtensionFrame = (props: ExtensionFrameProps) => {\n const {\n view,\n props: extensionProps,\n theme,\n capabilities,\n hostEvents,\n onReady,\n onError,\n onDiagnostics,\n title,\n } = props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const remoteRef = useRef<GuestRemote | null>(null);\n const initializedRef = useRef(false);\n const connectedKeyRef = useRef<string | null>(null);\n const propsRef = useRef(extensionProps);\n const themeRef = useRef(theme);\n const capabilitiesRef = useRef(capabilities);\n const hostEventsRef = useRef(hostEvents);\n const declaredCapabilitiesRef = useRef(view.webview.capabilities);\n const onReadyRef = useRef(onReady);\n const onErrorRef = useRef(onError);\n const onDiagnosticsRef = useRef(onDiagnostics);\n const [runtimeError, setRuntimeError] = useState<string | null>(null);\n\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 const connectedKey = `${view.webview.runtimeUrl}\\n${view.webview.moduleUrl}`;\n if (connectedKeyRef.current === connectedKey) return;\n connectedKeyRef.current = connectedKey;\n\n initializedRef.current = false;\n remoteRef.current = null;\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 connection = host.connect(iframe, hostApi);\n // A sandboxed iframe without allow-same-origin posts messages with origin \"null\".\n // Leaving the iframe src attribute empty lets rimless validate the guest by\n // contentWindow identity while still loading the API-owned runtime document.\n iframe.contentWindow?.location.replace(view.webview.runtimeUrl);\n\n connection\n .then(async (conn) => {\n const remote = conn.remote as GuestRemote;\n remoteRef.current = remote;\n hostEventsRef.current?.bind((message) => remote.hostEvent?.(message));\n\n await remote.init({\n moduleUrl: moduleUrlAtConnect,\n styles: stylesAtConnect,\n props: propsRef.current,\n theme: resolveActiveTheme(themeRef.current),\n themeVariables: collectChakraThemeVariables(),\n });\n initializedRef.current = true;\n setRuntimeError(null);\n onReadyRef.current?.();\n })\n .catch((error) => {\n const normalized = normalizeRuntimeError(error);\n setRuntimeError(normalized.message);\n onErrorRef.current?.(normalized);\n });\n\n // 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 () => {\n // No-op. We deliberately keep the live connection.\n };\n }, [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 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 { OpenResourceInput, 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 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?: OpenResourceInput; resource?: ResourceRef };\n if (!request.resource) throw new Error(\"resource.open requires a resource.\");\n return input.workbench.resources.openResource(request.resource, 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 kind: resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`,\n id: resource.id,\n label: resource.label,\n metadata: resource.metadata,\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 { WorkbenchExtensionCommandPaletteResourceRecord } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { CommandPaletteResourceResult, Disposable } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\n\n// Transport-safe shapes returned by an extension queryCommand.\ninterface ResourceItemTarget {\n kind: \"command\" | \"resource\";\n command?: string | { id: string };\n params?: Record<string, unknown>;\n resource?: Parameters<typeof toWorkbenchResource>[0];\n}\n\ninterface ResourceItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n target: ResourceItemTarget;\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: ResourceItemTarget[\"command\"]) => (typeof command === \"string\" ? command : command?.id);\n\nconst activateTarget = async (context: WorkbenchExtensionCommandContext, target: ResourceItemTarget) => {\n if (target.kind === \"resource\" && target.resource) {\n await context.workbench.resources\n .openResource(toWorkbenchResource(target.resource), { replaceActive: true })\n .catch(() => undefined);\n return;\n }\n\n const commandId = commandIdOf(target.command);\n if (!commandId) return;\n await executeWorkbenchExtensionCommand(context, commandId, { 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};\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, item.target),\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 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 ExtensionPanelMenu = NonNullable<WorkbenchExtensionMetadata[\"panels\"][number][\"panelMenus\"]>[number];\n\nexport interface RegisterWorkbenchExtensionPanelInput {\n contribution: WorkbenchPanelContribution;\n workbench: WorkbenchModuleContext;\n}\n\nexport const toWorkbenchPanelEligibility = (eligibility?: { resourceKinds?: readonly string[] }) =>\n eligibility\n ? {\n resourceKinds: eligibility.resourceKinds ? [...eligibility.resourceKinds] : undefined,\n }\n : undefined;\n\nconst panelMenuRendererId = (menu: ExtensionPanelMenu) => {\n const rendererId =\n menu.treeRendererId ??\n menu.fileRendererId ??\n menu.controlsRendererId ??\n menu.dataTableRendererId ??\n (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\nexport const toWorkbenchPanelMenus = (\n menus: readonly ExtensionPanelMenu[] | undefined,\n): WorkbenchPanelMenuDefinition[] | undefined =>\n menus?.map((menu) => ({\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 }));\n\nexport const registerWorkbenchExtensionPanel = (input: RegisterWorkbenchExtensionPanelInput): Disposable =>\n input.workbench.layout.registerPanel(input.contribution);\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 { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\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 run = (commandId: string | undefined, params: Record<string, unknown>, resource?: ResourceRef) =>\n commandId ? executeWorkbenchExtensionCommand(context, commandId, { params, resource }) : 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.queryCommandId, {}, resource ?? adapter.resolveResource?.(record));\n return isQueryResult(value) ? value : {};\n },\n updateValue: record.updateValueCommandId\n ? ({ controlId, value, values, resource }) =>\n run(record.updateValueCommandId, { controlId, value, values }, resource).then(() => undefined)\n : undefined,\n apply: record.applyCommandId\n ? ({ values, resource }) => run(record.applyCommandId, { values }, resource).then(() => undefined)\n : undefined,\n reset: record.resetCommandId\n ? ({ controlIds, resource }) => run(record.resetCommandId, { 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 = (context: WorkbenchExtensionCommandContext, panel: ControlsViewRecord) => {\n if (!panel.controlsRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.controlsRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\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): Disposable => {\n const disposables: Disposable[] = [];\n\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n for (const panel of panels) {\n const disposable = registerControlsViewWidget(context, panel);\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 type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\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 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) =>\n executeWorkbenchExtensionCommand(context, commandId, {\n params,\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 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(\n record.queryCommandId,\n {\n rendererId: record.id,\n projectId: context.projectId,\n modeId,\n resource: resource\n ? {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n }\n : undefined,\n },\n resource,\n );\n if (!isQueryResult(value)) return { rows: [] };\n return {\n rows: value.rows.map(toRow),\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: (row) => run(action.commandId, { rowId: row.id }, row.resource).then(() => undefined),\n })),\n });\n};\n\nconst registerView = (context: WorkbenchExtensionCommandContext, panel: DataTableViewRecord) => {\n if (!panel.dataTableRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.dataTableRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\n },\n });\n};\n\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n panels: DataTableViewRecord[],\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record));\n for (const panel of panels) {\n const disposable = registerView(context, panel);\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 navigation: [],\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 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 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, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, FileRendererContent, ResourceRef, WorkbenchModuleContext } from \"../../core\";\nimport { unwrapCommandValue } from \"../host/command-response\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\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) => {\n const ext = toExtensionResource(resource);\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params: { projectId: input.projectId, resource: ext, ...extra },\n resource: ext,\n slot: slotContext({ projectId: input.projectId, rendererId, resource: ext }),\n source: \"dashboard\",\n });\n return unwrapCommandValue(result);\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.loadCommandId, resource);\n return (result ?? {}) as FileRendererContent;\n },\n save: record.saveCommandId\n ? async (resource, content) => {\n await executeFileCommand(input, record.id, record.saveCommandId as string, resource, { content });\n }\n : undefined,\n });\n\nconst registerFileViewWidget = (input: RegisterWorkbenchExtensionFileRenderersInput, panel: ViewRecord) => {\n if (!panel.fileRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.fileRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\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 for (const panel of input.metadata.panels) {\n const disposable = registerFileViewWidget(input, panel);\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 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 executeWorkbenchExtensionCommand(context, commandId, {\n params,\n resource: resource ?? context.workbench.getPrimaryResource(),\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}`;\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 { WorkbenchExtensionKanbanRendererRecord } 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 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\";\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 /** 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 record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n resolveRowResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\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) => {\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 let columnConfigs: ColumnConfigRecord | undefined;\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, 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 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 onRowClick: toRowClick(record, adapter, resolveRowResource),\n executeQuery: async (state: KanbanRendererQueryState) => {\n const value = await executeKanbanRendererCommand(context, record, record.queryCommandId, {\n settings: state.settings,\n filters: state.filters,\n });\n if (Array.isArray(value)) return value.map((row) => toWorkbenchRow(row, rowResource));\n if (!isQueryResult(value)) return [];\n attributes.set(value.attributes);\n columnConfigs = value.boardColumnConfigs;\n return (value.rows ?? []).map((row) => toWorkbenchRow(row, rowResource));\n },\n onAttributeChange: record.updateAttributeCommandId\n ? (rowId, attributeId, value) =>\n runMutation(record, record.updateAttributeCommandId!, {\n rowId,\n attributeId,\n value,\n }).then(() => undefined)\n : undefined,\n onReorder: record.reorderCommandId\n ? (rowId, beforeRowId) =>\n runMutation(record, record.reorderCommandId!, { rowId, beforeRowId }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(record, adapter, runMutation),\n onColumnAction: record.columnActionCommandId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionCommandId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(context, record, adapter, localize, resolveRowActionResource),\n }),\n );\n\n disposables.push(\n context.workbench.layout.registerPanel({\n closable: false,\n id: record.id,\n title: localize(record.title, record.id),\n region: \"main\",\n rendererId: record.id,\n singleton: true,\n resourceKinds: record.resourceKind ? [record.resourceKind] : undefined,\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.treeRendererId === record.id);\n\nconst resolveTreeView = (panels: ExtensionTreeViewRecord[], ctx: TreeContext) => {\n if (ctx.viewId) return panels.find((panel) => panel.id === ctx.viewId);\n return panels.length === 1 ? panels[0] : undefined;\n};\n\nexport const resolveHostTreeHeaderNodes = async (input: ResolveHostTreeHeaderInput) => {\n const { ctx, getHostTreeHeaderNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeHeader\" in panel) || panel.hostTreeHeader !== \"default\") return [];\n return (await getHostTreeHeaderNodes?.({ ctx, record, panel })) ?? [];\n};\n\nexport const resolveHostTreeFooterNodes = async (input: ResolveHostTreeFooterInput) => {\n const { ctx, getHostTreeFooterNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeFooter\" in panel) || panel.hostTreeFooter !== \"default\") return [];\n return (await getHostTreeFooterNodes?.({ ctx, record, panel })) ?? [];\n};\n","import { text } from \"pstdio-extensions/workbench\";\nimport type { WorkbenchModuleContext } from \"../../core\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\n} from \"./panel-contributions\";\nimport type { ExtensionTreePanelRecord } from \"./tree-renderer-contribution-types\";\n\ninterface RegisterTreeViewWidgetInput {\n workbench: WorkbenchModuleContext;\n}\n\nexport const registerTreeViewWidget = (input: RegisterTreeViewWidgetInput, panel: ExtensionTreePanelRecord) => {\n if (!panel.treeRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.treeRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\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 { unwrapCommandValue } from \"../host/command-response\";\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 workbench: WorkbenchModuleContext;\n}\n\nconst toExtensionResource = (resource: ResourceRef | undefined): ExtensionTreeResource | undefined => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nconst toWorkbenchResource = (resource: ExtensionTreeResource): 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: 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 return {\n projectId: input.projectId,\n modeId: input.workbench.modes.getActiveModeId(),\n resource,\n treeId: record.id,\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 commandId: string,\n params: Record<string, unknown>,\n) => {\n const resource = params.resource as ExtensionTreeResource | undefined;\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params,\n resource,\n slot: slotContext({\n modeId: params.modeId as string | undefined,\n projectId: input.projectId,\n resource,\n treeId: params.treeId as string,\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 result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n ...(params ? { params } : {}),\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 createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\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 if (target.kind === \"resource\" && target.resource) {\n return { kind: \"resource\", resource: toWorkbenchResource(target.resource), input: { replaceActive: true } };\n }\n if (target.kind === \"panel\" && target.panelId) return { kind: \"panel\", panelId: target.panelId };\n if (target.kind !== \"command\" || !target.commandId) return undefined;\n return {\n kind: \"command\",\n commandId: runnerCommandId,\n args: {\n commandId: target.commandId,\n nodeId: node.id,\n params: target.args,\n resource: node.resource ?? toExtensionResource(ctx.resource),\n treeId: record.id,\n } satisfies TargetCommandArgs,\n };\n };\n\n const mapAction = (\n action: ExtensionTreeAction,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): TreeAction => {\n const commandId = action.commandId;\n return {\n id: action.id,\n label: text(action.label),\n icon: action.icon,\n args: action.args,\n params: localizeParamSchema(action.params, 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, action.args),\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 ? toWorkbenchResource(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 selectedNodeIdFromSections = (sections: ExtensionTreeSection[]): string | undefined => {\n for (const section of sections) {\n for (const node of section.nodes) {\n if (node.selected) return node.id;\n }\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 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.bodyCommandId, 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.footerCommandId) return hostFooter;\n const result = await executeCallback(input, record.footerCommandId, createQueryParams(input, record, ctx));\n const extensionFooter = isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n return [...extensionFooter, ...hostFooter];\n },\n getChildren: async (node, ctx) => {\n if (!record.childrenCommandId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node) ?? (node as unknown as ExtensionTreeNode);\n const result = await executeCallback(\n input,\n record.childrenCommandId,\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 for (const panel of input.metadata.panels) {\n const disposable = registerTreeViewWidget(input, panel);\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 { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport type { OpenResourceInput } from \"../../core\";\nimport {\n createExtensionSlot,\n toExtensionCommandResource,\n toWorkbenchResource,\n} 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\"];\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?: OpenResourceInput;\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(toWorkbenchResource(request.resource), request.input);\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 closable: false,\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: \"activate-or-open\" },\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 === \"kanbanRenderer\") return { kind: \"panel\", panelId: item.action.kanbanRendererId };\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 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 closable: false,\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 WorkbenchCommandExecutionContext,\n WorkbenchModeActivationContext,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { workbenchCommandPaletteMenuPath } 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 { 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 registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\n} from \"../contributions/panel-contributions\";\nimport { registerWorkbenchExtensionRoutes, routeResource } 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 input.metadata.panels.flatMap((panel) => {\n if (!panel.webview) return [];\n return [\n registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: BRIDGE_WEBVIEW_RENDERER_ID,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\n config: {\n ...toBridgeWebviewConfig(panel.webview),\n ...(panel.region === \"overlay\"\n ? { size: \"lg\", scrollBehavior: \"inside\", contentHeight: \"min(560px, calc(100dvh - 48px))\" }\n : {}),\n },\n },\n }),\n ];\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\nconst registerResourcePresenters = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const resourceKinds = new Set<string>();\n for (const panel of input.metadata.panels) if (panel.resourceKind) resourceKinds.add(panel.resourceKind);\n for (const renderer of input.metadata.kanbanRenderers ?? [])\n if (renderer.resourceKind) resourceKinds.add(renderer.resourceKind);\n\n const disposables: Disposable[] = [];\n for (const kind of resourceKinds) {\n if (!input.workbench.resources.getKind(kind)) {\n disposables.push(\n input.workbench.resources.registerKind({ kind, label: kind, icon: \"FileText\", surface: \"primary\" }),\n );\n }\n const panels = input.metadata.panels.filter((panel) => panel.resourceKind === kind && panel.region !== \"overlay\");\n if (panels.length > 0) {\n disposables.push(\n input.workbench.resources.registerPresenter({\n id: `workbench.extension.resource.${kind}`,\n canOpen: (resource) => resource.kind === kind,\n open: (resource) => {\n const instances = panels.map((panel) =>\n input.workbench.layout.openPanel(panel.id, {\n resource,\n title: resource.label ?? resource.id ?? resource.uri,\n }),\n );\n return instances.find((_instance, index) => panels[index]?.region === \"main\") ?? instances[0]!;\n },\n }),\n );\n }\n }\n return disposables;\n};\n\ntype WorkbenchExtensionModeRecord = WorkbenchExtensionMetadata[\"modes\"][number];\ntype WorkbenchExtensionModeLayout = NonNullable<WorkbenchExtensionModeRecord[\"layout\"]>;\ntype WorkbenchExtensionModeOpenEntry = NonNullable<WorkbenchExtensionModeLayout[\"open\"]>[number];\n\nconst openModePanel = (ctx: WorkbenchModeActivationContext, entry: WorkbenchExtensionModeOpenEntry) => {\n if (!entry.panel) return;\n ctx.layout.openPanel(entry.panel, {\n region: entry.region,\n pinned: entry.pinned,\n title: text(entry.title),\n });\n};\n\nconst openModeResource = (\n input: RegisterWorkbenchExtensionContributionsInput,\n ctx: WorkbenchModeActivationContext,\n entry: WorkbenchExtensionModeOpenEntry,\n) => {\n if (!entry.resource) return;\n const route = input.metadata.routes.find(\n (candidate) => candidate.id === entry.resource || candidate.path === entry.resource,\n );\n if (!route) return;\n void ctx.resources.openResource(routeResource(route, input.routeResourceKind ?? routeResourceKindDefault));\n};\n\nconst activateModeLayout = (\n input: RegisterWorkbenchExtensionContributionsInput,\n ctx: WorkbenchModeActivationContext,\n mode: WorkbenchExtensionModeRecord,\n) => {\n for (const entry of mode.layout?.open ?? []) {\n openModePanel(ctx, entry);\n openModeResource(input, ctx, entry);\n }\n};\n\nconst registerModes = (input: RegisterWorkbenchExtensionContributionsInput) =>\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.layout?.panels,\n activate: () => undefined,\n seed: (ctx) => {\n activateModeLayout(input, ctx, mode);\n },\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(registerWorkbenchExtensionKanbanRenderers(context, input.metadata.kanbanRenderers ?? []));\n disposables.push(\n registerWorkbenchExtensionDataTableRenderers(\n context,\n input.metadata.dataTableRenderers ?? [],\n input.metadata.panels,\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(...registerResourcePresenters(input));\n disposables.push(...registerModes(input));\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 { WorkbenchModuleContext, WorkbenchPanelInstance } from \"../../core\";\n\nconst treeQueryCommandIds = (metadata: WorkbenchExtensionMetadata) =>\n new Set(\n (metadata.treeRenderers ?? []).flatMap((renderer) =>\n [renderer.bodyCommandId, renderer.childrenCommandId, renderer.footerCommandId].filter((commandId) => commandId),\n ),\n );\n\nconst kanbanRendererQueryCommandIds = (metadata: WorkbenchExtensionMetadata) =>\n new Set((metadata.kanbanRenderers ?? []).map((renderer) => renderer.queryCommandId));\n\nconst dataTableRendererQueryCommandIds = (metadata: WorkbenchExtensionMetadata) =>\n new Set((metadata.dataTableRenderers ?? []).map((renderer) => renderer.queryCommandId));\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 shouldRefreshWorkbenchExtensionTrees = (metadata: WorkbenchExtensionMetadata, commandId: string) =>\n !treeQueryCommandIds(metadata).has(commandId);\n\nexport const shouldRefreshWorkbenchExtensionKanbanRenderers = (\n metadata: WorkbenchExtensionMetadata,\n commandId: string,\n) => !kanbanRendererQueryCommandIds(metadata).has(commandId);\n\nexport const shouldRefreshWorkbenchExtensionDataTableRenderers = (\n metadata: WorkbenchExtensionMetadata,\n commandId: string,\n) => !dataTableRendererQueryCommandIds(metadata).has(commandId);\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 || panel.region === \"overlay\") 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 });\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 });\n }\n\n restoreActiveWidget(workbench, activeWidgetId);\n};\n\nexport const refreshWorkbenchExtensionContributions = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n commandId: string,\n) => {\n refreshOpenWorkbenchExtensionWebviews(workbench, metadata);\n\n if (shouldRefreshWorkbenchExtensionTrees(metadata, commandId)) {\n for (const renderer of metadata.treeRenderers ?? []) workbench.renderers.refresh(renderer.id);\n }\n\n if (shouldRefreshWorkbenchExtensionKanbanRenderers(metadata, commandId)) {\n for (const renderer of metadata.kanbanRenderers ?? []) workbench.renderers.refreshKanbanRenderer(renderer.id);\n }\n\n if (shouldRefreshWorkbenchExtensionDataTableRenderers(metadata, commandId)) {\n for (const renderer of metadata.dataTableRenderers ?? []) {\n workbench.renderers.refreshDataTableRenderer(renderer.id);\n }\n }\n};\n"],"names":["WEBVIEW_HOST_CAPABILITY_VERSION","WEBVIEW_DECLARABLE_CAPABILITIES","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","WEBVIEW_HOST_CAPABILITIES","publicCapabilityNames","Set","isPublicCapability","name","has","parseCapabilityDeclaration","capability","versionText","split","version","undefined","Number","unsupportedCapability","code","message","severity","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","declaredCapabilities","capabilities","diagnostics","allowed","add","declaration","parsed","push","createHostCapabilityGate","input","emit","diagnostic","onDiagnostic","call","request","method","Error","handler","params","isRecord","value","safeStringify","json","JSON","stringify","length","String","normalizeRuntimeError","stack","collectChakraThemeVariables","document","computed","getComputedStyle","documentElement","variables","index","item","startsWith","getPropertyValue","trim","resolveActiveTheme","fallback","getAttribute","colorMode","iframeStyle","border","display","flex","height","minHeight","width","frameShellStyle","position","errorOverlayStyle","alignItems","background","color","inset","justifyContent","padding","textAlign","zIndex","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","props","view","extensionProps","theme","hostEvents","onReady","onError","onDiagnostics","title","iframeRef","useRef","remoteRef","initializedRef","connectedKeyRef","propsRef","themeRef","capabilitiesRef","hostEventsRef","declaredCapabilitiesRef","webview","onReadyRef","onErrorRef","onDiagnosticsRef","runtimeError","setRuntimeError","useState","current","useEffect","iframe","connectedKey","runtimeUrl","moduleUrl","stylesAtConnect","styles","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","ready","payload","connection","host","connect","contentWindow","location","replace","then","conn","remote","bind","hostEvent","init","themeVariables","catch","error","normalized","unbind","propsUpdate","themeUpdate","window","MutationObserver","frame","schedule","cancelAnimationFrame","requestAnimationFrame","observer","options","attributeFilter","attributes","observe","body","disconnect","jsxs","jsx","label","colorScheme","createHostEventPublisher","sink","pending","disconnectListeners","next","shift","onDisconnect","listener","delete","TERMINAL_SESSION_EVENT_SCOPE","createTerminalSessionCapability","terminal","scope","operation","sessionId","open","write","data","accepted","resize","cols","rows","kill","signal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","subscribe","onData","chunk","kind","onExit","exit","dispatchDocumentKeyboardEvent","event","KeyboardEvent","bubbles","cancelable","dispatchEvent","createWorkbenchWebviewHostCapabilities","commands.execute","workbench","commands","executeCommand","commandId","resource.open","resource","resources","openResource","notification.show","notification","notifications","show","level","preferences.get","preferences","getValue","preferences.set","setValue","host.dispatchKeyboardEvent","dispatchKeyboardEvent","logWebviewDiagnostics","webviewId","console","warn","logWebviewError","BRIDGE_WEBVIEW_RENDERER_ID","isBridgeWebviewConfig","Array","isArray","config","createPlacementProps","placement","createLightTheme","hostEventPublishersByWorkbench","WeakMap","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","get","Map","set","key","instanceId","renderBridgeWebviewFrame","context","createHostCapabilities","createProps","createTheme","ownerId","extensionId","id","renderBridgeWebview","panel","panelId","createBridgeWebviewRenderer","render","renderInput","defineSlot","description","metadata","isLocalizedString","$l10n","text","default","unwrapCommandValue","result","response","outcome","status","reason","toExtensionCommandResource","type","uri","toWorkbenchResource","encodeURIComponent","createExtensionSlot","projectId","executeWorkbenchExtensionCommand","slot","source","isProviderQueryResult","commandIdOf","command","activateTarget","target","replaceActive","commandPaletteResources","refresh","toResult","record","groupLabel","icon","keywords","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","registerProvider","refreshEventIds","query","limit","activeResource","getActiveResource","queryCommandId","modeId","modes","getActiveModeId","providerId","items","map","dispose","toBridgeWebviewConfig","toWorkbenchPanelEligibility","eligibility","resourceKinds","panelMenuRendererId","menu","rendererId","treeRendererId","fileRendererId","controlsRendererId","dataTableRendererId","toWorkbenchPanelMenus","menus","side","registerWorkbenchExtensionPanel","layout","registerPanel","contribution","localize","isQueryResult","Boolean","registerControlsRenderer","adapter","run","Promise","resolve","renderers","emptyTitle","emptyDescription","defaultValues","executeQuery","resolveResource","updateValue","updateValueCommandId","controlId","values","apply","applyCommandId","reset","resetCommandId","controlIds","registerControlsViewWidget","region","closable","singleton","resourceKind","eligibleLocations","panelMenus","registerWorkbenchExtensionControlsRenderers","panels","disposable","toColumn","column","createElement","WorkbenchIcon","size","toRow","row","registerRenderer","registerDataTableRenderer","columns","initialPageSize","pageSizeOptions","rowActions","action","destructive","rowId","registerView","registerWorkbenchExtensionDataTableRenderers","placementOrder","first","last","emptyWorkbenchExtensionMetadata","commandPaletteContributions","extensions","menuContributions","navigation","routes","kanbanRenderers","dataTableRenderers","treeRenderers","fileRenderers","settingsPanels","settingsDefinitions","treeItems","defaultWorkbenchExtensionCommandId","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","createMenuItem","resolveString","when","sourceCommandId","overflowLabel","order","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","createCommandId","createWhenExpression","menuSlotsById","menuTargetsById","registrations","forEach","slotId","find","candidate","category","menuItem","menuPath","targetCommandId","buildWorkbenchExtensionCommandPaletteRegistrations","buildWorkbenchExtensionRouteEntries","createResource","route","toExtensionResource","slotContext","resourceType","resourceId","executeFileCommand","extra","ext","registerFileRenderer","load","loadCommandId","save","saveCommandId","content","registerFileViewWidget","registerWorkbenchExtensionFileRenderers","localizeAttributes","decorate","attribute","base","option","createMutableAttributeSource","initial","snapshot","listeners","getSnapshot","isWorkbenchResource","isExtensionResource","rowResourceUri","defaultResolveRowResource","_","defaultResolveRowActionResource","fromRow","toWorkbenchRow","mergeParams","Object","assign","filter","asParams","hasCommandParameters","keys","CREATE_FIELD_TYPES","toCreateField","descriptor","optional","placeholder","required","defaultValue","multiple","accept","toCreateFields","entries","createRow","flatMap","field","createKanbanRendererSlot","kanbanRendererId","executeKanbanRendererCommand","getPrimaryResource","kanbanRendererRowActionCommandId","registerRowActionCommands","getCommand","registerCommand","execute","args","executionContext","runDefaultRowAction","commandPalette","requestParams","createBoardActionIcon","BoardActionIcon","toWorkbenchBoardColumnConfig","canDragIn","canDragOut","canCreate","actions","createRowActionIcon","toCreateRowConfig","submitLabel","fields","labels","cancel","properties","submitError","removeFile","toRowClick","resolveRowResource","onRowClick","toCreateRowHandler","runMutation","submission","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","toRowContextMenuActions","resolveRowActionResource","runDefault","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","resolveLabel","decorateAttribute","afterMutation","onAfterMutation","columnConfigs","rowResource","registerKanbanRenderer","defaultSettings","defaultFilters","defaultViews","defaultActiveViewId","hideToolbar","getBoardColumnConfig","groupKey","state","settings","filters","boardColumnConfigs","onAttributeChange","updateAttributeCommandId","attributeId","onReorder","reorderCommandId","beforeRowId","onCreateRow","onColumnAction","columnActionCommandId","actionId","getRowContextMenuActions","localizeParamSchema","fromEntries","treeViewsFor","resolveTreeView","ctx","viewId","resolveHostTreeHeaderNodes","getHostTreeHeaderNodes","treeViews","hostTreeHeader","resolveHostTreeFooterNodes","getHostTreeFooterNodes","hostTreeFooter","registerTreeViewWidget","treeId","createQueryParams","node","getTreeState","executeCallback","executeTreeActionCommand","toActionParams","createTreeMapper","originalNodes","runnerCommandId","mapEmptyState","section","emptyState","mapTarget","nodeId","mapAction","disabled","mapNode","mapped","iconColor","iconTooltip","rowVariant","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","mapNodes","nodes","mapSections","sections","isTreeSectionArray","every","isTreeNodeArray","selectedNodeIdFromSections","selected","registerTree","mapper","commandDisposable","rawArgs","setSelectedNode","renderer","listFileRenderers","refreshFileRenderer","treeDisposable","registerTreeRenderer","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","getBody","bodyCommandId","selectedNodeId","getFooter","hostFooter","footerCommandId","getChildren","childrenCommandId","originalNode","registerWorkbenchExtensionTreeRenderers","createExtensionWebviewHostCapabilities","slotKind","files","upload","list","routeResource","routeResourceKind","extensionRouteId","path","routeFromResource","registerWorkbenchExtensionRoutes","getKind","registerKind","registerPresenter","canOpen","openInput","openPanel","strategy","treeTargetRegions","resolveWorkbenchTreeRegion","targetForTreeAction","href","registerWorkbenchExtensionTreeItems","targets","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","scrollBehavior","contentHeight","registerSettings","sectionId","settingsSectionId","getSection","registerSection","settingsSectionTitle","setting","enum","registerSchema","registerResourcePresenters","surface","instances","_instance","openModePanel","entry","pinned","openModeResource","activateModeLayout","mode","registerModes","registerMode","seed","registerWorkbenchExtensionContributions","treeQueryCommandIds","kanbanRendererQueryCommandIds","dataTableRendererQueryCommandIds","findOpenPlacement","listPanelInstances","restoreActiveWidget","activatePanel","shouldRefreshWorkbenchExtensionTrees","shouldRefreshWorkbenchExtensionKanbanRenderers","shouldRefreshWorkbenchExtensionDataTableRenderers","refreshOpenWorkbenchExtensionWebviews","activeWidgetId","getLayout","refreshWorkbenchExtensionContributions","refreshKanbanRenderer","refreshDataTableRenderer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extensions.js","sources":["../../pstdio-extensions/src/bridge/contract/capabilities.ts","../../pstdio-extensions/src/bridge/normalize-error.ts","../../pstdio-extensions/src/bridge/host/theme.ts","../../pstdio-extensions/src/bridge/host/extension-frame.tsx","../../pstdio-extensions/src/bridge/host/host-event-publisher.ts","../src/extensions/bridge/terminal-session-capability.ts","../src/extensions/bridge/webview-host-capabilities.ts","../src/extensions/bridge/bridge-webview-renderer.tsx","../../pstdio-api-contracts/src/extension-kernel/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/contributions/command-palette-resource-contributions.ts","../src/extensions/bridge/webview-contribution-config.ts","../src/extensions/contributions/panel-contributions.ts","../src/extensions/contributions/controls-renderer-contributions.ts","../src/extensions/contributions/data-table-renderer-contributions.ts","../src/extensions/contributions/extension-contributions.ts","../src/extensions/contributions/file-renderer-contributions.ts","../src/extensions/contributions/kanban-renderer-contribution-helpers.ts","../src/extensions/contributions/kanban-renderer-contributions.ts","../src/extensions/contributions/param-schema-localization.ts","../src/extensions/contributions/tree-renderer-host-defaults.ts","../src/extensions/contributions/tree-renderer-panels.ts","../src/extensions/contributions/tree-renderer-contributions.ts","../src/extensions/bridge/webview-command-capabilities.ts","../src/extensions/contributions/route-contributions.ts","../src/extensions/shared/workbench-targets.ts","../src/extensions/contributions/tree-item-contributions.ts","../src/extensions/host/workbench-extension-host.ts","../src/extensions/host/workbench-extension-refresh.ts"],"sourcesContent":["import type { HostCapabilityRequest } from \"./index\";\n\nexport const WEBVIEW_HOST_CAPABILITY_VERSION = 1;\n\n// Capabilities a webview must declare in its manifest before the bridge will route them.\nexport const WEBVIEW_DECLARABLE_CAPABILITIES = [\n \"commands.execute\",\n \"resource.open\",\n \"notification.show\",\n \"notification.action\",\n \"notification.resolve\",\n \"notification.dismiss\",\n \"preferences.get\",\n \"preferences.set\",\n \"extension.settings.all\",\n \"extension.settings.get\",\n \"extension.settings.set\",\n \"extension.settings.delete\",\n \"terminal.session\",\n \"files.upload\",\n \"files.list\",\n \"files.delete\",\n] as const;\n\n// Runtime plumbing the guest invokes on its own (e.g. keyboard forwarding). These are\n// enabled whenever the host implements them, with no manifest declaration required.\nexport const ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES = [\"host.dispatchKeyboardEvent\"] as const;\n\nexport const WEBVIEW_HOST_CAPABILITIES = [\n ...WEBVIEW_DECLARABLE_CAPABILITIES,\n ...ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES,\n] as const;\n\nexport type WebviewHostCapability = (typeof WEBVIEW_HOST_CAPABILITIES)[number];\nexport type WebviewDeclarableCapability = (typeof WEBVIEW_DECLARABLE_CAPABILITIES)[number];\n\nexport type WebviewCapabilityDiagnosticCode =\n | \"undeclared_webview_capability\"\n | \"unsupported_webview_capability\"\n | \"unsupported_webview_capability_version\";\n\nexport interface WebviewCapabilityDiagnostic {\n capability: string;\n code: WebviewCapabilityDiagnosticCode;\n message: string;\n severity: \"error\";\n}\n\nexport type HostCapability<TParams = unknown, TResult = unknown> = (params: TParams) => Promise<TResult> | TResult;\nexport type HostCapabilityRegistry = Partial<Record<WebviewHostCapability, HostCapability>>;\n\ninterface CreateHostCapabilityGateInput {\n capabilities: HostCapabilityRegistry;\n declaredCapabilities?: readonly string[];\n onDiagnostic?: (diagnostic: WebviewCapabilityDiagnostic) => void;\n}\n\nconst publicCapabilityNames = new Set<string>(WEBVIEW_HOST_CAPABILITIES);\n\nconst isPublicCapability = (name: string): name is WebviewHostCapability => publicCapabilityNames.has(name);\n\nconst parseCapabilityDeclaration = (capability: string) => {\n const [name, versionText] = capability.split(\"@\");\n const version = versionText === undefined ? WEBVIEW_HOST_CAPABILITY_VERSION : Number(versionText);\n\n return { capability, name: name ?? \"\", version };\n};\n\nconst unsupportedCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability\",\n message: `Unsupported webview capability: ${capability}`,\n severity: \"error\",\n});\n\nconst unsupportedVersion = (capability: string, name: string, version: number): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"unsupported_webview_capability_version\",\n message: `Unsupported webview capability version: ${name}@${version.toString()} (supported: ${WEBVIEW_HOST_CAPABILITY_VERSION.toString()})`,\n severity: \"error\",\n});\n\nconst undeclaredCapability = (capability: string): WebviewCapabilityDiagnostic => ({\n capability,\n code: \"undeclared_webview_capability\",\n message: `Webview did not declare host capability: ${capability}`,\n severity: \"error\",\n});\n\nexport const validateWebviewCapabilityDeclarations = (\n declaredCapabilities: readonly string[] | undefined,\n capabilities: HostCapabilityRegistry = {},\n) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n const allowed = new Set<WebviewHostCapability>();\n\n // Always-available capabilities never need a declaration — enable them wherever the\n // host implements them.\n for (const name of ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES) {\n if (capabilities[name]) allowed.add(name);\n }\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n continue;\n }\n if (!capabilities[parsed.name]) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n allowed.add(parsed.name);\n }\n\n return { allowed, diagnostics };\n};\n\nexport const validateWebviewCapabilityNames = (declaredCapabilities: readonly string[] | undefined) => {\n const diagnostics: WebviewCapabilityDiagnostic[] = [];\n\n for (const declaration of declaredCapabilities ?? []) {\n const parsed = parseCapabilityDeclaration(declaration);\n if (!isPublicCapability(parsed.name)) {\n diagnostics.push(unsupportedCapability(declaration));\n continue;\n }\n if (parsed.version !== WEBVIEW_HOST_CAPABILITY_VERSION) {\n diagnostics.push(unsupportedVersion(declaration, parsed.name, parsed.version));\n }\n }\n\n return diagnostics;\n};\n\nexport const createHostCapabilityGate = (input: CreateHostCapabilityGateInput) => {\n const { allowed, diagnostics } = validateWebviewCapabilityDeclarations(\n input.declaredCapabilities,\n input.capabilities,\n );\n\n const emit = (diagnostic: WebviewCapabilityDiagnostic) => {\n input.onDiagnostic?.(diagnostic);\n };\n\n return {\n diagnostics,\n\n async call(request: HostCapabilityRequest) {\n if (!isPublicCapability(request.method)) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n if (!allowed.has(request.method)) {\n const diagnostic = undeclaredCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n const handler = input.capabilities[request.method];\n if (!handler) {\n const diagnostic = unsupportedCapability(request.method);\n emit(diagnostic);\n throw new Error(diagnostic.message);\n }\n\n return await handler(request.params);\n },\n };\n};\n","import type { RuntimeErrorPayload } from \"./contract\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\nconst safeStringify = (value: unknown) => {\n try {\n const json = JSON.stringify(value);\n if (typeof json === \"string\" && json.length > 0) return json;\n } catch {\n // Circular or non-serializable — fall through.\n }\n try {\n return String(value);\n } catch {\n return \"Unknown error\";\n }\n};\n\nexport const normalizeRuntimeError = (value: unknown): RuntimeErrorPayload => {\n if (value instanceof Error) return { message: value.message, stack: value.stack };\n\n if (typeof value === \"string\") return { message: value };\n\n if (isRecord(value)) {\n const message = typeof value.message === \"string\" ? value.message : null;\n const stack = typeof value.stack === \"string\" ? value.stack : undefined;\n if (message) return stack ? { message, stack } : { message };\n return { message: safeStringify(value) };\n }\n\n if (value === null || value === undefined) return { message: \"Unknown error\" };\n\n return { message: safeStringify(value) };\n};\n","import type { ThemePreference } from \"../contract\";\n\nexport const collectChakraThemeVariables = () => {\n if (typeof document === \"undefined\") return {};\n\n const computed = getComputedStyle(document.documentElement);\n const variables: Record<string, string> = {};\n for (let index = 0; index < computed.length; index += 1) {\n const name = computed.item(index);\n if (name.startsWith(\"--chakra-\")) {\n variables[name] = computed.getPropertyValue(name).trim();\n }\n }\n return variables;\n};\n\nexport const resolveActiveTheme = (fallback: ThemePreference): ThemePreference => {\n if (typeof document === \"undefined\") return fallback;\n const value = document.documentElement.getAttribute(\"data-theme\");\n if (value === \"dark\" || value === \"light\") return value;\n\n const colorMode = document.documentElement.getAttribute(\"data-color-mode\");\n return colorMode === \"dark\" || colorMode === \"light\" ? colorMode : fallback;\n};\n\nexport const postThemeToFrame = (\n iframe: HTMLIFrameElement | null,\n theme: ThemePreference,\n variables: Record<string, string>,\n) => {\n iframe?.contentWindow?.postMessage({ type: \"pstdio.theme\", theme, variables }, \"*\");\n};\n","import { type CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { host } from \"rimless\";\nimport type {\n ExtensionViewDescriptor,\n HostCapabilityRegistry,\n HostCapabilityRequest,\n HostEventMessage,\n ThemePreference,\n WebviewCapabilityDiagnostic,\n} from \"../contract\";\nimport { createHostCapabilityGate } from \"../contract\";\nimport { normalizeRuntimeError } from \"../normalize-error\";\nimport type { HostEventPublisher } from \"./host-event-publisher\";\nimport { collectChakraThemeVariables, resolveActiveTheme } from \"./theme\";\n\nexport interface ExtensionFrameProps {\n view: ExtensionViewDescriptor;\n props: unknown;\n theme: ThemePreference;\n capabilities?: HostCapabilityRegistry;\n /** Publisher whose emitted events are forwarded into the guest once connected. */\n hostEvents?: HostEventPublisher;\n onReady?: () => void;\n onError?: (error: { message: string; stack?: string }) => void;\n onDiagnostics?: (diagnostics: WebviewCapabilityDiagnostic[]) => void;\n title?: string;\n}\n\ntype GuestRemote = {\n init: (message: {\n moduleUrl: string;\n styles: string[];\n props: unknown;\n theme: ThemePreference;\n themeVariables: Record<string, string>;\n }) => Promise<void>;\n themeUpdate: (message: { theme: ThemePreference; variables: Record<string, string> }) => void;\n propsUpdate: (message: { props: unknown }) => void;\n hostEvent?: (message: HostEventMessage) => void;\n};\n\nconst iframeStyle: CSSProperties = {\n border: 0,\n display: \"block\",\n flex: \"1 1 0%\",\n height: \"100%\",\n minHeight: 0,\n width: \"100%\",\n};\n\nconst frameShellStyle: CSSProperties = {\n display: \"flex\",\n height: \"100%\",\n minHeight: 0,\n position: \"relative\",\n width: \"100%\",\n};\n\nconst errorOverlayStyle: CSSProperties = {\n alignItems: \"center\",\n background: \"rgba(255, 255, 255, 0.92)\",\n color: \"#7a1f12\",\n display: \"flex\",\n inset: 0,\n justifyContent: \"center\",\n padding: \"24px\",\n position: \"absolute\",\n textAlign: \"center\",\n zIndex: 1,\n};\n\nexport const EXTENSION_IFRAME_SANDBOX = \"allow-scripts allow-forms allow-popups\";\n\nexport const ExtensionFrame = (props: ExtensionFrameProps) => {\n const {\n view,\n props: extensionProps,\n theme,\n capabilities,\n hostEvents,\n onReady,\n onError,\n onDiagnostics,\n title,\n } = props;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const remoteRef = useRef<GuestRemote | null>(null);\n const initializedRef = useRef(false);\n const connectedKeyRef = useRef<string | null>(null);\n const propsRef = useRef(extensionProps);\n const themeRef = useRef(theme);\n const capabilitiesRef = useRef(capabilities);\n const hostEventsRef = useRef(hostEvents);\n const declaredCapabilitiesRef = useRef(view.webview.capabilities);\n const onReadyRef = useRef(onReady);\n const onErrorRef = useRef(onError);\n const onDiagnosticsRef = useRef(onDiagnostics);\n const [runtimeError, setRuntimeError] = useState<string | null>(null);\n\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 const connectedKey = `${view.webview.runtimeUrl}\\n${view.webview.moduleUrl}`;\n if (connectedKeyRef.current === connectedKey) return;\n connectedKeyRef.current = connectedKey;\n\n initializedRef.current = false;\n remoteRef.current = null;\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 connection = host.connect(iframe, hostApi);\n // A sandboxed iframe without allow-same-origin posts messages with origin \"null\".\n // Leaving the iframe src attribute empty lets rimless validate the guest by\n // contentWindow identity while still loading the API-owned runtime document.\n iframe.contentWindow?.location.replace(view.webview.runtimeUrl);\n\n connection\n .then(async (conn) => {\n const remote = conn.remote as GuestRemote;\n remoteRef.current = remote;\n hostEventsRef.current?.bind((message) => remote.hostEvent?.(message));\n\n await remote.init({\n moduleUrl: moduleUrlAtConnect,\n styles: stylesAtConnect,\n props: propsRef.current,\n theme: resolveActiveTheme(themeRef.current),\n themeVariables: collectChakraThemeVariables(),\n });\n initializedRef.current = true;\n setRuntimeError(null);\n onReadyRef.current?.();\n })\n .catch((error) => {\n const normalized = normalizeRuntimeError(error);\n setRuntimeError(normalized.message);\n onErrorRef.current?.(normalized);\n });\n\n // 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 () => {\n // No-op. We deliberately keep the live connection.\n };\n }, [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 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 { OpenResourceInput, 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 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?: OpenResourceInput; resource?: ResourceRef };\n if (!request.resource) throw new Error(\"resource.open requires a resource.\");\n return input.workbench.resources.openResource(request.resource, 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 kind: resource.type,\n uri: `pstdio://extension-resource/${encodeURIComponent(resource.type)}/${encodeURIComponent(resource.id)}`,\n id: resource.id,\n label: resource.label,\n metadata: resource.metadata,\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 { WorkbenchExtensionCommandPaletteResourceRecord } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { CommandPaletteResourceResult, Disposable } from \"../../core\";\nimport type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n executeWorkbenchExtensionCommand,\n toExtensionCommandResource,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\n\n// Transport-safe shapes returned by an extension queryCommand.\ninterface ResourceItemTarget {\n kind: \"command\" | \"resource\";\n command?: string | { id: string };\n params?: Record<string, unknown>;\n resource?: Parameters<typeof toWorkbenchResource>[0];\n}\n\ninterface ResourceItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n keywords?: string[];\n target: ResourceItemTarget;\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: ResourceItemTarget[\"command\"]) => (typeof command === \"string\" ? command : command?.id);\n\nconst activateTarget = async (context: WorkbenchExtensionCommandContext, target: ResourceItemTarget) => {\n if (target.kind === \"resource\" && target.resource) {\n await context.workbench.resources\n .openResource(toWorkbenchResource(target.resource), { replaceActive: true })\n .catch(() => undefined);\n return;\n }\n\n const commandId = commandIdOf(target.command);\n if (!commandId) return;\n await executeWorkbenchExtensionCommand(context, commandId, { 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};\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, item.target),\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 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 ExtensionPanelMenu = NonNullable<WorkbenchExtensionMetadata[\"panels\"][number][\"panelMenus\"]>[number];\n\nexport interface RegisterWorkbenchExtensionPanelInput {\n contribution: WorkbenchPanelContribution;\n workbench: WorkbenchModuleContext;\n}\n\nexport const toWorkbenchPanelEligibility = (eligibility?: { resourceKinds?: readonly string[] }) =>\n eligibility\n ? {\n resourceKinds: eligibility.resourceKinds ? [...eligibility.resourceKinds] : undefined,\n }\n : undefined;\n\nconst panelMenuRendererId = (menu: ExtensionPanelMenu) => {\n const rendererId =\n menu.treeRendererId ??\n menu.fileRendererId ??\n menu.controlsRendererId ??\n menu.dataTableRendererId ??\n (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\nexport const toWorkbenchPanelMenus = (\n menus: readonly ExtensionPanelMenu[] | undefined,\n): WorkbenchPanelMenuDefinition[] | undefined =>\n menus?.map((menu) => ({\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 }));\n\nexport const registerWorkbenchExtensionPanel = (input: RegisterWorkbenchExtensionPanelInput): Disposable =>\n input.workbench.layout.registerPanel(input.contribution);\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 { executeWorkbenchExtensionCommand } from \"../host/workbench-extension-command\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\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 run = (commandId: string | undefined, params: Record<string, unknown>, resource?: ResourceRef) =>\n commandId ? executeWorkbenchExtensionCommand(context, commandId, { params, resource }) : 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.queryCommandId, {}, resource ?? adapter.resolveResource?.(record));\n return isQueryResult(value) ? value : {};\n },\n updateValue: record.updateValueCommandId\n ? ({ controlId, value, values, resource }) =>\n run(record.updateValueCommandId, { controlId, value, values }, resource).then(() => undefined)\n : undefined,\n apply: record.applyCommandId\n ? ({ values, resource }) => run(record.applyCommandId, { values }, resource).then(() => undefined)\n : undefined,\n reset: record.resetCommandId\n ? ({ controlIds, resource }) => run(record.resetCommandId, { 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 = (context: WorkbenchExtensionCommandContext, panel: ControlsViewRecord) => {\n if (!panel.controlsRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.controlsRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\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): Disposable => {\n const disposables: Disposable[] = [];\n\n for (const record of records) disposables.push(registerControlsRenderer(context, record, adapter));\n for (const panel of panels) {\n const disposable = registerControlsViewWidget(context, panel);\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 type { WorkbenchExtensionCommandContext } from \"../host/workbench-extension-command\";\nimport {\n createExtensionSlot,\n executeWorkbenchExtensionCommand,\n toWorkbenchResource,\n} from \"../host/workbench-extension-command\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\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 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) =>\n executeWorkbenchExtensionCommand(context, commandId, {\n params,\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(\n record.queryCommandId,\n {\n rendererId: record.id,\n projectId: context.projectId,\n modeId,\n resource: resource\n ? {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n }\n : undefined,\n },\n resource,\n );\n if (!isQueryResult(value)) return { rows: [] };\n return {\n rows: value.rows.map(toRow),\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: (row) => run(action.commandId, { rowId: row.id }, row.resource).then(() => undefined),\n })),\n });\n};\n\nconst registerView = (context: WorkbenchExtensionCommandContext, panel: DataTableViewRecord) => {\n if (!panel.dataTableRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: context.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.dataTableRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\n },\n });\n};\n\nexport const registerWorkbenchExtensionDataTableRenderers = (\n context: WorkbenchExtensionCommandContext,\n records: WorkbenchExtensionDataTableRendererRecord[],\n panels: DataTableViewRecord[],\n): Disposable => {\n const disposables: Disposable[] = records.map((record) => registerRenderer(context, record));\n for (const panel of panels) {\n const disposable = registerView(context, panel);\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 navigation: [],\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 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 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, WorkbenchExtensionMetadata } from \"@pstdio/sdk/api\";\nimport { text } from \"pstdio-extensions/workbench\";\nimport type { Disposable, FileRendererContent, ResourceRef, WorkbenchModuleContext } from \"../../core\";\nimport { unwrapCommandValue } from \"../host/command-response\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\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) => {\n const ext = toExtensionResource(resource);\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params: { projectId: input.projectId, resource: ext, ...extra },\n resource: ext,\n slot: slotContext({ projectId: input.projectId, rendererId, resource: ext }),\n source: \"dashboard\",\n });\n return unwrapCommandValue(result);\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.loadCommandId, resource);\n return (result ?? {}) as FileRendererContent;\n },\n save: record.saveCommandId\n ? async (resource, content) => {\n await executeFileCommand(input, record.id, record.saveCommandId as string, resource, { content });\n }\n : undefined,\n });\n\nconst registerFileViewWidget = (input: RegisterWorkbenchExtensionFileRenderersInput, panel: ViewRecord) => {\n if (!panel.fileRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.fileRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\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 for (const panel of input.metadata.panels) {\n const disposable = registerFileViewWidget(input, panel);\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 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 executeWorkbenchExtensionCommand(context, commandId, {\n params,\n resource: resource ?? context.workbench.getPrimaryResource(),\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}`;\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 { WorkbenchExtensionKanbanRendererRecord } 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 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\";\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 /** 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 record: WorkbenchExtensionKanbanRendererRecord,\n adapter: WorkbenchExtensionKanbanRendererAdapter,\n resolveRowResource: (\n record: WorkbenchExtensionKanbanRendererRecord,\n row: KanbanRendererRow,\n ) => ResourceRef | undefined,\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) => {\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 let columnConfigs: ColumnConfigRecord | undefined;\n const rowResource = (row: KanbanRendererRow) => resolveRowResource(record, 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 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 onRowClick: toRowClick(record, adapter, resolveRowResource),\n executeQuery: async (state: KanbanRendererQueryState) => {\n const value = await executeKanbanRendererCommand(context, record, record.queryCommandId, {\n settings: state.settings,\n filters: state.filters,\n });\n if (Array.isArray(value)) return value.map((row) => toWorkbenchRow(row, rowResource));\n if (!isQueryResult(value)) return [];\n attributes.set(value.attributes);\n columnConfigs = value.boardColumnConfigs;\n return (value.rows ?? []).map((row) => toWorkbenchRow(row, rowResource));\n },\n onAttributeChange: record.updateAttributeCommandId\n ? (rowId, attributeId, value) =>\n runMutation(record, record.updateAttributeCommandId!, {\n rowId,\n attributeId,\n value,\n }).then(() => undefined)\n : undefined,\n onReorder: record.reorderCommandId\n ? (rowId, beforeRowId) =>\n runMutation(record, record.reorderCommandId!, { rowId, beforeRowId }).then(() => undefined)\n : undefined,\n onCreateRow: toCreateRowHandler(record, adapter, runMutation),\n onColumnAction: record.columnActionCommandId\n ? async (columnId, actionId) => {\n await runMutation(record, record.columnActionCommandId!, { columnId, actionId });\n }\n : undefined,\n getRowContextMenuActions: toRowContextMenuActions(context, record, adapter, localize, resolveRowActionResource),\n }),\n );\n\n disposables.push(\n context.workbench.layout.registerPanel({\n closable: false,\n id: record.id,\n title: localize(record.title, record.id),\n region: \"main\",\n rendererId: record.id,\n singleton: true,\n resourceKinds: record.resourceKind ? [record.resourceKind] : undefined,\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.treeRendererId === record.id);\n\nconst resolveTreeView = (panels: ExtensionTreeViewRecord[], ctx: TreeContext) => {\n if (ctx.viewId) return panels.find((panel) => panel.id === ctx.viewId);\n return panels.length === 1 ? panels[0] : undefined;\n};\n\nexport const resolveHostTreeHeaderNodes = async (input: ResolveHostTreeHeaderInput) => {\n const { ctx, getHostTreeHeaderNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeHeader\" in panel) || panel.hostTreeHeader !== \"default\") return [];\n return (await getHostTreeHeaderNodes?.({ ctx, record, panel })) ?? [];\n};\n\nexport const resolveHostTreeFooterNodes = async (input: ResolveHostTreeFooterInput) => {\n const { ctx, getHostTreeFooterNodes, record, treeViews } = input;\n const panel = resolveTreeView(treeViews, ctx);\n if (!panel || !(\"hostTreeFooter\" in panel) || panel.hostTreeFooter !== \"default\") return [];\n return (await getHostTreeFooterNodes?.({ ctx, record, panel })) ?? [];\n};\n","import { text } from \"pstdio-extensions/workbench\";\nimport type { WorkbenchModuleContext } from \"../../core\";\nimport {\n registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\n} from \"./panel-contributions\";\nimport type { ExtensionTreePanelRecord } from \"./tree-renderer-contribution-types\";\n\ninterface RegisterTreeViewWidgetInput {\n workbench: WorkbenchModuleContext;\n}\n\nexport const registerTreeViewWidget = (input: RegisterTreeViewWidgetInput, panel: ExtensionTreePanelRecord) => {\n if (!panel.treeRendererId) return undefined;\n return registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: panel.treeRendererId,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\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 { unwrapCommandValue } from \"../host/command-response\";\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 workbench: WorkbenchModuleContext;\n}\n\nconst toExtensionResource = (resource: ResourceRef | undefined): ExtensionTreeResource | undefined => {\n if (!resource) return undefined;\n return {\n type: resource.kind,\n id: resource.id ?? resource.uri,\n label: resource.label,\n metadata: resource.metadata,\n };\n};\n\nconst toWorkbenchResource = (resource: ExtensionTreeResource): 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: 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 return {\n projectId: input.projectId,\n modeId: input.workbench.modes.getActiveModeId(),\n resource,\n treeId: record.id,\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 commandId: string,\n params: Record<string, unknown>,\n) => {\n const resource = params.resource as ExtensionTreeResource | undefined;\n const result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n params,\n resource,\n slot: slotContext({\n modeId: params.modeId as string | undefined,\n projectId: input.projectId,\n resource,\n treeId: params.treeId as string,\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 result = await input.executeCommand(commandId, {\n projectId: input.projectId,\n ...(params ? { params } : {}),\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 createTreeMapper = (input: RegisterWorkbenchExtensionTreeRenderersInput, record: ExtensionTreeRendererRecord) => {\n const originalNodes = new WeakMap<TreeNode, ExtensionTreeNode>();\n const runnerCommandId = `workbench.extensionTreeRenderer.${record.id}.command`;\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 if (target.kind === \"resource\" && target.resource) {\n return { kind: \"resource\", resource: toWorkbenchResource(target.resource), input: { replaceActive: true } };\n }\n if (target.kind === \"panel\" && target.panelId) return { kind: \"panel\", panelId: target.panelId };\n if (target.kind !== \"command\" || !target.commandId) return undefined;\n return {\n kind: \"command\",\n commandId: runnerCommandId,\n args: {\n commandId: target.commandId,\n nodeId: node.id,\n params: target.args,\n resource: node.resource ?? toExtensionResource(ctx.resource),\n treeId: record.id,\n } satisfies TargetCommandArgs,\n };\n };\n\n const mapAction = (\n action: ExtensionTreeAction,\n node: ExtensionTreeNode | undefined,\n ctx: TreeContext,\n ): TreeAction => {\n const commandId = action.commandId;\n return {\n id: action.id,\n label: text(action.label),\n icon: action.icon,\n args: action.args,\n params: localizeParamSchema(action.params, 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, action.args),\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 ? toWorkbenchResource(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 selectedNodeIdFromSections = (sections: ExtensionTreeSection[]): string | undefined => {\n for (const section of sections) {\n for (const node of section.nodes) {\n if (node.selected) return node.id;\n }\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 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.bodyCommandId, 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.footerCommandId) return hostFooter;\n const result = await executeCallback(input, record.footerCommandId, createQueryParams(input, record, ctx));\n const extensionFooter = isTreeNodeArray(result) ? mapper.mapNodes(result, ctx) : [];\n return [...extensionFooter, ...hostFooter];\n },\n getChildren: async (node, ctx) => {\n if (!record.childrenCommandId) return node.children ?? [];\n const originalNode = mapper.originalNodes.get(node) ?? (node as unknown as ExtensionTreeNode);\n const result = await executeCallback(\n input,\n record.childrenCommandId,\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 for (const panel of input.metadata.panels) {\n const disposable = registerTreeViewWidget(input, panel);\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 { HostCapabilityRegistry } from \"pstdio-extensions/bridge/contract\";\nimport type { OpenResourceInput } from \"../../core\";\nimport {\n createExtensionSlot,\n toExtensionCommandResource,\n toWorkbenchResource,\n} 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\"];\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?: OpenResourceInput;\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(toWorkbenchResource(request.resource), request.input);\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 closable: false,\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: \"activate-or-open\" },\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 === \"kanbanRenderer\") return { kind: \"panel\", panelId: item.action.kanbanRendererId };\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 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 closable: false,\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 WorkbenchCommandExecutionContext,\n WorkbenchModeActivationContext,\n WorkbenchModuleContext,\n} from \"../../core\";\nimport { workbenchCommandPaletteMenuPath } 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 { 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 registerWorkbenchExtensionPanel,\n toWorkbenchPanelEligibility,\n toWorkbenchPanelMenus,\n} from \"../contributions/panel-contributions\";\nimport { registerWorkbenchExtensionRoutes, routeResource } 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 input.metadata.panels.flatMap((panel) => {\n if (!panel.webview) return [];\n return [\n registerWorkbenchExtensionPanel({\n workbench: input.workbench,\n contribution: {\n id: panel.id,\n title: text(panel.title, panel.id),\n region: panel.region,\n closable: panel.closable,\n rendererId: BRIDGE_WEBVIEW_RENDERER_ID,\n singleton: true,\n resourceKinds: panel.resourceKind ? [panel.resourceKind] : undefined,\n eligibleLocations: toWorkbenchPanelEligibility(panel.eligibleLocations),\n panelMenus: toWorkbenchPanelMenus(panel.panelMenus),\n config: {\n ...toBridgeWebviewConfig(panel.webview),\n ...(panel.region === \"overlay\"\n ? { size: \"lg\", scrollBehavior: \"inside\", contentHeight: \"min(560px, calc(100dvh - 48px))\" }\n : {}),\n },\n },\n }),\n ];\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\nconst registerResourcePresenters = (input: RegisterWorkbenchExtensionContributionsInput) => {\n const resourceKinds = new Set<string>();\n for (const panel of input.metadata.panels) if (panel.resourceKind) resourceKinds.add(panel.resourceKind);\n for (const renderer of input.metadata.kanbanRenderers ?? [])\n if (renderer.resourceKind) resourceKinds.add(renderer.resourceKind);\n\n const disposables: Disposable[] = [];\n for (const kind of resourceKinds) {\n if (!input.workbench.resources.getKind(kind)) {\n disposables.push(\n input.workbench.resources.registerKind({ kind, label: kind, icon: \"FileText\", surface: \"primary\" }),\n );\n }\n const panels = input.metadata.panels.filter((panel) => panel.resourceKind === kind && panel.region !== \"overlay\");\n if (panels.length > 0) {\n disposables.push(\n input.workbench.resources.registerPresenter({\n id: `workbench.extension.resource.${kind}`,\n canOpen: (resource) => resource.kind === kind,\n open: (resource) => {\n const instances = panels.map((panel) =>\n input.workbench.layout.openPanel(panel.id, {\n resource,\n title: resource.label ?? resource.id ?? resource.uri,\n }),\n );\n return instances.find((_instance, index) => panels[index]?.region === \"main\") ?? instances[0]!;\n },\n }),\n );\n }\n }\n return disposables;\n};\n\ntype WorkbenchExtensionModeRecord = WorkbenchExtensionMetadata[\"modes\"][number];\ntype WorkbenchExtensionModeLayout = NonNullable<WorkbenchExtensionModeRecord[\"layout\"]>;\ntype WorkbenchExtensionModeOpenEntry = NonNullable<WorkbenchExtensionModeLayout[\"open\"]>[number];\n\nconst openModePanel = (ctx: WorkbenchModeActivationContext, entry: WorkbenchExtensionModeOpenEntry) => {\n if (!entry.panel) return;\n ctx.layout.openPanel(entry.panel, {\n region: entry.region,\n pinned: entry.pinned,\n title: text(entry.title),\n });\n};\n\nconst openModeResource = (\n input: RegisterWorkbenchExtensionContributionsInput,\n ctx: WorkbenchModeActivationContext,\n entry: WorkbenchExtensionModeOpenEntry,\n) => {\n if (!entry.resource) return;\n const route = input.metadata.routes.find(\n (candidate) => candidate.id === entry.resource || candidate.path === entry.resource,\n );\n if (!route) return;\n void ctx.resources.openResource(routeResource(route, input.routeResourceKind ?? routeResourceKindDefault));\n};\n\nconst activateModeLayout = (\n input: RegisterWorkbenchExtensionContributionsInput,\n ctx: WorkbenchModeActivationContext,\n mode: WorkbenchExtensionModeRecord,\n) => {\n for (const entry of mode.layout?.open ?? []) {\n openModePanel(ctx, entry);\n openModeResource(input, ctx, entry);\n }\n};\n\nconst registerModes = (input: RegisterWorkbenchExtensionContributionsInput) =>\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.layout?.panels,\n activate: () => undefined,\n seed: (ctx) => {\n activateModeLayout(input, ctx, mode);\n },\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(registerWorkbenchExtensionKanbanRenderers(context, input.metadata.kanbanRenderers ?? []));\n disposables.push(\n registerWorkbenchExtensionDataTableRenderers(\n context,\n input.metadata.dataTableRenderers ?? [],\n input.metadata.panels,\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(...registerResourcePresenters(input));\n disposables.push(...registerModes(input));\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 { WorkbenchModuleContext, WorkbenchPanelInstance } from \"../../core\";\n\nconst treeQueryCommandIds = (metadata: WorkbenchExtensionMetadata) =>\n new Set(\n (metadata.treeRenderers ?? []).flatMap((renderer) =>\n [renderer.bodyCommandId, renderer.childrenCommandId, renderer.footerCommandId].filter((commandId) => commandId),\n ),\n );\n\nconst kanbanRendererQueryCommandIds = (metadata: WorkbenchExtensionMetadata) =>\n new Set((metadata.kanbanRenderers ?? []).map((renderer) => renderer.queryCommandId));\n\nconst dataTableRendererQueryCommandIds = (metadata: WorkbenchExtensionMetadata) =>\n new Set((metadata.dataTableRenderers ?? []).map((renderer) => renderer.queryCommandId));\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 shouldRefreshWorkbenchExtensionTrees = (metadata: WorkbenchExtensionMetadata, commandId: string) =>\n !treeQueryCommandIds(metadata).has(commandId);\n\nexport const shouldRefreshWorkbenchExtensionKanbanRenderers = (\n metadata: WorkbenchExtensionMetadata,\n commandId: string,\n) => !kanbanRendererQueryCommandIds(metadata).has(commandId);\n\nexport const shouldRefreshWorkbenchExtensionDataTableRenderers = (\n metadata: WorkbenchExtensionMetadata,\n commandId: string,\n) => !dataTableRendererQueryCommandIds(metadata).has(commandId);\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 || panel.region === \"overlay\") 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 });\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 });\n }\n\n restoreActiveWidget(workbench, activeWidgetId);\n};\n\nexport const refreshWorkbenchExtensionContributions = (\n workbench: WorkbenchModuleContext,\n metadata: WorkbenchExtensionMetadata,\n commandId: string,\n) => {\n refreshOpenWorkbenchExtensionWebviews(workbench, metadata);\n\n if (shouldRefreshWorkbenchExtensionTrees(metadata, commandId)) {\n for (const renderer of metadata.treeRenderers ?? []) workbench.renderers.refresh(renderer.id);\n }\n\n if (shouldRefreshWorkbenchExtensionKanbanRenderers(metadata, commandId)) {\n for (const renderer of metadata.kanbanRenderers ?? []) workbench.renderers.refreshKanbanRenderer(renderer.id);\n }\n\n if (shouldRefreshWorkbenchExtensionDataTableRenderers(metadata, commandId)) {\n for (const renderer of metadata.dataTableRenderers ?? []) {\n workbench.renderers.refreshDataTableRenderer(renderer.id);\n }\n }\n};\n"],"names":["WEBVIEW_HOST_CAPABILITY_VERSION","WEBVIEW_DECLARABLE_CAPABILITIES","ALWAYS_AVAILABLE_WEBVIEW_CAPABILITIES","WEBVIEW_HOST_CAPABILITIES","publicCapabilityNames","Set","isPublicCapability","name","has","parseCapabilityDeclaration","capability","versionText","split","version","undefined","Number","unsupportedCapability","code","message","severity","unsupportedVersion","toString","undeclaredCapability","validateWebviewCapabilityDeclarations","declaredCapabilities","capabilities","diagnostics","allowed","add","declaration","parsed","push","createHostCapabilityGate","input","emit","diagnostic","onDiagnostic","call","request","method","Error","handler","params","isRecord","value","safeStringify","json","JSON","stringify","length","String","normalizeRuntimeError","stack","collectChakraThemeVariables","document","computed","getComputedStyle","documentElement","variables","index","item","startsWith","getPropertyValue","trim","resolveActiveTheme","fallback","getAttribute","colorMode","iframeStyle","border","display","flex","height","minHeight","width","frameShellStyle","position","errorOverlayStyle","alignItems","background","color","inset","justifyContent","padding","textAlign","zIndex","EXTENSION_IFRAME_SANDBOX","ExtensionFrame","props","view","extensionProps","theme","hostEvents","onReady","onError","onDiagnostics","title","iframeRef","useRef","remoteRef","initializedRef","connectedKeyRef","propsRef","themeRef","capabilitiesRef","hostEventsRef","declaredCapabilitiesRef","webview","onReadyRef","onErrorRef","onDiagnosticsRef","runtimeError","setRuntimeError","useState","current","useEffect","iframe","connectedKey","runtimeUrl","moduleUrl","stylesAtConnect","styles","moduleUrlAtConnect","reportDiagnostics","createCapabilityGate","hostApi","ready","payload","connection","host","connect","contentWindow","location","replace","then","conn","remote","bind","hostEvent","init","themeVariables","catch","error","normalized","unbind","propsUpdate","themeUpdate","window","MutationObserver","frame","schedule","cancelAnimationFrame","requestAnimationFrame","observer","options","attributeFilter","attributes","observe","body","disconnect","jsxs","jsx","label","colorScheme","createHostEventPublisher","sink","pending","disconnectListeners","next","shift","onDisconnect","listener","delete","TERMINAL_SESSION_EVENT_SCOPE","createTerminalSessionCapability","terminal","scope","operation","sessionId","open","write","data","accepted","resize","cols","rows","kill","signal","unsubscribeTerminal","unsubscribeDisconnect","closed","close","subscribe","onData","chunk","kind","onExit","exit","dispatchDocumentKeyboardEvent","event","KeyboardEvent","bubbles","cancelable","dispatchEvent","createWorkbenchWebviewHostCapabilities","commands.execute","workbench","commands","executeCommand","commandId","resource.open","resource","resources","openResource","notification.show","notification","notifications","show","level","preferences.get","preferences","getValue","preferences.set","setValue","host.dispatchKeyboardEvent","dispatchKeyboardEvent","logWebviewDiagnostics","webviewId","console","warn","logWebviewError","BRIDGE_WEBVIEW_RENDERER_ID","isBridgeWebviewConfig","Array","isArray","config","createPlacementProps","placement","createLightTheme","hostEventPublishersByWorkbench","WeakMap","getBridgeWebviewHostEventPublisher","instance","hostEventsByWidget","get","Map","set","key","instanceId","renderBridgeWebviewFrame","context","createHostCapabilities","createProps","createTheme","ownerId","extensionId","id","renderBridgeWebview","panel","panelId","createBridgeWebviewRenderer","render","renderInput","defineSlot","description","metadata","isLocalizedString","$l10n","text","default","unwrapCommandValue","result","response","outcome","status","reason","toExtensionCommandResource","type","uri","toWorkbenchResource","encodeURIComponent","createExtensionSlot","projectId","executeWorkbenchExtensionCommand","slot","source","isProviderQueryResult","commandIdOf","command","activateTarget","target","replaceActive","commandPaletteResources","refresh","toResult","record","groupLabel","icon","keywords","group","activate","registerWorkbenchExtensionCommandPaletteResources","records","disposables","registerProvider","refreshEventIds","query","limit","activeResource","getActiveResource","queryCommandId","modeId","modes","getActiveModeId","providerId","items","map","dispose","toBridgeWebviewConfig","toWorkbenchPanelEligibility","eligibility","resourceKinds","panelMenuRendererId","menu","rendererId","treeRendererId","fileRendererId","controlsRendererId","dataTableRendererId","toWorkbenchPanelMenus","menus","side","registerWorkbenchExtensionPanel","layout","registerPanel","contribution","localize","isQueryResult","Boolean","registerControlsRenderer","adapter","run","Promise","resolve","renderers","emptyTitle","emptyDescription","defaultValues","executeQuery","resolveResource","updateValue","updateValueCommandId","controlId","values","apply","applyCommandId","reset","resetCommandId","controlIds","registerControlsViewWidget","region","closable","singleton","resourceKind","eligibleLocations","panelMenus","registerWorkbenchExtensionControlsRenderers","panels","disposable","toColumn","column","createElement","WorkbenchIcon","size","toRow","row","registerRenderer","registerDataTableRenderer","columns","initialPageSize","pageSizeOptions","selectionMode","selectionActions","action","destructive","rowIds","rowActions","rowId","registerView","registerWorkbenchExtensionDataTableRenderers","placementOrder","first","last","emptyWorkbenchExtensionMetadata","commandPaletteContributions","extensions","menuContributions","navigation","routes","kanbanRenderers","dataTableRenderers","treeRenderers","fileRenderers","settingsPanels","settingsDefinitions","treeItems","defaultWorkbenchExtensionCommandId","defaultWorkbenchExtensionPaletteCommandId","contributionOrder","createMenuItem","resolveString","when","sourceCommandId","overflowLabel","order","createPaletteItem","buildWorkbenchExtensionMenuRegistrations","createCommandId","createWhenExpression","menuSlotsById","menuTargetsById","registrations","forEach","slotId","find","candidate","category","menuItem","menuPath","targetCommandId","buildWorkbenchExtensionCommandPaletteRegistrations","buildWorkbenchExtensionRouteEntries","createResource","route","toExtensionResource","slotContext","resourceType","resourceId","executeFileCommand","extra","ext","registerFileRenderer","load","loadCommandId","save","saveCommandId","content","registerFileViewWidget","registerWorkbenchExtensionFileRenderers","localizeAttributes","decorate","attribute","base","option","createMutableAttributeSource","initial","snapshot","listeners","getSnapshot","isWorkbenchResource","isExtensionResource","rowResourceUri","defaultResolveRowResource","_","defaultResolveRowActionResource","fromRow","toWorkbenchRow","mergeParams","Object","assign","filter","asParams","hasCommandParameters","keys","CREATE_FIELD_TYPES","toCreateField","descriptor","optional","placeholder","required","defaultValue","multiple","accept","toCreateFields","entries","createRow","flatMap","field","createKanbanRendererSlot","kanbanRendererId","executeKanbanRendererCommand","getPrimaryResource","kanbanRendererRowActionCommandId","registerRowActionCommands","getCommand","registerCommand","execute","args","executionContext","runDefaultRowAction","commandPalette","requestParams","createBoardActionIcon","BoardActionIcon","toWorkbenchBoardColumnConfig","canDragIn","canDragOut","canCreate","actions","createRowActionIcon","toCreateRowConfig","submitLabel","fields","labels","cancel","properties","submitError","removeFile","toRowClick","resolveRowResource","onRowClick","toCreateRowHandler","runMutation","submission","columnParam","columnId","attributesParam","attributeValues","created","onAfterCreate","toRowContextMenuActions","resolveRowActionResource","runDefault","onClick","executeRowAction","registerWorkbenchExtensionKanbanRenderers","resolveLabel","decorateAttribute","afterMutation","onAfterMutation","columnConfigs","rowResource","registerKanbanRenderer","defaultSettings","defaultFilters","defaultViews","defaultActiveViewId","hideToolbar","getBoardColumnConfig","groupKey","state","settings","filters","boardColumnConfigs","onAttributeChange","updateAttributeCommandId","attributeId","onReorder","reorderCommandId","beforeRowId","onCreateRow","onColumnAction","columnActionCommandId","actionId","getRowContextMenuActions","localizeParamSchema","fromEntries","treeViewsFor","resolveTreeView","ctx","viewId","resolveHostTreeHeaderNodes","getHostTreeHeaderNodes","treeViews","hostTreeHeader","resolveHostTreeFooterNodes","getHostTreeFooterNodes","hostTreeFooter","registerTreeViewWidget","treeId","createQueryParams","node","getTreeState","executeCallback","executeTreeActionCommand","toActionParams","createTreeMapper","originalNodes","runnerCommandId","mapEmptyState","section","emptyState","mapTarget","nodeId","mapAction","disabled","mapNode","mapped","iconColor","iconTooltip","rowVariant","contextMenuActions","collapsible","children","child","contextValue","hiddenByDefault","canHide","mapNodes","nodes","mapSections","sections","isTreeSectionArray","every","isTreeNodeArray","selectedNodeIdFromSections","selected","registerTree","mapper","commandDisposable","rawArgs","setSelectedNode","renderer","listFileRenderers","refreshFileRenderer","treeDisposable","registerTreeRenderer","defaultExpandedNodeIds","defaultExpandedSectionIds","getHeader","getBody","bodyCommandId","selectedNodeId","getFooter","hostFooter","footerCommandId","getChildren","childrenCommandId","originalNode","registerWorkbenchExtensionTreeRenderers","createExtensionWebviewHostCapabilities","slotKind","files","upload","list","routeResource","routeResourceKind","extensionRouteId","path","routeFromResource","registerWorkbenchExtensionRoutes","getKind","registerKind","registerPresenter","canOpen","openInput","openPanel","strategy","treeTargetRegions","resolveWorkbenchTreeRegion","targetForTreeAction","href","registerWorkbenchExtensionTreeItems","targets","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","scrollBehavior","contentHeight","registerSettings","sectionId","settingsSectionId","getSection","registerSection","settingsSectionTitle","setting","enum","registerSchema","registerResourcePresenters","surface","instances","_instance","openModePanel","entry","pinned","openModeResource","activateModeLayout","mode","registerModes","registerMode","seed","registerWorkbenchExtensionContributions","treeQueryCommandIds","kanbanRendererQueryCommandIds","dataTableRendererQueryCommandIds","findOpenPlacement","listPanelInstances","restoreActiveWidget","activatePanel","shouldRefreshWorkbenchExtensionTrees","shouldRefreshWorkbenchExtensionKanbanRenderers","shouldRefreshWorkbenchExtensionDataTableRenderers","refreshOpenWorkbenchExtensionWebviews","activeWidgetId","getLayout","refreshWorkbenchExtensionContributions","refreshKanbanRenderer","refreshDataTableRenderer"],"mappings":"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"}
|