@kb-labs/studio-federation 2.119.0-canary.e120bc0ee → 2.119.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/widget-loader.ts","../src/plugin-error-ui.tsx","../src/page-error-boundary.tsx","../src/page-container.tsx"],"names":["jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["import { init, loadRemote, registerRemotes } from '@module-federation/runtime';\nimport type { StudioPluginEntryV2 } from './types.js';\nimport type { ComponentType } from 'react';\nimport { devToolsStore, GenericChannel } from '@kb-labs/studio-devtools';\nimport type { MFEvent } from '@kb-labs/studio-devtools';\n/**\n * Resolve a potentially path-absolute remoteEntryUrl against the API origin.\n * Needed when the SPA is served from a different origin than the API (e.g.\n * Studio on :3000, API gateway on :4000 / api.example.com).\n *\n * Reads the API origin from the runtime config injected by server.js into\n * index.html as window.__KB_STUDIO_CONFIG__.KB_API_BASE_URL.\n *\n * - Absolute URLs (http/https) → returned as-is\n * - Root-relative paths (/plugins/...) → prefixed with the API origin\n */\nfunction resolveEntryUrl(url: string): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n if (url.startsWith('/')) {\n try {\n const cfg = (window as Window & { __KB_STUDIO_CONFIG__?: Record<string, string> }).__KB_STUDIO_CONFIG__;\n const apiBase = cfg?.KB_API_BASE_URL ?? '';\n if (apiBase) {\n return new URL(apiBase).origin + url;\n }\n } catch {\n // fall through\n }\n }\n return url;\n}\n\n/** MF events channel — registered lazily on first use */\nfunction getMFChannel(): ReturnType<typeof devToolsStore.getChannel<MFEvent>> {\n let ch = devToolsStore.getChannel<MFEvent>('mf-events');\n if (!ch) {\n ch = new GenericChannel<MFEvent>('mf-events', 'MF Events', 'ApiOutlined');\n devToolsStore.registerChannel(ch);\n }\n return ch;\n}\n\n/**\n * Last known remoteEntryUrl per remoteName.\n * Updated on init and on each loadPageComponent call (lazy, navigation-triggered).\n */\nconst knownRemotes = new Map<string, string>();\nlet mfInitialized = false;\n\n/**\n * Initialize Module Federation runtime. Called once after registry is first loaded.\n */\nexport function initFederation(plugins: StudioPluginEntryV2[]): void {\n if (mfInitialized) { return; }\n\n init({\n name: 'studioHost',\n remotes: plugins.map((plugin) => ({\n name: plugin.remoteName,\n entry: resolveEntryUrl(plugin.remoteEntryUrl),\n })),\n });\n\n mfInitialized = true;\n for (const p of plugins) {\n knownRemotes.set(p.remoteName, p.remoteEntryUrl);\n }\n}\n\n/**\n * Notify federation about the current remoteEntryUrl for a remote.\n * If the URL changed since last load (i.e. plugin was rebuilt), re-registers\n * the remote so the next loadRemote() fetches the fresh bundle.\n *\n * Called lazily at navigation time — never in background — so the running\n * page is never disrupted mid-session.\n */\nexport function syncRemoteEntry(remoteName: string, currentEntryUrl: string): void {\n if (knownRemotes.get(remoteName) === currentEntryUrl) { return; }\n\n registerRemotes([{ name: remoteName, entry: resolveEntryUrl(currentEntryUrl) }], { force: true });\n knownRemotes.set(remoteName, currentEntryUrl);\n}\n\n/**\n * Reset federation state. For testing only.\n */\nexport function resetFederation(): void {\n knownRemotes.clear();\n mfInitialized = false;\n}\n\n/**\n * Error thrown when a remote widget fails to load.\n */\nexport class PageLoadError extends Error {\n readonly remoteName: string;\n readonly exposedModule: string;\n\n constructor(\n message: string,\n remoteName: string,\n exposedModule: string,\n cause?: Error,\n ) {\n super(message, { cause });\n this.name = 'PageLoadError';\n this.remoteName = remoteName;\n this.exposedModule = exposedModule;\n }\n}\n\ninterface MFEventContext {\n id: string;\n remoteName: string;\n exposedModule: string;\n startedAt: number;\n}\n\nfunction pushMFEvent(\n ctx: MFEventContext,\n fields: Omit<MFEvent, 'id' | 'remoteName' | 'exposedModule' | 'startedAt'>,\n): void {\n getMFChannel()?.push({ ...ctx, ...fields } as MFEvent);\n}\n\nfunction buildErrorPayload(err: unknown): { message: string; cause?: string } {\n return {\n message: err instanceof Error ? err.message : String(err),\n cause: err instanceof Error && err.cause instanceof Error ? err.cause.message : undefined,\n };\n}\n\n/**\n * Load a page component from a Module Federation remote.\n * Retries on failure with backoff.\n *\n * @param remoteEntryUrl - Current remoteEntryUrl from registry. If it changed since\n * the last load (plugin was rebuilt), the remote is re-registered before loading\n * so the browser fetches the fresh bundle. This check happens at navigation time\n * only — never in the background — so the active page is never disrupted.\n */\nexport async function loadPageComponent(\n remoteName: string,\n exposedModule: string,\n remoteEntryUrl?: string,\n retries = 2,\n retryDelay = 1000,\n): Promise<{ default: ComponentType<unknown> }> {\n if (remoteEntryUrl) {\n syncRemoteEntry(remoteName, remoteEntryUrl);\n }\n\n const modulePath = `${remoteName}/${exposedModule.replace('./', '')}`;\n const ctx: MFEventContext = {\n id: `mf-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n remoteName,\n exposedModule,\n startedAt: Date.now(),\n };\n\n pushMFEvent(ctx, { status: 'loading', attempt: 1 });\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const module = await loadRemote<{ default: ComponentType<unknown> }>(modulePath);\n if (!module) { throw new Error('Module resolved to null'); }\n\n if (module.default === undefined) {\n // Module loaded but has no default export — e.g. `export function X()` instead of `export default`\n pushMFEvent(ctx, { status: 'warning', durationMs: Date.now() - ctx.startedAt, attempt: attempt + 1, isDefaultUndefined: true });\n return module;\n }\n\n pushMFEvent(ctx, { status: 'success', durationMs: Date.now() - ctx.startedAt, attempt: attempt + 1 });\n return module;\n } catch (err) {\n if (attempt === retries) {\n pushMFEvent(ctx, { status: 'error', durationMs: Date.now() - ctx.startedAt, attempt: attempt + 1, error: buildErrorPayload(err) });\n throw new PageLoadError(\n `Failed to load page after ${retries + 1} attempts: ${modulePath}`,\n remoteName,\n exposedModule,\n err instanceof Error ? err : undefined,\n );\n }\n pushMFEvent(ctx, { status: 'loading', attempt: attempt + 2 });\n await new Promise<void>((resolve) => { setTimeout(resolve, retryDelay * (attempt + 1)); });\n }\n }\n\n // Unreachable\n throw new PageLoadError('Unreachable', remoteName, exposedModule);\n}\n","/**\n * Shared error UI primitives for plugin load/runtime failures.\n * Used by PageContainer (load errors) and PageErrorBoundary (runtime crashes).\n */\n\nimport { useState } from 'react';\nimport { Button, Typography, Tag } from 'antd';\nimport {\n WarningOutlined, BugOutlined, DownOutlined, UpOutlined,\n CopyOutlined, CheckOutlined, ReloadOutlined,\n} from '@ant-design/icons';\n\nconst { Text, Paragraph } = Typography;\n\nexport interface PluginErrorDetails {\n /** Error type: 'load' = failed to fetch remote, 'crash' = runtime exception */\n type: 'load' | 'crash';\n pluginId: string;\n pageId: string;\n error: Error;\n /** Module Federation specific — only for load errors */\n remoteName?: string;\n entry?: string;\n}\n\ninterface PluginErrorUIProps extends PluginErrorDetails {\n onRetry: () => void;\n}\n\nexport function PluginErrorUI({\n type,\n pluginId,\n pageId,\n error,\n remoteName,\n entry,\n onRetry,\n}: PluginErrorUIProps) {\n const [detailsOpen, setDetailsOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const isLoad = type === 'load';\n\n const title = isLoad ? 'Plugin unavailable' : 'Plugin crashed';\n const subtitle = isLoad\n ? 'Could not load the plugin bundle. The service may be down or the plugin is not built.'\n : 'An unexpected error occurred while rendering this plugin.';\n\n const handleCopy = () => {\n const lines = [\n `Plugin: ${pluginId}`,\n `Page: ${pageId}`,\n remoteName ? `Remote: ${remoteName}` : null,\n entry ? `Entry: ${entry}` : null,\n ``,\n `${error.name}: ${error.message}`,\n error.stack ? `\\n${error.stack}` : null,\n ].filter(Boolean).join('\\n');\n\n navigator.clipboard.writeText(lines).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 320,\n padding: '32px 24px',\n }}>\n <div style={{ maxWidth: 560, width: '100%' }}>\n {/* Icon + title */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 8 }}>\n {isLoad\n ? <WarningOutlined style={{ fontSize: 18, color: 'var(--warning)', flexShrink: 0 }} />\n : <BugOutlined style={{ fontSize: 18, color: 'var(--error)', flexShrink: 0 }} />\n }\n <Text strong style={{ fontSize: 16 }}>{title}</Text>\n </div>\n\n {/* Plugin breadcrumb */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 12, paddingLeft: 32 }}>\n <Text type=\"secondary\" style={{ fontSize: 12, fontFamily: 'monospace' }}>\n {pluginId}\n </Text>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>›</Text>\n <Text type=\"secondary\" style={{ fontSize: 12, fontFamily: 'monospace' }}>\n {pageId}\n </Text>\n </div>\n\n {/* Subtitle */}\n <Paragraph type=\"secondary\" style={{ fontSize: 13, marginBottom: 16, paddingLeft: 32 }}>\n {subtitle}\n </Paragraph>\n\n {/* Actions */}\n <div style={{ display: 'flex', gap: 8, paddingLeft: 32, marginBottom: 16 }}>\n <Button\n size=\"small\"\n icon={<ReloadOutlined />}\n onClick={onRetry}\n >\n Retry\n </Button>\n <Button\n size=\"small\"\n icon={copied ? <CheckOutlined /> : <CopyOutlined />}\n onClick={handleCopy}\n >\n {copied ? 'Copied' : 'Copy details'}\n </Button>\n </div>\n\n {/* Developer details toggle */}\n <div style={{ paddingLeft: 32 }}>\n <button\n onClick={() => setDetailsOpen((v) => !v)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n background: 'none',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n color: 'var(--text-tertiary)',\n fontSize: 12,\n marginBottom: detailsOpen ? 12 : 0,\n }}\n >\n {detailsOpen ? <UpOutlined style={{ fontSize: 11 }} /> : <DownOutlined style={{ fontSize: 11 }} />}\n Developer details\n </button>\n\n {detailsOpen && (\n <div style={{\n border: '1px solid var(--border-primary)',\n borderRadius: 6,\n overflow: 'hidden',\n }}>\n {/* Error type + plugin context */}\n <div style={{\n padding: '10px 12px',\n borderBottom: '1px solid var(--border-primary)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flexWrap: 'wrap',\n }}>\n <Tag color={isLoad ? 'orange' : 'red'} style={{ margin: 0 }}>\n {error.name}\n </Tag>\n {remoteName && (\n <Text type=\"secondary\" style={{ fontSize: 11, fontFamily: 'monospace' }}>\n remote: {remoteName}\n </Text>\n )}\n {entry && (\n <Text type=\"secondary\" style={{ fontSize: 11, fontFamily: 'monospace' }}>\n entry: {entry}\n </Text>\n )}\n </div>\n\n {/* Error message */}\n <div style={{\n padding: '10px 12px',\n borderBottom: error.stack ? '1px solid var(--border-primary)' : undefined,\n fontFamily: 'monospace',\n fontSize: 12,\n color: 'var(--text-primary)',\n wordBreak: 'break-word',\n }}>\n {error.message}\n </div>\n\n {/* Stack trace */}\n {error.stack && (\n <div style={{\n padding: '10px 12px',\n maxHeight: 200,\n overflowY: 'auto',\n background: 'var(--bg-tertiary)',\n }}>\n <pre style={{\n margin: 0,\n fontFamily: 'monospace',\n fontSize: 11,\n lineHeight: 1.6,\n color: 'var(--text-secondary)',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {error.stack}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { PluginErrorUI } from './plugin-error-ui.js';\n\ninterface Props {\n pageId: string;\n pluginId: string;\n children: ReactNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error boundary that isolates plugin page runtime crashes.\n * A crashed plugin does NOT bring down the rest of Studio.\n */\nexport class PageErrorBoundary extends Component<Props, State> {\n override state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(\n `[PageErrorBoundary] Plugin \"${this.props.pluginId}\" page \"${this.props.pageId}\" crashed:`,\n error,\n errorInfo,\n );\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n override render(): ReactNode {\n if (this.state.hasError && this.state.error) {\n return (\n <PluginErrorUI\n type=\"crash\"\n pluginId={this.props.pluginId}\n pageId={this.props.pageId}\n error={this.state.error}\n onRetry={this.handleRetry}\n />\n );\n }\n return this.props.children;\n }\n}\n","import { useState, useEffect, useCallback, useMemo, type ComponentType } from 'react';\nimport { Spin, ConfigProvider } from 'antd';\nimport { loadPageComponent, type PageLoadError } from './widget-loader.js';\nimport { PageErrorBoundary } from './page-error-boundary.js';\nimport { PluginErrorUI } from './plugin-error-ui.js';\nimport { PageContextProvider, type PageContext, getAntDesignTokens, getAntDesignComponents } from '@kb-labs/studio-hooks';\nimport { EventBusProvider } from '@kb-labs/studio-event-bus';\n\nexport interface PageContainerProps {\n remoteName: string;\n entry: string;\n /** Current remoteEntryUrl from registry. Used to detect plugin rebuilds at navigation time. */\n remoteEntryUrl?: string;\n pageId: string;\n pluginId: string;\n config?: Record<string, unknown>;\n permissions?: string[];\n}\n\n/**\n * Loads an MF remote page component and wraps it with providers.\n *\n * Lifecycle:\n * 1. Shows loading spinner\n * 2. Loads remote via Module Federation (retries built-in)\n * 3. On load failure → PluginErrorUI (load variant) with retry\n * 4. On runtime crash → PageErrorBoundary catches → PluginErrorUI (crash variant)\n *\n * ConfigProvider is injected here so that plugin pages receive the same\n * Ant Design theme tokens as the studio host (CSS-variable-based theming).\n */\nexport function PageContainer({\n remoteName,\n entry,\n remoteEntryUrl,\n pageId,\n pluginId,\n config = {},\n permissions = [],\n}: PageContainerProps) {\n const [PageComponent, setPageComponent] = useState<ComponentType<unknown> | null>(null);\n const [loadError, setLoadError] = useState<Error | null>(null);\n const [loading, setLoading] = useState(true);\n const [retryKey, setRetryKey] = useState(0);\n\n const themeConfig = useMemo(() => ({\n token: getAntDesignTokens(),\n components: getAntDesignComponents(),\n }), []);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setLoadError(null);\n setPageComponent(null);\n\n loadPageComponent(remoteName, entry, remoteEntryUrl)\n .then((mod) => {\n if (!cancelled) {\n setPageComponent(() => mod.default);\n setLoading(false);\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setLoadError(err);\n setLoading(false);\n }\n });\n\n return () => { cancelled = true; };\n }, [remoteName, entry, retryKey]);\n\n const handleRetry = useCallback(() => {\n setRetryKey((k) => k + 1);\n }, []);\n\n if (loading) {\n return (\n <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', minHeight: 320 }}>\n <Spin size=\"large\" />\n </div>\n );\n }\n\n if (loadError) {\n const mfError = loadError as PageLoadError;\n return (\n <PluginErrorUI\n type=\"load\"\n pluginId={pluginId}\n pageId={pageId}\n error={loadError}\n remoteName={mfError.remoteName ?? remoteName}\n entry={mfError.exposedModule ?? entry}\n onRetry={handleRetry}\n />\n );\n }\n\n if (!PageComponent) { return null; }\n\n const pageContext: PageContext = { pageId, pluginId, config, permissions };\n\n return (\n <PageErrorBoundary pageId={pageId} pluginId={pluginId} key={retryKey}>\n <ConfigProvider theme={themeConfig}>\n <EventBusProvider>\n <PageContextProvider value={pageContext}>\n <PageComponent />\n </PageContextProvider>\n </EventBusProvider>\n </ConfigProvider>\n </PageErrorBoundary>\n );\n}\n"]}
1
+ {"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/studio/federation/src/widget-loader.ts","../../home/runner/work/kb-labs/kb-labs/studio/federation/src/plugin-error-ui.tsx","../../home/runner/work/kb-labs/kb-labs/studio/federation/src/page-error-boundary.tsx","../../home/runner/work/kb-labs/kb-labs/studio/federation/src/page-container.tsx"],"names":["jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["import { init, loadRemote, registerRemotes } from '@module-federation/runtime';\nimport type { StudioPluginEntryV2 } from './types.js';\nimport type { ComponentType } from 'react';\nimport { devToolsStore, GenericChannel } from '@kb-labs/studio-devtools';\nimport type { MFEvent } from '@kb-labs/studio-devtools';\n/**\n * Resolve a potentially path-absolute remoteEntryUrl against the API origin.\n * Needed when the SPA is served from a different origin than the API (e.g.\n * Studio on :3000, API gateway on :4000 / api.example.com).\n *\n * Reads the API origin from the runtime config injected by server.js into\n * index.html as window.__KB_STUDIO_CONFIG__.KB_API_BASE_URL.\n *\n * - Absolute URLs (http/https) → returned as-is\n * - Root-relative paths (/plugins/...) → prefixed with the API origin\n */\nfunction resolveEntryUrl(url: string): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n if (url.startsWith('/')) {\n try {\n const cfg = (window as Window & { __KB_STUDIO_CONFIG__?: Record<string, string> }).__KB_STUDIO_CONFIG__;\n const apiBase = cfg?.KB_API_BASE_URL ?? '';\n if (apiBase) {\n return new URL(apiBase).origin + url;\n }\n } catch {\n // fall through\n }\n }\n return url;\n}\n\n/** MF events channel — registered lazily on first use */\nfunction getMFChannel(): ReturnType<typeof devToolsStore.getChannel<MFEvent>> {\n let ch = devToolsStore.getChannel<MFEvent>('mf-events');\n if (!ch) {\n ch = new GenericChannel<MFEvent>('mf-events', 'MF Events', 'ApiOutlined');\n devToolsStore.registerChannel(ch);\n }\n return ch;\n}\n\n/**\n * Last known remoteEntryUrl per remoteName.\n * Updated on init and on each loadPageComponent call (lazy, navigation-triggered).\n */\nconst knownRemotes = new Map<string, string>();\nlet mfInitialized = false;\n\n/**\n * Initialize Module Federation runtime. Called once after registry is first loaded.\n */\nexport function initFederation(plugins: StudioPluginEntryV2[]): void {\n if (mfInitialized) { return; }\n\n init({\n name: 'studioHost',\n remotes: plugins.map((plugin) => ({\n name: plugin.remoteName,\n entry: resolveEntryUrl(plugin.remoteEntryUrl),\n })),\n });\n\n mfInitialized = true;\n for (const p of plugins) {\n knownRemotes.set(p.remoteName, p.remoteEntryUrl);\n }\n}\n\n/**\n * Notify federation about the current remoteEntryUrl for a remote.\n * If the URL changed since last load (i.e. plugin was rebuilt), re-registers\n * the remote so the next loadRemote() fetches the fresh bundle.\n *\n * Called lazily at navigation time — never in background — so the running\n * page is never disrupted mid-session.\n */\nexport function syncRemoteEntry(remoteName: string, currentEntryUrl: string): void {\n if (knownRemotes.get(remoteName) === currentEntryUrl) { return; }\n\n registerRemotes([{ name: remoteName, entry: resolveEntryUrl(currentEntryUrl) }], { force: true });\n knownRemotes.set(remoteName, currentEntryUrl);\n}\n\n/**\n * Reset federation state. For testing only.\n */\nexport function resetFederation(): void {\n knownRemotes.clear();\n mfInitialized = false;\n}\n\n/**\n * Error thrown when a remote widget fails to load.\n */\nexport class PageLoadError extends Error {\n readonly remoteName: string;\n readonly exposedModule: string;\n\n constructor(\n message: string,\n remoteName: string,\n exposedModule: string,\n cause?: Error,\n ) {\n super(message, { cause });\n this.name = 'PageLoadError';\n this.remoteName = remoteName;\n this.exposedModule = exposedModule;\n }\n}\n\ninterface MFEventContext {\n id: string;\n remoteName: string;\n exposedModule: string;\n startedAt: number;\n}\n\nfunction pushMFEvent(\n ctx: MFEventContext,\n fields: Omit<MFEvent, 'id' | 'remoteName' | 'exposedModule' | 'startedAt'>,\n): void {\n getMFChannel()?.push({ ...ctx, ...fields } as MFEvent);\n}\n\nfunction buildErrorPayload(err: unknown): { message: string; cause?: string } {\n return {\n message: err instanceof Error ? err.message : String(err),\n cause: err instanceof Error && err.cause instanceof Error ? err.cause.message : undefined,\n };\n}\n\n/**\n * Load a page component from a Module Federation remote.\n * Retries on failure with backoff.\n *\n * @param remoteEntryUrl - Current remoteEntryUrl from registry. If it changed since\n * the last load (plugin was rebuilt), the remote is re-registered before loading\n * so the browser fetches the fresh bundle. This check happens at navigation time\n * only — never in the background — so the active page is never disrupted.\n */\nexport async function loadPageComponent(\n remoteName: string,\n exposedModule: string,\n remoteEntryUrl?: string,\n retries = 2,\n retryDelay = 1000,\n): Promise<{ default: ComponentType<unknown> }> {\n if (remoteEntryUrl) {\n syncRemoteEntry(remoteName, remoteEntryUrl);\n }\n\n const modulePath = `${remoteName}/${exposedModule.replace('./', '')}`;\n const ctx: MFEventContext = {\n id: `mf-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n remoteName,\n exposedModule,\n startedAt: Date.now(),\n };\n\n pushMFEvent(ctx, { status: 'loading', attempt: 1 });\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n const module = await loadRemote<{ default: ComponentType<unknown> }>(modulePath);\n if (!module) { throw new Error('Module resolved to null'); }\n\n if (module.default === undefined) {\n // Module loaded but has no default export — e.g. `export function X()` instead of `export default`\n pushMFEvent(ctx, { status: 'warning', durationMs: Date.now() - ctx.startedAt, attempt: attempt + 1, isDefaultUndefined: true });\n return module;\n }\n\n pushMFEvent(ctx, { status: 'success', durationMs: Date.now() - ctx.startedAt, attempt: attempt + 1 });\n return module;\n } catch (err) {\n if (attempt === retries) {\n pushMFEvent(ctx, { status: 'error', durationMs: Date.now() - ctx.startedAt, attempt: attempt + 1, error: buildErrorPayload(err) });\n throw new PageLoadError(\n `Failed to load page after ${retries + 1} attempts: ${modulePath}`,\n remoteName,\n exposedModule,\n err instanceof Error ? err : undefined,\n );\n }\n pushMFEvent(ctx, { status: 'loading', attempt: attempt + 2 });\n await new Promise<void>((resolve) => { setTimeout(resolve, retryDelay * (attempt + 1)); });\n }\n }\n\n // Unreachable\n throw new PageLoadError('Unreachable', remoteName, exposedModule);\n}\n","/**\n * Shared error UI primitives for plugin load/runtime failures.\n * Used by PageContainer (load errors) and PageErrorBoundary (runtime crashes).\n */\n\nimport { useState } from 'react';\nimport { Button, Typography, Tag } from 'antd';\nimport {\n WarningOutlined, BugOutlined, DownOutlined, UpOutlined,\n CopyOutlined, CheckOutlined, ReloadOutlined,\n} from '@ant-design/icons';\n\nconst { Text, Paragraph } = Typography;\n\nexport interface PluginErrorDetails {\n /** Error type: 'load' = failed to fetch remote, 'crash' = runtime exception */\n type: 'load' | 'crash';\n pluginId: string;\n pageId: string;\n error: Error;\n /** Module Federation specific — only for load errors */\n remoteName?: string;\n entry?: string;\n}\n\ninterface PluginErrorUIProps extends PluginErrorDetails {\n onRetry: () => void;\n}\n\nexport function PluginErrorUI({\n type,\n pluginId,\n pageId,\n error,\n remoteName,\n entry,\n onRetry,\n}: PluginErrorUIProps) {\n const [detailsOpen, setDetailsOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const isLoad = type === 'load';\n\n const title = isLoad ? 'Plugin unavailable' : 'Plugin crashed';\n const subtitle = isLoad\n ? 'Could not load the plugin bundle. The service may be down or the plugin is not built.'\n : 'An unexpected error occurred while rendering this plugin.';\n\n const handleCopy = () => {\n const lines = [\n `Plugin: ${pluginId}`,\n `Page: ${pageId}`,\n remoteName ? `Remote: ${remoteName}` : null,\n entry ? `Entry: ${entry}` : null,\n ``,\n `${error.name}: ${error.message}`,\n error.stack ? `\\n${error.stack}` : null,\n ].filter(Boolean).join('\\n');\n\n navigator.clipboard.writeText(lines).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 320,\n padding: '32px 24px',\n }}>\n <div style={{ maxWidth: 560, width: '100%' }}>\n {/* Icon + title */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 8 }}>\n {isLoad\n ? <WarningOutlined style={{ fontSize: 18, color: 'var(--warning)', flexShrink: 0 }} />\n : <BugOutlined style={{ fontSize: 18, color: 'var(--error)', flexShrink: 0 }} />\n }\n <Text strong style={{ fontSize: 16 }}>{title}</Text>\n </div>\n\n {/* Plugin breadcrumb */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 12, paddingLeft: 32 }}>\n <Text type=\"secondary\" style={{ fontSize: 12, fontFamily: 'monospace' }}>\n {pluginId}\n </Text>\n <Text type=\"secondary\" style={{ fontSize: 12 }}>›</Text>\n <Text type=\"secondary\" style={{ fontSize: 12, fontFamily: 'monospace' }}>\n {pageId}\n </Text>\n </div>\n\n {/* Subtitle */}\n <Paragraph type=\"secondary\" style={{ fontSize: 13, marginBottom: 16, paddingLeft: 32 }}>\n {subtitle}\n </Paragraph>\n\n {/* Actions */}\n <div style={{ display: 'flex', gap: 8, paddingLeft: 32, marginBottom: 16 }}>\n <Button\n size=\"small\"\n icon={<ReloadOutlined />}\n onClick={onRetry}\n >\n Retry\n </Button>\n <Button\n size=\"small\"\n icon={copied ? <CheckOutlined /> : <CopyOutlined />}\n onClick={handleCopy}\n >\n {copied ? 'Copied' : 'Copy details'}\n </Button>\n </div>\n\n {/* Developer details toggle */}\n <div style={{ paddingLeft: 32 }}>\n <button\n onClick={() => setDetailsOpen((v) => !v)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n background: 'none',\n border: 'none',\n padding: 0,\n cursor: 'pointer',\n color: 'var(--text-tertiary)',\n fontSize: 12,\n marginBottom: detailsOpen ? 12 : 0,\n }}\n >\n {detailsOpen ? <UpOutlined style={{ fontSize: 11 }} /> : <DownOutlined style={{ fontSize: 11 }} />}\n Developer details\n </button>\n\n {detailsOpen && (\n <div style={{\n border: '1px solid var(--border-primary)',\n borderRadius: 6,\n overflow: 'hidden',\n }}>\n {/* Error type + plugin context */}\n <div style={{\n padding: '10px 12px',\n borderBottom: '1px solid var(--border-primary)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flexWrap: 'wrap',\n }}>\n <Tag color={isLoad ? 'orange' : 'red'} style={{ margin: 0 }}>\n {error.name}\n </Tag>\n {remoteName && (\n <Text type=\"secondary\" style={{ fontSize: 11, fontFamily: 'monospace' }}>\n remote: {remoteName}\n </Text>\n )}\n {entry && (\n <Text type=\"secondary\" style={{ fontSize: 11, fontFamily: 'monospace' }}>\n entry: {entry}\n </Text>\n )}\n </div>\n\n {/* Error message */}\n <div style={{\n padding: '10px 12px',\n borderBottom: error.stack ? '1px solid var(--border-primary)' : undefined,\n fontFamily: 'monospace',\n fontSize: 12,\n color: 'var(--text-primary)',\n wordBreak: 'break-word',\n }}>\n {error.message}\n </div>\n\n {/* Stack trace */}\n {error.stack && (\n <div style={{\n padding: '10px 12px',\n maxHeight: 200,\n overflowY: 'auto',\n background: 'var(--bg-tertiary)',\n }}>\n <pre style={{\n margin: 0,\n fontFamily: 'monospace',\n fontSize: 11,\n lineHeight: 1.6,\n color: 'var(--text-secondary)',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {error.stack}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { PluginErrorUI } from './plugin-error-ui.js';\n\ninterface Props {\n pageId: string;\n pluginId: string;\n children: ReactNode;\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error boundary that isolates plugin page runtime crashes.\n * A crashed plugin does NOT bring down the rest of Studio.\n */\nexport class PageErrorBoundary extends Component<Props, State> {\n override state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(\n `[PageErrorBoundary] Plugin \"${this.props.pluginId}\" page \"${this.props.pageId}\" crashed:`,\n error,\n errorInfo,\n );\n this.props.onError?.(error, errorInfo);\n }\n\n handleRetry = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n override render(): ReactNode {\n if (this.state.hasError && this.state.error) {\n return (\n <PluginErrorUI\n type=\"crash\"\n pluginId={this.props.pluginId}\n pageId={this.props.pageId}\n error={this.state.error}\n onRetry={this.handleRetry}\n />\n );\n }\n return this.props.children;\n }\n}\n","import { useState, useEffect, useCallback, useMemo, type ComponentType } from 'react';\nimport { Spin, ConfigProvider } from 'antd';\nimport { loadPageComponent, type PageLoadError } from './widget-loader.js';\nimport { PageErrorBoundary } from './page-error-boundary.js';\nimport { PluginErrorUI } from './plugin-error-ui.js';\nimport { PageContextProvider, type PageContext, getAntDesignTokens, getAntDesignComponents } from '@kb-labs/studio-hooks';\nimport { EventBusProvider } from '@kb-labs/studio-event-bus';\n\nexport interface PageContainerProps {\n remoteName: string;\n entry: string;\n /** Current remoteEntryUrl from registry. Used to detect plugin rebuilds at navigation time. */\n remoteEntryUrl?: string;\n pageId: string;\n pluginId: string;\n config?: Record<string, unknown>;\n permissions?: string[];\n}\n\n/**\n * Loads an MF remote page component and wraps it with providers.\n *\n * Lifecycle:\n * 1. Shows loading spinner\n * 2. Loads remote via Module Federation (retries built-in)\n * 3. On load failure → PluginErrorUI (load variant) with retry\n * 4. On runtime crash → PageErrorBoundary catches → PluginErrorUI (crash variant)\n *\n * ConfigProvider is injected here so that plugin pages receive the same\n * Ant Design theme tokens as the studio host (CSS-variable-based theming).\n */\nexport function PageContainer({\n remoteName,\n entry,\n remoteEntryUrl,\n pageId,\n pluginId,\n config = {},\n permissions = [],\n}: PageContainerProps) {\n const [PageComponent, setPageComponent] = useState<ComponentType<unknown> | null>(null);\n const [loadError, setLoadError] = useState<Error | null>(null);\n const [loading, setLoading] = useState(true);\n const [retryKey, setRetryKey] = useState(0);\n\n const themeConfig = useMemo(() => ({\n token: getAntDesignTokens(),\n components: getAntDesignComponents(),\n }), []);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setLoadError(null);\n setPageComponent(null);\n\n loadPageComponent(remoteName, entry, remoteEntryUrl)\n .then((mod) => {\n if (!cancelled) {\n setPageComponent(() => mod.default);\n setLoading(false);\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setLoadError(err);\n setLoading(false);\n }\n });\n\n return () => { cancelled = true; };\n }, [remoteName, entry, retryKey]);\n\n const handleRetry = useCallback(() => {\n setRetryKey((k) => k + 1);\n }, []);\n\n if (loading) {\n return (\n <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', minHeight: 320 }}>\n <Spin size=\"large\" />\n </div>\n );\n }\n\n if (loadError) {\n const mfError = loadError as PageLoadError;\n return (\n <PluginErrorUI\n type=\"load\"\n pluginId={pluginId}\n pageId={pageId}\n error={loadError}\n remoteName={mfError.remoteName ?? remoteName}\n entry={mfError.exposedModule ?? entry}\n onRetry={handleRetry}\n />\n );\n }\n\n if (!PageComponent) { return null; }\n\n const pageContext: PageContext = { pageId, pluginId, config, permissions };\n\n return (\n <PageErrorBoundary pageId={pageId} pluginId={pluginId} key={retryKey}>\n <ConfigProvider theme={themeConfig}>\n <EventBusProvider>\n <PageContextProvider value={pageContext}>\n <PageComponent />\n </PageContextProvider>\n </EventBusProvider>\n </ConfigProvider>\n </PageErrorBoundary>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/studio-federation",
3
3
  "description": "Studio Module Federation host logic — page loader, container, error boundary",
4
- "version": "2.119.0-canary.e120bc0ee",
4
+ "version": "2.119.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -16,10 +16,10 @@
16
16
  ],
17
17
  "dependencies": {
18
18
  "@module-federation/runtime": "^2.3.0",
19
- "@kb-labs/plugin-contracts": "2.119.0-canary.e120bc0ee",
20
- "@kb-labs/studio-devtools": "2.119.0-canary.e120bc0ee",
21
- "@kb-labs/studio-hooks": "2.119.0-canary.e120bc0ee",
22
- "@kb-labs/studio-event-bus": "2.119.0-canary.e120bc0ee"
19
+ "@kb-labs/plugin-contracts": "2.119.0",
20
+ "@kb-labs/studio-event-bus": "2.119.0",
21
+ "@kb-labs/studio-devtools": "2.119.0",
22
+ "@kb-labs/studio-hooks": "2.119.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@ant-design/icons": "^5.0.0",
@@ -30,10 +30,10 @@
30
30
  "tsup": "^8.5.0",
31
31
  "typescript": "^5.6.3",
32
32
  "vitest": "^3.2.6",
33
- "@kb-labs/devkit": "2.119.0-canary.e120bc0ee"
33
+ "@kb-labs/devkit": "2.119.0"
34
34
  },
35
35
  "engines": {
36
- "node": ">=22.0.0",
36
+ "node": ">=24.0.0",
37
37
  "pnpm": ">=9.0.0"
38
38
  },
39
39
  "peerDependencies": {