@maykonpaulo/maestro-core 0.2.0 → 0.3.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/README.md +94 -67
- package/dist/index.d.ts +762 -1
- package/dist/index.js +2102 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/audit/InMemoryAuditRepository.ts","../src/audit/AuditRecorder.ts","../src/rbac/RbacEngine.ts","../src/feature-flags/InMemoryFeatureFlagProvider.ts","../src/config/InMemoryConfigProvider.ts","../src/events/InMemoryEventBus.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 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 { AuditRepository, AuditFilter } from './AuditRepository.js';\nimport type { AuditEvent } from './AuditEvent.js';\n\nexport class InMemoryAuditRepository implements AuditRepository {\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.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","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 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 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"],"mappings":"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","names":["ErrorCode"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/ErrorCode.ts","../src/errors/MaestroError.ts","../src/logging/LogLevel.ts","../src/logging/ConsoleLogger.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/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"],"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 { AuditRepository, AuditFilter } from './AuditRepository.js';\nimport type { AuditEvent } from './AuditEvent.js';\n\nexport class InMemoryAuditRepository implements AuditRepository {\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.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","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 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 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({ path: 'entities', message: 'At least one entity is required.' });\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 { 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\n constructor(\n private readonly metadata: MaestroMetadata,\n private readonly datasources: DatasourceRegistry,\n private readonly operations: OperationRegistry,\n private readonly audit?: AuditRecorder,\n ) {\n this.rbac = new RbacEngine(metadata.policies);\n }\n\n getMetadata(): MaestroMetadata {\n return this.metadata;\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 { 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';\n\nexport function createMaestro(config: MaestroConfig): MaestroEngine {\n const validation = validateMaestroConfig(config);\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 const metadataEngine = new MetadataEngine();\n const metadata = metadataEngine.normalize(config);\n\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 config.operations ?? []) {\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);\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"],"mappings":"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","names":["ErrorCode","randomUUID","randomUUID","randomUUID","randomUUID","detectSoftDelete"]}
|