@peac/control 0.10.13 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -145,7 +145,7 @@ var ConstraintSchema = zod.z.discriminatedUnion("type", [
145
145
  var ControlBlockSchema2 = zod.z.object({
146
146
  mandate: ConstraintSchema,
147
147
  scope: zod.z.string().url().optional(),
148
- metadata: zod.z.record(zod.z.unknown()).optional()
148
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
149
149
  });
150
150
  var ControlStateSchema = zod.z.object({
151
151
  receipt_id: zod.z.string().uuid(),
@@ -154,7 +154,7 @@ var ControlStateSchema = zod.z.object({
154
154
  spent_amount: zod.z.number().int().nonnegative().optional(),
155
155
  first_use: zod.z.number().int().positive().optional(),
156
156
  last_use: zod.z.number().int().positive().optional(),
157
- metadata: zod.z.record(zod.z.unknown()).optional()
157
+ metadata: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
158
158
  });
159
159
 
160
160
  // src/enforcement.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["z","ControlBlockSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["z","ControlBlockSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
package/dist/index.mjs CHANGED
@@ -143,7 +143,7 @@ var ConstraintSchema = z.discriminatedUnion("type", [
143
143
  var ControlBlockSchema2 = z.object({
144
144
  mandate: ConstraintSchema,
145
145
  scope: z.string().url().optional(),
146
- metadata: z.record(z.unknown()).optional()
146
+ metadata: z.record(z.string(), z.unknown()).optional()
147
147
  });
148
148
  var ControlStateSchema = z.object({
149
149
  receipt_id: z.string().uuid(),
@@ -152,7 +152,7 @@ var ControlStateSchema = z.object({
152
152
  spent_amount: z.number().int().nonnegative().optional(),
153
153
  first_use: z.number().int().positive().optional(),
154
154
  last_use: z.number().int().positive().optional(),
155
- metadata: z.record(z.unknown()).optional()
155
+ metadata: z.record(z.string(), z.unknown()).optional()
156
156
  });
157
157
 
158
158
  // src/enforcement.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["ControlBlockSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
1
+ {"version":3,"sources":["../src/adapter.ts","../src/validators.ts","../src/enforcement.ts","../src/state.ts"],"names":["ControlBlockSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * PEAC Control Engine Adapter Interface\n *\n * Minimal, vendor-neutral interface for control engine implementations.\n * Control engines evaluate authorization policies and return allow/deny decisions.\n *\n * @packageDocumentation\n */\n\nimport type { ControlStep } from '@peac/schema';\n\n/**\n * Context provided to control engine for evaluation\n *\n * This is the minimal context needed for most control engines.\n * Engines may require additional context via the `policy` field.\n */\nexport interface ControlEvaluationContext {\n /** Resource being accessed (e.g., \"https://api.example.com/v1/chat\") */\n resource: string;\n\n /** HTTP method or operation (e.g., \"POST\", \"read\", \"write\") */\n method: string;\n\n /** Requested payment amount (smallest currency unit), if applicable */\n amount?: number;\n\n /** Currency (ISO 4217), if applicable */\n currency?: string;\n\n /** Subject identifier (e.g., agent ID, user ID) */\n subject?: string;\n\n /** Policy document fetched from policy_uri (engine-specific structure) */\n policy: unknown;\n\n /** Current timestamp (Unix seconds) for temporal checks */\n timestamp?: number;\n\n /** Additional context (engine-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Control Engine Adapter\n *\n * Minimal interface that all control engines must implement.\n *\n * **Design principles**:\n * - Vendor-neutral: No hardcoded engine names or vendor-specific types\n * - Stateless: Engine is responsible for fetching its own state if needed\n * - Async: Allows engines to make network calls (fetch policies, check quotas)\n * - Opaque: Policy structure is engine-specific (unknown type)\n *\n * **Examples of engines**:\n * - Spend control: Per-transaction, daily, monthly limits\n * - Risk scoring: Fraud detection, anomaly detection\n * - Mandate enforcement: Enterprise approval chains\n * - Rate limiting: Request quotas, throttling\n *\n * **Usage**:\n * ```typescript\n * const engine: ControlEngineAdapter = new MyControlEngine();\n * const step = await engine.evaluate({\n * resource: \"https://api.example.com/v1/chat\",\n * method: \"POST\",\n * amount: 250,\n * currency: \"USD\",\n * policy: { ... } // Fetched from policy_uri\n * });\n * ```\n */\nexport interface ControlEngineAdapter {\n /**\n * Engine identifier (vendor-neutral)\n *\n * Examples:\n * - \"spend-control-service\"\n * - \"risk-engine\"\n * - \"mandate-service\"\n *\n * See docs/specs/registries.json for common identifiers.\n */\n readonly engineId: string;\n\n /**\n * Engine version (optional, for tracking)\n *\n * Format: Semantic versioning (e.g., \"1.2.3\")\n */\n readonly version?: string;\n\n /**\n * Evaluate authorization policy and return control decision\n *\n * @param context - Evaluation context (resource, method, amount, policy, etc.)\n * @returns Control step with decision (allow/deny) and optional limits_snapshot\n * @throws Error if evaluation fails (network error, invalid policy, etc.)\n *\n * **Requirements**:\n * - MUST return a valid ControlStep with result: \"allow\" | \"deny\" | \"review\"\n * - SHOULD populate reason if result is \"deny\" or \"review\"\n * - MAY populate limits_snapshot with engine-specific state\n * - MAY populate evidence_ref with URL to detailed evidence\n * - MUST NOT throw on normal deny decisions (only throw on errors)\n */\n evaluate(context: ControlEvaluationContext): Promise<ControlStep>;\n}\n\n/**\n * Control Engine Registry\n *\n * Optional helper for managing multiple control engines.\n *\n * **Usage**:\n * ```typescript\n * const registry = new ControlEngineRegistry();\n * registry.register(new SpendControlEngine());\n * registry.register(new RiskEngine());\n *\n * const engine = registry.get(\"spend-control-service\");\n * const step = await engine.evaluate(context);\n * ```\n */\nexport class ControlEngineRegistry {\n private engines = new Map<string, ControlEngineAdapter>();\n\n /**\n * Register a control engine\n *\n * @param engine - Control engine adapter\n * @throws Error if engine with same ID already registered\n */\n register(engine: ControlEngineAdapter): void {\n if (this.engines.has(engine.engineId)) {\n throw new Error(`Control engine already registered: ${engine.engineId}`);\n }\n this.engines.set(engine.engineId, engine);\n }\n\n /**\n * Get control engine by ID\n *\n * @param engineId - Engine identifier\n * @returns Control engine adapter\n * @throws Error if engine not found\n */\n get(engineId: string): ControlEngineAdapter {\n const engine = this.engines.get(engineId);\n if (!engine) {\n throw new Error(`Control engine not found: ${engineId}`);\n }\n return engine;\n }\n\n /**\n * Check if engine is registered\n *\n * @param engineId - Engine identifier\n * @returns True if engine is registered\n */\n has(engineId: string): boolean {\n return this.engines.has(engineId);\n }\n\n /**\n * Get all registered engine IDs\n *\n * @returns Array of engine IDs\n */\n list(): string[] {\n return Array.from(this.engines.keys());\n }\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) Validators\n *\n * Validation logic for control blocks and mandates.\n */\n\nimport { z } from 'zod';\n\n/**\n * Base temporal mandate schema (without refinements)\n */\nconst TemporalConstraintBaseSchema = z.object({\n type: z.literal('temporal'),\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n});\n\n/**\n * Base usage mandate schema (without refinements)\n */\nconst UsageConstraintBaseSchema = z.object({\n type: z.literal('usage'),\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n});\n\n/**\n * Base budget mandate schema (without refinements)\n */\nconst BudgetConstraintBaseSchema = z.object({\n type: z.literal('budget'),\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n});\n\n/**\n * Base combined mandate schema (without refinements)\n */\nconst CombinedConstraintBaseSchema = z.object({\n type: z.literal('combined'),\n temporal: z\n .object({\n valid_from: z.number().int().positive().optional(),\n valid_until: z.number().int().positive().optional(),\n duration: z.number().int().positive().optional(),\n })\n .optional(),\n usage: z\n .object({\n max_uses: z.number().int().positive(),\n current_uses: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n })\n .optional(),\n budget: z\n .object({\n max_amount: z.number().int().positive(),\n current_amount: z.number().int().nonnegative().optional(),\n window: z.number().int().positive().optional(),\n currency: z.string().length(3).toUpperCase(),\n })\n .optional(),\n});\n\n/**\n * Temporal mandate schema (with validation)\n */\nexport const TemporalConstraintSchema = TemporalConstraintBaseSchema.refine(\n (data) => {\n // At least one temporal constraint must be specified\n return (\n data.valid_from !== undefined || data.valid_until !== undefined || data.duration !== undefined\n );\n },\n {\n message:\n 'At least one temporal constraint (valid_from, valid_until, duration) must be specified',\n }\n).refine(\n (data) => {\n // If both valid_from and valid_until are specified, valid_until must be after valid_from\n if (data.valid_from !== undefined && data.valid_until !== undefined) {\n return data.valid_until > data.valid_from;\n }\n return true;\n },\n {\n message: 'valid_until must be after valid_from',\n }\n);\n\n/**\n * Usage mandate schema (with validation)\n */\nexport const UsageConstraintSchema = UsageConstraintBaseSchema.refine(\n (data) => {\n // current_uses cannot exceed max_uses\n if (data.current_uses !== undefined) {\n return data.current_uses <= data.max_uses;\n }\n return true;\n },\n {\n message: 'current_uses cannot exceed max_uses',\n }\n);\n\n/**\n * Budget mandate schema (with validation)\n */\nexport const BudgetConstraintSchema = BudgetConstraintBaseSchema.refine(\n (data) => {\n // current_amount cannot exceed max_amount\n if (data.current_amount !== undefined) {\n return data.current_amount <= data.max_amount;\n }\n return true;\n },\n {\n message: 'current_amount cannot exceed max_amount',\n }\n);\n\n/**\n * Combined mandate schema (with validation)\n */\nexport const CombinedConstraintSchema = CombinedConstraintBaseSchema.refine(\n (data) => {\n // At least one mandate type must be specified\n return data.temporal !== undefined || data.usage !== undefined || data.budget !== undefined;\n },\n {\n message: 'At least one mandate (temporal, usage, budget) must be specified in combined type',\n }\n);\n\n/**\n * Constraint schema (discriminated union using base schemas)\n */\nexport const ConstraintSchema = z.discriminatedUnion('type', [\n TemporalConstraintBaseSchema,\n UsageConstraintBaseSchema,\n BudgetConstraintBaseSchema,\n CombinedConstraintBaseSchema,\n]);\n\n/**\n * Control block schema\n */\nexport const ControlBlockSchema = z.object({\n mandate: ConstraintSchema,\n scope: z.string().url().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n/**\n * Control state schema\n */\nexport const ControlStateSchema = z.object({\n receipt_id: z.string().uuid(),\n constraint: ConstraintSchema,\n usage_count: z.number().int().nonnegative().optional(),\n spent_amount: z.number().int().nonnegative().optional(),\n first_use: z.number().int().positive().optional(),\n last_use: z.number().int().positive().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\n// -----------------------------------------------------------------------------\n// CAL Semantic Validators (v0.9.16+)\n// Re-exported from @peac/schema for convenience\n// -----------------------------------------------------------------------------\n\nexport {\n ControlPurposeSchema,\n ControlLicensingModeSchema,\n ControlDecisionSchema,\n ControlStepSchema,\n // Note: ControlBlockSchema from @peac/schema validates chain-based governance blocks\n // (chain/decision/combinator), while the ControlBlockSchema above validates\n // constraint-based blocks (mandate/scope/metadata). We export the chain-based\n // one with a distinct name to avoid confusion.\n ControlBlockSchema as ChainControlBlockSchema,\n} from '@peac/schema';\n","/**\n * PEAC Control Abstraction Layer (CAL) Enforcement\n *\n * Enforcement logic for mandates and control blocks.\n */\n\nimport type {\n Constraint,\n ControlState,\n ConstraintEnforcementResult,\n TemporalConstraint,\n UsageConstraint,\n BudgetConstraint,\n CombinedConstraint,\n} from './types';\n\ntype EnforcementResult = ConstraintEnforcementResult;\n\n/**\n * Enforce temporal mandate\n */\nexport function enforceTemporalConstraint(\n mandate: TemporalConstraint,\n currentTime: number = Math.floor(Date.now() / 1000)\n): EnforcementResult {\n // Check valid_from\n if (mandate.valid_from !== undefined && currentTime < mandate.valid_from) {\n const remaining = mandate.valid_from - currentTime;\n return {\n allowed: false,\n reason: `Access not yet valid (starts in ${remaining}s)`,\n remaining: { seconds: remaining },\n };\n }\n\n // Check valid_until\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return {\n allowed: false,\n reason: 'Access has expired',\n remaining: { seconds: 0 },\n };\n }\n\n // Calculate remaining time\n let remainingSeconds: number | undefined;\n if (mandate.valid_until !== undefined) {\n remainingSeconds = mandate.valid_until - currentTime;\n } else if (mandate.duration !== undefined && mandate.valid_from !== undefined) {\n const expiresAt = mandate.valid_from + mandate.duration;\n remainingSeconds = expiresAt - currentTime;\n }\n\n return {\n allowed: true,\n remaining: remainingSeconds !== undefined ? { seconds: remainingSeconds } : undefined,\n };\n}\n\n/**\n * Enforce usage mandate\n */\nexport function enforceUsageConstraint(\n mandate: UsageConstraint,\n state?: ControlState\n): EnforcementResult {\n const currentUses = state?.usage_count ?? mandate.current_uses ?? 0;\n\n // Check if max uses exceeded\n if (currentUses >= mandate.max_uses) {\n return {\n allowed: false,\n reason: `Usage limit exceeded (${currentUses}/${mandate.max_uses})`,\n remaining: { uses: 0 },\n };\n }\n\n // Check usage window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Usage window expired',\n remaining: { uses: 0 },\n };\n }\n }\n\n const remainingUses = mandate.max_uses - currentUses;\n\n return {\n allowed: true,\n remaining: { uses: remainingUses },\n };\n}\n\n/**\n * Enforce budget mandate\n */\nexport function enforceBudgetConstraint(\n mandate: BudgetConstraint,\n state?: ControlState,\n requestedAmount?: number\n): EnforcementResult {\n const currentAmount = state?.spent_amount ?? mandate.current_amount ?? 0;\n\n // Check if budget exceeded\n if (currentAmount >= mandate.max_amount) {\n return {\n allowed: false,\n reason: `Budget limit exceeded (${currentAmount}/${mandate.max_amount} ${mandate.currency})`,\n remaining: { amount: 0 },\n };\n }\n\n // Check if requested amount would exceed budget\n if (requestedAmount !== undefined) {\n if (currentAmount + requestedAmount > mandate.max_amount) {\n const remaining = mandate.max_amount - currentAmount;\n return {\n allowed: false,\n reason: `Requested amount would exceed budget (${requestedAmount} > ${remaining} ${mandate.currency} remaining)`,\n remaining: { amount: remaining },\n };\n }\n }\n\n // Check budget window if specified\n if (mandate.window !== undefined && state?.first_use !== undefined) {\n const currentTime = Math.floor(Date.now() / 1000);\n const windowExpiry = state.first_use + mandate.window;\n\n if (currentTime > windowExpiry) {\n return {\n allowed: false,\n reason: 'Budget window expired',\n remaining: { amount: 0 },\n };\n }\n }\n\n const remainingAmount = mandate.max_amount - currentAmount;\n\n return {\n allowed: true,\n remaining: { amount: remainingAmount },\n };\n}\n\n/**\n * Enforce combined mandate\n */\nexport function enforceCombinedConstraint(\n mandate: CombinedConstraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n const results: EnforcementResult[] = [];\n\n // Check temporal constraints\n if (mandate.temporal !== undefined) {\n const temporalConstraint: TemporalConstraint = {\n type: 'temporal',\n ...mandate.temporal,\n };\n const result = enforceTemporalConstraint(temporalConstraint, currentTime);\n results.push(result);\n }\n\n // Check usage constraints\n if (mandate.usage !== undefined) {\n const usageConstraint: UsageConstraint = {\n type: 'usage',\n ...mandate.usage,\n };\n const result = enforceUsageConstraint(usageConstraint, state);\n results.push(result);\n }\n\n // Check budget constraints\n if (mandate.budget !== undefined) {\n const budgetConstraint: BudgetConstraint = {\n type: 'budget',\n ...mandate.budget,\n };\n const result = enforceBudgetConstraint(budgetConstraint, state, requestedAmount);\n results.push(result);\n }\n\n // All constraints must be satisfied\n const failedResult = results.find((r) => !r.allowed);\n if (failedResult) {\n return failedResult;\n }\n\n // Merge remaining information\n const remaining: EnforcementResult['remaining'] = {};\n for (const result of results) {\n if (result.remaining) {\n Object.assign(remaining, result.remaining);\n }\n }\n\n return {\n allowed: true,\n remaining: Object.keys(remaining).length > 0 ? remaining : undefined,\n };\n}\n\n/**\n * Enforce mandate (dispatcher)\n */\nexport function enforceConstraint(\n mandate: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n switch (mandate.type) {\n case 'temporal':\n return enforceTemporalConstraint(mandate, currentTime);\n\n case 'usage':\n return enforceUsageConstraint(mandate, state);\n\n case 'budget':\n return enforceBudgetConstraint(mandate, state, requestedAmount);\n\n case 'combined':\n return enforceCombinedConstraint(mandate, state, requestedAmount, currentTime);\n\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = mandate;\n return {\n allowed: false,\n reason: `Unknown mandate type: ${(_exhaustive as any).type}`,\n };\n }\n }\n}\n\n/**\n * Enforce control block\n *\n * @deprecated Use enforceConstraint directly. This function is maintained for backward compatibility.\n */\nexport function enforceControlBlock(\n constraint: Constraint,\n state?: ControlState,\n requestedAmount?: number,\n currentTime?: number\n): EnforcementResult {\n return enforceConstraint(constraint, state, requestedAmount, currentTime);\n}\n","/**\n * PEAC Control Abstraction Layer (CAL) State Management\n *\n * State tracking and updates for control blocks.\n */\n\nimport type { ControlState, Constraint } from './types';\n\n/**\n * Create initial control state\n */\nexport function createControlState(receiptId: string, constraint: Constraint): ControlState {\n return {\n receipt_id: receiptId,\n constraint,\n usage_count: 0,\n spent_amount: 0,\n metadata: {},\n };\n}\n\n/**\n * Update state after usage\n */\nexport function updateStateAfterUse(state: ControlState, amount?: number): ControlState {\n const currentTime = Math.floor(Date.now() / 1000);\n const usageCount = (state.usage_count ?? 0) + 1;\n const spentAmount = (state.spent_amount ?? 0) + (amount ?? 0);\n\n return {\n ...state,\n usage_count: usageCount,\n spent_amount: spentAmount,\n first_use: state.first_use ?? currentTime,\n last_use: currentTime,\n };\n}\n\n/**\n * Check if state is expired\n */\nexport function isStateExpired(state: ControlState): boolean {\n const { constraint: mandate } = state;\n const currentTime = Math.floor(Date.now() / 1000);\n\n // Check temporal expiry\n if (mandate.type === 'temporal') {\n if (mandate.valid_until !== undefined && currentTime > mandate.valid_until) {\n return true;\n }\n if (mandate.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check combined mandate temporal expiry\n if (mandate.type === 'combined' && mandate.temporal) {\n if (mandate.temporal.valid_until !== undefined && currentTime > mandate.temporal.valid_until) {\n return true;\n }\n if (mandate.temporal.duration !== undefined && state.first_use !== undefined) {\n const expiresAt = state.first_use + mandate.temporal.duration;\n if (currentTime > expiresAt) {\n return true;\n }\n }\n }\n\n // Check window expiry for usage mandates\n if (mandate.type === 'usage' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for budget mandates\n if (mandate.type === 'budget' && mandate.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n\n // Check window expiry for combined mandates\n if (mandate.type === 'combined') {\n if (mandate.usage?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.usage.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n if (mandate.budget?.window !== undefined && state.first_use !== undefined) {\n const windowExpiry = state.first_use + mandate.budget.window;\n if (currentTime > windowExpiry) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Reset state (for windowed mandates)\n */\nexport function resetState(state: ControlState): ControlState {\n return {\n ...state,\n usage_count: 0,\n spent_amount: 0,\n first_use: undefined,\n last_use: undefined,\n };\n}\n\n/**\n * Get state summary for debugging\n */\nexport function getStateSummary(state: ControlState): string {\n const parts: string[] = [];\n\n if (state.usage_count !== undefined && state.usage_count > 0) {\n parts.push(`uses: ${state.usage_count}`);\n }\n\n if (state.spent_amount !== undefined && state.spent_amount > 0) {\n const currency =\n state.constraint.type === 'budget'\n ? state.constraint.currency\n : state.constraint.type === 'combined' && state.constraint.budget\n ? state.constraint.budget.currency\n : 'units';\n parts.push(`spent: ${state.spent_amount} ${currency}`);\n }\n\n if (state.first_use !== undefined) {\n const date = new Date(state.first_use * 1000).toISOString();\n parts.push(`first: ${date}`);\n }\n\n if (state.last_use !== undefined) {\n const date = new Date(state.last_use * 1000).toISOString();\n parts.push(`last: ${date}`);\n }\n\n return parts.join(', ');\n}\n"]}
@@ -7,792 +7,178 @@ import { z } from 'zod';
7
7
  /**
8
8
  * Temporal mandate schema (with validation)
9
9
  */
10
- export declare const TemporalConstraintSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
10
+ export declare const TemporalConstraintSchema: z.ZodObject<{
11
11
  type: z.ZodLiteral<"temporal">;
12
12
  valid_from: z.ZodOptional<z.ZodNumber>;
13
13
  valid_until: z.ZodOptional<z.ZodNumber>;
14
14
  duration: z.ZodOptional<z.ZodNumber>;
15
- }, "strip", z.ZodTypeAny, {
16
- type: "temporal";
17
- valid_from?: number | undefined;
18
- valid_until?: number | undefined;
19
- duration?: number | undefined;
20
- }, {
21
- type: "temporal";
22
- valid_from?: number | undefined;
23
- valid_until?: number | undefined;
24
- duration?: number | undefined;
25
- }>, {
26
- type: "temporal";
27
- valid_from?: number | undefined;
28
- valid_until?: number | undefined;
29
- duration?: number | undefined;
30
- }, {
31
- type: "temporal";
32
- valid_from?: number | undefined;
33
- valid_until?: number | undefined;
34
- duration?: number | undefined;
35
- }>, {
36
- type: "temporal";
37
- valid_from?: number | undefined;
38
- valid_until?: number | undefined;
39
- duration?: number | undefined;
40
- }, {
41
- type: "temporal";
42
- valid_from?: number | undefined;
43
- valid_until?: number | undefined;
44
- duration?: number | undefined;
45
- }>;
15
+ }, z.core.$strip>;
46
16
  /**
47
17
  * Usage mandate schema (with validation)
48
18
  */
49
- export declare const UsageConstraintSchema: z.ZodEffects<z.ZodObject<{
19
+ export declare const UsageConstraintSchema: z.ZodObject<{
50
20
  type: z.ZodLiteral<"usage">;
51
21
  max_uses: z.ZodNumber;
52
22
  current_uses: z.ZodOptional<z.ZodNumber>;
53
23
  window: z.ZodOptional<z.ZodNumber>;
54
- }, "strip", z.ZodTypeAny, {
55
- type: "usage";
56
- max_uses: number;
57
- current_uses?: number | undefined;
58
- window?: number | undefined;
59
- }, {
60
- type: "usage";
61
- max_uses: number;
62
- current_uses?: number | undefined;
63
- window?: number | undefined;
64
- }>, {
65
- type: "usage";
66
- max_uses: number;
67
- current_uses?: number | undefined;
68
- window?: number | undefined;
69
- }, {
70
- type: "usage";
71
- max_uses: number;
72
- current_uses?: number | undefined;
73
- window?: number | undefined;
74
- }>;
24
+ }, z.core.$strip>;
75
25
  /**
76
26
  * Budget mandate schema (with validation)
77
27
  */
78
- export declare const BudgetConstraintSchema: z.ZodEffects<z.ZodObject<{
28
+ export declare const BudgetConstraintSchema: z.ZodObject<{
79
29
  type: z.ZodLiteral<"budget">;
80
30
  max_amount: z.ZodNumber;
81
31
  current_amount: z.ZodOptional<z.ZodNumber>;
82
32
  window: z.ZodOptional<z.ZodNumber>;
83
33
  currency: z.ZodString;
84
- }, "strip", z.ZodTypeAny, {
85
- currency: string;
86
- type: "budget";
87
- max_amount: number;
88
- window?: number | undefined;
89
- current_amount?: number | undefined;
90
- }, {
91
- currency: string;
92
- type: "budget";
93
- max_amount: number;
94
- window?: number | undefined;
95
- current_amount?: number | undefined;
96
- }>, {
97
- currency: string;
98
- type: "budget";
99
- max_amount: number;
100
- window?: number | undefined;
101
- current_amount?: number | undefined;
102
- }, {
103
- currency: string;
104
- type: "budget";
105
- max_amount: number;
106
- window?: number | undefined;
107
- current_amount?: number | undefined;
108
- }>;
34
+ }, z.core.$strip>;
109
35
  /**
110
36
  * Combined mandate schema (with validation)
111
37
  */
112
- export declare const CombinedConstraintSchema: z.ZodEffects<z.ZodObject<{
38
+ export declare const CombinedConstraintSchema: z.ZodObject<{
113
39
  type: z.ZodLiteral<"combined">;
114
40
  temporal: z.ZodOptional<z.ZodObject<{
115
41
  valid_from: z.ZodOptional<z.ZodNumber>;
116
42
  valid_until: z.ZodOptional<z.ZodNumber>;
117
43
  duration: z.ZodOptional<z.ZodNumber>;
118
- }, "strip", z.ZodTypeAny, {
119
- valid_from?: number | undefined;
120
- valid_until?: number | undefined;
121
- duration?: number | undefined;
122
- }, {
123
- valid_from?: number | undefined;
124
- valid_until?: number | undefined;
125
- duration?: number | undefined;
126
- }>>;
44
+ }, z.core.$strip>>;
127
45
  usage: z.ZodOptional<z.ZodObject<{
128
46
  max_uses: z.ZodNumber;
129
47
  current_uses: z.ZodOptional<z.ZodNumber>;
130
48
  window: z.ZodOptional<z.ZodNumber>;
131
- }, "strip", z.ZodTypeAny, {
132
- max_uses: number;
133
- current_uses?: number | undefined;
134
- window?: number | undefined;
135
- }, {
136
- max_uses: number;
137
- current_uses?: number | undefined;
138
- window?: number | undefined;
139
- }>>;
49
+ }, z.core.$strip>>;
140
50
  budget: z.ZodOptional<z.ZodObject<{
141
51
  max_amount: z.ZodNumber;
142
52
  current_amount: z.ZodOptional<z.ZodNumber>;
143
53
  window: z.ZodOptional<z.ZodNumber>;
144
54
  currency: z.ZodString;
145
- }, "strip", z.ZodTypeAny, {
146
- currency: string;
147
- max_amount: number;
148
- window?: number | undefined;
149
- current_amount?: number | undefined;
150
- }, {
151
- currency: string;
152
- max_amount: number;
153
- window?: number | undefined;
154
- current_amount?: number | undefined;
155
- }>>;
156
- }, "strip", z.ZodTypeAny, {
157
- type: "combined";
158
- temporal?: {
159
- valid_from?: number | undefined;
160
- valid_until?: number | undefined;
161
- duration?: number | undefined;
162
- } | undefined;
163
- usage?: {
164
- max_uses: number;
165
- current_uses?: number | undefined;
166
- window?: number | undefined;
167
- } | undefined;
168
- budget?: {
169
- currency: string;
170
- max_amount: number;
171
- window?: number | undefined;
172
- current_amount?: number | undefined;
173
- } | undefined;
174
- }, {
175
- type: "combined";
176
- temporal?: {
177
- valid_from?: number | undefined;
178
- valid_until?: number | undefined;
179
- duration?: number | undefined;
180
- } | undefined;
181
- usage?: {
182
- max_uses: number;
183
- current_uses?: number | undefined;
184
- window?: number | undefined;
185
- } | undefined;
186
- budget?: {
187
- currency: string;
188
- max_amount: number;
189
- window?: number | undefined;
190
- current_amount?: number | undefined;
191
- } | undefined;
192
- }>, {
193
- type: "combined";
194
- temporal?: {
195
- valid_from?: number | undefined;
196
- valid_until?: number | undefined;
197
- duration?: number | undefined;
198
- } | undefined;
199
- usage?: {
200
- max_uses: number;
201
- current_uses?: number | undefined;
202
- window?: number | undefined;
203
- } | undefined;
204
- budget?: {
205
- currency: string;
206
- max_amount: number;
207
- window?: number | undefined;
208
- current_amount?: number | undefined;
209
- } | undefined;
210
- }, {
211
- type: "combined";
212
- temporal?: {
213
- valid_from?: number | undefined;
214
- valid_until?: number | undefined;
215
- duration?: number | undefined;
216
- } | undefined;
217
- usage?: {
218
- max_uses: number;
219
- current_uses?: number | undefined;
220
- window?: number | undefined;
221
- } | undefined;
222
- budget?: {
223
- currency: string;
224
- max_amount: number;
225
- window?: number | undefined;
226
- current_amount?: number | undefined;
227
- } | undefined;
228
- }>;
55
+ }, z.core.$strip>>;
56
+ }, z.core.$strip>;
229
57
  /**
230
58
  * Constraint schema (discriminated union using base schemas)
231
59
  */
232
- export declare const ConstraintSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
60
+ export declare const ConstraintSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
233
61
  type: z.ZodLiteral<"temporal">;
234
62
  valid_from: z.ZodOptional<z.ZodNumber>;
235
63
  valid_until: z.ZodOptional<z.ZodNumber>;
236
64
  duration: z.ZodOptional<z.ZodNumber>;
237
- }, "strip", z.ZodTypeAny, {
238
- type: "temporal";
239
- valid_from?: number | undefined;
240
- valid_until?: number | undefined;
241
- duration?: number | undefined;
242
- }, {
243
- type: "temporal";
244
- valid_from?: number | undefined;
245
- valid_until?: number | undefined;
246
- duration?: number | undefined;
247
- }>, z.ZodObject<{
65
+ }, z.core.$strip>, z.ZodObject<{
248
66
  type: z.ZodLiteral<"usage">;
249
67
  max_uses: z.ZodNumber;
250
68
  current_uses: z.ZodOptional<z.ZodNumber>;
251
69
  window: z.ZodOptional<z.ZodNumber>;
252
- }, "strip", z.ZodTypeAny, {
253
- type: "usage";
254
- max_uses: number;
255
- current_uses?: number | undefined;
256
- window?: number | undefined;
257
- }, {
258
- type: "usage";
259
- max_uses: number;
260
- current_uses?: number | undefined;
261
- window?: number | undefined;
262
- }>, z.ZodObject<{
70
+ }, z.core.$strip>, z.ZodObject<{
263
71
  type: z.ZodLiteral<"budget">;
264
72
  max_amount: z.ZodNumber;
265
73
  current_amount: z.ZodOptional<z.ZodNumber>;
266
74
  window: z.ZodOptional<z.ZodNumber>;
267
75
  currency: z.ZodString;
268
- }, "strip", z.ZodTypeAny, {
269
- currency: string;
270
- type: "budget";
271
- max_amount: number;
272
- window?: number | undefined;
273
- current_amount?: number | undefined;
274
- }, {
275
- currency: string;
276
- type: "budget";
277
- max_amount: number;
278
- window?: number | undefined;
279
- current_amount?: number | undefined;
280
- }>, z.ZodObject<{
76
+ }, z.core.$strip>, z.ZodObject<{
281
77
  type: z.ZodLiteral<"combined">;
282
78
  temporal: z.ZodOptional<z.ZodObject<{
283
79
  valid_from: z.ZodOptional<z.ZodNumber>;
284
80
  valid_until: z.ZodOptional<z.ZodNumber>;
285
81
  duration: z.ZodOptional<z.ZodNumber>;
286
- }, "strip", z.ZodTypeAny, {
287
- valid_from?: number | undefined;
288
- valid_until?: number | undefined;
289
- duration?: number | undefined;
290
- }, {
291
- valid_from?: number | undefined;
292
- valid_until?: number | undefined;
293
- duration?: number | undefined;
294
- }>>;
82
+ }, z.core.$strip>>;
295
83
  usage: z.ZodOptional<z.ZodObject<{
296
84
  max_uses: z.ZodNumber;
297
85
  current_uses: z.ZodOptional<z.ZodNumber>;
298
86
  window: z.ZodOptional<z.ZodNumber>;
299
- }, "strip", z.ZodTypeAny, {
300
- max_uses: number;
301
- current_uses?: number | undefined;
302
- window?: number | undefined;
303
- }, {
304
- max_uses: number;
305
- current_uses?: number | undefined;
306
- window?: number | undefined;
307
- }>>;
87
+ }, z.core.$strip>>;
308
88
  budget: z.ZodOptional<z.ZodObject<{
309
89
  max_amount: z.ZodNumber;
310
90
  current_amount: z.ZodOptional<z.ZodNumber>;
311
91
  window: z.ZodOptional<z.ZodNumber>;
312
92
  currency: z.ZodString;
313
- }, "strip", z.ZodTypeAny, {
314
- currency: string;
315
- max_amount: number;
316
- window?: number | undefined;
317
- current_amount?: number | undefined;
318
- }, {
319
- currency: string;
320
- max_amount: number;
321
- window?: number | undefined;
322
- current_amount?: number | undefined;
323
- }>>;
324
- }, "strip", z.ZodTypeAny, {
325
- type: "combined";
326
- temporal?: {
327
- valid_from?: number | undefined;
328
- valid_until?: number | undefined;
329
- duration?: number | undefined;
330
- } | undefined;
331
- usage?: {
332
- max_uses: number;
333
- current_uses?: number | undefined;
334
- window?: number | undefined;
335
- } | undefined;
336
- budget?: {
337
- currency: string;
338
- max_amount: number;
339
- window?: number | undefined;
340
- current_amount?: number | undefined;
341
- } | undefined;
342
- }, {
343
- type: "combined";
344
- temporal?: {
345
- valid_from?: number | undefined;
346
- valid_until?: number | undefined;
347
- duration?: number | undefined;
348
- } | undefined;
349
- usage?: {
350
- max_uses: number;
351
- current_uses?: number | undefined;
352
- window?: number | undefined;
353
- } | undefined;
354
- budget?: {
355
- currency: string;
356
- max_amount: number;
357
- window?: number | undefined;
358
- current_amount?: number | undefined;
359
- } | undefined;
360
- }>]>;
93
+ }, z.core.$strip>>;
94
+ }, z.core.$strip>], "type">;
361
95
  /**
362
96
  * Control block schema
363
97
  */
