@happyvertical/smrt-core 0.57.20 → 0.57.21
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/agents/build-knowledge.md +68 -0
- package/dist/consumer-plugin/index.d.ts +45 -0
- package/dist/consumer-plugin/index.d.ts.map +1 -1
- package/dist/consumer-plugin/index.js +96 -12
- package/dist/consumer-plugin/index.js.map +1 -1
- package/dist/consumer-plugin.js +2 -2
- package/dist/manifest/static-manifest.js +1 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest.json +1 -1
- package/dist/smrt-knowledge.json +5 -5
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/consumer-plugin/index.ts"],"sourcesContent":["/**\n * Vite plugin for consuming SMRT packages\n * Solves virtual module resolution in downstream projects\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DomainKnowledgeAgentSurface } from '@happyvertical/smrt-types';\nimport type { ConfigEnv, Plugin } from 'vite';\nimport {\n loadVerifiedSmrtGenerationSnapshot,\n type SmrtGenerationSnapshotOptions,\n} from '../generation-snapshot.js';\nimport { buildDomainKnowledgeManifest } from '../knowledge.js';\nimport { resolveFileKnowledgeConfig } from '../knowledge-config.js';\nimport { manifestExportCandidates } from '../manifest/package-manifest-exports.js';\nimport { generateDeclarations } from '../prebuild/index.js';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from '../scanner/types.js';\nimport { MANIFEST_TIMESTAMP } from '../scanner/types.js';\nimport { generateClientModule } from '../vite-plugin/generated-client.js';\nimport type { SmrtPluginApi } from '../vite-plugin/index.js';\nimport {\n clearGeneratedSvelteKitRouteFiles,\n reconcileSvelteKitRouteGitignore,\n type SvelteKitOptions,\n} from '../vite-plugin/sveltekit-generator.js';\nimport { canonicalSvelteKitPath } from '../vite-plugin/sveltekit-path.js';\nimport {\n activeProducerKnowledgeRoutePaths,\n activeSvelteKitRouteParticipants,\n assertNoSvelteKitRouteRootSymlinkConflict,\n assertSvelteKitRouteCoordinationComplete,\n contributeSvelteKitRoutes,\n expectedSvelteKitRouteOwners,\n markSvelteKitRouteParticipant,\n producerKnowledgeRoutePaths,\n revokeSvelteKitRoutes,\n} from '../vite-plugin/sveltekit-route-coordinator.js';\nimport {\n generateWebModule,\n isCollectionManifestClass,\n resolveCollectionItemObject,\n} from '../vite-plugin/web-collections.js';\nimport { publishArtifactFiles } from './artifact-publication.js';\nimport { separateHostedStiCollections } from './hosted-sti-collections.js';\n\nexport {\n loadVerifiedSmrtGenerationSnapshot,\n type SerializeSmrtGenerationSnapshotOptions,\n type SmrtGenerationSnapshotArtifact,\n type SmrtGenerationSnapshotOptions,\n type SmrtGenerationSnapshotView,\n serializeSmrtGenerationSnapshot,\n sha256SmrtGenerationSnapshot,\n} from '../generation-snapshot.js';\n\n/**\n * Loosely-typed view of an object definition as carried by an external\n * package's static manifest. The static manifests are read from JSON at the\n * package boundary, so only the fields this plugin consumes are typed; the\n * index signature preserves any additional fields (e.g. for spreads). This is\n * a structural superset of a manifest `SmartObjectDefinition` plus the\n * consumer-only `hasCollection` marker.\n */\ninterface ConsumerObjectDefinition {\n className?: string;\n packageName?: string;\n packageVersion?: string;\n qualifiedName?: string;\n importPath?: string;\n exportName?: string;\n collectionExportName?: string;\n hasCollection?: boolean;\n collection?: string;\n extends?: string;\n extendsQualified?: string;\n extendsTypeArg?: string;\n /** Configured app dependency whose manifest contributed this object. */\n providerPackageName?: string;\n [key: string]: unknown;\n}\n\nclass AmbiguousProviderGraphError extends Error {}\n\n/**\n * Aggregated manifest assembled by the consumer plugin from one or more\n * external package manifests. Loosely typed because the inputs originate from\n * JSON read at the package boundary.\n */\ninterface ConsumerManifest {\n version: string;\n timestamp: number;\n packageName?: string;\n packageVersion?: string;\n smrtDependencies?: string[];\n objects: Record<string, ConsumerObjectDefinition>;\n}\n\n/**\n * Minimal structural shape of a parsed `package.json` consumed here (name,\n * version, and the export map used to derive import paths). The index\n * signature keeps the remaining fields accessible.\n */\ninterface ConsumerPackageJson {\n name?: string;\n version?: string;\n main?: string;\n exports?: Record<string, unknown>;\n dependencies?: Record<string, unknown>;\n optionalDependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface SelectiveSsrPackage {\n packageJson: ConsumerPackageJson;\n packageRoot: string;\n}\n\nfunction packageNameFromImportPath(importPath: string): string {\n const parts = importPath.split('/');\n return importPath.startsWith('@')\n ? parts.slice(0, 2).join('/')\n : (parts[0] ?? importPath);\n}\n\nfunction findInstalledPackageJson(\n packageName: string,\n searchFrom: string,\n): string | undefined {\n let currentDir = fs.existsSync(searchFrom)\n ? fs.realpathSync(searchFrom)\n : path.resolve(searchFrom);\n while (true) {\n const candidate = path.join(\n currentDir,\n 'node_modules',\n packageName,\n 'package.json',\n );\n if (fs.existsSync(candidate)) return fs.realpathSync(candidate);\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) return undefined;\n currentDir = parentDir;\n }\n}\n\nfunction sameInstalledPackage(\n left: string | undefined,\n right: string | undefined,\n): boolean {\n return Boolean(\n left && right && fs.realpathSync(left) === fs.realpathSync(right),\n );\n}\n\n/**\n * SvelteKit route-hosting options for dependency models. Unlike `packages`,\n * `objects` is an HTTP exposure boundary: every entry must be an exact,\n * provider-qualified manifest key (for example, `@acme/widgets:Widget`).\n */\nexport interface SmrtConsumerSvelteKitOptions\n extends Partial<\n Pick<\n SvelteKitOptions,\n | 'routesDir'\n | 'objectsDir'\n | 'configPath'\n | 'configFileName'\n | 'kebabRoutes'\n | 'changesRoute'\n | 'eventsRoute'\n | 'resourcesRoute'\n >\n > {\n objects: readonly string[];\n}\n\nexport interface SmrtConsumerOptions {\n /** SMRT packages to scan (e.g., ['@my-org/products', '@my-org/content']) */\n packages?: string[];\n /** Generate TypeScript declarations */\n generateTypes?: boolean;\n /** Output directory for generated types */\n typesDir?: string;\n /** Project root path (defaults to the current working directory) */\n projectRoot?: string;\n /**\n * Reuse an immutable, verified aggregated manifest instead of discovering\n * packages or writing `.smrt/manifest.json`. Registration and generated\n * types still consume the verified manifest.\n */\n generationSnapshot?: SmrtGenerationSnapshotOptions;\n /**\n * Consumer SvelteKit integration. `true` retains the historical compatibility\n * mode and does not generate dependency routes. Route hosting requires an\n * explicit, provider-qualified object allowlist.\n */\n svelteKit?: boolean | SmrtConsumerSvelteKitOptions;\n /**\n * Apply kebab-case to generated custom-method URL segments. This must match\n * the producer plugin's `svelteKit.kebabRoutes` setting. When explicit\n * consumer SvelteKit hosting is configured, its `kebabRoutes` value takes\n * precedence, including an explicit `false`.\n */\n kebabRoutes?: boolean;\n /** Use static types only (for federation builds) */\n staticTypes?: boolean;\n /** Disable file scanning */\n disableScanning?: boolean;\n}\n\n// Distinct resolved ids per plugin (#1795). smrtPlugin resolves\n// `@happyvertical/smrt-virt-*` to `\\0smrt:*`; if this consumer plugin also\n// resolved its `@smrt/*` specifiers to `\\0smrt:*` the two virtual modules would\n// share a rollup id, and in standalone/federation builds the consumer's\n// fallback `load` would non-deterministically win and shadow smrtPlugin's real\n// module. Namespacing the consumer ids (`\\0smrt-consumer:*`) keeps them\n// separate so each plugin only ever loads its own module.\nconst VIRTUAL_MODULES = {\n '@smrt/routes': 'smrt-consumer:routes',\n '@smrt/client': 'smrt-consumer:client',\n '@smrt/mcp': 'smrt-consumer:mcp',\n '@smrt/types': 'smrt-consumer:types',\n '@smrt/manifest': 'smrt-consumer:manifest',\n '@smrt/web': 'smrt-consumer:web',\n};\n\nconst CONSUMER_SVELTEKIT_ROUTES_ARTIFACT_VERSION = 1;\nconst CONSUMER_SVELTEKIT_ROUTES_ARTIFACT = 'consumer-sveltekit-routes.json';\n\ninterface ConsumerSvelteKitRoutesArtifact {\n version: number;\n routesDir: string[];\n}\n\nfunction consumerSvelteKitRoutesArtifactPath(projectRoot: string): string {\n return path.join(projectRoot, '.smrt', CONSUMER_SVELTEKIT_ROUTES_ARTIFACT);\n}\n\n/** Persist only project-relative consumer route roots, never an output file list. */\nfunction canonicalConsumerRouteRoot(\n projectRoot: string,\n routesDir: string,\n): string {\n const root = path.resolve(projectRoot);\n const relative = path.relative(root, path.resolve(root, routesDir));\n if (\n !relative ||\n relative === '..' ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new Error(\n `[smrt:consumer] svelteKit.routesDir must be a project-relative subdirectory (received ${JSON.stringify(routesDir)})`,\n );\n }\n return relative.split(path.sep).join('/');\n}\n\nfunction loadConsumerSvelteKitRouteRoots(projectRoot: string): string[] {\n const artifactPath = consumerSvelteKitRoutesArtifactPath(projectRoot);\n if (!fs.existsSync(artifactPath)) return [];\n let parsed: ConsumerSvelteKitRoutesArtifact;\n try {\n parsed = JSON.parse(fs.readFileSync(artifactPath, 'utf-8'));\n } catch {\n throw new Error(\n `[smrt:consumer] Cannot read ${CONSUMER_SVELTEKIT_ROUTES_ARTIFACT}; refusing to leave hosted routes unreconciled`,\n );\n }\n if (\n parsed?.version !== CONSUMER_SVELTEKIT_ROUTES_ARTIFACT_VERSION ||\n !Array.isArray(parsed.routesDir) ||\n parsed.routesDir.some((routesDir) => typeof routesDir !== 'string')\n ) {\n throw new Error(\n `[smrt:consumer] Invalid ${CONSUMER_SVELTEKIT_ROUTES_ARTIFACT}; refusing to leave hosted routes unreconciled`,\n );\n }\n return [...new Set(parsed.routesDir)].map((routesDir) =>\n canonicalConsumerRouteRoot(projectRoot, routesDir),\n );\n}\n\nfunction publishConsumerSvelteKitRouteRoots(\n projectRoot: string,\n routesDir: string[],\n): void {\n const artifactPath = consumerSvelteKitRoutesArtifactPath(projectRoot);\n fs.mkdirSync(path.dirname(artifactPath), { recursive: true });\n publishArtifactFiles([\n {\n path: artifactPath,\n content: JSON.stringify(\n {\n version: CONSUMER_SVELTEKIT_ROUTES_ARTIFACT_VERSION,\n routesDir: [...new Set(routesDir)].sort(),\n } satisfies ConsumerSvelteKitRoutesArtifact,\n null,\n 2,\n ),\n },\n ]);\n}\n\nfunction removeConsumerSvelteKitRouteRoots(projectRoot: string): void {\n const artifactPath = consumerSvelteKitRoutesArtifactPath(projectRoot);\n if (fs.existsSync(artifactPath)) fs.unlinkSync(artifactPath);\n}\n\n/**\n * A hosting-to-hosting move can replace one configured root with another in a\n * fresh lifecycle. Validate every durable former root before the new target\n * journals or clears anything, otherwise a rejected move could alter the\n * prior generated surface before reconciliation notices the conflict.\n */\nasync function assertConsumerSvelteKitFormerRouteRootsAreSafe(\n userConfig: unknown,\n projectRoot: string,\n routesDir: readonly string[],\n env?: ConfigEnv,\n): Promise<void> {\n if (routesDir.length === 0) return;\n const activeParticipants = await activeSvelteKitRouteParticipants(\n userConfig,\n projectRoot,\n env,\n );\n const activeRoots = activeParticipants.map(\n (participant) => participant.routesDir,\n );\n for (const priorRoutesDir of routesDir) {\n assertNoSvelteKitRouteRootSymlinkConflict(\n canonicalSvelteKitPath(path.resolve(projectRoot, priorRoutesDir)),\n activeRoots,\n );\n }\n}\n\nasync function reconcileConsumerSvelteKitRouteRoots(\n lifecycle: object,\n userConfig: unknown,\n projectRoot: string,\n routesDir: string[],\n afterReconciled: () => void,\n env?: ConfigEnv,\n): Promise<void> {\n const remaining = new Set(routesDir);\n const reconcileOne = (routesDir: string) => {\n remaining.delete(routesDir);\n if (remaining.size === 0) afterReconciled();\n };\n\n if (remaining.size === 0) {\n afterReconciled();\n return;\n }\n\n for (const routesDir of [...remaining]) {\n const routeRoot = canonicalSvelteKitPath(\n path.resolve(projectRoot, routesDir),\n );\n const activeParticipants = await activeSvelteKitRouteParticipants(\n userConfig,\n projectRoot,\n env,\n );\n // The durable consumer inventory names roots, not individual handlers.\n // Check before every reconciliation branch, including an active parent\n // consumer that would otherwise compact a nested former root without a\n // sweep. A child symlink into a foreign active root makes that ownership\n // ambiguous, so retaining the inventory makes retry safe.\n assertNoSvelteKitRouteRootSymlinkConflict(\n routeRoot,\n activeParticipants.map((participant) => participant.routesDir),\n );\n const containingConsumer = activeParticipants.find(\n (participant) =>\n participant.owner === 'consumer' &&\n (routeRoot === participant.routesDir ||\n routeRoot.startsWith(`${participant.routesDir}${path.sep}`)),\n );\n // A current parent consumer root has already swept and regenerated this\n // former child root. Sweeping it again would remove the newly selected\n // handler before SvelteKit inventories it.\n if (containingConsumer) {\n reconcileOne(routesDir);\n continue;\n }\n const containingProducer = activeParticipants.find(\n (participant) =>\n participant.owner === 'producer' &&\n (routeRoot === participant.routesDir ||\n routeRoot.startsWith(`${participant.routesDir}${path.sep}`)),\n );\n if (containingProducer) {\n await revokeSvelteKitRoutes(\n lifecycle,\n await expectedSvelteKitRouteOwners(\n userConfig,\n containingProducer.projectRoot,\n containingProducer.routesDir,\n env,\n ),\n containingProducer.projectRoot,\n containingProducer.routesDir,\n () => reconcileOne(routesDir),\n );\n continue;\n }\n const owners = await expectedSvelteKitRouteOwners(\n userConfig,\n projectRoot,\n routesDir,\n env,\n );\n if (owners.includes('producer')) {\n await revokeSvelteKitRoutes(\n lifecycle,\n owners,\n projectRoot,\n routesDir,\n () => reconcileOne(routesDir),\n );\n continue;\n }\n clearGeneratedSvelteKitRouteFiles(\n routeRoot,\n producerKnowledgeRoutePaths(lifecycle),\n new Set(\n activeParticipants\n .map((participant) => participant.routesDir)\n .filter((activeRoot) => activeRoot !== routeRoot),\n ),\n );\n reconcileSvelteKitRouteGitignore(projectRoot, routesDir);\n reconcileOne(routesDir);\n }\n}\n\nfunction consumerRouteOptions(\n value: SmrtConsumerOptions['svelteKit'],\n): SmrtConsumerSvelteKitOptions | undefined {\n if (!value || value === true) return undefined;\n if (!Array.isArray(value.objects) || value.objects.length === 0) {\n throw new Error(\n '[smrt:consumer] svelteKit.objects must list at least one provider-qualified object reference',\n );\n }\n for (const objectRef of value.objects) {\n if (typeof objectRef !== 'string' || !objectRef.includes(':')) {\n throw new Error(\n `[smrt:consumer] svelteKit.objects entries must be provider-qualified (received ${JSON.stringify(objectRef)})`,\n );\n }\n }\n return value;\n}\n\nfunction consumerUtilityOption<T extends { enabled?: boolean }>(\n value: T | undefined,\n): T | { enabled: false } {\n return value?.enabled === true ? value : { enabled: false };\n}\n\nfunction consumerObjectRef(\n manifestKey: string,\n objectDef: ConsumerObjectDefinition,\n): string | undefined {\n if (manifestKey.includes(':')) return manifestKey;\n if (objectDef.qualifiedName?.includes(':')) return objectDef.qualifiedName;\n if (objectDef.packageName && objectDef.className) {\n return `${objectDef.packageName}:${objectDef.className}`;\n }\n return undefined;\n}\n\n/**\n * Select exactly the dependency objects that a consumer explicitly hosts.\n * Validation completes before the generator clears its managed files, so an\n * invalid deployment cannot erase a previously generated route surface.\n */\nfunction selectConsumerRouteManifest(\n manifest: ConsumerManifest,\n options: SmrtConsumerSvelteKitOptions,\n): SmartObjectManifest {\n const entriesByRef = new Map<string, [string, ConsumerObjectDefinition]>();\n for (const [manifestKey, objectDef] of Object.entries(manifest.objects)) {\n const objectRef = consumerObjectRef(manifestKey, objectDef);\n if (objectRef) entriesByRef.set(objectRef, [manifestKey, objectDef]);\n }\n\n const selected = new Set<string>();\n const objects: Record<string, ConsumerObjectDefinition> = {};\n for (const objectRef of options.objects) {\n const entry = entriesByRef.get(objectRef);\n if (!entry) {\n throw new Error(\n `[smrt:consumer] svelteKit.objects references unknown dependency object ${JSON.stringify(objectRef)}`,\n );\n }\n if (selected.has(objectRef)) {\n throw new Error(\n `[smrt:consumer] svelteKit.objects contains duplicate object ${JSON.stringify(objectRef)}`,\n );\n }\n selected.add(objectRef);\n const [, objectDef] = entry;\n objects[objectRef] = { ...objectDef, qualifiedName: objectRef };\n }\n\n const sourceManifest = manifest as unknown as SmartObjectManifest;\n const collectionBySlot = new Map<\n string,\n { ref: string; className: string }\n >();\n // Use the generator's canonical ancestry resolver so a collection subclass\n // inherits the selected item's identity through any number of ancestors.\n for (const [manifestKey, objectDef] of Object.entries(manifest.objects)) {\n const candidate = objectDef as unknown as SmartObjectDefinition;\n if (!isCollectionManifestClass(sourceManifest, candidate)) continue;\n const item = resolveCollectionItemObject(sourceManifest, candidate);\n const itemEntry = item\n ? Object.entries(manifest.objects).find(\n ([, value]) => (value as unknown) === item,\n )\n : undefined;\n const itemRef = itemEntry\n ? consumerObjectRef(itemEntry[0], itemEntry[1])\n : undefined;\n if (!itemRef || !selected.has(itemRef)) continue;\n const collectionRef = consumerObjectRef(manifestKey, objectDef);\n if (!collectionRef) continue;\n // A collection class that inherits another's item type (`MaterialCollection\n // extends ProductCollection`, whose `SmrtCollection<Product>` generic is\n // authoritative) resolves to the SAME item and collection, so hosting both\n // would write the same custom-action routes twice (#3749). The class named\n // for the item stands for it, else the first in qualified order.\n const slot = `${itemRef}\\0${candidate.collection}`;\n const rival = collectionBySlot.get(slot);\n if (rival) {\n const conventional = `${item?.className}Collection`;\n if (\n candidate.className !== conventional ||\n rival.className === conventional\n ) {\n continue;\n }\n delete objects[rival.ref];\n }\n collectionBySlot.set(slot, {\n ref: collectionRef,\n className: candidate.className,\n });\n objects[collectionRef] = { ...objectDef, qualifiedName: collectionRef };\n }\n\n return {\n ...manifest,\n // The generated route config imports this full registration entry point so\n // SSR retains every consumer provider, while only `objects` reach routing.\n // `smrtDependencies` is optional in verified snapshots, so derive this\n // generator signal from the immutable full manifest rather than treating\n // absent metadata as an empty provider inventory.\n smrtDependencies: [\n ...new Set([\n ...(manifest.smrtDependencies ?? []),\n ...Object.values(manifest.objects)\n .map((objectDef) => objectDef.packageName)\n .filter(\n (packageName): packageName is string =>\n typeof packageName === 'string' &&\n packageName !== manifest.packageName,\n ),\n ]),\n ].sort(),\n objects,\n } as unknown as SmartObjectManifest;\n}\n\n/**\n * Consumer plugin for projects that use SMRT packages\n */\nexport function smrtConsumer(options: SmrtConsumerOptions = {}): Plugin {\n const {\n packages = [],\n generateTypes = true,\n typesDir = 'src/types/smrt-generated',\n projectRoot = process.cwd(),\n generationSnapshot,\n disableScanning = false,\n kebabRoutes = false,\n } = options;\n const consumerSvelteKit = consumerRouteOptions(options.svelteKit);\n // Hosted routes, the generated client, and web tool definitions must expose\n // the same custom-action URLs. Nested consumer SvelteKit hosting owns this\n // policy when present, including an explicit false override.\n const effectiveKebabRoutes = consumerSvelteKit?.kebabRoutes ?? kebabRoutes;\n\n let smrtPackages: string[] = [];\n let typeManifest: ConsumerManifest | null = null;\n let typesGenerated = false;\n let producerApi: SmrtPluginApi | undefined;\n let routeLifecycleConfig: object | undefined;\n let isBuild = false;\n let selectiveSsrPackages = new Map<string, SelectiveSsrPackage>();\n\n function loadGenerationSnapshot(): ConsumerManifest {\n if (!generationSnapshot) {\n throw new Error('[smrt:consumer] Generation snapshot is not configured');\n }\n return withHostedStiCollections(\n loadVerifiedSmrtGenerationSnapshot<ConsumerManifest>(\n generationSnapshot,\n projectRoot,\n 'dependencies',\n ),\n );\n }\n\n /**\n * Hosted STI subclasses get their own route collection (#3749), in every\n * manifest view the plugin derives, so routes, the generated client, the\n * `@smrt/web` definitions and the registration agree on the endpoint.\n */\n function withHostedStiCollections(manifest: ConsumerManifest) {\n return consumerSvelteKit\n ? separateHostedStiCollections(\n manifest,\n consumerSvelteKit.objects,\n (key, def) =>\n consumerObjectRef(key, def as unknown as ConsumerObjectDefinition),\n )\n : manifest;\n }\n\n async function aggregateHosted(\n ...args: Parameters<typeof aggregateTypeManifests>\n ): Promise<ConsumerManifest> {\n return withHostedStiCollections(await aggregateTypeManifests(...args));\n }\n\n /**\n * Resolve the packages to aggregate, and whether that list was asserted by\n * the consumer's config. An explicit list fails closed when a package\n * yields no manifest; a heuristically discovered one only warns.\n */\n async function resolveConsumerPackages(): Promise<{\n names: string[];\n explicit: boolean;\n }> {\n if (packages.length === 0 && !disableScanning) {\n return {\n names: await discoverSmrtPackages(projectRoot),\n explicit: false,\n };\n }\n return { names: packages, explicit: packages.length > 0 };\n }\n\n /**\n * Keep consumed providers and their SMRT runtime graph in Node's installed\n * package context during SSR. Native-backed dependencies (such as sharp)\n * resolve relative to that context, and keeping core/tenancy alongside the\n * provider prevents the server bundle from creating a second registry or\n * AsyncLocalStorage instance.\n */\n function resolveConsumerSsrExternalPackages(\n providerPackages: readonly string[],\n ): {\n external: string[];\n selective: Map<string, SelectiveSsrPackage>;\n } {\n const needsViteCompilation = (value: unknown): boolean => {\n if (typeof value === 'string') {\n return value.endsWith('.svelte') || value.endsWith('.css');\n }\n if (!value || typeof value !== 'object') return false;\n return Object.entries(value).some(\n ([condition, target]) =>\n condition === 'svelte' || needsViteCompilation(target),\n );\n };\n const external = new Set<string>();\n const selective = new Map<string, SelectiveSsrPackage>();\n const visited = new Set<string>();\n const pending = providerPackages.map((packageName) => ({\n packageName,\n searchFrom: projectRoot,\n }));\n while (pending.length > 0) {\n const candidate = pending.pop();\n if (!candidate) continue;\n const { packageName, searchFrom } = candidate;\n\n const packageJsonPath = findInstalledPackageJson(packageName, searchFrom);\n const visitKey = packageJsonPath ?? `${searchFrom}\\0${packageName}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n let packageJson: ConsumerPackageJson | undefined;\n if (packageJsonPath) {\n try {\n packageJson = JSON.parse(\n fs.readFileSync(packageJsonPath, 'utf8'),\n ) as ConsumerPackageJson;\n } catch {\n // Manifest loading reports an unavailable declared provider with the\n // actionable package context. Keep the root external here so Vite\n // does not inline a partial substitute while reporting that error.\n }\n }\n\n const needsSvelteCompilation =\n typeof packageJson?.svelte === 'string' ||\n needsViteCompilation(packageJson?.exports);\n const projectPackageJson = findInstalledPackageJson(\n packageName,\n projectRoot,\n );\n const isAppResolvable = sameInstalledPackage(\n packageJsonPath,\n projectPackageJson,\n );\n\n // The preset owns app-runtime's finer split: its root and native runtime\n // stay external while ./sveltekit remains bundled with the app's Kit.\n // Component-bearing packages need an export-level boundary: their server\n // entries stay external while Svelte/CSS entries remain in Vite's graph.\n // A nested-only dependency cannot be emitted as a bare external import\n // because Node would resolve it from the app root, where pnpm has no link.\n if (\n packageName !== '@happyvertical/smrt-app-runtime' &&\n isAppResolvable\n ) {\n if (needsSvelteCompilation && packageJson) {\n selective.set(packageName, {\n packageJson,\n packageRoot: path.dirname(packageJsonPath as string),\n });\n } else {\n external.add(packageName);\n }\n }\n\n if (!packageJsonPath || !packageJson) continue;\n for (const dependencies of [\n packageJson.dependencies,\n packageJson.optionalDependencies,\n packageJson.peerDependencies,\n ]) {\n for (const dependency of Object.keys(dependencies ?? {})) {\n if (dependency.startsWith('@happyvertical/smrt-')) {\n pending.push({\n packageName: dependency,\n searchFrom: path.dirname(packageJsonPath),\n });\n }\n }\n }\n }\n return { external: [...external].sort(), selective };\n }\n\n function matchingExportTarget(\n exports: unknown,\n exportKey: string,\n ): { target: unknown; wildcard?: string } | undefined {\n if (!exports) return undefined;\n if (typeof exports === 'string') {\n return exportKey === '.' ? { target: exports } : undefined;\n }\n if (typeof exports !== 'object') return undefined;\n const exportMap = exports as Record<string, unknown>;\n if (exportKey in exportMap) return { target: exportMap[exportKey] };\n if (\n exportKey === '.' &&\n !Object.keys(exportMap).some((key) => key.startsWith('.'))\n ) {\n return { target: exportMap };\n }\n for (const [pattern, target] of Object.entries(exportMap)) {\n const wildcardIndex = pattern.indexOf('*');\n if (wildcardIndex < 0) continue;\n const prefix = pattern.slice(0, wildcardIndex);\n const suffix = pattern.slice(wildcardIndex + 1);\n if (exportKey.startsWith(prefix) && exportKey.endsWith(suffix)) {\n return {\n target,\n wildcard: exportKey.slice(\n prefix.length,\n exportKey.length - suffix.length,\n ),\n };\n }\n }\n }\n\n function svelteConditionTargets(value: unknown): string[] {\n if (!value || typeof value !== 'object') return [];\n return Object.entries(value).flatMap(([condition, target]) => {\n if (condition === 'svelte') {\n if (typeof target === 'string') return [target];\n return svelteConditionTargets(target);\n }\n return svelteConditionTargets(target);\n });\n }\n\n function resolvesToSvelteCondition(\n packageName: string,\n packageJson: ConsumerPackageJson,\n packageRoot: string,\n id: string,\n resolvedId: string | undefined,\n ): boolean {\n if (!resolvedId) return false;\n const exportKey =\n id === packageName ? '.' : `./${id.slice(packageName.length + 1)}`;\n const matched = matchingExportTarget(packageJson.exports, exportKey);\n const targets = matched ? svelteConditionTargets(matched.target) : [];\n if (exportKey === '.' && typeof packageJson.svelte === 'string') {\n targets.push(packageJson.svelte);\n }\n const normalizedResolved = resolvedId.split('?')[0];\n const canonical = (candidate: string): string =>\n fs.existsSync(candidate)\n ? fs.realpathSync(candidate)\n : path.resolve(candidate);\n return targets.some((target) => {\n const substituted = matched?.wildcard\n ? target.replaceAll('*', matched.wildcard)\n : target;\n return (\n canonical(path.resolve(packageRoot, substituted)) ===\n canonical(normalizedResolved)\n );\n });\n }\n\n async function generateConfigTypes(\n manifest?: ConsumerManifest,\n ): Promise<void> {\n if (!generateTypes || typesGenerated) return;\n\n if (manifest) {\n typeManifest = manifest;\n } else if (generationSnapshot) {\n typeManifest = loadGenerationSnapshot();\n } else {\n const resolved = await resolveConsumerPackages();\n typeManifest = await aggregateHosted(resolved.names, projectRoot, {\n explicit: resolved.explicit,\n });\n }\n await generateProjectTypes(typeManifest, typesDir, projectRoot);\n typesGenerated = true;\n }\n\n const plugin: Plugin = {\n name: 'smrt-consumer',\n\n // SvelteKit inventories routes in its config hook. Run before it so a\n // clean consumer build sees the explicit dependency routes on its first\n // invocation, even when sveltekit() appears first in vite.config.\n enforce: 'pre',\n\n config: {\n order: 'pre',\n async handler(userConfig, env) {\n const routeLifecycle = env ?? userConfig;\n routeLifecycleConfig = routeLifecycle;\n const consumerPackages = await resolveConsumerPackages();\n isBuild = env?.command === 'build';\n const ssrResolution = resolveConsumerSsrExternalPackages(\n consumerPackages.names,\n );\n selectiveSsrPackages = ssrResolution.selective;\n const previousConsumerRouteRoots =\n loadConsumerSvelteKitRouteRoots(projectRoot);\n if (consumerSvelteKit) {\n await assertConsumerSvelteKitFormerRouteRootsAreSafe(\n userConfig,\n projectRoot,\n previousConsumerRouteRoots,\n env,\n );\n const routeManifest = generationSnapshot\n ? loadGenerationSnapshot()\n : await aggregateHosted(consumerPackages.names, projectRoot, {\n explicit: consumerPackages.explicit,\n });\n const hostedManifest = selectConsumerRouteManifest(\n routeManifest,\n consumerSvelteKit,\n );\n const routesDir = canonicalConsumerRouteRoot(\n projectRoot,\n consumerSvelteKit.routesDir ?? 'src/routes/api',\n );\n const reservedRoutePaths = await activeProducerKnowledgeRoutePaths(\n userConfig,\n projectRoot,\n env,\n );\n const routeOptions = {\n enabled: true,\n routesDir,\n // Must equal the producer's, or the shared routesDir is refused.\n objectsDir: consumerSvelteKit.objectsDir ?? 'src/lib/objects',\n configPath: consumerSvelteKit.configPath ?? 'src/lib/server',\n configFileName: consumerSvelteKit.configFileName ?? 'smrt.ts',\n kebabRoutes: effectiveKebabRoutes,\n // These span a model set rather than one selected object, so new\n // consumer hosting starts fail-closed. Callers can opt in with the\n // generator's established option shapes.\n changesRoute: consumerUtilityOption(consumerSvelteKit.changesRoute),\n eventsRoute: consumerUtilityOption(consumerSvelteKit.eventsRoute),\n resourcesRoute: consumerUtilityOption(\n consumerSvelteKit.resourcesRoute,\n ),\n rejectRouteCollisions: true,\n };\n let ownershipJournaled = false;\n let reconciliationScheduled = false;\n await contributeSvelteKitRoutes(\n routeLifecycle,\n await expectedSvelteKitRouteOwners(\n userConfig,\n projectRoot,\n routeOptions.routesDir,\n env,\n ),\n projectRoot,\n {\n owner: 'consumer',\n routeManifest: hostedManifest,\n semanticManifest: routeManifest as unknown as SmartObjectManifest,\n options: routeOptions,\n reservedRoutePaths,\n beforeCleanup: async () => {\n // Route selection and collision checks have succeeded, but no\n // generated output has changed. SvelteKit type checking still\n // runs after this config hook and needs these declarations.\n await generateConfigTypes(routeManifest);\n // The generated TS registration imports this runtime module.\n // SvelteKit sync must resolve it before Vite buildStart runs.\n await generateRegistrationFile(routeManifest, projectRoot);\n if (ownershipJournaled) return;\n ownershipJournaled = true;\n // Preflight has succeeded but no generated output has changed.\n // Keep both roots until old-root reconciliation commits.\n publishConsumerSvelteKitRouteRoots(projectRoot, [\n ...previousConsumerRouteRoots,\n routesDir,\n ]);\n },\n afterGenerate: async () => {\n if (reconciliationScheduled) return;\n reconciliationScheduled = true;\n const priorRoots = previousConsumerRouteRoots.filter(\n (previousRoot) => previousRoot !== routesDir,\n );\n await reconcileConsumerSvelteKitRouteRoots(\n routeLifecycle,\n userConfig,\n projectRoot,\n priorRoots,\n () =>\n publishConsumerSvelteKitRouteRoots(projectRoot, [\n routesDir,\n ]),\n env,\n );\n },\n },\n );\n } else {\n // Legacy/non-hosting SvelteKit consumers have no route preflight,\n // but still need physical virtual-module declarations before their\n // SvelteKit typecheck reaches Vite's later buildStart lifecycle.\n await generateConfigTypes();\n if (options.svelteKit && typeManifest) {\n await generateRegistrationFile(typeManifest, projectRoot);\n }\n if (previousConsumerRouteRoots.length > 0) {\n await reconcileConsumerSvelteKitRouteRoots(\n routeLifecycle,\n userConfig,\n projectRoot,\n previousConsumerRouteRoots,\n () => removeConsumerSvelteKitRouteRoots(projectRoot),\n env,\n );\n }\n }\n return {\n // This applies only to SSR. Client and Svelte-component builds still\n // compile provider exports normally, while Node keeps provider JS and\n // every shared SMRT runtime dependency in one pnpm package context.\n ssr: {\n external: ssrResolution.external,\n noExternal: [...selectiveSsrPackages.keys()].sort(),\n },\n build: {\n rollupOptions: {\n // Runtime registration evaluates provider entry points so their\n // exact constructors can be registered. Leave optional native\n // provider binaries to Node instead of parsing them as JavaScript.\n external: [/\\.node$/],\n },\n },\n };\n },\n },\n\n configResolved(resolvedConfig) {\n if (consumerSvelteKit && routeLifecycleConfig) {\n assertSvelteKitRouteCoordinationComplete(routeLifecycleConfig);\n }\n producerApi = (resolvedConfig.plugins ?? []).find(\n (plugin) => plugin?.name === 'smrt-auto-service',\n )?.api as SmrtPluginApi | undefined;\n },\n\n async buildStart() {\n console.log('[smrt:consumer] Initializing SMRT consumer plugin');\n\n if (generationSnapshot) {\n typeManifest = loadGenerationSnapshot();\n console.log(\n `[smrt:consumer] Reusing verified generation snapshot (${generationSnapshot.provenance})`,\n );\n await generateRegistrationFile(typeManifest, projectRoot);\n if (generateTypes && !typesGenerated) {\n await generateProjectTypes(typeManifest, typesDir, projectRoot);\n typesGenerated = true;\n }\n return;\n }\n\n // Discover SMRT packages if not explicitly specified\n const resolvedPackages = await resolveConsumerPackages();\n smrtPackages = resolvedPackages.names;\n\n if (smrtPackages.length > 0) {\n console.log(\n `[smrt:consumer] Found SMRT packages: ${smrtPackages.join(', ')}`,\n );\n\n // Aggregate type manifests from discovered packages\n typeManifest = await aggregateHosted(smrtPackages, projectRoot, {\n explicit: resolvedPackages.explicit,\n });\n // Wait before reading .smrt/manifest.json: a producer's parallel\n // buildStart writes its current local manifest after scanning. Reading\n // first could merge an older local manifest with a newer surface.\n const agentSurface = producerApi\n ? await producerApi.resolveKnowledgeAgentSurface()\n : undefined;\n\n // Save aggregated manifest for CLI discovery\n await saveAggregatedManifest(\n typeManifest,\n projectRoot,\n producerApi?.resolveKnowledgeConfig,\n agentSurface,\n );\n\n // Generate registration file for CLI class loading\n await generateRegistrationFile(typeManifest, projectRoot);\n\n // Generate types if requested\n if (generateTypes && !typesGenerated) {\n await generateProjectTypes(typeManifest, typesDir, projectRoot);\n typesGenerated = true;\n }\n } else {\n console.log('[smrt:consumer] No SMRT packages found');\n typeManifest = {\n version: '1.0.0',\n timestamp: MANIFEST_TIMESTAMP,\n objects: {},\n };\n }\n },\n\n async resolveId(id, importer, resolveOptions) {\n if (isBuild && resolveOptions.ssr) {\n for (const [packageName, selectivePackage] of selectiveSsrPackages) {\n if (id !== packageName && !id.startsWith(`${packageName}/`)) {\n continue;\n }\n const resolved = await this.resolve(id, importer, {\n ...resolveOptions,\n skipSelf: true,\n });\n const compile =\n resolved?.id.endsWith('.svelte') || resolved?.id.endsWith('.css');\n const compileSvelteBarrel = resolvesToSvelteCondition(\n packageName,\n selectivePackage.packageJson,\n selectivePackage.packageRoot,\n id,\n resolved?.id,\n );\n if (!compile && !compileSvelteBarrel) return { id, external: true };\n break;\n }\n }\n // Resolve virtual modules to generated type declarations\n if (id in VIRTUAL_MODULES) {\n // Generated declarations are ambient TypeScript declarations, not\n // executable JavaScript. Vite must always load the consumer runtime\n // module after default type generation writes them.\n if (id !== '@smrt/types') {\n return `\\0${VIRTUAL_MODULES[id as keyof typeof VIRTUAL_MODULES]}`;\n }\n\n const typeFileName = getTypeFileName(id);\n const typePath = path.join(projectRoot, typesDir, typeFileName);\n\n // If types file exists, resolve to it\n if (fs.existsSync(typePath)) {\n return typePath;\n }\n\n // Otherwise use virtual module ID for runtime resolution\n return `\\0${VIRTUAL_MODULES[id as keyof typeof VIRTUAL_MODULES]}`;\n }\n return null;\n },\n\n async load(id) {\n // Handle virtual modules if types aren't available\n const cleanId = id.startsWith('\\0') ? id.slice(1) : id;\n\n if (!typeManifest) {\n typeManifest = generationSnapshot\n ? loadGenerationSnapshot()\n : {\n version: '1.0.0',\n timestamp: MANIFEST_TIMESTAMP,\n objects: {},\n };\n }\n\n switch (cleanId) {\n case 'smrt-consumer:routes':\n return generateFallbackRoutesModule();\n\n case 'smrt-consumer:client':\n return generateFallbackClientModule(typeManifest, {\n kebabRoutes: effectiveKebabRoutes,\n });\n\n case 'smrt-consumer:mcp':\n return generateFallbackMcpModule();\n\n case 'smrt-consumer:types':\n return generateFallbackTypesModule(typeManifest);\n\n case 'smrt-consumer:manifest':\n return generateFallbackManifestModule(typeManifest);\n\n case 'smrt-consumer:web':\n return generateWebModule(\n typeManifest as unknown as SmartObjectManifest,\n {\n kebabRoutes: effectiveKebabRoutes,\n },\n );\n\n default:\n return null;\n }\n },\n };\n markSvelteKitRouteParticipant(\n plugin,\n 'consumer',\n Boolean(consumerSvelteKit),\n consumerSvelteKit?.routesDir ?? 'src/routes/api',\n undefined,\n () => projectRoot,\n );\n return plugin;\n}\n\n/**\n * Discover SMRT packages from a consumer app's dependencies.\n *\n * Intentional split (#1579): this **consumer-plugin** path is async and\n * resolves SMRT packages from the downstream app's `package.json` dependency\n * names (`@have/`/`smrt` heuristic + `hasSmrtManifest` probe) inside the Vite\n * consumer plugin. It is deliberately separate from the build-time\n * `discoverSmrtPackages()` in `src/manifest/discover-smrt-packages.ts` — a\n * synchronous, lockfile-cached `node_modules` manifest scan used for manifest\n * generation. Different inputs, contexts, and lifecycles, not duplicated logic.\n */\nasync function discoverSmrtPackages(projectRoot: string): Promise<string[]> {\n const packages: string[] = [];\n const nodeModulesPath = path.join(projectRoot, 'node_modules');\n\n if (!fs.existsSync(nodeModulesPath)) {\n return packages;\n }\n\n try {\n // Check package.json for workspace dependencies\n const packageJsonPath = path.join(projectRoot, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n };\n\n // Look for packages that likely contain SMRT objects\n for (const [name, version] of Object.entries(allDeps)) {\n if (\n typeof version === 'string' &&\n (name.includes('smrt') ||\n name.includes('@have/') ||\n (await hasSmrtManifest(nodeModulesPath, name)))\n ) {\n packages.push(name);\n }\n }\n }\n } catch (error) {\n console.warn('[smrt:consumer] Error discovering packages:', error);\n }\n\n return packages;\n}\n\n/**\n * Manifest locations probed for a consumed package, in preference order.\n *\n * The package's own `package.json#exports` map comes first: it is the\n * published contract for where the manifest lives, and a package whose build\n * emits outside this framework's conventional layout (for example\n * `\"./manifest.json\": \"./dist/lib/manifest.json\"`) is otherwise skipped\n * entirely (issue #2923). The conventional paths remain as a fallback for\n * packages that ship a manifest without exporting a subpath for it.\n */\nfunction legacyStaticManifestPath(packageDir: string): string {\n return path.join(packageDir, 'dist', 'manifest', 'static-manifest.js');\n}\n\nfunction packageManifestCandidates(\n packageDir: string,\n packageJson?: ConsumerPackageJson,\n): string[] {\n return [\n ...manifestExportCandidates(packageDir, packageJson),\n legacyStaticManifestPath(packageDir),\n path.join(packageDir, 'dist', 'manifest.json'),\n path.join(packageDir, 'manifest.json'),\n ];\n}\n\n/**\n * Whether a dependency looks like a SMRT package, for the name-heuristic\n * discovery path only.\n *\n * This decides whether a package this framework knows nothing about is pulled\n * into aggregation at all, so mere existence of a manifest-shaped file is not\n * enough: `manifest.json` at a package root or `dist/manifest.json` is a\n * common artifact of unrelated tooling (Vite build manifests, PWA and\n * extension manifests). A false positive would announce a stranger under\n * \"Found SMRT packages\", tell the user to publish a manifest for a package\n * that has nothing to do with SMRT, and — for a JS candidate — evaluate that\n * dependency's module inside the build.\n *\n * A JSON candidate is therefore confirmed by parsing it and requiring\n * `moduleType: 'smrt'`, matching what build-time discovery requires. A JS\n * candidate cannot be identified without importing it, which is the thing\n * being avoided, so only the historical `dist/manifest/static-manifest.js`\n * location counts — exactly the probe this function used before #2923.\n */\nasync function hasSmrtManifest(\n nodeModulesPath: string,\n packageName: string,\n): Promise<boolean> {\n const packagePath = path.join(nodeModulesPath, packageName);\n const legacyStaticManifest = legacyStaticManifestPath(packagePath);\n\n for (const manifestPath of packageManifestCandidates(packagePath)) {\n if (!fs.existsSync(manifestPath)) continue;\n\n if (!manifestPath.endsWith('.json')) {\n if (manifestPath === legacyStaticManifest) return true;\n continue;\n }\n\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as {\n moduleType?: string;\n };\n if (manifest?.moduleType === 'smrt') return true;\n } catch {\n // Not a readable SMRT manifest; keep probing the remaining candidates.\n }\n }\n\n return false;\n}\n\n/**\n * Aggregate type manifests from multiple packages.\n *\n * A package that yields no usable manifest is never dropped silently\n * (issue #2923): an explicitly listed package fails the build, and a\n * heuristically discovered one warns by name. Silence here surfaces much\n * later as missing tables, routes, and generated types with nothing in the\n * build log to connect them to the package that was skipped.\n *\n * @param packages - Package names to aggregate.\n * @param projectRoot - Consumer project root containing `node_modules`.\n * @param options - `explicit` marks a caller-supplied `packages` list, whose\n * entries are assertions rather than guesses and therefore fail closed.\n */\nasync function aggregateTypeManifests(\n packages: string[],\n projectRoot: string,\n options: { explicit?: boolean } = {},\n): Promise<ConsumerManifest> {\n const aggregatedManifest: ConsumerManifest = {\n version: '1.0.0',\n timestamp: MANIFEST_TIMESTAMP,\n smrtDependencies: [...packages],\n objects: {},\n };\n\n const unresolvedPackages: string[] = [];\n const objectSources = new Map<string, string>();\n\n for (const packageName of packages) {\n let loadedManifest = false;\n try {\n // Load package.json for version and export information\n const packageJsonPath = findInstalledPackageJson(\n packageName,\n projectRoot,\n );\n if (!packageJsonPath) {\n console.warn(\n `[smrt:consumer] Could not read package.json for ${packageName}`,\n );\n unresolvedPackages.push(packageName);\n continue;\n }\n const packageDir = path.dirname(packageJsonPath);\n let packageJson: ConsumerPackageJson;\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8');\n packageJson = JSON.parse(packageJsonContent) as ConsumerPackageJson;\n } catch {\n console.warn(\n `[smrt:consumer] Could not read package.json for ${packageName}`,\n );\n unresolvedPackages.push(packageName);\n continue;\n }\n\n // Try the package's declared manifest export first, then convention.\n const manifestCandidates = packageManifestCandidates(\n packageDir,\n packageJson,\n );\n\n for (const manifestPath of manifestCandidates) {\n if (fs.existsSync(manifestPath)) {\n // Import or read the manifest. A candidate that exists but cannot be\n // read, parsed, or imported must not end the search: the export map\n // is probed before the conventional paths, so letting one stale or\n // malformed exported target throw out of this loop would take away\n // the `dist/manifest.json` fallback a package used to load through.\n let manifest: Partial<ConsumerManifest> | undefined;\n try {\n if (manifestPath.endsWith('.js')) {\n const manifestModule = await import(manifestPath);\n manifest =\n manifestModule.staticManifest || manifestModule.default;\n } else {\n const manifestContent = fs.readFileSync(manifestPath, 'utf-8');\n manifest = JSON.parse(\n manifestContent,\n ) as Partial<ConsumerManifest>;\n }\n } catch (error) {\n console.warn(\n `[smrt:consumer] Could not load manifest candidate ${manifestPath} for ${packageName}; trying the next location:`,\n error,\n );\n continue;\n }\n\n if (manifest?.objects) {\n console.log(\n `[smrt:consumer] Loaded manifest from ${packageName} (${Object.keys(manifest.objects).length} objects)`,\n );\n\n // ENHANCED: Preserve package metadata for each object\n for (const [objectName, objectDef] of Object.entries(\n manifest.objects,\n )) {\n const def = objectDef;\n const importPath =\n def.importPath || determineImportPath(packageJson);\n const importPackageName = importPath.startsWith('@')\n ? importPath.split('/').slice(0, 2).join('/')\n : importPath.split('/')[0];\n const sourcePackageJson =\n importPackageName === packageName ? packageJsonPath : undefined;\n const resolvedSourcePackageJson =\n sourcePackageJson ??\n findInstalledPackageJson(importPackageName, packageDir);\n const sourceIdentity = resolvedSourcePackageJson\n ? fs.realpathSync(resolvedSourcePackageJson)\n : `${packageName}\\0${importPackageName}`;\n const priorSource = objectSources.get(objectName);\n if (priorSource && priorSource !== sourceIdentity) {\n throw new AmbiguousProviderGraphError(\n `[smrt:consumer] ${objectName} is contributed by multiple installed provider graphs; refusing ambiguous constructor identity`,\n );\n }\n if (priorSource) continue;\n objectSources.set(objectName, sourceIdentity);\n\n aggregatedManifest.objects[objectName] = {\n ...def,\n // Ensure package metadata is preserved/set\n packageName:\n def.packageName || manifest.packageName || packageName,\n packageVersion:\n def.packageVersion ||\n manifest.packageVersion ||\n packageJson.version,\n // Add fallback import paths if missing\n importPath,\n providerPackageName: packageName,\n exportName: def.exportName || def.className || objectName,\n collectionExportName:\n def.collectionExportName ||\n `${def.className || objectName}Collection`,\n };\n }\n\n loadedManifest = true;\n break; // Use first found manifest for this package\n }\n }\n }\n } catch (error) {\n if (error instanceof AmbiguousProviderGraphError) throw error;\n console.warn(\n `[smrt:consumer] Error loading manifest from ${packageName}:`,\n error,\n );\n }\n\n if (!loadedManifest) {\n unresolvedPackages.push(packageName);\n }\n }\n\n if (unresolvedPackages.length > 0) {\n const named = unresolvedPackages.join(', ');\n if (options.explicit) {\n throw new Error(\n `[smrt:consumer] No SMRT manifest could be resolved for ${named}. ` +\n 'Listed packages must publish a manifest through ' +\n 'package.json#exports (\"./manifest.json\") or at dist/manifest.json, ' +\n 'dist/manifest/static-manifest.js, or manifest.json. Build the ' +\n 'package, or remove it from smrtConsumer({ packages }).',\n );\n }\n // Discovery matches on dependency name, so a hit here is a guess: some\n // matched packages (UI/runtime helpers) legitimately have no objects.\n // Name them anyway — a missing manifest is otherwise invisible until the\n // objects turn up absent from routes and schema.\n console.warn(\n `[smrt:consumer] No SMRT manifest could be resolved for ${named}; ` +\n 'contributing 0 objects. If the package provides SMRT objects, ' +\n 'publish its manifest through package.json#exports (\"./manifest.json\").',\n );\n }\n\n return aggregatedManifest;\n}\n\n/**\n * Determine import path from package.json\n */\nfunction determineImportPath(packageJson: ConsumerPackageJson): string {\n const packageName = packageJson.name;\n\n if (!packageName) {\n throw new Error('Package name not found in package.json');\n }\n\n // Strategy 1: Check for specific exports\n if (packageJson.exports) {\n // Check for objects export\n if (packageJson.exports['./objects']) {\n return `${packageName}/objects`;\n }\n\n // Check for main export\n const mainExport = packageJson.exports['.'];\n if (mainExport) {\n // Handle conditional exports\n if (typeof mainExport === 'object' && mainExport !== null) {\n const conditional = mainExport as Record<string, unknown>;\n if (conditional.import) {\n return packageName;\n }\n if (conditional.default) {\n return packageName;\n }\n }\n return packageName;\n }\n }\n\n // Strategy 2: Check main field\n if (packageJson.main) {\n return packageName;\n }\n\n // Strategy 3: Fallback to package name\n return packageName;\n}\n\n/**\n * Save aggregated manifest to .smrt/manifest.json for CLI discovery.\n *\n * Merge-preserving: `smrtPlugin()` writes the project's own scanned objects\n * to the same file (`writeLocalManifest`, issue #963), and both writes happen\n * in parallel `buildStart` hooks — so a plain overwrite here would clobber\n * the local objects whenever this plugin's write lands last (issue #1760\n * review). Local field metadata would then silently vanish from CLI schema\n * commands and from server runtimes that seed `.smrt/manifest.json`, dropping\n * domain columns on write. This function therefore only ADDS/refreshes the\n * external-package entries it owns and preserves everything else already in\n * the file (including the top-level `packageName` the local write sets).\n */\nasync function saveAggregatedManifest(\n manifest: ConsumerManifest,\n projectRoot: string,\n resolveKnowledgeConfig?: SmrtPluginApi['resolveKnowledgeConfig'],\n agentSurface?: DomainKnowledgeAgentSurface,\n): Promise<void> {\n const smrtDir = path.join(projectRoot, '.smrt');\n const manifestPath = path.join(smrtDir, 'manifest.json');\n\n try {\n // Create .smrt directory if it doesn't exist\n if (!fs.existsSync(smrtDir)) {\n fs.mkdirSync(smrtDir, { recursive: true });\n }\n\n // Merge with whatever is on disk: existing entries (typically the local\n // project's objects written by smrtPlugin) are preserved; aggregated\n // external entries win for the qualified names this plugin owns.\n let merged: ConsumerManifest = manifest;\n if (fs.existsSync(manifestPath)) {\n try {\n const existing = JSON.parse(\n fs.readFileSync(manifestPath, 'utf-8'),\n ) as Partial<ConsumerManifest>;\n if (existing && typeof existing.objects === 'object') {\n merged = {\n ...existing,\n ...manifest,\n // The aggregated manifest carries no packageName; keep the local\n // project's (used as the manifest cache key at runtime).\n ...(existing.packageName\n ? { packageName: existing.packageName }\n : {}),\n objects: { ...existing.objects, ...manifest.objects },\n };\n }\n } catch {\n // Unreadable/corrupt existing file — fall back to a plain write.\n }\n }\n\n // smrtPlugin writes the local knowledge artifact before this consumer\n // plugin merges external package entries into the same manifest. Refresh\n // the artifact from the merged manifest so its source hash always names\n // the manifest that CLI discovery and server runtimes actually consume.\n // The consumer deliberately does not load the scanner. Only carry a\n // surface from the current producer scan: a prior artifact can describe\n // declarations that have since changed while retaining the same path.\n // Re-hashing that current path under a stale declaration would make an\n // incorrect agent contract look fresh.\n const knowledgePath = path.join(smrtDir, 'smrt-knowledge.json');\n const packageJsonPath = path.join(projectRoot, 'package.json');\n const packageJson = fs.existsSync(packageJsonPath)\n ? JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n : undefined;\n const knowledgeConfig = resolveKnowledgeConfig\n ? await resolveKnowledgeConfig(merged as unknown as SmartObjectManifest)\n : await resolveFileKnowledgeConfig(\n projectRoot,\n merged.packageName ?? packageJson?.name,\n );\n if (knowledgeConfig.enabled === false) {\n publishArtifactFiles([\n { path: manifestPath, content: JSON.stringify(merged, null, 2) },\n ]);\n return;\n }\n const knowledge = buildDomainKnowledgeManifest({\n manifest: merged as unknown as SmartObjectManifest,\n rootDir: projectRoot,\n packageJson,\n manifestPath,\n config: knowledgeConfig,\n agentSurface,\n });\n // Stage both artifacts before replacing either. Renames are individually\n // atomic; if a synchronous later rename fails, restore every earlier\n // replacement. A process crash between renames cannot be made pair-atomic\n // with ordinary filesystem operations, so the next generation remains the\n // freshness repair path for that distinct failure mode.\n publishArtifactFiles([\n { path: knowledgePath, content: JSON.stringify(knowledge, null, 2) },\n { path: manifestPath, content: JSON.stringify(merged, null, 2) },\n ]);\n\n console.log(\n `[smrt:consumer] Saved aggregated manifest to .smrt/manifest.json (${Object.keys(merged.objects).length} objects)`,\n );\n } catch (error) {\n throw new Error('[smrt:consumer] Failed to save aggregated manifest', {\n cause: error,\n });\n }\n}\n\n/**\n * Generate registration file for CLI class loading\n *\n * Creates .smrt/register.js with static imports and registrations\n * for all external SMRT objects discovered during build.\n */\nasync function generateRegistrationFile(\n manifest: ConsumerManifest,\n projectRoot: string,\n): Promise<void> {\n const smrtDir = path.join(projectRoot, '.smrt');\n const registerPath = path.join(smrtDir, 'register.js');\n\n // Bind every imported symbol to a generated local name. Aggregated manifests\n // may contain same-named exports from different packages (and may list a\n // collection both beside its object and as its own manifest entry), so using\n // provider export names as local bindings can produce invalid duplicate\n // imports in a production consumer bundle.\n const importBindings = new Map<string, string>();\n const importsByPath = new Map<string, Map<string, string>>();\n const transitiveNamespaces = new Map<\n string,\n { binding: string; providerPackageName: string; importPath: string }\n >();\n const transitiveBindings = new Map<\n string,\n { binding: string; namespaceBinding: string; exportName: string }\n >();\n const transitiveCollectionChecks: Array<{\n collectionBinding: string;\n itemBinding: string;\n }> = [];\n let nextImportBinding = 0;\n const getImportBinding = (importPath: string, exportName: string): string => {\n const key = `${importPath}\\0${exportName}`;\n const existing = importBindings.get(key);\n if (existing) return existing;\n const binding = `__smrt_consumer_${nextImportBinding++}`;\n importBindings.set(key, binding);\n const specifiers =\n importsByPath.get(importPath) ?? new Map<string, string>();\n specifiers.set(exportName, binding);\n importsByPath.set(importPath, specifiers);\n return binding;\n };\n const getTransitiveBinding = (\n importPath: string,\n providerPackageName: string,\n exportName: string,\n ): string => {\n const namespaceKey = `${providerPackageName}\\0${importPath}`;\n let namespace = transitiveNamespaces.get(namespaceKey);\n if (!namespace) {\n namespace = {\n binding: `__smrt_transitive_provider_${transitiveNamespaces.size}`,\n providerPackageName,\n importPath,\n };\n transitiveNamespaces.set(namespaceKey, namespace);\n }\n const key = `${namespaceKey}\\0${exportName}`;\n const existing = transitiveBindings.get(key);\n if (existing) return existing.binding;\n const binding = `__smrt_consumer_${nextImportBinding++}`;\n transitiveBindings.set(key, {\n binding,\n namespaceBinding: namespace.binding,\n exportName,\n });\n return binding;\n };\n const isSameProjectAndProviderImport = (\n importPath: string,\n providerPackageName?: string,\n ): boolean => {\n const importPackageName = packageNameFromImportPath(importPath);\n const projectPackageJson = findInstalledPackageJson(\n importPackageName,\n projectRoot,\n );\n if (!providerPackageName) return Boolean(projectPackageJson);\n\n const providerPackageJson = findInstalledPackageJson(\n providerPackageName,\n projectRoot,\n );\n if (!providerPackageJson) return false;\n const providerImportPackageJson =\n importPackageName === providerPackageName\n ? providerPackageJson\n : findInstalledPackageJson(\n importPackageName,\n path.dirname(providerPackageJson),\n );\n return sameInstalledPackage(projectPackageJson, providerImportPackageJson);\n };\n\n // Configured providers remain ordinary static imports. Transitive-only\n // object modules are loaded below through their owning provider context.\n for (const packageName of manifest.smrtDependencies ?? []) {\n if (\n isSameProjectAndProviderImport(packageName, packageName) &&\n !importsByPath.has(packageName)\n ) {\n importsByPath.set(packageName, new Map());\n }\n }\n\n const registrations: string[] = [];\n const registrationManifests: Record<string, ConsumerManifest> = {};\n let importedEntryCount = 0;\n let registeredObjectCount = 0;\n\n const manifestObjects = manifest.objects;\n const manifestObjectLookup = new Map<string, ConsumerObjectDefinition>();\n for (const [key, def] of Object.entries(manifestObjects)) {\n const candidate = def;\n const lookupKeys = [\n key,\n key.includes(':') ? key.split(':').pop() : undefined,\n candidate.qualifiedName,\n candidate.className,\n candidate.exportName,\n ];\n\n for (const lookupKey of lookupKeys) {\n if (lookupKey && !manifestObjectLookup.has(lookupKey)) {\n manifestObjectLookup.set(lookupKey, candidate);\n }\n }\n }\n\n const collectionClassMemo = new WeakMap<object, boolean>();\n\n const isCollectionClass = (\n def: ConsumerObjectDefinition | undefined,\n seen = new Set<string>(),\n ): boolean => {\n if (!def || typeof def !== 'object') {\n return false;\n }\n\n const cached = collectionClassMemo.get(def);\n if (cached !== undefined) {\n return cached;\n }\n\n if (\n def?.extends === 'SmrtCollection' ||\n def?.extendsTypeArg !== undefined\n ) {\n collectionClassMemo.set(def, true);\n return true;\n }\n\n const parentName = def?.extendsQualified || def?.extends;\n if (!parentName || seen.has(parentName)) {\n collectionClassMemo.set(def, false);\n return false;\n }\n seen.add(parentName);\n\n const parentDef = manifestObjectLookup.get(parentName);\n const isCollection = parentDef ? isCollectionClass(parentDef, seen) : false;\n collectionClassMemo.set(def, isCollection);\n\n return isCollection;\n };\n\n for (const [objectName, objectDef] of Object.entries(manifestObjects)) {\n const def = objectDef;\n\n // Skip local objects (they're imported from local entry point)\n if (!def.packageName || def.packageName === manifest.packageName) {\n continue;\n }\n\n const importPath = def.importPath || def.packageName;\n const exportName = def.exportName || def.className || objectName;\n const collectionExportName = def.collectionExportName;\n const hasCollection = def.hasCollection; // Check if collection class actually exists\n const tableName = def.collection || objectName.toLowerCase();\n const qualifiedName =\n def.qualifiedName ||\n (objectName.includes(':')\n ? objectName\n : `${def.packageName}:${def.className || exportName}`);\n\n const providerPackageName = def.providerPackageName;\n const appResolvable = isSameProjectAndProviderImport(\n importPath,\n providerPackageName,\n );\n if (!appResolvable && !providerPackageName) {\n throw new Error(\n `[smrt:consumer] ${objectName} has no configured provider provenance for ${importPath}`,\n );\n }\n const exportBinding = appResolvable\n ? getImportBinding(importPath, exportName)\n : getTransitiveBinding(\n importPath,\n providerPackageName as string,\n exportName,\n );\n const collectionBinding =\n hasCollection && collectionExportName\n ? appResolvable\n ? getImportBinding(importPath, collectionExportName)\n : getTransitiveBinding(\n importPath,\n providerPackageName as string,\n collectionExportName,\n )\n : undefined;\n if (!appResolvable && collectionBinding) {\n transitiveCollectionChecks.push({\n collectionBinding,\n itemBinding: exportBinding,\n });\n }\n importedEntryCount++;\n\n if (isCollectionClass(def)) {\n continue;\n }\n\n const logicalName = def.className || exportName;\n registrationManifests[objectName] = {\n ...manifest,\n packageName: def.packageName,\n packageVersion: def.packageVersion || manifest.packageVersion,\n objects: { [objectName]: def },\n };\n\n // Import evaluation triggers the provider decorator first. The explicit\n // constructor/package/key tuple then promotes that exact constructor with\n // its isolated manifest, which is stable across Rollup name deconfliction.\n registrations.push(\n `if (${exportBinding}) ObjectRegistry.register(${exportBinding}, { name: ${JSON.stringify(logicalName)}, packageName: ${JSON.stringify(def.packageName)}, _manifest: smrtRegistrationManifests[${JSON.stringify(objectName)}], _manifestKey: ${JSON.stringify(objectName)} });`,\n );\n\n // Only register collection if it exists\n if (collectionBinding) {\n registrations.push(\n `if (${collectionBinding}) {\n ObjectRegistry.registerCollection(${JSON.stringify(qualifiedName)}, ${collectionBinding});\n ObjectRegistry.registerCollection(${JSON.stringify(tableName)}, ${collectionBinding});\n}`,\n );\n }\n\n registeredObjectCount++;\n }\n\n // Skip generation if no external entries\n if (importedEntryCount === 0) {\n console.log('[smrt:consumer] No external entries - skipping register.js');\n return;\n }\n\n const registeredObjectLabel =\n registeredObjectCount === 1 ? 'object' : 'objects';\n const sortedImports = Array.from(importsByPath.entries()).sort(\n ([left], [right]) => left.localeCompare(right),\n );\n const imports = sortedImports.map(\n ([importPath], index) =>\n `import * as __smrt_provider_${index} from '${importPath}';`,\n );\n const importDeclarations = sortedImports.flatMap(([, specifiers], index) =>\n Array.from(specifiers.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([exportName, binding]) =>\n `const ${binding} = getSmrtExport(__smrt_provider_${index}, ${JSON.stringify(exportName)});`,\n ),\n );\n const transitiveNamespaceDeclarations = Array.from(\n transitiveNamespaces.values(),\n )\n .sort((left, right) => left.binding.localeCompare(right.binding))\n .map(\n ({ binding, providerPackageName, importPath }) =>\n `const ${binding} = await importSmrtDependency(${JSON.stringify(importPath)}, ${JSON.stringify(providerPackageName)});`,\n );\n const transitiveDeclarations = Array.from(transitiveBindings.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([, { binding, namespaceBinding, exportName }]) =>\n `const ${binding} = getSmrtExport(${namespaceBinding}, ${JSON.stringify(exportName)});\nif (!${binding}) throw new Error(${JSON.stringify(`[smrt:consumer] Provider-owned module did not export ${exportName}`)});`,\n );\n const transitiveCollectionDeclarations = transitiveCollectionChecks.map(\n ({ collectionBinding, itemBinding }) =>\n `if (${collectionBinding}._itemClass !== ${itemBinding}) throw new Error('[smrt:consumer] Provider-owned collection does not match its item constructor');`,\n );\n const registrationManifestLiteral = JSON.stringify(\n JSON.stringify(registrationManifests),\n );\n\n // Generate file content\n const content = `/**\n * Auto-generated by @happyvertical/smrt-core/consumer-plugin\n * DO NOT EDIT - This file is regenerated on every build\n *\n * Registers SMRT objects from external packages for CLI discovery.\n * Generated at: ${new Date().toISOString()}\n */\n\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n${transitiveNamespaces.size > 0 ? \"import { registerHooks } from 'node:module';\" : ''}\n\n${imports.join('\\n')}\n\n/**\n * @param {Record<string, unknown>} provider\n * @param {string} exportName\n * @returns {any}\n */\nconst getSmrtExport = (provider, exportName) =>\n typeof provider[exportName] === 'function' ? provider[exportName] : undefined;\n${\n transitiveNamespaces.size > 0\n ? `const SMRT_RESOLVER_MODULE = 'data:text/javascript,export default (specifier) => import.meta.resolve(specifier)';\nlet smrtResolverToken = 0;\nconst importSmrtDependency = async (specifier, providerPackageName) => {\n const parentURL = import.meta.resolve(providerPackageName);\n const token = \\`smrt-consumer-resolve-\\${smrtResolverToken++}\\`;\n const hooks = registerHooks({\n resolve(requested, context, nextResolve) {\n return requested === token\n ? nextResolve(specifier, { ...context, parentURL })\n : nextResolve(requested, context);\n },\n });\n try {\n const resolver = (await import(/* @vite-ignore */ SMRT_RESOLVER_MODULE)).default;\n return import(/* @vite-ignore */ resolver(token));\n } finally {\n hooks.deregister();\n }\n};\n`\n : ''\n}\n${transitiveNamespaceDeclarations.join('\\n')}\n${importDeclarations.join('\\n')}\n${transitiveDeclarations.join('\\n')}\n${transitiveCollectionDeclarations.join('\\n')}\n\nconst smrtRegistrationManifests = JSON.parse(${registrationManifestLiteral});\n\n// Register all objects (executed during module evaluation)\n${registrations.join('\\n')}\n\nexport function registerAll() {\n // Objects are already registered during module evaluation\n console.log('[smrt:register] Registered ${registeredObjectCount} external ${registeredObjectLabel}');\n}\n`;\n\n // Create .smrt directory if needed\n if (!fs.existsSync(smrtDir)) {\n fs.mkdirSync(smrtDir, { recursive: true });\n }\n\n // Write registration file\n fs.writeFileSync(registerPath, content, 'utf-8');\n\n console.log(\n `[smrt:consumer] Generated .smrt/register.js with ${importedEntryCount} external entries (${registeredObjectCount} registered ${registeredObjectLabel})`,\n );\n}\n\n/**\n * Generate project-specific types\n */\nasync function generateProjectTypes(\n typeManifest: ConsumerManifest,\n typesDir: string,\n projectRoot: string,\n): Promise<void> {\n if (!typeManifest || Object.keys(typeManifest.objects).length === 0) {\n console.log(\n '[smrt:consumer] No SMRT objects found, skipping type generation',\n );\n return;\n }\n\n await generateDeclarations({\n // The aggregated manifest is a runtime SMRT manifest assembled from external\n // package manifests; it is intentionally typed loosely at the JSON boundary,\n // so narrow it to the declaration generator's strict manifest shape here.\n manifest: typeManifest as unknown as SmartObjectManifest,\n outDir: typesDir,\n projectRoot,\n includeVirtualModules: true,\n includeObjectTypes: true,\n });\n\n console.log(\n `[smrt:consumer] Generated types for ${Object.keys(typeManifest.objects).length} objects`,\n );\n}\n\n/**\n * Get type file name for virtual module\n */\nfunction getTypeFileName(virtualModule: string): string {\n const moduleMap: Record<string, string> = {\n '@smrt/routes': 'smrt-routes.d.ts',\n '@smrt/client': 'smrt-client.d.ts',\n '@smrt/mcp': 'smrt-mcp.d.ts',\n '@smrt/types': 'smrt-types.d.ts',\n '@smrt/manifest': 'smrt-manifest.d.ts',\n '@smrt/web': 'smrt-web.d.ts',\n };\n return moduleMap[virtualModule] || 'smrt-unknown.d.ts';\n}\n\n/**\n * Fallback modules for when types aren't available\n */\nfunction generateFallbackRoutesModule(): string {\n return `\n// Fallback routes module\nexport function setupRoutes(app) {\n console.warn('[smrt:consumer] No routes available - SMRT packages may not be properly configured');\n}\nexport default setupRoutes;\n`;\n}\n\nfunction generateFallbackClientModule(\n manifest: ConsumerManifest,\n options: { kebabRoutes?: boolean } = {},\n): string {\n const objects = Object.entries(manifest?.objects || {});\n if (objects.length === 0) {\n return `\n// Fallback client module\nexport function createClient(basePath = '/api/v1') {\n console.warn('[smrt:consumer] No API client available - SMRT packages may not be properly configured');\n return {};\n}\nexport default createClient;\n`;\n }\n\n return generateClientModule(manifest as unknown as SmartObjectManifest, {\n kebabRoutes: options.kebabRoutes,\n });\n}\n\nfunction generateFallbackMcpModule(): string {\n return `\n// Fallback MCP module\nexport const tools = [];\nexport function createMCPServer() {\n console.warn('[smrt:consumer] No MCP tools available - SMRT packages may not be properly configured');\n return { name: 'smrt-consumer', version: '1.0.0', tools: [] };\n}\nexport default createMCPServer;\n`;\n}\n\nfunction generateFallbackTypesModule(manifest: ConsumerManifest): string {\n const objects = Object.entries(manifest?.objects || {});\n if (objects.length === 0) {\n return `// No types available`;\n }\n\n // Generate basic interfaces\n const interfaces = objects.map(([_name, obj]) => {\n return `export interface ${obj.className}Data {\n id?: string;\n created_at?: string;\n updated_at?: string;\n [key: string]: any;\n}`;\n });\n\n return interfaces.join('\\n\\n');\n}\n\nfunction generateFallbackManifestModule(manifest: ConsumerManifest): string {\n return `\n// Auto-generated manifest from SMRT consumer\nexport const manifest = ${JSON.stringify(manifest, null, 2)};\nexport default manifest;\n`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/consumer-plugin/index.ts"],"sourcesContent":["/**\n * Vite plugin for consuming SMRT packages\n * Solves virtual module resolution in downstream projects\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DomainKnowledgeAgentSurface } from '@happyvertical/smrt-types';\nimport type { ConfigEnv, Plugin } from 'vite';\nimport {\n loadVerifiedSmrtGenerationSnapshot,\n type SmrtGenerationSnapshotOptions,\n} from '../generation-snapshot.js';\nimport { buildDomainKnowledgeManifest } from '../knowledge.js';\nimport { resolveFileKnowledgeConfig } from '../knowledge-config.js';\nimport { manifestExportCandidates } from '../manifest/package-manifest-exports.js';\nimport { generateDeclarations } from '../prebuild/index.js';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from '../scanner/types.js';\nimport { MANIFEST_TIMESTAMP } from '../scanner/types.js';\nimport { generateClientModule } from '../vite-plugin/generated-client.js';\nimport type { SmrtPluginApi } from '../vite-plugin/index.js';\nimport {\n clearGeneratedSvelteKitRouteFiles,\n reconcileSvelteKitRouteGitignore,\n type SvelteKitOptions,\n} from '../vite-plugin/sveltekit-generator.js';\nimport { canonicalSvelteKitPath } from '../vite-plugin/sveltekit-path.js';\nimport {\n activeProducerKnowledgeRoutePaths,\n activeSvelteKitRouteParticipants,\n assertNoSvelteKitRouteRootSymlinkConflict,\n assertSvelteKitRouteCoordinationComplete,\n contributeSvelteKitRoutes,\n expectedSvelteKitRouteOwners,\n markSvelteKitRouteParticipant,\n producerKnowledgeRoutePaths,\n revokeSvelteKitRoutes,\n} from '../vite-plugin/sveltekit-route-coordinator.js';\nimport {\n generateWebModule,\n isCollectionManifestClass,\n resolveCollectionItemObject,\n} from '../vite-plugin/web-collections.js';\nimport { publishArtifactFiles } from './artifact-publication.js';\nimport { separateHostedStiCollections } from './hosted-sti-collections.js';\n\nexport {\n loadVerifiedSmrtGenerationSnapshot,\n type SerializeSmrtGenerationSnapshotOptions,\n type SmrtGenerationSnapshotArtifact,\n type SmrtGenerationSnapshotOptions,\n type SmrtGenerationSnapshotView,\n serializeSmrtGenerationSnapshot,\n sha256SmrtGenerationSnapshot,\n} from '../generation-snapshot.js';\n\n/**\n * Loosely-typed view of an object definition as carried by an external\n * package's static manifest. The static manifests are read from JSON at the\n * package boundary, so only the fields this plugin consumes are typed; the\n * index signature preserves any additional fields (e.g. for spreads). This is\n * a structural superset of a manifest `SmartObjectDefinition` plus the\n * consumer-only `hasCollection` marker.\n */\ninterface ConsumerObjectDefinition {\n className?: string;\n packageName?: string;\n packageVersion?: string;\n qualifiedName?: string;\n importPath?: string;\n exportName?: string;\n collectionExportName?: string;\n hasCollection?: boolean;\n collection?: string;\n extends?: string;\n extendsQualified?: string;\n extendsTypeArg?: string;\n /** Configured app dependency whose manifest contributed this object. */\n providerPackageName?: string;\n [key: string]: unknown;\n}\n\nclass AmbiguousProviderGraphError extends Error {}\n\n/**\n * Aggregated manifest assembled by the consumer plugin from one or more\n * external package manifests. Loosely typed because the inputs originate from\n * JSON read at the package boundary.\n */\ninterface ConsumerManifest {\n version: string;\n timestamp: number;\n packageName?: string;\n packageVersion?: string;\n smrtDependencies?: string[];\n objects: Record<string, ConsumerObjectDefinition>;\n}\n\n/**\n * Minimal structural shape of a parsed `package.json` consumed here (name,\n * version, and the export map used to derive import paths). The index\n * signature keeps the remaining fields accessible.\n */\ninterface ConsumerPackageJson {\n name?: string;\n version?: string;\n main?: string;\n exports?: Record<string, unknown>;\n dependencies?: Record<string, unknown>;\n optionalDependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface SelectiveSsrPackage {\n packageJson: ConsumerPackageJson;\n packageRoot: string;\n}\n\nfunction packageNameFromImportPath(importPath: string): string {\n const parts = importPath.split('/');\n return importPath.startsWith('@')\n ? parts.slice(0, 2).join('/')\n : (parts[0] ?? importPath);\n}\n\nfunction findInstalledPackageJson(\n packageName: string,\n searchFrom: string,\n): string | undefined {\n let currentDir = fs.existsSync(searchFrom)\n ? fs.realpathSync(searchFrom)\n : path.resolve(searchFrom);\n while (true) {\n const candidate = path.join(\n currentDir,\n 'node_modules',\n packageName,\n 'package.json',\n );\n if (fs.existsSync(candidate)) return fs.realpathSync(candidate);\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) return undefined;\n currentDir = parentDir;\n }\n}\n\nfunction sameInstalledPackage(\n left: string | undefined,\n right: string | undefined,\n): boolean {\n return Boolean(\n left && right && fs.realpathSync(left) === fs.realpathSync(right),\n );\n}\n\nfunction readInstalledPackageJson(\n packageJsonPath: string | undefined,\n): ConsumerPackageJson | undefined {\n if (!packageJsonPath) return undefined;\n try {\n return JSON.parse(\n fs.readFileSync(packageJsonPath, 'utf8'),\n ) as ConsumerPackageJson;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Whether an `exports` target (or any condition under it) needs Vite to\n * compile it: a `.svelte`/`.css` file or a `svelte` resolution condition.\n */\nfunction exportTargetNeedsViteCompilation(value: unknown): boolean {\n if (typeof value === 'string') {\n return value.endsWith('.svelte') || value.endsWith('.css');\n }\n if (!value || typeof value !== 'object') return false;\n return Object.entries(value).some(\n ([condition, target]) =>\n condition === 'svelte' || exportTargetNeedsViteCompilation(target),\n );\n}\n\n/**\n * A component-bearing package publishes Svelte entries (a `svelte` field, a\n * `svelte` condition, or a `.svelte`/`.css` export target). Plain Node cannot\n * evaluate such a package's root: it may re-export `.svelte` files directly or\n * through another component library (#4219).\n */\nfunction isComponentBearingPackage(\n packageJson: ConsumerPackageJson | undefined,\n): boolean {\n return (\n typeof packageJson?.svelte === 'string' ||\n exportTargetNeedsViteCompilation(packageJson?.exports)\n );\n}\n\n/**\n * The package.json fields the Svelte-root rule reads. `exports` is `unknown`\n * because npm allows a bare string target as well as a conditions map.\n */\ninterface ProviderPackageShape {\n svelte?: unknown;\n exports?: unknown;\n [key: string]: unknown;\n}\n\n/**\n * Whether the package declares its ROOT as a Svelte entry: a `svelte` field or\n * a `.` export carrying a `svelte` condition (at any nesting) or a\n * `.svelte`/`.css` target. Such a root (e.g. `@happyvertical/smrt-products`,\n * which re-exports its components) cannot be evaluated by plain Node (#4219).\n * A package that only publishes Svelte under a subpath keeps a Node-safe root,\n * as the standards require.\n *\n * A `svelte` condition counts even when its target is plain `.js`: that is\n * what svelte-package and Vite library builds emit for a root that re-exports\n * components (the `.svelte` files sit one import deeper), and it is exactly\n * the shape of every Svelte root in this workspace. Reading the condition as\n * the package's declaration is deliberate — the trade-off is that a Node-safe\n * root that nevertheless declares `svelte` loses its optional provider-context\n * import, which costs nothing when its objects are imported from a subpath.\n *\n * A missing `exports` map, a `.` key absent from it, or an unreadable\n * package.json (`undefined`) all answer `false`: the register then keeps the\n * root import #4187 chose, as before.\n *\n * @internal Exported for tests.\n */\nexport function isComponentBearingRoot(\n packageJson: ProviderPackageShape | undefined,\n): boolean {\n if (typeof packageJson?.svelte === 'string') return true;\n const exports = packageJson?.exports;\n if (typeof exports === 'string') {\n return exportTargetNeedsViteCompilation(exports);\n }\n if (!exports || typeof exports !== 'object') return false;\n const exportsMap = exports as Record<string, unknown>;\n const hasSubpathKeys = Object.keys(exportsMap).some((key) =>\n key.startsWith('.'),\n );\n return exportTargetNeedsViteCompilation(\n hasSubpathKeys ? exportsMap['.'] : exportsMap,\n );\n}\n\n/**\n * Pick the module the generated register imports so a configured provider is\n * evaluated in Node's installed package context (#4187): the package root,\n * unless the package declares that root as a Svelte entry, in which case\n * nothing is imported for the provider (#4219). Its object entries, imported\n * from their manifest `importPath`, already evaluate it in that context, and\n * the transitive loader needs only `import.meta.resolve(provider)`, not an\n * import. No substitute subpath is chosen: one that reaches `.svelte` would\n * re-create the failure this avoids.\n *\n * @internal Exported for tests.\n */\nexport function resolveProviderContextImport(\n packageName: string,\n packageJson: ProviderPackageShape | undefined,\n): string | undefined {\n return isComponentBearingRoot(packageJson) ? undefined : packageName;\n}\n\n/**\n * SvelteKit route-hosting options for dependency models. Unlike `packages`,\n * `objects` is an HTTP exposure boundary: every entry must be an exact,\n * provider-qualified manifest key (for example, `@acme/widgets:Widget`).\n */\nexport interface SmrtConsumerSvelteKitOptions\n extends Partial<\n Pick<\n SvelteKitOptions,\n | 'routesDir'\n | 'objectsDir'\n | 'configPath'\n | 'configFileName'\n | 'kebabRoutes'\n | 'changesRoute'\n | 'eventsRoute'\n | 'resourcesRoute'\n >\n > {\n objects: readonly string[];\n}\n\nexport interface SmrtConsumerOptions {\n /** SMRT packages to scan (e.g., ['@my-org/products', '@my-org/content']) */\n packages?: string[];\n /** Generate TypeScript declarations */\n generateTypes?: boolean;\n /** Output directory for generated types */\n typesDir?: string;\n /** Project root path (defaults to the current working directory) */\n projectRoot?: string;\n /**\n * Reuse an immutable, verified aggregated manifest instead of discovering\n * packages or writing `.smrt/manifest.json`. Registration and generated\n * types still consume the verified manifest.\n */\n generationSnapshot?: SmrtGenerationSnapshotOptions;\n /**\n * Consumer SvelteKit integration. `true` retains the historical compatibility\n * mode and does not generate dependency routes. Route hosting requires an\n * explicit, provider-qualified object allowlist.\n */\n svelteKit?: boolean | SmrtConsumerSvelteKitOptions;\n /**\n * Apply kebab-case to generated custom-method URL segments. This must match\n * the producer plugin's `svelteKit.kebabRoutes` setting. When explicit\n * consumer SvelteKit hosting is configured, its `kebabRoutes` value takes\n * precedence, including an explicit `false`.\n */\n kebabRoutes?: boolean;\n /** Use static types only (for federation builds) */\n staticTypes?: boolean;\n /** Disable file scanning */\n disableScanning?: boolean;\n}\n\n// Distinct resolved ids per plugin (#1795). smrtPlugin resolves\n// `@happyvertical/smrt-virt-*` to `\\0smrt:*`; if this consumer plugin also\n// resolved its `@smrt/*` specifiers to `\\0smrt:*` the two virtual modules would\n// share a rollup id, and in standalone/federation builds the consumer's\n// fallback `load` would non-deterministically win and shadow smrtPlugin's real\n// module. Namespacing the consumer ids (`\\0smrt-consumer:*`) keeps them\n// separate so each plugin only ever loads its own module.\nconst VIRTUAL_MODULES = {\n '@smrt/routes': 'smrt-consumer:routes',\n '@smrt/client': 'smrt-consumer:client',\n '@smrt/mcp': 'smrt-consumer:mcp',\n '@smrt/types': 'smrt-consumer:types',\n '@smrt/manifest': 'smrt-consumer:manifest',\n '@smrt/web': 'smrt-consumer:web',\n};\n\nconst CONSUMER_SVELTEKIT_ROUTES_ARTIFACT_VERSION = 1;\nconst CONSUMER_SVELTEKIT_ROUTES_ARTIFACT = 'consumer-sveltekit-routes.json';\n\ninterface ConsumerSvelteKitRoutesArtifact {\n version: number;\n routesDir: string[];\n}\n\nfunction consumerSvelteKitRoutesArtifactPath(projectRoot: string): string {\n return path.join(projectRoot, '.smrt', CONSUMER_SVELTEKIT_ROUTES_ARTIFACT);\n}\n\n/** Persist only project-relative consumer route roots, never an output file list. */\nfunction canonicalConsumerRouteRoot(\n projectRoot: string,\n routesDir: string,\n): string {\n const root = path.resolve(projectRoot);\n const relative = path.relative(root, path.resolve(root, routesDir));\n if (\n !relative ||\n relative === '..' ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new Error(\n `[smrt:consumer] svelteKit.routesDir must be a project-relative subdirectory (received ${JSON.stringify(routesDir)})`,\n );\n }\n return relative.split(path.sep).join('/');\n}\n\nfunction loadConsumerSvelteKitRouteRoots(projectRoot: string): string[] {\n const artifactPath = consumerSvelteKitRoutesArtifactPath(projectRoot);\n if (!fs.existsSync(artifactPath)) return [];\n let parsed: ConsumerSvelteKitRoutesArtifact;\n try {\n parsed = JSON.parse(fs.readFileSync(artifactPath, 'utf-8'));\n } catch {\n throw new Error(\n `[smrt:consumer] Cannot read ${CONSUMER_SVELTEKIT_ROUTES_ARTIFACT}; refusing to leave hosted routes unreconciled`,\n );\n }\n if (\n parsed?.version !== CONSUMER_SVELTEKIT_ROUTES_ARTIFACT_VERSION ||\n !Array.isArray(parsed.routesDir) ||\n parsed.routesDir.some((routesDir) => typeof routesDir !== 'string')\n ) {\n throw new Error(\n `[smrt:consumer] Invalid ${CONSUMER_SVELTEKIT_ROUTES_ARTIFACT}; refusing to leave hosted routes unreconciled`,\n );\n }\n return [...new Set(parsed.routesDir)].map((routesDir) =>\n canonicalConsumerRouteRoot(projectRoot, routesDir),\n );\n}\n\nfunction publishConsumerSvelteKitRouteRoots(\n projectRoot: string,\n routesDir: string[],\n): void {\n const artifactPath = consumerSvelteKitRoutesArtifactPath(projectRoot);\n fs.mkdirSync(path.dirname(artifactPath), { recursive: true });\n publishArtifactFiles([\n {\n path: artifactPath,\n content: JSON.stringify(\n {\n version: CONSUMER_SVELTEKIT_ROUTES_ARTIFACT_VERSION,\n routesDir: [...new Set(routesDir)].sort(),\n } satisfies ConsumerSvelteKitRoutesArtifact,\n null,\n 2,\n ),\n },\n ]);\n}\n\nfunction removeConsumerSvelteKitRouteRoots(projectRoot: string): void {\n const artifactPath = consumerSvelteKitRoutesArtifactPath(projectRoot);\n if (fs.existsSync(artifactPath)) fs.unlinkSync(artifactPath);\n}\n\n/**\n * A hosting-to-hosting move can replace one configured root with another in a\n * fresh lifecycle. Validate every durable former root before the new target\n * journals or clears anything, otherwise a rejected move could alter the\n * prior generated surface before reconciliation notices the conflict.\n */\nasync function assertConsumerSvelteKitFormerRouteRootsAreSafe(\n userConfig: unknown,\n projectRoot: string,\n routesDir: readonly string[],\n env?: ConfigEnv,\n): Promise<void> {\n if (routesDir.length === 0) return;\n const activeParticipants = await activeSvelteKitRouteParticipants(\n userConfig,\n projectRoot,\n env,\n );\n const activeRoots = activeParticipants.map(\n (participant) => participant.routesDir,\n );\n for (const priorRoutesDir of routesDir) {\n assertNoSvelteKitRouteRootSymlinkConflict(\n canonicalSvelteKitPath(path.resolve(projectRoot, priorRoutesDir)),\n activeRoots,\n );\n }\n}\n\nasync function reconcileConsumerSvelteKitRouteRoots(\n lifecycle: object,\n userConfig: unknown,\n projectRoot: string,\n routesDir: string[],\n afterReconciled: () => void,\n env?: ConfigEnv,\n): Promise<void> {\n const remaining = new Set(routesDir);\n const reconcileOne = (routesDir: string) => {\n remaining.delete(routesDir);\n if (remaining.size === 0) afterReconciled();\n };\n\n if (remaining.size === 0) {\n afterReconciled();\n return;\n }\n\n for (const routesDir of [...remaining]) {\n const routeRoot = canonicalSvelteKitPath(\n path.resolve(projectRoot, routesDir),\n );\n const activeParticipants = await activeSvelteKitRouteParticipants(\n userConfig,\n projectRoot,\n env,\n );\n // The durable consumer inventory names roots, not individual handlers.\n // Check before every reconciliation branch, including an active parent\n // consumer that would otherwise compact a nested former root without a\n // sweep. A child symlink into a foreign active root makes that ownership\n // ambiguous, so retaining the inventory makes retry safe.\n assertNoSvelteKitRouteRootSymlinkConflict(\n routeRoot,\n activeParticipants.map((participant) => participant.routesDir),\n );\n const containingConsumer = activeParticipants.find(\n (participant) =>\n participant.owner === 'consumer' &&\n (routeRoot === participant.routesDir ||\n routeRoot.startsWith(`${participant.routesDir}${path.sep}`)),\n );\n // A current parent consumer root has already swept and regenerated this\n // former child root. Sweeping it again would remove the newly selected\n // handler before SvelteKit inventories it.\n if (containingConsumer) {\n reconcileOne(routesDir);\n continue;\n }\n const containingProducer = activeParticipants.find(\n (participant) =>\n participant.owner === 'producer' &&\n (routeRoot === participant.routesDir ||\n routeRoot.startsWith(`${participant.routesDir}${path.sep}`)),\n );\n if (containingProducer) {\n await revokeSvelteKitRoutes(\n lifecycle,\n await expectedSvelteKitRouteOwners(\n userConfig,\n containingProducer.projectRoot,\n containingProducer.routesDir,\n env,\n ),\n containingProducer.projectRoot,\n containingProducer.routesDir,\n () => reconcileOne(routesDir),\n );\n continue;\n }\n const owners = await expectedSvelteKitRouteOwners(\n userConfig,\n projectRoot,\n routesDir,\n env,\n );\n if (owners.includes('producer')) {\n await revokeSvelteKitRoutes(\n lifecycle,\n owners,\n projectRoot,\n routesDir,\n () => reconcileOne(routesDir),\n );\n continue;\n }\n clearGeneratedSvelteKitRouteFiles(\n routeRoot,\n producerKnowledgeRoutePaths(lifecycle),\n new Set(\n activeParticipants\n .map((participant) => participant.routesDir)\n .filter((activeRoot) => activeRoot !== routeRoot),\n ),\n );\n reconcileSvelteKitRouteGitignore(projectRoot, routesDir);\n reconcileOne(routesDir);\n }\n}\n\nfunction consumerRouteOptions(\n value: SmrtConsumerOptions['svelteKit'],\n): SmrtConsumerSvelteKitOptions | undefined {\n if (!value || value === true) return undefined;\n if (!Array.isArray(value.objects) || value.objects.length === 0) {\n throw new Error(\n '[smrt:consumer] svelteKit.objects must list at least one provider-qualified object reference',\n );\n }\n for (const objectRef of value.objects) {\n if (typeof objectRef !== 'string' || !objectRef.includes(':')) {\n throw new Error(\n `[smrt:consumer] svelteKit.objects entries must be provider-qualified (received ${JSON.stringify(objectRef)})`,\n );\n }\n }\n return value;\n}\n\nfunction consumerUtilityOption<T extends { enabled?: boolean }>(\n value: T | undefined,\n): T | { enabled: false } {\n return value?.enabled === true ? value : { enabled: false };\n}\n\nfunction consumerObjectRef(\n manifestKey: string,\n objectDef: ConsumerObjectDefinition,\n): string | undefined {\n if (manifestKey.includes(':')) return manifestKey;\n if (objectDef.qualifiedName?.includes(':')) return objectDef.qualifiedName;\n if (objectDef.packageName && objectDef.className) {\n return `${objectDef.packageName}:${objectDef.className}`;\n }\n return undefined;\n}\n\n/**\n * Select exactly the dependency objects that a consumer explicitly hosts.\n * Validation completes before the generator clears its managed files, so an\n * invalid deployment cannot erase a previously generated route surface.\n */\nfunction selectConsumerRouteManifest(\n manifest: ConsumerManifest,\n options: SmrtConsumerSvelteKitOptions,\n): SmartObjectManifest {\n const entriesByRef = new Map<string, [string, ConsumerObjectDefinition]>();\n for (const [manifestKey, objectDef] of Object.entries(manifest.objects)) {\n const objectRef = consumerObjectRef(manifestKey, objectDef);\n if (objectRef) entriesByRef.set(objectRef, [manifestKey, objectDef]);\n }\n\n const selected = new Set<string>();\n const objects: Record<string, ConsumerObjectDefinition> = {};\n for (const objectRef of options.objects) {\n const entry = entriesByRef.get(objectRef);\n if (!entry) {\n throw new Error(\n `[smrt:consumer] svelteKit.objects references unknown dependency object ${JSON.stringify(objectRef)}`,\n );\n }\n if (selected.has(objectRef)) {\n throw new Error(\n `[smrt:consumer] svelteKit.objects contains duplicate object ${JSON.stringify(objectRef)}`,\n );\n }\n selected.add(objectRef);\n const [, objectDef] = entry;\n objects[objectRef] = { ...objectDef, qualifiedName: objectRef };\n }\n\n const sourceManifest = manifest as unknown as SmartObjectManifest;\n const collectionBySlot = new Map<\n string,\n { ref: string; className: string }\n >();\n // Use the generator's canonical ancestry resolver so a collection subclass\n // inherits the selected item's identity through any number of ancestors.\n for (const [manifestKey, objectDef] of Object.entries(manifest.objects)) {\n const candidate = objectDef as unknown as SmartObjectDefinition;\n if (!isCollectionManifestClass(sourceManifest, candidate)) continue;\n const item = resolveCollectionItemObject(sourceManifest, candidate);\n const itemEntry = item\n ? Object.entries(manifest.objects).find(\n ([, value]) => (value as unknown) === item,\n )\n : undefined;\n const itemRef = itemEntry\n ? consumerObjectRef(itemEntry[0], itemEntry[1])\n : undefined;\n if (!itemRef || !selected.has(itemRef)) continue;\n const collectionRef = consumerObjectRef(manifestKey, objectDef);\n if (!collectionRef) continue;\n // A collection class that inherits another's item type (`MaterialCollection\n // extends ProductCollection`, whose `SmrtCollection<Product>` generic is\n // authoritative) resolves to the SAME item and collection, so hosting both\n // would write the same custom-action routes twice (#3749). The class named\n // for the item stands for it, else the first in qualified order.\n const slot = `${itemRef}\\0${candidate.collection}`;\n const rival = collectionBySlot.get(slot);\n if (rival) {\n const conventional = `${item?.className}Collection`;\n if (\n candidate.className !== conventional ||\n rival.className === conventional\n ) {\n continue;\n }\n delete objects[rival.ref];\n }\n collectionBySlot.set(slot, {\n ref: collectionRef,\n className: candidate.className,\n });\n objects[collectionRef] = { ...objectDef, qualifiedName: collectionRef };\n }\n\n return {\n ...manifest,\n // The generated route config imports this full registration entry point so\n // SSR retains every consumer provider, while only `objects` reach routing.\n // `smrtDependencies` is optional in verified snapshots, so derive this\n // generator signal from the immutable full manifest rather than treating\n // absent metadata as an empty provider inventory.\n smrtDependencies: [\n ...new Set([\n ...(manifest.smrtDependencies ?? []),\n ...Object.values(manifest.objects)\n .map((objectDef) => objectDef.packageName)\n .filter(\n (packageName): packageName is string =>\n typeof packageName === 'string' &&\n packageName !== manifest.packageName,\n ),\n ]),\n ].sort(),\n objects,\n } as unknown as SmartObjectManifest;\n}\n\n/**\n * Consumer plugin for projects that use SMRT packages\n */\nexport function smrtConsumer(options: SmrtConsumerOptions = {}): Plugin {\n const {\n packages = [],\n generateTypes = true,\n typesDir = 'src/types/smrt-generated',\n projectRoot = process.cwd(),\n generationSnapshot,\n disableScanning = false,\n kebabRoutes = false,\n } = options;\n const consumerSvelteKit = consumerRouteOptions(options.svelteKit);\n // Hosted routes, the generated client, and web tool definitions must expose\n // the same custom-action URLs. Nested consumer SvelteKit hosting owns this\n // policy when present, including an explicit false override.\n const effectiveKebabRoutes = consumerSvelteKit?.kebabRoutes ?? kebabRoutes;\n\n let smrtPackages: string[] = [];\n let typeManifest: ConsumerManifest | null = null;\n let typesGenerated = false;\n let producerApi: SmrtPluginApi | undefined;\n let routeLifecycleConfig: object | undefined;\n let isBuild = false;\n let selectiveSsrPackages = new Map<string, SelectiveSsrPackage>();\n\n function loadGenerationSnapshot(): ConsumerManifest {\n if (!generationSnapshot) {\n throw new Error('[smrt:consumer] Generation snapshot is not configured');\n }\n return withHostedStiCollections(\n loadVerifiedSmrtGenerationSnapshot<ConsumerManifest>(\n generationSnapshot,\n projectRoot,\n 'dependencies',\n ),\n );\n }\n\n /**\n * Hosted STI subclasses get their own route collection (#3749), in every\n * manifest view the plugin derives, so routes, the generated client, the\n * `@smrt/web` definitions and the registration agree on the endpoint.\n */\n function withHostedStiCollections(manifest: ConsumerManifest) {\n return consumerSvelteKit\n ? separateHostedStiCollections(\n manifest,\n consumerSvelteKit.objects,\n (key, def) =>\n consumerObjectRef(key, def as unknown as ConsumerObjectDefinition),\n )\n : manifest;\n }\n\n async function aggregateHosted(\n ...args: Parameters<typeof aggregateTypeManifests>\n ): Promise<ConsumerManifest> {\n return withHostedStiCollections(await aggregateTypeManifests(...args));\n }\n\n /**\n * Resolve the packages to aggregate, and whether that list was asserted by\n * the consumer's config. An explicit list fails closed when a package\n * yields no manifest; a heuristically discovered one only warns.\n */\n async function resolveConsumerPackages(): Promise<{\n names: string[];\n explicit: boolean;\n }> {\n if (packages.length === 0 && !disableScanning) {\n return {\n names: await discoverSmrtPackages(projectRoot),\n explicit: false,\n };\n }\n return { names: packages, explicit: packages.length > 0 };\n }\n\n /**\n * Keep consumed providers and their SMRT runtime graph in Node's installed\n * package context during SSR. Native-backed dependencies (such as sharp)\n * resolve relative to that context, and keeping core/tenancy alongside the\n * provider prevents the server bundle from creating a second registry or\n * AsyncLocalStorage instance.\n */\n function resolveConsumerSsrExternalPackages(\n providerPackages: readonly string[],\n ): {\n external: string[];\n selective: Map<string, SelectiveSsrPackage>;\n } {\n const external = new Set<string>();\n const selective = new Map<string, SelectiveSsrPackage>();\n const visited = new Set<string>();\n const pending = providerPackages.map((packageName) => ({\n packageName,\n searchFrom: projectRoot,\n }));\n while (pending.length > 0) {\n const candidate = pending.pop();\n if (!candidate) continue;\n const { packageName, searchFrom } = candidate;\n\n const packageJsonPath = findInstalledPackageJson(packageName, searchFrom);\n const visitKey = packageJsonPath ?? `${searchFrom}\\0${packageName}`;\n if (visited.has(visitKey)) continue;\n visited.add(visitKey);\n\n // Manifest loading reports an unavailable or unreadable declared\n // provider with the actionable package context. Keep the root external\n // here so Vite does not inline a partial substitute while reporting\n // that error.\n const packageJson = readInstalledPackageJson(packageJsonPath);\n\n const needsSvelteCompilation = isComponentBearingPackage(packageJson);\n const projectPackageJson = findInstalledPackageJson(\n packageName,\n projectRoot,\n );\n const isAppResolvable = sameInstalledPackage(\n packageJsonPath,\n projectPackageJson,\n );\n\n // The preset owns app-runtime's finer split: its root and native runtime\n // stay external while ./sveltekit remains bundled with the app's Kit.\n // Component-bearing packages need an export-level boundary: their server\n // entries stay external while Svelte/CSS entries remain in Vite's graph.\n // A nested-only dependency cannot be emitted as a bare external import\n // because Node would resolve it from the app root, where pnpm has no link.\n if (\n packageName !== '@happyvertical/smrt-app-runtime' &&\n isAppResolvable\n ) {\n if (needsSvelteCompilation && packageJson) {\n selective.set(packageName, {\n packageJson,\n packageRoot: path.dirname(packageJsonPath as string),\n });\n } else {\n external.add(packageName);\n }\n }\n\n if (!packageJsonPath || !packageJson) continue;\n for (const dependencies of [\n packageJson.dependencies,\n packageJson.optionalDependencies,\n packageJson.peerDependencies,\n ]) {\n for (const dependency of Object.keys(dependencies ?? {})) {\n if (dependency.startsWith('@happyvertical/smrt-')) {\n pending.push({\n packageName: dependency,\n searchFrom: path.dirname(packageJsonPath),\n });\n }\n }\n }\n }\n return { external: [...external].sort(), selective };\n }\n\n function matchingExportTarget(\n exports: unknown,\n exportKey: string,\n ): { target: unknown; wildcard?: string } | undefined {\n if (!exports) return undefined;\n if (typeof exports === 'string') {\n return exportKey === '.' ? { target: exports } : undefined;\n }\n if (typeof exports !== 'object') return undefined;\n const exportMap = exports as Record<string, unknown>;\n if (exportKey in exportMap) return { target: exportMap[exportKey] };\n if (\n exportKey === '.' &&\n !Object.keys(exportMap).some((key) => key.startsWith('.'))\n ) {\n return { target: exportMap };\n }\n for (const [pattern, target] of Object.entries(exportMap)) {\n const wildcardIndex = pattern.indexOf('*');\n if (wildcardIndex < 0) continue;\n const prefix = pattern.slice(0, wildcardIndex);\n const suffix = pattern.slice(wildcardIndex + 1);\n if (exportKey.startsWith(prefix) && exportKey.endsWith(suffix)) {\n return {\n target,\n wildcard: exportKey.slice(\n prefix.length,\n exportKey.length - suffix.length,\n ),\n };\n }\n }\n }\n\n function svelteConditionTargets(value: unknown): string[] {\n if (!value || typeof value !== 'object') return [];\n return Object.entries(value).flatMap(([condition, target]) => {\n if (condition === 'svelte') {\n if (typeof target === 'string') return [target];\n return svelteConditionTargets(target);\n }\n return svelteConditionTargets(target);\n });\n }\n\n function resolvesToSvelteCondition(\n packageName: string,\n packageJson: ConsumerPackageJson,\n packageRoot: string,\n id: string,\n resolvedId: string | undefined,\n ): boolean {\n if (!resolvedId) return false;\n const exportKey =\n id === packageName ? '.' : `./${id.slice(packageName.length + 1)}`;\n const matched = matchingExportTarget(packageJson.exports, exportKey);\n const targets = matched ? svelteConditionTargets(matched.target) : [];\n if (exportKey === '.' && typeof packageJson.svelte === 'string') {\n targets.push(packageJson.svelte);\n }\n const normalizedResolved = resolvedId.split('?')[0];\n const canonical = (candidate: string): string =>\n fs.existsSync(candidate)\n ? fs.realpathSync(candidate)\n : path.resolve(candidate);\n return targets.some((target) => {\n const substituted = matched?.wildcard\n ? target.replaceAll('*', matched.wildcard)\n : target;\n return (\n canonical(path.resolve(packageRoot, substituted)) ===\n canonical(normalizedResolved)\n );\n });\n }\n\n async function generateConfigTypes(\n manifest?: ConsumerManifest,\n ): Promise<void> {\n if (!generateTypes || typesGenerated) return;\n\n if (manifest) {\n typeManifest = manifest;\n } else if (generationSnapshot) {\n typeManifest = loadGenerationSnapshot();\n } else {\n const resolved = await resolveConsumerPackages();\n typeManifest = await aggregateHosted(resolved.names, projectRoot, {\n explicit: resolved.explicit,\n });\n }\n await generateProjectTypes(typeManifest, typesDir, projectRoot);\n typesGenerated = true;\n }\n\n const plugin: Plugin = {\n name: 'smrt-consumer',\n\n // SvelteKit inventories routes in its config hook. Run before it so a\n // clean consumer build sees the explicit dependency routes on its first\n // invocation, even when sveltekit() appears first in vite.config.\n enforce: 'pre',\n\n config: {\n order: 'pre',\n async handler(userConfig, env) {\n const routeLifecycle = env ?? userConfig;\n routeLifecycleConfig = routeLifecycle;\n const consumerPackages = await resolveConsumerPackages();\n isBuild = env?.command === 'build';\n const ssrResolution = resolveConsumerSsrExternalPackages(\n consumerPackages.names,\n );\n selectiveSsrPackages = ssrResolution.selective;\n const previousConsumerRouteRoots =\n loadConsumerSvelteKitRouteRoots(projectRoot);\n if (consumerSvelteKit) {\n await assertConsumerSvelteKitFormerRouteRootsAreSafe(\n userConfig,\n projectRoot,\n previousConsumerRouteRoots,\n env,\n );\n const routeManifest = generationSnapshot\n ? loadGenerationSnapshot()\n : await aggregateHosted(consumerPackages.names, projectRoot, {\n explicit: consumerPackages.explicit,\n });\n const hostedManifest = selectConsumerRouteManifest(\n routeManifest,\n consumerSvelteKit,\n );\n const routesDir = canonicalConsumerRouteRoot(\n projectRoot,\n consumerSvelteKit.routesDir ?? 'src/routes/api',\n );\n const reservedRoutePaths = await activeProducerKnowledgeRoutePaths(\n userConfig,\n projectRoot,\n env,\n );\n const routeOptions = {\n enabled: true,\n routesDir,\n // Must equal the producer's, or the shared routesDir is refused.\n objectsDir: consumerSvelteKit.objectsDir ?? 'src/lib/objects',\n configPath: consumerSvelteKit.configPath ?? 'src/lib/server',\n configFileName: consumerSvelteKit.configFileName ?? 'smrt.ts',\n kebabRoutes: effectiveKebabRoutes,\n // These span a model set rather than one selected object, so new\n // consumer hosting starts fail-closed. Callers can opt in with the\n // generator's established option shapes.\n changesRoute: consumerUtilityOption(consumerSvelteKit.changesRoute),\n eventsRoute: consumerUtilityOption(consumerSvelteKit.eventsRoute),\n resourcesRoute: consumerUtilityOption(\n consumerSvelteKit.resourcesRoute,\n ),\n rejectRouteCollisions: true,\n };\n let ownershipJournaled = false;\n let reconciliationScheduled = false;\n await contributeSvelteKitRoutes(\n routeLifecycle,\n await expectedSvelteKitRouteOwners(\n userConfig,\n projectRoot,\n routeOptions.routesDir,\n env,\n ),\n projectRoot,\n {\n owner: 'consumer',\n routeManifest: hostedManifest,\n semanticManifest: routeManifest as unknown as SmartObjectManifest,\n options: routeOptions,\n reservedRoutePaths,\n beforeCleanup: async () => {\n // Route selection and collision checks have succeeded, but no\n // generated output has changed. SvelteKit type checking still\n // runs after this config hook and needs these declarations.\n await generateConfigTypes(routeManifest);\n // The generated TS registration imports this runtime module.\n // SvelteKit sync must resolve it before Vite buildStart runs.\n await generateRegistrationFile(routeManifest, projectRoot);\n if (ownershipJournaled) return;\n ownershipJournaled = true;\n // Preflight has succeeded but no generated output has changed.\n // Keep both roots until old-root reconciliation commits.\n publishConsumerSvelteKitRouteRoots(projectRoot, [\n ...previousConsumerRouteRoots,\n routesDir,\n ]);\n },\n afterGenerate: async () => {\n if (reconciliationScheduled) return;\n reconciliationScheduled = true;\n const priorRoots = previousConsumerRouteRoots.filter(\n (previousRoot) => previousRoot !== routesDir,\n );\n await reconcileConsumerSvelteKitRouteRoots(\n routeLifecycle,\n userConfig,\n projectRoot,\n priorRoots,\n () =>\n publishConsumerSvelteKitRouteRoots(projectRoot, [\n routesDir,\n ]),\n env,\n );\n },\n },\n );\n } else {\n // Legacy/non-hosting SvelteKit consumers have no route preflight,\n // but still need physical virtual-module declarations before their\n // SvelteKit typecheck reaches Vite's later buildStart lifecycle.\n await generateConfigTypes();\n if (options.svelteKit && typeManifest) {\n await generateRegistrationFile(typeManifest, projectRoot);\n }\n if (previousConsumerRouteRoots.length > 0) {\n await reconcileConsumerSvelteKitRouteRoots(\n routeLifecycle,\n userConfig,\n projectRoot,\n previousConsumerRouteRoots,\n () => removeConsumerSvelteKitRouteRoots(projectRoot),\n env,\n );\n }\n }\n return {\n // This applies only to SSR. Client and Svelte-component builds still\n // compile provider exports normally, while Node keeps provider JS and\n // every shared SMRT runtime dependency in one pnpm package context.\n ssr: {\n external: ssrResolution.external,\n noExternal: [...selectiveSsrPackages.keys()].sort(),\n },\n build: {\n rollupOptions: {\n // Runtime registration evaluates provider entry points so their\n // exact constructors can be registered. Leave optional native\n // provider binaries to Node instead of parsing them as JavaScript.\n external: [/\\.node$/],\n },\n },\n };\n },\n },\n\n configResolved(resolvedConfig) {\n if (consumerSvelteKit && routeLifecycleConfig) {\n assertSvelteKitRouteCoordinationComplete(routeLifecycleConfig);\n }\n producerApi = (resolvedConfig.plugins ?? []).find(\n (plugin) => plugin?.name === 'smrt-auto-service',\n )?.api as SmrtPluginApi | undefined;\n },\n\n async buildStart() {\n console.log('[smrt:consumer] Initializing SMRT consumer plugin');\n\n if (generationSnapshot) {\n typeManifest = loadGenerationSnapshot();\n console.log(\n `[smrt:consumer] Reusing verified generation snapshot (${generationSnapshot.provenance})`,\n );\n await generateRegistrationFile(typeManifest, projectRoot);\n if (generateTypes && !typesGenerated) {\n await generateProjectTypes(typeManifest, typesDir, projectRoot);\n typesGenerated = true;\n }\n return;\n }\n\n // Discover SMRT packages if not explicitly specified\n const resolvedPackages = await resolveConsumerPackages();\n smrtPackages = resolvedPackages.names;\n\n if (smrtPackages.length > 0) {\n console.log(\n `[smrt:consumer] Found SMRT packages: ${smrtPackages.join(', ')}`,\n );\n\n // Aggregate type manifests from discovered packages\n typeManifest = await aggregateHosted(smrtPackages, projectRoot, {\n explicit: resolvedPackages.explicit,\n });\n // Wait before reading .smrt/manifest.json: a producer's parallel\n // buildStart writes its current local manifest after scanning. Reading\n // first could merge an older local manifest with a newer surface.\n const agentSurface = producerApi\n ? await producerApi.resolveKnowledgeAgentSurface()\n : undefined;\n\n // Save aggregated manifest for CLI discovery\n await saveAggregatedManifest(\n typeManifest,\n projectRoot,\n producerApi?.resolveKnowledgeConfig,\n agentSurface,\n );\n\n // Generate registration file for CLI class loading\n await generateRegistrationFile(typeManifest, projectRoot);\n\n // Generate types if requested\n if (generateTypes && !typesGenerated) {\n await generateProjectTypes(typeManifest, typesDir, projectRoot);\n typesGenerated = true;\n }\n } else {\n console.log('[smrt:consumer] No SMRT packages found');\n typeManifest = {\n version: '1.0.0',\n timestamp: MANIFEST_TIMESTAMP,\n objects: {},\n };\n }\n },\n\n async resolveId(id, importer, resolveOptions) {\n if (isBuild && resolveOptions.ssr) {\n for (const [packageName, selectivePackage] of selectiveSsrPackages) {\n if (id !== packageName && !id.startsWith(`${packageName}/`)) {\n continue;\n }\n const resolved = await this.resolve(id, importer, {\n ...resolveOptions,\n skipSelf: true,\n });\n const compile =\n resolved?.id.endsWith('.svelte') || resolved?.id.endsWith('.css');\n const compileSvelteBarrel = resolvesToSvelteCondition(\n packageName,\n selectivePackage.packageJson,\n selectivePackage.packageRoot,\n id,\n resolved?.id,\n );\n if (!compile && !compileSvelteBarrel) return { id, external: true };\n break;\n }\n }\n // Resolve virtual modules to generated type declarations\n if (id in VIRTUAL_MODULES) {\n // Generated declarations are ambient TypeScript declarations, not\n // executable JavaScript. Vite must always load the consumer runtime\n // module after default type generation writes them.\n if (id !== '@smrt/types') {\n return `\\0${VIRTUAL_MODULES[id as keyof typeof VIRTUAL_MODULES]}`;\n }\n\n const typeFileName = getTypeFileName(id);\n const typePath = path.join(projectRoot, typesDir, typeFileName);\n\n // If types file exists, resolve to it\n if (fs.existsSync(typePath)) {\n return typePath;\n }\n\n // Otherwise use virtual module ID for runtime resolution\n return `\\0${VIRTUAL_MODULES[id as keyof typeof VIRTUAL_MODULES]}`;\n }\n return null;\n },\n\n async load(id) {\n // Handle virtual modules if types aren't available\n const cleanId = id.startsWith('\\0') ? id.slice(1) : id;\n\n if (!typeManifest) {\n typeManifest = generationSnapshot\n ? loadGenerationSnapshot()\n : {\n version: '1.0.0',\n timestamp: MANIFEST_TIMESTAMP,\n objects: {},\n };\n }\n\n switch (cleanId) {\n case 'smrt-consumer:routes':\n return generateFallbackRoutesModule();\n\n case 'smrt-consumer:client':\n return generateFallbackClientModule(typeManifest, {\n kebabRoutes: effectiveKebabRoutes,\n });\n\n case 'smrt-consumer:mcp':\n return generateFallbackMcpModule();\n\n case 'smrt-consumer:types':\n return generateFallbackTypesModule(typeManifest);\n\n case 'smrt-consumer:manifest':\n return generateFallbackManifestModule(typeManifest);\n\n case 'smrt-consumer:web':\n return generateWebModule(\n typeManifest as unknown as SmartObjectManifest,\n {\n kebabRoutes: effectiveKebabRoutes,\n },\n );\n\n default:\n return null;\n }\n },\n };\n markSvelteKitRouteParticipant(\n plugin,\n 'consumer',\n Boolean(consumerSvelteKit),\n consumerSvelteKit?.routesDir ?? 'src/routes/api',\n undefined,\n () => projectRoot,\n );\n return plugin;\n}\n\n/**\n * Discover SMRT packages from a consumer app's dependencies.\n *\n * Intentional split (#1579): this **consumer-plugin** path is async and\n * resolves SMRT packages from the downstream app's `package.json` dependency\n * names (`@have/`/`smrt` heuristic + `hasSmrtManifest` probe) inside the Vite\n * consumer plugin. It is deliberately separate from the build-time\n * `discoverSmrtPackages()` in `src/manifest/discover-smrt-packages.ts` — a\n * synchronous, lockfile-cached `node_modules` manifest scan used for manifest\n * generation. Different inputs, contexts, and lifecycles, not duplicated logic.\n */\nasync function discoverSmrtPackages(projectRoot: string): Promise<string[]> {\n const packages: string[] = [];\n const nodeModulesPath = path.join(projectRoot, 'node_modules');\n\n if (!fs.existsSync(nodeModulesPath)) {\n return packages;\n }\n\n try {\n // Check package.json for workspace dependencies\n const packageJsonPath = path.join(projectRoot, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n };\n\n // Look for packages that likely contain SMRT objects\n for (const [name, version] of Object.entries(allDeps)) {\n if (\n typeof version === 'string' &&\n (name.includes('smrt') ||\n name.includes('@have/') ||\n (await hasSmrtManifest(nodeModulesPath, name)))\n ) {\n packages.push(name);\n }\n }\n }\n } catch (error) {\n console.warn('[smrt:consumer] Error discovering packages:', error);\n }\n\n return packages;\n}\n\n/**\n * Manifest locations probed for a consumed package, in preference order.\n *\n * The package's own `package.json#exports` map comes first: it is the\n * published contract for where the manifest lives, and a package whose build\n * emits outside this framework's conventional layout (for example\n * `\"./manifest.json\": \"./dist/lib/manifest.json\"`) is otherwise skipped\n * entirely (issue #2923). The conventional paths remain as a fallback for\n * packages that ship a manifest without exporting a subpath for it.\n */\nfunction legacyStaticManifestPath(packageDir: string): string {\n return path.join(packageDir, 'dist', 'manifest', 'static-manifest.js');\n}\n\nfunction packageManifestCandidates(\n packageDir: string,\n packageJson?: ConsumerPackageJson,\n): string[] {\n return [\n ...manifestExportCandidates(packageDir, packageJson),\n legacyStaticManifestPath(packageDir),\n path.join(packageDir, 'dist', 'manifest.json'),\n path.join(packageDir, 'manifest.json'),\n ];\n}\n\n/**\n * Whether a dependency looks like a SMRT package, for the name-heuristic\n * discovery path only.\n *\n * This decides whether a package this framework knows nothing about is pulled\n * into aggregation at all, so mere existence of a manifest-shaped file is not\n * enough: `manifest.json` at a package root or `dist/manifest.json` is a\n * common artifact of unrelated tooling (Vite build manifests, PWA and\n * extension manifests). A false positive would announce a stranger under\n * \"Found SMRT packages\", tell the user to publish a manifest for a package\n * that has nothing to do with SMRT, and — for a JS candidate — evaluate that\n * dependency's module inside the build.\n *\n * A JSON candidate is therefore confirmed by parsing it and requiring\n * `moduleType: 'smrt'`, matching what build-time discovery requires. A JS\n * candidate cannot be identified without importing it, which is the thing\n * being avoided, so only the historical `dist/manifest/static-manifest.js`\n * location counts — exactly the probe this function used before #2923.\n */\nasync function hasSmrtManifest(\n nodeModulesPath: string,\n packageName: string,\n): Promise<boolean> {\n const packagePath = path.join(nodeModulesPath, packageName);\n const legacyStaticManifest = legacyStaticManifestPath(packagePath);\n\n for (const manifestPath of packageManifestCandidates(packagePath)) {\n if (!fs.existsSync(manifestPath)) continue;\n\n if (!manifestPath.endsWith('.json')) {\n if (manifestPath === legacyStaticManifest) return true;\n continue;\n }\n\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as {\n moduleType?: string;\n };\n if (manifest?.moduleType === 'smrt') return true;\n } catch {\n // Not a readable SMRT manifest; keep probing the remaining candidates.\n }\n }\n\n return false;\n}\n\n/**\n * Aggregate type manifests from multiple packages.\n *\n * A package that yields no usable manifest is never dropped silently\n * (issue #2923): an explicitly listed package fails the build, and a\n * heuristically discovered one warns by name. Silence here surfaces much\n * later as missing tables, routes, and generated types with nothing in the\n * build log to connect them to the package that was skipped.\n *\n * @param packages - Package names to aggregate.\n * @param projectRoot - Consumer project root containing `node_modules`.\n * @param options - `explicit` marks a caller-supplied `packages` list, whose\n * entries are assertions rather than guesses and therefore fail closed.\n */\nasync function aggregateTypeManifests(\n packages: string[],\n projectRoot: string,\n options: { explicit?: boolean } = {},\n): Promise<ConsumerManifest> {\n const aggregatedManifest: ConsumerManifest = {\n version: '1.0.0',\n timestamp: MANIFEST_TIMESTAMP,\n smrtDependencies: [...packages],\n objects: {},\n };\n\n const unresolvedPackages: string[] = [];\n const objectSources = new Map<string, string>();\n\n for (const packageName of packages) {\n let loadedManifest = false;\n try {\n // Load package.json for version and export information\n const packageJsonPath = findInstalledPackageJson(\n packageName,\n projectRoot,\n );\n if (!packageJsonPath) {\n console.warn(\n `[smrt:consumer] Could not read package.json for ${packageName}`,\n );\n unresolvedPackages.push(packageName);\n continue;\n }\n const packageDir = path.dirname(packageJsonPath);\n let packageJson: ConsumerPackageJson;\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8');\n packageJson = JSON.parse(packageJsonContent) as ConsumerPackageJson;\n } catch {\n console.warn(\n `[smrt:consumer] Could not read package.json for ${packageName}`,\n );\n unresolvedPackages.push(packageName);\n continue;\n }\n\n // Try the package's declared manifest export first, then convention.\n const manifestCandidates = packageManifestCandidates(\n packageDir,\n packageJson,\n );\n\n for (const manifestPath of manifestCandidates) {\n if (fs.existsSync(manifestPath)) {\n // Import or read the manifest. A candidate that exists but cannot be\n // read, parsed, or imported must not end the search: the export map\n // is probed before the conventional paths, so letting one stale or\n // malformed exported target throw out of this loop would take away\n // the `dist/manifest.json` fallback a package used to load through.\n let manifest: Partial<ConsumerManifest> | undefined;\n try {\n if (manifestPath.endsWith('.js')) {\n const manifestModule = await import(manifestPath);\n manifest =\n manifestModule.staticManifest || manifestModule.default;\n } else {\n const manifestContent = fs.readFileSync(manifestPath, 'utf-8');\n manifest = JSON.parse(\n manifestContent,\n ) as Partial<ConsumerManifest>;\n }\n } catch (error) {\n console.warn(\n `[smrt:consumer] Could not load manifest candidate ${manifestPath} for ${packageName}; trying the next location:`,\n error,\n );\n continue;\n }\n\n if (manifest?.objects) {\n console.log(\n `[smrt:consumer] Loaded manifest from ${packageName} (${Object.keys(manifest.objects).length} objects)`,\n );\n\n // ENHANCED: Preserve package metadata for each object\n for (const [objectName, objectDef] of Object.entries(\n manifest.objects,\n )) {\n const def = objectDef;\n const importPath =\n def.importPath || determineImportPath(packageJson);\n const importPackageName = importPath.startsWith('@')\n ? importPath.split('/').slice(0, 2).join('/')\n : importPath.split('/')[0];\n const sourcePackageJson =\n importPackageName === packageName ? packageJsonPath : undefined;\n const resolvedSourcePackageJson =\n sourcePackageJson ??\n findInstalledPackageJson(importPackageName, packageDir);\n const sourceIdentity = resolvedSourcePackageJson\n ? fs.realpathSync(resolvedSourcePackageJson)\n : `${packageName}\\0${importPackageName}`;\n const priorSource = objectSources.get(objectName);\n if (priorSource && priorSource !== sourceIdentity) {\n throw new AmbiguousProviderGraphError(\n `[smrt:consumer] ${objectName} is contributed by multiple installed provider graphs; refusing ambiguous constructor identity`,\n );\n }\n if (priorSource) continue;\n objectSources.set(objectName, sourceIdentity);\n\n aggregatedManifest.objects[objectName] = {\n ...def,\n // Ensure package metadata is preserved/set\n packageName:\n def.packageName || manifest.packageName || packageName,\n packageVersion:\n def.packageVersion ||\n manifest.packageVersion ||\n packageJson.version,\n // Add fallback import paths if missing\n importPath,\n providerPackageName: packageName,\n exportName: def.exportName || def.className || objectName,\n collectionExportName:\n def.collectionExportName ||\n `${def.className || objectName}Collection`,\n };\n }\n\n loadedManifest = true;\n break; // Use first found manifest for this package\n }\n }\n }\n } catch (error) {\n if (error instanceof AmbiguousProviderGraphError) throw error;\n console.warn(\n `[smrt:consumer] Error loading manifest from ${packageName}:`,\n error,\n );\n }\n\n if (!loadedManifest) {\n unresolvedPackages.push(packageName);\n }\n }\n\n if (unresolvedPackages.length > 0) {\n const named = unresolvedPackages.join(', ');\n if (options.explicit) {\n throw new Error(\n `[smrt:consumer] No SMRT manifest could be resolved for ${named}. ` +\n 'Listed packages must publish a manifest through ' +\n 'package.json#exports (\"./manifest.json\") or at dist/manifest.json, ' +\n 'dist/manifest/static-manifest.js, or manifest.json. Build the ' +\n 'package, or remove it from smrtConsumer({ packages }).',\n );\n }\n // Discovery matches on dependency name, so a hit here is a guess: some\n // matched packages (UI/runtime helpers) legitimately have no objects.\n // Name them anyway — a missing manifest is otherwise invisible until the\n // objects turn up absent from routes and schema.\n console.warn(\n `[smrt:consumer] No SMRT manifest could be resolved for ${named}; ` +\n 'contributing 0 objects. If the package provides SMRT objects, ' +\n 'publish its manifest through package.json#exports (\"./manifest.json\").',\n );\n }\n\n return aggregatedManifest;\n}\n\n/**\n * Determine import path from package.json\n */\nfunction determineImportPath(packageJson: ConsumerPackageJson): string {\n const packageName = packageJson.name;\n\n if (!packageName) {\n throw new Error('Package name not found in package.json');\n }\n\n // Strategy 1: Check for specific exports\n if (packageJson.exports) {\n // Check for objects export\n if (packageJson.exports['./objects']) {\n return `${packageName}/objects`;\n }\n\n // Check for main export\n const mainExport = packageJson.exports['.'];\n if (mainExport) {\n // Handle conditional exports\n if (typeof mainExport === 'object' && mainExport !== null) {\n const conditional = mainExport as Record<string, unknown>;\n if (conditional.import) {\n return packageName;\n }\n if (conditional.default) {\n return packageName;\n }\n }\n return packageName;\n }\n }\n\n // Strategy 2: Check main field\n if (packageJson.main) {\n return packageName;\n }\n\n // Strategy 3: Fallback to package name\n return packageName;\n}\n\n/**\n * Save aggregated manifest to .smrt/manifest.json for CLI discovery.\n *\n * Merge-preserving: `smrtPlugin()` writes the project's own scanned objects\n * to the same file (`writeLocalManifest`, issue #963), and both writes happen\n * in parallel `buildStart` hooks — so a plain overwrite here would clobber\n * the local objects whenever this plugin's write lands last (issue #1760\n * review). Local field metadata would then silently vanish from CLI schema\n * commands and from server runtimes that seed `.smrt/manifest.json`, dropping\n * domain columns on write. This function therefore only ADDS/refreshes the\n * external-package entries it owns and preserves everything else already in\n * the file (including the top-level `packageName` the local write sets).\n */\nasync function saveAggregatedManifest(\n manifest: ConsumerManifest,\n projectRoot: string,\n resolveKnowledgeConfig?: SmrtPluginApi['resolveKnowledgeConfig'],\n agentSurface?: DomainKnowledgeAgentSurface,\n): Promise<void> {\n const smrtDir = path.join(projectRoot, '.smrt');\n const manifestPath = path.join(smrtDir, 'manifest.json');\n\n try {\n // Create .smrt directory if it doesn't exist\n if (!fs.existsSync(smrtDir)) {\n fs.mkdirSync(smrtDir, { recursive: true });\n }\n\n // Merge with whatever is on disk: existing entries (typically the local\n // project's objects written by smrtPlugin) are preserved; aggregated\n // external entries win for the qualified names this plugin owns.\n let merged: ConsumerManifest = manifest;\n if (fs.existsSync(manifestPath)) {\n try {\n const existing = JSON.parse(\n fs.readFileSync(manifestPath, 'utf-8'),\n ) as Partial<ConsumerManifest>;\n if (existing && typeof existing.objects === 'object') {\n merged = {\n ...existing,\n ...manifest,\n // The aggregated manifest carries no packageName; keep the local\n // project's (used as the manifest cache key at runtime).\n ...(existing.packageName\n ? { packageName: existing.packageName }\n : {}),\n objects: { ...existing.objects, ...manifest.objects },\n };\n }\n } catch {\n // Unreadable/corrupt existing file — fall back to a plain write.\n }\n }\n\n // smrtPlugin writes the local knowledge artifact before this consumer\n // plugin merges external package entries into the same manifest. Refresh\n // the artifact from the merged manifest so its source hash always names\n // the manifest that CLI discovery and server runtimes actually consume.\n // The consumer deliberately does not load the scanner. Only carry a\n // surface from the current producer scan: a prior artifact can describe\n // declarations that have since changed while retaining the same path.\n // Re-hashing that current path under a stale declaration would make an\n // incorrect agent contract look fresh.\n const knowledgePath = path.join(smrtDir, 'smrt-knowledge.json');\n const packageJsonPath = path.join(projectRoot, 'package.json');\n const packageJson = fs.existsSync(packageJsonPath)\n ? JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n : undefined;\n const knowledgeConfig = resolveKnowledgeConfig\n ? await resolveKnowledgeConfig(merged as unknown as SmartObjectManifest)\n : await resolveFileKnowledgeConfig(\n projectRoot,\n merged.packageName ?? packageJson?.name,\n );\n if (knowledgeConfig.enabled === false) {\n publishArtifactFiles([\n { path: manifestPath, content: JSON.stringify(merged, null, 2) },\n ]);\n return;\n }\n const knowledge = buildDomainKnowledgeManifest({\n manifest: merged as unknown as SmartObjectManifest,\n rootDir: projectRoot,\n packageJson,\n manifestPath,\n config: knowledgeConfig,\n agentSurface,\n });\n // Stage both artifacts before replacing either. Renames are individually\n // atomic; if a synchronous later rename fails, restore every earlier\n // replacement. A process crash between renames cannot be made pair-atomic\n // with ordinary filesystem operations, so the next generation remains the\n // freshness repair path for that distinct failure mode.\n publishArtifactFiles([\n { path: knowledgePath, content: JSON.stringify(knowledge, null, 2) },\n { path: manifestPath, content: JSON.stringify(merged, null, 2) },\n ]);\n\n console.log(\n `[smrt:consumer] Saved aggregated manifest to .smrt/manifest.json (${Object.keys(merged.objects).length} objects)`,\n );\n } catch (error) {\n throw new Error('[smrt:consumer] Failed to save aggregated manifest', {\n cause: error,\n });\n }\n}\n\n/**\n * Generate registration file for CLI class loading\n *\n * Creates .smrt/register.js with static imports and registrations\n * for all external SMRT objects discovered during build.\n */\nasync function generateRegistrationFile(\n manifest: ConsumerManifest,\n projectRoot: string,\n): Promise<void> {\n const smrtDir = path.join(projectRoot, '.smrt');\n const registerPath = path.join(smrtDir, 'register.js');\n\n // Bind every imported symbol to a generated local name. Aggregated manifests\n // may contain same-named exports from different packages (and may list a\n // collection both beside its object and as its own manifest entry), so using\n // provider export names as local bindings can produce invalid duplicate\n // imports in a production consumer bundle.\n const importBindings = new Map<string, string>();\n const importsByPath = new Map<string, Map<string, string>>();\n const transitiveNamespaces = new Map<\n string,\n { binding: string; providerPackageName: string; importPath: string }\n >();\n const transitiveBindings = new Map<\n string,\n { binding: string; namespaceBinding: string; exportName: string }\n >();\n const transitiveCollectionChecks: Array<{\n collectionBinding: string;\n itemBinding: string;\n }> = [];\n let nextImportBinding = 0;\n const getImportBinding = (importPath: string, exportName: string): string => {\n const key = `${importPath}\\0${exportName}`;\n const existing = importBindings.get(key);\n if (existing) return existing;\n const binding = `__smrt_consumer_${nextImportBinding++}`;\n importBindings.set(key, binding);\n const specifiers =\n importsByPath.get(importPath) ?? new Map<string, string>();\n specifiers.set(exportName, binding);\n importsByPath.set(importPath, specifiers);\n return binding;\n };\n const getTransitiveBinding = (\n importPath: string,\n providerPackageName: string,\n exportName: string,\n ): string => {\n const namespaceKey = `${providerPackageName}\\0${importPath}`;\n let namespace = transitiveNamespaces.get(namespaceKey);\n if (!namespace) {\n namespace = {\n binding: `__smrt_transitive_provider_${transitiveNamespaces.size}`,\n providerPackageName,\n importPath,\n };\n transitiveNamespaces.set(namespaceKey, namespace);\n }\n const key = `${namespaceKey}\\0${exportName}`;\n const existing = transitiveBindings.get(key);\n if (existing) return existing.binding;\n const binding = `__smrt_consumer_${nextImportBinding++}`;\n transitiveBindings.set(key, {\n binding,\n namespaceBinding: namespace.binding,\n exportName,\n });\n return binding;\n };\n const isSameProjectAndProviderImport = (\n importPath: string,\n providerPackageName?: string,\n ): boolean => {\n const importPackageName = packageNameFromImportPath(importPath);\n const projectPackageJson = findInstalledPackageJson(\n importPackageName,\n projectRoot,\n );\n if (!providerPackageName) return Boolean(projectPackageJson);\n\n const providerPackageJson = findInstalledPackageJson(\n providerPackageName,\n projectRoot,\n );\n if (!providerPackageJson) return false;\n const providerImportPackageJson =\n importPackageName === providerPackageName\n ? providerPackageJson\n : findInstalledPackageJson(\n importPackageName,\n path.dirname(providerPackageJson),\n );\n return sameInstalledPackage(projectPackageJson, providerImportPackageJson);\n };\n\n const registrations: string[] = [];\n const registrationManifests: Record<string, ConsumerManifest> = {};\n let importedEntryCount = 0;\n let registeredObjectCount = 0;\n\n const manifestObjects = manifest.objects;\n const manifestObjectLookup = new Map<string, ConsumerObjectDefinition>();\n for (const [key, def] of Object.entries(manifestObjects)) {\n const candidate = def;\n const lookupKeys = [\n key,\n key.includes(':') ? key.split(':').pop() : undefined,\n candidate.qualifiedName,\n candidate.className,\n candidate.exportName,\n ];\n\n for (const lookupKey of lookupKeys) {\n if (lookupKey && !manifestObjectLookup.has(lookupKey)) {\n manifestObjectLookup.set(lookupKey, candidate);\n }\n }\n }\n\n const collectionClassMemo = new WeakMap<object, boolean>();\n const svelteRootImportWarnings = new Set<string>();\n // External objects imported from a package ROOT, grouped by package, so the\n // Svelte-root warning below can name every affected object once per package.\n const rootImportedObjects = new Map<string, string[]>();\n for (const [objectName, def] of Object.entries(manifestObjects)) {\n if (!def.packageName || def.packageName === manifest.packageName) continue;\n const objectImportPath = def.importPath || def.packageName;\n if (objectImportPath !== packageNameFromImportPath(objectImportPath)) {\n continue;\n }\n const names = rootImportedObjects.get(objectImportPath) ?? [];\n names.push(def.className || def.exportName || objectName);\n names.sort((left, right) => left.localeCompare(right));\n rootImportedObjects.set(objectImportPath, names);\n }\n\n const isCollectionClass = (\n def: ConsumerObjectDefinition | undefined,\n seen = new Set<string>(),\n ): boolean => {\n if (!def || typeof def !== 'object') {\n return false;\n }\n\n const cached = collectionClassMemo.get(def);\n if (cached !== undefined) {\n return cached;\n }\n\n if (\n def?.extends === 'SmrtCollection' ||\n def?.extendsTypeArg !== undefined\n ) {\n collectionClassMemo.set(def, true);\n return true;\n }\n\n const parentName = def?.extendsQualified || def?.extends;\n if (!parentName || seen.has(parentName)) {\n collectionClassMemo.set(def, false);\n return false;\n }\n seen.add(parentName);\n\n const parentDef = manifestObjectLookup.get(parentName);\n const isCollection = parentDef ? isCollectionClass(parentDef, seen) : false;\n collectionClassMemo.set(def, isCollection);\n\n return isCollection;\n };\n\n for (const [objectName, objectDef] of Object.entries(manifestObjects)) {\n const def = objectDef;\n\n // Skip local objects (they're imported from local entry point)\n if (!def.packageName || def.packageName === manifest.packageName) {\n continue;\n }\n\n const importPath = def.importPath || def.packageName;\n const exportName = def.exportName || def.className || objectName;\n const collectionExportName = def.collectionExportName;\n const hasCollection = def.hasCollection; // Check if collection class actually exists\n const tableName = def.collection || objectName.toLowerCase();\n const qualifiedName =\n def.qualifiedName ||\n (objectName.includes(':')\n ? objectName\n : `${def.packageName}:${def.className || exportName}`);\n\n const providerPackageName = def.providerPackageName;\n const appResolvable = isSameProjectAndProviderImport(\n importPath,\n providerPackageName,\n );\n if (!appResolvable && !providerPackageName) {\n throw new Error(\n `[smrt:consumer] ${objectName} has no configured provider provenance for ${importPath}`,\n );\n }\n // An object exported only from a root the package declares as a Svelte\n // entry leaves the register no server-safe module to import: the root\n // import (static, or transitive through the owning provider's context)\n // is the only way to reach the constructor, so it is kept. Vite SSR\n // works; plain Node (`smrt db:migrate`, workers) can load it only when\n // that root really is Node-safe, which the declaration cannot prove\n // either way. Say so once per package rather than failing a build whose\n // consumer may never run outside Vite (#4219).\n if (\n importPath === packageNameFromImportPath(importPath) &&\n !svelteRootImportWarnings.has(importPath)\n ) {\n svelteRootImportWarnings.add(importPath);\n const providerPackageJsonPath = appResolvable\n ? undefined\n : findInstalledPackageJson(providerPackageName as string, projectRoot);\n const rootPackageJsonPath = appResolvable\n ? findInstalledPackageJson(importPath, projectRoot)\n : providerPackageJsonPath &&\n findInstalledPackageJson(\n importPath,\n path.dirname(providerPackageJsonPath),\n );\n if (\n isComponentBearingRoot(readInstalledPackageJson(rootPackageJsonPath))\n ) {\n console.warn(\n `[smrt:consumer] ${importPath} declares a Svelte root entry (a \"svelte\" field, or a \"svelte\" condition or a .svelte/.css target on its \".\" export) and exports ${(rootImportedObjects.get(importPath) ?? [objectName]).join(', ')} only from that root; .smrt/register.js keeps the root import${appResolvable ? '' : ` (loaded through ${providerPackageName})`}. Verify that root loads under plain Node (smrt db:migrate, task/schedule workers), or publish the package's @smrt() objects from a ./models or ./objects export.`,\n );\n }\n }\n const exportBinding = appResolvable\n ? getImportBinding(importPath, exportName)\n : getTransitiveBinding(\n importPath,\n providerPackageName as string,\n exportName,\n );\n const collectionBinding =\n hasCollection && collectionExportName\n ? appResolvable\n ? getImportBinding(importPath, collectionExportName)\n : getTransitiveBinding(\n importPath,\n providerPackageName as string,\n collectionExportName,\n )\n : undefined;\n if (!appResolvable && collectionBinding) {\n transitiveCollectionChecks.push({\n collectionBinding,\n itemBinding: exportBinding,\n });\n }\n importedEntryCount++;\n\n if (isCollectionClass(def)) {\n continue;\n }\n\n const logicalName = def.className || exportName;\n registrationManifests[objectName] = {\n ...manifest,\n packageName: def.packageName,\n packageVersion: def.packageVersion || manifest.packageVersion,\n objects: { [objectName]: def },\n };\n\n // Import evaluation triggers the provider decorator first. The explicit\n // constructor/package/key tuple then promotes that exact constructor with\n // its isolated manifest, which is stable across Rollup name deconfliction.\n registrations.push(\n `if (${exportBinding}) ObjectRegistry.register(${exportBinding}, { name: ${JSON.stringify(logicalName)}, packageName: ${JSON.stringify(def.packageName)}, _manifest: smrtRegistrationManifests[${JSON.stringify(objectName)}], _manifestKey: ${JSON.stringify(objectName)} });`,\n );\n\n // Only register collection if it exists\n if (collectionBinding) {\n registrations.push(\n `if (${collectionBinding}) {\n ObjectRegistry.registerCollection(${JSON.stringify(qualifiedName)}, ${collectionBinding});\n ObjectRegistry.registerCollection(${JSON.stringify(tableName)}, ${collectionBinding});\n}`,\n );\n }\n\n registeredObjectCount++;\n }\n\n // Configured providers remain ordinary static imports so each is evaluated\n // in Node's installed package context (#4187); transitive-only object\n // modules are loaded below through their owning provider context. The\n // register must stay loadable under plain Node (`smrt db:migrate`, workers,\n // `.smrt/runtime/register.js`), so a root the provider declares as a Svelte\n // entry is never imported: its object entries already imported above\n // establish the context (#4219).\n for (const packageName of manifest.smrtDependencies ?? []) {\n if (!isSameProjectAndProviderImport(packageName, packageName)) continue;\n const contextImport = resolveProviderContextImport(\n packageName,\n readInstalledPackageJson(\n findInstalledPackageJson(packageName, projectRoot),\n ),\n );\n if (!contextImport || importsByPath.has(contextImport)) continue;\n importsByPath.set(contextImport, new Map());\n }\n\n // Skip generation if no external entries\n if (importedEntryCount === 0) {\n console.log('[smrt:consumer] No external entries - skipping register.js');\n return;\n }\n\n const registeredObjectLabel =\n registeredObjectCount === 1 ? 'object' : 'objects';\n const sortedImports = Array.from(importsByPath.entries()).sort(\n ([left], [right]) => left.localeCompare(right),\n );\n const imports = sortedImports.map(\n ([importPath], index) =>\n `import * as __smrt_provider_${index} from '${importPath}';`,\n );\n const importDeclarations = sortedImports.flatMap(([, specifiers], index) =>\n Array.from(specifiers.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([exportName, binding]) =>\n `const ${binding} = getSmrtExport(__smrt_provider_${index}, ${JSON.stringify(exportName)});`,\n ),\n );\n const transitiveNamespaceDeclarations = Array.from(\n transitiveNamespaces.values(),\n )\n .sort((left, right) => left.binding.localeCompare(right.binding))\n .map(\n ({ binding, providerPackageName, importPath }) =>\n `const ${binding} = await importSmrtDependency(${JSON.stringify(importPath)}, ${JSON.stringify(providerPackageName)});`,\n );\n const transitiveDeclarations = Array.from(transitiveBindings.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([, { binding, namespaceBinding, exportName }]) =>\n `const ${binding} = getSmrtExport(${namespaceBinding}, ${JSON.stringify(exportName)});\nif (!${binding}) throw new Error(${JSON.stringify(`[smrt:consumer] Provider-owned module did not export ${exportName}`)});`,\n );\n const transitiveCollectionDeclarations = transitiveCollectionChecks.map(\n ({ collectionBinding, itemBinding }) =>\n `if (${collectionBinding}._itemClass !== ${itemBinding}) throw new Error('[smrt:consumer] Provider-owned collection does not match its item constructor');`,\n );\n const registrationManifestLiteral = JSON.stringify(\n JSON.stringify(registrationManifests),\n );\n\n // Generate file content\n const content = `/**\n * Auto-generated by @happyvertical/smrt-core/consumer-plugin\n * DO NOT EDIT - This file is regenerated on every build\n *\n * Registers SMRT objects from external packages for CLI discovery.\n * Generated at: ${new Date().toISOString()}\n */\n\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\n${transitiveNamespaces.size > 0 ? \"import { registerHooks } from 'node:module';\" : ''}\n\n${imports.join('\\n')}\n\n/**\n * @param {Record<string, unknown>} provider\n * @param {string} exportName\n * @returns {any}\n */\nconst getSmrtExport = (provider, exportName) =>\n typeof provider[exportName] === 'function' ? provider[exportName] : undefined;\n${\n transitiveNamespaces.size > 0\n ? `const SMRT_RESOLVER_MODULE = 'data:text/javascript,export default (specifier) => import.meta.resolve(specifier)';\nlet smrtResolverToken = 0;\nconst importSmrtDependency = async (specifier, providerPackageName) => {\n const parentURL = import.meta.resolve(providerPackageName);\n const token = \\`smrt-consumer-resolve-\\${smrtResolverToken++}\\`;\n const hooks = registerHooks({\n resolve(requested, context, nextResolve) {\n return requested === token\n ? nextResolve(specifier, { ...context, parentURL })\n : nextResolve(requested, context);\n },\n });\n try {\n const resolver = (await import(/* @vite-ignore */ SMRT_RESOLVER_MODULE)).default;\n return import(/* @vite-ignore */ resolver(token));\n } finally {\n hooks.deregister();\n }\n};\n`\n : ''\n}\n${transitiveNamespaceDeclarations.join('\\n')}\n${importDeclarations.join('\\n')}\n${transitiveDeclarations.join('\\n')}\n${transitiveCollectionDeclarations.join('\\n')}\n\nconst smrtRegistrationManifests = JSON.parse(${registrationManifestLiteral});\n\n// Register all objects (executed during module evaluation)\n${registrations.join('\\n')}\n\nexport function registerAll() {\n // Objects are already registered during module evaluation\n console.log('[smrt:register] Registered ${registeredObjectCount} external ${registeredObjectLabel}');\n}\n`;\n\n // Create .smrt directory if needed\n if (!fs.existsSync(smrtDir)) {\n fs.mkdirSync(smrtDir, { recursive: true });\n }\n\n // Write registration file\n fs.writeFileSync(registerPath, content, 'utf-8');\n\n console.log(\n `[smrt:consumer] Generated .smrt/register.js with ${importedEntryCount} external entries (${registeredObjectCount} registered ${registeredObjectLabel})`,\n );\n}\n\n/**\n * Generate project-specific types\n */\nasync function generateProjectTypes(\n typeManifest: ConsumerManifest,\n typesDir: string,\n projectRoot: string,\n): Promise<void> {\n if (!typeManifest || Object.keys(typeManifest.objects).length === 0) {\n console.log(\n '[smrt:consumer] No SMRT objects found, skipping type generation',\n );\n return;\n }\n\n await generateDeclarations({\n // The aggregated manifest is a runtime SMRT manifest assembled from external\n // package manifests; it is intentionally typed loosely at the JSON boundary,\n // so narrow it to the declaration generator's strict manifest shape here.\n manifest: typeManifest as unknown as SmartObjectManifest,\n outDir: typesDir,\n projectRoot,\n includeVirtualModules: true,\n includeObjectTypes: true,\n });\n\n console.log(\n `[smrt:consumer] Generated types for ${Object.keys(typeManifest.objects).length} objects`,\n );\n}\n\n/**\n * Get type file name for virtual module\n */\nfunction getTypeFileName(virtualModule: string): string {\n const moduleMap: Record<string, string> = {\n '@smrt/routes': 'smrt-routes.d.ts',\n '@smrt/client': 'smrt-client.d.ts',\n '@smrt/mcp': 'smrt-mcp.d.ts',\n '@smrt/types': 'smrt-types.d.ts',\n '@smrt/manifest': 'smrt-manifest.d.ts',\n '@smrt/web': 'smrt-web.d.ts',\n };\n return moduleMap[virtualModule] || 'smrt-unknown.d.ts';\n}\n\n/**\n * Fallback modules for when types aren't available\n */\nfunction generateFallbackRoutesModule(): string {\n return `\n// Fallback routes module\nexport function setupRoutes(app) {\n console.warn('[smrt:consumer] No routes available - SMRT packages may not be properly configured');\n}\nexport default setupRoutes;\n`;\n}\n\nfunction generateFallbackClientModule(\n manifest: ConsumerManifest,\n options: { kebabRoutes?: boolean } = {},\n): string {\n const objects = Object.entries(manifest?.objects || {});\n if (objects.length === 0) {\n return `\n// Fallback client module\nexport function createClient(basePath = '/api/v1') {\n console.warn('[smrt:consumer] No API client available - SMRT packages may not be properly configured');\n return {};\n}\nexport default createClient;\n`;\n }\n\n return generateClientModule(manifest as unknown as SmartObjectManifest, {\n kebabRoutes: options.kebabRoutes,\n });\n}\n\nfunction generateFallbackMcpModule(): string {\n return `\n// Fallback MCP module\nexport const tools = [];\nexport function createMCPServer() {\n console.warn('[smrt:consumer] No MCP tools available - SMRT packages may not be properly configured');\n return { name: 'smrt-consumer', version: '1.0.0', tools: [] };\n}\nexport default createMCPServer;\n`;\n}\n\nfunction generateFallbackTypesModule(manifest: ConsumerManifest): string {\n const objects = Object.entries(manifest?.objects || {});\n if (objects.length === 0) {\n return `// No types available`;\n }\n\n // Generate basic interfaces\n const interfaces = objects.map(([_name, obj]) => {\n return `export interface ${obj.className}Data {\n id?: string;\n created_at?: string;\n updated_at?: string;\n [key: string]: any;\n}`;\n });\n\n return interfaces.join('\\n\\n');\n}\n\nfunction generateFallbackManifestModule(manifest: ConsumerManifest): string {\n return `\n// Auto-generated manifest from SMRT consumer\nexport const manifest = ${JSON.stringify(manifest, null, 2)};\nexport default manifest;\n`;\n}\n"],"mappings":"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"}
|
package/dist/consumer-plugin.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { loadVerifiedSmrtGenerationSnapshot, serializeSmrtGenerationSnapshot, sha256SmrtGenerationSnapshot } from "./generation-snapshot.js";
|
|
2
|
-
import { smrtConsumer } from "./consumer-plugin/index.js";
|
|
3
|
-
export { loadVerifiedSmrtGenerationSnapshot, serializeSmrtGenerationSnapshot, sha256SmrtGenerationSnapshot, smrtConsumer };
|
|
2
|
+
import { isComponentBearingRoot, resolveProviderContextImport, smrtConsumer } from "./consumer-plugin/index.js";
|
|
3
|
+
export { isComponentBearingRoot, loadVerifiedSmrtGenerationSnapshot, resolveProviderContextImport, serializeSmrtGenerationSnapshot, sha256SmrtGenerationSnapshot, smrtConsumer };
|