@happyvertical/smrt-core 0.36.3 → 0.36.5
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/collection.d.ts +8 -3
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +6 -0
- package/dist/collection.js.map +1 -1
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +13 -198
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +2 -2
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest/test-manifest-stub.d.ts.map +1 -1
- package/dist/manifest/test-manifest-stub.js +13 -198
- package/dist/manifest/test-manifest-stub.js.map +1 -1
- package/dist/manifest.json +13 -175
- package/dist/registry/types.d.ts +21 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +9 -0
- package/dist/registry.js.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +2 -0
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +30 -1
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/smrt-knowledge.json +14 -26
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +2 -0
- package/dist/vite-plugin/index.js.map +1 -1
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["/**\n * Vite plugin for automatic SMRT service generation\n * Provides virtual modules for REST, MCP, and other services\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { DomainKnowledgeConfig } from '@happyvertical/smrt-types';\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { buildDomainKnowledgeManifest } from '../knowledge.js';\nimport { discoverSmrtPackages } from '../manifest/discover-smrt-packages.js';\nimport type { SmartObjectManifest } from '../scanner/types';\nimport { importWorkspaceModule } from '../utils/import-workspace-module.js';\nimport type { ScannerModule } from '../utils/scanner-module.js';\nimport { importBuildAwareModule } from './import-build-aware.js';\nimport {\n findCliApiCoherenceViolations,\n generateSvelteKitRoutes,\n methodNameToKebab,\n resolveApiActionSet,\n validateCliIncludeAgainstApi,\n} from './sveltekit-generator.js';\n\nexport type {\n CliApiCoherenceViolation,\n SvelteKitOptions,\n} from './sveltekit-generator.js';\n// Re-export SvelteKit route generator for CLI usage\nexport {\n findCliApiCoherenceViolations,\n generateSvelteKitRoutes,\n methodNameToKebab,\n resolveApiActionSet,\n validateCliIncludeAgainstApi,\n} from './sveltekit-generator.js';\n\nexport interface SmrtPluginOptions {\n /** Glob patterns for SMRT source files */\n include?: string[];\n /** Patterns to exclude */\n exclude?: string[];\n /** Output directory for generated files */\n outDir?: string;\n /** Enable hot module replacement */\n hmr?: boolean;\n /** Watch for file changes */\n watch?: boolean;\n /** Generate types */\n generateTypes?: boolean;\n /** Custom base classes to scan for */\n baseClasses?: string[];\n /** Follow import chains to detect inheritance (e.g., Event extends SmrtObject) */\n followImports?: boolean;\n /** Directory to write TypeScript declarations (relative to project root) */\n typeDeclarationsPath?: string;\n /** Plugin execution mode - controls Node.js vs browser compatibility */\n mode?: 'server' | 'client' | 'auto';\n /**\n * @deprecated OXC scanner is now the only scanner. This option is ignored.\n */\n experimentalFastScanner?: boolean;\n /** SvelteKit route auto-generation options */\n svelteKit?: {\n /** Enable SvelteKit route generation (default: false) */\n enabled: boolean;\n /** Output directory for generated routes (default: 'src/routes/api') */\n routesDir?: string;\n /** Directory containing SMRT objects (default: 'src/lib/objects') */\n objectsDir?: string;\n /** Directory for configuration file (default: 'src/lib/server') */\n configPath?: string;\n /** Configuration file name (default: 'smrt.ts') */\n configFileName?: string;\n /**\n * Apply kebab-case to custom-method URL segments (e.g. `discoverFromUrl`\n * becomes `/discover-from-url`). Opt-in for one minor; default flips in\n * the next major. An explicit `api.routes[name].path` always wins.\n */\n kebabRoutes?: boolean;\n };\n /** Domain-scoped agent/developer knowledge artifact generation. */\n knowledge?: DomainKnowledgeConfig | false;\n /**\n * Validate that every method in `cli.include` is exposed via the API\n * (so HTTP-based CLI consumers can actually reach them). Default: true.\n * Per-class opt-out via `cli: { skipApiCheck: true }`.\n */\n validateCliApiCoherence?: boolean;\n}\n\nconst VIRTUAL_MODULES = {\n '@happyvertical/smrt-virt-routes': 'smrt:routes',\n '@happyvertical/smrt-virt-client': 'smrt:client',\n '@happyvertical/smrt-virt-mcp': 'smrt:mcp',\n '@happyvertical/smrt-virt-types': 'smrt:types',\n '@happyvertical/smrt-virt-manifest': 'smrt:manifest',\n '@happyvertical/smrt-virt-schema': 'smrt:schema',\n '@happyvertical/smrt-virt-ui': 'smrt:ui',\n '@happyvertical/smrt-virt-cli': 'smrt:cli',\n};\n\nasync function importScanner() {\n return importWorkspaceModule<ScannerModule>({\n packageName: '@happyvertical/smrt-scanner',\n distEntry: 'packages/scanner/dist/index.js',\n sourceEntry: 'packages/scanner/src/index.ts',\n purpose: 'Vite manifest scanning',\n });\n}\n\nexport function smrtPlugin(options: SmrtPluginOptions = {}): Plugin {\n const {\n include = ['src/**/*.ts', 'src/**/*.js'],\n exclude = ['**/*.test.ts', '**/*.spec.ts', '**/node_modules/**'],\n hmr = true,\n watch = true,\n generateTypes = true,\n baseClasses = ['SmrtObject', 'SmartObject'],\n followImports = true, // Default true: needed for multi-package inheritance\n typeDeclarationsPath = 'src/types',\n mode = 'auto',\n svelteKit = {\n enabled: false,\n routesDir: 'src/routes/api',\n objectsDir: 'src/lib/objects',\n configPath: 'src/lib/server',\n configFileName: 'smrt.ts',\n },\n knowledge,\n validateCliApiCoherence = true,\n } = options;\n\n /**\n * Dev-watcher variant of the cli↔api coherence lint: warn instead of throw,\n * so an in-flight decorator edit doesn't kill the dev server. Uses the same\n * remediation text as the strict build-time gate (`validateCliIncludeAgainstApi`)\n * so the dev-server message is as actionable as the build failure.\n */\n function warnCliApiCoherenceViolations(m: SmartObjectManifest): void {\n if (!validateCliApiCoherence) return;\n const violations = findCliApiCoherenceViolations(m);\n if (violations.length === 0) return;\n for (const { className, unreachable } of violations) {\n for (const action of unreachable) {\n console.warn(\n `[smrt] ${className}.${action} is declared in cli.include but is not ` +\n `exposed via the api. Build will fail until this is resolved.\\n` +\n ` Either:\\n` +\n ` - Add '${action}' to api.include, or\\n` +\n ` - Remove '${action}' from cli.include.\\n` +\n ` The CLI invokes methods over HTTP; methods without API routes are unreachable.\\n` +\n ` If this CLI is intentionally invoked in-process (no HTTP), set\\n` +\n ` \\`cli: { skipApiCheck: true }\\` on the @smrt() decorator to acknowledge.`,\n );\n }\n }\n }\n\n let server: ViteDevServer | undefined;\n let manifest: SmartObjectManifest | null = null;\n let pluginMode: 'server' | 'client' = 'server';\n let projectRoot: string = process.cwd();\n let config: any = null; // Store resolved config for closeBundle hook\n let resolvedPluginNames: string[] = [];\n\n /**\n * Write manifest to .smrt/manifest.json for CLI discovery.\n * This ensures `smrt db:migrate`, `smrt db:status`, etc. can find\n * locally-defined SMRT objects in non-library builds (Issue #963).\n */\n async function writeLocalManifest(\n m: SmartObjectManifest,\n rootDir: string,\n ): Promise<void> {\n try {\n const { writeFileSync, mkdirSync } = await import('node:fs');\n const { resolve } = await import('node:path');\n\n const smrtDir = resolve(rootDir, '.smrt');\n mkdirSync(smrtDir, { recursive: true });\n\n const manifestPath = resolve(smrtDir, 'manifest.json');\n writeFileSync(manifestPath, JSON.stringify(m, null, 2), 'utf-8');\n await writeDomainKnowledgeArtifact(\n m,\n rootDir,\n resolve(smrtDir, 'smrt-knowledge.json'),\n manifestPath,\n );\n\n const objectCount = Object.keys(m.objects).length;\n console.log(\n `[smrt] Wrote local manifest with ${objectCount} objects to .smrt/manifest.json`,\n );\n } catch (error) {\n console.error('[smrt] Error writing local manifest:', error);\n }\n }\n\n async function writeDomainKnowledgeArtifact(\n m: SmartObjectManifest,\n rootDir: string,\n outputPath: string,\n manifestPath: string,\n ): Promise<void> {\n const resolvedKnowledge = await resolveKnowledgeConfig(rootDir, m);\n if (resolvedKnowledge.enabled === false) {\n return;\n }\n\n const { mkdirSync, writeFileSync } = await import('node:fs');\n const { dirname } = await import('node:path');\n mkdirSync(dirname(outputPath), { recursive: true });\n const artifact = buildDomainKnowledgeManifest({\n manifest: m,\n rootDir,\n manifestPath,\n config: resolvedKnowledge,\n });\n writeFileSync(\n outputPath,\n JSON.stringify(\n preserveKnowledgeGeneratedAt(outputPath, artifact),\n null,\n 2,\n ),\n 'utf-8',\n );\n }\n\n async function resolveKnowledgeConfig(\n rootDir: string,\n m: SmartObjectManifest,\n ): Promise<DomainKnowledgeConfig> {\n if (knowledge === false) return { enabled: false };\n const packageName = m.packageName ?? readPackageName(rootDir);\n const defaults: DomainKnowledgeConfig = {\n enabled: true,\n api: {\n enabled: false,\n basePath: '/__smrt/knowledge',\n requireAdmin: true,\n includeDocs: false,\n includePrompts: false,\n },\n includeDocs: true,\n includePrompts: true,\n };\n\n let fileKnowledge: DomainKnowledgeConfig = {};\n let packageKnowledge: DomainKnowledgeConfig = {};\n try {\n const previousCwd = process.cwd();\n process.chdir(rootDir);\n try {\n const { loadConfig } = await import('@happyvertical/smrt-config');\n const config = await loadConfig({ cache: false });\n fileKnowledge = (config.knowledge ?? {}) as DomainKnowledgeConfig;\n packageKnowledge = (\n packageName ? (config.packages?.[packageName]?.knowledge ?? {}) : {}\n ) as DomainKnowledgeConfig;\n } finally {\n process.chdir(previousCwd);\n }\n } catch {\n fileKnowledge = {};\n packageKnowledge = {};\n }\n\n return mergeKnowledgeConfig(\n defaults,\n fileKnowledge,\n packageKnowledge,\n knowledge || {},\n );\n }\n\n function mergeKnowledgeConfig(\n ...configs: Array<DomainKnowledgeConfig | undefined | null | false>\n ): DomainKnowledgeConfig {\n const merged: DomainKnowledgeConfig = {};\n for (const next of configs) {\n if (!next) continue;\n const hasApi = Boolean(merged.api || next.api);\n const api = hasApi\n ? { ...(merged.api ?? {}), ...(next.api ?? {}) }\n : undefined;\n Object.assign(merged, next);\n if (api) merged.api = api;\n }\n return merged;\n }\n\n function preserveKnowledgeGeneratedAt(\n outputPath: string,\n nextKnowledge: Record<string, any>,\n ): Record<string, any> {\n if (!existsSync(outputPath)) return nextKnowledge;\n\n try {\n const current = JSON.parse(readFileSync(outputPath, 'utf8'));\n if (\n semanticKnowledgeJson(current) === semanticKnowledgeJson(nextKnowledge)\n ) {\n return {\n ...nextKnowledge,\n generatedAt: current.generatedAt,\n };\n }\n } catch {\n // Replace malformed artifacts.\n }\n\n return nextKnowledge;\n }\n\n function semanticKnowledgeJson(artifact: Record<string, any>): string {\n const { generatedAt: _generatedAt, ...rest } = artifact ?? {};\n return JSON.stringify(sortJson(rest));\n }\n\n function sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n }\n\n function readPackageName(rootDir: string): string | undefined {\n try {\n const pkg = JSON.parse(\n readFileSync(join(rootDir, 'package.json'), 'utf8'),\n );\n return typeof pkg.name === 'string' ? pkg.name : undefined;\n } catch {\n return undefined;\n }\n }\n\n function validateConsumerPluginSetup(\n m: SmartObjectManifest,\n context: 'configResolved' | 'buildStart',\n ): void {\n if (config?.mode === 'test') {\n return;\n }\n\n if (config?.build?.lib) {\n return;\n }\n\n const consumerDependencies = (m.smrtDependencies || []).filter(\n (dependency) => dependency !== '@happyvertical/smrt-core',\n );\n if (consumerDependencies.length === 0) {\n return;\n }\n\n const hasConsumerPlugin = resolvedPluginNames.some(\n (name) => name === 'smrt-consumer',\n );\n if (hasConsumerPlugin) {\n return;\n }\n\n const dependencySummary =\n consumerDependencies.length <= 4\n ? consumerDependencies.join(', ')\n : `${consumerDependencies.slice(0, 4).join(', ')}, +${consumerDependencies.length - 4} more`;\n\n throw new Error(\n `[smrt] Consumer project misconfiguration detected during ${context}: found external SMRT dependencies (${dependencySummary}) but vite.config is missing smrtConsumer(). Add \"import { smrtConsumer } from '@happyvertical/smrt-core/consumer-plugin'\" and register it alongside smrtPlugin() so .smrt/register.js is generated for CLI/runtime class loading.`,\n );\n }\n\n function validateLibraryMinifySetup(\n m: SmartObjectManifest,\n context: 'configResolved' | 'buildStart',\n ): void {\n if (!config?.build?.lib) {\n return;\n }\n\n if (Object.keys(m.objects || {}).length === 0) {\n return;\n }\n\n if (config.build.minify === false) {\n return;\n }\n\n throw new Error(\n `[smrt] Library package misconfiguration detected during ${context}: packages that publish SMRT objects must set Vite build.minify = false. Minification rewrites runtime class names and breaks manifest registration, STI resolution, and collection queries in downstream apps.`,\n );\n }\n\n return {\n name: 'smrt-auto-service',\n\n // Expose options for external access (e.g., test manifest generation)\n api: {\n options: {\n baseClasses,\n followImports,\n include,\n exclude,\n },\n },\n\n async configResolved(resolvedConfig) {\n // Store config for closeBundle hook\n config = resolvedConfig;\n resolvedPluginNames = (resolvedConfig.plugins || []).map(\n (plugin) => plugin?.name || '',\n );\n\n // Store project root for file scanning\n projectRoot = resolvedConfig.root;\n\n // Detect plugin mode based on build configuration\n if (mode === 'auto') {\n const isSSRBuild = resolvedConfig.build?.ssr;\n const isFederationBuild = resolvedConfig.plugins.some((p) =>\n p.name?.includes('federation'),\n );\n const isClientBuild =\n isFederationBuild ||\n (!isSSRBuild && resolvedConfig.build?.target === 'esnext');\n\n pluginMode = isClientBuild ? 'client' : 'server';\n } else {\n pluginMode = mode;\n }\n\n console.log(`[smrt] Running in ${pluginMode} mode`);\n\n // Scan files and generate initial manifest in all modes\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n validateLibraryMinifySetup(manifest, 'configResolved');\n validateConsumerPluginSetup(manifest, 'configResolved');\n if (validateCliApiCoherence) {\n validateCliIncludeAgainstApi(manifest);\n }\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest) {\n await generateSvelteKitRoutes(resolvedConfig.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n resolvedConfig.root,\n manifest,\n ),\n });\n }\n },\n\n async buildStart() {\n // Rescan files on build start in all modes\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n validateLibraryMinifySetup(manifest, 'buildStart');\n validateConsumerPluginSetup(manifest, 'buildStart');\n if (validateCliApiCoherence) {\n validateCliIncludeAgainstApi(manifest);\n }\n }\n },\n\n configureServer(devServer) {\n server = devServer;\n\n // Serve default HTML when no index.html exists\n // Skip for SvelteKit projects (they use src/app.html and handle routing themselves)\n devServer.middlewares.use(async (req, res, next) => {\n // Skip default UI entirely for SvelteKit projects\n if (svelteKit.enabled) {\n return next();\n }\n\n if (req.url === '/' || req.url === '/index.html') {\n try {\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const projectRoot = devServer.config.root;\n const indexPath = join(projectRoot, 'index.html');\n\n // If index.html exists, let Vite handle it\n if (existsSync(indexPath)) {\n return next();\n }\n\n // Otherwise, serve default SMRT UI\n console.log('[smrt] Serving default UI (no index.html found)');\n let html = getDefaultHTML();\n\n // Apply Vite's HTML transformation to process module imports\n html = await devServer.transformIndexHtml('/', html);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } catch (error) {\n console.error('[smrt] Error serving default HTML:', error);\n return next();\n }\n }\n next();\n });\n\n // Set up file watching in all modes when enabled\n if (watch && hmr) {\n // Watch for file changes\n const watcher = devServer.watcher;\n\n // Guard each watcher handler: scanAndGenerateManifest re-throws on a\n // mid-edit scan error, and an unhandled rejection in a watcher callback\n // can crash the dev server. Log and keep the previous manifest (#1378).\n watcher.on('change', async (file) => {\n try {\n if (await shouldRescan(file)) {\n console.log(`[smrt] Rescanning due to change in ${file}`);\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n warnCliApiCoherenceViolations(manifest);\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest && server) {\n await generateSvelteKitRoutes(server.config.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n server.config.root,\n manifest,\n ),\n });\n }\n\n // Invalidate virtual modules\n Object.values(VIRTUAL_MODULES).forEach((id) => {\n const module = server?.moduleGraph.getModuleById(id);\n if (module) {\n server?.reloadModule(module);\n }\n });\n }\n } catch (error) {\n console.error(\n `[smrt] Failed to rescan after change in ${file}:`,\n error,\n );\n }\n });\n\n watcher.on('add', async (file) => {\n try {\n if (await shouldRescan(file)) {\n console.log(`[smrt] Rescanning due to new file ${file}`);\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n warnCliApiCoherenceViolations(manifest);\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest && server) {\n await generateSvelteKitRoutes(server.config.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n server.config.root,\n manifest,\n ),\n });\n }\n }\n } catch (error) {\n console.error(\n `[smrt] Failed to rescan after adding ${file}:`,\n error,\n );\n }\n });\n\n watcher.on('unlink', async (file) => {\n try {\n if (await shouldRescan(file)) {\n console.log(`[smrt] Rescanning due to removed file ${file}`);\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n warnCliApiCoherenceViolations(manifest);\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest && server) {\n await generateSvelteKitRoutes(server.config.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n server.config.root,\n manifest,\n ),\n });\n }\n }\n } catch (error) {\n console.error(\n `[smrt] Failed to rescan after removing ${file}:`,\n error,\n );\n }\n });\n }\n },\n\n resolveId(id) {\n // Resolve virtual module imports\n if (id in VIRTUAL_MODULES) {\n return `\\0${VIRTUAL_MODULES[id as keyof typeof VIRTUAL_MODULES]}`;\n }\n\n // Resolve virtual index.html for dev UI (only in dev mode)\n if (id === '/index.html' && server) {\n return `\\0smrt:index-html`;\n }\n\n return null;\n },\n\n async load(id) {\n // Load virtual modules (strip the \\0 prefix)\n const cleanId = id.startsWith('\\0') ? id.slice(1) : id;\n\n if (!manifest) {\n manifest = await scanAndGenerateManifest(projectRoot);\n }\n\n switch (cleanId) {\n case 'smrt:routes':\n // Routes module available in all modes\n return await generateRoutesModule(manifest);\n\n case 'smrt:client':\n // Client module available in both modes\n return generateClientModule(manifest, {\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n });\n\n case 'smrt:mcp':\n // MCP module available in all modes\n return await generateMCPModule(manifest);\n\n case 'smrt:types':\n // Types module available in both modes\n return await generateTypesModule(manifest, pluginMode);\n\n case 'smrt:manifest':\n // Manifest module available in both modes\n return generateManifestModule(manifest);\n\n case 'smrt:schema':\n // Schema module available in both modes\n return await generateSchemaModule(manifest);\n\n case 'smrt:ui':\n // UI module for default development interface\n return await loadDefaultUI();\n\n case 'smrt:index-html':\n // Virtual index.html for projects without one\n return await loadDefaultHTML();\n\n case 'smrt:cli':\n // CLI module for command-line interface generation\n return await generateCLIModule(manifest);\n\n default:\n return null;\n }\n },\n\n transformIndexHtml: {\n order: 'pre',\n handler: async (html, _ctx) => {\n // Only provide default HTML if no index.html exists in project\n if (!server) return html;\n\n try {\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const projectRoot = server.config.root;\n const indexPath = join(projectRoot, 'index.html');\n\n // If index.html exists, use it as-is\n if (existsSync(indexPath)) {\n return html;\n }\n\n // Otherwise, provide default SMRT UI\n return await loadDefaultHTML();\n } catch (error) {\n console.error('[smrt] Error checking for index.html:', error);\n return html;\n }\n },\n },\n\n async closeBundle() {\n // Write manifest to disk during library builds\n // This allows published packages to include their manifest\n if (!manifest || !config.build?.lib) {\n return;\n }\n\n try {\n const { writeFileSync, mkdirSync } = await import('node:fs');\n const { resolve, dirname } = await import('node:path');\n\n // Determine output directory\n const outDir =\n config.build?.rollupOptions?.output?.dir ||\n config.build?.outDir ||\n 'dist';\n const manifestPath = resolve(projectRoot, outDir, 'manifest.json');\n const knowledgePath = resolve(\n projectRoot,\n outDir,\n 'smrt-knowledge.json',\n );\n\n // Ensure directory exists\n mkdirSync(dirname(manifestPath), { recursive: true });\n\n // Write manifest file\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n await writeDomainKnowledgeArtifact(\n manifest,\n projectRoot,\n knowledgePath,\n manifestPath,\n );\n\n const objectCount = Object.keys(manifest.objects).length;\n console.log(\n `[smrt] Wrote manifest with ${objectCount} objects to ${manifestPath}`,\n );\n } catch (error) {\n console.error('[smrt] Error writing manifest file:', error);\n }\n },\n };\n\n async function scanAndGenerateManifest(\n rootDir: string,\n ): Promise<SmartObjectManifest> {\n // NOTE: We do NOT use the framework's static manifest here\n // The static manifest JSON that core emits at build time\n // contains framework objects (like 'pleb') which should not be included\n // when scanning user code in consuming applications.\n //\n // smrtPlugin is designed to scan USER code dynamically, not load\n // framework objects. For consuming apps that need framework objects,\n // they should use smrtConsumer plugin instead.\n\n // Always use OXC-based scanner (consolidated in Issue #951)\n try {\n return await scanWithOxc(rootDir);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('Cannot find package')\n ) {\n console.error(\n '[smrt] @happyvertical/smrt-scanner is required but not installed.',\n );\n console.error(\n '[smrt] Install it: pnpm add @happyvertical/smrt-scanner',\n );\n }\n console.error('[smrt] Error scanning files:', error);\n // Re-throw to fail the build - don't silently continue with empty manifest\n throw error;\n }\n }\n\n /**\n * Scan files using OXC-based scanner (experimental fast path)\n * Uses Rust-based oxc-parser for 2-3x faster parsing\n */\n async function scanWithOxc(rootDir: string): Promise<SmartObjectManifest> {\n const startTime = performance.now();\n\n try {\n // Import the OXC scanner package\n const { OxcScanner, ManifestAdapter } = await importScanner();\n\n console.log(`[smrt] Using experimental OXC scanner for faster builds`);\n\n // Create scanner with options. Always exclude .svelte files as OXC barfs on <style> tags\n const safeExclude = [...(exclude || []), '**/*.svelte'];\n const scanner = new OxcScanner({\n cwd: rootDir,\n include,\n exclude: safeExclude,\n });\n\n // Scan and resolve inheritance\n const { results, resolved } = await scanner.scanAndResolve();\n\n // Check for errors\n if (results.errors.length > 0) {\n console.error(\n `\\n[smrt] ❌ Build failed: ${results.errors.length} error(s) during scanning:\\n`,\n );\n for (const error of results.errors) {\n console.error(\n ` ${error.filePath}:${error.line || '?'}: ${error.message}\\n`,\n );\n }\n throw new Error(\n '[smrt] Build aborted due to scan errors. See above for details.',\n );\n }\n\n // Read package.json for metadata BEFORE creating manifest (Issue #713)\n // This ensures qualified names are generated correctly for namespace isolation\n // packageJson is also needed for agent manifest generation (component discovery)\n let packageName: string | undefined;\n let packageVersion: string | undefined;\n let packageJson: any;\n try {\n const { readFileSync } = await import('node:fs');\n const { join } = await import('node:path');\n const pkgPath = join(rootDir, 'package.json');\n const pkgContent = readFileSync(pkgPath, 'utf-8');\n packageJson = JSON.parse(pkgContent);\n packageName = packageJson.name || undefined;\n packageVersion = packageJson.version || undefined;\n } catch {\n // package.json not found or invalid - continue without packageName\n console.warn(\n '[smrt] Warning: package.json not found. Qualified names will not be generated.',\n );\n }\n\n // Convert to manifest format with packageName for qualified names (Issue #713)\n const adapter = new ManifestAdapter();\n const newManifest = adapter.toManifest(resolved, {\n packageName,\n packageVersion,\n typeAliases: results.typeAliases,\n });\n\n // Add moduleType identifier\n newManifest.moduleType = 'smrt';\n\n // Keep this as a normal module import: dynamic source imports with a\n // `.js` specifier do not reliably resolve through tsx during publish-time\n // workspace builds, even though the compiled dist path exists.\n const smrtDependencies = discoverSmrtPackages({ baseDir: rootDir });\n if (smrtDependencies.length > 0) {\n newManifest.smrtDependencies = smrtDependencies;\n console.log(\n `[smrt] Found ${smrtDependencies.length} SMRT dependencies: ${smrtDependencies.join(', ')}`,\n );\n }\n\n // Run all manifest generation passes (same as TypeScript scanner path)\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const manifestGen = new ManifestGenerator();\n // IMPORTANT: Materialize tenantScoped fields and merge inherited fields\n // BEFORE generating schemas so migration manifests contain every column.\n manifestGen.injectTenantScopedFields(newManifest);\n manifestGen.mergeInheritedFields(newManifest);\n manifestGen.generateValidationRules(newManifest);\n manifestGen.generateSchemas(newManifest);\n manifestGen.assertTenantScopedSchemaContract(newManifest);\n // Final pass: Generate agent manifests for Agent subclasses\n // Derives permissions, features, menuItems, and components from code\n manifestGen.generateAgentManifests(newManifest, packageName, packageJson);\n\n const elapsed = performance.now() - startTime;\n\n // Log results\n const objectCount = Object.keys(newManifest.objects).length;\n if (objectCount > 0) {\n const names = Object.keys(newManifest.objects).join(', ');\n console.log(`[smrt] Found ${objectCount} SMRT objects: ${names}`);\n } else {\n console.log('[smrt] No SMRT objects found');\n }\n console.log(`[smrt] OXC scan completed in ${elapsed.toFixed(2)}ms`);\n\n // Generate TypeScript declarations if enabled\n if (generateTypes && server) {\n await generateTypeDeclarationFile(\n newManifest,\n rootDir,\n typeDeclarationsPath,\n );\n }\n\n return newManifest;\n } catch (error) {\n console.error('[smrt] Error in OXC scanner:', error);\n throw error;\n }\n }\n\n async function shouldRescan(file: string): Promise<boolean> {\n // Only rescan in server mode\n if (pluginMode === 'client') {\n return false;\n }\n\n try {\n // Conditionally import minimatch\n const { minimatch } = await import('minimatch');\n\n const isIncluded = include.some((pattern) => minimatch(file, pattern));\n const isExcluded = exclude.some((pattern) => minimatch(file, pattern));\n\n return isIncluded && !isExcluded;\n } catch (error) {\n console.warn('[smrt] Error checking file patterns:', error);\n return false;\n }\n }\n}\n\n/**\n * Generate virtual routes module\n */\nasync function generateRoutesModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const generator = new ManifestGenerator();\n const routes = generator.generateRestEndpoints(manifest);\n\n return `\n// Auto-generated REST routes from SMRT objects\n// This file is generated automatically - do not edit\n\n/**\n * Setup routes on an Express-like app\n *\n * NOTE: This virtual module function is for documentation only.\n * For actual route registration, use:\n * - import { startRestServer } from '@happyvertical/smrt-core'\n * - Or APIGenerator from '@happyvertical/smrt-core/generators'\n *\n * @param app - Express-like app instance\n * @param options - Route configuration options\n * @param options.basePath - Base path for all routes (default: '/api/v1')\n */\nexport function setupRoutes(app, options = {}) {\n const basePath = options.basePath || '/api/v1';\n\n console.warn('[smrt] setupRoutes is a documentation function only.');\n console.warn('[smrt] Use startRestServer() or APIGenerator for actual route registration.');\n console.warn('[smrt] Available endpoints:');\n${routes\n .split('\\\\n')\n .map((line) => ` console.warn(\\` \\${basePath}${line.trim()}\\`);`)\n .join('\\\\n')}\n}\n\nexport { setupRoutes as default };\n`;\n } catch (error) {\n console.warn('[smrt] Error generating routes module:', error);\n return 'export function setupRoutes(app, options = {}) { console.warn(\"Routes generation failed\"); }';\n }\n}\n\n/**\n * Generate virtual client module\n */\nfunction lowerFirst(value: string): string {\n return value ? value[0].toLowerCase() + value.slice(1) : value;\n}\n\nfunction uniqueApiClientEntries(\n objects: Array<[string, SmartObjectManifest['objects'][string]]>,\n): Array<{\n objectName: string;\n obj: SmartObjectManifest['objects'][string];\n clientKey: string;\n}> {\n const usedKeys = new Set<string>();\n\n return objects.map(([objectName, obj]) => {\n let clientKey = obj.collection;\n\n if (usedKeys.has(clientKey)) {\n clientKey = lowerFirst(obj.className);\n }\n\n const baseClientKey = clientKey;\n let suffix = 2;\n while (usedKeys.has(clientKey)) {\n clientKey = `${baseClientKey}${suffix}`;\n suffix += 1;\n }\n\n usedKeys.add(clientKey);\n return { objectName, obj, clientKey };\n });\n}\n\nfunction generateClientModule(\n manifest: SmartObjectManifest,\n options: { kebabRoutes?: boolean } = {},\n): string {\n const objects = uniqueApiClientEntries(Object.entries(manifest.objects));\n\n const clientMethods = objects\n .map(({ obj, clientKey }) => {\n const { collection, methods = {} } = obj;\n\n // Honor api include/exclude + scope/static skip rules for custom methods,\n // so the client only emits proxies for methods that actually have routes\n // emitted by the server. (Custom only — CRUD is left unconditional to\n // preserve the existing client-type contract.)\n const exposedActions = resolveApiActionSet(obj);\n const apiConfig = obj.decoratorConfig?.api;\n const apiRoutes: Record<string, { path?: string }> =\n apiConfig && typeof apiConfig === 'object'\n ? ((apiConfig as { routes?: Record<string, { path?: string }> })\n .routes ?? {})\n : {};\n\n const customMethods = Object.entries(methods).filter(\n ([name, method]) => method.isPublic && exposedActions.has(name),\n );\n\n // Resolve the URL segment for each custom method using the same priority\n // the server does in normalizeCustomRoutePath: explicit api.routes[name].path\n // override wins; else kebab-case when kebabRoutes is enabled; else source casing.\n const segmentFor = (methodName: string): string => {\n const overridePath = apiRoutes[methodName]?.path;\n if (overridePath) {\n const trimmed = overridePath\n .split('/')\n .map((s) => s.trim())\n .filter(Boolean)\n .join('/');\n if (trimmed.length > 0) return trimmed;\n }\n return options.kebabRoutes ? methodNameToKebab(methodName) : methodName;\n };\n\n // Generate custom method implementations.\n // Custom methods are instance methods: POST /{collection}/{id}/{urlSegment}.\n const customMethodImpls = customMethods\n .map(([methodName, _method]) => {\n const urlSegment = segmentFor(methodName);\n return ` ${methodName}: (id, options) => fetch(basePath + '/${collection}/' + id + '/${urlSegment}', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(options || {})\n }).then(r => r.json())`;\n })\n .join(',\\n');\n\n const customMethodsBlock =\n customMethods.length > 0 ? `,\\n${customMethodImpls}` : '';\n\n return `\n ${clientKey}: {\n list: (params) => fetch(basePath + '/${collection}', {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.json()),\n\n get: (id) => fetch(basePath + '/${collection}/' + id, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.json()),\n\n create: (data) => fetch(basePath + '/${collection}', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }).then(r => r.json()),\n\n update: (id, data) => fetch(basePath + '/${collection}/' + id, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }).then(r => r.json()),\n\n delete: (id) => fetch(basePath + '/${collection}/' + id, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.ok),\n\n search: (query) => fetch(basePath + '/${collection}/search?q=' + encodeURIComponent(query), {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.json())${customMethodsBlock}\n }`;\n })\n .join(',');\n\n return `\n// Auto-generated API client from SMRT objects\n// This file is generated automatically - do not edit\n\nexport function createClient(basePath = '/api/v1') {\n return {${clientMethods}\n };\n}\n\nexport { createClient as default };\n`;\n}\n\n/**\n * Generate virtual MCP module\n */\nasync function generateMCPModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const generator = new ManifestGenerator();\n const tools = generator.generateMCPTools(manifest);\n\n return `\n// Auto-generated MCP tools from SMRT objects\n// This file is generated automatically - do not edit\n\nimport { SmrtMCPServer } from '@happyvertical/smrt-core/runtime';\n\nexport const tools = ${tools};\n\nexport function createMCPServer(options = {}) {\n const server = new SmrtMCPServer({\n name: options.name || 'smrt-auto-generated',\n version: options.version || '1.0.0',\n ...options\n });\n\n // Add all generated tools to the server\n for (const tool of tools) {\n server.addTool(tool, async (params) => {\n // Tool execution will be handled by the application\n throw new Error(\\`Tool '\\${tool.name}' handler must be provided by application\\`);\n });\n }\n\n return server;\n}\n\nexport { createMCPServer as default };\n`;\n } catch (error) {\n console.warn('[smrt] Error generating MCP module:', error);\n return `\nimport { SmrtMCPServer } from '@happyvertical/smrt-core/runtime';\nexport const tools = [];\nexport function createMCPServer(options = {}) {\n console.warn(\"MCP generation failed\");\n return new SmrtMCPServer({\n name: options.name || 'smrt-client',\n version: options.version || '1.0.0',\n ...options\n });\n}\n`;\n }\n}\n\n/**\n * Generate client-mode types without server dependencies\n */\nfunction generateClientModeTypes(manifest: SmartObjectManifest): string {\n const typeDefinitions: string[] = [];\n\n // Generate interfaces for each object in the manifest\n for (const [objectName, objectMeta] of Object.entries(manifest.objects)) {\n const fields = objectMeta.fields || {};\n const propertyLines: string[] = [];\n\n for (const [fieldName, fieldDef] of Object.entries(fields)) {\n let type = 'any';\n\n // Map SMRT field types to TypeScript types\n switch (fieldDef.type) {\n case 'text':\n type = 'string';\n break;\n case 'decimal':\n case 'integer':\n type = 'number';\n break;\n case 'boolean':\n type = 'boolean';\n break;\n case 'datetime':\n type = 'string';\n break;\n case 'json':\n type = 'any';\n break;\n case 'foreignKey':\n type = 'string';\n break;\n default:\n type = 'any';\n }\n\n const optional = !fieldDef.required ? '?' : '';\n propertyLines.push(` ${fieldName}${optional}: ${type};`);\n }\n\n // Add common SmrtObject properties\n propertyLines.unshift(\n ' id?: string;',\n ' created_at?: string;',\n ' updated_at?: string;',\n );\n\n const interfaceDef = `export interface ${objectName}Data {\\n${propertyLines.join('\\n')}\\n}`;\n typeDefinitions.push(interfaceDef);\n }\n\n return typeDefinitions.join('\\n\\n');\n}\n\n/**\n * Generate virtual types module\n */\nasync function generateTypesModule(\n manifest: SmartObjectManifest,\n mode: 'server' | 'client' = 'server',\n): Promise<string> {\n let interfaces = '';\n\n try {\n // Only use scanner in server mode to avoid Node.js dependencies in browser builds\n if (mode !== 'client') {\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const generator = new ManifestGenerator();\n interfaces = generator.generateTypeDefinitions(manifest);\n } else {\n // In client mode, generate basic interfaces directly from manifest\n interfaces = generateClientModeTypes(manifest);\n }\n\n return `\n// Auto-generated TypeScript types from SMRT objects\n// This file is generated automatically - do not edit\n\n${interfaces}\n\nexport interface Request {\n params: Record<string, string>;\n query: Record<string, any>;\n json(): Promise<any>;\n}\n\nexport interface Response {\n json(data: any, init?: { status?: number }): Response;\n status(code: number): Response;\n}\n`;\n } catch (error) {\n console.warn('[smrt] Error generating types module:', error);\n return `\n// Auto-generated TypeScript types from SMRT objects (fallback)\n// This file is generated automatically - do not edit\n\nexport interface Request {\n params: Record<string, string>;\n query: Record<string, any>;\n json(): Promise<any>;\n}\n\nexport interface Response {\n json(data: any, init?: { status?: number }): Response;\n status(code: number): Response;\n}\n`;\n }\n}\n\n/**\n * Generate virtual manifest module\n */\nfunction generateManifestModule(manifest: SmartObjectManifest): string {\n return `\n// Auto-generated manifest from SMRT objects\n// This file is generated automatically - do not edit\n\nexport const manifest = ${JSON.stringify(manifest, null, 2)};\n\nexport { manifest as default };\n`;\n}\n\n/**\n * Generate TypeScript declaration file for virtual modules\n * This eliminates the need for manual type maintenance\n */\nasync function generateTypeDeclarationFile(\n manifest: SmartObjectManifest,\n projectRoot: string,\n typeDeclarationsPath: string,\n): Promise<void> {\n try {\n // Conditionally import path and fs modules\n const [{ join }, { existsSync, mkdirSync, writeFileSync }] =\n await Promise.all([import('node:path'), import('node:fs')]);\n\n const declarationsDir = join(projectRoot, typeDeclarationsPath);\n const declarationsFile = join(declarationsDir, 'virtual-modules.d.ts');\n\n // Create directory if it doesn't exist\n if (!existsSync(declarationsDir)) {\n mkdirSync(declarationsDir, { recursive: true });\n }\n\n // Generate interface definitions for each discovered SMRT object\n const objectInterfaces = Object.entries(manifest.objects)\n .map(([_name, obj]) => {\n const interfaceName = `${obj.className}Data`;\n const fields = Object.entries(obj.fields)\n .map(([fieldName, field]) => {\n const optional = field.required === false ? '?' : '';\n const type = mapTypeScriptType(field.type);\n return ` ${fieldName}${optional}: ${type};`;\n })\n .join('\\n');\n\n return ` export interface ${interfaceName} {\n id?: string;\n${fields}\n createdAt?: string;\n updatedAt?: string;\n }`;\n })\n .join('\\n\\n');\n\n // Generate API client interface for each object\n // Always use plural collection names (standard REST convention).\n // Filter custom methods through resolveApiActionSet so the declared\n // type surface matches what generateClientModule actually emits at\n // runtime — otherwise consumers see methods in autocomplete that are\n // undefined at runtime.\n const apiClientInterface = uniqueApiClientEntries(\n Object.entries(manifest.objects),\n )\n .map(({ obj, clientKey }) => {\n const { className, methods = {} } = obj;\n const interfaceName = `${className}Data`;\n const exposedActions = resolveApiActionSet(obj);\n const customMethods = Object.entries(methods).filter(\n ([name, method]) => method.isPublic && exposedActions.has(name),\n );\n\n // Generate custom method signatures\n // Custom methods are instance methods requiring id as first parameter\n const customMethodSignatures = customMethods\n .map(([methodName, method]) => {\n const params = method.parameters || [];\n const optionsSignature =\n params.length > 0\n ? `, options?: { ${params.map((p) => `${p.name}?: ${mapTypeScriptType(p.type)}`).join('; ')} }`\n : '';\n return ` ${methodName}(id: string${optionsSignature}): Promise<any>;`;\n })\n .join('\\n');\n\n if (customMethods.length > 0) {\n // Object with custom methods: include both CRUD and custom methods\n return ` ${clientKey}: CrudOperations<${interfaceName}> & {\\n${customMethodSignatures}\\n };`;\n } else {\n // Standard CRUD operations only\n return ` ${clientKey}: CrudOperations<${interfaceName}>;`;\n }\n })\n .join('\\n');\n\n // Generate MCP tool interfaces based on discovered methods\n const _mcpTools = Object.entries(manifest.objects).flatMap(([_name, obj]) =>\n Object.entries(obj.methods).map(([methodName, method]) => ({\n name: `${methodName}_${obj.collection}`,\n description: `${method.name} operation on ${obj.collection}`,\n inputSchema: {\n type: 'object',\n properties: Object.fromEntries(\n method.parameters.map((param) => [\n param.name,\n { type: mapJsonSchemaType(param.type) },\n ]),\n ),\n required: method.parameters\n .filter((p) => p.optional !== true)\n .map((p) => p.name),\n },\n })),\n );\n\n const typeDeclarations = `/**\n * Auto-generated TypeScript declarations for SMRT virtual modules\n * Generated from discovered @smrt() decorated classes\n * \n * DO NOT EDIT THIS FILE MANUALLY\n * This file is automatically regenerated when SMRT objects change\n */\n\n// Manifest module - Contains discovered SMRT objects metadata\ndeclare module '@happyvertical/smrt-virt-manifest' {\n export interface SmrtObjectField {\n type: string;\n required?: boolean;\n default?: any;\n }\n\n export interface SmrtObjectMethod {\n name: string;\n parameters: Array<{\n name: string;\n type: string;\n required?: boolean;\n }>;\n returnType: string;\n isAsync: boolean;\n }\n\n export interface SmrtObjectDefinition {\n className: string;\n collection: string;\n fields: Record<string, SmrtObjectField>;\n methods: Record<string, SmrtObjectMethod>;\n decoratorConfig: any;\n }\n\n export interface SmrtManifest {\n version: string;\n timestamp: number;\n objects: Record<string, SmrtObjectDefinition>;\n }\n\n export const manifest: SmrtManifest;\n}\n\n// Routes module - Auto-generated REST route setup\ndeclare module '@happyvertical/smrt-virt-routes' {\n export interface RouteApp {\n get(path: string, handler: (req: any, res: any) => void): void;\n post(path: string, handler: (req: any, res: any) => void): void;\n put(path: string, handler: (req: any, res: any) => void): void;\n delete(path: string, handler: (req: any, res: any) => void): void;\n }\n\n export interface RouteOptions {\n basePath?: string;\n [key: string]: any;\n }\n\n export function setupRoutes(app: RouteApp, options?: RouteOptions): void;\n export default setupRoutes;\n}\n\n// Client module - Auto-generated API client \ndeclare module '@happyvertical/smrt-virt-client' {\n export interface ApiResponse<T = any> {\n id?: string;\n data?: T;\n error?: string;\n message?: string;\n }\n\n export interface CrudOperations<T = any> {\n list(params?: Record<string, any>): Promise<T[]>;\n get(id: string): Promise<T>;\n create(data: Partial<T>): Promise<T>;\n update(id: string, data: Partial<T>): Promise<T>;\n delete(id: string): Promise<boolean>;\n search(query: string): Promise<T[]>;\n }\n\n export interface ApiClient {\n${apiClientInterface}\n }\n\n export function createClient(basePath?: string): ApiClient;\n export default createClient;\n}\n\n// MCP module - Auto-generated Model Context Protocol tools\ndeclare module '@happyvertical/smrt-virt-mcp' {\n import type { SmrtMCPServer, MCPServerOptions } from '@happyvertical/smrt-core/runtime';\n\n export interface McpTool {\n name: string;\n description: string;\n inputSchema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n }\n\n export const tools: McpTool[];\n export function createMCPServer(options?: MCPServerOptions): SmrtMCPServer;\n export default createMCPServer;\n}\n\n// Types module - Auto-generated TypeScript interfaces\ndeclare module '@happyvertical/smrt-virt-types' {\n export const types: string;\n\n // Auto-generated interfaces for discovered SMRT objects\n${objectInterfaces}\n\n export default types;\n}\n\n// CLI module - Auto-generated command-line interface\ndeclare module '@happyvertical/smrt-virt-cli' {\n export interface CLIConfig {\n name?: string;\n version?: string;\n description?: string;\n prompt?: boolean;\n colors?: boolean;\n }\n\n export interface CLIContext {\n db?: any;\n ai?: any;\n user?: {\n id: string;\n roles?: string[];\n };\n }\n\n export interface CLICommandMap {\n [objectName: string]: {\n collection: string;\n commands: string[];\n };\n }\n\n export const cliCommands: CLICommandMap;\n\n export function setupCLI(config?: CLIConfig, context?: CLIContext): {\n run: (argv: string[]) => Promise<void>;\n generator: any;\n };\n\n export function getCLIHandler(config?: CLIConfig, context?: CLIContext): (argv: string[]) => Promise<void>;\n\n export default setupCLI;\n}`;\n\n // Write the declarations file\n writeFileSync(declarationsFile, typeDeclarations);\n console.log(\n `[smrt] Generated TypeScript declarations: ${declarationsFile}`,\n );\n } catch (error) {\n console.error('[smrt] Error generating TypeScript declarations:', error);\n }\n}\n\n/**\n * Map SMRT field types to TypeScript types\n */\nfunction mapTypeScriptType(smrtType: string): string {\n const typeMap: Record<string, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n array: 'any[]',\n object: 'Record<string, any>',\n date: 'string',\n Date: 'string',\n };\n return typeMap[smrtType] || 'any';\n}\n\n/**\n * Map TypeScript types to JSON Schema types for MCP tools\n */\nfunction mapJsonSchemaType(tsType: string): string {\n const typeMap: Record<string, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n array: 'array',\n object: 'object',\n any: 'string',\n };\n return typeMap[tsType] || 'string';\n}\n\n/**\n * Get default HTML template with inlined JavaScript (inlined for distribution)\n */\nfunction getDefaultHTML(): string {\n const uiScript = getDefaultUIModule();\n\n // Build HTML without template literals to avoid escaping issues\n return (\n '<!DOCTYPE html>\\n' +\n '<html lang=\"en\">\\n' +\n '<head>\\n' +\n ' <meta charset=\"UTF-8\">\\n' +\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n' +\n ' <title>SMRT Development UI</title>\\n' +\n ' <style>\\n' +\n ' * { margin: 0; padding: 0; box-sizing: border-box; }\\n' +\n ' body {\\n' +\n ' font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\\n' +\n ' background: #f5f5f5;\\n' +\n ' color: #333;\\n' +\n ' }\\n' +\n ' .container { max-width: 1200px; margin: 0 auto; padding: 20px; }\\n' +\n ' header {\\n' +\n ' background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\n' +\n ' color: white;\\n' +\n ' padding: 40px 0;\\n' +\n ' margin-bottom: 40px;\\n' +\n ' box-shadow: 0 4px 6px rgba(0,0,0,0.1);\\n' +\n ' }\\n' +\n ' header h1 { font-size: 2.5em; font-weight: 700; margin-bottom: 10px; }\\n' +\n ' .subtitle { font-size: 1.1em; opacity: 0.9; }\\n' +\n ' .stats {\\n' +\n ' display: grid;\\n' +\n ' grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\\n' +\n ' gap: 20px;\\n' +\n ' margin-bottom: 40px;\\n' +\n ' }\\n' +\n ' .stat-card {\\n' +\n ' background: white;\\n' +\n ' padding: 20px;\\n' +\n ' border-radius: 8px;\\n' +\n ' box-shadow: 0 2px 4px rgba(0,0,0,0.1);\\n' +\n ' text-align: center;\\n' +\n ' }\\n' +\n ' .stat-value { font-size: 2.5em; font-weight: 700; color: #667eea; margin-bottom: 5px; }\\n' +\n ' .stat-label { font-size: 0.9em; color: #666; text-transform: uppercase; letter-spacing: 1px; }\\n' +\n ' .collections { display: grid; gap: 30px; }\\n' +\n ' .collection-card {\\n' +\n ' background: white;\\n' +\n ' border-radius: 8px;\\n' +\n ' box-shadow: 0 2px 4px rgba(0,0,0,0.1);\\n' +\n ' overflow: hidden;\\n' +\n ' }\\n' +\n ' .collection-header {\\n' +\n ' background: #667eea;\\n' +\n ' color: white;\\n' +\n ' padding: 15px 20px;\\n' +\n ' display: flex;\\n' +\n ' justify-content: space-between;\\n' +\n ' align-items: center;\\n' +\n ' }\\n' +\n ' .collection-title { font-size: 1.3em; font-weight: 600; }\\n' +\n ' .collection-count {\\n' +\n ' background: rgba(255,255,255,0.2);\\n' +\n ' padding: 5px 15px;\\n' +\n ' border-radius: 20px;\\n' +\n ' font-size: 0.9em;\\n' +\n ' }\\n' +\n ' .collection-body { padding: 20px; }\\n' +\n ' .field-list {\\n' +\n ' display: grid;\\n' +\n ' grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\\n' +\n ' gap: 15px;\\n' +\n ' margin-bottom: 20px;\\n' +\n ' }\\n' +\n ' .field {\\n' +\n ' padding: 10px;\\n' +\n ' background: #f8f9fa;\\n' +\n ' border-radius: 4px;\\n' +\n ' border-left: 3px solid #667eea;\\n' +\n ' }\\n' +\n ' .field-name { font-weight: 600; color: #333; margin-bottom: 3px; }\\n' +\n ' .field-type { font-size: 0.85em; color: #666; }\\n' +\n ' .actions { display: flex; gap: 10px; flex-wrap: wrap; }\\n' +\n ' .btn {\\n' +\n ' padding: 10px 20px;\\n' +\n ' border: none;\\n' +\n ' border-radius: 4px;\\n' +\n ' font-size: 0.9em;\\n' +\n ' cursor: pointer;\\n' +\n ' transition: all 0.2s;\\n' +\n ' text-decoration: none;\\n' +\n ' display: inline-block;\\n' +\n ' }\\n' +\n ' .btn-primary { background: #667eea; color: white; }\\n' +\n ' .btn-primary:hover { background: #5568d3; transform: translateY(-1px); }\\n' +\n ' .btn-secondary { background: #e0e0e0; color: #333; }\\n' +\n ' .btn-secondary:hover { background: #d0d0d0; }\\n' +\n ' .loading { text-align: center; padding: 40px; color: #666; }\\n' +\n ' .error {\\n' +\n ' background: #fee;\\n' +\n ' border: 1px solid #fcc;\\n' +\n ' color: #c33;\\n' +\n ' padding: 15px;\\n' +\n ' border-radius: 4px;\\n' +\n ' margin-bottom: 20px;\\n' +\n ' }\\n' +\n ' .empty-state { text-align: center; padding: 60px 20px; color: #999; }\\n' +\n ' .empty-state svg { width: 100px; height: 100px; margin-bottom: 20px; opacity: 0.3; }\\n' +\n ' </style>\\n' +\n '</head>\\n' +\n '<body>\\n' +\n ' <div id=\"app\">\\n' +\n ' <div class=\"loading\">Loading SMRT UI...</div>\\n' +\n ' </div>\\n' +\n ' <script type=\"module\">\\n' +\n uiScript +\n '\\n </script>\\n' +\n '</body>\\n' +\n '</html>'\n );\n}\n\n/**\n * Get default UI module from template file\n * Loads the JavaScript template\n */\nfunction getDefaultUIModule(): string {\n try {\n // Get current file directory\n const __dirname = dirname(fileURLToPath(import.meta.url));\n\n // Load template file (works in both src and dist)\n const templatePath = join(__dirname, 'templates/default-ui.js');\n\n return readFileSync(templatePath, 'utf-8').trim();\n } catch (error) {\n console.error('[smrt] Error loading UI template:', error);\n // Fallback to minimal UI\n return `\nasync function createUI() {\n const app = document.getElementById('app');\n if (!app) return;\n app.innerHTML = '<div class=\"container\" style=\"padding:40px;text-align:center;\"><h1>🎯 SMRT Development UI</h1><p>Template file not found. UI code could not be loaded.</p></div>';\n}\ncreateUI();\n`;\n }\n}\n\n/**\n * Load default HTML template for projects without index.html\n */\nasync function loadDefaultHTML(): Promise<string> {\n return getDefaultHTML();\n}\n\n/**\n * Load default UI module\n */\nasync function loadDefaultUI(): Promise<string> {\n return getDefaultUIModule();\n}\n\n/**\n * Generate virtual CLI module\n */\nasync function generateCLIModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n // Import CLI types\n const commands: string[] = [];\n const objectImports: string[] = [];\n\n // Generate CLI setup code for each object\n for (const [className, objectDef] of Object.entries(manifest.objects)) {\n const config = objectDef.decoratorConfig;\n const cliConfig = config?.cli;\n\n // Skip if CLI is disabled\n if (cliConfig === false) continue;\n\n // Determine which operations to include\n const excluded =\n (typeof cliConfig === 'object' ? cliConfig.exclude : []) || [];\n const included = typeof cliConfig === 'object' ? cliConfig.include : null;\n\n const shouldInclude = (command: string) => {\n if (included && !included.includes(command)) return false;\n if (excluded.includes(command)) return false;\n return true;\n };\n\n // Collection name (metadata) and the command segment. Commands are keyed\n // by the simple class name (e.g. `document:list`) to match what\n // `CLIGenerator` resolves and the dev `smrt` CLI convention — NOT the\n // plural collection name, which the runtime resolver does not accept.\n const collectionName = objectDef.collection;\n const commandName = (objectDef.className || className).toLowerCase();\n\n // Generate import statement for the object class\n objectImports.push(\n `// Import ${className} and ${className}Collection for CLI operations`,\n );\n\n // Generate command registration\n const availableCommands: string[] = [];\n\n // Standard CRUD commands\n if (shouldInclude('list'))\n availableCommands.push(`'${commandName}:list'`);\n if (shouldInclude('get')) availableCommands.push(`'${commandName}:get'`);\n if (shouldInclude('create'))\n availableCommands.push(`'${commandName}:create'`);\n if (shouldInclude('update'))\n availableCommands.push(`'${commandName}:update'`);\n if (shouldInclude('delete'))\n availableCommands.push(`'${commandName}:delete'`);\n\n // Custom action methods\n for (const [methodName, _method] of Object.entries(objectDef.methods)) {\n // Skip private methods and standard CRUD\n if (\n methodName.startsWith('_') ||\n ['list', 'get', 'create', 'update', 'delete', 'save'].includes(\n methodName,\n )\n )\n continue;\n\n if (shouldInclude(methodName)) {\n availableCommands.push(`'${commandName}:${methodName}'`);\n }\n }\n\n if (availableCommands.length > 0) {\n commands.push(`\n // ${className} commands\n ${className}: {\n collection: '${collectionName}',\n commands: [${availableCommands.join(', ')}]\n }`);\n }\n }\n\n return `\n// Auto-generated CLI module from SMRT objects\n// This file is generated automatically - do not edit\n\nimport { CLIGenerator } from '@happyvertical/smrt-core/generators/cli';\n\n/**\n * @typedef {import('@happyvertical/smrt-core/generators/cli').CLIConfig} CLIConfig\n * @typedef {import('@happyvertical/smrt-core/generators/cli').CLIContext} CLIContext\n */\n\n${objectImports.join('\\n')}\n\n/**\n * Available CLI commands by object\n */\nexport const cliCommands = {${commands.join(',\\n')}\n};\n\n/**\n * Setup CLI with auto-generated commands\n *\n * @param {CLIConfig} [config={}] - CLI configuration\n * @param {CLIContext} [context={}] - CLI context\n * @returns {{run: function(string[]): Promise<void>, generator: *}}\n *\n * @example\n * import { setupCLI } from '@happyvertical/smrt-virt-cli';\n *\n * const cli = setupCLI({\n * name: 'my-app',\n * version: '1.0.0'\n * });\n *\n * cli.run(process.argv);\n */\nexport function setupCLI(config = {}, context = {}) {\n const generator = new CLIGenerator(config, context);\n return {\n run: async (argv) => {\n const handler = generator.generateHandler();\n await handler(argv.slice(2)); // Remove 'node' and script name\n },\n generator\n };\n}\n\n/**\n * Get CLI handler directly\n *\n * @param {CLIConfig} [config={}] - CLI configuration\n * @param {CLIContext} [context={}] - CLI context\n * @returns {function(string[]): Promise<void>}\n */\nexport function getCLIHandler(config = {}, context = {}) {\n const generator = new CLIGenerator(config, context);\n return generator.generateHandler();\n}\n\nexport default setupCLI;\n`;\n } catch (error) {\n console.warn('[smrt] Error generating CLI module:', error);\n return `\n// Error generating CLI module\nexport const cliCommands = {};\nexport function setupCLI() {\n console.warn(\"CLI generation failed\");\n return { run: async () => {} };\n}\nexport function getCLIHandler() {\n return async () => console.warn(\"CLI generation failed\");\n}\nexport default setupCLI;\n`;\n }\n}\n\n/**\n * Generate virtual schema module with JSON manifests\n */\nasync function generateSchemaModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n const { SchemaGenerator } = await importBuildAwareModule<\n typeof import('../schema/generator.js')\n >({\n source: '../schema/generator.ts',\n dist: '../schema/generator.js',\n });\n\n const schemaGenerator = new SchemaGenerator();\n const schemas: Record<string, any> = {};\n\n // Generate schemas for all SMRT objects\n for (const [className, objectDef] of Object.entries(manifest.objects)) {\n const schema = schemaGenerator.generateSchema(objectDef);\n schemas[className] = schema;\n }\n\n // Create JSON manifest for schemas\n const schemaManifest = {\n version: '1.0.0',\n timestamp: Date.now(),\n packageName: manifest.packageName || 'unknown',\n schemas: schemas,\n dependencies: Array.from(\n new Set(\n Object.values(schemas).flatMap((s: any) => s.dependencies || []),\n ),\n ),\n };\n\n return `// Auto-generated schema manifest from SMRT objects\n// This file is generated automatically - do not edit\n\n// Schema manifest as JSON for SQL adapters\nexport const schemaManifest = ${JSON.stringify(schemaManifest, null, 2)};\n\n// Schema registry for runtime access\nexport const schemas = schemaManifest.schemas;\n\n// Schema lookup function\nexport function getSchema(className: string) {\n return schemas[className];\n}\n\n// All schemas as array for dependency resolution\nexport const allSchemas = Object.values(schemas);\n\n// Package information\nexport const packageName = schemaManifest.packageName;\nexport const dependencies = schemaManifest.dependencies;\n\nexport default schemaManifest;`;\n } catch (error) {\n console.error('[smrt] Error generating schema module:', error);\n return `// Error generating schema module\nexport const schemaManifest = { schemas: {}, dependencies: [] };\nexport const schemas = {};\nexport function getSchema() { return null; }\nexport const allSchemas = [];\nexport default {};`;\n }\n}\n"],"names":["dirname","config","existsSync","join","projectRoot","readFileSync"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["/**\n * Vite plugin for automatic SMRT service generation\n * Provides virtual modules for REST, MCP, and other services\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { DomainKnowledgeConfig } from '@happyvertical/smrt-types';\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { buildDomainKnowledgeManifest } from '../knowledge.js';\nimport { discoverSmrtPackages } from '../manifest/discover-smrt-packages.js';\nimport type { SmartObjectManifest } from '../scanner/types';\nimport { importWorkspaceModule } from '../utils/import-workspace-module.js';\nimport type { ScannerModule } from '../utils/scanner-module.js';\nimport { importBuildAwareModule } from './import-build-aware.js';\nimport {\n findCliApiCoherenceViolations,\n generateSvelteKitRoutes,\n methodNameToKebab,\n resolveApiActionSet,\n validateCliIncludeAgainstApi,\n} from './sveltekit-generator.js';\n\nexport type {\n CliApiCoherenceViolation,\n SvelteKitOptions,\n} from './sveltekit-generator.js';\n// Re-export SvelteKit route generator for CLI usage\nexport {\n findCliApiCoherenceViolations,\n generateSvelteKitRoutes,\n methodNameToKebab,\n resolveApiActionSet,\n validateCliIncludeAgainstApi,\n} from './sveltekit-generator.js';\n\nexport interface SmrtPluginOptions {\n /** Glob patterns for SMRT source files */\n include?: string[];\n /** Patterns to exclude */\n exclude?: string[];\n /** Output directory for generated files */\n outDir?: string;\n /** Enable hot module replacement */\n hmr?: boolean;\n /** Watch for file changes */\n watch?: boolean;\n /** Generate types */\n generateTypes?: boolean;\n /** Custom base classes to scan for */\n baseClasses?: string[];\n /** Follow import chains to detect inheritance (e.g., Event extends SmrtObject) */\n followImports?: boolean;\n /** Directory to write TypeScript declarations (relative to project root) */\n typeDeclarationsPath?: string;\n /** Plugin execution mode - controls Node.js vs browser compatibility */\n mode?: 'server' | 'client' | 'auto';\n /**\n * @deprecated OXC scanner is now the only scanner. This option is ignored.\n */\n experimentalFastScanner?: boolean;\n /** SvelteKit route auto-generation options */\n svelteKit?: {\n /** Enable SvelteKit route generation (default: false) */\n enabled: boolean;\n /** Output directory for generated routes (default: 'src/routes/api') */\n routesDir?: string;\n /** Directory containing SMRT objects (default: 'src/lib/objects') */\n objectsDir?: string;\n /** Directory for configuration file (default: 'src/lib/server') */\n configPath?: string;\n /** Configuration file name (default: 'smrt.ts') */\n configFileName?: string;\n /**\n * Apply kebab-case to custom-method URL segments (e.g. `discoverFromUrl`\n * becomes `/discover-from-url`). Opt-in for one minor; default flips in\n * the next major. An explicit `api.routes[name].path` always wins.\n */\n kebabRoutes?: boolean;\n };\n /** Domain-scoped agent/developer knowledge artifact generation. */\n knowledge?: DomainKnowledgeConfig | false;\n /**\n * Validate that every method in `cli.include` is exposed via the API\n * (so HTTP-based CLI consumers can actually reach them). Default: true.\n * Per-class opt-out via `cli: { skipApiCheck: true }`.\n */\n validateCliApiCoherence?: boolean;\n}\n\nconst VIRTUAL_MODULES = {\n '@happyvertical/smrt-virt-routes': 'smrt:routes',\n '@happyvertical/smrt-virt-client': 'smrt:client',\n '@happyvertical/smrt-virt-mcp': 'smrt:mcp',\n '@happyvertical/smrt-virt-types': 'smrt:types',\n '@happyvertical/smrt-virt-manifest': 'smrt:manifest',\n '@happyvertical/smrt-virt-schema': 'smrt:schema',\n '@happyvertical/smrt-virt-ui': 'smrt:ui',\n '@happyvertical/smrt-virt-cli': 'smrt:cli',\n};\n\nasync function importScanner() {\n return importWorkspaceModule<ScannerModule>({\n packageName: '@happyvertical/smrt-scanner',\n distEntry: 'packages/scanner/dist/index.js',\n sourceEntry: 'packages/scanner/src/index.ts',\n purpose: 'Vite manifest scanning',\n });\n}\n\nexport function smrtPlugin(options: SmrtPluginOptions = {}): Plugin {\n const {\n include = ['src/**/*.ts', 'src/**/*.js'],\n exclude = ['**/*.test.ts', '**/*.spec.ts', '**/node_modules/**'],\n hmr = true,\n watch = true,\n generateTypes = true,\n baseClasses = ['SmrtObject', 'SmartObject'],\n followImports = true, // Default true: needed for multi-package inheritance\n typeDeclarationsPath = 'src/types',\n mode = 'auto',\n svelteKit = {\n enabled: false,\n routesDir: 'src/routes/api',\n objectsDir: 'src/lib/objects',\n configPath: 'src/lib/server',\n configFileName: 'smrt.ts',\n },\n knowledge,\n validateCliApiCoherence = true,\n } = options;\n\n /**\n * Dev-watcher variant of the cli↔api coherence lint: warn instead of throw,\n * so an in-flight decorator edit doesn't kill the dev server. Uses the same\n * remediation text as the strict build-time gate (`validateCliIncludeAgainstApi`)\n * so the dev-server message is as actionable as the build failure.\n */\n function warnCliApiCoherenceViolations(m: SmartObjectManifest): void {\n if (!validateCliApiCoherence) return;\n const violations = findCliApiCoherenceViolations(m);\n if (violations.length === 0) return;\n for (const { className, unreachable } of violations) {\n for (const action of unreachable) {\n console.warn(\n `[smrt] ${className}.${action} is declared in cli.include but is not ` +\n `exposed via the api. Build will fail until this is resolved.\\n` +\n ` Either:\\n` +\n ` - Add '${action}' to api.include, or\\n` +\n ` - Remove '${action}' from cli.include.\\n` +\n ` The CLI invokes methods over HTTP; methods without API routes are unreachable.\\n` +\n ` If this CLI is intentionally invoked in-process (no HTTP), set\\n` +\n ` \\`cli: { skipApiCheck: true }\\` on the @smrt() decorator to acknowledge.`,\n );\n }\n }\n }\n\n let server: ViteDevServer | undefined;\n let manifest: SmartObjectManifest | null = null;\n let pluginMode: 'server' | 'client' = 'server';\n let projectRoot: string = process.cwd();\n let config: any = null; // Store resolved config for closeBundle hook\n let resolvedPluginNames: string[] = [];\n\n /**\n * Write manifest to .smrt/manifest.json for CLI discovery.\n * This ensures `smrt db:migrate`, `smrt db:status`, etc. can find\n * locally-defined SMRT objects in non-library builds (Issue #963).\n */\n async function writeLocalManifest(\n m: SmartObjectManifest,\n rootDir: string,\n ): Promise<void> {\n try {\n const { writeFileSync, mkdirSync } = await import('node:fs');\n const { resolve } = await import('node:path');\n\n const smrtDir = resolve(rootDir, '.smrt');\n mkdirSync(smrtDir, { recursive: true });\n\n const manifestPath = resolve(smrtDir, 'manifest.json');\n writeFileSync(manifestPath, JSON.stringify(m, null, 2), 'utf-8');\n await writeDomainKnowledgeArtifact(\n m,\n rootDir,\n resolve(smrtDir, 'smrt-knowledge.json'),\n manifestPath,\n );\n\n const objectCount = Object.keys(m.objects).length;\n console.log(\n `[smrt] Wrote local manifest with ${objectCount} objects to .smrt/manifest.json`,\n );\n } catch (error) {\n console.error('[smrt] Error writing local manifest:', error);\n }\n }\n\n async function writeDomainKnowledgeArtifact(\n m: SmartObjectManifest,\n rootDir: string,\n outputPath: string,\n manifestPath: string,\n ): Promise<void> {\n const resolvedKnowledge = await resolveKnowledgeConfig(rootDir, m);\n if (resolvedKnowledge.enabled === false) {\n return;\n }\n\n const { mkdirSync, writeFileSync } = await import('node:fs');\n const { dirname } = await import('node:path');\n mkdirSync(dirname(outputPath), { recursive: true });\n const artifact = buildDomainKnowledgeManifest({\n manifest: m,\n rootDir,\n manifestPath,\n config: resolvedKnowledge,\n });\n writeFileSync(\n outputPath,\n JSON.stringify(\n preserveKnowledgeGeneratedAt(outputPath, artifact),\n null,\n 2,\n ),\n 'utf-8',\n );\n }\n\n async function resolveKnowledgeConfig(\n rootDir: string,\n m: SmartObjectManifest,\n ): Promise<DomainKnowledgeConfig> {\n if (knowledge === false) return { enabled: false };\n const packageName = m.packageName ?? readPackageName(rootDir);\n const defaults: DomainKnowledgeConfig = {\n enabled: true,\n api: {\n enabled: false,\n basePath: '/__smrt/knowledge',\n requireAdmin: true,\n includeDocs: false,\n includePrompts: false,\n },\n includeDocs: true,\n includePrompts: true,\n };\n\n let fileKnowledge: DomainKnowledgeConfig = {};\n let packageKnowledge: DomainKnowledgeConfig = {};\n try {\n const previousCwd = process.cwd();\n process.chdir(rootDir);\n try {\n const { loadConfig } = await import('@happyvertical/smrt-config');\n const config = await loadConfig({ cache: false });\n fileKnowledge = (config.knowledge ?? {}) as DomainKnowledgeConfig;\n packageKnowledge = (\n packageName ? (config.packages?.[packageName]?.knowledge ?? {}) : {}\n ) as DomainKnowledgeConfig;\n } finally {\n process.chdir(previousCwd);\n }\n } catch {\n fileKnowledge = {};\n packageKnowledge = {};\n }\n\n return mergeKnowledgeConfig(\n defaults,\n fileKnowledge,\n packageKnowledge,\n knowledge || {},\n );\n }\n\n function mergeKnowledgeConfig(\n ...configs: Array<DomainKnowledgeConfig | undefined | null | false>\n ): DomainKnowledgeConfig {\n const merged: DomainKnowledgeConfig = {};\n for (const next of configs) {\n if (!next) continue;\n const hasApi = Boolean(merged.api || next.api);\n const api = hasApi\n ? { ...(merged.api ?? {}), ...(next.api ?? {}) }\n : undefined;\n Object.assign(merged, next);\n if (api) merged.api = api;\n }\n return merged;\n }\n\n function preserveKnowledgeGeneratedAt(\n outputPath: string,\n nextKnowledge: Record<string, any>,\n ): Record<string, any> {\n if (!existsSync(outputPath)) return nextKnowledge;\n\n try {\n const current = JSON.parse(readFileSync(outputPath, 'utf8'));\n if (\n semanticKnowledgeJson(current) === semanticKnowledgeJson(nextKnowledge)\n ) {\n return {\n ...nextKnowledge,\n generatedAt: current.generatedAt,\n };\n }\n } catch {\n // Replace malformed artifacts.\n }\n\n return nextKnowledge;\n }\n\n function semanticKnowledgeJson(artifact: Record<string, any>): string {\n const { generatedAt: _generatedAt, ...rest } = artifact ?? {};\n return JSON.stringify(sortJson(rest));\n }\n\n function sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n }\n\n function readPackageName(rootDir: string): string | undefined {\n try {\n const pkg = JSON.parse(\n readFileSync(join(rootDir, 'package.json'), 'utf8'),\n );\n return typeof pkg.name === 'string' ? pkg.name : undefined;\n } catch {\n return undefined;\n }\n }\n\n function validateConsumerPluginSetup(\n m: SmartObjectManifest,\n context: 'configResolved' | 'buildStart',\n ): void {\n if (config?.mode === 'test') {\n return;\n }\n\n if (config?.build?.lib) {\n return;\n }\n\n const consumerDependencies = (m.smrtDependencies || []).filter(\n (dependency) => dependency !== '@happyvertical/smrt-core',\n );\n if (consumerDependencies.length === 0) {\n return;\n }\n\n const hasConsumerPlugin = resolvedPluginNames.some(\n (name) => name === 'smrt-consumer',\n );\n if (hasConsumerPlugin) {\n return;\n }\n\n const dependencySummary =\n consumerDependencies.length <= 4\n ? consumerDependencies.join(', ')\n : `${consumerDependencies.slice(0, 4).join(', ')}, +${consumerDependencies.length - 4} more`;\n\n throw new Error(\n `[smrt] Consumer project misconfiguration detected during ${context}: found external SMRT dependencies (${dependencySummary}) but vite.config is missing smrtConsumer(). Add \"import { smrtConsumer } from '@happyvertical/smrt-core/consumer-plugin'\" and register it alongside smrtPlugin() so .smrt/register.js is generated for CLI/runtime class loading.`,\n );\n }\n\n function validateLibraryMinifySetup(\n m: SmartObjectManifest,\n context: 'configResolved' | 'buildStart',\n ): void {\n if (!config?.build?.lib) {\n return;\n }\n\n if (Object.keys(m.objects || {}).length === 0) {\n return;\n }\n\n if (config.build.minify === false) {\n return;\n }\n\n throw new Error(\n `[smrt] Library package misconfiguration detected during ${context}: packages that publish SMRT objects must set Vite build.minify = false. Minification rewrites runtime class names and breaks manifest registration, STI resolution, and collection queries in downstream apps.`,\n );\n }\n\n return {\n name: 'smrt-auto-service',\n\n // Expose options for external access (e.g., test manifest generation)\n api: {\n options: {\n baseClasses,\n followImports,\n include,\n exclude,\n },\n },\n\n async configResolved(resolvedConfig) {\n // Store config for closeBundle hook\n config = resolvedConfig;\n resolvedPluginNames = (resolvedConfig.plugins || []).map(\n (plugin) => plugin?.name || '',\n );\n\n // Store project root for file scanning\n projectRoot = resolvedConfig.root;\n\n // Detect plugin mode based on build configuration\n if (mode === 'auto') {\n const isSSRBuild = resolvedConfig.build?.ssr;\n const isFederationBuild = resolvedConfig.plugins.some((p) =>\n p.name?.includes('federation'),\n );\n const isClientBuild =\n isFederationBuild ||\n (!isSSRBuild && resolvedConfig.build?.target === 'esnext');\n\n pluginMode = isClientBuild ? 'client' : 'server';\n } else {\n pluginMode = mode;\n }\n\n console.log(`[smrt] Running in ${pluginMode} mode`);\n\n // Scan files and generate initial manifest in all modes\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n validateLibraryMinifySetup(manifest, 'configResolved');\n validateConsumerPluginSetup(manifest, 'configResolved');\n if (validateCliApiCoherence) {\n validateCliIncludeAgainstApi(manifest);\n }\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest) {\n await generateSvelteKitRoutes(resolvedConfig.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n resolvedConfig.root,\n manifest,\n ),\n });\n }\n },\n\n async buildStart() {\n // Rescan files on build start in all modes\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n validateLibraryMinifySetup(manifest, 'buildStart');\n validateConsumerPluginSetup(manifest, 'buildStart');\n if (validateCliApiCoherence) {\n validateCliIncludeAgainstApi(manifest);\n }\n }\n },\n\n configureServer(devServer) {\n server = devServer;\n\n // Serve default HTML when no index.html exists\n // Skip for SvelteKit projects (they use src/app.html and handle routing themselves)\n devServer.middlewares.use(async (req, res, next) => {\n // Skip default UI entirely for SvelteKit projects\n if (svelteKit.enabled) {\n return next();\n }\n\n if (req.url === '/' || req.url === '/index.html') {\n try {\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const projectRoot = devServer.config.root;\n const indexPath = join(projectRoot, 'index.html');\n\n // If index.html exists, let Vite handle it\n if (existsSync(indexPath)) {\n return next();\n }\n\n // Otherwise, serve default SMRT UI\n console.log('[smrt] Serving default UI (no index.html found)');\n let html = getDefaultHTML();\n\n // Apply Vite's HTML transformation to process module imports\n html = await devServer.transformIndexHtml('/', html);\n\n res.setHeader('Content-Type', 'text/html');\n res.end(html);\n return;\n } catch (error) {\n console.error('[smrt] Error serving default HTML:', error);\n return next();\n }\n }\n next();\n });\n\n // Set up file watching in all modes when enabled\n if (watch && hmr) {\n // Watch for file changes\n const watcher = devServer.watcher;\n\n // Guard each watcher handler: scanAndGenerateManifest re-throws on a\n // mid-edit scan error, and an unhandled rejection in a watcher callback\n // can crash the dev server. Log and keep the previous manifest (#1378).\n watcher.on('change', async (file) => {\n try {\n if (await shouldRescan(file)) {\n console.log(`[smrt] Rescanning due to change in ${file}`);\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n warnCliApiCoherenceViolations(manifest);\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest && server) {\n await generateSvelteKitRoutes(server.config.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n server.config.root,\n manifest,\n ),\n });\n }\n\n // Invalidate virtual modules\n Object.values(VIRTUAL_MODULES).forEach((id) => {\n const module = server?.moduleGraph.getModuleById(id);\n if (module) {\n server?.reloadModule(module);\n }\n });\n }\n } catch (error) {\n console.error(\n `[smrt] Failed to rescan after change in ${file}:`,\n error,\n );\n }\n });\n\n watcher.on('add', async (file) => {\n try {\n if (await shouldRescan(file)) {\n console.log(`[smrt] Rescanning due to new file ${file}`);\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n warnCliApiCoherenceViolations(manifest);\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest && server) {\n await generateSvelteKitRoutes(server.config.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n server.config.root,\n manifest,\n ),\n });\n }\n }\n } catch (error) {\n console.error(\n `[smrt] Failed to rescan after adding ${file}:`,\n error,\n );\n }\n });\n\n watcher.on('unlink', async (file) => {\n try {\n if (await shouldRescan(file)) {\n console.log(`[smrt] Rescanning due to removed file ${file}`);\n manifest = await scanAndGenerateManifest(projectRoot);\n\n // Write local manifest for CLI discovery (Issue #963)\n if (manifest) {\n await writeLocalManifest(manifest, projectRoot);\n warnCliApiCoherenceViolations(manifest);\n }\n\n // Generate SvelteKit routes if enabled\n if (svelteKit.enabled && manifest && server) {\n await generateSvelteKitRoutes(server.config.root, manifest, {\n enabled: svelteKit.enabled,\n routesDir: svelteKit.routesDir || 'src/routes/api',\n objectsDir: svelteKit.objectsDir || 'src/lib/objects',\n configPath: svelteKit.configPath || 'src/lib/server',\n configFileName: svelteKit.configFileName || 'smrt.ts',\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n knowledge: await resolveKnowledgeConfig(\n server.config.root,\n manifest,\n ),\n });\n }\n }\n } catch (error) {\n console.error(\n `[smrt] Failed to rescan after removing ${file}:`,\n error,\n );\n }\n });\n }\n },\n\n resolveId(id) {\n // Resolve virtual module imports\n if (id in VIRTUAL_MODULES) {\n return `\\0${VIRTUAL_MODULES[id as keyof typeof VIRTUAL_MODULES]}`;\n }\n\n // Resolve virtual index.html for dev UI (only in dev mode)\n if (id === '/index.html' && server) {\n return `\\0smrt:index-html`;\n }\n\n return null;\n },\n\n async load(id) {\n // Load virtual modules (strip the \\0 prefix)\n const cleanId = id.startsWith('\\0') ? id.slice(1) : id;\n\n if (!manifest) {\n manifest = await scanAndGenerateManifest(projectRoot);\n }\n\n switch (cleanId) {\n case 'smrt:routes':\n // Routes module available in all modes\n return await generateRoutesModule(manifest);\n\n case 'smrt:client':\n // Client module available in both modes\n return generateClientModule(manifest, {\n kebabRoutes: svelteKit.kebabRoutes ?? false,\n });\n\n case 'smrt:mcp':\n // MCP module available in all modes\n return await generateMCPModule(manifest);\n\n case 'smrt:types':\n // Types module available in both modes\n return await generateTypesModule(manifest, pluginMode);\n\n case 'smrt:manifest':\n // Manifest module available in both modes\n return generateManifestModule(manifest);\n\n case 'smrt:schema':\n // Schema module available in both modes\n return await generateSchemaModule(manifest);\n\n case 'smrt:ui':\n // UI module for default development interface\n return await loadDefaultUI();\n\n case 'smrt:index-html':\n // Virtual index.html for projects without one\n return await loadDefaultHTML();\n\n case 'smrt:cli':\n // CLI module for command-line interface generation\n return await generateCLIModule(manifest);\n\n default:\n return null;\n }\n },\n\n transformIndexHtml: {\n order: 'pre',\n handler: async (html, _ctx) => {\n // Only provide default HTML if no index.html exists in project\n if (!server) return html;\n\n try {\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const projectRoot = server.config.root;\n const indexPath = join(projectRoot, 'index.html');\n\n // If index.html exists, use it as-is\n if (existsSync(indexPath)) {\n return html;\n }\n\n // Otherwise, provide default SMRT UI\n return await loadDefaultHTML();\n } catch (error) {\n console.error('[smrt] Error checking for index.html:', error);\n return html;\n }\n },\n },\n\n async closeBundle() {\n // Write manifest to disk during library builds\n // This allows published packages to include their manifest\n if (!manifest || !config.build?.lib) {\n return;\n }\n\n try {\n const { writeFileSync, mkdirSync } = await import('node:fs');\n const { resolve, dirname } = await import('node:path');\n\n // Determine output directory\n const outDir =\n config.build?.rollupOptions?.output?.dir ||\n config.build?.outDir ||\n 'dist';\n const manifestPath = resolve(projectRoot, outDir, 'manifest.json');\n const knowledgePath = resolve(\n projectRoot,\n outDir,\n 'smrt-knowledge.json',\n );\n\n // Ensure directory exists\n mkdirSync(dirname(manifestPath), { recursive: true });\n\n // Write manifest file\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), 'utf-8');\n await writeDomainKnowledgeArtifact(\n manifest,\n projectRoot,\n knowledgePath,\n manifestPath,\n );\n\n const objectCount = Object.keys(manifest.objects).length;\n console.log(\n `[smrt] Wrote manifest with ${objectCount} objects to ${manifestPath}`,\n );\n } catch (error) {\n console.error('[smrt] Error writing manifest file:', error);\n }\n },\n };\n\n async function scanAndGenerateManifest(\n rootDir: string,\n ): Promise<SmartObjectManifest> {\n // NOTE: We do NOT use the framework's static manifest here\n // The static manifest JSON that core emits at build time\n // contains framework objects (like 'pleb') which should not be included\n // when scanning user code in consuming applications.\n //\n // smrtPlugin is designed to scan USER code dynamically, not load\n // framework objects. For consuming apps that need framework objects,\n // they should use smrtConsumer plugin instead.\n\n // Always use OXC-based scanner (consolidated in Issue #951)\n try {\n return await scanWithOxc(rootDir);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes('Cannot find package')\n ) {\n console.error(\n '[smrt] @happyvertical/smrt-scanner is required but not installed.',\n );\n console.error(\n '[smrt] Install it: pnpm add @happyvertical/smrt-scanner',\n );\n }\n console.error('[smrt] Error scanning files:', error);\n // Re-throw to fail the build - don't silently continue with empty manifest\n throw error;\n }\n }\n\n /**\n * Scan files using OXC-based scanner (experimental fast path)\n * Uses Rust-based oxc-parser for 2-3x faster parsing\n */\n async function scanWithOxc(rootDir: string): Promise<SmartObjectManifest> {\n const startTime = performance.now();\n\n try {\n // Import the OXC scanner package\n const { OxcScanner, ManifestAdapter } = await importScanner();\n\n console.log(`[smrt] Using experimental OXC scanner for faster builds`);\n\n // Create scanner with options. Always exclude .svelte files as OXC barfs on <style> tags\n const safeExclude = [...(exclude || []), '**/*.svelte'];\n const scanner = new OxcScanner({\n cwd: rootDir,\n include,\n exclude: safeExclude,\n });\n\n // Scan and resolve inheritance\n const { results, resolved } = await scanner.scanAndResolve();\n\n // Check for errors\n if (results.errors.length > 0) {\n console.error(\n `\\n[smrt] ❌ Build failed: ${results.errors.length} error(s) during scanning:\\n`,\n );\n for (const error of results.errors) {\n console.error(\n ` ${error.filePath}:${error.line || '?'}: ${error.message}\\n`,\n );\n }\n throw new Error(\n '[smrt] Build aborted due to scan errors. See above for details.',\n );\n }\n\n // Read package.json for metadata BEFORE creating manifest (Issue #713)\n // This ensures qualified names are generated correctly for namespace isolation\n // packageJson is also needed for agent manifest generation (component discovery)\n let packageName: string | undefined;\n let packageVersion: string | undefined;\n let packageJson: any;\n try {\n const { readFileSync } = await import('node:fs');\n const { join } = await import('node:path');\n const pkgPath = join(rootDir, 'package.json');\n const pkgContent = readFileSync(pkgPath, 'utf-8');\n packageJson = JSON.parse(pkgContent);\n packageName = packageJson.name || undefined;\n packageVersion = packageJson.version || undefined;\n } catch {\n // package.json not found or invalid - continue without packageName\n console.warn(\n '[smrt] Warning: package.json not found. Qualified names will not be generated.',\n );\n }\n\n // Convert to manifest format with packageName for qualified names (Issue #713)\n const adapter = new ManifestAdapter();\n const newManifest = adapter.toManifest(resolved, {\n packageName,\n packageVersion,\n typeAliases: results.typeAliases,\n });\n\n // Add moduleType identifier\n newManifest.moduleType = 'smrt';\n\n // Keep this as a normal module import: dynamic source imports with a\n // `.js` specifier do not reliably resolve through tsx during publish-time\n // workspace builds, even though the compiled dist path exists.\n const smrtDependencies = discoverSmrtPackages({ baseDir: rootDir });\n if (smrtDependencies.length > 0) {\n newManifest.smrtDependencies = smrtDependencies;\n console.log(\n `[smrt] Found ${smrtDependencies.length} SMRT dependencies: ${smrtDependencies.join(', ')}`,\n );\n }\n\n // Run all manifest generation passes (same as TypeScript scanner path)\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const manifestGen = new ManifestGenerator();\n // IMPORTANT: keep this pass order aligned with generateManifest().\n manifestGen.normalizeReportTenantScope(newManifest);\n manifestGen.injectTenantScopedFields(newManifest);\n manifestGen.mergeInheritedFields(newManifest);\n manifestGen.normalizeReportObjects(newManifest);\n manifestGen.generateValidationRules(newManifest);\n manifestGen.generateSchemas(newManifest);\n manifestGen.assertTenantScopedSchemaContract(newManifest);\n // Final pass: Generate agent manifests for Agent subclasses\n // Derives permissions, features, menuItems, and components from code\n manifestGen.generateAgentManifests(newManifest, packageName, packageJson);\n\n const elapsed = performance.now() - startTime;\n\n // Log results\n const objectCount = Object.keys(newManifest.objects).length;\n if (objectCount > 0) {\n const names = Object.keys(newManifest.objects).join(', ');\n console.log(`[smrt] Found ${objectCount} SMRT objects: ${names}`);\n } else {\n console.log('[smrt] No SMRT objects found');\n }\n console.log(`[smrt] OXC scan completed in ${elapsed.toFixed(2)}ms`);\n\n // Generate TypeScript declarations if enabled\n if (generateTypes && server) {\n await generateTypeDeclarationFile(\n newManifest,\n rootDir,\n typeDeclarationsPath,\n );\n }\n\n return newManifest;\n } catch (error) {\n console.error('[smrt] Error in OXC scanner:', error);\n throw error;\n }\n }\n\n async function shouldRescan(file: string): Promise<boolean> {\n // Only rescan in server mode\n if (pluginMode === 'client') {\n return false;\n }\n\n try {\n // Conditionally import minimatch\n const { minimatch } = await import('minimatch');\n\n const isIncluded = include.some((pattern) => minimatch(file, pattern));\n const isExcluded = exclude.some((pattern) => minimatch(file, pattern));\n\n return isIncluded && !isExcluded;\n } catch (error) {\n console.warn('[smrt] Error checking file patterns:', error);\n return false;\n }\n }\n}\n\n/**\n * Generate virtual routes module\n */\nasync function generateRoutesModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const generator = new ManifestGenerator();\n const routes = generator.generateRestEndpoints(manifest);\n\n return `\n// Auto-generated REST routes from SMRT objects\n// This file is generated automatically - do not edit\n\n/**\n * Setup routes on an Express-like app\n *\n * NOTE: This virtual module function is for documentation only.\n * For actual route registration, use:\n * - import { startRestServer } from '@happyvertical/smrt-core'\n * - Or APIGenerator from '@happyvertical/smrt-core/generators'\n *\n * @param app - Express-like app instance\n * @param options - Route configuration options\n * @param options.basePath - Base path for all routes (default: '/api/v1')\n */\nexport function setupRoutes(app, options = {}) {\n const basePath = options.basePath || '/api/v1';\n\n console.warn('[smrt] setupRoutes is a documentation function only.');\n console.warn('[smrt] Use startRestServer() or APIGenerator for actual route registration.');\n console.warn('[smrt] Available endpoints:');\n${routes\n .split('\\\\n')\n .map((line) => ` console.warn(\\` \\${basePath}${line.trim()}\\`);`)\n .join('\\\\n')}\n}\n\nexport { setupRoutes as default };\n`;\n } catch (error) {\n console.warn('[smrt] Error generating routes module:', error);\n return 'export function setupRoutes(app, options = {}) { console.warn(\"Routes generation failed\"); }';\n }\n}\n\n/**\n * Generate virtual client module\n */\nfunction lowerFirst(value: string): string {\n return value ? value[0].toLowerCase() + value.slice(1) : value;\n}\n\nfunction uniqueApiClientEntries(\n objects: Array<[string, SmartObjectManifest['objects'][string]]>,\n): Array<{\n objectName: string;\n obj: SmartObjectManifest['objects'][string];\n clientKey: string;\n}> {\n const usedKeys = new Set<string>();\n\n return objects.map(([objectName, obj]) => {\n let clientKey = obj.collection;\n\n if (usedKeys.has(clientKey)) {\n clientKey = lowerFirst(obj.className);\n }\n\n const baseClientKey = clientKey;\n let suffix = 2;\n while (usedKeys.has(clientKey)) {\n clientKey = `${baseClientKey}${suffix}`;\n suffix += 1;\n }\n\n usedKeys.add(clientKey);\n return { objectName, obj, clientKey };\n });\n}\n\nfunction generateClientModule(\n manifest: SmartObjectManifest,\n options: { kebabRoutes?: boolean } = {},\n): string {\n const objects = uniqueApiClientEntries(Object.entries(manifest.objects));\n\n const clientMethods = objects\n .map(({ obj, clientKey }) => {\n const { collection, methods = {} } = obj;\n\n // Honor api include/exclude + scope/static skip rules for custom methods,\n // so the client only emits proxies for methods that actually have routes\n // emitted by the server. (Custom only — CRUD is left unconditional to\n // preserve the existing client-type contract.)\n const exposedActions = resolveApiActionSet(obj);\n const apiConfig = obj.decoratorConfig?.api;\n const apiRoutes: Record<string, { path?: string }> =\n apiConfig && typeof apiConfig === 'object'\n ? ((apiConfig as { routes?: Record<string, { path?: string }> })\n .routes ?? {})\n : {};\n\n const customMethods = Object.entries(methods).filter(\n ([name, method]) => method.isPublic && exposedActions.has(name),\n );\n\n // Resolve the URL segment for each custom method using the same priority\n // the server does in normalizeCustomRoutePath: explicit api.routes[name].path\n // override wins; else kebab-case when kebabRoutes is enabled; else source casing.\n const segmentFor = (methodName: string): string => {\n const overridePath = apiRoutes[methodName]?.path;\n if (overridePath) {\n const trimmed = overridePath\n .split('/')\n .map((s) => s.trim())\n .filter(Boolean)\n .join('/');\n if (trimmed.length > 0) return trimmed;\n }\n return options.kebabRoutes ? methodNameToKebab(methodName) : methodName;\n };\n\n // Generate custom method implementations.\n // Custom methods are instance methods: POST /{collection}/{id}/{urlSegment}.\n const customMethodImpls = customMethods\n .map(([methodName, _method]) => {\n const urlSegment = segmentFor(methodName);\n return ` ${methodName}: (id, options) => fetch(basePath + '/${collection}/' + id + '/${urlSegment}', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(options || {})\n }).then(r => r.json())`;\n })\n .join(',\\n');\n\n const customMethodsBlock =\n customMethods.length > 0 ? `,\\n${customMethodImpls}` : '';\n\n return `\n ${clientKey}: {\n list: (params) => fetch(basePath + '/${collection}', {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.json()),\n\n get: (id) => fetch(basePath + '/${collection}/' + id, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.json()),\n\n create: (data) => fetch(basePath + '/${collection}', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }).then(r => r.json()),\n\n update: (id, data) => fetch(basePath + '/${collection}/' + id, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data)\n }).then(r => r.json()),\n\n delete: (id) => fetch(basePath + '/${collection}/' + id, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.ok),\n\n search: (query) => fetch(basePath + '/${collection}/search?q=' + encodeURIComponent(query), {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' }\n }).then(r => r.json())${customMethodsBlock}\n }`;\n })\n .join(',');\n\n return `\n// Auto-generated API client from SMRT objects\n// This file is generated automatically - do not edit\n\nexport function createClient(basePath = '/api/v1') {\n return {${clientMethods}\n };\n}\n\nexport { createClient as default };\n`;\n}\n\n/**\n * Generate virtual MCP module\n */\nasync function generateMCPModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const generator = new ManifestGenerator();\n const tools = generator.generateMCPTools(manifest);\n\n return `\n// Auto-generated MCP tools from SMRT objects\n// This file is generated automatically - do not edit\n\nimport { SmrtMCPServer } from '@happyvertical/smrt-core/runtime';\n\nexport const tools = ${tools};\n\nexport function createMCPServer(options = {}) {\n const server = new SmrtMCPServer({\n name: options.name || 'smrt-auto-generated',\n version: options.version || '1.0.0',\n ...options\n });\n\n // Add all generated tools to the server\n for (const tool of tools) {\n server.addTool(tool, async (params) => {\n // Tool execution will be handled by the application\n throw new Error(\\`Tool '\\${tool.name}' handler must be provided by application\\`);\n });\n }\n\n return server;\n}\n\nexport { createMCPServer as default };\n`;\n } catch (error) {\n console.warn('[smrt] Error generating MCP module:', error);\n return `\nimport { SmrtMCPServer } from '@happyvertical/smrt-core/runtime';\nexport const tools = [];\nexport function createMCPServer(options = {}) {\n console.warn(\"MCP generation failed\");\n return new SmrtMCPServer({\n name: options.name || 'smrt-client',\n version: options.version || '1.0.0',\n ...options\n });\n}\n`;\n }\n}\n\n/**\n * Generate client-mode types without server dependencies\n */\nfunction generateClientModeTypes(manifest: SmartObjectManifest): string {\n const typeDefinitions: string[] = [];\n\n // Generate interfaces for each object in the manifest\n for (const [objectName, objectMeta] of Object.entries(manifest.objects)) {\n const fields = objectMeta.fields || {};\n const propertyLines: string[] = [];\n\n for (const [fieldName, fieldDef] of Object.entries(fields)) {\n let type = 'any';\n\n // Map SMRT field types to TypeScript types\n switch (fieldDef.type) {\n case 'text':\n type = 'string';\n break;\n case 'decimal':\n case 'integer':\n type = 'number';\n break;\n case 'boolean':\n type = 'boolean';\n break;\n case 'datetime':\n type = 'string';\n break;\n case 'json':\n type = 'any';\n break;\n case 'foreignKey':\n type = 'string';\n break;\n default:\n type = 'any';\n }\n\n const optional = !fieldDef.required ? '?' : '';\n propertyLines.push(` ${fieldName}${optional}: ${type};`);\n }\n\n // Add common SmrtObject properties\n propertyLines.unshift(\n ' id?: string;',\n ' created_at?: string;',\n ' updated_at?: string;',\n );\n\n const interfaceDef = `export interface ${objectName}Data {\\n${propertyLines.join('\\n')}\\n}`;\n typeDefinitions.push(interfaceDef);\n }\n\n return typeDefinitions.join('\\n\\n');\n}\n\n/**\n * Generate virtual types module\n */\nasync function generateTypesModule(\n manifest: SmartObjectManifest,\n mode: 'server' | 'client' = 'server',\n): Promise<string> {\n let interfaces = '';\n\n try {\n // Only use scanner in server mode to avoid Node.js dependencies in browser builds\n if (mode !== 'client') {\n const { ManifestGenerator } = await importBuildAwareModule<\n typeof import('../scanner/index.js')\n >({\n source: '../scanner/index.ts',\n dist: '../scanner.js',\n });\n const generator = new ManifestGenerator();\n interfaces = generator.generateTypeDefinitions(manifest);\n } else {\n // In client mode, generate basic interfaces directly from manifest\n interfaces = generateClientModeTypes(manifest);\n }\n\n return `\n// Auto-generated TypeScript types from SMRT objects\n// This file is generated automatically - do not edit\n\n${interfaces}\n\nexport interface Request {\n params: Record<string, string>;\n query: Record<string, any>;\n json(): Promise<any>;\n}\n\nexport interface Response {\n json(data: any, init?: { status?: number }): Response;\n status(code: number): Response;\n}\n`;\n } catch (error) {\n console.warn('[smrt] Error generating types module:', error);\n return `\n// Auto-generated TypeScript types from SMRT objects (fallback)\n// This file is generated automatically - do not edit\n\nexport interface Request {\n params: Record<string, string>;\n query: Record<string, any>;\n json(): Promise<any>;\n}\n\nexport interface Response {\n json(data: any, init?: { status?: number }): Response;\n status(code: number): Response;\n}\n`;\n }\n}\n\n/**\n * Generate virtual manifest module\n */\nfunction generateManifestModule(manifest: SmartObjectManifest): string {\n return `\n// Auto-generated manifest from SMRT objects\n// This file is generated automatically - do not edit\n\nexport const manifest = ${JSON.stringify(manifest, null, 2)};\n\nexport { manifest as default };\n`;\n}\n\n/**\n * Generate TypeScript declaration file for virtual modules\n * This eliminates the need for manual type maintenance\n */\nasync function generateTypeDeclarationFile(\n manifest: SmartObjectManifest,\n projectRoot: string,\n typeDeclarationsPath: string,\n): Promise<void> {\n try {\n // Conditionally import path and fs modules\n const [{ join }, { existsSync, mkdirSync, writeFileSync }] =\n await Promise.all([import('node:path'), import('node:fs')]);\n\n const declarationsDir = join(projectRoot, typeDeclarationsPath);\n const declarationsFile = join(declarationsDir, 'virtual-modules.d.ts');\n\n // Create directory if it doesn't exist\n if (!existsSync(declarationsDir)) {\n mkdirSync(declarationsDir, { recursive: true });\n }\n\n // Generate interface definitions for each discovered SMRT object\n const objectInterfaces = Object.entries(manifest.objects)\n .map(([_name, obj]) => {\n const interfaceName = `${obj.className}Data`;\n const fields = Object.entries(obj.fields)\n .map(([fieldName, field]) => {\n const optional = field.required === false ? '?' : '';\n const type = mapTypeScriptType(field.type);\n return ` ${fieldName}${optional}: ${type};`;\n })\n .join('\\n');\n\n return ` export interface ${interfaceName} {\n id?: string;\n${fields}\n createdAt?: string;\n updatedAt?: string;\n }`;\n })\n .join('\\n\\n');\n\n // Generate API client interface for each object\n // Always use plural collection names (standard REST convention).\n // Filter custom methods through resolveApiActionSet so the declared\n // type surface matches what generateClientModule actually emits at\n // runtime — otherwise consumers see methods in autocomplete that are\n // undefined at runtime.\n const apiClientInterface = uniqueApiClientEntries(\n Object.entries(manifest.objects),\n )\n .map(({ obj, clientKey }) => {\n const { className, methods = {} } = obj;\n const interfaceName = `${className}Data`;\n const exposedActions = resolveApiActionSet(obj);\n const customMethods = Object.entries(methods).filter(\n ([name, method]) => method.isPublic && exposedActions.has(name),\n );\n\n // Generate custom method signatures\n // Custom methods are instance methods requiring id as first parameter\n const customMethodSignatures = customMethods\n .map(([methodName, method]) => {\n const params = method.parameters || [];\n const optionsSignature =\n params.length > 0\n ? `, options?: { ${params.map((p) => `${p.name}?: ${mapTypeScriptType(p.type)}`).join('; ')} }`\n : '';\n return ` ${methodName}(id: string${optionsSignature}): Promise<any>;`;\n })\n .join('\\n');\n\n if (customMethods.length > 0) {\n // Object with custom methods: include both CRUD and custom methods\n return ` ${clientKey}: CrudOperations<${interfaceName}> & {\\n${customMethodSignatures}\\n };`;\n } else {\n // Standard CRUD operations only\n return ` ${clientKey}: CrudOperations<${interfaceName}>;`;\n }\n })\n .join('\\n');\n\n // Generate MCP tool interfaces based on discovered methods\n const _mcpTools = Object.entries(manifest.objects).flatMap(([_name, obj]) =>\n Object.entries(obj.methods).map(([methodName, method]) => ({\n name: `${methodName}_${obj.collection}`,\n description: `${method.name} operation on ${obj.collection}`,\n inputSchema: {\n type: 'object',\n properties: Object.fromEntries(\n method.parameters.map((param) => [\n param.name,\n { type: mapJsonSchemaType(param.type) },\n ]),\n ),\n required: method.parameters\n .filter((p) => p.optional !== true)\n .map((p) => p.name),\n },\n })),\n );\n\n const typeDeclarations = `/**\n * Auto-generated TypeScript declarations for SMRT virtual modules\n * Generated from discovered @smrt() decorated classes\n * \n * DO NOT EDIT THIS FILE MANUALLY\n * This file is automatically regenerated when SMRT objects change\n */\n\n// Manifest module - Contains discovered SMRT objects metadata\ndeclare module '@happyvertical/smrt-virt-manifest' {\n export interface SmrtObjectField {\n type: string;\n required?: boolean;\n default?: any;\n }\n\n export interface SmrtObjectMethod {\n name: string;\n parameters: Array<{\n name: string;\n type: string;\n required?: boolean;\n }>;\n returnType: string;\n isAsync: boolean;\n }\n\n export interface SmrtObjectDefinition {\n className: string;\n collection: string;\n fields: Record<string, SmrtObjectField>;\n methods: Record<string, SmrtObjectMethod>;\n decoratorConfig: any;\n }\n\n export interface SmrtManifest {\n version: string;\n timestamp: number;\n objects: Record<string, SmrtObjectDefinition>;\n }\n\n export const manifest: SmrtManifest;\n}\n\n// Routes module - Auto-generated REST route setup\ndeclare module '@happyvertical/smrt-virt-routes' {\n export interface RouteApp {\n get(path: string, handler: (req: any, res: any) => void): void;\n post(path: string, handler: (req: any, res: any) => void): void;\n put(path: string, handler: (req: any, res: any) => void): void;\n delete(path: string, handler: (req: any, res: any) => void): void;\n }\n\n export interface RouteOptions {\n basePath?: string;\n [key: string]: any;\n }\n\n export function setupRoutes(app: RouteApp, options?: RouteOptions): void;\n export default setupRoutes;\n}\n\n// Client module - Auto-generated API client \ndeclare module '@happyvertical/smrt-virt-client' {\n export interface ApiResponse<T = any> {\n id?: string;\n data?: T;\n error?: string;\n message?: string;\n }\n\n export interface CrudOperations<T = any> {\n list(params?: Record<string, any>): Promise<T[]>;\n get(id: string): Promise<T>;\n create(data: Partial<T>): Promise<T>;\n update(id: string, data: Partial<T>): Promise<T>;\n delete(id: string): Promise<boolean>;\n search(query: string): Promise<T[]>;\n }\n\n export interface ApiClient {\n${apiClientInterface}\n }\n\n export function createClient(basePath?: string): ApiClient;\n export default createClient;\n}\n\n// MCP module - Auto-generated Model Context Protocol tools\ndeclare module '@happyvertical/smrt-virt-mcp' {\n import type { SmrtMCPServer, MCPServerOptions } from '@happyvertical/smrt-core/runtime';\n\n export interface McpTool {\n name: string;\n description: string;\n inputSchema: {\n type: string;\n properties: Record<string, any>;\n required?: string[];\n };\n }\n\n export const tools: McpTool[];\n export function createMCPServer(options?: MCPServerOptions): SmrtMCPServer;\n export default createMCPServer;\n}\n\n// Types module - Auto-generated TypeScript interfaces\ndeclare module '@happyvertical/smrt-virt-types' {\n export const types: string;\n\n // Auto-generated interfaces for discovered SMRT objects\n${objectInterfaces}\n\n export default types;\n}\n\n// CLI module - Auto-generated command-line interface\ndeclare module '@happyvertical/smrt-virt-cli' {\n export interface CLIConfig {\n name?: string;\n version?: string;\n description?: string;\n prompt?: boolean;\n colors?: boolean;\n }\n\n export interface CLIContext {\n db?: any;\n ai?: any;\n user?: {\n id: string;\n roles?: string[];\n };\n }\n\n export interface CLICommandMap {\n [objectName: string]: {\n collection: string;\n commands: string[];\n };\n }\n\n export const cliCommands: CLICommandMap;\n\n export function setupCLI(config?: CLIConfig, context?: CLIContext): {\n run: (argv: string[]) => Promise<void>;\n generator: any;\n };\n\n export function getCLIHandler(config?: CLIConfig, context?: CLIContext): (argv: string[]) => Promise<void>;\n\n export default setupCLI;\n}`;\n\n // Write the declarations file\n writeFileSync(declarationsFile, typeDeclarations);\n console.log(\n `[smrt] Generated TypeScript declarations: ${declarationsFile}`,\n );\n } catch (error) {\n console.error('[smrt] Error generating TypeScript declarations:', error);\n }\n}\n\n/**\n * Map SMRT field types to TypeScript types\n */\nfunction mapTypeScriptType(smrtType: string): string {\n const typeMap: Record<string, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n array: 'any[]',\n object: 'Record<string, any>',\n date: 'string',\n Date: 'string',\n };\n return typeMap[smrtType] || 'any';\n}\n\n/**\n * Map TypeScript types to JSON Schema types for MCP tools\n */\nfunction mapJsonSchemaType(tsType: string): string {\n const typeMap: Record<string, string> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n array: 'array',\n object: 'object',\n any: 'string',\n };\n return typeMap[tsType] || 'string';\n}\n\n/**\n * Get default HTML template with inlined JavaScript (inlined for distribution)\n */\nfunction getDefaultHTML(): string {\n const uiScript = getDefaultUIModule();\n\n // Build HTML without template literals to avoid escaping issues\n return (\n '<!DOCTYPE html>\\n' +\n '<html lang=\"en\">\\n' +\n '<head>\\n' +\n ' <meta charset=\"UTF-8\">\\n' +\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\\n' +\n ' <title>SMRT Development UI</title>\\n' +\n ' <style>\\n' +\n ' * { margin: 0; padding: 0; box-sizing: border-box; }\\n' +\n ' body {\\n' +\n ' font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\\n' +\n ' background: #f5f5f5;\\n' +\n ' color: #333;\\n' +\n ' }\\n' +\n ' .container { max-width: 1200px; margin: 0 auto; padding: 20px; }\\n' +\n ' header {\\n' +\n ' background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\\n' +\n ' color: white;\\n' +\n ' padding: 40px 0;\\n' +\n ' margin-bottom: 40px;\\n' +\n ' box-shadow: 0 4px 6px rgba(0,0,0,0.1);\\n' +\n ' }\\n' +\n ' header h1 { font-size: 2.5em; font-weight: 700; margin-bottom: 10px; }\\n' +\n ' .subtitle { font-size: 1.1em; opacity: 0.9; }\\n' +\n ' .stats {\\n' +\n ' display: grid;\\n' +\n ' grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\\n' +\n ' gap: 20px;\\n' +\n ' margin-bottom: 40px;\\n' +\n ' }\\n' +\n ' .stat-card {\\n' +\n ' background: white;\\n' +\n ' padding: 20px;\\n' +\n ' border-radius: 8px;\\n' +\n ' box-shadow: 0 2px 4px rgba(0,0,0,0.1);\\n' +\n ' text-align: center;\\n' +\n ' }\\n' +\n ' .stat-value { font-size: 2.5em; font-weight: 700; color: #667eea; margin-bottom: 5px; }\\n' +\n ' .stat-label { font-size: 0.9em; color: #666; text-transform: uppercase; letter-spacing: 1px; }\\n' +\n ' .collections { display: grid; gap: 30px; }\\n' +\n ' .collection-card {\\n' +\n ' background: white;\\n' +\n ' border-radius: 8px;\\n' +\n ' box-shadow: 0 2px 4px rgba(0,0,0,0.1);\\n' +\n ' overflow: hidden;\\n' +\n ' }\\n' +\n ' .collection-header {\\n' +\n ' background: #667eea;\\n' +\n ' color: white;\\n' +\n ' padding: 15px 20px;\\n' +\n ' display: flex;\\n' +\n ' justify-content: space-between;\\n' +\n ' align-items: center;\\n' +\n ' }\\n' +\n ' .collection-title { font-size: 1.3em; font-weight: 600; }\\n' +\n ' .collection-count {\\n' +\n ' background: rgba(255,255,255,0.2);\\n' +\n ' padding: 5px 15px;\\n' +\n ' border-radius: 20px;\\n' +\n ' font-size: 0.9em;\\n' +\n ' }\\n' +\n ' .collection-body { padding: 20px; }\\n' +\n ' .field-list {\\n' +\n ' display: grid;\\n' +\n ' grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\\n' +\n ' gap: 15px;\\n' +\n ' margin-bottom: 20px;\\n' +\n ' }\\n' +\n ' .field {\\n' +\n ' padding: 10px;\\n' +\n ' background: #f8f9fa;\\n' +\n ' border-radius: 4px;\\n' +\n ' border-left: 3px solid #667eea;\\n' +\n ' }\\n' +\n ' .field-name { font-weight: 600; color: #333; margin-bottom: 3px; }\\n' +\n ' .field-type { font-size: 0.85em; color: #666; }\\n' +\n ' .actions { display: flex; gap: 10px; flex-wrap: wrap; }\\n' +\n ' .btn {\\n' +\n ' padding: 10px 20px;\\n' +\n ' border: none;\\n' +\n ' border-radius: 4px;\\n' +\n ' font-size: 0.9em;\\n' +\n ' cursor: pointer;\\n' +\n ' transition: all 0.2s;\\n' +\n ' text-decoration: none;\\n' +\n ' display: inline-block;\\n' +\n ' }\\n' +\n ' .btn-primary { background: #667eea; color: white; }\\n' +\n ' .btn-primary:hover { background: #5568d3; transform: translateY(-1px); }\\n' +\n ' .btn-secondary { background: #e0e0e0; color: #333; }\\n' +\n ' .btn-secondary:hover { background: #d0d0d0; }\\n' +\n ' .loading { text-align: center; padding: 40px; color: #666; }\\n' +\n ' .error {\\n' +\n ' background: #fee;\\n' +\n ' border: 1px solid #fcc;\\n' +\n ' color: #c33;\\n' +\n ' padding: 15px;\\n' +\n ' border-radius: 4px;\\n' +\n ' margin-bottom: 20px;\\n' +\n ' }\\n' +\n ' .empty-state { text-align: center; padding: 60px 20px; color: #999; }\\n' +\n ' .empty-state svg { width: 100px; height: 100px; margin-bottom: 20px; opacity: 0.3; }\\n' +\n ' </style>\\n' +\n '</head>\\n' +\n '<body>\\n' +\n ' <div id=\"app\">\\n' +\n ' <div class=\"loading\">Loading SMRT UI...</div>\\n' +\n ' </div>\\n' +\n ' <script type=\"module\">\\n' +\n uiScript +\n '\\n </script>\\n' +\n '</body>\\n' +\n '</html>'\n );\n}\n\n/**\n * Get default UI module from template file\n * Loads the JavaScript template\n */\nfunction getDefaultUIModule(): string {\n try {\n // Get current file directory\n const __dirname = dirname(fileURLToPath(import.meta.url));\n\n // Load template file (works in both src and dist)\n const templatePath = join(__dirname, 'templates/default-ui.js');\n\n return readFileSync(templatePath, 'utf-8').trim();\n } catch (error) {\n console.error('[smrt] Error loading UI template:', error);\n // Fallback to minimal UI\n return `\nasync function createUI() {\n const app = document.getElementById('app');\n if (!app) return;\n app.innerHTML = '<div class=\"container\" style=\"padding:40px;text-align:center;\"><h1>🎯 SMRT Development UI</h1><p>Template file not found. UI code could not be loaded.</p></div>';\n}\ncreateUI();\n`;\n }\n}\n\n/**\n * Load default HTML template for projects without index.html\n */\nasync function loadDefaultHTML(): Promise<string> {\n return getDefaultHTML();\n}\n\n/**\n * Load default UI module\n */\nasync function loadDefaultUI(): Promise<string> {\n return getDefaultUIModule();\n}\n\n/**\n * Generate virtual CLI module\n */\nasync function generateCLIModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n // Import CLI types\n const commands: string[] = [];\n const objectImports: string[] = [];\n\n // Generate CLI setup code for each object\n for (const [className, objectDef] of Object.entries(manifest.objects)) {\n const config = objectDef.decoratorConfig;\n const cliConfig = config?.cli;\n\n // Skip if CLI is disabled\n if (cliConfig === false) continue;\n\n // Determine which operations to include\n const excluded =\n (typeof cliConfig === 'object' ? cliConfig.exclude : []) || [];\n const included = typeof cliConfig === 'object' ? cliConfig.include : null;\n\n const shouldInclude = (command: string) => {\n if (included && !included.includes(command)) return false;\n if (excluded.includes(command)) return false;\n return true;\n };\n\n // Collection name (metadata) and the command segment. Commands are keyed\n // by the simple class name (e.g. `document:list`) to match what\n // `CLIGenerator` resolves and the dev `smrt` CLI convention — NOT the\n // plural collection name, which the runtime resolver does not accept.\n const collectionName = objectDef.collection;\n const commandName = (objectDef.className || className).toLowerCase();\n\n // Generate import statement for the object class\n objectImports.push(\n `// Import ${className} and ${className}Collection for CLI operations`,\n );\n\n // Generate command registration\n const availableCommands: string[] = [];\n\n // Standard CRUD commands\n if (shouldInclude('list'))\n availableCommands.push(`'${commandName}:list'`);\n if (shouldInclude('get')) availableCommands.push(`'${commandName}:get'`);\n if (shouldInclude('create'))\n availableCommands.push(`'${commandName}:create'`);\n if (shouldInclude('update'))\n availableCommands.push(`'${commandName}:update'`);\n if (shouldInclude('delete'))\n availableCommands.push(`'${commandName}:delete'`);\n\n // Custom action methods\n for (const [methodName, _method] of Object.entries(objectDef.methods)) {\n // Skip private methods and standard CRUD\n if (\n methodName.startsWith('_') ||\n ['list', 'get', 'create', 'update', 'delete', 'save'].includes(\n methodName,\n )\n )\n continue;\n\n if (shouldInclude(methodName)) {\n availableCommands.push(`'${commandName}:${methodName}'`);\n }\n }\n\n if (availableCommands.length > 0) {\n commands.push(`\n // ${className} commands\n ${className}: {\n collection: '${collectionName}',\n commands: [${availableCommands.join(', ')}]\n }`);\n }\n }\n\n return `\n// Auto-generated CLI module from SMRT objects\n// This file is generated automatically - do not edit\n\nimport { CLIGenerator } from '@happyvertical/smrt-core/generators/cli';\n\n/**\n * @typedef {import('@happyvertical/smrt-core/generators/cli').CLIConfig} CLIConfig\n * @typedef {import('@happyvertical/smrt-core/generators/cli').CLIContext} CLIContext\n */\n\n${objectImports.join('\\n')}\n\n/**\n * Available CLI commands by object\n */\nexport const cliCommands = {${commands.join(',\\n')}\n};\n\n/**\n * Setup CLI with auto-generated commands\n *\n * @param {CLIConfig} [config={}] - CLI configuration\n * @param {CLIContext} [context={}] - CLI context\n * @returns {{run: function(string[]): Promise<void>, generator: *}}\n *\n * @example\n * import { setupCLI } from '@happyvertical/smrt-virt-cli';\n *\n * const cli = setupCLI({\n * name: 'my-app',\n * version: '1.0.0'\n * });\n *\n * cli.run(process.argv);\n */\nexport function setupCLI(config = {}, context = {}) {\n const generator = new CLIGenerator(config, context);\n return {\n run: async (argv) => {\n const handler = generator.generateHandler();\n await handler(argv.slice(2)); // Remove 'node' and script name\n },\n generator\n };\n}\n\n/**\n * Get CLI handler directly\n *\n * @param {CLIConfig} [config={}] - CLI configuration\n * @param {CLIContext} [context={}] - CLI context\n * @returns {function(string[]): Promise<void>}\n */\nexport function getCLIHandler(config = {}, context = {}) {\n const generator = new CLIGenerator(config, context);\n return generator.generateHandler();\n}\n\nexport default setupCLI;\n`;\n } catch (error) {\n console.warn('[smrt] Error generating CLI module:', error);\n return `\n// Error generating CLI module\nexport const cliCommands = {};\nexport function setupCLI() {\n console.warn(\"CLI generation failed\");\n return { run: async () => {} };\n}\nexport function getCLIHandler() {\n return async () => console.warn(\"CLI generation failed\");\n}\nexport default setupCLI;\n`;\n }\n}\n\n/**\n * Generate virtual schema module with JSON manifests\n */\nasync function generateSchemaModule(\n manifest: SmartObjectManifest,\n): Promise<string> {\n try {\n const { SchemaGenerator } = await importBuildAwareModule<\n typeof import('../schema/generator.js')\n >({\n source: '../schema/generator.ts',\n dist: '../schema/generator.js',\n });\n\n const schemaGenerator = new SchemaGenerator();\n const schemas: Record<string, any> = {};\n\n // Generate schemas for all SMRT objects\n for (const [className, objectDef] of Object.entries(manifest.objects)) {\n const schema = schemaGenerator.generateSchema(objectDef);\n schemas[className] = schema;\n }\n\n // Create JSON manifest for schemas\n const schemaManifest = {\n version: '1.0.0',\n timestamp: Date.now(),\n packageName: manifest.packageName || 'unknown',\n schemas: schemas,\n dependencies: Array.from(\n new Set(\n Object.values(schemas).flatMap((s: any) => s.dependencies || []),\n ),\n ),\n };\n\n return `// Auto-generated schema manifest from SMRT objects\n// This file is generated automatically - do not edit\n\n// Schema manifest as JSON for SQL adapters\nexport const schemaManifest = ${JSON.stringify(schemaManifest, null, 2)};\n\n// Schema registry for runtime access\nexport const schemas = schemaManifest.schemas;\n\n// Schema lookup function\nexport function getSchema(className: string) {\n return schemas[className];\n}\n\n// All schemas as array for dependency resolution\nexport const allSchemas = Object.values(schemas);\n\n// Package information\nexport const packageName = schemaManifest.packageName;\nexport const dependencies = schemaManifest.dependencies;\n\nexport default schemaManifest;`;\n } catch (error) {\n console.error('[smrt] Error generating schema module:', error);\n return `// Error generating schema module\nexport const schemaManifest = { schemas: {}, dependencies: [] };\nexport const schemas = {};\nexport function getSchema() { return null; }\nexport const allSchemas = [];\nexport default {};`;\n }\n}\n"],"names":["dirname","config","existsSync","join","projectRoot","readFileSync"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-core",
|
|
3
|
-
"version": "0.36.
|
|
3
|
+
"version": "0.36.5",
|
|
4
4
|
"description": "Core AI agent framework with standardized collections, object-relational mapping, and code generators",
|
|
5
5
|
"author": "HappyVertical",
|
|
6
6
|
"type": "module",
|
|
@@ -139,12 +139,12 @@
|
|
|
139
139
|
}
|
|
140
140
|
},
|
|
141
141
|
"dependencies": {
|
|
142
|
-
"@happyvertical/ai": "^0.74.
|
|
143
|
-
"@happyvertical/files": "^0.74.
|
|
144
|
-
"@happyvertical/json": "^0.74.
|
|
145
|
-
"@happyvertical/logger": "^0.74.
|
|
146
|
-
"@happyvertical/sql": "^0.74.
|
|
147
|
-
"@happyvertical/utils": "^0.74.
|
|
142
|
+
"@happyvertical/ai": "^0.74.10",
|
|
143
|
+
"@happyvertical/files": "^0.74.10",
|
|
144
|
+
"@happyvertical/json": "^0.74.10",
|
|
145
|
+
"@happyvertical/logger": "^0.74.10",
|
|
146
|
+
"@happyvertical/sql": "^0.74.10",
|
|
147
|
+
"@happyvertical/utils": "^0.74.10",
|
|
148
148
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
149
149
|
"cheerio": "^1.1.2",
|
|
150
150
|
"fast-glob": "3.3.3",
|
|
@@ -153,9 +153,9 @@
|
|
|
153
153
|
"tsx": "^4.21.0",
|
|
154
154
|
"typescript": "^5.9.3",
|
|
155
155
|
"yaml": "^2.8.2",
|
|
156
|
-
"@happyvertical/smrt-
|
|
157
|
-
"@happyvertical/smrt-
|
|
158
|
-
"@happyvertical/smrt-types": "0.36.
|
|
156
|
+
"@happyvertical/smrt-config": "0.36.5",
|
|
157
|
+
"@happyvertical/smrt-scanner": "0.36.5",
|
|
158
|
+
"@happyvertical/smrt-types": "0.36.5"
|
|
159
159
|
},
|
|
160
160
|
"peerDependencies": {
|
|
161
161
|
"@huggingface/transformers": ">=3.0.0 <4.0.0",
|