aui-mcp-server 0.0.1 → 0.0.3
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/client/index.cjs +11 -16
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +4 -4
- package/dist/client/index.d.ts +4 -4
- package/dist/client/index.js +12 -17
- package/dist/client/index.js.map +1 -1
- package/package.json +6 -10
- package/src/client/handshake.ts +3 -4
- package/src/client/registry.tsx +16 -22
- package/src/mcp-app-poc.html +0 -69
- package/src/poc.ts +0 -88
package/dist/client/index.cjs
CHANGED
|
@@ -146,10 +146,8 @@ var ErrorPlaceholder = ({
|
|
|
146
146
|
}
|
|
147
147
|
);
|
|
148
148
|
var mfInstance = null;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (mfInstance) return mfInstance;
|
|
152
|
-
const baseShared = {
|
|
149
|
+
function createBaseShared() {
|
|
150
|
+
return {
|
|
153
151
|
react: {
|
|
154
152
|
version: React__default.default.version,
|
|
155
153
|
scope: "default",
|
|
@@ -178,8 +176,11 @@ function ensureMFInstance(options) {
|
|
|
178
176
|
}
|
|
179
177
|
}
|
|
180
178
|
};
|
|
179
|
+
}
|
|
180
|
+
function ensureMFInstance(options) {
|
|
181
|
+
if (mfInstance) return mfInstance;
|
|
181
182
|
const shared = {
|
|
182
|
-
...
|
|
183
|
+
...createBaseShared(),
|
|
183
184
|
...options?.shared ?? {}
|
|
184
185
|
};
|
|
185
186
|
mfInstance = runtime.createInstance({
|
|
@@ -189,17 +190,12 @@ function ensureMFInstance(options) {
|
|
|
189
190
|
});
|
|
190
191
|
return mfInstance;
|
|
191
192
|
}
|
|
192
|
-
function
|
|
193
|
+
function setupMFRegistry(registry, options) {
|
|
193
194
|
ensureMFInstance(options);
|
|
194
|
-
if (!registryInstance) {
|
|
195
|
-
registryInstance = A2UI.ComponentRegistry.getInstance();
|
|
196
|
-
A2UI.registerDefaultCatalog(registryInstance);
|
|
197
|
-
logger.info("[aui-mcp-server/react] ComponentRegistry initialized with default catalog");
|
|
198
|
-
}
|
|
199
195
|
if (typeof window !== "undefined" && options?.exposeGlobal) {
|
|
200
|
-
window.__AUI_REGISTRY__ =
|
|
196
|
+
window.__AUI_REGISTRY__ = registry;
|
|
201
197
|
}
|
|
202
|
-
return
|
|
198
|
+
return registry;
|
|
203
199
|
}
|
|
204
200
|
function registerMFComponent(registry, componentType, xLoader) {
|
|
205
201
|
const mf = ensureMFInstance();
|
|
@@ -284,7 +280,6 @@ async function performHandshake(agentUrl, registry) {
|
|
|
284
280
|
}
|
|
285
281
|
const catalogs = a2uiExt.params.inlineCatalogs;
|
|
286
282
|
const allComponents = {};
|
|
287
|
-
const effectiveRegistry = registry ?? createMFRegistry();
|
|
288
283
|
catalogs.forEach((cat) => {
|
|
289
284
|
if (!cat.components) return;
|
|
290
285
|
const count = Object.keys(cat.components).length;
|
|
@@ -292,7 +287,7 @@ async function performHandshake(agentUrl, registry) {
|
|
|
292
287
|
`[AUI-X] Found catalog "${cat.id ?? "inline"}", syncing ${count} components from handshake`
|
|
293
288
|
);
|
|
294
289
|
Object.assign(allComponents, cat.components);
|
|
295
|
-
syncRegistryFromCatalog(
|
|
290
|
+
syncRegistryFromCatalog(registry, cat.components);
|
|
296
291
|
});
|
|
297
292
|
return allComponents;
|
|
298
293
|
} catch (error) {
|
|
@@ -607,11 +602,11 @@ function useA2UIStream(options) {
|
|
|
607
602
|
exports.A2UI_EXTENSION_URI = A2UI_EXTENSION_URI;
|
|
608
603
|
exports.A2UI_MIME_TYPE = A2UI_MIME_TYPE;
|
|
609
604
|
exports.createLogger = createLogger;
|
|
610
|
-
exports.createMFRegistry = createMFRegistry;
|
|
611
605
|
exports.logger = logger;
|
|
612
606
|
exports.performHandshake = performHandshake;
|
|
613
607
|
exports.registerMFComponent = registerMFComponent;
|
|
614
608
|
exports.render = render;
|
|
609
|
+
exports.setupMFRegistry = setupMFRegistry;
|
|
615
610
|
exports.syncRegistryFromCatalog = syncRegistryFromCatalog;
|
|
616
611
|
exports.useA2UIStream = useA2UIStream;
|
|
617
612
|
exports.useLogger = useLogger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/types.ts","../../src/client/useLogger.ts","../../src/client/registry.tsx","../../src/client/handshake.ts","../../src/client/useA2UIStream.ts"],"names":["logger","useRef","useEffect","jsxs","jsx","React","ReactDOM","A2UI","createInstance","ComponentRegistry","registerDefaultCatalog","lazy","useA2UIActions","useState","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ServerToClientMessage } from '@a2ui/react';\n\n/** A2UI extension URI (from the A2A protocol definition). */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/** A2UI DataPart mimeType. */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n// ── Module Federation x-loader config ───────────────────────────────────────\n\n/**\n * Runtime config aligned with the `x-loader` field in the MCP Catalog.\n */\nexport interface XLoaderConfig {\n type: 'module-federation';\n /** remoteEntry.js URL (passed to MF runtime as the remote entry). */\n url: string;\n /** MF remote name (`moduleFederation.name`). */\n scope: string;\n /** Exposed module path, e.g. \"./ArtistProfile\". */\n module: string;\n}\n\n// ── A2A SSE response types ─────────────────────────────────────────────────-\n\nexport interface A2ATaskStatus {\n state: 'submitted' | 'working' | 'input-required' | 'completed' | 'failed' | 'canceled';\n /** Inline message from the agent, may contain text/data parts */\n message?: {\n kind: 'message';\n role: 'agent';\n messageId?: string;\n contextId?: string;\n // Narrowed to WirePart[] inside the hook\n parts: unknown[];\n };\n timestamp?: string;\n}\n\nexport interface A2AArtifact {\n artifactId: string;\n name?: string;\n parts: unknown[];\n index?: number;\n lastChunk?: boolean;\n metadata?: Record<string, unknown> | null;\n}\n\n/** Task status update event. */\nexport interface TaskStatusUpdateEvent {\n id: string;\n result: {\n /** Task ID */\n id: string;\n contextId: string;\n status: A2ATaskStatus;\n final: boolean;\n metadata?: Record<string, unknown> | null;\n };\n}\n\n/** Task artifact update event (usually contains the final A2UI DataParts). */\nexport interface TaskArtifactUpdateEvent {\n id: string;\n result: {\n taskId: string;\n contextId: string;\n artifact: A2AArtifact;\n };\n}\n\nexport type A2AStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── Chat / Hook types ─────────────────────────────────────────────────------\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n text: string;\n /** True when this message triggers an A2UI surface render. */\n hasSurface?: boolean;\n}\n\n/**\n * `useA2UIStream` hook options.\n */\nexport interface A2UIStreamOptions {\n /**\n * A2A Agent HTTP base URL. Defaults to `/api`.\n *\n * - `useA2UIStream({ agentUrl: '/api/a2a' })`\n */\n agentUrl?: string;\n\n /**\n * Whether `sendMessage` input is treated as an action payload (DataPart) by default.\n * If true, you can pass a JSON string directly as a `userAction` payload.\n */\n defaultIsActionPayload?: boolean;\n}\n\n/**\n * Logger creation options.\n */\nexport interface CreateLoggerOptions {\n /** Remote log endpoint. Defaults to `/api/log`. */\n endpoint?: string;\n /** Whether to hijack global console.*. Defaults to false. */\n hijackConsole?: boolean;\n}\n\n/**\n * MF Registry creation options.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CreateMFRegistryOptions {\n /**\n * Additional shared deps (merged after the default react / react-dom / @a2ui/react config).\n * Key is the package name; value is a shared config fragment for `@module-federation/enhanced/runtime`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shared?: Record<string, any>;\n\n /** Expose `window.__AUI_REGISTRY__` for debugging. Defaults to false. */\n exposeGlobal?: boolean;\n}\n\n/**\n * Payload shape for converting tool calls into A2UI messages.\n */\nexport interface ToolCallPayload {\n tool_name: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool_input?: Record<string, any>;\n}\n\nexport type { ServerToClientMessage };\n","import { useEffect, useRef } from 'react';\nimport type { CreateLoggerOptions } from './types';\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';\n\nclass RemoteLogger {\n private queue: unknown[] = [];\n private isProcessing = false;\n\n constructor(private endpoint: string) {}\n\n setEndpoint(endpoint: string) {\n this.endpoint = endpoint;\n }\n\n private async flush() {\n if (this.isProcessing || this.queue.length === 0) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const entry = this.queue.shift();\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(entry),\n });\n } catch (e) {\n // Use the original console to avoid recursion\n // eslint-disable-next-line no-console\n console.warn('[AUI Logger] Failed to sync log to backend', e);\n // Abort the current flush to avoid an infinite loop when backend is unavailable\n break;\n }\n }\n\n this.isProcessing = false;\n }\n\n log(level: LogLevel, ...args: unknown[]) {\n const time = new Date().toISOString();\n const message = args\n .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\n .join(' ');\n\n const consoleMethod = level.toLowerCase() as 'debug' | 'info' | 'warn' | 'error';\n\n // Prefer the preserved original console methods (if present)\n const original =\n (typeof window !== 'undefined' && (window as any).__AUI_ORIGINAL_CONSOLE__?.[consoleMethod]) ||\n // eslint-disable-next-line no-console\n console[consoleMethod];\n\n original(`[${level}]`, ...args);\n\n this.queue.push({ time, level, message });\n void this.flush();\n }\n}\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nlet remoteLogger: RemoteLogger | null = null;\nlet globalLogger: Logger | null = null;\n\nfunction ensureRemoteLogger(endpoint: string): RemoteLogger {\n if (!remoteLogger) {\n remoteLogger = new RemoteLogger(endpoint);\n } else {\n remoteLogger.setEndpoint(endpoint);\n }\n return remoteLogger;\n}\n\nfunction hijackConsoleIfNeeded(logger: Logger) {\n if (typeof window === 'undefined') return;\n\n const w = window as any;\n if (w.__AUI_CONSOLE_HIJACKED__) return;\n\n w.__AUI_ORIGINAL_CONSOLE__ = {\n debug: console.debug,\n info: console.info,\n log: console.log,\n warn: console.warn,\n error: console.error,\n };\n\n console.debug = (...args) => logger.debug(...args);\n console.info = (...args) => logger.info(...args);\n console.log = (...args) => logger.info(...args);\n console.warn = (...args) => logger.warn(...args);\n console.error = (...args) => logger.error(...args);\n\n w.__AUI_CONSOLE_HIJACKED__ = true;\n}\n\n/**\n * Create (or reconfigure) the global logger.\n *\n * - `endpoint`: remote log endpoint (default: `/api/log`)\n * - `hijackConsole`: whether to hijack console.* (default: false)\n */\nexport function createLogger(options?: CreateLoggerOptions): Logger {\n const endpoint = options?.endpoint ?? '/api/log';\n const hijackConsole = options?.hijackConsole ?? false;\n\n const remote = ensureRemoteLogger(endpoint);\n const logger: Logger = {\n debug: (...args: unknown[]) => remote.log('DEBUG', ...args),\n info: (...args: unknown[]) => remote.log('INFO', ...args),\n warn: (...args: unknown[]) => remote.log('WARN', ...args),\n error: (...args: unknown[]) => remote.log('ERROR', ...args),\n };\n\n if (hijackConsole) {\n hijackConsoleIfNeeded(logger);\n }\n\n globalLogger = logger;\n return logger;\n}\n\n/**\n * Default exported logger:\n * - endpoint: `/api/log`\n * - does not hijack console (configure on demand)\n */\nexport const logger: Logger = createLogger();\n\n/**\n * React hook: initialize the logger on mount and optionally hijack console.*\n */\nexport function useLogger(options?: CreateLoggerOptions): Logger {\n const optionsRef = useRef(options);\n\n useEffect(() => {\n createLogger(optionsRef.current);\n }, []);\n\n return globalLogger ?? logger;\n}\n","import React, { lazy } from 'react';\nimport ReactDOM from 'react-dom';\nimport { createInstance } from '@module-federation/enhanced/runtime';\nimport * as A2UI from '@a2ui/react';\nimport {\n ComponentRegistry,\n registerDefaultCatalog,\n type ComponentRegistration,\n} from '@a2ui/react';\nimport type { CreateMFRegistryOptions, XLoaderConfig } from './types';\nimport { logger } from './useLogger';\n\n// ── Inline ErrorPlaceholder (avoid depending on sample app components) ──────\n\nconst ErrorPlaceholder: React.FC<{ title?: string; message?: string }> = ({\n title = 'Component load failed',\n message,\n}) => (\n <div\n style={{\n padding: '0.75rem 1rem',\n borderRadius: 6,\n border: '1px solid #f5c2c7',\n background: '#f8d7da',\n color: '#842029',\n fontSize: 14,\n }}\n >\n <strong>{title}</strong>\n {message && <div style={{ marginTop: 4 }}>{message}</div>}\n </div>\n);\n\n// ── MF Runtime singleton ────────────────────────────────────────────────────\n\ntype MFInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: MFInstance | null = null;\nlet registryInstance: ComponentRegistry | null = null;\n\nfunction ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {\n if (mfInstance) return mfInstance;\n\n const baseShared = {\n react: {\n version: React.version,\n scope: 'default',\n lib: () => React,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n 'react-dom': {\n version: React.version,\n scope: 'default',\n lib: () => ReactDOM,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n '@a2ui/react': {\n version: '0.8.0',\n scope: 'default',\n lib: () => A2UI,\n shareConfig: {\n singleton: true,\n requiredVersion: '^0.8.0',\n },\n },\n } as const;\n\n const shared = {\n ...baseShared,\n ...(options?.shared ?? {}),\n } as any;\n\n mfInstance = createInstance({\n name: 'aui_mcp_client',\n remotes: [],\n shared,\n });\n\n return mfInstance;\n}\n\n/**\n * Create (or get) a `ComponentRegistry` instance and initialize the default catalog.\n *\n * - Share `react` / `react-dom` / `@a2ui/react` as singletons\n * - Allow extra shared deps via `options.shared`\n * - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`\n */\nexport function createMFRegistry(options?: CreateMFRegistryOptions): ComponentRegistry {\n ensureMFInstance(options);\n\n if (!registryInstance) {\n registryInstance = ComponentRegistry.getInstance();\n registerDefaultCatalog(registryInstance);\n logger.info('[aui-mcp-server/react] ComponentRegistry initialized with default catalog');\n }\n\n if (typeof window !== 'undefined' && options?.exposeGlobal) {\n (window as any).__AUI_REGISTRY__ = registryInstance;\n }\n\n return registryInstance;\n}\n\n/**\n * Register a single MF component (lazy-loaded with a safe ErrorPlaceholder fallback).\n */\nexport function registerMFComponent(\n registry: ComponentRegistry,\n componentType: string,\n xLoader: XLoaderConfig,\n): void {\n const mf = ensureMFInstance();\n const { url, scope, module: modulePath } = xLoader;\n\n const exposeName = modulePath.replace(/^\\.\\//, '');\n const remoteId = `${scope}/${exposeName}`;\n\n const LazyComponent = lazy(async () => {\n logger.debug(`[AUI-X] MF lazy load triggered: ${componentType} (${remoteId})`);\n try {\n mf.registerRemotes([{ name: scope, entry: url }], { force: false });\n\n const mod = await mf.loadRemote<{\n default: React.ComponentType<Record<string, unknown>>;\n }>(remoteId);\n\n if (!mod) {\n throw new Error(`[AUI-X] loadRemote returned null for \"${remoteId}\"`);\n }\n\n const Component =\n mod.default ?? (mod as unknown as React.ComponentType<Record<string, unknown>>);\n logger.info(`[AUI-X] ✅ MF component loaded OK: ${componentType}`);\n return { default: Component };\n } catch (error) {\n logger.error(\n `[AUI-X] ❌ Failed to load MF component \"${componentType}\" from \"${remoteId}\":`,\n error,\n );\n\n const Fallback: React.FC = () => (\n <ErrorPlaceholder\n title=\"Failed to load MF component\"\n message={`Unable to load remote component: ${componentType}`}\n />\n );\n\n return { default: Fallback };\n }\n });\n\n const registration: ComponentRegistration = {\n component: LazyComponent as never,\n };\n\n registry.register(componentType, registration as never);\n logger.info(\n `[AUI-X] MF component registered (runtime): ${componentType} ← ${url} → ${remoteId}`,\n );\n}\n\n/**\n * Register all `x-loader` components from a Catalog into the given registry.\n */\nexport function syncRegistryFromCatalog(\n registry: ComponentRegistry,\n catalog: Record<string, unknown>,\n): void {\n Object.entries(catalog).forEach(([type, schema]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anySchema = schema as any;\n const xLoader = (anySchema.x_loader || anySchema['x-loader']) as XLoaderConfig | undefined;\n if (!xLoader || xLoader.type !== 'module-federation') return;\n\n registerMFComponent(registry, type, xLoader);\n });\n}\n","import type { ComponentRegistry } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport { logger } from './useLogger';\nimport { createMFRegistry, syncRegistryFromCatalog } from './registry';\nimport type { ToolCallPayload } from './types';\nimport { A2UI_EXTENSION_URI } from './types';\n\ninterface A2UIValue {\n literalString?: string;\n path?: string;\n}\n\n/** Convert any input into an A2UI literalString value object. */\nfunction toLiteralStringValue(value: unknown): A2UIValue | undefined {\n if (value === undefined || value === null) return undefined;\n\n if (typeof value === 'string') {\n return { literalString: value };\n }\n\n if (typeof value === 'object') {\n const obj = value as Partial<A2UIValue>;\n if (typeof obj.literalString === 'string' || typeof obj.path === 'string') {\n return {\n ...(obj.literalString ? { literalString: obj.literalString } : {}),\n ...(obj.path ? { path: obj.path } : {}),\n };\n }\n }\n\n return { literalString: String(value) };\n}\n\n/**\n * A2A handshake:\n * - Fetch AgentCard from `{agentUrl}/agent-card`\n * - Parse `inlineCatalogs` from `capabilities.extensions`\n * - Auto-register MF components via `syncRegistryFromCatalog()`\n */\nexport async function performHandshake(\n agentUrl: string,\n registry?: ComponentRegistry,\n): Promise<Record<string, unknown>> {\n try {\n const base = agentUrl.replace(/\\/$/, '');\n const handshakeUrl = base.endsWith('/agent-card') ? base : `${base}/agent-card`;\n\n const response = await fetch(handshakeUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch AgentCard from ${handshakeUrl}: ${response.statusText}`);\n }\n\n const agentCard = await response.json();\n\n const a2uiExt = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === A2UI_EXTENSION_URI,\n );\n\n if (!a2uiExt || !a2uiExt.params?.inlineCatalogs) {\n logger.warn('[AUI-X] No inlineCatalogs found in AgentCard. Handshake skipped.');\n return {};\n }\n\n const catalogs = a2uiExt.params.inlineCatalogs as Array<{\n id?: string;\n components?: Record<string, unknown>;\n }>;\n\n const allComponents: Record<string, unknown> = {};\n const effectiveRegistry = registry ?? createMFRegistry();\n\n catalogs.forEach((cat) => {\n if (!cat.components) return;\n const count = Object.keys(cat.components).length;\n logger.info(\n `[AUI-X] Found catalog \"${cat.id ?? 'inline'}\", syncing ${count} components from handshake`,\n );\n Object.assign(allComponents, cat.components);\n syncRegistryFromCatalog(effectiveRegistry, cat.components);\n });\n\n return allComponents;\n } catch (error) {\n logger.error('[AUI-X] Handshake error:', error);\n return {};\n }\n}\n\n/**\n * Generic renderer: map a tool call to A2UI messages based on the Catalog schema.\n */\nexport function render(\n toolCall: ToolCallPayload,\n catalog: Record<string, any>,\n): ServerToClientMessage[] {\n const { tool_name, tool_input } = toolCall;\n\n // 1) Derive component type\n let componentType = tool_name;\n if (tool_name.startsWith('render_')) {\n const parts = tool_name.split('_').slice(1);\n componentType = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('');\n }\n\n const schema = catalog[componentType];\n if (!schema) {\n throw new Error(\n `[AUI-X] Component type \"${componentType}\" not found in catalog for tool \"${tool_name}\"`,\n );\n }\n\n const surfaceId = `${tool_name}-surface-handshake`;\n const rootId = 'root-column';\n\n // 2) Map props\n const props: Record<string, unknown> = {};\n if (tool_input) {\n Object.entries(tool_input).forEach(([key, value]) => {\n if (key === 'mfData' || key === 'dataModel') {\n props[key] = value;\n } else {\n const val = toLiteralStringValue(value);\n if (val) props[key] = val;\n }\n });\n }\n\n // 3) Build rendering instructions\n const components = [\n {\n id: rootId,\n component: {\n Column: {\n children: {\n explicitList: ['dynamic-card'],\n },\n },\n },\n },\n {\n id: 'dynamic-card',\n component: {\n [componentType]: props,\n },\n },\n ];\n\n return [\n {\n beginRendering: {\n surfaceId,\n root: rootId,\n styles: {\n primaryColor: '#1DB954',\n font: 'Roboto',\n },\n },\n },\n {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n },\n ];\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useA2UIActions } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport {\n A2UI_EXTENSION_URI,\n A2UI_MIME_TYPE,\n type A2AStreamEvent,\n type TaskStatusUpdateEvent,\n type TaskArtifactUpdateEvent,\n type ChatMessage,\n type A2UIStreamOptions,\n} from './types';\nimport { logger } from './useLogger';\n\n// ── A2A wire-format Part types (aligned with the Python SDK) ────────────────\n\ninterface WireTextPart {\n kind: 'text';\n text: string;\n metadata?: Record<string, string> | null;\n}\n\ninterface WireDataPart {\n kind: 'data';\n data: Record<string, unknown>;\n metadata?: Record<string, string> | null;\n}\n\ntype WirePart = WireTextPart | WireDataPart;\n\n// ── Type guards ──────────────────────────────────────────────────────────────\n\nfunction isTaskStatusUpdateEvent(e: A2AStreamEvent): e is TaskStatusUpdateEvent {\n return 'result' in e && 'status' in (e as TaskStatusUpdateEvent).result;\n}\n\nfunction isTaskArtifactUpdateEvent(e: A2AStreamEvent): e is TaskArtifactUpdateEvent {\n return 'result' in e && 'artifact' in (e as TaskArtifactUpdateEvent).result;\n}\n\nfunction isA2UIPart(part: WirePart): part is WireDataPart {\n return (\n part.kind === 'data' &&\n (part.metadata?.mimeType === A2UI_MIME_TYPE ||\n // snake_case compatibility\n (part.metadata as any)?.mime_type === A2UI_MIME_TYPE)\n );\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction extractText(parts: WirePart[]): string {\n return parts\n .filter((p): p is WireTextPart => p.kind === 'text')\n .map((p) => p.text)\n .join('');\n}\n\nfunction extractA2UIData(parts: WirePart[]): Record<string, unknown>[] {\n return parts.filter(isA2UIPart).map((p) => p.data);\n}\n\n// ── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * A2A JSON-RPC 2.0 + SSE streaming hook.\n *\n * - Defaults to `/api` as the Agent HTTP entry\n * - Supports `isActionPayload` mode to serialize user input as a DataPart\n */\nexport interface A2UIStreamPerfSnapshot {\n /** t0: request start timestamp (message/stream), in ms (performance.now) */\n t0: number;\n /** t1: timestamp when the first A2UI DataPart triggers render, in ms (performance.now) */\n t1?: number;\n /** t2: completion timestamp (SSE end or final status), in ms (performance.now) */\n t2?: number;\n /** TTFC = t1 - t0, in ms; undefined if no A2UI DataPart appears in this round */\n ttfcMs?: number;\n /** TTLC = t2 - t0, in ms */\n ttlcMs?: number;\n /** Completion reason for debugging (e.g. 'status-completed' | 'sse-end') */\n reason?: string;\n}\n\nexport function useA2UIStream(options?: A2UIStreamOptions) {\n const actions = useA2UIActions();\n\n const agentUrl = options?.agentUrl ?? '/api';\n const defaultIsActionPayload = options?.defaultIsActionPayload ?? false;\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [lastPerf, setLastPerf] = useState<A2UIStreamPerfSnapshot | null>(null);\n\n // `contextId` stays stable across the session; `taskId` persists after the first response\n const contextIdRef = useRef<string>(crypto.randomUUID());\n const taskIdRef = useRef<string | undefined>(undefined);\n\n // Perf timing state for the current round (use performance.now to avoid Date precision issues)\n const perfStateRef = useRef<{\n t0?: number;\n t1?: number;\n t2?: number;\n hasFirstComponent?: boolean;\n completed?: boolean;\n }>({});\n\n const now = () => (typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now());\n\n const markFirstComponentRendered = () => {\n const state = perfStateRef.current;\n if (!state.t0 || state.t1 || state.completed) return;\n state.t1 = now();\n };\n\n const finalizePerf = (reason: string) => {\n const state = perfStateRef.current;\n if (!state.t0 || state.completed) return;\n\n state.completed = true;\n state.t2 = state.t2 ?? now();\n\n const t0 = state.t0;\n const t1 = state.t1;\n const t2 = state.t2;\n const ttfcMs = t1 ? t1 - t0 : undefined;\n const ttlcMs = t2 - t0;\n\n const snapshot: A2UIStreamPerfSnapshot = {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n };\n\n setLastPerf(snapshot);\n\n const ttfcLabel = ttfcMs !== undefined ? `${(ttfcMs / 1000).toFixed(2)}s` : 'N/A';\n const totalLabel = `${(ttlcMs / 1000).toFixed(2)}s`;\n\n // Print a visible perf snapshot to the console for quick inspection\n // eslint-disable-next-line no-console\n console.log('[AUI-X Perf] TTFC: %s, Total: %s', ttfcLabel, totalLabel, {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n });\n };\n\n const sendMessage = useCallback(\n async (userText: string, isActionPayload = defaultIsActionPayload) => {\n if (!userText.trim() || isLoading) return;\n\n setIsLoading(true);\n // Reset timers per round and record t0\n perfStateRef.current = {\n t0: now(),\n t1: undefined,\n t2: undefined,\n hasFirstComponent: false,\n completed: false,\n };\n if (!isActionPayload) {\n setMessages((prev) => [...prev, { role: 'user', text: userText }]);\n }\n\n let assistantText = '';\n let renderedSurface = false;\n\n try {\n // ── Build message.parts ─────────────────────────────────────────\n let parts: WirePart[];\n if (isActionPayload) {\n let actionData: Record<string, unknown>;\n try {\n actionData = JSON.parse(userText) as Record<string, unknown>;\n } catch {\n actionData = { userAction: { actionName: userText, context: {} } };\n }\n parts = [{ kind: 'data', data: actionData }];\n } else {\n parts = [{ kind: 'text', text: userText }];\n }\n\n // ── Build A2A JSON-RPC request ──────────────────────────────────\n const rpcRequest = {\n jsonrpc: '2.0' as const,\n id: crypto.randomUUID(),\n method: 'message/stream' as const,\n params: {\n message: {\n kind: 'message' as const,\n role: 'user' as const,\n messageId: crypto.randomUUID(),\n contextId: contextIdRef.current,\n ...(taskIdRef.current ? { taskId: taskIdRef.current } : {}),\n extensions: [A2UI_EXTENSION_URI],\n parts,\n },\n },\n };\n\n const response = await fetch(agentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(rpcRequest),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n if (!response.body) {\n throw new Error('No response body');\n }\n\n // ── Parse SSE stream ───────────────────────────────────────────\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr || jsonStr === '[DONE]') continue;\n\n let event: A2AStreamEvent;\n try {\n event = JSON.parse(jsonStr) as A2AStreamEvent;\n } catch {\n continue;\n }\n\n // ── TaskStatusUpdateEvent ─────────────────────────────────\n if (isTaskStatusUpdateEvent(event)) {\n const { id: taskId, status } = event.result;\n\n if (taskId) taskIdRef.current = taskId;\n\n const rawParts = (status.message?.parts ?? []) as WirePart[];\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n logger.info('[A2UI] Received UI update part', {\n taskId,\n componentCount: a2uiData.length,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n const surfaces = actions.getSurfaces();\n logger.debug('[A2UI] Surfaces after process:', Array.from(surfaces.keys()));\n\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // ── TaskArtifactUpdateEvent ───────────────────────────────\n if (isTaskArtifactUpdateEvent(event)) {\n const { artifact } = event.result;\n const rawParts = (artifact.parts ?? []) as WirePart[];\n\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // If the event is final, consider this round completed and record t2 (TTLC)\n if (\n isTaskStatusUpdateEvent(event) &&\n (event.result.final || event.result.status.state === 'completed')\n ) {\n finalizePerf('status-completed');\n }\n }\n }\n\n // Fallback: ensure at least one assistant bubble\n if (!assistantText && !renderedSurface) {\n setMessages((prev) => [...prev, { role: 'assistant', text: '…' }]);\n }\n } catch (err) {\n setMessages((prev) => [\n ...prev,\n { role: 'assistant', text: `Connection error: ${String(err)}` },\n ]);\n } finally {\n setIsLoading(false);\n // Even if we didn't receive a final status, record t2 when SSE ends\n finalizePerf('sse-end');\n }\n },\n [agentUrl, defaultIsActionPayload, isLoading, actions],\n );\n\n const processLocalMessages = useCallback(\n (serverMessages: ServerToClientMessage[], label = 'Local tool call: rendered UI surface') => {\n if (!serverMessages || serverMessages.length === 0) return;\n\n logger.info('[A2UI] processLocalMessages:', label, `(${serverMessages.length} messages)`);\n logger.debug('[A2UI] Surfaces BEFORE process:', Array.from(actions.getSurfaces().keys()));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(serverMessages as any);\n\n logger.debug('[A2UI] Surfaces AFTER process:', Array.from(actions.getSurfaces().keys()));\n\n setMessages((prev) => [\n ...prev,\n {\n role: 'assistant',\n text: label,\n hasSurface: true,\n },\n ]);\n },\n [actions],\n );\n\n return { messages, isLoading, sendMessage, processLocalMessages, lastPerf };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/types.ts","../../src/client/useLogger.ts","../../src/client/registry.tsx","../../src/client/handshake.ts","../../src/client/useA2UIStream.ts"],"names":["logger","useRef","useEffect","jsxs","jsx","React","ReactDOM","A2UI","createInstance","lazy","useA2UIActions","useState","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ServerToClientMessage } from '@a2ui/react';\n\n/** A2UI extension URI (from the A2A protocol definition). */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/** A2UI DataPart mimeType. */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n// ── Module Federation x-loader config ───────────────────────────────────────\n\n/**\n * Runtime config aligned with the `x-loader` field in the MCP Catalog.\n */\nexport interface XLoaderConfig {\n type: 'module-federation';\n /** remoteEntry.js URL (passed to MF runtime as the remote entry). */\n url: string;\n /** MF remote name (`moduleFederation.name`). */\n scope: string;\n /** Exposed module path, e.g. \"./ArtistProfile\". */\n module: string;\n}\n\n// ── A2A SSE response types ─────────────────────────────────────────────────-\n\nexport interface A2ATaskStatus {\n state: 'submitted' | 'working' | 'input-required' | 'completed' | 'failed' | 'canceled';\n /** Inline message from the agent, may contain text/data parts */\n message?: {\n kind: 'message';\n role: 'agent';\n messageId?: string;\n contextId?: string;\n // Narrowed to WirePart[] inside the hook\n parts: unknown[];\n };\n timestamp?: string;\n}\n\nexport interface A2AArtifact {\n artifactId: string;\n name?: string;\n parts: unknown[];\n index?: number;\n lastChunk?: boolean;\n metadata?: Record<string, unknown> | null;\n}\n\n/** Task status update event. */\nexport interface TaskStatusUpdateEvent {\n id: string;\n result: {\n /** Task ID */\n id: string;\n contextId: string;\n status: A2ATaskStatus;\n final: boolean;\n metadata?: Record<string, unknown> | null;\n };\n}\n\n/** Task artifact update event (usually contains the final A2UI DataParts). */\nexport interface TaskArtifactUpdateEvent {\n id: string;\n result: {\n taskId: string;\n contextId: string;\n artifact: A2AArtifact;\n };\n}\n\nexport type A2AStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── Chat / Hook types ─────────────────────────────────────────────────------\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n text: string;\n /** True when this message triggers an A2UI surface render. */\n hasSurface?: boolean;\n}\n\n/**\n * `useA2UIStream` hook options.\n */\nexport interface A2UIStreamOptions {\n /**\n * A2A Agent HTTP base URL. Defaults to `/api`.\n *\n * - `useA2UIStream({ agentUrl: '/api/a2a' })`\n */\n agentUrl?: string;\n\n /**\n * Whether `sendMessage` input is treated as an action payload (DataPart) by default.\n * If true, you can pass a JSON string directly as a `userAction` payload.\n */\n defaultIsActionPayload?: boolean;\n}\n\n/**\n * Logger creation options.\n */\nexport interface CreateLoggerOptions {\n /** Remote log endpoint. Defaults to `/api/log`. */\n endpoint?: string;\n /** Whether to hijack global console.*. Defaults to false. */\n hijackConsole?: boolean;\n}\n\n/**\n * MF Registry creation options.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CreateMFRegistryOptions {\n /**\n * Additional shared deps (merged after the default react / react-dom / @a2ui/react config).\n * Key is the package name; value is a shared config fragment for `@module-federation/enhanced/runtime`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shared?: Record<string, any>;\n\n /** Expose `window.__AUI_REGISTRY__` for debugging. Defaults to false. */\n exposeGlobal?: boolean;\n}\n\n/**\n * Payload shape for converting tool calls into A2UI messages.\n */\nexport interface ToolCallPayload {\n tool_name: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool_input?: Record<string, any>;\n}\n\nexport type { ServerToClientMessage };\n","import { useEffect, useRef } from 'react';\nimport type { CreateLoggerOptions } from './types';\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';\n\nclass RemoteLogger {\n private queue: unknown[] = [];\n private isProcessing = false;\n\n constructor(private endpoint: string) {}\n\n setEndpoint(endpoint: string) {\n this.endpoint = endpoint;\n }\n\n private async flush() {\n if (this.isProcessing || this.queue.length === 0) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const entry = this.queue.shift();\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(entry),\n });\n } catch (e) {\n // Use the original console to avoid recursion\n // eslint-disable-next-line no-console\n console.warn('[AUI Logger] Failed to sync log to backend', e);\n // Abort the current flush to avoid an infinite loop when backend is unavailable\n break;\n }\n }\n\n this.isProcessing = false;\n }\n\n log(level: LogLevel, ...args: unknown[]) {\n const time = new Date().toISOString();\n const message = args\n .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\n .join(' ');\n\n const consoleMethod = level.toLowerCase() as 'debug' | 'info' | 'warn' | 'error';\n\n // Prefer the preserved original console methods (if present)\n const original =\n (typeof window !== 'undefined' && (window as any).__AUI_ORIGINAL_CONSOLE__?.[consoleMethod]) ||\n // eslint-disable-next-line no-console\n console[consoleMethod];\n\n original(`[${level}]`, ...args);\n\n this.queue.push({ time, level, message });\n void this.flush();\n }\n}\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nlet remoteLogger: RemoteLogger | null = null;\nlet globalLogger: Logger | null = null;\n\nfunction ensureRemoteLogger(endpoint: string): RemoteLogger {\n if (!remoteLogger) {\n remoteLogger = new RemoteLogger(endpoint);\n } else {\n remoteLogger.setEndpoint(endpoint);\n }\n return remoteLogger;\n}\n\nfunction hijackConsoleIfNeeded(logger: Logger) {\n if (typeof window === 'undefined') return;\n\n const w = window as any;\n if (w.__AUI_CONSOLE_HIJACKED__) return;\n\n w.__AUI_ORIGINAL_CONSOLE__ = {\n debug: console.debug,\n info: console.info,\n log: console.log,\n warn: console.warn,\n error: console.error,\n };\n\n console.debug = (...args) => logger.debug(...args);\n console.info = (...args) => logger.info(...args);\n console.log = (...args) => logger.info(...args);\n console.warn = (...args) => logger.warn(...args);\n console.error = (...args) => logger.error(...args);\n\n w.__AUI_CONSOLE_HIJACKED__ = true;\n}\n\n/**\n * Create (or reconfigure) the global logger.\n *\n * - `endpoint`: remote log endpoint (default: `/api/log`)\n * - `hijackConsole`: whether to hijack console.* (default: false)\n */\nexport function createLogger(options?: CreateLoggerOptions): Logger {\n const endpoint = options?.endpoint ?? '/api/log';\n const hijackConsole = options?.hijackConsole ?? false;\n\n const remote = ensureRemoteLogger(endpoint);\n const logger: Logger = {\n debug: (...args: unknown[]) => remote.log('DEBUG', ...args),\n info: (...args: unknown[]) => remote.log('INFO', ...args),\n warn: (...args: unknown[]) => remote.log('WARN', ...args),\n error: (...args: unknown[]) => remote.log('ERROR', ...args),\n };\n\n if (hijackConsole) {\n hijackConsoleIfNeeded(logger);\n }\n\n globalLogger = logger;\n return logger;\n}\n\n/**\n * Default exported logger:\n * - endpoint: `/api/log`\n * - does not hijack console (configure on demand)\n */\nexport const logger: Logger = createLogger();\n\n/**\n * React hook: initialize the logger on mount and optionally hijack console.*\n */\nexport function useLogger(options?: CreateLoggerOptions): Logger {\n const optionsRef = useRef(options);\n\n useEffect(() => {\n createLogger(optionsRef.current);\n }, []);\n\n return globalLogger ?? logger;\n}\n","import React, { lazy } from 'react';\nimport ReactDOM from 'react-dom';\nimport { createInstance } from '@module-federation/enhanced/runtime';\nimport * as A2UI from '@a2ui/react';\nimport { ComponentRegistry, type ComponentRegistration } from '@a2ui/react';\nimport type { CreateMFRegistryOptions, XLoaderConfig } from './types';\nimport { logger } from './useLogger';\n\n// ── Inline ErrorPlaceholder (avoid depending on sample app components) ──────\n\nconst ErrorPlaceholder: React.FC<{ title?: string; message?: string }> = ({\n title = 'Component load failed',\n message,\n}) => (\n <div\n style={{\n padding: '0.75rem 1rem',\n borderRadius: 6,\n border: '1px solid #f5c2c7',\n background: '#f8d7da',\n color: '#842029',\n fontSize: 14,\n }}\n >\n <strong>{title}</strong>\n {message && <div style={{ marginTop: 4 }}>{message}</div>}\n </div>\n);\n\n// ── MF Runtime singleton ────────────────────────────────────────────────────\n\ntype MFInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: MFInstance | null = null;\n\nfunction createBaseShared() {\n return {\n react: {\n version: React.version,\n scope: 'default',\n lib: () => React,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n 'react-dom': {\n version: React.version,\n scope: 'default',\n lib: () => ReactDOM,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n '@a2ui/react': {\n version: '0.8.0',\n scope: 'default',\n lib: () => A2UI,\n shareConfig: {\n singleton: true,\n requiredVersion: '^0.8.0',\n },\n },\n } as const;\n}\n\nfunction ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {\n if (mfInstance) return mfInstance;\n\n const shared = {\n ...createBaseShared(),\n ...(options?.shared ?? {}),\n } as any; // MF runtime expects a loosely-typed shared map\n\n mfInstance = createInstance({\n name: 'aui_mcp_client',\n remotes: [],\n shared,\n });\n\n return mfInstance;\n}\n\n/**\n * Initialize MF runtime for an existing `ComponentRegistry`.\n *\n * - Share `react` / `react-dom` / `@a2ui/react` as singletons\n * - Allow extra shared deps via `options.shared`\n * - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`\n */\nexport function setupMFRegistry(\n registry: ComponentRegistry,\n options?: CreateMFRegistryOptions,\n): ComponentRegistry {\n ensureMFInstance(options);\n\n if (typeof window !== 'undefined' && options?.exposeGlobal) {\n (window as any).__AUI_REGISTRY__ = registry;\n }\n\n return registry;\n}\n\n/**\n * Register a single MF component (lazy-loaded with a safe ErrorPlaceholder fallback).\n */\nexport function registerMFComponent(\n registry: ComponentRegistry,\n componentType: string,\n xLoader: XLoaderConfig,\n): void {\n const mf = ensureMFInstance();\n const { url, scope, module: modulePath } = xLoader;\n\n const exposeName = modulePath.replace(/^\\.\\//, '');\n const remoteId = `${scope}/${exposeName}`;\n\n const LazyComponent = lazy(async () => {\n logger.debug(`[AUI-X] MF lazy load triggered: ${componentType} (${remoteId})`);\n try {\n mf.registerRemotes([{ name: scope, entry: url }], { force: false });\n\n const mod = await mf.loadRemote<{\n default: React.ComponentType<Record<string, unknown>>;\n }>(remoteId);\n\n if (!mod) {\n throw new Error(`[AUI-X] loadRemote returned null for \"${remoteId}\"`);\n }\n\n const Component =\n mod.default ?? (mod as unknown as React.ComponentType<Record<string, unknown>>);\n logger.info(`[AUI-X] ✅ MF component loaded OK: ${componentType}`);\n return { default: Component };\n } catch (error) {\n logger.error(\n `[AUI-X] ❌ Failed to load MF component \"${componentType}\" from \"${remoteId}\":`,\n error,\n );\n\n const Fallback: React.FC = () => (\n <ErrorPlaceholder\n title=\"Failed to load MF component\"\n message={`Unable to load remote component: ${componentType}`}\n />\n );\n\n return { default: Fallback };\n }\n });\n\n const registration: ComponentRegistration = {\n component: LazyComponent as never,\n };\n\n registry.register(componentType, registration as never);\n logger.info(\n `[AUI-X] MF component registered (runtime): ${componentType} ← ${url} → ${remoteId}`,\n );\n}\n\n/**\n * Register all `x-loader` components from a Catalog into the given registry.\n */\nexport function syncRegistryFromCatalog(\n registry: ComponentRegistry,\n catalog: Record<string, unknown>,\n): void {\n Object.entries(catalog).forEach(([type, schema]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anySchema = schema as any;\n const xLoader = (anySchema.x_loader || anySchema['x-loader']) as XLoaderConfig | undefined;\n if (!xLoader || xLoader.type !== 'module-federation') return;\n\n registerMFComponent(registry, type, xLoader);\n });\n}\n","import type { ComponentRegistry } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport { logger } from './useLogger';\nimport { syncRegistryFromCatalog } from './registry';\nimport type { ToolCallPayload } from './types';\nimport { A2UI_EXTENSION_URI } from './types';\n\ninterface A2UIValue {\n literalString?: string;\n path?: string;\n}\n\n/** Convert any input into an A2UI literalString value object. */\nfunction toLiteralStringValue(value: unknown): A2UIValue | undefined {\n if (value === undefined || value === null) return undefined;\n\n if (typeof value === 'string') {\n return { literalString: value };\n }\n\n if (typeof value === 'object') {\n const obj = value as Partial<A2UIValue>;\n if (typeof obj.literalString === 'string' || typeof obj.path === 'string') {\n return {\n ...(obj.literalString ? { literalString: obj.literalString } : {}),\n ...(obj.path ? { path: obj.path } : {}),\n };\n }\n }\n\n return { literalString: String(value) };\n}\n\n/**\n * A2A handshake:\n * - Fetch AgentCard from `{agentUrl}/agent-card`\n * - Parse `inlineCatalogs` from `capabilities.extensions`\n * - Auto-register MF components via `syncRegistryFromCatalog()`\n */\nexport async function performHandshake(\n agentUrl: string,\n registry: ComponentRegistry,\n): Promise<Record<string, unknown>> {\n try {\n const base = agentUrl.replace(/\\/$/, '');\n const handshakeUrl = base.endsWith('/agent-card') ? base : `${base}/agent-card`;\n\n const response = await fetch(handshakeUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch AgentCard from ${handshakeUrl}: ${response.statusText}`);\n }\n\n const agentCard = await response.json();\n\n const a2uiExt = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === A2UI_EXTENSION_URI,\n );\n\n if (!a2uiExt || !a2uiExt.params?.inlineCatalogs) {\n logger.warn('[AUI-X] No inlineCatalogs found in AgentCard. Handshake skipped.');\n return {};\n }\n\n const catalogs = a2uiExt.params.inlineCatalogs as Array<{\n id?: string;\n components?: Record<string, unknown>;\n }>;\n\n const allComponents: Record<string, unknown> = {};\n\n catalogs.forEach((cat) => {\n if (!cat.components) return;\n const count = Object.keys(cat.components).length;\n logger.info(\n `[AUI-X] Found catalog \"${cat.id ?? 'inline'}\", syncing ${count} components from handshake`,\n );\n Object.assign(allComponents, cat.components);\n syncRegistryFromCatalog(registry, cat.components);\n });\n\n return allComponents;\n } catch (error) {\n logger.error('[AUI-X] Handshake error:', error);\n return {};\n }\n}\n\n/**\n * Generic renderer: map a tool call to A2UI messages based on the Catalog schema.\n */\nexport function render(\n toolCall: ToolCallPayload,\n catalog: Record<string, any>,\n): ServerToClientMessage[] {\n const { tool_name, tool_input } = toolCall;\n\n // 1) Derive component type\n let componentType = tool_name;\n if (tool_name.startsWith('render_')) {\n const parts = tool_name.split('_').slice(1);\n componentType = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('');\n }\n\n const schema = catalog[componentType];\n if (!schema) {\n throw new Error(\n `[AUI-X] Component type \"${componentType}\" not found in catalog for tool \"${tool_name}\"`,\n );\n }\n\n const surfaceId = `${tool_name}-surface-handshake`;\n const rootId = 'root-column';\n\n // 2) Map props\n const props: Record<string, unknown> = {};\n if (tool_input) {\n Object.entries(tool_input).forEach(([key, value]) => {\n if (key === 'mfData' || key === 'dataModel') {\n props[key] = value;\n } else {\n const val = toLiteralStringValue(value);\n if (val) props[key] = val;\n }\n });\n }\n\n // 3) Build rendering instructions\n const components = [\n {\n id: rootId,\n component: {\n Column: {\n children: {\n explicitList: ['dynamic-card'],\n },\n },\n },\n },\n {\n id: 'dynamic-card',\n component: {\n [componentType]: props,\n },\n },\n ];\n\n return [\n {\n beginRendering: {\n surfaceId,\n root: rootId,\n styles: {\n primaryColor: '#1DB954',\n font: 'Roboto',\n },\n },\n },\n {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n },\n ];\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useA2UIActions } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport {\n A2UI_EXTENSION_URI,\n A2UI_MIME_TYPE,\n type A2AStreamEvent,\n type TaskStatusUpdateEvent,\n type TaskArtifactUpdateEvent,\n type ChatMessage,\n type A2UIStreamOptions,\n} from './types';\nimport { logger } from './useLogger';\n\n// ── A2A wire-format Part types (aligned with the Python SDK) ────────────────\n\ninterface WireTextPart {\n kind: 'text';\n text: string;\n metadata?: Record<string, string> | null;\n}\n\ninterface WireDataPart {\n kind: 'data';\n data: Record<string, unknown>;\n metadata?: Record<string, string> | null;\n}\n\ntype WirePart = WireTextPart | WireDataPart;\n\n// ── Type guards ──────────────────────────────────────────────────────────────\n\nfunction isTaskStatusUpdateEvent(e: A2AStreamEvent): e is TaskStatusUpdateEvent {\n return 'result' in e && 'status' in (e as TaskStatusUpdateEvent).result;\n}\n\nfunction isTaskArtifactUpdateEvent(e: A2AStreamEvent): e is TaskArtifactUpdateEvent {\n return 'result' in e && 'artifact' in (e as TaskArtifactUpdateEvent).result;\n}\n\nfunction isA2UIPart(part: WirePart): part is WireDataPart {\n return (\n part.kind === 'data' &&\n (part.metadata?.mimeType === A2UI_MIME_TYPE ||\n // snake_case compatibility\n (part.metadata as any)?.mime_type === A2UI_MIME_TYPE)\n );\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction extractText(parts: WirePart[]): string {\n return parts\n .filter((p): p is WireTextPart => p.kind === 'text')\n .map((p) => p.text)\n .join('');\n}\n\nfunction extractA2UIData(parts: WirePart[]): Record<string, unknown>[] {\n return parts.filter(isA2UIPart).map((p) => p.data);\n}\n\n// ── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * A2A JSON-RPC 2.0 + SSE streaming hook.\n *\n * - Defaults to `/api` as the Agent HTTP entry\n * - Supports `isActionPayload` mode to serialize user input as a DataPart\n */\nexport interface A2UIStreamPerfSnapshot {\n /** t0: request start timestamp (message/stream), in ms (performance.now) */\n t0: number;\n /** t1: timestamp when the first A2UI DataPart triggers render, in ms (performance.now) */\n t1?: number;\n /** t2: completion timestamp (SSE end or final status), in ms (performance.now) */\n t2?: number;\n /** TTFC = t1 - t0, in ms; undefined if no A2UI DataPart appears in this round */\n ttfcMs?: number;\n /** TTLC = t2 - t0, in ms */\n ttlcMs?: number;\n /** Completion reason for debugging (e.g. 'status-completed' | 'sse-end') */\n reason?: string;\n}\n\nexport function useA2UIStream(options?: A2UIStreamOptions) {\n const actions = useA2UIActions();\n\n const agentUrl = options?.agentUrl ?? '/api';\n const defaultIsActionPayload = options?.defaultIsActionPayload ?? false;\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [lastPerf, setLastPerf] = useState<A2UIStreamPerfSnapshot | null>(null);\n\n // `contextId` stays stable across the session; `taskId` persists after the first response\n const contextIdRef = useRef<string>(crypto.randomUUID());\n const taskIdRef = useRef<string | undefined>(undefined);\n\n // Perf timing state for the current round (use performance.now to avoid Date precision issues)\n const perfStateRef = useRef<{\n t0?: number;\n t1?: number;\n t2?: number;\n hasFirstComponent?: boolean;\n completed?: boolean;\n }>({});\n\n const now = () => (typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now());\n\n const markFirstComponentRendered = () => {\n const state = perfStateRef.current;\n if (!state.t0 || state.t1 || state.completed) return;\n state.t1 = now();\n };\n\n const finalizePerf = (reason: string) => {\n const state = perfStateRef.current;\n if (!state.t0 || state.completed) return;\n\n state.completed = true;\n state.t2 = state.t2 ?? now();\n\n const t0 = state.t0;\n const t1 = state.t1;\n const t2 = state.t2;\n const ttfcMs = t1 ? t1 - t0 : undefined;\n const ttlcMs = t2 - t0;\n\n const snapshot: A2UIStreamPerfSnapshot = {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n };\n\n setLastPerf(snapshot);\n\n const ttfcLabel = ttfcMs !== undefined ? `${(ttfcMs / 1000).toFixed(2)}s` : 'N/A';\n const totalLabel = `${(ttlcMs / 1000).toFixed(2)}s`;\n\n // Print a visible perf snapshot to the console for quick inspection\n // eslint-disable-next-line no-console\n console.log('[AUI-X Perf] TTFC: %s, Total: %s', ttfcLabel, totalLabel, {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n });\n };\n\n const sendMessage = useCallback(\n async (userText: string, isActionPayload = defaultIsActionPayload) => {\n if (!userText.trim() || isLoading) return;\n\n setIsLoading(true);\n // Reset timers per round and record t0\n perfStateRef.current = {\n t0: now(),\n t1: undefined,\n t2: undefined,\n hasFirstComponent: false,\n completed: false,\n };\n if (!isActionPayload) {\n setMessages((prev) => [...prev, { role: 'user', text: userText }]);\n }\n\n let assistantText = '';\n let renderedSurface = false;\n\n try {\n // ── Build message.parts ─────────────────────────────────────────\n let parts: WirePart[];\n if (isActionPayload) {\n let actionData: Record<string, unknown>;\n try {\n actionData = JSON.parse(userText) as Record<string, unknown>;\n } catch {\n actionData = { userAction: { actionName: userText, context: {} } };\n }\n parts = [{ kind: 'data', data: actionData }];\n } else {\n parts = [{ kind: 'text', text: userText }];\n }\n\n // ── Build A2A JSON-RPC request ──────────────────────────────────\n const rpcRequest = {\n jsonrpc: '2.0' as const,\n id: crypto.randomUUID(),\n method: 'message/stream' as const,\n params: {\n message: {\n kind: 'message' as const,\n role: 'user' as const,\n messageId: crypto.randomUUID(),\n contextId: contextIdRef.current,\n ...(taskIdRef.current ? { taskId: taskIdRef.current } : {}),\n extensions: [A2UI_EXTENSION_URI],\n parts,\n },\n },\n };\n\n const response = await fetch(agentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(rpcRequest),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n if (!response.body) {\n throw new Error('No response body');\n }\n\n // ── Parse SSE stream ───────────────────────────────────────────\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr || jsonStr === '[DONE]') continue;\n\n let event: A2AStreamEvent;\n try {\n event = JSON.parse(jsonStr) as A2AStreamEvent;\n } catch {\n continue;\n }\n\n // ── TaskStatusUpdateEvent ─────────────────────────────────\n if (isTaskStatusUpdateEvent(event)) {\n const { id: taskId, status } = event.result;\n\n if (taskId) taskIdRef.current = taskId;\n\n const rawParts = (status.message?.parts ?? []) as WirePart[];\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n logger.info('[A2UI] Received UI update part', {\n taskId,\n componentCount: a2uiData.length,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n const surfaces = actions.getSurfaces();\n logger.debug('[A2UI] Surfaces after process:', Array.from(surfaces.keys()));\n\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // ── TaskArtifactUpdateEvent ───────────────────────────────\n if (isTaskArtifactUpdateEvent(event)) {\n const { artifact } = event.result;\n const rawParts = (artifact.parts ?? []) as WirePart[];\n\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // If the event is final, consider this round completed and record t2 (TTLC)\n if (\n isTaskStatusUpdateEvent(event) &&\n (event.result.final || event.result.status.state === 'completed')\n ) {\n finalizePerf('status-completed');\n }\n }\n }\n\n // Fallback: ensure at least one assistant bubble\n if (!assistantText && !renderedSurface) {\n setMessages((prev) => [...prev, { role: 'assistant', text: '…' }]);\n }\n } catch (err) {\n setMessages((prev) => [\n ...prev,\n { role: 'assistant', text: `Connection error: ${String(err)}` },\n ]);\n } finally {\n setIsLoading(false);\n // Even if we didn't receive a final status, record t2 when SSE ends\n finalizePerf('sse-end');\n }\n },\n [agentUrl, defaultIsActionPayload, isLoading, actions],\n );\n\n const processLocalMessages = useCallback(\n (serverMessages: ServerToClientMessage[], label = 'Local tool call: rendered UI surface') => {\n if (!serverMessages || serverMessages.length === 0) return;\n\n logger.info('[A2UI] processLocalMessages:', label, `(${serverMessages.length} messages)`);\n logger.debug('[A2UI] Surfaces BEFORE process:', Array.from(actions.getSurfaces().keys()));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(serverMessages as any);\n\n logger.debug('[A2UI] Surfaces AFTER process:', Array.from(actions.getSurfaces().keys()));\n\n setMessages((prev) => [\n ...prev,\n {\n role: 'assistant',\n text: label,\n hasSurface: true,\n },\n ]);\n },\n [actions],\n );\n\n return { messages, isLoading, sendMessage, processLocalMessages, lastPerf };\n}\n"]}
|
package/dist/client/index.d.cts
CHANGED
|
@@ -116,20 +116,20 @@ interface ToolCallPayload {
|
|
|
116
116
|
* - Parse `inlineCatalogs` from `capabilities.extensions`
|
|
117
117
|
* - Auto-register MF components via `syncRegistryFromCatalog()`
|
|
118
118
|
*/
|
|
119
|
-
declare function performHandshake(agentUrl: string, registry
|
|
119
|
+
declare function performHandshake(agentUrl: string, registry: ComponentRegistry): Promise<Record<string, unknown>>;
|
|
120
120
|
/**
|
|
121
121
|
* Generic renderer: map a tool call to A2UI messages based on the Catalog schema.
|
|
122
122
|
*/
|
|
123
123
|
declare function render(toolCall: ToolCallPayload, catalog: Record<string, any>): ServerToClientMessage[];
|
|
124
124
|
|
|
125
125
|
/**
|
|
126
|
-
*
|
|
126
|
+
* Initialize MF runtime for an existing `ComponentRegistry`.
|
|
127
127
|
*
|
|
128
128
|
* - Share `react` / `react-dom` / `@a2ui/react` as singletons
|
|
129
129
|
* - Allow extra shared deps via `options.shared`
|
|
130
130
|
* - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`
|
|
131
131
|
*/
|
|
132
|
-
declare function
|
|
132
|
+
declare function setupMFRegistry(registry: ComponentRegistry, options?: CreateMFRegistryOptions): ComponentRegistry;
|
|
133
133
|
/**
|
|
134
134
|
* Register a single MF component (lazy-loaded with a safe ErrorPlaceholder fallback).
|
|
135
135
|
*/
|
|
@@ -191,4 +191,4 @@ declare const logger: Logger;
|
|
|
191
191
|
*/
|
|
192
192
|
declare function useLogger(options?: CreateLoggerOptions): Logger;
|
|
193
193
|
|
|
194
|
-
export { type A2AArtifact, type A2AStreamEvent, type A2ATaskStatus, type A2UIStreamOptions, type A2UIStreamPerfSnapshot, A2UI_EXTENSION_URI, A2UI_MIME_TYPE, type ChatMessage, type CreateLoggerOptions, type CreateMFRegistryOptions, type Logger, type TaskArtifactUpdateEvent, type TaskStatusUpdateEvent, type ToolCallPayload, type XLoaderConfig, createLogger,
|
|
194
|
+
export { type A2AArtifact, type A2AStreamEvent, type A2ATaskStatus, type A2UIStreamOptions, type A2UIStreamPerfSnapshot, A2UI_EXTENSION_URI, A2UI_MIME_TYPE, type ChatMessage, type CreateLoggerOptions, type CreateMFRegistryOptions, type Logger, type TaskArtifactUpdateEvent, type TaskStatusUpdateEvent, type ToolCallPayload, type XLoaderConfig, createLogger, logger, performHandshake, registerMFComponent, render, setupMFRegistry, syncRegistryFromCatalog, useA2UIStream, useLogger };
|
package/dist/client/index.d.ts
CHANGED
|
@@ -116,20 +116,20 @@ interface ToolCallPayload {
|
|
|
116
116
|
* - Parse `inlineCatalogs` from `capabilities.extensions`
|
|
117
117
|
* - Auto-register MF components via `syncRegistryFromCatalog()`
|
|
118
118
|
*/
|
|
119
|
-
declare function performHandshake(agentUrl: string, registry
|
|
119
|
+
declare function performHandshake(agentUrl: string, registry: ComponentRegistry): Promise<Record<string, unknown>>;
|
|
120
120
|
/**
|
|
121
121
|
* Generic renderer: map a tool call to A2UI messages based on the Catalog schema.
|
|
122
122
|
*/
|
|
123
123
|
declare function render(toolCall: ToolCallPayload, catalog: Record<string, any>): ServerToClientMessage[];
|
|
124
124
|
|
|
125
125
|
/**
|
|
126
|
-
*
|
|
126
|
+
* Initialize MF runtime for an existing `ComponentRegistry`.
|
|
127
127
|
*
|
|
128
128
|
* - Share `react` / `react-dom` / `@a2ui/react` as singletons
|
|
129
129
|
* - Allow extra shared deps via `options.shared`
|
|
130
130
|
* - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`
|
|
131
131
|
*/
|
|
132
|
-
declare function
|
|
132
|
+
declare function setupMFRegistry(registry: ComponentRegistry, options?: CreateMFRegistryOptions): ComponentRegistry;
|
|
133
133
|
/**
|
|
134
134
|
* Register a single MF component (lazy-loaded with a safe ErrorPlaceholder fallback).
|
|
135
135
|
*/
|
|
@@ -191,4 +191,4 @@ declare const logger: Logger;
|
|
|
191
191
|
*/
|
|
192
192
|
declare function useLogger(options?: CreateLoggerOptions): Logger;
|
|
193
193
|
|
|
194
|
-
export { type A2AArtifact, type A2AStreamEvent, type A2ATaskStatus, type A2UIStreamOptions, type A2UIStreamPerfSnapshot, A2UI_EXTENSION_URI, A2UI_MIME_TYPE, type ChatMessage, type CreateLoggerOptions, type CreateMFRegistryOptions, type Logger, type TaskArtifactUpdateEvent, type TaskStatusUpdateEvent, type ToolCallPayload, type XLoaderConfig, createLogger,
|
|
194
|
+
export { type A2AArtifact, type A2AStreamEvent, type A2ATaskStatus, type A2UIStreamOptions, type A2UIStreamPerfSnapshot, A2UI_EXTENSION_URI, A2UI_MIME_TYPE, type ChatMessage, type CreateLoggerOptions, type CreateMFRegistryOptions, type Logger, type TaskArtifactUpdateEvent, type TaskStatusUpdateEvent, type ToolCallPayload, type XLoaderConfig, createLogger, logger, performHandshake, registerMFComponent, render, setupMFRegistry, syncRegistryFromCatalog, useA2UIStream, useLogger };
|
package/dist/client/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import React, { useRef, useEffect, lazy, useState, useCallback } from 'react';
|
|
|
2
2
|
import ReactDOM from 'react-dom';
|
|
3
3
|
import { createInstance } from '@module-federation/enhanced/runtime';
|
|
4
4
|
import * as A2UI from '@a2ui/react';
|
|
5
|
-
import {
|
|
5
|
+
import { useA2UIActions } from '@a2ui/react';
|
|
6
6
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
8
|
/* aui-mcp-server */
|
|
@@ -121,10 +121,8 @@ var ErrorPlaceholder = ({
|
|
|
121
121
|
}
|
|
122
122
|
);
|
|
123
123
|
var mfInstance = null;
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (mfInstance) return mfInstance;
|
|
127
|
-
const baseShared = {
|
|
124
|
+
function createBaseShared() {
|
|
125
|
+
return {
|
|
128
126
|
react: {
|
|
129
127
|
version: React.version,
|
|
130
128
|
scope: "default",
|
|
@@ -153,8 +151,11 @@ function ensureMFInstance(options) {
|
|
|
153
151
|
}
|
|
154
152
|
}
|
|
155
153
|
};
|
|
154
|
+
}
|
|
155
|
+
function ensureMFInstance(options) {
|
|
156
|
+
if (mfInstance) return mfInstance;
|
|
156
157
|
const shared = {
|
|
157
|
-
...
|
|
158
|
+
...createBaseShared(),
|
|
158
159
|
...options?.shared ?? {}
|
|
159
160
|
};
|
|
160
161
|
mfInstance = createInstance({
|
|
@@ -164,17 +165,12 @@ function ensureMFInstance(options) {
|
|
|
164
165
|
});
|
|
165
166
|
return mfInstance;
|
|
166
167
|
}
|
|
167
|
-
function
|
|
168
|
+
function setupMFRegistry(registry, options) {
|
|
168
169
|
ensureMFInstance(options);
|
|
169
|
-
if (!registryInstance) {
|
|
170
|
-
registryInstance = ComponentRegistry.getInstance();
|
|
171
|
-
registerDefaultCatalog(registryInstance);
|
|
172
|
-
logger.info("[aui-mcp-server/react] ComponentRegistry initialized with default catalog");
|
|
173
|
-
}
|
|
174
170
|
if (typeof window !== "undefined" && options?.exposeGlobal) {
|
|
175
|
-
window.__AUI_REGISTRY__ =
|
|
171
|
+
window.__AUI_REGISTRY__ = registry;
|
|
176
172
|
}
|
|
177
|
-
return
|
|
173
|
+
return registry;
|
|
178
174
|
}
|
|
179
175
|
function registerMFComponent(registry, componentType, xLoader) {
|
|
180
176
|
const mf = ensureMFInstance();
|
|
@@ -259,7 +255,6 @@ async function performHandshake(agentUrl, registry) {
|
|
|
259
255
|
}
|
|
260
256
|
const catalogs = a2uiExt.params.inlineCatalogs;
|
|
261
257
|
const allComponents = {};
|
|
262
|
-
const effectiveRegistry = registry ?? createMFRegistry();
|
|
263
258
|
catalogs.forEach((cat) => {
|
|
264
259
|
if (!cat.components) return;
|
|
265
260
|
const count = Object.keys(cat.components).length;
|
|
@@ -267,7 +262,7 @@ async function performHandshake(agentUrl, registry) {
|
|
|
267
262
|
`[AUI-X] Found catalog "${cat.id ?? "inline"}", syncing ${count} components from handshake`
|
|
268
263
|
);
|
|
269
264
|
Object.assign(allComponents, cat.components);
|
|
270
|
-
syncRegistryFromCatalog(
|
|
265
|
+
syncRegistryFromCatalog(registry, cat.components);
|
|
271
266
|
});
|
|
272
267
|
return allComponents;
|
|
273
268
|
} catch (error) {
|
|
@@ -579,6 +574,6 @@ function useA2UIStream(options) {
|
|
|
579
574
|
return { messages, isLoading, sendMessage, processLocalMessages, lastPerf };
|
|
580
575
|
}
|
|
581
576
|
|
|
582
|
-
export { A2UI_EXTENSION_URI, A2UI_MIME_TYPE, createLogger,
|
|
577
|
+
export { A2UI_EXTENSION_URI, A2UI_MIME_TYPE, createLogger, logger, performHandshake, registerMFComponent, render, setupMFRegistry, syncRegistryFromCatalog, useA2UIStream, useLogger };
|
|
583
578
|
//# sourceMappingURL=index.js.map
|
|
584
579
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/types.ts","../../src/client/useLogger.ts","../../src/client/registry.tsx","../../src/client/handshake.ts","../../src/client/useA2UIStream.ts"],"names":["logger","useRef"],"mappings":"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","file":"index.js","sourcesContent":["import type { ServerToClientMessage } from '@a2ui/react';\n\n/** A2UI extension URI (from the A2A protocol definition). */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/** A2UI DataPart mimeType. */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n// ── Module Federation x-loader config ───────────────────────────────────────\n\n/**\n * Runtime config aligned with the `x-loader` field in the MCP Catalog.\n */\nexport interface XLoaderConfig {\n type: 'module-federation';\n /** remoteEntry.js URL (passed to MF runtime as the remote entry). */\n url: string;\n /** MF remote name (`moduleFederation.name`). */\n scope: string;\n /** Exposed module path, e.g. \"./ArtistProfile\". */\n module: string;\n}\n\n// ── A2A SSE response types ─────────────────────────────────────────────────-\n\nexport interface A2ATaskStatus {\n state: 'submitted' | 'working' | 'input-required' | 'completed' | 'failed' | 'canceled';\n /** Inline message from the agent, may contain text/data parts */\n message?: {\n kind: 'message';\n role: 'agent';\n messageId?: string;\n contextId?: string;\n // Narrowed to WirePart[] inside the hook\n parts: unknown[];\n };\n timestamp?: string;\n}\n\nexport interface A2AArtifact {\n artifactId: string;\n name?: string;\n parts: unknown[];\n index?: number;\n lastChunk?: boolean;\n metadata?: Record<string, unknown> | null;\n}\n\n/** Task status update event. */\nexport interface TaskStatusUpdateEvent {\n id: string;\n result: {\n /** Task ID */\n id: string;\n contextId: string;\n status: A2ATaskStatus;\n final: boolean;\n metadata?: Record<string, unknown> | null;\n };\n}\n\n/** Task artifact update event (usually contains the final A2UI DataParts). */\nexport interface TaskArtifactUpdateEvent {\n id: string;\n result: {\n taskId: string;\n contextId: string;\n artifact: A2AArtifact;\n };\n}\n\nexport type A2AStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── Chat / Hook types ─────────────────────────────────────────────────------\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n text: string;\n /** True when this message triggers an A2UI surface render. */\n hasSurface?: boolean;\n}\n\n/**\n * `useA2UIStream` hook options.\n */\nexport interface A2UIStreamOptions {\n /**\n * A2A Agent HTTP base URL. Defaults to `/api`.\n *\n * - `useA2UIStream({ agentUrl: '/api/a2a' })`\n */\n agentUrl?: string;\n\n /**\n * Whether `sendMessage` input is treated as an action payload (DataPart) by default.\n * If true, you can pass a JSON string directly as a `userAction` payload.\n */\n defaultIsActionPayload?: boolean;\n}\n\n/**\n * Logger creation options.\n */\nexport interface CreateLoggerOptions {\n /** Remote log endpoint. Defaults to `/api/log`. */\n endpoint?: string;\n /** Whether to hijack global console.*. Defaults to false. */\n hijackConsole?: boolean;\n}\n\n/**\n * MF Registry creation options.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CreateMFRegistryOptions {\n /**\n * Additional shared deps (merged after the default react / react-dom / @a2ui/react config).\n * Key is the package name; value is a shared config fragment for `@module-federation/enhanced/runtime`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shared?: Record<string, any>;\n\n /** Expose `window.__AUI_REGISTRY__` for debugging. Defaults to false. */\n exposeGlobal?: boolean;\n}\n\n/**\n * Payload shape for converting tool calls into A2UI messages.\n */\nexport interface ToolCallPayload {\n tool_name: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool_input?: Record<string, any>;\n}\n\nexport type { ServerToClientMessage };\n","import { useEffect, useRef } from 'react';\nimport type { CreateLoggerOptions } from './types';\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';\n\nclass RemoteLogger {\n private queue: unknown[] = [];\n private isProcessing = false;\n\n constructor(private endpoint: string) {}\n\n setEndpoint(endpoint: string) {\n this.endpoint = endpoint;\n }\n\n private async flush() {\n if (this.isProcessing || this.queue.length === 0) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const entry = this.queue.shift();\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(entry),\n });\n } catch (e) {\n // Use the original console to avoid recursion\n // eslint-disable-next-line no-console\n console.warn('[AUI Logger] Failed to sync log to backend', e);\n // Abort the current flush to avoid an infinite loop when backend is unavailable\n break;\n }\n }\n\n this.isProcessing = false;\n }\n\n log(level: LogLevel, ...args: unknown[]) {\n const time = new Date().toISOString();\n const message = args\n .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\n .join(' ');\n\n const consoleMethod = level.toLowerCase() as 'debug' | 'info' | 'warn' | 'error';\n\n // Prefer the preserved original console methods (if present)\n const original =\n (typeof window !== 'undefined' && (window as any).__AUI_ORIGINAL_CONSOLE__?.[consoleMethod]) ||\n // eslint-disable-next-line no-console\n console[consoleMethod];\n\n original(`[${level}]`, ...args);\n\n this.queue.push({ time, level, message });\n void this.flush();\n }\n}\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nlet remoteLogger: RemoteLogger | null = null;\nlet globalLogger: Logger | null = null;\n\nfunction ensureRemoteLogger(endpoint: string): RemoteLogger {\n if (!remoteLogger) {\n remoteLogger = new RemoteLogger(endpoint);\n } else {\n remoteLogger.setEndpoint(endpoint);\n }\n return remoteLogger;\n}\n\nfunction hijackConsoleIfNeeded(logger: Logger) {\n if (typeof window === 'undefined') return;\n\n const w = window as any;\n if (w.__AUI_CONSOLE_HIJACKED__) return;\n\n w.__AUI_ORIGINAL_CONSOLE__ = {\n debug: console.debug,\n info: console.info,\n log: console.log,\n warn: console.warn,\n error: console.error,\n };\n\n console.debug = (...args) => logger.debug(...args);\n console.info = (...args) => logger.info(...args);\n console.log = (...args) => logger.info(...args);\n console.warn = (...args) => logger.warn(...args);\n console.error = (...args) => logger.error(...args);\n\n w.__AUI_CONSOLE_HIJACKED__ = true;\n}\n\n/**\n * Create (or reconfigure) the global logger.\n *\n * - `endpoint`: remote log endpoint (default: `/api/log`)\n * - `hijackConsole`: whether to hijack console.* (default: false)\n */\nexport function createLogger(options?: CreateLoggerOptions): Logger {\n const endpoint = options?.endpoint ?? '/api/log';\n const hijackConsole = options?.hijackConsole ?? false;\n\n const remote = ensureRemoteLogger(endpoint);\n const logger: Logger = {\n debug: (...args: unknown[]) => remote.log('DEBUG', ...args),\n info: (...args: unknown[]) => remote.log('INFO', ...args),\n warn: (...args: unknown[]) => remote.log('WARN', ...args),\n error: (...args: unknown[]) => remote.log('ERROR', ...args),\n };\n\n if (hijackConsole) {\n hijackConsoleIfNeeded(logger);\n }\n\n globalLogger = logger;\n return logger;\n}\n\n/**\n * Default exported logger:\n * - endpoint: `/api/log`\n * - does not hijack console (configure on demand)\n */\nexport const logger: Logger = createLogger();\n\n/**\n * React hook: initialize the logger on mount and optionally hijack console.*\n */\nexport function useLogger(options?: CreateLoggerOptions): Logger {\n const optionsRef = useRef(options);\n\n useEffect(() => {\n createLogger(optionsRef.current);\n }, []);\n\n return globalLogger ?? logger;\n}\n","import React, { lazy } from 'react';\nimport ReactDOM from 'react-dom';\nimport { createInstance } from '@module-federation/enhanced/runtime';\nimport * as A2UI from '@a2ui/react';\nimport {\n ComponentRegistry,\n registerDefaultCatalog,\n type ComponentRegistration,\n} from '@a2ui/react';\nimport type { CreateMFRegistryOptions, XLoaderConfig } from './types';\nimport { logger } from './useLogger';\n\n// ── Inline ErrorPlaceholder (avoid depending on sample app components) ──────\n\nconst ErrorPlaceholder: React.FC<{ title?: string; message?: string }> = ({\n title = 'Component load failed',\n message,\n}) => (\n <div\n style={{\n padding: '0.75rem 1rem',\n borderRadius: 6,\n border: '1px solid #f5c2c7',\n background: '#f8d7da',\n color: '#842029',\n fontSize: 14,\n }}\n >\n <strong>{title}</strong>\n {message && <div style={{ marginTop: 4 }}>{message}</div>}\n </div>\n);\n\n// ── MF Runtime singleton ────────────────────────────────────────────────────\n\ntype MFInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: MFInstance | null = null;\nlet registryInstance: ComponentRegistry | null = null;\n\nfunction ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {\n if (mfInstance) return mfInstance;\n\n const baseShared = {\n react: {\n version: React.version,\n scope: 'default',\n lib: () => React,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n 'react-dom': {\n version: React.version,\n scope: 'default',\n lib: () => ReactDOM,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n '@a2ui/react': {\n version: '0.8.0',\n scope: 'default',\n lib: () => A2UI,\n shareConfig: {\n singleton: true,\n requiredVersion: '^0.8.0',\n },\n },\n } as const;\n\n const shared = {\n ...baseShared,\n ...(options?.shared ?? {}),\n } as any;\n\n mfInstance = createInstance({\n name: 'aui_mcp_client',\n remotes: [],\n shared,\n });\n\n return mfInstance;\n}\n\n/**\n * Create (or get) a `ComponentRegistry` instance and initialize the default catalog.\n *\n * - Share `react` / `react-dom` / `@a2ui/react` as singletons\n * - Allow extra shared deps via `options.shared`\n * - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`\n */\nexport function createMFRegistry(options?: CreateMFRegistryOptions): ComponentRegistry {\n ensureMFInstance(options);\n\n if (!registryInstance) {\n registryInstance = ComponentRegistry.getInstance();\n registerDefaultCatalog(registryInstance);\n logger.info('[aui-mcp-server/react] ComponentRegistry initialized with default catalog');\n }\n\n if (typeof window !== 'undefined' && options?.exposeGlobal) {\n (window as any).__AUI_REGISTRY__ = registryInstance;\n }\n\n return registryInstance;\n}\n\n/**\n * Register a single MF component (lazy-loaded with a safe ErrorPlaceholder fallback).\n */\nexport function registerMFComponent(\n registry: ComponentRegistry,\n componentType: string,\n xLoader: XLoaderConfig,\n): void {\n const mf = ensureMFInstance();\n const { url, scope, module: modulePath } = xLoader;\n\n const exposeName = modulePath.replace(/^\\.\\//, '');\n const remoteId = `${scope}/${exposeName}`;\n\n const LazyComponent = lazy(async () => {\n logger.debug(`[AUI-X] MF lazy load triggered: ${componentType} (${remoteId})`);\n try {\n mf.registerRemotes([{ name: scope, entry: url }], { force: false });\n\n const mod = await mf.loadRemote<{\n default: React.ComponentType<Record<string, unknown>>;\n }>(remoteId);\n\n if (!mod) {\n throw new Error(`[AUI-X] loadRemote returned null for \"${remoteId}\"`);\n }\n\n const Component =\n mod.default ?? (mod as unknown as React.ComponentType<Record<string, unknown>>);\n logger.info(`[AUI-X] ✅ MF component loaded OK: ${componentType}`);\n return { default: Component };\n } catch (error) {\n logger.error(\n `[AUI-X] ❌ Failed to load MF component \"${componentType}\" from \"${remoteId}\":`,\n error,\n );\n\n const Fallback: React.FC = () => (\n <ErrorPlaceholder\n title=\"Failed to load MF component\"\n message={`Unable to load remote component: ${componentType}`}\n />\n );\n\n return { default: Fallback };\n }\n });\n\n const registration: ComponentRegistration = {\n component: LazyComponent as never,\n };\n\n registry.register(componentType, registration as never);\n logger.info(\n `[AUI-X] MF component registered (runtime): ${componentType} ← ${url} → ${remoteId}`,\n );\n}\n\n/**\n * Register all `x-loader` components from a Catalog into the given registry.\n */\nexport function syncRegistryFromCatalog(\n registry: ComponentRegistry,\n catalog: Record<string, unknown>,\n): void {\n Object.entries(catalog).forEach(([type, schema]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anySchema = schema as any;\n const xLoader = (anySchema.x_loader || anySchema['x-loader']) as XLoaderConfig | undefined;\n if (!xLoader || xLoader.type !== 'module-federation') return;\n\n registerMFComponent(registry, type, xLoader);\n });\n}\n","import type { ComponentRegistry } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport { logger } from './useLogger';\nimport { createMFRegistry, syncRegistryFromCatalog } from './registry';\nimport type { ToolCallPayload } from './types';\nimport { A2UI_EXTENSION_URI } from './types';\n\ninterface A2UIValue {\n literalString?: string;\n path?: string;\n}\n\n/** Convert any input into an A2UI literalString value object. */\nfunction toLiteralStringValue(value: unknown): A2UIValue | undefined {\n if (value === undefined || value === null) return undefined;\n\n if (typeof value === 'string') {\n return { literalString: value };\n }\n\n if (typeof value === 'object') {\n const obj = value as Partial<A2UIValue>;\n if (typeof obj.literalString === 'string' || typeof obj.path === 'string') {\n return {\n ...(obj.literalString ? { literalString: obj.literalString } : {}),\n ...(obj.path ? { path: obj.path } : {}),\n };\n }\n }\n\n return { literalString: String(value) };\n}\n\n/**\n * A2A handshake:\n * - Fetch AgentCard from `{agentUrl}/agent-card`\n * - Parse `inlineCatalogs` from `capabilities.extensions`\n * - Auto-register MF components via `syncRegistryFromCatalog()`\n */\nexport async function performHandshake(\n agentUrl: string,\n registry?: ComponentRegistry,\n): Promise<Record<string, unknown>> {\n try {\n const base = agentUrl.replace(/\\/$/, '');\n const handshakeUrl = base.endsWith('/agent-card') ? base : `${base}/agent-card`;\n\n const response = await fetch(handshakeUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch AgentCard from ${handshakeUrl}: ${response.statusText}`);\n }\n\n const agentCard = await response.json();\n\n const a2uiExt = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === A2UI_EXTENSION_URI,\n );\n\n if (!a2uiExt || !a2uiExt.params?.inlineCatalogs) {\n logger.warn('[AUI-X] No inlineCatalogs found in AgentCard. Handshake skipped.');\n return {};\n }\n\n const catalogs = a2uiExt.params.inlineCatalogs as Array<{\n id?: string;\n components?: Record<string, unknown>;\n }>;\n\n const allComponents: Record<string, unknown> = {};\n const effectiveRegistry = registry ?? createMFRegistry();\n\n catalogs.forEach((cat) => {\n if (!cat.components) return;\n const count = Object.keys(cat.components).length;\n logger.info(\n `[AUI-X] Found catalog \"${cat.id ?? 'inline'}\", syncing ${count} components from handshake`,\n );\n Object.assign(allComponents, cat.components);\n syncRegistryFromCatalog(effectiveRegistry, cat.components);\n });\n\n return allComponents;\n } catch (error) {\n logger.error('[AUI-X] Handshake error:', error);\n return {};\n }\n}\n\n/**\n * Generic renderer: map a tool call to A2UI messages based on the Catalog schema.\n */\nexport function render(\n toolCall: ToolCallPayload,\n catalog: Record<string, any>,\n): ServerToClientMessage[] {\n const { tool_name, tool_input } = toolCall;\n\n // 1) Derive component type\n let componentType = tool_name;\n if (tool_name.startsWith('render_')) {\n const parts = tool_name.split('_').slice(1);\n componentType = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('');\n }\n\n const schema = catalog[componentType];\n if (!schema) {\n throw new Error(\n `[AUI-X] Component type \"${componentType}\" not found in catalog for tool \"${tool_name}\"`,\n );\n }\n\n const surfaceId = `${tool_name}-surface-handshake`;\n const rootId = 'root-column';\n\n // 2) Map props\n const props: Record<string, unknown> = {};\n if (tool_input) {\n Object.entries(tool_input).forEach(([key, value]) => {\n if (key === 'mfData' || key === 'dataModel') {\n props[key] = value;\n } else {\n const val = toLiteralStringValue(value);\n if (val) props[key] = val;\n }\n });\n }\n\n // 3) Build rendering instructions\n const components = [\n {\n id: rootId,\n component: {\n Column: {\n children: {\n explicitList: ['dynamic-card'],\n },\n },\n },\n },\n {\n id: 'dynamic-card',\n component: {\n [componentType]: props,\n },\n },\n ];\n\n return [\n {\n beginRendering: {\n surfaceId,\n root: rootId,\n styles: {\n primaryColor: '#1DB954',\n font: 'Roboto',\n },\n },\n },\n {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n },\n ];\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useA2UIActions } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport {\n A2UI_EXTENSION_URI,\n A2UI_MIME_TYPE,\n type A2AStreamEvent,\n type TaskStatusUpdateEvent,\n type TaskArtifactUpdateEvent,\n type ChatMessage,\n type A2UIStreamOptions,\n} from './types';\nimport { logger } from './useLogger';\n\n// ── A2A wire-format Part types (aligned with the Python SDK) ────────────────\n\ninterface WireTextPart {\n kind: 'text';\n text: string;\n metadata?: Record<string, string> | null;\n}\n\ninterface WireDataPart {\n kind: 'data';\n data: Record<string, unknown>;\n metadata?: Record<string, string> | null;\n}\n\ntype WirePart = WireTextPart | WireDataPart;\n\n// ── Type guards ──────────────────────────────────────────────────────────────\n\nfunction isTaskStatusUpdateEvent(e: A2AStreamEvent): e is TaskStatusUpdateEvent {\n return 'result' in e && 'status' in (e as TaskStatusUpdateEvent).result;\n}\n\nfunction isTaskArtifactUpdateEvent(e: A2AStreamEvent): e is TaskArtifactUpdateEvent {\n return 'result' in e && 'artifact' in (e as TaskArtifactUpdateEvent).result;\n}\n\nfunction isA2UIPart(part: WirePart): part is WireDataPart {\n return (\n part.kind === 'data' &&\n (part.metadata?.mimeType === A2UI_MIME_TYPE ||\n // snake_case compatibility\n (part.metadata as any)?.mime_type === A2UI_MIME_TYPE)\n );\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction extractText(parts: WirePart[]): string {\n return parts\n .filter((p): p is WireTextPart => p.kind === 'text')\n .map((p) => p.text)\n .join('');\n}\n\nfunction extractA2UIData(parts: WirePart[]): Record<string, unknown>[] {\n return parts.filter(isA2UIPart).map((p) => p.data);\n}\n\n// ── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * A2A JSON-RPC 2.0 + SSE streaming hook.\n *\n * - Defaults to `/api` as the Agent HTTP entry\n * - Supports `isActionPayload` mode to serialize user input as a DataPart\n */\nexport interface A2UIStreamPerfSnapshot {\n /** t0: request start timestamp (message/stream), in ms (performance.now) */\n t0: number;\n /** t1: timestamp when the first A2UI DataPart triggers render, in ms (performance.now) */\n t1?: number;\n /** t2: completion timestamp (SSE end or final status), in ms (performance.now) */\n t2?: number;\n /** TTFC = t1 - t0, in ms; undefined if no A2UI DataPart appears in this round */\n ttfcMs?: number;\n /** TTLC = t2 - t0, in ms */\n ttlcMs?: number;\n /** Completion reason for debugging (e.g. 'status-completed' | 'sse-end') */\n reason?: string;\n}\n\nexport function useA2UIStream(options?: A2UIStreamOptions) {\n const actions = useA2UIActions();\n\n const agentUrl = options?.agentUrl ?? '/api';\n const defaultIsActionPayload = options?.defaultIsActionPayload ?? false;\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [lastPerf, setLastPerf] = useState<A2UIStreamPerfSnapshot | null>(null);\n\n // `contextId` stays stable across the session; `taskId` persists after the first response\n const contextIdRef = useRef<string>(crypto.randomUUID());\n const taskIdRef = useRef<string | undefined>(undefined);\n\n // Perf timing state for the current round (use performance.now to avoid Date precision issues)\n const perfStateRef = useRef<{\n t0?: number;\n t1?: number;\n t2?: number;\n hasFirstComponent?: boolean;\n completed?: boolean;\n }>({});\n\n const now = () => (typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now());\n\n const markFirstComponentRendered = () => {\n const state = perfStateRef.current;\n if (!state.t0 || state.t1 || state.completed) return;\n state.t1 = now();\n };\n\n const finalizePerf = (reason: string) => {\n const state = perfStateRef.current;\n if (!state.t0 || state.completed) return;\n\n state.completed = true;\n state.t2 = state.t2 ?? now();\n\n const t0 = state.t0;\n const t1 = state.t1;\n const t2 = state.t2;\n const ttfcMs = t1 ? t1 - t0 : undefined;\n const ttlcMs = t2 - t0;\n\n const snapshot: A2UIStreamPerfSnapshot = {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n };\n\n setLastPerf(snapshot);\n\n const ttfcLabel = ttfcMs !== undefined ? `${(ttfcMs / 1000).toFixed(2)}s` : 'N/A';\n const totalLabel = `${(ttlcMs / 1000).toFixed(2)}s`;\n\n // Print a visible perf snapshot to the console for quick inspection\n // eslint-disable-next-line no-console\n console.log('[AUI-X Perf] TTFC: %s, Total: %s', ttfcLabel, totalLabel, {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n });\n };\n\n const sendMessage = useCallback(\n async (userText: string, isActionPayload = defaultIsActionPayload) => {\n if (!userText.trim() || isLoading) return;\n\n setIsLoading(true);\n // Reset timers per round and record t0\n perfStateRef.current = {\n t0: now(),\n t1: undefined,\n t2: undefined,\n hasFirstComponent: false,\n completed: false,\n };\n if (!isActionPayload) {\n setMessages((prev) => [...prev, { role: 'user', text: userText }]);\n }\n\n let assistantText = '';\n let renderedSurface = false;\n\n try {\n // ── Build message.parts ─────────────────────────────────────────\n let parts: WirePart[];\n if (isActionPayload) {\n let actionData: Record<string, unknown>;\n try {\n actionData = JSON.parse(userText) as Record<string, unknown>;\n } catch {\n actionData = { userAction: { actionName: userText, context: {} } };\n }\n parts = [{ kind: 'data', data: actionData }];\n } else {\n parts = [{ kind: 'text', text: userText }];\n }\n\n // ── Build A2A JSON-RPC request ──────────────────────────────────\n const rpcRequest = {\n jsonrpc: '2.0' as const,\n id: crypto.randomUUID(),\n method: 'message/stream' as const,\n params: {\n message: {\n kind: 'message' as const,\n role: 'user' as const,\n messageId: crypto.randomUUID(),\n contextId: contextIdRef.current,\n ...(taskIdRef.current ? { taskId: taskIdRef.current } : {}),\n extensions: [A2UI_EXTENSION_URI],\n parts,\n },\n },\n };\n\n const response = await fetch(agentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(rpcRequest),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n if (!response.body) {\n throw new Error('No response body');\n }\n\n // ── Parse SSE stream ───────────────────────────────────────────\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr || jsonStr === '[DONE]') continue;\n\n let event: A2AStreamEvent;\n try {\n event = JSON.parse(jsonStr) as A2AStreamEvent;\n } catch {\n continue;\n }\n\n // ── TaskStatusUpdateEvent ─────────────────────────────────\n if (isTaskStatusUpdateEvent(event)) {\n const { id: taskId, status } = event.result;\n\n if (taskId) taskIdRef.current = taskId;\n\n const rawParts = (status.message?.parts ?? []) as WirePart[];\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n logger.info('[A2UI] Received UI update part', {\n taskId,\n componentCount: a2uiData.length,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n const surfaces = actions.getSurfaces();\n logger.debug('[A2UI] Surfaces after process:', Array.from(surfaces.keys()));\n\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // ── TaskArtifactUpdateEvent ───────────────────────────────\n if (isTaskArtifactUpdateEvent(event)) {\n const { artifact } = event.result;\n const rawParts = (artifact.parts ?? []) as WirePart[];\n\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // If the event is final, consider this round completed and record t2 (TTLC)\n if (\n isTaskStatusUpdateEvent(event) &&\n (event.result.final || event.result.status.state === 'completed')\n ) {\n finalizePerf('status-completed');\n }\n }\n }\n\n // Fallback: ensure at least one assistant bubble\n if (!assistantText && !renderedSurface) {\n setMessages((prev) => [...prev, { role: 'assistant', text: '…' }]);\n }\n } catch (err) {\n setMessages((prev) => [\n ...prev,\n { role: 'assistant', text: `Connection error: ${String(err)}` },\n ]);\n } finally {\n setIsLoading(false);\n // Even if we didn't receive a final status, record t2 when SSE ends\n finalizePerf('sse-end');\n }\n },\n [agentUrl, defaultIsActionPayload, isLoading, actions],\n );\n\n const processLocalMessages = useCallback(\n (serverMessages: ServerToClientMessage[], label = 'Local tool call: rendered UI surface') => {\n if (!serverMessages || serverMessages.length === 0) return;\n\n logger.info('[A2UI] processLocalMessages:', label, `(${serverMessages.length} messages)`);\n logger.debug('[A2UI] Surfaces BEFORE process:', Array.from(actions.getSurfaces().keys()));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(serverMessages as any);\n\n logger.debug('[A2UI] Surfaces AFTER process:', Array.from(actions.getSurfaces().keys()));\n\n setMessages((prev) => [\n ...prev,\n {\n role: 'assistant',\n text: label,\n hasSurface: true,\n },\n ]);\n },\n [actions],\n );\n\n return { messages, isLoading, sendMessage, processLocalMessages, lastPerf };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/types.ts","../../src/client/useLogger.ts","../../src/client/registry.tsx","../../src/client/handshake.ts","../../src/client/useA2UIStream.ts"],"names":["logger","useRef"],"mappings":"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","file":"index.js","sourcesContent":["import type { ServerToClientMessage } from '@a2ui/react';\n\n/** A2UI extension URI (from the A2A protocol definition). */\nexport const A2UI_EXTENSION_URI = 'https://a2ui.org/a2a-extension/a2ui/v0.8';\n\n/** A2UI DataPart mimeType. */\nexport const A2UI_MIME_TYPE = 'application/json+a2ui';\n\n// ── Module Federation x-loader config ───────────────────────────────────────\n\n/**\n * Runtime config aligned with the `x-loader` field in the MCP Catalog.\n */\nexport interface XLoaderConfig {\n type: 'module-federation';\n /** remoteEntry.js URL (passed to MF runtime as the remote entry). */\n url: string;\n /** MF remote name (`moduleFederation.name`). */\n scope: string;\n /** Exposed module path, e.g. \"./ArtistProfile\". */\n module: string;\n}\n\n// ── A2A SSE response types ─────────────────────────────────────────────────-\n\nexport interface A2ATaskStatus {\n state: 'submitted' | 'working' | 'input-required' | 'completed' | 'failed' | 'canceled';\n /** Inline message from the agent, may contain text/data parts */\n message?: {\n kind: 'message';\n role: 'agent';\n messageId?: string;\n contextId?: string;\n // Narrowed to WirePart[] inside the hook\n parts: unknown[];\n };\n timestamp?: string;\n}\n\nexport interface A2AArtifact {\n artifactId: string;\n name?: string;\n parts: unknown[];\n index?: number;\n lastChunk?: boolean;\n metadata?: Record<string, unknown> | null;\n}\n\n/** Task status update event. */\nexport interface TaskStatusUpdateEvent {\n id: string;\n result: {\n /** Task ID */\n id: string;\n contextId: string;\n status: A2ATaskStatus;\n final: boolean;\n metadata?: Record<string, unknown> | null;\n };\n}\n\n/** Task artifact update event (usually contains the final A2UI DataParts). */\nexport interface TaskArtifactUpdateEvent {\n id: string;\n result: {\n taskId: string;\n contextId: string;\n artifact: A2AArtifact;\n };\n}\n\nexport type A2AStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── Chat / Hook types ─────────────────────────────────────────────────------\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n text: string;\n /** True when this message triggers an A2UI surface render. */\n hasSurface?: boolean;\n}\n\n/**\n * `useA2UIStream` hook options.\n */\nexport interface A2UIStreamOptions {\n /**\n * A2A Agent HTTP base URL. Defaults to `/api`.\n *\n * - `useA2UIStream({ agentUrl: '/api/a2a' })`\n */\n agentUrl?: string;\n\n /**\n * Whether `sendMessage` input is treated as an action payload (DataPart) by default.\n * If true, you can pass a JSON string directly as a `userAction` payload.\n */\n defaultIsActionPayload?: boolean;\n}\n\n/**\n * Logger creation options.\n */\nexport interface CreateLoggerOptions {\n /** Remote log endpoint. Defaults to `/api/log`. */\n endpoint?: string;\n /** Whether to hijack global console.*. Defaults to false. */\n hijackConsole?: boolean;\n}\n\n/**\n * MF Registry creation options.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CreateMFRegistryOptions {\n /**\n * Additional shared deps (merged after the default react / react-dom / @a2ui/react config).\n * Key is the package name; value is a shared config fragment for `@module-federation/enhanced/runtime`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shared?: Record<string, any>;\n\n /** Expose `window.__AUI_REGISTRY__` for debugging. Defaults to false. */\n exposeGlobal?: boolean;\n}\n\n/**\n * Payload shape for converting tool calls into A2UI messages.\n */\nexport interface ToolCallPayload {\n tool_name: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tool_input?: Record<string, any>;\n}\n\nexport type { ServerToClientMessage };\n","import { useEffect, useRef } from 'react';\nimport type { CreateLoggerOptions } from './types';\n\ntype LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';\n\nclass RemoteLogger {\n private queue: unknown[] = [];\n private isProcessing = false;\n\n constructor(private endpoint: string) {}\n\n setEndpoint(endpoint: string) {\n this.endpoint = endpoint;\n }\n\n private async flush() {\n if (this.isProcessing || this.queue.length === 0) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const entry = this.queue.shift();\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(entry),\n });\n } catch (e) {\n // Use the original console to avoid recursion\n // eslint-disable-next-line no-console\n console.warn('[AUI Logger] Failed to sync log to backend', e);\n // Abort the current flush to avoid an infinite loop when backend is unavailable\n break;\n }\n }\n\n this.isProcessing = false;\n }\n\n log(level: LogLevel, ...args: unknown[]) {\n const time = new Date().toISOString();\n const message = args\n .map((arg) => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)))\n .join(' ');\n\n const consoleMethod = level.toLowerCase() as 'debug' | 'info' | 'warn' | 'error';\n\n // Prefer the preserved original console methods (if present)\n const original =\n (typeof window !== 'undefined' && (window as any).__AUI_ORIGINAL_CONSOLE__?.[consoleMethod]) ||\n // eslint-disable-next-line no-console\n console[consoleMethod];\n\n original(`[${level}]`, ...args);\n\n this.queue.push({ time, level, message });\n void this.flush();\n }\n}\n\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nlet remoteLogger: RemoteLogger | null = null;\nlet globalLogger: Logger | null = null;\n\nfunction ensureRemoteLogger(endpoint: string): RemoteLogger {\n if (!remoteLogger) {\n remoteLogger = new RemoteLogger(endpoint);\n } else {\n remoteLogger.setEndpoint(endpoint);\n }\n return remoteLogger;\n}\n\nfunction hijackConsoleIfNeeded(logger: Logger) {\n if (typeof window === 'undefined') return;\n\n const w = window as any;\n if (w.__AUI_CONSOLE_HIJACKED__) return;\n\n w.__AUI_ORIGINAL_CONSOLE__ = {\n debug: console.debug,\n info: console.info,\n log: console.log,\n warn: console.warn,\n error: console.error,\n };\n\n console.debug = (...args) => logger.debug(...args);\n console.info = (...args) => logger.info(...args);\n console.log = (...args) => logger.info(...args);\n console.warn = (...args) => logger.warn(...args);\n console.error = (...args) => logger.error(...args);\n\n w.__AUI_CONSOLE_HIJACKED__ = true;\n}\n\n/**\n * Create (or reconfigure) the global logger.\n *\n * - `endpoint`: remote log endpoint (default: `/api/log`)\n * - `hijackConsole`: whether to hijack console.* (default: false)\n */\nexport function createLogger(options?: CreateLoggerOptions): Logger {\n const endpoint = options?.endpoint ?? '/api/log';\n const hijackConsole = options?.hijackConsole ?? false;\n\n const remote = ensureRemoteLogger(endpoint);\n const logger: Logger = {\n debug: (...args: unknown[]) => remote.log('DEBUG', ...args),\n info: (...args: unknown[]) => remote.log('INFO', ...args),\n warn: (...args: unknown[]) => remote.log('WARN', ...args),\n error: (...args: unknown[]) => remote.log('ERROR', ...args),\n };\n\n if (hijackConsole) {\n hijackConsoleIfNeeded(logger);\n }\n\n globalLogger = logger;\n return logger;\n}\n\n/**\n * Default exported logger:\n * - endpoint: `/api/log`\n * - does not hijack console (configure on demand)\n */\nexport const logger: Logger = createLogger();\n\n/**\n * React hook: initialize the logger on mount and optionally hijack console.*\n */\nexport function useLogger(options?: CreateLoggerOptions): Logger {\n const optionsRef = useRef(options);\n\n useEffect(() => {\n createLogger(optionsRef.current);\n }, []);\n\n return globalLogger ?? logger;\n}\n","import React, { lazy } from 'react';\nimport ReactDOM from 'react-dom';\nimport { createInstance } from '@module-federation/enhanced/runtime';\nimport * as A2UI from '@a2ui/react';\nimport { ComponentRegistry, type ComponentRegistration } from '@a2ui/react';\nimport type { CreateMFRegistryOptions, XLoaderConfig } from './types';\nimport { logger } from './useLogger';\n\n// ── Inline ErrorPlaceholder (avoid depending on sample app components) ──────\n\nconst ErrorPlaceholder: React.FC<{ title?: string; message?: string }> = ({\n title = 'Component load failed',\n message,\n}) => (\n <div\n style={{\n padding: '0.75rem 1rem',\n borderRadius: 6,\n border: '1px solid #f5c2c7',\n background: '#f8d7da',\n color: '#842029',\n fontSize: 14,\n }}\n >\n <strong>{title}</strong>\n {message && <div style={{ marginTop: 4 }}>{message}</div>}\n </div>\n);\n\n// ── MF Runtime singleton ────────────────────────────────────────────────────\n\ntype MFInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: MFInstance | null = null;\n\nfunction createBaseShared() {\n return {\n react: {\n version: React.version,\n scope: 'default',\n lib: () => React,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n 'react-dom': {\n version: React.version,\n scope: 'default',\n lib: () => ReactDOM,\n shareConfig: {\n singleton: true,\n requiredVersion: '^18.0.0',\n },\n },\n '@a2ui/react': {\n version: '0.8.0',\n scope: 'default',\n lib: () => A2UI,\n shareConfig: {\n singleton: true,\n requiredVersion: '^0.8.0',\n },\n },\n } as const;\n}\n\nfunction ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {\n if (mfInstance) return mfInstance;\n\n const shared = {\n ...createBaseShared(),\n ...(options?.shared ?? {}),\n } as any; // MF runtime expects a loosely-typed shared map\n\n mfInstance = createInstance({\n name: 'aui_mcp_client',\n remotes: [],\n shared,\n });\n\n return mfInstance;\n}\n\n/**\n * Initialize MF runtime for an existing `ComponentRegistry`.\n *\n * - Share `react` / `react-dom` / `@a2ui/react` as singletons\n * - Allow extra shared deps via `options.shared`\n * - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`\n */\nexport function setupMFRegistry(\n registry: ComponentRegistry,\n options?: CreateMFRegistryOptions,\n): ComponentRegistry {\n ensureMFInstance(options);\n\n if (typeof window !== 'undefined' && options?.exposeGlobal) {\n (window as any).__AUI_REGISTRY__ = registry;\n }\n\n return registry;\n}\n\n/**\n * Register a single MF component (lazy-loaded with a safe ErrorPlaceholder fallback).\n */\nexport function registerMFComponent(\n registry: ComponentRegistry,\n componentType: string,\n xLoader: XLoaderConfig,\n): void {\n const mf = ensureMFInstance();\n const { url, scope, module: modulePath } = xLoader;\n\n const exposeName = modulePath.replace(/^\\.\\//, '');\n const remoteId = `${scope}/${exposeName}`;\n\n const LazyComponent = lazy(async () => {\n logger.debug(`[AUI-X] MF lazy load triggered: ${componentType} (${remoteId})`);\n try {\n mf.registerRemotes([{ name: scope, entry: url }], { force: false });\n\n const mod = await mf.loadRemote<{\n default: React.ComponentType<Record<string, unknown>>;\n }>(remoteId);\n\n if (!mod) {\n throw new Error(`[AUI-X] loadRemote returned null for \"${remoteId}\"`);\n }\n\n const Component =\n mod.default ?? (mod as unknown as React.ComponentType<Record<string, unknown>>);\n logger.info(`[AUI-X] ✅ MF component loaded OK: ${componentType}`);\n return { default: Component };\n } catch (error) {\n logger.error(\n `[AUI-X] ❌ Failed to load MF component \"${componentType}\" from \"${remoteId}\":`,\n error,\n );\n\n const Fallback: React.FC = () => (\n <ErrorPlaceholder\n title=\"Failed to load MF component\"\n message={`Unable to load remote component: ${componentType}`}\n />\n );\n\n return { default: Fallback };\n }\n });\n\n const registration: ComponentRegistration = {\n component: LazyComponent as never,\n };\n\n registry.register(componentType, registration as never);\n logger.info(\n `[AUI-X] MF component registered (runtime): ${componentType} ← ${url} → ${remoteId}`,\n );\n}\n\n/**\n * Register all `x-loader` components from a Catalog into the given registry.\n */\nexport function syncRegistryFromCatalog(\n registry: ComponentRegistry,\n catalog: Record<string, unknown>,\n): void {\n Object.entries(catalog).forEach(([type, schema]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anySchema = schema as any;\n const xLoader = (anySchema.x_loader || anySchema['x-loader']) as XLoaderConfig | undefined;\n if (!xLoader || xLoader.type !== 'module-federation') return;\n\n registerMFComponent(registry, type, xLoader);\n });\n}\n","import type { ComponentRegistry } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport { logger } from './useLogger';\nimport { syncRegistryFromCatalog } from './registry';\nimport type { ToolCallPayload } from './types';\nimport { A2UI_EXTENSION_URI } from './types';\n\ninterface A2UIValue {\n literalString?: string;\n path?: string;\n}\n\n/** Convert any input into an A2UI literalString value object. */\nfunction toLiteralStringValue(value: unknown): A2UIValue | undefined {\n if (value === undefined || value === null) return undefined;\n\n if (typeof value === 'string') {\n return { literalString: value };\n }\n\n if (typeof value === 'object') {\n const obj = value as Partial<A2UIValue>;\n if (typeof obj.literalString === 'string' || typeof obj.path === 'string') {\n return {\n ...(obj.literalString ? { literalString: obj.literalString } : {}),\n ...(obj.path ? { path: obj.path } : {}),\n };\n }\n }\n\n return { literalString: String(value) };\n}\n\n/**\n * A2A handshake:\n * - Fetch AgentCard from `{agentUrl}/agent-card`\n * - Parse `inlineCatalogs` from `capabilities.extensions`\n * - Auto-register MF components via `syncRegistryFromCatalog()`\n */\nexport async function performHandshake(\n agentUrl: string,\n registry: ComponentRegistry,\n): Promise<Record<string, unknown>> {\n try {\n const base = agentUrl.replace(/\\/$/, '');\n const handshakeUrl = base.endsWith('/agent-card') ? base : `${base}/agent-card`;\n\n const response = await fetch(handshakeUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch AgentCard from ${handshakeUrl}: ${response.statusText}`);\n }\n\n const agentCard = await response.json();\n\n const a2uiExt = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === A2UI_EXTENSION_URI,\n );\n\n if (!a2uiExt || !a2uiExt.params?.inlineCatalogs) {\n logger.warn('[AUI-X] No inlineCatalogs found in AgentCard. Handshake skipped.');\n return {};\n }\n\n const catalogs = a2uiExt.params.inlineCatalogs as Array<{\n id?: string;\n components?: Record<string, unknown>;\n }>;\n\n const allComponents: Record<string, unknown> = {};\n\n catalogs.forEach((cat) => {\n if (!cat.components) return;\n const count = Object.keys(cat.components).length;\n logger.info(\n `[AUI-X] Found catalog \"${cat.id ?? 'inline'}\", syncing ${count} components from handshake`,\n );\n Object.assign(allComponents, cat.components);\n syncRegistryFromCatalog(registry, cat.components);\n });\n\n return allComponents;\n } catch (error) {\n logger.error('[AUI-X] Handshake error:', error);\n return {};\n }\n}\n\n/**\n * Generic renderer: map a tool call to A2UI messages based on the Catalog schema.\n */\nexport function render(\n toolCall: ToolCallPayload,\n catalog: Record<string, any>,\n): ServerToClientMessage[] {\n const { tool_name, tool_input } = toolCall;\n\n // 1) Derive component type\n let componentType = tool_name;\n if (tool_name.startsWith('render_')) {\n const parts = tool_name.split('_').slice(1);\n componentType = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('');\n }\n\n const schema = catalog[componentType];\n if (!schema) {\n throw new Error(\n `[AUI-X] Component type \"${componentType}\" not found in catalog for tool \"${tool_name}\"`,\n );\n }\n\n const surfaceId = `${tool_name}-surface-handshake`;\n const rootId = 'root-column';\n\n // 2) Map props\n const props: Record<string, unknown> = {};\n if (tool_input) {\n Object.entries(tool_input).forEach(([key, value]) => {\n if (key === 'mfData' || key === 'dataModel') {\n props[key] = value;\n } else {\n const val = toLiteralStringValue(value);\n if (val) props[key] = val;\n }\n });\n }\n\n // 3) Build rendering instructions\n const components = [\n {\n id: rootId,\n component: {\n Column: {\n children: {\n explicitList: ['dynamic-card'],\n },\n },\n },\n },\n {\n id: 'dynamic-card',\n component: {\n [componentType]: props,\n },\n },\n ];\n\n return [\n {\n beginRendering: {\n surfaceId,\n root: rootId,\n styles: {\n primaryColor: '#1DB954',\n font: 'Roboto',\n },\n },\n },\n {\n surfaceUpdate: {\n surfaceId,\n components,\n },\n },\n ];\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { useA2UIActions } from '@a2ui/react';\nimport type { ServerToClientMessage } from '@a2ui/react';\nimport {\n A2UI_EXTENSION_URI,\n A2UI_MIME_TYPE,\n type A2AStreamEvent,\n type TaskStatusUpdateEvent,\n type TaskArtifactUpdateEvent,\n type ChatMessage,\n type A2UIStreamOptions,\n} from './types';\nimport { logger } from './useLogger';\n\n// ── A2A wire-format Part types (aligned with the Python SDK) ────────────────\n\ninterface WireTextPart {\n kind: 'text';\n text: string;\n metadata?: Record<string, string> | null;\n}\n\ninterface WireDataPart {\n kind: 'data';\n data: Record<string, unknown>;\n metadata?: Record<string, string> | null;\n}\n\ntype WirePart = WireTextPart | WireDataPart;\n\n// ── Type guards ──────────────────────────────────────────────────────────────\n\nfunction isTaskStatusUpdateEvent(e: A2AStreamEvent): e is TaskStatusUpdateEvent {\n return 'result' in e && 'status' in (e as TaskStatusUpdateEvent).result;\n}\n\nfunction isTaskArtifactUpdateEvent(e: A2AStreamEvent): e is TaskArtifactUpdateEvent {\n return 'result' in e && 'artifact' in (e as TaskArtifactUpdateEvent).result;\n}\n\nfunction isA2UIPart(part: WirePart): part is WireDataPart {\n return (\n part.kind === 'data' &&\n (part.metadata?.mimeType === A2UI_MIME_TYPE ||\n // snake_case compatibility\n (part.metadata as any)?.mime_type === A2UI_MIME_TYPE)\n );\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction extractText(parts: WirePart[]): string {\n return parts\n .filter((p): p is WireTextPart => p.kind === 'text')\n .map((p) => p.text)\n .join('');\n}\n\nfunction extractA2UIData(parts: WirePart[]): Record<string, unknown>[] {\n return parts.filter(isA2UIPart).map((p) => p.data);\n}\n\n// ── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * A2A JSON-RPC 2.0 + SSE streaming hook.\n *\n * - Defaults to `/api` as the Agent HTTP entry\n * - Supports `isActionPayload` mode to serialize user input as a DataPart\n */\nexport interface A2UIStreamPerfSnapshot {\n /** t0: request start timestamp (message/stream), in ms (performance.now) */\n t0: number;\n /** t1: timestamp when the first A2UI DataPart triggers render, in ms (performance.now) */\n t1?: number;\n /** t2: completion timestamp (SSE end or final status), in ms (performance.now) */\n t2?: number;\n /** TTFC = t1 - t0, in ms; undefined if no A2UI DataPart appears in this round */\n ttfcMs?: number;\n /** TTLC = t2 - t0, in ms */\n ttlcMs?: number;\n /** Completion reason for debugging (e.g. 'status-completed' | 'sse-end') */\n reason?: string;\n}\n\nexport function useA2UIStream(options?: A2UIStreamOptions) {\n const actions = useA2UIActions();\n\n const agentUrl = options?.agentUrl ?? '/api';\n const defaultIsActionPayload = options?.defaultIsActionPayload ?? false;\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [lastPerf, setLastPerf] = useState<A2UIStreamPerfSnapshot | null>(null);\n\n // `contextId` stays stable across the session; `taskId` persists after the first response\n const contextIdRef = useRef<string>(crypto.randomUUID());\n const taskIdRef = useRef<string | undefined>(undefined);\n\n // Perf timing state for the current round (use performance.now to avoid Date precision issues)\n const perfStateRef = useRef<{\n t0?: number;\n t1?: number;\n t2?: number;\n hasFirstComponent?: boolean;\n completed?: boolean;\n }>({});\n\n const now = () => (typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now());\n\n const markFirstComponentRendered = () => {\n const state = perfStateRef.current;\n if (!state.t0 || state.t1 || state.completed) return;\n state.t1 = now();\n };\n\n const finalizePerf = (reason: string) => {\n const state = perfStateRef.current;\n if (!state.t0 || state.completed) return;\n\n state.completed = true;\n state.t2 = state.t2 ?? now();\n\n const t0 = state.t0;\n const t1 = state.t1;\n const t2 = state.t2;\n const ttfcMs = t1 ? t1 - t0 : undefined;\n const ttlcMs = t2 - t0;\n\n const snapshot: A2UIStreamPerfSnapshot = {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n };\n\n setLastPerf(snapshot);\n\n const ttfcLabel = ttfcMs !== undefined ? `${(ttfcMs / 1000).toFixed(2)}s` : 'N/A';\n const totalLabel = `${(ttlcMs / 1000).toFixed(2)}s`;\n\n // Print a visible perf snapshot to the console for quick inspection\n // eslint-disable-next-line no-console\n console.log('[AUI-X Perf] TTFC: %s, Total: %s', ttfcLabel, totalLabel, {\n t0,\n t1,\n t2,\n ttfcMs,\n ttlcMs,\n reason,\n });\n };\n\n const sendMessage = useCallback(\n async (userText: string, isActionPayload = defaultIsActionPayload) => {\n if (!userText.trim() || isLoading) return;\n\n setIsLoading(true);\n // Reset timers per round and record t0\n perfStateRef.current = {\n t0: now(),\n t1: undefined,\n t2: undefined,\n hasFirstComponent: false,\n completed: false,\n };\n if (!isActionPayload) {\n setMessages((prev) => [...prev, { role: 'user', text: userText }]);\n }\n\n let assistantText = '';\n let renderedSurface = false;\n\n try {\n // ── Build message.parts ─────────────────────────────────────────\n let parts: WirePart[];\n if (isActionPayload) {\n let actionData: Record<string, unknown>;\n try {\n actionData = JSON.parse(userText) as Record<string, unknown>;\n } catch {\n actionData = { userAction: { actionName: userText, context: {} } };\n }\n parts = [{ kind: 'data', data: actionData }];\n } else {\n parts = [{ kind: 'text', text: userText }];\n }\n\n // ── Build A2A JSON-RPC request ──────────────────────────────────\n const rpcRequest = {\n jsonrpc: '2.0' as const,\n id: crypto.randomUUID(),\n method: 'message/stream' as const,\n params: {\n message: {\n kind: 'message' as const,\n role: 'user' as const,\n messageId: crypto.randomUUID(),\n contextId: contextIdRef.current,\n ...(taskIdRef.current ? { taskId: taskIdRef.current } : {}),\n extensions: [A2UI_EXTENSION_URI],\n parts,\n },\n },\n };\n\n const response = await fetch(agentUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(rpcRequest),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n if (!response.body) {\n throw new Error('No response body');\n }\n\n // ── Parse SSE stream ───────────────────────────────────────────\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const jsonStr = line.slice(6).trim();\n if (!jsonStr || jsonStr === '[DONE]') continue;\n\n let event: A2AStreamEvent;\n try {\n event = JSON.parse(jsonStr) as A2AStreamEvent;\n } catch {\n continue;\n }\n\n // ── TaskStatusUpdateEvent ─────────────────────────────────\n if (isTaskStatusUpdateEvent(event)) {\n const { id: taskId, status } = event.result;\n\n if (taskId) taskIdRef.current = taskId;\n\n const rawParts = (status.message?.parts ?? []) as WirePart[];\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n logger.info('[A2UI] Received UI update part', {\n taskId,\n componentCount: a2uiData.length,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n const surfaces = actions.getSurfaces();\n logger.debug('[A2UI] Surfaces after process:', Array.from(surfaces.keys()));\n\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // ── TaskArtifactUpdateEvent ───────────────────────────────\n if (isTaskArtifactUpdateEvent(event)) {\n const { artifact } = event.result;\n const rawParts = (artifact.parts ?? []) as WirePart[];\n\n const textChunk = extractText(rawParts);\n if (textChunk) {\n assistantText += textChunk;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, text: assistantText }];\n }\n return [...prev, { role: 'assistant', text: assistantText }];\n });\n }\n\n const a2uiData = extractA2UIData(rawParts);\n if (a2uiData.length > 0) {\n // Record t1 (TTFC) when the first A2UI DataPart triggers render\n markFirstComponentRendered();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(a2uiData as any);\n renderedSurface = true;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last?.role === 'assistant') {\n return [...prev.slice(0, -1), { ...last, hasSurface: true }];\n }\n return [...prev, { role: 'assistant', text: assistantText, hasSurface: true }];\n });\n }\n }\n\n // If the event is final, consider this round completed and record t2 (TTLC)\n if (\n isTaskStatusUpdateEvent(event) &&\n (event.result.final || event.result.status.state === 'completed')\n ) {\n finalizePerf('status-completed');\n }\n }\n }\n\n // Fallback: ensure at least one assistant bubble\n if (!assistantText && !renderedSurface) {\n setMessages((prev) => [...prev, { role: 'assistant', text: '…' }]);\n }\n } catch (err) {\n setMessages((prev) => [\n ...prev,\n { role: 'assistant', text: `Connection error: ${String(err)}` },\n ]);\n } finally {\n setIsLoading(false);\n // Even if we didn't receive a final status, record t2 when SSE ends\n finalizePerf('sse-end');\n }\n },\n [agentUrl, defaultIsActionPayload, isLoading, actions],\n );\n\n const processLocalMessages = useCallback(\n (serverMessages: ServerToClientMessage[], label = 'Local tool call: rendered UI surface') => {\n if (!serverMessages || serverMessages.length === 0) return;\n\n logger.info('[A2UI] processLocalMessages:', label, `(${serverMessages.length} messages)`);\n logger.debug('[A2UI] Surfaces BEFORE process:', Array.from(actions.getSurfaces().keys()));\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions.processMessages(serverMessages as any);\n\n logger.debug('[A2UI] Surfaces AFTER process:', Array.from(actions.getSurfaces().keys()));\n\n setMessages((prev) => [\n ...prev,\n {\n role: 'assistant',\n text: label,\n hasSurface: true,\n },\n ]);\n },\n [actions],\n );\n\n return { messages, isLoading, sendMessage, processLocalMessages, lastPerf };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aui-mcp-server",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "AUI-X: generate MCP assets from aui-x-catalog.json",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -33,23 +33,19 @@
|
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsup",
|
|
35
35
|
"typecheck": "tsc --noEmit",
|
|
36
|
-
"clean": "rm -rf dist"
|
|
37
|
-
"poc": "tsx src/poc.ts",
|
|
38
|
-
"postinstall": "tsup"
|
|
36
|
+
"clean": "rm -rf dist"
|
|
39
37
|
},
|
|
40
38
|
"dependencies": {
|
|
41
|
-
"@modelcontextprotocol/ext-apps": "^1.1.2",
|
|
42
39
|
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
43
40
|
"@module-federation/runtime": "2.3.0",
|
|
44
41
|
"chokidar": "^3.6.0",
|
|
45
|
-
"esbuild": "^0.25.0"
|
|
46
|
-
"zod": "^4.3.6"
|
|
42
|
+
"esbuild": "^0.25.0"
|
|
47
43
|
},
|
|
48
44
|
"peerDependencies": {
|
|
49
|
-
"@a2ui/react": "^0.8.0",
|
|
50
|
-
"@module-federation/enhanced": "2.3.0",
|
|
51
45
|
"react": "^18.0.0 || ^19.0.0",
|
|
52
|
-
"react-dom": "^18.0.0 || ^19.0.0"
|
|
46
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
47
|
+
"@a2ui/react": "^0.8.0",
|
|
48
|
+
"@module-federation/enhanced": "2.3.0"
|
|
53
49
|
},
|
|
54
50
|
"devDependencies": {
|
|
55
51
|
"@rspack/core": "^1.7.9",
|
package/src/client/handshake.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ComponentRegistry } from '@a2ui/react';
|
|
2
2
|
import type { ServerToClientMessage } from '@a2ui/react';
|
|
3
3
|
import { logger } from './useLogger';
|
|
4
|
-
import {
|
|
4
|
+
import { syncRegistryFromCatalog } from './registry';
|
|
5
5
|
import type { ToolCallPayload } from './types';
|
|
6
6
|
import { A2UI_EXTENSION_URI } from './types';
|
|
7
7
|
|
|
@@ -39,7 +39,7 @@ function toLiteralStringValue(value: unknown): A2UIValue | undefined {
|
|
|
39
39
|
*/
|
|
40
40
|
export async function performHandshake(
|
|
41
41
|
agentUrl: string,
|
|
42
|
-
registry
|
|
42
|
+
registry: ComponentRegistry,
|
|
43
43
|
): Promise<Record<string, unknown>> {
|
|
44
44
|
try {
|
|
45
45
|
const base = agentUrl.replace(/\/$/, '');
|
|
@@ -67,7 +67,6 @@ export async function performHandshake(
|
|
|
67
67
|
}>;
|
|
68
68
|
|
|
69
69
|
const allComponents: Record<string, unknown> = {};
|
|
70
|
-
const effectiveRegistry = registry ?? createMFRegistry();
|
|
71
70
|
|
|
72
71
|
catalogs.forEach((cat) => {
|
|
73
72
|
if (!cat.components) return;
|
|
@@ -76,7 +75,7 @@ export async function performHandshake(
|
|
|
76
75
|
`[AUI-X] Found catalog "${cat.id ?? 'inline'}", syncing ${count} components from handshake`,
|
|
77
76
|
);
|
|
78
77
|
Object.assign(allComponents, cat.components);
|
|
79
|
-
syncRegistryFromCatalog(
|
|
78
|
+
syncRegistryFromCatalog(registry, cat.components);
|
|
80
79
|
});
|
|
81
80
|
|
|
82
81
|
return allComponents;
|
package/src/client/registry.tsx
CHANGED
|
@@ -2,11 +2,7 @@ import React, { lazy } from 'react';
|
|
|
2
2
|
import ReactDOM from 'react-dom';
|
|
3
3
|
import { createInstance } from '@module-federation/enhanced/runtime';
|
|
4
4
|
import * as A2UI from '@a2ui/react';
|
|
5
|
-
import {
|
|
6
|
-
ComponentRegistry,
|
|
7
|
-
registerDefaultCatalog,
|
|
8
|
-
type ComponentRegistration,
|
|
9
|
-
} from '@a2ui/react';
|
|
5
|
+
import { ComponentRegistry, type ComponentRegistration } from '@a2ui/react';
|
|
10
6
|
import type { CreateMFRegistryOptions, XLoaderConfig } from './types';
|
|
11
7
|
import { logger } from './useLogger';
|
|
12
8
|
|
|
@@ -36,12 +32,9 @@ const ErrorPlaceholder: React.FC<{ title?: string; message?: string }> = ({
|
|
|
36
32
|
type MFInstance = ReturnType<typeof createInstance>;
|
|
37
33
|
|
|
38
34
|
let mfInstance: MFInstance | null = null;
|
|
39
|
-
let registryInstance: ComponentRegistry | null = null;
|
|
40
35
|
|
|
41
|
-
function
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const baseShared = {
|
|
36
|
+
function createBaseShared() {
|
|
37
|
+
return {
|
|
45
38
|
react: {
|
|
46
39
|
version: React.version,
|
|
47
40
|
scope: 'default',
|
|
@@ -70,11 +63,15 @@ function ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {
|
|
|
70
63
|
},
|
|
71
64
|
},
|
|
72
65
|
} as const;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {
|
|
69
|
+
if (mfInstance) return mfInstance;
|
|
73
70
|
|
|
74
71
|
const shared = {
|
|
75
|
-
...
|
|
72
|
+
...createBaseShared(),
|
|
76
73
|
...(options?.shared ?? {}),
|
|
77
|
-
} as any;
|
|
74
|
+
} as any; // MF runtime expects a loosely-typed shared map
|
|
78
75
|
|
|
79
76
|
mfInstance = createInstance({
|
|
80
77
|
name: 'aui_mcp_client',
|
|
@@ -86,26 +83,23 @@ function ensureMFInstance(options?: CreateMFRegistryOptions): MFInstance {
|
|
|
86
83
|
}
|
|
87
84
|
|
|
88
85
|
/**
|
|
89
|
-
*
|
|
86
|
+
* Initialize MF runtime for an existing `ComponentRegistry`.
|
|
90
87
|
*
|
|
91
88
|
* - Share `react` / `react-dom` / `@a2ui/react` as singletons
|
|
92
89
|
* - Allow extra shared deps via `options.shared`
|
|
93
90
|
* - Optionally expose `window.__AUI_REGISTRY__` via `options.exposeGlobal`
|
|
94
91
|
*/
|
|
95
|
-
export function
|
|
92
|
+
export function setupMFRegistry(
|
|
93
|
+
registry: ComponentRegistry,
|
|
94
|
+
options?: CreateMFRegistryOptions,
|
|
95
|
+
): ComponentRegistry {
|
|
96
96
|
ensureMFInstance(options);
|
|
97
97
|
|
|
98
|
-
if (!registryInstance) {
|
|
99
|
-
registryInstance = ComponentRegistry.getInstance();
|
|
100
|
-
registerDefaultCatalog(registryInstance);
|
|
101
|
-
logger.info('[aui-mcp-server/react] ComponentRegistry initialized with default catalog');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
98
|
if (typeof window !== 'undefined' && options?.exposeGlobal) {
|
|
105
|
-
(window as any).__AUI_REGISTRY__ =
|
|
99
|
+
(window as any).__AUI_REGISTRY__ = registry;
|
|
106
100
|
}
|
|
107
101
|
|
|
108
|
-
return
|
|
102
|
+
return registry;
|
|
109
103
|
}
|
|
110
104
|
|
|
111
105
|
/**
|
package/src/mcp-app-poc.html
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>AUI-X MCP POC</title>
|
|
7
|
-
<style>
|
|
8
|
-
body { font-family: sans-serif; padding: 20px; background: #f0f0f0; }
|
|
9
|
-
.container { background: white; border-radius: 8px; padding: 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
|
|
10
|
-
.status { color: #666; font-size: 0.9em; margin-bottom: 10px; }
|
|
11
|
-
.result { border-top: 1px solid #eee; margin-top: 10px; padding-top: 10px; }
|
|
12
|
-
.loader { color: #007bff; }
|
|
13
|
-
</style>
|
|
14
|
-
</head>
|
|
15
|
-
<body>
|
|
16
|
-
<div class="container">
|
|
17
|
-
<h1>AUI-X MCP POC</h1>
|
|
18
|
-
<div id="status" class="status">Connecting to MCP host...</div>
|
|
19
|
-
<div id="content">
|
|
20
|
-
<p>This is a POC for the Iframe-based UI in AUI-X.</p>
|
|
21
|
-
</div>
|
|
22
|
-
<div id="result" class="result" style="display:none">
|
|
23
|
-
<h3>Tool Result:</h3>
|
|
24
|
-
<pre id="tool-output"></pre>
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
|
|
28
|
-
<script type="module">
|
|
29
|
-
// For POC, we'll use a simple postMessage bridge if @modelcontextprotocol/ext-apps is not available as a CDN resource easily
|
|
30
|
-
// But for verification, we'll try to listen to message events which is what the SDK uses under the hood
|
|
31
|
-
|
|
32
|
-
const statusEl = document.getElementById('status');
|
|
33
|
-
const resultEl = document.getElementById('result');
|
|
34
|
-
const outputEl = document.getElementById('tool-output');
|
|
35
|
-
|
|
36
|
-
window.addEventListener('message', (event) => {
|
|
37
|
-
console.log('Received message:', event.data);
|
|
38
|
-
|
|
39
|
-
// The MCP Apps SDK uses a specific message format for handshake and protocol messages
|
|
40
|
-
if (event.data && event.data.method === 'initialize') {
|
|
41
|
-
statusEl.innerText = 'Connected to MCP host';
|
|
42
|
-
// Send initialize response
|
|
43
|
-
event.source.postMessage({
|
|
44
|
-
jsonrpc: '2.0',
|
|
45
|
-
id: event.data.id,
|
|
46
|
-
result: {
|
|
47
|
-
protocolVersion: '2024-11-05',
|
|
48
|
-
capabilities: {},
|
|
49
|
-
serverInfo: { name: 'aui-x-poc', version: '0.1.0' }
|
|
50
|
-
}
|
|
51
|
-
}, event.origin);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Handle tool results
|
|
55
|
-
if (event.data && event.data.method === 'notifications/toolResult') {
|
|
56
|
-
const result = event.data.params;
|
|
57
|
-
statusEl.innerText = 'Tool result received';
|
|
58
|
-
resultEl.style.display = 'block';
|
|
59
|
-
outputEl.innerText = JSON.stringify(result, null, 2);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// Signal that we are ready
|
|
64
|
-
if (window.parent !== window) {
|
|
65
|
-
window.parent.postMessage({ type: 'mcp-app-ready' }, '*');
|
|
66
|
-
}
|
|
67
|
-
</script>
|
|
68
|
-
</body>
|
|
69
|
-
</html>
|
package/src/poc.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { registerAppResource, registerAppTool, RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
|
|
3
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import fs from 'node:fs/promises';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
|
|
9
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
-
|
|
11
|
-
async function main() {
|
|
12
|
-
const server = new McpServer({
|
|
13
|
-
name: 'aui-x-poc-server',
|
|
14
|
-
version: '1.0.0',
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
const POC_RESOURCE_URI = 'ui://aui-x/poc';
|
|
18
|
-
|
|
19
|
-
// 1. Register the POC Tool
|
|
20
|
-
registerAppTool(
|
|
21
|
-
server,
|
|
22
|
-
'aui_x_poc_tool',
|
|
23
|
-
{
|
|
24
|
-
title: 'AUI-X POC Tool',
|
|
25
|
-
description: 'A simple tool to demonstrate AUI-X Iframe integration',
|
|
26
|
-
inputSchema: z.object({
|
|
27
|
-
message: z.string().optional().describe('A message to display in the POC UI'),
|
|
28
|
-
}),
|
|
29
|
-
_meta: {
|
|
30
|
-
ui: {
|
|
31
|
-
resourceUri: POC_RESOURCE_URI,
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
async (args) => {
|
|
36
|
-
console.error('[POC] Tool called with:', args);
|
|
37
|
-
const payload = {
|
|
38
|
-
tool: 'aui_x_poc_tool',
|
|
39
|
-
args,
|
|
40
|
-
resource: {
|
|
41
|
-
uri: POC_RESOURCE_URI,
|
|
42
|
-
mimeType: 'text/html;profile=mcp-app'
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
return {
|
|
46
|
-
content: [{ type: 'text', text: JSON.stringify(payload) }],
|
|
47
|
-
structuredContent: payload,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
// 2. Register the POC Resource
|
|
53
|
-
registerAppResource(
|
|
54
|
-
server,
|
|
55
|
-
'aui-x-poc-resource',
|
|
56
|
-
POC_RESOURCE_URI,
|
|
57
|
-
{ mimeType: RESOURCE_MIME_TYPE },
|
|
58
|
-
async () => {
|
|
59
|
-
console.error('[POC] Resource requested:', POC_RESOURCE_URI);
|
|
60
|
-
const htmlPath = path.join(__dirname, 'mcp-app-poc.html');
|
|
61
|
-
const html = await fs.readFile(htmlPath, 'utf-8');
|
|
62
|
-
return {
|
|
63
|
-
contents: [
|
|
64
|
-
{
|
|
65
|
-
uri: POC_RESOURCE_URI,
|
|
66
|
-
mimeType: RESOURCE_MIME_TYPE,
|
|
67
|
-
text: html,
|
|
68
|
-
_meta: {
|
|
69
|
-
ui: {
|
|
70
|
-
prefersBorder: true,
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
],
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
console.error('[POC] Server starting...');
|
|
80
|
-
const transport = new StdioServerTransport();
|
|
81
|
-
await server.connect(transport);
|
|
82
|
-
console.error('[POC] Server connected via stdio');
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
main().catch((err) => {
|
|
86
|
-
console.error('[POC] Fatal error:', err);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
});
|