/** * Constants for Ensemble elements * * Defines limits, defaults, and security constants following patterns from other elements * * CONFIGURABILITY (Issue #368): * Limits can be configured via: * 1. Environment variables (e.g., ENSEMBLE_MAX_ELEMENTS=100) * 2. Global configuration object (setGlobalEnsembleLimits()) * 3. Per-ensemble overrides via metadata.resourceLimits * * Priority: Per-ensemble > Global config > Environment variables > Defaults * * @example * // 1. Environment variables (set before server starts) * // ENSEMBLE_MAX_ELEMENTS=100 * // ENSEMBLE_MAX_NESTING_DEPTH=3 * // ENSEMBLE_MAX_ACTIVATION_TIME=60000 * * @example * // 2. Global configuration (programmatic) * import { setGlobalEnsembleLimits } from './constants.js'; * setGlobalEnsembleLimits({ * maxElements: 75, * maxNestingDepth: 4, * maxActivationTime: 45000 * }); * * @example * // 3. Per-ensemble override (in ensemble metadata) * const ensemble = new Ensemble({ * name: 'my-ensemble', * resourceLimits: { * maxActiveElements: 25, // Maps to MAX_ELEMENTS * maxExecutionTimeMs: 10000 // Maps to MAX_ACTIVATION_TIME * } * }, elements, metadataService); */ /** * Absolute maximum values for security - cannot be exceeded even with configuration * These prevent resource exhaustion and DoS attacks */ export declare const ENSEMBLE_HARD_LIMITS: { readonly MAX_ELEMENTS: 500; readonly MAX_NESTING_DEPTH: 10; readonly MAX_ACTIVATION_TIME: 300000; readonly MAX_CONTEXT_SIZE: 10000; readonly MAX_CONTEXT_VALUE_SIZE: 1048576; readonly MAX_DEPENDENCIES: 50; readonly MAX_CONDITION_LENGTH: 1000; }; /** * Minimum values for safety - configured values cannot go below these */ export declare const ENSEMBLE_MIN_LIMITS: { readonly MAX_ELEMENTS: 1; readonly MAX_NESTING_DEPTH: 0; readonly MAX_ACTIVATION_TIME: 1000; readonly MAX_CONTEXT_SIZE: 10; readonly MAX_CONTEXT_VALUE_SIZE: 100; readonly MAX_DEPENDENCIES: 1; readonly MAX_CONDITION_LENGTH: 10; }; /** * Interface for configurable ensemble limits * All properties are optional - unset properties use defaults */ export interface EnsembleLimitsConfig { /** Maximum elements in an ensemble (default: 50, max: 500) */ maxElements?: number; /** Maximum depth of nested ensembles (default: 5, max: 10) */ maxNestingDepth?: number; /** Maximum activation time in ms (default: 30000, max: 300000) */ maxActivationTime?: number; /** Maximum keys in shared context (default: 1000, max: 10000) */ maxContextSize?: number; /** Maximum size of a context value in bytes (default: 10000, max: 1048576) */ maxContextValueSize?: number; /** Maximum dependencies per element (default: 10, max: 50) */ maxDependencies?: number; /** Maximum length of activation condition (default: 200, max: 1000) */ maxConditionLength?: number; } /** * Set global ensemble limits configuration * Values are validated against hard limits * * @param config - Configuration object with desired limits * @example * setGlobalEnsembleLimits({ * maxElements: 100, * maxNestingDepth: 3, * maxActivationTime: 60000 * }); */ export declare function setGlobalEnsembleLimits(config: EnsembleLimitsConfig): void; /** * Get current global ensemble limits configuration * @returns Copy of current global config */ export declare function getGlobalEnsembleLimits(): Readonly; /** * Reset global ensemble limits to defaults (clears all overrides) */ export declare function resetGlobalEnsembleLimits(): void; /** * Resolved ensemble limits structure * Uses number type (not literal types) since values are computed at runtime */ export interface ResolvedEnsembleLimits { readonly MAX_ELEMENTS: number; readonly MAX_NESTING_DEPTH: number; readonly MAX_ACTIVATION_TIME: number; readonly MAX_CONTEXT_SIZE: number; readonly MAX_CONTEXT_VALUE_SIZE: number; readonly MAX_DEPENDENCIES: number; readonly MAX_CONDITION_LENGTH: number; } /** * Get effective limits with proper priority: * Per-ensemble override > Global config > Environment variable > Default * * @param perEnsembleOverrides - Optional per-ensemble limit overrides * @returns Resolved limits object */ export declare function getEffectiveLimits(perEnsembleOverrides?: Partial): ResolvedEnsembleLimits; /** * Resource limits to prevent DoS attacks and ensure system stability * * Note: Rate limiting is not implemented at the Ensemble level because: * 1. The activationInProgress flag already prevents concurrent activations * 2. Rate limiting should be handled at the handler/API level, not in the domain model * 3. Different deployment scenarios may have different rate limiting requirements * * CONFIGURABILITY: Use getEffectiveLimits() to get limits that respect * environment variables, global config, and per-ensemble overrides. * This constant provides the base defaults for backwards compatibility. */ export declare const ENSEMBLE_LIMITS: { readonly MAX_ELEMENTS: 50; readonly MAX_NESTING_DEPTH: 5; readonly MAX_ACTIVATION_TIME: 30000; readonly MAX_CONTEXT_SIZE: 1000; readonly MAX_CONTEXT_VALUE_SIZE: 10000; readonly MAX_DEPENDENCIES: 10; readonly MAX_CONDITION_LENGTH: 200; }; /** * Default values for ensemble configuration */ export declare const ENSEMBLE_DEFAULTS: { readonly ACTIVATION_STRATEGY: "sequential"; readonly CONFLICT_RESOLUTION: "last-write"; readonly ELEMENT_ROLE: "support"; readonly PRIORITY: 50; readonly ALLOW_NESTED: true; readonly ACTIVATION_TIMEOUT: 5000; readonly MAX_NESTING_DEPTH: 5; readonly CONTEXT_SHARING: "selective"; }; /** * Supported activation strategies * Must match ActivationStrategy type in types.ts */ export declare const ACTIVATION_STRATEGIES: readonly ["all", "sequential", "lazy", "conditional", "priority"]; /** * Supported conflict resolution strategies */ export declare const CONFLICT_STRATEGIES: readonly ["last-write", "first-write", "priority", "merge", "error"]; /** * Element roles within an ensemble */ export declare const ELEMENT_ROLES: readonly ["primary", "support", "override", "monitor", "core"]; /** * Activation modes for elements */ export declare const ACTIVATION_MODES: readonly ["always", "on-demand", "conditional"]; /** * Security event types for ensemble operations * These are logged via SecurityMonitor for audit trails */ export declare const ENSEMBLE_SECURITY_EVENTS: { readonly CIRCULAR_DEPENDENCY: "ENSEMBLE_CIRCULAR_DEPENDENCY"; readonly RESOURCE_LIMIT_EXCEEDED: "ENSEMBLE_RESOURCE_LIMIT_EXCEEDED"; readonly ACTIVATION_TIMEOUT: "ENSEMBLE_ACTIVATION_TIMEOUT"; readonly ACTIVATION_FAILED: "ENSEMBLE_ACTIVATION_FAILED"; readonly SUSPICIOUS_CONDITION: "ENSEMBLE_SUSPICIOUS_CONDITION"; readonly CONDITION_EVALUATION_FAILED: "ENSEMBLE_CONDITION_EVALUATION_FAILED"; readonly NESTED_DEPTH_EXCEEDED: "ENSEMBLE_NESTED_DEPTH_EXCEEDED"; readonly CONTEXT_SIZE_EXCEEDED: "ENSEMBLE_CONTEXT_SIZE_EXCEEDED"; readonly CONTEXT_VALUE_TOO_LARGE: "ENSEMBLE_CONTEXT_VALUE_TOO_LARGE"; readonly SAVED: "ENSEMBLE_SAVED"; readonly IMPORTED: "ENSEMBLE_IMPORTED"; readonly DELETED: "ENSEMBLE_DELETED"; readonly ACTIVATED: "ENSEMBLE_ACTIVATED"; readonly DEACTIVATED: "ENSEMBLE_DEACTIVATED"; }; /** * Error messages for validation */ export declare const ENSEMBLE_ERRORS: { readonly TOO_MANY_ELEMENTS: "Ensemble cannot contain more than 50 elements"; readonly NESTING_TOO_DEEP: "Ensemble nesting depth cannot exceed 5"; readonly CIRCULAR_DEPENDENCY: "Circular dependency detected in ensemble"; readonly INVALID_STRATEGY: "Invalid activation strategy"; readonly INVALID_CONFLICT_RESOLUTION: "Invalid conflict resolution strategy"; readonly INVALID_ELEMENT_ROLE: "Invalid element role"; readonly INVALID_ACTIVATION_MODE: "Invalid activation mode"; readonly ELEMENT_NOT_FOUND: "Element not found in ensemble"; readonly ACTIVATION_TIMEOUT: "Ensemble activation timed out"; readonly CONTEXT_OVERFLOW: "Shared context size exceeded limits"; readonly ELEMENT_LOAD_FAILED: "Failed to load element"; readonly CONDITION_EVALUATION_FAILED: "Failed to evaluate activation condition"; }; /** * Regex patterns for validation */ export declare const ENSEMBLE_PATTERNS: { readonly CONDITION_PATTERN: RegExp; readonly ELEMENT_NAME_PATTERN: RegExp; }; /** * Dangerous keywords that should be rejected in conditions * * These patterns are checked separately from CONDITION_PATTERN for security. * Note: We focus on dangerous code execution patterns rather than unsupported * operators, since condition evaluation isn't implemented yet. When it is * implemented, the evaluator will handle operator support properly. */ export declare const DANGEROUS_CONDITION_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp]; //# sourceMappingURL=constants.d.ts.map