364
98
  export declare const ControlBlockSchema: z.ZodObject<{
365
- mandate: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
99
+ mandate: z.ZodDiscriminatedUnion<[z.ZodObject<{
366
100
  type: z.ZodLiteral<"temporal">;
367
101
  valid_from: z.ZodOptional<z.ZodNumber>;
368
102
  valid_until: z.ZodOptional<z.ZodNumber>;
369
103
  duration: z.ZodOptional<z.ZodNumber>;
370
- }, "strip", z.ZodTypeAny, {
371
- type: "temporal";
372
- valid_from?: number | undefined;
373
- valid_until?: number | undefined;
374
- duration?: number | undefined;
375
- }, {
376
- type: "temporal";
377
- valid_from?: number | undefined;
378
- valid_until?: number | undefined;
379
- duration?: number | undefined;
380
- }>, z.ZodObject<{
104
+ }, z.core.$strip>, z.ZodObject<{
381
105
  type: z.ZodLiteral<"usage">;
382
106
  max_uses: z.ZodNumber;
383
107
  current_uses: z.ZodOptional<z.ZodNumber>;
384
108
  window: z.ZodOptional<z.ZodNumber>;
385
- }, "strip", z.ZodTypeAny, {
386
- type: "usage";
387
- max_uses: number;
388
- current_uses?: number | undefined;
389
- window?: number | undefined;
390
- }, {
391
- type: "usage";
392
- max_uses: number;
393
- current_uses?: number | undefined;
394
- window?: number | undefined;
395
- }>, z.ZodObject<{
109
+ }, z.core.$strip>, z.ZodObject<{
396
110
  type: z.ZodLiteral<"budget">;
397
111
  max_amount: z.ZodNumber;
398
112
  current_amount: z.ZodOptional<z.ZodNumber>;
399
113
  window: z.ZodOptional<z.ZodNumber>;
400
114
  currency: z.ZodString;
401
- }, "strip", z.ZodTypeAny, {
402
- currency: string;
403
- type: "budget";
404
- max_amount: number;
405
- window?: number | undefined;
406
- current_amount?: number | undefined;
407
- }, {
408
- currency: string;
409
- type: "budget";
410
- max_amount: number;
411
- window?: number | undefined;
412
- current_amount?: number | undefined;
413
- }>, z.ZodObject<{
115
+ }, z.core.$strip>, z.ZodObject<{
414
116
  type: z.ZodLiteral<"combined">;
415
117
  temporal: z.ZodOptional<z.ZodObject<{
416
118
  valid_from: z.ZodOptional<z.ZodNumber>;
417
119
  valid_until: z.ZodOptional<z.ZodNumber>;
418
120
  duration: z.ZodOptional<z.ZodNumber>;
419
- }, "strip", z.ZodTypeAny, {
420
- valid_from?: number | undefined;
421
- valid_until?: number | undefined;
422
- duration?: number | undefined;
423
- }, {
424
- valid_from?: number | undefined;
425
- valid_until?: number | undefined;
426
- duration?: number | undefined;
427
- }>>;
121
+ }, z.core.$strip>>;
428
122
  usage: z.ZodOptional<z.ZodObject<{
429
123
  max_uses: z.ZodNumber;
430
124
  current_uses: z.ZodOptional<z.ZodNumber>;
431
125
  window: z.ZodOptional<z.ZodNumber>;
432
- }, "strip", z.ZodTypeAny, {
433
- max_uses: number;
434
- current_uses?: number | undefined;
435
- window?: number | undefined;
436
- }, {
437
- max_uses: number;
438
- current_uses?: number | undefined;
439
- window?: number | undefined;
440
- }>>;
126
+ }, z.core.$strip>>;
441
127
  budget: z.ZodOptional<z.ZodObject<{
442
128
  max_amount: z.ZodNumber;
443
129
  current_amount: z.ZodOptional<z.ZodNumber>;
444
130
  window: z.ZodOptional<z.ZodNumber>;
445
131
  currency: z.ZodString;
446
- }, "strip", z.ZodTypeAny, {
447
- currency: string;
448
- max_amount: number;
449
- window?: number | undefined;
450
- current_amount?: number | undefined;
451
- }, {
452
- currency: string;
453
- max_amount: number;
454
- window?: number | undefined;
455
- current_amount?: number | undefined;
456
- }>>;
457
- }, "strip", z.ZodTypeAny, {
458
- type: "combined";
459
- temporal?: {
460
- valid_from?: number | undefined;
461
- valid_until?: number | undefined;
462
- duration?: number | undefined;
463
- } | undefined;
464
- usage?: {
465
- max_uses: number;
466
- current_uses?: number | undefined;
467
- window?: number | undefined;
468
- } | undefined;
469
- budget?: {
470
- currency: string;
471
- max_amount: number;
472
- window?: number | undefined;
473
- current_amount?: number | undefined;
474
- } | undefined;
475
- }, {
476
- type: "combined";
477
- temporal?: {
478
- valid_from?: number | undefined;
479
- valid_until?: number | undefined;
480
- duration?: number | undefined;
481
- } | undefined;
482
- usage?: {
483
- max_uses: number;
484
- current_uses?: number | undefined;
485
- window?: number | undefined;
486
- } | undefined;
487
- budget?: {
488
- currency: string;
489
- max_amount: number;
490
- window?: number | undefined;
491
- current_amount?: number | undefined;
492
- } | undefined;
493
- }>]>;
132
+ }, z.core.$strip>>;
133
+ }, z.core.$strip>], "type">;
494
134
  scope: z.ZodOptional<z.ZodString>;
