@happyvertical/smrt-core 0.36.5 → 0.36.7

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.
Files changed (131) hide show
  1. package/dist/collection.d.ts +1 -1
  2. package/dist/config.d.ts +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/consumer-plugin/index.d.ts.map +1 -1
  6. package/dist/consumer-plugin/index.js +7 -3
  7. package/dist/consumer-plugin/index.js.map +1 -1
  8. package/dist/database.d.ts +3 -3
  9. package/dist/database.d.ts.map +1 -1
  10. package/dist/database.js.map +1 -1
  11. package/dist/embeddings/provider.d.ts +14 -2
  12. package/dist/embeddings/provider.d.ts.map +1 -1
  13. package/dist/embeddings/provider.js +3 -3
  14. package/dist/embeddings/provider.js.map +1 -1
  15. package/dist/embeddings/storage.js.map +1 -1
  16. package/dist/errors.d.ts +22 -22
  17. package/dist/errors.d.ts.map +1 -1
  18. package/dist/errors.js +5 -4
  19. package/dist/errors.js.map +1 -1
  20. package/dist/generators/cli.d.ts +4 -22
  21. package/dist/generators/cli.d.ts.map +1 -1
  22. package/dist/generators/cli.js +9 -5
  23. package/dist/generators/cli.js.map +1 -1
  24. package/dist/generators/mcp-runtime-template.d.ts +1 -1
  25. package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
  26. package/dist/generators/mcp-runtime-template.js.map +1 -1
  27. package/dist/generators/mcp.d.ts +16 -4
  28. package/dist/generators/mcp.d.ts.map +1 -1
  29. package/dist/generators/mcp.js +25 -9
  30. package/dist/generators/mcp.js.map +1 -1
  31. package/dist/generators/rest.d.ts +6 -5
  32. package/dist/generators/rest.d.ts.map +1 -1
  33. package/dist/generators/rest.js +8 -5
  34. package/dist/generators/rest.js.map +1 -1
  35. package/dist/generators/swagger.d.ts +12 -2
  36. package/dist/generators/swagger.d.ts.map +1 -1
  37. package/dist/generators/swagger.js +6 -3
  38. package/dist/generators/swagger.js.map +1 -1
  39. package/dist/knowledge.d.ts +12 -1
  40. package/dist/knowledge.d.ts.map +1 -1
  41. package/dist/knowledge.js.map +1 -1
  42. package/dist/lazy-config.d.ts.map +1 -1
  43. package/dist/lazy-config.js.map +1 -1
  44. package/dist/manifest/generator.d.ts.map +1 -1
  45. package/dist/manifest/generator.js +14 -12
  46. package/dist/manifest/generator.js.map +1 -1
  47. package/dist/manifest/manager.d.ts +3 -3
  48. package/dist/manifest/manager.d.ts.map +1 -1
  49. package/dist/manifest/manager.js.map +1 -1
  50. package/dist/manifest/manifest-loader.d.ts +3 -2
  51. package/dist/manifest/manifest-loader.d.ts.map +1 -1
  52. package/dist/manifest/manifest-loader.js +3 -2
  53. package/dist/manifest/manifest-loader.js.map +1 -1
  54. package/dist/manifest/static-manifest.js +2 -2
  55. package/dist/manifest/static-manifest.js.map +1 -1
  56. package/dist/manifest/store.js +2 -2
  57. package/dist/manifest/test-manifest-stub.js +2 -2
  58. package/dist/manifest/test-manifest-stub.js.map +1 -1
  59. package/dist/manifest.json +2 -2
  60. package/dist/mcp-advisor/index.d.ts +1 -1
  61. package/dist/mcp-advisor/index.d.ts.map +1 -1
  62. package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -1
  63. package/dist/mcp-advisor/types.d.ts +5 -5
  64. package/dist/mcp-advisor/types.d.ts.map +1 -1
  65. package/dist/migrations/differ.js.map +1 -1
  66. package/dist/scanner/manifest-generator.d.ts +11 -3
  67. package/dist/scanner/manifest-generator.d.ts.map +1 -1
  68. package/dist/scanner/manifest-generator.js +19 -15
  69. package/dist/scanner/manifest-generator.js.map +1 -1
  70. package/dist/scanner/types.d.ts +60 -6
  71. package/dist/scanner/types.d.ts.map +1 -1
  72. package/dist/schema/code-generator.d.ts.map +1 -1
  73. package/dist/schema/ddl/base-strategy.d.ts +2 -2
  74. package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
  75. package/dist/schema/ddl/base-strategy.js.map +1 -1
  76. package/dist/schema/ddl/sqlite-strategy.d.ts +1 -1
  77. package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -1
  78. package/dist/schema/ddl/sqlite-strategy.js.map +1 -1
  79. package/dist/schema/ddl/types.d.ts +1 -1
  80. package/dist/schema/ddl/types.d.ts.map +1 -1
  81. package/dist/schema/generator.d.ts +27 -4
  82. package/dist/schema/generator.d.ts.map +1 -1
  83. package/dist/schema/generator.js +3 -2
  84. package/dist/schema/generator.js.map +1 -1
  85. package/dist/schema/override-system.d.ts +3 -3
  86. package/dist/schema/override-system.d.ts.map +1 -1
  87. package/dist/schema/schema-aggregator.d.ts.map +1 -1
  88. package/dist/schema/schema-manager.d.ts.map +1 -1
  89. package/dist/schema/schema-manager.js +12 -4
  90. package/dist/schema/schema-manager.js.map +1 -1
  91. package/dist/schema/types.d.ts +1 -1
  92. package/dist/schema/types.d.ts.map +1 -1
  93. package/dist/schema/utils.d.ts +6 -1
  94. package/dist/schema/utils.d.ts.map +1 -1
  95. package/dist/schema/utils.js +2 -1
  96. package/dist/schema/utils.js.map +1 -1
  97. package/dist/signals/sanitizer.d.ts +1 -1
  98. package/dist/signals/sanitizer.d.ts.map +1 -1
  99. package/dist/signals/sanitizer.js +12 -2
  100. package/dist/signals/sanitizer.js.map +1 -1
  101. package/dist/smrt-knowledge.json +4 -4
  102. package/dist/system/types.d.ts +2 -2
  103. package/dist/system/types.d.ts.map +1 -1
  104. package/dist/system-fields.d.ts +5 -43
  105. package/dist/system-fields.d.ts.map +1 -1
  106. package/dist/system-fields.js +2 -1
  107. package/dist/system-fields.js.map +1 -1
  108. package/dist/test-utils.d.ts +39 -13
  109. package/dist/test-utils.d.ts.map +1 -1
  110. package/dist/testing/database.d.ts.map +1 -1
  111. package/dist/testing/database.js.map +1 -1
  112. package/dist/tools/tool-executor.d.ts +19 -5
  113. package/dist/tools/tool-executor.d.ts.map +1 -1
  114. package/dist/tools/tool-executor.js +4 -2
  115. package/dist/tools/tool-executor.js.map +1 -1
  116. package/dist/tools/tool-generator.d.ts +8 -1
  117. package/dist/tools/tool-generator.d.ts.map +1 -1
  118. package/dist/tools/tool-generator.js +10 -11
  119. package/dist/tools/tool-generator.js.map +1 -1
  120. package/dist/utils/json.js.map +1 -1
  121. package/dist/utils.d.ts +16 -8
  122. package/dist/utils.d.ts.map +1 -1
  123. package/dist/utils.js.map +1 -1
  124. package/dist/vite-plugin/index.d.ts.map +1 -1
  125. package/dist/vite-plugin/index.js +9 -7
  126. package/dist/vite-plugin/index.js.map +1 -1
  127. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
  128. package/dist/vite-plugin/sveltekit-generator.js +4 -3
  129. package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
  130. package/dist/vite-plugin/templates/default-ui.ts +20 -6
  131. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-generator.js","sources":["../../src/scanner/manifest-generator.ts"],"sourcesContent":["/**\n * Manifest generator for creating service manifests from AST scan results\n */\n\nimport { createHash } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport {\n loadExternalManifestSync,\n lookupInManifest,\n} from '../manifest/manifest-loader.js';\nimport { SchemaGenerator } from '../schema/generator.js';\nimport { generateToolManifest } from '../tools/tool-generator.js';\nimport { classnameToTablename, toSnakeCase } from '../utils/naming.js';\nimport { createQualifiedName } from '../utils/qualified-names.js';\nimport { isTestFile } from './test-file-patterns.js';\nimport type {\n AgentAdminRouteManifest,\n AgentComponentDeclaration,\n AgentFeature,\n AgentManifest,\n AgentMenuItem,\n AgentPermission,\n AgentUISlotManifest,\n ManifestColumnDefinition,\n ManifestSchema,\n ScanResult,\n SmartObjectDefinition,\n SmartObjectManifest,\n SmrtVisibility,\n ValidationRule,\n} from './types.js';\n\ntype SchemaGeneratorLike = {\n generateSQL: (schema: any, engine?: any) => string;\n};\n\n// Create require function for synchronous module loading in ESM context\nconst require = createRequire(import.meta.url);\n\n/**\n * Framework abstract base classes whose declared fields must be merged\n * into every subclass's `fields` map.\n *\n * These classes live in SMRT framework packages, have no `@smrt()`\n * decorator, no table of their own, and contribute structural fields\n * (e.g. `SmrtHierarchical.parentId`) that subclasses query against —\n * without merging, downstream WHERE-clause validation rejects queries on\n * those columns.\n *\n * SmrtObject / SmrtClass / SmrtCollection are intentionally NOT in this\n * set even though they live in core. SmrtObject's universal columns\n * (`id`, `slug`, `context`, `created_at`, `updated_at`) are added by a\n * separate universal-baseline mechanism in `fieldsFromClass`, and merging\n * them here would double-write with subtly different `_meta` payloads\n * and regress existing field expectations.\n *\n * Keep in sync with `FRAMEWORK_BASE_CLASSES` in\n * `packages/scanner/src/inheritance-resolver.ts` — note that set is\n * broader: it controls scanner-level chain termination and stub\n * resolution, while this one only controls field merging.\n */\nconst FRAMEWORK_ABSTRACT_BASE_NAMES = new Set([\n 'SmrtJunction',\n 'SmrtHierarchical',\n 'SmrtPolymorphicAssociation',\n 'SmrtReport',\n 'SmrtReportCollection',\n]);\n\n/**\n * Infer visibility from file path and explicit config\n *\n * Priority:\n * 1. Explicit visibility in decorator config\n * 2. Auto-detect test files → 'test'\n * 3. Default to 'public'\n */\nfunction inferVisibility(\n filePath: string,\n explicitVisibility?: SmrtVisibility,\n): SmrtVisibility {\n if (explicitVisibility) return explicitVisibility;\n if (isTestFile(filePath)) return 'test';\n return 'public';\n}\n\nexport class ManifestGenerator {\n /**\n * Generate manifest from scan results\n *\n * @param scanResults - Array of scan results containing object definitions\n * @param options - Optional configuration\n * @param options.packageName - Package name to inject into manifest and object definitions\n * @param options.packageVersion - Package version\n * @param options.packageJson - Full package.json object for determining import paths\n * @param options.smrtDependencies - List of SMRT package dependencies to include in manifest\n * @param options.includeVisibility - Array of visibility levels to include (default: all)\n * - For published packages: ['public']\n * - For development: ['public', 'internal', 'test'] or omit for all\n */\n generateManifest(\n scanResults: ScanResult[],\n options?: {\n packageName?: string;\n packageVersion?: string;\n packageJson?: any;\n smrtDependencies?: string[];\n includeVisibility?: SmrtVisibility[];\n },\n ): SmartObjectManifest {\n const manifest: SmartObjectManifest = {\n version: '1.0.0',\n timestamp: Date.now(),\n objects: {},\n };\n\n // Set package metadata at manifest level if provided\n if (options?.packageName) {\n manifest.packageName = options.packageName;\n }\n if (options?.packageVersion) {\n manifest.packageVersion = options.packageVersion;\n }\n // Set smrtDependencies BEFORE mergeInheritedFields() so external packages can be loaded\n if (options?.smrtDependencies) {\n manifest.smrtDependencies = options.smrtDependencies;\n }\n\n for (const result of scanResults) {\n for (const objectDef of result.objects) {\n // Set package metadata on object definition if provided\n if (options?.packageName) {\n objectDef.packageName = options.packageName;\n }\n if (options?.packageVersion) {\n objectDef.packageVersion = options.packageVersion;\n }\n\n // Generate qualified name (required for manifest keying)\n // Must have packageName to generate qualified name\n if (objectDef.packageName) {\n objectDef.qualifiedName = createQualifiedName(\n objectDef.packageName,\n objectDef.className,\n );\n }\n\n // Infer visibility from file path and decorator config\n objectDef.visibility = inferVisibility(\n objectDef.filePath,\n objectDef.decoratorConfig?.visibility as SmrtVisibility | undefined,\n );\n\n // Filter by visibility if specified\n // Skip objects that don't match the requested visibility levels\n if (\n options?.includeVisibility &&\n options.includeVisibility.length > 0 &&\n !options.includeVisibility.includes(objectDef.visibility)\n ) {\n // Skip this object - visibility not in allowed list\n continue;\n }\n\n // Determine import path from package.json exports\n if (options?.packageName && options?.packageJson) {\n objectDef.importPath = this.determineImportPath(\n options.packageJson,\n objectDef.filePath,\n );\n }\n\n // Set export names (defaults to className)\n objectDef.exportName = objectDef.exportName || objectDef.className;\n objectDef.collectionExportName =\n objectDef.collectionExportName || `${objectDef.className}Collection`;\n\n // Generate AI tools from methods if AI config exists\n if (objectDef.decoratorConfig.ai) {\n const methods = Object.values(objectDef.methods);\n const tools = generateToolManifest(\n methods,\n objectDef.decoratorConfig.ai,\n );\n\n // Store tools in object definition\n if (tools.length > 0) {\n objectDef.tools = tools;\n }\n }\n\n // Determine manifest key: use qualified name if available, fall back to lowercase name\n // During transition, some objects may not have qualified names\n const manifestKey = objectDef.qualifiedName || objectDef.name;\n\n // Check for collisions using the manifest key\n if (manifest.objects[manifestKey]) {\n const existing = manifest.objects[manifestKey];\n throw new Error(\n `Class name collision detected: '${objectDef.className}' (${manifestKey}) is defined in multiple files:\\n` +\n ` 1. ${existing.filePath}\\n` +\n ` 2. ${objectDef.filePath}\\n\\n` +\n `Class names must be unique within a package. Use different class names or separate packages.`,\n );\n }\n\n manifest.objects[manifestKey] = objectDef;\n }\n }\n\n // Report cache rows are safe to scope by tenant even when a report is\n // global: optional mode keeps tenant-less rows readable outside a tenant\n // context and gives tenant-scoped reports the tenant_id column their raw\n // aggregate refresh path must write.\n this.normalizeReportTenantScope(manifest);\n\n // Second pass: materialize implicit tenant fields before inheritance and schema generation.\n this.injectTenantScopedFields(manifest);\n\n // Third pass: Merge inherited fields for STI classes\n // This ensures STI subclasses have all parent fields inline in the manifest\n this.mergeInheritedFields(manifest);\n\n // Report models are read-only cache tables. Fill in the generated surface\n // and natural conflict key from report metadata before schema generation.\n this.normalizeReportObjects(manifest);\n\n // Fourth pass: Generate validation rules for all objects\n // This pre-computes validation rules from field definitions, eliminating\n // the need to compile validator closures at runtime (Issue #782)\n this.generateValidationRules(manifest);\n\n // Fifth pass: Generate schemas for each object (build-time schema generation)\n // This pre-computes DDL, indexes, and columns for efficient external package consumption\n this.generateSchemas(manifest);\n this.assertTenantScopedSchemaContract(manifest);\n\n // Sixth pass: Generate agent manifests for Agent subclasses\n // Derives permissions, features, menuItems, and components from code\n this.generateAgentManifests(\n manifest,\n options?.packageName,\n options?.packageJson,\n );\n\n return manifest;\n }\n\n /**\n * Materialize tenantScoped schema fields.\n *\n * Runtime registration already injects tenant fields for\n * `@smrt({ tenantScoped: true })`, but published manifests must contain the\n * same field before schema generation so migrations create `tenant_id`.\n */\n injectTenantScopedFields(manifest: SmartObjectManifest): void {\n for (const objectDef of Object.values(manifest.objects)) {\n this.injectTenantScopedField(objectDef);\n }\n }\n\n private injectTenantScopedField(objectDef: SmartObjectDefinition): void {\n const tenantScoped = objectDef.decoratorConfig?.tenantScoped;\n if (!tenantScoped) {\n return;\n }\n\n const { tenantConfig, tenantOptions } =\n this.normalizeTenantScopedConfig(tenantScoped);\n const fieldName = tenantConfig.field;\n const existingField = objectDef.fields[fieldName];\n const tenancyMeta = {\n isTenantIdField: true,\n ...tenantConfig,\n };\n\n if (existingField) {\n const fieldTypeFailure = this.getTenantScopedFieldTypeFailure(\n objectDef,\n fieldName,\n );\n if (fieldTypeFailure) {\n throw new Error(\n `Tenant-scoped field configuration invalid: ${fieldTypeFailure}`,\n );\n }\n\n existingField._meta = {\n ...existingField._meta,\n sqlType: 'UUID',\n __tenancy: {\n ...existingField._meta?.__tenancy,\n ...tenancyMeta,\n },\n };\n return;\n }\n\n objectDef.fields[fieldName] = {\n type: 'text',\n // Preserve legacy migration behavior: boolean `tenantScoped: true`\n // enables required-mode runtime scoping, but does not add a NOT NULL\n // column to existing tables unless mode is explicitly set.\n required: tenantOptions.mode === 'required',\n _meta: {\n generated: true,\n source: 'tenantScoped_decorator',\n sqlType: 'UUID',\n __tenancy: tenancyMeta,\n },\n };\n\n console.log(\n `[manifest-generator] Injected ${fieldName} field for ${objectDef.className} (tenantScoped: ${JSON.stringify(tenantConfig)})`,\n );\n }\n\n assertTenantScopedSchemaContract(manifest: SmartObjectManifest): void {\n const failures: string[] = [];\n\n for (const objectDef of Object.values(manifest.objects)) {\n const tenantScoped = objectDef.decoratorConfig?.tenantScoped;\n if (!tenantScoped) {\n continue;\n }\n\n const { tenantConfig } = this.normalizeTenantScopedConfig(tenantScoped);\n const fieldName = tenantConfig.field;\n const columnName = toSnakeCase(fieldName);\n\n if (!objectDef.fields[fieldName]) {\n failures.push(\n `${objectDef.className}: missing tenant-scoped field \"${fieldName}\"`,\n );\n continue;\n }\n\n const fieldTypeFailure = this.getTenantScopedFieldTypeFailure(\n objectDef,\n fieldName,\n );\n if (fieldTypeFailure) {\n failures.push(fieldTypeFailure);\n continue;\n }\n\n const schemaOwner = this.getTenantScopedSchemaOwner(objectDef, manifest);\n const schemaOwnerContext =\n schemaOwner === objectDef\n ? ''\n : ` on STI base \"${schemaOwner.className}\"`;\n\n if (!schemaOwner.schema?.columns) {\n failures.push(\n `${objectDef.className}: schema has not been generated for tenant-scoped column \"${columnName}\"${schemaOwnerContext}`,\n );\n continue;\n }\n\n if (!schemaOwner.schema.columns[columnName]) {\n failures.push(\n `${objectDef.className}: schema is missing tenant-scoped column \"${columnName}\"${schemaOwnerContext}`,\n );\n }\n }\n\n if (failures.length > 0) {\n throw new Error(\n `Tenant-scoped schema contract failed:\\n${failures\n .map((failure) => ` - ${failure}`)\n .join('\\n')}`,\n );\n }\n }\n\n private getTenantScopedSchemaOwner(\n objectDef: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n ): SmartObjectDefinition {\n if (!this.isSTIChildClass(objectDef, manifest)) {\n return objectDef;\n }\n\n const stiBase = this.findSTIBaseInfo(objectDef, manifest);\n if (!stiBase) {\n return objectDef;\n }\n\n const localBase = Object.values(manifest.objects).find(\n (candidate) => candidate.className === stiBase.className,\n );\n\n return localBase ?? objectDef;\n }\n\n private getTenantScopedFieldTypeFailure(\n objectDef: SmartObjectDefinition,\n fieldName: string,\n ): string | undefined {\n const field = objectDef.fields[fieldName];\n if (!field) {\n return undefined;\n }\n\n if (field.type !== 'text' && field.type !== 'foreignKey') {\n return `${objectDef.className}: tenant-scoped field \"${fieldName}\" must use type \"text\" or \"foreignKey\"; received \"${field.type}\"`;\n }\n\n const sqlType = field._meta?.sqlType;\n if (sqlType && !['TEXT', 'UUID'].includes(String(sqlType).toUpperCase())) {\n return `${objectDef.className}: tenant-scoped field \"${fieldName}\" must use SQL type \"UUID\" or legacy \"TEXT\"; received \"${sqlType}\"`;\n }\n\n return undefined;\n }\n\n private normalizeTenantScopedConfig(tenantScoped: unknown): {\n tenantOptions: Record<string, any>;\n tenantConfig: {\n mode: string;\n field: string;\n autoFilter: boolean;\n autoPopulate: boolean;\n allowSuperAdminBypass: boolean;\n };\n } {\n const tenantOptions: Record<string, any> =\n typeof tenantScoped === 'boolean' ? {} : (tenantScoped as any);\n\n return {\n tenantOptions,\n tenantConfig: {\n mode: tenantOptions.mode ?? 'required',\n field: tenantOptions.field ?? 'tenantId',\n autoFilter: tenantOptions.autoFilter ?? true,\n autoPopulate: tenantOptions.autoPopulate ?? true,\n allowSuperAdminBypass: tenantOptions.allowSuperAdminBypass ?? false,\n },\n };\n }\n\n /**\n * Generate pre-computed validation rules for all objects in the manifest.\n *\n * This extracts validation constraints (required, min, max, minLength, maxLength, pattern)\n * from field definitions and stores them as serializable rules in the manifest.\n *\n * At runtime, these rules can be evaluated without creating validator closures,\n * significantly reducing CLI startup time for projects with many SMRT objects.\n *\n * @param manifest - The manifest to process in-place\n */\n generateValidationRules(manifest: SmartObjectManifest): void {\n for (const [name, obj] of Object.entries(manifest.objects)) {\n const rules: ValidationRule[] = [];\n\n for (const [fieldName, field] of Object.entries(obj.fields)) {\n // Skip transient fields (they're not persisted, so no validation needed)\n if (field.transient || field._meta?.transient) {\n continue;\n }\n\n const options = field._meta || {};\n\n // Required field rule\n if (options.required || field.required) {\n rules.push({\n field: fieldName,\n rule: 'required',\n fieldType: field.type,\n });\n }\n\n // Numeric range rules (for integer, decimal fields)\n if (field.type === 'integer' || field.type === 'decimal') {\n if (options.min !== undefined || field.min !== undefined) {\n rules.push({\n field: fieldName,\n rule: 'min',\n value: options.min ?? field.min,\n fieldType: field.type,\n });\n }\n\n if (options.max !== undefined || field.max !== undefined) {\n rules.push({\n field: fieldName,\n rule: 'max',\n value: options.max ?? field.max,\n fieldType: field.type,\n });\n }\n }\n\n // String length rules (for text fields)\n if (field.type === 'text') {\n if (\n options.minLength !== undefined ||\n field.minLength !== undefined\n ) {\n rules.push({\n field: fieldName,\n rule: 'minLength',\n value: options.minLength ?? field.minLength,\n fieldType: field.type,\n });\n }\n\n if (\n options.maxLength !== undefined ||\n field.maxLength !== undefined\n ) {\n rules.push({\n field: fieldName,\n rule: 'maxLength',\n value: options.maxLength ?? field.maxLength,\n fieldType: field.type,\n });\n }\n\n // Pattern rule (regex validation)\n // Note: Custom validator functions (options.validate) cannot be serialized\n // and will fall back to compiled validators at runtime\n // Note: Pattern is only available in field options, not in FieldDefinition\n const pattern = options.pattern;\n if (pattern) {\n rules.push({\n field: fieldName,\n rule: 'pattern',\n value: typeof pattern === 'string' ? pattern : pattern.source,\n fieldType: field.type,\n });\n }\n }\n }\n\n // Only add validationRules if there are any rules\n if (rules.length > 0) {\n obj.validationRules = rules;\n }\n }\n }\n\n /**\n * Generate pre-computed schemas for all objects in the manifest.\n *\n * This enables external package consumers to use pre-generated schemas\n * without calling generateSchema() at runtime, eliminating latency.\n *\n * IMPORTANT: For STI classes, we aggregate ALL descendants from both local\n * and external packages to ensure complete schemas are generated.\n *\n * This method is public to allow external callers (like OXC scanner) to use it.\n *\n * @param manifest - The manifest to process in-place\n */\n generateSchemas(manifest: SmartObjectManifest): void {\n const generator = new SchemaGenerator();\n\n // Create aggregated manifest that includes external package objects\n // This ensures STI schema generation finds ALL descendants\n const aggregatedManifest = this.createAggregatedManifest(manifest);\n\n // Track which STI bases have been processed (to avoid duplicate schema generation)\n const processedSTIBases = new Set<string>();\n\n // Build lookup map for checking if base is local\n const localObjects = new Set(\n Object.values(manifest.objects).map((o) => o.className),\n );\n\n for (const [name, obj] of Object.entries(manifest.objects)) {\n if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(obj.className)) {\n continue;\n }\n\n // Determine table name (may have been inherited from external STI base)\n // Use obj.className (PascalCase) for consistent table name derivation with runtime\n const tableName =\n obj.decoratorConfig?.tableName ||\n this.classNameToTableName(obj.className);\n\n // Check if this is an STI class\n if (obj.decoratorConfig?.tableStrategy === 'sti') {\n // This is an STI base class - generate STI schema with ALL descendants\n if (processedSTIBases.has(name)) continue;\n processedSTIBases.add(name);\n\n console.log(\n `[manifest-generator] Generating STI schema for ${name} (table: ${tableName})`,\n );\n\n // Use aggregated manifest to find descendants from ALL packages\n obj.schema = generator.generateSTISchemaFromManifest(\n name,\n tableName,\n obj.fields,\n aggregatedManifest,\n obj.decoratorConfig,\n );\n this.applySqlTypeOverrides(obj);\n } else if (this.isSTIChildClass(obj, manifest)) {\n // This is an STI child class - check if base is LOCAL or EXTERNAL\n const stiBase = this.findSTIBaseInfo(obj, manifest);\n const baseIsLocal = stiBase && localObjects.has(stiBase.className);\n\n if (baseIsLocal) {\n // STI base is in this manifest - skip (schema is on base class)\n console.log(\n `[manifest-generator] Skipping schema for STI child ${name} (base ${stiBase?.className} is local)`,\n );\n } else {\n // STI base is EXTERNAL - generate STI schema for this child\n // CRITICAL: Use the external base's table name, not the child's!\n const baseTableName = stiBase?.tableName || tableName;\n console.log(\n `[manifest-generator] Generating STI schema for ${name} (external base: ${stiBase?.className}, table: ${baseTableName})`,\n );\n\n // Use aggregated manifest to include all descendants\n // FIX #527: Use actual STI base class name, not child class name\n // This ensures findDescendantsInManifest() finds ALL STI children\n obj.schema = generator.generateSTISchemaFromManifest(\n stiBase?.className || name,\n baseTableName,\n obj.fields,\n aggregatedManifest,\n obj.decoratorConfig,\n );\n this.applySqlTypeOverrides(obj);\n }\n } else {\n // CTI class - generate individual table schema\n console.log(\n `[manifest-generator] Generating CTI schema for ${name} (table: ${tableName})`,\n );\n\n obj.schema = generator.generateCTISchemaFromManifest(\n name,\n tableName,\n obj.fields,\n obj.decoratorConfig,\n );\n this.applySqlTypeOverrides(obj);\n }\n }\n\n this.resolveSamePackageForeignKeyColumnTypes(manifest, generator);\n }\n\n normalizeReportObjects(manifest: SmartObjectManifest): void {\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.decoratorConfig?.report) continue;\n\n obj.decoratorConfig.api ??= { include: ['list', 'get'] };\n obj.decoratorConfig.mcp ??= { include: ['list', 'get'] };\n\n if (obj.decoratorConfig.conflictColumns) continue;\n\n const tenantScoped = obj.decoratorConfig.tenantScoped;\n const tenantField =\n tenantScoped && typeof tenantScoped === 'object'\n ? tenantScoped.field || 'tenantId'\n : tenantScoped\n ? 'tenantId'\n : undefined;\n const tenantColumn =\n tenantField && obj.fields[tenantField] ? toSnakeCase(tenantField) : '';\n\n const conflictColumns = Object.entries(obj.fields)\n .filter(([, field]) => {\n const kind = field._meta?.__report?.kind;\n return kind === 'group' || kind === 'bucket';\n })\n .map(([fieldName]) => toSnakeCase(fieldName));\n\n obj.decoratorConfig.conflictColumns =\n conflictColumns.length > 0\n ? [...(tenantColumn ? [tenantColumn] : []), ...conflictColumns]\n : ['id'];\n }\n }\n\n normalizeReportTenantScope(manifest: SmartObjectManifest): void {\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.decoratorConfig?.report) continue;\n obj.decoratorConfig.tenantScoped ??= { mode: 'optional' };\n }\n }\n\n private resolveSamePackageForeignKeyColumnTypes(\n manifest: SmartObjectManifest,\n generator: SchemaGeneratorLike,\n ): void {\n const schemaByTable = new Map<string, ManifestSchema>();\n const ownerBySchema = new Map<\n ManifestSchema,\n { name: string; obj: SmartObjectDefinition }\n >();\n const changedSchemas = new Set<ManifestSchema>();\n\n for (const [name, obj] of Object.entries(manifest.objects)) {\n if (obj.schema?.tableName) {\n schemaByTable.set(obj.schema.tableName, obj.schema);\n ownerBySchema.set(obj.schema, { name, obj });\n }\n }\n\n for (const obj of Object.values(manifest.objects)) {\n const sourceTable = this.getObjectTableName(obj);\n if (!sourceTable) {\n continue;\n }\n\n const sourceSchema = schemaByTable.get(sourceTable);\n if (!sourceSchema) {\n continue;\n }\n\n for (const [fieldName, field] of Object.entries(obj.fields || {})) {\n if (\n field.type !== 'foreignKey' ||\n !field.related ||\n field._meta?.sqlType\n ) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n const sourceColumn = sourceSchema.columns[columnName];\n if (!sourceColumn) {\n continue;\n }\n\n const targetSchema = this.findForeignKeyTargetSchema(\n field.related,\n manifest,\n schemaByTable,\n );\n const targetIdType = targetSchema?.columns.id?.type;\n if (!targetIdType || sourceColumn.type === targetIdType) {\n continue;\n }\n\n sourceSchema.columns[columnName] = {\n ...sourceColumn,\n type: targetIdType,\n };\n changedSchemas.add(sourceSchema);\n }\n }\n\n for (const schema of changedSchemas) {\n this.refreshManifestSchemaDDL(\n schema,\n generator,\n ownerBySchema.get(schema),\n manifest,\n );\n }\n }\n\n private findForeignKeyTargetSchema(\n related: string,\n manifest: SmartObjectManifest,\n schemaByTable: Map<string, ManifestSchema>,\n ): ManifestSchema | undefined {\n const relatedTarget = related.split('.')[0];\n if (schemaByTable.has(relatedTarget)) {\n return schemaByTable.get(relatedTarget);\n }\n\n const targetObj = Object.values(manifest.objects).find(\n (candidate) =>\n candidate.className === relatedTarget ||\n candidate.qualifiedName === relatedTarget ||\n candidate.name === relatedTarget ||\n candidate.decoratorConfig?.tableName === relatedTarget ||\n candidate.schema?.tableName === relatedTarget,\n );\n\n if (!targetObj && relatedTarget.includes(':')) {\n return undefined;\n }\n\n const targetTable = targetObj\n ? this.getObjectTableName(targetObj)\n : this.classNameToTableName(relatedTarget);\n\n return targetTable ? schemaByTable.get(targetTable) : undefined;\n }\n\n private getObjectTableName(obj: SmartObjectDefinition): string | undefined {\n return (\n obj.schema?.tableName ||\n obj.decoratorConfig?.tableName ||\n this.classNameToTableName(obj.className)\n );\n }\n\n private refreshManifestSchemaDDL(\n schema: ManifestSchema,\n generator: SchemaGeneratorLike,\n owner: { name: string; obj: SmartObjectDefinition } | undefined,\n manifest: SmartObjectManifest,\n ): void {\n const schemaDefinition = {\n tableName: schema.tableName,\n columns: Object.fromEntries(\n Object.entries(schema.columns).map(([name, column]) => [\n name,\n {\n type: column.type,\n primaryKey: column.primaryKey,\n notNull: column.notNull,\n unique: column.unique,\n defaultValue: column.default,\n },\n ]),\n ),\n indexes: (schema.indexes || []).map((index) => ({\n name: index.name,\n columns: index.columns,\n unique: index.unique,\n where: index.where,\n jsonPath: index.jsonPath,\n })),\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: schema.version,\n packageName: '',\n };\n\n schema.ddl = generator.generateSQL(schemaDefinition);\n schema.version = this.computeManifestSchemaVersion(schema, owner, manifest);\n }\n\n private computeManifestSchemaVersion(\n schema: ManifestSchema,\n owner: { name: string; obj: SmartObjectDefinition } | undefined,\n manifest: SmartObjectManifest,\n ): string {\n if (schema.columns._meta_type && owner) {\n const baseClassName =\n owner.obj.decoratorConfig?.tableStrategy === 'sti'\n ? owner.name\n : this.findSTIBaseInfo(owner.obj, manifest)?.className || owner.name;\n\n return createHash('sha256')\n .update(\n JSON.stringify({\n columns: schema.columns,\n baseClassName,\n descendants: this.findDescendantsInManifest(\n baseClassName,\n manifest,\n ),\n }),\n )\n .digest('hex')\n .substring(0, 8);\n }\n\n return createHash('sha256')\n .update(\n JSON.stringify({\n columns: schema.columns,\n className: owner?.name || schema.tableName,\n }),\n )\n .digest('hex')\n .substring(0, 8);\n }\n\n private findDescendantsInManifest(\n baseClassName: string,\n manifest: SmartObjectManifest,\n visited: Set<string> = new Set(),\n ): string[] {\n const descendants: string[] = [];\n if (visited.has(baseClassName)) {\n return descendants;\n }\n visited.add(baseClassName);\n\n const baseClassLower = this.simpleClassName(baseClassName).toLowerCase();\n\n for (const [name, obj] of Object.entries(manifest.objects)) {\n const classNameLower = this.simpleClassName(obj.className).toLowerCase();\n const extendsLower = obj.extends\n ? this.simpleClassName(obj.extends).toLowerCase()\n : undefined;\n\n if (\n classNameLower === baseClassLower &&\n extendsLower === baseClassLower\n ) {\n continue;\n }\n\n if (extendsLower === baseClassLower) {\n descendants.push(name);\n descendants.push(\n ...this.findDescendantsInManifest(name, manifest, visited),\n );\n }\n }\n\n return descendants;\n }\n\n private applySqlTypeOverrides(obj: SmartObjectDefinition): void {\n if (!obj.schema?.columns) {\n return;\n }\n\n for (const [fieldName, field] of Object.entries(obj.fields || {})) {\n const sqlType = field?._meta?.sqlType;\n const referenceKind = this.getReferenceKind(field);\n if (!sqlType && !referenceKind) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n if (!obj.schema.columns[columnName]) {\n continue;\n }\n\n obj.schema.columns[columnName] = {\n ...obj.schema.columns[columnName],\n ...(sqlType ? { type: String(sqlType).toUpperCase() } : {}),\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n }\n\n private getReferenceKind(\n field: SmartObjectDefinition['fields'][string] | undefined,\n ): ManifestColumnDefinition['referenceKind'] | undefined {\n if (field?._meta?.__tenancy?.isTenantIdField) {\n return 'tenantId';\n }\n\n if (field?.type === 'foreignKey') {\n return 'foreignKey';\n }\n\n if (field?.type === 'crossPackageRef') {\n return 'crossPackageRef';\n }\n\n return undefined;\n }\n\n /**\n * Create an aggregated manifest that includes objects from all external packages\n *\n * This is used for STI schema generation to ensure ALL descendants are found,\n * regardless of which package they're defined in.\n *\n * @param manifest - The local manifest\n * @returns Aggregated manifest with local + external objects\n */\n private createAggregatedManifest(\n manifest: SmartObjectManifest,\n ): SmartObjectManifest {\n // Start with a copy of local objects\n const aggregatedObjects: Record<string, SmartObjectDefinition> = {\n ...manifest.objects,\n };\n\n // Load and merge external package objects\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n for (const packageName of manifest.smrtDependencies) {\n const externalManifest = loadExternalManifestSync(packageName);\n if (externalManifest) {\n // Merge external objects (local objects take precedence on collision)\n for (const [name, obj] of Object.entries(externalManifest.objects)) {\n if (!aggregatedObjects[name]) {\n aggregatedObjects[name] = obj;\n }\n }\n\n console.log(\n `[manifest-generator] Aggregated ${Object.keys(externalManifest.objects).length} objects from ${packageName}`,\n );\n }\n }\n }\n\n return {\n ...manifest,\n objects: aggregatedObjects,\n };\n }\n\n /**\n * Check if an object is an STI child class (inherits from STI base)\n *\n * Walks up the inheritance chain to find if any ancestor has tableStrategy: 'sti'.\n * Also checks external SMRT packages for parent class definitions.\n */\n private isSTIChildClass(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n ): boolean {\n if (!obj.extends) return false;\n\n // Build a lookup map for efficient access\n const objectsByName = new Map<string, SmartObjectDefinition>();\n for (const [_name, objDef] of Object.entries(manifest.objects)) {\n objectsByName.set(objDef.className, objDef);\n objectsByName.set(objDef.className.toLowerCase(), objDef);\n }\n\n // Walk up the inheritance chain looking for STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n let parentObj = objectsByName.get(currentClass);\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentObj) break; // Parent not found anywhere (e.g., SmrtObject)\n\n if (parentObj.decoratorConfig?.tableStrategy === 'sti') {\n return true; // Found STI ancestor\n }\n\n currentClass = parentObj.extends;\n }\n\n return false;\n }\n\n /**\n * Check whether `obj` extends a framework abstract base class anywhere\n * in its chain.\n *\n * Framework abstract bases (`SmrtHierarchical`, `SmrtJunction`, …) have\n * no table of their own — fields they declare must be merged into every\n * subclass's manifest, even when the subclass uses CTI. Without this,\n * a class like `Account extends SmrtHierarchical` would silently lose\n * `parentId` from its `fields` map and downstream WHERE-clause\n * validation would reject queries on the inherited column.\n *\n * Identified by name against the same hardcoded set the scanner's\n * `FRAMEWORK_BASE_CLASSES` recognizes (`packages/scanner/src/\n * inheritance-resolver.ts`). Keep the two lists in sync.\n */\n private extendsFrameworkAbstractBase(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n manifest: SmartObjectManifest,\n ): boolean {\n if (!obj.extends) return false;\n\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(currentClass)) {\n return true;\n }\n\n let parentObj = objectsByName.get(currentClass);\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n if (!parentObj) break;\n\n currentClass = parentObj.extends;\n }\n\n return false;\n }\n\n /**\n * Find full STI base class info (className + tableName)\n *\n * Walks up the inheritance chain to find the STI base class and returns\n * both its className and tableName. This is critical for external STI bases\n * where the child needs to use the base's table name for schema generation.\n */\n private findSTIBaseInfo(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n ): { className: string; tableName: string } | undefined {\n if (!obj.extends) return undefined;\n\n // Build a lookup map for efficient access\n const objectsByName = new Map<string, SmartObjectDefinition>();\n for (const [_name, objDef] of Object.entries(manifest.objects)) {\n objectsByName.set(objDef.className, objDef);\n objectsByName.set(objDef.className.toLowerCase(), objDef);\n }\n\n // Track the oldest STI base found as we walk up\n // (we need to keep walking to find the ROOT STI class, not the first one)\n let stiBaseInfo: { className: string; tableName: string } | undefined;\n\n // Walk up the inheritance chain looking for the OLDEST STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n let parentObj = objectsByName.get(currentClass);\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentObj) break;\n\n if (parentObj.decoratorConfig?.tableStrategy === 'sti') {\n // Found an STI ancestor - it becomes the new candidate base\n // Keep walking to find the OLDEST/ROOT STI class in the hierarchy\n const tableName =\n parentObj.decoratorConfig?.tableName ||\n parentObj.schema?.tableName ||\n this.classNameToTableName(parentObj.className);\n stiBaseInfo = {\n className: parentObj.className,\n tableName,\n };\n }\n\n currentClass = parentObj.extends;\n }\n\n return stiBaseInfo; // Return the oldest STI ancestor found (or undefined if none)\n }\n\n /**\n * Convert class name to table name (snake_case pluralized)\n *\n * IMPORTANT: Must use the same algorithm as runtime's tableNameFromClass()\n * to ensure manifest-generated table names match runtime-derived names.\n */\n private classNameToTableName(className: string): string {\n // Use the shared pluralization function that handles English plurals correctly\n // (e.g., 'Currency' → 'currencies', 'JournalEntry' → 'journal_entries')\n return classnameToTablename(className);\n }\n\n private normalizeFrameworkInheritedField(\n ancestorName: string,\n fieldName: string,\n fieldDef: any,\n childClassName: string,\n ): any {\n if (\n this.simpleClassName(ancestorName) === 'SmrtHierarchical' &&\n fieldName === 'parentId'\n ) {\n return {\n ...fieldDef,\n type: 'foreignKey',\n related: childClassName,\n required: false,\n _meta: {\n ...(fieldDef._meta || {}),\n nullable: true,\n },\n };\n }\n\n return fieldDef;\n }\n\n private simpleClassName(className: string): string {\n return className.includes(':')\n ? className.split(':').pop() || className\n : className;\n }\n\n /**\n * Merge inherited fields into child classes (build-time inheritance resolution)\n *\n * For STI hierarchies, child classes don't define their own fields in source code\n * (they inherit from parent). This method merges parent fields into child manifests\n * so that runtime code doesn't need to do field resolution.\n *\n * Also handles collection classes (SmrtCollection<T>) that should inherit their\n * item class's tableName and collection when the item uses STI.\n *\n * Handles multi-level inheritance (grandparents, great-grandparents, etc.)\n * Automatically loads parent class definitions from external SMRT packages when needed\n *\n * @param manifest - The manifest to process in-place\n */\n public mergeInheritedFields(manifest: SmartObjectManifest): void {\n // Build a map of className -> objectDef for fast lookup\n const objectsByName = new Map<string, SmartObjectDefinition>();\n for (const [name, obj] of Object.entries(manifest.objects)) {\n objectsByName.set(obj.className, obj);\n // Also store by lowercase name for case-insensitive lookup\n objectsByName.set(obj.className.toLowerCase(), obj);\n }\n\n // FIRST PASS: Handle STI field merging and tableName inheritance\n // This must happen FIRST so that item classes (like Meeting) have their tableName\n // inherited from their STI base (like Event) before collection classes (like Meetings)\n // try to read it\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.extends) continue; // No parent, skip\n\n // Merge inherited fields when ANY of:\n // (a) STI is in play — shared table with parent, full chain merges.\n // (b) An ancestor in the chain is a framework abstract base class\n // (SmrtHierarchical, SmrtJunction, …) — those have no table of\n // their own, so structural fields they declare (e.g.\n // `SmrtHierarchical.parentId`) must propagate into every CTI\n // subclass's manifest, otherwise WHERE-clause validation\n // rejects queries against the inherited column.\n // For plain CTI through a user-defined base with its own table, we\n // skip merging — each class keeps its own table layout.\n const usesSTI = this.isSTIClass(obj, objectsByName, manifest);\n const extendsFrameworkBase = this.extendsFrameworkAbstractBase(\n obj,\n objectsByName,\n manifest,\n );\n\n if (!usesSTI && !extendsFrameworkBase) {\n continue; // Plain CTI through a user-defined base — skip.\n }\n\n console.log(\n `[manifest-generator] Merging inherited fields for ${obj.className} from ${obj.extends}`,\n );\n\n // Build full inheritance chain (base -> child)\n const inheritanceChain: string[] = [];\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) {\n console.warn(\n `[manifest-generator] Circular inheritance detected for ${obj.className}`,\n );\n break;\n }\n visited.add(currentClass);\n inheritanceChain.unshift(currentClass); // Add to front (building base -> child)\n\n let parentObj = objectsByName.get(currentClass);\n\n // Skip self-reference: when a local class has the same name as its\n // imported parent (e.g., local Performer extends external Performer),\n // objectsByName returns the child itself. Skip it so we fall through\n // to the external package lookup.\n if (parentObj === obj) {\n parentObj = undefined;\n }\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentObj) break; // Parent not found anywhere (e.g., SmrtObject)\n currentClass = parentObj.extends;\n }\n\n console.log(\n `[manifest-generator] Inheritance chain for ${obj.className}: ${inheritanceChain.join(' -> ')}`,\n );\n\n // Merge fields from ancestors (base to child).\n //\n // STI path: pull in fields from every ancestor — they all share one\n // table.\n //\n // Non-STI (framework-base) path: pull in fields ONLY from framework\n // abstract bases (SmrtHierarchical, …). User-defined ancestors with\n // their own `@smrt()` decorator have their own tables in CTI, so\n // merging their columns onto a descendant would generate the wrong\n // schema.\n const mergedFields: Record<string, any> = {};\n const mergedMethods: Record<string, any> = {};\n\n for (const ancestorName of inheritanceChain) {\n const ancestor = objectsByName.get(ancestorName);\n if (!ancestor) continue;\n\n const ancestorIsFrameworkBase =\n FRAMEWORK_ABSTRACT_BASE_NAMES.has(ancestorName);\n if (!usesSTI && !ancestorIsFrameworkBase) {\n continue;\n }\n\n // Merge fields (child fields override parent fields with same name)\n for (const [fieldName, fieldDef] of Object.entries(ancestor.fields)) {\n if (!mergedFields[fieldName]) {\n mergedFields[fieldName] = this.normalizeFrameworkInheritedField(\n ancestorName,\n fieldName,\n fieldDef,\n obj.className,\n );\n }\n }\n\n // Merge methods (child methods override parent methods)\n for (const [methodName, methodDef] of Object.entries(\n ancestor.methods || {},\n )) {\n if (!mergedMethods[methodName]) {\n mergedMethods[methodName] = methodDef;\n }\n }\n }\n\n // Add child's own fields (override any parent fields with same name)\n for (const [fieldName, fieldDef] of Object.entries(obj.fields)) {\n mergedFields[fieldName] = fieldDef;\n }\n\n // Add child's own methods\n for (const [methodName, methodDef] of Object.entries(obj.methods || {})) {\n mergedMethods[methodName] = methodDef;\n }\n\n // Update object definition with merged fields\n obj.fields = mergedFields;\n obj.methods = mergedMethods;\n\n // Inherit tableName and collection from STI base class\n // STI subclasses share the parent's table, so they should use the same collection name\n const stiBase = this.findSTIBase(obj, objectsByName, manifest);\n if (stiBase && stiBase !== obj) {\n // Determine the STI base's table name (explicit or derived from className)\n // Note: We don't use stiBase.collection as fallback because collection uses\n // lowercase-only format (e.g., 'querytestevents') while tableName needs\n // snake_case format (e.g., 'query_test_events')\n const baseTableName =\n stiBase.decoratorConfig?.tableName ||\n this.classNameToTableName(stiBase.className);\n\n // Inherit tableName from STI base\n obj.decoratorConfig = obj.decoratorConfig || {};\n obj.decoratorConfig.tableName = baseTableName;\n console.log(\n `[manifest-generator] ${obj.className} inherits tableName: '${baseTableName}' from ${stiBase.className}`,\n );\n\n // Inherit tableStrategy from STI base (so runtime doesn't need to walk inheritance chain)\n if (stiBase.decoratorConfig?.tableStrategy) {\n obj.decoratorConfig.tableStrategy =\n stiBase.decoratorConfig.tableStrategy;\n console.log(\n `[manifest-generator] ${obj.className} inherits tableStrategy: '${stiBase.decoratorConfig.tableStrategy}' from ${stiBase.className}`,\n );\n }\n\n // Inherit collection name from STI base (all STI classes share one table)\n if (stiBase.collection !== obj.collection) {\n console.log(\n `[manifest-generator] ${obj.className} inherits collection: '${stiBase.collection}' from ${stiBase.className}`,\n );\n obj.collection = stiBase.collection;\n }\n }\n\n console.log(\n `[manifest-generator] ✅ ${obj.className} now has ${Object.keys(mergedFields).length} fields (including inherited)`,\n );\n }\n\n // SECOND PASS: Handle collection classes that should inherit from their item class\n // This must happen AFTER STI field merging so item classes have their tableName set\n for (const obj of Object.values(manifest.objects)) {\n // Check if this is a collection class (extends SmrtCollection)\n const isCollection =\n obj.extends === 'SmrtCollection' ||\n this.extendsCollection(obj, objectsByName);\n\n if (isCollection) {\n // Find the item class from _itemClass static property\n const itemClass = this.findItemClass(obj, manifest, objectsByName);\n\n if (itemClass) {\n console.log(\n `[manifest-generator] ${obj.className} is a collection class for ${itemClass.className}`,\n );\n\n // Inherit tableName from item class (which may have inherited it from STI base)\n if (itemClass.decoratorConfig?.tableName) {\n obj.decoratorConfig = obj.decoratorConfig || {};\n obj.decoratorConfig.tableName = itemClass.decoratorConfig.tableName;\n console.log(\n `[manifest-generator] ${obj.className} inherits tableName: '${itemClass.decoratorConfig.tableName}' from item class ${itemClass.className}`,\n );\n }\n\n // Inherit collection name from item class\n if (itemClass.collection !== obj.collection) {\n console.log(\n `[manifest-generator] ${obj.className} inherits collection: '${itemClass.collection}' from item class ${itemClass.className} (was '${obj.collection}')`,\n );\n obj.collection = itemClass.collection;\n }\n }\n }\n }\n }\n\n /**\n * Check if a class extends SmrtCollection (directly or indirectly)\n *\n * @param obj - The object definition to check\n * @param objectsByName - Map of className -> objectDef for lookups\n * @returns true if this class extends SmrtCollection\n */\n private extendsCollection(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n ): boolean {\n if (!obj.extends) return false;\n\n // Walk up inheritance chain looking for SmrtCollection\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n if (currentClass === 'SmrtCollection') return true;\n\n const parentObj = objectsByName.get(currentClass);\n if (!parentObj) break;\n\n currentClass = parentObj.extends;\n }\n\n return false;\n }\n\n /**\n * Find the item class for a collection class\n *\n * Lookup priority:\n * 1. extendsTypeArg - Generic type argument from extends clause (e.g., \"Meeting\" from SmrtCollection<Meeting>)\n * 2. _itemClass static property - May be captured by AST scanner\n * 3. Name-based inference - Fallback (e.g., \"Meetings\" -> \"Meeting\")\n *\n * @param collectionObj - The collection class definition\n * @param manifest - The manifest\n * @param objectsByName - Map of className -> objectDef for lookups\n * @returns Item class definition or undefined\n */\n private findItemClass(\n collectionObj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n objectsByName: Map<string, SmartObjectDefinition>,\n ): SmartObjectDefinition | undefined {\n // PRIORITY 1: Use generic type argument from extends clause\n // This is the most reliable method: SmrtCollection<Meeting> -> \"Meeting\"\n if (collectionObj.extendsTypeArg) {\n const itemClassName = collectionObj.extendsTypeArg;\n console.log(\n `[manifest-generator] ${collectionObj.className} has extendsTypeArg: ${itemClassName}`,\n );\n\n // Try to find the item class by name in local manifest\n const itemClass = objectsByName.get(itemClassName);\n if (itemClass) {\n console.log(\n `[manifest-generator] Found item class ${itemClassName} in local manifest`,\n );\n return itemClass;\n }\n\n // Try loading from external packages\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n const externalItemClass = this.loadParentFromExternalPackage(\n itemClassName,\n manifest.smrtDependencies,\n objectsByName,\n );\n if (externalItemClass) {\n console.log(\n `[manifest-generator] Found item class ${itemClassName} in external package`,\n );\n return externalItemClass;\n }\n }\n }\n\n // PRIORITY 2: Look for _itemClass static field in the collection class\n // This is defined like: static readonly _itemClass = Meeting;\n // Note: AST scanner currently skips static properties, so this rarely works\n const itemClassField = collectionObj.fields._itemClass;\n\n if (itemClassField) {\n // Extract class name from the field's default value or metadata\n // The AST scanner might capture this as a reference\n const itemClassName = itemClassField.related || itemClassField.default;\n\n if (itemClassName && typeof itemClassName === 'string') {\n // Try to find the item class by name\n const itemClass = objectsByName.get(itemClassName);\n if (itemClass) {\n return itemClass;\n }\n\n // Try loading from external packages\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n return this.loadParentFromExternalPackage(\n itemClassName,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n }\n }\n\n // PRIORITY 3: Fallback - Try to infer from collection class name\n // Generate candidate item class names and check if they exist\n const collectionName = collectionObj.className;\n const candidates: string[] = [];\n\n // Strip \"Collection\" suffix first if present\n let baseName = collectionName;\n if (baseName.endsWith('Collection')) {\n baseName = baseName.slice(0, -'Collection'.length);\n }\n\n // Generate singularization candidates (order matters - try most specific first)\n // 1. Exact name (e.g., \"Event\" from \"EventCollection\")\n candidates.push(baseName);\n\n // 2. Remove trailing 's' (e.g., \"Meetings\" -> \"Meeting\")\n if (baseName.endsWith('s') && baseName.length > 1) {\n candidates.push(baseName.slice(0, -1));\n }\n\n // 3. Handle 'ies' -> 'y' (e.g., \"Categories\" -> \"Category\")\n if (baseName.endsWith('ies') && baseName.length > 3) {\n candidates.push(`${baseName.slice(0, -3)}y`);\n }\n\n // 4. Handle 'es' -> '' for words ending in s/x/z/ch/sh (e.g., \"Statuses\" -> \"Status\")\n if (baseName.endsWith('es') && baseName.length > 2) {\n candidates.push(baseName.slice(0, -2));\n }\n\n // Try each candidate against local classes first, then external packages\n // Skip candidates that match the collection class itself\n for (const candidate of candidates) {\n if (candidate === collectionObj.className) continue; // Don't match self\n const itemClass = objectsByName.get(candidate);\n if (itemClass) {\n return itemClass;\n }\n }\n\n // Try loading from external packages\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n for (const candidate of candidates) {\n if (candidate === collectionObj.className) continue; // Don't match self\n const itemClass = this.loadParentFromExternalPackage(\n candidate,\n manifest.smrtDependencies,\n objectsByName,\n );\n if (itemClass) {\n return itemClass;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Check if a class uses STI (either explicitly or inherited from an ancestor)\n *\n * Walks up the inheritance chain to find if any ancestor has tableStrategy: 'sti'.\n * If found, all descendants inherit STI and should have fields merged.\n * Also checks external SMRT packages for parent class definitions.\n *\n * @param obj - The object definition to check\n * @param objectsByName - Map of className -> objectDef for lookups\n * @param manifest - The manifest (for accessing smrtDependencies)\n * @returns true if this class uses STI (directly or inherited)\n */\n private isSTIClass(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n manifest: SmartObjectManifest,\n ): boolean {\n // Check if explicitly marked as STI\n if (obj.decoratorConfig?.tableStrategy === 'sti') {\n return true;\n }\n\n // Walk up the inheritance chain looking for STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) {\n break; // Circular inheritance, stop\n }\n visited.add(currentClass);\n\n let parentDef = objectsByName.get(currentClass);\n\n // Skip self-reference (local class with same name as imported parent)\n if (parentDef === obj) {\n parentDef = undefined;\n }\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentDef &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentDef = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentDef) break; // Parent not found anywhere\n\n // Check if this ancestor uses STI\n if (parentDef.decoratorConfig?.tableStrategy === 'sti') {\n return true; // Found STI ancestor\n }\n\n currentClass = parentDef.extends;\n }\n\n return false; // No STI in hierarchy\n }\n\n /**\n * Find the STI base class for a given object\n *\n * Walks up the inheritance chain to find the first ancestor that defines\n * tableStrategy: 'sti'. This is the class that owns the shared table.\n *\n * @param obj - The object definition to find the STI base for\n * @param objectsByName - Map of className -> objectDef for lookups\n * @param manifest - The manifest (for accessing smrtDependencies)\n * @returns The STI base class definition, or the object itself if it's the base\n */\n private findSTIBase(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n manifest: SmartObjectManifest,\n ): SmartObjectDefinition | undefined {\n // Track the oldest STI class found as we walk up\n let stiBase: SmartObjectDefinition | undefined;\n\n // If this object explicitly defines STI, it's a candidate (but ancestors may also be STI)\n if (obj.decoratorConfig?.tableStrategy === 'sti') {\n stiBase = obj;\n }\n\n // Walk up the inheritance chain looking for the oldest STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) {\n break; // Circular inheritance, stop\n }\n visited.add(currentClass);\n\n let parentDef = objectsByName.get(currentClass);\n\n // Skip self-reference (local class with same name as imported parent)\n if (parentDef === obj) {\n parentDef = undefined;\n }\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentDef &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentDef = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentDef) break; // Parent not found anywhere\n\n // Check if this ancestor defines STI - if so, it becomes the new candidate base\n // (we keep walking to find the oldest/root STI class)\n if (parentDef.decoratorConfig?.tableStrategy === 'sti') {\n stiBase = parentDef;\n }\n\n currentClass = parentDef.extends;\n }\n\n return stiBase; // Return the oldest STI ancestor found (or undefined if none)\n }\n\n /**\n * Load parent class definition from external SMRT packages\n *\n * When a child class extends a parent from an external package (e.g., praeco's Council extends\n * smrt-profiles' Organization), this method loads the parent's manifest and extracts the\n * parent's field definitions.\n *\n * @param parentClassName - Name of the parent class to find\n * @param smrtDependencies - List of external SMRT packages to search\n * @param objectsByName - Map to cache loaded external objects\n * @returns Parent object definition if found, undefined otherwise\n */\n private loadParentFromExternalPackage(\n parentClassName: string,\n smrtDependencies: string[],\n objectsByName: Map<string, SmartObjectDefinition>,\n ): SmartObjectDefinition | undefined {\n // Try each external SMRT dependency\n for (const packageName of smrtDependencies) {\n const externalManifest = loadExternalManifestSync(packageName);\n\n if (!externalManifest) {\n continue;\n }\n\n // Use lookupInManifest for O(1) lookup via cached className index\n // Handles both qualified names and simple class names\n const parentObj = lookupInManifest(externalManifest, parentClassName);\n\n if (parentObj) {\n // Cache the loaded parent object for future lookups\n objectsByName.set(parentObj.className, parentObj);\n objectsByName.set(parentObj.className.toLowerCase(), parentObj);\n\n return parentObj;\n }\n }\n\n return undefined;\n }\n\n /**\n * Determine import path from package.json exports\n *\n * Tries the following strategies in order:\n * 1. package.json exports[\"./objects\"] - Specific objects export\n * 2. package.json exports[\".\"] - Main export\n * 3. package.json main - Main field\n * 4. Fallback to package name\n */\n private determineImportPath(packageJson: any, _filePath?: string): string {\n const packageName = packageJson.name;\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') {\n if (mainExport.import) {\n return packageName;\n }\n if (mainExport.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 * Generate TypeScript interfaces from manifest\n */\n generateTypeDefinitions(manifest: SmartObjectManifest): string {\n const interfaces: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n interfaces.push(this.generateInterface(obj));\n }\n\n return interfaces.join('\\n\\n');\n }\n\n /**\n * Generate a single interface definition\n */\n private generateInterface(obj: SmartObjectDefinition): string {\n const fields = Object.entries(obj.fields)\n .map(([name, field]) => {\n const optional = !field.required ? '?' : '';\n const type = this.mapFieldTypeToTS(field.type);\n return ` ${name}${optional}: ${type};`;\n })\n .join('\\n');\n\n return `export interface ${obj.className}Data {\n${fields}\n}`;\n }\n\n /**\n * Map field types to TypeScript types\n */\n private mapFieldTypeToTS(fieldType: string): string {\n switch (fieldType) {\n case 'text':\n return 'string';\n case 'decimal':\n return 'number';\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'datetime':\n return 'Date | string';\n case 'json':\n return 'any';\n case 'foreignKey':\n return 'string';\n case 'crossPackageRef':\n return 'string';\n default:\n return 'any';\n }\n }\n\n /**\n * Generate simple endpoint list for testing/documentation\n */\n generateRestEndpoints(manifest: SmartObjectManifest): string {\n const endpoints: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const apiConfig = obj.decoratorConfig.api;\n if (apiConfig !== false) {\n endpoints.push(...this.getSimpleEndpoints(obj));\n }\n }\n\n return endpoints.join('\\n');\n }\n\n /**\n * Generate REST endpoint code implementations\n */\n generateRestEndpointCode(manifest: SmartObjectManifest): string {\n const endpoints: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const apiConfig = obj.decoratorConfig.api;\n if (apiConfig !== false) {\n endpoints.push(this.generateRestEndpoint(obj));\n }\n }\n\n return endpoints.join('\\n\\n');\n }\n\n /**\n * Get simple endpoint strings for an object\n */\n private getApiRouteMetadata(\n obj: SmartObjectDefinition,\n actionName: string,\n actionDef: { isStatic?: boolean },\n ): {\n scope: 'item' | 'collection';\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n } {\n const config =\n obj.decoratorConfig.api && typeof obj.decoratorConfig.api === 'object'\n ? obj.decoratorConfig.api\n : undefined;\n const routeConfig = config?.routes?.[actionName];\n const normalizedPath = (routeConfig?.path || actionName)\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('/');\n const isCollectionClass =\n obj.extends === 'SmrtCollection' || !!obj.extendsTypeArg;\n\n return {\n scope:\n routeConfig?.scope ||\n (isCollectionClass || actionDef.isStatic ? 'collection' : 'item'),\n method:\n routeConfig?.method?.toUpperCase() === 'GET' ||\n routeConfig?.method?.toUpperCase() === 'POST' ||\n routeConfig?.method?.toUpperCase() === 'PUT' ||\n routeConfig?.method?.toUpperCase() === 'PATCH' ||\n routeConfig?.method?.toUpperCase() === 'DELETE'\n ? (routeConfig.method.toUpperCase() as\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'PATCH'\n | 'DELETE')\n : 'POST',\n path: normalizedPath || actionName,\n };\n }\n\n private getSimpleEndpoints(obj: SmartObjectDefinition): string[] {\n const { collection } = obj;\n const config = obj.decoratorConfig.api;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n const isCollectionClass =\n obj.extends === 'SmrtCollection' || !!obj.extendsTypeArg;\n\n const endpoints: string[] = [];\n\n // Determine which operations to include\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (!isCollectionClass) {\n if (shouldInclude('list')) {\n endpoints.push(`GET /${collection}`);\n }\n if (shouldInclude('create')) {\n endpoints.push(`POST /${collection}`);\n }\n if (shouldInclude('get')) {\n endpoints.push(`GET /${collection}/:id`);\n }\n if (shouldInclude('update')) {\n endpoints.push(`PUT /${collection}/:id`);\n }\n if (shouldInclude('delete')) {\n endpoints.push(`DELETE /${collection}/:id`);\n }\n }\n\n const standardActions = ['list', 'get', 'create', 'update', 'delete'];\n for (const [actionName, actionDef] of Object.entries(obj.methods)) {\n if (\n standardActions.includes(actionName) ||\n !actionDef.isPublic ||\n !shouldInclude(actionName)\n ) {\n continue;\n }\n\n const route = this.getApiRouteMetadata(obj, actionName, actionDef);\n if (\n route.scope === 'collection' &&\n !isCollectionClass &&\n !actionDef.isStatic\n ) {\n continue;\n }\n\n if (route.scope === 'item' && isCollectionClass) {\n continue;\n }\n\n const suffix = route.scope === 'collection' ? '' : '/:id';\n endpoints.push(`${route.method} /${collection}${suffix}/${route.path}`);\n }\n\n return endpoints;\n }\n\n /**\n * Generate a single REST endpoint\n */\n private generateRestEndpoint(obj: SmartObjectDefinition): string {\n const { collection, className } = obj;\n const config = obj.decoratorConfig.api;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n\n const operations = [];\n\n // Determine which operations to include\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (shouldInclude('list')) {\n operations.push(` // GET /${collection} - List ${collection}`);\n operations.push(` app.get('/${collection}', async (req: Request) => {`);\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const items = await collection.list(req.query);');\n operations.push(' return Response.json(items);');\n operations.push(' });');\n }\n\n if (shouldInclude('get')) {\n operations.push(` // GET /${collection}/:id - Get ${className}`);\n operations.push(\n ` app.get('/${collection}/:id', async (req: Request) => {`,\n );\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const item = await collection.get(req.params.id);');\n operations.push(\n ` if (!item) return new Response('Not found', { status: 404 });`,\n );\n operations.push(' return Response.json(item);');\n operations.push(' });');\n }\n\n if (shouldInclude('create')) {\n operations.push(` // POST /${collection} - Create ${className}`);\n operations.push(` app.post('/${collection}', async (req: Request) => {`);\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const data = await req.json();');\n operations.push(' const item = await collection.create(data);');\n operations.push(' return Response.json(item, { status: 201 });');\n operations.push(' });');\n }\n\n if (shouldInclude('update')) {\n operations.push(` // PUT /${collection}/:id - Update ${className}`);\n operations.push(\n ` app.put('/${collection}/:id', async (req: Request) => {`,\n );\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const data = await req.json();');\n operations.push(\n ' const item = await collection.update(req.params.id, data);',\n );\n operations.push(\n ` if (!item) return new Response('Not found', { status: 404 });`,\n );\n operations.push(' return Response.json(item);');\n operations.push(' });');\n }\n\n if (shouldInclude('delete')) {\n operations.push(` // DELETE /${collection}/:id - Delete ${className}`);\n operations.push(\n ` app.delete('/${collection}/:id', async (req: Request) => {`,\n );\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(\n ' const success = await collection.delete(req.params.id);',\n );\n operations.push(\n ` if (!success) return new Response('Not found', { status: 404 });`,\n );\n operations.push(` return new Response('', { status: 204 });`);\n operations.push(' });');\n }\n\n return `// ${className} endpoints\\n${operations.join('\\n')}`;\n }\n\n /**\n * Generate simple MCP tool names for testing/documentation\n */\n generateMCPTools(manifest: SmartObjectManifest): string {\n const tools: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const mcpConfig = obj.decoratorConfig.mcp;\n if (mcpConfig !== false) {\n tools.push(...this.getSimpleMCPToolNames(obj));\n }\n }\n\n return tools.join('\\n');\n }\n\n /**\n * Generate MCP tool JSON definitions\n */\n generateMCPToolsCode(manifest: SmartObjectManifest): string {\n const tools: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const mcpConfig = obj.decoratorConfig.mcp;\n if (mcpConfig !== false) {\n tools.push(this.generateMCPTool(obj));\n }\n }\n\n return `[\\n${tools.join(',\\n')}\\n]`;\n }\n\n /**\n * Get simple MCP tool names for an object\n */\n private getSimpleMCPToolNames(obj: SmartObjectDefinition): string[] {\n const { collection } = obj;\n const config = obj.decoratorConfig.mcp;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n\n const tools: string[] = [];\n\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (shouldInclude('list')) {\n tools.push(`list_${collection}`);\n }\n if (shouldInclude('get')) {\n tools.push(`get_${collection}`);\n }\n if (shouldInclude('create')) {\n tools.push(`create_${collection}`);\n }\n if (shouldInclude('update')) {\n tools.push(`update_${collection}`);\n }\n if (shouldInclude('delete')) {\n tools.push(`delete_${collection}`);\n }\n\n return tools;\n }\n\n /**\n * Generate a single MCP tool\n */\n private generateMCPTool(obj: SmartObjectDefinition): string {\n const { collection, className, name } = obj;\n const config = obj.decoratorConfig.mcp;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n\n const tools = [];\n\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (shouldInclude('list')) {\n tools.push(` {\n name: \"list_${collection}\",\n description: \"List ${collection}\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\" },\n offset: { type: \"number\" },\n where: { type: \"object\" }\n }\n }\n }`);\n }\n\n if (shouldInclude('get')) {\n tools.push(` {\n name: \"get_${name}\",\n description: \"Get a ${name} by ID\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"The ${name} ID\" }\n },\n required: [\"id\"]\n }\n }`);\n }\n\n if (shouldInclude('create')) {\n const requiredFields = Object.entries(obj.fields)\n .filter(([_, field]) => field.required)\n .map(([fieldName]) => fieldName);\n\n tools.push(` {\n name: \"create_${name}\",\n description: \"Create a new ${name}\",\n inputSchema: {\n type: \"object\",\n properties: ${JSON.stringify(this.generateSchemaProperties(obj.fields), null, 6)},\n required: ${JSON.stringify(requiredFields)}\n }\n }`);\n }\n\n return tools.join(',\\n');\n }\n\n /**\n * Generate JSON schema properties for fields\n */\n private generateSchemaProperties(\n fields: Record<string, any>,\n ): Record<string, any> {\n const properties: Record<string, any> = {};\n\n for (const [name, field] of Object.entries(fields)) {\n properties[name] = {\n type: this.mapFieldTypeToJSON(field.type),\n description: field.description || `The ${name} field`,\n };\n\n if (field.min !== undefined) properties[name].minimum = field.min;\n if (field.max !== undefined) properties[name].maximum = field.max;\n if (field.minLength !== undefined)\n properties[name].minLength = field.minLength;\n if (field.maxLength !== undefined)\n properties[name].maxLength = field.maxLength;\n }\n\n return properties;\n }\n\n /**\n * Map field types to JSON Schema types\n */\n private mapFieldTypeToJSON(fieldType: string): string {\n switch (fieldType) {\n case 'text':\n return 'string';\n case 'decimal':\n return 'number';\n case 'integer':\n return 'integer';\n case 'boolean':\n return 'boolean';\n case 'datetime':\n return 'string';\n case 'json':\n return 'object';\n case 'foreignKey':\n return 'string';\n case 'crossPackageRef':\n return 'string';\n default:\n return 'string';\n }\n }\n\n /**\n * Generate agent manifests for Agent subclasses (fifth pass).\n *\n * For any SmartObjectDefinition with `agent` in its decoratorConfig,\n * auto-generates:\n * - Permissions from uiSlots (manage:*) and CLI/MCP methods (execute:*)\n * - Features from uiSlots and exposed methods\n * - Menu items from uiSlots\n * - Component declarations from package.json exports\n *\n * @param manifest - The manifest to process in-place\n * @param packageName - Package name for component export paths\n * @param packageJson - Full package.json for component discovery\n */\n generateAgentManifests(\n manifest: SmartObjectManifest,\n packageName?: string,\n packageJson?: any,\n ): void {\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.decoratorConfig.agent) continue;\n\n const agentConfig = obj.decoratorConfig.agent;\n const slug = obj.className.toLowerCase();\n const uiSlots: Record<string, AgentUISlotManifest> =\n obj.staticProperties?.uiSlots ?? {};\n\n // Derive permissions\n const permissions: AgentPermission[] = [];\n\n // From uiSlots: manage:<slotId>\n for (const [slotId, slot] of Object.entries(uiSlots)) {\n permissions.push({\n id: `manage:${slotId}`,\n label: `Manage ${(slot as AgentUISlotManifest).label || slotId}`,\n category: 'slot',\n defaultGranted: true,\n });\n }\n\n // From CLI/MCP methods: execute:<methodName>\n const exposedMethods = this.getExposedMethods(obj);\n for (const methodName of exposedMethods) {\n permissions.push({\n id: `execute:${methodName}`,\n label: `Execute ${methodName}`,\n category: 'method',\n defaultGranted: true,\n });\n }\n\n // Derive features\n const features: AgentFeature[] = [];\n\n for (const [slotId, slot] of Object.entries(uiSlots)) {\n const typedSlot = slot as AgentUISlotManifest;\n features.push({\n id: slotId,\n label: typedSlot.label || slotId,\n description: typedSlot.description,\n type: 'slot',\n });\n }\n\n for (const methodName of exposedMethods) {\n features.push({\n id: methodName,\n label: methodName,\n type: 'method',\n });\n }\n\n // Derive menu items from uiSlots (sorted by order)\n const menuItems: AgentMenuItem[] = Object.entries(uiSlots)\n .map(([slotId, slot]) => {\n const typedSlot = slot as AgentUISlotManifest;\n return {\n id: slotId,\n label: typedSlot.label || slotId,\n icon: typedSlot.icon,\n order: typedSlot.order ?? 999,\n path: `/agents/${slug}/${slotId}`,\n requiredPermission: `manage:${slotId}`,\n };\n })\n .sort((a, b) => a.order - b.order);\n\n // Derive component declarations from package.json exports\n const components: AgentComponentDeclaration[] = [];\n if (packageName && packageJson?.exports) {\n for (const [exportKey, exportValue] of Object.entries(\n packageJson.exports,\n )) {\n // Match patterns like './admin', './town', etc.\n if (exportKey === '.' || exportKey === './manifest') continue;\n\n // Check if this export has a svelte condition (component export)\n const hasSvelteCondition = this.hasSvelteExport(exportValue);\n if (hasSvelteCondition) {\n const type = exportKey.replace('./', '');\n components.push({\n exportPath: `${packageName}/${type}`,\n type,\n });\n }\n }\n }\n\n // Capture adminRoutes from static property (same pattern as uiSlots)\n const adminRoutes: AgentAdminRouteManifest[] =\n obj.staticProperties?.adminRoutes ?? [];\n\n // Capture signalSubscriptions from static property\n const signalSubscriptions: string[] =\n obj.staticProperties?.signalSubscriptions ?? [];\n\n const agentManifest: AgentManifest = {\n name: obj.className,\n slug,\n icon: agentConfig.icon,\n tier: agentConfig.tier || 'free',\n description: agentConfig.description,\n uiSlots,\n ...(adminRoutes.length > 0 ? { adminRoutes } : {}),\n ...(signalSubscriptions.length > 0 ? { signalSubscriptions } : {}),\n permissions,\n features,\n menuItems,\n components,\n };\n\n obj.agent = agentManifest;\n\n console.log(\n `[manifest-generator] Generated agent manifest for ${obj.className}: ` +\n `${permissions.length} permissions, ${features.length} features, ` +\n `${menuItems.length} menu items, ${components.length} components`,\n );\n }\n }\n\n /**\n * Get deduplicated list of method names exposed via CLI and MCP config\n */\n private getExposedMethods(obj: SmartObjectDefinition): string[] {\n const methods = new Set<string>();\n\n const cliConfig = obj.decoratorConfig.cli;\n if (cliConfig && typeof cliConfig === 'object' && cliConfig.include) {\n for (const m of cliConfig.include) {\n methods.add(m);\n }\n }\n\n const mcpConfig = obj.decoratorConfig.mcp;\n if (mcpConfig && typeof mcpConfig === 'object' && mcpConfig.include) {\n for (const m of mcpConfig.include) {\n methods.add(m);\n }\n }\n\n return Array.from(methods);\n }\n\n /**\n * Check if an export value has a svelte condition (indicating a component export)\n */\n private hasSvelteExport(exportValue: any): boolean {\n if (!exportValue || typeof exportValue !== 'object') return false;\n\n // Check for { svelte: ... } condition\n if ('svelte' in exportValue) return true;\n\n // Check nested conditions like { import: { svelte: ... } }\n for (const val of Object.values(exportValue)) {\n if (val && typeof val === 'object' && 'svelte' in (val as object)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Save manifest to file\n */\n saveManifest(manifest: SmartObjectManifest, filePath: string): void {\n const fs = require('node:fs');\n fs.writeFileSync(filePath, JSON.stringify(manifest, null, 2));\n }\n\n /**\n * Load manifest from file\n */\n loadManifest(filePath: string): SmartObjectManifest {\n const fs = require('node:fs');\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n}\n\n/**\n * Convenience function to generate manifest\n *\n * @param scanResults - Array of scan results containing object definitions\n * @param options - Optional configuration (passed to ManifestGenerator.generateManifest)\n */\nexport function generateManifest(\n scanResults: ScanResult[],\n options?: {\n packageName?: string;\n packageVersion?: string;\n packageJson?: any;\n smrtDependencies?: string[];\n includeVisibility?: SmrtVisibility[];\n },\n): SmartObjectManifest {\n const generator = new ManifestGenerator();\n return generator.generateManifest(scanResults, options);\n}\n"],"names":["require"],"mappings":"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"}
