@maykonpaulo/maestro-core 0.5.0 → 0.7.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/ErrorCode.ts","../src/errors/MaestroError.ts","../src/logging/LogLevel.ts","../src/logging/ConsoleLogger.ts","../src/logging/ConsoleStructuredLogger.ts","../src/audit/InMemoryAuditRepository.ts","../src/audit/AuditRecorder.ts","../src/rbac/RbacEngine.ts","../src/feature-flags/InMemoryFeatureFlagProvider.ts","../src/config/InMemoryConfigProvider.ts","../src/events/InMemoryEventBus.ts","../src/metadata/EntityCapabilities.ts","../src/datasource/DatasourceRegistry.ts","../src/datasource/InMemoryDatasourceProvider.ts","../src/operation/OperationRegistry.ts","../src/schema/SchemaValidator.ts","../src/engine/MetadataEngine.ts","../src/engine/MaestroEngine.ts","../src/export/CsvExportProvider.ts","../src/declarative/DeclarativeValidator.ts","../src/declarative/DeclarativeMetadataCompiler.ts","../src/engine/createMaestro.ts","../src/introspection/utils.ts","../src/hybrid-loader/HybridLoader.ts","../src/engine/createMaestroFromIntrospection.ts","../src/http/QueryStringParser.ts","../src/http/createMaestroHttpHandlers.ts","../src/config-loader/MaestroFileLoader.ts","../src/config-generator/ConfigGenerator.ts","../src/diff/DiffEngine.ts","../src/introspection-report/ReportGenerator.ts","../src/snapshot/InMemorySnapshotRepository.ts","../src/introspection-runtime/IntrospectionRuntime.ts","../src/correlation/CorrelationId.ts","../src/risk/MetadataRiskClassifier.ts","../src/authorization/ContextualAuthorizationEngine.ts","../src/policy/PolicyEngine.ts","../src/policy/InMemoryPolicyProvider.ts","../src/confirmation/ConfirmationEngine.ts","../src/confirmation/InMemoryConfirmationRepository.ts","../src/declarative/loader/DeclarativeFileLoader.ts","../src/governance/GovernanceEventType.ts","../src/governance/InMemoryGovernanceEventBus.ts","../src/governance/DefaultGovernanceApi.ts"],"sourcesContent":["export enum ErrorCode {\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n NOT_FOUND = 'NOT_FOUND',\n CONFLICT = 'CONFLICT',\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\n}\n","import type { Metadata } from '../types/index.js';\nimport type { ErrorCode } from './ErrorCode.js';\n\nexport class MaestroError extends Error {\n readonly code: ErrorCode;\n readonly details?: Metadata;\n override readonly cause?: unknown;\n\n constructor(\n code: ErrorCode,\n message: string,\n options?: { details?: Metadata; cause?: unknown },\n ) {\n super(message, { cause: options?.cause });\n this.code = code;\n this.details = options?.details;\n this.cause = options?.cause;\n this.name = 'MaestroError';\n }\n}\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n","import type { Logger, LogEntry } from './Logger.js';\nimport type { LogLevel } from './LogLevel.js';\nimport { LOG_LEVEL_PRIORITY } from './LogLevel.js';\n\nexport class ConsoleLogger implements Logger {\n constructor(private readonly minLevel: LogLevel = 'info') {}\n\n debug(entry: LogEntry): void {\n this.log('debug', entry);\n }\n\n info(entry: LogEntry): void {\n this.log('info', entry);\n }\n\n warn(entry: LogEntry): void {\n this.log('warn', entry);\n }\n\n error(entry: LogEntry): void {\n this.log('error', entry);\n }\n\n private log(level: LogLevel, entry: LogEntry): void {\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.minLevel]) return;\n\n const output = {\n timestamp: new Date().toISOString(),\n level,\n message: entry.message,\n ...(entry.correlationId && { correlationId: entry.correlationId }),\n ...(entry.metadata && { metadata: entry.metadata }),\n ...(entry.error !== undefined && { error: this.serializeError(entry.error) }),\n };\n\n const consoleFn = level === 'error' ? console.error\n : level === 'warn' ? console.warn\n : level === 'debug' ? console.debug\n : console.info;\n\n consoleFn(JSON.stringify(output));\n }\n\n private serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return { name: error.name, message: error.message };\n }\n return error;\n }\n}\n","import type { StructuredLogger } from './StructuredLogger.js';\nimport type { StructuredLogEntry } from './StructuredLogEntry.js';\nimport type { LogLevel } from './LogLevel.js';\nimport { LOG_LEVEL_PRIORITY } from './LogLevel.js';\n\nexport class ConsoleStructuredLogger implements StructuredLogger {\n constructor(private readonly minLevel: LogLevel = 'info') {}\n\n debug(entry: StructuredLogEntry): void {\n this.log('debug', entry);\n }\n\n info(entry: StructuredLogEntry): void {\n this.log('info', entry);\n }\n\n warn(entry: StructuredLogEntry): void {\n this.log('warn', entry);\n }\n\n error(entry: StructuredLogEntry): void {\n this.log('error', entry);\n }\n\n private log(level: LogLevel, entry: StructuredLogEntry): void {\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.minLevel]) return;\n\n const output: Record<string, unknown> = {\n timestamp: new Date().toISOString(),\n level,\n };\n\n if (entry.correlationId !== undefined) output['correlationId'] = entry.correlationId;\n if (entry.operation !== undefined) output['operation'] = entry.operation;\n if (entry.entity !== undefined) output['entity'] = entry.entity;\n if (entry.entityId !== undefined) output['entityId'] = entry.entityId;\n if (entry.actor !== undefined) output['actor'] = entry.actor;\n if (entry.durationMs !== undefined) output['durationMs'] = entry.durationMs;\n if (entry.status !== undefined) output['status'] = entry.status;\n if (entry.severity !== undefined) output['severity'] = entry.severity;\n if (entry.message !== undefined) output['message'] = entry.message;\n if (entry.metadata !== undefined) output['metadata'] = entry.metadata;\n if (entry.error !== undefined) output['error'] = this.serializeError(entry.error);\n\n const consoleFn =\n level === 'error' ? console.error\n : level === 'warn' ? console.warn\n : level === 'debug' ? console.debug\n : console.info;\n\n consoleFn(JSON.stringify(output));\n }\n\n private serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return { name: error.name, message: error.message };\n }\n return error;\n }\n}\n","import type { AuditRepository, AuditFilter } from './AuditRepository.js';\nimport type { AuditTimeline } from './AuditTimeline.js';\nimport type { AuditEvent } from './AuditEvent.js';\n\nexport class InMemoryAuditRepository implements AuditRepository, AuditTimeline {\n private readonly store = new Map<string, AuditEvent>();\n\n async record(event: AuditEvent): Promise<void> {\n this.store.set(event.id, event);\n }\n\n async list(filter?: AuditFilter): Promise<AuditEvent[]> {\n let events = Array.from(this.store.values());\n\n if (!filter) return events;\n\n if (filter.actorId !== undefined) {\n events = events.filter((e) => e.actor.id === filter.actorId);\n }\n if (filter.action !== undefined) {\n events = events.filter((e) => e.action === filter.action);\n }\n if (filter.entity !== undefined) {\n events = events.filter((e) => e.entity === filter.entity);\n }\n if (filter.entityId !== undefined) {\n events = events.filter((e) => e.entityId === filter.entityId);\n }\n if (filter.resourceType !== undefined) {\n events = events.filter((e) => e.resource?.type === filter.resourceType);\n }\n if (filter.resourceId !== undefined) {\n events = events.filter((e) => e.resource?.id === filter.resourceId);\n }\n if (filter.level !== undefined) {\n events = events.filter((e) => e.level === filter.level);\n }\n if (filter.from !== undefined) {\n const from = filter.from;\n events = events.filter((e) => e.timestamp >= from);\n }\n if (filter.to !== undefined) {\n const to = filter.to;\n events = events.filter((e) => e.timestamp <= to);\n }\n if (filter.correlationId !== undefined) {\n events = events.filter((e) => e.correlationId === filter.correlationId);\n }\n\n return events;\n }\n\n async query(filter?: AuditFilter): Promise<AuditEvent[]> {\n return this.list(filter);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { AuditRepository } from './AuditRepository.js';\nimport type { AuditEvent } from './AuditEvent.js';\nimport type { AuditLevel } from './AuditLevel.js';\nimport type { Actor, ResourceRef, Metadata } from '../types/index.js';\n\nexport interface RecordAuditInput {\n action: string;\n actor: Actor;\n level?: AuditLevel;\n resource?: ResourceRef;\n entity?: string;\n entityId?: string;\n before?: Metadata;\n after?: Metadata;\n metadata?: Metadata;\n correlationId?: string;\n requestId?: string;\n ip?: string;\n userAgent?: string;\n}\n\nexport class AuditRecorder {\n constructor(private readonly repository: AuditRepository) {}\n\n async record(input: RecordAuditInput): Promise<AuditEvent> {\n const event: AuditEvent = {\n id: randomUUID(),\n timestamp: new Date(),\n action: input.action,\n actor: input.actor,\n level: input.level ?? 'info',\n resource: input.resource,\n entity: input.entity,\n entityId: input.entityId,\n before: input.before,\n after: input.after,\n metadata: input.metadata,\n correlationId: input.correlationId,\n requestId: input.requestId,\n ip: input.ip,\n userAgent: input.userAgent,\n };\n\n await this.repository.record(event);\n return event;\n }\n}\n","import type { Actor } from '../types/index.js';\nimport type { RbacPolicy } from './RbacPolicy.js';\n\nexport class RbacEngine {\n constructor(private readonly policy: RbacPolicy) {}\n\n can(actor: Actor, permission: string): boolean {\n const permissions = this.resolvePermissions(actor);\n return permissions.some((p) => this.matchesPattern(p, permission));\n }\n\n private resolvePermissions(actor: Actor): string[] {\n const direct = actor.permissions ?? [];\n const fromRoles = (actor.roles ?? []).flatMap((roleName) => {\n const role = this.policy.roles[roleName];\n return role?.permissions ?? [];\n });\n return [...direct, ...fromRoles];\n }\n\n private matchesPattern(pattern: string, target: string): boolean {\n if (pattern === '*') return true;\n if (pattern === target) return true;\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return target === prefix || target.startsWith(`${prefix}.`);\n }\n return false;\n }\n}\n","import type { FeatureFlagProvider } from './FeatureFlagProvider.js';\nimport type { FeatureFlag } from './FeatureFlag.js';\nimport type { Actor } from '../types/index.js';\n\nexport class InMemoryFeatureFlagProvider implements FeatureFlagProvider {\n private readonly flags = new Map<string, FeatureFlag>();\n\n constructor(flags: FeatureFlag[] = []) {\n for (const flag of flags) {\n this.flags.set(flag.key, flag);\n }\n }\n\n async isEnabled(key: string, _actor?: Actor): Promise<boolean> {\n return this.flags.get(key)?.enabled ?? false;\n }\n\n get(key: string): FeatureFlag | undefined {\n return this.flags.get(key);\n }\n\n set(flag: FeatureFlag): void {\n this.flags.set(flag.key, flag);\n }\n\n list(): FeatureFlag[] {\n return Array.from(this.flags.values());\n }\n}\n","import type { ConfigProvider } from './ConfigProvider.js';\nimport type { MetadataValue } from '../types/index.js';\n\nexport class InMemoryConfigProvider implements ConfigProvider {\n private readonly store = new Map<string, MetadataValue>();\n\n constructor(initial: Record<string, MetadataValue> = {}) {\n for (const [key, value] of Object.entries(initial)) {\n this.store.set(key, value);\n }\n }\n\n get<T extends MetadataValue>(key: string): T | undefined {\n return this.store.get(key) as T | undefined;\n }\n\n set<T extends MetadataValue>(key: string, value: T): void {\n this.store.set(key, value);\n }\n\n has(key: string): boolean {\n return this.store.has(key);\n }\n\n getOrDefault<T extends MetadataValue>(key: string, defaultValue: T): T {\n const value = this.store.get(key);\n return value !== undefined ? (value as T) : defaultValue;\n }\n}\n","import type { EventBus, EventHandler } from './EventBus.js';\nimport type { DomainEvent } from './DomainEvent.js';\n\nexport class InMemoryEventBus implements EventBus {\n private readonly handlers = new Map<string, Set<EventHandler>>();\n\n async publish<TPayload>(event: DomainEvent<TPayload>): Promise<void> {\n const set = this.handlers.get(event.type);\n if (!set) return;\n\n const promises = Array.from(set).map((handler) =>\n Promise.resolve(handler(event as DomainEvent<unknown>)),\n );\n await Promise.all(promises);\n }\n\n subscribe<TPayload>(eventType: string, handler: EventHandler<TPayload>): void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n }\n this.handlers.get(eventType)!.add(handler as EventHandler);\n }\n\n unsubscribe<TPayload>(eventType: string, handler: EventHandler<TPayload>): void {\n this.handlers.get(eventType)?.delete(handler as EventHandler);\n }\n}\n","export interface EntityCapabilities {\n list: boolean;\n detail: boolean;\n create: boolean;\n update: boolean;\n clone: boolean;\n delete: boolean;\n softDelete: boolean;\n export: boolean;\n bulkActions: boolean;\n}\n\nexport const DEFAULT_CAPABILITIES: EntityCapabilities = {\n list: true,\n detail: true,\n create: false,\n update: false,\n clone: false,\n delete: false,\n softDelete: false,\n export: false,\n bulkActions: false,\n};\n","import type { DatasourceProvider } from './DatasourceProvider.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\n\nexport class DatasourceRegistry {\n private readonly registry = new Map<string, DatasourceProvider>();\n\n register(id: string, provider: DatasourceProvider): void {\n this.registry.set(id, provider);\n }\n\n get(id: string): DatasourceProvider {\n const provider = this.registry.get(id);\n if (!provider) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Datasource '${id}' not found. Registered datasources: [${this.ids().join(', ')}]`,\n );\n }\n return provider;\n }\n\n has(id: string): boolean {\n return this.registry.has(id);\n }\n\n ids(): string[] {\n return Array.from(this.registry.keys());\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { DatasourceProvider } from './DatasourceProvider.js';\nimport type { ListResult } from '../query/ListResult.js';\nimport type { FilterDescriptor } from '../query/FilterDescriptor.js';\nimport type { SortDescriptor } from '../query/SortDescriptor.js';\nimport type {\n DatasourceQueryContext,\n DatasourceFindContext,\n DatasourceWriteContext,\n DatasourceUpdateContext,\n DatasourceDeleteContext,\n} from './DatasourceContexts.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\n\nexport class InMemoryDatasourceProvider implements DatasourceProvider {\n private readonly tables = new Map<string, Map<string, Record<string, unknown>>>();\n\n seed(table: string, records: Record<string, unknown>[], primaryKey = 'id'): void {\n if (!this.tables.has(table)) {\n this.tables.set(table, new Map());\n }\n const store = this.tables.get(table)!;\n for (const record of records) {\n const id = String(record[primaryKey] ?? randomUUID());\n store.set(id, { ...record, [primaryKey]: id });\n }\n }\n\n async list(context: DatasourceQueryContext): Promise<ListResult<Record<string, unknown>>> {\n const store = this.getStore(context.table);\n let records = Array.from(store.values());\n\n if (context.search?.term) {\n const term = context.search.term.toLowerCase();\n records = records.filter((r) =>\n context.search!.fields.some((field) =>\n String(r[field] ?? '').toLowerCase().includes(term),\n ),\n );\n }\n\n if (context.filters?.length) {\n records = this.applyFilters(records, context.filters);\n }\n\n if (context.sort?.length) {\n records = this.applySort(records, context.sort);\n }\n\n const total = records.length;\n\n if (context.pagination) {\n const p = context.pagination;\n if (p.strategy === 'page') {\n const start = (p.page - 1) * p.pageSize;\n records = records.slice(start, start + p.pageSize);\n return { records, total, page: p.page, pageSize: p.pageSize, totalPages: Math.ceil(total / p.pageSize) };\n }\n if (p.strategy === 'offset') {\n records = records.slice(p.offset, p.offset + p.limit);\n }\n if (p.strategy === 'cursor') {\n const from = p.cursor ? parseInt(p.cursor, 10) : 0;\n const sliced = records.slice(from, from + p.limit);\n const nextIndex = from + p.limit;\n return { records: sliced, total, nextCursor: nextIndex < total ? String(nextIndex) : undefined };\n }\n }\n\n return { records, total };\n }\n\n async findById(context: DatasourceFindContext): Promise<Record<string, unknown> | null> {\n return this.getStore(context.table).get(context.id) ?? null;\n }\n\n async create(context: DatasourceWriteContext): Promise<Record<string, unknown>> {\n const store = this.getStore(context.table);\n const id = String(context.data[context.primaryKey] ?? randomUUID());\n const record = { ...context.data, [context.primaryKey]: id };\n store.set(id, record);\n return record;\n }\n\n async update(context: DatasourceUpdateContext): Promise<Record<string, unknown>> {\n const store = this.getStore(context.table);\n const existing = store.get(context.id);\n if (!existing) {\n throw new MaestroError(\n ErrorCode.NOT_FOUND,\n `Record '${context.id}' not found in table '${context.table}'.`,\n );\n }\n const updated = { ...existing, ...context.data, [context.primaryKey]: context.id };\n store.set(context.id, updated);\n return updated;\n }\n\n async delete(context: DatasourceDeleteContext): Promise<void> {\n const store = this.getStore(context.table);\n if (!store.has(context.id)) {\n throw new MaestroError(\n ErrorCode.NOT_FOUND,\n `Record '${context.id}' not found in table '${context.table}'.`,\n );\n }\n store.delete(context.id);\n }\n\n async count(context: DatasourceQueryContext): Promise<number> {\n const result = await this.list({ ...context, pagination: undefined });\n return result.total;\n }\n\n private getStore(table: string): Map<string, Record<string, unknown>> {\n if (!this.tables.has(table)) {\n this.tables.set(table, new Map());\n }\n return this.tables.get(table)!;\n }\n\n private applyFilters(\n records: Record<string, unknown>[],\n filters: FilterDescriptor[],\n ): Record<string, unknown>[] {\n return records.filter((record) => filters.every((f) => this.matchFilter(record, f)));\n }\n\n private matchFilter(record: Record<string, unknown>, filter: FilterDescriptor): boolean {\n const val = record[filter.field];\n switch (filter.operator) {\n case 'equals': return val === filter.value;\n case 'notEquals': return val !== filter.value;\n case 'contains': return String(val ?? '').toLowerCase().includes(String(filter.value ?? '').toLowerCase());\n case 'startsWith': return String(val ?? '').startsWith(String(filter.value ?? ''));\n case 'endsWith': return String(val ?? '').endsWith(String(filter.value ?? ''));\n case 'in': return Array.isArray(filter.value) && filter.value.includes(val);\n case 'notIn': return Array.isArray(filter.value) && !filter.value.includes(val);\n case 'gt': return (val as number) > (filter.value as number);\n case 'gte': return (val as number) >= (filter.value as number);\n case 'lt': return (val as number) < (filter.value as number);\n case 'lte': return (val as number) <= (filter.value as number);\n case 'between': {\n const [min, max] = filter.value as [number, number];\n return (val as number) >= min && (val as number) <= max;\n }\n case 'isNull': return val === null || val === undefined;\n case 'isNotNull': return val !== null && val !== undefined;\n case 'isTrue': return val === true;\n case 'isFalse': return val === false;\n default: return true;\n }\n }\n\n private applySort(\n records: Record<string, unknown>[],\n sort: SortDescriptor[],\n ): Record<string, unknown>[] {\n return [...records].sort((a, b) => {\n for (const { field, direction } of sort) {\n const aVal = a[field];\n const bVal = b[field];\n let cmp = 0;\n if (aVal === null || aVal === undefined) cmp = 1;\n else if (bVal === null || bVal === undefined) cmp = -1;\n else if (aVal < bVal) cmp = -1;\n else if (aVal > bVal) cmp = 1;\n if (cmp !== 0) return direction === 'desc' ? -cmp : cmp;\n }\n return 0;\n });\n }\n}\n","import type { OperationDef } from './OperationDef.js';\nimport type { OperationScope } from '../metadata/OperationMetadata.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\n\nexport class OperationRegistry {\n private readonly operations = new Map<string, OperationDef>();\n\n register(operation: OperationDef): void {\n if (this.operations.has(operation.id)) {\n throw new MaestroError(\n ErrorCode.CONFLICT,\n `Operation '${operation.id}' is already registered.`,\n );\n }\n this.operations.set(operation.id, operation);\n }\n\n get(id: string): OperationDef {\n const op = this.operations.get(id);\n if (!op) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Operation '${id}' not found.`);\n }\n return op;\n }\n\n find(id: string): OperationDef | undefined {\n return this.operations.get(id);\n }\n\n forEntity(entityId: string, scope?: OperationScope): OperationDef[] {\n return Array.from(this.operations.values()).filter(\n (op) => op.entity === entityId && (scope === undefined || op.scope === scope),\n );\n }\n\n all(): OperationDef[] {\n return Array.from(this.operations.values());\n }\n}\n","import type { MaestroConfig } from './MaestroConfig.js';\nimport type { EntitySchema } from './EntitySchema.js';\nimport type { RelationSchema } from './RelationSchema.js';\n\nexport interface SchemaValidationError {\n path: string;\n message: string;\n}\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: SchemaValidationError[];\n}\n\nexport function validateMaestroConfig(config: MaestroConfig): SchemaValidationResult {\n const errors: SchemaValidationError[] = [];\n\n if (!config.datasources || Object.keys(config.datasources).length === 0) {\n errors.push({ path: 'datasources', message: 'At least one datasource is required.' });\n }\n\n if (!config.entities || config.entities.length === 0) {\n errors.push({\n path: 'entities',\n message:\n 'At least one entity is required. Provide entities directly or via declarations.entities.',\n });\n }\n\n const entityIds = new Set<string>();\n for (const entity of config.entities ?? []) {\n validateEntity(entity, config, entityIds, errors);\n if (entity.id) entityIds.add(entity.id);\n }\n\n for (const relation of config.relations ?? []) {\n validateRelation(relation, entityIds, errors);\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateEntity(\n entity: EntitySchema,\n config: MaestroConfig,\n existingIds: Set<string>,\n errors: SchemaValidationError[],\n): void {\n const prefix = `entities[${entity.id ?? '?'}]`;\n\n if (!entity.id) {\n errors.push({ path: prefix, message: 'Entity id is required.' });\n return;\n }\n\n if (existingIds.has(entity.id)) {\n errors.push({ path: prefix, message: `Duplicate entity id '${entity.id}'.` });\n }\n\n if (!entity.label?.singular || !entity.label?.plural) {\n errors.push({ path: `${prefix}.label`, message: 'Entity label.singular and label.plural are required.' });\n }\n\n if (!entity.source?.datasource) {\n errors.push({ path: `${prefix}.source.datasource`, message: 'Entity source.datasource is required.' });\n } else if (!config.datasources[entity.source.datasource]) {\n errors.push({\n path: `${prefix}.source.datasource`,\n message: `Datasource '${entity.source.datasource}' referenced by entity '${entity.id}' is not configured.`,\n });\n }\n\n if (!entity.source?.table) {\n errors.push({ path: `${prefix}.source.table`, message: 'Entity source.table is required.' });\n }\n\n if (!entity.fields || entity.fields.length === 0) {\n errors.push({ path: `${prefix}.fields`, message: 'Entity must have at least one field.' });\n return;\n }\n\n const fieldNames = new Set<string>();\n for (const field of entity.fields) {\n const fp = `${prefix}.fields[${field.name ?? '?'}]`;\n if (!field.name) {\n errors.push({ path: fp, message: 'Field name is required.' });\n continue;\n }\n if (fieldNames.has(field.name)) {\n errors.push({ path: fp, message: `Duplicate field name '${field.name}'.` });\n } else {\n fieldNames.add(field.name);\n }\n if (!field.label) {\n errors.push({ path: `${fp}.label`, message: 'Field label is required.' });\n }\n if (!field.type) {\n errors.push({ path: `${fp}.type`, message: 'Field type is required.' });\n }\n }\n}\n\nfunction validateRelation(\n relation: RelationSchema,\n entityIds: Set<string>,\n errors: SchemaValidationError[],\n): void {\n const prefix = `relations[${relation.id ?? '?'}]`;\n\n if (!relation.id) {\n errors.push({ path: prefix, message: 'Relation id is required.' });\n }\n\n if (!relation.from?.entity) {\n errors.push({ path: `${prefix}.from.entity`, message: 'Relation from.entity is required.' });\n } else if (!entityIds.has(relation.from.entity)) {\n errors.push({ path: `${prefix}.from.entity`, message: `Entity '${relation.from.entity}' not found.` });\n }\n\n if (!relation.to?.entity) {\n errors.push({ path: `${prefix}.to.entity`, message: 'Relation to.entity is required.' });\n } else if (!entityIds.has(relation.to.entity)) {\n errors.push({ path: `${prefix}.to.entity`, message: `Entity '${relation.to.entity}' not found.` });\n }\n}\n","import type { MaestroConfig } from '../schema/MaestroConfig.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport type { EntityMetadata } from '../metadata/EntityMetadata.js';\nimport type { FieldMetadata } from '../metadata/FieldMetadata.js';\nimport type { RelationMetadata } from '../metadata/RelationMetadata.js';\nimport type { OperationMetadata } from '../metadata/OperationMetadata.js';\nimport type { ContextAction } from '../metadata/ContextAction.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { FilterOperator } from '../query/FilterOperator.js';\nimport type { FieldType } from '../metadata/FieldType.js';\nimport { DEFAULT_CAPABILITIES } from '../metadata/EntityCapabilities.js';\nimport type { EntityCapabilities } from '../metadata/EntityCapabilities.js';\n\nconst STRING_OPERATORS: FilterOperator[] = [\n 'equals', 'notEquals', 'contains', 'startsWith', 'endsWith',\n 'in', 'notIn', 'isNull', 'isNotNull',\n];\n\nconst NUMERIC_OPERATORS: FilterOperator[] = [\n 'equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between',\n 'in', 'notIn', 'isNull', 'isNotNull',\n];\n\nconst DATE_OPERATORS: FilterOperator[] = [\n 'equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'isNull', 'isNotNull',\n];\n\nconst ENUM_OPERATORS: FilterOperator[] = ['equals', 'notEquals', 'in', 'notIn', 'isNull', 'isNotNull'];\n\nconst BOOLEAN_OPERATORS: FilterOperator[] = ['isTrue', 'isFalse', 'isNull', 'isNotNull'];\n\nconst NULL_OPERATORS: FilterOperator[] = ['isNull', 'isNotNull'];\n\nfunction filterOperatorsForType(type: FieldType): FilterOperator[] {\n switch (type) {\n case 'string':\n case 'text':\n case 'email':\n case 'phone':\n case 'url':\n case 'document':\n return STRING_OPERATORS;\n case 'number':\n case 'integer':\n case 'decimal':\n case 'currency':\n return NUMERIC_OPERATORS;\n case 'boolean':\n return BOOLEAN_OPERATORS;\n case 'date':\n case 'datetime':\n case 'time':\n return DATE_OPERATORS;\n case 'enum':\n return ENUM_OPERATORS;\n case 'uuid':\n return ENUM_OPERATORS;\n case 'json':\n case 'array':\n case 'relation':\n return NULL_OPERATORS;\n default:\n return ['equals', 'notEquals', 'isNull', 'isNotNull'];\n }\n}\n\nfunction buildContextActions(entity: EntitySchema, operations: OperationDef[]): ContextAction[] {\n const caps = { ...DEFAULT_CAPABILITIES, ...entity.capabilities };\n const actions: ContextAction[] = [];\n\n if (caps.update) {\n actions.push({ id: 'edit', label: 'Edit', permission: `entity.${entity.id}.update` });\n }\n if (caps.clone) {\n actions.push({ id: 'clone', label: 'Clone', permission: `entity.${entity.id}.clone` });\n }\n if (caps.softDelete) {\n actions.push({\n id: 'soft-delete',\n label: 'Deactivate',\n permission: `entity.${entity.id}.softDelete`,\n condition: 'when-active',\n style: 'warning',\n });\n actions.push({\n id: 'restore',\n label: 'Restore',\n permission: `entity.${entity.id}.restore`,\n condition: 'when-inactive',\n });\n }\n if (caps.delete) {\n actions.push({\n id: 'hard-delete',\n label: 'Delete permanently',\n permission: `entity.${entity.id}.delete`,\n style: 'danger',\n });\n }\n\n for (const op of operations) {\n if (op.entity === entity.id && op.scope === 'record') {\n actions.push({\n id: op.id,\n label: op.label,\n permission: op.requiredPermission ?? `operation.${op.id}`,\n operationId: op.id,\n });\n }\n }\n\n return actions;\n}\n\nfunction buildBulkOperations(entity: EntitySchema, operations: OperationDef[]): string[] {\n return operations\n .filter((op) => op.entity === entity.id && op.scope === 'bulk')\n .map((op) => op.id);\n}\n\nexport class MetadataEngine {\n normalize(config: MaestroConfig): MaestroMetadata {\n const operations = config.operations ?? [];\n const entities = (config.entities ?? []).map((e) => this.normalizeEntity(e, operations));\n const relations = (config.relations ?? []) as RelationMetadata[];\n\n const entityRelationMap = new Map<string, string[]>();\n for (const rel of relations) {\n const addToMap = (entityId: string): void => {\n if (!entityRelationMap.has(entityId)) entityRelationMap.set(entityId, []);\n entityRelationMap.get(entityId)!.push(rel.id);\n };\n addToMap(rel.from.entity);\n if (rel.to.entity !== rel.from.entity) addToMap(rel.to.entity);\n }\n\n const enrichedEntities: EntityMetadata[] = entities.map((e) => ({\n ...e,\n relations: entityRelationMap.get(e.id) ?? [],\n }));\n\n const normalizedOps: OperationMetadata[] = operations.map((op) => ({\n id: op.id,\n label: op.label,\n description: op.description,\n entity: op.entity,\n scope: op.scope,\n requiresConfirmation: op.requiresConfirmation ?? false,\n confirmationMessage: op.confirmationMessage,\n requiresTypedConfirmation: op.requiresTypedConfirmation ?? false,\n requiredPermission: op.requiredPermission,\n }));\n\n return {\n entities: enrichedEntities,\n relations,\n operations: normalizedOps,\n policies: config.policies ?? { roles: {} },\n };\n }\n\n private normalizeEntity(schema: EntitySchema, operations: OperationDef[]): EntityMetadata {\n const capabilities: EntityCapabilities = { ...DEFAULT_CAPABILITIES, ...schema.capabilities };\n const primaryKey = schema.source.primaryKey ?? 'id';\n const displayField =\n schema.displayField ?? schema.fields.find((f) => !f.hidden)?.name ?? primaryKey;\n\n return {\n id: schema.id,\n label: schema.label,\n description: schema.description,\n datasource: schema.source.datasource,\n table: schema.source.table,\n primaryKey,\n displayField,\n fields: schema.fields.map((f) => this.normalizeField(f)),\n capabilities,\n softDelete: schema.softDelete,\n defaultSort: schema.defaultSort,\n search: schema.search,\n relations: [],\n contextActions: buildContextActions(schema, operations),\n bulkOperations: buildBulkOperations(schema, operations),\n exportConfig: schema.exportConfig,\n };\n }\n\n private normalizeField(schema: FieldSchema): FieldMetadata {\n return {\n name: schema.name,\n label: schema.label,\n type: schema.type,\n required: schema.required ?? false,\n readonly: schema.readonly ?? false,\n hidden: schema.hidden ?? false,\n sensitive: schema.sensitive ?? false,\n searchable: schema.searchable ?? false,\n sortable: schema.sortable ?? false,\n filterable: schema.filterable ?? false,\n exportable: schema.exportable ?? true,\n filterOperators: schema.filterOperators ?? filterOperatorsForType(schema.type),\n description: schema.description,\n enumOptions: schema.enumOptions,\n relationEntity: schema.relationEntity,\n mask: schema.mask,\n list: {\n visible: schema.list?.visible ?? !(schema.hidden ?? false),\n width: schema.list?.width,\n align: schema.list?.align,\n order: schema.list?.order,\n },\n detail: {\n visible: schema.detail?.visible ?? !(schema.hidden ?? false),\n group: schema.detail?.group,\n order: schema.detail?.order,\n },\n form: {\n creatable: schema.form?.creatable ?? true,\n editable: schema.form?.editable ?? !(schema.readonly ?? false),\n cloneable: schema.form?.cloneable ?? !(schema.readonly ?? false),\n placeholder: schema.form?.placeholder,\n helpText: schema.form?.helpText,\n section: schema.form?.section,\n order: schema.form?.order,\n },\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport type { EntityMetadata } from '../metadata/EntityMetadata.js';\nimport type { EntityCapabilities } from '../metadata/EntityCapabilities.js';\nimport type { Actor } from '../types/Actor.js';\nimport type { Metadata } from '../types/Metadata.js';\nimport type { QueryInput } from '../query/QueryInput.js';\nimport type { ListResult } from '../query/ListResult.js';\nimport type { DatasourceRegistry } from '../datasource/DatasourceRegistry.js';\nimport type { OperationContext } from '../operation/OperationContext.js';\nimport type { OperationResult } from '../operation/OperationResult.js';\nimport type { OperationRegistry } from '../operation/OperationRegistry.js';\nimport type { AuditRecorder } from '../audit/AuditRecorder.js';\nimport type { ExportFormat } from '../export/ExportFormat.js';\nimport type { ExportResult } from '../export/ExportResult.js';\nimport type { ResolvedConsumerProjection } from '../declarative/ConsumerProjection.js';\nimport { RbacEngine } from '../rbac/RbacEngine.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport { CsvExportProvider } from '../export/CsvExportProvider.js';\n\nexport class MaestroEngine {\n private readonly rbac: RbacEngine;\n private readonly consumerMap: ReadonlyMap<string, ResolvedConsumerProjection>;\n\n constructor(\n private readonly metadata: MaestroMetadata,\n private readonly datasources: DatasourceRegistry,\n private readonly operations: OperationRegistry,\n private readonly audit?: AuditRecorder,\n consumers: ResolvedConsumerProjection[] = [],\n ) {\n this.rbac = new RbacEngine(metadata.policies);\n this.consumerMap = new Map(consumers.map((c) => [c.consumer, c]));\n }\n\n getMetadata(): MaestroMetadata {\n return this.metadata;\n }\n\n /**\n * Returns the resolved consumer projection for the given consumer ID, or undefined if not found.\n * Each call returns an independent copy — mutations to the returned object do not affect internal state.\n * Consumer projections are only available when declarations.consumers were provided to createMaestro().\n */\n getConsumer(consumerId: string): ResolvedConsumerProjection | undefined {\n const p = this.consumerMap.get(consumerId);\n if (!p) return undefined;\n return {\n consumer: p.consumer,\n entity: p.entity,\n fields: {\n list: [...p.fields.list],\n detail: [...p.fields.detail],\n create: [...p.fields.create],\n update: [...p.fields.update],\n clone: [...p.fields.clone],\n },\n operations: {\n row: [...p.operations.row],\n bulk: [...p.operations.bulk],\n global: [...p.operations.global],\n },\n };\n }\n\n /**\n * Returns the IDs of all registered consumer projections.\n */\n listConsumers(): string[] {\n return [...this.consumerMap.keys()];\n }\n\n async list(\n entityId: string,\n query: QueryInput,\n actor: Actor,\n ): Promise<ListResult<Record<string, unknown>>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'list', actor, `entity.${entityId}.list`);\n\n const provider = this.datasources.get(entity.datasource);\n const result = await provider.list({\n table: entity.table,\n primaryKey: entity.primaryKey,\n filters: query.filters,\n sort: query.sort ?? (entity.defaultSort ? [entity.defaultSort] : undefined),\n pagination: query.pagination,\n search: query.search,\n });\n\n await this.recordAudit(`entity.${entityId}.list`, actor, { type: entityId, id: '*' }, 'debug', {\n total: result.total as unknown as Metadata[string],\n });\n\n return result;\n }\n\n async findById(\n entityId: string,\n id: string,\n actor: Actor,\n ): Promise<Record<string, unknown> | null> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'detail', actor, `entity.${entityId}.detail`);\n\n const provider = this.datasources.get(entity.datasource);\n const record = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n if (record) {\n await this.recordAudit(`entity.${entityId}.detail`, actor, { type: entityId, id }, 'debug');\n }\n\n return record;\n }\n\n async create(\n entityId: string,\n data: Record<string, unknown>,\n actor: Actor,\n ): Promise<Record<string, unknown>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'create', actor, `entity.${entityId}.create`);\n\n const provider = this.datasources.get(entity.datasource);\n const created = await provider.create({\n table: entity.table,\n primaryKey: entity.primaryKey,\n data: { ...data, [entity.primaryKey]: data[entity.primaryKey] ?? randomUUID() },\n });\n\n await this.recordAudit(\n `entity.${entityId}.create`,\n actor,\n { type: entityId, id: String(created[entity.primaryKey]) },\n 'info',\n undefined,\n undefined,\n created,\n );\n\n return created;\n }\n\n async update(\n entityId: string,\n id: string,\n data: Record<string, unknown>,\n actor: Actor,\n ): Promise<Record<string, unknown>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'update', actor, `entity.${entityId}.update`);\n\n const provider = this.datasources.get(entity.datasource);\n const before = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n const updated = await provider.update({ table: entity.table, primaryKey: entity.primaryKey, id, data });\n\n await this.recordAudit(\n `entity.${entityId}.update`,\n actor,\n { type: entityId, id },\n 'info',\n undefined,\n before ?? undefined,\n updated,\n );\n\n return updated;\n }\n\n async clone(\n entityId: string,\n id: string,\n actor: Actor,\n ): Promise<Record<string, unknown>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'clone', actor, `entity.${entityId}.clone`);\n\n const provider = this.datasources.get(entity.datasource);\n const source = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n if (!source) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Record '${id}' not found in entity '${entityId}'.`);\n }\n\n const cloneableFields = entity.fields.filter((f) => f.form.cloneable && f.name !== entity.primaryKey);\n const cloneData: Record<string, unknown> = {};\n for (const field of cloneableFields) {\n if (source[field.name] !== undefined) cloneData[field.name] = source[field.name];\n }\n\n const created = await provider.create({\n table: entity.table,\n primaryKey: entity.primaryKey,\n data: { ...cloneData, [entity.primaryKey]: randomUUID() },\n });\n\n await this.recordAudit(\n `entity.${entityId}.clone`,\n actor,\n { type: entityId, id: String(created[entity.primaryKey]) },\n 'info',\n { sourceId: id as unknown as Metadata[string] },\n );\n\n return created;\n }\n\n async softDelete(entityId: string, id: string, actor: Actor): Promise<void> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'softDelete', actor, `entity.${entityId}.softDelete`);\n\n if (!entity.softDelete) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Entity '${entityId}' does not have softDelete configured.`,\n );\n }\n\n const provider = this.datasources.get(entity.datasource);\n await provider.update({\n table: entity.table,\n primaryKey: entity.primaryKey,\n id,\n data: { [entity.softDelete.field]: entity.softDelete.inactiveValue },\n });\n\n await this.recordAudit(`entity.${entityId}.softDelete`, actor, { type: entityId, id }, 'warn');\n }\n\n async restore(entityId: string, id: string, actor: Actor): Promise<void> {\n const entity = this.requireEntity(entityId);\n\n if (!entity.softDelete) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Entity '${entityId}' does not have softDelete configured.`,\n );\n }\n\n const permission = `entity.${entityId}.restore`;\n if (!this.rbac.can(actor, permission)) {\n throw new MaestroError(ErrorCode.PERMISSION_DENIED, `Permission denied: ${permission}`);\n }\n\n const provider = this.datasources.get(entity.datasource);\n await provider.update({\n table: entity.table,\n primaryKey: entity.primaryKey,\n id,\n data: { [entity.softDelete.field]: entity.softDelete.activeValue },\n });\n\n await this.recordAudit(`entity.${entityId}.restore`, actor, { type: entityId, id }, 'warn');\n }\n\n async hardDelete(entityId: string, id: string, actor: Actor): Promise<void> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'delete', actor, `entity.${entityId}.delete`);\n\n const provider = this.datasources.get(entity.datasource);\n const before = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n await provider.delete({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n await this.recordAudit(\n `entity.${entityId}.delete`,\n actor,\n { type: entityId, id },\n 'warn',\n undefined,\n before ?? undefined,\n );\n }\n\n async export(\n entityId: string,\n query: QueryInput,\n actor: Actor,\n format: ExportFormat = 'csv',\n ): Promise<ExportResult> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'export', actor, `entity.${entityId}.export`);\n\n const provider = this.datasources.get(entity.datasource);\n const result = await provider.list({\n table: entity.table,\n primaryKey: entity.primaryKey,\n filters: query.filters,\n sort: query.sort,\n search: query.search,\n });\n\n const exportProvider = new CsvExportProvider();\n const exportResult = exportProvider.export(entity, result.records, { format });\n\n await this.recordAudit(\n `entity.${entityId}.export`,\n actor,\n { type: entityId, id: '*' },\n 'info',\n { recordCount: exportResult.recordCount as unknown as Metadata[string], format: format as unknown as Metadata[string] },\n );\n\n return exportResult;\n }\n\n async executeOperation(\n operationId: string,\n context: OperationContext,\n actor: Actor,\n ): Promise<OperationResult> {\n const operation = this.operations.find(operationId);\n if (!operation) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Operation '${operationId}' not found.`);\n }\n\n if (operation.requiredPermission && !this.rbac.can(actor, operation.requiredPermission)) {\n throw new MaestroError(\n ErrorCode.PERMISSION_DENIED,\n `Permission denied: ${operation.requiredPermission}`,\n );\n }\n\n const correlationId = context.correlationId ?? randomUUID();\n const result = await operation.execute({ ...context, actor, correlationId });\n\n const entityMeta = context.entityId\n ? this.metadata.entities.find((e) => e.id === context.entityId)\n : undefined;\n const recordId =\n context.record && entityMeta\n ? String(context.record[entityMeta.primaryKey] ?? 'unknown')\n : '*';\n\n await this.recordAudit(\n `operation.${operationId}`,\n actor,\n context.entityId ? { type: context.entityId, id: recordId } : undefined,\n result.success ? 'info' : 'error',\n { success: result.success as unknown as Metadata[string] },\n undefined,\n undefined,\n correlationId,\n );\n\n return result;\n }\n\n private requireEntity(entityId: string): EntityMetadata {\n const entity = this.metadata.entities.find((e) => e.id === entityId);\n if (!entity) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Entity '${entityId}' not found.`);\n }\n return entity;\n }\n\n private requireCapability(\n entity: EntityMetadata,\n capability: keyof EntityCapabilities,\n actor: Actor,\n permission: string,\n ): void {\n if (!entity.capabilities[capability]) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Capability '${String(capability)}' is not enabled for entity '${entity.id}'.`,\n );\n }\n if (!this.rbac.can(actor, permission)) {\n throw new MaestroError(ErrorCode.PERMISSION_DENIED, `Permission denied: ${permission}`);\n }\n }\n\n private async recordAudit(\n action: string,\n actor: Actor,\n resource?: { type: string; id: string },\n level: 'debug' | 'info' | 'warn' | 'error' = 'info',\n metadata?: Metadata,\n before?: Record<string, unknown>,\n after?: Record<string, unknown>,\n correlationId?: string,\n ): Promise<void> {\n await this.audit?.record({\n action,\n actor,\n resource,\n level,\n metadata,\n before: before as unknown as Metadata,\n after: after as unknown as Metadata,\n correlationId,\n });\n }\n}\n","import type { ExportProvider } from './ExportProvider.js';\nimport type { EntityMetadata } from '../metadata/EntityMetadata.js';\nimport type { FieldMetadata } from '../metadata/FieldMetadata.js';\nimport type { ExportOptions } from './ExportOptions.js';\nimport type { ExportResult } from './ExportResult.js';\n\nexport class CsvExportProvider implements ExportProvider {\n export(\n entity: EntityMetadata,\n records: Record<string, unknown>[],\n options: ExportOptions,\n ): ExportResult {\n const fields = this.resolveFields(entity, options);\n const headers = fields.map((f) => f.label);\n const rows = records.map((record) =>\n fields.map((field) => this.formatValue(record[field.name], field, options)),\n );\n\n const csvLines = [headers, ...rows].map((row) =>\n row.map((cell) => this.escapeCsvCell(String(cell ?? ''))).join(','),\n );\n\n const bom = options.bom !== false ? '' : '';\n const data = bom + csvLines.join('\\r\\n');\n const datestamp = new Date().toISOString().slice(0, 10);\n const filename = `${entity.id}_export_${datestamp}.csv`;\n\n return {\n format: 'csv',\n data,\n filename,\n recordCount: records.length,\n mimeType: 'text/csv;charset=utf-8',\n };\n }\n\n private resolveFields(entity: EntityMetadata, options: ExportOptions): FieldMetadata[] {\n let fields = entity.fields.filter((f) => f.exportable && !f.hidden);\n\n if (options.includeFields?.length) {\n const include = new Set(options.includeFields);\n fields = fields.filter((f) => include.has(f.name));\n }\n\n if (options.excludeFields?.length) {\n const exclude = new Set(options.excludeFields);\n fields = fields.filter((f) => !exclude.has(f.name));\n }\n\n return fields;\n }\n\n private formatValue(value: unknown, field: FieldMetadata, options: ExportOptions): string {\n if (value === null || value === undefined) return '';\n if (field.sensitive) return '***';\n\n switch (field.type) {\n case 'boolean':\n return value ? 'Sim' : 'Não';\n case 'date':\n case 'datetime': {\n if (value instanceof Date) {\n return options.dateFormat ? this.formatDate(value, options.dateFormat) : value.toISOString();\n }\n return String(value);\n }\n case 'enum': {\n const option = field.enumOptions?.find((o) => o.value === value);\n return option ? option.label : String(value);\n }\n case 'json':\n return JSON.stringify(value);\n default:\n return String(value);\n }\n }\n\n private formatDate(date: Date, format: string): string {\n return format\n .replace('YYYY', String(date.getFullYear()))\n .replace('MM', String(date.getMonth() + 1).padStart(2, '0'))\n .replace('DD', String(date.getDate()).padStart(2, '0'))\n .replace('HH', String(date.getHours()).padStart(2, '0'))\n .replace('mm', String(date.getMinutes()).padStart(2, '0'))\n .replace('ss', String(date.getSeconds()).padStart(2, '0'));\n }\n\n private escapeCsvCell(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n}\n","import type { FieldType } from '../metadata/index.js';\nimport type { OperationalRisk } from '../risk/index.js';\nimport type { OperationScope } from '../metadata/index.js';\nimport type { RelationType } from '../metadata/RelationMetadata.js';\nimport type { SchemaValidationResult } from '../schema/index.js';\nimport type {\n EntityDeclaration,\n FieldDeclaration,\n OperationDeclaration,\n RelationDeclaration,\n EnumOptionDeclaration,\n} from './EntityDeclaration.js';\n\nconst SUPPORTED_FIELD_TYPES: FieldType[] = [\n 'string', 'text', 'number', 'integer', 'decimal', 'currency',\n 'boolean', 'date', 'datetime', 'time', 'email', 'phone', 'url',\n 'document', 'uuid', 'enum', 'json', 'relation', 'array',\n];\n\nconst SUPPORTED_OPERATIONAL_RISKS: OperationalRisk[] = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];\n\nconst SUPPORTED_OPERATION_SCOPES: OperationScope[] = ['global', 'entity', 'record', 'bulk'];\n\nconst SUPPORTED_RELATION_TYPES: RelationType[] = [\n 'one-to-one', 'one-to-many', 'many-to-one', 'many-to-many',\n];\n\nexport function validateEntityDeclaration(input: unknown): SchemaValidationResult {\n const errors: { path: string; message: string }[] = [];\n\n if (!input || typeof input !== 'object') {\n return { valid: false, errors: [{ path: '', message: 'Entity declaration must be an object.' }] };\n }\n\n const decl = input as Record<string, unknown>;\n\n if (!decl['entity'] || typeof decl['entity'] !== 'string' || decl['entity'].trim() === '') {\n errors.push({ path: 'entity', message: 'Entity name is required.' });\n }\n\n const fields = decl['fields'];\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {\n errors.push({ path: 'fields', message: 'Entity must declare at least one field.' });\n } else {\n const fieldMap = fields as Record<string, unknown>;\n if (Object.keys(fieldMap).length === 0) {\n errors.push({ path: 'fields', message: 'Entity must declare at least one field.' });\n } else {\n for (const [name, rawField] of Object.entries(fieldMap)) {\n validateFieldDeclaration(name, rawField, errors);\n }\n }\n }\n\n const operations = decl['operations'];\n if (operations !== undefined) {\n if (typeof operations !== 'object' || Array.isArray(operations)) {\n errors.push({ path: 'operations', message: 'Operations must be an object.' });\n } else {\n const opMap = operations as Record<string, unknown>;\n for (const [id, rawOp] of Object.entries(opMap)) {\n validateOperationDeclaration(id, rawOp, errors);\n }\n }\n }\n\n const relationships = decl['relationships'];\n if (relationships !== undefined) {\n if (!Array.isArray(relationships)) {\n errors.push({ path: 'relationships', message: 'Relationships must be an array.' });\n } else {\n const knownFields = fields && typeof fields === 'object' && !Array.isArray(fields)\n ? new Set(Object.keys(fields as Record<string, unknown>))\n : new Set<string>();\n const seenRelIds = new Set<string>();\n\n for (let i = 0; i < relationships.length; i++) {\n validateRelationDeclaration(i, relationships[i], knownFields, seenRelIds, errors);\n }\n }\n }\n\n const capabilities = decl['capabilities'];\n if (capabilities !== undefined) {\n if (typeof capabilities !== 'object' || Array.isArray(capabilities)) {\n errors.push({ path: 'capabilities', message: 'Capabilities must be an object.' });\n } else {\n const caps = capabilities as Record<string, unknown>;\n const booleanKeys = [\n 'list', 'detail', 'create', 'update', 'clone',\n 'delete', 'softDelete', 'export', 'bulkActions',\n ];\n for (const key of Object.keys(caps)) {\n if (!booleanKeys.includes(key)) {\n errors.push({\n path: `capabilities.${key}`,\n message: `Unknown capability '${key}'. Valid capabilities: ${booleanKeys.join(', ')}.`,\n });\n } else if (typeof caps[key] !== 'boolean') {\n errors.push({\n path: `capabilities.${key}`,\n message: `Capability '${key}' must be a boolean.`,\n });\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFieldDeclaration(\n name: string,\n rawField: unknown,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `fields[${name}]`;\n\n if (!rawField || typeof rawField !== 'object') {\n errors.push({ path: prefix, message: `Field '${name}' must be an object.` });\n return;\n }\n\n const field = rawField as Partial<FieldDeclaration>;\n\n if (!field.type) {\n errors.push({ path: `${prefix}.type`, message: 'Field type is required.' });\n } else if (!SUPPORTED_FIELD_TYPES.includes(field.type as FieldType)) {\n errors.push({\n path: `${prefix}.type`,\n message: `Field type '${field.type}' is not supported. Supported types: ${SUPPORTED_FIELD_TYPES.join(', ')}.`,\n });\n }\n\n if (field.sensitive === true && field.exportable === true) {\n errors.push({\n path: prefix,\n message: `Field '${name}' cannot be both sensitive and exportable.`,\n });\n }\n\n if (field.enumOptions !== undefined) {\n if (field.type !== 'enum') {\n errors.push({\n path: `${prefix}.enumOptions`,\n message: `Field '${name}' has enumOptions but type is '${field.type}'. enumOptions is only valid for type 'enum'.`,\n });\n } else {\n validateEnumOptions(name, field.enumOptions as unknown, errors);\n }\n }\n\n if (field.relationEntity !== undefined) {\n if (field.type !== 'relation') {\n errors.push({\n path: `${prefix}.relationEntity`,\n message: `Field '${name}' has relationEntity but type is '${field.type}'. relationEntity is only valid for type 'relation'.`,\n });\n } else if (typeof field.relationEntity !== 'string' || field.relationEntity.trim() === '') {\n errors.push({\n path: `${prefix}.relationEntity`,\n message: `Field '${name}' relationEntity must be a non-empty string.`,\n });\n }\n }\n}\n\nfunction validateEnumOptions(\n fieldName: string,\n rawOptions: unknown,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `fields[${fieldName}].enumOptions`;\n\n if (!Array.isArray(rawOptions)) {\n errors.push({ path: prefix, message: `enumOptions for field '${fieldName}' must be an array.` });\n return;\n }\n\n if (rawOptions.length === 0) {\n errors.push({ path: prefix, message: `enumOptions for field '${fieldName}' must not be empty.` });\n return;\n }\n\n for (let i = 0; i < rawOptions.length; i++) {\n const opt = rawOptions[i] as Partial<EnumOptionDeclaration>;\n if (!opt || typeof opt !== 'object') {\n errors.push({ path: `${prefix}[${i}]`, message: `Enum option at index ${i} must be an object.` });\n continue;\n }\n if (opt.value === undefined || opt.value === null) {\n errors.push({ path: `${prefix}[${i}].value`, message: `Enum option at index ${i} is missing 'value'.` });\n }\n if (!opt.label || typeof opt.label !== 'string' || opt.label.trim() === '') {\n errors.push({ path: `${prefix}[${i}].label`, message: `Enum option at index ${i} is missing 'label'.` });\n }\n }\n}\n\nfunction validateOperationDeclaration(\n id: string,\n rawOp: unknown,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `operations[${id}]`;\n\n if (!rawOp || typeof rawOp !== 'object') {\n errors.push({ path: prefix, message: `Operation '${id}' must be an object.` });\n return;\n }\n\n const op = rawOp as Partial<OperationDeclaration>;\n\n if (!op.label || typeof op.label !== 'string' || op.label.trim() === '') {\n errors.push({ path: `${prefix}.label`, message: 'Operation label is required.' });\n }\n\n if (op.risk !== undefined && !SUPPORTED_OPERATIONAL_RISKS.includes(op.risk as OperationalRisk)) {\n errors.push({\n path: `${prefix}.risk`,\n message: `Operation risk '${op.risk}' is not valid. Valid values: ${SUPPORTED_OPERATIONAL_RISKS.join(', ')}.`,\n });\n }\n\n if (op.scope !== undefined && !SUPPORTED_OPERATION_SCOPES.includes(op.scope as OperationScope)) {\n errors.push({\n path: `${prefix}.scope`,\n message: `Operation scope '${op.scope}' is not valid. Valid values: ${SUPPORTED_OPERATION_SCOPES.join(', ')}.`,\n });\n }\n\n if (op.confirmation !== undefined) {\n const conf = op.confirmation;\n if (conf.approvers !== undefined && (typeof conf.approvers !== 'number' || conf.approvers < 1)) {\n errors.push({\n path: `${prefix}.confirmation.approvers`,\n message: 'Confirmation approvers must be at least 1.',\n });\n }\n }\n}\n\nfunction validateRelationDeclaration(\n index: number,\n rawRel: unknown,\n knownFields: Set<string>,\n seenIds: Set<string>,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `relationships[${index}]`;\n\n if (!rawRel || typeof rawRel !== 'object') {\n errors.push({ path: prefix, message: `Relationship at index ${index} must be an object.` });\n return;\n }\n\n const rel = rawRel as Partial<RelationDeclaration>;\n\n if (rel.id !== undefined) {\n if (typeof rel.id !== 'string' || rel.id.trim() === '') {\n errors.push({ path: `${prefix}.id`, message: 'Relationship id must be a non-empty string.' });\n } else if (seenIds.has(rel.id)) {\n errors.push({ path: `${prefix}.id`, message: `Duplicate relationship id '${rel.id}'.` });\n } else {\n seenIds.add(rel.id);\n }\n }\n\n if (!rel.type) {\n errors.push({ path: `${prefix}.type`, message: 'Relationship type is required.' });\n } else if (!SUPPORTED_RELATION_TYPES.includes(rel.type as RelationType)) {\n errors.push({\n path: `${prefix}.type`,\n message: `Relationship type '${rel.type}' is not valid. Valid values: ${SUPPORTED_RELATION_TYPES.join(', ')}.`,\n });\n }\n\n if (!rel.fromField || typeof rel.fromField !== 'string' || rel.fromField.trim() === '') {\n errors.push({ path: `${prefix}.fromField`, message: 'Relationship fromField is required.' });\n } else if (knownFields.size > 0 && !knownFields.has(rel.fromField)) {\n errors.push({\n path: `${prefix}.fromField`,\n message: `Relationship fromField '${rel.fromField}' does not exist in the entity's fields.`,\n });\n }\n\n if (!rel.toEntity || typeof rel.toEntity !== 'string' || rel.toEntity.trim() === '') {\n errors.push({ path: `${prefix}.toEntity`, message: 'Relationship toEntity is required.' });\n }\n\n if (!rel.toField || typeof rel.toField !== 'string' || rel.toField.trim() === '') {\n errors.push({ path: `${prefix}.toField`, message: 'Relationship toField is required.' });\n }\n}\n\nexport function validateConsumerDeclaration(\n input: unknown,\n entity?: EntityDeclaration,\n): SchemaValidationResult {\n const errors: { path: string; message: string }[] = [];\n\n if (!input || typeof input !== 'object') {\n return { valid: false, errors: [{ path: '', message: 'Consumer declaration must be an object.' }] };\n }\n\n const decl = input as Record<string, unknown>;\n\n if (!decl['consumer'] || typeof decl['consumer'] !== 'string' || (decl['consumer'] as string).trim() === '') {\n errors.push({ path: 'consumer', message: 'Consumer name is required.' });\n }\n\n if (!decl['entity'] || typeof decl['entity'] !== 'string' || (decl['entity'] as string).trim() === '') {\n errors.push({ path: 'entity', message: 'Entity name is required.' });\n }\n\n if (entity) {\n const knownFields = new Set(Object.keys(entity.fields));\n const knownOps = new Set(Object.keys(entity.operations ?? {}));\n const entityName = entity.entity;\n\n validateFieldRefs('list.fields', decl['list'], knownFields, entityName, errors);\n validateFieldRefs('detail.fields', decl['detail'], knownFields, entityName, errors);\n\n const forms = decl['forms'] as Record<string, unknown> | undefined;\n if (forms && typeof forms === 'object') {\n validateFieldRefs('forms.create.fields', forms['create'], knownFields, entityName, errors);\n validateFieldRefs('forms.update.fields', forms['update'], knownFields, entityName, errors);\n validateFieldRefs('forms.clone.fields', forms['clone'], knownFields, entityName, errors);\n }\n\n const actions = decl['actions'] as Record<string, unknown> | undefined;\n if (actions && typeof actions === 'object') {\n validateOperationRefs('actions.row', actions['row'], knownOps, entityName, errors);\n validateOperationRefs('actions.bulk', actions['bulk'], knownOps, entityName, errors);\n validateOperationRefs('actions.global', actions['global'], knownOps, entityName, errors);\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFieldRefs(\n path: string,\n container: unknown,\n knownFields: Set<string>,\n entityName: string,\n errors: { path: string; message: string }[],\n): void {\n if (!container || typeof container !== 'object') return;\n const obj = container as Record<string, unknown>;\n const fields = obj['fields'];\n if (!Array.isArray(fields)) return;\n for (let i = 0; i < fields.length; i++) {\n const name = fields[i] as string;\n if (!knownFields.has(name)) {\n errors.push({\n path: `${path}[${i}]`,\n message: `Field '${name}' does not exist in entity '${entityName}'.`,\n });\n }\n }\n}\n\nfunction validateOperationRefs(\n path: string,\n refs: unknown,\n knownOps: Set<string>,\n entityName: string,\n errors: { path: string; message: string }[],\n): void {\n if (!Array.isArray(refs)) return;\n for (let i = 0; i < refs.length; i++) {\n const id = refs[i] as string;\n if (!knownOps.has(id)) {\n errors.push({\n path: `${path}[${i}]`,\n message: `Operation '${id}' does not exist in entity '${entityName}'.`,\n });\n }\n }\n}\n","import type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { SchemaValidationError } from '../schema/SchemaValidator.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport type { FieldMetadata } from '../metadata/FieldMetadata.js';\nimport type { OperationMetadata } from '../metadata/OperationMetadata.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport { validateEntityDeclaration, validateConsumerDeclaration } from './DeclarativeValidator.js';\nimport type { DeclarativeConfig } from './DeclarativeConfig.js';\nimport type {\n EntityDeclaration,\n FieldDeclaration,\n OperationDeclaration,\n RelationDeclaration,\n} from './EntityDeclaration.js';\nimport type { ConsumerDeclaration } from './ConsumerDeclaration.js';\nimport type { ResolvedConsumerProjection } from './ConsumerProjection.js';\n\nexport interface DeclarativeCompilationResult {\n valid: boolean;\n errors: SchemaValidationError[];\n entities: EntitySchema[];\n /** Operation stubs for declared operations. Real implementations in config.operations override these. */\n operations: OperationDef[];\n /** Validated consumer declarations ready for resolution after metadata is built. */\n consumers: ConsumerDeclaration[];\n /** Relation schemas derived from RelationDeclaration[]. Cross-entity refs validated at startup. */\n relations: RelationSchema[];\n}\n\nexport interface CompileDeclarationsOptions {\n datasourceIds: string[];\n /**\n * Datasource to assign to all declared entities.\n * Resolved by the caller: either declarations.defaultDatasource or the single available datasource.\n */\n defaultDatasource?: string;\n}\n\nfunction capitalizeFirst(name: string): string {\n if (!name) return name;\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\nfunction fieldDeclToFieldSchema(name: string, field: FieldDeclaration): FieldSchema {\n return {\n name,\n label: field.label ?? capitalizeFirst(name),\n type: field.type,\n required: field.required,\n readonly: field.readonly,\n // FieldDeclaration uses visible (default true); FieldSchema uses hidden (default false)\n hidden: field.visible === false ? true : undefined,\n sensitive: field.sensitive,\n searchable: field.searchable,\n sortable: field.sortable,\n filterable: field.filterable,\n exportable: field.exportable,\n description: field.description,\n enumOptions: field.enumOptions,\n relationEntity: field.relationEntity,\n };\n}\n\nfunction opDeclToStubOperationDef(\n entityId: string,\n opKey: string,\n op: OperationDeclaration,\n): OperationDef {\n const id = `${entityId}.${opKey}`;\n return {\n id,\n label: op.label,\n description: op.description,\n entity: entityId,\n scope: op.scope ?? 'record',\n requiredPermission: op.permission,\n requiresConfirmation: op.confirmation?.required,\n execute: async () => {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Operation '${id}' declared but has no registered implementation. ` +\n `Provide an OperationDef with id '${id}' in config.operations.`,\n );\n },\n };\n}\n\nfunction entityDeclToEntitySchema(decl: EntityDeclaration, datasource: string): EntitySchema {\n const primaryKeyEntry = Object.entries(decl.fields).find(([, f]) => f.primary);\n const primaryKey = primaryKeyEntry ? primaryKeyEntry[0] : 'id';\n\n const singularLabel = decl.label ?? capitalizeFirst(decl.entity);\n const pluralLabel = decl.pluralLabel ?? decl.label ?? capitalizeFirst(decl.entity);\n\n const fields: FieldSchema[] = Object.entries(decl.fields).map(([name, field]) =>\n fieldDeclToFieldSchema(name, field),\n );\n\n return {\n id: decl.entity,\n label: { singular: singularLabel, plural: pluralLabel },\n description: decl.description,\n source: {\n datasource,\n table: decl.entity,\n primaryKey,\n },\n capabilities: decl.capabilities,\n fields,\n };\n}\n\nfunction relationDeclToRelationSchema(\n fromEntity: string,\n rel: RelationDeclaration,\n): RelationSchema {\n const id = rel.id ?? `${fromEntity}.${rel.toEntity}`;\n const label = rel.label ?? capitalizeFirst(rel.toEntity);\n return {\n id,\n type: rel.type,\n from: { entity: fromEntity, field: rel.fromField },\n to: { entity: rel.toEntity, field: rel.toField },\n label,\n display: rel.display ? { tab: rel.display.tab ?? false, label: rel.display.label } : undefined,\n };\n}\n\nexport function compileDeclarations(\n config: DeclarativeConfig,\n options: CompileDeclarationsOptions,\n): DeclarativeCompilationResult {\n const errors: SchemaValidationError[] = [];\n\n // Resolve the datasource to use for all declared entities\n const datasource =\n options.defaultDatasource ??\n (options.datasourceIds.length === 1 ? options.datasourceIds[0] : undefined);\n\n if (options.datasourceIds.length > 1 && !datasource) {\n errors.push({\n path: 'declarations.defaultDatasource',\n message:\n 'Multiple datasources are configured. Set declarations.defaultDatasource to specify which one to use for declared entities.',\n });\n }\n\n // Validate and compile each EntityDeclaration\n const entityDeclarationMap = new Map<string, EntityDeclaration>();\n const compiledEntities: EntitySchema[] = [];\n const compiledOperations: OperationDef[] = [];\n const compiledRelations: RelationSchema[] = [];\n\n for (const decl of config.entities) {\n const entityId = typeof decl?.entity === 'string' ? decl.entity : '?';\n const prefix = `declarations.entities[${entityId}]`;\n\n const validation = validateEntityDeclaration(decl);\n if (!validation.valid) {\n for (const err of validation.errors) {\n errors.push({ path: `${prefix}.${err.path}`.replace(/\\.$/, ''), message: err.message });\n }\n continue;\n }\n\n if (entityDeclarationMap.has(decl.entity)) {\n errors.push({\n path: prefix,\n message: `Duplicate entity '${decl.entity}' in declarations.entities.`,\n });\n continue;\n }\n\n entityDeclarationMap.set(decl.entity, decl);\n\n if (datasource) {\n compiledEntities.push(entityDeclToEntitySchema(decl, datasource));\n\n for (const [opKey, opDecl] of Object.entries(decl.operations ?? {})) {\n compiledOperations.push(opDeclToStubOperationDef(decl.entity, opKey, opDecl));\n }\n\n // Compile relationships (cross-entity refs validated later in createMaestro)\n const seenRelIds = new Set<string>();\n for (let i = 0; i < (decl.relationships ?? []).length; i++) {\n const rel = decl.relationships![i];\n const relSchema = relationDeclToRelationSchema(decl.entity, rel);\n if (seenRelIds.has(relSchema.id)) {\n errors.push({\n path: `${prefix}.relationships[${i}].id`,\n message: `Duplicate relation id '${relSchema.id}' in entity '${decl.entity}'.`,\n });\n } else {\n seenRelIds.add(relSchema.id);\n compiledRelations.push(relSchema);\n }\n }\n }\n }\n\n // Validate each ConsumerDeclaration.\n // Consumers may reference entities from declarations OR from config.entities / hybrid loader.\n // Field/op cross-validation is only performed when the entity is present in this declaration batch.\n // Cross-entity consumers (referencing base-metadata entities) are included as-is for deferred\n // validation in createMaestro() after the full metadata is built.\n const consumerNames = new Set<string>();\n const validConsumers: ConsumerDeclaration[] = [];\n\n for (const consumer of config.consumers ?? []) {\n const consumerId = typeof consumer?.consumer === 'string' ? consumer.consumer : '?';\n const prefix = `declarations.consumers[${consumerId}]`;\n\n // Look up the entity declaration for cross-validation (may be undefined for base-metadata entities)\n const entityDecl = entityDeclarationMap.get(consumer?.entity ?? '');\n\n // Only validate field/op references when the entity is in this declaration batch\n const validation = validateConsumerDeclaration(consumer, entityDecl);\n if (!validation.valid) {\n for (const err of validation.errors) {\n errors.push({ path: `${prefix}.${err.path}`.replace(/\\.$/, ''), message: err.message });\n }\n continue;\n }\n\n if (consumerNames.has(consumer.consumer)) {\n errors.push({\n path: prefix,\n message: `Duplicate consumer '${consumer.consumer}' in declarations.consumers.`,\n });\n continue;\n }\n\n consumerNames.add(consumer.consumer);\n validConsumers.push(consumer);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n entities: compiledEntities,\n operations: compiledOperations,\n consumers: validConsumers,\n relations: compiledRelations,\n };\n}\n\n/**\n * Resolves validated ConsumerDeclarations against the fully-built MaestroMetadata.\n * Must be called after MetadataEngine.normalize() has produced the final EntityMetadata[].\n */\nexport function resolveConsumerProjections(\n consumers: ConsumerDeclaration[],\n metadata: MaestroMetadata,\n): ResolvedConsumerProjection[] {\n const results: ResolvedConsumerProjection[] = [];\n\n for (const consumer of consumers) {\n const entityMeta = metadata.entities.find((e) => e.id === consumer.entity);\n if (!entityMeta) continue;\n\n const allFields = entityMeta.fields;\n const entityOps = metadata.operations.filter((o) => o.entity === consumer.entity);\n\n const resolveFields = (names?: string[]): FieldMetadata[] => {\n if (!names || names.length === 0) return [...allFields];\n return names\n .map((name) => allFields.find((f) => f.name === name))\n .filter((f): f is FieldMetadata => f !== undefined);\n };\n\n // ConsumerDeclaration action keys are the local operation keys from EntityDeclaration.\n // Compiled OperationDef IDs follow the pattern `${entityId}.${opKey}`.\n const resolveOps = (keys?: string[], defaultScope?: string): OperationMetadata[] => {\n if (!keys || keys.length === 0) {\n return defaultScope ? entityOps.filter((o) => o.scope === defaultScope) : [...entityOps];\n }\n return keys\n .map((key) => {\n const fullId = `${consumer.entity}.${key}`;\n return entityOps.find((o) => o.id === fullId);\n })\n .filter((o): o is OperationMetadata => o !== undefined);\n };\n\n results.push({\n consumer: consumer.consumer,\n entity: consumer.entity,\n fields: {\n list: resolveFields(consumer.list?.fields),\n detail: resolveFields(consumer.detail?.fields),\n create: resolveFields(consumer.forms?.create?.fields),\n update: resolveFields(consumer.forms?.update?.fields),\n clone: resolveFields(consumer.forms?.clone?.fields),\n },\n operations: {\n row: resolveOps(consumer.actions?.row, 'record'),\n bulk: resolveOps(consumer.actions?.bulk, 'bulk'),\n global: resolveOps(consumer.actions?.global, 'global'),\n },\n });\n }\n\n return results;\n}\n","import { AuditRecorder } from '../audit/AuditRecorder.js';\nimport { DatasourceRegistry } from '../datasource/DatasourceRegistry.js';\nimport { OperationRegistry } from '../operation/OperationRegistry.js';\nimport { MetadataEngine } from './MetadataEngine.js';\nimport { MaestroEngine } from './MaestroEngine.js';\nimport { validateMaestroConfig } from '../schema/SchemaValidator.js';\nimport type { MaestroConfig } from '../schema/MaestroConfig.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport {\n compileDeclarations,\n resolveConsumerProjections,\n} from '../declarative/DeclarativeMetadataCompiler.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { ConsumerDeclaration } from '../declarative/ConsumerDeclaration.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\n\ninterface BindingError {\n path: string;\n message: string;\n}\n\n/**\n * Merges declared stubs with real implementations from config.operations.\n *\n * Rules:\n * - Every declared operation (stub) MUST have a matching implementation in config.operations.\n * Missing binding → CONFIGURATION_ERROR at startup (never at runtime).\n * - Duplicate IDs in config.operations → CONFIGURATION_ERROR.\n * - Entity mismatch between stub and implementation → CONFIGURATION_ERROR.\n * - config.operations entries that do not match any stub are kept as-is (legacy path).\n */\nfunction bindAndValidateOperations(\n stubs: OperationDef[],\n configOps: OperationDef[],\n): { operations: OperationDef[]; errors: BindingError[] } {\n const errors: BindingError[] = [];\n\n // Detect duplicate IDs in config.operations (two real implementations with the same id)\n const configOpMap = new Map<string, OperationDef>();\n for (const op of configOps) {\n if (configOpMap.has(op.id)) {\n errors.push({\n path: `operations[${op.id}]`,\n message: `Duplicate operation id '${op.id}' in config.operations. Each operation must have a unique id.`,\n });\n } else {\n configOpMap.set(op.id, op);\n }\n }\n\n const stubIds = new Set(stubs.map((s) => s.id));\n const bound: OperationDef[] = [];\n\n // Each declared stub must be bound to a real implementation\n for (const stub of stubs) {\n const impl = configOpMap.get(stub.id);\n if (!impl) {\n errors.push({\n path: `declarations.entities[${stub.entity}].operations`,\n message:\n `Declared operation '${stub.id}' has no implementation. ` +\n `Provide an OperationDef with id '${stub.id}' in config.operations.`,\n });\n continue;\n }\n\n // When both sides specify an entity, they must agree\n if (impl.entity !== undefined && impl.entity !== stub.entity) {\n errors.push({\n path: `operations[${impl.id}].entity`,\n message:\n `Operation '${impl.id}' is declared for entity '${stub.entity}' but ` +\n `config.operations specifies entity '${impl.entity}'.`,\n });\n continue;\n }\n\n bound.push(impl);\n }\n\n // Standalone config operations (no matching declaration) pass through as-is (legacy path)\n for (const op of configOpMap.values()) {\n if (!stubIds.has(op.id)) {\n bound.push(op);\n }\n }\n\n return { operations: bound, errors };\n}\n\n/**\n * Validates compiled relation cross-entity and cross-field references against final metadata.\n * Called after MetadataEngine.normalize() so the full entity/field set is available.\n */\nfunction validateRelationRefs(\n relations: RelationSchema[],\n metadata: MaestroMetadata,\n): BindingError[] {\n const errors: BindingError[] = [];\n const entityMap = new Map(metadata.entities.map((e) => [e.id, e]));\n\n for (const rel of relations) {\n const fromEntity = entityMap.get(rel.from.entity);\n if (!fromEntity) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message: `Relation '${rel.id}': source entity '${rel.from.entity}' not found in metadata.`,\n });\n continue;\n }\n\n const fromField = fromEntity.fields.find((f) => f.name === rel.from.field);\n if (!fromField) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message:\n `Relation '${rel.id}': fromField '${rel.from.field}' does not exist in entity '${rel.from.entity}'.`,\n });\n }\n\n const toEntity = entityMap.get(rel.to.entity);\n if (!toEntity) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message:\n `Relation '${rel.id}': target entity '${rel.to.entity}' not found in metadata. ` +\n `Ensure the target entity is declared, introspected, or manually configured.`,\n });\n continue;\n }\n\n const toField = toEntity.fields.find((f) => f.name === rel.to.field);\n if (!toField) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message:\n `Relation '${rel.id}': toField '${rel.to.field}' does not exist in entity '${rel.to.entity}'.`,\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validates consumer entity references and field/operation references against final metadata.\n * Handles both consumers of declared entities and consumers of base-metadata entities.\n */\nfunction validateConsumerRefs(\n consumers: ConsumerDeclaration[],\n metadata: MaestroMetadata,\n): BindingError[] {\n const errors: BindingError[] = [];\n\n for (const consumer of consumers) {\n const entityMeta = metadata.entities.find((e) => e.id === consumer.entity);\n if (!entityMeta) {\n errors.push({\n path: `declarations.consumers[${consumer.consumer}].entity`,\n message:\n `Consumer '${consumer.consumer}' references entity '${consumer.entity}' which does not exist in the final metadata. ` +\n `Ensure the entity is declared, introspected, or manually configured.`,\n });\n continue;\n }\n\n const knownFields = new Set(entityMeta.fields.map((f) => f.name));\n const entityOps = metadata.operations.filter((o) => o.entity === consumer.entity);\n // Operation keys in consumer actions use the local key form; full ID is `${entity}.${key}`\n const knownOpKeys = new Set(\n entityOps.map((o) => (o.id.startsWith(`${consumer.entity}.`) ? o.id.slice(consumer.entity.length + 1) : o.id)),\n );\n\n const checkFields = (sectionPath: string, fieldNames?: string[]): void => {\n if (!fieldNames) return;\n for (let i = 0; i < fieldNames.length; i++) {\n if (!knownFields.has(fieldNames[i])) {\n errors.push({\n path: `declarations.consumers[${consumer.consumer}].${sectionPath}[${i}]`,\n message:\n `Consumer '${consumer.consumer}': field '${fieldNames[i]}' does not exist in entity '${consumer.entity}'.`,\n });\n }\n }\n };\n\n const checkOps = (sectionPath: string, opKeys?: string[]): void => {\n if (!opKeys) return;\n for (let i = 0; i < opKeys.length; i++) {\n if (!knownOpKeys.has(opKeys[i])) {\n errors.push({\n path: `declarations.consumers[${consumer.consumer}].${sectionPath}[${i}]`,\n message:\n `Consumer '${consumer.consumer}': operation '${opKeys[i]}' does not exist in entity '${consumer.entity}'.`,\n });\n }\n }\n };\n\n checkFields('list.fields', consumer.list?.fields);\n checkFields('detail.fields', consumer.detail?.fields);\n checkFields('forms.create.fields', consumer.forms?.create?.fields);\n checkFields('forms.update.fields', consumer.forms?.update?.fields);\n checkFields('forms.clone.fields', consumer.forms?.clone?.fields);\n checkOps('actions.row', consumer.actions?.row);\n checkOps('actions.bulk', consumer.actions?.bulk);\n checkOps('actions.global', consumer.actions?.global);\n }\n\n return errors;\n}\n\nexport function createMaestro(config: MaestroConfig): MaestroEngine {\n // ── Step 1: Compile declarative entities/consumers (if provided) ───────────\n let extraEntities: EntitySchema[] = [];\n let declaredOperations: OperationDef[] = [];\n let compiledConsumers: ConsumerDeclaration[] = [];\n let compiledRelations: RelationSchema[] = [];\n\n if (config.declarations) {\n const datasourceIds = Object.keys(config.datasources ?? {});\n const defaultDatasource =\n config.declarations.defaultDatasource ??\n (datasourceIds.length === 1 ? datasourceIds[0] : undefined);\n\n const compilation = compileDeclarations(config.declarations, {\n datasourceIds,\n defaultDatasource,\n });\n\n if (!compilation.valid) {\n const messages = compilation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Invalid declarative configuration: ${messages}`,\n );\n }\n\n extraEntities = compilation.entities;\n declaredOperations = compilation.operations;\n compiledConsumers = compilation.consumers;\n compiledRelations = compilation.relations;\n }\n\n // ── Step 2: Merge entities — direct EntitySchema takes precedence for uniqueness ──\n // Duplicate entity IDs across both sources will be caught by SchemaValidator below.\n const mergedEntities: EntitySchema[] = [\n ...(config.entities ?? []),\n ...extraEntities,\n ];\n\n // ── Step 3: Bind declared operations to real implementations ─────────────\n // Every declared operation must have a handler in config.operations.\n // Duplicate IDs in config.operations and entity mismatches are also caught here.\n const binding = bindAndValidateOperations(declaredOperations, config.operations ?? []);\n if (binding.errors.length > 0) {\n const messages = binding.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(ErrorCode.CONFIGURATION_ERROR, `Invalid operation bindings: ${messages}`);\n }\n const mergedOperations = binding.operations;\n\n // ── Step 4: Merge relations — declared relations added to config.relations ─\n const mergedRelations: RelationSchema[] = [\n ...(config.relations ?? []),\n ...compiledRelations,\n ];\n\n // ── Step 5: Validate the fully merged config ──────────────────────────────\n const mergedConfig: MaestroConfig = {\n ...config,\n entities: mergedEntities,\n operations: mergedOperations,\n relations: mergedRelations,\n };\n\n const validation = validateMaestroConfig(mergedConfig);\n if (!validation.valid) {\n const messages = validation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(ErrorCode.CONFIGURATION_ERROR, `Invalid Maestro configuration: ${messages}`);\n }\n\n // ── Step 6: Build metadata ────────────────────────────────────────────────\n const metadataEngine = new MetadataEngine();\n const metadata = metadataEngine.normalize(mergedConfig);\n\n // ── Step 7: Validate cross-entity relation references ────────────────────\n // Done after metadata is built so the full entity/field set is available.\n if (compiledRelations.length > 0) {\n const relErrors = validateRelationRefs(compiledRelations, metadata);\n if (relErrors.length > 0) {\n const messages = relErrors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Invalid relation references: ${messages}`,\n );\n }\n }\n\n // ── Step 8: Validate consumer entity and field/op references ─────────────\n // Handles both consumers of declared entities and consumers of base-metadata entities.\n if (compiledConsumers.length > 0) {\n const consumerErrors = validateConsumerRefs(compiledConsumers, metadata);\n if (consumerErrors.length > 0) {\n const messages = consumerErrors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Invalid consumer references: ${messages}`,\n );\n }\n }\n\n // ── Step 9: Resolve consumer projections against final metadata ───────────\n const consumers = resolveConsumerProjections(compiledConsumers, metadata);\n\n // ── Step 10: Build registries and engine ──────────────────────────────────\n const datasources = new DatasourceRegistry();\n for (const [id, provider] of Object.entries(config.datasources)) {\n datasources.register(id, provider);\n }\n\n const operations = new OperationRegistry();\n for (const operation of mergedOperations) {\n operations.register(operation);\n }\n\n const audit = config.audit ? new AuditRecorder(config.audit) : undefined;\n\n return new MaestroEngine(metadata, datasources, operations, audit, consumers);\n}\n","import type { FieldType } from '../metadata/FieldType.js';\n\nconst DISPLAY_FIELD_PRIORITY = [\n 'name', 'title', 'username', 'email', 'code', 'slug', 'label',\n 'first_name', 'firstname', 'full_name', 'fullname', 'subject',\n];\n\nconst TIMESTAMP_PATTERN =\n /^(created_at|createdat|created_date|createddate|updated_at|updatedat|updated_date|updateddate|deleted_at|deletedat|modified_at|modifiedat)$/i;\n\nconst SEARCH_CANDIDATE_PATTERN =\n /^(name|title|description|email|username|first_name|firstname|last_name|lastname|full_name|fullname|label|code|slug|reference|subject)$/i;\n\nexport function inferFieldType(nativeType: string, fieldName: string): FieldType {\n const nt = nativeType.toLowerCase().replace(/\\(.*\\)/, '').trim();\n const fn = fieldName.toLowerCase();\n\n if (['uuid', 'uniqueidentifier'].includes(nt)) return 'uuid';\n if (['boolean', 'bool', 'bit'].includes(nt)) return 'boolean';\n if (nt === 'date') return 'date';\n if (\n [\n 'timestamp', 'timestamptz', 'timestamp with time zone',\n 'timestamp without time zone', 'datetime', 'datetime2',\n ].includes(nt)\n )\n return 'datetime';\n if (['time', 'timetz', 'time with time zone', 'time without time zone'].includes(nt))\n return 'time';\n if (['json', 'jsonb'].includes(nt)) return 'json';\n if (nt.includes('[]') || nt === 'array') return 'array';\n if (\n [\n 'int', 'int2', 'int4', 'int8', 'int16', 'integer', 'bigint', 'smallint',\n 'tinyint', 'mediumint', 'serial', 'bigserial', 'smallserial',\n ].includes(nt)\n )\n return 'integer';\n if (['float', 'float4', 'float8', 'double', 'double precision', 'real'].includes(nt))\n return 'number';\n if (['decimal', 'numeric', 'money', 'smallmoney'].includes(nt)) {\n if (\n /^(price|amount|value|total|cost|fee|salary|balance|revenue|profit|tax)$|_(price|amount|value|total|cost|fee)$/.test(\n fn,\n )\n )\n return 'currency';\n return 'decimal';\n }\n if (['text', 'mediumtext', 'longtext', 'clob'].includes(nt)) return 'text';\n\n // Name-based heuristics applied after type mapping for string-family types\n if (fn === 'email' || fn.endsWith('_email')) return 'email';\n if (fn === 'phone' || fn === 'telephone' || fn.endsWith('_phone') || fn.endsWith('_tel'))\n return 'phone';\n if (fn === 'url' || fn === 'website' || fn.endsWith('_url') || fn.endsWith('_website'))\n return 'url';\n if (/^(doc|document|cpf|cnpj|ssn|nif|rg)$|_(doc|document|cpf|cnpj|ssn|rg)$/.test(fn))\n return 'document';\n\n return 'string';\n}\n\nexport function isTimestampField(fieldName: string, fieldType: FieldType): boolean {\n return TIMESTAMP_PATTERN.test(fieldName) && (fieldType === 'datetime' || fieldType === 'date');\n}\n\nexport function isSoftDeleteCandidate(\n fieldName: string,\n fieldType: FieldType,\n nullable: boolean,\n): boolean {\n const fn = fieldName.toLowerCase();\n if ((fn === 'deleted_at' || fn === 'deletedat') && fieldType === 'datetime' && nullable)\n return true;\n if (\n (fn === 'is_deleted' || fn === 'isdeleted' || fn === 'deleted') &&\n fieldType === 'boolean'\n )\n return true;\n if (\n (fn === 'is_active' || fn === 'isactive' || fn === 'active') &&\n fieldType === 'boolean'\n )\n return true;\n return false;\n}\n\nexport function isSearchCandidate(\n fieldName: string,\n fieldType: FieldType,\n isPrimaryKey: boolean,\n): boolean {\n if (isPrimaryKey) return false;\n if (!['string', 'text', 'email', 'phone', 'url'].includes(fieldType)) return false;\n return SEARCH_CANDIDATE_PATTERN.test(fieldName);\n}\n\nexport function tableNameToEntityId(table: string): string {\n return table\n .replace(/([A-Z])/g, (match, c, offset: number) => (offset > 0 ? `-${c}` : c))\n .replace(/_/g, '-')\n .replace(/--+/g, '-')\n .toLowerCase();\n}\n\nfunction humanizeWord(word: string): string {\n if (!word) return '';\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n\nexport function tableNameToLabel(table: string): { singular: string; plural: string } {\n const words = table\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map(humanizeWord);\n\n const plural = words.join(' ');\n const lastWord = words[words.length - 1];\n\n let singularLast: string;\n if (lastWord.toLowerCase().endsWith('ies')) {\n singularLast = lastWord.slice(0, -3) + 'y';\n } else if (\n lastWord.toLowerCase().endsWith('ses') ||\n lastWord.toLowerCase().endsWith('xes') ||\n lastWord.toLowerCase().endsWith('ches') ||\n lastWord.toLowerCase().endsWith('shes')\n ) {\n singularLast = lastWord.slice(0, -2);\n } else if (lastWord.toLowerCase().endsWith('s') && !lastWord.toLowerCase().endsWith('ss')) {\n singularLast = lastWord.slice(0, -1);\n } else {\n singularLast = lastWord;\n }\n\n const singular = [...words.slice(0, -1), singularLast].join(' ');\n return { singular, plural };\n}\n\nexport function humanizeFieldName(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function detectDisplayField(\n fields: Array<{ name: string; type: FieldType; isPrimaryKey: boolean }>,\n): string | undefined {\n for (const priority of DISPLAY_FIELD_PRIORITY) {\n const match = fields.find((f) => f.name.toLowerCase() === priority && !f.isPrimaryKey);\n if (match) return match.name;\n }\n const fallback = fields.find(\n (f) => !f.isPrimaryKey && ['string', 'text', 'email'].includes(f.type),\n );\n return fallback?.name;\n}\n","import type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type {\n EntityIntrospectionSchema,\n FieldIntrospectionSchema,\n RelationIntrospectionSchema,\n} from '../introspection/IntrospectionResult.js';\nimport type { LoadedConfig } from '../config-loader/MaestroFileLoader.js';\nimport type { MaestroConfig } from '../schema/MaestroConfig.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { DatasourceProvider } from '../datasource/DatasourceProvider.js';\nimport type { SoftDeleteConfig } from '../metadata/SoftDeleteConfig.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { AuditRepository } from '../audit/AuditRepository.js';\nimport type { Logger } from '../logging/Logger.js';\nimport {\n tableNameToEntityId,\n tableNameToLabel,\n detectDisplayField,\n humanizeFieldName,\n} from '../introspection/utils.js';\n\nexport type MergeStrategy = 'extend' | 'override';\n\nexport interface MergeIntrospectionOptions {\n introspection: IntrospectionResult;\n overrides: LoadedConfig;\n datasources: Record<string, DatasourceProvider>;\n defaultDatasource: string;\n strategy?: MergeStrategy;\n operations?: OperationDef[];\n audit?: AuditRepository;\n logger?: Logger;\n}\n\nfunction fieldFromIntrospection(field: FieldIntrospectionSchema): FieldSchema {\n return {\n name: field.name,\n label: humanizeFieldName(field.name),\n type: field.type,\n required: !field.nullable && !field.isPrimaryKey,\n readonly: field.isPrimaryKey,\n hidden: field.isPrimaryKey,\n searchable: field.candidateForSearch ?? false,\n sortable: !field.isPrimaryKey && !field.isTimestamp,\n filterable: field.isIndexed ?? false,\n exportable: !field.isPrimaryKey,\n };\n}\n\nfunction mergeFields(\n introspectedFields: FieldIntrospectionSchema[],\n overrideFields: FieldSchema[],\n strategy: MergeStrategy,\n): FieldSchema[] {\n const overrideMap = new Map(overrideFields.map((f) => [f.name, f]));\n const introspectedMap = new Map(introspectedFields.map((f) => [f.name, f]));\n\n const result: FieldSchema[] = [];\n\n // Process override fields first (preserving their order and properties)\n for (const override of overrideFields) {\n const introspected = introspectedMap.get(override.name);\n if (introspected) {\n // Field exists in both: override wins on all set properties\n result.push(override);\n } else {\n // YAML-only field (declarative): keep as-is\n result.push(override);\n }\n }\n\n // In 'extend' strategy, append introspected fields not present in overrides\n if (strategy === 'extend') {\n for (const introspected of introspectedFields) {\n if (!overrideMap.has(introspected.name)) {\n result.push(fieldFromIntrospection(introspected));\n }\n }\n }\n\n return result;\n}\n\nfunction detectSoftDelete(\n fields: FieldIntrospectionSchema[],\n): SoftDeleteConfig | undefined {\n const PRIORITY = ['deleted_at', 'deletedat', 'is_deleted', 'isdeleted', 'deleted', 'is_active', 'isactive', 'active'];\n for (const candidate of PRIORITY) {\n const field = fields.find((f) => f.name.toLowerCase() === candidate && f.candidateForSoftDelete);\n if (field) {\n const fn = field.name.toLowerCase();\n if (fn === 'deleted_at' || fn === 'deletedat') {\n return { field: field.name, activeValue: null, inactiveValue: 'timestamp' };\n }\n if (fn === 'is_deleted' || fn === 'isdeleted' || fn === 'deleted') {\n return { field: field.name, activeValue: false, inactiveValue: true };\n }\n return { field: field.name, activeValue: true, inactiveValue: false };\n }\n }\n return undefined;\n}\n\nfunction detectSearchConfig(fields: FieldIntrospectionSchema[]): { fields: string[] } | undefined {\n const searchFields = fields\n .filter((f) => f.candidateForSearch)\n .map((f) => f.name);\n return searchFields.length > 0 ? { fields: searchFields } : undefined;\n}\n\nfunction entityFromIntrospection(\n entity: EntityIntrospectionSchema,\n datasource: string,\n): EntitySchema {\n const pk = entity.fields.find((f) => f.isPrimaryKey)?.name ?? 'id';\n const displayField = detectDisplayField(entity.fields);\n const softDelete = detectSoftDelete(entity.fields);\n const search = detectSearchConfig(entity.fields);\n\n return {\n id: tableNameToEntityId(entity.table),\n label: tableNameToLabel(entity.table),\n source: {\n datasource,\n table: entity.table,\n primaryKey: pk,\n },\n displayField,\n fields: entity.fields.map(fieldFromIntrospection),\n ...(softDelete && { softDelete }),\n ...(search && { search }),\n };\n}\n\nfunction mergeEntity(\n introspected: EntityIntrospectionSchema,\n override: EntitySchema,\n strategy: MergeStrategy,\n): EntitySchema {\n return {\n ...override,\n fields: mergeFields(introspected.fields, override.fields, strategy),\n };\n}\n\nfunction introspectedRelationToSchema(\n rel: RelationIntrospectionSchema,\n entityIdByTable: Map<string, string>,\n): RelationSchema | null {\n const fromEntity = entityIdByTable.get(rel.from.table);\n const toEntity = entityIdByTable.get(rel.to.table);\n if (!fromEntity || !toEntity) return null;\n return {\n id: rel.id,\n type: rel.type,\n from: { entity: fromEntity, field: rel.from.field },\n to: { entity: toEntity, field: rel.to.field },\n label: `${tableNameToLabel(rel.to.table).plural}`,\n };\n}\n\nexport function mergeIntrospectionWithOverrides(\n options: MergeIntrospectionOptions,\n): MaestroConfig {\n const { introspection, overrides, datasources, defaultDatasource, strategy = 'extend' } = options;\n\n // Build lookup maps\n const overrideByTable = new Map<string, EntitySchema>();\n const overrideById = new Map<string, EntitySchema>();\n for (const entity of overrides.entities) {\n overrideByTable.set(entity.source.table, entity);\n overrideById.set(entity.id, entity);\n }\n\n const entityIdByTable = new Map<string, string>();\n const mergedEntities: EntitySchema[] = [];\n const handledOverrideIds = new Set<string>();\n\n // Process introspected entities\n for (const introspectedEntity of introspection.entities) {\n const override =\n overrideByTable.get(introspectedEntity.table) ??\n overrideById.get(tableNameToEntityId(introspectedEntity.table));\n\n if (override) {\n handledOverrideIds.add(override.id);\n mergedEntities.push(mergeEntity(introspectedEntity, override, strategy));\n entityIdByTable.set(introspectedEntity.table, override.id);\n } else {\n const generated = entityFromIntrospection(introspectedEntity, defaultDatasource);\n mergedEntities.push(generated);\n entityIdByTable.set(introspectedEntity.table, generated.id);\n }\n }\n\n // Keep purely declarative entities not matched by any introspected table\n for (const override of overrides.entities) {\n if (!handledOverrideIds.has(override.id)) {\n mergedEntities.push(override);\n }\n }\n\n // Process relations\n const overrideRelationIds = new Set(overrides.relations.map((r) => r.id));\n const mergedRelations: RelationSchema[] = [...overrides.relations];\n\n for (const rel of introspection.relations) {\n if (!overrideRelationIds.has(rel.id)) {\n const schema = introspectedRelationToSchema(rel, entityIdByTable);\n if (schema) mergedRelations.push(schema);\n }\n }\n\n return {\n datasources,\n entities: mergedEntities,\n relations: mergedRelations,\n policies: overrides.policies,\n operations: options.operations,\n audit: options.audit,\n logger: options.logger,\n };\n}\n","import type { IntrospectionProvider } from '../introspection/IntrospectionProvider.js';\nimport type { LoadedConfig } from '../config-loader/MaestroFileLoader.js';\nimport type { DatasourceProvider } from '../datasource/DatasourceProvider.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { AuditRepository } from '../audit/AuditRepository.js';\nimport type { Logger } from '../logging/Logger.js';\nimport type { RbacPolicy } from '../rbac/RbacPolicy.js';\nimport type { MergeStrategy } from '../hybrid-loader/HybridLoader.js';\nimport { mergeIntrospectionWithOverrides } from '../hybrid-loader/HybridLoader.js';\nimport { createMaestro } from './createMaestro.js';\nimport type { MaestroEngine } from './MaestroEngine.js';\n\nexport interface CreateMaestroFromIntrospectionOptions {\n provider: IntrospectionProvider;\n overrides?: LoadedConfig;\n mergeStrategy?: MergeStrategy;\n datasources?: Record<string, DatasourceProvider>;\n defaultDatasource?: string;\n policies?: RbacPolicy;\n operations?: OperationDef[];\n audit?: AuditRepository;\n logger?: Logger;\n}\n\nexport async function createMaestroFromIntrospection(\n options: CreateMaestroFromIntrospectionOptions,\n): Promise<MaestroEngine> {\n const introspection = await options.provider.introspect();\n\n const overrides = options.overrides ?? { entities: [], relations: [] };\n const datasources = options.datasources ?? {};\n const defaultDatasource = options.defaultDatasource ?? '';\n\n const config = mergeIntrospectionWithOverrides({\n introspection,\n overrides,\n datasources,\n defaultDatasource,\n strategy: options.mergeStrategy ?? 'extend',\n operations: options.operations,\n audit: options.audit,\n logger: options.logger,\n });\n\n if (options.policies) {\n config.policies = options.policies;\n }\n\n return createMaestro(config);\n}\n","import type { QueryInput } from '../query/QueryInput.js';\nimport type { FilterDescriptor } from '../query/FilterDescriptor.js';\nimport type { SortDescriptor } from '../query/SortDescriptor.js';\nimport type { FilterOperator } from '../query/FilterOperator.js';\nimport type { PagePagination, OffsetPagination, CursorPagination } from '../query/PaginationInput.js';\n\nconst VALID_OPERATORS = new Set<FilterOperator>([\n 'equals', 'notEquals', 'contains', 'startsWith', 'endsWith',\n 'in', 'notIn', 'gt', 'gte', 'lt', 'lte', 'between',\n 'isNull', 'isNotNull', 'isTrue', 'isFalse',\n]);\n\nfunction parseStr(val: string | string[] | undefined): string | undefined {\n return Array.isArray(val) ? val[0] : val;\n}\n\nfunction parseNum(val: string | string[] | undefined): number | undefined {\n const s = parseStr(val);\n if (!s) return undefined;\n const n = Number(s);\n return Number.isNaN(n) ? undefined : n;\n}\n\nfunction parseFilterValue(operator: FilterOperator, value: string | undefined): unknown {\n if (value === undefined) return undefined;\n if (operator === 'in' || operator === 'notIn') return value.split(',');\n if (operator === 'between') {\n const [from, to] = value.split(',');\n return [from, to];\n }\n return value;\n}\n\nexport function parseQueryInput(query: Record<string, string | string[]>): QueryInput {\n const result: QueryInput = {};\n\n const filterParam = query['filter'] ?? query['filters'];\n if (filterParam) {\n const rawFilters = Array.isArray(filterParam) ? filterParam : [filterParam];\n const filters: FilterDescriptor[] = [];\n for (const raw of rawFilters) {\n const colonIdx = raw.indexOf(':');\n if (colonIdx === -1) continue;\n const field = raw.slice(0, colonIdx);\n const rest = raw.slice(colonIdx + 1);\n const colonIdx2 = rest.indexOf(':');\n const op = colonIdx2 === -1 ? rest : rest.slice(0, colonIdx2);\n const valueRaw = colonIdx2 === -1 ? undefined : rest.slice(colonIdx2 + 1);\n if (!field || !VALID_OPERATORS.has(op as FilterOperator)) continue;\n const operator = op as FilterOperator;\n filters.push({ field, operator, value: parseFilterValue(operator, valueRaw) });\n }\n if (filters.length > 0) result.filters = filters;\n }\n\n const sortParam = query['sort'];\n if (sortParam) {\n const rawSorts = Array.isArray(sortParam) ? sortParam : [sortParam];\n const sort: SortDescriptor[] = [];\n for (const raw of rawSorts) {\n const colonIdx = raw.indexOf(':');\n const field = colonIdx === -1 ? raw : raw.slice(0, colonIdx);\n const direction = colonIdx === -1 ? 'asc' : raw.slice(colonIdx + 1);\n if (!field) continue;\n sort.push({ field, direction: direction === 'desc' ? 'desc' : 'asc' });\n }\n if (sort.length > 0) result.sort = sort;\n }\n\n const page = parseNum(query['page']);\n const pageSize = parseNum(query['pageSize']);\n const offset = parseNum(query['offset']);\n const limit = parseNum(query['limit']);\n const cursor = parseStr(query['cursor']);\n\n if (page !== undefined) {\n const pagination: PagePagination = { strategy: 'page', page, pageSize: pageSize ?? 20 };\n result.pagination = pagination;\n } else if (offset !== undefined) {\n const pagination: OffsetPagination = { strategy: 'offset', offset, limit: limit ?? 20 };\n result.pagination = pagination;\n } else if (cursor !== undefined) {\n const pagination: CursorPagination = { strategy: 'cursor', cursor, limit: limit ?? 20 };\n result.pagination = pagination;\n }\n\n const searchTerm = parseStr(query['search']);\n if (searchTerm) {\n const searchFields = parseStr(query['searchFields']);\n result.search = {\n term: searchTerm,\n fields: searchFields ? searchFields.split(',') : [],\n };\n }\n\n return result;\n}\n","import type { MaestroEngine } from '../engine/MaestroEngine.js';\nimport type { MaestroHttpHandler, MaestroHttpResponse } from './MaestroHttpContract.js';\nimport type { MaestroHttpOptions } from './ActorResolver.js';\nimport type { MaestroHttpHandlers } from './HttpHandlers.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport { parseQueryInput } from './QueryStringParser.js';\n\nconst HTTP_STATUS: Record<ErrorCode, number> = {\n [ErrorCode.PERMISSION_DENIED]: 403,\n [ErrorCode.NOT_FOUND]: 404,\n [ErrorCode.CONFLICT]: 409,\n [ErrorCode.VALIDATION_ERROR]: 400,\n [ErrorCode.CONFIGURATION_ERROR]: 400,\n [ErrorCode.INTERNAL_ERROR]: 500,\n};\n\nfunction errorResponse(err: unknown): MaestroHttpResponse {\n if (err instanceof MaestroError) {\n return {\n status: HTTP_STATUS[err.code] ?? 500,\n body: { error: err.code, message: err.message },\n };\n }\n const message = err instanceof Error ? err.message : 'Internal server error';\n return { status: 500, body: { error: 'INTERNAL_ERROR', message } };\n}\n\nexport function createMaestroHttpHandlers(\n engine: MaestroEngine,\n options: MaestroHttpOptions,\n): MaestroHttpHandlers {\n const resolve = options.actorResolver;\n\n const list: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const result = await engine.list(req.params['entity']!, parseQueryInput(req.query), actor);\n return { status: 200, body: result };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const findById: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const record = await engine.findById(req.params['entity']!, req.params['id']!, actor);\n if (!record) {\n return { status: 404, body: { error: 'NOT_FOUND', message: `Record '${req.params['id']}' not found.` } };\n }\n return { status: 200, body: record };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const create: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const created = await engine.create(req.params['entity']!, req.body as Record<string, unknown>, actor);\n return { status: 201, body: created };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const update: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const updated = await engine.update(\n req.params['entity']!,\n req.params['id']!,\n req.body as Record<string, unknown>,\n actor,\n );\n return { status: 200, body: updated };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const clone: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const cloned = await engine.clone(req.params['entity']!, req.params['id']!, actor);\n return { status: 201, body: cloned };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const softDelete: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n await engine.softDelete(req.params['entity']!, req.params['id']!, actor);\n return { status: 204, body: null };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const restore: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n await engine.restore(req.params['entity']!, req.params['id']!, actor);\n return { status: 200, body: { success: true } };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const hardDelete: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n await engine.hardDelete(req.params['entity']!, req.params['id']!, actor);\n return { status: 204, body: null };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const exportHandler: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const rawFormat = Array.isArray(req.query['format']) ? req.query['format'][0] : req.query['format'];\n const format = rawFormat === 'json' ? ('json' as const) : ('csv' as const);\n const exportResult = await engine.export(req.params['entity']!, parseQueryInput(req.query), actor, format);\n return {\n status: 200,\n body: exportResult.data,\n headers: {\n 'Content-Type': exportResult.mimeType,\n 'Content-Disposition': `attachment; filename=\"${exportResult.filename}\"`,\n },\n };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const executeOperation: MaestroHttpHandler = async (req) => {\n try {\n const { actor, correlationId } = await resolve(req);\n const body = (req.body ?? {}) as Record<string, unknown>;\n const result = await engine.executeOperation(\n req.params['operationId']!,\n {\n actor,\n correlationId,\n entityId: body['entityId'] as string | undefined,\n record: body['record'] as Record<string, unknown> | undefined,\n input: body['input'],\n },\n actor,\n );\n return { status: result.success ? 200 : 422, body: result };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const getMetadata: MaestroHttpHandler = async () => {\n return { status: 200, body: engine.getMetadata() };\n };\n\n const getEntityMetadata: MaestroHttpHandler = async (req) => {\n const entityId = req.params['entity']!;\n const meta = engine.getMetadata();\n const entity = meta.entities.find((e) => e.id === entityId);\n if (!entity) {\n return { status: 404, body: { error: 'NOT_FOUND', message: `Entity '${entityId}' not found.` } };\n }\n return { status: 200, body: entity };\n };\n\n const health: MaestroHttpHandler = async () => {\n return { status: 200, body: { status: 'ok' } };\n };\n\n return {\n list,\n findById,\n create,\n update,\n clone,\n softDelete,\n restore,\n hardDelete,\n export: exportHandler,\n executeOperation,\n getMetadata,\n getEntityMetadata,\n health,\n };\n}\n","import { readFile, readdir, access } from 'node:fs/promises';\nimport { join, extname } from 'node:path';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { RbacPolicy } from '../rbac/RbacPolicy.js';\nimport type { YamlParser } from './YamlParser.js';\n\nexport interface FileSystemReader {\n readFile(path: string): Promise<string>;\n readDir(path: string): Promise<string[]>;\n exists(path: string): Promise<boolean>;\n}\n\nexport interface MaestroFileLoaderOptions {\n rootDir: string;\n yamlParser?: YamlParser;\n fileReader?: FileSystemReader;\n}\n\nexport interface LoadedConfig {\n entities: EntitySchema[];\n relations: RelationSchema[];\n policies?: RbacPolicy;\n}\n\nconst defaultFileReader: FileSystemReader = {\n readFile: (p) => readFile(p, 'utf-8'),\n readDir: async (p) => {\n const entries = await readdir(p, { withFileTypes: true });\n return entries.filter((e) => e.isFile()).map((e) => e.name);\n },\n exists: async (p) => {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n },\n};\n\nfunction parseContent(content: string, ext: string, yamlParser?: YamlParser): unknown {\n if (ext === '.yml' || ext === '.yaml') {\n if (!yamlParser) {\n throw new Error(\n 'YAML files require a yamlParser option. Install js-yaml and pass { parse: jsYaml.load } as yamlParser.',\n );\n }\n return yamlParser.parse(content);\n }\n return JSON.parse(content) as unknown;\n}\n\nasync function readAllInDir(\n dir: string,\n suffix: string,\n reader: FileSystemReader,\n yamlParser?: YamlParser,\n): Promise<unknown[]> {\n const exists = await reader.exists(dir);\n if (!exists) return [];\n\n const files = await reader.readDir(dir);\n const matched = files.filter(\n (f) =>\n f.endsWith(`${suffix}.json`) ||\n f.endsWith(`${suffix}.yml`) ||\n f.endsWith(`${suffix}.yaml`),\n );\n\n const results: unknown[] = [];\n for (const f of matched) {\n const content = await reader.readFile(join(dir, f));\n results.push(parseContent(content, extname(f), yamlParser));\n }\n return results;\n}\n\nexport async function loadMaestroConfig(options: MaestroFileLoaderOptions): Promise<LoadedConfig> {\n const reader = options.fileReader ?? defaultFileReader;\n const { rootDir, yamlParser } = options;\n\n const [entitiesRaw, relationsRaw] = await Promise.all([\n readAllInDir(join(rootDir, 'entities'), '.entity', reader, yamlParser),\n readAllInDir(join(rootDir, 'relations'), '.relation', reader, yamlParser),\n ]);\n\n let policies: RbacPolicy | undefined;\n const policyCandidates = [\n 'policies/rbac.policy.json',\n 'policies/rbac.policy.yml',\n 'policies/rbac.policy.yaml',\n ];\n for (const candidate of policyCandidates) {\n const fullPath = join(rootDir, candidate);\n if (await reader.exists(fullPath)) {\n const content = await reader.readFile(fullPath);\n policies = parseContent(content, extname(candidate), yamlParser) as RbacPolicy;\n break;\n }\n }\n\n return {\n entities: entitiesRaw as EntitySchema[],\n relations: relationsRaw as RelationSchema[],\n policies,\n };\n}\n","import type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type {\n EntityIntrospectionSchema,\n FieldIntrospectionSchema,\n RelationIntrospectionSchema,\n} from '../introspection/IntrospectionResult.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { SoftDeleteConfig } from '../metadata/SoftDeleteConfig.js';\nimport {\n tableNameToEntityId,\n tableNameToLabel,\n detectDisplayField,\n humanizeFieldName,\n} from '../introspection/utils.js';\n\nexport interface GeneratedConfig {\n entities: Record<string, EntitySchema>;\n relations: Record<string, RelationSchema>;\n}\n\nfunction detectSoftDelete(fields: FieldIntrospectionSchema[]): SoftDeleteConfig | undefined {\n const PRIORITY = [\n 'deleted_at', 'deletedat',\n 'is_deleted', 'isdeleted', 'deleted',\n 'is_active', 'isactive', 'active',\n ];\n for (const candidate of PRIORITY) {\n const field = fields.find(\n (f) => f.name.toLowerCase() === candidate && f.candidateForSoftDelete,\n );\n if (!field) continue;\n const fn = field.name.toLowerCase();\n if (fn === 'deleted_at' || fn === 'deletedat') {\n return { field: field.name, activeValue: null, inactiveValue: 'timestamp' };\n }\n if (fn === 'is_deleted' || fn === 'isdeleted' || fn === 'deleted') {\n return { field: field.name, activeValue: false, inactiveValue: true };\n }\n return { field: field.name, activeValue: true, inactiveValue: false };\n }\n return undefined;\n}\n\nfunction fieldToSchema(field: FieldIntrospectionSchema): FieldSchema {\n return {\n name: field.name,\n label: humanizeFieldName(field.name),\n type: field.type,\n required: !field.nullable && !field.isPrimaryKey,\n readonly: field.isPrimaryKey,\n hidden: field.isPrimaryKey,\n searchable: field.candidateForSearch ?? false,\n sortable: !field.isPrimaryKey && !field.isTimestamp,\n filterable: field.isIndexed ?? false,\n exportable: !field.isPrimaryKey,\n };\n}\n\nexport function generateEntityConfig(\n entity: EntityIntrospectionSchema,\n datasource: string,\n): EntitySchema {\n const pk = entity.fields.find((f) => f.isPrimaryKey)?.name ?? 'id';\n const displayField = detectDisplayField(entity.fields);\n const softDelete = detectSoftDelete(entity.fields);\n const searchFields = entity.fields\n .filter((f) => f.candidateForSearch)\n .map((f) => f.name);\n\n return {\n id: tableNameToEntityId(entity.table),\n label: tableNameToLabel(entity.table),\n source: {\n datasource,\n table: entity.table,\n primaryKey: pk,\n },\n ...(displayField && { displayField }),\n fields: entity.fields.map(fieldToSchema),\n ...(softDelete && { softDelete }),\n ...(searchFields.length > 0 && { search: { fields: searchFields } }),\n };\n}\n\nexport function generateRelationConfig(\n relation: RelationIntrospectionSchema,\n entityIdByTable: Map<string, string>,\n): RelationSchema | null {\n const fromEntity = entityIdByTable.get(relation.from.table);\n const toEntity = entityIdByTable.get(relation.to.table);\n if (!fromEntity || !toEntity) return null;\n return {\n id: relation.id,\n type: relation.type,\n from: { entity: fromEntity, field: relation.from.field },\n to: { entity: toEntity, field: relation.to.field },\n label: tableNameToLabel(relation.to.table).plural,\n };\n}\n\nexport function generateAllConfigs(\n result: IntrospectionResult,\n datasource: string,\n): GeneratedConfig {\n const entities: Record<string, EntitySchema> = {};\n const entityIdByTable = new Map<string, string>();\n\n for (const entity of result.entities) {\n const schema = generateEntityConfig(entity, datasource);\n entities[schema.id] = schema;\n entityIdByTable.set(entity.table, schema.id);\n }\n\n const relations: Record<string, RelationSchema> = {};\n for (const relation of result.relations) {\n const schema = generateRelationConfig(relation, entityIdByTable);\n if (schema) relations[schema.id] = schema;\n }\n\n return { entities, relations };\n}\n","import type {\n IntrospectionResult,\n FieldIntrospectionSchema,\n} from '../introspection/IntrospectionResult.js';\nimport { tableNameToLabel } from '../introspection/utils.js';\nimport type {\n DiffChange,\n FieldDiffChange,\n IntrospectionDiff,\n ImpactLevel,\n} from './DiffChange.js';\n\nexport interface DiffEngineOptions {\n /**\n * Optional explicit label maps (table → label) for detecting label changes\n * across two introspection snapshots. When omitted, labels are derived\n * from table names via tableNameToLabel — making entity_label_changed\n * only fire when the table name itself changes its derived label.\n */\n previousEntityLabels?: Map<string, string>;\n currentEntityLabels?: Map<string, string>;\n}\n\nexport class DiffEngine {\n compare(\n previous: IntrospectionResult,\n current: IntrospectionResult,\n options: DiffEngineOptions = {},\n ): IntrospectionDiff {\n const changes: DiffChange[] = [];\n\n const prevEntityMap = new Map(previous.entities.map((e) => [e.table, e]));\n const currEntityMap = new Map(current.entities.map((e) => [e.table, e]));\n\n for (const [table, entity] of currEntityMap) {\n if (!prevEntityMap.has(table)) {\n changes.push({\n category: 'entity',\n kind: 'entity_added',\n impact: 'SAFE',\n entityTable: table,\n current: entity,\n });\n }\n }\n\n for (const [table, entity] of prevEntityMap) {\n if (!currEntityMap.has(table)) {\n changes.push({\n category: 'entity',\n kind: 'entity_removed',\n impact: 'BREAKING',\n entityTable: table,\n previous: entity,\n });\n }\n }\n\n for (const [table, prevEntity] of prevEntityMap) {\n const currEntity = currEntityMap.get(table);\n if (!currEntity) continue;\n\n const prevLabel =\n options.previousEntityLabels?.get(table) ??\n tableNameToLabel(prevEntity.table).singular;\n const currLabel =\n options.currentEntityLabels?.get(table) ??\n tableNameToLabel(currEntity.table).singular;\n\n if (prevLabel !== currLabel) {\n changes.push({\n category: 'entity',\n kind: 'entity_label_changed',\n impact: 'WARNING',\n entityTable: table,\n previous: prevLabel,\n current: currLabel,\n });\n }\n\n const prevPk = prevEntity.fields.find((f) => f.isPrimaryKey)?.name;\n const currPk = currEntity.fields.find((f) => f.isPrimaryKey)?.name;\n if (prevPk !== currPk) {\n changes.push({\n category: 'entity',\n kind: 'entity_primary_key_changed',\n impact: 'BREAKING',\n entityTable: table,\n previous: prevPk,\n current: currPk,\n });\n }\n\n changes.push(...this.compareFields(table, prevEntity.fields, currEntity.fields));\n }\n\n const prevRelMap = new Map(previous.relations.map((r) => [r.id, r]));\n const currRelMap = new Map(current.relations.map((r) => [r.id, r]));\n\n for (const [id, rel] of currRelMap) {\n if (!prevRelMap.has(id)) {\n changes.push({\n category: 'relation',\n kind: 'relation_added',\n impact: 'SAFE',\n relationId: id,\n current: rel,\n });\n }\n }\n\n for (const [id, rel] of prevRelMap) {\n if (!currRelMap.has(id)) {\n changes.push({\n category: 'relation',\n kind: 'relation_removed',\n impact: 'BREAKING',\n relationId: id,\n previous: rel,\n });\n }\n }\n\n for (const [id, prevRel] of prevRelMap) {\n const currRel = currRelMap.get(id);\n if (!currRel) continue;\n\n if (prevRel.type !== currRel.type) {\n changes.push({\n category: 'relation',\n kind: 'relation_cardinality_changed',\n impact: 'BREAKING',\n relationId: id,\n previous: prevRel.type,\n current: currRel.type,\n });\n }\n\n if (\n prevRel.from.field !== currRel.from.field ||\n prevRel.to.field !== currRel.to.field\n ) {\n changes.push({\n category: 'relation',\n kind: 'relation_fields_changed',\n impact: 'BREAKING',\n relationId: id,\n previous: { from: prevRel.from.field, to: prevRel.to.field },\n current: { from: currRel.from.field, to: currRel.to.field },\n });\n }\n }\n\n const summary = {\n total: changes.length,\n safe: changes.filter((c) => c.impact === 'SAFE').length,\n warnings: changes.filter((c) => c.impact === 'WARNING').length,\n breaking: changes.filter((c) => c.impact === 'BREAKING').length,\n };\n\n return {\n changes,\n summary,\n hasBreaking: summary.breaking > 0,\n hasWarnings: summary.warnings > 0,\n };\n }\n\n private compareFields(\n entityTable: string,\n prevFields: FieldIntrospectionSchema[],\n currFields: FieldIntrospectionSchema[],\n ): FieldDiffChange[] {\n const changes: FieldDiffChange[] = [];\n const prevMap = new Map(prevFields.map((f) => [f.name, f]));\n const currMap = new Map(currFields.map((f) => [f.name, f]));\n\n for (const [name, field] of currMap) {\n if (!prevMap.has(name)) {\n changes.push({\n category: 'field',\n kind: 'field_added',\n impact: 'SAFE',\n entityTable,\n fieldName: name,\n current: field,\n });\n }\n }\n\n for (const [name, field] of prevMap) {\n if (!currMap.has(name)) {\n changes.push({\n category: 'field',\n kind: 'field_removed',\n impact: 'BREAKING',\n entityTable,\n fieldName: name,\n previous: field,\n });\n }\n }\n\n for (const [name, prevField] of prevMap) {\n const currField = currMap.get(name);\n if (!currField) continue;\n\n if (prevField.type !== currField.type) {\n changes.push({\n category: 'field',\n kind: 'field_type_changed',\n impact: 'BREAKING',\n entityTable,\n fieldName: name,\n previous: prevField.type,\n current: currField.type,\n });\n }\n\n if (prevField.nullable !== currField.nullable) {\n // false→true: was required, now optional = SAFE (more permissive)\n // true→false: was optional, now required = BREAKING (less permissive)\n const impact: ImpactLevel =\n !prevField.nullable && currField.nullable ? 'SAFE' : 'BREAKING';\n changes.push({\n category: 'field',\n kind: 'field_nullable_changed',\n impact,\n entityTable,\n fieldName: name,\n previous: prevField.nullable,\n current: currField.nullable,\n });\n }\n\n const wasIndexed = prevField.isIndexed ?? false;\n const isIndexed = currField.isIndexed ?? false;\n if (wasIndexed !== isIndexed) {\n if (isIndexed) {\n changes.push({\n category: 'field',\n kind: 'field_index_added',\n impact: 'SAFE',\n entityTable,\n fieldName: name,\n previous: false,\n current: true,\n });\n } else {\n changes.push({\n category: 'field',\n kind: 'field_index_removed',\n impact: 'WARNING',\n entityTable,\n fieldName: name,\n previous: true,\n current: false,\n });\n }\n }\n\n const prevMeta = {\n candidateForSearch: prevField.candidateForSearch ?? false,\n candidateForSoftDelete: prevField.candidateForSoftDelete ?? false,\n };\n const currMeta = {\n candidateForSearch: currField.candidateForSearch ?? false,\n candidateForSoftDelete: currField.candidateForSoftDelete ?? false,\n };\n if (\n prevMeta.candidateForSearch !== currMeta.candidateForSearch ||\n prevMeta.candidateForSoftDelete !== currMeta.candidateForSoftDelete\n ) {\n changes.push({\n category: 'field',\n kind: 'field_metadata_changed',\n impact: 'WARNING',\n entityTable,\n fieldName: name,\n previous: prevMeta,\n current: currMeta,\n });\n }\n }\n\n return changes;\n }\n}\n","import type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type { IntrospectionDiff, DiffChange } from '../diff/DiffChange.js';\nimport type {\n IntrospectionReport,\n IntrospectionReportChange,\n IntrospectionReportStats,\n} from './IntrospectionReport.js';\n\nexport class ReportGenerator {\n generate(result: IntrospectionResult, diff?: IntrospectionDiff): IntrospectionReport {\n const completedAt = new Date().toISOString();\n const hasDiff = diff !== undefined;\n\n const stats: IntrospectionReportStats = {\n entitiesDiscovered: result.entities.length,\n relationsDiscovered: result.relations.length,\n totalChanges: diff?.summary.total ?? 0,\n safeChanges: diff?.summary.safe ?? 0,\n warnings: diff?.summary.warnings ?? 0,\n breakingChanges: diff?.summary.breaking ?? 0,\n };\n\n const changes: IntrospectionReportChange[] = hasDiff\n ? diff!.changes.map((c) => this.describeChange(c))\n : [];\n\n const text = this.generateText(stats, changes, hasDiff);\n\n return { completedAt, stats, changes, hasDiff, text };\n }\n\n private describeChange(change: DiffChange): IntrospectionReportChange {\n switch (change.category) {\n case 'entity': {\n switch (change.kind) {\n case 'entity_added':\n return {\n impact: 'SAFE',\n description: `Entity \"${change.entityTable}\" added`,\n };\n case 'entity_removed':\n return {\n impact: 'BREAKING',\n description: `Entity \"${change.entityTable}\" removed`,\n recommendation: `Ensure all consumers of \"${change.entityTable}\" are updated before deploying.`,\n };\n case 'entity_label_changed':\n return {\n impact: 'WARNING',\n description: `Entity \"${change.entityTable}\" label changed: \"${change.previous}\" → \"${change.current}\"`,\n recommendation: 'Update UI labels and documentation to reflect the new entity name.',\n };\n case 'entity_primary_key_changed':\n return {\n impact: 'BREAKING',\n description: `Entity \"${change.entityTable}\" primary key changed: \"${change.previous}\" → \"${change.current}\"`,\n recommendation:\n 'This is a destructive change. Review all queries and foreign key references before deploying.',\n };\n }\n break;\n }\n case 'field': {\n switch (change.kind) {\n case 'field_added':\n return {\n impact: 'SAFE',\n description: `Field \"${change.entityTable}.${change.fieldName}\" added`,\n };\n case 'field_removed':\n return {\n impact: 'BREAKING',\n description: `Field \"${change.entityTable}.${change.fieldName}\" removed`,\n recommendation: `Remove all references to \"${change.fieldName}\" in \"${change.entityTable}\" before deploying.`,\n };\n case 'field_type_changed':\n return {\n impact: 'BREAKING',\n description: `Field \"${change.entityTable}.${change.fieldName}\" changed type: ${change.previous} → ${change.current}`,\n recommendation:\n 'Verify that existing data can be migrated to the new type and that all consumers handle the new type.',\n };\n case 'field_nullable_changed':\n if (!change.previous && change.current) {\n return {\n impact: 'SAFE',\n description: `Field \"${change.entityTable}.${change.fieldName}\" is now optional (was required)`,\n };\n }\n return {\n impact: 'BREAKING',\n description: `Field \"${change.entityTable}.${change.fieldName}\" is now required (was optional)`,\n recommendation:\n 'Ensure existing rows have values for this field before deploying the migration.',\n };\n case 'field_index_added':\n return {\n impact: 'SAFE',\n description: `Index added to field \"${change.entityTable}.${change.fieldName}\"`,\n };\n case 'field_index_removed':\n return {\n impact: 'WARNING',\n description: `Index removed from field \"${change.entityTable}.${change.fieldName}\"`,\n recommendation:\n 'Removing indexes may degrade query performance. Review affected queries.',\n };\n case 'field_metadata_changed':\n return {\n impact: 'WARNING',\n description: `Derived metadata changed for field \"${change.entityTable}.${change.fieldName}\"`,\n };\n }\n break;\n }\n case 'relation': {\n switch (change.kind) {\n case 'relation_added':\n return {\n impact: 'SAFE',\n description: `Relation \"${change.relationId}\" added`,\n };\n case 'relation_removed':\n return {\n impact: 'BREAKING',\n description: `Relation \"${change.relationId}\" removed`,\n recommendation: `Update all code that references relation \"${change.relationId}\".`,\n };\n case 'relation_cardinality_changed':\n return {\n impact: 'BREAKING',\n description: `Relation \"${change.relationId}\" cardinality changed: ${change.previous} → ${change.current}`,\n recommendation:\n 'Verify data integrity and update all query logic that depends on this relation.',\n };\n case 'relation_fields_changed': {\n const prev = change.previous as { from: string; to: string } | undefined;\n const curr = change.current as { from: string; to: string } | undefined;\n return {\n impact: 'BREAKING',\n description: `Relation \"${change.relationId}\" participating fields changed (from: ${prev?.from} → ${curr?.from}, to: ${prev?.to} → ${curr?.to})`,\n recommendation: 'Review all JOIN logic and foreign key constraints for this relation.',\n };\n }\n }\n break;\n }\n }\n return { impact: 'WARNING', description: 'Unknown change detected' };\n }\n\n private generateText(\n stats: IntrospectionReportStats,\n changes: IntrospectionReportChange[],\n hasDiff: boolean,\n ): string {\n const lines: string[] = [];\n\n lines.push('Introspection completed');\n lines.push('');\n lines.push(`Entities discovered: ${stats.entitiesDiscovered}`);\n lines.push(`Relations discovered: ${stats.relationsDiscovered}`);\n\n if (!hasDiff) {\n lines.push('');\n lines.push('No previous snapshot available for comparison.');\n return lines.join('\\n');\n }\n\n if (stats.totalChanges === 0) {\n lines.push('');\n lines.push('No changes detected since last snapshot.');\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(`Changes detected: ${stats.totalChanges}`);\n\n const safeChanges = changes.filter((c) => c.impact === 'SAFE');\n const warnings = changes.filter((c) => c.impact === 'WARNING');\n const breaking = changes.filter((c) => c.impact === 'BREAKING');\n\n if (safeChanges.length > 0) {\n lines.push('');\n lines.push('SAFE:');\n for (const c of safeChanges) {\n lines.push(`- ${c.description}`);\n }\n }\n\n if (warnings.length > 0) {\n lines.push('');\n lines.push('WARNINGS:');\n for (const c of warnings) {\n lines.push(`- ${c.description}`);\n if (c.recommendation) lines.push(` → ${c.recommendation}`);\n }\n }\n\n if (breaking.length > 0) {\n lines.push('');\n lines.push('BREAKING:');\n for (const c of breaking) {\n lines.push(`- ${c.description}`);\n if (c.recommendation) lines.push(` → ${c.recommendation}`);\n }\n }\n\n return lines.join('\\n');\n }\n}\n","import type { SnapshotRepository } from './SnapshotRepository.js';\nimport type { IntrospectionSnapshot } from './IntrospectionSnapshot.js';\n\nexport class InMemorySnapshotRepository implements SnapshotRepository {\n private readonly store = new Map<string, IntrospectionSnapshot>();\n\n async save(snapshot: IntrospectionSnapshot): Promise<void> {\n this.store.set(snapshot.id, snapshot);\n }\n\n async load(id: string): Promise<IntrospectionSnapshot | null> {\n return this.store.get(id) ?? null;\n }\n}\n","import type { IntrospectionProvider } from '../introspection/IntrospectionProvider.js';\nimport type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type { LoadedConfig } from '../config-loader/MaestroFileLoader.js';\nimport type { DatasourceProvider } from '../datasource/DatasourceProvider.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { AuditRepository } from '../audit/AuditRepository.js';\nimport type { Logger } from '../logging/Logger.js';\nimport type { RbacPolicy } from '../rbac/RbacPolicy.js';\nimport type { MergeStrategy } from '../hybrid-loader/HybridLoader.js';\nimport type { IntrospectionDiff } from '../diff/DiffChange.js';\nimport type { IntrospectionReport } from '../introspection-report/IntrospectionReport.js';\nimport type { IntrospectionSnapshot } from '../snapshot/IntrospectionSnapshot.js';\nimport type { SnapshotRepository } from '../snapshot/SnapshotRepository.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport { mergeIntrospectionWithOverrides } from '../hybrid-loader/HybridLoader.js';\nimport { MetadataEngine } from '../engine/MetadataEngine.js';\nimport { DiffEngine } from '../diff/DiffEngine.js';\nimport { ReportGenerator } from '../introspection-report/ReportGenerator.js';\n\nexport interface IntrospectionRuntimeRunOptions {\n provider: IntrospectionProvider;\n overrides?: LoadedConfig;\n mergeStrategy?: MergeStrategy;\n datasources?: Record<string, DatasourceProvider>;\n defaultDatasource?: string;\n /** ID of a previously saved snapshot to diff against */\n snapshotId?: string;\n /** Whether to automatically save the new snapshot after running. Defaults to true when a repository is configured. */\n saveSnapshot?: boolean;\n operations?: OperationDef[];\n audit?: AuditRepository;\n logger?: Logger;\n policies?: RbacPolicy;\n}\n\nexport interface IntrospectionRuntimeResult {\n metadata: MaestroMetadata;\n diff?: IntrospectionDiff;\n report: IntrospectionReport;\n snapshot: IntrospectionSnapshot;\n}\n\nlet _snapshotCounter = 0;\n\nfunction generateSnapshotId(): string {\n return `snapshot-${Date.now()}-${++_snapshotCounter}`;\n}\n\nexport class IntrospectionRuntime {\n private lastProvider?: IntrospectionProvider;\n\n constructor(private readonly snapshotRepository?: SnapshotRepository) {}\n\n async run(options: IntrospectionRuntimeRunOptions): Promise<IntrospectionRuntimeResult> {\n this.lastProvider = options.provider;\n\n const introspectionResult: IntrospectionResult = await options.provider.introspect();\n\n const snapshot: IntrospectionSnapshot = {\n id: generateSnapshotId(),\n timestamp: new Date().toISOString(),\n result: introspectionResult,\n };\n\n let diff: IntrospectionDiff | undefined;\n if (options.snapshotId && this.snapshotRepository) {\n const previous = await this.snapshotRepository.load(options.snapshotId);\n if (previous) {\n const engine = new DiffEngine();\n diff = engine.compare(previous.result, introspectionResult);\n }\n }\n\n const reportGenerator = new ReportGenerator();\n const report = reportGenerator.generate(introspectionResult, diff);\n\n const shouldSave = options.saveSnapshot !== false && this.snapshotRepository !== undefined;\n if (shouldSave) {\n await this.snapshotRepository!.save(snapshot);\n }\n\n const overrides = options.overrides ?? { entities: [], relations: [] };\n const datasources = options.datasources ?? {};\n const defaultDatasource = options.defaultDatasource ?? '';\n\n const config = mergeIntrospectionWithOverrides({\n introspection: introspectionResult,\n overrides,\n datasources,\n defaultDatasource,\n strategy: options.mergeStrategy ?? 'extend',\n operations: options.operations,\n audit: options.audit,\n logger: options.logger,\n });\n\n if (options.policies) {\n config.policies = options.policies;\n }\n\n const metadataEngine = new MetadataEngine();\n const metadata = metadataEngine.normalize(config);\n\n return { metadata, diff, report, snapshot };\n }\n\n async saveSnapshot(snapshot: IntrospectionSnapshot): Promise<void> {\n if (!this.snapshotRepository) {\n throw new Error(\n 'IntrospectionRuntime: no snapshotRepository configured. Pass one in the constructor.',\n );\n }\n await this.snapshotRepository.save(snapshot);\n }\n\n async loadSnapshot(id: string): Promise<IntrospectionSnapshot | null> {\n if (!this.snapshotRepository) return null;\n return this.snapshotRepository.load(id);\n }\n\n async compareWithSnapshot(\n snapshotId: string,\n provider?: IntrospectionProvider,\n ): Promise<IntrospectionDiff | null> {\n if (!this.snapshotRepository) return null;\n\n const resolvedProvider = provider ?? this.lastProvider;\n if (!resolvedProvider) {\n throw new Error(\n 'IntrospectionRuntime.compareWithSnapshot: a provider must be supplied or run() must have been called first.',\n );\n }\n\n const previous = await this.snapshotRepository.load(snapshotId);\n if (!previous) return null;\n\n const current = await resolvedProvider.introspect();\n const engine = new DiffEngine();\n return engine.compare(previous.result, current);\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nexport type CorrelationId = string;\n\nexport function generateCorrelationId(): CorrelationId {\n return randomUUID();\n}\n","import type { OperationalRisk } from './OperationalRisk.js';\nimport type { RiskClassifier, RiskClassificationInput } from './RiskClassifier.js';\n\nexport class MetadataRiskClassifier implements RiskClassifier {\n constructor(\n private readonly operationRiskMap: Record<string, OperationalRisk> = {},\n private readonly defaultRisk: OperationalRisk = 'LOW',\n ) {}\n\n classify(input: RiskClassificationInput): OperationalRisk {\n const fromMetadata = input.metadata?.['riskLevel'];\n if (isOperationalRisk(fromMetadata)) return fromMetadata;\n\n return this.operationRiskMap[input.operation] ?? this.defaultRisk;\n }\n}\n\nconst RISK_LEVELS: OperationalRisk[] = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];\n\nfunction isOperationalRisk(value: unknown): value is OperationalRisk {\n return typeof value === 'string' && (RISK_LEVELS as string[]).includes(value);\n}\n","import type { AuthorizationContext } from './AuthorizationContext.js';\nimport type { AuthorizationProvider } from './AuthorizationProvider.js';\nimport type { AuthorizationResult } from './AuthorizationResult.js';\nimport type { RbacPolicy } from '../rbac/index.js';\nimport { RbacEngine } from '../rbac/index.js';\n\nexport class ContextualAuthorizationEngine implements AuthorizationProvider {\n private readonly rbac: RbacEngine;\n\n constructor(\n policy: RbacPolicy,\n private readonly criticalOperations: ReadonlySet<string> = new Set(),\n ) {\n this.rbac = new RbacEngine(policy);\n }\n\n async evaluate(context: AuthorizationContext): Promise<AuthorizationResult> {\n if (!this.rbac.can(context.actor, context.operation)) {\n return { decision: 'DENY', reason: `Actor lacks permission for operation: ${context.operation}` };\n }\n\n const risk = context.riskLevel ?? 'LOW';\n if (risk === 'CRITICAL' || this.criticalOperations.has(context.operation)) {\n return { decision: 'REQUIRES_CONFIRMATION', reason: `Operation requires confirmation due to risk level: ${risk}` };\n }\n\n return { decision: 'ALLOW' };\n }\n}\n","import type { PolicyContext } from './PolicyContext.js';\nimport type { PolicyProvider } from './PolicyProvider.js';\nimport type { PolicyEvaluationResult } from './PolicyEvaluationResult.js';\nimport type { PolicyDecision } from './PolicyDecision.js';\nimport type { PolicyViolation } from './PolicyViolation.js';\n\nconst DECISION_PRIORITY: Record<PolicyDecision, number> = {\n ALLOW: 0,\n REQUIRES_CONFIRMATION: 1,\n DENY: 2,\n};\n\nexport class PolicyEngine {\n constructor(private readonly provider: PolicyProvider) {}\n\n evaluate(context: PolicyContext): PolicyEvaluationResult {\n const violations: PolicyViolation[] = [];\n let decision: PolicyDecision = 'ALLOW';\n let reason: string | undefined;\n\n for (const rule of this.provider.rules()) {\n const result = rule.evaluate(context);\n if (result === null) continue;\n\n if (DECISION_PRIORITY[result.decision] > DECISION_PRIORITY[decision]) {\n decision = result.decision;\n reason = result.reason;\n }\n\n if (result.decision === 'DENY' || result.decision === 'REQUIRES_CONFIRMATION') {\n violations.push({\n ruleId: rule.id,\n reason: result.reason,\n context,\n occurredAt: new Date(),\n });\n }\n }\n\n return { decision, violations, reason };\n }\n}\n","import type { PolicyRule } from './PolicyRule.js';\nimport type { PolicyProvider } from './PolicyProvider.js';\n\nexport class InMemoryPolicyProvider implements PolicyProvider {\n private readonly _rules: PolicyRule[];\n\n constructor(rules: PolicyRule[] = []) {\n this._rules = rules;\n }\n\n rules(): PolicyRule[] {\n return this._rules;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Actor, ResourceRef, Metadata } from '../types/index.js';\nimport type { ConfirmationRepository } from './ConfirmationRepository.js';\nimport type { ConfirmationRequest } from './ConfirmationRequest.js';\nimport { MaestroError } from '../errors/index.js';\nimport { ErrorCode } from '../errors/index.js';\n\nexport interface RequestConfirmationInput {\n operation: string;\n actor: Actor;\n resource?: ResourceRef;\n requiredApprovals?: number;\n metadata?: Metadata;\n correlationId?: string;\n expiresAt?: Date;\n}\n\nexport class ConfirmationEngine {\n constructor(private readonly repository: ConfirmationRepository) {}\n\n async request(input: RequestConfirmationInput): Promise<ConfirmationRequest> {\n const requiredApprovals = input.requiredApprovals ?? 1;\n const request: ConfirmationRequest = {\n id: randomUUID(),\n operation: input.operation,\n actor: input.actor,\n resource: input.resource,\n status: requiredApprovals > 1 ? 'AWAITING_CONFIRMATION' : 'REQUESTED',\n requiredApprovals,\n approvals: [],\n rejections: [],\n requestedAt: new Date(),\n expiresAt: input.expiresAt,\n metadata: input.metadata,\n correlationId: input.correlationId,\n };\n\n await this.repository.save(request);\n return request;\n }\n\n async approve(requestId: string, approver: Actor, comment?: string): Promise<ConfirmationRequest> {\n const request = await this.findOrThrow(requestId);\n this.assertActive(request);\n\n const updated: ConfirmationRequest = {\n ...request,\n approvals: [...request.approvals, { approver, approvedAt: new Date(), comment }],\n };\n\n const fullyApproved = updated.approvals.length >= updated.requiredApprovals;\n updated.status = fullyApproved ? 'APPROVED' : 'AWAITING_CONFIRMATION';\n\n await this.repository.save(updated);\n return updated;\n }\n\n async reject(requestId: string, approver: Actor, comment?: string): Promise<ConfirmationRequest> {\n const request = await this.findOrThrow(requestId);\n this.assertActive(request);\n\n const updated: ConfirmationRequest = {\n ...request,\n status: 'REJECTED',\n rejections: [...request.rejections, { approver, approvedAt: new Date(), comment }],\n };\n\n await this.repository.save(updated);\n return updated;\n }\n\n async execute(requestId: string): Promise<ConfirmationRequest> {\n const request = await this.findOrThrow(requestId);\n\n if (request.status !== 'APPROVED') {\n throw new MaestroError(\n ErrorCode.VALIDATION_ERROR,\n `Cannot execute confirmation request in status: ${request.status}`,\n );\n }\n\n const updated: ConfirmationRequest = {\n ...request,\n status: 'EXECUTED',\n executedAt: new Date(),\n };\n\n await this.repository.save(updated);\n return updated;\n }\n\n async getPending(): Promise<ConfirmationRequest[]> {\n return this.repository.listPending();\n }\n\n private async findOrThrow(requestId: string): Promise<ConfirmationRequest> {\n const request = await this.repository.findById(requestId);\n if (!request) {\n throw new MaestroError(\n ErrorCode.NOT_FOUND,\n `Confirmation request not found: ${requestId}`,\n );\n }\n return request;\n }\n\n private assertActive(request: ConfirmationRequest): void {\n const terminal: ConfirmationRequest['status'][] = ['APPROVED', 'REJECTED', 'EXECUTED', 'EXPIRED'];\n if (terminal.includes(request.status)) {\n throw new MaestroError(\n ErrorCode.VALIDATION_ERROR,\n `Confirmation request is already in terminal status: ${request.status}`,\n );\n }\n }\n}\n","import type { ConfirmationRepository } from './ConfirmationRepository.js';\nimport type { ConfirmationRequest } from './ConfirmationRequest.js';\n\nexport class InMemoryConfirmationRepository implements ConfirmationRepository {\n private readonly store = new Map<string, ConfirmationRequest>();\n\n async save(request: ConfirmationRequest): Promise<void> {\n this.store.set(request.id, request);\n }\n\n async findById(id: string): Promise<ConfirmationRequest | undefined> {\n return this.store.get(id);\n }\n\n async listPending(): Promise<ConfirmationRequest[]> {\n return Array.from(this.store.values()).filter(\n (r) => r.status === 'REQUESTED' || r.status === 'AWAITING_CONFIRMATION',\n );\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport type { EntityDeclaration } from '../EntityDeclaration.js';\nimport type { ConsumerDeclaration } from '../ConsumerDeclaration.js';\nimport type { YamlParser } from '../../config-loader/YamlParser.js';\nimport { validateEntityDeclaration, validateConsumerDeclaration } from '../DeclarativeValidator.js';\nimport { MaestroError } from '../../errors/MaestroError.js';\nimport { ErrorCode } from '../../errors/ErrorCode.js';\n\nexport type DeclarativeFileFormat = 'yaml' | 'json';\n\n/**\n * Canonical shape of a declarative config file — structurally identical to `DeclarativeConfig`,\n * so it can be passed directly as `createMaestro({ declarations })`.\n * `entities` defaults to `[]` when the file omits it.\n */\nexport interface DeclarativeFileConfig {\n entities: EntityDeclaration[];\n consumers?: ConsumerDeclaration[];\n}\n\nexport interface LoadDeclarativeConfigFromStringOptions {\n format: DeclarativeFileFormat;\n /** Required for `format: 'yaml'`. The core has no YAML runtime dependency — pass a parser (e.g. `{ parse: YAML.parse }` from the `yaml` package). */\n yamlParser?: YamlParser;\n /** Optional label (e.g. a file path) included in error messages to help pinpoint the source. */\n source?: string;\n}\n\nexport interface LoadDeclarativeConfigFromFileOptions {\n /** Overrides the format that would otherwise be detected from the file extension. */\n format?: DeclarativeFileFormat;\n yamlParser?: YamlParser;\n}\n\nconst KNOWN_KEYS = new Set(['entities', 'consumers']);\n\nfunction parseContent(\n content: string,\n format: DeclarativeFileFormat,\n yamlParser: YamlParser | undefined,\n source: string | undefined,\n): unknown {\n const origin = source ? ` (${source})` : '';\n\n if (format === 'yaml') {\n if (!yamlParser) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Cannot parse YAML declarative config${origin}: a \"yamlParser\" must be provided. ` +\n 'The core has no bundled YAML dependency — install a YAML library (e.g. \"yaml\") ' +\n 'and pass { yamlParser: { parse: YAML.parse } }.',\n );\n }\n try {\n return yamlParser.parse(content);\n } catch (cause) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Failed to parse YAML declarative config${origin}: ${(cause as Error).message}`,\n { cause },\n );\n }\n }\n\n try {\n return JSON.parse(content) as unknown;\n } catch (cause) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Failed to parse JSON declarative config${origin}: ${(cause as Error).message}`,\n { cause },\n );\n }\n}\n\nfunction normalizeAndValidate(raw: unknown, source: string | undefined): DeclarativeFileConfig {\n const origin = source ? ` in ${source}` : '';\n\n if (raw === null || raw === undefined) {\n return { entities: [] };\n }\n\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Declarative config${origin} must be an object with optional \"entities\" and \"consumers\" arrays.`,\n );\n }\n\n const obj = raw as Record<string, unknown>;\n const errors: { path: string; message: string }[] = [];\n\n for (const key of Object.keys(obj)) {\n if (!KNOWN_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Unknown declarative config key \"${key}\". Only \"entities\" and \"consumers\" are supported.`,\n });\n }\n }\n\n let entities: EntityDeclaration[] | undefined;\n if (obj['entities'] !== undefined) {\n if (!Array.isArray(obj['entities'])) {\n errors.push({ path: 'entities', message: '\"entities\" must be an array of entity declarations.' });\n } else {\n entities = obj['entities'] as EntityDeclaration[];\n entities.forEach((entity, index) => {\n const result = validateEntityDeclaration(entity);\n if (!result.valid) {\n for (const err of result.errors) {\n const path = err.path ? `entities[${index}].${err.path}` : `entities[${index}]`;\n errors.push({ path, message: err.message });\n }\n }\n });\n }\n }\n\n let consumers: ConsumerDeclaration[] | undefined;\n if (obj['consumers'] !== undefined) {\n if (!Array.isArray(obj['consumers'])) {\n errors.push({ path: 'consumers', message: '\"consumers\" must be an array of consumer declarations.' });\n } else {\n consumers = obj['consumers'] as ConsumerDeclaration[];\n const entityByName = new Map((entities ?? []).map((entity) => [entity.entity, entity]));\n consumers.forEach((consumer, index) => {\n const relatedEntity =\n consumer && typeof consumer === 'object'\n ? entityByName.get((consumer as unknown as Record<string, unknown>)['entity'] as string)\n : undefined;\n const result = validateConsumerDeclaration(consumer, relatedEntity);\n if (!result.valid) {\n for (const err of result.errors) {\n const path = err.path ? `consumers[${index}].${err.path}` : `consumers[${index}]`;\n errors.push({ path, message: err.message });\n }\n }\n });\n }\n }\n\n if (errors.length > 0) {\n const details = errors.map((err) => `${err.path}: ${err.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.VALIDATION_ERROR,\n `Invalid declarative config${origin}: ${details}`,\n { details: { errors } },\n );\n }\n\n return { entities: entities ?? [], consumers };\n}\n\n/** Parses and validates a declarative config from textual content. Does not perform I/O. */\nexport function loadDeclarativeConfigFromString(\n content: string,\n options: LoadDeclarativeConfigFromStringOptions,\n): DeclarativeFileConfig {\n const raw = parseContent(content, options.format, options.yamlParser, options.source);\n return normalizeAndValidate(raw, options.source);\n}\n\nfunction detectFormatFromExtension(filePath: string): DeclarativeFileFormat {\n const ext = extname(filePath).toLowerCase();\n if (ext === '.yaml' || ext === '.yml') return 'yaml';\n if (ext === '.json') return 'json';\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Cannot detect declarative config format from file extension \"${ext}\" (${filePath}). ` +\n 'Supported extensions: .yaml, .yml, .json. Pass { format } explicitly to override.',\n );\n}\n\n/** Reads, parses and validates a declarative config from a file path. Format is detected from the extension unless overridden. */\nexport async function loadDeclarativeConfigFromFile(\n filePath: string,\n options: LoadDeclarativeConfigFromFileOptions = {},\n): Promise<DeclarativeFileConfig> {\n const format = options.format ?? detectFormatFromExtension(filePath);\n const content = await readFile(filePath, 'utf-8');\n return loadDeclarativeConfigFromString(content, { format, yamlParser: options.yamlParser, source: filePath });\n}\n","export const GOVERNANCE_EVENT_TYPES = {\n OPERATION_EXECUTED: 'governance.operation.executed',\n AUTHORIZATION_DENIED: 'governance.authorization.denied',\n POLICY_TRIGGERED: 'governance.policy.triggered',\n CONFIRMATION_REQUESTED: 'governance.confirmation.requested',\n CONFIRMATION_APPROVED: 'governance.confirmation.approved',\n CONFIRMATION_REJECTED: 'governance.confirmation.rejected',\n AUDIT_RECORDED: 'governance.audit.recorded',\n} as const;\n\nexport type GovernanceEventType = (typeof GOVERNANCE_EVENT_TYPES)[keyof typeof GOVERNANCE_EVENT_TYPES];\n","import { randomUUID } from 'node:crypto';\nimport { InMemoryEventBus } from '../events/index.js';\nimport type { DomainEvent } from '../events/index.js';\nimport type { GovernanceEventBus } from './GovernanceEventBus.js';\nimport type { GovernanceEventType } from './GovernanceEventType.js';\n\nexport class InMemoryGovernanceEventBus extends InMemoryEventBus implements GovernanceEventBus {\n async publishGovernance<TPayload>(\n type: GovernanceEventType,\n payload: TPayload,\n correlationId?: string,\n ): Promise<DomainEvent<TPayload>> {\n const event: DomainEvent<TPayload> = {\n id: randomUUID(),\n type,\n occurredAt: new Date(),\n payload,\n correlationId,\n };\n await this.publish(event);\n return event;\n }\n}\n","import type { AuditEvent, AuditFilter, AuditRepository } from '../audit/index.js';\nimport type { ConfirmationRequest, ConfirmationRepository } from '../confirmation/index.js';\nimport type { PolicyViolation } from '../policy/index.js';\nimport type { GovernanceApi, PolicyViolationFilter } from './GovernanceApi.js';\n\nexport class DefaultGovernanceApi implements GovernanceApi {\n constructor(\n private readonly auditRepository: AuditRepository,\n private readonly confirmationRepository: ConfirmationRepository,\n private readonly violationLog: PolicyViolation[] = [],\n ) {}\n\n async getAuditTimeline(filter?: AuditFilter): Promise<AuditEvent[]> {\n return this.auditRepository.list(filter);\n }\n\n async getCorrelationTrace(correlationId: string): Promise<AuditEvent[]> {\n return this.auditRepository.list({ correlationId });\n }\n\n async getPendingConfirmations(): Promise<ConfirmationRequest[]> {\n return this.confirmationRepository.listPending();\n }\n\n async getPolicyViolations(filter?: PolicyViolationFilter): Promise<PolicyViolation[]> {\n let violations = [...this.violationLog];\n\n if (filter?.ruleId !== undefined) {\n violations = violations.filter((v) => v.ruleId === filter.ruleId);\n }\n if (filter?.correlationId !== undefined) {\n violations = violations.filter((v) => v.context.correlationId === filter.correlationId);\n }\n if (filter?.from !== undefined) {\n const from = filter.from;\n violations = violations.filter((v) => v.occurredAt >= from);\n }\n if (filter?.to !== undefined) {\n const to = filter.to;\n violations = violations.filter((v) => v.occurredAt <= to);\n }\n\n return violations;\n }\n}\n"],"mappings":"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","names":["ErrorCode","randomUUID","randomUUID","randomUUID","randomUUID","detectSoftDelete","randomUUID","randomUUID","randomUUID","readFile","extname","parseContent","extname","readFile","randomUUID","randomUUID"]}
1
+ {"version":3,"sources":["../src/errors/ErrorCode.ts","../src/errors/MaestroError.ts","../src/logging/LogLevel.ts","../src/logging/ConsoleLogger.ts","../src/logging/ConsoleStructuredLogger.ts","../src/audit/InMemoryAuditRepository.ts","../src/audit/AuditRecorder.ts","../src/rbac/RbacEngine.ts","../src/feature-flags/InMemoryFeatureFlagProvider.ts","../src/config/InMemoryConfigProvider.ts","../src/events/InMemoryEventBus.ts","../src/metadata/EntityCapabilities.ts","../src/datasource/DatasourceRegistry.ts","../src/datasource/InMemoryDatasourceProvider.ts","../src/operation/OperationRegistry.ts","../src/schema/SchemaValidator.ts","../src/engine/MetadataEngine.ts","../src/engine/MaestroEngine.ts","../src/export/CsvExportProvider.ts","../src/declarative/DeclarativeValidator.ts","../src/declarative/DeclarativeMetadataCompiler.ts","../src/engine/createMaestro.ts","../src/introspection/utils.ts","../src/hybrid-loader/HybridLoader.ts","../src/engine/createMaestroFromIntrospection.ts","../src/http/QueryStringParser.ts","../src/http/createMaestroHttpHandlers.ts","../src/config-loader/MaestroFileLoader.ts","../src/introspection/IntrospectionValidator.ts","../src/introspection/IntrospectionNormalizer.ts","../src/config-generator/ConfigGenerator.ts","../src/diff/DiffEngine.ts","../src/introspection-report/ReportGenerator.ts","../src/snapshot/InMemorySnapshotRepository.ts","../src/introspection-runtime/IntrospectionRuntime.ts","../src/correlation/CorrelationId.ts","../src/risk/MetadataRiskClassifier.ts","../src/authorization/ContextualAuthorizationEngine.ts","../src/policy/PolicyEngine.ts","../src/policy/InMemoryPolicyProvider.ts","../src/confirmation/ConfirmationEngine.ts","../src/confirmation/InMemoryConfirmationRepository.ts","../src/declarative/loader/DeclarativeFileLoader.ts","../src/declarative/generator/DeclarativeConfigGenerator.ts","../src/declarative/generator/DeclarativeConfigSerializer.ts","../src/governance/GovernanceEventType.ts","../src/governance/InMemoryGovernanceEventBus.ts","../src/governance/DefaultGovernanceApi.ts"],"sourcesContent":["export enum ErrorCode {\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n NOT_FOUND = 'NOT_FOUND',\n CONFLICT = 'CONFLICT',\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\n}\n","import type { Metadata } from '../types/index.js';\nimport type { ErrorCode } from './ErrorCode.js';\n\nexport class MaestroError extends Error {\n readonly code: ErrorCode;\n readonly details?: Metadata;\n override readonly cause?: unknown;\n\n constructor(\n code: ErrorCode,\n message: string,\n options?: { details?: Metadata; cause?: unknown },\n ) {\n super(message, { cause: options?.cause });\n this.code = code;\n this.details = options?.details;\n this.cause = options?.cause;\n this.name = 'MaestroError';\n }\n}\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n","import type { Logger, LogEntry } from './Logger.js';\nimport type { LogLevel } from './LogLevel.js';\nimport { LOG_LEVEL_PRIORITY } from './LogLevel.js';\n\nexport class ConsoleLogger implements Logger {\n constructor(private readonly minLevel: LogLevel = 'info') {}\n\n debug(entry: LogEntry): void {\n this.log('debug', entry);\n }\n\n info(entry: LogEntry): void {\n this.log('info', entry);\n }\n\n warn(entry: LogEntry): void {\n this.log('warn', entry);\n }\n\n error(entry: LogEntry): void {\n this.log('error', entry);\n }\n\n private log(level: LogLevel, entry: LogEntry): void {\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.minLevel]) return;\n\n const output = {\n timestamp: new Date().toISOString(),\n level,\n message: entry.message,\n ...(entry.correlationId && { correlationId: entry.correlationId }),\n ...(entry.metadata && { metadata: entry.metadata }),\n ...(entry.error !== undefined && { error: this.serializeError(entry.error) }),\n };\n\n const consoleFn = level === 'error' ? console.error\n : level === 'warn' ? console.warn\n : level === 'debug' ? console.debug\n : console.info;\n\n consoleFn(JSON.stringify(output));\n }\n\n private serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return { name: error.name, message: error.message };\n }\n return error;\n }\n}\n","import type { StructuredLogger } from './StructuredLogger.js';\nimport type { StructuredLogEntry } from './StructuredLogEntry.js';\nimport type { LogLevel } from './LogLevel.js';\nimport { LOG_LEVEL_PRIORITY } from './LogLevel.js';\n\nexport class ConsoleStructuredLogger implements StructuredLogger {\n constructor(private readonly minLevel: LogLevel = 'info') {}\n\n debug(entry: StructuredLogEntry): void {\n this.log('debug', entry);\n }\n\n info(entry: StructuredLogEntry): void {\n this.log('info', entry);\n }\n\n warn(entry: StructuredLogEntry): void {\n this.log('warn', entry);\n }\n\n error(entry: StructuredLogEntry): void {\n this.log('error', entry);\n }\n\n private log(level: LogLevel, entry: StructuredLogEntry): void {\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[this.minLevel]) return;\n\n const output: Record<string, unknown> = {\n timestamp: new Date().toISOString(),\n level,\n };\n\n if (entry.correlationId !== undefined) output['correlationId'] = entry.correlationId;\n if (entry.operation !== undefined) output['operation'] = entry.operation;\n if (entry.entity !== undefined) output['entity'] = entry.entity;\n if (entry.entityId !== undefined) output['entityId'] = entry.entityId;\n if (entry.actor !== undefined) output['actor'] = entry.actor;\n if (entry.durationMs !== undefined) output['durationMs'] = entry.durationMs;\n if (entry.status !== undefined) output['status'] = entry.status;\n if (entry.severity !== undefined) output['severity'] = entry.severity;\n if (entry.message !== undefined) output['message'] = entry.message;\n if (entry.metadata !== undefined) output['metadata'] = entry.metadata;\n if (entry.error !== undefined) output['error'] = this.serializeError(entry.error);\n\n const consoleFn =\n level === 'error' ? console.error\n : level === 'warn' ? console.warn\n : level === 'debug' ? console.debug\n : console.info;\n\n consoleFn(JSON.stringify(output));\n }\n\n private serializeError(error: unknown): unknown {\n if (error instanceof Error) {\n return { name: error.name, message: error.message };\n }\n return error;\n }\n}\n","import type { AuditRepository, AuditFilter } from './AuditRepository.js';\nimport type { AuditTimeline } from './AuditTimeline.js';\nimport type { AuditEvent } from './AuditEvent.js';\n\nexport class InMemoryAuditRepository implements AuditRepository, AuditTimeline {\n private readonly store = new Map<string, AuditEvent>();\n\n async record(event: AuditEvent): Promise<void> {\n this.store.set(event.id, event);\n }\n\n async list(filter?: AuditFilter): Promise<AuditEvent[]> {\n let events = Array.from(this.store.values());\n\n if (!filter) return events;\n\n if (filter.actorId !== undefined) {\n events = events.filter((e) => e.actor.id === filter.actorId);\n }\n if (filter.action !== undefined) {\n events = events.filter((e) => e.action === filter.action);\n }\n if (filter.entity !== undefined) {\n events = events.filter((e) => e.entity === filter.entity);\n }\n if (filter.entityId !== undefined) {\n events = events.filter((e) => e.entityId === filter.entityId);\n }\n if (filter.resourceType !== undefined) {\n events = events.filter((e) => e.resource?.type === filter.resourceType);\n }\n if (filter.resourceId !== undefined) {\n events = events.filter((e) => e.resource?.id === filter.resourceId);\n }\n if (filter.level !== undefined) {\n events = events.filter((e) => e.level === filter.level);\n }\n if (filter.from !== undefined) {\n const from = filter.from;\n events = events.filter((e) => e.timestamp >= from);\n }\n if (filter.to !== undefined) {\n const to = filter.to;\n events = events.filter((e) => e.timestamp <= to);\n }\n if (filter.correlationId !== undefined) {\n events = events.filter((e) => e.correlationId === filter.correlationId);\n }\n\n return events;\n }\n\n async query(filter?: AuditFilter): Promise<AuditEvent[]> {\n return this.list(filter);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { AuditRepository } from './AuditRepository.js';\nimport type { AuditEvent } from './AuditEvent.js';\nimport type { AuditLevel } from './AuditLevel.js';\nimport type { Actor, ResourceRef, Metadata } from '../types/index.js';\n\nexport interface RecordAuditInput {\n action: string;\n actor: Actor;\n level?: AuditLevel;\n resource?: ResourceRef;\n entity?: string;\n entityId?: string;\n before?: Metadata;\n after?: Metadata;\n metadata?: Metadata;\n correlationId?: string;\n requestId?: string;\n ip?: string;\n userAgent?: string;\n}\n\nexport class AuditRecorder {\n constructor(private readonly repository: AuditRepository) {}\n\n async record(input: RecordAuditInput): Promise<AuditEvent> {\n const event: AuditEvent = {\n id: randomUUID(),\n timestamp: new Date(),\n action: input.action,\n actor: input.actor,\n level: input.level ?? 'info',\n resource: input.resource,\n entity: input.entity,\n entityId: input.entityId,\n before: input.before,\n after: input.after,\n metadata: input.metadata,\n correlationId: input.correlationId,\n requestId: input.requestId,\n ip: input.ip,\n userAgent: input.userAgent,\n };\n\n await this.repository.record(event);\n return event;\n }\n}\n","import type { Actor } from '../types/index.js';\nimport type { RbacPolicy } from './RbacPolicy.js';\n\nexport class RbacEngine {\n constructor(private readonly policy: RbacPolicy) {}\n\n can(actor: Actor, permission: string): boolean {\n const permissions = this.resolvePermissions(actor);\n return permissions.some((p) => this.matchesPattern(p, permission));\n }\n\n private resolvePermissions(actor: Actor): string[] {\n const direct = actor.permissions ?? [];\n const fromRoles = (actor.roles ?? []).flatMap((roleName) => {\n const role = this.policy.roles[roleName];\n return role?.permissions ?? [];\n });\n return [...direct, ...fromRoles];\n }\n\n private matchesPattern(pattern: string, target: string): boolean {\n if (pattern === '*') return true;\n if (pattern === target) return true;\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return target === prefix || target.startsWith(`${prefix}.`);\n }\n return false;\n }\n}\n","import type { FeatureFlagProvider } from './FeatureFlagProvider.js';\nimport type { FeatureFlag } from './FeatureFlag.js';\nimport type { Actor } from '../types/index.js';\n\nexport class InMemoryFeatureFlagProvider implements FeatureFlagProvider {\n private readonly flags = new Map<string, FeatureFlag>();\n\n constructor(flags: FeatureFlag[] = []) {\n for (const flag of flags) {\n this.flags.set(flag.key, flag);\n }\n }\n\n async isEnabled(key: string, _actor?: Actor): Promise<boolean> {\n return this.flags.get(key)?.enabled ?? false;\n }\n\n get(key: string): FeatureFlag | undefined {\n return this.flags.get(key);\n }\n\n set(flag: FeatureFlag): void {\n this.flags.set(flag.key, flag);\n }\n\n list(): FeatureFlag[] {\n return Array.from(this.flags.values());\n }\n}\n","import type { ConfigProvider } from './ConfigProvider.js';\nimport type { MetadataValue } from '../types/index.js';\n\nexport class InMemoryConfigProvider implements ConfigProvider {\n private readonly store = new Map<string, MetadataValue>();\n\n constructor(initial: Record<string, MetadataValue> = {}) {\n for (const [key, value] of Object.entries(initial)) {\n this.store.set(key, value);\n }\n }\n\n get<T extends MetadataValue>(key: string): T | undefined {\n return this.store.get(key) as T | undefined;\n }\n\n set<T extends MetadataValue>(key: string, value: T): void {\n this.store.set(key, value);\n }\n\n has(key: string): boolean {\n return this.store.has(key);\n }\n\n getOrDefault<T extends MetadataValue>(key: string, defaultValue: T): T {\n const value = this.store.get(key);\n return value !== undefined ? (value as T) : defaultValue;\n }\n}\n","import type { EventBus, EventHandler } from './EventBus.js';\nimport type { DomainEvent } from './DomainEvent.js';\n\nexport class InMemoryEventBus implements EventBus {\n private readonly handlers = new Map<string, Set<EventHandler>>();\n\n async publish<TPayload>(event: DomainEvent<TPayload>): Promise<void> {\n const set = this.handlers.get(event.type);\n if (!set) return;\n\n const promises = Array.from(set).map((handler) =>\n Promise.resolve(handler(event as DomainEvent<unknown>)),\n );\n await Promise.all(promises);\n }\n\n subscribe<TPayload>(eventType: string, handler: EventHandler<TPayload>): void {\n if (!this.handlers.has(eventType)) {\n this.handlers.set(eventType, new Set());\n }\n this.handlers.get(eventType)!.add(handler as EventHandler);\n }\n\n unsubscribe<TPayload>(eventType: string, handler: EventHandler<TPayload>): void {\n this.handlers.get(eventType)?.delete(handler as EventHandler);\n }\n}\n","export interface EntityCapabilities {\n list: boolean;\n detail: boolean;\n create: boolean;\n update: boolean;\n clone: boolean;\n delete: boolean;\n softDelete: boolean;\n export: boolean;\n bulkActions: boolean;\n}\n\nexport const DEFAULT_CAPABILITIES: EntityCapabilities = {\n list: true,\n detail: true,\n create: false,\n update: false,\n clone: false,\n delete: false,\n softDelete: false,\n export: false,\n bulkActions: false,\n};\n","import type { DatasourceProvider } from './DatasourceProvider.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\n\nexport class DatasourceRegistry {\n private readonly registry = new Map<string, DatasourceProvider>();\n\n register(id: string, provider: DatasourceProvider): void {\n this.registry.set(id, provider);\n }\n\n get(id: string): DatasourceProvider {\n const provider = this.registry.get(id);\n if (!provider) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Datasource '${id}' not found. Registered datasources: [${this.ids().join(', ')}]`,\n );\n }\n return provider;\n }\n\n has(id: string): boolean {\n return this.registry.has(id);\n }\n\n ids(): string[] {\n return Array.from(this.registry.keys());\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { DatasourceProvider } from './DatasourceProvider.js';\nimport type { ListResult } from '../query/ListResult.js';\nimport type { FilterDescriptor } from '../query/FilterDescriptor.js';\nimport type { SortDescriptor } from '../query/SortDescriptor.js';\nimport type {\n DatasourceQueryContext,\n DatasourceFindContext,\n DatasourceWriteContext,\n DatasourceUpdateContext,\n DatasourceDeleteContext,\n} from './DatasourceContexts.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\n\nexport class InMemoryDatasourceProvider implements DatasourceProvider {\n private readonly tables = new Map<string, Map<string, Record<string, unknown>>>();\n\n seed(table: string, records: Record<string, unknown>[], primaryKey = 'id'): void {\n if (!this.tables.has(table)) {\n this.tables.set(table, new Map());\n }\n const store = this.tables.get(table)!;\n for (const record of records) {\n const id = String(record[primaryKey] ?? randomUUID());\n store.set(id, { ...record, [primaryKey]: id });\n }\n }\n\n async list(context: DatasourceQueryContext): Promise<ListResult<Record<string, unknown>>> {\n const store = this.getStore(context.table);\n let records = Array.from(store.values());\n\n if (context.search?.term) {\n const term = context.search.term.toLowerCase();\n records = records.filter((r) =>\n context.search!.fields.some((field) =>\n String(r[field] ?? '').toLowerCase().includes(term),\n ),\n );\n }\n\n if (context.filters?.length) {\n records = this.applyFilters(records, context.filters);\n }\n\n if (context.sort?.length) {\n records = this.applySort(records, context.sort);\n }\n\n const total = records.length;\n\n if (context.pagination) {\n const p = context.pagination;\n if (p.strategy === 'page') {\n const start = (p.page - 1) * p.pageSize;\n records = records.slice(start, start + p.pageSize);\n return { records, total, page: p.page, pageSize: p.pageSize, totalPages: Math.ceil(total / p.pageSize) };\n }\n if (p.strategy === 'offset') {\n records = records.slice(p.offset, p.offset + p.limit);\n }\n if (p.strategy === 'cursor') {\n const from = p.cursor ? parseInt(p.cursor, 10) : 0;\n const sliced = records.slice(from, from + p.limit);\n const nextIndex = from + p.limit;\n return { records: sliced, total, nextCursor: nextIndex < total ? String(nextIndex) : undefined };\n }\n }\n\n return { records, total };\n }\n\n async findById(context: DatasourceFindContext): Promise<Record<string, unknown> | null> {\n return this.getStore(context.table).get(context.id) ?? null;\n }\n\n async create(context: DatasourceWriteContext): Promise<Record<string, unknown>> {\n const store = this.getStore(context.table);\n const id = String(context.data[context.primaryKey] ?? randomUUID());\n const record = { ...context.data, [context.primaryKey]: id };\n store.set(id, record);\n return record;\n }\n\n async update(context: DatasourceUpdateContext): Promise<Record<string, unknown>> {\n const store = this.getStore(context.table);\n const existing = store.get(context.id);\n if (!existing) {\n throw new MaestroError(\n ErrorCode.NOT_FOUND,\n `Record '${context.id}' not found in table '${context.table}'.`,\n );\n }\n const updated = { ...existing, ...context.data, [context.primaryKey]: context.id };\n store.set(context.id, updated);\n return updated;\n }\n\n async delete(context: DatasourceDeleteContext): Promise<void> {\n const store = this.getStore(context.table);\n if (!store.has(context.id)) {\n throw new MaestroError(\n ErrorCode.NOT_FOUND,\n `Record '${context.id}' not found in table '${context.table}'.`,\n );\n }\n store.delete(context.id);\n }\n\n async count(context: DatasourceQueryContext): Promise<number> {\n const result = await this.list({ ...context, pagination: undefined });\n return result.total;\n }\n\n private getStore(table: string): Map<string, Record<string, unknown>> {\n if (!this.tables.has(table)) {\n this.tables.set(table, new Map());\n }\n return this.tables.get(table)!;\n }\n\n private applyFilters(\n records: Record<string, unknown>[],\n filters: FilterDescriptor[],\n ): Record<string, unknown>[] {\n return records.filter((record) => filters.every((f) => this.matchFilter(record, f)));\n }\n\n private matchFilter(record: Record<string, unknown>, filter: FilterDescriptor): boolean {\n const val = record[filter.field];\n switch (filter.operator) {\n case 'equals': return val === filter.value;\n case 'notEquals': return val !== filter.value;\n case 'contains': return String(val ?? '').toLowerCase().includes(String(filter.value ?? '').toLowerCase());\n case 'startsWith': return String(val ?? '').startsWith(String(filter.value ?? ''));\n case 'endsWith': return String(val ?? '').endsWith(String(filter.value ?? ''));\n case 'in': return Array.isArray(filter.value) && filter.value.includes(val);\n case 'notIn': return Array.isArray(filter.value) && !filter.value.includes(val);\n case 'gt': return (val as number) > (filter.value as number);\n case 'gte': return (val as number) >= (filter.value as number);\n case 'lt': return (val as number) < (filter.value as number);\n case 'lte': return (val as number) <= (filter.value as number);\n case 'between': {\n const [min, max] = filter.value as [number, number];\n return (val as number) >= min && (val as number) <= max;\n }\n case 'isNull': return val === null || val === undefined;\n case 'isNotNull': return val !== null && val !== undefined;\n case 'isTrue': return val === true;\n case 'isFalse': return val === false;\n default: return true;\n }\n }\n\n private applySort(\n records: Record<string, unknown>[],\n sort: SortDescriptor[],\n ): Record<string, unknown>[] {\n return [...records].sort((a, b) => {\n for (const { field, direction } of sort) {\n const aVal = a[field];\n const bVal = b[field];\n let cmp = 0;\n if (aVal === null || aVal === undefined) cmp = 1;\n else if (bVal === null || bVal === undefined) cmp = -1;\n else if (aVal < bVal) cmp = -1;\n else if (aVal > bVal) cmp = 1;\n if (cmp !== 0) return direction === 'desc' ? -cmp : cmp;\n }\n return 0;\n });\n }\n}\n","import type { OperationDef } from './OperationDef.js';\nimport type { OperationScope } from '../metadata/OperationMetadata.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\n\nexport class OperationRegistry {\n private readonly operations = new Map<string, OperationDef>();\n\n register(operation: OperationDef): void {\n if (this.operations.has(operation.id)) {\n throw new MaestroError(\n ErrorCode.CONFLICT,\n `Operation '${operation.id}' is already registered.`,\n );\n }\n this.operations.set(operation.id, operation);\n }\n\n get(id: string): OperationDef {\n const op = this.operations.get(id);\n if (!op) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Operation '${id}' not found.`);\n }\n return op;\n }\n\n find(id: string): OperationDef | undefined {\n return this.operations.get(id);\n }\n\n forEntity(entityId: string, scope?: OperationScope): OperationDef[] {\n return Array.from(this.operations.values()).filter(\n (op) => op.entity === entityId && (scope === undefined || op.scope === scope),\n );\n }\n\n all(): OperationDef[] {\n return Array.from(this.operations.values());\n }\n}\n","import type { MaestroConfig } from './MaestroConfig.js';\nimport type { EntitySchema } from './EntitySchema.js';\nimport type { RelationSchema } from './RelationSchema.js';\n\nexport interface SchemaValidationError {\n path: string;\n message: string;\n}\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: SchemaValidationError[];\n}\n\nexport function validateMaestroConfig(config: MaestroConfig): SchemaValidationResult {\n const errors: SchemaValidationError[] = [];\n\n if (!config.datasources || Object.keys(config.datasources).length === 0) {\n errors.push({ path: 'datasources', message: 'At least one datasource is required.' });\n }\n\n if (!config.entities || config.entities.length === 0) {\n errors.push({\n path: 'entities',\n message:\n 'At least one entity is required. Provide entities directly or via declarations.entities.',\n });\n }\n\n const entityIds = new Set<string>();\n for (const entity of config.entities ?? []) {\n validateEntity(entity, config, entityIds, errors);\n if (entity.id) entityIds.add(entity.id);\n }\n\n for (const relation of config.relations ?? []) {\n validateRelation(relation, entityIds, errors);\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateEntity(\n entity: EntitySchema,\n config: MaestroConfig,\n existingIds: Set<string>,\n errors: SchemaValidationError[],\n): void {\n const prefix = `entities[${entity.id ?? '?'}]`;\n\n if (!entity.id) {\n errors.push({ path: prefix, message: 'Entity id is required.' });\n return;\n }\n\n if (existingIds.has(entity.id)) {\n errors.push({ path: prefix, message: `Duplicate entity id '${entity.id}'.` });\n }\n\n if (!entity.label?.singular || !entity.label?.plural) {\n errors.push({ path: `${prefix}.label`, message: 'Entity label.singular and label.plural are required.' });\n }\n\n if (!entity.source?.datasource) {\n errors.push({ path: `${prefix}.source.datasource`, message: 'Entity source.datasource is required.' });\n } else if (!config.datasources[entity.source.datasource]) {\n errors.push({\n path: `${prefix}.source.datasource`,\n message: `Datasource '${entity.source.datasource}' referenced by entity '${entity.id}' is not configured.`,\n });\n }\n\n if (!entity.source?.table) {\n errors.push({ path: `${prefix}.source.table`, message: 'Entity source.table is required.' });\n }\n\n if (!entity.fields || entity.fields.length === 0) {\n errors.push({ path: `${prefix}.fields`, message: 'Entity must have at least one field.' });\n return;\n }\n\n const fieldNames = new Set<string>();\n for (const field of entity.fields) {\n const fp = `${prefix}.fields[${field.name ?? '?'}]`;\n if (!field.name) {\n errors.push({ path: fp, message: 'Field name is required.' });\n continue;\n }\n if (fieldNames.has(field.name)) {\n errors.push({ path: fp, message: `Duplicate field name '${field.name}'.` });\n } else {\n fieldNames.add(field.name);\n }\n if (!field.label) {\n errors.push({ path: `${fp}.label`, message: 'Field label is required.' });\n }\n if (!field.type) {\n errors.push({ path: `${fp}.type`, message: 'Field type is required.' });\n }\n }\n}\n\nfunction validateRelation(\n relation: RelationSchema,\n entityIds: Set<string>,\n errors: SchemaValidationError[],\n): void {\n const prefix = `relations[${relation.id ?? '?'}]`;\n\n if (!relation.id) {\n errors.push({ path: prefix, message: 'Relation id is required.' });\n }\n\n if (!relation.from?.entity) {\n errors.push({ path: `${prefix}.from.entity`, message: 'Relation from.entity is required.' });\n } else if (!entityIds.has(relation.from.entity)) {\n errors.push({ path: `${prefix}.from.entity`, message: `Entity '${relation.from.entity}' not found.` });\n }\n\n if (!relation.to?.entity) {\n errors.push({ path: `${prefix}.to.entity`, message: 'Relation to.entity is required.' });\n } else if (!entityIds.has(relation.to.entity)) {\n errors.push({ path: `${prefix}.to.entity`, message: `Entity '${relation.to.entity}' not found.` });\n }\n}\n","import type { MaestroConfig } from '../schema/MaestroConfig.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport type { EntityMetadata } from '../metadata/EntityMetadata.js';\nimport type { FieldMetadata } from '../metadata/FieldMetadata.js';\nimport type { RelationMetadata } from '../metadata/RelationMetadata.js';\nimport type { OperationMetadata } from '../metadata/OperationMetadata.js';\nimport type { ContextAction } from '../metadata/ContextAction.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { FilterOperator } from '../query/FilterOperator.js';\nimport type { FieldType } from '../metadata/FieldType.js';\nimport { DEFAULT_CAPABILITIES } from '../metadata/EntityCapabilities.js';\nimport type { EntityCapabilities } from '../metadata/EntityCapabilities.js';\n\nconst STRING_OPERATORS: FilterOperator[] = [\n 'equals', 'notEquals', 'contains', 'startsWith', 'endsWith',\n 'in', 'notIn', 'isNull', 'isNotNull',\n];\n\nconst NUMERIC_OPERATORS: FilterOperator[] = [\n 'equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between',\n 'in', 'notIn', 'isNull', 'isNotNull',\n];\n\nconst DATE_OPERATORS: FilterOperator[] = [\n 'equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'isNull', 'isNotNull',\n];\n\nconst ENUM_OPERATORS: FilterOperator[] = ['equals', 'notEquals', 'in', 'notIn', 'isNull', 'isNotNull'];\n\nconst BOOLEAN_OPERATORS: FilterOperator[] = ['isTrue', 'isFalse', 'isNull', 'isNotNull'];\n\nconst NULL_OPERATORS: FilterOperator[] = ['isNull', 'isNotNull'];\n\nfunction filterOperatorsForType(type: FieldType): FilterOperator[] {\n switch (type) {\n case 'string':\n case 'text':\n case 'email':\n case 'phone':\n case 'url':\n case 'document':\n return STRING_OPERATORS;\n case 'number':\n case 'integer':\n case 'decimal':\n case 'currency':\n return NUMERIC_OPERATORS;\n case 'boolean':\n return BOOLEAN_OPERATORS;\n case 'date':\n case 'datetime':\n case 'time':\n return DATE_OPERATORS;\n case 'enum':\n return ENUM_OPERATORS;\n case 'uuid':\n return ENUM_OPERATORS;\n case 'json':\n case 'array':\n case 'relation':\n return NULL_OPERATORS;\n default:\n return ['equals', 'notEquals', 'isNull', 'isNotNull'];\n }\n}\n\nfunction buildContextActions(entity: EntitySchema, operations: OperationDef[]): ContextAction[] {\n const caps = { ...DEFAULT_CAPABILITIES, ...entity.capabilities };\n const actions: ContextAction[] = [];\n\n if (caps.update) {\n actions.push({ id: 'edit', label: 'Edit', permission: `entity.${entity.id}.update` });\n }\n if (caps.clone) {\n actions.push({ id: 'clone', label: 'Clone', permission: `entity.${entity.id}.clone` });\n }\n if (caps.softDelete) {\n actions.push({\n id: 'soft-delete',\n label: 'Deactivate',\n permission: `entity.${entity.id}.softDelete`,\n condition: 'when-active',\n style: 'warning',\n });\n actions.push({\n id: 'restore',\n label: 'Restore',\n permission: `entity.${entity.id}.restore`,\n condition: 'when-inactive',\n });\n }\n if (caps.delete) {\n actions.push({\n id: 'hard-delete',\n label: 'Delete permanently',\n permission: `entity.${entity.id}.delete`,\n style: 'danger',\n });\n }\n\n for (const op of operations) {\n if (op.entity === entity.id && op.scope === 'record') {\n actions.push({\n id: op.id,\n label: op.label,\n permission: op.requiredPermission ?? `operation.${op.id}`,\n operationId: op.id,\n });\n }\n }\n\n return actions;\n}\n\nfunction buildBulkOperations(entity: EntitySchema, operations: OperationDef[]): string[] {\n return operations\n .filter((op) => op.entity === entity.id && op.scope === 'bulk')\n .map((op) => op.id);\n}\n\nexport class MetadataEngine {\n normalize(config: MaestroConfig): MaestroMetadata {\n const operations = config.operations ?? [];\n const entities = (config.entities ?? []).map((e) => this.normalizeEntity(e, operations));\n const relations = (config.relations ?? []) as RelationMetadata[];\n\n const entityRelationMap = new Map<string, string[]>();\n for (const rel of relations) {\n const addToMap = (entityId: string): void => {\n if (!entityRelationMap.has(entityId)) entityRelationMap.set(entityId, []);\n entityRelationMap.get(entityId)!.push(rel.id);\n };\n addToMap(rel.from.entity);\n if (rel.to.entity !== rel.from.entity) addToMap(rel.to.entity);\n }\n\n const enrichedEntities: EntityMetadata[] = entities.map((e) => ({\n ...e,\n relations: entityRelationMap.get(e.id) ?? [],\n }));\n\n const normalizedOps: OperationMetadata[] = operations.map((op) => ({\n id: op.id,\n label: op.label,\n description: op.description,\n entity: op.entity,\n scope: op.scope,\n requiresConfirmation: op.requiresConfirmation ?? false,\n confirmationMessage: op.confirmationMessage,\n requiresTypedConfirmation: op.requiresTypedConfirmation ?? false,\n requiredPermission: op.requiredPermission,\n }));\n\n return {\n entities: enrichedEntities,\n relations,\n operations: normalizedOps,\n policies: config.policies ?? { roles: {} },\n };\n }\n\n private normalizeEntity(schema: EntitySchema, operations: OperationDef[]): EntityMetadata {\n const capabilities: EntityCapabilities = { ...DEFAULT_CAPABILITIES, ...schema.capabilities };\n const primaryKey = schema.source.primaryKey ?? 'id';\n const displayField =\n schema.displayField ?? schema.fields.find((f) => !f.hidden)?.name ?? primaryKey;\n\n return {\n id: schema.id,\n label: schema.label,\n description: schema.description,\n datasource: schema.source.datasource,\n table: schema.source.table,\n primaryKey,\n displayField,\n fields: schema.fields.map((f) => this.normalizeField(f)),\n capabilities,\n softDelete: schema.softDelete,\n defaultSort: schema.defaultSort,\n search: schema.search,\n relations: [],\n contextActions: buildContextActions(schema, operations),\n bulkOperations: buildBulkOperations(schema, operations),\n exportConfig: schema.exportConfig,\n };\n }\n\n private normalizeField(schema: FieldSchema): FieldMetadata {\n return {\n name: schema.name,\n label: schema.label,\n type: schema.type,\n required: schema.required ?? false,\n readonly: schema.readonly ?? false,\n hidden: schema.hidden ?? false,\n sensitive: schema.sensitive ?? false,\n searchable: schema.searchable ?? false,\n sortable: schema.sortable ?? false,\n filterable: schema.filterable ?? false,\n exportable: schema.exportable ?? true,\n filterOperators: schema.filterOperators ?? filterOperatorsForType(schema.type),\n description: schema.description,\n enumOptions: schema.enumOptions,\n relationEntity: schema.relationEntity,\n mask: schema.mask,\n list: {\n visible: schema.list?.visible ?? !(schema.hidden ?? false),\n width: schema.list?.width,\n align: schema.list?.align,\n order: schema.list?.order,\n },\n detail: {\n visible: schema.detail?.visible ?? !(schema.hidden ?? false),\n group: schema.detail?.group,\n order: schema.detail?.order,\n },\n form: {\n creatable: schema.form?.creatable ?? true,\n editable: schema.form?.editable ?? !(schema.readonly ?? false),\n cloneable: schema.form?.cloneable ?? !(schema.readonly ?? false),\n placeholder: schema.form?.placeholder,\n helpText: schema.form?.helpText,\n section: schema.form?.section,\n order: schema.form?.order,\n },\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport type { EntityMetadata } from '../metadata/EntityMetadata.js';\nimport type { EntityCapabilities } from '../metadata/EntityCapabilities.js';\nimport type { Actor } from '../types/Actor.js';\nimport type { Metadata } from '../types/Metadata.js';\nimport type { QueryInput } from '../query/QueryInput.js';\nimport type { ListResult } from '../query/ListResult.js';\nimport type { DatasourceRegistry } from '../datasource/DatasourceRegistry.js';\nimport type { OperationContext } from '../operation/OperationContext.js';\nimport type { OperationResult } from '../operation/OperationResult.js';\nimport type { OperationRegistry } from '../operation/OperationRegistry.js';\nimport type { AuditRecorder } from '../audit/AuditRecorder.js';\nimport type { ExportFormat } from '../export/ExportFormat.js';\nimport type { ExportResult } from '../export/ExportResult.js';\nimport type { ResolvedConsumerProjection } from '../declarative/ConsumerProjection.js';\nimport { RbacEngine } from '../rbac/RbacEngine.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport { CsvExportProvider } from '../export/CsvExportProvider.js';\n\nexport class MaestroEngine {\n private readonly rbac: RbacEngine;\n private readonly consumerMap: ReadonlyMap<string, ResolvedConsumerProjection>;\n\n constructor(\n private readonly metadata: MaestroMetadata,\n private readonly datasources: DatasourceRegistry,\n private readonly operations: OperationRegistry,\n private readonly audit?: AuditRecorder,\n consumers: ResolvedConsumerProjection[] = [],\n ) {\n this.rbac = new RbacEngine(metadata.policies);\n this.consumerMap = new Map(consumers.map((c) => [c.consumer, c]));\n }\n\n getMetadata(): MaestroMetadata {\n return this.metadata;\n }\n\n /**\n * Returns the resolved consumer projection for the given consumer ID, or undefined if not found.\n * Each call returns an independent copy — mutations to the returned object do not affect internal state.\n * Consumer projections are only available when declarations.consumers were provided to createMaestro().\n */\n getConsumer(consumerId: string): ResolvedConsumerProjection | undefined {\n const p = this.consumerMap.get(consumerId);\n if (!p) return undefined;\n return {\n consumer: p.consumer,\n entity: p.entity,\n fields: {\n list: [...p.fields.list],\n detail: [...p.fields.detail],\n create: [...p.fields.create],\n update: [...p.fields.update],\n clone: [...p.fields.clone],\n },\n operations: {\n row: [...p.operations.row],\n bulk: [...p.operations.bulk],\n global: [...p.operations.global],\n },\n };\n }\n\n /**\n * Returns the IDs of all registered consumer projections.\n */\n listConsumers(): string[] {\n return [...this.consumerMap.keys()];\n }\n\n async list(\n entityId: string,\n query: QueryInput,\n actor: Actor,\n ): Promise<ListResult<Record<string, unknown>>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'list', actor, `entity.${entityId}.list`);\n\n const provider = this.datasources.get(entity.datasource);\n const result = await provider.list({\n table: entity.table,\n primaryKey: entity.primaryKey,\n filters: query.filters,\n sort: query.sort ?? (entity.defaultSort ? [entity.defaultSort] : undefined),\n pagination: query.pagination,\n search: query.search,\n });\n\n await this.recordAudit(`entity.${entityId}.list`, actor, { type: entityId, id: '*' }, 'debug', {\n total: result.total as unknown as Metadata[string],\n });\n\n return result;\n }\n\n async findById(\n entityId: string,\n id: string,\n actor: Actor,\n ): Promise<Record<string, unknown> | null> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'detail', actor, `entity.${entityId}.detail`);\n\n const provider = this.datasources.get(entity.datasource);\n const record = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n if (record) {\n await this.recordAudit(`entity.${entityId}.detail`, actor, { type: entityId, id }, 'debug');\n }\n\n return record;\n }\n\n async create(\n entityId: string,\n data: Record<string, unknown>,\n actor: Actor,\n ): Promise<Record<string, unknown>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'create', actor, `entity.${entityId}.create`);\n\n const provider = this.datasources.get(entity.datasource);\n const created = await provider.create({\n table: entity.table,\n primaryKey: entity.primaryKey,\n data: { ...data, [entity.primaryKey]: data[entity.primaryKey] ?? randomUUID() },\n });\n\n await this.recordAudit(\n `entity.${entityId}.create`,\n actor,\n { type: entityId, id: String(created[entity.primaryKey]) },\n 'info',\n undefined,\n undefined,\n created,\n );\n\n return created;\n }\n\n async update(\n entityId: string,\n id: string,\n data: Record<string, unknown>,\n actor: Actor,\n ): Promise<Record<string, unknown>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'update', actor, `entity.${entityId}.update`);\n\n const provider = this.datasources.get(entity.datasource);\n const before = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n const updated = await provider.update({ table: entity.table, primaryKey: entity.primaryKey, id, data });\n\n await this.recordAudit(\n `entity.${entityId}.update`,\n actor,\n { type: entityId, id },\n 'info',\n undefined,\n before ?? undefined,\n updated,\n );\n\n return updated;\n }\n\n async clone(\n entityId: string,\n id: string,\n actor: Actor,\n ): Promise<Record<string, unknown>> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'clone', actor, `entity.${entityId}.clone`);\n\n const provider = this.datasources.get(entity.datasource);\n const source = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n if (!source) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Record '${id}' not found in entity '${entityId}'.`);\n }\n\n const cloneableFields = entity.fields.filter((f) => f.form.cloneable && f.name !== entity.primaryKey);\n const cloneData: Record<string, unknown> = {};\n for (const field of cloneableFields) {\n if (source[field.name] !== undefined) cloneData[field.name] = source[field.name];\n }\n\n const created = await provider.create({\n table: entity.table,\n primaryKey: entity.primaryKey,\n data: { ...cloneData, [entity.primaryKey]: randomUUID() },\n });\n\n await this.recordAudit(\n `entity.${entityId}.clone`,\n actor,\n { type: entityId, id: String(created[entity.primaryKey]) },\n 'info',\n { sourceId: id as unknown as Metadata[string] },\n );\n\n return created;\n }\n\n async softDelete(entityId: string, id: string, actor: Actor): Promise<void> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'softDelete', actor, `entity.${entityId}.softDelete`);\n\n if (!entity.softDelete) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Entity '${entityId}' does not have softDelete configured.`,\n );\n }\n\n const provider = this.datasources.get(entity.datasource);\n await provider.update({\n table: entity.table,\n primaryKey: entity.primaryKey,\n id,\n data: { [entity.softDelete.field]: entity.softDelete.inactiveValue },\n });\n\n await this.recordAudit(`entity.${entityId}.softDelete`, actor, { type: entityId, id }, 'warn');\n }\n\n async restore(entityId: string, id: string, actor: Actor): Promise<void> {\n const entity = this.requireEntity(entityId);\n\n if (!entity.softDelete) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Entity '${entityId}' does not have softDelete configured.`,\n );\n }\n\n const permission = `entity.${entityId}.restore`;\n if (!this.rbac.can(actor, permission)) {\n throw new MaestroError(ErrorCode.PERMISSION_DENIED, `Permission denied: ${permission}`);\n }\n\n const provider = this.datasources.get(entity.datasource);\n await provider.update({\n table: entity.table,\n primaryKey: entity.primaryKey,\n id,\n data: { [entity.softDelete.field]: entity.softDelete.activeValue },\n });\n\n await this.recordAudit(`entity.${entityId}.restore`, actor, { type: entityId, id }, 'warn');\n }\n\n async hardDelete(entityId: string, id: string, actor: Actor): Promise<void> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'delete', actor, `entity.${entityId}.delete`);\n\n const provider = this.datasources.get(entity.datasource);\n const before = await provider.findById({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n await provider.delete({ table: entity.table, primaryKey: entity.primaryKey, id });\n\n await this.recordAudit(\n `entity.${entityId}.delete`,\n actor,\n { type: entityId, id },\n 'warn',\n undefined,\n before ?? undefined,\n );\n }\n\n async export(\n entityId: string,\n query: QueryInput,\n actor: Actor,\n format: ExportFormat = 'csv',\n ): Promise<ExportResult> {\n const entity = this.requireEntity(entityId);\n this.requireCapability(entity, 'export', actor, `entity.${entityId}.export`);\n\n const provider = this.datasources.get(entity.datasource);\n const result = await provider.list({\n table: entity.table,\n primaryKey: entity.primaryKey,\n filters: query.filters,\n sort: query.sort,\n search: query.search,\n });\n\n const exportProvider = new CsvExportProvider();\n const exportResult = exportProvider.export(entity, result.records, { format });\n\n await this.recordAudit(\n `entity.${entityId}.export`,\n actor,\n { type: entityId, id: '*' },\n 'info',\n { recordCount: exportResult.recordCount as unknown as Metadata[string], format: format as unknown as Metadata[string] },\n );\n\n return exportResult;\n }\n\n async executeOperation(\n operationId: string,\n context: OperationContext,\n actor: Actor,\n ): Promise<OperationResult> {\n const operation = this.operations.find(operationId);\n if (!operation) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Operation '${operationId}' not found.`);\n }\n\n if (operation.requiredPermission && !this.rbac.can(actor, operation.requiredPermission)) {\n throw new MaestroError(\n ErrorCode.PERMISSION_DENIED,\n `Permission denied: ${operation.requiredPermission}`,\n );\n }\n\n const correlationId = context.correlationId ?? randomUUID();\n const result = await operation.execute({ ...context, actor, correlationId });\n\n const entityMeta = context.entityId\n ? this.metadata.entities.find((e) => e.id === context.entityId)\n : undefined;\n const recordId =\n context.record && entityMeta\n ? String(context.record[entityMeta.primaryKey] ?? 'unknown')\n : '*';\n\n await this.recordAudit(\n `operation.${operationId}`,\n actor,\n context.entityId ? { type: context.entityId, id: recordId } : undefined,\n result.success ? 'info' : 'error',\n { success: result.success as unknown as Metadata[string] },\n undefined,\n undefined,\n correlationId,\n );\n\n return result;\n }\n\n private requireEntity(entityId: string): EntityMetadata {\n const entity = this.metadata.entities.find((e) => e.id === entityId);\n if (!entity) {\n throw new MaestroError(ErrorCode.NOT_FOUND, `Entity '${entityId}' not found.`);\n }\n return entity;\n }\n\n private requireCapability(\n entity: EntityMetadata,\n capability: keyof EntityCapabilities,\n actor: Actor,\n permission: string,\n ): void {\n if (!entity.capabilities[capability]) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Capability '${String(capability)}' is not enabled for entity '${entity.id}'.`,\n );\n }\n if (!this.rbac.can(actor, permission)) {\n throw new MaestroError(ErrorCode.PERMISSION_DENIED, `Permission denied: ${permission}`);\n }\n }\n\n private async recordAudit(\n action: string,\n actor: Actor,\n resource?: { type: string; id: string },\n level: 'debug' | 'info' | 'warn' | 'error' = 'info',\n metadata?: Metadata,\n before?: Record<string, unknown>,\n after?: Record<string, unknown>,\n correlationId?: string,\n ): Promise<void> {\n await this.audit?.record({\n action,\n actor,\n resource,\n level,\n metadata,\n before: before as unknown as Metadata,\n after: after as unknown as Metadata,\n correlationId,\n });\n }\n}\n","import type { ExportProvider } from './ExportProvider.js';\nimport type { EntityMetadata } from '../metadata/EntityMetadata.js';\nimport type { FieldMetadata } from '../metadata/FieldMetadata.js';\nimport type { ExportOptions } from './ExportOptions.js';\nimport type { ExportResult } from './ExportResult.js';\n\nexport class CsvExportProvider implements ExportProvider {\n export(\n entity: EntityMetadata,\n records: Record<string, unknown>[],\n options: ExportOptions,\n ): ExportResult {\n const fields = this.resolveFields(entity, options);\n const headers = fields.map((f) => f.label);\n const rows = records.map((record) =>\n fields.map((field) => this.formatValue(record[field.name], field, options)),\n );\n\n const csvLines = [headers, ...rows].map((row) =>\n row.map((cell) => this.escapeCsvCell(String(cell ?? ''))).join(','),\n );\n\n const bom = options.bom !== false ? '' : '';\n const data = bom + csvLines.join('\\r\\n');\n const datestamp = new Date().toISOString().slice(0, 10);\n const filename = `${entity.id}_export_${datestamp}.csv`;\n\n return {\n format: 'csv',\n data,\n filename,\n recordCount: records.length,\n mimeType: 'text/csv;charset=utf-8',\n };\n }\n\n private resolveFields(entity: EntityMetadata, options: ExportOptions): FieldMetadata[] {\n let fields = entity.fields.filter((f) => f.exportable && !f.hidden);\n\n if (options.includeFields?.length) {\n const include = new Set(options.includeFields);\n fields = fields.filter((f) => include.has(f.name));\n }\n\n if (options.excludeFields?.length) {\n const exclude = new Set(options.excludeFields);\n fields = fields.filter((f) => !exclude.has(f.name));\n }\n\n return fields;\n }\n\n private formatValue(value: unknown, field: FieldMetadata, options: ExportOptions): string {\n if (value === null || value === undefined) return '';\n if (field.sensitive) return '***';\n\n switch (field.type) {\n case 'boolean':\n return value ? 'Sim' : 'Não';\n case 'date':\n case 'datetime': {\n if (value instanceof Date) {\n return options.dateFormat ? this.formatDate(value, options.dateFormat) : value.toISOString();\n }\n return String(value);\n }\n case 'enum': {\n const option = field.enumOptions?.find((o) => o.value === value);\n return option ? option.label : String(value);\n }\n case 'json':\n return JSON.stringify(value);\n default:\n return String(value);\n }\n }\n\n private formatDate(date: Date, format: string): string {\n return format\n .replace('YYYY', String(date.getFullYear()))\n .replace('MM', String(date.getMonth() + 1).padStart(2, '0'))\n .replace('DD', String(date.getDate()).padStart(2, '0'))\n .replace('HH', String(date.getHours()).padStart(2, '0'))\n .replace('mm', String(date.getMinutes()).padStart(2, '0'))\n .replace('ss', String(date.getSeconds()).padStart(2, '0'));\n }\n\n private escapeCsvCell(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n') || value.includes('\\r')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n}\n","import type { FieldType } from '../metadata/index.js';\nimport type { OperationalRisk } from '../risk/index.js';\nimport type { OperationScope } from '../metadata/index.js';\nimport type { RelationType } from '../metadata/RelationMetadata.js';\nimport type { SchemaValidationResult } from '../schema/index.js';\nimport type {\n EntityDeclaration,\n FieldDeclaration,\n OperationDeclaration,\n RelationDeclaration,\n EnumOptionDeclaration,\n} from './EntityDeclaration.js';\n\nconst SUPPORTED_FIELD_TYPES: FieldType[] = [\n 'string', 'text', 'number', 'integer', 'decimal', 'currency',\n 'boolean', 'date', 'datetime', 'time', 'email', 'phone', 'url',\n 'document', 'uuid', 'enum', 'json', 'relation', 'array',\n];\n\nconst SUPPORTED_OPERATIONAL_RISKS: OperationalRisk[] = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];\n\nconst SUPPORTED_OPERATION_SCOPES: OperationScope[] = ['global', 'entity', 'record', 'bulk'];\n\nconst SUPPORTED_RELATION_TYPES: RelationType[] = [\n 'one-to-one', 'one-to-many', 'many-to-one', 'many-to-many',\n];\n\nexport function validateEntityDeclaration(input: unknown): SchemaValidationResult {\n const errors: { path: string; message: string }[] = [];\n\n if (!input || typeof input !== 'object') {\n return { valid: false, errors: [{ path: '', message: 'Entity declaration must be an object.' }] };\n }\n\n const decl = input as Record<string, unknown>;\n\n if (!decl['entity'] || typeof decl['entity'] !== 'string' || decl['entity'].trim() === '') {\n errors.push({ path: 'entity', message: 'Entity name is required.' });\n }\n\n const fields = decl['fields'];\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {\n errors.push({ path: 'fields', message: 'Entity must declare at least one field.' });\n } else {\n const fieldMap = fields as Record<string, unknown>;\n if (Object.keys(fieldMap).length === 0) {\n errors.push({ path: 'fields', message: 'Entity must declare at least one field.' });\n } else {\n for (const [name, rawField] of Object.entries(fieldMap)) {\n validateFieldDeclaration(name, rawField, errors);\n }\n }\n }\n\n const operations = decl['operations'];\n if (operations !== undefined) {\n if (typeof operations !== 'object' || Array.isArray(operations)) {\n errors.push({ path: 'operations', message: 'Operations must be an object.' });\n } else {\n const opMap = operations as Record<string, unknown>;\n for (const [id, rawOp] of Object.entries(opMap)) {\n validateOperationDeclaration(id, rawOp, errors);\n }\n }\n }\n\n const relationships = decl['relationships'];\n if (relationships !== undefined) {\n if (!Array.isArray(relationships)) {\n errors.push({ path: 'relationships', message: 'Relationships must be an array.' });\n } else {\n const knownFields = fields && typeof fields === 'object' && !Array.isArray(fields)\n ? new Set(Object.keys(fields as Record<string, unknown>))\n : new Set<string>();\n const seenRelIds = new Set<string>();\n\n for (let i = 0; i < relationships.length; i++) {\n validateRelationDeclaration(i, relationships[i], knownFields, seenRelIds, errors);\n }\n }\n }\n\n const capabilities = decl['capabilities'];\n if (capabilities !== undefined) {\n if (typeof capabilities !== 'object' || Array.isArray(capabilities)) {\n errors.push({ path: 'capabilities', message: 'Capabilities must be an object.' });\n } else {\n const caps = capabilities as Record<string, unknown>;\n const booleanKeys = [\n 'list', 'detail', 'create', 'update', 'clone',\n 'delete', 'softDelete', 'export', 'bulkActions',\n ];\n for (const key of Object.keys(caps)) {\n if (!booleanKeys.includes(key)) {\n errors.push({\n path: `capabilities.${key}`,\n message: `Unknown capability '${key}'. Valid capabilities: ${booleanKeys.join(', ')}.`,\n });\n } else if (typeof caps[key] !== 'boolean') {\n errors.push({\n path: `capabilities.${key}`,\n message: `Capability '${key}' must be a boolean.`,\n });\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFieldDeclaration(\n name: string,\n rawField: unknown,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `fields[${name}]`;\n\n if (!rawField || typeof rawField !== 'object') {\n errors.push({ path: prefix, message: `Field '${name}' must be an object.` });\n return;\n }\n\n const field = rawField as Partial<FieldDeclaration>;\n\n if (!field.type) {\n errors.push({ path: `${prefix}.type`, message: 'Field type is required.' });\n } else if (!SUPPORTED_FIELD_TYPES.includes(field.type as FieldType)) {\n errors.push({\n path: `${prefix}.type`,\n message: `Field type '${field.type}' is not supported. Supported types: ${SUPPORTED_FIELD_TYPES.join(', ')}.`,\n });\n }\n\n if (field.sensitive === true && field.exportable === true) {\n errors.push({\n path: prefix,\n message: `Field '${name}' cannot be both sensitive and exportable.`,\n });\n }\n\n if (field.enumOptions !== undefined) {\n if (field.type !== 'enum') {\n errors.push({\n path: `${prefix}.enumOptions`,\n message: `Field '${name}' has enumOptions but type is '${field.type}'. enumOptions is only valid for type 'enum'.`,\n });\n } else {\n validateEnumOptions(name, field.enumOptions as unknown, errors);\n }\n }\n\n if (field.relationEntity !== undefined) {\n if (field.type !== 'relation') {\n errors.push({\n path: `${prefix}.relationEntity`,\n message: `Field '${name}' has relationEntity but type is '${field.type}'. relationEntity is only valid for type 'relation'.`,\n });\n } else if (typeof field.relationEntity !== 'string' || field.relationEntity.trim() === '') {\n errors.push({\n path: `${prefix}.relationEntity`,\n message: `Field '${name}' relationEntity must be a non-empty string.`,\n });\n }\n }\n}\n\nfunction validateEnumOptions(\n fieldName: string,\n rawOptions: unknown,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `fields[${fieldName}].enumOptions`;\n\n if (!Array.isArray(rawOptions)) {\n errors.push({ path: prefix, message: `enumOptions for field '${fieldName}' must be an array.` });\n return;\n }\n\n if (rawOptions.length === 0) {\n errors.push({ path: prefix, message: `enumOptions for field '${fieldName}' must not be empty.` });\n return;\n }\n\n for (let i = 0; i < rawOptions.length; i++) {\n const opt = rawOptions[i] as Partial<EnumOptionDeclaration>;\n if (!opt || typeof opt !== 'object') {\n errors.push({ path: `${prefix}[${i}]`, message: `Enum option at index ${i} must be an object.` });\n continue;\n }\n if (opt.value === undefined || opt.value === null) {\n errors.push({ path: `${prefix}[${i}].value`, message: `Enum option at index ${i} is missing 'value'.` });\n }\n if (!opt.label || typeof opt.label !== 'string' || opt.label.trim() === '') {\n errors.push({ path: `${prefix}[${i}].label`, message: `Enum option at index ${i} is missing 'label'.` });\n }\n }\n}\n\nfunction validateOperationDeclaration(\n id: string,\n rawOp: unknown,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `operations[${id}]`;\n\n if (!rawOp || typeof rawOp !== 'object') {\n errors.push({ path: prefix, message: `Operation '${id}' must be an object.` });\n return;\n }\n\n const op = rawOp as Partial<OperationDeclaration>;\n\n if (!op.label || typeof op.label !== 'string' || op.label.trim() === '') {\n errors.push({ path: `${prefix}.label`, message: 'Operation label is required.' });\n }\n\n if (op.risk !== undefined && !SUPPORTED_OPERATIONAL_RISKS.includes(op.risk as OperationalRisk)) {\n errors.push({\n path: `${prefix}.risk`,\n message: `Operation risk '${op.risk}' is not valid. Valid values: ${SUPPORTED_OPERATIONAL_RISKS.join(', ')}.`,\n });\n }\n\n if (op.scope !== undefined && !SUPPORTED_OPERATION_SCOPES.includes(op.scope as OperationScope)) {\n errors.push({\n path: `${prefix}.scope`,\n message: `Operation scope '${op.scope}' is not valid. Valid values: ${SUPPORTED_OPERATION_SCOPES.join(', ')}.`,\n });\n }\n\n if (op.confirmation !== undefined) {\n const conf = op.confirmation;\n if (conf.approvers !== undefined && (typeof conf.approvers !== 'number' || conf.approvers < 1)) {\n errors.push({\n path: `${prefix}.confirmation.approvers`,\n message: 'Confirmation approvers must be at least 1.',\n });\n }\n }\n}\n\nfunction validateRelationDeclaration(\n index: number,\n rawRel: unknown,\n knownFields: Set<string>,\n seenIds: Set<string>,\n errors: { path: string; message: string }[],\n): void {\n const prefix = `relationships[${index}]`;\n\n if (!rawRel || typeof rawRel !== 'object') {\n errors.push({ path: prefix, message: `Relationship at index ${index} must be an object.` });\n return;\n }\n\n const rel = rawRel as Partial<RelationDeclaration>;\n\n if (rel.id !== undefined) {\n if (typeof rel.id !== 'string' || rel.id.trim() === '') {\n errors.push({ path: `${prefix}.id`, message: 'Relationship id must be a non-empty string.' });\n } else if (seenIds.has(rel.id)) {\n errors.push({ path: `${prefix}.id`, message: `Duplicate relationship id '${rel.id}'.` });\n } else {\n seenIds.add(rel.id);\n }\n }\n\n if (!rel.type) {\n errors.push({ path: `${prefix}.type`, message: 'Relationship type is required.' });\n } else if (!SUPPORTED_RELATION_TYPES.includes(rel.type as RelationType)) {\n errors.push({\n path: `${prefix}.type`,\n message: `Relationship type '${rel.type}' is not valid. Valid values: ${SUPPORTED_RELATION_TYPES.join(', ')}.`,\n });\n }\n\n if (!rel.fromField || typeof rel.fromField !== 'string' || rel.fromField.trim() === '') {\n errors.push({ path: `${prefix}.fromField`, message: 'Relationship fromField is required.' });\n } else if (knownFields.size > 0 && !knownFields.has(rel.fromField)) {\n errors.push({\n path: `${prefix}.fromField`,\n message: `Relationship fromField '${rel.fromField}' does not exist in the entity's fields.`,\n });\n }\n\n if (!rel.toEntity || typeof rel.toEntity !== 'string' || rel.toEntity.trim() === '') {\n errors.push({ path: `${prefix}.toEntity`, message: 'Relationship toEntity is required.' });\n }\n\n if (!rel.toField || typeof rel.toField !== 'string' || rel.toField.trim() === '') {\n errors.push({ path: `${prefix}.toField`, message: 'Relationship toField is required.' });\n }\n}\n\nexport function validateConsumerDeclaration(\n input: unknown,\n entity?: EntityDeclaration,\n): SchemaValidationResult {\n const errors: { path: string; message: string }[] = [];\n\n if (!input || typeof input !== 'object') {\n return { valid: false, errors: [{ path: '', message: 'Consumer declaration must be an object.' }] };\n }\n\n const decl = input as Record<string, unknown>;\n\n if (!decl['consumer'] || typeof decl['consumer'] !== 'string' || (decl['consumer'] as string).trim() === '') {\n errors.push({ path: 'consumer', message: 'Consumer name is required.' });\n }\n\n if (!decl['entity'] || typeof decl['entity'] !== 'string' || (decl['entity'] as string).trim() === '') {\n errors.push({ path: 'entity', message: 'Entity name is required.' });\n }\n\n if (entity) {\n const knownFields = new Set(Object.keys(entity.fields));\n const knownOps = new Set(Object.keys(entity.operations ?? {}));\n const entityName = entity.entity;\n\n validateFieldRefs('list.fields', decl['list'], knownFields, entityName, errors);\n validateFieldRefs('detail.fields', decl['detail'], knownFields, entityName, errors);\n\n const forms = decl['forms'] as Record<string, unknown> | undefined;\n if (forms && typeof forms === 'object') {\n validateFieldRefs('forms.create.fields', forms['create'], knownFields, entityName, errors);\n validateFieldRefs('forms.update.fields', forms['update'], knownFields, entityName, errors);\n validateFieldRefs('forms.clone.fields', forms['clone'], knownFields, entityName, errors);\n }\n\n const actions = decl['actions'] as Record<string, unknown> | undefined;\n if (actions && typeof actions === 'object') {\n validateOperationRefs('actions.row', actions['row'], knownOps, entityName, errors);\n validateOperationRefs('actions.bulk', actions['bulk'], knownOps, entityName, errors);\n validateOperationRefs('actions.global', actions['global'], knownOps, entityName, errors);\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nfunction validateFieldRefs(\n path: string,\n container: unknown,\n knownFields: Set<string>,\n entityName: string,\n errors: { path: string; message: string }[],\n): void {\n if (!container || typeof container !== 'object') return;\n const obj = container as Record<string, unknown>;\n const fields = obj['fields'];\n if (!Array.isArray(fields)) return;\n for (let i = 0; i < fields.length; i++) {\n const name = fields[i] as string;\n if (!knownFields.has(name)) {\n errors.push({\n path: `${path}[${i}]`,\n message: `Field '${name}' does not exist in entity '${entityName}'.`,\n });\n }\n }\n}\n\nfunction validateOperationRefs(\n path: string,\n refs: unknown,\n knownOps: Set<string>,\n entityName: string,\n errors: { path: string; message: string }[],\n): void {\n if (!Array.isArray(refs)) return;\n for (let i = 0; i < refs.length; i++) {\n const id = refs[i] as string;\n if (!knownOps.has(id)) {\n errors.push({\n path: `${path}[${i}]`,\n message: `Operation '${id}' does not exist in entity '${entityName}'.`,\n });\n }\n }\n}\n","import type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { SchemaValidationError } from '../schema/SchemaValidator.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport type { FieldMetadata } from '../metadata/FieldMetadata.js';\nimport type { OperationMetadata } from '../metadata/OperationMetadata.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport { validateEntityDeclaration, validateConsumerDeclaration } from './DeclarativeValidator.js';\nimport type { DeclarativeConfig } from './DeclarativeConfig.js';\nimport type {\n EntityDeclaration,\n FieldDeclaration,\n OperationDeclaration,\n RelationDeclaration,\n} from './EntityDeclaration.js';\nimport type { ConsumerDeclaration } from './ConsumerDeclaration.js';\nimport type { ResolvedConsumerProjection } from './ConsumerProjection.js';\n\nexport interface DeclarativeCompilationResult {\n valid: boolean;\n errors: SchemaValidationError[];\n entities: EntitySchema[];\n /** Operation stubs for declared operations. Real implementations in config.operations override these. */\n operations: OperationDef[];\n /** Validated consumer declarations ready for resolution after metadata is built. */\n consumers: ConsumerDeclaration[];\n /** Relation schemas derived from RelationDeclaration[]. Cross-entity refs validated at startup. */\n relations: RelationSchema[];\n}\n\nexport interface CompileDeclarationsOptions {\n datasourceIds: string[];\n /**\n * Datasource to assign to all declared entities.\n * Resolved by the caller: either declarations.defaultDatasource or the single available datasource.\n */\n defaultDatasource?: string;\n}\n\nfunction capitalizeFirst(name: string): string {\n if (!name) return name;\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\nfunction fieldDeclToFieldSchema(name: string, field: FieldDeclaration): FieldSchema {\n return {\n name,\n label: field.label ?? capitalizeFirst(name),\n type: field.type,\n required: field.required,\n readonly: field.readonly,\n // FieldDeclaration uses visible (default true); FieldSchema uses hidden (default false)\n hidden: field.visible === false ? true : undefined,\n sensitive: field.sensitive,\n searchable: field.searchable,\n sortable: field.sortable,\n filterable: field.filterable,\n exportable: field.exportable,\n description: field.description,\n enumOptions: field.enumOptions,\n relationEntity: field.relationEntity,\n };\n}\n\nfunction opDeclToStubOperationDef(\n entityId: string,\n opKey: string,\n op: OperationDeclaration,\n): OperationDef {\n const id = `${entityId}.${opKey}`;\n return {\n id,\n label: op.label,\n description: op.description,\n entity: entityId,\n scope: op.scope ?? 'record',\n requiredPermission: op.permission,\n requiresConfirmation: op.confirmation?.required,\n execute: async () => {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Operation '${id}' declared but has no registered implementation. ` +\n `Provide an OperationDef with id '${id}' in config.operations.`,\n );\n },\n };\n}\n\nfunction entityDeclToEntitySchema(decl: EntityDeclaration, datasource: string): EntitySchema {\n const primaryKeyEntry = Object.entries(decl.fields).find(([, f]) => f.primary);\n const primaryKey = primaryKeyEntry ? primaryKeyEntry[0] : 'id';\n\n const singularLabel = decl.label ?? capitalizeFirst(decl.entity);\n const pluralLabel = decl.pluralLabel ?? decl.label ?? capitalizeFirst(decl.entity);\n\n const fields: FieldSchema[] = Object.entries(decl.fields).map(([name, field]) =>\n fieldDeclToFieldSchema(name, field),\n );\n\n return {\n id: decl.entity,\n label: { singular: singularLabel, plural: pluralLabel },\n description: decl.description,\n source: {\n datasource,\n table: decl.entity,\n primaryKey,\n },\n capabilities: decl.capabilities,\n fields,\n };\n}\n\nfunction relationDeclToRelationSchema(\n fromEntity: string,\n rel: RelationDeclaration,\n): RelationSchema {\n const id = rel.id ?? `${fromEntity}.${rel.toEntity}`;\n const label = rel.label ?? capitalizeFirst(rel.toEntity);\n return {\n id,\n type: rel.type,\n from: { entity: fromEntity, field: rel.fromField },\n to: { entity: rel.toEntity, field: rel.toField },\n label,\n display: rel.display ? { tab: rel.display.tab ?? false, label: rel.display.label } : undefined,\n };\n}\n\nexport function compileDeclarations(\n config: DeclarativeConfig,\n options: CompileDeclarationsOptions,\n): DeclarativeCompilationResult {\n const errors: SchemaValidationError[] = [];\n\n // Resolve the datasource to use for all declared entities\n const datasource =\n options.defaultDatasource ??\n (options.datasourceIds.length === 1 ? options.datasourceIds[0] : undefined);\n\n if (options.datasourceIds.length > 1 && !datasource) {\n errors.push({\n path: 'declarations.defaultDatasource',\n message:\n 'Multiple datasources are configured. Set declarations.defaultDatasource to specify which one to use for declared entities.',\n });\n }\n\n // Validate and compile each EntityDeclaration\n const entityDeclarationMap = new Map<string, EntityDeclaration>();\n const compiledEntities: EntitySchema[] = [];\n const compiledOperations: OperationDef[] = [];\n const compiledRelations: RelationSchema[] = [];\n\n for (const decl of config.entities) {\n const entityId = typeof decl?.entity === 'string' ? decl.entity : '?';\n const prefix = `declarations.entities[${entityId}]`;\n\n const validation = validateEntityDeclaration(decl);\n if (!validation.valid) {\n for (const err of validation.errors) {\n errors.push({ path: `${prefix}.${err.path}`.replace(/\\.$/, ''), message: err.message });\n }\n continue;\n }\n\n if (entityDeclarationMap.has(decl.entity)) {\n errors.push({\n path: prefix,\n message: `Duplicate entity '${decl.entity}' in declarations.entities.`,\n });\n continue;\n }\n\n entityDeclarationMap.set(decl.entity, decl);\n\n if (datasource) {\n compiledEntities.push(entityDeclToEntitySchema(decl, datasource));\n\n for (const [opKey, opDecl] of Object.entries(decl.operations ?? {})) {\n compiledOperations.push(opDeclToStubOperationDef(decl.entity, opKey, opDecl));\n }\n\n // Compile relationships (cross-entity refs validated later in createMaestro)\n const seenRelIds = new Set<string>();\n for (let i = 0; i < (decl.relationships ?? []).length; i++) {\n const rel = decl.relationships![i];\n const relSchema = relationDeclToRelationSchema(decl.entity, rel);\n if (seenRelIds.has(relSchema.id)) {\n errors.push({\n path: `${prefix}.relationships[${i}].id`,\n message: `Duplicate relation id '${relSchema.id}' in entity '${decl.entity}'.`,\n });\n } else {\n seenRelIds.add(relSchema.id);\n compiledRelations.push(relSchema);\n }\n }\n }\n }\n\n // Validate each ConsumerDeclaration.\n // Consumers may reference entities from declarations OR from config.entities / hybrid loader.\n // Field/op cross-validation is only performed when the entity is present in this declaration batch.\n // Cross-entity consumers (referencing base-metadata entities) are included as-is for deferred\n // validation in createMaestro() after the full metadata is built.\n const consumerNames = new Set<string>();\n const validConsumers: ConsumerDeclaration[] = [];\n\n for (const consumer of config.consumers ?? []) {\n const consumerId = typeof consumer?.consumer === 'string' ? consumer.consumer : '?';\n const prefix = `declarations.consumers[${consumerId}]`;\n\n // Look up the entity declaration for cross-validation (may be undefined for base-metadata entities)\n const entityDecl = entityDeclarationMap.get(consumer?.entity ?? '');\n\n // Only validate field/op references when the entity is in this declaration batch\n const validation = validateConsumerDeclaration(consumer, entityDecl);\n if (!validation.valid) {\n for (const err of validation.errors) {\n errors.push({ path: `${prefix}.${err.path}`.replace(/\\.$/, ''), message: err.message });\n }\n continue;\n }\n\n if (consumerNames.has(consumer.consumer)) {\n errors.push({\n path: prefix,\n message: `Duplicate consumer '${consumer.consumer}' in declarations.consumers.`,\n });\n continue;\n }\n\n consumerNames.add(consumer.consumer);\n validConsumers.push(consumer);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n entities: compiledEntities,\n operations: compiledOperations,\n consumers: validConsumers,\n relations: compiledRelations,\n };\n}\n\n/**\n * Resolves validated ConsumerDeclarations against the fully-built MaestroMetadata.\n * Must be called after MetadataEngine.normalize() has produced the final EntityMetadata[].\n */\nexport function resolveConsumerProjections(\n consumers: ConsumerDeclaration[],\n metadata: MaestroMetadata,\n): ResolvedConsumerProjection[] {\n const results: ResolvedConsumerProjection[] = [];\n\n for (const consumer of consumers) {\n const entityMeta = metadata.entities.find((e) => e.id === consumer.entity);\n if (!entityMeta) continue;\n\n const allFields = entityMeta.fields;\n const entityOps = metadata.operations.filter((o) => o.entity === consumer.entity);\n\n const resolveFields = (names?: string[]): FieldMetadata[] => {\n if (!names || names.length === 0) return [...allFields];\n return names\n .map((name) => allFields.find((f) => f.name === name))\n .filter((f): f is FieldMetadata => f !== undefined);\n };\n\n // ConsumerDeclaration action keys are the local operation keys from EntityDeclaration.\n // Compiled OperationDef IDs follow the pattern `${entityId}.${opKey}`.\n const resolveOps = (keys?: string[], defaultScope?: string): OperationMetadata[] => {\n if (!keys || keys.length === 0) {\n return defaultScope ? entityOps.filter((o) => o.scope === defaultScope) : [...entityOps];\n }\n return keys\n .map((key) => {\n const fullId = `${consumer.entity}.${key}`;\n return entityOps.find((o) => o.id === fullId);\n })\n .filter((o): o is OperationMetadata => o !== undefined);\n };\n\n results.push({\n consumer: consumer.consumer,\n entity: consumer.entity,\n fields: {\n list: resolveFields(consumer.list?.fields),\n detail: resolveFields(consumer.detail?.fields),\n create: resolveFields(consumer.forms?.create?.fields),\n update: resolveFields(consumer.forms?.update?.fields),\n clone: resolveFields(consumer.forms?.clone?.fields),\n },\n operations: {\n row: resolveOps(consumer.actions?.row, 'record'),\n bulk: resolveOps(consumer.actions?.bulk, 'bulk'),\n global: resolveOps(consumer.actions?.global, 'global'),\n },\n });\n }\n\n return results;\n}\n","import { AuditRecorder } from '../audit/AuditRecorder.js';\nimport { DatasourceRegistry } from '../datasource/DatasourceRegistry.js';\nimport { OperationRegistry } from '../operation/OperationRegistry.js';\nimport { MetadataEngine } from './MetadataEngine.js';\nimport { MaestroEngine } from './MaestroEngine.js';\nimport { validateMaestroConfig } from '../schema/SchemaValidator.js';\nimport type { MaestroConfig } from '../schema/MaestroConfig.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport {\n compileDeclarations,\n resolveConsumerProjections,\n} from '../declarative/DeclarativeMetadataCompiler.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { ConsumerDeclaration } from '../declarative/ConsumerDeclaration.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\n\ninterface BindingError {\n path: string;\n message: string;\n}\n\n/**\n * Merges declared stubs with real implementations from config.operations.\n *\n * Rules:\n * - Every declared operation (stub) MUST have a matching implementation in config.operations.\n * Missing binding → CONFIGURATION_ERROR at startup (never at runtime).\n * - Duplicate IDs in config.operations → CONFIGURATION_ERROR.\n * - Entity mismatch between stub and implementation → CONFIGURATION_ERROR.\n * - config.operations entries that do not match any stub are kept as-is (legacy path).\n */\nfunction bindAndValidateOperations(\n stubs: OperationDef[],\n configOps: OperationDef[],\n): { operations: OperationDef[]; errors: BindingError[] } {\n const errors: BindingError[] = [];\n\n // Detect duplicate IDs in config.operations (two real implementations with the same id)\n const configOpMap = new Map<string, OperationDef>();\n for (const op of configOps) {\n if (configOpMap.has(op.id)) {\n errors.push({\n path: `operations[${op.id}]`,\n message: `Duplicate operation id '${op.id}' in config.operations. Each operation must have a unique id.`,\n });\n } else {\n configOpMap.set(op.id, op);\n }\n }\n\n const stubIds = new Set(stubs.map((s) => s.id));\n const bound: OperationDef[] = [];\n\n // Each declared stub must be bound to a real implementation\n for (const stub of stubs) {\n const impl = configOpMap.get(stub.id);\n if (!impl) {\n errors.push({\n path: `declarations.entities[${stub.entity}].operations`,\n message:\n `Declared operation '${stub.id}' has no implementation. ` +\n `Provide an OperationDef with id '${stub.id}' in config.operations.`,\n });\n continue;\n }\n\n // When both sides specify an entity, they must agree\n if (impl.entity !== undefined && impl.entity !== stub.entity) {\n errors.push({\n path: `operations[${impl.id}].entity`,\n message:\n `Operation '${impl.id}' is declared for entity '${stub.entity}' but ` +\n `config.operations specifies entity '${impl.entity}'.`,\n });\n continue;\n }\n\n bound.push(impl);\n }\n\n // Standalone config operations (no matching declaration) pass through as-is (legacy path)\n for (const op of configOpMap.values()) {\n if (!stubIds.has(op.id)) {\n bound.push(op);\n }\n }\n\n return { operations: bound, errors };\n}\n\n/**\n * Validates compiled relation cross-entity and cross-field references against final metadata.\n * Called after MetadataEngine.normalize() so the full entity/field set is available.\n */\nfunction validateRelationRefs(\n relations: RelationSchema[],\n metadata: MaestroMetadata,\n): BindingError[] {\n const errors: BindingError[] = [];\n const entityMap = new Map(metadata.entities.map((e) => [e.id, e]));\n\n for (const rel of relations) {\n const fromEntity = entityMap.get(rel.from.entity);\n if (!fromEntity) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message: `Relation '${rel.id}': source entity '${rel.from.entity}' not found in metadata.`,\n });\n continue;\n }\n\n const fromField = fromEntity.fields.find((f) => f.name === rel.from.field);\n if (!fromField) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message:\n `Relation '${rel.id}': fromField '${rel.from.field}' does not exist in entity '${rel.from.entity}'.`,\n });\n }\n\n const toEntity = entityMap.get(rel.to.entity);\n if (!toEntity) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message:\n `Relation '${rel.id}': target entity '${rel.to.entity}' not found in metadata. ` +\n `Ensure the target entity is declared, introspected, or manually configured.`,\n });\n continue;\n }\n\n const toField = toEntity.fields.find((f) => f.name === rel.to.field);\n if (!toField) {\n errors.push({\n path: `declarations.entities[${rel.from.entity}].relationships`,\n message:\n `Relation '${rel.id}': toField '${rel.to.field}' does not exist in entity '${rel.to.entity}'.`,\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Validates consumer entity references and field/operation references against final metadata.\n * Handles both consumers of declared entities and consumers of base-metadata entities.\n */\nfunction validateConsumerRefs(\n consumers: ConsumerDeclaration[],\n metadata: MaestroMetadata,\n): BindingError[] {\n const errors: BindingError[] = [];\n\n for (const consumer of consumers) {\n const entityMeta = metadata.entities.find((e) => e.id === consumer.entity);\n if (!entityMeta) {\n errors.push({\n path: `declarations.consumers[${consumer.consumer}].entity`,\n message:\n `Consumer '${consumer.consumer}' references entity '${consumer.entity}' which does not exist in the final metadata. ` +\n `Ensure the entity is declared, introspected, or manually configured.`,\n });\n continue;\n }\n\n const knownFields = new Set(entityMeta.fields.map((f) => f.name));\n const entityOps = metadata.operations.filter((o) => o.entity === consumer.entity);\n // Operation keys in consumer actions use the local key form; full ID is `${entity}.${key}`\n const knownOpKeys = new Set(\n entityOps.map((o) => (o.id.startsWith(`${consumer.entity}.`) ? o.id.slice(consumer.entity.length + 1) : o.id)),\n );\n\n const checkFields = (sectionPath: string, fieldNames?: string[]): void => {\n if (!fieldNames) return;\n for (let i = 0; i < fieldNames.length; i++) {\n if (!knownFields.has(fieldNames[i])) {\n errors.push({\n path: `declarations.consumers[${consumer.consumer}].${sectionPath}[${i}]`,\n message:\n `Consumer '${consumer.consumer}': field '${fieldNames[i]}' does not exist in entity '${consumer.entity}'.`,\n });\n }\n }\n };\n\n const checkOps = (sectionPath: string, opKeys?: string[]): void => {\n if (!opKeys) return;\n for (let i = 0; i < opKeys.length; i++) {\n if (!knownOpKeys.has(opKeys[i])) {\n errors.push({\n path: `declarations.consumers[${consumer.consumer}].${sectionPath}[${i}]`,\n message:\n `Consumer '${consumer.consumer}': operation '${opKeys[i]}' does not exist in entity '${consumer.entity}'.`,\n });\n }\n }\n };\n\n checkFields('list.fields', consumer.list?.fields);\n checkFields('detail.fields', consumer.detail?.fields);\n checkFields('forms.create.fields', consumer.forms?.create?.fields);\n checkFields('forms.update.fields', consumer.forms?.update?.fields);\n checkFields('forms.clone.fields', consumer.forms?.clone?.fields);\n checkOps('actions.row', consumer.actions?.row);\n checkOps('actions.bulk', consumer.actions?.bulk);\n checkOps('actions.global', consumer.actions?.global);\n }\n\n return errors;\n}\n\nexport function createMaestro(config: MaestroConfig): MaestroEngine {\n // ── Step 1: Compile declarative entities/consumers (if provided) ───────────\n let extraEntities: EntitySchema[] = [];\n let declaredOperations: OperationDef[] = [];\n let compiledConsumers: ConsumerDeclaration[] = [];\n let compiledRelations: RelationSchema[] = [];\n\n if (config.declarations) {\n const datasourceIds = Object.keys(config.datasources ?? {});\n const defaultDatasource =\n config.declarations.defaultDatasource ??\n (datasourceIds.length === 1 ? datasourceIds[0] : undefined);\n\n const compilation = compileDeclarations(config.declarations, {\n datasourceIds,\n defaultDatasource,\n });\n\n if (!compilation.valid) {\n const messages = compilation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Invalid declarative configuration: ${messages}`,\n );\n }\n\n extraEntities = compilation.entities;\n declaredOperations = compilation.operations;\n compiledConsumers = compilation.consumers;\n compiledRelations = compilation.relations;\n }\n\n // ── Step 2: Merge entities — direct EntitySchema takes precedence for uniqueness ──\n // Duplicate entity IDs across both sources will be caught by SchemaValidator below.\n const mergedEntities: EntitySchema[] = [\n ...(config.entities ?? []),\n ...extraEntities,\n ];\n\n // ── Step 3: Bind declared operations to real implementations ─────────────\n // Every declared operation must have a handler in config.operations.\n // Duplicate IDs in config.operations and entity mismatches are also caught here.\n const binding = bindAndValidateOperations(declaredOperations, config.operations ?? []);\n if (binding.errors.length > 0) {\n const messages = binding.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(ErrorCode.CONFIGURATION_ERROR, `Invalid operation bindings: ${messages}`);\n }\n const mergedOperations = binding.operations;\n\n // ── Step 4: Merge relations — declared relations added to config.relations ─\n const mergedRelations: RelationSchema[] = [\n ...(config.relations ?? []),\n ...compiledRelations,\n ];\n\n // ── Step 5: Validate the fully merged config ──────────────────────────────\n const mergedConfig: MaestroConfig = {\n ...config,\n entities: mergedEntities,\n operations: mergedOperations,\n relations: mergedRelations,\n };\n\n const validation = validateMaestroConfig(mergedConfig);\n if (!validation.valid) {\n const messages = validation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(ErrorCode.CONFIGURATION_ERROR, `Invalid Maestro configuration: ${messages}`);\n }\n\n // ── Step 6: Build metadata ────────────────────────────────────────────────\n const metadataEngine = new MetadataEngine();\n const metadata = metadataEngine.normalize(mergedConfig);\n\n // ── Step 7: Validate cross-entity relation references ────────────────────\n // Done after metadata is built so the full entity/field set is available.\n if (compiledRelations.length > 0) {\n const relErrors = validateRelationRefs(compiledRelations, metadata);\n if (relErrors.length > 0) {\n const messages = relErrors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Invalid relation references: ${messages}`,\n );\n }\n }\n\n // ── Step 8: Validate consumer entity and field/op references ─────────────\n // Handles both consumers of declared entities and consumers of base-metadata entities.\n if (compiledConsumers.length > 0) {\n const consumerErrors = validateConsumerRefs(compiledConsumers, metadata);\n if (consumerErrors.length > 0) {\n const messages = consumerErrors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Invalid consumer references: ${messages}`,\n );\n }\n }\n\n // ── Step 9: Resolve consumer projections against final metadata ───────────\n const consumers = resolveConsumerProjections(compiledConsumers, metadata);\n\n // ── Step 10: Build registries and engine ──────────────────────────────────\n const datasources = new DatasourceRegistry();\n for (const [id, provider] of Object.entries(config.datasources)) {\n datasources.register(id, provider);\n }\n\n const operations = new OperationRegistry();\n for (const operation of mergedOperations) {\n operations.register(operation);\n }\n\n const audit = config.audit ? new AuditRecorder(config.audit) : undefined;\n\n return new MaestroEngine(metadata, datasources, operations, audit, consumers);\n}\n","import type { FieldType } from '../metadata/FieldType.js';\n\nconst DISPLAY_FIELD_PRIORITY = [\n 'name', 'title', 'username', 'email', 'code', 'slug', 'label',\n 'first_name', 'firstname', 'full_name', 'fullname', 'subject',\n];\n\nconst TIMESTAMP_PATTERN =\n /^(created_at|createdat|created_date|createddate|updated_at|updatedat|updated_date|updateddate|deleted_at|deletedat|modified_at|modifiedat)$/i;\n\nconst SEARCH_CANDIDATE_PATTERN =\n /^(name|title|description|email|username|first_name|firstname|last_name|lastname|full_name|fullname|label|code|slug|reference|subject)$/i;\n\nexport function inferFieldType(nativeType: string, fieldName: string): FieldType {\n const nt = nativeType.toLowerCase().replace(/\\(.*\\)/, '').trim();\n const fn = fieldName.toLowerCase();\n\n if (['uuid', 'uniqueidentifier'].includes(nt)) return 'uuid';\n if (['boolean', 'bool', 'bit'].includes(nt)) return 'boolean';\n if (nt === 'date') return 'date';\n if (\n [\n 'timestamp', 'timestamptz', 'timestamp with time zone',\n 'timestamp without time zone', 'datetime', 'datetime2',\n ].includes(nt)\n )\n return 'datetime';\n if (['time', 'timetz', 'time with time zone', 'time without time zone'].includes(nt))\n return 'time';\n if (['json', 'jsonb'].includes(nt)) return 'json';\n if (nt.includes('[]') || nt === 'array') return 'array';\n if (\n [\n 'int', 'int2', 'int4', 'int8', 'int16', 'integer', 'bigint', 'smallint',\n 'tinyint', 'mediumint', 'serial', 'bigserial', 'smallserial',\n ].includes(nt)\n )\n return 'integer';\n if (['float', 'float4', 'float8', 'double', 'double precision', 'real'].includes(nt))\n return 'number';\n if (['decimal', 'numeric', 'money', 'smallmoney'].includes(nt)) {\n if (\n /^(price|amount|value|total|cost|fee|salary|balance|revenue|profit|tax)$|_(price|amount|value|total|cost|fee)$/.test(\n fn,\n )\n )\n return 'currency';\n return 'decimal';\n }\n if (['text', 'mediumtext', 'longtext', 'clob'].includes(nt)) return 'text';\n\n // Name-based heuristics applied after type mapping for string-family types\n if (fn === 'email' || fn.endsWith('_email')) return 'email';\n if (fn === 'phone' || fn === 'telephone' || fn.endsWith('_phone') || fn.endsWith('_tel'))\n return 'phone';\n if (fn === 'url' || fn === 'website' || fn.endsWith('_url') || fn.endsWith('_website'))\n return 'url';\n if (/^(doc|document|cpf|cnpj|ssn|nif|rg)$|_(doc|document|cpf|cnpj|ssn|rg)$/.test(fn))\n return 'document';\n\n return 'string';\n}\n\nexport function isTimestampField(fieldName: string, fieldType: FieldType): boolean {\n return TIMESTAMP_PATTERN.test(fieldName) && (fieldType === 'datetime' || fieldType === 'date');\n}\n\nexport function isSoftDeleteCandidate(\n fieldName: string,\n fieldType: FieldType,\n nullable: boolean,\n): boolean {\n const fn = fieldName.toLowerCase();\n if ((fn === 'deleted_at' || fn === 'deletedat') && fieldType === 'datetime' && nullable)\n return true;\n if (\n (fn === 'is_deleted' || fn === 'isdeleted' || fn === 'deleted') &&\n fieldType === 'boolean'\n )\n return true;\n if (\n (fn === 'is_active' || fn === 'isactive' || fn === 'active') &&\n fieldType === 'boolean'\n )\n return true;\n return false;\n}\n\nexport function isSearchCandidate(\n fieldName: string,\n fieldType: FieldType,\n isPrimaryKey: boolean,\n): boolean {\n if (isPrimaryKey) return false;\n if (!['string', 'text', 'email', 'phone', 'url'].includes(fieldType)) return false;\n return SEARCH_CANDIDATE_PATTERN.test(fieldName);\n}\n\nexport function tableNameToEntityId(table: string): string {\n return table\n .replace(/([A-Z])/g, (match, c, offset: number) => (offset > 0 ? `-${c}` : c))\n .replace(/_/g, '-')\n .replace(/--+/g, '-')\n .toLowerCase();\n}\n\nfunction humanizeWord(word: string): string {\n if (!word) return '';\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n\nexport function tableNameToLabel(table: string): { singular: string; plural: string } {\n const words = table\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map(humanizeWord);\n\n const plural = words.join(' ');\n const lastWord = words[words.length - 1];\n\n let singularLast: string;\n if (lastWord.toLowerCase().endsWith('ies')) {\n singularLast = lastWord.slice(0, -3) + 'y';\n } else if (\n lastWord.toLowerCase().endsWith('ses') ||\n lastWord.toLowerCase().endsWith('xes') ||\n lastWord.toLowerCase().endsWith('ches') ||\n lastWord.toLowerCase().endsWith('shes')\n ) {\n singularLast = lastWord.slice(0, -2);\n } else if (lastWord.toLowerCase().endsWith('s') && !lastWord.toLowerCase().endsWith('ss')) {\n singularLast = lastWord.slice(0, -1);\n } else {\n singularLast = lastWord;\n }\n\n const singular = [...words.slice(0, -1), singularLast].join(' ');\n return { singular, plural };\n}\n\nexport function humanizeFieldName(name: string): string {\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/_/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function detectDisplayField(\n fields: Array<{ name: string; type: FieldType; isPrimaryKey: boolean }>,\n): string | undefined {\n for (const priority of DISPLAY_FIELD_PRIORITY) {\n const match = fields.find((f) => f.name.toLowerCase() === priority && !f.isPrimaryKey);\n if (match) return match.name;\n }\n const fallback = fields.find(\n (f) => !f.isPrimaryKey && ['string', 'text', 'email'].includes(f.type),\n );\n return fallback?.name;\n}\n","import type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type {\n EntityIntrospectionSchema,\n FieldIntrospectionSchema,\n RelationIntrospectionSchema,\n} from '../introspection/IntrospectionResult.js';\nimport type { LoadedConfig } from '../config-loader/MaestroFileLoader.js';\nimport type { MaestroConfig } from '../schema/MaestroConfig.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { DatasourceProvider } from '../datasource/DatasourceProvider.js';\nimport type { SoftDeleteConfig } from '../metadata/SoftDeleteConfig.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { AuditRepository } from '../audit/AuditRepository.js';\nimport type { Logger } from '../logging/Logger.js';\nimport {\n tableNameToEntityId,\n tableNameToLabel,\n detectDisplayField,\n humanizeFieldName,\n} from '../introspection/utils.js';\n\nexport type MergeStrategy = 'extend' | 'override';\n\nexport interface MergeIntrospectionOptions {\n introspection: IntrospectionResult;\n overrides: LoadedConfig;\n datasources: Record<string, DatasourceProvider>;\n defaultDatasource: string;\n strategy?: MergeStrategy;\n operations?: OperationDef[];\n audit?: AuditRepository;\n logger?: Logger;\n}\n\nfunction fieldFromIntrospection(field: FieldIntrospectionSchema): FieldSchema {\n return {\n name: field.name,\n label: humanizeFieldName(field.name),\n type: field.type,\n required: !field.nullable && !field.isPrimaryKey,\n readonly: field.isPrimaryKey,\n hidden: field.isPrimaryKey,\n searchable: field.candidateForSearch ?? false,\n sortable: !field.isPrimaryKey && !field.isTimestamp,\n filterable: field.isIndexed ?? false,\n exportable: !field.isPrimaryKey,\n };\n}\n\nfunction mergeFields(\n introspectedFields: FieldIntrospectionSchema[],\n overrideFields: FieldSchema[],\n strategy: MergeStrategy,\n): FieldSchema[] {\n const overrideMap = new Map(overrideFields.map((f) => [f.name, f]));\n const introspectedMap = new Map(introspectedFields.map((f) => [f.name, f]));\n\n const result: FieldSchema[] = [];\n\n // Process override fields first (preserving their order and properties)\n for (const override of overrideFields) {\n const introspected = introspectedMap.get(override.name);\n if (introspected) {\n // Field exists in both: override wins on all set properties\n result.push(override);\n } else {\n // YAML-only field (declarative): keep as-is\n result.push(override);\n }\n }\n\n // In 'extend' strategy, append introspected fields not present in overrides\n if (strategy === 'extend') {\n for (const introspected of introspectedFields) {\n if (!overrideMap.has(introspected.name)) {\n result.push(fieldFromIntrospection(introspected));\n }\n }\n }\n\n return result;\n}\n\nfunction detectSoftDelete(\n fields: FieldIntrospectionSchema[],\n): SoftDeleteConfig | undefined {\n const PRIORITY = ['deleted_at', 'deletedat', 'is_deleted', 'isdeleted', 'deleted', 'is_active', 'isactive', 'active'];\n for (const candidate of PRIORITY) {\n const field = fields.find((f) => f.name.toLowerCase() === candidate && f.candidateForSoftDelete);\n if (field) {\n const fn = field.name.toLowerCase();\n if (fn === 'deleted_at' || fn === 'deletedat') {\n return { field: field.name, activeValue: null, inactiveValue: 'timestamp' };\n }\n if (fn === 'is_deleted' || fn === 'isdeleted' || fn === 'deleted') {\n return { field: field.name, activeValue: false, inactiveValue: true };\n }\n return { field: field.name, activeValue: true, inactiveValue: false };\n }\n }\n return undefined;\n}\n\nfunction detectSearchConfig(fields: FieldIntrospectionSchema[]): { fields: string[] } | undefined {\n const searchFields = fields\n .filter((f) => f.candidateForSearch)\n .map((f) => f.name);\n return searchFields.length > 0 ? { fields: searchFields } : undefined;\n}\n\nfunction entityFromIntrospection(\n entity: EntityIntrospectionSchema,\n datasource: string,\n): EntitySchema {\n const pk = entity.fields.find((f) => f.isPrimaryKey)?.name ?? 'id';\n const displayField = detectDisplayField(entity.fields);\n const softDelete = detectSoftDelete(entity.fields);\n const search = detectSearchConfig(entity.fields);\n\n return {\n id: tableNameToEntityId(entity.table),\n label: tableNameToLabel(entity.table),\n source: {\n datasource,\n table: entity.table,\n primaryKey: pk,\n },\n displayField,\n fields: entity.fields.map(fieldFromIntrospection),\n ...(softDelete && { softDelete }),\n ...(search && { search }),\n };\n}\n\nfunction mergeEntity(\n introspected: EntityIntrospectionSchema,\n override: EntitySchema,\n strategy: MergeStrategy,\n): EntitySchema {\n return {\n ...override,\n fields: mergeFields(introspected.fields, override.fields, strategy),\n };\n}\n\nfunction introspectedRelationToSchema(\n rel: RelationIntrospectionSchema,\n entityIdByTable: Map<string, string>,\n): RelationSchema | null {\n const fromEntity = entityIdByTable.get(rel.from.table);\n const toEntity = entityIdByTable.get(rel.to.table);\n if (!fromEntity || !toEntity) return null;\n return {\n id: rel.id,\n type: rel.type,\n from: { entity: fromEntity, field: rel.from.field },\n to: { entity: toEntity, field: rel.to.field },\n label: `${tableNameToLabel(rel.to.table).plural}`,\n };\n}\n\nexport function mergeIntrospectionWithOverrides(\n options: MergeIntrospectionOptions,\n): MaestroConfig {\n const { introspection, overrides, datasources, defaultDatasource, strategy = 'extend' } = options;\n\n // Build lookup maps\n const overrideByTable = new Map<string, EntitySchema>();\n const overrideById = new Map<string, EntitySchema>();\n for (const entity of overrides.entities) {\n overrideByTable.set(entity.source.table, entity);\n overrideById.set(entity.id, entity);\n }\n\n const entityIdByTable = new Map<string, string>();\n const mergedEntities: EntitySchema[] = [];\n const handledOverrideIds = new Set<string>();\n\n // Process introspected entities\n for (const introspectedEntity of introspection.entities) {\n const override =\n overrideByTable.get(introspectedEntity.table) ??\n overrideById.get(tableNameToEntityId(introspectedEntity.table));\n\n if (override) {\n handledOverrideIds.add(override.id);\n mergedEntities.push(mergeEntity(introspectedEntity, override, strategy));\n entityIdByTable.set(introspectedEntity.table, override.id);\n } else {\n const generated = entityFromIntrospection(introspectedEntity, defaultDatasource);\n mergedEntities.push(generated);\n entityIdByTable.set(introspectedEntity.table, generated.id);\n }\n }\n\n // Keep purely declarative entities not matched by any introspected table\n for (const override of overrides.entities) {\n if (!handledOverrideIds.has(override.id)) {\n mergedEntities.push(override);\n }\n }\n\n // Process relations\n const overrideRelationIds = new Set(overrides.relations.map((r) => r.id));\n const mergedRelations: RelationSchema[] = [...overrides.relations];\n\n for (const rel of introspection.relations) {\n if (!overrideRelationIds.has(rel.id)) {\n const schema = introspectedRelationToSchema(rel, entityIdByTable);\n if (schema) mergedRelations.push(schema);\n }\n }\n\n return {\n datasources,\n entities: mergedEntities,\n relations: mergedRelations,\n policies: overrides.policies,\n operations: options.operations,\n audit: options.audit,\n logger: options.logger,\n };\n}\n","import type { IntrospectionProvider } from '../introspection/IntrospectionProvider.js';\nimport type { LoadedConfig } from '../config-loader/MaestroFileLoader.js';\nimport type { DatasourceProvider } from '../datasource/DatasourceProvider.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { AuditRepository } from '../audit/AuditRepository.js';\nimport type { Logger } from '../logging/Logger.js';\nimport type { RbacPolicy } from '../rbac/RbacPolicy.js';\nimport type { MergeStrategy } from '../hybrid-loader/HybridLoader.js';\nimport { mergeIntrospectionWithOverrides } from '../hybrid-loader/HybridLoader.js';\nimport { createMaestro } from './createMaestro.js';\nimport type { MaestroEngine } from './MaestroEngine.js';\n\nexport interface CreateMaestroFromIntrospectionOptions {\n provider: IntrospectionProvider;\n overrides?: LoadedConfig;\n mergeStrategy?: MergeStrategy;\n datasources?: Record<string, DatasourceProvider>;\n defaultDatasource?: string;\n policies?: RbacPolicy;\n operations?: OperationDef[];\n audit?: AuditRepository;\n logger?: Logger;\n}\n\nexport async function createMaestroFromIntrospection(\n options: CreateMaestroFromIntrospectionOptions,\n): Promise<MaestroEngine> {\n const introspection = await options.provider.introspect();\n\n const overrides = options.overrides ?? { entities: [], relations: [] };\n const datasources = options.datasources ?? {};\n const defaultDatasource = options.defaultDatasource ?? '';\n\n const config = mergeIntrospectionWithOverrides({\n introspection,\n overrides,\n datasources,\n defaultDatasource,\n strategy: options.mergeStrategy ?? 'extend',\n operations: options.operations,\n audit: options.audit,\n logger: options.logger,\n });\n\n if (options.policies) {\n config.policies = options.policies;\n }\n\n return createMaestro(config);\n}\n","import type { QueryInput } from '../query/QueryInput.js';\nimport type { FilterDescriptor } from '../query/FilterDescriptor.js';\nimport type { SortDescriptor } from '../query/SortDescriptor.js';\nimport type { FilterOperator } from '../query/FilterOperator.js';\nimport type { PagePagination, OffsetPagination, CursorPagination } from '../query/PaginationInput.js';\n\nconst VALID_OPERATORS = new Set<FilterOperator>([\n 'equals', 'notEquals', 'contains', 'startsWith', 'endsWith',\n 'in', 'notIn', 'gt', 'gte', 'lt', 'lte', 'between',\n 'isNull', 'isNotNull', 'isTrue', 'isFalse',\n]);\n\nfunction parseStr(val: string | string[] | undefined): string | undefined {\n return Array.isArray(val) ? val[0] : val;\n}\n\nfunction parseNum(val: string | string[] | undefined): number | undefined {\n const s = parseStr(val);\n if (!s) return undefined;\n const n = Number(s);\n return Number.isNaN(n) ? undefined : n;\n}\n\nfunction parseFilterValue(operator: FilterOperator, value: string | undefined): unknown {\n if (value === undefined) return undefined;\n if (operator === 'in' || operator === 'notIn') return value.split(',');\n if (operator === 'between') {\n const [from, to] = value.split(',');\n return [from, to];\n }\n return value;\n}\n\nexport function parseQueryInput(query: Record<string, string | string[]>): QueryInput {\n const result: QueryInput = {};\n\n const filterParam = query['filter'] ?? query['filters'];\n if (filterParam) {\n const rawFilters = Array.isArray(filterParam) ? filterParam : [filterParam];\n const filters: FilterDescriptor[] = [];\n for (const raw of rawFilters) {\n const colonIdx = raw.indexOf(':');\n if (colonIdx === -1) continue;\n const field = raw.slice(0, colonIdx);\n const rest = raw.slice(colonIdx + 1);\n const colonIdx2 = rest.indexOf(':');\n const op = colonIdx2 === -1 ? rest : rest.slice(0, colonIdx2);\n const valueRaw = colonIdx2 === -1 ? undefined : rest.slice(colonIdx2 + 1);\n if (!field || !VALID_OPERATORS.has(op as FilterOperator)) continue;\n const operator = op as FilterOperator;\n filters.push({ field, operator, value: parseFilterValue(operator, valueRaw) });\n }\n if (filters.length > 0) result.filters = filters;\n }\n\n const sortParam = query['sort'];\n if (sortParam) {\n const rawSorts = Array.isArray(sortParam) ? sortParam : [sortParam];\n const sort: SortDescriptor[] = [];\n for (const raw of rawSorts) {\n const colonIdx = raw.indexOf(':');\n const field = colonIdx === -1 ? raw : raw.slice(0, colonIdx);\n const direction = colonIdx === -1 ? 'asc' : raw.slice(colonIdx + 1);\n if (!field) continue;\n sort.push({ field, direction: direction === 'desc' ? 'desc' : 'asc' });\n }\n if (sort.length > 0) result.sort = sort;\n }\n\n const page = parseNum(query['page']);\n const pageSize = parseNum(query['pageSize']);\n const offset = parseNum(query['offset']);\n const limit = parseNum(query['limit']);\n const cursor = parseStr(query['cursor']);\n\n if (page !== undefined) {\n const pagination: PagePagination = { strategy: 'page', page, pageSize: pageSize ?? 20 };\n result.pagination = pagination;\n } else if (offset !== undefined) {\n const pagination: OffsetPagination = { strategy: 'offset', offset, limit: limit ?? 20 };\n result.pagination = pagination;\n } else if (cursor !== undefined) {\n const pagination: CursorPagination = { strategy: 'cursor', cursor, limit: limit ?? 20 };\n result.pagination = pagination;\n }\n\n const searchTerm = parseStr(query['search']);\n if (searchTerm) {\n const searchFields = parseStr(query['searchFields']);\n result.search = {\n term: searchTerm,\n fields: searchFields ? searchFields.split(',') : [],\n };\n }\n\n return result;\n}\n","import type { MaestroEngine } from '../engine/MaestroEngine.js';\nimport type { MaestroHttpHandler, MaestroHttpResponse } from './MaestroHttpContract.js';\nimport type { MaestroHttpOptions } from './ActorResolver.js';\nimport type { MaestroHttpHandlers } from './HttpHandlers.js';\nimport { MaestroError } from '../errors/MaestroError.js';\nimport { ErrorCode } from '../errors/ErrorCode.js';\nimport { parseQueryInput } from './QueryStringParser.js';\n\nconst HTTP_STATUS: Record<ErrorCode, number> = {\n [ErrorCode.PERMISSION_DENIED]: 403,\n [ErrorCode.NOT_FOUND]: 404,\n [ErrorCode.CONFLICT]: 409,\n [ErrorCode.VALIDATION_ERROR]: 400,\n [ErrorCode.CONFIGURATION_ERROR]: 400,\n [ErrorCode.INTERNAL_ERROR]: 500,\n};\n\nfunction errorResponse(err: unknown): MaestroHttpResponse {\n if (err instanceof MaestroError) {\n return {\n status: HTTP_STATUS[err.code] ?? 500,\n body: { error: err.code, message: err.message },\n };\n }\n const message = err instanceof Error ? err.message : 'Internal server error';\n return { status: 500, body: { error: 'INTERNAL_ERROR', message } };\n}\n\nexport function createMaestroHttpHandlers(\n engine: MaestroEngine,\n options: MaestroHttpOptions,\n): MaestroHttpHandlers {\n const resolve = options.actorResolver;\n\n const list: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const result = await engine.list(req.params['entity']!, parseQueryInput(req.query), actor);\n return { status: 200, body: result };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const findById: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const record = await engine.findById(req.params['entity']!, req.params['id']!, actor);\n if (!record) {\n return { status: 404, body: { error: 'NOT_FOUND', message: `Record '${req.params['id']}' not found.` } };\n }\n return { status: 200, body: record };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const create: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const created = await engine.create(req.params['entity']!, req.body as Record<string, unknown>, actor);\n return { status: 201, body: created };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const update: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const updated = await engine.update(\n req.params['entity']!,\n req.params['id']!,\n req.body as Record<string, unknown>,\n actor,\n );\n return { status: 200, body: updated };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const clone: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const cloned = await engine.clone(req.params['entity']!, req.params['id']!, actor);\n return { status: 201, body: cloned };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const softDelete: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n await engine.softDelete(req.params['entity']!, req.params['id']!, actor);\n return { status: 204, body: null };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const restore: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n await engine.restore(req.params['entity']!, req.params['id']!, actor);\n return { status: 200, body: { success: true } };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const hardDelete: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n await engine.hardDelete(req.params['entity']!, req.params['id']!, actor);\n return { status: 204, body: null };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const exportHandler: MaestroHttpHandler = async (req) => {\n try {\n const { actor } = await resolve(req);\n const rawFormat = Array.isArray(req.query['format']) ? req.query['format'][0] : req.query['format'];\n const format = rawFormat === 'json' ? ('json' as const) : ('csv' as const);\n const exportResult = await engine.export(req.params['entity']!, parseQueryInput(req.query), actor, format);\n return {\n status: 200,\n body: exportResult.data,\n headers: {\n 'Content-Type': exportResult.mimeType,\n 'Content-Disposition': `attachment; filename=\"${exportResult.filename}\"`,\n },\n };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const executeOperation: MaestroHttpHandler = async (req) => {\n try {\n const { actor, correlationId } = await resolve(req);\n const body = (req.body ?? {}) as Record<string, unknown>;\n const result = await engine.executeOperation(\n req.params['operationId']!,\n {\n actor,\n correlationId,\n entityId: body['entityId'] as string | undefined,\n record: body['record'] as Record<string, unknown> | undefined,\n input: body['input'],\n },\n actor,\n );\n return { status: result.success ? 200 : 422, body: result };\n } catch (err) {\n return errorResponse(err);\n }\n };\n\n const getMetadata: MaestroHttpHandler = async () => {\n return { status: 200, body: engine.getMetadata() };\n };\n\n const getEntityMetadata: MaestroHttpHandler = async (req) => {\n const entityId = req.params['entity']!;\n const meta = engine.getMetadata();\n const entity = meta.entities.find((e) => e.id === entityId);\n if (!entity) {\n return { status: 404, body: { error: 'NOT_FOUND', message: `Entity '${entityId}' not found.` } };\n }\n return { status: 200, body: entity };\n };\n\n const health: MaestroHttpHandler = async () => {\n return { status: 200, body: { status: 'ok' } };\n };\n\n return {\n list,\n findById,\n create,\n update,\n clone,\n softDelete,\n restore,\n hardDelete,\n export: exportHandler,\n executeOperation,\n getMetadata,\n getEntityMetadata,\n health,\n };\n}\n","import { readFile, readdir, access } from 'node:fs/promises';\nimport { join, extname } from 'node:path';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { RbacPolicy } from '../rbac/RbacPolicy.js';\nimport type { YamlParser } from './YamlParser.js';\n\nexport interface FileSystemReader {\n readFile(path: string): Promise<string>;\n readDir(path: string): Promise<string[]>;\n exists(path: string): Promise<boolean>;\n}\n\nexport interface MaestroFileLoaderOptions {\n rootDir: string;\n yamlParser?: YamlParser;\n fileReader?: FileSystemReader;\n}\n\nexport interface LoadedConfig {\n entities: EntitySchema[];\n relations: RelationSchema[];\n policies?: RbacPolicy;\n}\n\nconst defaultFileReader: FileSystemReader = {\n readFile: (p) => readFile(p, 'utf-8'),\n readDir: async (p) => {\n const entries = await readdir(p, { withFileTypes: true });\n return entries.filter((e) => e.isFile()).map((e) => e.name);\n },\n exists: async (p) => {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n },\n};\n\nfunction parseContent(content: string, ext: string, yamlParser?: YamlParser): unknown {\n if (ext === '.yml' || ext === '.yaml') {\n if (!yamlParser) {\n throw new Error(\n 'YAML files require a yamlParser option. Install js-yaml and pass { parse: jsYaml.load } as yamlParser.',\n );\n }\n return yamlParser.parse(content);\n }\n return JSON.parse(content) as unknown;\n}\n\nasync function readAllInDir(\n dir: string,\n suffix: string,\n reader: FileSystemReader,\n yamlParser?: YamlParser,\n): Promise<unknown[]> {\n const exists = await reader.exists(dir);\n if (!exists) return [];\n\n const files = await reader.readDir(dir);\n const matched = files.filter(\n (f) =>\n f.endsWith(`${suffix}.json`) ||\n f.endsWith(`${suffix}.yml`) ||\n f.endsWith(`${suffix}.yaml`),\n );\n\n const results: unknown[] = [];\n for (const f of matched) {\n const content = await reader.readFile(join(dir, f));\n results.push(parseContent(content, extname(f), yamlParser));\n }\n return results;\n}\n\nexport async function loadMaestroConfig(options: MaestroFileLoaderOptions): Promise<LoadedConfig> {\n const reader = options.fileReader ?? defaultFileReader;\n const { rootDir, yamlParser } = options;\n\n const [entitiesRaw, relationsRaw] = await Promise.all([\n readAllInDir(join(rootDir, 'entities'), '.entity', reader, yamlParser),\n readAllInDir(join(rootDir, 'relations'), '.relation', reader, yamlParser),\n ]);\n\n let policies: RbacPolicy | undefined;\n const policyCandidates = [\n 'policies/rbac.policy.json',\n 'policies/rbac.policy.yml',\n 'policies/rbac.policy.yaml',\n ];\n for (const candidate of policyCandidates) {\n const fullPath = join(rootDir, candidate);\n if (await reader.exists(fullPath)) {\n const content = await reader.readFile(fullPath);\n policies = parseContent(content, extname(candidate), yamlParser) as RbacPolicy;\n break;\n }\n }\n\n return {\n entities: entitiesRaw as EntitySchema[],\n relations: relationsRaw as RelationSchema[],\n policies,\n };\n}\n","/**\n * Public structural validator for the `IntrospectionResult` contract. Accepts unknown/untrusted input\n * (e.g. a parsed JSON file) and checks it against the required (non-optional) fields of\n * `IntrospectionResult`/`EntityIntrospectionSchema`/`FieldIntrospectionSchema`/`RelationIntrospectionSchema`.\n * Optional derived fields (`isUnique`, `candidateForSearch`, `isTimestamp`, …) are not validated —\n * they pass through untouched when present.\n */\nexport interface IntrospectionValidationIssue {\n /** Logical path of the offending field, e.g. `entities[0].fields[1].nullable`. */\n path: string;\n /** Human-readable reason, including expected vs. received type when applicable. */\n message: string;\n}\n\nexport interface IntrospectionValidationResult {\n valid: boolean;\n issues: IntrospectionValidationIssue[];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction typeOf(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\nfunction reject(\n issues: IntrospectionValidationIssue[],\n path: string,\n expected: string,\n received: unknown,\n): void {\n issues.push({ path, message: `expected ${expected}, received ${typeOf(received)}.` });\n}\n\nfunction validateEndpoint(\n endpoint: unknown,\n path: string,\n issues: IntrospectionValidationIssue[],\n): void {\n if (!isObject(endpoint)) {\n reject(issues, path, 'an object with \"table\" and \"field\"', endpoint);\n return;\n }\n if (!nonEmptyString(endpoint['table'])) {\n reject(issues, `${path}.table`, 'a non-empty string', endpoint['table']);\n }\n if (!nonEmptyString(endpoint['field'])) {\n reject(issues, `${path}.field`, 'a non-empty string', endpoint['field']);\n }\n}\n\nfunction validateField(\n entityIndex: number,\n fieldIndex: number,\n field: unknown,\n issues: IntrospectionValidationIssue[],\n): void {\n const path = `entities[${entityIndex}].fields[${fieldIndex}]`;\n if (!isObject(field)) {\n reject(issues, path, 'an object', field);\n return;\n }\n if (!nonEmptyString(field['name'])) reject(issues, `${path}.name`, 'a non-empty string', field['name']);\n if (typeof field['nativeType'] !== 'string') reject(issues, `${path}.nativeType`, 'a string', field['nativeType']);\n if (typeof field['type'] !== 'string') reject(issues, `${path}.type`, 'a string', field['type']);\n if (typeof field['nullable'] !== 'boolean') reject(issues, `${path}.nullable`, 'a boolean', field['nullable']);\n if (typeof field['isPrimaryKey'] !== 'boolean') {\n reject(issues, `${path}.isPrimaryKey`, 'a boolean', field['isPrimaryKey']);\n }\n}\n\nfunction validateEntity(\n index: number,\n entity: unknown,\n issues: IntrospectionValidationIssue[],\n): void {\n const path = `entities[${index}]`;\n if (!isObject(entity)) {\n reject(issues, path, 'an object', entity);\n return;\n }\n if (!nonEmptyString(entity['table'])) reject(issues, `${path}.table`, 'a non-empty string', entity['table']);\n if (!Array.isArray(entity['fields'])) {\n reject(issues, `${path}.fields`, 'an array', entity['fields']);\n return;\n }\n const fields = entity['fields'] as unknown[];\n for (let j = 0; j < fields.length; j++) {\n validateField(index, j, fields[j], issues);\n }\n}\n\nfunction validateRelation(\n index: number,\n relation: unknown,\n issues: IntrospectionValidationIssue[],\n): void {\n const path = `relations[${index}]`;\n if (!isObject(relation)) {\n reject(issues, path, 'an object', relation);\n return;\n }\n if (!nonEmptyString(relation['id'])) reject(issues, `${path}.id`, 'a non-empty string', relation['id']);\n if (typeof relation['type'] !== 'string') reject(issues, `${path}.type`, 'a string', relation['type']);\n validateEndpoint(relation['from'], `${path}.from`, issues);\n validateEndpoint(relation['to'], `${path}.to`, issues);\n if (relation['confidence'] !== 'definite' && relation['confidence'] !== 'inferred') {\n issues.push({\n path: `${path}.confidence`,\n message: `expected \"definite\" or \"inferred\", received ${JSON.stringify(relation['confidence'])}.`,\n });\n }\n}\n\n/**\n * Validates that an unknown value matches the `IntrospectionResult` contract closely enough to be\n * safely consumed downstream. Accumulates every issue found (rather than failing fast) so callers can\n * surface a complete, readable list of problems in one pass.\n */\nexport function validateIntrospectionResult(value: unknown): IntrospectionValidationResult {\n const issues: IntrospectionValidationIssue[] = [];\n\n if (!isObject(value)) {\n reject(issues, '', 'an object with \"entities\" and \"relations\" arrays', value);\n return { valid: false, issues };\n }\n\n if (!Array.isArray(value['entities'])) {\n reject(issues, 'entities', 'an array', value['entities']);\n } else {\n const entities = value['entities'] as unknown[];\n for (let i = 0; i < entities.length; i++) {\n validateEntity(i, entities[i], issues);\n }\n }\n\n if (!Array.isArray(value['relations'])) {\n reject(issues, 'relations', 'an array', value['relations']);\n } else {\n const relations = value['relations'] as unknown[];\n for (let i = 0; i < relations.length; i++) {\n validateRelation(i, relations[i], issues);\n }\n }\n\n return { valid: issues.length === 0, issues };\n}\n","import type { IntrospectionResult } from './IntrospectionResult.js';\n\nfunction compareStrings(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Normalizes a valid `IntrospectionResult` into a deterministic, canonical form: entities sorted by\n * `table`, relations sorted by `id`. The internal order of `fields`/`indices` is preserved, since column\n * order is operationally meaningful. Never adds volatile data (timestamps, absolute paths, hashes) —\n * the same input always normalizes to the same output.\n */\nexport function normalizeIntrospectionResult(result: IntrospectionResult): IntrospectionResult {\n const entities = [...result.entities].sort((a, b) => compareStrings(a.table, b.table));\n const relations = [...result.relations].sort((a, b) => compareStrings(a.id, b.id));\n return { entities, relations };\n}\n","import type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type {\n EntityIntrospectionSchema,\n FieldIntrospectionSchema,\n RelationIntrospectionSchema,\n} from '../introspection/IntrospectionResult.js';\nimport type { EntitySchema } from '../schema/EntitySchema.js';\nimport type { FieldSchema } from '../schema/FieldSchema.js';\nimport type { RelationSchema } from '../schema/RelationSchema.js';\nimport type { SoftDeleteConfig } from '../metadata/SoftDeleteConfig.js';\nimport {\n tableNameToEntityId,\n tableNameToLabel,\n detectDisplayField,\n humanizeFieldName,\n} from '../introspection/utils.js';\n\nexport interface GeneratedConfig {\n entities: Record<string, EntitySchema>;\n relations: Record<string, RelationSchema>;\n}\n\nfunction detectSoftDelete(fields: FieldIntrospectionSchema[]): SoftDeleteConfig | undefined {\n const PRIORITY = [\n 'deleted_at', 'deletedat',\n 'is_deleted', 'isdeleted', 'deleted',\n 'is_active', 'isactive', 'active',\n ];\n for (const candidate of PRIORITY) {\n const field = fields.find(\n (f) => f.name.toLowerCase() === candidate && f.candidateForSoftDelete,\n );\n if (!field) continue;\n const fn = field.name.toLowerCase();\n if (fn === 'deleted_at' || fn === 'deletedat') {\n return { field: field.name, activeValue: null, inactiveValue: 'timestamp' };\n }\n if (fn === 'is_deleted' || fn === 'isdeleted' || fn === 'deleted') {\n return { field: field.name, activeValue: false, inactiveValue: true };\n }\n return { field: field.name, activeValue: true, inactiveValue: false };\n }\n return undefined;\n}\n\nfunction fieldToSchema(field: FieldIntrospectionSchema): FieldSchema {\n return {\n name: field.name,\n label: humanizeFieldName(field.name),\n type: field.type,\n required: !field.nullable && !field.isPrimaryKey,\n readonly: field.isPrimaryKey,\n hidden: field.isPrimaryKey,\n searchable: field.candidateForSearch ?? false,\n sortable: !field.isPrimaryKey && !field.isTimestamp,\n filterable: field.isIndexed ?? false,\n exportable: !field.isPrimaryKey,\n };\n}\n\nexport function generateEntityConfig(\n entity: EntityIntrospectionSchema,\n datasource: string,\n): EntitySchema {\n const pk = entity.fields.find((f) => f.isPrimaryKey)?.name ?? 'id';\n const displayField = detectDisplayField(entity.fields);\n const softDelete = detectSoftDelete(entity.fields);\n const searchFields = entity.fields\n .filter((f) => f.candidateForSearch)\n .map((f) => f.name);\n\n return {\n id: tableNameToEntityId(entity.table),\n label: tableNameToLabel(entity.table),\n source: {\n datasource,\n table: entity.table,\n primaryKey: pk,\n },\n ...(displayField && { displayField }),\n fields: entity.fields.map(fieldToSchema),\n ...(softDelete && { softDelete }),\n ...(searchFields.length > 0 && { search: { fields: searchFields } }),\n };\n}\n\nexport function generateRelationConfig(\n relation: RelationIntrospectionSchema,\n entityIdByTable: Map<string, string>,\n): RelationSchema | null {\n const fromEntity = entityIdByTable.get(relation.from.table);\n const toEntity = entityIdByTable.get(relation.to.table);\n if (!fromEntity || !toEntity) return null;\n return {\n id: relation.id,\n type: relation.type,\n from: { entity: fromEntity, field: relation.from.field },\n to: { entity: toEntity, field: relation.to.field },\n label: tableNameToLabel(relation.to.table).plural,\n };\n}\n\nexport function generateAllConfigs(\n result: IntrospectionResult,\n datasource: string,\n): GeneratedConfig {\n const entities: Record<string, EntitySchema> = {};\n const entityIdByTable = new Map<string, string>();\n\n for (const entity of result.entities) {\n const schema = generateEntityConfig(entity, datasource);\n entities[schema.id] = schema;\n entityIdByTable.set(entity.table, schema.id);\n }\n\n const relations: Record<string, RelationSchema> = {};\n for (const relation of result.relations) {\n const schema = generateRelationConfig(relation, entityIdByTable);\n if (schema) relations[schema.id] = schema;\n }\n\n return { entities, relations };\n}\n","import type {\n IntrospectionResult,\n FieldIntrospectionSchema,\n} from '../introspection/IntrospectionResult.js';\nimport { tableNameToLabel } from '../introspection/utils.js';\nimport type {\n DiffChange,\n FieldDiffChange,\n IntrospectionDiff,\n ImpactLevel,\n} from './DiffChange.js';\n\nexport interface DiffEngineOptions {\n /**\n * Optional explicit label maps (table → label) for detecting label changes\n * across two introspection snapshots. When omitted, labels are derived\n * from table names via tableNameToLabel — making entity_label_changed\n * only fire when the table name itself changes its derived label.\n */\n previousEntityLabels?: Map<string, string>;\n currentEntityLabels?: Map<string, string>;\n}\n\nexport class DiffEngine {\n compare(\n previous: IntrospectionResult,\n current: IntrospectionResult,\n options: DiffEngineOptions = {},\n ): IntrospectionDiff {\n const changes: DiffChange[] = [];\n\n const prevEntityMap = new Map(previous.entities.map((e) => [e.table, e]));\n const currEntityMap = new Map(current.entities.map((e) => [e.table, e]));\n\n for (const [table, entity] of currEntityMap) {\n if (!prevEntityMap.has(table)) {\n changes.push({\n category: 'entity',\n kind: 'entity_added',\n impact: 'SAFE',\n entityTable: table,\n current: entity,\n });\n }\n }\n\n for (const [table, entity] of prevEntityMap) {\n if (!currEntityMap.has(table)) {\n changes.push({\n category: 'entity',\n kind: 'entity_removed',\n impact: 'BREAKING',\n entityTable: table,\n previous: entity,\n });\n }\n }\n\n for (const [table, prevEntity] of prevEntityMap) {\n const currEntity = currEntityMap.get(table);\n if (!currEntity) continue;\n\n const prevLabel =\n options.previousEntityLabels?.get(table) ??\n tableNameToLabel(prevEntity.table).singular;\n const currLabel =\n options.currentEntityLabels?.get(table) ??\n tableNameToLabel(currEntity.table).singular;\n\n if (prevLabel !== currLabel) {\n changes.push({\n category: 'entity',\n kind: 'entity_label_changed',\n impact: 'WARNING',\n entityTable: table,\n previous: prevLabel,\n current: currLabel,\n });\n }\n\n const prevPk = prevEntity.fields.find((f) => f.isPrimaryKey)?.name;\n const currPk = currEntity.fields.find((f) => f.isPrimaryKey)?.name;\n if (prevPk !== currPk) {\n changes.push({\n category: 'entity',\n kind: 'entity_primary_key_changed',\n impact: 'BREAKING',\n entityTable: table,\n previous: prevPk,\n current: currPk,\n });\n }\n\n changes.push(...this.compareFields(table, prevEntity.fields, currEntity.fields));\n }\n\n const prevRelMap = new Map(previous.relations.map((r) => [r.id, r]));\n const currRelMap = new Map(current.relations.map((r) => [r.id, r]));\n\n for (const [id, rel] of currRelMap) {\n if (!prevRelMap.has(id)) {\n changes.push({\n category: 'relation',\n kind: 'relation_added',\n impact: 'SAFE',\n relationId: id,\n current: rel,\n });\n }\n }\n\n for (const [id, rel] of prevRelMap) {\n if (!currRelMap.has(id)) {\n changes.push({\n category: 'relation',\n kind: 'relation_removed',\n impact: 'BREAKING',\n relationId: id,\n previous: rel,\n });\n }\n }\n\n for (const [id, prevRel] of prevRelMap) {\n const currRel = currRelMap.get(id);\n if (!currRel) continue;\n\n if (prevRel.type !== currRel.type) {\n changes.push({\n category: 'relation',\n kind: 'relation_cardinality_changed',\n impact: 'BREAKING',\n relationId: id,\n previous: prevRel.type,\n current: currRel.type,\n });\n }\n\n if (\n prevRel.from.field !== currRel.from.field ||\n prevRel.to.field !== currRel.to.field\n ) {\n changes.push({\n category: 'relation',\n kind: 'relation_fields_changed',\n impact: 'BREAKING',\n relationId: id,\n previous: { from: prevRel.from.field, to: prevRel.to.field },\n current: { from: currRel.from.field, to: currRel.to.field },\n });\n }\n }\n\n const summary = {\n total: changes.length,\n safe: changes.filter((c) => c.impact === 'SAFE').length,\n warnings: changes.filter((c) => c.impact === 'WARNING').length,\n breaking: changes.filter((c) => c.impact === 'BREAKING').length,\n };\n\n return {\n changes,\n summary,\n hasBreaking: summary.breaking > 0,\n hasWarnings: summary.warnings > 0,\n };\n }\n\n private compareFields(\n entityTable: string,\n prevFields: FieldIntrospectionSchema[],\n currFields: FieldIntrospectionSchema[],\n ): FieldDiffChange[] {\n const changes: FieldDiffChange[] = [];\n const prevMap = new Map(prevFields.map((f) => [f.name, f]));\n const currMap = new Map(currFields.map((f) => [f.name, f]));\n\n for (const [name, field] of currMap) {\n if (!prevMap.has(name)) {\n changes.push({\n category: 'field',\n kind: 'field_added',\n impact: 'SAFE',\n entityTable,\n fieldName: name,\n current: field,\n });\n }\n }\n\n for (const [name, field] of prevMap) {\n if (!currMap.has(name)) {\n changes.push({\n category: 'field',\n kind: 'field_removed',\n impact: 'BREAKING',\n entityTable,\n fieldName: name,\n previous: field,\n });\n }\n }\n\n for (const [name, prevField] of prevMap) {\n const currField = currMap.get(name);\n if (!currField) continue;\n\n if (prevField.type !== currField.type) {\n changes.push({\n category: 'field',\n kind: 'field_type_changed',\n impact: 'BREAKING',\n entityTable,\n fieldName: name,\n previous: prevField.type,\n current: currField.type,\n });\n }\n\n if (prevField.nullable !== currField.nullable) {\n // false→true: was required, now optional = SAFE (more permissive)\n // true→false: was optional, now required = BREAKING (less permissive)\n const impact: ImpactLevel =\n !prevField.nullable && currField.nullable ? 'SAFE' : 'BREAKING';\n changes.push({\n category: 'field',\n kind: 'field_nullable_changed',\n impact,\n entityTable,\n fieldName: name,\n previous: prevField.nullable,\n current: currField.nullable,\n });\n }\n\n const wasIndexed = prevField.isIndexed ?? false;\n const isIndexed = currField.isIndexed ?? false;\n if (wasIndexed !== isIndexed) {\n if (isIndexed) {\n changes.push({\n category: 'field',\n kind: 'field_index_added',\n impact: 'SAFE',\n entityTable,\n fieldName: name,\n previous: false,\n current: true,\n });\n } else {\n changes.push({\n category: 'field',\n kind: 'field_index_removed',\n impact: 'WARNING',\n entityTable,\n fieldName: name,\n previous: true,\n current: false,\n });\n }\n }\n\n const prevMeta = {\n candidateForSearch: prevField.candidateForSearch ?? false,\n candidateForSoftDelete: prevField.candidateForSoftDelete ?? false,\n };\n const currMeta = {\n candidateForSearch: currField.candidateForSearch ?? false,\n candidateForSoftDelete: currField.candidateForSoftDelete ?? false,\n };\n if (\n prevMeta.candidateForSearch !== currMeta.candidateForSearch ||\n prevMeta.candidateForSoftDelete !== currMeta.candidateForSoftDelete\n ) {\n changes.push({\n category: 'field',\n kind: 'field_metadata_changed',\n impact: 'WARNING',\n entityTable,\n fieldName: name,\n previous: prevMeta,\n current: currMeta,\n });\n }\n }\n\n return changes;\n }\n}\n","import type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type { IntrospectionDiff, DiffChange } from '../diff/DiffChange.js';\nimport type {\n IntrospectionReport,\n IntrospectionReportChange,\n IntrospectionReportStats,\n} from './IntrospectionReport.js';\n\nexport class ReportGenerator {\n generate(result: IntrospectionResult, diff?: IntrospectionDiff): IntrospectionReport {\n const completedAt = new Date().toISOString();\n const hasDiff = diff !== undefined;\n\n const stats: IntrospectionReportStats = {\n entitiesDiscovered: result.entities.length,\n relationsDiscovered: result.relations.length,\n totalChanges: diff?.summary.total ?? 0,\n safeChanges: diff?.summary.safe ?? 0,\n warnings: diff?.summary.warnings ?? 0,\n breakingChanges: diff?.summary.breaking ?? 0,\n };\n\n const changes: IntrospectionReportChange[] = hasDiff\n ? diff!.changes.map((c) => this.describeChange(c))\n : [];\n\n const text = this.generateText(stats, changes, hasDiff);\n\n return { completedAt, stats, changes, hasDiff, text };\n }\n\n private describeChange(change: DiffChange): IntrospectionReportChange {\n switch (change.category) {\n case 'entity': {\n switch (change.kind) {\n case 'entity_added':\n return {\n impact: 'SAFE',\n description: `Entity \"${change.entityTable}\" added`,\n };\n case 'entity_removed':\n return {\n impact: 'BREAKING',\n description: `Entity \"${change.entityTable}\" removed`,\n recommendation: `Ensure all consumers of \"${change.entityTable}\" are updated before deploying.`,\n };\n case 'entity_label_changed':\n return {\n impact: 'WARNING',\n description: `Entity \"${change.entityTable}\" label changed: \"${change.previous}\" → \"${change.current}\"`,\n recommendation: 'Update UI labels and documentation to reflect the new entity name.',\n };\n case 'entity_primary_key_changed':\n return {\n impact: 'BREAKING',\n description: `Entity \"${change.entityTable}\" primary key changed: \"${change.previous}\" → \"${change.current}\"`,\n recommendation:\n 'This is a destructive change. Review all queries and foreign key references before deploying.',\n };\n }\n break;\n }\n case 'field': {\n switch (change.kind) {\n case 'field_added':\n return {\n impact: 'SAFE',\n description: `Field \"${change.entityTable}.${change.fieldName}\" added`,\n };\n case 'field_removed':\n return {\n impact: 'BREAKING',\n description: `Field \"${change.entityTable}.${change.fieldName}\" removed`,\n recommendation: `Remove all references to \"${change.fieldName}\" in \"${change.entityTable}\" before deploying.`,\n };\n case 'field_type_changed':\n return {\n impact: 'BREAKING',\n description: `Field \"${change.entityTable}.${change.fieldName}\" changed type: ${change.previous} → ${change.current}`,\n recommendation:\n 'Verify that existing data can be migrated to the new type and that all consumers handle the new type.',\n };\n case 'field_nullable_changed':\n if (!change.previous && change.current) {\n return {\n impact: 'SAFE',\n description: `Field \"${change.entityTable}.${change.fieldName}\" is now optional (was required)`,\n };\n }\n return {\n impact: 'BREAKING',\n description: `Field \"${change.entityTable}.${change.fieldName}\" is now required (was optional)`,\n recommendation:\n 'Ensure existing rows have values for this field before deploying the migration.',\n };\n case 'field_index_added':\n return {\n impact: 'SAFE',\n description: `Index added to field \"${change.entityTable}.${change.fieldName}\"`,\n };\n case 'field_index_removed':\n return {\n impact: 'WARNING',\n description: `Index removed from field \"${change.entityTable}.${change.fieldName}\"`,\n recommendation:\n 'Removing indexes may degrade query performance. Review affected queries.',\n };\n case 'field_metadata_changed':\n return {\n impact: 'WARNING',\n description: `Derived metadata changed for field \"${change.entityTable}.${change.fieldName}\"`,\n };\n }\n break;\n }\n case 'relation': {\n switch (change.kind) {\n case 'relation_added':\n return {\n impact: 'SAFE',\n description: `Relation \"${change.relationId}\" added`,\n };\n case 'relation_removed':\n return {\n impact: 'BREAKING',\n description: `Relation \"${change.relationId}\" removed`,\n recommendation: `Update all code that references relation \"${change.relationId}\".`,\n };\n case 'relation_cardinality_changed':\n return {\n impact: 'BREAKING',\n description: `Relation \"${change.relationId}\" cardinality changed: ${change.previous} → ${change.current}`,\n recommendation:\n 'Verify data integrity and update all query logic that depends on this relation.',\n };\n case 'relation_fields_changed': {\n const prev = change.previous as { from: string; to: string } | undefined;\n const curr = change.current as { from: string; to: string } | undefined;\n return {\n impact: 'BREAKING',\n description: `Relation \"${change.relationId}\" participating fields changed (from: ${prev?.from} → ${curr?.from}, to: ${prev?.to} → ${curr?.to})`,\n recommendation: 'Review all JOIN logic and foreign key constraints for this relation.',\n };\n }\n }\n break;\n }\n }\n return { impact: 'WARNING', description: 'Unknown change detected' };\n }\n\n private generateText(\n stats: IntrospectionReportStats,\n changes: IntrospectionReportChange[],\n hasDiff: boolean,\n ): string {\n const lines: string[] = [];\n\n lines.push('Introspection completed');\n lines.push('');\n lines.push(`Entities discovered: ${stats.entitiesDiscovered}`);\n lines.push(`Relations discovered: ${stats.relationsDiscovered}`);\n\n if (!hasDiff) {\n lines.push('');\n lines.push('No previous snapshot available for comparison.');\n return lines.join('\\n');\n }\n\n if (stats.totalChanges === 0) {\n lines.push('');\n lines.push('No changes detected since last snapshot.');\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(`Changes detected: ${stats.totalChanges}`);\n\n const safeChanges = changes.filter((c) => c.impact === 'SAFE');\n const warnings = changes.filter((c) => c.impact === 'WARNING');\n const breaking = changes.filter((c) => c.impact === 'BREAKING');\n\n if (safeChanges.length > 0) {\n lines.push('');\n lines.push('SAFE:');\n for (const c of safeChanges) {\n lines.push(`- ${c.description}`);\n }\n }\n\n if (warnings.length > 0) {\n lines.push('');\n lines.push('WARNINGS:');\n for (const c of warnings) {\n lines.push(`- ${c.description}`);\n if (c.recommendation) lines.push(` → ${c.recommendation}`);\n }\n }\n\n if (breaking.length > 0) {\n lines.push('');\n lines.push('BREAKING:');\n for (const c of breaking) {\n lines.push(`- ${c.description}`);\n if (c.recommendation) lines.push(` → ${c.recommendation}`);\n }\n }\n\n return lines.join('\\n');\n }\n}\n","import type { SnapshotRepository } from './SnapshotRepository.js';\nimport type { IntrospectionSnapshot } from './IntrospectionSnapshot.js';\n\nexport class InMemorySnapshotRepository implements SnapshotRepository {\n private readonly store = new Map<string, IntrospectionSnapshot>();\n\n async save(snapshot: IntrospectionSnapshot): Promise<void> {\n this.store.set(snapshot.id, snapshot);\n }\n\n async load(id: string): Promise<IntrospectionSnapshot | null> {\n return this.store.get(id) ?? null;\n }\n}\n","import type { IntrospectionProvider } from '../introspection/IntrospectionProvider.js';\nimport type { IntrospectionResult } from '../introspection/IntrospectionResult.js';\nimport type { LoadedConfig } from '../config-loader/MaestroFileLoader.js';\nimport type { DatasourceProvider } from '../datasource/DatasourceProvider.js';\nimport type { OperationDef } from '../operation/OperationDef.js';\nimport type { AuditRepository } from '../audit/AuditRepository.js';\nimport type { Logger } from '../logging/Logger.js';\nimport type { RbacPolicy } from '../rbac/RbacPolicy.js';\nimport type { MergeStrategy } from '../hybrid-loader/HybridLoader.js';\nimport type { IntrospectionDiff } from '../diff/DiffChange.js';\nimport type { IntrospectionReport } from '../introspection-report/IntrospectionReport.js';\nimport type { IntrospectionSnapshot } from '../snapshot/IntrospectionSnapshot.js';\nimport type { SnapshotRepository } from '../snapshot/SnapshotRepository.js';\nimport type { MaestroMetadata } from '../metadata/MaestroMetadata.js';\nimport { mergeIntrospectionWithOverrides } from '../hybrid-loader/HybridLoader.js';\nimport { MetadataEngine } from '../engine/MetadataEngine.js';\nimport { DiffEngine } from '../diff/DiffEngine.js';\nimport { ReportGenerator } from '../introspection-report/ReportGenerator.js';\n\nexport interface IntrospectionRuntimeRunOptions {\n provider: IntrospectionProvider;\n overrides?: LoadedConfig;\n mergeStrategy?: MergeStrategy;\n datasources?: Record<string, DatasourceProvider>;\n defaultDatasource?: string;\n /** ID of a previously saved snapshot to diff against */\n snapshotId?: string;\n /** Whether to automatically save the new snapshot after running. Defaults to true when a repository is configured. */\n saveSnapshot?: boolean;\n operations?: OperationDef[];\n audit?: AuditRepository;\n logger?: Logger;\n policies?: RbacPolicy;\n}\n\nexport interface IntrospectionRuntimeResult {\n metadata: MaestroMetadata;\n diff?: IntrospectionDiff;\n report: IntrospectionReport;\n snapshot: IntrospectionSnapshot;\n}\n\nlet _snapshotCounter = 0;\n\nfunction generateSnapshotId(): string {\n return `snapshot-${Date.now()}-${++_snapshotCounter}`;\n}\n\nexport class IntrospectionRuntime {\n private lastProvider?: IntrospectionProvider;\n\n constructor(private readonly snapshotRepository?: SnapshotRepository) {}\n\n async run(options: IntrospectionRuntimeRunOptions): Promise<IntrospectionRuntimeResult> {\n this.lastProvider = options.provider;\n\n const introspectionResult: IntrospectionResult = await options.provider.introspect();\n\n const snapshot: IntrospectionSnapshot = {\n id: generateSnapshotId(),\n timestamp: new Date().toISOString(),\n result: introspectionResult,\n };\n\n let diff: IntrospectionDiff | undefined;\n if (options.snapshotId && this.snapshotRepository) {\n const previous = await this.snapshotRepository.load(options.snapshotId);\n if (previous) {\n const engine = new DiffEngine();\n diff = engine.compare(previous.result, introspectionResult);\n }\n }\n\n const reportGenerator = new ReportGenerator();\n const report = reportGenerator.generate(introspectionResult, diff);\n\n const shouldSave = options.saveSnapshot !== false && this.snapshotRepository !== undefined;\n if (shouldSave) {\n await this.snapshotRepository!.save(snapshot);\n }\n\n const overrides = options.overrides ?? { entities: [], relations: [] };\n const datasources = options.datasources ?? {};\n const defaultDatasource = options.defaultDatasource ?? '';\n\n const config = mergeIntrospectionWithOverrides({\n introspection: introspectionResult,\n overrides,\n datasources,\n defaultDatasource,\n strategy: options.mergeStrategy ?? 'extend',\n operations: options.operations,\n audit: options.audit,\n logger: options.logger,\n });\n\n if (options.policies) {\n config.policies = options.policies;\n }\n\n const metadataEngine = new MetadataEngine();\n const metadata = metadataEngine.normalize(config);\n\n return { metadata, diff, report, snapshot };\n }\n\n async saveSnapshot(snapshot: IntrospectionSnapshot): Promise<void> {\n if (!this.snapshotRepository) {\n throw new Error(\n 'IntrospectionRuntime: no snapshotRepository configured. Pass one in the constructor.',\n );\n }\n await this.snapshotRepository.save(snapshot);\n }\n\n async loadSnapshot(id: string): Promise<IntrospectionSnapshot | null> {\n if (!this.snapshotRepository) return null;\n return this.snapshotRepository.load(id);\n }\n\n async compareWithSnapshot(\n snapshotId: string,\n provider?: IntrospectionProvider,\n ): Promise<IntrospectionDiff | null> {\n if (!this.snapshotRepository) return null;\n\n const resolvedProvider = provider ?? this.lastProvider;\n if (!resolvedProvider) {\n throw new Error(\n 'IntrospectionRuntime.compareWithSnapshot: a provider must be supplied or run() must have been called first.',\n );\n }\n\n const previous = await this.snapshotRepository.load(snapshotId);\n if (!previous) return null;\n\n const current = await resolvedProvider.introspect();\n const engine = new DiffEngine();\n return engine.compare(previous.result, current);\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nexport type CorrelationId = string;\n\nexport function generateCorrelationId(): CorrelationId {\n return randomUUID();\n}\n","import type { OperationalRisk } from './OperationalRisk.js';\nimport type { RiskClassifier, RiskClassificationInput } from './RiskClassifier.js';\n\nexport class MetadataRiskClassifier implements RiskClassifier {\n constructor(\n private readonly operationRiskMap: Record<string, OperationalRisk> = {},\n private readonly defaultRisk: OperationalRisk = 'LOW',\n ) {}\n\n classify(input: RiskClassificationInput): OperationalRisk {\n const fromMetadata = input.metadata?.['riskLevel'];\n if (isOperationalRisk(fromMetadata)) return fromMetadata;\n\n return this.operationRiskMap[input.operation] ?? this.defaultRisk;\n }\n}\n\nconst RISK_LEVELS: OperationalRisk[] = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];\n\nfunction isOperationalRisk(value: unknown): value is OperationalRisk {\n return typeof value === 'string' && (RISK_LEVELS as string[]).includes(value);\n}\n","import type { AuthorizationContext } from './AuthorizationContext.js';\nimport type { AuthorizationProvider } from './AuthorizationProvider.js';\nimport type { AuthorizationResult } from './AuthorizationResult.js';\nimport type { RbacPolicy } from '../rbac/index.js';\nimport { RbacEngine } from '../rbac/index.js';\n\nexport class ContextualAuthorizationEngine implements AuthorizationProvider {\n private readonly rbac: RbacEngine;\n\n constructor(\n policy: RbacPolicy,\n private readonly criticalOperations: ReadonlySet<string> = new Set(),\n ) {\n this.rbac = new RbacEngine(policy);\n }\n\n async evaluate(context: AuthorizationContext): Promise<AuthorizationResult> {\n if (!this.rbac.can(context.actor, context.operation)) {\n return { decision: 'DENY', reason: `Actor lacks permission for operation: ${context.operation}` };\n }\n\n const risk = context.riskLevel ?? 'LOW';\n if (risk === 'CRITICAL' || this.criticalOperations.has(context.operation)) {\n return { decision: 'REQUIRES_CONFIRMATION', reason: `Operation requires confirmation due to risk level: ${risk}` };\n }\n\n return { decision: 'ALLOW' };\n }\n}\n","import type { PolicyContext } from './PolicyContext.js';\nimport type { PolicyProvider } from './PolicyProvider.js';\nimport type { PolicyEvaluationResult } from './PolicyEvaluationResult.js';\nimport type { PolicyDecision } from './PolicyDecision.js';\nimport type { PolicyViolation } from './PolicyViolation.js';\n\nconst DECISION_PRIORITY: Record<PolicyDecision, number> = {\n ALLOW: 0,\n REQUIRES_CONFIRMATION: 1,\n DENY: 2,\n};\n\nexport class PolicyEngine {\n constructor(private readonly provider: PolicyProvider) {}\n\n evaluate(context: PolicyContext): PolicyEvaluationResult {\n const violations: PolicyViolation[] = [];\n let decision: PolicyDecision = 'ALLOW';\n let reason: string | undefined;\n\n for (const rule of this.provider.rules()) {\n const result = rule.evaluate(context);\n if (result === null) continue;\n\n if (DECISION_PRIORITY[result.decision] > DECISION_PRIORITY[decision]) {\n decision = result.decision;\n reason = result.reason;\n }\n\n if (result.decision === 'DENY' || result.decision === 'REQUIRES_CONFIRMATION') {\n violations.push({\n ruleId: rule.id,\n reason: result.reason,\n context,\n occurredAt: new Date(),\n });\n }\n }\n\n return { decision, violations, reason };\n }\n}\n","import type { PolicyRule } from './PolicyRule.js';\nimport type { PolicyProvider } from './PolicyProvider.js';\n\nexport class InMemoryPolicyProvider implements PolicyProvider {\n private readonly _rules: PolicyRule[];\n\n constructor(rules: PolicyRule[] = []) {\n this._rules = rules;\n }\n\n rules(): PolicyRule[] {\n return this._rules;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Actor, ResourceRef, Metadata } from '../types/index.js';\nimport type { ConfirmationRepository } from './ConfirmationRepository.js';\nimport type { ConfirmationRequest } from './ConfirmationRequest.js';\nimport { MaestroError } from '../errors/index.js';\nimport { ErrorCode } from '../errors/index.js';\n\nexport interface RequestConfirmationInput {\n operation: string;\n actor: Actor;\n resource?: ResourceRef;\n requiredApprovals?: number;\n metadata?: Metadata;\n correlationId?: string;\n expiresAt?: Date;\n}\n\nexport class ConfirmationEngine {\n constructor(private readonly repository: ConfirmationRepository) {}\n\n async request(input: RequestConfirmationInput): Promise<ConfirmationRequest> {\n const requiredApprovals = input.requiredApprovals ?? 1;\n const request: ConfirmationRequest = {\n id: randomUUID(),\n operation: input.operation,\n actor: input.actor,\n resource: input.resource,\n status: requiredApprovals > 1 ? 'AWAITING_CONFIRMATION' : 'REQUESTED',\n requiredApprovals,\n approvals: [],\n rejections: [],\n requestedAt: new Date(),\n expiresAt: input.expiresAt,\n metadata: input.metadata,\n correlationId: input.correlationId,\n };\n\n await this.repository.save(request);\n return request;\n }\n\n async approve(requestId: string, approver: Actor, comment?: string): Promise<ConfirmationRequest> {\n const request = await this.findOrThrow(requestId);\n this.assertActive(request);\n\n const updated: ConfirmationRequest = {\n ...request,\n approvals: [...request.approvals, { approver, approvedAt: new Date(), comment }],\n };\n\n const fullyApproved = updated.approvals.length >= updated.requiredApprovals;\n updated.status = fullyApproved ? 'APPROVED' : 'AWAITING_CONFIRMATION';\n\n await this.repository.save(updated);\n return updated;\n }\n\n async reject(requestId: string, approver: Actor, comment?: string): Promise<ConfirmationRequest> {\n const request = await this.findOrThrow(requestId);\n this.assertActive(request);\n\n const updated: ConfirmationRequest = {\n ...request,\n status: 'REJECTED',\n rejections: [...request.rejections, { approver, approvedAt: new Date(), comment }],\n };\n\n await this.repository.save(updated);\n return updated;\n }\n\n async execute(requestId: string): Promise<ConfirmationRequest> {\n const request = await this.findOrThrow(requestId);\n\n if (request.status !== 'APPROVED') {\n throw new MaestroError(\n ErrorCode.VALIDATION_ERROR,\n `Cannot execute confirmation request in status: ${request.status}`,\n );\n }\n\n const updated: ConfirmationRequest = {\n ...request,\n status: 'EXECUTED',\n executedAt: new Date(),\n };\n\n await this.repository.save(updated);\n return updated;\n }\n\n async getPending(): Promise<ConfirmationRequest[]> {\n return this.repository.listPending();\n }\n\n private async findOrThrow(requestId: string): Promise<ConfirmationRequest> {\n const request = await this.repository.findById(requestId);\n if (!request) {\n throw new MaestroError(\n ErrorCode.NOT_FOUND,\n `Confirmation request not found: ${requestId}`,\n );\n }\n return request;\n }\n\n private assertActive(request: ConfirmationRequest): void {\n const terminal: ConfirmationRequest['status'][] = ['APPROVED', 'REJECTED', 'EXECUTED', 'EXPIRED'];\n if (terminal.includes(request.status)) {\n throw new MaestroError(\n ErrorCode.VALIDATION_ERROR,\n `Confirmation request is already in terminal status: ${request.status}`,\n );\n }\n }\n}\n","import type { ConfirmationRepository } from './ConfirmationRepository.js';\nimport type { ConfirmationRequest } from './ConfirmationRequest.js';\n\nexport class InMemoryConfirmationRepository implements ConfirmationRepository {\n private readonly store = new Map<string, ConfirmationRequest>();\n\n async save(request: ConfirmationRequest): Promise<void> {\n this.store.set(request.id, request);\n }\n\n async findById(id: string): Promise<ConfirmationRequest | undefined> {\n return this.store.get(id);\n }\n\n async listPending(): Promise<ConfirmationRequest[]> {\n return Array.from(this.store.values()).filter(\n (r) => r.status === 'REQUESTED' || r.status === 'AWAITING_CONFIRMATION',\n );\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { extname } from 'node:path';\nimport type { EntityDeclaration } from '../EntityDeclaration.js';\nimport type { ConsumerDeclaration } from '../ConsumerDeclaration.js';\nimport type { YamlParser } from '../../config-loader/YamlParser.js';\nimport { validateEntityDeclaration, validateConsumerDeclaration } from '../DeclarativeValidator.js';\nimport { MaestroError } from '../../errors/MaestroError.js';\nimport { ErrorCode } from '../../errors/ErrorCode.js';\n\nexport type DeclarativeFileFormat = 'yaml' | 'json';\n\n/**\n * Canonical shape of a declarative config file — structurally identical to `DeclarativeConfig`,\n * so it can be passed directly as `createMaestro({ declarations })`.\n * `entities` defaults to `[]` when the file omits it.\n */\nexport interface DeclarativeFileConfig {\n entities: EntityDeclaration[];\n consumers?: ConsumerDeclaration[];\n}\n\nexport interface LoadDeclarativeConfigFromStringOptions {\n format: DeclarativeFileFormat;\n /** Required for `format: 'yaml'`. The core has no YAML runtime dependency — pass a parser (e.g. `{ parse: YAML.parse }` from the `yaml` package). */\n yamlParser?: YamlParser;\n /** Optional label (e.g. a file path) included in error messages to help pinpoint the source. */\n source?: string;\n}\n\nexport interface LoadDeclarativeConfigFromFileOptions {\n /** Overrides the format that would otherwise be detected from the file extension. */\n format?: DeclarativeFileFormat;\n yamlParser?: YamlParser;\n}\n\nconst KNOWN_KEYS = new Set(['entities', 'consumers']);\n\nfunction parseContent(\n content: string,\n format: DeclarativeFileFormat,\n yamlParser: YamlParser | undefined,\n source: string | undefined,\n): unknown {\n const origin = source ? ` (${source})` : '';\n\n if (format === 'yaml') {\n if (!yamlParser) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Cannot parse YAML declarative config${origin}: a \"yamlParser\" must be provided. ` +\n 'The core has no bundled YAML dependency — install a YAML library (e.g. \"yaml\") ' +\n 'and pass { yamlParser: { parse: YAML.parse } }.',\n );\n }\n try {\n return yamlParser.parse(content);\n } catch (cause) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Failed to parse YAML declarative config${origin}: ${(cause as Error).message}`,\n { cause },\n );\n }\n }\n\n try {\n return JSON.parse(content) as unknown;\n } catch (cause) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Failed to parse JSON declarative config${origin}: ${(cause as Error).message}`,\n { cause },\n );\n }\n}\n\nfunction normalizeAndValidate(raw: unknown, source: string | undefined): DeclarativeFileConfig {\n const origin = source ? ` in ${source}` : '';\n\n if (raw === null || raw === undefined) {\n return { entities: [] };\n }\n\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Declarative config${origin} must be an object with optional \"entities\" and \"consumers\" arrays.`,\n );\n }\n\n const obj = raw as Record<string, unknown>;\n const errors: { path: string; message: string }[] = [];\n\n for (const key of Object.keys(obj)) {\n if (!KNOWN_KEYS.has(key)) {\n errors.push({\n path: key,\n message: `Unknown declarative config key \"${key}\". Only \"entities\" and \"consumers\" are supported.`,\n });\n }\n }\n\n let entities: EntityDeclaration[] | undefined;\n if (obj['entities'] !== undefined) {\n if (!Array.isArray(obj['entities'])) {\n errors.push({ path: 'entities', message: '\"entities\" must be an array of entity declarations.' });\n } else {\n entities = obj['entities'] as EntityDeclaration[];\n entities.forEach((entity, index) => {\n const result = validateEntityDeclaration(entity);\n if (!result.valid) {\n for (const err of result.errors) {\n const path = err.path ? `entities[${index}].${err.path}` : `entities[${index}]`;\n errors.push({ path, message: err.message });\n }\n }\n });\n }\n }\n\n let consumers: ConsumerDeclaration[] | undefined;\n if (obj['consumers'] !== undefined) {\n if (!Array.isArray(obj['consumers'])) {\n errors.push({ path: 'consumers', message: '\"consumers\" must be an array of consumer declarations.' });\n } else {\n consumers = obj['consumers'] as ConsumerDeclaration[];\n const entityByName = new Map((entities ?? []).map((entity) => [entity.entity, entity]));\n consumers.forEach((consumer, index) => {\n const relatedEntity =\n consumer && typeof consumer === 'object'\n ? entityByName.get((consumer as unknown as Record<string, unknown>)['entity'] as string)\n : undefined;\n const result = validateConsumerDeclaration(consumer, relatedEntity);\n if (!result.valid) {\n for (const err of result.errors) {\n const path = err.path ? `consumers[${index}].${err.path}` : `consumers[${index}]`;\n errors.push({ path, message: err.message });\n }\n }\n });\n }\n }\n\n if (errors.length > 0) {\n const details = errors.map((err) => `${err.path}: ${err.message}`).join('; ');\n throw new MaestroError(\n ErrorCode.VALIDATION_ERROR,\n `Invalid declarative config${origin}: ${details}`,\n { details: { errors } },\n );\n }\n\n return { entities: entities ?? [], consumers };\n}\n\n/** Parses and validates a declarative config from textual content. Does not perform I/O. */\nexport function loadDeclarativeConfigFromString(\n content: string,\n options: LoadDeclarativeConfigFromStringOptions,\n): DeclarativeFileConfig {\n const raw = parseContent(content, options.format, options.yamlParser, options.source);\n return normalizeAndValidate(raw, options.source);\n}\n\nfunction detectFormatFromExtension(filePath: string): DeclarativeFileFormat {\n const ext = extname(filePath).toLowerCase();\n if (ext === '.yaml' || ext === '.yml') return 'yaml';\n if (ext === '.json') return 'json';\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n `Cannot detect declarative config format from file extension \"${ext}\" (${filePath}). ` +\n 'Supported extensions: .yaml, .yml, .json. Pass { format } explicitly to override.',\n );\n}\n\n/** Reads, parses and validates a declarative config from a file path. Format is detected from the extension unless overridden. */\nexport async function loadDeclarativeConfigFromFile(\n filePath: string,\n options: LoadDeclarativeConfigFromFileOptions = {},\n): Promise<DeclarativeFileConfig> {\n const format = options.format ?? detectFormatFromExtension(filePath);\n const content = await readFile(filePath, 'utf-8');\n return loadDeclarativeConfigFromString(content, { format, yamlParser: options.yamlParser, source: filePath });\n}\n","import type { EntityMetadata } from '../../metadata/EntityMetadata.js';\nimport type { FieldMetadata } from '../../metadata/FieldMetadata.js';\nimport type { RelationMetadata } from '../../metadata/RelationMetadata.js';\nimport type { OperationMetadata } from '../../metadata/OperationMetadata.js';\nimport { DEFAULT_CAPABILITIES, type EntityCapabilities } from '../../metadata/EntityCapabilities.js';\nimport type { EntitySchema } from '../../schema/EntitySchema.js';\nimport type { FieldSchema } from '../../schema/FieldSchema.js';\nimport type { RelationSchema } from '../../schema/RelationSchema.js';\nimport type {\n EntityDeclaration,\n FieldDeclaration,\n OperationDeclaration,\n RelationDeclaration,\n} from '../EntityDeclaration.js';\nimport type { ConsumerDeclaration } from '../ConsumerDeclaration.js';\nimport type { DeclarativeFileConfig } from '../loader/DeclarativeFileLoader.js';\n\nexport interface DeclarativeGeneratorOptions {\n /** Adds one minimal list/detail consumer per entity, derived from visible fields. Default: false. */\n includeConsumers?: boolean;\n /** Includes fields flagged as internal (hidden in metadata, or hidden: true in schema). Default: true. */\n includeInternalFields?: boolean;\n /** Sorts entities alphabetically by id and fields alphabetically by name for deterministic output. Default: true. */\n sort?: boolean;\n}\n\n/** Metadata-shaped input. Structurally compatible with `MaestroMetadata`, so it can be passed directly. */\nexport interface DeclarativeGeneratorMetadataInput {\n entities: EntityMetadata[];\n relations?: RelationMetadata[];\n operations?: OperationMetadata[];\n}\n\n/** Schema-shaped input, mirroring `MaestroConfig.entities` / `MaestroConfig.relations`. */\nexport interface DeclarativeGeneratorSchemaInput {\n entities: EntitySchema[];\n relations?: RelationSchema[];\n}\n\nfunction sortByName<T extends { name: string }>(items: T[]): T[] {\n return [...items].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction capabilitiesOverride(\n capabilities: EntityCapabilities,\n): Partial<EntityCapabilities> | undefined {\n const overrides: Partial<EntityCapabilities> = {};\n let hasOverride = false;\n for (const key of Object.keys(DEFAULT_CAPABILITIES) as (keyof EntityCapabilities)[]) {\n if (capabilities[key] !== DEFAULT_CAPABILITIES[key]) {\n overrides[key] = capabilities[key];\n hasOverride = true;\n }\n }\n return hasOverride ? overrides : undefined;\n}\n\nfunction relationToDeclaration(rel: RelationMetadata | RelationSchema): RelationDeclaration {\n return {\n id: rel.id,\n type: rel.type,\n fromField: rel.from.field,\n toEntity: rel.to.entity,\n toField: rel.to.field,\n label: rel.label,\n display: rel.display ? { tab: rel.display.tab, label: rel.display.label } : undefined,\n };\n}\n\nfunction fieldMetadataToDeclaration(field: FieldMetadata, primaryKey: string): FieldDeclaration {\n const decl: FieldDeclaration = { type: field.type };\n if (field.label) decl.label = field.label;\n if (field.required) decl.required = true;\n if (field.readonly) decl.readonly = true;\n if (field.name === primaryKey) decl.primary = true;\n if (field.sensitive) decl.sensitive = true;\n if (field.hidden) decl.visible = false;\n if (field.searchable) decl.searchable = true;\n if (field.sortable) decl.sortable = true;\n if (field.filterable) decl.filterable = true;\n if (field.exportable) decl.exportable = true;\n if (field.description) decl.description = field.description;\n if (field.enumOptions) decl.enumOptions = field.enumOptions;\n if (field.relationEntity) decl.relationEntity = field.relationEntity;\n return decl;\n}\n\nfunction fieldSchemaToDeclaration(field: FieldSchema, primaryKey: string | undefined): FieldDeclaration {\n const decl: FieldDeclaration = { type: field.type };\n if (field.label) decl.label = field.label;\n if (field.required) decl.required = true;\n if (field.readonly) decl.readonly = true;\n if (primaryKey && field.name === primaryKey) decl.primary = true;\n if (field.sensitive) decl.sensitive = true;\n if (field.hidden) decl.visible = false;\n if (field.searchable) decl.searchable = true;\n if (field.sortable) decl.sortable = true;\n if (field.filterable) decl.filterable = true;\n if (field.exportable) decl.exportable = true;\n if (field.description) decl.description = field.description;\n if (field.enumOptions) decl.enumOptions = field.enumOptions;\n if (field.relationEntity) decl.relationEntity = field.relationEntity;\n return decl;\n}\n\nfunction operationMetadataToDeclaration(\n op: OperationMetadata,\n entityId: string,\n): { key: string; declaration: OperationDeclaration } {\n const key = op.id.startsWith(`${entityId}.`) ? op.id.slice(entityId.length + 1) : op.id;\n const declaration: OperationDeclaration = { label: op.label };\n if (op.description) declaration.description = op.description;\n if (op.scope) declaration.scope = op.scope;\n if (op.requiresConfirmation) declaration.confirmation = { required: true };\n if (op.requiredPermission) declaration.permission = op.requiredPermission;\n return { key, declaration };\n}\n\nfunction entityMetadataToDeclaration(\n entity: EntityMetadata,\n relations: RelationMetadata[],\n operations: OperationMetadata[],\n options: Required<Pick<DeclarativeGeneratorOptions, 'includeInternalFields' | 'sort'>>,\n): EntityDeclaration {\n const sourceFields = options.includeInternalFields ? entity.fields : entity.fields.filter((f) => !f.hidden);\n const orderedFields = options.sort ? sortByName(sourceFields) : sourceFields;\n\n const fields: Record<string, FieldDeclaration> = {};\n for (const field of orderedFields) {\n fields[field.name] = fieldMetadataToDeclaration(field, entity.primaryKey);\n }\n\n const orderedRelations = options.sort\n ? [...relations].sort((a, b) => a.id.localeCompare(b.id))\n : relations;\n const orderedOperations = options.sort\n ? [...operations].sort((a, b) => a.id.localeCompare(b.id))\n : operations;\n\n const operationsRecord: Record<string, OperationDeclaration> = {};\n for (const op of orderedOperations) {\n const { key, declaration } = operationMetadataToDeclaration(op, entity.id);\n operationsRecord[key] = declaration;\n }\n\n const declaration: EntityDeclaration = {\n entity: entity.id,\n label: entity.label.singular,\n pluralLabel: entity.label.plural,\n fields,\n };\n if (entity.description) declaration.description = entity.description;\n const capabilities = capabilitiesOverride(entity.capabilities);\n if (capabilities) declaration.capabilities = capabilities;\n if (orderedOperations.length > 0) declaration.operations = operationsRecord;\n if (orderedRelations.length > 0) {\n declaration.relationships = orderedRelations.map(relationToDeclaration);\n }\n return declaration;\n}\n\nfunction entitySchemaToDeclaration(\n entity: EntitySchema,\n relations: RelationSchema[],\n options: Required<Pick<DeclarativeGeneratorOptions, 'includeInternalFields' | 'sort'>>,\n): EntityDeclaration {\n const sourceFields = options.includeInternalFields ? entity.fields : entity.fields.filter((f) => !f.hidden);\n const orderedFields = options.sort ? sortByName(sourceFields) : sourceFields;\n\n const fields: Record<string, FieldDeclaration> = {};\n for (const field of orderedFields) {\n fields[field.name] = fieldSchemaToDeclaration(field, entity.source.primaryKey);\n }\n\n const orderedRelations = options.sort\n ? [...relations].sort((a, b) => a.id.localeCompare(b.id))\n : relations;\n\n const declaration: EntityDeclaration = {\n entity: entity.id,\n label: entity.label.singular,\n pluralLabel: entity.label.plural,\n fields,\n };\n if (entity.description) declaration.description = entity.description;\n if (entity.capabilities) declaration.capabilities = entity.capabilities;\n if (orderedRelations.length > 0) {\n declaration.relationships = orderedRelations.map(relationToDeclaration);\n }\n return declaration;\n}\n\n/** Minimal list/detail consumer derived from an entity's visible fields. No business rule is inferred beyond visibility. */\nfunction generateDefaultConsumerDeclaration(entity: EntityDeclaration): ConsumerDeclaration {\n const visibleFieldNames = Object.entries(entity.fields)\n .filter(([, field]) => field.visible !== false)\n .map(([name]) => name);\n return {\n consumer: entity.entity,\n entity: entity.entity,\n list: { fields: visibleFieldNames },\n detail: { fields: visibleFieldNames },\n };\n}\n\n/** Generates a `DeclarativeFileConfig` from already-built `EntityMetadata[]` (+ optional relations/operations). */\nexport function generateDeclarativeConfigFromMetadata(\n input: DeclarativeGeneratorMetadataInput,\n options: DeclarativeGeneratorOptions = {},\n): DeclarativeFileConfig {\n const resolved = {\n includeInternalFields: options.includeInternalFields ?? true,\n sort: options.sort ?? true,\n };\n\n const orderedEntities = resolved.sort\n ? [...input.entities].sort((a, b) => a.id.localeCompare(b.id))\n : input.entities;\n\n const entities = orderedEntities.map((entity) =>\n entityMetadataToDeclaration(\n entity,\n (input.relations ?? []).filter((rel) => rel.from.entity === entity.id),\n (input.operations ?? []).filter((op) => op.entity === entity.id),\n resolved,\n ),\n );\n\n const consumers = options.includeConsumers ? entities.map(generateDefaultConsumerDeclaration) : undefined;\n return consumers ? { entities, consumers } : { entities };\n}\n\n/** Generates a `DeclarativeFileConfig` from raw `EntitySchema[]` (+ optional relations), before metadata normalization. */\nexport function generateDeclarativeConfigFromSchema(\n input: DeclarativeGeneratorSchemaInput,\n options: DeclarativeGeneratorOptions = {},\n): DeclarativeFileConfig {\n const resolved = {\n includeInternalFields: options.includeInternalFields ?? true,\n sort: options.sort ?? true,\n };\n\n const orderedEntities = resolved.sort\n ? [...input.entities].sort((a, b) => a.id.localeCompare(b.id))\n : input.entities;\n\n const entities = orderedEntities.map((entity) =>\n entitySchemaToDeclaration(\n entity,\n (input.relations ?? []).filter((rel) => rel.from.entity === entity.id),\n resolved,\n ),\n );\n\n const consumers = options.includeConsumers ? entities.map(generateDefaultConsumerDeclaration) : undefined;\n return consumers ? { entities, consumers } : { entities };\n}\n","import type { DeclarativeFileConfig } from '../loader/DeclarativeFileLoader.js';\nimport type { YamlSerializer } from './YamlSerializer.js';\nimport { MaestroError } from '../../errors/MaestroError.js';\nimport { ErrorCode } from '../../errors/ErrorCode.js';\n\nexport type DeclarativeSerializationFormat = 'yaml' | 'json';\n\nexport interface SerializeDeclarativeConfigOptions {\n format: DeclarativeSerializationFormat;\n /** Required for `format: 'yaml'`. The core has no YAML runtime dependency — pass a serializer (e.g. `{ stringify: YAML.stringify }` from the `yaml` package). */\n yamlSerializer?: YamlSerializer;\n}\n\n/** Serializes a declarative config to formatted, stable JSON. */\nexport function serializeDeclarativeConfigToJson(config: DeclarativeFileConfig): string {\n return `${JSON.stringify(config, null, 2)}\\n`;\n}\n\n/** Serializes a declarative config to YAML using an injected serializer (the core has no bundled YAML dependency). */\nexport function serializeDeclarativeConfigToYaml(\n config: DeclarativeFileConfig,\n yamlSerializer: YamlSerializer,\n): string {\n return yamlSerializer.stringify(config);\n}\n\n/** Serializes a declarative config to the requested textual format. */\nexport function serializeDeclarativeConfig(\n config: DeclarativeFileConfig,\n options: SerializeDeclarativeConfigOptions,\n): string {\n if (options.format === 'json') {\n return serializeDeclarativeConfigToJson(config);\n }\n\n if (!options.yamlSerializer) {\n throw new MaestroError(\n ErrorCode.CONFIGURATION_ERROR,\n 'Cannot serialize declarative config to YAML: a \"yamlSerializer\" must be provided. ' +\n 'The core has no bundled YAML dependency — install a YAML library (e.g. \"yaml\") ' +\n 'and pass { yamlSerializer: { stringify: YAML.stringify } }.',\n );\n }\n return serializeDeclarativeConfigToYaml(config, options.yamlSerializer);\n}\n","export const GOVERNANCE_EVENT_TYPES = {\n OPERATION_EXECUTED: 'governance.operation.executed',\n AUTHORIZATION_DENIED: 'governance.authorization.denied',\n POLICY_TRIGGERED: 'governance.policy.triggered',\n CONFIRMATION_REQUESTED: 'governance.confirmation.requested',\n CONFIRMATION_APPROVED: 'governance.confirmation.approved',\n CONFIRMATION_REJECTED: 'governance.confirmation.rejected',\n AUDIT_RECORDED: 'governance.audit.recorded',\n} as const;\n\nexport type GovernanceEventType = (typeof GOVERNANCE_EVENT_TYPES)[keyof typeof GOVERNANCE_EVENT_TYPES];\n","import { randomUUID } from 'node:crypto';\nimport { InMemoryEventBus } from '../events/index.js';\nimport type { DomainEvent } from '../events/index.js';\nimport type { GovernanceEventBus } from './GovernanceEventBus.js';\nimport type { GovernanceEventType } from './GovernanceEventType.js';\n\nexport class InMemoryGovernanceEventBus extends InMemoryEventBus implements GovernanceEventBus {\n async publishGovernance<TPayload>(\n type: GovernanceEventType,\n payload: TPayload,\n correlationId?: string,\n ): Promise<DomainEvent<TPayload>> {\n const event: DomainEvent<TPayload> = {\n id: randomUUID(),\n type,\n occurredAt: new Date(),\n payload,\n correlationId,\n };\n await this.publish(event);\n return event;\n }\n}\n","import type { AuditEvent, AuditFilter, AuditRepository } from '../audit/index.js';\nimport type { ConfirmationRequest, ConfirmationRepository } from '../confirmation/index.js';\nimport type { PolicyViolation } from '../policy/index.js';\nimport type { GovernanceApi, PolicyViolationFilter } from './GovernanceApi.js';\n\nexport class DefaultGovernanceApi implements GovernanceApi {\n constructor(\n private readonly auditRepository: AuditRepository,\n private readonly confirmationRepository: ConfirmationRepository,\n private readonly violationLog: PolicyViolation[] = [],\n ) {}\n\n async getAuditTimeline(filter?: AuditFilter): Promise<AuditEvent[]> {\n return this.auditRepository.list(filter);\n }\n\n async getCorrelationTrace(correlationId: string): Promise<AuditEvent[]> {\n return this.auditRepository.list({ correlationId });\n }\n\n async getPendingConfirmations(): Promise<ConfirmationRequest[]> {\n return this.confirmationRepository.listPending();\n }\n\n async getPolicyViolations(filter?: PolicyViolationFilter): Promise<PolicyViolation[]> {\n let violations = [...this.violationLog];\n\n if (filter?.ruleId !== undefined) {\n violations = violations.filter((v) => v.ruleId === filter.ruleId);\n }\n if (filter?.correlationId !== undefined) {\n violations = violations.filter((v) => v.context.correlationId === filter.correlationId);\n }\n if (filter?.from !== undefined) {\n const from = filter.from;\n violations = violations.filter((v) => v.occurredAt >= from);\n }\n if (filter?.to !== undefined) {\n const to = filter.to;\n violations = violations.filter((v) => v.occurredAt <= to);\n }\n\n return violations;\n }\n}\n"],"mappings":"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","names":["ErrorCode","randomUUID","randomUUID","randomUUID","randomUUID","validateEntity","validateRelation","detectSoftDelete","randomUUID","randomUUID","randomUUID","readFile","extname","parseContent","extname","readFile","declaration","randomUUID","randomUUID"]}