495
135
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
496
- }, "strip", z.ZodTypeAny, {
497
- mandate: {
498
- type: "temporal";
499
- valid_from?: number | undefined;
500
- valid_until?: number | undefined;
501
- duration?: number | undefined;
502
- } | {
503
- type: "usage";
504
- max_uses: number;
505
- current_uses?: number | undefined;
506
- window?: number | undefined;
507
- } | {
508
- currency: string;
509
- type: "budget";
510
- max_amount: number;
511
- window?: number | undefined;
512
- current_amount?: number | undefined;
513
- } | {
514
- type: "combined";
515
- temporal?: {
516
- valid_from?: number | undefined;
517
- valid_until?: number | undefined;
518
- duration?: number | undefined;
519
- } | undefined;
520
- usage?: {
521
- max_uses: number;
522
- current_uses?: number | undefined;
523
- window?: number | undefined;
524
- } | undefined;
525
- budget?: {
526
- currency: string;
527
- max_amount: number;
528
- window?: number | undefined;
529
- current_amount?: number | undefined;
530
- } | undefined;
531
- };
532
- scope?: string | undefined;
533
- metadata?: Record<string, unknown> | undefined;
534
- }, {
535
- mandate: {
536
- type: "temporal";
537
- valid_from?: number | undefined;
538
- valid_until?: number | undefined;
539
- duration?: number | undefined;
540
- } | {
541
- type: "usage";
542
- max_uses: number;
543
- current_uses?: number | undefined;
544
- window?: number | undefined;
545
- } | {
546
- currency: string;
547
- type: "budget";
548
- max_amount: number;
549
- window?: number | undefined;
550
- current_amount?: number | undefined;
551
- } | {
552
- type: "combined";
553
- temporal?: {
554
- valid_from?: number | undefined;
555
- valid_until?: number | undefined;
556
- duration?: number | undefined;
557
- } | undefined;
558
- usage?: {
559
- max_uses: number;
560
- current_uses?: number | undefined;
561
- window?: number | undefined;
562
- } | undefined;
563
- budget?: {
564
- currency: string;
565
- max_amount: number;
566
- window?: number | undefined;
567
- current_amount?: number | undefined;
568
- } | undefined;
569
- };
570
- scope?: string | undefined;
571
- metadata?: Record<string, unknown> | undefined;
572
- }>;
136
+ }, z.core.$strip>;
573
137
  /**
574
138
  * Control state schema
575
139
  */