1
+ {"version":3,"file":"manifest-generator.js","sources":["../../src/scanner/manifest-generator.ts"],"sourcesContent":["/**\n * Manifest generator for creating service manifests from AST scan results\n */\n\nimport { createHash } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport {\n loadExternalManifestSync,\n lookupInManifest,\n} from '../manifest/manifest-loader.js';\nimport type { DatabaseEngine } from '../schema/ddl/types.js';\nimport { SchemaGenerator } from '../schema/generator.js';\nimport type {\n ColumnDefinition,\n SchemaDefinition,\n SQLDataType,\n} from '../schema/types.js';\nimport { generateToolManifest } from '../tools/tool-generator.js';\nimport { classnameToTablename, toSnakeCase } from '../utils/naming.js';\nimport { createQualifiedName } from '../utils/qualified-names.js';\nimport { isTestFile } from './test-file-patterns.js';\nimport type {\n AgentAdminRouteManifest,\n AgentComponentDeclaration,\n AgentFeature,\n AgentManifest,\n AgentMenuItem,\n AgentPermission,\n AgentUISlotManifest,\n FieldDefinition,\n ManifestColumnDefinition,\n ManifestSchema,\n MethodDefinition,\n ScanResult,\n SmartObjectDefinition,\n SmartObjectManifest,\n SmrtVisibility,\n ValidationRule,\n} from './types.js';\n\n/** Package.json shape consumed for import-path and component discovery. */\ninterface PackageJsonLike {\n name?: string;\n main?: string;\n exports?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Object form of the `@smrt({ tenantScoped })` config. Mirrors the object\n * branch of `SmartObjectConfig['tenantScoped']`; all keys optional because\n * the boolean shorthand normalizes to `{}`.\n */\ninterface TenantScopedOptions {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\n/** JSON Schema property entry emitted for a field in generated MCP tools. */\ninterface JsonSchemaProperty {\n type: string;\n description: string;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n}\n\ntype SchemaGeneratorLike = {\n generateSQL: (schema: SchemaDefinition, engine?: DatabaseEngine) => string;\n};\n\n// Create require function for synchronous module loading in ESM context\nconst require = createRequire(import.meta.url);\n\n/**\n * Framework abstract base classes whose declared fields must be merged\n * into every subclass's `fields` map.\n *\n * These classes live in SMRT framework packages, have no `@smrt()`\n * decorator, no table of their own, and contribute structural fields\n * (e.g. `SmrtHierarchical.parentId`) that subclasses query against —\n * without merging, downstream WHERE-clause validation rejects queries on\n * those columns.\n *\n * SmrtObject / SmrtClass / SmrtCollection are intentionally NOT in this\n * set even though they live in core. SmrtObject's universal columns\n * (`id`, `slug`, `context`, `created_at`, `updated_at`) are added by a\n * separate universal-baseline mechanism in `fieldsFromClass`, and merging\n * them here would double-write with subtly different `_meta` payloads\n * and regress existing field expectations.\n *\n * Keep in sync with `FRAMEWORK_BASE_CLASSES` in\n * `packages/scanner/src/inheritance-resolver.ts` — note that set is\n * broader: it controls scanner-level chain termination and stub\n * resolution, while this one only controls field merging.\n */\nconst FRAMEWORK_ABSTRACT_BASE_NAMES = new Set([\n 'SmrtJunction',\n 'SmrtHierarchical',\n 'SmrtPolymorphicAssociation',\n 'SmrtReport',\n 'SmrtReportCollection',\n]);\n\n/**\n * Infer visibility from file path and explicit config\n *\n * Priority:\n * 1. Explicit visibility in decorator config\n * 2. Auto-detect test files → 'test'\n * 3. Default to 'public'\n */\nfunction inferVisibility(\n filePath: string,\n explicitVisibility?: SmrtVisibility,\n): SmrtVisibility {\n if (explicitVisibility) return explicitVisibility;\n if (isTestFile(filePath)) return 'test';\n return 'public';\n}\n\nexport class ManifestGenerator {\n /**\n * Generate manifest from scan results\n *\n * @param scanResults - Array of scan results containing object definitions\n * @param options - Optional configuration\n * @param options.packageName - Package name to inject into manifest and object definitions\n * @param options.packageVersion - Package version\n * @param options.packageJson - Full package.json object for determining import paths\n * @param options.smrtDependencies - List of SMRT package dependencies to include in manifest\n * @param options.includeVisibility - Array of visibility levels to include (default: all)\n * - For published packages: ['public']\n * - For development: ['public', 'internal', 'test'] or omit for all\n */\n generateManifest(\n scanResults: ScanResult[],\n options?: {\n packageName?: string;\n packageVersion?: string;\n packageJson?: PackageJsonLike;\n smrtDependencies?: string[];\n includeVisibility?: SmrtVisibility[];\n },\n ): SmartObjectManifest {\n const manifest: SmartObjectManifest = {\n version: '1.0.0',\n timestamp: Date.now(),\n objects: {},\n };\n\n // Set package metadata at manifest level if provided\n if (options?.packageName) {\n manifest.packageName = options.packageName;\n }\n if (options?.packageVersion) {\n manifest.packageVersion = options.packageVersion;\n }\n // Set smrtDependencies BEFORE mergeInheritedFields() so external packages can be loaded\n if (options?.smrtDependencies) {\n manifest.smrtDependencies = options.smrtDependencies;\n }\n\n for (const result of scanResults) {\n for (const objectDef of result.objects) {\n // Set package metadata on object definition if provided\n if (options?.packageName) {\n objectDef.packageName = options.packageName;\n }\n if (options?.packageVersion) {\n objectDef.packageVersion = options.packageVersion;\n }\n\n // Generate qualified name (required for manifest keying)\n // Must have packageName to generate qualified name\n if (objectDef.packageName) {\n objectDef.qualifiedName = createQualifiedName(\n objectDef.packageName,\n objectDef.className,\n );\n }\n\n // Infer visibility from file path and decorator config\n objectDef.visibility = inferVisibility(\n objectDef.filePath,\n objectDef.decoratorConfig?.visibility as SmrtVisibility | undefined,\n );\n\n // Filter by visibility if specified\n // Skip objects that don't match the requested visibility levels\n if (\n options?.includeVisibility &&\n options.includeVisibility.length > 0 &&\n !options.includeVisibility.includes(objectDef.visibility)\n ) {\n // Skip this object - visibility not in allowed list\n continue;\n }\n\n // Determine import path from package.json exports\n if (options?.packageName && options?.packageJson) {\n objectDef.importPath = this.determineImportPath(\n options.packageJson,\n objectDef.filePath,\n );\n }\n\n // Set export names (defaults to className)\n objectDef.exportName = objectDef.exportName || objectDef.className;\n objectDef.collectionExportName =\n objectDef.collectionExportName || `${objectDef.className}Collection`;\n\n // Generate AI tools from methods if AI config exists\n if (objectDef.decoratorConfig.ai) {\n const methods = Object.values(objectDef.methods);\n const tools = generateToolManifest(\n methods,\n objectDef.decoratorConfig.ai,\n );\n\n // Store tools in object definition\n if (tools.length > 0) {\n objectDef.tools = tools;\n }\n }\n\n // Determine manifest key: use qualified name if available, fall back to lowercase name\n // During transition, some objects may not have qualified names\n const manifestKey = objectDef.qualifiedName || objectDef.name;\n\n // Check for collisions using the manifest key\n if (manifest.objects[manifestKey]) {\n const existing = manifest.objects[manifestKey];\n throw new Error(\n `Class name collision detected: '${objectDef.className}' (${manifestKey}) is defined in multiple files:\\n` +\n ` 1. ${existing.filePath}\\n` +\n ` 2. ${objectDef.filePath}\\n\\n` +\n `Class names must be unique within a package. Use different class names or separate packages.`,\n );\n }\n\n manifest.objects[manifestKey] = objectDef;\n }\n }\n\n // Report cache rows are safe to scope by tenant even when a report is\n // global: optional mode keeps tenant-less rows readable outside a tenant\n // context and gives tenant-scoped reports the tenant_id column their raw\n // aggregate refresh path must write.\n this.normalizeReportTenantScope(manifest);\n\n // Second pass: materialize implicit tenant fields before inheritance and schema generation.\n this.injectTenantScopedFields(manifest);\n\n // Third pass: Merge inherited fields for STI classes\n // This ensures STI subclasses have all parent fields inline in the manifest\n this.mergeInheritedFields(manifest);\n\n // Report models are read-only cache tables. Fill in the generated surface\n // and natural conflict key from report metadata before schema generation.\n this.normalizeReportObjects(manifest);\n\n // Fourth pass: Generate validation rules for all objects\n // This pre-computes validation rules from field definitions, eliminating\n // the need to compile validator closures at runtime (Issue #782)\n this.generateValidationRules(manifest);\n\n // Fifth pass: Generate schemas for each object (build-time schema generation)\n // This pre-computes DDL, indexes, and columns for efficient external package consumption\n this.generateSchemas(manifest);\n this.assertTenantScopedSchemaContract(manifest);\n\n // Sixth pass: Generate agent manifests for Agent subclasses\n // Derives permissions, features, menuItems, and components from code\n this.generateAgentManifests(\n manifest,\n options?.packageName,\n options?.packageJson,\n );\n\n return manifest;\n }\n\n /**\n * Materialize tenantScoped schema fields.\n *\n * Runtime registration already injects tenant fields for\n * `@smrt({ tenantScoped: true })`, but published manifests must contain the\n * same field before schema generation so migrations create `tenant_id`.\n */\n injectTenantScopedFields(manifest: SmartObjectManifest): void {\n for (const objectDef of Object.values(manifest.objects)) {\n this.injectTenantScopedField(objectDef);\n }\n }\n\n private injectTenantScopedField(objectDef: SmartObjectDefinition): void {\n const tenantScoped = objectDef.decoratorConfig?.tenantScoped;\n if (!tenantScoped) {\n return;\n }\n\n const { tenantConfig, tenantOptions } =\n this.normalizeTenantScopedConfig(tenantScoped);\n const fieldName = tenantConfig.field;\n const existingField = objectDef.fields[fieldName];\n const tenancyMeta = {\n isTenantIdField: true,\n ...tenantConfig,\n };\n\n if (existingField) {\n const fieldTypeFailure = this.getTenantScopedFieldTypeFailure(\n objectDef,\n fieldName,\n );\n if (fieldTypeFailure) {\n throw new Error(\n `Tenant-scoped field configuration invalid: ${fieldTypeFailure}`,\n );\n }\n\n existingField._meta = {\n ...existingField._meta,\n sqlType: 'UUID',\n __tenancy: {\n ...existingField._meta?.__tenancy,\n ...tenancyMeta,\n },\n };\n return;\n }\n\n objectDef.fields[fieldName] = {\n type: 'text',\n // Preserve legacy migration behavior: boolean `tenantScoped: true`\n // enables required-mode runtime scoping, but does not add a NOT NULL\n // column to existing tables unless mode is explicitly set.\n required: tenantOptions.mode === 'required',\n _meta: {\n generated: true,\n source: 'tenantScoped_decorator',\n sqlType: 'UUID',\n __tenancy: tenancyMeta,\n },\n };\n\n console.log(\n `[manifest-generator] Injected ${fieldName} field for ${objectDef.className} (tenantScoped: ${JSON.stringify(tenantConfig)})`,\n );\n }\n\n assertTenantScopedSchemaContract(manifest: SmartObjectManifest): void {\n const failures: string[] = [];\n\n for (const objectDef of Object.values(manifest.objects)) {\n const tenantScoped = objectDef.decoratorConfig?.tenantScoped;\n if (!tenantScoped) {\n continue;\n }\n\n const { tenantConfig } = this.normalizeTenantScopedConfig(tenantScoped);\n const fieldName = tenantConfig.field;\n const columnName = toSnakeCase(fieldName);\n\n if (!objectDef.fields[fieldName]) {\n failures.push(\n `${objectDef.className}: missing tenant-scoped field \"${fieldName}\"`,\n );\n continue;\n }\n\n const fieldTypeFailure = this.getTenantScopedFieldTypeFailure(\n objectDef,\n fieldName,\n );\n if (fieldTypeFailure) {\n failures.push(fieldTypeFailure);\n continue;\n }\n\n const schemaOwner = this.getTenantScopedSchemaOwner(objectDef, manifest);\n const schemaOwnerContext =\n schemaOwner === objectDef\n ? ''\n : ` on STI base \"${schemaOwner.className}\"`;\n\n if (!schemaOwner.schema?.columns) {\n failures.push(\n `${objectDef.className}: schema has not been generated for tenant-scoped column \"${columnName}\"${schemaOwnerContext}`,\n );\n continue;\n }\n\n if (!schemaOwner.schema.columns[columnName]) {\n failures.push(\n `${objectDef.className}: schema is missing tenant-scoped column \"${columnName}\"${schemaOwnerContext}`,\n );\n }\n }\n\n if (failures.length > 0) {\n throw new Error(\n `Tenant-scoped schema contract failed:\\n${failures\n .map((failure) => ` - ${failure}`)\n .join('\\n')}`,\n );\n }\n }\n\n private getTenantScopedSchemaOwner(\n objectDef: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n ): SmartObjectDefinition {\n if (!this.isSTIChildClass(objectDef, manifest)) {\n return objectDef;\n }\n\n const stiBase = this.findSTIBaseInfo(objectDef, manifest);\n if (!stiBase) {\n return objectDef;\n }\n\n const localBase = Object.values(manifest.objects).find(\n (candidate) => candidate.className === stiBase.className,\n );\n\n return localBase ?? objectDef;\n }\n\n private getTenantScopedFieldTypeFailure(\n objectDef: SmartObjectDefinition,\n fieldName: string,\n ): string | undefined {\n const field = objectDef.fields[fieldName];\n if (!field) {\n return undefined;\n }\n\n if (field.type !== 'text' && field.type !== 'foreignKey') {\n return `${objectDef.className}: tenant-scoped field \"${fieldName}\" must use type \"text\" or \"foreignKey\"; received \"${field.type}\"`;\n }\n\n const sqlType = field._meta?.sqlType;\n if (sqlType && !['TEXT', 'UUID'].includes(String(sqlType).toUpperCase())) {\n return `${objectDef.className}: tenant-scoped field \"${fieldName}\" must use SQL type \"UUID\" or legacy \"TEXT\"; received \"${sqlType}\"`;\n }\n\n return undefined;\n }\n\n private normalizeTenantScopedConfig(tenantScoped: unknown): {\n tenantOptions: TenantScopedOptions;\n tenantConfig: {\n mode: string;\n field: string;\n autoFilter: boolean;\n autoPopulate: boolean;\n allowSuperAdminBypass: boolean;\n };\n } {\n const tenantOptions: TenantScopedOptions =\n typeof tenantScoped === 'boolean'\n ? {}\n : (tenantScoped as TenantScopedOptions);\n\n return {\n tenantOptions,\n tenantConfig: {\n mode: tenantOptions.mode ?? 'required',\n field: tenantOptions.field ?? 'tenantId',\n autoFilter: tenantOptions.autoFilter ?? true,\n autoPopulate: tenantOptions.autoPopulate ?? true,\n allowSuperAdminBypass: tenantOptions.allowSuperAdminBypass ?? false,\n },\n };\n }\n\n /**\n * Generate pre-computed validation rules for all objects in the manifest.\n *\n * This extracts validation constraints (required, min, max, minLength, maxLength, pattern)\n * from field definitions and stores them as serializable rules in the manifest.\n *\n * At runtime, these rules can be evaluated without creating validator closures,\n * significantly reducing CLI startup time for projects with many SMRT objects.\n *\n * @param manifest - The manifest to process in-place\n */\n generateValidationRules(manifest: SmartObjectManifest): void {\n for (const [name, obj] of Object.entries(manifest.objects)) {\n const rules: ValidationRule[] = [];\n\n for (const [fieldName, field] of Object.entries(obj.fields)) {\n // Skip transient fields (they're not persisted, so no validation needed)\n if (field.transient || field._meta?.transient) {\n continue;\n }\n\n const options = field._meta || {};\n\n // Required field rule\n if (options.required || field.required) {\n rules.push({\n field: fieldName,\n rule: 'required',\n fieldType: field.type,\n });\n }\n\n // Numeric range rules (for integer, decimal fields)\n if (field.type === 'integer' || field.type === 'decimal') {\n if (options.min !== undefined || field.min !== undefined) {\n rules.push({\n field: fieldName,\n rule: 'min',\n value: options.min ?? field.min,\n fieldType: field.type,\n });\n }\n\n if (options.max !== undefined || field.max !== undefined) {\n rules.push({\n field: fieldName,\n rule: 'max',\n value: options.max ?? field.max,\n fieldType: field.type,\n });\n }\n }\n\n // String length rules (for text fields)\n if (field.type === 'text') {\n if (\n options.minLength !== undefined ||\n field.minLength !== undefined\n ) {\n rules.push({\n field: fieldName,\n rule: 'minLength',\n value: options.minLength ?? field.minLength,\n fieldType: field.type,\n });\n }\n\n if (\n options.maxLength !== undefined ||\n field.maxLength !== undefined\n ) {\n rules.push({\n field: fieldName,\n rule: 'maxLength',\n value: options.maxLength ?? field.maxLength,\n fieldType: field.type,\n });\n }\n\n // Pattern rule (regex validation)\n // Note: Custom validator functions (options.validate) cannot be serialized\n // and will fall back to compiled validators at runtime\n // Note: Pattern is only available in field options, not in FieldDefinition\n const pattern = options.pattern;\n if (pattern) {\n rules.push({\n field: fieldName,\n rule: 'pattern',\n // RegExp patterns expose `.source`; a JSON-collapsed RegExp ({})\n // has none, preserving the prior `undefined` value exactly.\n value:\n typeof pattern === 'string'\n ? pattern\n : (pattern as { source?: string }).source,\n fieldType: field.type,\n });\n }\n }\n }\n\n // Only add validationRules if there are any rules\n if (rules.length > 0) {\n obj.validationRules = rules;\n }\n }\n }\n\n /**\n * Generate pre-computed schemas for all objects in the manifest.\n *\n * This enables external package consumers to use pre-generated schemas\n * without calling generateSchema() at runtime, eliminating latency.\n *\n * IMPORTANT: For STI classes, we aggregate ALL descendants from both local\n * and external packages to ensure complete schemas are generated.\n *\n * This method is public to allow external callers (like OXC scanner) to use it.\n *\n * @param manifest - The manifest to process in-place\n */\n generateSchemas(manifest: SmartObjectManifest): void {\n const generator = new SchemaGenerator();\n\n // Create aggregated manifest that includes external package objects\n // This ensures STI schema generation finds ALL descendants\n const aggregatedManifest = this.createAggregatedManifest(manifest);\n\n // Track which STI bases have been processed (to avoid duplicate schema generation)\n const processedSTIBases = new Set<string>();\n\n // Build lookup map for checking if base is local\n const localObjects = new Set(\n Object.values(manifest.objects).map((o) => o.className),\n );\n\n for (const [name, obj] of Object.entries(manifest.objects)) {\n if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(obj.className)) {\n continue;\n }\n\n // Determine table name (may have been inherited from external STI base)\n // Use obj.className (PascalCase) for consistent table name derivation with runtime\n const tableName =\n obj.decoratorConfig?.tableName ||\n this.classNameToTableName(obj.className);\n\n // Check if this is an STI class\n if (obj.decoratorConfig?.tableStrategy === 'sti') {\n // This is an STI base class - generate STI schema with ALL descendants\n if (processedSTIBases.has(name)) continue;\n processedSTIBases.add(name);\n\n console.log(\n `[manifest-generator] Generating STI schema for ${name} (table: ${tableName})`,\n );\n\n // Use aggregated manifest to find descendants from ALL packages\n obj.schema = generator.generateSTISchemaFromManifest(\n name,\n tableName,\n obj.fields,\n aggregatedManifest,\n obj.decoratorConfig,\n );\n this.applySqlTypeOverrides(obj);\n } else if (this.isSTIChildClass(obj, manifest)) {\n // This is an STI child class - check if base is LOCAL or EXTERNAL\n const stiBase = this.findSTIBaseInfo(obj, manifest);\n const baseIsLocal = stiBase && localObjects.has(stiBase.className);\n\n if (baseIsLocal) {\n // STI base is in this manifest - skip (schema is on base class)\n console.log(\n `[manifest-generator] Skipping schema for STI child ${name} (base ${stiBase?.className} is local)`,\n );\n } else {\n // STI base is EXTERNAL - generate STI schema for this child\n // CRITICAL: Use the external base's table name, not the child's!\n const baseTableName = stiBase?.tableName || tableName;\n console.log(\n `[manifest-generator] Generating STI schema for ${name} (external base: ${stiBase?.className}, table: ${baseTableName})`,\n );\n\n // Use aggregated manifest to include all descendants\n // FIX #527: Use actual STI base class name, not child class name\n // This ensures findDescendantsInManifest() finds ALL STI children\n obj.schema = generator.generateSTISchemaFromManifest(\n stiBase?.className || name,\n baseTableName,\n obj.fields,\n aggregatedManifest,\n obj.decoratorConfig,\n );\n this.applySqlTypeOverrides(obj);\n }\n } else {\n // CTI class - generate individual table schema\n console.log(\n `[manifest-generator] Generating CTI schema for ${name} (table: ${tableName})`,\n );\n\n obj.schema = generator.generateCTISchemaFromManifest(\n name,\n tableName,\n obj.fields,\n obj.decoratorConfig,\n );\n this.applySqlTypeOverrides(obj);\n }\n }\n\n this.resolveSamePackageForeignKeyColumnTypes(manifest, generator);\n }\n\n normalizeReportObjects(manifest: SmartObjectManifest): void {\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.decoratorConfig?.report) continue;\n\n obj.decoratorConfig.api ??= { include: ['list', 'get'] };\n obj.decoratorConfig.mcp ??= { include: ['list', 'get'] };\n\n if (obj.decoratorConfig.conflictColumns) continue;\n\n const tenantScoped = obj.decoratorConfig.tenantScoped;\n const tenantField =\n tenantScoped && typeof tenantScoped === 'object'\n ? tenantScoped.field || 'tenantId'\n : tenantScoped\n ? 'tenantId'\n : undefined;\n const tenantColumn =\n tenantField && obj.fields[tenantField] ? toSnakeCase(tenantField) : '';\n\n const conflictColumns = Object.entries(obj.fields)\n .filter(([, field]) => {\n const kind = field._meta?.__report?.kind;\n return kind === 'group' || kind === 'bucket';\n })\n .map(([fieldName]) => toSnakeCase(fieldName));\n\n obj.decoratorConfig.conflictColumns =\n conflictColumns.length > 0\n ? [...(tenantColumn ? [tenantColumn] : []), ...conflictColumns]\n : ['id'];\n }\n }\n\n normalizeReportTenantScope(manifest: SmartObjectManifest): void {\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.decoratorConfig?.report) continue;\n obj.decoratorConfig.tenantScoped ??= { mode: 'optional' };\n }\n }\n\n private resolveSamePackageForeignKeyColumnTypes(\n manifest: SmartObjectManifest,\n generator: SchemaGeneratorLike,\n ): void {\n const schemaByTable = new Map<string, ManifestSchema>();\n const ownerBySchema = new Map<\n ManifestSchema,\n { name: string; obj: SmartObjectDefinition }\n >();\n const changedSchemas = new Set<ManifestSchema>();\n\n for (const [name, obj] of Object.entries(manifest.objects)) {\n if (obj.schema?.tableName) {\n schemaByTable.set(obj.schema.tableName, obj.schema);\n ownerBySchema.set(obj.schema, { name, obj });\n }\n }\n\n for (const obj of Object.values(manifest.objects)) {\n const sourceTable = this.getObjectTableName(obj);\n if (!sourceTable) {\n continue;\n }\n\n const sourceSchema = schemaByTable.get(sourceTable);\n if (!sourceSchema) {\n continue;\n }\n\n for (const [fieldName, field] of Object.entries(obj.fields || {})) {\n if (\n field.type !== 'foreignKey' ||\n !field.related ||\n field._meta?.sqlType\n ) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n const sourceColumn = sourceSchema.columns[columnName];\n if (!sourceColumn) {\n continue;\n }\n\n const targetSchema = this.findForeignKeyTargetSchema(\n field.related,\n manifest,\n schemaByTable,\n );\n const targetIdType = targetSchema?.columns.id?.type;\n if (!targetIdType || sourceColumn.type === targetIdType) {\n continue;\n }\n\n sourceSchema.columns[columnName] = {\n ...sourceColumn,\n type: targetIdType,\n };\n changedSchemas.add(sourceSchema);\n }\n }\n\n for (const schema of changedSchemas) {\n this.refreshManifestSchemaDDL(\n schema,\n generator,\n ownerBySchema.get(schema),\n manifest,\n );\n }\n }\n\n private findForeignKeyTargetSchema(\n related: string,\n manifest: SmartObjectManifest,\n schemaByTable: Map<string, ManifestSchema>,\n ): ManifestSchema | undefined {\n const relatedTarget = related.split('.')[0];\n if (schemaByTable.has(relatedTarget)) {\n return schemaByTable.get(relatedTarget);\n }\n\n const targetObj = Object.values(manifest.objects).find(\n (candidate) =>\n candidate.className === relatedTarget ||\n candidate.qualifiedName === relatedTarget ||\n candidate.name === relatedTarget ||\n candidate.decoratorConfig?.tableName === relatedTarget ||\n candidate.schema?.tableName === relatedTarget,\n );\n\n if (!targetObj && relatedTarget.includes(':')) {\n return undefined;\n }\n\n const targetTable = targetObj\n ? this.getObjectTableName(targetObj)\n : this.classNameToTableName(relatedTarget);\n\n return targetTable ? schemaByTable.get(targetTable) : undefined;\n }\n\n private getObjectTableName(obj: SmartObjectDefinition): string | undefined {\n return (\n obj.schema?.tableName ||\n obj.decoratorConfig?.tableName ||\n this.classNameToTableName(obj.className)\n );\n }\n\n private refreshManifestSchemaDDL(\n schema: ManifestSchema,\n generator: SchemaGeneratorLike,\n owner: { name: string; obj: SmartObjectDefinition } | undefined,\n manifest: SmartObjectManifest,\n ): void {\n const columns: Record<string, ColumnDefinition> = {};\n for (const [name, column] of Object.entries(schema.columns)) {\n columns[name] = {\n // ManifestColumnDefinition stores `type` as a plain string; it is\n // always a valid SQLDataType for DDL rendering.\n type: column.type as SQLDataType,\n primaryKey: column.primaryKey,\n notNull: column.notNull,\n unique: column.unique,\n defaultValue: column.default,\n };\n }\n\n const schemaDefinition: SchemaDefinition = {\n tableName: schema.tableName,\n columns,\n indexes: (schema.indexes || []).map((index) => ({\n name: index.name,\n columns: index.columns,\n unique: index.unique,\n where: index.where,\n jsonPath: index.jsonPath,\n })),\n triggers: [],\n foreignKeys: [],\n dependencies: [],\n version: schema.version,\n packageName: '',\n };\n\n schema.ddl = generator.generateSQL(schemaDefinition);\n schema.version = this.computeManifestSchemaVersion(schema, owner, manifest);\n }\n\n private computeManifestSchemaVersion(\n schema: ManifestSchema,\n owner: { name: string; obj: SmartObjectDefinition } | undefined,\n manifest: SmartObjectManifest,\n ): string {\n if (schema.columns._meta_type && owner) {\n const baseClassName =\n owner.obj.decoratorConfig?.tableStrategy === 'sti'\n ? owner.name\n : this.findSTIBaseInfo(owner.obj, manifest)?.className || owner.name;\n\n return createHash('sha256')\n .update(\n JSON.stringify({\n columns: schema.columns,\n baseClassName,\n descendants: this.findDescendantsInManifest(\n baseClassName,\n manifest,\n ),\n }),\n )\n .digest('hex')\n .substring(0, 8);\n }\n\n return createHash('sha256')\n .update(\n JSON.stringify({\n columns: schema.columns,\n className: owner?.name || schema.tableName,\n }),\n )\n .digest('hex')\n .substring(0, 8);\n }\n\n private findDescendantsInManifest(\n baseClassName: string,\n manifest: SmartObjectManifest,\n visited: Set<string> = new Set(),\n ): string[] {\n const descendants: string[] = [];\n if (visited.has(baseClassName)) {\n return descendants;\n }\n visited.add(baseClassName);\n\n const baseClassLower = this.simpleClassName(baseClassName).toLowerCase();\n\n for (const [name, obj] of Object.entries(manifest.objects)) {\n const classNameLower = this.simpleClassName(obj.className).toLowerCase();\n const extendsLower = obj.extends\n ? this.simpleClassName(obj.extends).toLowerCase()\n : undefined;\n\n if (\n classNameLower === baseClassLower &&\n extendsLower === baseClassLower\n ) {\n continue;\n }\n\n if (extendsLower === baseClassLower) {\n descendants.push(name);\n descendants.push(\n ...this.findDescendantsInManifest(name, manifest, visited),\n );\n }\n }\n\n return descendants;\n }\n\n private applySqlTypeOverrides(obj: SmartObjectDefinition): void {\n if (!obj.schema?.columns) {\n return;\n }\n\n for (const [fieldName, field] of Object.entries(obj.fields || {})) {\n const sqlType = field?._meta?.sqlType;\n const referenceKind = this.getReferenceKind(field);\n if (!sqlType && !referenceKind) {\n continue;\n }\n\n const columnName = toSnakeCase(fieldName);\n if (!obj.schema.columns[columnName]) {\n continue;\n }\n\n obj.schema.columns[columnName] = {\n ...obj.schema.columns[columnName],\n ...(sqlType ? { type: String(sqlType).toUpperCase() } : {}),\n ...(referenceKind ? { referenceKind } : {}),\n };\n }\n }\n\n private getReferenceKind(\n field: SmartObjectDefinition['fields'][string] | undefined,\n ): ManifestColumnDefinition['referenceKind'] | undefined {\n if (field?._meta?.__tenancy?.isTenantIdField) {\n return 'tenantId';\n }\n\n if (field?.type === 'foreignKey') {\n return 'foreignKey';\n }\n\n if (field?.type === 'crossPackageRef') {\n return 'crossPackageRef';\n }\n\n return undefined;\n }\n\n /**\n * Create an aggregated manifest that includes objects from all external packages\n *\n * This is used for STI schema generation to ensure ALL descendants are found,\n * regardless of which package they're defined in.\n *\n * @param manifest - The local manifest\n * @returns Aggregated manifest with local + external objects\n */\n private createAggregatedManifest(\n manifest: SmartObjectManifest,\n ): SmartObjectManifest {\n // Start with a copy of local objects\n const aggregatedObjects: Record<string, SmartObjectDefinition> = {\n ...manifest.objects,\n };\n\n // Load and merge external package objects\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n for (const packageName of manifest.smrtDependencies) {\n const externalManifest = loadExternalManifestSync(packageName);\n if (externalManifest) {\n // Merge external objects (local objects take precedence on collision)\n for (const [name, obj] of Object.entries(externalManifest.objects)) {\n if (!aggregatedObjects[name]) {\n aggregatedObjects[name] = obj;\n }\n }\n\n console.log(\n `[manifest-generator] Aggregated ${Object.keys(externalManifest.objects).length} objects from ${packageName}`,\n );\n }\n }\n }\n\n return {\n ...manifest,\n objects: aggregatedObjects,\n };\n }\n\n /**\n * Check if an object is an STI child class (inherits from STI base)\n *\n * Walks up the inheritance chain to find if any ancestor has tableStrategy: 'sti'.\n * Also checks external SMRT packages for parent class definitions.\n */\n private isSTIChildClass(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n ): boolean {\n if (!obj.extends) return false;\n\n // Build a lookup map for efficient access\n const objectsByName = new Map<string, SmartObjectDefinition>();\n for (const [_name, objDef] of Object.entries(manifest.objects)) {\n objectsByName.set(objDef.className, objDef);\n objectsByName.set(objDef.className.toLowerCase(), objDef);\n }\n\n // Walk up the inheritance chain looking for STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n let parentObj = objectsByName.get(currentClass);\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentObj) break; // Parent not found anywhere (e.g., SmrtObject)\n\n if (parentObj.decoratorConfig?.tableStrategy === 'sti') {\n return true; // Found STI ancestor\n }\n\n currentClass = parentObj.extends;\n }\n\n return false;\n }\n\n /**\n * Check whether `obj` extends a framework abstract base class anywhere\n * in its chain.\n *\n * Framework abstract bases (`SmrtHierarchical`, `SmrtJunction`, …) have\n * no table of their own — fields they declare must be merged into every\n * subclass's manifest, even when the subclass uses CTI. Without this,\n * a class like `Account extends SmrtHierarchical` would silently lose\n * `parentId` from its `fields` map and downstream WHERE-clause\n * validation would reject queries on the inherited column.\n *\n * Identified by name against the same hardcoded set the scanner's\n * `FRAMEWORK_BASE_CLASSES` recognizes (`packages/scanner/src/\n * inheritance-resolver.ts`). Keep the two lists in sync.\n */\n private extendsFrameworkAbstractBase(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n manifest: SmartObjectManifest,\n ): boolean {\n if (!obj.extends) return false;\n\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n if (FRAMEWORK_ABSTRACT_BASE_NAMES.has(currentClass)) {\n return true;\n }\n\n let parentObj = objectsByName.get(currentClass);\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n if (!parentObj) break;\n\n currentClass = parentObj.extends;\n }\n\n return false;\n }\n\n /**\n * Find full STI base class info (className + tableName)\n *\n * Walks up the inheritance chain to find the STI base class and returns\n * both its className and tableName. This is critical for external STI bases\n * where the child needs to use the base's table name for schema generation.\n */\n private findSTIBaseInfo(\n obj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n ): { className: string; tableName: string } | undefined {\n if (!obj.extends) return undefined;\n\n // Build a lookup map for efficient access\n const objectsByName = new Map<string, SmartObjectDefinition>();\n for (const [_name, objDef] of Object.entries(manifest.objects)) {\n objectsByName.set(objDef.className, objDef);\n objectsByName.set(objDef.className.toLowerCase(), objDef);\n }\n\n // Track the oldest STI base found as we walk up\n // (we need to keep walking to find the ROOT STI class, not the first one)\n let stiBaseInfo: { className: string; tableName: string } | undefined;\n\n // Walk up the inheritance chain looking for the OLDEST STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n let parentObj = objectsByName.get(currentClass);\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentObj) break;\n\n if (parentObj.decoratorConfig?.tableStrategy === 'sti') {\n // Found an STI ancestor - it becomes the new candidate base\n // Keep walking to find the OLDEST/ROOT STI class in the hierarchy\n const tableName =\n parentObj.decoratorConfig?.tableName ||\n parentObj.schema?.tableName ||\n this.classNameToTableName(parentObj.className);\n stiBaseInfo = {\n className: parentObj.className,\n tableName,\n };\n }\n\n currentClass = parentObj.extends;\n }\n\n return stiBaseInfo; // Return the oldest STI ancestor found (or undefined if none)\n }\n\n /**\n * Convert class name to table name (snake_case pluralized)\n *\n * IMPORTANT: Must use the same algorithm as runtime's tableNameFromClass()\n * to ensure manifest-generated table names match runtime-derived names.\n */\n private classNameToTableName(className: string): string {\n // Use the shared pluralization function that handles English plurals correctly\n // (e.g., 'Currency' → 'currencies', 'JournalEntry' → 'journal_entries')\n return classnameToTablename(className);\n }\n\n private normalizeFrameworkInheritedField(\n ancestorName: string,\n fieldName: string,\n fieldDef: FieldDefinition,\n childClassName: string,\n ): FieldDefinition {\n if (\n this.simpleClassName(ancestorName) === 'SmrtHierarchical' &&\n fieldName === 'parentId'\n ) {\n return {\n ...fieldDef,\n type: 'foreignKey',\n related: childClassName,\n required: false,\n _meta: {\n ...(fieldDef._meta || {}),\n nullable: true,\n },\n };\n }\n\n return fieldDef;\n }\n\n private simpleClassName(className: string): string {\n return className.includes(':')\n ? className.split(':').pop() || className\n : className;\n }\n\n /**\n * Merge inherited fields into child classes (build-time inheritance resolution)\n *\n * For STI hierarchies, child classes don't define their own fields in source code\n * (they inherit from parent). This method merges parent fields into child manifests\n * so that runtime code doesn't need to do field resolution.\n *\n * Also handles collection classes (SmrtCollection<T>) that should inherit their\n * item class's tableName and collection when the item uses STI.\n *\n * Handles multi-level inheritance (grandparents, great-grandparents, etc.)\n * Automatically loads parent class definitions from external SMRT packages when needed\n *\n * @param manifest - The manifest to process in-place\n */\n public mergeInheritedFields(manifest: SmartObjectManifest): void {\n // Build a map of className -> objectDef for fast lookup\n const objectsByName = new Map<string, SmartObjectDefinition>();\n for (const [name, obj] of Object.entries(manifest.objects)) {\n objectsByName.set(obj.className, obj);\n // Also store by lowercase name for case-insensitive lookup\n objectsByName.set(obj.className.toLowerCase(), obj);\n }\n\n // FIRST PASS: Handle STI field merging and tableName inheritance\n // This must happen FIRST so that item classes (like Meeting) have their tableName\n // inherited from their STI base (like Event) before collection classes (like Meetings)\n // try to read it\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.extends) continue; // No parent, skip\n\n // Merge inherited fields when ANY of:\n // (a) STI is in play — shared table with parent, full chain merges.\n // (b) An ancestor in the chain is a framework abstract base class\n // (SmrtHierarchical, SmrtJunction, …) — those have no table of\n // their own, so structural fields they declare (e.g.\n // `SmrtHierarchical.parentId`) must propagate into every CTI\n // subclass's manifest, otherwise WHERE-clause validation\n // rejects queries against the inherited column.\n // For plain CTI through a user-defined base with its own table, we\n // skip merging — each class keeps its own table layout.\n const usesSTI = this.isSTIClass(obj, objectsByName, manifest);\n const extendsFrameworkBase = this.extendsFrameworkAbstractBase(\n obj,\n objectsByName,\n manifest,\n );\n\n if (!usesSTI && !extendsFrameworkBase) {\n continue; // Plain CTI through a user-defined base — skip.\n }\n\n console.log(\n `[manifest-generator] Merging inherited fields for ${obj.className} from ${obj.extends}`,\n );\n\n // Build full inheritance chain (base -> child)\n const inheritanceChain: string[] = [];\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) {\n console.warn(\n `[manifest-generator] Circular inheritance detected for ${obj.className}`,\n );\n break;\n }\n visited.add(currentClass);\n inheritanceChain.unshift(currentClass); // Add to front (building base -> child)\n\n let parentObj = objectsByName.get(currentClass);\n\n // Skip self-reference: when a local class has the same name as its\n // imported parent (e.g., local Performer extends external Performer),\n // objectsByName returns the child itself. Skip it so we fall through\n // to the external package lookup.\n if (parentObj === obj) {\n parentObj = undefined;\n }\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentObj &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentObj = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentObj) break; // Parent not found anywhere (e.g., SmrtObject)\n currentClass = parentObj.extends;\n }\n\n console.log(\n `[manifest-generator] Inheritance chain for ${obj.className}: ${inheritanceChain.join(' -> ')}`,\n );\n\n // Merge fields from ancestors (base to child).\n //\n // STI path: pull in fields from every ancestor — they all share one\n // table.\n //\n // Non-STI (framework-base) path: pull in fields ONLY from framework\n // abstract bases (SmrtHierarchical, …). User-defined ancestors with\n // their own `@smrt()` decorator have their own tables in CTI, so\n // merging their columns onto a descendant would generate the wrong\n // schema.\n const mergedFields: Record<string, FieldDefinition> = {};\n const mergedMethods: Record<string, MethodDefinition> = {};\n\n for (const ancestorName of inheritanceChain) {\n const ancestor = objectsByName.get(ancestorName);\n if (!ancestor) continue;\n\n const ancestorIsFrameworkBase =\n FRAMEWORK_ABSTRACT_BASE_NAMES.has(ancestorName);\n if (!usesSTI && !ancestorIsFrameworkBase) {\n continue;\n }\n\n // Merge fields (child fields override parent fields with same name)\n for (const [fieldName, fieldDef] of Object.entries(ancestor.fields)) {\n if (!mergedFields[fieldName]) {\n mergedFields[fieldName] = this.normalizeFrameworkInheritedField(\n ancestorName,\n fieldName,\n fieldDef,\n obj.className,\n );\n }\n }\n\n // Merge methods (child methods override parent methods)\n for (const [methodName, methodDef] of Object.entries(\n ancestor.methods || {},\n )) {\n if (!mergedMethods[methodName]) {\n mergedMethods[methodName] = methodDef;\n }\n }\n }\n\n // Add child's own fields (override any parent fields with same name)\n for (const [fieldName, fieldDef] of Object.entries(obj.fields)) {\n mergedFields[fieldName] = fieldDef;\n }\n\n // Add child's own methods\n for (const [methodName, methodDef] of Object.entries(obj.methods || {})) {\n mergedMethods[methodName] = methodDef;\n }\n\n // Update object definition with merged fields\n obj.fields = mergedFields;\n obj.methods = mergedMethods;\n\n // Inherit tableName and collection from STI base class\n // STI subclasses share the parent's table, so they should use the same collection name\n const stiBase = this.findSTIBase(obj, objectsByName, manifest);\n if (stiBase && stiBase !== obj) {\n // Determine the STI base's table name (explicit or derived from className)\n // Note: We don't use stiBase.collection as fallback because collection uses\n // lowercase-only format (e.g., 'querytestevents') while tableName needs\n // snake_case format (e.g., 'query_test_events')\n const baseTableName =\n stiBase.decoratorConfig?.tableName ||\n this.classNameToTableName(stiBase.className);\n\n // Inherit tableName from STI base\n obj.decoratorConfig = obj.decoratorConfig || {};\n obj.decoratorConfig.tableName = baseTableName;\n console.log(\n `[manifest-generator] ${obj.className} inherits tableName: '${baseTableName}' from ${stiBase.className}`,\n );\n\n // Inherit tableStrategy from STI base (so runtime doesn't need to walk inheritance chain)\n if (stiBase.decoratorConfig?.tableStrategy) {\n obj.decoratorConfig.tableStrategy =\n stiBase.decoratorConfig.tableStrategy;\n console.log(\n `[manifest-generator] ${obj.className} inherits tableStrategy: '${stiBase.decoratorConfig.tableStrategy}' from ${stiBase.className}`,\n );\n }\n\n // Inherit collection name from STI base (all STI classes share one table)\n if (stiBase.collection !== obj.collection) {\n console.log(\n `[manifest-generator] ${obj.className} inherits collection: '${stiBase.collection}' from ${stiBase.className}`,\n );\n obj.collection = stiBase.collection;\n }\n }\n\n console.log(\n `[manifest-generator] ✅ ${obj.className} now has ${Object.keys(mergedFields).length} fields (including inherited)`,\n );\n }\n\n // SECOND PASS: Handle collection classes that should inherit from their item class\n // This must happen AFTER STI field merging so item classes have their tableName set\n for (const obj of Object.values(manifest.objects)) {\n // Check if this is a collection class (extends SmrtCollection)\n const isCollection =\n obj.extends === 'SmrtCollection' ||\n this.extendsCollection(obj, objectsByName);\n\n if (isCollection) {\n // Find the item class from _itemClass static property\n const itemClass = this.findItemClass(obj, manifest, objectsByName);\n\n if (itemClass) {\n console.log(\n `[manifest-generator] ${obj.className} is a collection class for ${itemClass.className}`,\n );\n\n // Inherit tableName from item class (which may have inherited it from STI base)\n if (itemClass.decoratorConfig?.tableName) {\n obj.decoratorConfig = obj.decoratorConfig || {};\n obj.decoratorConfig.tableName = itemClass.decoratorConfig.tableName;\n console.log(\n `[manifest-generator] ${obj.className} inherits tableName: '${itemClass.decoratorConfig.tableName}' from item class ${itemClass.className}`,\n );\n }\n\n // Inherit collection name from item class\n if (itemClass.collection !== obj.collection) {\n console.log(\n `[manifest-generator] ${obj.className} inherits collection: '${itemClass.collection}' from item class ${itemClass.className} (was '${obj.collection}')`,\n );\n obj.collection = itemClass.collection;\n }\n }\n }\n }\n }\n\n /**\n * Check if a class extends SmrtCollection (directly or indirectly)\n *\n * @param obj - The object definition to check\n * @param objectsByName - Map of className -> objectDef for lookups\n * @returns true if this class extends SmrtCollection\n */\n private extendsCollection(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n ): boolean {\n if (!obj.extends) return false;\n\n // Walk up inheritance chain looking for SmrtCollection\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) break;\n visited.add(currentClass);\n\n if (currentClass === 'SmrtCollection') return true;\n\n const parentObj = objectsByName.get(currentClass);\n if (!parentObj) break;\n\n currentClass = parentObj.extends;\n }\n\n return false;\n }\n\n /**\n * Find the item class for a collection class\n *\n * Lookup priority:\n * 1. extendsTypeArg - Generic type argument from extends clause (e.g., \"Meeting\" from SmrtCollection<Meeting>)\n * 2. _itemClass static property - May be captured by AST scanner\n * 3. Name-based inference - Fallback (e.g., \"Meetings\" -> \"Meeting\")\n *\n * @param collectionObj - The collection class definition\n * @param manifest - The manifest\n * @param objectsByName - Map of className -> objectDef for lookups\n * @returns Item class definition or undefined\n */\n private findItemClass(\n collectionObj: SmartObjectDefinition,\n manifest: SmartObjectManifest,\n objectsByName: Map<string, SmartObjectDefinition>,\n ): SmartObjectDefinition | undefined {\n // PRIORITY 1: Use generic type argument from extends clause\n // This is the most reliable method: SmrtCollection<Meeting> -> \"Meeting\"\n if (collectionObj.extendsTypeArg) {\n const itemClassName = collectionObj.extendsTypeArg;\n console.log(\n `[manifest-generator] ${collectionObj.className} has extendsTypeArg: ${itemClassName}`,\n );\n\n // Try to find the item class by name in local manifest\n const itemClass = objectsByName.get(itemClassName);\n if (itemClass) {\n console.log(\n `[manifest-generator] Found item class ${itemClassName} in local manifest`,\n );\n return itemClass;\n }\n\n // Try loading from external packages\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n const externalItemClass = this.loadParentFromExternalPackage(\n itemClassName,\n manifest.smrtDependencies,\n objectsByName,\n );\n if (externalItemClass) {\n console.log(\n `[manifest-generator] Found item class ${itemClassName} in external package`,\n );\n return externalItemClass;\n }\n }\n }\n\n // PRIORITY 2: Look for _itemClass static field in the collection class\n // This is defined like: static readonly _itemClass = Meeting;\n // Note: AST scanner currently skips static properties, so this rarely works\n const itemClassField = collectionObj.fields._itemClass;\n\n if (itemClassField) {\n // Extract class name from the field's default value or metadata\n // The AST scanner might capture this as a reference\n const itemClassName = itemClassField.related || itemClassField.default;\n\n if (itemClassName && typeof itemClassName === 'string') {\n // Try to find the item class by name\n const itemClass = objectsByName.get(itemClassName);\n if (itemClass) {\n return itemClass;\n }\n\n // Try loading from external packages\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n return this.loadParentFromExternalPackage(\n itemClassName,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n }\n }\n\n // PRIORITY 3: Fallback - Try to infer from collection class name\n // Generate candidate item class names and check if they exist\n const collectionName = collectionObj.className;\n const candidates: string[] = [];\n\n // Strip \"Collection\" suffix first if present\n let baseName = collectionName;\n if (baseName.endsWith('Collection')) {\n baseName = baseName.slice(0, -'Collection'.length);\n }\n\n // Generate singularization candidates (order matters - try most specific first)\n // 1. Exact name (e.g., \"Event\" from \"EventCollection\")\n candidates.push(baseName);\n\n // 2. Remove trailing 's' (e.g., \"Meetings\" -> \"Meeting\")\n if (baseName.endsWith('s') && baseName.length > 1) {\n candidates.push(baseName.slice(0, -1));\n }\n\n // 3. Handle 'ies' -> 'y' (e.g., \"Categories\" -> \"Category\")\n if (baseName.endsWith('ies') && baseName.length > 3) {\n candidates.push(`${baseName.slice(0, -3)}y`);\n }\n\n // 4. Handle 'es' -> '' for words ending in s/x/z/ch/sh (e.g., \"Statuses\" -> \"Status\")\n if (baseName.endsWith('es') && baseName.length > 2) {\n candidates.push(baseName.slice(0, -2));\n }\n\n // Try each candidate against local classes first, then external packages\n // Skip candidates that match the collection class itself\n for (const candidate of candidates) {\n if (candidate === collectionObj.className) continue; // Don't match self\n const itemClass = objectsByName.get(candidate);\n if (itemClass) {\n return itemClass;\n }\n }\n\n // Try loading from external packages\n if (manifest.smrtDependencies && manifest.smrtDependencies.length > 0) {\n for (const candidate of candidates) {\n if (candidate === collectionObj.className) continue; // Don't match self\n const itemClass = this.loadParentFromExternalPackage(\n candidate,\n manifest.smrtDependencies,\n objectsByName,\n );\n if (itemClass) {\n return itemClass;\n }\n }\n }\n\n return undefined;\n }\n\n /**\n * Check if a class uses STI (either explicitly or inherited from an ancestor)\n *\n * Walks up the inheritance chain to find if any ancestor has tableStrategy: 'sti'.\n * If found, all descendants inherit STI and should have fields merged.\n * Also checks external SMRT packages for parent class definitions.\n *\n * @param obj - The object definition to check\n * @param objectsByName - Map of className -> objectDef for lookups\n * @param manifest - The manifest (for accessing smrtDependencies)\n * @returns true if this class uses STI (directly or inherited)\n */\n private isSTIClass(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n manifest: SmartObjectManifest,\n ): boolean {\n // Check if explicitly marked as STI\n if (obj.decoratorConfig?.tableStrategy === 'sti') {\n return true;\n }\n\n // Walk up the inheritance chain looking for STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) {\n break; // Circular inheritance, stop\n }\n visited.add(currentClass);\n\n let parentDef = objectsByName.get(currentClass);\n\n // Skip self-reference (local class with same name as imported parent)\n if (parentDef === obj) {\n parentDef = undefined;\n }\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentDef &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentDef = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentDef) break; // Parent not found anywhere\n\n // Check if this ancestor uses STI\n if (parentDef.decoratorConfig?.tableStrategy === 'sti') {\n return true; // Found STI ancestor\n }\n\n currentClass = parentDef.extends;\n }\n\n return false; // No STI in hierarchy\n }\n\n /**\n * Find the STI base class for a given object\n *\n * Walks up the inheritance chain to find the first ancestor that defines\n * tableStrategy: 'sti'. This is the class that owns the shared table.\n *\n * @param obj - The object definition to find the STI base for\n * @param objectsByName - Map of className -> objectDef for lookups\n * @param manifest - The manifest (for accessing smrtDependencies)\n * @returns The STI base class definition, or the object itself if it's the base\n */\n private findSTIBase(\n obj: SmartObjectDefinition,\n objectsByName: Map<string, SmartObjectDefinition>,\n manifest: SmartObjectManifest,\n ): SmartObjectDefinition | undefined {\n // Track the oldest STI class found as we walk up\n let stiBase: SmartObjectDefinition | undefined;\n\n // If this object explicitly defines STI, it's a candidate (but ancestors may also be STI)\n if (obj.decoratorConfig?.tableStrategy === 'sti') {\n stiBase = obj;\n }\n\n // Walk up the inheritance chain looking for the oldest STI base\n let currentClass: string | undefined = obj.extends;\n const visited = new Set<string>();\n\n while (currentClass) {\n if (visited.has(currentClass)) {\n break; // Circular inheritance, stop\n }\n visited.add(currentClass);\n\n let parentDef = objectsByName.get(currentClass);\n\n // Skip self-reference (local class with same name as imported parent)\n if (parentDef === obj) {\n parentDef = undefined;\n }\n\n // If parent not in current manifest, try loading from external SMRT packages\n if (\n !parentDef &&\n manifest.smrtDependencies &&\n manifest.smrtDependencies.length > 0\n ) {\n parentDef = this.loadParentFromExternalPackage(\n currentClass,\n manifest.smrtDependencies,\n objectsByName,\n );\n }\n\n if (!parentDef) break; // Parent not found anywhere\n\n // Check if this ancestor defines STI - if so, it becomes the new candidate base\n // (we keep walking to find the oldest/root STI class)\n if (parentDef.decoratorConfig?.tableStrategy === 'sti') {\n stiBase = parentDef;\n }\n\n currentClass = parentDef.extends;\n }\n\n return stiBase; // Return the oldest STI ancestor found (or undefined if none)\n }\n\n /**\n * Load parent class definition from external SMRT packages\n *\n * When a child class extends a parent from an external package (e.g., praeco's Council extends\n * smrt-profiles' Organization), this method loads the parent's manifest and extracts the\n * parent's field definitions.\n *\n * @param parentClassName - Name of the parent class to find\n * @param smrtDependencies - List of external SMRT packages to search\n * @param objectsByName - Map to cache loaded external objects\n * @returns Parent object definition if found, undefined otherwise\n */\n private loadParentFromExternalPackage(\n parentClassName: string,\n smrtDependencies: string[],\n objectsByName: Map<string, SmartObjectDefinition>,\n ): SmartObjectDefinition | undefined {\n // Try each external SMRT dependency\n for (const packageName of smrtDependencies) {\n const externalManifest = loadExternalManifestSync(packageName);\n\n if (!externalManifest) {\n continue;\n }\n\n // Use lookupInManifest for O(1) lookup via cached className index\n // Handles both qualified names and simple class names\n const parentObj = lookupInManifest(externalManifest, parentClassName);\n\n if (parentObj) {\n // Cache the loaded parent object for future lookups\n objectsByName.set(parentObj.className, parentObj);\n objectsByName.set(parentObj.className.toLowerCase(), parentObj);\n\n return parentObj;\n }\n }\n\n return undefined;\n }\n\n /**\n * Determine import path from package.json exports\n *\n * Tries the following strategies in order:\n * 1. package.json exports[\"./objects\"] - Specific objects export\n * 2. package.json exports[\".\"] - Main export\n * 3. package.json main - Main field\n * 4. Fallback to package name\n */\n private determineImportPath(\n packageJson: PackageJsonLike,\n _filePath?: string,\n ): string {\n // Only invoked once a package name is known (guarded at the call site),\n // so `name` is always present here.\n const packageName = packageJson.name as string;\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 (mainExport && typeof mainExport === 'object') {\n const conditional = mainExport as {\n import?: unknown;\n default?: unknown;\n };\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 * Generate TypeScript interfaces from manifest\n */\n generateTypeDefinitions(manifest: SmartObjectManifest): string {\n const interfaces: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n interfaces.push(this.generateInterface(obj));\n }\n\n return interfaces.join('\\n\\n');\n }\n\n /**\n * Generate a single interface definition\n */\n private generateInterface(obj: SmartObjectDefinition): string {\n const fields = Object.entries(obj.fields)\n .map(([name, field]) => {\n const optional = !field.required ? '?' : '';\n const type = this.mapFieldTypeToTS(field.type);\n return ` ${name}${optional}: ${type};`;\n })\n .join('\\n');\n\n return `export interface ${obj.className}Data {\n${fields}\n}`;\n }\n\n /**\n * Map field types to TypeScript types\n */\n private mapFieldTypeToTS(fieldType: string): string {\n switch (fieldType) {\n case 'text':\n return 'string';\n case 'decimal':\n return 'number';\n case 'integer':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'datetime':\n return 'Date | string';\n case 'json':\n return 'any';\n case 'foreignKey':\n return 'string';\n case 'crossPackageRef':\n return 'string';\n default:\n return 'any';\n }\n }\n\n /**\n * Generate simple endpoint list for testing/documentation\n */\n generateRestEndpoints(manifest: SmartObjectManifest): string {\n const endpoints: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const apiConfig = obj.decoratorConfig.api;\n if (apiConfig !== false) {\n endpoints.push(...this.getSimpleEndpoints(obj));\n }\n }\n\n return endpoints.join('\\n');\n }\n\n /**\n * Generate REST endpoint code implementations\n */\n generateRestEndpointCode(manifest: SmartObjectManifest): string {\n const endpoints: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const apiConfig = obj.decoratorConfig.api;\n if (apiConfig !== false) {\n endpoints.push(this.generateRestEndpoint(obj));\n }\n }\n\n return endpoints.join('\\n\\n');\n }\n\n /**\n * Get simple endpoint strings for an object\n */\n private getApiRouteMetadata(\n obj: SmartObjectDefinition,\n actionName: string,\n actionDef: { isStatic?: boolean },\n ): {\n scope: 'item' | 'collection';\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n } {\n const config =\n obj.decoratorConfig.api && typeof obj.decoratorConfig.api === 'object'\n ? obj.decoratorConfig.api\n : undefined;\n const routeConfig = config?.routes?.[actionName];\n const normalizedPath = (routeConfig?.path || actionName)\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('/');\n const isCollectionClass =\n obj.extends === 'SmrtCollection' || !!obj.extendsTypeArg;\n\n return {\n scope:\n routeConfig?.scope ||\n (isCollectionClass || actionDef.isStatic ? 'collection' : 'item'),\n method:\n routeConfig?.method?.toUpperCase() === 'GET' ||\n routeConfig?.method?.toUpperCase() === 'POST' ||\n routeConfig?.method?.toUpperCase() === 'PUT' ||\n routeConfig?.method?.toUpperCase() === 'PATCH' ||\n routeConfig?.method?.toUpperCase() === 'DELETE'\n ? (routeConfig.method.toUpperCase() as\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'PATCH'\n | 'DELETE')\n : 'POST',\n path: normalizedPath || actionName,\n };\n }\n\n private getSimpleEndpoints(obj: SmartObjectDefinition): string[] {\n const { collection } = obj;\n const config = obj.decoratorConfig.api;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n const isCollectionClass =\n obj.extends === 'SmrtCollection' || !!obj.extendsTypeArg;\n\n const endpoints: string[] = [];\n\n // Determine which operations to include\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (!isCollectionClass) {\n if (shouldInclude('list')) {\n endpoints.push(`GET /${collection}`);\n }\n if (shouldInclude('create')) {\n endpoints.push(`POST /${collection}`);\n }\n if (shouldInclude('get')) {\n endpoints.push(`GET /${collection}/:id`);\n }\n if (shouldInclude('update')) {\n endpoints.push(`PUT /${collection}/:id`);\n }\n if (shouldInclude('delete')) {\n endpoints.push(`DELETE /${collection}/:id`);\n }\n }\n\n const standardActions = ['list', 'get', 'create', 'update', 'delete'];\n for (const [actionName, actionDef] of Object.entries(obj.methods)) {\n if (\n standardActions.includes(actionName) ||\n !actionDef.isPublic ||\n !shouldInclude(actionName)\n ) {\n continue;\n }\n\n const route = this.getApiRouteMetadata(obj, actionName, actionDef);\n if (\n route.scope === 'collection' &&\n !isCollectionClass &&\n !actionDef.isStatic\n ) {\n continue;\n }\n\n if (route.scope === 'item' && isCollectionClass) {\n continue;\n }\n\n const suffix = route.scope === 'collection' ? '' : '/:id';\n endpoints.push(`${route.method} /${collection}${suffix}/${route.path}`);\n }\n\n return endpoints;\n }\n\n /**\n * Generate a single REST endpoint\n */\n private generateRestEndpoint(obj: SmartObjectDefinition): string {\n const { collection, className } = obj;\n const config = obj.decoratorConfig.api;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n\n const operations = [];\n\n // Determine which operations to include\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (shouldInclude('list')) {\n operations.push(` // GET /${collection} - List ${collection}`);\n operations.push(` app.get('/${collection}', async (req: Request) => {`);\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const items = await collection.list(req.query);');\n operations.push(' return Response.json(items);');\n operations.push(' });');\n }\n\n if (shouldInclude('get')) {\n operations.push(` // GET /${collection}/:id - Get ${className}`);\n operations.push(\n ` app.get('/${collection}/:id', async (req: Request) => {`,\n );\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const item = await collection.get(req.params.id);');\n operations.push(\n ` if (!item) return new Response('Not found', { status: 404 });`,\n );\n operations.push(' return Response.json(item);');\n operations.push(' });');\n }\n\n if (shouldInclude('create')) {\n operations.push(` // POST /${collection} - Create ${className}`);\n operations.push(` app.post('/${collection}', async (req: Request) => {`);\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const data = await req.json();');\n operations.push(' const item = await collection.create(data);');\n operations.push(' return Response.json(item, { status: 201 });');\n operations.push(' });');\n }\n\n if (shouldInclude('update')) {\n operations.push(` // PUT /${collection}/:id - Update ${className}`);\n operations.push(\n ` app.put('/${collection}/:id', async (req: Request) => {`,\n );\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(' const data = await req.json();');\n operations.push(\n ' const item = await collection.update(req.params.id, data);',\n );\n operations.push(\n ` if (!item) return new Response('Not found', { status: 404 });`,\n );\n operations.push(' return Response.json(item);');\n operations.push(' });');\n }\n\n if (shouldInclude('delete')) {\n operations.push(` // DELETE /${collection}/:id - Delete ${className}`);\n operations.push(\n ` app.delete('/${collection}/:id', async (req: Request) => {`,\n );\n operations.push(\n ` const collection = await get${className}Collection();`,\n );\n operations.push(\n ' const success = await collection.delete(req.params.id);',\n );\n operations.push(\n ` if (!success) return new Response('Not found', { status: 404 });`,\n );\n operations.push(` return new Response('', { status: 204 });`);\n operations.push(' });');\n }\n\n return `// ${className} endpoints\\n${operations.join('\\n')}`;\n }\n\n /**\n * Generate simple MCP tool names for testing/documentation\n */\n generateMCPTools(manifest: SmartObjectManifest): string {\n const tools: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const mcpConfig = obj.decoratorConfig.mcp;\n if (mcpConfig !== false) {\n tools.push(...this.getSimpleMCPToolNames(obj));\n }\n }\n\n return tools.join('\\n');\n }\n\n /**\n * Generate MCP tool JSON definitions\n */\n generateMCPToolsCode(manifest: SmartObjectManifest): string {\n const tools: string[] = [];\n\n for (const [_name, obj] of Object.entries(manifest.objects)) {\n const mcpConfig = obj.decoratorConfig.mcp;\n if (mcpConfig !== false) {\n tools.push(this.generateMCPTool(obj));\n }\n }\n\n return `[\\n${tools.join(',\\n')}\\n]`;\n }\n\n /**\n * Get simple MCP tool names for an object\n */\n private getSimpleMCPToolNames(obj: SmartObjectDefinition): string[] {\n const { collection } = obj;\n const config = obj.decoratorConfig.mcp;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n\n const tools: string[] = [];\n\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (shouldInclude('list')) {\n tools.push(`list_${collection}`);\n }\n if (shouldInclude('get')) {\n tools.push(`get_${collection}`);\n }\n if (shouldInclude('create')) {\n tools.push(`create_${collection}`);\n }\n if (shouldInclude('update')) {\n tools.push(`update_${collection}`);\n }\n if (shouldInclude('delete')) {\n tools.push(`delete_${collection}`);\n }\n\n return tools;\n }\n\n /**\n * Generate a single MCP tool\n */\n private generateMCPTool(obj: SmartObjectDefinition): string {\n const { collection, className, name } = obj;\n const config = obj.decoratorConfig.mcp;\n const exclude = (typeof config === 'object' && config?.exclude) || [];\n const include =\n (typeof config === 'object' && config?.include) || undefined;\n\n const tools = [];\n\n const shouldInclude = (op: string) => {\n if (include && !include.includes(op)) return false;\n if (exclude.includes(op)) return false;\n return true;\n };\n\n if (shouldInclude('list')) {\n tools.push(` {\n name: \"list_${collection}\",\n description: \"List ${collection}\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\" },\n offset: { type: \"number\" },\n where: { type: \"object\" }\n }\n }\n }`);\n }\n\n if (shouldInclude('get')) {\n tools.push(` {\n name: \"get_${name}\",\n description: \"Get a ${name} by ID\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"The ${name} ID\" }\n },\n required: [\"id\"]\n }\n }`);\n }\n\n if (shouldInclude('create')) {\n const requiredFields = Object.entries(obj.fields)\n .filter(([_, field]) => field.required)\n .map(([fieldName]) => fieldName);\n\n tools.push(` {\n name: \"create_${name}\",\n description: \"Create a new ${name}\",\n inputSchema: {\n type: \"object\",\n properties: ${JSON.stringify(this.generateSchemaProperties(obj.fields), null, 6)},\n required: ${JSON.stringify(requiredFields)}\n }\n }`);\n }\n\n return tools.join(',\\n');\n }\n\n /**\n * Generate JSON schema properties for fields\n */\n private generateSchemaProperties(\n fields: Record<string, FieldDefinition>,\n ): Record<string, JsonSchemaProperty> {\n const properties: Record<string, JsonSchemaProperty> = {};\n\n for (const [name, field] of Object.entries(fields)) {\n properties[name] = {\n type: this.mapFieldTypeToJSON(field.type),\n description: field.description || `The ${name} field`,\n };\n\n if (field.min !== undefined) properties[name].minimum = field.min;\n if (field.max !== undefined) properties[name].maximum = field.max;\n if (field.minLength !== undefined)\n properties[name].minLength = field.minLength;\n if (field.maxLength !== undefined)\n properties[name].maxLength = field.maxLength;\n }\n\n return properties;\n }\n\n /**\n * Map field types to JSON Schema types\n */\n private mapFieldTypeToJSON(fieldType: string): string {\n switch (fieldType) {\n case 'text':\n return 'string';\n case 'decimal':\n return 'number';\n case 'integer':\n return 'integer';\n case 'boolean':\n return 'boolean';\n case 'datetime':\n return 'string';\n case 'json':\n return 'object';\n case 'foreignKey':\n return 'string';\n case 'crossPackageRef':\n return 'string';\n default:\n return 'string';\n }\n }\n\n /**\n * Generate agent manifests for Agent subclasses (fifth pass).\n *\n * For any SmartObjectDefinition with `agent` in its decoratorConfig,\n * auto-generates:\n * - Permissions from uiSlots (manage:*) and CLI/MCP methods (execute:*)\n * - Features from uiSlots and exposed methods\n * - Menu items from uiSlots\n * - Component declarations from package.json exports\n *\n * @param manifest - The manifest to process in-place\n * @param packageName - Package name for component export paths\n * @param packageJson - Full package.json for component discovery\n */\n generateAgentManifests(\n manifest: SmartObjectManifest,\n packageName?: string,\n packageJson?: PackageJsonLike,\n ): void {\n for (const obj of Object.values(manifest.objects)) {\n if (!obj.decoratorConfig.agent) continue;\n\n const agentConfig = obj.decoratorConfig.agent;\n const slug = obj.className.toLowerCase();\n // staticProperties is an untyped AST capture; assert the shape the\n // scanner records for `static uiSlots` on Agent subclasses.\n const uiSlots: Record<string, AgentUISlotManifest> =\n (obj.staticProperties?.uiSlots as\n | Record<string, AgentUISlotManifest>\n | undefined) ?? {};\n\n // Derive permissions\n const permissions: AgentPermission[] = [];\n\n // From uiSlots: manage:<slotId>\n for (const [slotId, slot] of Object.entries(uiSlots)) {\n permissions.push({\n id: `manage:${slotId}`,\n label: `Manage ${(slot as AgentUISlotManifest).label || slotId}`,\n category: 'slot',\n defaultGranted: true,\n });\n }\n\n // From CLI/MCP methods: execute:<methodName>\n const exposedMethods = this.getExposedMethods(obj);\n for (const methodName of exposedMethods) {\n permissions.push({\n id: `execute:${methodName}`,\n label: `Execute ${methodName}`,\n category: 'method',\n defaultGranted: true,\n });\n }\n\n // Derive features\n const features: AgentFeature[] = [];\n\n for (const [slotId, slot] of Object.entries(uiSlots)) {\n const typedSlot = slot as AgentUISlotManifest;\n features.push({\n id: slotId,\n label: typedSlot.label || slotId,\n description: typedSlot.description,\n type: 'slot',\n });\n }\n\n for (const methodName of exposedMethods) {\n features.push({\n id: methodName,\n label: methodName,\n type: 'method',\n });\n }\n\n // Derive menu items from uiSlots (sorted by order)\n const menuItems: AgentMenuItem[] = Object.entries(uiSlots)\n .map(([slotId, slot]) => {\n const typedSlot = slot as AgentUISlotManifest;\n return {\n id: slotId,\n label: typedSlot.label || slotId,\n icon: typedSlot.icon,\n order: typedSlot.order ?? 999,\n path: `/agents/${slug}/${slotId}`,\n requiredPermission: `manage:${slotId}`,\n };\n })\n .sort((a, b) => a.order - b.order);\n\n // Derive component declarations from package.json exports\n const components: AgentComponentDeclaration[] = [];\n if (packageName && packageJson?.exports) {\n for (const [exportKey, exportValue] of Object.entries(\n packageJson.exports,\n )) {\n // Match patterns like './admin', './town', etc.\n if (exportKey === '.' || exportKey === './manifest') continue;\n\n // Check if this export has a svelte condition (component export)\n const hasSvelteCondition = this.hasSvelteExport(exportValue);\n if (hasSvelteCondition) {\n const type = exportKey.replace('./', '');\n components.push({\n exportPath: `${packageName}/${type}`,\n type,\n });\n }\n }\n }\n\n // Capture adminRoutes from static property (same pattern as uiSlots)\n const adminRoutes: AgentAdminRouteManifest[] =\n (obj.staticProperties?.adminRoutes as\n | AgentAdminRouteManifest[]\n | undefined) ?? [];\n\n // Capture signalSubscriptions from static property\n const signalSubscriptions: string[] =\n (obj.staticProperties?.signalSubscriptions as string[] | undefined) ??\n [];\n\n const agentManifest: AgentManifest = {\n name: obj.className,\n slug,\n icon: agentConfig.icon,\n tier: agentConfig.tier || 'free',\n description: agentConfig.description,\n uiSlots,\n ...(adminRoutes.length > 0 ? { adminRoutes } : {}),\n ...(signalSubscriptions.length > 0 ? { signalSubscriptions } : {}),\n permissions,\n features,\n menuItems,\n components,\n };\n\n obj.agent = agentManifest;\n\n console.log(\n `[manifest-generator] Generated agent manifest for ${obj.className}: ` +\n `${permissions.length} permissions, ${features.length} features, ` +\n `${menuItems.length} menu items, ${components.length} components`,\n );\n }\n }\n\n /**\n * Get deduplicated list of method names exposed via CLI and MCP config\n */\n private getExposedMethods(obj: SmartObjectDefinition): string[] {\n const methods = new Set<string>();\n\n const cliConfig = obj.decoratorConfig.cli;\n if (cliConfig && typeof cliConfig === 'object' && cliConfig.include) {\n for (const m of cliConfig.include) {\n methods.add(m);\n }\n }\n\n const mcpConfig = obj.decoratorConfig.mcp;\n if (mcpConfig && typeof mcpConfig === 'object' && mcpConfig.include) {\n for (const m of mcpConfig.include) {\n methods.add(m);\n }\n }\n\n return Array.from(methods);\n }\n\n /**\n * Check if an export value has a svelte condition (indicating a component export)\n */\n private hasSvelteExport(exportValue: unknown): boolean {\n if (!exportValue || typeof exportValue !== 'object') return false;\n\n // Check for { svelte: ... } condition\n if ('svelte' in exportValue) return true;\n\n // Check nested conditions like { import: { svelte: ... } }\n for (const val of Object.values(exportValue)) {\n if (val && typeof val === 'object' && 'svelte' in (val as object)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Save manifest to file\n */\n saveManifest(manifest: SmartObjectManifest, filePath: string): void {\n const fs = require('node:fs');\n fs.writeFileSync(filePath, JSON.stringify(manifest, null, 2));\n }\n\n /**\n * Load manifest from file\n */\n loadManifest(filePath: string): SmartObjectManifest {\n const fs = require('node:fs');\n const content = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(content);\n }\n}\n\n/**\n * Convenience function to generate manifest\n *\n * @param scanResults - Array of scan results containing object definitions\n * @param options - Optional configuration (passed to ManifestGenerator.generateManifest)\n */\nexport function generateManifest(\n scanResults: ScanResult[],\n options?: {\n packageName?: string;\n packageVersion?: string;\n packageJson?: PackageJsonLike;\n smrtDependencies?: string[];\n includeVisibility?: SmrtVisibility[];\n },\n): SmartObjectManifest {\n const generator = new ManifestGenerator();\n return generator.generateManifest(scanResults, options);\n}\n"],"names":["require"],"mappings":";;;;;;;;AA4EA,MAAMA,YAAU,cAAc,YAAY,GAAG;AAwB7C,MAAM,oDAAoC,IAAI;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUD,SAAS,gBACP,UACA,oBACgB;AAChB,MAAI,mBAAoB,QAAO;AAC/B,MAAI,WAAW,QAAQ,EAAG,QAAO;AACjC,SAAO;AACT;AAEO,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc7B,iBACE,aACA,SAOqB;AACrB,UAAM,WAAgC;AAAA,MACpC,SAAS;AAAA,MACT,WAAW,KAAK,IAAA;AAAA,MAChB,SAAS,CAAA;AAAA,IAAC;AAIZ,QAAI,SAAS,aAAa;AACxB,eAAS,cAAc,QAAQ;AAAA,IACjC;AACA,QAAI,SAAS,gBAAgB;AAC3B,eAAS,iBAAiB,QAAQ;AAAA,IACpC;AAEA,QAAI,SAAS,kBAAkB;AAC7B,eAAS,mBAAmB,QAAQ;AAAA,IACtC;AAEA,eAAW,UAAU,aAAa;AAChC,iBAAW,aAAa,OAAO,SAAS;AAEtC,YAAI,SAAS,aAAa;AACxB,oBAAU,cAAc,QAAQ;AAAA,QAClC;AACA,YAAI,SAAS,gBAAgB;AAC3B,oBAAU,iBAAiB,QAAQ;AAAA,QACrC;AAIA,YAAI,UAAU,aAAa;AACzB,oBAAU,gBAAgB;AAAA,YACxB,UAAU;AAAA,YACV,UAAU;AAAA,UAAA;AAAA,QAEd;AAGA,kBAAU,aAAa;AAAA,UACrB,UAAU;AAAA,UACV,UAAU,iBAAiB;AAAA,QAAA;AAK7B,YACE,SAAS,qBACT,QAAQ,kBAAkB,SAAS,KACnC,CAAC,QAAQ,kBAAkB,SAAS,UAAU,UAAU,GACxD;AAEA;AAAA,QACF;AAGA,YAAI,SAAS,eAAe,SAAS,aAAa;AAChD,oBAAU,aAAa,KAAK;AAAA,YAC1B,QAAQ;AAAA,YACR,UAAU;AAAA,UAAA;AAAA,QAEd;AAGA,kBAAU,aAAa,UAAU,cAAc,UAAU;AACzD,kBAAU,uBACR,UAAU,wBAAwB,GAAG,UAAU,SAAS;AAG1D,YAAI,UAAU,gBAAgB,IAAI;AAChC,gBAAM,UAAU,OAAO,OAAO,UAAU,OAAO;AAC/C,gBAAM,QAAQ;AAAA,YACZ;AAAA,YACA,UAAU,gBAAgB;AAAA,UAAA;AAI5B,cAAI,MAAM,SAAS,GAAG;AACpB,sBAAU,QAAQ;AAAA,UACpB;AAAA,QACF;AAIA,cAAM,cAAc,UAAU,iBAAiB,UAAU;AAGzD,YAAI,SAAS,QAAQ,WAAW,GAAG;AACjC,gBAAM,WAAW,SAAS,QAAQ,WAAW;AAC7C,gBAAM,IAAI;AAAA,YACR,mCAAmC,UAAU,SAAS,MAAM,WAAW;AAAA,OAC7D,SAAS,QAAQ;AAAA,OACjB,UAAU,QAAQ;AAAA;AAAA;AAAA,UAAA;AAAA,QAGhC;AAEA,iBAAS,QAAQ,WAAW,IAAI;AAAA,MAClC;AAAA,IACF;AAMA,SAAK,2BAA2B,QAAQ;AAGxC,SAAK,yBAAyB,QAAQ;AAItC,SAAK,qBAAqB,QAAQ;AAIlC,SAAK,uBAAuB,QAAQ;AAKpC,SAAK,wBAAwB,QAAQ;AAIrC,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,iCAAiC,QAAQ;AAI9C,SAAK;AAAA,MACH;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IAAA;AAGX,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,yBAAyB,UAAqC;AAC5D,eAAW,aAAa,OAAO,OAAO,SAAS,OAAO,GAAG;AACvD,WAAK,wBAAwB,SAAS;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,wBAAwB,WAAwC;AACtE,UAAM,eAAe,UAAU,iBAAiB;AAChD,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,EAAE,cAAc,cAAA,IACpB,KAAK,4BAA4B,YAAY;AAC/C,UAAM,YAAY,aAAa;AAC/B,UAAM,gBAAgB,UAAU,OAAO,SAAS;AAChD,UAAM,cAAc;AAAA,MAClB,iBAAiB;AAAA,MACjB,GAAG;AAAA,IAAA;AAGL,QAAI,eAAe;AACjB,YAAM,mBAAmB,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,kBAAkB;AACpB,cAAM,IAAI;AAAA,UACR,8CAA8C,gBAAgB;AAAA,QAAA;AAAA,MAElE;AAEA,oBAAc,QAAQ;AAAA,QACpB,GAAG,cAAc;AAAA,QACjB,SAAS;AAAA,QACT,WAAW;AAAA,UACT,GAAG,cAAc,OAAO;AAAA,UACxB,GAAG;AAAA,QAAA;AAAA,MACL;AAEF;AAAA,IACF;AAEA,cAAU,OAAO,SAAS,IAAI;AAAA,MAC5B,MAAM;AAAA;AAAA;AAAA;AAAA,MAIN,UAAU,cAAc,SAAS;AAAA,MACjC,OAAO;AAAA,QACL,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAW;AAAA,MAAA;AAAA,IACb;AAGF,YAAQ;AAAA,MACN,iCAAiC,SAAS,cAAc,UAAU,SAAS,mBAAmB,KAAK,UAAU,YAAY,CAAC;AAAA,IAAA;AAAA,EAE9H;AAAA,EAEA,iCAAiC,UAAqC;AACpE,UAAM,WAAqB,CAAA;AAE3B,eAAW,aAAa,OAAO,OAAO,SAAS,OAAO,GAAG;AACvD,YAAM,eAAe,UAAU,iBAAiB;AAChD,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AAEA,YAAM,EAAE,aAAA,IAAiB,KAAK,4BAA4B,YAAY;AACtE,YAAM,YAAY,aAAa;AAC/B,YAAM,aAAa,YAAY,SAAS;AAExC,UAAI,CAAC,UAAU,OAAO,SAAS,GAAG;AAChC,iBAAS;AAAA,UACP,GAAG,UAAU,SAAS,kCAAkC,SAAS;AAAA,QAAA;AAEnE;AAAA,MACF;AAEA,YAAM,mBAAmB,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,kBAAkB;AACpB,iBAAS,KAAK,gBAAgB;AAC9B;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,2BAA2B,WAAW,QAAQ;AACvE,YAAM,qBACJ,gBAAgB,YACZ,KACA,iBAAiB,YAAY,SAAS;AAE5C,UAAI,CAAC,YAAY,QAAQ,SAAS;AAChC,iBAAS;AAAA,UACP,GAAG,UAAU,SAAS,6DAA6D,UAAU,IAAI,kBAAkB;AAAA,QAAA;AAErH;AAAA,MACF;AAEA,UAAI,CAAC,YAAY,OAAO,QAAQ,UAAU,GAAG;AAC3C,iBAAS;AAAA,UACP,GAAG,UAAU,SAAS,6CAA6C,UAAU,IAAI,kBAAkB;AAAA,QAAA;AAAA,MAEvG;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,EAA0C,SACvC,IAAI,CAAC,YAAY,OAAO,OAAO,EAAE,EACjC,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAEjB;AAAA,EACF;AAAA,EAEQ,2BACN,WACA,UACuB;AACvB,QAAI,CAAC,KAAK,gBAAgB,WAAW,QAAQ,GAAG;AAC9C,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,gBAAgB,WAAW,QAAQ;AACxD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,OAAO,OAAO,SAAS,OAAO,EAAE;AAAA,MAChD,CAAC,cAAc,UAAU,cAAc,QAAQ;AAAA,IAAA;AAGjD,WAAO,aAAa;AAAA,EACtB;AAAA,EAEQ,gCACN,WACA,WACoB;AACpB,UAAM,QAAQ,UAAU,OAAO,SAAS;AACxC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,SAAS,UAAU,MAAM,SAAS,cAAc;AACxD,aAAO,GAAG,UAAU,SAAS,0BAA0B,SAAS,qDAAqD,MAAM,IAAI;AAAA,IACjI;AAEA,UAAM,UAAU,MAAM,OAAO;AAC7B,QAAI,WAAW,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,OAAO,OAAO,EAAE,YAAA,CAAa,GAAG;AACxE,aAAO,GAAG,UAAU,SAAS,0BAA0B,SAAS,0DAA0D,OAAO;AAAA,IACnI;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,4BAA4B,cASlC;AACA,UAAM,gBACJ,OAAO,iBAAiB,YACpB,CAAA,IACC;AAEP,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,QACZ,MAAM,cAAc,QAAQ;AAAA,QAC5B,OAAO,cAAc,SAAS;AAAA,QAC9B,YAAY,cAAc,cAAc;AAAA,QACxC,cAAc,cAAc,gBAAgB;AAAA,QAC5C,uBAAuB,cAAc,yBAAyB;AAAA,MAAA;AAAA,IAChE;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,wBAAwB,UAAqC;AAC3D,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC1D,YAAM,QAA0B,CAAA;AAEhC,iBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAE3D,YAAI,MAAM,aAAa,MAAM,OAAO,WAAW;AAC7C;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,SAAS,CAAA;AAG/B,YAAI,QAAQ,YAAY,MAAM,UAAU;AACtC,gBAAM,KAAK;AAAA,YACT,OAAO;AAAA,YACP,MAAM;AAAA,YACN,WAAW,MAAM;AAAA,UAAA,CAClB;AAAA,QACH;AAGA,YAAI,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW;AACxD,cAAI,QAAQ,QAAQ,UAAa,MAAM,QAAQ,QAAW;AACxD,kBAAM,KAAK;AAAA,cACT,OAAO;AAAA,cACP,MAAM;AAAA,cACN,OAAO,QAAQ,OAAO,MAAM;AAAA,cAC5B,WAAW,MAAM;AAAA,YAAA,CAClB;AAAA,UACH;AAEA,cAAI,QAAQ,QAAQ,UAAa,MAAM,QAAQ,QAAW;AACxD,kBAAM,KAAK;AAAA,cACT,OAAO;AAAA,cACP,MAAM;AAAA,cACN,OAAO,QAAQ,OAAO,MAAM;AAAA,cAC5B,WAAW,MAAM;AAAA,YAAA,CAClB;AAAA,UACH;AAAA,QACF;AAGA,YAAI,MAAM,SAAS,QAAQ;AACzB,cACE,QAAQ,cAAc,UACtB,MAAM,cAAc,QACpB;AACA,kBAAM,KAAK;AAAA,cACT,OAAO;AAAA,cACP,MAAM;AAAA,cACN,OAAO,QAAQ,aAAa,MAAM;AAAA,cAClC,WAAW,MAAM;AAAA,YAAA,CAClB;AAAA,UACH;AAEA,cACE,QAAQ,cAAc,UACtB,MAAM,cAAc,QACpB;AACA,kBAAM,KAAK;AAAA,cACT,OAAO;AAAA,cACP,MAAM;AAAA,cACN,OAAO,QAAQ,aAAa,MAAM;AAAA,cAClC,WAAW,MAAM;AAAA,YAAA,CAClB;AAAA,UACH;AAMA,gBAAM,UAAU,QAAQ;AACxB,cAAI,SAAS;AACX,kBAAM,KAAK;AAAA,cACT,OAAO;AAAA,cACP,MAAM;AAAA;AAAA;AAAA,cAGN,OACE,OAAO,YAAY,WACf,UACC,QAAgC;AAAA,cACvC,WAAW,MAAM;AAAA,YAAA,CAClB;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,UAAI,MAAM,SAAS,GAAG;AACpB,YAAI,kBAAkB;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,gBAAgB,UAAqC;AACnD,UAAM,YAAY,IAAI,gBAAA;AAItB,UAAM,qBAAqB,KAAK,yBAAyB,QAAQ;AAGjE,UAAM,wCAAwB,IAAA;AAG9B,UAAM,eAAe,IAAI;AAAA,MACvB,OAAO,OAAO,SAAS,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,IAAA;AAGxD,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC1D,UAAI,8BAA8B,IAAI,IAAI,SAAS,GAAG;AACpD;AAAA,MACF;AAIA,YAAM,YACJ,IAAI,iBAAiB,aACrB,KAAK,qBAAqB,IAAI,SAAS;AAGzC,UAAI,IAAI,iBAAiB,kBAAkB,OAAO;AAEhD,YAAI,kBAAkB,IAAI,IAAI,EAAG;AACjC,0BAAkB,IAAI,IAAI;AAE1B,gBAAQ;AAAA,UACN,kDAAkD,IAAI,YAAY,SAAS;AAAA,QAAA;AAI7E,YAAI,SAAS,UAAU;AAAA,UACrB;AAAA,UACA;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,IAAI;AAAA,QAAA;AAEN,aAAK,sBAAsB,GAAG;AAAA,MAChC,WAAW,KAAK,gBAAgB,KAAK,QAAQ,GAAG;AAE9C,cAAM,UAAU,KAAK,gBAAgB,KAAK,QAAQ;AAClD,cAAM,cAAc,WAAW,aAAa,IAAI,QAAQ,SAAS;AAEjE,YAAI,aAAa;AAEf,kBAAQ;AAAA,YACN,sDAAsD,IAAI,UAAU,SAAS,SAAS;AAAA,UAAA;AAAA,QAE1F,OAAO;AAGL,gBAAM,gBAAgB,SAAS,aAAa;AAC5C,kBAAQ;AAAA,YACN,kDAAkD,IAAI,oBAAoB,SAAS,SAAS,YAAY,aAAa;AAAA,UAAA;AAMvH,cAAI,SAAS,UAAU;AAAA,YACrB,SAAS,aAAa;AAAA,YACtB;AAAA,YACA,IAAI;AAAA,YACJ;AAAA,YACA,IAAI;AAAA,UAAA;AAEN,eAAK,sBAAsB,GAAG;AAAA,QAChC;AAAA,MACF,OAAO;AAEL,gBAAQ;AAAA,UACN,kDAAkD,IAAI,YAAY,SAAS;AAAA,QAAA;AAG7E,YAAI,SAAS,UAAU;AAAA,UACrB;AAAA,UACA;AAAA,UACA,IAAI;AAAA,UACJ,IAAI;AAAA,QAAA;AAEN,aAAK,sBAAsB,GAAG;AAAA,MAChC;AAAA,IACF;AAEA,SAAK,wCAAwC,UAAU,SAAS;AAAA,EAClE;AAAA,EAEA,uBAAuB,UAAqC;AAC1D,eAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,UAAI,CAAC,IAAI,iBAAiB,OAAQ;AAElC,UAAI,gBAAgB,QAAQ,EAAE,SAAS,CAAC,QAAQ,KAAK,EAAA;AACrD,UAAI,gBAAgB,QAAQ,EAAE,SAAS,CAAC,QAAQ,KAAK,EAAA;AAErD,UAAI,IAAI,gBAAgB,gBAAiB;AAEzC,YAAM,eAAe,IAAI,gBAAgB;AACzC,YAAM,cACJ,gBAAgB,OAAO,iBAAiB,WACpC,aAAa,SAAS,aACtB,eACE,aACA;AACR,YAAM,eACJ,eAAe,IAAI,OAAO,WAAW,IAAI,YAAY,WAAW,IAAI;AAEtE,YAAM,kBAAkB,OAAO,QAAQ,IAAI,MAAM,EAC9C,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM;AACrB,cAAM,OAAO,MAAM,OAAO,UAAU;AACpC,eAAO,SAAS,WAAW,SAAS;AAAA,MACtC,CAAC,EACA,IAAI,CAAC,CAAC,SAAS,MAAM,YAAY,SAAS,CAAC;AAE9C,UAAI,gBAAgB,kBAClB,gBAAgB,SAAS,IACrB,CAAC,GAAI,eAAe,CAAC,YAAY,IAAI,CAAA,GAAK,GAAG,eAAe,IAC5D,CAAC,IAAI;AAAA,IACb;AAAA,EACF;AAAA,EAEA,2BAA2B,UAAqC;AAC9D,eAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,UAAI,CAAC,IAAI,iBAAiB,OAAQ;AAClC,UAAI,gBAAgB,iBAAiB,EAAE,MAAM,WAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEQ,wCACN,UACA,WACM;AACN,UAAM,oCAAoB,IAAA;AAC1B,UAAM,oCAAoB,IAAA;AAI1B,UAAM,qCAAqB,IAAA;AAE3B,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC1D,UAAI,IAAI,QAAQ,WAAW;AACzB,sBAAc,IAAI,IAAI,OAAO,WAAW,IAAI,MAAM;AAClD,sBAAc,IAAI,IAAI,QAAQ,EAAE,MAAM,KAAK;AAAA,MAC7C;AAAA,IACF;AAEA,eAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,YAAM,cAAc,KAAK,mBAAmB,GAAG;AAC/C,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,YAAM,eAAe,cAAc,IAAI,WAAW;AAClD,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AAEA,iBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,IAAI,UAAU,CAAA,CAAE,GAAG;AACjE,YACE,MAAM,SAAS,gBACf,CAAC,MAAM,WACP,MAAM,OAAO,SACb;AACA;AAAA,QACF;AAEA,cAAM,aAAa,YAAY,SAAS;AACxC,cAAM,eAAe,aAAa,QAAQ,UAAU;AACpD,YAAI,CAAC,cAAc;AACjB;AAAA,QACF;AAEA,cAAM,eAAe,KAAK;AAAA,UACxB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QAAA;AAEF,cAAM,eAAe,cAAc,QAAQ,IAAI;AAC/C,YAAI,CAAC,gBAAgB,aAAa,SAAS,cAAc;AACvD;AAAA,QACF;AAEA,qBAAa,QAAQ,UAAU,IAAI;AAAA,UACjC,GAAG;AAAA,UACH,MAAM;AAAA,QAAA;AAER,uBAAe,IAAI,YAAY;AAAA,MACjC;AAAA,IACF;AAEA,eAAW,UAAU,gBAAgB;AACnC,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,cAAc,IAAI,MAAM;AAAA,QACxB;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEQ,2BACN,SACA,UACA,eAC4B;AAC5B,UAAM,gBAAgB,QAAQ,MAAM,GAAG,EAAE,CAAC;AAC1C,QAAI,cAAc,IAAI,aAAa,GAAG;AACpC,aAAO,cAAc,IAAI,aAAa;AAAA,IACxC;AAEA,UAAM,YAAY,OAAO,OAAO,SAAS,OAAO,EAAE;AAAA,MAChD,CAAC,cACC,UAAU,cAAc,iBACxB,UAAU,kBAAkB,iBAC5B,UAAU,SAAS,iBACnB,UAAU,iBAAiB,cAAc,iBACzC,UAAU,QAAQ,cAAc;AAAA,IAAA;AAGpC,QAAI,CAAC,aAAa,cAAc,SAAS,GAAG,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,YAChB,KAAK,mBAAmB,SAAS,IACjC,KAAK,qBAAqB,aAAa;AAE3C,WAAO,cAAc,cAAc,IAAI,WAAW,IAAI;AAAA,EACxD;AAAA,EAEQ,mBAAmB,KAAgD;AACzE,WACE,IAAI,QAAQ,aACZ,IAAI,iBAAiB,aACrB,KAAK,qBAAqB,IAAI,SAAS;AAAA,EAE3C;AAAA,EAEQ,yBACN,QACA,WACA,OACA,UACM;AACN,UAAM,UAA4C,CAAA;AAClD,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AAC3D,cAAQ,IAAI,IAAI;AAAA;AAAA;AAAA,QAGd,MAAM,OAAO;AAAA,QACb,YAAY,OAAO;AAAA,QACnB,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,QACf,cAAc,OAAO;AAAA,MAAA;AAAA,IAEzB;AAEA,UAAM,mBAAqC;AAAA,MACzC,WAAW,OAAO;AAAA,MAClB;AAAA,MACA,UAAU,OAAO,WAAW,CAAA,GAAI,IAAI,CAAC,WAAW;AAAA,QAC9C,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,MAAA,EAChB;AAAA,MACF,UAAU,CAAA;AAAA,MACV,aAAa,CAAA;AAAA,MACb,cAAc,CAAA;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,aAAa;AAAA,IAAA;AAGf,WAAO,MAAM,UAAU,YAAY,gBAAgB;AACnD,WAAO,UAAU,KAAK,6BAA6B,QAAQ,OAAO,QAAQ;AAAA,EAC5E;AAAA,EAEQ,6BACN,QACA,OACA,UACQ;AACR,QAAI,OAAO,QAAQ,cAAc,OAAO;AACtC,YAAM,gBACJ,MAAM,IAAI,iBAAiB,kBAAkB,QACzC,MAAM,OACN,KAAK,gBAAgB,MAAM,KAAK,QAAQ,GAAG,aAAa,MAAM;AAEpE,aAAO,WAAW,QAAQ,EACvB;AAAA,QACC,KAAK,UAAU;AAAA,UACb,SAAS,OAAO;AAAA,UAChB;AAAA,UACA,aAAa,KAAK;AAAA,YAChB;AAAA,YACA;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MAAA,EAEF,OAAO,KAAK,EACZ,UAAU,GAAG,CAAC;AAAA,IACnB;AAEA,WAAO,WAAW,QAAQ,EACvB;AAAA,MACC,KAAK,UAAU;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,WAAW,OAAO,QAAQ,OAAO;AAAA,MAAA,CAClC;AAAA,IAAA,EAEF,OAAO,KAAK,EACZ,UAAU,GAAG,CAAC;AAAA,EACnB;AAAA,EAEQ,0BACN,eACA,UACA,UAAuB,oBAAI,OACjB;AACV,UAAM,cAAwB,CAAA;AAC9B,QAAI,QAAQ,IAAI,aAAa,GAAG;AAC9B,aAAO;AAAA,IACT;AACA,YAAQ,IAAI,aAAa;AAEzB,UAAM,iBAAiB,KAAK,gBAAgB,aAAa,EAAE,YAAA;AAE3D,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC1D,YAAM,iBAAiB,KAAK,gBAAgB,IAAI,SAAS,EAAE,YAAA;AAC3D,YAAM,eAAe,IAAI,UACrB,KAAK,gBAAgB,IAAI,OAAO,EAAE,YAAA,IAClC;AAEJ,UACE,mBAAmB,kBACnB,iBAAiB,gBACjB;AACA;AAAA,MACF;AAEA,UAAI,iBAAiB,gBAAgB;AACnC,oBAAY,KAAK,IAAI;AACrB,oBAAY;AAAA,UACV,GAAG,KAAK,0BAA0B,MAAM,UAAU,OAAO;AAAA,QAAA;AAAA,MAE7D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAsB,KAAkC;AAC9D,QAAI,CAAC,IAAI,QAAQ,SAAS;AACxB;AAAA,IACF;AAEA,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,IAAI,UAAU,CAAA,CAAE,GAAG;AACjE,YAAM,UAAU,OAAO,OAAO;AAC9B,YAAM,gBAAgB,KAAK,iBAAiB,KAAK;AACjD,UAAI,CAAC,WAAW,CAAC,eAAe;AAC9B;AAAA,MACF;AAEA,YAAM,aAAa,YAAY,SAAS;AACxC,UAAI,CAAC,IAAI,OAAO,QAAQ,UAAU,GAAG;AACnC;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,UAAU,IAAI;AAAA,QAC/B,GAAG,IAAI,OAAO,QAAQ,UAAU;AAAA,QAChC,GAAI,UAAU,EAAE,MAAM,OAAO,OAAO,EAAE,YAAA,EAAY,IAAM,CAAA;AAAA,QACxD,GAAI,gBAAgB,EAAE,kBAAkB,CAAA;AAAA,MAAC;AAAA,IAE7C;AAAA,EACF;AAAA,EAEQ,iBACN,OACuD;AACvD,QAAI,OAAO,OAAO,WAAW,iBAAiB;AAC5C,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,cAAc;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,mBAAmB;AACrC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,yBACN,UACqB;AAErB,UAAM,oBAA2D;AAAA,MAC/D,GAAG,SAAS;AAAA,IAAA;AAId,QAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,iBAAW,eAAe,SAAS,kBAAkB;AACnD,cAAM,mBAAmB,yBAAyB,WAAW;AAC7D,YAAI,kBAAkB;AAEpB,qBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,iBAAiB,OAAO,GAAG;AAClE,gBAAI,CAAC,kBAAkB,IAAI,GAAG;AAC5B,gCAAkB,IAAI,IAAI;AAAA,YAC5B;AAAA,UACF;AAEA,kBAAQ;AAAA,YACN,mCAAmC,OAAO,KAAK,iBAAiB,OAAO,EAAE,MAAM,iBAAiB,WAAW;AAAA,UAAA;AAAA,QAE/G;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBACN,KACA,UACS;AACT,QAAI,CAAC,IAAI,QAAS,QAAO;AAGzB,UAAM,oCAAoB,IAAA;AAC1B,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC9D,oBAAc,IAAI,OAAO,WAAW,MAAM;AAC1C,oBAAc,IAAI,OAAO,UAAU,YAAA,GAAe,MAAM;AAAA,IAC1D;AAGA,QAAI,eAAmC,IAAI;AAC3C,UAAM,8BAAc,IAAA;AAEpB,WAAO,cAAc;AACnB,UAAI,QAAQ,IAAI,YAAY,EAAG;AAC/B,cAAQ,IAAI,YAAY;AAExB,UAAI,YAAY,cAAc,IAAI,YAAY;AAG9C,UACE,CAAC,aACD,SAAS,oBACT,SAAS,iBAAiB,SAAS,GACnC;AACA,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,CAAC,UAAW;AAEhB,UAAI,UAAU,iBAAiB,kBAAkB,OAAO;AACtD,eAAO;AAAA,MACT;AAEA,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,6BACN,KACA,eACA,UACS;AACT,QAAI,CAAC,IAAI,QAAS,QAAO;AAEzB,QAAI,eAAmC,IAAI;AAC3C,UAAM,8BAAc,IAAA;AAEpB,WAAO,cAAc;AACnB,UAAI,QAAQ,IAAI,YAAY,EAAG;AAC/B,cAAQ,IAAI,YAAY;AAExB,UAAI,8BAA8B,IAAI,YAAY,GAAG;AACnD,eAAO;AAAA,MACT;AAEA,UAAI,YAAY,cAAc,IAAI,YAAY;AAC9C,UACE,CAAC,aACD,SAAS,oBACT,SAAS,iBAAiB,SAAS,GACnC;AACA,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,MAEJ;AACA,UAAI,CAAC,UAAW;AAEhB,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,gBACN,KACA,UACsD;AACtD,QAAI,CAAC,IAAI,QAAS,QAAO;AAGzB,UAAM,oCAAoB,IAAA;AAC1B,eAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC9D,oBAAc,IAAI,OAAO,WAAW,MAAM;AAC1C,oBAAc,IAAI,OAAO,UAAU,YAAA,GAAe,MAAM;AAAA,IAC1D;AAIA,QAAI;AAGJ,QAAI,eAAmC,IAAI;AAC3C,UAAM,8BAAc,IAAA;AAEpB,WAAO,cAAc;AACnB,UAAI,QAAQ,IAAI,YAAY,EAAG;AAC/B,cAAQ,IAAI,YAAY;AAExB,UAAI,YAAY,cAAc,IAAI,YAAY;AAG9C,UACE,CAAC,aACD,SAAS,oBACT,SAAS,iBAAiB,SAAS,GACnC;AACA,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,CAAC,UAAW;AAEhB,UAAI,UAAU,iBAAiB,kBAAkB,OAAO;AAGtD,cAAM,YACJ,UAAU,iBAAiB,aAC3B,UAAU,QAAQ,aAClB,KAAK,qBAAqB,UAAU,SAAS;AAC/C,sBAAc;AAAA,UACZ,WAAW,UAAU;AAAA,UACrB;AAAA,QAAA;AAAA,MAEJ;AAEA,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqB,WAA2B;AAGtD,WAAO,qBAAqB,SAAS;AAAA,EACvC;AAAA,EAEQ,iCACN,cACA,WACA,UACA,gBACiB;AACjB,QACE,KAAK,gBAAgB,YAAY,MAAM,sBACvC,cAAc,YACd;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,UACL,GAAI,SAAS,SAAS,CAAA;AAAA,UACtB,UAAU;AAAA,QAAA;AAAA,MACZ;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,WAA2B;AACjD,WAAO,UAAU,SAAS,GAAG,IACzB,UAAU,MAAM,GAAG,EAAE,SAAS,YAC9B;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBO,qBAAqB,UAAqC;AAE/D,UAAM,oCAAoB,IAAA;AAC1B,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC1D,oBAAc,IAAI,IAAI,WAAW,GAAG;AAEpC,oBAAc,IAAI,IAAI,UAAU,YAAA,GAAe,GAAG;AAAA,IACpD;AAMA,eAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,UAAI,CAAC,IAAI,QAAS;AAYlB,YAAM,UAAU,KAAK,WAAW,KAAK,eAAe,QAAQ;AAC5D,YAAM,uBAAuB,KAAK;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,UAAI,CAAC,WAAW,CAAC,sBAAsB;AACrC;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,qDAAqD,IAAI,SAAS,SAAS,IAAI,OAAO;AAAA,MAAA;AAIxF,YAAM,mBAA6B,CAAA;AACnC,UAAI,eAAmC,IAAI;AAC3C,YAAM,8BAAc,IAAA;AAEpB,aAAO,cAAc;AACnB,YAAI,QAAQ,IAAI,YAAY,GAAG;AAC7B,kBAAQ;AAAA,YACN,0DAA0D,IAAI,SAAS;AAAA,UAAA;AAEzE;AAAA,QACF;AACA,gBAAQ,IAAI,YAAY;AACxB,yBAAiB,QAAQ,YAAY;AAErC,YAAI,YAAY,cAAc,IAAI,YAAY;AAM9C,YAAI,cAAc,KAAK;AACrB,sBAAY;AAAA,QACd;AAGA,YACE,CAAC,aACD,SAAS,oBACT,SAAS,iBAAiB,SAAS,GACnC;AACA,sBAAY,KAAK;AAAA,YACf;AAAA,YACA,SAAS;AAAA,YACT;AAAA,UAAA;AAAA,QAEJ;AAEA,YAAI,CAAC,UAAW;AAChB,uBAAe,UAAU;AAAA,MAC3B;AAEA,cAAQ;AAAA,QACN,8CAA8C,IAAI,SAAS,KAAK,iBAAiB,KAAK,MAAM,CAAC;AAAA,MAAA;AAa/F,YAAM,eAAgD,CAAA;AACtD,YAAM,gBAAkD,CAAA;AAExD,iBAAW,gBAAgB,kBAAkB;AAC3C,cAAM,WAAW,cAAc,IAAI,YAAY;AAC/C,YAAI,CAAC,SAAU;AAEf,cAAM,0BACJ,8BAA8B,IAAI,YAAY;AAChD,YAAI,CAAC,WAAW,CAAC,yBAAyB;AACxC;AAAA,QACF;AAGA,mBAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AACnE,cAAI,CAAC,aAAa,SAAS,GAAG;AAC5B,yBAAa,SAAS,IAAI,KAAK;AAAA,cAC7B;AAAA,cACA;AAAA,cACA;AAAA,cACA,IAAI;AAAA,YAAA;AAAA,UAER;AAAA,QACF;AAGA,mBAAW,CAAC,YAAY,SAAS,KAAK,OAAO;AAAA,UAC3C,SAAS,WAAW,CAAA;AAAA,QAAC,GACpB;AACD,cAAI,CAAC,cAAc,UAAU,GAAG;AAC9B,0BAAc,UAAU,IAAI;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAGA,iBAAW,CAAC,WAAW,QAAQ,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC9D,qBAAa,SAAS,IAAI;AAAA,MAC5B;AAGA,iBAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,IAAI,WAAW,CAAA,CAAE,GAAG;AACvE,sBAAc,UAAU,IAAI;AAAA,MAC9B;AAGA,UAAI,SAAS;AACb,UAAI,UAAU;AAId,YAAM,UAAU,KAAK,YAAY,KAAK,eAAe,QAAQ;AAC7D,UAAI,WAAW,YAAY,KAAK;AAK9B,cAAM,gBACJ,QAAQ,iBAAiB,aACzB,KAAK,qBAAqB,QAAQ,SAAS;AAG7C,YAAI,kBAAkB,IAAI,mBAAmB,CAAA;AAC7C,YAAI,gBAAgB,YAAY;AAChC,gBAAQ;AAAA,UACN,wBAAwB,IAAI,SAAS,yBAAyB,aAAa,UAAU,QAAQ,SAAS;AAAA,QAAA;AAIxG,YAAI,QAAQ,iBAAiB,eAAe;AAC1C,cAAI,gBAAgB,gBAClB,QAAQ,gBAAgB;AAC1B,kBAAQ;AAAA,YACN,wBAAwB,IAAI,SAAS,6BAA6B,QAAQ,gBAAgB,aAAa,UAAU,QAAQ,SAAS;AAAA,UAAA;AAAA,QAEtI;AAGA,YAAI,QAAQ,eAAe,IAAI,YAAY;AACzC,kBAAQ;AAAA,YACN,wBAAwB,IAAI,SAAS,0BAA0B,QAAQ,UAAU,UAAU,QAAQ,SAAS;AAAA,UAAA;AAE9G,cAAI,aAAa,QAAQ;AAAA,QAC3B;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,0BAA0B,IAAI,SAAS,YAAY,OAAO,KAAK,YAAY,EAAE,MAAM;AAAA,MAAA;AAAA,IAEvF;AAIA,eAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AAEjD,YAAM,eACJ,IAAI,YAAY,oBAChB,KAAK,kBAAkB,KAAK,aAAa;AAE3C,UAAI,cAAc;AAEhB,cAAM,YAAY,KAAK,cAAc,KAAK,UAAU,aAAa;AAEjE,YAAI,WAAW;AACb,kBAAQ;AAAA,YACN,wBAAwB,IAAI,SAAS,8BAA8B,UAAU,SAAS;AAAA,UAAA;AAIxF,cAAI,UAAU,iBAAiB,WAAW;AACxC,gBAAI,kBAAkB,IAAI,mBAAmB,CAAA;AAC7C,gBAAI,gBAAgB,YAAY,UAAU,gBAAgB;AAC1D,oBAAQ;AAAA,cACN,wBAAwB,IAAI,SAAS,yBAAyB,UAAU,gBAAgB,SAAS,qBAAqB,UAAU,SAAS;AAAA,YAAA;AAAA,UAE7I;AAGA,cAAI,UAAU,eAAe,IAAI,YAAY;AAC3C,oBAAQ;AAAA,cACN,wBAAwB,IAAI,SAAS,0BAA0B,UAAU,UAAU,qBAAqB,UAAU,SAAS,UAAU,IAAI,UAAU;AAAA,YAAA;AAErJ,gBAAI,aAAa,UAAU;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBACN,KACA,eACS;AACT,QAAI,CAAC,IAAI,QAAS,QAAO;AAGzB,QAAI,eAAmC,IAAI;AAC3C,UAAM,8BAAc,IAAA;AAEpB,WAAO,cAAc;AACnB,UAAI,QAAQ,IAAI,YAAY,EAAG;AAC/B,cAAQ,IAAI,YAAY;AAExB,UAAI,iBAAiB,iBAAkB,QAAO;AAE9C,YAAM,YAAY,cAAc,IAAI,YAAY;AAChD,UAAI,CAAC,UAAW;AAEhB,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeQ,cACN,eACA,UACA,eACmC;AAGnC,QAAI,cAAc,gBAAgB;AAChC,YAAM,gBAAgB,cAAc;AACpC,cAAQ;AAAA,QACN,wBAAwB,cAAc,SAAS,wBAAwB,aAAa;AAAA,MAAA;AAItF,YAAM,YAAY,cAAc,IAAI,aAAa;AACjD,UAAI,WAAW;AACb,gBAAQ;AAAA,UACN,yCAAyC,aAAa;AAAA,QAAA;AAExD,eAAO;AAAA,MACT;AAGA,UAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,cAAM,oBAAoB,KAAK;AAAA,UAC7B;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAEF,YAAI,mBAAmB;AACrB,kBAAQ;AAAA,YACN,yCAAyC,aAAa;AAAA,UAAA;AAExD,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAKA,UAAM,iBAAiB,cAAc,OAAO;AAE5C,QAAI,gBAAgB;AAGlB,YAAM,gBAAgB,eAAe,WAAW,eAAe;AAE/D,UAAI,iBAAiB,OAAO,kBAAkB,UAAU;AAEtD,cAAM,YAAY,cAAc,IAAI,aAAa;AACjD,YAAI,WAAW;AACb,iBAAO;AAAA,QACT;AAGA,YAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,SAAS;AAAA,YACT;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF;AAIA,UAAM,iBAAiB,cAAc;AACrC,UAAM,aAAuB,CAAA;AAG7B,QAAI,WAAW;AACf,QAAI,SAAS,SAAS,YAAY,GAAG;AACnC,iBAAW,SAAS,MAAM,GAAG,CAAC,aAAa,MAAM;AAAA,IACnD;AAIA,eAAW,KAAK,QAAQ;AAGxB,QAAI,SAAS,SAAS,GAAG,KAAK,SAAS,SAAS,GAAG;AACjD,iBAAW,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;AAAA,IACvC;AAGA,QAAI,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,GAAG;AACnD,iBAAW,KAAK,GAAG,SAAS,MAAM,GAAG,EAAE,CAAC,GAAG;AAAA,IAC7C;AAGA,QAAI,SAAS,SAAS,IAAI,KAAK,SAAS,SAAS,GAAG;AAClD,iBAAW,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;AAAA,IACvC;AAIA,eAAW,aAAa,YAAY;AAClC,UAAI,cAAc,cAAc,UAAW;AAC3C,YAAM,YAAY,cAAc,IAAI,SAAS;AAC7C,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,iBAAW,aAAa,YAAY;AAClC,YAAI,cAAc,cAAc,UAAW;AAC3C,cAAM,YAAY,KAAK;AAAA,UACrB;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAEF,YAAI,WAAW;AACb,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,WACN,KACA,eACA,UACS;AAET,QAAI,IAAI,iBAAiB,kBAAkB,OAAO;AAChD,aAAO;AAAA,IACT;AAGA,QAAI,eAAmC,IAAI;AAC3C,UAAM,8BAAc,IAAA;AAEpB,WAAO,cAAc;AACnB,UAAI,QAAQ,IAAI,YAAY,GAAG;AAC7B;AAAA,MACF;AACA,cAAQ,IAAI,YAAY;AAExB,UAAI,YAAY,cAAc,IAAI,YAAY;AAG9C,UAAI,cAAc,KAAK;AACrB,oBAAY;AAAA,MACd;AAGA,UACE,CAAC,aACD,SAAS,oBACT,SAAS,iBAAiB,SAAS,GACnC;AACA,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,CAAC,UAAW;AAGhB,UAAI,UAAU,iBAAiB,kBAAkB,OAAO;AACtD,eAAO;AAAA,MACT;AAEA,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,YACN,KACA,eACA,UACmC;AAEnC,QAAI;AAGJ,QAAI,IAAI,iBAAiB,kBAAkB,OAAO;AAChD,gBAAU;AAAA,IACZ;AAGA,QAAI,eAAmC,IAAI;AAC3C,UAAM,8BAAc,IAAA;AAEpB,WAAO,cAAc;AACnB,UAAI,QAAQ,IAAI,YAAY,GAAG;AAC7B;AAAA,MACF;AACA,cAAQ,IAAI,YAAY;AAExB,UAAI,YAAY,cAAc,IAAI,YAAY;AAG9C,UAAI,cAAc,KAAK;AACrB,oBAAY;AAAA,MACd;AAGA,UACE,CAAC,aACD,SAAS,oBACT,SAAS,iBAAiB,SAAS,GACnC;AACA,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,CAAC,UAAW;AAIhB,UAAI,UAAU,iBAAiB,kBAAkB,OAAO;AACtD,kBAAU;AAAA,MACZ;AAEA,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,8BACN,iBACA,kBACA,eACmC;AAEnC,eAAW,eAAe,kBAAkB;AAC1C,YAAM,mBAAmB,yBAAyB,WAAW;AAE7D,UAAI,CAAC,kBAAkB;AACrB;AAAA,MACF;AAIA,YAAM,YAAY,iBAAiB,kBAAkB,eAAe;AAEpE,UAAI,WAAW;AAEb,sBAAc,IAAI,UAAU,WAAW,SAAS;AAChD,sBAAc,IAAI,UAAU,UAAU,YAAA,GAAe,SAAS;AAE9D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,oBACN,aACA,WACQ;AAGR,UAAM,cAAc,YAAY;AAGhC,QAAI,YAAY,SAAS;AAEvB,UAAI,YAAY,QAAQ,WAAW,GAAG;AACpC,eAAO,GAAG,WAAW;AAAA,MACvB;AAGA,YAAM,aAAa,YAAY,QAAQ,GAAG;AAC1C,UAAI,YAAY;AAEd,YAAI,cAAc,OAAO,eAAe,UAAU;AAChD,gBAAM,cAAc;AAIpB,cAAI,YAAY,QAAQ;AACtB,mBAAO;AAAA,UACT;AACA,cAAI,YAAY,SAAS;AACvB,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,YAAY,MAAM;AACpB,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,UAAuC;AAC7D,UAAM,aAAuB,CAAA;AAE7B,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC3D,iBAAW,KAAK,KAAK,kBAAkB,GAAG,CAAC;AAAA,IAC7C;AAEA,WAAO,WAAW,KAAK,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAoC;AAC5D,UAAM,SAAS,OAAO,QAAQ,IAAI,MAAM,EACrC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AACtB,YAAM,WAAW,CAAC,MAAM,WAAW,MAAM;AACzC,YAAM,OAAO,KAAK,iBAAiB,MAAM,IAAI;AAC7C,aAAO,KAAK,IAAI,GAAG,QAAQ,KAAK,IAAI;AAAA,IACtC,CAAC,EACA,KAAK,IAAI;AAEZ,WAAO,oBAAoB,IAAI,SAAS;AAAA,EAC1C,MAAM;AAAA;AAAA,EAEN;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,WAA2B;AAClD,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,UAAuC;AAC3D,UAAM,YAAsB,CAAA;AAE5B,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC3D,YAAM,YAAY,IAAI,gBAAgB;AACtC,UAAI,cAAc,OAAO;AACvB,kBAAU,KAAK,GAAG,KAAK,mBAAmB,GAAG,CAAC;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,UAAU,KAAK,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,UAAuC;AAC9D,UAAM,YAAsB,CAAA;AAE5B,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC3D,YAAM,YAAY,IAAI,gBAAgB;AACtC,UAAI,cAAc,OAAO;AACvB,kBAAU,KAAK,KAAK,qBAAqB,GAAG,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO,UAAU,KAAK,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,KACA,YACA,WAKA;AACA,UAAM,SACJ,IAAI,gBAAgB,OAAO,OAAO,IAAI,gBAAgB,QAAQ,WAC1D,IAAI,gBAAgB,MACpB;AACN,UAAM,cAAc,QAAQ,SAAS,UAAU;AAC/C,UAAM,kBAAkB,aAAa,QAAQ,YAC1C,MAAM,GAAG,EACT,IAAI,CAAC,YAAY,QAAQ,MAAM,EAC/B,OAAO,OAAO,EACd,KAAK,GAAG;AACX,UAAM,oBACJ,IAAI,YAAY,oBAAoB,CAAC,CAAC,IAAI;AAE5C,WAAO;AAAA,MACL,OACE,aAAa,UACZ,qBAAqB,UAAU,WAAW,eAAe;AAAA,MAC5D,QACE,aAAa,QAAQ,YAAA,MAAkB,SACvC,aAAa,QAAQ,YAAA,MAAkB,UACvC,aAAa,QAAQ,YAAA,MAAkB,SACvC,aAAa,QAAQ,kBAAkB,WACvC,aAAa,QAAQ,YAAA,MAAkB,WAClC,YAAY,OAAO,gBAMpB;AAAA,MACN,MAAM,kBAAkB;AAAA,IAAA;AAAA,EAE5B;AAAA,EAEQ,mBAAmB,KAAsC;AAC/D,UAAM,EAAE,eAAe;AACvB,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAW,OAAO,WAAW,YAAY,QAAQ,WAAY,CAAA;AACnE,UAAM,UACH,OAAO,WAAW,YAAY,QAAQ,WAAY;AACrD,UAAM,oBACJ,IAAI,YAAY,oBAAoB,CAAC,CAAC,IAAI;AAE5C,UAAM,YAAsB,CAAA;AAG5B,UAAM,gBAAgB,CAAC,OAAe;AACpC,UAAI,WAAW,CAAC,QAAQ,SAAS,EAAE,EAAG,QAAO;AAC7C,UAAI,QAAQ,SAAS,EAAE,EAAG,QAAO;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,mBAAmB;AACtB,UAAI,cAAc,MAAM,GAAG;AACzB,kBAAU,KAAK,QAAQ,UAAU,EAAE;AAAA,MACrC;AACA,UAAI,cAAc,QAAQ,GAAG;AAC3B,kBAAU,KAAK,SAAS,UAAU,EAAE;AAAA,MACtC;AACA,UAAI,cAAc,KAAK,GAAG;AACxB,kBAAU,KAAK,QAAQ,UAAU,MAAM;AAAA,MACzC;AACA,UAAI,cAAc,QAAQ,GAAG;AAC3B,kBAAU,KAAK,QAAQ,UAAU,MAAM;AAAA,MACzC;AACA,UAAI,cAAc,QAAQ,GAAG;AAC3B,kBAAU,KAAK,WAAW,UAAU,MAAM;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,kBAAkB,CAAC,QAAQ,OAAO,UAAU,UAAU,QAAQ;AACpE,eAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACjE,UACE,gBAAgB,SAAS,UAAU,KACnC,CAAC,UAAU,YACX,CAAC,cAAc,UAAU,GACzB;AACA;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,oBAAoB,KAAK,YAAY,SAAS;AACjE,UACE,MAAM,UAAU,gBAChB,CAAC,qBACD,CAAC,UAAU,UACX;AACA;AAAA,MACF;AAEA,UAAI,MAAM,UAAU,UAAU,mBAAmB;AAC/C;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,UAAU,eAAe,KAAK;AACnD,gBAAU,KAAK,GAAG,MAAM,MAAM,KAAK,UAAU,GAAG,MAAM,IAAI,MAAM,IAAI,EAAE;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,KAAoC;AAC/D,UAAM,EAAE,YAAY,UAAA,IAAc;AAClC,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAW,OAAO,WAAW,YAAY,QAAQ,WAAY,CAAA;AACnE,UAAM,UACH,OAAO,WAAW,YAAY,QAAQ,WAAY;AAErD,UAAM,aAAa,CAAA;AAGnB,UAAM,gBAAgB,CAAC,OAAe;AACpC,UAAI,WAAW,CAAC,QAAQ,SAAS,EAAE,EAAG,QAAO;AAC7C,UAAI,QAAQ,SAAS,EAAE,EAAG,QAAO;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,MAAM,GAAG;AACzB,iBAAW,KAAK,aAAa,UAAU,WAAW,UAAU,EAAE;AAC9D,iBAAW,KAAK,eAAe,UAAU,8BAA8B;AACvE,iBAAW;AAAA,QACT,mCAAmC,SAAS;AAAA,MAAA;AAE9C,iBAAW,KAAK,qDAAqD;AACrE,iBAAW,KAAK,kCAAkC;AAClD,iBAAW,KAAK,OAAO;AAAA,IACzB;AAEA,QAAI,cAAc,KAAK,GAAG;AACxB,iBAAW,KAAK,aAAa,UAAU,cAAc,SAAS,EAAE;AAChE,iBAAW;AAAA,QACT,eAAe,UAAU;AAAA,MAAA;AAE3B,iBAAW;AAAA,QACT,mCAAmC,SAAS;AAAA,MAAA;AAE9C,iBAAW,KAAK,uDAAuD;AACvE,iBAAW;AAAA,QACT;AAAA,MAAA;AAEF,iBAAW,KAAK,iCAAiC;AACjD,iBAAW,KAAK,OAAO;AAAA,IACzB;AAEA,QAAI,cAAc,QAAQ,GAAG;AAC3B,iBAAW,KAAK,cAAc,UAAU,aAAa,SAAS,EAAE;AAChE,iBAAW,KAAK,gBAAgB,UAAU,8BAA8B;AACxE,iBAAW;AAAA,QACT,mCAAmC,SAAS;AAAA,MAAA;AAE9C,iBAAW,KAAK,oCAAoC;AACpD,iBAAW,KAAK,iDAAiD;AACjE,iBAAW,KAAK,kDAAkD;AAClE,iBAAW,KAAK,OAAO;AAAA,IACzB;AAEA,QAAI,cAAc,QAAQ,GAAG;AAC3B,iBAAW,KAAK,aAAa,UAAU,iBAAiB,SAAS,EAAE;AACnE,iBAAW;AAAA,QACT,eAAe,UAAU;AAAA,MAAA;AAE3B,iBAAW;AAAA,QACT,mCAAmC,SAAS;AAAA,MAAA;AAE9C,iBAAW,KAAK,oCAAoC;AACpD,iBAAW;AAAA,QACT;AAAA,MAAA;AAEF,iBAAW;AAAA,QACT;AAAA,MAAA;AAEF,iBAAW,KAAK,iCAAiC;AACjD,iBAAW,KAAK,OAAO;AAAA,IACzB;AAEA,QAAI,cAAc,QAAQ,GAAG;AAC3B,iBAAW,KAAK,gBAAgB,UAAU,iBAAiB,SAAS,EAAE;AACtE,iBAAW;AAAA,QACT,kBAAkB,UAAU;AAAA,MAAA;AAE9B,iBAAW;AAAA,QACT,mCAAmC,SAAS;AAAA,MAAA;AAE9C,iBAAW;AAAA,QACT;AAAA,MAAA;AAEF,iBAAW;AAAA,QACT;AAAA,MAAA;AAEF,iBAAW,KAAK,+CAA+C;AAC/D,iBAAW,KAAK,OAAO;AAAA,IACzB;AAEA,WAAO,MAAM,SAAS;AAAA,EAAe,WAAW,KAAK,IAAI,CAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAuC;AACtD,UAAM,QAAkB,CAAA;AAExB,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC3D,YAAM,YAAY,IAAI,gBAAgB;AACtC,UAAI,cAAc,OAAO;AACvB,cAAM,KAAK,GAAG,KAAK,sBAAsB,GAAG,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,UAAuC;AAC1D,UAAM,QAAkB,CAAA;AAExB,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,SAAS,OAAO,GAAG;AAC3D,YAAM,YAAY,IAAI,gBAAgB;AACtC,UAAI,cAAc,OAAO;AACvB,cAAM,KAAK,KAAK,gBAAgB,GAAG,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EAAM,MAAM,KAAK,KAAK,CAAC;AAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,KAAsC;AAClE,UAAM,EAAE,eAAe;AACvB,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAW,OAAO,WAAW,YAAY,QAAQ,WAAY,CAAA;AACnE,UAAM,UACH,OAAO,WAAW,YAAY,QAAQ,WAAY;AAErD,UAAM,QAAkB,CAAA;AAExB,UAAM,gBAAgB,CAAC,OAAe;AACpC,UAAI,WAAW,CAAC,QAAQ,SAAS,EAAE,EAAG,QAAO;AAC7C,UAAI,QAAQ,SAAS,EAAE,EAAG,QAAO;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,MAAM,GAAG;AACzB,YAAM,KAAK,QAAQ,UAAU,EAAE;AAAA,IACjC;AACA,QAAI,cAAc,KAAK,GAAG;AACxB,YAAM,KAAK,OAAO,UAAU,EAAE;AAAA,IAChC;AACA,QAAI,cAAc,QAAQ,GAAG;AAC3B,YAAM,KAAK,UAAU,UAAU,EAAE;AAAA,IACnC;AACA,QAAI,cAAc,QAAQ,GAAG;AAC3B,YAAM,KAAK,UAAU,UAAU,EAAE;AAAA,IACnC;AACA,QAAI,cAAc,QAAQ,GAAG;AAC3B,YAAM,KAAK,UAAU,UAAU,EAAE;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,KAAoC;AAC1D,UAAM,EAAE,YAAY,WAAW,KAAA,IAAS;AACxC,UAAM,SAAS,IAAI,gBAAgB;AACnC,UAAM,UAAW,OAAO,WAAW,YAAY,QAAQ,WAAY,CAAA;AACnE,UAAM,UACH,OAAO,WAAW,YAAY,QAAQ,WAAY;AAErD,UAAM,QAAQ,CAAA;AAEd,UAAM,gBAAgB,CAAC,OAAe;AACpC,UAAI,WAAW,CAAC,QAAQ,SAAS,EAAE,EAAG,QAAO;AAC7C,UAAI,QAAQ,SAAS,EAAE,EAAG,QAAO;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,MAAM,GAAG;AACzB,YAAM,KAAK;AAAA,kBACC,UAAU;AAAA,yBACH,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAS/B;AAAA,IACA;AAEA,QAAI,cAAc,KAAK,GAAG;AACxB,YAAM,KAAK;AAAA,iBACA,IAAI;AAAA,0BACK,IAAI;AAAA;AAAA;AAAA;AAAA,kDAIoB,IAAI;AAAA;AAAA;AAAA;AAAA,IAIlD;AAAA,IACA;AAEA,QAAI,cAAc,QAAQ,GAAG;AAC3B,YAAM,iBAAiB,OAAO,QAAQ,IAAI,MAAM,EAC7C,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,MAAM,QAAQ,EACrC,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS;AAEjC,YAAM,KAAK;AAAA,oBACG,IAAI;AAAA,iCACS,IAAI;AAAA;AAAA;AAAA,oBAGjB,KAAK,UAAU,KAAK,yBAAyB,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,kBACpE,KAAK,UAAU,cAAc,CAAC;AAAA;AAAA,IAE5C;AAAA,IACA;AAEA,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,yBACN,QACoC;AACpC,UAAM,aAAiD,CAAA;AAEvD,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,iBAAW,IAAI,IAAI;AAAA,QACjB,MAAM,KAAK,mBAAmB,MAAM,IAAI;AAAA,QACxC,aAAa,MAAM,eAAe,OAAO,IAAI;AAAA,MAAA;AAG/C,UAAI,MAAM,QAAQ,mBAAsB,IAAI,EAAE,UAAU,MAAM;AAC9D,UAAI,MAAM,QAAQ,mBAAsB,IAAI,EAAE,UAAU,MAAM;AAC9D,UAAI,MAAM,cAAc;AACtB,mBAAW,IAAI,EAAE,YAAY,MAAM;AACrC,UAAI,MAAM,cAAc;AACtB,mBAAW,IAAI,EAAE,YAAY,MAAM;AAAA,IACvC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,WAA2B;AACpD,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,uBACE,UACA,aACA,aACM;AACN,eAAW,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG;AACjD,UAAI,CAAC,IAAI,gBAAgB,MAAO;AAEhC,YAAM,cAAc,IAAI,gBAAgB;AACxC,YAAM,OAAO,IAAI,UAAU,YAAA;AAG3B,YAAM,UACH,IAAI,kBAAkB,WAEL,CAAA;AAGpB,YAAM,cAAiC,CAAA;AAGvC,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,oBAAY,KAAK;AAAA,UACf,IAAI,UAAU,MAAM;AAAA,UACpB,OAAO,UAAW,KAA6B,SAAS,MAAM;AAAA,UAC9D,UAAU;AAAA,UACV,gBAAgB;AAAA,QAAA,CACjB;AAAA,MACH;AAGA,YAAM,iBAAiB,KAAK,kBAAkB,GAAG;AACjD,iBAAW,cAAc,gBAAgB;AACvC,oBAAY,KAAK;AAAA,UACf,IAAI,WAAW,UAAU;AAAA,UACzB,OAAO,WAAW,UAAU;AAAA,UAC5B,UAAU;AAAA,UACV,gBAAgB;AAAA,QAAA,CACjB;AAAA,MACH;AAGA,YAAM,WAA2B,CAAA;AAEjC,iBAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,cAAM,YAAY;AAClB,iBAAS,KAAK;AAAA,UACZ,IAAI;AAAA,UACJ,OAAO,UAAU,SAAS;AAAA,UAC1B,aAAa,UAAU;AAAA,UACvB,MAAM;AAAA,QAAA,CACP;AAAA,MACH;AAEA,iBAAW,cAAc,gBAAgB;AACvC,iBAAS,KAAK;AAAA,UACZ,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,MAAM;AAAA,QAAA,CACP;AAAA,MACH;AAGA,YAAM,YAA6B,OAAO,QAAQ,OAAO,EACtD,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM;AACvB,cAAM,YAAY;AAClB,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,OAAO,UAAU,SAAS;AAAA,UAC1B,MAAM,UAAU;AAAA,UAChB,OAAO,UAAU,SAAS;AAAA,UAC1B,MAAM,WAAW,IAAI,IAAI,MAAM;AAAA,UAC/B,oBAAoB,UAAU,MAAM;AAAA,QAAA;AAAA,MAExC,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAGnC,YAAM,aAA0C,CAAA;AAChD,UAAI,eAAe,aAAa,SAAS;AACvC,mBAAW,CAAC,WAAW,WAAW,KAAK,OAAO;AAAA,UAC5C,YAAY;AAAA,QAAA,GACX;AAED,cAAI,cAAc,OAAO,cAAc,aAAc;AAGrD,gBAAM,qBAAqB,KAAK,gBAAgB,WAAW;AAC3D,cAAI,oBAAoB;AACtB,kBAAM,OAAO,UAAU,QAAQ,MAAM,EAAE;AACvC,uBAAW,KAAK;AAAA,cACd,YAAY,GAAG,WAAW,IAAI,IAAI;AAAA,cAClC;AAAA,YAAA,CACD;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,YAAM,cACH,IAAI,kBAAkB,eAEL,CAAA;AAGpB,YAAM,sBACH,IAAI,kBAAkB,uBACvB,CAAA;AAEF,YAAM,gBAA+B;AAAA,QACnC,MAAM,IAAI;AAAA,QACV;AAAA,QACA,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY,QAAQ;AAAA,QAC1B,aAAa,YAAY;AAAA,QACzB;AAAA,QACA,GAAI,YAAY,SAAS,IAAI,EAAE,YAAA,IAAgB,CAAA;AAAA,QAC/C,GAAI,oBAAoB,SAAS,IAAI,EAAE,oBAAA,IAAwB,CAAA;AAAA,QAC/D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGF,UAAI,QAAQ;AAEZ,cAAQ;AAAA,QACN,qDAAqD,IAAI,SAAS,KAC7D,YAAY,MAAM,iBAAiB,SAAS,MAAM,cAClD,UAAU,MAAM,gBAAgB,WAAW,MAAM;AAAA,MAAA;AAAA,IAE1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAsC;AAC9D,UAAM,8BAAc,IAAA;AAEpB,UAAM,YAAY,IAAI,gBAAgB;AACtC,QAAI,aAAa,OAAO,cAAc,YAAY,UAAU,SAAS;AACnE,iBAAW,KAAK,UAAU,SAAS;AACjC,gBAAQ,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,gBAAgB;AACtC,QAAI,aAAa,OAAO,cAAc,YAAY,UAAU,SAAS;AACnE,iBAAW,KAAK,UAAU,SAAS;AACjC,gBAAQ,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,aAA+B;AACrD,QAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAG5D,QAAI,YAAY,YAAa,QAAO;AAGpC,eAAW,OAAO,OAAO,OAAO,WAAW,GAAG;AAC5C,UAAI,OAAO,OAAO,QAAQ,YAAY,YAAa,KAAgB;AACjE,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAA+B,UAAwB;AAClE,UAAM,KAAKA,UAAQ,SAAS;AAC5B,OAAG,cAAc,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAuC;AAClD,UAAM,KAAKA,UAAQ,SAAS;AAC5B,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AACF;AAQO,SAAS,iBACd,aACA,SAOqB;AACrB,QAAM,YAAY,IAAI,kBAAA;AACtB,SAAO,UAAU,iBAAiB,aAAa,OAAO;AACxD;"}