@happyvertical/smrt-core 0.36.4 → 0.36.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collection.d.ts +9 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +6 -0
- package/dist/collection.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/consumer-plugin/index.d.ts.map +1 -1
- package/dist/consumer-plugin/index.js +7 -3
- package/dist/consumer-plugin/index.js.map +1 -1
- package/dist/database.d.ts +3 -3
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js.map +1 -1
- package/dist/embeddings/provider.d.ts +14 -2
- package/dist/embeddings/provider.d.ts.map +1 -1
- package/dist/embeddings/provider.js +3 -3
- package/dist/embeddings/provider.js.map +1 -1
- package/dist/embeddings/storage.js.map +1 -1
- package/dist/errors.d.ts +22 -22
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +5 -4
- package/dist/errors.js.map +1 -1
- package/dist/knowledge.d.ts +12 -1
- package/dist/knowledge.d.ts.map +1 -1
- package/dist/knowledge.js.map +1 -1
- package/dist/lazy-config.d.ts.map +1 -1
- package/dist/lazy-config.js.map +1 -1
- package/dist/manifest/generator.d.ts.map +1 -1
- package/dist/manifest/generator.js +14 -12
- package/dist/manifest/generator.js.map +1 -1
- package/dist/manifest/manager.d.ts +3 -3
- package/dist/manifest/manager.d.ts.map +1 -1
- package/dist/manifest/manager.js.map +1 -1
- package/dist/manifest/manifest-loader.d.ts +3 -2
- package/dist/manifest/manifest-loader.d.ts.map +1 -1
- package/dist/manifest/manifest-loader.js +3 -2
- package/dist/manifest/manifest-loader.js.map +1 -1
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +13 -198
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +2 -2
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest/test-manifest-stub.d.ts.map +1 -1
- package/dist/manifest/test-manifest-stub.js +13 -198
- package/dist/manifest/test-manifest-stub.js.map +1 -1
- package/dist/manifest.json +13 -175
- package/dist/mcp-advisor/index.d.ts +1 -1
- package/dist/mcp-advisor/index.d.ts.map +1 -1
- package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -1
- package/dist/mcp-advisor/types.d.ts +5 -5
- package/dist/mcp-advisor/types.d.ts.map +1 -1
- package/dist/migrations/differ.js.map +1 -1
- package/dist/registry/types.d.ts +21 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +9 -0
- package/dist/registry.js.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +13 -3
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +49 -16
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +60 -6
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/schema/code-generator.d.ts.map +1 -1
- package/dist/schema/ddl/base-strategy.d.ts +2 -2
- package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/base-strategy.js.map +1 -1
- package/dist/schema/ddl/sqlite-strategy.d.ts +1 -1
- package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/sqlite-strategy.js.map +1 -1
- package/dist/schema/ddl/types.d.ts +1 -1
- package/dist/schema/ddl/types.d.ts.map +1 -1
- package/dist/schema/generator.d.ts +27 -4
- package/dist/schema/generator.d.ts.map +1 -1
- package/dist/schema/generator.js +3 -2
- package/dist/schema/generator.js.map +1 -1
- package/dist/schema/override-system.d.ts +3 -3
- package/dist/schema/override-system.d.ts.map +1 -1
- package/dist/schema/schema-aggregator.d.ts.map +1 -1
- package/dist/schema/schema-manager.d.ts.map +1 -1
- package/dist/schema/schema-manager.js +12 -4
- package/dist/schema/schema-manager.js.map +1 -1
- package/dist/schema/types.d.ts +1 -1
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/utils.d.ts +6 -1
- package/dist/schema/utils.d.ts.map +1 -1
- package/dist/schema/utils.js +2 -1
- package/dist/schema/utils.js.map +1 -1
- package/dist/signals/sanitizer.d.ts +1 -1
- package/dist/signals/sanitizer.d.ts.map +1 -1
- package/dist/signals/sanitizer.js +12 -2
- package/dist/signals/sanitizer.js.map +1 -1
- package/dist/smrt-knowledge.json +14 -26
- package/dist/system/types.d.ts +2 -2
- package/dist/system/types.d.ts.map +1 -1
- package/dist/system-fields.d.ts +5 -43
- package/dist/system-fields.d.ts.map +1 -1
- package/dist/system-fields.js +2 -1
- package/dist/system-fields.js.map +1 -1
- package/dist/test-utils.d.ts +39 -13
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils.d.ts +16 -8
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +11 -7
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
- package/dist/vite-plugin/sveltekit-generator.js +4 -3
- package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
- package/dist/vite-plugin/templates/default-ui.ts +20 -6
- package/package.json +10 -10
package/dist/errors.d.ts
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
export declare abstract class SmrtError extends Error {
|
|
8
8
|
readonly code: string;
|
|
9
9
|
readonly category: 'database' | 'ai' | 'filesystem' | 'validation' | 'network' | 'configuration' | 'runtime';
|
|
10
|
-
readonly details?: Record<string,
|
|
10
|
+
readonly details?: Record<string, unknown>;
|
|
11
11
|
readonly cause?: Error;
|
|
12
|
-
constructor(message: string, code: string, category: SmrtError['category'], details?: Record<string,
|
|
12
|
+
constructor(message: string, code: string, category: SmrtError['category'], details?: Record<string, unknown>, cause?: Error);
|
|
13
13
|
/**
|
|
14
14
|
* Converts error to a serializable object for logging/debugging
|
|
15
15
|
*/
|
|
@@ -18,7 +18,7 @@ export declare abstract class SmrtError extends Error {
|
|
|
18
18
|
message: string;
|
|
19
19
|
code: string;
|
|
20
20
|
category: "ai" | "database" | "filesystem" | "validation" | "network" | "configuration" | "runtime";
|
|
21
|
-
details: Record<string,
|
|
21
|
+
details: Record<string, unknown> | undefined;
|
|
22
22
|
stack: string | undefined;
|
|
23
23
|
cause: {
|
|
24
24
|
name: string;
|
|
@@ -43,11 +43,11 @@ export declare abstract class SmrtError extends Error {
|
|
|
43
43
|
* All errors have `category: 'database'` and codes prefixed with `DB_`.
|
|
44
44
|
*/
|
|
45
45
|
export declare class DatabaseError extends SmrtError {
|
|
46
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
46
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
47
47
|
static connectionFailed(dbUrl: string, cause?: Error): DatabaseError;
|
|
48
48
|
static queryFailed(query: string, cause?: Error): DatabaseError;
|
|
49
49
|
static schemaError(tableName: string, operation: string, cause?: Error): DatabaseError;
|
|
50
|
-
static constraintViolation(constraint: string, value:
|
|
50
|
+
static constraintViolation(constraint: string, value: unknown, cause?: Error): DatabaseError;
|
|
51
51
|
static corruptedData(fieldName: string, className: string, cause?: Error): DatabaseError;
|
|
52
52
|
static missingDiscriminator(className: string, rowId?: string): DatabaseError;
|
|
53
53
|
static stiDiscriminatorConflict(details: {
|
|
@@ -56,7 +56,7 @@ export declare class DatabaseError extends SmrtError {
|
|
|
56
56
|
id: string;
|
|
57
57
|
slug: string;
|
|
58
58
|
context: string;
|
|
59
|
-
conflictIdentity: Record<string,
|
|
59
|
+
conflictIdentity: Record<string, unknown>;
|
|
60
60
|
legacyMetaType: string;
|
|
61
61
|
qualifiedMetaType: string;
|
|
62
62
|
duplicateId: string;
|
|
@@ -76,10 +76,10 @@ export declare class DatabaseError extends SmrtError {
|
|
|
76
76
|
* AI errors are considered retryable by `ErrorUtils.isRetryable()`.
|
|
77
77
|
*/
|
|
78
78
|
export declare class AIError extends SmrtError {
|
|
79
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
79
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
80
80
|
static providerError(provider: string, operation: string, cause?: Error): AIError;
|
|
81
81
|
static rateLimitExceeded(provider: string, retryAfter?: number): AIError;
|
|
82
|
-
static invalidResponse(provider: string, response:
|
|
82
|
+
static invalidResponse(provider: string, response: unknown): AIError;
|
|
83
83
|
static authenticationFailed(provider: string): AIError;
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
@@ -93,7 +93,7 @@ export declare class AIError extends SmrtError {
|
|
|
93
93
|
* All errors have `category: 'filesystem'` and codes prefixed with `FS_`.
|
|
94
94
|
*/
|
|
95
95
|
export declare class FilesystemError extends SmrtError {
|
|
96
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
96
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
97
97
|
static fileNotFound(path: string): FilesystemError;
|
|
98
98
|
static permissionDenied(path: string, operation: string): FilesystemError;
|
|
99
99
|
static diskSpaceExceeded(path: string, requiredBytes: number): FilesystemError;
|
|
@@ -114,10 +114,10 @@ export declare class FilesystemError extends SmrtError {
|
|
|
114
114
|
* All errors have `category: 'validation'` and codes prefixed with `VALIDATION_`.
|
|
115
115
|
*/
|
|
116
116
|
export declare class ValidationError extends SmrtError {
|
|
117
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
117
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
118
118
|
static requiredField(fieldName: string, objectType: string): ValidationError;
|
|
119
|
-
static invalidValue(fieldName: string, value:
|
|
120
|
-
static uniqueConstraint(fieldName: string, value:
|
|
119
|
+
static invalidValue(fieldName: string, value: unknown, expectedType: string): ValidationError;
|
|
120
|
+
static uniqueConstraint(fieldName: string, value: unknown): ValidationError;
|
|
121
121
|
static rangeError(fieldName: string, value: number, min?: number, max?: number): ValidationError;
|
|
122
122
|
}
|
|
123
123
|
/**
|
|
@@ -132,7 +132,7 @@ export declare class ValidationError extends SmrtError {
|
|
|
132
132
|
* Network errors are considered retryable by `ErrorUtils.isRetryable()`.
|
|
133
133
|
*/
|
|
134
134
|
export declare class NetworkError extends SmrtError {
|
|
135
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
135
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
136
136
|
static requestFailed(url: string, status?: number, responseBody?: string | Error): NetworkError;
|
|
137
137
|
static timeout(url: string, timeoutMs: number): NetworkError;
|
|
138
138
|
static serviceUnavailable(service: string, reason?: string): NetworkError;
|
|
@@ -155,9 +155,9 @@ export declare class NetworkError extends SmrtError {
|
|
|
155
155
|
* Configuration errors are **not** retried by `ErrorUtils.withRetry()`.
|
|
156
156
|
*/
|
|
157
157
|
export declare class ConfigurationError extends SmrtError {
|
|
158
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
158
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
159
159
|
static missingConfiguration(configKey: string, context?: string): ConfigurationError;
|
|
160
|
-
static invalidConfiguration(configKey: string, value:
|
|
160
|
+
static invalidConfiguration(configKey: string, value: unknown, expected: string): ConfigurationError;
|
|
161
161
|
static initializationFailed(component: string, cause?: Error): ConfigurationError;
|
|
162
162
|
static circularInheritance(className: string, inheritanceChain: string[]): ConfigurationError;
|
|
163
163
|
static incompatibleStrategy(className: string, classStrategy: string, parentClass: string, parentStrategy: string): ConfigurationError;
|
|
@@ -178,9 +178,9 @@ export declare class ConfigurationError extends SmrtError {
|
|
|
178
178
|
* All errors have `category: 'runtime'` and codes prefixed with `RUNTIME_`.
|
|
179
179
|
*/
|
|
180
180
|
export declare class RuntimeError extends SmrtError {
|
|
181
|
-
constructor(message: string, code: string, details?: Record<string,
|
|
181
|
+
constructor(message: string, code: string, details?: Record<string, unknown>, cause?: Error);
|
|
182
182
|
static operationFailed(operation: string, context?: string, cause?: Error): RuntimeError;
|
|
183
|
-
static invalidState(message: string, context?: Record<string,
|
|
183
|
+
static invalidState(message: string, context?: Record<string, unknown>): RuntimeError;
|
|
184
184
|
static resourceExhausted(resource: string, limit: number): RuntimeError;
|
|
185
185
|
}
|
|
186
186
|
/**
|
|
@@ -231,7 +231,7 @@ export declare class TenantIsolationError extends SmrtError {
|
|
|
231
231
|
constructor(message: string, details?: {
|
|
232
232
|
tenantId?: string;
|
|
233
233
|
attemptedTenantId?: string;
|
|
234
|
-
[key: string]:
|
|
234
|
+
[key: string]: unknown;
|
|
235
235
|
}, cause?: Error);
|
|
236
236
|
/**
|
|
237
237
|
* Builds a {@link TenantIsolationError} for a blocked cross-tenant
|
|
@@ -260,7 +260,7 @@ export declare class ErrorUtils {
|
|
|
260
260
|
/**
|
|
261
261
|
* Sanitizes an error for safe logging (removes sensitive information)
|
|
262
262
|
*/
|
|
263
|
-
static sanitizeError(error: Error): Record<string,
|
|
263
|
+
static sanitizeError(error: Error): Record<string, unknown>;
|
|
264
264
|
}
|
|
265
265
|
/**
|
|
266
266
|
* Validation report that collects multiple validation errors
|
|
@@ -332,7 +332,7 @@ export declare class ValidationUtils {
|
|
|
332
332
|
* @param options - Validation options (required, min, max, etc.)
|
|
333
333
|
* @returns ValidationError if validation fails, null otherwise
|
|
334
334
|
*/
|
|
335
|
-
static validateField(fieldName: string, value:
|
|
335
|
+
static validateField(fieldName: string, value: unknown, options: {
|
|
336
336
|
required?: boolean;
|
|
337
337
|
min?: number;
|
|
338
338
|
max?: number;
|
|
@@ -340,13 +340,13 @@ export declare class ValidationUtils {
|
|
|
340
340
|
maxLength?: number;
|
|
341
341
|
pattern?: string | RegExp;
|
|
342
342
|
type?: string;
|
|
343
|
-
customValidator?: (value:
|
|
343
|
+
customValidator?: (value: unknown) => boolean | Promise<boolean>;
|
|
344
344
|
customMessage?: string;
|
|
345
345
|
}, objectType?: string): Promise<ValidationError | null>;
|
|
346
346
|
/**
|
|
347
347
|
* Validate required field
|
|
348
348
|
*/
|
|
349
|
-
static validateRequired(fieldName: string, value:
|
|
349
|
+
static validateRequired(fieldName: string, value: unknown, objectType?: string): ValidationError | null;
|
|
350
350
|
/**
|
|
351
351
|
* Validate numeric range
|
|
352
352
|
*/
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgCH,8BAAsB,SAAU,SAAQ,KAAK;IAC3C,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,QAAQ,EACpB,UAAU,GACV,IAAI,GACJ,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,eAAe,GACf,SAAS,CAAC;IACd,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
CHANGED
|
@@ -230,7 +230,7 @@ class ValidationError extends SmrtError {
|
|
|
230
230
|
}
|
|
231
231
|
static uniqueConstraint(fieldName, value) {
|
|
232
232
|
return new ValidationError(
|
|
233
|
-
`Unique constraint violation for field '${fieldName}' with value: ${value}`,
|
|
233
|
+
`Unique constraint violation for field '${fieldName}' with value: ${String(value)}`,
|
|
234
234
|
"VALIDATION_UNIQUE_CONSTRAINT",
|
|
235
235
|
{ fieldName, value }
|
|
236
236
|
);
|
|
@@ -432,7 +432,8 @@ class ErrorUtils {
|
|
|
432
432
|
sanitized.code = error.code;
|
|
433
433
|
sanitized.category = error.category;
|
|
434
434
|
if (error.details) {
|
|
435
|
-
|
|
435
|
+
const details = { ...error.details };
|
|
436
|
+
sanitized.details = details;
|
|
436
437
|
const sensitiveFields = [
|
|
437
438
|
"password",
|
|
438
439
|
"token",
|
|
@@ -441,8 +442,8 @@ class ErrorUtils {
|
|
|
441
442
|
"apiKey"
|
|
442
443
|
];
|
|
443
444
|
for (const field of sensitiveFields) {
|
|
444
|
-
if (
|
|
445
|
-
|
|
445
|
+
if (details[field]) {
|
|
446
|
+
details[field] = "[REDACTED]";
|
|
446
447
|
}
|
|
447
448
|
}
|
|
448
449
|
}
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sources":["../src/errors.ts"],"sourcesContent":["/**\n * Comprehensive error handling system for SMRT framework\n *\n * Provides specialized error types for different failure scenarios\n * with proper error codes, messages, and debugging information.\n */\n\n/**\n * Abstract base class for all SMRT framework errors.\n *\n * Adds a structured `code` (machine-readable string constant), a `category`\n * (coarse error domain), optional structured `details`, and an optional\n * causal `Error` chain on top of the standard `Error` class.\n *\n * Never throw `SmrtError` directly — use one of the concrete subclasses\n * (`DatabaseError`, `AIError`, `ValidationError`, etc.) or their static\n * factory methods for consistent error codes and messages.\n *\n * @example\n * ```typescript\n * try {\n * await product.save();\n * } catch (err) {\n * if (err instanceof ValidationError) {\n * console.error(err.code, err.details); // 'VALIDATION_REQUIRED_FIELD', { fieldName, objectType }\n * }\n * if (err instanceof SmrtError) {\n * logger.error(ErrorUtils.sanitizeError(err));\n * }\n * }\n * ```\n */\n\nimport { createLogger } from '@happyvertical/logger';\n\nconst logger = createLogger({ level: 'info' });\n\nexport abstract class SmrtError extends Error {\n public readonly code: string;\n public readonly category:\n | 'database'\n | 'ai'\n | 'filesystem'\n | 'validation'\n | 'network'\n | 'configuration'\n | 'runtime';\n public readonly details?: Record<string, any>;\n public readonly cause?: Error;\n\n constructor(\n message: string,\n code: string,\n category: SmrtError['category'],\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.category = category;\n this.details = details;\n this.cause = cause;\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Converts error to a serializable object for logging/debugging\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n category: this.category,\n details: this.details,\n stack: this.stack,\n cause: this.cause\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : undefined,\n };\n }\n}\n\ntype ErrorLikeWithContext = Error & {\n cause?: unknown;\n context?: {\n originalError?: unknown;\n };\n};\n\nfunction collectErrorMessages(\n value: unknown,\n messages: string[],\n visited: Set<unknown>,\n depth = 0,\n): void {\n if (!value || visited.has(value) || depth > 10) {\n return;\n }\n\n visited.add(value);\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed) {\n messages.push(trimmed);\n }\n return;\n }\n\n if (!(value instanceof Error)) {\n return;\n }\n\n const message = value.message?.trim();\n if (message) {\n messages.push(message);\n }\n\n const errorWithContext = value as ErrorLikeWithContext;\n collectErrorMessages(\n errorWithContext.context?.originalError,\n messages,\n visited,\n depth + 1,\n );\n collectErrorMessages(errorWithContext.cause, messages, visited, depth + 1);\n}\n\nfunction getPrimaryCauseMessage(cause?: Error): {\n message?: string;\n messages?: string[];\n} {\n if (!cause) {\n return {};\n }\n\n const collected: string[] = [];\n collectErrorMessages(cause, collected, new Set<unknown>());\n\n const uniqueMessages = [...new Set(collected.filter(Boolean))];\n if (uniqueMessages.length === 0) {\n return {};\n }\n\n return {\n message: uniqueMessages[uniqueMessages.length - 1],\n messages: uniqueMessages,\n };\n}\n\n/**\n * Errors originating from database operations.\n *\n * Use the static factory methods rather than the constructor directly:\n * - `DatabaseError.connectionFailed(url, cause)` — DB connection failure\n * - `DatabaseError.queryFailed(query, cause)` — SQL execution error\n * - `DatabaseError.schemaError(table, op, cause)` — DDL/migration error\n * - `DatabaseError.constraintViolation(constraint, value, cause)` — FK/CHECK/UNIQUE\n * - `DatabaseError.corruptedData(field, class, cause)` — unparse-able column data\n * - `DatabaseError.missingDiscriminator(class, rowId)` — STI row missing `_meta_type`\n * - `DatabaseError.stiDiscriminatorConflict(...)` — legacy STI discriminator collides during qualification\n * - `DatabaseError.schemaMissing(table, class)` — table not yet migrated\n *\n * All errors have `category: 'database'` and codes prefixed with `DB_`.\n */\nexport class DatabaseError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'database', details, cause);\n }\n\n static connectionFailed(dbUrl: string, cause?: Error): DatabaseError {\n return new DatabaseError(\n `Failed to connect to database: ${dbUrl}`,\n 'DB_CONNECTION_FAILED',\n { dbUrl },\n cause,\n );\n }\n\n static queryFailed(query: string, cause?: Error): DatabaseError {\n // Include the deepest actionable cause message for better debugging.\n const causeInfo = getPrimaryCauseMessage(cause);\n const causeMsg = causeInfo.message ? `\\nCause: ${causeInfo.message}` : '';\n return new DatabaseError(\n `Database query failed: ${query.substring(0, 100)}${query.length > 100 ? '...' : ''}${causeMsg}`,\n 'DB_QUERY_FAILED',\n {\n query,\n causeMessage: causeInfo.message,\n causeMessages: causeInfo.messages,\n },\n cause,\n );\n }\n\n static schemaError(\n tableName: string,\n operation: string,\n cause?: Error,\n ): DatabaseError {\n return new DatabaseError(\n `Schema operation failed for table '${tableName}': ${operation}`,\n 'DB_SCHEMA_ERROR',\n { tableName, operation },\n cause,\n );\n }\n\n static constraintViolation(\n constraint: string,\n value: any,\n cause?: Error,\n ): DatabaseError {\n return new DatabaseError(\n `Database constraint violation: ${constraint}`,\n 'DB_CONSTRAINT_VIOLATION',\n { constraint, value },\n cause,\n );\n }\n\n static corruptedData(\n fieldName: string,\n className: string,\n cause?: Error,\n ): DatabaseError {\n return new DatabaseError(\n `Corrupted data in field '${fieldName}' for ${className}. ` +\n `The data cannot be parsed or is malformed. ` +\n `This may indicate database corruption or incompatible schema changes.`,\n 'DB_CORRUPTED_DATA',\n { fieldName, className },\n cause,\n );\n }\n\n static missingDiscriminator(\n className: string,\n rowId?: string,\n ): DatabaseError {\n return new DatabaseError(\n `Missing discriminator (_meta_type) for STI class ${className}${rowId ? ` (row id: ${rowId})` : ''}. ` +\n `STI classes require a discriminator column to determine the correct subclass. ` +\n `This may indicate a schema mismatch or manual database modification.`,\n 'DB_MISSING_DISCRIMINATOR',\n { className, rowId },\n );\n }\n\n static stiDiscriminatorConflict(details: {\n className: string;\n tableName: string;\n id: string;\n slug: string;\n context: string;\n conflictIdentity: Record<string, any>;\n legacyMetaType: string;\n qualifiedMetaType: string;\n duplicateId: string;\n }): DatabaseError {\n const identityText = Object.entries(details.conflictIdentity)\n .map(([key, value]) => `${key} '${String(value)}'`)\n .join(', ');\n\n return new DatabaseError(\n `Legacy STI discriminator collision for ${details.className} (${details.tableName}). ` +\n `Row '${details.id}' would upgrade _meta_type from '${details.legacyMetaType}' to '${details.qualifiedMetaType}', ` +\n `but row '${details.duplicateId}' already uses the qualified discriminator for ${identityText || 'the same conflict identity'}. ` +\n `Merge or remove the duplicate legacy/qualified rows before saving.`,\n 'DB_STI_DISCRIMINATOR_CONFLICT',\n details,\n );\n }\n\n static schemaMissing(tableName: string, className: string): DatabaseError {\n return new DatabaseError(\n `Table '${tableName}' does not exist for class '${className}'. ` +\n `Run 'smrt db:migrate' to create database schema.`,\n 'DB_SCHEMA_MISSING',\n { tableName, className },\n );\n }\n}\n\n/**\n * Errors from AI provider integrations.\n *\n * Use the static factory methods:\n * - `AIError.providerError(provider, operation, cause)` — generic provider failure\n * - `AIError.rateLimitExceeded(provider, retryAfter)` — rate limit hit\n * - `AIError.invalidResponse(provider, response)` — unexpected response shape\n * - `AIError.authenticationFailed(provider)` — bad API key / credentials\n *\n * All errors have `category: 'ai'` and codes prefixed with `AI_`.\n * AI errors are considered retryable by `ErrorUtils.isRetryable()`.\n */\nexport class AIError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'ai', details, cause);\n }\n\n static providerError(\n provider: string,\n operation: string,\n cause?: Error,\n ): AIError {\n return new AIError(\n `AI provider '${provider}' failed during ${operation}`,\n 'AI_PROVIDER_ERROR',\n { provider, operation },\n cause,\n );\n }\n\n static rateLimitExceeded(provider: string, retryAfter?: number): AIError {\n return new AIError(\n `AI provider '${provider}' rate limit exceeded`,\n 'AI_RATE_LIMIT',\n { provider, retryAfter },\n );\n }\n\n static invalidResponse(provider: string, response: any): AIError {\n return new AIError(\n `AI provider '${provider}' returned invalid response`,\n 'AI_INVALID_RESPONSE',\n { provider, response },\n );\n }\n\n static authenticationFailed(provider: string): AIError {\n return new AIError(\n `AI provider '${provider}' authentication failed`,\n 'AI_AUTH_FAILED',\n { provider },\n );\n }\n}\n\n/**\n * Errors from filesystem operations.\n *\n * Use the static factory methods:\n * - `FilesystemError.fileNotFound(path)` — file does not exist\n * - `FilesystemError.permissionDenied(path, operation)` — access denied\n * - `FilesystemError.diskSpaceExceeded(path, requiredBytes)` — insufficient space\n *\n * All errors have `category: 'filesystem'` and codes prefixed with `FS_`.\n */\nexport class FilesystemError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'filesystem', details, cause);\n }\n\n static fileNotFound(path: string): FilesystemError {\n return new FilesystemError(`File not found: ${path}`, 'FS_FILE_NOT_FOUND', {\n path,\n });\n }\n\n static permissionDenied(path: string, operation: string): FilesystemError {\n return new FilesystemError(\n `Permission denied for ${operation} on: ${path}`,\n 'FS_PERMISSION_DENIED',\n { path, operation },\n );\n }\n\n static diskSpaceExceeded(\n path: string,\n requiredBytes: number,\n ): FilesystemError {\n return new FilesystemError(\n `Insufficient disk space for operation on: ${path}`,\n 'FS_DISK_SPACE_EXCEEDED',\n { path, requiredBytes },\n );\n }\n}\n\n/**\n * Input/data validation errors thrown before or during a database operation.\n *\n * `save()` throws `ValidationError` when field validation fails. The collection's\n * `convertWhereKeys()` throws it for invalid WHERE clause operators or field names.\n * `ValidationError` is **not** retried by `ErrorUtils.withRetry()`.\n *\n * Use the static factory methods:\n * - `ValidationError.requiredField(field, objectType)` — missing required field\n * - `ValidationError.invalidValue(field, value, expected)` — wrong type/format\n * - `ValidationError.uniqueConstraint(field, value)` — duplicate unique value\n * - `ValidationError.rangeError(field, value, min?, max?)` — out of allowed range\n *\n * All errors have `category: 'validation'` and codes prefixed with `VALIDATION_`.\n */\nexport class ValidationError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'validation', details, cause);\n }\n\n static requiredField(fieldName: string, objectType: string): ValidationError {\n return new ValidationError(\n `Required field '${fieldName}' is missing for ${objectType}`,\n 'VALIDATION_REQUIRED_FIELD',\n { fieldName, objectType },\n );\n }\n\n static invalidValue(\n fieldName: string,\n value: any,\n expectedType: string,\n ): ValidationError {\n return new ValidationError(\n `Invalid value for field '${fieldName}': expected ${expectedType}, got ${typeof value}`,\n 'VALIDATION_INVALID_VALUE',\n { fieldName, value, expectedType },\n );\n }\n\n static uniqueConstraint(fieldName: string, value: any): ValidationError {\n return new ValidationError(\n `Unique constraint violation for field '${fieldName}' with value: ${value}`,\n 'VALIDATION_UNIQUE_CONSTRAINT',\n { fieldName, value },\n );\n }\n\n static rangeError(\n fieldName: string,\n value: number,\n min?: number,\n max?: number,\n ): ValidationError {\n const range =\n min !== undefined && max !== undefined\n ? `between ${min} and ${max}`\n : min !== undefined\n ? `>= ${min}`\n : `<= ${max}`;\n\n return new ValidationError(\n `Value for field '${fieldName}' must be ${range}, got: ${value}`,\n 'VALIDATION_RANGE_ERROR',\n { fieldName, value, min, max },\n );\n }\n}\n\n/**\n * Errors from HTTP and external network operations.\n *\n * Use the static factory methods:\n * - `NetworkError.requestFailed(url, status?, body?)` — non-2xx response or connection failure\n * - `NetworkError.timeout(url, timeoutMs)` — request exceeded timeout\n * - `NetworkError.serviceUnavailable(service, reason?)` — external service down\n *\n * All errors have `category: 'network'` and codes prefixed with `NETWORK_`.\n * Network errors are considered retryable by `ErrorUtils.isRetryable()`.\n */\nexport class NetworkError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'network', details, cause);\n }\n\n static requestFailed(\n url: string,\n status?: number,\n responseBody?: string | Error,\n ): NetworkError {\n const cause = responseBody instanceof Error ? responseBody : undefined;\n const body = typeof responseBody === 'string' ? responseBody : undefined;\n return new NetworkError(\n `Network request failed: ${url}${status ? ` (Status: ${status})` : ''}${body ? ` - ${body.substring(0, 200)}` : ''}`,\n 'NETWORK_REQUEST_FAILED',\n { url, status, responseBody: body },\n cause,\n );\n }\n\n static timeout(url: string, timeoutMs: number): NetworkError {\n return new NetworkError(\n `Network request timed out after ${timeoutMs}ms: ${url}`,\n 'NETWORK_TIMEOUT',\n { url, timeoutMs },\n );\n }\n\n static serviceUnavailable(service: string, reason?: string): NetworkError {\n return new NetworkError(\n reason\n ? `External service unavailable: ${service} - ${reason}`\n : `External service unavailable: ${service}`,\n 'NETWORK_SERVICE_UNAVAILABLE',\n { service, reason },\n );\n }\n}\n\n/**\n * Errors from misconfigured or incompatible class/framework setup.\n *\n * These are typically thrown during class registration (i.e. at module load time),\n * not during normal request handling.\n *\n * Use the static factory methods:\n * - `ConfigurationError.missingConfiguration(key, context?)` — missing required config\n * - `ConfigurationError.invalidConfiguration(key, value, expected)` — wrong config type/value\n * - `ConfigurationError.initializationFailed(component, cause?)` — component failed to start\n * - `ConfigurationError.circularInheritance(class, chain)` — circular class inheritance\n * - `ConfigurationError.incompatibleStrategy(class, strategy, parent, parentStrategy)` — STI mismatch\n * - `ConfigurationError.unregisteredBaseClass(child, base)` — STI base not yet registered\n *\n * All errors have `category: 'configuration'` and codes prefixed with `CONFIG_`.\n * Configuration errors are **not** retried by `ErrorUtils.withRetry()`.\n */\nexport class ConfigurationError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'configuration', details, cause);\n }\n\n static missingConfiguration(\n configKey: string,\n context?: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `Missing required configuration: ${configKey}${context ? ` in ${context}` : ''}`,\n 'CONFIG_MISSING',\n { configKey, context },\n );\n }\n\n static invalidConfiguration(\n configKey: string,\n value: any,\n expected: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `Invalid configuration for ${configKey}: expected ${expected}, got ${typeof value}`,\n 'CONFIG_INVALID',\n { configKey, value, expected },\n );\n }\n\n static initializationFailed(\n component: string,\n cause?: Error,\n ): ConfigurationError {\n return new ConfigurationError(\n `Failed to initialize component: ${component}`,\n 'CONFIG_INIT_FAILED',\n { component },\n cause,\n );\n }\n\n static circularInheritance(\n className: string,\n inheritanceChain: string[],\n ): ConfigurationError {\n return new ConfigurationError(\n `Circular inheritance detected for class '${className}'. ` +\n `Inheritance chain: ${inheritanceChain.join(' → ')} → ${className}. ` +\n `Classes cannot inherit from themselves directly or indirectly.`,\n 'CONFIG_CIRCULAR_INHERITANCE',\n { className, inheritanceChain },\n );\n }\n\n static incompatibleStrategy(\n className: string,\n classStrategy: string,\n parentClass: string,\n parentStrategy: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `Incompatible table strategy for class '${className}' (${classStrategy}). ` +\n `Parent class '${parentClass}' uses ${parentStrategy} strategy. ` +\n `Child classes must use the same table strategy as their parent. ` +\n `Either change ${className} to use ${parentStrategy}, or remove the inheritance.`,\n 'CONFIG_INCOMPATIBLE_STRATEGY',\n { className, classStrategy, parentClass, parentStrategy },\n );\n }\n\n static unregisteredBaseClass(\n childClass: string,\n baseClass: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `STI base class '${baseClass}' is not registered for child class '${childClass}'. ` +\n `When using Single Table Inheritance, the base class must be registered before any child classes. ` +\n `Ensure ${baseClass} is decorated with @smrt({ tableStrategy: 'sti' }) and imported before ${childClass}.`,\n 'CONFIG_UNREGISTERED_BASE',\n { childClass, baseClass },\n );\n }\n}\n\n/**\n * Errors representing unexpected runtime failures not covered by other categories.\n *\n * `RuntimeError` is the catch-all for internal framework errors — invalid object\n * state, exhausted resources, or failures in operations like `save()` and `loadFromId()`\n * that propagate from an unknown cause.\n *\n * Use the static factory methods:\n * - `RuntimeError.operationFailed(operation, context?, cause?)` — generic operation failure\n * - `RuntimeError.invalidState(message, context?)` — unexpected object/system state\n * - `RuntimeError.resourceExhausted(resource, limit)` — limit exceeded (e.g. connections)\n *\n * All errors have `category: 'runtime'` and codes prefixed with `RUNTIME_`.\n */\nexport class RuntimeError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, any>,\n cause?: Error,\n ) {\n super(message, code, 'runtime', details, cause);\n }\n\n static operationFailed(\n operation: string,\n context?: string,\n cause?: Error,\n ): RuntimeError {\n return new RuntimeError(\n `Operation failed: ${operation}${context ? ` in ${context}` : ''}`,\n 'RUNTIME_OPERATION_FAILED',\n { operation, context },\n cause,\n );\n }\n\n static invalidState(\n message: string,\n context?: Record<string, any>,\n ): RuntimeError {\n return new RuntimeError(message, 'RUNTIME_INVALID_STATE', context);\n }\n\n static resourceExhausted(resource: string, limit: number): RuntimeError {\n return new RuntimeError(\n `Resource exhausted: ${resource} exceeded limit of ${limit}`,\n 'RUNTIME_RESOURCE_EXHAUSTED',\n { resource, limit },\n );\n }\n}\n\n/**\n * Error thrown when a tenant isolation boundary is crossed while resolving a\n * relationship.\n *\n * Raised by {@link SmrtObject.loadRelated} / {@link SmrtObject.loadRelatedMany}\n * (and {@link SmrtObject.getRelated}, which delegates to them) when a\n * tenant-scoped object resolves a relationship to an object belonging to a\n * *different*, non-null tenant — the genuine cross-tenant data leak. The guard\n * is a no-op when either side has a `null` tenant (global / non-tenant-scoped\n * models) and when both sides share the same tenant, so it only fires on real\n * leaks. Pass `{ allowCrossTenant: true }` to the loader to deliberately opt out.\n *\n * The `code` is always `'TENANT_ISOLATION_VIOLATION'` and the category is\n * `'validation'`. It is never retried — `ErrorUtils.withRetry()` rethrows it\n * immediately and `ErrorUtils.isRetryable()` returns `false` — because a tenant\n * boundary violation is deterministic. `tenantId` is the owning object's tenant\n * and `attemptedTenantId` is the tenant of the object that was reached.\n *\n * This shares its stable `code`, `name`, `tenantId`, and `attemptedTenantId`\n * shape with the interceptor-level `TenantIsolationError` in\n * `@happyvertical/smrt-tenancy`, so cross-cutting handlers can match either via\n * `err.code === 'TENANT_ISOLATION_VIOLATION'`. They are intentionally distinct\n * classes because `@happyvertical/smrt-core` cannot depend on the tenancy\n * package (the dependency runs the other way).\n *\n * @example\n * ```typescript\n * try {\n * await order.loadRelated('customerId');\n * } catch (err) {\n * if (err instanceof TenantIsolationError) {\n * // err.tenantId — the order's tenant\n * // err.attemptedTenantId — the customer's tenant\n * }\n * }\n * ```\n *\n * @see SmrtObject.loadRelated\n * @see SmrtObject.loadRelatedMany\n */\nexport class TenantIsolationError extends SmrtError {\n /** The tenant ID of the object that owns the relationship. */\n public readonly tenantId?: string;\n /** The tenant ID of the related object that was reached (and rejected). */\n public readonly attemptedTenantId?: string;\n\n constructor(\n message: string,\n details?: {\n tenantId?: string;\n attemptedTenantId?: string;\n [key: string]: any;\n },\n cause?: Error,\n ) {\n super(message, 'TENANT_ISOLATION_VIOLATION', 'validation', details, cause);\n this.tenantId = details?.tenantId;\n this.attemptedTenantId = details?.attemptedTenantId;\n }\n\n /**\n * Builds a {@link TenantIsolationError} for a blocked cross-tenant\n * relationship resolution, with a descriptive message and structured details.\n */\n static crossTenantReference(details: {\n sourceClass: string;\n fieldName: string;\n sourceTenantId: string;\n targetClass?: string;\n targetTenantId: string;\n }): TenantIsolationError {\n const target = details.targetClass\n ? `${details.targetClass} (tenant '${details.targetTenantId}')`\n : `tenant '${details.targetTenantId}'`;\n return new TenantIsolationError(\n `Cross-tenant relationship access blocked on ${details.sourceClass}.${details.fieldName}: ` +\n `owning tenant '${details.sourceTenantId}' does not match ${target}. ` +\n `Pass { allowCrossTenant: true } to loadRelated()/loadRelatedMany()/getRelated() to override.`,\n {\n tenantId: details.sourceTenantId,\n attemptedTenantId: details.targetTenantId,\n sourceClass: details.sourceClass,\n fieldName: details.fieldName,\n targetClass: details.targetClass,\n },\n );\n }\n}\n\n/**\n * Utility functions for error handling\n */\nexport class ErrorUtils {\n /**\n * Wraps a function with error handling and automatic retry logic\n */\n static async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries = 3,\n delay = 1000,\n backoffMultiplier = 2,\n ): Promise<T> {\n let lastError: Error = new Error('Operation failed without error details');\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxRetries) {\n throw lastError;\n }\n\n // Skip retry for certain error types. A tenant isolation violation is\n // deterministic — retrying re-fetches the same cross-tenant target — and\n // is a security boundary, so it must never be retried.\n if (\n error instanceof ValidationError ||\n error instanceof ConfigurationError ||\n error instanceof TenantIsolationError\n ) {\n throw error;\n }\n\n // Wait before retrying with exponential backoff\n // Wrap in try-catch to handle any potential timer errors\n try {\n await new Promise<void>((resolve) => {\n setTimeout(() => resolve(), delay * backoffMultiplier ** attempt);\n });\n } catch (timerError) {\n // Log timer error but don't fail the retry\n logger.error('Timer error during retry', { error: timerError });\n }\n }\n }\n\n throw lastError;\n }\n\n /**\n * Checks if an error is retryable\n */\n static isRetryable(error: Error): boolean {\n if (error instanceof SmrtError) {\n return error.category === 'network' || error.category === 'ai';\n }\n\n // Check for common retryable error patterns\n const retryablePatterns = [\n /ECONNRESET/,\n /ETIMEDOUT/,\n /ENOTFOUND/,\n /rate.?limit/i,\n /timeout/i,\n /503/,\n /502/,\n /500/,\n ];\n\n return retryablePatterns.some((pattern) => pattern.test(error.message));\n }\n\n /**\n * Sanitizes an error for safe logging (removes sensitive information)\n */\n static sanitizeError(error: Error): Record<string, any> {\n const sanitized: Record<string, any> = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n\n if (error instanceof SmrtError) {\n sanitized.code = error.code;\n sanitized.category = error.category;\n\n // Sanitize details to remove potential sensitive information\n if (error.details) {\n sanitized.details = { ...error.details };\n\n // Remove common sensitive fields\n const sensitiveFields = [\n 'password',\n 'token',\n 'key',\n 'secret',\n 'apiKey',\n ];\n for (const field of sensitiveFields) {\n if (sanitized.details[field]) {\n sanitized.details[field] = '[REDACTED]';\n }\n }\n }\n }\n\n return sanitized;\n }\n}\n\n/**\n * Validation report that collects multiple validation errors\n *\n * Useful for validating an entire object and reporting all errors\n * at once rather than stopping at the first error.\n *\n * @example\n * ```typescript\n * const report = new ValidationReport('Product');\n * report.addError(ValidationError.requiredField('name', 'Product'));\n * report.addError(ValidationError.rangeError('price', -10, 0));\n *\n * if (report.hasErrors()) {\n * console.error(report.toString());\n * // Output:\n * // Validation failed for Product with 2 errors:\n * // - name: Required field 'name' is missing for Product\n * // - price: Value -10 for field 'price' is outside allowed range [0, undefined]\n * }\n * ```\n */\nexport class ValidationReport {\n private errors: ValidationError[] = [];\n private objectType: string;\n\n constructor(objectType: string) {\n this.objectType = objectType;\n }\n\n /**\n * Add a validation error to the report\n */\n addError(error: ValidationError): void {\n this.errors.push(error);\n }\n\n /**\n * Check if there are any validation errors\n */\n hasErrors(): boolean {\n return this.errors.length > 0;\n }\n\n /**\n * Get all validation errors\n */\n getErrors(): ValidationError[] {\n return [...this.errors];\n }\n\n /**\n * Get the number of validation errors\n */\n getErrorCount(): number {\n return this.errors.length;\n }\n\n /**\n * Convert to a human-readable string\n */\n toString(): string {\n if (this.errors.length === 0) {\n return `Validation passed for ${this.objectType}`;\n }\n\n const errorList = this.errors\n .map((err, idx) => ` ${idx + 1}. ${err.message}`)\n .join('\\n');\n\n return `Validation failed for ${this.objectType} with ${this.errors.length} error(s):\\n${errorList}`;\n }\n\n /**\n * Convert to JSON format\n */\n toJSON(): object {\n return {\n objectType: this.objectType,\n errorCount: this.errors.length,\n errors: this.errors.map((err) => err.toJSON()),\n };\n }\n\n /**\n * Throw the first error if there are any errors\n */\n throwIfErrors(): void {\n if (this.errors.length > 0) {\n throw this.errors[0];\n }\n }\n\n /**\n * Clear all errors\n */\n clear(): void {\n this.errors = [];\n }\n}\n\n/**\n * Validation utility functions\n */\nexport class ValidationUtils {\n /**\n * Validate a single field value\n *\n * @param fieldName - Name of the field\n * @param value - Value to validate\n * @param options - Validation options (required, min, max, etc.)\n * @returns ValidationError if validation fails, null otherwise\n */\n static async validateField(\n fieldName: string,\n value: any,\n options: {\n required?: boolean;\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string | RegExp;\n type?: string;\n customValidator?: (value: any) => boolean | Promise<boolean>;\n customMessage?: string;\n },\n objectType: string = 'Object',\n ): Promise<ValidationError | null> {\n // Required check\n if (\n options.required &&\n (value === null || value === undefined || value === '')\n ) {\n return ValidationError.requiredField(fieldName, objectType);\n }\n\n // Skip further validation if value is null/undefined and not required\n if (value === null || value === undefined) {\n return null;\n }\n\n // Numeric range validation\n if (typeof value === 'number') {\n if (options.min !== undefined && value < options.min) {\n return ValidationError.rangeError(\n fieldName,\n value,\n options.min,\n options.max,\n );\n }\n if (options.max !== undefined && value > options.max) {\n return ValidationError.rangeError(\n fieldName,\n value,\n options.min,\n options.max,\n );\n }\n }\n\n // String length validation\n if (typeof value === 'string') {\n if (options.minLength !== undefined && value.length < options.minLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with minimum length ${options.minLength}`,\n );\n }\n if (options.maxLength !== undefined && value.length > options.maxLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with maximum length ${options.maxLength}`,\n );\n }\n\n // Pattern validation\n if (options.pattern) {\n const regex =\n typeof options.pattern === 'string'\n ? new RegExp(options.pattern)\n : options.pattern;\n if (!regex.test(value)) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string matching pattern ${options.pattern}`,\n );\n }\n }\n }\n\n // Custom validator\n if (options.customValidator) {\n try {\n const isValid = await options.customValidator(value);\n if (!isValid) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n options.customMessage || 'custom validation failed',\n );\n }\n } catch (error) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `custom validation error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return null;\n }\n\n /**\n * Validate required field\n */\n static validateRequired(\n fieldName: string,\n value: any,\n objectType: string = 'Object',\n ): ValidationError | null {\n if (value === null || value === undefined || value === '') {\n return ValidationError.requiredField(fieldName, objectType);\n }\n return null;\n }\n\n /**\n * Validate numeric range\n */\n static validateRange(\n fieldName: string,\n value: number,\n min?: number,\n max?: number,\n ): ValidationError | null {\n if (min !== undefined && value < min) {\n return ValidationError.rangeError(fieldName, value, min, max);\n }\n if (max !== undefined && value > max) {\n return ValidationError.rangeError(fieldName, value, min, max);\n }\n return null;\n }\n\n /**\n * Validate string length\n */\n static validateLength(\n fieldName: string,\n value: string,\n minLength?: number,\n maxLength?: number,\n ): ValidationError | null {\n if (minLength !== undefined && value.length < minLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with minimum length ${minLength}`,\n );\n }\n if (maxLength !== undefined && value.length > maxLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with maximum length ${maxLength}`,\n );\n }\n return null;\n }\n\n /**\n * Validate string pattern\n */\n static validatePattern(\n fieldName: string,\n value: string,\n pattern: string | RegExp,\n ): ValidationError | null {\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\n if (!regex.test(value)) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string matching pattern ${pattern}`,\n );\n }\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sources":["../src/errors.ts"],"sourcesContent":["/**\n * Comprehensive error handling system for SMRT framework\n *\n * Provides specialized error types for different failure scenarios\n * with proper error codes, messages, and debugging information.\n */\n\n/**\n * Abstract base class for all SMRT framework errors.\n *\n * Adds a structured `code` (machine-readable string constant), a `category`\n * (coarse error domain), optional structured `details`, and an optional\n * causal `Error` chain on top of the standard `Error` class.\n *\n * Never throw `SmrtError` directly — use one of the concrete subclasses\n * (`DatabaseError`, `AIError`, `ValidationError`, etc.) or their static\n * factory methods for consistent error codes and messages.\n *\n * @example\n * ```typescript\n * try {\n * await product.save();\n * } catch (err) {\n * if (err instanceof ValidationError) {\n * console.error(err.code, err.details); // 'VALIDATION_REQUIRED_FIELD', { fieldName, objectType }\n * }\n * if (err instanceof SmrtError) {\n * logger.error(ErrorUtils.sanitizeError(err));\n * }\n * }\n * ```\n */\n\nimport { createLogger } from '@happyvertical/logger';\n\nconst logger = createLogger({ level: 'info' });\n\nexport abstract class SmrtError extends Error {\n public readonly code: string;\n public readonly category:\n | 'database'\n | 'ai'\n | 'filesystem'\n | 'validation'\n | 'network'\n | 'configuration'\n | 'runtime';\n public readonly details?: Record<string, unknown>;\n public readonly cause?: Error;\n\n constructor(\n message: string,\n code: string,\n category: SmrtError['category'],\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.category = category;\n this.details = details;\n this.cause = cause;\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Converts error to a serializable object for logging/debugging\n */\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n category: this.category,\n details: this.details,\n stack: this.stack,\n cause: this.cause\n ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n }\n : undefined,\n };\n }\n}\n\ntype ErrorLikeWithContext = Error & {\n cause?: unknown;\n context?: {\n originalError?: unknown;\n };\n};\n\nfunction collectErrorMessages(\n value: unknown,\n messages: string[],\n visited: Set<unknown>,\n depth = 0,\n): void {\n if (!value || visited.has(value) || depth > 10) {\n return;\n }\n\n visited.add(value);\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed) {\n messages.push(trimmed);\n }\n return;\n }\n\n if (!(value instanceof Error)) {\n return;\n }\n\n const message = value.message?.trim();\n if (message) {\n messages.push(message);\n }\n\n const errorWithContext = value as ErrorLikeWithContext;\n collectErrorMessages(\n errorWithContext.context?.originalError,\n messages,\n visited,\n depth + 1,\n );\n collectErrorMessages(errorWithContext.cause, messages, visited, depth + 1);\n}\n\nfunction getPrimaryCauseMessage(cause?: Error): {\n message?: string;\n messages?: string[];\n} {\n if (!cause) {\n return {};\n }\n\n const collected: string[] = [];\n collectErrorMessages(cause, collected, new Set<unknown>());\n\n const uniqueMessages = [...new Set(collected.filter(Boolean))];\n if (uniqueMessages.length === 0) {\n return {};\n }\n\n return {\n message: uniqueMessages[uniqueMessages.length - 1],\n messages: uniqueMessages,\n };\n}\n\n/**\n * Errors originating from database operations.\n *\n * Use the static factory methods rather than the constructor directly:\n * - `DatabaseError.connectionFailed(url, cause)` — DB connection failure\n * - `DatabaseError.queryFailed(query, cause)` — SQL execution error\n * - `DatabaseError.schemaError(table, op, cause)` — DDL/migration error\n * - `DatabaseError.constraintViolation(constraint, value, cause)` — FK/CHECK/UNIQUE\n * - `DatabaseError.corruptedData(field, class, cause)` — unparse-able column data\n * - `DatabaseError.missingDiscriminator(class, rowId)` — STI row missing `_meta_type`\n * - `DatabaseError.stiDiscriminatorConflict(...)` — legacy STI discriminator collides during qualification\n * - `DatabaseError.schemaMissing(table, class)` — table not yet migrated\n *\n * All errors have `category: 'database'` and codes prefixed with `DB_`.\n */\nexport class DatabaseError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'database', details, cause);\n }\n\n static connectionFailed(dbUrl: string, cause?: Error): DatabaseError {\n return new DatabaseError(\n `Failed to connect to database: ${dbUrl}`,\n 'DB_CONNECTION_FAILED',\n { dbUrl },\n cause,\n );\n }\n\n static queryFailed(query: string, cause?: Error): DatabaseError {\n // Include the deepest actionable cause message for better debugging.\n const causeInfo = getPrimaryCauseMessage(cause);\n const causeMsg = causeInfo.message ? `\\nCause: ${causeInfo.message}` : '';\n return new DatabaseError(\n `Database query failed: ${query.substring(0, 100)}${query.length > 100 ? '...' : ''}${causeMsg}`,\n 'DB_QUERY_FAILED',\n {\n query,\n causeMessage: causeInfo.message,\n causeMessages: causeInfo.messages,\n },\n cause,\n );\n }\n\n static schemaError(\n tableName: string,\n operation: string,\n cause?: Error,\n ): DatabaseError {\n return new DatabaseError(\n `Schema operation failed for table '${tableName}': ${operation}`,\n 'DB_SCHEMA_ERROR',\n { tableName, operation },\n cause,\n );\n }\n\n static constraintViolation(\n constraint: string,\n value: unknown,\n cause?: Error,\n ): DatabaseError {\n return new DatabaseError(\n `Database constraint violation: ${constraint}`,\n 'DB_CONSTRAINT_VIOLATION',\n { constraint, value },\n cause,\n );\n }\n\n static corruptedData(\n fieldName: string,\n className: string,\n cause?: Error,\n ): DatabaseError {\n return new DatabaseError(\n `Corrupted data in field '${fieldName}' for ${className}. ` +\n `The data cannot be parsed or is malformed. ` +\n `This may indicate database corruption or incompatible schema changes.`,\n 'DB_CORRUPTED_DATA',\n { fieldName, className },\n cause,\n );\n }\n\n static missingDiscriminator(\n className: string,\n rowId?: string,\n ): DatabaseError {\n return new DatabaseError(\n `Missing discriminator (_meta_type) for STI class ${className}${rowId ? ` (row id: ${rowId})` : ''}. ` +\n `STI classes require a discriminator column to determine the correct subclass. ` +\n `This may indicate a schema mismatch or manual database modification.`,\n 'DB_MISSING_DISCRIMINATOR',\n { className, rowId },\n );\n }\n\n static stiDiscriminatorConflict(details: {\n className: string;\n tableName: string;\n id: string;\n slug: string;\n context: string;\n conflictIdentity: Record<string, unknown>;\n legacyMetaType: string;\n qualifiedMetaType: string;\n duplicateId: string;\n }): DatabaseError {\n const identityText = Object.entries(details.conflictIdentity)\n .map(([key, value]) => `${key} '${String(value)}'`)\n .join(', ');\n\n return new DatabaseError(\n `Legacy STI discriminator collision for ${details.className} (${details.tableName}). ` +\n `Row '${details.id}' would upgrade _meta_type from '${details.legacyMetaType}' to '${details.qualifiedMetaType}', ` +\n `but row '${details.duplicateId}' already uses the qualified discriminator for ${identityText || 'the same conflict identity'}. ` +\n `Merge or remove the duplicate legacy/qualified rows before saving.`,\n 'DB_STI_DISCRIMINATOR_CONFLICT',\n details,\n );\n }\n\n static schemaMissing(tableName: string, className: string): DatabaseError {\n return new DatabaseError(\n `Table '${tableName}' does not exist for class '${className}'. ` +\n `Run 'smrt db:migrate' to create database schema.`,\n 'DB_SCHEMA_MISSING',\n { tableName, className },\n );\n }\n}\n\n/**\n * Errors from AI provider integrations.\n *\n * Use the static factory methods:\n * - `AIError.providerError(provider, operation, cause)` — generic provider failure\n * - `AIError.rateLimitExceeded(provider, retryAfter)` — rate limit hit\n * - `AIError.invalidResponse(provider, response)` — unexpected response shape\n * - `AIError.authenticationFailed(provider)` — bad API key / credentials\n *\n * All errors have `category: 'ai'` and codes prefixed with `AI_`.\n * AI errors are considered retryable by `ErrorUtils.isRetryable()`.\n */\nexport class AIError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'ai', details, cause);\n }\n\n static providerError(\n provider: string,\n operation: string,\n cause?: Error,\n ): AIError {\n return new AIError(\n `AI provider '${provider}' failed during ${operation}`,\n 'AI_PROVIDER_ERROR',\n { provider, operation },\n cause,\n );\n }\n\n static rateLimitExceeded(provider: string, retryAfter?: number): AIError {\n return new AIError(\n `AI provider '${provider}' rate limit exceeded`,\n 'AI_RATE_LIMIT',\n { provider, retryAfter },\n );\n }\n\n static invalidResponse(provider: string, response: unknown): AIError {\n return new AIError(\n `AI provider '${provider}' returned invalid response`,\n 'AI_INVALID_RESPONSE',\n { provider, response },\n );\n }\n\n static authenticationFailed(provider: string): AIError {\n return new AIError(\n `AI provider '${provider}' authentication failed`,\n 'AI_AUTH_FAILED',\n { provider },\n );\n }\n}\n\n/**\n * Errors from filesystem operations.\n *\n * Use the static factory methods:\n * - `FilesystemError.fileNotFound(path)` — file does not exist\n * - `FilesystemError.permissionDenied(path, operation)` — access denied\n * - `FilesystemError.diskSpaceExceeded(path, requiredBytes)` — insufficient space\n *\n * All errors have `category: 'filesystem'` and codes prefixed with `FS_`.\n */\nexport class FilesystemError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'filesystem', details, cause);\n }\n\n static fileNotFound(path: string): FilesystemError {\n return new FilesystemError(`File not found: ${path}`, 'FS_FILE_NOT_FOUND', {\n path,\n });\n }\n\n static permissionDenied(path: string, operation: string): FilesystemError {\n return new FilesystemError(\n `Permission denied for ${operation} on: ${path}`,\n 'FS_PERMISSION_DENIED',\n { path, operation },\n );\n }\n\n static diskSpaceExceeded(\n path: string,\n requiredBytes: number,\n ): FilesystemError {\n return new FilesystemError(\n `Insufficient disk space for operation on: ${path}`,\n 'FS_DISK_SPACE_EXCEEDED',\n { path, requiredBytes },\n );\n }\n}\n\n/**\n * Input/data validation errors thrown before or during a database operation.\n *\n * `save()` throws `ValidationError` when field validation fails. The collection's\n * `convertWhereKeys()` throws it for invalid WHERE clause operators or field names.\n * `ValidationError` is **not** retried by `ErrorUtils.withRetry()`.\n *\n * Use the static factory methods:\n * - `ValidationError.requiredField(field, objectType)` — missing required field\n * - `ValidationError.invalidValue(field, value, expected)` — wrong type/format\n * - `ValidationError.uniqueConstraint(field, value)` — duplicate unique value\n * - `ValidationError.rangeError(field, value, min?, max?)` — out of allowed range\n *\n * All errors have `category: 'validation'` and codes prefixed with `VALIDATION_`.\n */\nexport class ValidationError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'validation', details, cause);\n }\n\n static requiredField(fieldName: string, objectType: string): ValidationError {\n return new ValidationError(\n `Required field '${fieldName}' is missing for ${objectType}`,\n 'VALIDATION_REQUIRED_FIELD',\n { fieldName, objectType },\n );\n }\n\n static invalidValue(\n fieldName: string,\n value: unknown,\n expectedType: string,\n ): ValidationError {\n return new ValidationError(\n `Invalid value for field '${fieldName}': expected ${expectedType}, got ${typeof value}`,\n 'VALIDATION_INVALID_VALUE',\n { fieldName, value, expectedType },\n );\n }\n\n static uniqueConstraint(fieldName: string, value: unknown): ValidationError {\n return new ValidationError(\n `Unique constraint violation for field '${fieldName}' with value: ${String(value)}`,\n 'VALIDATION_UNIQUE_CONSTRAINT',\n { fieldName, value },\n );\n }\n\n static rangeError(\n fieldName: string,\n value: number,\n min?: number,\n max?: number,\n ): ValidationError {\n const range =\n min !== undefined && max !== undefined\n ? `between ${min} and ${max}`\n : min !== undefined\n ? `>= ${min}`\n : `<= ${max}`;\n\n return new ValidationError(\n `Value for field '${fieldName}' must be ${range}, got: ${value}`,\n 'VALIDATION_RANGE_ERROR',\n { fieldName, value, min, max },\n );\n }\n}\n\n/**\n * Errors from HTTP and external network operations.\n *\n * Use the static factory methods:\n * - `NetworkError.requestFailed(url, status?, body?)` — non-2xx response or connection failure\n * - `NetworkError.timeout(url, timeoutMs)` — request exceeded timeout\n * - `NetworkError.serviceUnavailable(service, reason?)` — external service down\n *\n * All errors have `category: 'network'` and codes prefixed with `NETWORK_`.\n * Network errors are considered retryable by `ErrorUtils.isRetryable()`.\n */\nexport class NetworkError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'network', details, cause);\n }\n\n static requestFailed(\n url: string,\n status?: number,\n responseBody?: string | Error,\n ): NetworkError {\n const cause = responseBody instanceof Error ? responseBody : undefined;\n const body = typeof responseBody === 'string' ? responseBody : undefined;\n return new NetworkError(\n `Network request failed: ${url}${status ? ` (Status: ${status})` : ''}${body ? ` - ${body.substring(0, 200)}` : ''}`,\n 'NETWORK_REQUEST_FAILED',\n { url, status, responseBody: body },\n cause,\n );\n }\n\n static timeout(url: string, timeoutMs: number): NetworkError {\n return new NetworkError(\n `Network request timed out after ${timeoutMs}ms: ${url}`,\n 'NETWORK_TIMEOUT',\n { url, timeoutMs },\n );\n }\n\n static serviceUnavailable(service: string, reason?: string): NetworkError {\n return new NetworkError(\n reason\n ? `External service unavailable: ${service} - ${reason}`\n : `External service unavailable: ${service}`,\n 'NETWORK_SERVICE_UNAVAILABLE',\n { service, reason },\n );\n }\n}\n\n/**\n * Errors from misconfigured or incompatible class/framework setup.\n *\n * These are typically thrown during class registration (i.e. at module load time),\n * not during normal request handling.\n *\n * Use the static factory methods:\n * - `ConfigurationError.missingConfiguration(key, context?)` — missing required config\n * - `ConfigurationError.invalidConfiguration(key, value, expected)` — wrong config type/value\n * - `ConfigurationError.initializationFailed(component, cause?)` — component failed to start\n * - `ConfigurationError.circularInheritance(class, chain)` — circular class inheritance\n * - `ConfigurationError.incompatibleStrategy(class, strategy, parent, parentStrategy)` — STI mismatch\n * - `ConfigurationError.unregisteredBaseClass(child, base)` — STI base not yet registered\n *\n * All errors have `category: 'configuration'` and codes prefixed with `CONFIG_`.\n * Configuration errors are **not** retried by `ErrorUtils.withRetry()`.\n */\nexport class ConfigurationError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'configuration', details, cause);\n }\n\n static missingConfiguration(\n configKey: string,\n context?: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `Missing required configuration: ${configKey}${context ? ` in ${context}` : ''}`,\n 'CONFIG_MISSING',\n { configKey, context },\n );\n }\n\n static invalidConfiguration(\n configKey: string,\n value: unknown,\n expected: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `Invalid configuration for ${configKey}: expected ${expected}, got ${typeof value}`,\n 'CONFIG_INVALID',\n { configKey, value, expected },\n );\n }\n\n static initializationFailed(\n component: string,\n cause?: Error,\n ): ConfigurationError {\n return new ConfigurationError(\n `Failed to initialize component: ${component}`,\n 'CONFIG_INIT_FAILED',\n { component },\n cause,\n );\n }\n\n static circularInheritance(\n className: string,\n inheritanceChain: string[],\n ): ConfigurationError {\n return new ConfigurationError(\n `Circular inheritance detected for class '${className}'. ` +\n `Inheritance chain: ${inheritanceChain.join(' → ')} → ${className}. ` +\n `Classes cannot inherit from themselves directly or indirectly.`,\n 'CONFIG_CIRCULAR_INHERITANCE',\n { className, inheritanceChain },\n );\n }\n\n static incompatibleStrategy(\n className: string,\n classStrategy: string,\n parentClass: string,\n parentStrategy: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `Incompatible table strategy for class '${className}' (${classStrategy}). ` +\n `Parent class '${parentClass}' uses ${parentStrategy} strategy. ` +\n `Child classes must use the same table strategy as their parent. ` +\n `Either change ${className} to use ${parentStrategy}, or remove the inheritance.`,\n 'CONFIG_INCOMPATIBLE_STRATEGY',\n { className, classStrategy, parentClass, parentStrategy },\n );\n }\n\n static unregisteredBaseClass(\n childClass: string,\n baseClass: string,\n ): ConfigurationError {\n return new ConfigurationError(\n `STI base class '${baseClass}' is not registered for child class '${childClass}'. ` +\n `When using Single Table Inheritance, the base class must be registered before any child classes. ` +\n `Ensure ${baseClass} is decorated with @smrt({ tableStrategy: 'sti' }) and imported before ${childClass}.`,\n 'CONFIG_UNREGISTERED_BASE',\n { childClass, baseClass },\n );\n }\n}\n\n/**\n * Errors representing unexpected runtime failures not covered by other categories.\n *\n * `RuntimeError` is the catch-all for internal framework errors — invalid object\n * state, exhausted resources, or failures in operations like `save()` and `loadFromId()`\n * that propagate from an unknown cause.\n *\n * Use the static factory methods:\n * - `RuntimeError.operationFailed(operation, context?, cause?)` — generic operation failure\n * - `RuntimeError.invalidState(message, context?)` — unexpected object/system state\n * - `RuntimeError.resourceExhausted(resource, limit)` — limit exceeded (e.g. connections)\n *\n * All errors have `category: 'runtime'` and codes prefixed with `RUNTIME_`.\n */\nexport class RuntimeError extends SmrtError {\n constructor(\n message: string,\n code: string,\n details?: Record<string, unknown>,\n cause?: Error,\n ) {\n super(message, code, 'runtime', details, cause);\n }\n\n static operationFailed(\n operation: string,\n context?: string,\n cause?: Error,\n ): RuntimeError {\n return new RuntimeError(\n `Operation failed: ${operation}${context ? ` in ${context}` : ''}`,\n 'RUNTIME_OPERATION_FAILED',\n { operation, context },\n cause,\n );\n }\n\n static invalidState(\n message: string,\n context?: Record<string, unknown>,\n ): RuntimeError {\n return new RuntimeError(message, 'RUNTIME_INVALID_STATE', context);\n }\n\n static resourceExhausted(resource: string, limit: number): RuntimeError {\n return new RuntimeError(\n `Resource exhausted: ${resource} exceeded limit of ${limit}`,\n 'RUNTIME_RESOURCE_EXHAUSTED',\n { resource, limit },\n );\n }\n}\n\n/**\n * Error thrown when a tenant isolation boundary is crossed while resolving a\n * relationship.\n *\n * Raised by {@link SmrtObject.loadRelated} / {@link SmrtObject.loadRelatedMany}\n * (and {@link SmrtObject.getRelated}, which delegates to them) when a\n * tenant-scoped object resolves a relationship to an object belonging to a\n * *different*, non-null tenant — the genuine cross-tenant data leak. The guard\n * is a no-op when either side has a `null` tenant (global / non-tenant-scoped\n * models) and when both sides share the same tenant, so it only fires on real\n * leaks. Pass `{ allowCrossTenant: true }` to the loader to deliberately opt out.\n *\n * The `code` is always `'TENANT_ISOLATION_VIOLATION'` and the category is\n * `'validation'`. It is never retried — `ErrorUtils.withRetry()` rethrows it\n * immediately and `ErrorUtils.isRetryable()` returns `false` — because a tenant\n * boundary violation is deterministic. `tenantId` is the owning object's tenant\n * and `attemptedTenantId` is the tenant of the object that was reached.\n *\n * This shares its stable `code`, `name`, `tenantId`, and `attemptedTenantId`\n * shape with the interceptor-level `TenantIsolationError` in\n * `@happyvertical/smrt-tenancy`, so cross-cutting handlers can match either via\n * `err.code === 'TENANT_ISOLATION_VIOLATION'`. They are intentionally distinct\n * classes because `@happyvertical/smrt-core` cannot depend on the tenancy\n * package (the dependency runs the other way).\n *\n * @example\n * ```typescript\n * try {\n * await order.loadRelated('customerId');\n * } catch (err) {\n * if (err instanceof TenantIsolationError) {\n * // err.tenantId — the order's tenant\n * // err.attemptedTenantId — the customer's tenant\n * }\n * }\n * ```\n *\n * @see SmrtObject.loadRelated\n * @see SmrtObject.loadRelatedMany\n */\nexport class TenantIsolationError extends SmrtError {\n /** The tenant ID of the object that owns the relationship. */\n public readonly tenantId?: string;\n /** The tenant ID of the related object that was reached (and rejected). */\n public readonly attemptedTenantId?: string;\n\n constructor(\n message: string,\n details?: {\n tenantId?: string;\n attemptedTenantId?: string;\n [key: string]: unknown;\n },\n cause?: Error,\n ) {\n super(message, 'TENANT_ISOLATION_VIOLATION', 'validation', details, cause);\n this.tenantId = details?.tenantId;\n this.attemptedTenantId = details?.attemptedTenantId;\n }\n\n /**\n * Builds a {@link TenantIsolationError} for a blocked cross-tenant\n * relationship resolution, with a descriptive message and structured details.\n */\n static crossTenantReference(details: {\n sourceClass: string;\n fieldName: string;\n sourceTenantId: string;\n targetClass?: string;\n targetTenantId: string;\n }): TenantIsolationError {\n const target = details.targetClass\n ? `${details.targetClass} (tenant '${details.targetTenantId}')`\n : `tenant '${details.targetTenantId}'`;\n return new TenantIsolationError(\n `Cross-tenant relationship access blocked on ${details.sourceClass}.${details.fieldName}: ` +\n `owning tenant '${details.sourceTenantId}' does not match ${target}. ` +\n `Pass { allowCrossTenant: true } to loadRelated()/loadRelatedMany()/getRelated() to override.`,\n {\n tenantId: details.sourceTenantId,\n attemptedTenantId: details.targetTenantId,\n sourceClass: details.sourceClass,\n fieldName: details.fieldName,\n targetClass: details.targetClass,\n },\n );\n }\n}\n\n/**\n * Utility functions for error handling\n */\nexport class ErrorUtils {\n /**\n * Wraps a function with error handling and automatic retry logic\n */\n static async withRetry<T>(\n operation: () => Promise<T>,\n maxRetries = 3,\n delay = 1000,\n backoffMultiplier = 2,\n ): Promise<T> {\n let lastError: Error = new Error('Operation failed without error details');\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxRetries) {\n throw lastError;\n }\n\n // Skip retry for certain error types. A tenant isolation violation is\n // deterministic — retrying re-fetches the same cross-tenant target — and\n // is a security boundary, so it must never be retried.\n if (\n error instanceof ValidationError ||\n error instanceof ConfigurationError ||\n error instanceof TenantIsolationError\n ) {\n throw error;\n }\n\n // Wait before retrying with exponential backoff\n // Wrap in try-catch to handle any potential timer errors\n try {\n await new Promise<void>((resolve) => {\n setTimeout(() => resolve(), delay * backoffMultiplier ** attempt);\n });\n } catch (timerError) {\n // Log timer error but don't fail the retry\n logger.error('Timer error during retry', { error: timerError });\n }\n }\n }\n\n throw lastError;\n }\n\n /**\n * Checks if an error is retryable\n */\n static isRetryable(error: Error): boolean {\n if (error instanceof SmrtError) {\n return error.category === 'network' || error.category === 'ai';\n }\n\n // Check for common retryable error patterns\n const retryablePatterns = [\n /ECONNRESET/,\n /ETIMEDOUT/,\n /ENOTFOUND/,\n /rate.?limit/i,\n /timeout/i,\n /503/,\n /502/,\n /500/,\n ];\n\n return retryablePatterns.some((pattern) => pattern.test(error.message));\n }\n\n /**\n * Sanitizes an error for safe logging (removes sensitive information)\n */\n static sanitizeError(error: Error): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n\n if (error instanceof SmrtError) {\n sanitized.code = error.code;\n sanitized.category = error.category;\n\n // Sanitize details to remove potential sensitive information\n if (error.details) {\n const details: Record<string, unknown> = { ...error.details };\n sanitized.details = details;\n\n // Remove common sensitive fields\n const sensitiveFields = [\n 'password',\n 'token',\n 'key',\n 'secret',\n 'apiKey',\n ];\n for (const field of sensitiveFields) {\n if (details[field]) {\n details[field] = '[REDACTED]';\n }\n }\n }\n }\n\n return sanitized;\n }\n}\n\n/**\n * Validation report that collects multiple validation errors\n *\n * Useful for validating an entire object and reporting all errors\n * at once rather than stopping at the first error.\n *\n * @example\n * ```typescript\n * const report = new ValidationReport('Product');\n * report.addError(ValidationError.requiredField('name', 'Product'));\n * report.addError(ValidationError.rangeError('price', -10, 0));\n *\n * if (report.hasErrors()) {\n * console.error(report.toString());\n * // Output:\n * // Validation failed for Product with 2 errors:\n * // - name: Required field 'name' is missing for Product\n * // - price: Value -10 for field 'price' is outside allowed range [0, undefined]\n * }\n * ```\n */\nexport class ValidationReport {\n private errors: ValidationError[] = [];\n private objectType: string;\n\n constructor(objectType: string) {\n this.objectType = objectType;\n }\n\n /**\n * Add a validation error to the report\n */\n addError(error: ValidationError): void {\n this.errors.push(error);\n }\n\n /**\n * Check if there are any validation errors\n */\n hasErrors(): boolean {\n return this.errors.length > 0;\n }\n\n /**\n * Get all validation errors\n */\n getErrors(): ValidationError[] {\n return [...this.errors];\n }\n\n /**\n * Get the number of validation errors\n */\n getErrorCount(): number {\n return this.errors.length;\n }\n\n /**\n * Convert to a human-readable string\n */\n toString(): string {\n if (this.errors.length === 0) {\n return `Validation passed for ${this.objectType}`;\n }\n\n const errorList = this.errors\n .map((err, idx) => ` ${idx + 1}. ${err.message}`)\n .join('\\n');\n\n return `Validation failed for ${this.objectType} with ${this.errors.length} error(s):\\n${errorList}`;\n }\n\n /**\n * Convert to JSON format\n */\n toJSON(): object {\n return {\n objectType: this.objectType,\n errorCount: this.errors.length,\n errors: this.errors.map((err) => err.toJSON()),\n };\n }\n\n /**\n * Throw the first error if there are any errors\n */\n throwIfErrors(): void {\n if (this.errors.length > 0) {\n throw this.errors[0];\n }\n }\n\n /**\n * Clear all errors\n */\n clear(): void {\n this.errors = [];\n }\n}\n\n/**\n * Validation utility functions\n */\nexport class ValidationUtils {\n /**\n * Validate a single field value\n *\n * @param fieldName - Name of the field\n * @param value - Value to validate\n * @param options - Validation options (required, min, max, etc.)\n * @returns ValidationError if validation fails, null otherwise\n */\n static async validateField(\n fieldName: string,\n value: unknown,\n options: {\n required?: boolean;\n min?: number;\n max?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string | RegExp;\n type?: string;\n customValidator?: (value: unknown) => boolean | Promise<boolean>;\n customMessage?: string;\n },\n objectType: string = 'Object',\n ): Promise<ValidationError | null> {\n // Required check\n if (\n options.required &&\n (value === null || value === undefined || value === '')\n ) {\n return ValidationError.requiredField(fieldName, objectType);\n }\n\n // Skip further validation if value is null/undefined and not required\n if (value === null || value === undefined) {\n return null;\n }\n\n // Numeric range validation\n if (typeof value === 'number') {\n if (options.min !== undefined && value < options.min) {\n return ValidationError.rangeError(\n fieldName,\n value,\n options.min,\n options.max,\n );\n }\n if (options.max !== undefined && value > options.max) {\n return ValidationError.rangeError(\n fieldName,\n value,\n options.min,\n options.max,\n );\n }\n }\n\n // String length validation\n if (typeof value === 'string') {\n if (options.minLength !== undefined && value.length < options.minLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with minimum length ${options.minLength}`,\n );\n }\n if (options.maxLength !== undefined && value.length > options.maxLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with maximum length ${options.maxLength}`,\n );\n }\n\n // Pattern validation\n if (options.pattern) {\n const regex =\n typeof options.pattern === 'string'\n ? new RegExp(options.pattern)\n : options.pattern;\n if (!regex.test(value)) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string matching pattern ${options.pattern}`,\n );\n }\n }\n }\n\n // Custom validator\n if (options.customValidator) {\n try {\n const isValid = await options.customValidator(value);\n if (!isValid) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n options.customMessage || 'custom validation failed',\n );\n }\n } catch (error) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `custom validation error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return null;\n }\n\n /**\n * Validate required field\n */\n static validateRequired(\n fieldName: string,\n value: unknown,\n objectType: string = 'Object',\n ): ValidationError | null {\n if (value === null || value === undefined || value === '') {\n return ValidationError.requiredField(fieldName, objectType);\n }\n return null;\n }\n\n /**\n * Validate numeric range\n */\n static validateRange(\n fieldName: string,\n value: number,\n min?: number,\n max?: number,\n ): ValidationError | null {\n if (min !== undefined && value < min) {\n return ValidationError.rangeError(fieldName, value, min, max);\n }\n if (max !== undefined && value > max) {\n return ValidationError.rangeError(fieldName, value, min, max);\n }\n return null;\n }\n\n /**\n * Validate string length\n */\n static validateLength(\n fieldName: string,\n value: string,\n minLength?: number,\n maxLength?: number,\n ): ValidationError | null {\n if (minLength !== undefined && value.length < minLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with minimum length ${minLength}`,\n );\n }\n if (maxLength !== undefined && value.length > maxLength) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string with maximum length ${maxLength}`,\n );\n }\n return null;\n }\n\n /**\n * Validate string pattern\n */\n static validatePattern(\n fieldName: string,\n value: string,\n pattern: string | RegExp,\n ): ValidationError | null {\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\n if (!regex.test(value)) {\n return ValidationError.invalidValue(\n fieldName,\n value,\n `string matching pattern ${pattern}`,\n );\n }\n return null;\n }\n}\n"],"names":[],"mappings":";AAmCA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAEtC,MAAe,kBAAkB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAQA;AAAA,EACA;AAAA,EAEhB,YACE,SACA,MACA,UACA,SACA,OACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,QAAQ;AAGb,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,QACR;AAAA,QACE,MAAM,KAAK,MAAM;AAAA,QACjB,SAAS,KAAK,MAAM;AAAA,QACpB,OAAO,KAAK,MAAM;AAAA,MAAA,IAEpB;AAAA,IAAA;AAAA,EAER;AACF;AASA,SAAS,qBACP,OACA,UACA,SACA,QAAQ,GACF;AACN,MAAI,CAAC,SAAS,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI;AAC9C;AAAA,EACF;AAEA,UAAQ,IAAI,KAAK;AAEjB,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAA;AACtB,QAAI,SAAS;AACX,eAAS,KAAK,OAAO;AAAA,IACvB;AACA;AAAA,EACF;AAEA,MAAI,EAAE,iBAAiB,QAAQ;AAC7B;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,SAAS,KAAA;AAC/B,MAAI,SAAS;AACX,aAAS,KAAK,OAAO;AAAA,EACvB;AAEA,QAAM,mBAAmB;AACzB;AAAA,IACE,iBAAiB,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EAAA;AAEV,uBAAqB,iBAAiB,OAAO,UAAU,SAAS,QAAQ,CAAC;AAC3E;AAEA,SAAS,uBAAuB,OAG9B;AACA,MAAI,CAAC,OAAO;AACV,WAAO,CAAA;AAAA,EACT;AAEA,QAAM,YAAsB,CAAA;AAC5B,uBAAqB,OAAO,WAAW,oBAAI,IAAA,CAAc;AAEzD,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,UAAU,OAAO,OAAO,CAAC,CAAC;AAC7D,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,CAAA;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,eAAe,eAAe,SAAS,CAAC;AAAA,IACjD,UAAU;AAAA,EAAA;AAEd;AAiBO,MAAM,sBAAsB,UAAU;AAAA,EAC3C,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,YAAY,SAAS,KAAK;AAAA,EACjD;AAAA,EAEA,OAAO,iBAAiB,OAAe,OAA8B;AACnE,WAAO,IAAI;AAAA,MACT,kCAAkC,KAAK;AAAA,MACvC;AAAA,MACA,EAAE,MAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,YAAY,OAAe,OAA8B;AAE9D,UAAM,YAAY,uBAAuB,KAAK;AAC9C,UAAM,WAAW,UAAU,UAAU;AAAA,SAAY,UAAU,OAAO,KAAK;AACvE,WAAO,IAAI;AAAA,MACT,0BAA0B,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,SAAS,MAAM,QAAQ,EAAE,GAAG,QAAQ;AAAA,MAC9F;AAAA,MACA;AAAA,QACE;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,eAAe,UAAU;AAAA,MAAA;AAAA,MAE3B;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,YACL,WACA,WACA,OACe;AACf,WAAO,IAAI;AAAA,MACT,sCAAsC,SAAS,MAAM,SAAS;AAAA,MAC9D;AAAA,MACA,EAAE,WAAW,UAAA;AAAA,MACb;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,oBACL,YACA,OACA,OACe;AACf,WAAO,IAAI;AAAA,MACT,kCAAkC,UAAU;AAAA,MAC5C;AAAA,MACA,EAAE,YAAY,MAAA;AAAA,MACd;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,cACL,WACA,WACA,OACe;AACf,WAAO,IAAI;AAAA,MACT,4BAA4B,SAAS,SAAS,SAAS;AAAA,MAGvD;AAAA,MACA,EAAE,WAAW,UAAA;AAAA,MACb;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,qBACL,WACA,OACe;AACf,WAAO,IAAI;AAAA,MACT,oDAAoD,SAAS,GAAG,QAAQ,aAAa,KAAK,MAAM,EAAE;AAAA,MAGlG;AAAA,MACA,EAAE,WAAW,MAAA;AAAA,IAAM;AAAA,EAEvB;AAAA,EAEA,OAAO,yBAAyB,SAUd;AAChB,UAAM,eAAe,OAAO,QAAQ,QAAQ,gBAAgB,EACzD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,OAAO,KAAK,CAAC,GAAG,EACjD,KAAK,IAAI;AAEZ,WAAO,IAAI;AAAA,MACT,0CAA0C,QAAQ,SAAS,KAAK,QAAQ,SAAS,WACvE,QAAQ,EAAE,oCAAoC,QAAQ,cAAc,SAAS,QAAQ,iBAAiB,eAClG,QAAQ,WAAW,kDAAkD,gBAAgB,4BAA4B;AAAA,MAE/H;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,cAAc,WAAmB,WAAkC;AACxE,WAAO,IAAI;AAAA,MACT,UAAU,SAAS,+BAA+B,SAAS;AAAA,MAE3D;AAAA,MACA,EAAE,WAAW,UAAA;AAAA,IAAU;AAAA,EAE3B;AACF;AAcO,MAAM,gBAAgB,UAAU;AAAA,EACrC,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,MAAM,SAAS,KAAK;AAAA,EAC3C;AAAA,EAEA,OAAO,cACL,UACA,WACA,OACS;AACT,WAAO,IAAI;AAAA,MACT,gBAAgB,QAAQ,mBAAmB,SAAS;AAAA,MACpD;AAAA,MACA,EAAE,UAAU,UAAA;AAAA,MACZ;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,kBAAkB,UAAkB,YAA8B;AACvE,WAAO,IAAI;AAAA,MACT,gBAAgB,QAAQ;AAAA,MACxB;AAAA,MACA,EAAE,UAAU,WAAA;AAAA,IAAW;AAAA,EAE3B;AAAA,EAEA,OAAO,gBAAgB,UAAkB,UAA4B;AACnE,WAAO,IAAI;AAAA,MACT,gBAAgB,QAAQ;AAAA,MACxB;AAAA,MACA,EAAE,UAAU,SAAA;AAAA,IAAS;AAAA,EAEzB;AAAA,EAEA,OAAO,qBAAqB,UAA2B;AACrD,WAAO,IAAI;AAAA,MACT,gBAAgB,QAAQ;AAAA,MACxB;AAAA,MACA,EAAE,SAAA;AAAA,IAAS;AAAA,EAEf;AACF;AAYO,MAAM,wBAAwB,UAAU;AAAA,EAC7C,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,cAAc,SAAS,KAAK;AAAA,EACnD;AAAA,EAEA,OAAO,aAAa,MAA+B;AACjD,WAAO,IAAI,gBAAgB,mBAAmB,IAAI,IAAI,qBAAqB;AAAA,MACzE;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,OAAO,iBAAiB,MAAc,WAAoC;AACxE,WAAO,IAAI;AAAA,MACT,yBAAyB,SAAS,QAAQ,IAAI;AAAA,MAC9C;AAAA,MACA,EAAE,MAAM,UAAA;AAAA,IAAU;AAAA,EAEtB;AAAA,EAEA,OAAO,kBACL,MACA,eACiB;AACjB,WAAO,IAAI;AAAA,MACT,6CAA6C,IAAI;AAAA,MACjD;AAAA,MACA,EAAE,MAAM,cAAA;AAAA,IAAc;AAAA,EAE1B;AACF;AAiBO,MAAM,wBAAwB,UAAU;AAAA,EAC7C,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,cAAc,SAAS,KAAK;AAAA,EACnD;AAAA,EAEA,OAAO,cAAc,WAAmB,YAAqC;AAC3E,WAAO,IAAI;AAAA,MACT,mBAAmB,SAAS,oBAAoB,UAAU;AAAA,MAC1D;AAAA,MACA,EAAE,WAAW,WAAA;AAAA,IAAW;AAAA,EAE5B;AAAA,EAEA,OAAO,aACL,WACA,OACA,cACiB;AACjB,WAAO,IAAI;AAAA,MACT,4BAA4B,SAAS,eAAe,YAAY,SAAS,OAAO,KAAK;AAAA,MACrF;AAAA,MACA,EAAE,WAAW,OAAO,aAAA;AAAA,IAAa;AAAA,EAErC;AAAA,EAEA,OAAO,iBAAiB,WAAmB,OAAiC;AAC1E,WAAO,IAAI;AAAA,MACT,0CAA0C,SAAS,iBAAiB,OAAO,KAAK,CAAC;AAAA,MACjF;AAAA,MACA,EAAE,WAAW,MAAA;AAAA,IAAM;AAAA,EAEvB;AAAA,EAEA,OAAO,WACL,WACA,OACA,KACA,KACiB;AACjB,UAAM,QACJ,QAAQ,UAAa,QAAQ,SACzB,WAAW,GAAG,QAAQ,GAAG,KACzB,QAAQ,SACN,MAAM,GAAG,KACT,MAAM,GAAG;AAEjB,WAAO,IAAI;AAAA,MACT,oBAAoB,SAAS,aAAa,KAAK,UAAU,KAAK;AAAA,MAC9D;AAAA,MACA,EAAE,WAAW,OAAO,KAAK,IAAA;AAAA,IAAI;AAAA,EAEjC;AACF;AAaO,MAAM,qBAAqB,UAAU;AAAA,EAC1C,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,WAAW,SAAS,KAAK;AAAA,EAChD;AAAA,EAEA,OAAO,cACL,KACA,QACA,cACc;AACd,UAAM,QAAQ,wBAAwB,QAAQ,eAAe;AAC7D,UAAM,OAAO,OAAO,iBAAiB,WAAW,eAAe;AAC/D,WAAO,IAAI;AAAA,MACT,2BAA2B,GAAG,GAAG,SAAS,aAAa,MAAM,MAAM,EAAE,GAAG,OAAO,MAAM,KAAK,UAAU,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,MAClH;AAAA,MACA,EAAE,KAAK,QAAQ,cAAc,KAAA;AAAA,MAC7B;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,QAAQ,KAAa,WAAiC;AAC3D,WAAO,IAAI;AAAA,MACT,mCAAmC,SAAS,OAAO,GAAG;AAAA,MACtD;AAAA,MACA,EAAE,KAAK,UAAA;AAAA,IAAU;AAAA,EAErB;AAAA,EAEA,OAAO,mBAAmB,SAAiB,QAA+B;AACxE,WAAO,IAAI;AAAA,MACT,SACI,iCAAiC,OAAO,MAAM,MAAM,KACpD,iCAAiC,OAAO;AAAA,MAC5C;AAAA,MACA,EAAE,SAAS,OAAA;AAAA,IAAO;AAAA,EAEtB;AACF;AAmBO,MAAM,2BAA2B,UAAU;AAAA,EAChD,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,iBAAiB,SAAS,KAAK;AAAA,EACtD;AAAA,EAEA,OAAO,qBACL,WACA,SACoB;AACpB,WAAO,IAAI;AAAA,MACT,mCAAmC,SAAS,GAAG,UAAU,OAAO,OAAO,KAAK,EAAE;AAAA,MAC9E;AAAA,MACA,EAAE,WAAW,QAAA;AAAA,IAAQ;AAAA,EAEzB;AAAA,EAEA,OAAO,qBACL,WACA,OACA,UACoB;AACpB,WAAO,IAAI;AAAA,MACT,6BAA6B,SAAS,cAAc,QAAQ,SAAS,OAAO,KAAK;AAAA,MACjF;AAAA,MACA,EAAE,WAAW,OAAO,SAAA;AAAA,IAAS;AAAA,EAEjC;AAAA,EAEA,OAAO,qBACL,WACA,OACoB;AACpB,WAAO,IAAI;AAAA,MACT,mCAAmC,SAAS;AAAA,MAC5C;AAAA,MACA,EAAE,UAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,oBACL,WACA,kBACoB;AACpB,WAAO,IAAI;AAAA,MACT,4CAA4C,SAAS,yBAC7B,iBAAiB,KAAK,KAAK,CAAC,MAAM,SAAS;AAAA,MAEnE;AAAA,MACA,EAAE,WAAW,iBAAA;AAAA,IAAiB;AAAA,EAElC;AAAA,EAEA,OAAO,qBACL,WACA,eACA,aACA,gBACoB;AACpB,WAAO,IAAI;AAAA,MACT,0CAA0C,SAAS,MAAM,aAAa,oBACnD,WAAW,UAAU,cAAc,4FAEnC,SAAS,WAAW,cAAc;AAAA,MACrD;AAAA,MACA,EAAE,WAAW,eAAe,aAAa,eAAA;AAAA,IAAe;AAAA,EAE5D;AAAA,EAEA,OAAO,sBACL,YACA,WACoB;AACpB,WAAO,IAAI;AAAA,MACT,mBAAmB,SAAS,wCAAwC,UAAU,8GAElE,SAAS,0EAA0E,UAAU;AAAA,MACzG;AAAA,MACA,EAAE,YAAY,UAAA;AAAA,IAAU;AAAA,EAE5B;AACF;AAgBO,MAAM,qBAAqB,UAAU;AAAA,EAC1C,YACE,SACA,MACA,SACA,OACA;AACA,UAAM,SAAS,MAAM,WAAW,SAAS,KAAK;AAAA,EAChD;AAAA,EAEA,OAAO,gBACL,WACA,SACA,OACc;AACd,WAAO,IAAI;AAAA,MACT,qBAAqB,SAAS,GAAG,UAAU,OAAO,OAAO,KAAK,EAAE;AAAA,MAChE;AAAA,MACA,EAAE,WAAW,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO,aACL,SACA,SACc;AACd,WAAO,IAAI,aAAa,SAAS,yBAAyB,OAAO;AAAA,EACnE;AAAA,EAEA,OAAO,kBAAkB,UAAkB,OAA6B;AACtE,WAAO,IAAI;AAAA,MACT,uBAAuB,QAAQ,sBAAsB,KAAK;AAAA,MAC1D;AAAA,MACA,EAAE,UAAU,MAAA;AAAA,IAAM;AAAA,EAEtB;AACF;AA0CO,MAAM,6BAA6B,UAAU;AAAA;AAAA,EAElC;AAAA;AAAA,EAEA;AAAA,EAEhB,YACE,SACA,SAKA,OACA;AACA,UAAM,SAAS,8BAA8B,cAAc,SAAS,KAAK;AACzE,SAAK,WAAW,SAAS;AACzB,SAAK,oBAAoB,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,qBAAqB,SAMH;AACvB,UAAM,SAAS,QAAQ,cACnB,GAAG,QAAQ,WAAW,aAAa,QAAQ,cAAc,OACzD,WAAW,QAAQ,cAAc;AACrC,WAAO,IAAI;AAAA,MACT,+CAA+C,QAAQ,WAAW,IAAI,QAAQ,SAAS,oBACnE,QAAQ,cAAc,oBAAoB,MAAM;AAAA,MAEpE;AAAA,QACE,UAAU,QAAQ;AAAA,QAClB,mBAAmB,QAAQ;AAAA,QAC3B,aAAa,QAAQ;AAAA,QACrB,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,MAAA;AAAA,IACvB;AAAA,EAEJ;AACF;AAKO,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA,EAItB,aAAa,UACX,WACA,aAAa,GACb,QAAQ,KACR,oBAAoB,GACR;AACZ,QAAI,YAAmB,IAAI,MAAM,wCAAwC;AAEzE,aAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,UAAI;AACF,eAAO,MAAM,UAAA;AAAA,MACf,SAAS,OAAO;AACd,oBAAY,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAEpE,YAAI,YAAY,YAAY;AAC1B,gBAAM;AAAA,QACR;AAKA,YACE,iBAAiB,mBACjB,iBAAiB,sBACjB,iBAAiB,sBACjB;AACA,gBAAM;AAAA,QACR;AAIA,YAAI;AACF,gBAAM,IAAI,QAAc,CAAC,YAAY;AACnC,uBAAW,MAAM,QAAA,GAAW,QAAQ,qBAAqB,OAAO;AAAA,UAClE,CAAC;AAAA,QACH,SAAS,YAAY;AAEnB,iBAAO,MAAM,4BAA4B,EAAE,OAAO,YAAY;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,OAAuB;AACxC,QAAI,iBAAiB,WAAW;AAC9B,aAAO,MAAM,aAAa,aAAa,MAAM,aAAa;AAAA,IAC5D;AAGA,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,WAAO,kBAAkB,KAAK,CAAC,YAAY,QAAQ,KAAK,MAAM,OAAO,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAc,OAAuC;AAC1D,UAAM,YAAqC;AAAA,MACzC,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IAAA;AAGf,QAAI,iBAAiB,WAAW;AAC9B,gBAAU,OAAO,MAAM;AACvB,gBAAU,WAAW,MAAM;AAG3B,UAAI,MAAM,SAAS;AACjB,cAAM,UAAmC,EAAE,GAAG,MAAM,QAAA;AACpD,kBAAU,UAAU;AAGpB,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,mBAAW,SAAS,iBAAiB;AACnC,cAAI,QAAQ,KAAK,GAAG;AAClB,oBAAQ,KAAK,IAAI;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAuBO,MAAM,iBAAiB;AAAA,EACpB,SAA4B,CAAA;AAAA,EAC5B;AAAA,EAER,YAAY,YAAoB;AAC9B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAA8B;AACrC,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,YAA+B;AAC7B,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAwB;AACtB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AACjB,QAAI,KAAK,OAAO,WAAW,GAAG;AAC5B,aAAO,yBAAyB,KAAK,UAAU;AAAA,IACjD;AAEA,UAAM,YAAY,KAAK,OACpB,IAAI,CAAC,KAAK,QAAQ,KAAK,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,EAChD,KAAK,IAAI;AAEZ,WAAO,yBAAyB,KAAK,UAAU,SAAS,KAAK,OAAO,MAAM;AAAA,EAAe,SAAS;AAAA,EACpG;AAAA;AAAA;AAAA;AAAA,EAKA,SAAiB;AACf,WAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK,OAAO;AAAA,MACxB,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,IAAI,QAAQ;AAAA,IAAA;AAAA,EAEjD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAsB;AACpB,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,YAAM,KAAK,OAAO,CAAC;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,CAAA;AAAA,EAChB;AACF;AAKO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS3B,aAAa,cACX,WACA,OACA,SAWA,aAAqB,UACY;AAEjC,QACE,QAAQ,aACP,UAAU,QAAQ,UAAU,UAAa,UAAU,KACpD;AACA,aAAO,gBAAgB,cAAc,WAAW,UAAU;AAAA,IAC5D;AAGA,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,QAAQ,QAAQ,UAAa,QAAQ,QAAQ,KAAK;AACpD,eAAO,gBAAgB;AAAA,UACrB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QAAA;AAAA,MAEZ;AACA,UAAI,QAAQ,QAAQ,UAAa,QAAQ,QAAQ,KAAK;AACpD,eAAO,gBAAgB;AAAA,UACrB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QAAA;AAAA,MAEZ;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,QAAQ,cAAc,UAAa,MAAM,SAAS,QAAQ,WAAW;AACvE,eAAO,gBAAgB;AAAA,UACrB;AAAA,UACA;AAAA,UACA,8BAA8B,QAAQ,SAAS;AAAA,QAAA;AAAA,MAEnD;AACA,UAAI,QAAQ,cAAc,UAAa,MAAM,SAAS,QAAQ,WAAW;AACvE,eAAO,gBAAgB;AAAA,UACrB;AAAA,UACA;AAAA,UACA,8BAA8B,QAAQ,SAAS;AAAA,QAAA;AAAA,MAEnD;AAGA,UAAI,QAAQ,SAAS;AACnB,cAAM,QACJ,OAAO,QAAQ,YAAY,WACvB,IAAI,OAAO,QAAQ,OAAO,IAC1B,QAAQ;AACd,YAAI,CAAC,MAAM,KAAK,KAAK,GAAG;AACtB,iBAAO,gBAAgB;AAAA,YACrB;AAAA,YACA;AAAA,YACA,2BAA2B,QAAQ,OAAO;AAAA,UAAA;AAAA,QAE9C;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,iBAAiB;AAC3B,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,gBAAgB,KAAK;AACnD,YAAI,CAAC,SAAS;AACZ,iBAAO,gBAAgB;AAAA,YACrB;AAAA,YACA;AAAA,YACA,QAAQ,iBAAiB;AAAA,UAAA;AAAA,QAE7B;AAAA,MACF,SAAS,OAAO;AACd,eAAO,gBAAgB;AAAA,UACrB;AAAA,UACA;AAAA,UACA,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAAA;AAAA,MAEtF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBACL,WACA,OACA,aAAqB,UACG;AACxB,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,IAAI;AACzD,aAAO,gBAAgB,cAAc,WAAW,UAAU;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cACL,WACA,OACA,KACA,KACwB;AACxB,QAAI,QAAQ,UAAa,QAAQ,KAAK;AACpC,aAAO,gBAAgB,WAAW,WAAW,OAAO,KAAK,GAAG;AAAA,IAC9D;AACA,QAAI,QAAQ,UAAa,QAAQ,KAAK;AACpC,aAAO,gBAAgB,WAAW,WAAW,OAAO,KAAK,GAAG;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eACL,WACA,OACA,WACA,WACwB;AACxB,QAAI,cAAc,UAAa,MAAM,SAAS,WAAW;AACvD,aAAO,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,8BAA8B,SAAS;AAAA,MAAA;AAAA,IAE3C;AACA,QAAI,cAAc,UAAa,MAAM,SAAS,WAAW;AACvD,aAAO,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,8BAA8B,SAAS;AAAA,MAAA;AAAA,IAE3C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBACL,WACA,OACA,SACwB;AACxB,UAAM,QAAQ,OAAO,YAAY,WAAW,IAAI,OAAO,OAAO,IAAI;AAClE,QAAI,CAAC,MAAM,KAAK,KAAK,GAAG;AACtB,aAAO,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA,2BAA2B,OAAO;AAAA,MAAA;AAAA,IAEtC;AACA,WAAO;AAAA,EACT;AACF;"}
|
package/dist/knowledge.d.ts
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { DomainKnowledgeConfig, DomainKnowledgeManifest } from '@happyvertical/smrt-types';
|
|
2
2
|
import { SmartObjectManifest } from './scanner/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Minimal package.json shape consumed by the knowledge builder.
|
|
5
|
+
* `name`/`version` are typed concretely because they flow into the manifest's
|
|
6
|
+
* string-typed metadata fields; everything else is read via `unknown`-accepting
|
|
7
|
+
* helpers (`record()`, `exportKeys()`), so an index signature is sufficient.
|
|
8
|
+
*/
|
|
9
|
+
export interface PackageJsonLike {
|
|
10
|
+
name?: string;
|
|
11
|
+
version?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
3
14
|
export interface BuildDomainKnowledgeOptions {
|
|
4
15
|
manifest: SmartObjectManifest;
|
|
5
16
|
rootDir: string;
|
|
6
|
-
packageJson?:
|
|
17
|
+
packageJson?: PackageJsonLike;
|
|
7
18
|
manifestPath?: string;
|
|
8
19
|
config?: DomainKnowledgeConfig;
|
|
9
20
|
}
|
package/dist/knowledge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EAGxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EAGxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAkCD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,2BAA2B,GACnC,uBAAuB,CAsDzB"}
|
package/dist/knowledge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.js","sources":["../src/knowledge.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type {\n DomainKnowledgeConfig,\n DomainKnowledgeManifest,\n DomainKnowledgeObject,\n DomainKnowledgeSurface,\n} from '@happyvertical/smrt-types';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from './scanner/types.js';\n\nexport interface BuildDomainKnowledgeOptions {\n manifest: SmartObjectManifest;\n rootDir: string;\n packageJson?: Record<string, any>;\n manifestPath?: string;\n config?: DomainKnowledgeConfig;\n}\n\nconst SDK_PACKAGE_NAMES = new Set([\n '@happyvertical/ai',\n '@happyvertical/cache',\n '@happyvertical/documents',\n '@happyvertical/email',\n '@happyvertical/encryption',\n '@happyvertical/files',\n '@happyvertical/geo',\n '@happyvertical/images',\n '@happyvertical/jobs',\n '@happyvertical/json',\n '@happyvertical/logger',\n '@happyvertical/messages',\n '@happyvertical/ocr',\n '@happyvertical/pdf',\n '@happyvertical/projects',\n '@happyvertical/repos',\n '@happyvertical/secrets',\n '@happyvertical/spider',\n '@happyvertical/sql',\n '@happyvertical/utils',\n]);\n\nconst RELATIONSHIP_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\nconst STANDARD_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport function buildDomainKnowledgeManifest(\n options: BuildDomainKnowledgeOptions,\n): DomainKnowledgeManifest {\n const rootDir = options.rootDir;\n const packageJson = options.packageJson ?? readPackageJson(rootDir) ?? {};\n const packageName = options.manifest.packageName ?? packageJson.name;\n const packageVersion = options.manifest.packageVersion ?? packageJson.version;\n const agentDocPath = existingPath(rootDir, 'AGENTS.md');\n const agentDoc =\n options.config?.includeDocs === false || !agentDocPath\n ? undefined\n : readFileSync(agentDocPath, 'utf8');\n const allDependencies = {\n ...record(packageJson.dependencies),\n ...record(packageJson.devDependencies),\n ...record(packageJson.peerDependencies),\n };\n const manifestObjects = Object.values(options.manifest.objects).filter(\n (object) => object.decoratorConfig?.knowledge !== false,\n );\n const objects = manifestObjects.map((object) => buildKnowledgeObject(object));\n const surfaces = objects.flatMap((object) => object.surfaces);\n const manifestJson = stableJson(normalizeManifestForHash(options.manifest));\n\n return {\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n packageName,\n packageVersion,\n sourceManifestPath: options.manifestPath\n ? relative(rootDir, options.manifestPath)\n : undefined,\n agentDocPath: agentDocPath ? relative(rootDir, agentDocPath) : undefined,\n sourceHashes: sourceHashes({\n manifest: { content: manifestJson },\n packageJson: fileHashSource(existingPath(rootDir, 'package.json')),\n agents: fileHashSource(agentDocPath),\n }),\n exports: exportKeys(packageJson.exports),\n dependencies: allDependencies,\n smrtDependencies: Object.keys(allDependencies)\n .filter((dep) => dep.startsWith('@happyvertical/smrt-'))\n .sort(),\n sdkDependencies: Object.keys(allDependencies)\n .filter((dep) => SDK_PACKAGE_NAMES.has(dep))\n .sort(),\n tags: options.config?.tags ?? [],\n summary: options.config?.summary,\n risks: options.config?.risks ?? [],\n objects,\n surfaces,\n prompts:\n options.config?.includePrompts === false ? [] : readPrompts(rootDir),\n relationshipsV2: summarizeRelationships(objects, manifestObjects),\n agentDoc,\n };\n}\n\nfunction buildKnowledgeObject(\n object: SmartObjectDefinition,\n): DomainKnowledgeObject {\n const knowledge =\n typeof object.decoratorConfig?.knowledge === 'object'\n ? object.decoratorConfig.knowledge\n : {};\n const fields = Object.entries(object.fields).map(([name, field]) => ({\n name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: columnType(object, name),\n }));\n const relationships = fields\n .filter((field) => RELATIONSHIP_FIELD_TYPES.has(field.type))\n .map((field) => ({\n name: field.name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: field.columnType,\n }));\n\n return {\n name: object.className,\n qualifiedName: object.qualifiedName,\n collection: object.collection,\n tableName: object.schema?.tableName,\n packageName: object.packageName,\n extends: object.extends,\n visibility: object.visibility,\n fields,\n relationships,\n methods: Object.keys(object.methods).sort(),\n surfaces: objectSurfaces(object),\n relationshipFeatures: relationshipFeatures(object),\n tags: knowledge.tags ?? [],\n summary: knowledge.summary,\n risks: knowledge.risks ?? [],\n };\n}\n\nfunction objectSurfaces(\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n return [\n ...configuredSurfaces('api', object),\n ...configuredSurfaces('cli', object),\n ...configuredSurfaces('mcp', object),\n ...aiSurfaces(object),\n ];\n}\n\nfunction configuredSurfaces(\n kind: 'api' | 'cli' | 'mcp',\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n const config = object.decoratorConfig?.[kind];\n if (!config) return [];\n const operations = configuredOperations(config);\n return operations.map((operation) => ({\n kind,\n name:\n kind === 'api'\n ? `${object.collection}.${operation}`\n : `${object.className.toLowerCase()}_${operation}`,\n operation,\n objectName: object.qualifiedName ?? object.className,\n path: kind === 'api' ? apiPath(object, operation) : undefined,\n method: kind === 'api' ? apiMethod(operation) : undefined,\n }));\n}\n\nfunction configuredOperations(config: unknown): string[] {\n if (config === true) return [...STANDARD_OPERATIONS];\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n return [];\n }\n const recordConfig = config as { include?: string[]; exclude?: string[] };\n const base = Array.isArray(recordConfig.include)\n ? recordConfig.include\n : STANDARD_OPERATIONS;\n const excluded = new Set(recordConfig.exclude ?? []);\n return [...new Set(base.filter((operation) => !excluded.has(operation)))];\n}\n\nfunction aiSurfaces(object: SmartObjectDefinition): DomainKnowledgeSurface[] {\n return (object.tools ?? []).map((tool) => ({\n kind: 'ai',\n name: tool.function.name,\n operation: tool.function.name,\n description: tool.function.description,\n objectName: object.qualifiedName ?? object.className,\n }));\n}\n\nfunction apiPath(object: SmartObjectDefinition, operation: string): string {\n const collection = object.decoratorConfig?.api;\n const configuredPath =\n typeof collection === 'object' && typeof collection.path === 'string'\n ? collection.path\n : object.collection.replaceAll('_', '-');\n if (operation === 'list' || operation === 'create') {\n return `/${configuredPath}`;\n }\n if (STANDARD_OPERATIONS.includes(operation)) {\n return `/${configuredPath}/[id]`;\n }\n return `/${configuredPath}/${operation}`;\n}\n\nfunction apiMethod(operation: string): string {\n switch (operation) {\n case 'list':\n case 'get':\n return 'GET';\n case 'create':\n return 'POST';\n case 'update':\n return 'PATCH';\n case 'delete':\n return 'DELETE';\n default:\n return 'POST';\n }\n}\n\nfunction relationshipFeatures(object: SmartObjectDefinition): string[] {\n const features = new Set<string>();\n for (const field of Object.values(object.fields)) {\n if (field.type === 'foreignKey') features.add('foreignKey');\n if (field.type === 'crossPackageRef') features.add('crossPackageRef');\n if (field.type === 'oneToMany') features.add('oneToMany');\n if (field.type === 'manyToMany') features.add('manyToMany');\n }\n if (object.extends === 'SmrtJunction') features.add('SmrtJunction');\n if (object.extends === 'SmrtHierarchical') features.add('SmrtHierarchical');\n if (\n object.extends === 'SmrtPolymorphicAssociation' ||\n object.fields.metaType ||\n object.fields.metaId\n ) {\n features.add('SmrtPolymorphicAssociation');\n }\n if (\n Object.keys(object.schema?.columns ?? {}).some(\n (name) => object.schema?.columns[name]?.type === 'UUID',\n )\n ) {\n features.add('uuidColumns');\n }\n return [...features].sort();\n}\n\nfunction summarizeRelationships(\n objects: DomainKnowledgeObject[],\n manifestObjects: SmartObjectDefinition[],\n) {\n const fields = objects.flatMap((object) => object.fields);\n return {\n foreignKeyFields: fields.filter((field) => field.type === 'foreignKey')\n .length,\n crossPackageRefFields: fields.filter(\n (field) => field.type === 'crossPackageRef',\n ).length,\n junctionCollections: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtJunction'),\n ).length,\n hierarchicalObjects: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtHierarchical'),\n ).length,\n polymorphicAssociations: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtPolymorphicAssociation'),\n ).length,\n uuidColumns: manifestObjects.reduce(\n (count, object) =>\n count +\n Object.values(object.schema?.columns ?? {}).filter(\n (column) => column.type === 'UUID',\n ).length,\n 0,\n ),\n };\n}\n\nfunction columnType(\n object: SmartObjectDefinition,\n fieldName: string,\n): string | undefined {\n const columnName = camelToSnake(fieldName);\n return object.schema?.columns[columnName]?.type;\n}\n\nfunction readPrompts(\n rootDir: string,\n): Array<{ filePath: string; key?: string }> {\n const srcDir = join(rootDir, 'src');\n if (!existsSync(srcDir)) return [];\n const prompts: Array<{ filePath: string; key?: string }> = [];\n for (const filePath of walkFiles(srcDir)) {\n if (!filePath.endsWith('.ts')) continue;\n const content = readFileSync(filePath, 'utf8');\n if (!content.includes('definePrompt')) continue;\n const keyMatch = content.match(/definePrompt\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/);\n prompts.push({\n filePath: relative(rootDir, filePath),\n key: keyMatch?.[1],\n });\n }\n return prompts;\n}\n\nfunction walkFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === '.svelte-kit'\n ) {\n continue;\n }\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...walkFiles(fullPath));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction sourceHashes(sources: Record<string, HashSource | undefined>) {\n const hashes: Record<string, string> = {};\n for (const [name, source] of Object.entries(sources)) {\n if (!source) continue;\n const content =\n 'content' in source ? source.content : readFileSync(source.path, 'utf8');\n hashes[name] = createHash('sha256').update(content).digest('hex');\n }\n return hashes;\n}\n\ntype HashSource = { content: string } | { path: string };\n\nfunction fileHashSource(path: string | undefined): HashSource | undefined {\n return path ? { path } : undefined;\n}\n\nfunction existingPath(rootDir: string, path: string): string | undefined {\n const fullPath = join(rootDir, path);\n return existsSync(fullPath) ? fullPath : undefined;\n}\n\nfunction readPackageJson(rootDir: string): Record<string, any> | null {\n const path = join(rootDir, 'package.json');\n if (!existsSync(path)) return null;\n return JSON.parse(readFileSync(path, 'utf8'));\n}\n\nfunction record(value: unknown): Record<string, string> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {};\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') return ['.'];\n if (\n typeof exportsField !== 'object' ||\n exportsField === null ||\n Array.isArray(exportsField)\n ) {\n return [];\n }\n return Object.keys(exportsField).sort();\n}\n\nfunction camelToSnake(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\nfunction normalizeManifestForHash(manifest: SmartObjectManifest): unknown {\n const normalized = JSON.parse(JSON.stringify(manifest)) as Record<\n string,\n unknown\n >;\n delete normalized.timestamp;\n return normalized;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJson(value), null, 2);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"knowledge.js","sources":["../src/knowledge.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type {\n DomainKnowledgeConfig,\n DomainKnowledgeManifest,\n DomainKnowledgeObject,\n DomainKnowledgeSurface,\n} from '@happyvertical/smrt-types';\nimport type {\n SmartObjectDefinition,\n SmartObjectManifest,\n} from './scanner/types.js';\n\n/**\n * Minimal package.json shape consumed by the knowledge builder.\n * `name`/`version` are typed concretely because they flow into the manifest's\n * string-typed metadata fields; everything else is read via `unknown`-accepting\n * helpers (`record()`, `exportKeys()`), so an index signature is sufficient.\n */\nexport interface PackageJsonLike {\n name?: string;\n version?: string;\n [key: string]: unknown;\n}\n\nexport interface BuildDomainKnowledgeOptions {\n manifest: SmartObjectManifest;\n rootDir: string;\n packageJson?: PackageJsonLike;\n manifestPath?: string;\n config?: DomainKnowledgeConfig;\n}\n\nconst SDK_PACKAGE_NAMES = new Set([\n '@happyvertical/ai',\n '@happyvertical/cache',\n '@happyvertical/documents',\n '@happyvertical/email',\n '@happyvertical/encryption',\n '@happyvertical/files',\n '@happyvertical/geo',\n '@happyvertical/images',\n '@happyvertical/jobs',\n '@happyvertical/json',\n '@happyvertical/logger',\n '@happyvertical/messages',\n '@happyvertical/ocr',\n '@happyvertical/pdf',\n '@happyvertical/projects',\n '@happyvertical/repos',\n '@happyvertical/secrets',\n '@happyvertical/spider',\n '@happyvertical/sql',\n '@happyvertical/utils',\n]);\n\nconst RELATIONSHIP_FIELD_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\nconst STANDARD_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport function buildDomainKnowledgeManifest(\n options: BuildDomainKnowledgeOptions,\n): DomainKnowledgeManifest {\n const rootDir = options.rootDir;\n const packageJson = options.packageJson ?? readPackageJson(rootDir) ?? {};\n const packageName = options.manifest.packageName ?? packageJson.name;\n const packageVersion = options.manifest.packageVersion ?? packageJson.version;\n const agentDocPath = existingPath(rootDir, 'AGENTS.md');\n const agentDoc =\n options.config?.includeDocs === false || !agentDocPath\n ? undefined\n : readFileSync(agentDocPath, 'utf8');\n const allDependencies = {\n ...record(packageJson.dependencies),\n ...record(packageJson.devDependencies),\n ...record(packageJson.peerDependencies),\n };\n const manifestObjects = Object.values(options.manifest.objects).filter(\n (object) => object.decoratorConfig?.knowledge !== false,\n );\n const objects = manifestObjects.map((object) => buildKnowledgeObject(object));\n const surfaces = objects.flatMap((object) => object.surfaces);\n const manifestJson = stableJson(normalizeManifestForHash(options.manifest));\n\n return {\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n packageName,\n packageVersion,\n sourceManifestPath: options.manifestPath\n ? relative(rootDir, options.manifestPath)\n : undefined,\n agentDocPath: agentDocPath ? relative(rootDir, agentDocPath) : undefined,\n sourceHashes: sourceHashes({\n manifest: { content: manifestJson },\n packageJson: fileHashSource(existingPath(rootDir, 'package.json')),\n agents: fileHashSource(agentDocPath),\n }),\n exports: exportKeys(packageJson.exports),\n dependencies: allDependencies,\n smrtDependencies: Object.keys(allDependencies)\n .filter((dep) => dep.startsWith('@happyvertical/smrt-'))\n .sort(),\n sdkDependencies: Object.keys(allDependencies)\n .filter((dep) => SDK_PACKAGE_NAMES.has(dep))\n .sort(),\n tags: options.config?.tags ?? [],\n summary: options.config?.summary,\n risks: options.config?.risks ?? [],\n objects,\n surfaces,\n prompts:\n options.config?.includePrompts === false ? [] : readPrompts(rootDir),\n relationshipsV2: summarizeRelationships(objects, manifestObjects),\n agentDoc,\n };\n}\n\nfunction buildKnowledgeObject(\n object: SmartObjectDefinition,\n): DomainKnowledgeObject {\n const knowledge =\n typeof object.decoratorConfig?.knowledge === 'object'\n ? object.decoratorConfig.knowledge\n : {};\n const fields = Object.entries(object.fields).map(([name, field]) => ({\n name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: columnType(object, name),\n }));\n const relationships = fields\n .filter((field) => RELATIONSHIP_FIELD_TYPES.has(field.type))\n .map((field) => ({\n name: field.name,\n type: field.type,\n required: field.required,\n related: field.related,\n columnType: field.columnType,\n }));\n\n return {\n name: object.className,\n qualifiedName: object.qualifiedName,\n collection: object.collection,\n tableName: object.schema?.tableName,\n packageName: object.packageName,\n extends: object.extends,\n visibility: object.visibility,\n fields,\n relationships,\n methods: Object.keys(object.methods).sort(),\n surfaces: objectSurfaces(object),\n relationshipFeatures: relationshipFeatures(object),\n tags: knowledge.tags ?? [],\n summary: knowledge.summary,\n risks: knowledge.risks ?? [],\n };\n}\n\nfunction objectSurfaces(\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n return [\n ...configuredSurfaces('api', object),\n ...configuredSurfaces('cli', object),\n ...configuredSurfaces('mcp', object),\n ...aiSurfaces(object),\n ];\n}\n\nfunction configuredSurfaces(\n kind: 'api' | 'cli' | 'mcp',\n object: SmartObjectDefinition,\n): DomainKnowledgeSurface[] {\n const config = object.decoratorConfig?.[kind];\n if (!config) return [];\n const operations = configuredOperations(config);\n return operations.map((operation) => ({\n kind,\n name:\n kind === 'api'\n ? `${object.collection}.${operation}`\n : `${object.className.toLowerCase()}_${operation}`,\n operation,\n objectName: object.qualifiedName ?? object.className,\n path: kind === 'api' ? apiPath(object, operation) : undefined,\n method: kind === 'api' ? apiMethod(operation) : undefined,\n }));\n}\n\nfunction configuredOperations(config: unknown): string[] {\n if (config === true) return [...STANDARD_OPERATIONS];\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n return [];\n }\n const recordConfig = config as { include?: string[]; exclude?: string[] };\n const base = Array.isArray(recordConfig.include)\n ? recordConfig.include\n : STANDARD_OPERATIONS;\n const excluded = new Set(recordConfig.exclude ?? []);\n return [...new Set(base.filter((operation) => !excluded.has(operation)))];\n}\n\nfunction aiSurfaces(object: SmartObjectDefinition): DomainKnowledgeSurface[] {\n return (object.tools ?? []).map((tool) => ({\n kind: 'ai',\n name: tool.function.name,\n operation: tool.function.name,\n description: tool.function.description,\n objectName: object.qualifiedName ?? object.className,\n }));\n}\n\nfunction apiPath(object: SmartObjectDefinition, operation: string): string {\n const collection = object.decoratorConfig?.api;\n const configuredPath =\n typeof collection === 'object' && typeof collection.path === 'string'\n ? collection.path\n : object.collection.replaceAll('_', '-');\n if (operation === 'list' || operation === 'create') {\n return `/${configuredPath}`;\n }\n if (STANDARD_OPERATIONS.includes(operation)) {\n return `/${configuredPath}/[id]`;\n }\n return `/${configuredPath}/${operation}`;\n}\n\nfunction apiMethod(operation: string): string {\n switch (operation) {\n case 'list':\n case 'get':\n return 'GET';\n case 'create':\n return 'POST';\n case 'update':\n return 'PATCH';\n case 'delete':\n return 'DELETE';\n default:\n return 'POST';\n }\n}\n\nfunction relationshipFeatures(object: SmartObjectDefinition): string[] {\n const features = new Set<string>();\n for (const field of Object.values(object.fields)) {\n if (field.type === 'foreignKey') features.add('foreignKey');\n if (field.type === 'crossPackageRef') features.add('crossPackageRef');\n if (field.type === 'oneToMany') features.add('oneToMany');\n if (field.type === 'manyToMany') features.add('manyToMany');\n }\n if (object.extends === 'SmrtJunction') features.add('SmrtJunction');\n if (object.extends === 'SmrtHierarchical') features.add('SmrtHierarchical');\n if (\n object.extends === 'SmrtPolymorphicAssociation' ||\n object.fields.metaType ||\n object.fields.metaId\n ) {\n features.add('SmrtPolymorphicAssociation');\n }\n if (\n Object.keys(object.schema?.columns ?? {}).some(\n (name) => object.schema?.columns[name]?.type === 'UUID',\n )\n ) {\n features.add('uuidColumns');\n }\n return [...features].sort();\n}\n\nfunction summarizeRelationships(\n objects: DomainKnowledgeObject[],\n manifestObjects: SmartObjectDefinition[],\n) {\n const fields = objects.flatMap((object) => object.fields);\n return {\n foreignKeyFields: fields.filter((field) => field.type === 'foreignKey')\n .length,\n crossPackageRefFields: fields.filter(\n (field) => field.type === 'crossPackageRef',\n ).length,\n junctionCollections: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtJunction'),\n ).length,\n hierarchicalObjects: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtHierarchical'),\n ).length,\n polymorphicAssociations: objects.filter((object) =>\n object.relationshipFeatures.includes('SmrtPolymorphicAssociation'),\n ).length,\n uuidColumns: manifestObjects.reduce(\n (count, object) =>\n count +\n Object.values(object.schema?.columns ?? {}).filter(\n (column) => column.type === 'UUID',\n ).length,\n 0,\n ),\n };\n}\n\nfunction columnType(\n object: SmartObjectDefinition,\n fieldName: string,\n): string | undefined {\n const columnName = camelToSnake(fieldName);\n return object.schema?.columns[columnName]?.type;\n}\n\nfunction readPrompts(\n rootDir: string,\n): Array<{ filePath: string; key?: string }> {\n const srcDir = join(rootDir, 'src');\n if (!existsSync(srcDir)) return [];\n const prompts: Array<{ filePath: string; key?: string }> = [];\n for (const filePath of walkFiles(srcDir)) {\n if (!filePath.endsWith('.ts')) continue;\n const content = readFileSync(filePath, 'utf8');\n if (!content.includes('definePrompt')) continue;\n const keyMatch = content.match(/definePrompt\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]/);\n prompts.push({\n filePath: relative(rootDir, filePath),\n key: keyMatch?.[1],\n });\n }\n return prompts;\n}\n\nfunction walkFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === '.svelte-kit'\n ) {\n continue;\n }\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...walkFiles(fullPath));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction sourceHashes(sources: Record<string, HashSource | undefined>) {\n const hashes: Record<string, string> = {};\n for (const [name, source] of Object.entries(sources)) {\n if (!source) continue;\n const content =\n 'content' in source ? source.content : readFileSync(source.path, 'utf8');\n hashes[name] = createHash('sha256').update(content).digest('hex');\n }\n return hashes;\n}\n\ntype HashSource = { content: string } | { path: string };\n\nfunction fileHashSource(path: string | undefined): HashSource | undefined {\n return path ? { path } : undefined;\n}\n\nfunction existingPath(rootDir: string, path: string): string | undefined {\n const fullPath = join(rootDir, path);\n return existsSync(fullPath) ? fullPath : undefined;\n}\n\nfunction readPackageJson(rootDir: string): PackageJsonLike | null {\n const path = join(rootDir, 'package.json');\n if (!existsSync(path)) return null;\n return JSON.parse(readFileSync(path, 'utf8'));\n}\n\nfunction record(value: unknown): Record<string, string> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, string>)\n : {};\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') return ['.'];\n if (\n typeof exportsField !== 'object' ||\n exportsField === null ||\n Array.isArray(exportsField)\n ) {\n return [];\n }\n return Object.keys(exportsField).sort();\n}\n\nfunction camelToSnake(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n}\n\nfunction normalizeManifestForHash(manifest: SmartObjectManifest): unknown {\n const normalized = JSON.parse(JSON.stringify(manifest)) as Record<\n string,\n unknown\n >;\n delete normalized.timestamp;\n return normalized;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(sortJson(value), null, 2);\n}\n\nfunction sortJson(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortJson);\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, entry]) => [key, sortJson(entry)]),\n );\n }\n return value;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-config.d.ts","sourceRoot":"","sources":["../src/lazy-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhD;;;OAGG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEzE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CACtC;AAID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,kBAAkB,CAU7B;AA2GD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,CAAC,CAAC,CAwCZ;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"lazy-config.d.ts","sourceRoot":"","sources":["../src/lazy-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEhD;;;OAGG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEzE;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CACtC;AAID;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,kBAAkB,CAU7B;AA2GD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,CAAC,CAAC,CAwCZ;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,SAAS,CAqB5C"}
|