576
140
  export declare const ControlStateSchema: z.ZodObject<{
577
141
  receipt_id: z.ZodString;
578
- constraint: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
142
+ constraint: z.ZodDiscriminatedUnion<[z.ZodObject<{
579
143
  type: z.ZodLiteral<"temporal">;
580
144
  valid_from: z.ZodOptional<z.ZodNumber>;
581
145
  valid_until: z.ZodOptional<z.ZodNumber>;
582
146
  duration: z.ZodOptional<z.ZodNumber>;
583
- }, "strip", z.ZodTypeAny, {
584
- type: "temporal";
585
- valid_from?: number | undefined;
586
- valid_until?: number | undefined;
587
- duration?: number | undefined;
588
- }, {
589
- type: "temporal";
590
- valid_from?: number | undefined;
591
- valid_until?: number | undefined;
592
- duration?: number | undefined;
593
- }>, z.ZodObject<{
147
+ }, z.core.$strip>, z.ZodObject<{
594
148
  type: z.ZodLiteral<"usage">;
595
149
  max_uses: z.ZodNumber;
596
150
  current_uses: z.ZodOptional<z.ZodNumber>;
597
151
  window: z.ZodOptional<z.ZodNumber>;
598
- }, "strip", z.ZodTypeAny, {
599
- type: "usage";
600
- max_uses: number;
601
- current_uses?: number | undefined;
602
- window?: number | undefined;
603
- }, {
604
- type: "usage";
605
- max_uses: number;
606
- current_uses?: number | undefined;
607
- window?: number | undefined;
608
- }>, z.ZodObject<{
152
+ }, z.core.$strip>, z.ZodObject<{
609
153
  type: z.ZodLiteral<"budget">;
610
154
  max_amount: z.ZodNumber;
611
155
  current_amount: z.ZodOptional<z.ZodNumber>;
612
156
  window: z.ZodOptional<z.ZodNumber>;
613
157
  currency: z.ZodString;
614
- }, "strip", z.ZodTypeAny, {
615
- currency: string;
616
- type: "budget";
617
- max_amount: number;
618
- window?: number | undefined;
619
- current_amount?: number | undefined;
620
- }, {
621
- currency: string;
622
- type: "budget";
623
- max_amount: number;
624
- window?: number | undefined;
625
- current_amount?: number | undefined;
626
- }>, z.ZodObject<{
158
+ }, z.core.$strip>, z.ZodObject<{
627
159
  type: z.ZodLiteral<"combined">;
628
160
  temporal: z.ZodOptional<z.ZodObject<{
629
161
  valid_from: z.ZodOptional<z.ZodNumber>;
630
162
  valid_until: z.ZodOptional<z.ZodNumber>;
631
163
  duration: z.ZodOptional<z.ZodNumber>;
632
- }, "strip", z.ZodTypeAny, {
633
- valid_from?: number | undefined;
634
- valid_until?: number | undefined;
635
- duration?: number | undefined;
636
- }, {
637
- valid_from?: number | undefined;
638
- valid_until?: number | undefined;
639
- duration?: number | undefined;
640
- }>>;
164
+ }, z.core.$strip>>;
641
165
  usage: z.ZodOptional<z.ZodObject<{
642
166
  max_uses: z.ZodNumber;
643
167
  current_uses: z.ZodOptional<z.ZodNumber>;
644
168
  window: z.ZodOptional<z.ZodNumber>;
645
- }, "strip", z.ZodTypeAny, {
646
- max_uses: number;
647
- current_uses?: number | undefined;
648
- window?: number | undefined;
649
- }, {
650
- max_uses: number;
651
- current_uses?: number | undefined;
652
- window?: number | undefined;
653
- }>>;
169
+ }, z.core.$strip>>;
654
170
  budget: z.ZodOptional<z.ZodObject<{
655
171
  max_amount: z.ZodNumber;
656
172
  current_amount: z.ZodOptional<z.ZodNumber>;
657
173
  window: z.ZodOptional<z.ZodNumber>;
658
174
  currency: z.ZodString;
659
- }, "strip", z.ZodTypeAny, {
660
- currency: string;
661
- max_amount: number;
662
- window?: number | undefined;
663
- current_amount?: number | undefined;
664
- }, {
665
- currency: string;
666
- max_amount: number;
667
- window?: number | undefined;
668
- current_amount?: number | undefined;
669
- }>>;
670
- }, "strip", z.ZodTypeAny, {
671
- type: "combined";
672
- temporal?: {
673
- valid_from?: number | undefined;
674
- valid_until?: number | undefined;
675
- duration?: number | undefined;
676
- } | undefined;
677
- usage?: {
678
- max_uses: number;
679
- current_uses?: number | undefined;
680
- window?: number | undefined;
681
- } | undefined;
682
- budget?: {
683
- currency: string;
684
- max_amount: number;
685
- window?: number | undefined;
686
- current_amount?: number | undefined;
687
- } | undefined;
688
- }, {
689
- type: "combined";
690
- temporal?: {
691
- valid_from?: number | undefined;
692
- valid_until?: number | undefined;
693
- duration?: number | undefined;
694
- } | undefined;
695
- usage?: {
696
- max_uses: number;
697
- current_uses?: number | undefined;
698
- window?: number | undefined;
699
- } | undefined;
700
- budget?: {
701
- currency: string;
702
- max_amount: number;
703
- window?: number | undefined;
704
- current_amount?: number | undefined;
705
- } | undefined;
706
- }>]>;
175
+ }, z.core.$strip>>;
176
+ }, z.core.$strip>], "type">;
707
177
  usage_count: z.ZodOptional<z.ZodNumber>;
