aui-mcp-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -0
- package/dist/cli.cjs +1088 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +1076 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/index.cjs +619 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +194 -0
- package/dist/client/index.d.ts +194 -0
- package/dist/client/index.js +584 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.cjs +1053 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +163 -0
- package/dist/index.d.ts +163 -0
- package/dist/index.js +1036 -0
- package/dist/index.js.map +1 -0
- package/dist/rsbuild.cjs +1049 -0
- package/dist/rsbuild.cjs.map +1 -0
- package/dist/rsbuild.d.cts +12 -0
- package/dist/rsbuild.d.ts +12 -0
- package/dist/rsbuild.js +1038 -0
- package/dist/rsbuild.js.map +1 -0
- package/dist/rspack.cjs +1016 -0
- package/dist/rspack.cjs.map +1 -0
- package/dist/rspack.d.cts +40 -0
- package/dist/rspack.d.ts +40 -0
- package/dist/rspack.js +1005 -0
- package/dist/rspack.js.map +1 -0
- package/dist/server.cjs +304 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +16 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.js +297 -0
- package/dist/server.js.map +1 -0
- package/package.json +72 -0
- package/src/catalog/build.ts +89 -0
- package/src/catalog/entry.ts +183 -0
- package/src/catalog/parser.ts +173 -0
- package/src/catalog/tool_parser.ts +145 -0
- package/src/cli.ts +318 -0
- package/src/client/handshake.ts +166 -0
- package/src/client/index.ts +6 -0
- package/src/client/registry.tsx +184 -0
- package/src/client/types.ts +136 -0
- package/src/client/useA2UIStream.ts +378 -0
- package/src/client/useLogger.ts +147 -0
- package/src/generator.ts +100 -0
- package/src/index.ts +17 -0
- package/src/mcp-app-poc.html +69 -0
- package/src/poc.ts +88 -0
- package/src/rsbuild.ts +46 -0
- package/src/rspack.ts +282 -0
- package/src/server.ts +391 -0
- package/src/templates.ts +51 -0
- package/src/types.ts +195 -0
- package/src/utils.ts +29 -0
- package/test.js +16 -0
- package/tsconfig.json +19 -0
- package/tsup.config.ts +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/catalog/tool_parser.ts","../src/catalog/entry.ts","../src/catalog/parser.ts","../src/catalog/build.ts","../src/utils.ts","../src/templates.ts","../src/generator.ts","../src/server.ts","../src/rspack.ts"],"names":["isAbsolute","join","existsSync","readFileSync","dirname","fs","esbuild","path","fileURLToPath","init","loadRemote","Server","ListToolsRequestSchema","CallToolRequestSchema","chokidar","StdioServerTransport","http","SSEServerTransport","ModuleFederationPlugin","text","fsp"],"mappings":"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","file":"rspack.cjs","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, isAbsolute } from 'node:path';\n\nexport interface ParsedToolLogic {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n /** Absolute path to the local logic file (if resolved). */\n logicFilePath: string;\n}\n\n/**\n * A simple regex-based tool logic parser for AUI-X.\n *\n * Responsibilities:\n * - Resolve a TS/JS file from a logicFilePath hint\n * - Parse JSDoc description\n * - Infer a minimal JSON-schema-like parameters shape from the\n * loader function's argument type\n *\n * NOTE: This function no longer infers or records any HTTP endpoint.\n * Endpoint routing is now owned by the MCP server, which executes\n * MF loaders directly via the Module Federation runtime.\n */\nexport function parseToolLogic(\n toolName: string,\n logicFilePath: string,\n baseDir: string\n): ParsedToolLogic | null {\n // 1. Resolve file path\n let targetPath = '';\n const extensions = ['.ts', '.tsx', '.js', '.jsx'];\n \n // Try absolute or relative\n const absPath = isAbsolute(logicFilePath) ? logicFilePath : join(baseDir, logicFilePath);\n for (const ext of ['', ...extensions]) {\n if (existsSync(absPath + ext)) {\n targetPath = absPath + ext;\n break;\n }\n }\n\n if (!targetPath) {\n console.error(`[AUI-X] Tool logic file not found: ${logicFilePath} (base: ${baseDir})`);\n return null;\n }\n\n const content = readFileSync(targetPath, 'utf-8');\n\n // 2. Extract description (JSDoc before the function)\n let description = `Automatically generated tool for ${toolName}.`;\n \n let jsdocContent = '';\n let paramsContent = '';\n let finalToolName = toolName;\n\n // Search for ANY block that contains @tool\n const jsdocRegex = /\\/\\*\\*([\\s\\S]*?)\\*\\/[\\s\\S]*?(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)/g;\n let match;\n \n while ((match = jsdocRegex.exec(content)) !== null) {\n const block = match[1]!;\n const funcName = match[2]!;\n \n // Pattern A: Manually specified @tool\n const toolMatch = block.match(/@tool\\s+(\\w+)/);\n if (toolMatch) {\n // If we are looking for a specific tool name, check if it matches\n // Or if we are looking for the 'loader' default, take the first @tool we find in the loader file\n if (toolMatch[1] === toolName || toolName.includes('artistevents') || toolName.endsWith('_data')) {\n jsdocContent = block;\n finalToolName = toolMatch[1]!;\n \n const pRegex = new RegExp(`(?:export\\\\s+)?(?:async\\\\s+)?function\\\\s+${funcName}\\\\s*\\\\(\\\\s*(?:args|\\\\{[\\\\s\\\\S]*?\\\\}|)\\\\s*:\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}\\\\s*\\\\)`, 'm');\n const pMatch = content.match(pRegex);\n if (pMatch) {\n paramsContent = pMatch[1] || '';\n }\n break;\n }\n }\n \n // Pattern B: Default MF 2.0 loader (if no @tool tag found yet)\n if (funcName === 'loader' && !jsdocContent) {\n jsdocContent = block;\n const pRegex = /(?:export\\s+)?(?:async\\s+)?function\\s+loader\\s*\\(\\s*(?:args|\\{[\\s\\S]*?\\}|)\\s*:\\s*\\{([\\s\\S]*?)\\}\\s*\\)/m;\n const pMatch = content.match(pRegex);\n if (pMatch) {\n paramsContent = pMatch[1] || '';\n }\n }\n }\n\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n if (jsdocContent) {\n // Check if there is an @description override in JSDoc\n const descriptionOverride = jsdocContent.match(/@description\\s+([^\\n@]+)/);\n if (descriptionOverride?.[1]) {\n description = descriptionOverride[1].trim();\n } else {\n description = jsdocContent\n .split('\\n')\n .map(l => l.replace(/^\\s*\\*\\s?/, '').trim())\n .filter(l => l && !l.startsWith('@') && !l.startsWith('/') && !l.endsWith('/'))\n .join('\\n') // keep line breaks first\n .trim();\n \n // If the extracted description still contains @tool-like remnants, clean it again\n // (helps with some non-standard JSDoc indentation).\n description = description.split('\\n').filter(l => !l.trim().startsWith('@')).join(' ').trim();\n }\n \n // Parse parameters\n if (paramsContent) {\n const fields = paramsContent.split(',').map(f => f.trim()).filter(Boolean);\n for (const field of fields) {\n const fieldMatch = field.match(/^(\\w+)(\\??):\\s*(\\w+)/);\n if (fieldMatch) {\n const name = fieldMatch[1]!;\n const optional = fieldMatch[2] === '?';\n const rawType = fieldMatch[3]!;\n let type = 'string';\n if (rawType === 'number') type = 'number';\n if (rawType === 'boolean') type = 'boolean';\n properties[name] = { type };\n if (!optional) required.push(name);\n }\n }\n }\n\n }\n\n return {\n name: finalToolName,\n description,\n logicFilePath: targetPath,\n parameters: {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n } as any,\n };\n}\n","import type {\n AuiXCatalogEntry,\n AuiXLoaderConfig,\n AuiXToolDefinition,\n PropDefinition,\n RemoteContext,\n} from '../types';\nimport { join, dirname } from 'node:path';\nimport { parseToolLogic } from './tool_parser';\n\nfunction propsToSchemaProperties(props: PropDefinition[]): AuiXCatalogEntry['properties'] {\n const result: AuiXCatalogEntry['properties'] = {};\n\n for (const prop of props) {\n result[prop.name] = {\n type: 'object',\n ...(prop.description ? { description: prop.description } : {}),\n properties: {\n literalString: { type: 'string' },\n path: { type: 'string' },\n },\n };\n }\n\n return result;\n}\n\nfunction getRequiredProps(props: PropDefinition[]): string[] {\n return props.filter((p) => !p.optional).map((p) => p.name);\n}\n\nfunction buildXLoader(ctx: RemoteContext): AuiXLoaderConfig {\n return {\n type: 'module-federation',\n url: ctx.remoteEntryUrl,\n scope: ctx.stats.id,\n module: ctx.expose.path,\n };\n}\n\nfunction buildFallbackExample(ctx: RemoteContext): unknown {\n const surfaceId = `${ctx.componentName.toLowerCase()}-surface-1`;\n const componentId = `${ctx.componentName.toLowerCase()}-card`;\n\n const required = getRequiredProps(ctx.props);\n const propsPayload: Record<string, unknown> = {};\n for (const name of required) {\n propsPayload[name] = { literalString: `<!-- ${name} -->` };\n }\n\n return [\n {\n beginRendering: {\n surfaceId,\n root: 'root-column',\n },\n },\n {\n surfaceUpdate: {\n surfaceId,\n components: [\n {\n id: 'root-column',\n component: {\n Column: {\n children: { explicitList: [componentId] },\n },\n },\n },\n {\n id: componentId,\n component: {\n [ctx.componentName]: propsPayload,\n },\n },\n ],\n },\n },\n ];\n}\n\nexport function generateCatalogEntry(ctx: RemoteContext): AuiXCatalogEntry {\n const schemaProps = propsToSchemaProperties(ctx.props);\n const required = getRequiredProps(ctx.props);\n\n // ─── A2UI v0.9 Actions (Custom Props) ──────────────────────────────────────\n // Convert `@action` tags into Action properties in the schema.\n if (ctx.jsdoc.actions && ctx.jsdoc.actions.length > 0) {\n for (const actionDef of ctx.jsdoc.actions) {\n const propName = `${actionDef.name}Action`;\n const desc = actionDef.description\n ? `${actionDef.description}${actionDef.replyWith ? ` (Expected reply: ${actionDef.replyWith})` : ''}`\n : `Trigger server event: ${actionDef.name}`;\n\n schemaProps[propName] = {\n type: 'object',\n description: desc,\n properties: {\n name: { type: 'string' },\n context: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n key: { type: 'string' },\n value: { type: 'object' },\n },\n required: ['key', 'value'],\n },\n },\n },\n required: ['name'],\n };\n }\n }\n\n const entry: AuiXCatalogEntry = {\n type: 'object',\n description: ctx.jsdoc.description ?? `AUI-X MF Remote component: ${ctx.componentName}.`,\n properties: schemaProps,\n ...(required.length > 0 ? { required } : {}),\n 'x-loader': buildXLoader(ctx),\n 'x-example': ctx.jsdoc.example ?? buildFallbackExample(ctx),\n ...(ctx.jsdoc.authRequired !== undefined\n ? { 'x-auth-required': ctx.jsdoc.authRequired }\n : {}),\n ...(ctx.jsdoc.fallback ? { 'x-fallback': ctx.jsdoc.fallback } : {}),\n };\n\n // ─── x-tools wiring ───────────────────────────────────────────────────────\n // 1) Prefer explicit `@tool <toolName> <logicFile>` tags.\n const xTools: AuiXToolDefinition[] = [];\n\n if (ctx.jsdoc.tools && ctx.jsdoc.tools.length > 0) {\n for (const tool of ctx.jsdoc.tools) {\n const sourceFile = ctx.expose.file;\n const baseDir = join(process.cwd(), dirname(sourceFile));\n\n const parsed = parseToolLogic(tool.name, tool.logicFile, baseDir);\n\n if (parsed && ctx.loaderExpose?.path) {\n xTools.push({\n name: parsed.name,\n description: parsed.description,\n loader: ctx.loaderExpose.path,\n parameters: parsed.parameters,\n logicFilePath: parsed.logicFilePath,\n });\n }\n }\n }\n\n // 2) Auto-detect MF 2.0 data loader as a tool.\n if (ctx.loaderExpose) {\n const loaderFile = ctx.loaderExpose.file;\n const baseDir = process.cwd();\n\n // Auto-generated tool naming convention: get_<ComponentName>_data\n const defaultToolName = `get_${ctx.componentName.toLowerCase()}_data`;\n\n const parsed = parseToolLogic(defaultToolName, loaderFile, baseDir);\n\n if (parsed) {\n // If the loader file defines an explicit `@tool`, `parseToolLogic` returns that tool name.\n // Only add it when not duplicated.\n if (!xTools.find(t => t.name === parsed.name || t.logicFilePath === parsed.logicFilePath)) {\n xTools.push({\n name: parsed.name,\n description: parsed.description,\n loader: ctx.loaderExpose.path,\n parameters: parsed.parameters,\n logicFilePath: parsed.logicFilePath,\n });\n }\n }\n }\n\n if (xTools.length > 0) {\n entry['x-tools'] = xTools;\n }\n\n return entry;\n}\n","import type { AuiJsDocTags, PropDefinition } from '../types';\n\n/**\n * Parse the first JSDoc block that contains `@aui-component`.\n */\nexport function parseJsDoc(dtsContent: string): AuiJsDocTags {\n const jsdocBlockRegex = /\\/\\*\\*([\\s\\S]*?)\\*\\//g;\n let targetBlock: string | null = null;\n\n for (const match of dtsContent.matchAll(jsdocBlockRegex)) {\n const block = match[1];\n if (block?.includes('@aui-component')) {\n targetBlock = block;\n break;\n }\n }\n\n if (!targetBlock) {\n return { isAuiComponent: false };\n }\n\n const result: AuiJsDocTags = { isAuiComponent: true };\n\n const lines = targetBlock\n .split('\\n')\n .map((l) => l.replace(/^\\s*\\*\\s?/, '').trimEnd());\n\n const descMatch = lines.find((l) => l.startsWith('@description'));\n if (descMatch) {\n result.description = descMatch.replace('@description', '').trim();\n }\n\n const authMatch = lines.find((l) => l.startsWith('@auth-required'));\n if (authMatch) {\n const val = authMatch.replace('@auth-required', '').trim().toLowerCase();\n result.authRequired = val === 'true';\n }\n\n const fallbackMatch = lines.find((l) => l.startsWith('@fallback'));\n if (fallbackMatch) {\n result.fallback = fallbackMatch.replace('@fallback', '').trim();\n }\n\n const exampleStartIdx = lines.findIndex((l) => l.startsWith('@example'));\n if (exampleStartIdx !== -1) {\n const exampleLine = lines[exampleStartIdx];\n if (exampleLine) {\n const exampleFirstLine = exampleLine.replace('@example', '').trim();\n\n const continuationLines: string[] = [];\n for (let i = exampleStartIdx + 1; i < lines.length; i++) {\n const l = lines[i];\n if (!l) break;\n if (/^@\\w/.test(l)) break;\n if (l && !/^[\\s[\\]{},\"'0-9\\-+tfn]/.test(l)) break;\n continuationLines.push(l);\n }\n\n const rawJson = [exampleFirstLine, ...continuationLines].join('\\n').trim();\n if (rawJson) {\n try {\n result.example = JSON.parse(rawJson);\n } catch {\n // keep silent and fallback later\n }\n }\n }\n }\n\n // ── @tool parsing ─────────────────────────────────────────────────────────\n // Supported syntax:\n // @tool <toolName> <logicFile>\n // Example:\n // @tool get_concert_tours ./getConcertTours\n const toolLines = lines.filter((l) => l.startsWith('@tool '));\n if (toolLines.length > 0) {\n result.tools = toolLines.map((l) => {\n const parts = l.replace('@tool', '').trim().split(/\\s+/);\n return {\n name: parts[0] ?? '',\n logicFile: parts[1] ?? '',\n };\n });\n }\n\n // ── @action parsing ───────────────────────────────────────────────────────\n // Supported syntax:\n // @action name=\"wish_more_shows\" replyWith=\"WishShowForm\" contextKeys=\"artist,region\" description=\"Wish for more tour shows\"\n const actionLines = lines.filter((l) => l.startsWith('@action '));\n if (actionLines.length > 0) {\n result.actions = actionLines.map((l) => {\n const raw = l.replace('@action', '').trim();\n const action: any = {};\n const pairs = raw.match(/(\\w+)=\"([^\"]*)\"/g) || [];\n for (const p of pairs) {\n const [k, v] = p.split('=\"');\n const key = k?.trim();\n const val = v?.replace(/\"$/, '');\n if (key === 'name') action.name = val;\n if (key === 'description') action.description = val;\n if (key === 'replyWith') action.replyWith = val;\n if (key === 'contextKeys') action.contextKeys = val?.split(',').map((s: string) => s.trim());\n }\n return action;\n });\n }\n\n return result;\n}\n\nexport function needsJsDocFill(dtsContent: string): boolean {\n return !dtsContent.includes('@aui-component');\n}\n\n/**\n * Parse props interface in compiled d.ts.\n */\nexport function parsePropsInterface(dtsContent: string, componentName: string): PropDefinition[] {\n const patterns = [\n new RegExp(`interface\\\\s+${componentName}Properties\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}`, 'm'),\n new RegExp(`interface\\\\s+${componentName}Props\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}`, 'm'),\n ];\n\n let interfaceBody: string | null = null;\n for (const pattern of patterns) {\n const m = dtsContent.match(pattern);\n const body = m?.[1];\n if (body) {\n interfaceBody = body;\n break;\n }\n }\n\n if (!interfaceBody) {\n return [];\n }\n\n // Handle nesting: node { properties { ... } }\n // In the AUI spec, actual props are defined under `node.properties`.\n const nodeMatch = interfaceBody.match(/node\\s*:\\s*\\{\\s*properties\\s*:\\s*\\{([\\s\\S]*?)\\}\\s*\\}/m);\n if (nodeMatch) {\n interfaceBody = nodeMatch[1]!;\n }\n\n const props: PropDefinition[] = [];\n // A more tolerant regex for matching nested property definitions in the AUI shape.\n const fieldRegex = /^\\s*(\\w+)(\\??):\\s*([\\s\\S]+?)(?:;|$)/;\n\n const reserved = ['node', 'properties', 'literalString', 'path'];\n\n for (const line of interfaceBody.split('\\n')) {\n const m = line.match(fieldRegex);\n if (!m) continue;\n\n const name = m[1];\n if (!name || (nodeMatch && reserved.includes(name))) continue;\n\n const questionMark = m[2];\n let rawType = m[3]?.trim() ?? '';\n\n // If the type is an inline object definition, simplify it to 'object'.\n if (rawType.startsWith('{')) {\n rawType = 'object';\n }\n\n const optional = questionMark === '?';\n const type = rawType;\n\n props.push({ name, type, optional });\n }\n\n return props;\n}\n","import type { AuiXCatalog, MfStats, RemoteContext } from '../types';\nimport { generateCatalogEntry } from './entry';\nimport { needsJsDocFill, parseJsDoc, parsePropsInterface } from './parser';\n\nexport interface CatalogBuildIssue {\n componentName?: string;\n message: string;\n detail?: string;\n}\n\nexport interface BuildCatalogFromStatsOptions {\n /** Parsed mf-stats.json */\n stats: MfStats;\n /** Read compiled type file for given component name */\n readCompiledTypes: (componentName: string) => string | undefined;\n}\n\nexport interface BuildCatalogFromStatsResult {\n catalog: AuiXCatalog;\n issues: CatalogBuildIssue[];\n /** Components missing @aui-component JSDoc */\n missingJsdocComponents: string[];\n}\n\nexport function buildCatalogFromStats(options: BuildCatalogFromStatsOptions): BuildCatalogFromStatsResult {\n const { stats, readCompiledTypes } = options;\n\n const catalog: AuiXCatalog = {};\n const issues: CatalogBuildIssue[] = [];\n const missingJsdocComponents: string[] = [];\n\n const { publicPath, remoteEntry } = stats.metaData;\n // Prefer MF manifest over remoteEntry.js for runtime loading.\n // Keep it co-located with remoteEntry in the same output directory.\n const remoteEntryUrl =\n publicPath.replace(/\\/$/, '') + '/' + [remoteEntry.path, 'mf-manifest.json'].filter(Boolean).join('/');\n\n const loaderExposes = stats.exposes.filter((e) => e.path.endsWith('.data'));\n const componentExposes = stats.exposes.filter((e) => !e.path.endsWith('.data'));\n\n for (const expose of componentExposes) {\n const componentName = expose.name;\n const loaderExpose = loaderExposes.find((le) => le.path === `${expose.path}.data`);\n\n // Note: In dev mode, MF type generation may run in parallel with the build.\n // Prefer generating the catalog in MF's `dts.generateTypes.afterGenerate` hook (so compiled d.ts are ready)\n // to avoid races where the first build misses type files.\n const dtsContent = readCompiledTypes(componentName);\n if (!dtsContent) {\n issues.push({ componentName, message: 'Missing compiled d.ts for component' });\n continue;\n }\n\n if (needsJsDocFill(dtsContent)) {\n missingJsdocComponents.push(componentName);\n issues.push({\n componentName,\n message: 'Missing @aui-component JSDoc (use skills/aui-jsdoc-gen)',\n });\n continue;\n }\n\n const jsdoc = parseJsDoc(dtsContent);\n const props = parsePropsInterface(dtsContent, componentName);\n\n const ctx: RemoteContext = {\n stats,\n expose,\n jsdoc,\n props,\n componentName,\n remoteEntryUrl,\n loaderExpose,\n };\n\n try {\n catalog[componentName] = generateCatalogEntry(ctx);\n } catch (err) {\n console.error(`[AUI-X] Failed to generate catalog entry for ${componentName}:`, err);\n issues.push({\n componentName,\n message: 'Failed to generate catalog entry',\n detail: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { catalog, issues, missingJsdocComponents };\n}\n","import { promises as fs } from 'node:fs';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as T;\n}\n\nexport function toSnakeCase(input: string): string {\n return input\n .trim()\n .replace(/[\\s-]+/g, '_')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/_+/g, '_')\n .toLowerCase();\n}\n\nexport function toToolName(componentName: string): string {\n return `get_${toSnakeCase(componentName)}`;\n}\n","export function buildServerSource(): string {\n // NOTE: This file is meant to be bundled by esbuild in the generator.\n // It reads manifest.json next to itself.\n return `import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst manifestPath = process.env.AUI_MCP_MANIFEST ?? join(__dirname, 'manifest.json');\nconst manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n\nconst server = new Server(\n { name: 'aui-x-catalog', version: '0.1.0' },\n { capabilities: { tools: {} } }\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: (manifest.tools ?? []).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema ?? { type: 'object', properties: {}, required: [] },\n })),\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params?.name;\n const tool = (manifest.tools ?? []).find((t) => t.name === toolName);\n if (!tool) {\n throw new Error('Tool not found: ' + toolName);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(tool.entry, null, 2),\n },\n ],\n };\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n`;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport esbuild from 'esbuild';\n\nimport type {\n AuiMcpManifest,\n AuiXCatalog,\n GenerateAuiMcpAssetsOptions,\n GenerateAuiMcpAssetsResult,\n} from './types';\nimport { fileExists, readJsonFile, toToolName } from './utils';\nimport { buildServerSource } from './templates';\n\nfunction assertCatalogShape(catalog: unknown): asserts catalog is AuiXCatalog {\n if (!catalog || typeof catalog !== 'object' || Array.isArray(catalog)) {\n throw new Error('Invalid aui-x-catalog.json: expected an object');\n }\n}\n\nasync function loadCatalog(options: GenerateAuiMcpAssetsOptions): Promise<AuiXCatalog> {\n const catalogPath = options.catalogPath ?? 'aui-x-catalog.json';\n if (!(await fileExists(catalogPath))) {\n throw new Error(`catalog not found: ${catalogPath}`);\n }\n const catalog = await readJsonFile<unknown>(catalogPath);\n assertCatalogShape(catalog);\n return catalog;\n}\n\nexport function buildAuiMcpManifest(catalog: AuiXCatalog): AuiMcpManifest {\n const tools = Object.entries(catalog).map(([componentName, entry]) => {\n return {\n name: toToolName(componentName),\n componentName,\n description: entry.description,\n inputSchema: { type: 'object', properties: {}, required: [] },\n entry,\n };\n });\n\n return {\n schemaVersion: 1,\n tools,\n };\n}\n\nexport async function bundleAuiMcpServer(): Promise<string> {\n const serverSource = buildServerSource();\n\n const result = await esbuild.build({\n stdin: {\n contents: serverSource,\n // Resolve from package root so pnpm symlinked deps can be bundled.\n resolveDir: path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'),\n sourcefile: 'aui-mcp-server.generated.ts',\n loader: 'ts',\n },\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node18',\n write: false,\n outfile: 'server.mjs',\n sourcemap: false,\n logLevel: 'silent',\n });\n\n const outputFile = result.outputFiles?.[0];\n if (!outputFile) {\n throw new Error('Failed to bundle MCP server');\n }\n\n return outputFile.text;\n}\n\nexport async function generateAuiMcpAssets(\n options: GenerateAuiMcpAssetsOptions = {}\n): Promise<GenerateAuiMcpAssetsResult> {\n const outDir = options.outDir ?? 'dist';\n const mcpDirname = options.mcpDirname ?? 'mcp';\n const mcpDir = path.join(outDir, mcpDirname);\n\n const catalog = await loadCatalog(options);\n const manifest = buildAuiMcpManifest(catalog);\n\n await fs.mkdir(mcpDir, { recursive: true });\n\n const manifestPath = path.join(mcpDir, 'manifest.json');\n await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n\n let serverPath: string | undefined;\n if (options.emitServer !== false) {\n serverPath = path.join(mcpDir, 'server.mjs');\n const serverCode = await bundleAuiMcpServer();\n await fs.writeFile(serverPath, serverCode, 'utf-8');\n }\n\n return { manifestPath, serverPath };\n}\n","import http from 'node:http';\nimport { promises as fs } from 'node:fs';\n\nimport chokidar from 'chokidar';\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport { init, loadRemote } from '@module-federation/runtime';\n\n// In Node.js there is no `self` global by default, but many MF remoteEntry\n// bundles still reference it (especially browser-first builds). Polyfill it so\n// MF runtime can eval remoteEntry safely.\nconst __mfGlobal = globalThis as any;\nif (typeof __mfGlobal.self === 'undefined') __mfGlobal.self = __mfGlobal;\nif (typeof __mfGlobal.window === 'undefined') __mfGlobal.window = __mfGlobal;\n\nimport type { AuiMcpManifest, AuiXCatalog, AuiXToolDefinition } from './types';\nimport { readJsonFile, toToolName } from './utils';\n\nexport type TransportType = 'stdio' | 'sse';\n\nexport interface ServeAuiMcpServerOptions {\n /** If provided, server will load tools from manifest.json (recommended for prod) */\n manifestPath?: string;\n /** If provided, server will derive tools from aui-x-catalog.json (recommended for dev) */\n catalogPath?: string;\n /** Enable hot reload for manifest/catalog */\n watch?: boolean;\n /** Transport type */\n transport?: TransportType;\n /** SSE port (only for transport=sse) */\n port?: number;\n}\n\nconst EMPTY_INPUT_SCHEMA: Tool['inputSchema'] = {\n type: 'object',\n properties: {},\n required: [],\n};\n\nasync function loadManifestFromFile(manifestPath: string): Promise<AuiMcpManifest> {\n const manifest = await readJsonFile<AuiMcpManifest>(manifestPath);\n if (!manifest || typeof manifest !== 'object' || (manifest as any).schemaVersion !== 1) {\n throw new Error(`Invalid manifest: ${manifestPath}`);\n }\n return manifest;\n}\n\nasync function loadManifestFromCatalog(catalogPath: string): Promise<AuiMcpManifest> {\n const catalog = await readJsonFile<AuiXCatalog>(catalogPath);\n if (!catalog || typeof catalog !== 'object' || Array.isArray(catalog)) {\n throw new Error(`Invalid aui-x-catalog.json: ${catalogPath}`);\n }\n\n return {\n schemaVersion: 1,\n tools: Object.entries(catalog).map(([componentName, entry]) => ({\n name: toToolName(componentName),\n componentName,\n description: entry.description,\n inputSchema: EMPTY_INPUT_SCHEMA,\n entry,\n })),\n };\n}\n\nfunction buildToolMap(manifest: AuiMcpManifest): Map<string, (typeof manifest.tools)[number]> {\n const map = new Map<string, (typeof manifest.tools)[number]>();\n for (const tool of manifest.tools ?? []) {\n map.set(tool.name, tool);\n }\n return map;\n}\n\nasync function executeCatalogTool(\n manifest: AuiMcpManifest,\n toolName: string,\n args: unknown\n): Promise<{ ok: true; value: unknown } | { ok: false; message: string }> {\n const tools = buildToolMap(manifest);\n const tool = tools.get(toolName);\n\n if (!tool) {\n return { ok: false, message: `Tool not found: ${toolName}` };\n }\n\n const entry = tool.entry;\n const xLoader = entry['x-loader'];\n const xTools = (entry['x-tools'] ?? []) as AuiXToolDefinition[];\n\n if (!xLoader) {\n return { ok: false, message: `No x-loader config for tool: ${toolName}` };\n }\n\n if (!xTools.length) {\n return { ok: false, message: `No x-tools defined for component: ${tool.componentName}` };\n }\n\n const selectedTool = xTools.find((t) => t.name === toolName) ?? xTools[0];\n\n if (!selectedTool) {\n return { ok: false, message: `No matching x-tools entry for tool: ${toolName}` };\n }\n\n // Prefer MF remote loader when loader path is present; otherwise fall back to local logic file.\n const loaderPath = selectedTool.loader.slice(2); // Remove \"./\" prefix \n const logicFilePath = selectedTool.logicFilePath;\n\n try {\n const inputArgs = (args && typeof args === 'object') ? (args as Record<string, unknown>) : {};\n\n // MF 2.0 remote loader path (e.g. \"./ArtistEvents.data\")\n if (loaderPath) {\n const scope = xLoader.scope;\n const remoteEntryUrl = xLoader.url;\n\n // Initialize MF runtime for this remote; repeated init calls are tolerated.\n try {\n init({\n name: 'aui-mcp-mf-host',\n remotes: [\n {\n name: scope,\n entry: remoteEntryUrl,\n },\n ],\n });\n } catch {\n // Ignore init errors (e.g. duplicate init); runtime will reuse existing instance.\n }\n\n const remoteKey = `${scope}/${loaderPath}`;\n const mod: any = await loadRemote(remoteKey);\n const loaderFn = mod?.loader ?? mod?.default;\n\n if (typeof loaderFn !== 'function') {\n return {\n ok: false,\n message: `Loaded MF module '${remoteKey}' does not export a callable loader`,\n };\n }\n\n const result = await loaderFn(inputArgs);\n return { ok: true, value: result };\n }\n\n // Fallback: execute local logic file directly (dev/non-MF mode)\n if (logicFilePath) {\n const moduleUrl = new URL(`file://${logicFilePath}`);\n const mod: any = await import(moduleUrl.href);\n const loaderFn = mod?.loader ?? mod?.default;\n\n if (typeof loaderFn !== 'function') {\n return {\n ok: false,\n message: `Local logic file '${logicFilePath}' does not export a callable loader`,\n };\n }\n\n const result = await loaderFn(inputArgs);\n return { ok: true, value: result };\n }\n\n return { ok: false, message: `No executable loader found for tool: ${toolName}` };\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[aui-mcp] tool execution failed:', error);\n return {\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nasync function createServer(getManifest: () => AuiMcpManifest): Promise<Server> {\n const server = new Server(\n { name: 'aui-x-catalog', version: '0.1.0' },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const manifest = getManifest();\n return {\n tools: (manifest.tools ?? []).map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema ?? EMPTY_INPUT_SCHEMA,\n })),\n };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const manifest = getManifest();\n const exec = await executeCatalogTool(manifest, request.params.name, request.params.arguments);\n\n if (!exec.ok) {\n return {\n content: [{ type: 'text' as const, text: exec.message }],\n isError: true,\n };\n }\n\n return {\n // Return raw loader result as JSON for the Agent to consume.\n content: [{ type: 'text' as const, text: JSON.stringify(exec.value) }],\n };\n });\n\n return server;\n}\n\nasync function startWatch(\n filePath: string,\n onReload: () => Promise<void>,\n onReloadError: (error: unknown) => void\n): Promise<chokidar.FSWatcher> {\n await fs.access(filePath);\n\n const watcher = chokidar.watch(filePath, { ignoreInitial: true });\n watcher.on('change', async () => {\n try {\n await onReload();\n } catch (err) {\n onReloadError(err);\n }\n });\n\n return watcher;\n}\n\nexport async function serveAuiMcpServer(options: ServeAuiMcpServerOptions = {}): Promise<void> {\n const transport: TransportType = options.transport ?? 'stdio';\n const port = options.port ?? 8001;\n\n const manifestPath = options.manifestPath;\n const catalogPath = options.catalogPath;\n\n if (!manifestPath && !catalogPath) {\n throw new Error('Either manifestPath or catalogPath is required');\n }\n\n const resolvedCatalogPath = catalogPath ?? '';\n let currentManifest: AuiMcpManifest = manifestPath\n ? await loadManifestFromFile(manifestPath)\n : await loadManifestFromCatalog(resolvedCatalogPath);\n\n const getRawCatalog = (): AuiXCatalog => {\n const catalog: AuiXCatalog = {};\n for (const tool of currentManifest.tools ?? []) {\n if (tool.entry) {\n catalog[tool.componentName] = tool.entry;\n }\n }\n return catalog;\n };\n\n const server = await createServer(() => currentManifest);\n\n if (options.watch) {\n const watchPath = manifestPath ?? resolvedCatalogPath;\n\n await startWatch(\n watchPath,\n async () => {\n currentManifest = manifestPath\n ? await loadManifestFromFile(manifestPath)\n : await loadManifestFromCatalog(resolvedCatalogPath);\n\n await server.sendToolListChanged();\n // eslint-disable-next-line no-console\n console.error(\n `[aui-mcp] reloaded: ${(currentManifest.tools ?? []).length} tools from ${watchPath}`\n );\n },\n (error) => {\n // eslint-disable-next-line no-console\n console.error(`[aui-mcp] reload failed:`, error);\n }\n );\n }\n\n if (transport === 'stdio') {\n await server.connect(new StdioServerTransport());\n return;\n }\n\n const transports = new Map<string, SSEServerTransport>();\n\n const httpServer = http.createServer(async (req, res) => {\n try {\n const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);\n\n if (req.method === 'GET' && url.pathname === '/catalog') {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(getRawCatalog(), null, 2));\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/call-tool') {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n\n let payload: any = {};\n try {\n const raw = Buffer.concat(chunks).toString('utf-8');\n payload = raw ? JSON.parse(raw) : {};\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[aui-mcp] invalid /call-tool payload:', error);\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Invalid JSON payload' }));\n return;\n }\n\n const name = payload.name as string | undefined;\n const args = payload.arguments ?? payload.args ?? {};\n\n if (!name || typeof name !== 'string') {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Missing tool name' }));\n return;\n }\n\n const exec = await executeCatalogTool(currentManifest, name, args);\n\n if (!exec.ok) {\n res.writeHead(400, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: exec.message }));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(exec.value));\n return;\n }\n\n if (req.method === 'GET' && url.pathname === '/sse') {\n const transportInstance = new SSEServerTransport('/message', res);\n transports.set(transportInstance.sessionId, transportInstance);\n req.on('close', () => {\n transports.delete(transportInstance.sessionId);\n });\n await server.connect(transportInstance);\n return;\n }\n\n if (req.method === 'POST' && url.pathname === '/message') {\n const sessionId = url.searchParams.get('sessionId');\n if (!sessionId) {\n res.writeHead(400).end('Missing sessionId');\n return;\n }\n\n const transportInstance = transports.get(sessionId);\n if (!transportInstance) {\n res.writeHead(404).end('Unknown sessionId');\n return;\n }\n\n await transportInstance.handlePostMessage(req, res);\n return;\n }\n\n res.writeHead(404).end('Not found');\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('[aui-mcp] request handler error:', error);\n res.writeHead(500).end('Internal server error');\n }\n });\n\n httpServer.on('error', (error) => {\n // Keep dev workflow resilient: don't crash the whole build process.\n // eslint-disable-next-line no-console\n console.error('[aui-mcp] http server error:', error);\n });\n\n httpServer.listen(port, () => {\n // eslint-disable-next-line no-console\n console.error(`[aui-mcp] SSE listening on http://localhost:${port}/sse`);\n });\n}\n","import fs from 'node:fs';\nimport { promises as fsp } from 'node:fs';\nimport path from 'node:path';\n\nimport type { Compiler, RspackPluginInstance } from '@rspack/core';\nimport { ModuleFederationPlugin } from '@module-federation/enhanced/rspack';\n\nimport type { MfStats } from './types';\nimport { buildCatalogFromStats } from './catalog/build';\nimport { generateAuiMcpAssets } from './generator';\nimport type { TransportType } from './server';\nimport { serveAuiMcpServer } from './server';\n\nexport interface AuiMcpRspackPluginOptions {\n /** Module Federation options (will be passed to MF plugin). */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mfOptions?: any;\n\n /** If false, will NOT apply ModuleFederationPlugin (useful when MF is managed by a rsbuild plugin). */\n applyModuleFederationPlugin?: boolean;\n\n /** dist output directory (absolute or relative to compiler.context). Defaults to compiler output.path */\n outDir?: string;\n\n /** Sub dir under dist for MCP assets. Defaults to \"mcp\" */\n mcpDirname?: string;\n\n /** Name of stats asset emitted by MF plugin. Defaults to \"mf-stats.json\" */\n statsAssetName?: string;\n\n /** Name of generated catalog json in dist root. Defaults to \"aui-x-catalog.json\" */\n catalogAssetName?: string;\n\n /** Whether to emit an executable MCP server bundle. Defaults to true */\n emitServer?: boolean;\n\n /** Auto start MCP server in watch/dev mode */\n dev?: boolean;\n\n /** Transport type used by auto-started server */\n transport?: TransportType;\n\n /** SSE port used by auto-started server */\n port?: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport class AuiMcpRspackPlugin implements RspackPluginInstance {\n private options: AuiMcpRspackPluginOptions;\n private devServerStarted = false;\n\n constructor(options: AuiMcpRspackPluginOptions = {}) {\n this.options = options;\n }\n\n apply(compiler: Compiler): void {\n const pluginName = 'aui-mcp-server';\n\n const mfOptions = this.options.mfOptions;\n if (!mfOptions || typeof mfOptions !== 'object') {\n throw new Error(`[${pluginName}] Missing required option: mfOptions`);\n }\n\n this.injectAfterGenerateTypesHook(compiler, mfOptions);\n\n if (this.options.applyModuleFederationPlugin !== false) {\n new ModuleFederationPlugin(mfOptions).apply(compiler);\n }\n }\n\n private getOutDir(compiler: any, compilation: any | undefined): string {\n const rawOutDir =\n this.options.outDir ??\n compilation?.outputOptions?.path ??\n compiler?.options?.output?.path ??\n compiler?.outputPath ??\n 'dist';\n\n // Prefer process.cwd() because some wrappers (rsbuild/rslib) may set compiler.context\n // to the workspace root while the actual project output (dist) is relative to cwd.\n const context = process.cwd();\n return path.isAbsolute(rawOutDir) ? rawOutDir : path.resolve(context, rawOutDir);\n }\n\n private isDev(compiler: any): boolean {\n if (this.options.dev !== undefined) return this.options.dev;\n\n const mode = compiler?.options?.mode;\n if (mode === 'development') return true;\n if (compiler?.watchMode) return true;\n return false;\n }\n\n private readCompiledTypes(compiler: any, outDir: string, componentName: string): string | undefined {\n // 1) @mf-types/xxx.d.ts (MF 2.0 standard entry)\n const entryPath = path.join(outDir, '@mf-types', `${componentName}.d.ts`);\n let content = this.readFileFromCompilerOrNodeFs(compiler, entryPath);\n\n // 2) Fallback: @mf-types/compiled-types/xxx.d.ts\n if (!content) {\n const compiledPath = path.join(outDir, '@mf-types', 'compiled-types', `${componentName}.d.ts`);\n content = this.readFileFromCompilerOrNodeFs(compiler, compiledPath);\n }\n\n if (!content) return undefined;\n\n // 3) Proxy file: export * from './compiled-types/xxx'\n const match = content.match(/export \\* from '\\.\\/(compiled-types\\/[^']+)'/);\n if (!match) return content;\n\n const realPath = path.join(outDir, '@mf-types', `${match[1]}.d.ts`);\n return this.readFileFromCompilerOrNodeFs(compiler, realPath);\n }\n\n private readFileFromCompilerOrNodeFs(compiler: any, absPath: string): string | undefined {\n // Prefer rspack/webpack outputFileSystem (memfs in dev) if available.\n const ofs = compiler?.outputFileSystem;\n const readFileSync = ofs?.readFileSync;\n if (typeof readFileSync === 'function') {\n try {\n const resolved = readFileSync.call(ofs, absPath);\n return Buffer.isBuffer(resolved) ? resolved.toString('utf-8') : String(resolved);\n } catch {\n // ignore and fallback to node fs\n }\n }\n\n try {\n if (fs.existsSync(absPath)) return fs.readFileSync(absPath, 'utf-8');\n } catch {\n // ignore\n }\n return undefined;\n }\n\n private async readJsonFromCompilerOrNodeFs<T>(compiler: any, absPath: string): Promise<T> {\n const ofs = compiler?.outputFileSystem;\n const readFile = ofs?.readFile;\n if (typeof readFile === 'function') {\n const data = await new Promise<string>((resolve, reject) => {\n readFile.call(ofs, absPath, (err: any, buf: any) => {\n if (err) return reject(err);\n const text = Buffer.isBuffer(buf) ? buf.toString('utf-8') : String(buf);\n resolve(text);\n });\n });\n return JSON.parse(data) as T;\n }\n\n const text = await fsp.readFile(absPath, 'utf-8');\n return JSON.parse(text) as T;\n }\n\n private async generateCatalogAndMcpAssetsAfterTypes(compiler: Compiler): Promise<string | undefined> {\n const outDir = this.getOutDir(compiler, undefined);\n const statsAssetName = this.options.statsAssetName ?? 'mf-stats.json';\n const statsPath = path.join(outDir, statsAssetName);\n\n let stats: MfStats;\n try {\n stats = await this.readJsonFromCompilerOrNodeFs<MfStats>(compiler, statsPath);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\n `[aui-mcp-server] Failed to read ${statsAssetName} from ${statsPath}:`,\n err instanceof Error ? err.message : err\n );\n return undefined;\n }\n\n // MF dts generation may still be flushing files in dev; wait briefly for compiled-types.\n const componentNames = (stats.exposes ?? [])\n .filter((e: any) => e && typeof e === 'object' && typeof e.path === 'string' && !e.path.endsWith('.data'))\n .map((e: any) => String(e.name))\n .filter(Boolean);\n\n const maxAttempts = 20;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const missing = componentNames.filter((name) => !this.readCompiledTypes(compiler, outDir, name));\n if (missing.length === 0) break;\n if (attempt === maxAttempts) break;\n await new Promise((r) => setTimeout(r, Math.min(200 * attempt, 1000)));\n }\n\n const { catalog, issues, missingJsdocComponents } = buildCatalogFromStats({\n stats,\n readCompiledTypes: (componentName) => this.readCompiledTypes(compiler, outDir, componentName),\n });\n\n if (issues.length > 0) {\n const head = issues\n .slice(0, 10)\n .map((i) => `${i.componentName ?? 'unknown'}: ${i.message}`)\n .join('; ');\n const tail = issues.length > 10 ? ` ... (+${issues.length - 10})` : '';\n // eslint-disable-next-line no-console\n console.warn(`[aui-mcp-server] catalog issues: ${head}${tail}`);\n }\n\n if (missingJsdocComponents.length > 0) {\n const names = missingJsdocComponents.slice(0, 10).join(', ');\n const tail = missingJsdocComponents.length > 10 ? ` ... (+${missingJsdocComponents.length - 10})` : '';\n // eslint-disable-next-line no-console\n console.warn(\n `[aui-mcp-server] missing @aui-component JSDoc: ${names}${tail}. Please run skills/aui-jsdoc-gen to write back to source files and retry.`\n );\n }\n\n if (!isRecord(catalog) || Object.keys(catalog).length === 0) return undefined;\n\n const catalogAssetName = this.options.catalogAssetName ?? 'aui-x-catalog.json';\n const catalogPath = path.resolve(outDir, catalogAssetName);\n await fsp.mkdir(path.dirname(catalogPath), { recursive: true });\n await fsp.writeFile(catalogPath, JSON.stringify(catalog, null, 2) + '\\n', 'utf-8');\n\n await generateAuiMcpAssets({\n catalogPath,\n outDir,\n mcpDirname: this.options.mcpDirname ?? 'mcp',\n emitServer: this.options.emitServer !== false,\n });\n\n return catalogPath;\n }\n\n private injectAfterGenerateTypesHook(compiler: Compiler, mfOptions: any): void {\n const pluginName = 'aui-mcp-server';\n const rawDts = mfOptions.dts ?? {};\n mfOptions.dts = isRecord(rawDts) ? rawDts : {};\n const dts = mfOptions.dts as Record<string, unknown>;\n\n // MF Plugin expects the hook at: dts.generateTypes.afterGenerate\n const rawGenerateTypes = (dts as any).generateTypes ?? {};\n (dts as any).generateTypes = isRecord(rawGenerateTypes) ? rawGenerateTypes : {};\n const generateTypes = (dts as any).generateTypes as Record<string, unknown>;\n\n // Avoid double injection if plugin applied twice.\n if ((generateTypes as any).__auiMcpInjectedAfterGenerate) return;\n (generateTypes as any).__auiMcpInjectedAfterGenerate = true;\n\n const userAfter = (generateTypes as any).afterGenerate as undefined | ((...args: any[]) => any);\n\n (generateTypes as any).afterGenerate = async (...args: any[]) => {\n try {\n await Promise.resolve(userAfter?.(...args));\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[${pluginName}] user afterGenerate failed:`, err);\n }\n\n let catalogPath: string | undefined;\n try {\n catalogPath = await this.generateCatalogAndMcpAssetsAfterTypes(compiler);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[${pluginName}] afterGenerate (aui) failed:`, err);\n return;\n }\n\n if (!catalogPath) return;\n if (!this.isDev(compiler)) return;\n if (this.devServerStarted) return;\n this.devServerStarted = true;\n\n try {\n await serveAuiMcpServer({\n catalogPath,\n watch: true,\n // Dev defaults to SSE so the sample can proxy to /api/tools.\n transport: (this.options.transport ?? 'sse') as TransportType,\n port: this.options.port ?? 8001,\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[${pluginName}] start dev server failed:`, err);\n }\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { RspackPluginInstance, Compiler } from '@rspack/core';
|
|
2
|
+
import { TransportType } from './server.cjs';
|
|
3
|
+
|
|
4
|
+
interface AuiMcpRspackPluginOptions {
|
|
5
|
+
/** Module Federation options (will be passed to MF plugin). */
|
|
6
|
+
mfOptions?: any;
|
|
7
|
+
/** If false, will NOT apply ModuleFederationPlugin (useful when MF is managed by a rsbuild plugin). */
|
|
8
|
+
applyModuleFederationPlugin?: boolean;
|
|
9
|
+
/** dist output directory (absolute or relative to compiler.context). Defaults to compiler output.path */
|
|
10
|
+
outDir?: string;
|
|
11
|
+
/** Sub dir under dist for MCP assets. Defaults to "mcp" */
|
|
12
|
+
mcpDirname?: string;
|
|
13
|
+
/** Name of stats asset emitted by MF plugin. Defaults to "mf-stats.json" */
|
|
14
|
+
statsAssetName?: string;
|
|
15
|
+
/** Name of generated catalog json in dist root. Defaults to "aui-x-catalog.json" */
|
|
16
|
+
catalogAssetName?: string;
|
|
17
|
+
/** Whether to emit an executable MCP server bundle. Defaults to true */
|
|
18
|
+
emitServer?: boolean;
|
|
19
|
+
/** Auto start MCP server in watch/dev mode */
|
|
20
|
+
dev?: boolean;
|
|
21
|
+
/** Transport type used by auto-started server */
|
|
22
|
+
transport?: TransportType;
|
|
23
|
+
/** SSE port used by auto-started server */
|
|
24
|
+
port?: number;
|
|
25
|
+
}
|
|
26
|
+
declare class AuiMcpRspackPlugin implements RspackPluginInstance {
|
|
27
|
+
private options;
|
|
28
|
+
private devServerStarted;
|
|
29
|
+
constructor(options?: AuiMcpRspackPluginOptions);
|
|
30
|
+
apply(compiler: Compiler): void;
|
|
31
|
+
private getOutDir;
|
|
32
|
+
private isDev;
|
|
33
|
+
private readCompiledTypes;
|
|
34
|
+
private readFileFromCompilerOrNodeFs;
|
|
35
|
+
private readJsonFromCompilerOrNodeFs;
|
|
36
|
+
private generateCatalogAndMcpAssetsAfterTypes;
|
|
37
|
+
private injectAfterGenerateTypesHook;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { AuiMcpRspackPlugin, type AuiMcpRspackPluginOptions };
|
package/dist/rspack.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { RspackPluginInstance, Compiler } from '@rspack/core';
|
|
2
|
+
import { TransportType } from './server.js';
|
|
3
|
+
|
|
4
|
+
interface AuiMcpRspackPluginOptions {
|
|
5
|
+
/** Module Federation options (will be passed to MF plugin). */
|
|
6
|
+
mfOptions?: any;
|
|
7
|
+
/** If false, will NOT apply ModuleFederationPlugin (useful when MF is managed by a rsbuild plugin). */
|
|
8
|
+
applyModuleFederationPlugin?: boolean;
|
|
9
|
+
/** dist output directory (absolute or relative to compiler.context). Defaults to compiler output.path */
|
|
10
|
+
outDir?: string;
|
|
11
|
+
/** Sub dir under dist for MCP assets. Defaults to "mcp" */
|
|
12
|
+
mcpDirname?: string;
|
|
13
|
+
/** Name of stats asset emitted by MF plugin. Defaults to "mf-stats.json" */
|
|
14
|
+
statsAssetName?: string;
|
|
15
|
+
/** Name of generated catalog json in dist root. Defaults to "aui-x-catalog.json" */
|
|
16
|
+
catalogAssetName?: string;
|
|
17
|
+
/** Whether to emit an executable MCP server bundle. Defaults to true */
|
|
18
|
+
emitServer?: boolean;
|
|
19
|
+
/** Auto start MCP server in watch/dev mode */
|
|
20
|
+
dev?: boolean;
|
|
21
|
+
/** Transport type used by auto-started server */
|
|
22
|
+
transport?: TransportType;
|
|
23
|
+
/** SSE port used by auto-started server */
|
|
24
|
+
port?: number;
|
|
25
|
+
}
|
|
26
|
+
declare class AuiMcpRspackPlugin implements RspackPluginInstance {
|
|
27
|
+
private options;
|
|
28
|
+
private devServerStarted;
|
|
29
|
+
constructor(options?: AuiMcpRspackPluginOptions);
|
|
30
|
+
apply(compiler: Compiler): void;
|
|
31
|
+
private getOutDir;
|
|
32
|
+
private isDev;
|
|
33
|
+
private readCompiledTypes;
|
|
34
|
+
private readFileFromCompilerOrNodeFs;
|
|
35
|
+
private readJsonFromCompilerOrNodeFs;
|
|
36
|
+
private generateCatalogAndMcpAssetsAfterTypes;
|
|
37
|
+
private injectAfterGenerateTypesHook;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { AuiMcpRspackPlugin, type AuiMcpRspackPluginOptions };
|