708
178
  spent_amount: z.ZodOptional<z.ZodNumber>;
709
179
  first_use: z.ZodOptional<z.ZodNumber>;
710
180
  last_use: z.ZodOptional<z.ZodNumber>;
711
181
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
712
- }, "strip", z.ZodTypeAny, {
713
- receipt_id: string;
714
- constraint: {
715
- type: "temporal";
716
- valid_from?: number | undefined;
717
- valid_until?: number | undefined;
718
- duration?: number | undefined;
719
- } | {
720
- type: "usage";
721
- max_uses: number;
722
- current_uses?: number | undefined;
723
- window?: number | undefined;
724
- } | {
725
- currency: string;
726
- type: "budget";
727
- max_amount: number;
728
- window?: number | undefined;
729
- current_amount?: number | undefined;
730
- } | {
731
- type: "combined";
732
- temporal?: {
733
- valid_from?: number | undefined;
734
- valid_until?: number | undefined;
735
- duration?: number | undefined;
736
- } | undefined;
737
- usage?: {
738
- max_uses: number;
739
- current_uses?: number | undefined;
740
- window?: number | undefined;
741
- } | undefined;
742
- budget?: {
743
- currency: string;
744
- max_amount: number;
745
- window?: number | undefined;
746
- current_amount?: number | undefined;
747
- } | undefined;
748
- };
749
- first_use?: number | undefined;
750
- metadata?: Record<string, unknown> | undefined;
751
- usage_count?: number | undefined;
752
- spent_amount?: number | undefined;
753
- last_use?: number | undefined;
754
- }, {
755
- receipt_id: string;
756
- constraint: {
757
- type: "temporal";
758
- valid_from?: number | undefined;
759
- valid_until?: number | undefined;
760
- duration?: number | undefined;
761
- } | {
762
- type: "usage";
763
- max_uses: number;
764
- current_uses?: number | undefined;
765
- window?: number | undefined;
766
- } | {
767
- currency: string;
768
- type: "budget";
769
- max_amount: number;
770
- window?: number | undefined;
771
- current_amount?: number | undefined;
772
- } | {
773
- type: "combined";
774
- temporal?: {
775
- valid_from?: number | undefined;
776
- valid_until?: number | undefined;
777
- duration?: number | undefined;
778
- } | undefined;
779
- usage?: {
780
- max_uses: number;
781
- current_uses?: number | undefined;
782
- window?: number | undefined;
783
- } | undefined;
784
- budget?: {
785
- currency: string;
786
- max_amount: number;
787
- window?: number | undefined;
788
- current_amount?: number | undefined;
789
- } | undefined;
790
- };
791
- first_use?: number | undefined;
792
- metadata?: Record<string, unknown> | undefined;
793
- usage_count?: number | undefined;
794
- spent_amount?: number | undefined;
795
- last_use?: number | undefined;
796
- }>;
182
+ }, z.core.$strip>;
797
183
  export { ControlPurposeSchema, ControlLicensingModeSchema, ControlDecisionSchema, ControlStepSchema, ControlBlockSchema as ChainControlBlockSchema, } from '@peac/schema';
798
184
  //# sourceMappingURL=validators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8DxB;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;EAWjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ7B,CAAC;AAOH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EAKjB,kBAAkB,IAAI,uBAAuB,GAC9C,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8DxB;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;iBAsBpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;iBAWjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;iBAWlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;iBAQpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAK3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ7B,CAAC;AAOH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EAKjB,kBAAkB,IAAI,uBAAuB,GAC9C,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peac/control",
3
- "version": "0.10.13",
3
+ "version": "0.11.0",
4
4
  "description": "PEAC Protocol Control - control engine interfaces and validation",
5
5
  "main": "dist/index.cjs",
6
6
  "types": "dist/index.d.ts",
@@ -19,11 +19,11 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "zod": "^3.22.4",
23
- "@peac/schema": "0.10.13"
22
+ "zod": "^4.3.6",
23
+ "@peac/schema": "0.11.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@types/node": "^20.19.33",
26
+ "@types/node": "^22.19.11",
27
27
  "typescript": "^5.3.3",
28
28
  "vitest": "^4.0.0",
29
29
  "tsup": "^8.0.0"