hierarchical-approval 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +968 -0
- package/dist/ApprovalEngine-BcnLzfAU.d.cts +426 -0
- package/dist/ApprovalEngine-DdZtyeB5.d.ts +426 -0
- package/dist/IStorageAdapter-RAiLF8bc.d.cts +192 -0
- package/dist/IStorageAdapter-RAiLF8bc.d.ts +192 -0
- package/dist/adapters/MemoryAdapter.cjs +189 -0
- package/dist/adapters/MemoryAdapter.cjs.map +1 -0
- package/dist/adapters/MemoryAdapter.d.cts +22 -0
- package/dist/adapters/MemoryAdapter.d.ts +22 -0
- package/dist/adapters/MemoryAdapter.js +187 -0
- package/dist/adapters/MemoryAdapter.js.map +1 -0
- package/dist/adapters/PostgresAdapter.cjs +468 -0
- package/dist/adapters/PostgresAdapter.cjs.map +1 -0
- package/dist/adapters/PostgresAdapter.d.cts +45 -0
- package/dist/adapters/PostgresAdapter.d.ts +45 -0
- package/dist/adapters/PostgresAdapter.js +466 -0
- package/dist/adapters/PostgresAdapter.js.map +1 -0
- package/dist/index.cjs +1759 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +40 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +1742 -0
- package/dist/index.js.map +1 -0
- package/dist/testing.cjs +1797 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +24 -0
- package/dist/testing.d.ts +24 -0
- package/dist/testing.js +1790 -0
- package/dist/testing.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/validate.ts","../src/utils/EventBus.ts","../src/utils/Logger.ts","../src/utils/Clock.ts","../src/utils/IdGenerator.ts","../src/errors.ts","../src/engine/TemplateRegistry.ts","../src/engine/LevelResolver.ts","../src/engine/EscalationScheduler.ts","../src/engine/ConditionEvaluator.ts","../src/engine/StateMachine.ts","../src/engine/ApprovalEngine.ts","../src/adapters/MemoryAdapter.ts"],"names":["z","EventEmitter","p","createHash"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod';\n\nexport const SubmitOptionsSchema = z.object({\n templateName: z.string().min(1),\n documentId: z.string().min(1),\n documentType: z.string().min(1),\n submittedBy: z.string().min(1),\n data: z.record(z.string(), z.unknown()).default({}),\n metadata: z.record(z.string(), z.unknown()).default({}),\n expiresAt: z.coerce.date().optional(),\n deadlineAction: z.enum(['cancel', 'reject']).optional(),\n});\n\nexport const ApproveOptionsSchema = z.object({\n approverId: z.string().min(1),\n comment: z.string().optional(),\n});\n\nexport const RejectOptionsSchema = z.object({\n approverId: z.string().min(1),\n reason: z.string().min(1),\n returnTo: z.enum(['originator', 'previous']).optional(),\n});\n\nexport const DelegateOptionsSchema = z.object({\n fromApprover: z.string().min(1),\n toApprover: z.string().min(1),\n reason: z.string().min(1),\n until: z.coerce.date().optional(),\n});\n\nexport const CancelOptionsSchema = z.object({\n cancelledBy: z.string().min(1),\n reason: z.string().min(1),\n});\n\nexport const EscalateOptionsSchema = z.object({\n escalatedBy: z.string().min(1),\n});\n\nexport const ResubmitOptionsSchema = z.object({\n resubmittedBy: z.string().min(1),\n reason: z.string().optional(),\n updatedData: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const AddCommentOptionsSchema = z.object({\n actorId: z.string().min(1),\n comment: z.string().min(1),\n});\n\nexport const OverrideOptionsSchema = z.object({\n overriddenBy: z.string().min(1),\n justification: z.string().min(1),\n});\n\nexport type SubmitOptions = z.infer<typeof SubmitOptionsSchema>;\nexport type ApproveOptions = z.infer<typeof ApproveOptionsSchema>;\nexport type RejectOptions = z.infer<typeof RejectOptionsSchema>;\nexport type DelegateOptions = z.infer<typeof DelegateOptionsSchema>;\nexport type CancelOptions = z.infer<typeof CancelOptionsSchema>;\nexport type EscalateOptions = z.infer<typeof EscalateOptionsSchema>;\nexport type ResubmitOptions = z.infer<typeof ResubmitOptionsSchema>;\nexport type AddCommentOptions = z.infer<typeof AddCommentOptionsSchema>;\nexport type OverrideOptions = z.infer<typeof OverrideOptionsSchema>;\n","import EventEmitter from 'eventemitter3';\nimport type { ApprovalEventMap, ApprovalEventName } from '../types/index.js';\n\nexport class EventBus {\n private emitter = new EventEmitter();\n\n emit<K extends ApprovalEventName>(event: K, payload: ApprovalEventMap[K]): void {\n this.emitter.emit(event, payload);\n }\n\n on<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n ): this {\n this.emitter.on(event, listener as (...args: unknown[]) => void);\n return this;\n }\n\n off<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n ): this {\n this.emitter.off(event, listener as (...args: unknown[]) => void);\n return this;\n }\n\n once<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n ): this {\n this.emitter.once(event, listener as (...args: unknown[]) => void);\n return this;\n }\n}\n","export interface Logger {\n info(msg: string, context?: Record<string, unknown>): void;\n warn(msg: string, context?: Record<string, unknown>): void;\n error(msg: string, err?: unknown, context?: Record<string, unknown>): void;\n debug(msg: string, context?: Record<string, unknown>): void;\n}\n\nexport const noopLogger: Logger = {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n};\n","export interface Clock {\n now(): Date;\n}\n\nexport const systemClock: Clock = { now: () => new Date() };\n","export type IdGeneratorFn = (prefix: 'inst' | 'tpl') => string;\n\nexport const defaultIdGenerator: IdGeneratorFn = (prefix) =>\n `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n","export class ApprovalError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = 'ApprovalError';\n }\n\n toJSON(): { code: string; message: string; name: string } {\n return { code: this.code, message: this.message, name: this.name };\n }\n\n toHttpStatus(): number {\n const map: Record<string, number> = {\n NOT_FOUND: 404,\n CONFLICT: 409,\n FORBIDDEN: 403,\n VALIDATION: 422,\n TEMPLATE_NOT_FOUND: 404,\n };\n return map[this.code] ?? 500;\n }\n}\n\nexport class ApprovalNotFoundError extends ApprovalError {\n constructor(resource: string, id: string) {\n super(`${resource} \"${id}\" not found.`, 'NOT_FOUND');\n this.name = 'ApprovalNotFoundError';\n }\n}\n\nexport class ApprovalConflictError extends ApprovalError {\n constructor(instanceId: string) {\n super(\n `Concurrent modification detected on instance \"${instanceId}\". The record was updated by another process. Please retry.`,\n 'CONFLICT',\n );\n this.name = 'ApprovalConflictError';\n }\n}\n\nexport class ApprovalForbiddenError extends ApprovalError {\n constructor(message: string) {\n super(message, 'FORBIDDEN');\n this.name = 'ApprovalForbiddenError';\n }\n}\n\nexport class ApprovalValidationError extends ApprovalError {\n constructor(\n message: string,\n public readonly cause?: unknown,\n ) {\n super(message, 'VALIDATION');\n this.name = 'ApprovalValidationError';\n }\n}\n\nexport class ApprovalTemplateNotFoundError extends ApprovalError {\n constructor(name: string) {\n super(`Template \"${name}\" not found.`, 'TEMPLATE_NOT_FOUND');\n this.name = 'ApprovalTemplateNotFoundError';\n }\n}\n","import type { IStorageAdapter } from '../adapters/IStorageAdapter.js';\nimport type { ApprovalTemplateConfig, ApprovalTemplate } from '../types/index.js';\nimport { ApprovalTemplateNotFoundError, ApprovalValidationError } from '../errors.js';\nimport type { Clock } from '../utils/Clock.js';\nimport { systemClock } from '../utils/Clock.js';\nimport type { IdGeneratorFn } from '../utils/IdGenerator.js';\nimport { defaultIdGenerator } from '../utils/IdGenerator.js';\n\nexport class TemplateRegistry {\n private readonly clock: Clock;\n private readonly generateId: IdGeneratorFn;\n\n constructor(\n private readonly adapter: IStorageAdapter,\n private readonly tenantId: string,\n opts?: { clock?: Clock; generateId?: IdGeneratorFn },\n ) {\n this.clock = opts?.clock ?? systemClock;\n this.generateId = opts?.generateId ?? defaultIdGenerator;\n }\n\n async define(config: ApprovalTemplateConfig): Promise<string> {\n const existing = await this.adapter.getTemplate(this.tenantId, config.name);\n if (existing) {\n throw new ApprovalValidationError(\n `Template \"${config.name}\" already exists for this tenant. Delete it first or use engine.updateTemplate() to modify it.`,\n );\n }\n const id = this.generateId('tpl');\n const template: ApprovalTemplate = {\n ...config,\n id,\n tenantId: this.tenantId,\n createdAt: this.clock.now(),\n version: 1,\n };\n await this.adapter.saveTemplate(template);\n return id;\n }\n\n /** Update an existing template, incrementing its version. Throws if the template doesn't exist. */\n async update(config: ApprovalTemplateConfig): Promise<string> {\n const existing = await this.adapter.getTemplate(this.tenantId, config.name);\n if (!existing) {\n throw new ApprovalTemplateNotFoundError(config.name);\n }\n const newId = this.generateId('tpl');\n const updated: ApprovalTemplate = {\n ...config,\n id: newId,\n tenantId: this.tenantId,\n createdAt: existing.createdAt,\n version: (existing.version ?? 1) + 1,\n previousVersionId: existing.id,\n };\n await this.adapter.saveTemplate(updated);\n return newId;\n }\n\n async get(name: string): Promise<ApprovalTemplate> {\n const template = await this.adapter.getTemplate(this.tenantId, name);\n if (!template) throw new ApprovalTemplateNotFoundError(name);\n return template;\n }\n\n async list(): Promise<ApprovalTemplate[]> {\n return this.adapter.listTemplates(this.tenantId);\n }\n}\n","import type { ApproverConfig, ResolverFn } from '../types/index.js';\nimport { ApprovalValidationError } from '../errors.js';\n\nexport interface OrgProvider {\n getUsersByRole(role: string, tenantId?: string): Promise<string[]> | string[];\n /** Optional: resolve users by department name. */\n getUsersByDepartment?(dept: string, tenantId?: string): Promise<string[]> | string[];\n /** Optional: resolve the direct manager of a user. */\n getManagerOf?(userId: string, tenantId?: string): Promise<string | null> | string | null;\n /** Optional: resolve the skip-level manager of a user. */\n getSkipLevelManagerOf?(userId: string, tenantId?: string): Promise<string | null> | string | null;\n /** Optional: resolve users matching a custom attribute/value pair. */\n getUsersByAttribute?(attr: string, value: unknown, tenantId?: string): Promise<string[]> | string[];\n}\n\nexport type ApproverResolverFn = (\n config: Record<string, unknown>,\n ctx: { submittedBy: string; data: Record<string, unknown>; orgProvider?: OrgProvider },\n) => Promise<string[]> | string[];\n\nexport class LevelResolver {\n private resolvers = new Map<string, ResolverFn>();\n private approverTypes = new Map<string, ApproverResolverFn>();\n\n register(name: string, fn: ResolverFn): void {\n this.resolvers.set(name, fn);\n }\n\n registerApproverType(typeName: string, fn: ApproverResolverFn): void {\n this.approverTypes.set(typeName, fn);\n }\n\n async resolveApprovers(\n approvers: ApproverConfig[],\n submittedBy: string,\n data: Record<string, unknown>,\n orgProvider?: OrgProvider,\n ): Promise<string[]> {\n const resolved: string[] = [];\n\n for (const approver of approvers) {\n switch (approver.type) {\n case 'user':\n resolved.push((approver as { type: 'user'; userId: string }).userId);\n break;\n case 'role': {\n if (!orgProvider) {\n throw new Error(\n `Cannot resolve role \"${(approver as { type: 'role'; role: string }).role}\" without an orgProvider configured on ApprovalEngine.`,\n );\n }\n const users = await orgProvider.getUsersByRole(\n (approver as { type: 'role'; role: string }).role,\n );\n resolved.push(...users);\n break;\n }\n case 'dynamic': {\n const fn = this.resolvers.get((approver as { type: 'dynamic'; resolver: string }).resolver);\n if (!fn) {\n throw new Error(\n `No resolver registered for \"${(approver as { type: 'dynamic'; resolver: string }).resolver}\". Call engine.registerResolver(\"${(approver as { type: 'dynamic'; resolver: string }).resolver}\", fn) first.`,\n );\n }\n const userId = await fn(submittedBy, data);\n resolved.push(userId);\n break;\n }\n default: {\n // Custom approver type registered via engine.registerApproverType()\n const customFn = this.approverTypes.get(approver.type);\n if (!customFn) {\n throw new ApprovalValidationError(\n `Unknown approver type \"${approver.type}\". Register it with engine.registerApproverType(\"${approver.type}\", fn) first.`,\n );\n }\n const ids = await customFn(approver as Record<string, unknown>, { submittedBy, data, orgProvider });\n resolved.push(...ids);\n break;\n }\n }\n }\n\n const result = [...new Set(resolved)];\n if (result.length === 0) {\n throw new ApprovalValidationError(\n 'No approvers resolved for this level. Check your approver configuration — role may have no members or dynamic resolver returned empty.',\n );\n }\n return result;\n }\n}\n","import type { IStorageAdapter } from '../adapters/IStorageAdapter.js';\nimport type { Logger } from '../utils/Logger.js';\nimport { noopLogger } from '../utils/Logger.js';\nimport type { Clock } from '../utils/Clock.js';\nimport { systemClock } from '../utils/Clock.js';\n\nexport interface EscalationSchedulerOpts {\n adapter: IStorageAdapter;\n tenantId: string;\n onEscalate: (instanceId: string) => Promise<void>;\n onExpire?: (instanceId: string, deadlineAction: 'cancel' | 'reject') => Promise<void>;\n onSlaBreach?: (instanceId: string) => Promise<void>;\n onRevertDelegation?: (instanceId: string, levelNumber: number, fromApprover: string) => Promise<void>;\n pollIntervalMs?: number;\n logger?: Logger;\n clock?: Clock;\n}\n\nexport class EscalationScheduler {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private tickPromise: Promise<void> | null = null;\n lastTickAt: Date | null = null;\n\n private readonly adapter: IStorageAdapter;\n private readonly tenantId: string;\n private readonly onEscalate: EscalationSchedulerOpts['onEscalate'];\n private readonly onExpire?: EscalationSchedulerOpts['onExpire'];\n private readonly onSlaBreach?: EscalationSchedulerOpts['onSlaBreach'];\n private readonly onRevertDelegation?: EscalationSchedulerOpts['onRevertDelegation'];\n private readonly pollIntervalMs: number;\n private readonly logger: Logger;\n private readonly clock: Clock;\n\n constructor(opts: EscalationSchedulerOpts) {\n this.adapter = opts.adapter;\n this.tenantId = opts.tenantId;\n this.onEscalate = opts.onEscalate;\n this.onExpire = opts.onExpire;\n this.onSlaBreach = opts.onSlaBreach;\n this.onRevertDelegation = opts.onRevertDelegation;\n this.pollIntervalMs = opts.pollIntervalMs ?? 60_000;\n this.logger = opts.logger ?? noopLogger;\n this.clock = opts.clock ?? systemClock;\n }\n\n get isRunning(): boolean {\n return this.intervalId !== null;\n }\n\n start(): void {\n if (this.intervalId !== null) return;\n this.intervalId = setInterval(() => {\n this.tickPromise = this.tick().catch((err) => {\n this.logger.error('EscalationScheduler: unhandled error in tick', err, { tenantId: this.tenantId });\n }).finally(() => { this.tickPromise = null; });\n }, this.pollIntervalMs);\n }\n\n async stop(): Promise<void> {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n // Wait for any in-progress tick to finish\n if (this.tickPromise) {\n await this.tickPromise;\n }\n }\n\n async tick(): Promise<void> {\n this.lastTickAt = this.clock.now();\n const now = this.lastTickAt;\n\n let instances;\n try {\n instances = await this.adapter.getOverdueInstances(this.tenantId, now);\n } catch (err) {\n this.logger.error('EscalationScheduler: failed to fetch overdue instances', err, {\n tenantId: this.tenantId,\n });\n return;\n }\n\n for (const instance of instances) {\n try {\n // 1. Check delegation expiry — revert before other checks\n if (this.onRevertDelegation) {\n for (const level of instance.levels) {\n if (\n level.delegatedUntil &&\n new Date(level.delegatedUntil) <= now &&\n level.status === 'pending' &&\n level.delegatedFrom\n ) {\n try {\n await this.onRevertDelegation(instance.id, level.level, level.delegatedFrom);\n } catch (err) {\n this.logger.error('EscalationScheduler: failed to revert delegation', err, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n levelNumber: level.level,\n });\n }\n }\n }\n }\n\n // 2. Check instance expiry — takes priority over escalation\n if (instance.expiresAt && new Date(instance.expiresAt) <= now) {\n if (this.onExpire) {\n await this.onExpire(instance.id, instance.deadlineAction ?? 'cancel');\n this.logger.debug('EscalationScheduler: expired instance', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n deadlineAction: instance.deadlineAction ?? 'cancel',\n });\n }\n continue;\n }\n\n // 3. Check SLA breach (non-blocking — escalation still runs)\n if (\n instance.slaDeadlineAt &&\n new Date(instance.slaDeadlineAt) <= now &&\n !instance.slaBreachedAt\n ) {\n if (this.onSlaBreach) {\n try {\n await this.onSlaBreach(instance.id);\n this.logger.warn('EscalationScheduler: SLA breached', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n slaDeadlineAt: instance.slaDeadlineAt,\n });\n } catch (err) {\n this.logger.error('EscalationScheduler: failed to record SLA breach', err, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\n }\n }\n }\n\n // 4. Check escalation\n const currentLevel = instance.levels.find((l) => l.level === instance.currentLevel);\n if (currentLevel?.escalationDueAt && new Date(currentLevel.escalationDueAt) <= now) {\n await this.onEscalate(instance.id);\n this.logger.debug('EscalationScheduler: escalated instance', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\n }\n } catch (err) {\n this.logger.error('EscalationScheduler: failed to process instance', err, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\n }\n }\n }\n\n static computeEscalationDue(\n escalationAfterDays: number,\n fromDate: Date,\n ): Date | undefined {\n if (escalationAfterDays <= 0) return undefined;\n const due = new Date(fromDate);\n due.setDate(due.getDate() + escalationAfterDays);\n return due;\n }\n}\n","import type { Condition, ConditionRule, ApprovalLevelConfig } from '../types/index.js';\nimport { ApprovalValidationError } from '../errors.js';\n\nexport type ConditionOperatorFn = (actual: unknown, expected: unknown) => boolean;\n\n// Built-in operators seeded at module load time.\nconst operatorRegistry = new Map<string, ConditionOperatorFn>([\n ['>', (a, e) => Number(a) > Number(e)],\n ['<', (a, e) => Number(a) < Number(e)],\n ['>=', (a, e) => Number(a) >= Number(e)],\n ['<=', (a, e) => Number(a) <= Number(e)],\n ['==', (a, e) => a === e],\n ['!=', (a, e) => a !== e],\n ['in', (a, e) => Array.isArray(e) && e.includes(a)],\n ['not_in', (a, e) => Array.isArray(e) && !e.includes(a)],\n]);\n\n/** Register a custom condition operator globally. Throws if the name is already taken by a built-in. */\nexport function registerConditionOperator(name: string, fn: ConditionOperatorFn): void {\n operatorRegistry.set(name, fn);\n}\n\nfunction getField(data: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((obj, key) => {\n if (obj !== null && typeof obj === 'object' && key in obj) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, data);\n}\n\nfunction evaluateCondition(condition: Condition, data: Record<string, unknown>): boolean {\n const fn = operatorRegistry.get(condition.operator);\n if (!fn) {\n throw new ApprovalValidationError(\n `Unknown condition operator \"${condition.operator}\". Register it with engine.registerConditionOperator() or use a built-in: ${[...operatorRegistry.keys()].join(', ')}.`,\n );\n }\n const actual = getField(data, condition.field);\n return fn(actual, condition.value);\n}\n\nfunction evaluateRule(rule: Condition | Condition[], data: Record<string, unknown>): boolean {\n if (Array.isArray(rule)) {\n return rule.every((c) => evaluateCondition(c, data));\n }\n return evaluateCondition(rule, data);\n}\n\nexport interface LevelMutations {\n addLevels: ApprovalLevelConfig[];\n skipLevels: Set<number>;\n}\n\nexport function evaluateConditions(\n conditions: ConditionRule[],\n data: Record<string, unknown>,\n): LevelMutations {\n const mutations: LevelMutations = { addLevels: [], skipLevels: new Set() };\n\n for (const rule of conditions) {\n if (evaluateRule(rule.when, data)) {\n if (rule.addLevels) mutations.addLevels.push(...rule.addLevels);\n if (rule.skipLevels) rule.skipLevels.forEach((l) => mutations.skipLevels.add(l));\n }\n }\n\n return mutations;\n}\n","import type { ApprovalInstance, ApprovalLevelInstance } from '../types/index.js';\nimport { ApprovalError, ApprovalForbiddenError, ApprovalValidationError } from '../errors.js';\n\nexport { ApprovalError };\n\nexport function assertStatus(\n instance: ApprovalInstance,\n expected: ApprovalInstance['status'],\n): void {\n if (instance.status !== expected) {\n throw new ApprovalError(\n `Expected instance status \"${expected}\" but got \"${instance.status}\".`,\n 'INVALID_STATUS',\n );\n }\n}\n\nexport function assertApproverOnLevel(level: ApprovalLevelInstance, approverId: string): void {\n if (!level.approverIds.includes(approverId)) {\n throw new ApprovalForbiddenError(\n `User \"${approverId}\" is not an approver for level ${level.level}.`,\n );\n }\n}\n\nexport function hasAlreadyActed(level: ApprovalLevelInstance, approverId: string): boolean {\n return level.approvedBy.includes(approverId) || level.rejectedBy.includes(approverId);\n}\n\nexport function isLevelApproved(level: ApprovalLevelInstance): boolean {\n const { mode, approverIds, approvedBy } = level;\n const total = approverIds.length;\n if (total === 0) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") has no approvers. Ensure resolvers return at least one user.`,\n );\n }\n const count = approvedBy.length;\n\n switch (mode) {\n case 'any':\n return count >= 1;\n case 'all':\n return count >= total;\n case 'majority':\n return count > Math.floor(total / 2);\n }\n}\n\nexport function isLevelRejected(level: ApprovalLevelInstance): boolean {\n const { mode, approverIds, rejectedBy } = level;\n const total = approverIds.length;\n if (total === 0) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") has no approvers. Ensure resolvers return at least one user.`,\n );\n }\n const rejectCount = rejectedBy.length;\n\n switch (mode) {\n case 'any':\n return rejectCount >= total;\n case 'all':\n return rejectCount >= 1;\n case 'majority':\n return rejectCount > Math.floor(total / 2);\n }\n}\n","import { createHash } from 'node:crypto';\nimport type { IStorageAdapter, InstanceFilter, PaginationOpts, PaginatedResult, CursorPaginationOpts, CursorPaginatedResult } from '../adapters/IStorageAdapter.js';\nimport type {\n ApprovalTemplate,\n ApprovalTemplateConfig,\n ApprovalInstance,\n ApprovalLevelInstance,\n AuditEntry,\n AuditContext,\n ResolverFn,\n ApprovalEventName,\n ApprovalEventMap,\n ApprovalMode,\n} from '../types/index.js';\nimport {\n SubmitOptionsSchema,\n ApproveOptionsSchema,\n RejectOptionsSchema,\n DelegateOptionsSchema,\n CancelOptionsSchema,\n EscalateOptionsSchema,\n ResubmitOptionsSchema,\n AddCommentOptionsSchema,\n OverrideOptionsSchema,\n type SubmitOptions,\n type ApproveOptions,\n type RejectOptions,\n type DelegateOptions,\n type CancelOptions,\n type EscalateOptions,\n type ResubmitOptions,\n type AddCommentOptions,\n type OverrideOptions,\n} from '../utils/validate.js';\nimport { EventBus } from '../utils/EventBus.js';\nimport type { Logger } from '../utils/Logger.js';\nimport { noopLogger } from '../utils/Logger.js';\nimport type { Clock } from '../utils/Clock.js';\nimport { systemClock } from '../utils/Clock.js';\nimport type { IdGeneratorFn } from '../utils/IdGenerator.js';\nimport { defaultIdGenerator } from '../utils/IdGenerator.js';\nimport { TemplateRegistry } from './TemplateRegistry.js';\nimport { LevelResolver, type OrgProvider, type ApproverResolverFn } from './LevelResolver.js';\nimport { EscalationScheduler } from './EscalationScheduler.js';\nimport { evaluateConditions, registerConditionOperator, type ConditionOperatorFn } from './ConditionEvaluator.js';\nimport {\n assertStatus,\n assertApproverOnLevel,\n hasAlreadyActed,\n isLevelApproved,\n isLevelRejected,\n} from './StateMachine.js';\nimport {\n ApprovalError,\n ApprovalNotFoundError,\n ApprovalConflictError,\n ApprovalForbiddenError,\n ApprovalValidationError,\n} from '../errors.js';\nimport type { INotificationAdapter } from '../adapters/INotificationAdapter.js';\nimport type { IAuditAdapter } from '../adapters/IAuditAdapter.js';\nimport type { IMetricsAdapter } from '../adapters/IMetricsAdapter.js';\nimport type { ISchedulerAdapter } from '../adapters/ISchedulerAdapter.js';\nimport type { IAuthorizationPolicy, AuthorizationContext } from './IAuthorizationPolicy.js';\nimport type { IOperationMiddleware, OperationContext } from './IOperationMiddleware.js';\n\nexport { ApprovalError } from '../errors.js';\nexport {\n ApprovalNotFoundError,\n ApprovalConflictError,\n ApprovalForbiddenError,\n ApprovalValidationError,\n ApprovalTemplateNotFoundError,\n} from '../errors.js';\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 50;\nconst TERMINAL_STATUSES = new Set<ApprovalInstance['status']>(['approved', 'rejected', 'cancelled', 'expired']);\n\n// ─── Exported result types ─────────────────────────────────────────────────\n\nexport interface ValidationResult {\n valid: boolean;\n errors: Array<{ field: string; message: string }>;\n}\n\nexport interface CanApproveResult {\n eligible: boolean;\n reason?: 'not_an_approver' | 'already_acted' | 'self_approval' | 'wrong_status' | 'delegated_away';\n}\n\nexport interface PreviewChainLevel {\n level: number;\n name: string;\n resolvedApprovers: string[];\n mode: ApprovalMode;\n}\n\nexport interface PreviewResult {\n levels: PreviewChainLevel[];\n /** Indices (0-based) of conditions that fired for this data. */\n conditionsApplied: number[];\n}\n\nexport interface BulkResult {\n succeeded: ApprovalInstance[];\n failed: Array<{ instanceId: string; error: ApprovalError }>;\n total: number;\n}\n\nexport interface HealthResult {\n status: 'healthy' | 'degraded' | 'unhealthy';\n adapter: 'connected' | 'error';\n pendingCount: number;\n overdueCount: number;\n escalationRunning: boolean;\n lastTickAt?: Date;\n}\n\nexport interface RetryPolicy {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs?: number;\n jitter?: boolean;\n}\n\nexport type IdempotencyKeyFn = (\n tenantId: string,\n documentType: string,\n documentId: string,\n templateName: string,\n data: Record<string, unknown>,\n) => string;\n\n// ─── Engine options ────────────────────────────────────────────────────────\n\nexport interface ApprovalEngineOptions {\n adapter: IStorageAdapter;\n tenantId?: string;\n orgProvider?: OrgProvider;\n logger?: Logger;\n escalationPollIntervalMs?: number;\n /** Maximum number of instances allowed in a single bulk operation. Default: 200. */\n maxBulkItems?: number;\n /** Injectable clock — defaults to system clock. Enables deterministic tests and custom time sources. */\n clock?: Clock;\n /** Custom ID generator for instances and templates. Defaults to timestamp+random. */\n generateId?: IdGeneratorFn;\n /** Custom optimistic locking retry policy. */\n retryPolicy?: RetryPolicy;\n /** Custom idempotency key derivation function. Default: SHA-256 of tenant+documentType+documentId+templateName. */\n idempotencyKeyFn?: IdempotencyKeyFn;\n /** Notification adapter called after every approval event. */\n notificationAdapter?: INotificationAdapter;\n /** Separate append-only audit sink (Kafka, S3, CloudTrail). Called alongside storage adapter. */\n auditAdapter?: IAuditAdapter;\n /** Metrics adapter for Prometheus / Datadog / OpenTelemetry. */\n metricsAdapter?: IMetricsAdapter;\n /** Custom scheduler adapter (BullMQ, Temporal, cron). Replaces built-in setInterval polling. */\n schedulerAdapter?: ISchedulerAdapter;\n /** Authorization policy called before every mutating operation. */\n authorizationPolicy?: IAuthorizationPolicy;\n /** Middleware chain: before/after/onError hooks for every operation. */\n middleware?: IOperationMiddleware[];\n}\n\n// ─── Engine ───────────────────────────────────────────────────────────────\n\nexport class ApprovalEngine {\n private readonly bus = new EventBus();\n private readonly registry: TemplateRegistry;\n private readonly resolver: LevelResolver;\n private readonly escalation: EscalationScheduler;\n private readonly tenantId: string;\n private readonly logger: Logger;\n private readonly clock: Clock;\n private readonly generateId: IdGeneratorFn;\n private readonly maxBulkItems: number;\n private readonly retryPolicy: Required<RetryPolicy>;\n private readonly idempotencyKeyFn: IdempotencyKeyFn;\n\n constructor(private readonly opts: ApprovalEngineOptions) {\n this.tenantId = opts.tenantId ?? 'default';\n this.logger = opts.logger ?? noopLogger;\n this.clock = opts.clock ?? systemClock;\n this.generateId = opts.generateId ?? defaultIdGenerator;\n this.maxBulkItems = opts.maxBulkItems ?? 200;\n this.retryPolicy = {\n maxAttempts: opts.retryPolicy?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,\n baseDelayMs: opts.retryPolicy?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS,\n maxDelayMs: opts.retryPolicy?.maxDelayMs ?? Infinity,\n jitter: opts.retryPolicy?.jitter ?? true,\n };\n this.idempotencyKeyFn = opts.idempotencyKeyFn ?? defaultIdempotencyKeyFn;\n\n this.registry = new TemplateRegistry(opts.adapter, this.tenantId, {\n clock: this.clock,\n generateId: this.generateId,\n });\n this.resolver = new LevelResolver();\n this.escalation = new EscalationScheduler({\n adapter: opts.adapter,\n tenantId: this.tenantId,\n onEscalate: async (id) => { await this.escalateInternal(id); },\n onExpire: async (id, action) => { await this.expireInstance(id, action); },\n onSlaBreach: async (id) => { await this.markSlaBreached(id); },\n onRevertDelegation: async (id, level, from) => { await this.revertDelegation(id, level, from); },\n pollIntervalMs: opts.escalationPollIntervalMs ?? 60_000,\n logger: this.logger,\n clock: this.clock,\n });\n this.escalation.start();\n }\n\n on<K extends ApprovalEventName>(event: K, listener: (payload: ApprovalEventMap[K]) => void) {\n this.bus.on(event, listener);\n return this;\n }\n\n off<K extends ApprovalEventName>(event: K, listener: (payload: ApprovalEventMap[K]) => void) {\n this.bus.off(event, listener);\n return this;\n }\n\n registerResolver(name: string, fn: ResolverFn): void {\n this.resolver.register(name, fn);\n }\n\n registerApproverType(typeName: string, fn: ApproverResolverFn): void {\n this.resolver.registerApproverType(typeName, fn);\n }\n\n registerConditionOperator(name: string, fn: ConditionOperatorFn): void {\n registerConditionOperator(name, fn);\n }\n\n // ─── Template management ──────────────────────────────────────────────────\n\n /** Validate a template config without persisting. Synchronous; never throws. */\n validateTemplate(config: ApprovalTemplateConfig): ValidationResult {\n const errors: Array<{ field: string; message: string }> = [];\n\n if (!config.levels || config.levels.length === 0) {\n errors.push({ field: 'levels', message: 'Template must have at least one level.' });\n } else {\n const levelNums = new Set<number>();\n config.levels.forEach((l, i) => {\n if (levelNums.has(l.level)) {\n errors.push({ field: `levels[${i}].level`, message: `Duplicate level number: ${l.level}.` });\n }\n levelNums.add(l.level);\n\n if (!l.approvers || l.approvers.length === 0) {\n errors.push({ field: `levels[${i}].approvers`, message: `Level ${l.level} must have at least one approver.` });\n }\n if (l.escalationAfterDays !== undefined && l.escalationAfterDays <= 0) {\n errors.push({ field: `levels[${i}].escalationAfterDays`, message: `Level ${l.level} escalationAfterDays must be a positive number.` });\n }\n });\n }\n\n if (config.conditions) {\n config.conditions.forEach((rule, ruleIdx) => {\n if (rule.addLevels) {\n rule.addLevels.forEach((al, alIdx) => {\n const conflictsWithStatic = config.levels.some((l) => l.level === al.level);\n if (conflictsWithStatic) {\n errors.push({\n field: `conditions[${ruleIdx}].addLevels[${alIdx}].level`,\n message: `Level ${al.level} in addLevels conflicts with an existing static level.`,\n });\n }\n if (rule.skipLevels?.includes(al.level)) {\n errors.push({\n field: `conditions[${ruleIdx}].addLevels[${alIdx}].level`,\n message: `Level ${al.level} appears in both addLevels and skipLevels in the same condition.`,\n });\n }\n });\n }\n });\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n async defineTemplate(config: ApprovalTemplateConfig): Promise<string> {\n const validation = this.validateTemplate(config);\n if (!validation.valid) {\n const first = validation.errors[0];\n throw new ApprovalValidationError(\n `Invalid template configuration: ${first?.message ?? 'unknown error'}`,\n );\n }\n return this.registry.define(config);\n }\n\n /** Update an existing template, incrementing its version. In-flight instances are protected by their templateSnapshot. */\n async updateTemplate(config: ApprovalTemplateConfig): Promise<string> {\n const validation = this.validateTemplate(config);\n if (!validation.valid) {\n const first = validation.errors[0];\n throw new ApprovalValidationError(\n `Invalid template configuration: ${first?.message ?? 'unknown error'}`,\n );\n }\n return this.registry.update(config);\n }\n\n async getTemplate(name: string): Promise<ApprovalTemplate> {\n return this.registry.get(name);\n }\n\n async listTemplates(): Promise<ApprovalTemplate[]> {\n return this.registry.list();\n }\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────\n\n async submit(raw: SubmitOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => SubmitOptionsSchema.parse(raw));\n const startMs = this.clock.now().getTime();\n const template = await this.registry.get(opts.templateName);\n\n const idempotencyKey = this.idempotencyKeyFn(this.tenantId, opts.documentType, opts.documentId, opts.templateName, opts.data);\n const existing = await this.opts.adapter.getIdempotentInstance(this.tenantId, idempotencyKey);\n if (existing && !TERMINAL_STATUSES.has(existing.status)) {\n this.logger.info('submit: returning idempotent existing instance', {\n tenantId: this.tenantId,\n instanceId: existing.id,\n idempotencyKey,\n });\n return existing;\n }\n\n const mutations = evaluateConditions(template.conditions ?? [], opts.data);\n const allLevelCfgs = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n if (allLevelCfgs.length === 0) {\n throw new ApprovalValidationError(\n 'Template has no active levels after condition evaluation. Check that skipLevels conditions are not removing all levels.',\n );\n }\n\n const levelNumSet = new Set(allLevelCfgs.map((l) => l.level));\n if (levelNumSet.size !== allLevelCfgs.length) {\n const seen = new Set<number>();\n for (const l of allLevelCfgs) {\n if (seen.has(l.level)) {\n throw new ApprovalValidationError(\n `Duplicate level number ${l.level} after condition evaluation. Check addLevels in conditions.`,\n );\n }\n seen.add(l.level);\n }\n }\n\n const now = this.clock.now();\n const instanceId = this.generateId('inst');\n\n const levels: ApprovalLevelInstance[] = allLevelCfgs.map((cfg, idx) => ({\n level: cfg.level,\n name: cfg.name,\n mode: cfg.mode,\n approverConfigs: cfg.approvers,\n approverIds: [],\n approvedBy: [],\n rejectedBy: [],\n status: idx === 0 ? 'pending' : 'waiting',\n escalationAfterDays: cfg.escalationAfterDays,\n escalationDueAt:\n idx === 0 && cfg.escalationAfterDays\n ? new Date(now.getTime() + cfg.escalationAfterDays * 86_400_000)\n : undefined,\n }));\n\n const firstCfg = allLevelCfgs[0];\n const firstLevel = levels[0];\n if (firstCfg && firstLevel) {\n firstLevel.approverIds = await this.resolver.resolveApprovers(\n firstCfg.approvers,\n opts.submittedBy,\n opts.data,\n this.opts.orgProvider,\n );\n }\n\n const auditEntry: AuditEntry = {\n action: 'submitted',\n actorId: opts.submittedBy,\n level: allLevelCfgs[0]?.level ?? 1,\n timestamp: now,\n ...auditCtx,\n };\n\n const slaDeadlineAt = template.slaDeadlineDays\n ? new Date(now.getTime() + template.slaDeadlineDays * 86_400_000)\n : undefined;\n\n const instance: ApprovalInstance = {\n id: instanceId,\n tenantId: this.tenantId,\n templateId: template.id,\n templateName: template.name,\n documentId: opts.documentId,\n documentType: opts.documentType,\n submittedBy: opts.submittedBy,\n status: 'pending',\n currentLevel: allLevelCfgs[0]?.level ?? 1,\n version: 1,\n idempotencyKey,\n levels,\n auditLog: [auditEntry],\n data: opts.data,\n metadata: opts.metadata,\n createdAt: now,\n updatedAt: now,\n expiresAt: opts.expiresAt,\n deadlineAction: opts.deadlineAction,\n slaDeadlineAt,\n templateSnapshot: {\n escalation: template.escalation,\n slaDeadlineDays: template.slaDeadlineDays,\n allowOverride: template.allowOverride,\n },\n };\n\n await this.runMiddlewareBefore({ operation: 'submit', actorId: opts.submittedBy, tenantId: this.tenantId, input: opts });\n await this.opts.adapter.saveInstance(instance);\n\n this.logger.info('submit: instance created', {\n tenantId: this.tenantId,\n instanceId,\n documentId: opts.documentId,\n templateName: opts.templateName,\n });\n\n this.opts.metricsAdapter?.increment('approval.submitted', { tenantId: this.tenantId, templateName: template.name });\n this.opts.metricsAdapter?.timing('approval.operation_duration_ms', this.clock.now().getTime() - startMs, { operation: 'submit' });\n\n const eventPayload = {\n instanceId: instance.id,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n submittedBy: opts.submittedBy,\n currentApprovers: firstLevel?.approverIds ?? [],\n };\n this.bus.emit('approval:submitted', eventPayload);\n await this.notifyAdapters('approval:submitted', instance, eventPayload);\n await this.runExternalAudit(instance, auditEntry);\n await this.runMiddlewareAfter({ operation: 'submit', actorId: opts.submittedBy, tenantId: this.tenantId, input: opts }, instance);\n\n return instance;\n }\n\n async approve(instanceId: string, raw: ApproveOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ApproveOptionsSchema.parse(raw));\n const startMs = this.clock.now().getTime();\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n\n if (opts.approverId === instance.submittedBy) {\n throw new ApprovalForbiddenError(\n `Self-approval is not permitted. Approver \"${opts.approverId}\" submitted this request.`,\n );\n }\n\n const level = this.currentLevelInstance(instance);\n await this.runAuthorizationPolicy({ operation: 'approve', actorId: opts.approverId, instance, level, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'approve', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts });\n\n assertApproverOnLevel(level, opts.approverId);\n if (hasAlreadyActed(level, opts.approverId)) {\n throw new ApprovalError(\n `Approver \"${opts.approverId}\" has already acted on level ${level.level}.`,\n 'ALREADY_ACTED',\n );\n }\n\n const now = this.clock.now();\n const oldValue = snapshotLevel(level);\n level.approvedBy.push(opts.approverId);\n\n const auditEntry: AuditEntry = {\n action: 'approved',\n actorId: opts.approverId,\n level: level.level,\n timestamp: now,\n comment: opts.comment,\n oldValue,\n newValue: snapshotLevel(level),\n ...auditCtx,\n };\n instance.auditLog.push(auditEntry);\n instance.updatedAt = now;\n\n if (isLevelApproved(level)) {\n level.status = 'approved';\n const nextLevel = this.findNextLevel(instance);\n\n if (!nextLevel) {\n instance.status = 'approved';\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.logger.info('approve: instance fully approved', { tenantId: this.tenantId, instanceId });\n this.opts.metricsAdapter?.increment('approval.approved', { tenantId: this.tenantId, isFinal: 'true' });\n this.opts.metricsAdapter?.timing('approval.operation_duration_ms', this.clock.now().getTime() - startMs, { operation: 'approve' });\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, approverId: opts.approverId, level: level.level, comment: opts.comment, isFinal: true };\n this.bus.emit('approval:approved', p);\n this.bus.emit('approval:completed', instance);\n await this.notifyAdapters('approval:approved', instance, p);\n await this.runMiddlewareAfter({ operation: 'approve', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts }, instance);\n return instance;\n }\n\n nextLevel.approverIds = await this.resolver.resolveApprovers(\n nextLevel.approverConfigs,\n instance.submittedBy,\n instance.data,\n this.opts.orgProvider,\n );\n if (nextLevel.escalationAfterDays) {\n nextLevel.escalationDueAt = new Date(now.getTime() + nextLevel.escalationAfterDays * 86_400_000);\n }\n nextLevel.status = 'pending';\n instance.currentLevel = nextLevel.level;\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.approved', { tenantId: this.tenantId, isFinal: 'false' });\n this.opts.metricsAdapter?.timing('approval.operation_duration_ms', this.clock.now().getTime() - startMs, { operation: 'approve' });\n const pAdv = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, approverId: opts.approverId, level: level.level, comment: opts.comment, isFinal: false };\n this.bus.emit('approval:approved', pAdv);\n const pLvl = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, fromLevel: level.level, toLevel: nextLevel.level, newApprovers: nextLevel.approverIds };\n this.bus.emit('approval:level_advanced', pLvl);\n await this.notifyAdapters('approval:level_advanced', instance, pLvl);\n await this.runMiddlewareAfter({ operation: 'approve', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts }, instance);\n } else {\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.approved', { tenantId: this.tenantId });\n this.opts.metricsAdapter?.timing('approval.operation_duration_ms', this.clock.now().getTime() - startMs, { operation: 'approve' });\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, approverId: opts.approverId, level: level.level, comment: opts.comment, isFinal: false };\n this.bus.emit('approval:approved', p);\n await this.notifyAdapters('approval:approved', instance, p);\n await this.runMiddlewareAfter({ operation: 'approve', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts }, instance);\n }\n\n return instance;\n });\n }\n\n async reject(instanceId: string, raw: RejectOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RejectOptionsSchema.parse(raw));\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n\n if (opts.approverId === instance.submittedBy) {\n throw new ApprovalForbiddenError(\n `Self-rejection is not permitted. Approver \"${opts.approverId}\" submitted this request.`,\n );\n }\n\n const level = this.currentLevelInstance(instance);\n await this.runAuthorizationPolicy({ operation: 'reject', actorId: opts.approverId, instance, level, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'reject', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts });\n\n assertApproverOnLevel(level, opts.approverId);\n if (hasAlreadyActed(level, opts.approverId)) {\n throw new ApprovalError(\n `Approver \"${opts.approverId}\" has already acted on level ${level.level}.`,\n 'ALREADY_ACTED',\n );\n }\n\n const now = this.clock.now();\n const oldValue = snapshotLevel(level);\n level.rejectedBy.push(opts.approverId);\n\n const auditEntry: AuditEntry = {\n action: 'rejected',\n actorId: opts.approverId,\n level: level.level,\n timestamp: now,\n reason: opts.reason,\n oldValue,\n newValue: snapshotLevel(level),\n ...auditCtx,\n };\n instance.auditLog.push(auditEntry);\n instance.updatedAt = now;\n\n if (isLevelRejected(level)) {\n level.status = 'rejected';\n\n if (opts.returnTo === 'previous') {\n const prevLevel = this.findPreviousLevel(instance);\n if (!prevLevel) {\n throw new ApprovalValidationError(\n `Cannot return to previous level: instance \"${instanceId}\" is already at the first level (${level.level}). Remove returnTo: 'previous' or use returnTo: 'originator' to fully reject.`,\n );\n }\n prevLevel.status = 'pending';\n prevLevel.approvedBy = [];\n prevLevel.rejectedBy = [];\n instance.currentLevel = prevLevel.level;\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, approverId: opts.approverId, level: level.level, reason: opts.reason, returnTo: 'previous' as const };\n this.bus.emit('approval:rejected', p);\n await this.notifyAdapters('approval:rejected', instance, p);\n await this.runMiddlewareAfter({ operation: 'reject', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts }, instance);\n return instance;\n }\n\n instance.status = 'rejected';\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.rejected', { tenantId: this.tenantId });\n this.logger.info('reject: instance rejected', { tenantId: this.tenantId, instanceId });\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, approverId: opts.approverId, level: level.level, reason: opts.reason, returnTo: opts.returnTo === 'originator' ? 'originator' as const : null };\n this.bus.emit('approval:rejected', p);\n await this.notifyAdapters('approval:rejected', instance, p);\n await this.runMiddlewareAfter({ operation: 'reject', instanceId, actorId: opts.approverId, tenantId: this.tenantId, input: opts }, instance);\n } else {\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n }\n\n return instance;\n });\n }\n\n async delegate(instanceId: string, raw: DelegateOptions, auditCtx?: AuditContext): Promise<void> {\n const opts = parseOrThrow(() => DelegateOptionsSchema.parse(raw));\n await this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n\n if (opts.fromApprover === opts.toApprover) {\n throw new ApprovalForbiddenError('Cannot delegate to yourself.');\n }\n\n const level = this.currentLevelInstance(instance);\n await this.runAuthorizationPolicy({ operation: 'delegate', actorId: opts.fromApprover, instance, level, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'delegate', instanceId, actorId: opts.fromApprover, tenantId: this.tenantId, input: opts });\n\n assertApproverOnLevel(level, opts.fromApprover);\n if (hasAlreadyActed(level, opts.fromApprover)) {\n throw new ApprovalForbiddenError(\n `Cannot delegate after acting: \"${opts.fromApprover}\" has already approved or rejected level ${level.level}.`,\n );\n }\n\n const now = this.clock.now();\n const idx = level.approverIds.indexOf(opts.fromApprover);\n level.approverIds[idx] = opts.toApprover;\n\n if (opts.until) {\n level.delegatedUntil = opts.until;\n level.delegatedFrom = opts.fromApprover;\n level.delegatedTo = opts.toApprover;\n }\n\n const auditEntry: AuditEntry = {\n action: 'delegated',\n actorId: opts.fromApprover,\n level: level.level,\n timestamp: now,\n reason: opts.reason,\n delegateTo: opts.toApprover,\n ...auditCtx,\n };\n instance.auditLog.push(auditEntry);\n instance.updatedAt = now;\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, fromApprover: opts.fromApprover, toApprover: opts.toApprover, level: level.level, reason: opts.reason };\n this.bus.emit('approval:delegated', p);\n await this.notifyAdapters('approval:delegated', instance, p);\n await this.runMiddlewareAfter({ operation: 'delegate', instanceId, actorId: opts.fromApprover, tenantId: this.tenantId, input: opts }, instance);\n return instance;\n });\n }\n\n async cancel(instanceId: string, raw: CancelOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => CancelOptionsSchema.parse(raw));\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status === 'approved' || instance.status === 'rejected') {\n throw new ApprovalError(`Cannot cancel a \"${instance.status}\" approval.`, 'CANNOT_CANCEL');\n }\n\n await this.runAuthorizationPolicy({ operation: 'cancel', actorId: opts.cancelledBy, instance, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'cancel', instanceId, actorId: opts.cancelledBy, tenantId: this.tenantId, input: opts });\n\n const now = this.clock.now();\n instance.status = 'cancelled';\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'cancelled',\n actorId: opts.cancelledBy,\n level: instance.currentLevel,\n timestamp: now,\n reason: opts.reason,\n ...auditCtx,\n };\n instance.auditLog.push(auditEntry);\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.cancelled', { tenantId: this.tenantId });\n this.logger.info('cancel: instance cancelled', { tenantId: this.tenantId, instanceId });\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, cancelledBy: opts.cancelledBy, reason: opts.reason };\n this.bus.emit('approval:cancelled', p);\n await this.notifyAdapters('approval:cancelled', instance, p);\n await this.runMiddlewareAfter({ operation: 'cancel', instanceId, actorId: opts.cancelledBy, tenantId: this.tenantId, input: opts }, instance);\n return instance;\n });\n }\n\n async escalate(instanceId: string, raw: EscalateOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n parseOrThrow(() => EscalateOptionsSchema.parse(raw));\n return this.escalateInternal(instanceId, raw.escalatedBy, auditCtx);\n }\n\n /** Add a comment to an instance without approving or rejecting. */\n async addComment(instanceId: string, raw: AddCommentOptions, auditCtx?: AuditContext): Promise<void> {\n const opts = parseOrThrow(() => AddCommentOptionsSchema.parse(raw));\n const instance = await this.requireInstance(instanceId);\n\n await this.runAuthorizationPolicy({ operation: 'addComment', actorId: opts.actorId, instance, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'addComment', instanceId, actorId: opts.actorId, tenantId: this.tenantId, input: opts });\n\n const now = this.clock.now();\n const auditEntry: AuditEntry = {\n action: 'commented',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n comment: opts.comment,\n ...auditCtx,\n };\n\n instance.auditLog.push(auditEntry);\n instance.updatedAt = now;\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n await this.runMiddlewareAfter({ operation: 'addComment', instanceId, actorId: opts.actorId, tenantId: this.tenantId, input: opts });\n }\n\n /** Resubmit a rejected instance, creating a new linked instance from level 1. */\n async resubmit(instanceId: string, raw: ResubmitOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ResubmitOptionsSchema.parse(raw));\n const original = await this.requireInstance(instanceId);\n\n if (original.status !== 'rejected') {\n throw new ApprovalForbiddenError(\n `Cannot resubmit an instance with status \"${original.status}\". Only rejected instances can be resubmitted.`,\n );\n }\n\n await this.runAuthorizationPolicy({ operation: 'resubmit', actorId: opts.resubmittedBy, instance: original, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'resubmit', instanceId, actorId: opts.resubmittedBy, tenantId: this.tenantId, input: opts });\n\n const template = await this.registry.get(original.templateName);\n const mergedData = { ...original.data, ...(opts.updatedData ?? {}) };\n\n const mutations = evaluateConditions(template.conditions ?? [], mergedData);\n const allLevelCfgs = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n if (allLevelCfgs.length === 0) {\n throw new ApprovalValidationError('Template has no active levels after condition evaluation.');\n }\n\n const levelNums = new Set(allLevelCfgs.map((l) => l.level));\n if (levelNums.size !== allLevelCfgs.length) {\n throw new ApprovalValidationError('Duplicate level numbers after condition evaluation.');\n }\n\n const now = this.clock.now();\n const newInstanceId = this.generateId('inst');\n\n const levels: ApprovalLevelInstance[] = allLevelCfgs.map((cfg, idx) => ({\n level: cfg.level,\n name: cfg.name,\n mode: cfg.mode,\n approverConfigs: cfg.approvers,\n approverIds: [],\n approvedBy: [],\n rejectedBy: [],\n status: idx === 0 ? 'pending' : 'waiting',\n escalationAfterDays: cfg.escalationAfterDays,\n escalationDueAt:\n idx === 0 && cfg.escalationAfterDays\n ? new Date(now.getTime() + cfg.escalationAfterDays * 86_400_000)\n : undefined,\n }));\n\n const firstCfg = allLevelCfgs[0];\n const firstLevel = levels[0];\n if (firstCfg && firstLevel) {\n firstLevel.approverIds = await this.resolver.resolveApprovers(\n firstCfg.approvers,\n opts.resubmittedBy,\n mergedData,\n this.opts.orgProvider,\n );\n }\n\n const auditEntry: AuditEntry = {\n action: 'resubmitted',\n actorId: opts.resubmittedBy,\n level: allLevelCfgs[0]?.level ?? 1,\n timestamp: now,\n reason: opts.reason,\n ...auditCtx,\n };\n\n const slaDeadlineAt = template.slaDeadlineDays\n ? new Date(now.getTime() + template.slaDeadlineDays * 86_400_000)\n : undefined;\n\n const newInstance: ApprovalInstance = {\n id: newInstanceId,\n tenantId: this.tenantId,\n templateId: template.id,\n templateName: template.name,\n documentId: original.documentId,\n documentType: original.documentType,\n submittedBy: opts.resubmittedBy,\n status: 'pending',\n currentLevel: allLevelCfgs[0]?.level ?? 1,\n version: 1,\n parentInstanceId: instanceId,\n levels,\n auditLog: [auditEntry],\n data: mergedData,\n metadata: original.metadata,\n createdAt: now,\n updatedAt: now,\n slaDeadlineAt,\n templateSnapshot: {\n escalation: template.escalation,\n slaDeadlineDays: template.slaDeadlineDays,\n allowOverride: template.allowOverride,\n },\n };\n\n await this.opts.adapter.saveInstance(newInstance);\n await this.runExternalAudit(newInstance, auditEntry);\n\n this.logger.info('resubmit: new instance created from rejected original', {\n tenantId: this.tenantId,\n originalInstanceId: instanceId,\n newInstanceId,\n });\n\n const p = {\n instanceId: newInstanceId,\n documentId: newInstance.documentId,\n documentType: newInstance.documentType,\n timestamp: now,\n resubmittedBy: opts.resubmittedBy,\n originalInstanceId: instanceId,\n };\n this.bus.emit('approval:resubmitted', p);\n await this.notifyAdapters('approval:resubmitted', newInstance, p);\n await this.runMiddlewareAfter({ operation: 'resubmit', instanceId, actorId: opts.resubmittedBy, tenantId: this.tenantId, input: opts }, newInstance);\n\n return newInstance;\n }\n\n /** Preview the resolved approval chain for a template and document data, without creating an instance. */\n async previewApprovalChain(\n templateName: string,\n data: Record<string, unknown>,\n submittedBy: string,\n ): Promise<PreviewResult> {\n const template = await this.registry.get(templateName);\n const mutations = evaluateConditions(template.conditions ?? [], data);\n\n const conditionsApplied: number[] = [];\n (template.conditions ?? []).forEach((rule, idx) => {\n const m = evaluateConditions([rule], data);\n if (m.addLevels.length > 0 || m.skipLevels.size > 0) {\n conditionsApplied.push(idx);\n }\n });\n\n const allLevelCfgs = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n const levels: PreviewChainLevel[] = [];\n for (const cfg of allLevelCfgs) {\n try {\n const resolvedApprovers = await this.resolver.resolveApprovers(\n cfg.approvers,\n submittedBy,\n data,\n this.opts.orgProvider,\n );\n levels.push({ level: cfg.level, name: cfg.name, resolvedApprovers, mode: cfg.mode });\n } catch {\n levels.push({ level: cfg.level, name: cfg.name, resolvedApprovers: [], mode: cfg.mode });\n }\n }\n\n return { levels, conditionsApplied };\n }\n\n /** Check whether a user is eligible to approve a specific instance. Never throws. */\n async canApprove(instanceId: string, userId: string): Promise<CanApproveResult> {\n let instance: ApprovalInstance;\n try {\n instance = await this.requireInstance(instanceId);\n } catch {\n return { eligible: false, reason: 'wrong_status' };\n }\n\n if (instance.status !== 'pending') {\n return { eligible: false, reason: 'wrong_status' };\n }\n\n if (userId === instance.submittedBy) {\n return { eligible: false, reason: 'self_approval' };\n }\n\n const level = this.currentLevelInstance(instance);\n\n if (!level.approverIds.includes(userId)) {\n const hasDelegated = instance.auditLog.some(\n (e) => e.action === 'delegated' && e.actorId === userId && e.level === level.level,\n );\n return { eligible: false, reason: hasDelegated ? 'delegated_away' : 'not_an_approver' };\n }\n\n if (hasAlreadyActed(level, userId)) {\n return { eligible: false, reason: 'already_acted' };\n }\n\n return { eligible: true };\n }\n\n /** Emergency bypass — completes the instance as 'approved', skipping remaining levels. Requires template.allowOverride = true. */\n async override(instanceId: string, raw: OverrideOptions, auditCtx?: AuditContext): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => OverrideOptionsSchema.parse(raw));\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n\n const allowOverride =\n instance.templateSnapshot?.allowOverride ??\n (await this.registry.get(instance.templateName)).allowOverride;\n if (!allowOverride) {\n throw new ApprovalForbiddenError(\n `Override is not enabled for template \"${instance.templateName}\". Set allowOverride: true in the template config.`,\n );\n }\n\n if (opts.overriddenBy === instance.submittedBy) {\n throw new ApprovalForbiddenError(\n 'Override cannot be performed by the original submitter.',\n );\n }\n\n await this.runAuthorizationPolicy({ operation: 'override', actorId: opts.overriddenBy, instance, opts: opts as Record<string, unknown> });\n await this.runMiddlewareBefore({ operation: 'override', instanceId, actorId: opts.overriddenBy, tenantId: this.tenantId, input: opts });\n\n const now = this.clock.now();\n instance.status = 'approved';\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'overridden',\n actorId: opts.overriddenBy,\n level: instance.currentLevel,\n timestamp: now,\n reason: opts.justification,\n ...auditCtx,\n };\n instance.auditLog.push(auditEntry);\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.overridden', { tenantId: this.tenantId });\n\n this.logger.info('override: instance force-approved', {\n tenantId: this.tenantId,\n instanceId,\n overriddenBy: opts.overriddenBy,\n });\n\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n overriddenBy: opts.overriddenBy,\n justification: opts.justification,\n };\n this.bus.emit('approval:overridden', p);\n this.bus.emit('approval:completed', instance);\n await this.notifyAdapters('approval:overridden', instance, p);\n await this.runMiddlewareAfter({ operation: 'override', instanceId, actorId: opts.overriddenBy, tenantId: this.tenantId, input: opts }, instance);\n\n return instance;\n });\n }\n\n /** Approve multiple instances in one call. Never throws — failures collected in result.failed. */\n async bulkApprove(instanceIds: string[], raw: ApproveOptions, auditCtx?: AuditContext): Promise<BulkResult> {\n const opts = parseOrThrow(() => ApproveOptionsSchema.parse(raw));\n this.guardBulkSize(instanceIds);\n\n const result: BulkResult = { succeeded: [], failed: [], total: instanceIds.length };\n for (const id of instanceIds) {\n try {\n result.succeeded.push(await this.approve(id, opts, auditCtx));\n } catch (err) {\n result.failed.push({ instanceId: id, error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN') });\n }\n }\n return result;\n }\n\n /** Reject multiple instances in one call. Never throws — failures collected in result.failed. */\n async bulkReject(instanceIds: string[], raw: RejectOptions, auditCtx?: AuditContext): Promise<BulkResult> {\n const opts = parseOrThrow(() => RejectOptionsSchema.parse(raw));\n this.guardBulkSize(instanceIds);\n\n const result: BulkResult = { succeeded: [], failed: [], total: instanceIds.length };\n for (const id of instanceIds) {\n try {\n result.succeeded.push(await this.reject(id, opts, auditCtx));\n } catch (err) {\n result.failed.push({ instanceId: id, error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN') });\n }\n }\n return result;\n }\n\n // ─── Queries ──────────────────────────────────────────────────────────────\n\n async getInstance(instanceId: string): Promise<ApprovalInstance> {\n return this.requireInstance(instanceId);\n }\n\n async getPendingFor(\n approverId: string,\n opts?: PaginationOpts,\n ): Promise<PaginatedResult<ApprovalInstance>> {\n return this.opts.adapter.getInstancesByApprover(this.tenantId, approverId, opts);\n }\n\n async queryInstances(\n filter: InstanceFilter,\n opts?: PaginationOpts,\n ): Promise<PaginatedResult<ApprovalInstance>> {\n return this.opts.adapter.getInstancesByFilter(this.tenantId, filter, opts);\n }\n\n async queryInstancesByCursor(\n filter: InstanceFilter,\n opts: CursorPaginationOpts,\n ): Promise<CursorPaginatedResult<ApprovalInstance>> {\n if (!this.opts.adapter.getInstancesByCursor) {\n throw new ApprovalError(\n 'The configured storage adapter does not support cursor pagination. Implement getInstancesByCursor() or use queryInstances() instead.',\n 'NOT_SUPPORTED',\n );\n }\n return this.opts.adapter.getInstancesByCursor(this.tenantId, filter, opts);\n }\n\n async getHistory(instanceId: string): Promise<AuditEntry[]> {\n const instance = await this.requireInstance(instanceId);\n return instance.auditLog;\n }\n\n async getCurrentApprovers(instanceId: string): Promise<string[]> {\n const instance = await this.requireInstance(instanceId);\n if (instance.status !== 'pending') return [];\n return this.currentLevelInstance(instance).approverIds;\n }\n\n /** Check adapter connectivity and escalation scheduler health. */\n async healthCheck(): Promise<HealthResult> {\n let adapterStatus: 'connected' | 'error' = 'connected';\n let pendingCount = 0;\n let overdueCount = 0;\n\n try {\n const result = await this.opts.adapter.getInstancesByFilter(\n this.tenantId,\n { status: 'pending' },\n { limit: 1, offset: 0 },\n );\n pendingCount = result.total;\n } catch {\n adapterStatus = 'error';\n }\n\n if (adapterStatus === 'connected') {\n try {\n const overdue = await this.opts.adapter.getOverdueInstances(this.tenantId, this.clock.now());\n overdueCount = overdue.length;\n } catch {\n adapterStatus = 'error';\n }\n }\n\n const status =\n adapterStatus === 'error'\n ? 'unhealthy'\n : overdueCount > 0\n ? 'degraded'\n : 'healthy';\n\n return {\n status,\n adapter: adapterStatus,\n pendingCount,\n overdueCount,\n escalationRunning: this.escalation.isRunning,\n lastTickAt: this.escalation.lastTickAt ?? undefined,\n };\n }\n\n async shutdown(): Promise<void> {\n await this.escalation.stop();\n await this.opts.schedulerAdapter?.shutdown();\n }\n\n // ─── Internals ────────────────────────────────────────────────────────────\n\n private async escalateInternal(\n instanceId: string,\n escalatedBy = 'system',\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n\n const escalationConfig = instance.templateSnapshot?.escalation\n ?? (await this.registry.get(instance.templateName)).escalation;\n if (!escalationConfig) return instance;\n\n const newApprovers = await this.resolver.resolveApprovers(\n [escalationConfig.escalateTo],\n instance.submittedBy,\n instance.data,\n this.opts.orgProvider,\n );\n\n const filteredApprovers = newApprovers.filter((id) => id !== instance.submittedBy);\n if (filteredApprovers.length === 0) {\n this.logger.warn('escalateInternal: escalation resolved to submitter only — no approvers added', {\n tenantId: this.tenantId,\n instanceId,\n });\n return instance;\n }\n\n const level = this.currentLevelInstance(instance);\n level.approverIds = [...new Set([...level.approverIds, ...filteredApprovers])];\n level.escalationDueAt = undefined;\n\n const now = this.clock.now();\n const escalatedTo = filteredApprovers[0] ?? 'unknown';\n const auditEntry: AuditEntry = {\n action: 'escalated',\n actorId: escalatedBy,\n level: level.level,\n timestamp: now,\n delegateTo: escalatedTo,\n ...auditCtx,\n };\n instance.auditLog.push(auditEntry);\n instance.updatedAt = now;\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.escalated', { tenantId: this.tenantId });\n this.logger.info('escalate: instance escalated', { tenantId: this.tenantId, instanceId, escalatedTo });\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, level: level.level, escalatedTo };\n this.bus.emit('approval:escalated', p);\n await this.notifyAdapters('approval:escalated', instance, p);\n return instance;\n });\n }\n\n private async expireInstance(instanceId: string, deadlineAction: 'cancel' | 'reject'): Promise<void> {\n try {\n await this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n\n const now = this.clock.now();\n instance.status = deadlineAction === 'reject' ? 'rejected' : 'cancelled';\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'expired',\n actorId: 'system',\n level: instance.currentLevel,\n timestamp: now,\n reason: `Approval deadline reached. Action: ${deadlineAction}.`,\n };\n instance.auditLog.push(auditEntry);\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, instanceId, auditEntry);\n await this.runExternalAudit(instance, auditEntry);\n this.opts.metricsAdapter?.increment('approval.expired', { tenantId: this.tenantId });\n\n this.logger.warn('expireInstance: instance expired by deadline', {\n tenantId: this.tenantId,\n instanceId,\n deadlineAction,\n });\n\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, deadlineAction };\n this.bus.emit('approval:expired', p);\n await this.notifyAdapters('approval:expired', instance, p);\n\n return instance;\n });\n } catch (err) {\n this.logger.error('expireInstance: failed', err, { tenantId: this.tenantId, instanceId });\n }\n }\n\n private async markSlaBreached(instanceId: string): Promise<void> {\n try {\n await this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending' || instance.slaBreachedAt) return instance;\n\n const now = this.clock.now();\n instance.slaBreachedAt = now;\n instance.updatedAt = now;\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n this.opts.metricsAdapter?.increment('approval.sla_breached', { tenantId: this.tenantId });\n\n this.logger.warn('markSlaBreached: SLA breached', { tenantId: this.tenantId, instanceId });\n\n const p = { instanceId, documentId: instance.documentId, documentType: instance.documentType, timestamp: now, slaDeadlineAt: instance.slaDeadlineAt ?? now };\n this.bus.emit('approval:sla_breached', p);\n await this.notifyAdapters('approval:sla_breached', instance, p);\n\n return instance;\n });\n } catch (err) {\n this.logger.error('markSlaBreached: failed', err, { tenantId: this.tenantId, instanceId });\n }\n }\n\n private async revertDelegation(instanceId: string, levelNumber: number, fromApprover: string): Promise<void> {\n try {\n await this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n\n const level = instance.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending') return instance;\n\n const delegateTo = level.delegatedTo;\n if (delegateTo) {\n const delegateIdx = level.approverIds.indexOf(delegateTo);\n if (delegateIdx >= 0) {\n level.approverIds[delegateIdx] = fromApprover;\n } else {\n level.approverIds.push(fromApprover);\n }\n }\n\n level.delegatedUntil = undefined;\n level.delegatedFrom = undefined;\n level.delegatedTo = undefined;\n\n const now = this.clock.now();\n instance.updatedAt = now;\n\n await this.opts.adapter.updateInstance(instance, instance.version);\n\n this.logger.info('revertDelegation: delegation expired and reverted', {\n tenantId: this.tenantId,\n instanceId,\n levelNumber,\n fromApprover,\n });\n\n return instance;\n });\n } catch (err) {\n this.logger.error('revertDelegation: failed', err, { tenantId: this.tenantId, instanceId });\n }\n }\n\n /** Read-modify-write with optimistic locking retry. */\n private async withOptimisticRetry(\n instanceId: string,\n fn: (instance: ApprovalInstance) => Promise<ApprovalInstance>,\n ): Promise<ApprovalInstance> {\n const { maxAttempts, baseDelayMs, maxDelayMs = Infinity, jitter = true } = this.retryPolicy;\n let lastError: unknown;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n let delay = Math.min(baseDelayMs * attempt, maxDelayMs);\n if (jitter) delay += Math.random() * baseDelayMs;\n await sleep(delay);\n this.opts.metricsAdapter?.increment('approval.conflict_retry', { tenantId: this.tenantId, attempt: String(attempt) });\n this.logger.warn('withOptimisticRetry: retrying after conflict', {\n tenantId: this.tenantId,\n instanceId,\n attempt,\n });\n }\n const instance = await this.requireInstance(instanceId);\n if (attempt > 0 && TERMINAL_STATUSES.has(instance.status)) {\n throw new ApprovalForbiddenError(\n `Instance \"${instanceId}\" is already in terminal status \"${instance.status}\" and cannot be modified.`,\n );\n }\n try {\n return await fn(instance);\n } catch (err) {\n if (err instanceof ApprovalConflictError) {\n lastError = err;\n continue;\n }\n throw err;\n }\n }\n throw lastError ?? new ApprovalConflictError(instanceId);\n }\n\n private async requireInstance(id: string): Promise<ApprovalInstance> {\n const instance = await this.opts.adapter.getInstance(this.tenantId, id);\n if (!instance) throw new ApprovalNotFoundError('Instance', id);\n return instance;\n }\n\n private currentLevelInstance(instance: ApprovalInstance): ApprovalLevelInstance {\n const level = instance.levels.find((l) => l.level === instance.currentLevel);\n if (!level) {\n const available = instance.levels.map((l) => l.level).join(', ');\n throw new ApprovalError(\n `Level ${instance.currentLevel} not found on instance (available: ${available}).`,\n 'INVALID_LEVEL',\n );\n }\n return level;\n }\n\n private findNextLevel(instance: ApprovalInstance): ApprovalLevelInstance | null {\n return instance.levels.find((l) => l.level > instance.currentLevel && l.status === 'waiting') ?? null;\n }\n\n private findPreviousLevel(instance: ApprovalInstance): ApprovalLevelInstance | null {\n return (\n [...instance.levels]\n .filter((l) => l.level < instance.currentLevel)\n .sort((a, b) => b.level - a.level)[0] ?? null\n );\n }\n\n private guardBulkSize(instanceIds: string[]): void {\n if (instanceIds.length > this.maxBulkItems) {\n throw new ApprovalValidationError(\n `Bulk operation exceeds maximum allowed items (${this.maxBulkItems}). Got ${instanceIds.length}.`,\n );\n }\n }\n\n // ─── Extension point helpers ──────────────────────────────────────────────\n\n private async runAuthorizationPolicy(ctx: AuthorizationContext): Promise<void> {\n if (!this.opts.authorizationPolicy) return;\n try {\n const denial = await this.opts.authorizationPolicy.authorize(ctx);\n if (denial) throw new ApprovalForbiddenError(denial);\n } catch (err) {\n if (err instanceof ApprovalForbiddenError) throw err;\n this.logger.error('authorizationPolicy.authorize threw unexpectedly', err, { tenantId: this.tenantId });\n throw err;\n }\n }\n\n private async runMiddlewareBefore(ctx: OperationContext): Promise<void> {\n if (!this.opts.middleware?.length) return;\n for (const mw of this.opts.middleware) {\n try {\n await mw.before?.(ctx);\n } catch (err) {\n this.logger.error('middleware.before threw', err, { operation: ctx.operation });\n }\n }\n }\n\n private async runMiddlewareAfter(ctx: OperationContext, result?: ApprovalInstance | void): Promise<void> {\n if (!this.opts.middleware?.length) return;\n for (const mw of this.opts.middleware) {\n try {\n await mw.after?.(ctx, result);\n } catch (err) {\n this.logger.error('middleware.after threw', err, { operation: ctx.operation });\n }\n }\n }\n\n private async notifyAdapters(\n eventType: ApprovalEventName,\n instance: ApprovalInstance,\n payload: ApprovalEventMap[ApprovalEventName],\n ): Promise<void> {\n if (!this.opts.notificationAdapter) return;\n const level = instance.levels.find((l) => l.level === instance.currentLevel);\n const notifEvent = {\n type: eventType,\n instanceId: instance.id,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: this.clock.now(),\n recipients: level?.approverIds ?? [],\n templateName: instance.templateName,\n tenantId: instance.tenantId,\n payload,\n };\n try {\n await this.opts.notificationAdapter.notify(notifEvent);\n } catch (err) {\n this.logger.error('notificationAdapter.notify threw', err, { tenantId: this.tenantId, instanceId: instance.id });\n }\n }\n\n private async runExternalAudit(instance: ApprovalInstance, entry: AuditEntry): Promise<void> {\n if (!this.opts.auditAdapter) return;\n try {\n await this.opts.auditAdapter.append(this.tenantId, instance.id, entry, instance);\n } catch (err) {\n this.logger.error('auditAdapter.append threw', err, { tenantId: this.tenantId, instanceId: instance.id });\n }\n }\n}\n\n// ─── Utilities ──────────────────────────────────────────────────────────────\n\nfunction defaultIdempotencyKeyFn(\n tenantId: string,\n documentType: string,\n documentId: string,\n templateName: string,\n _data: Record<string, unknown>,\n): string {\n return createHash('sha256')\n .update(`${tenantId}:${documentType}:${documentId}:${templateName}`)\n .digest('hex');\n}\n\nfunction snapshotLevel(level: ApprovalLevelInstance): Record<string, unknown> {\n return {\n approverIds: [...level.approverIds],\n approvedBy: [...level.approvedBy],\n rejectedBy: [...level.rejectedBy],\n status: level.status,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseOrThrow<T>(fn: () => T): T {\n try {\n return fn();\n } catch (err) {\n throw new ApprovalValidationError(\n err instanceof Error ? err.message : 'Invalid input',\n err,\n );\n }\n}\n","import type {\n IStorageAdapter,\n PaginationOpts,\n PaginatedResult,\n InstanceFilter,\n CursorPaginationOpts,\n CursorPaginatedResult,\n} from './IStorageAdapter.js';\nimport type { ApprovalTemplate, ApprovalInstance, AuditEntry } from '../types/index.js';\nimport { ApprovalConflictError } from '../errors.js';\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction reviveDates(instance: ApprovalInstance): ApprovalInstance {\n return {\n ...instance,\n createdAt: new Date(instance.createdAt),\n updatedAt: new Date(instance.updatedAt),\n expiresAt: instance.expiresAt ? new Date(instance.expiresAt) : undefined,\n slaDeadlineAt: instance.slaDeadlineAt ? new Date(instance.slaDeadlineAt) : undefined,\n slaBreachedAt: instance.slaBreachedAt ? new Date(instance.slaBreachedAt) : undefined,\n auditLog: instance.auditLog.map((e) => ({ ...e, timestamp: new Date(e.timestamp) })),\n levels: instance.levels.map((l) => {\n const level: typeof l = { ...l };\n if (l.escalationDueAt) level.escalationDueAt = new Date(l.escalationDueAt);\n if (l.delegatedUntil) level.delegatedUntil = new Date(l.delegatedUntil);\n return level;\n }),\n };\n}\n\nfunction applyFilter(instance: ApprovalInstance, filter: InstanceFilter): boolean {\n if (filter.status && instance.status !== filter.status) return false;\n if (filter.documentType && instance.documentType !== filter.documentType) return false;\n if (filter.submittedBy && instance.submittedBy !== filter.submittedBy) return false;\n if (filter.fromDate && instance.createdAt < filter.fromDate) return false;\n if (filter.toDate && instance.createdAt > filter.toDate) return false;\n return true;\n}\n\nexport class MemoryAdapter implements IStorageAdapter {\n // keyed by `${tenantId}:${template.name}`\n private templates = new Map<string, ApprovalTemplate>();\n // keyed by `${tenantId}:${instance.id}`\n private instances = new Map<string, ApprovalInstance>();\n\n async saveTemplate(template: ApprovalTemplate): Promise<void> {\n this.templates.set(`${template.tenantId}:${template.name}`, deepClone(template));\n }\n\n async getTemplate(tenantId: string, name: string): Promise<ApprovalTemplate | null> {\n return deepClone(this.templates.get(`${tenantId}:${name}`) ?? null);\n }\n\n async listTemplates(tenantId: string): Promise<ApprovalTemplate[]> {\n const result: ApprovalTemplate[] = [];\n for (const [key, template] of this.templates) {\n if (key.startsWith(`${tenantId}:`)) {\n result.push(deepClone(template));\n }\n }\n return result;\n }\n\n async saveInstance(instance: ApprovalInstance): Promise<void> {\n this.instances.set(`${instance.tenantId}:${instance.id}`, deepClone(instance));\n }\n\n async updateInstance(instance: ApprovalInstance, expectedVersion: number): Promise<void> {\n const key = `${instance.tenantId}:${instance.id}`;\n const stored = this.instances.get(key);\n if (!stored) throw new ApprovalConflictError(instance.id);\n if (stored.version !== expectedVersion) throw new ApprovalConflictError(instance.id);\n const updated = deepClone(instance);\n updated.version = expectedVersion + 1;\n this.instances.set(key, updated);\n }\n\n async getInstance(tenantId: string, id: string): Promise<ApprovalInstance | null> {\n const raw = this.instances.get(`${tenantId}:${id}`);\n if (!raw) return null;\n return reviveDates(deepClone(raw));\n }\n\n async getInstancesByApprover(\n tenantId: string,\n approverId: string,\n opts?: PaginationOpts,\n ): Promise<PaginatedResult<ApprovalInstance>> {\n const all = [...this.instances.values()].filter((i) => {\n if (i.tenantId !== tenantId || i.status !== 'pending') return false;\n // Use .find() by level number, not array index (level numbers may not be consecutive)\n const currentLevel = i.levels.find((l) => l.level === i.currentLevel);\n return currentLevel?.approverIds.includes(approverId) ?? false;\n });\n return paginate(all.map((i) => reviveDates(deepClone(i))), opts);\n }\n\n async getInstancesByFilter(\n tenantId: string,\n filter: InstanceFilter,\n opts?: PaginationOpts,\n ): Promise<PaginatedResult<ApprovalInstance>> {\n const all = [...this.instances.values()].filter(\n (i) => i.tenantId === tenantId && applyFilter(i, filter),\n );\n return paginate(all.map((i) => reviveDates(deepClone(i))), opts);\n }\n\n async getOverdueInstances(tenantId: string, asOf: Date): Promise<ApprovalInstance[]> {\n return [...this.instances.values()]\n .filter((i) => {\n if (i.tenantId !== tenantId || i.status !== 'pending') return false;\n // Escalation overdue\n const currentLevel = i.levels.find((l) => l.level === i.currentLevel);\n const hasOverdueEscalation =\n currentLevel?.escalationDueAt != null && new Date(currentLevel.escalationDueAt) <= asOf;\n // Instance deadline expired\n const isExpired = i.expiresAt != null && new Date(i.expiresAt) <= asOf;\n // SLA breach (not yet recorded)\n const hasSLABreach =\n i.slaDeadlineAt != null && new Date(i.slaDeadlineAt) <= asOf && !i.slaBreachedAt;\n // Delegation expiry on any pending level\n const hasDelegationExpiry = i.levels.some(\n (l) =>\n l.status === 'pending' &&\n l.delegatedUntil != null &&\n new Date(l.delegatedUntil) <= asOf &&\n l.delegatedFrom != null,\n );\n return hasOverdueEscalation || isExpired || hasSLABreach || hasDelegationExpiry;\n })\n .map((i) => reviveDates(deepClone(i)));\n }\n\n async getInstancesByCursor(\n tenantId: string,\n filter: InstanceFilter,\n opts: CursorPaginationOpts,\n ): Promise<CursorPaginatedResult<ApprovalInstance>> {\n const all = [...this.instances.values()]\n .filter((i) => i.tenantId === tenantId && applyFilter(i, filter))\n .map((i) => reviveDates(deepClone(i)))\n .sort((a, b) => {\n const ta = a.updatedAt.getTime();\n const tb = b.updatedAt.getTime();\n return ta !== tb ? ta - tb : a.id.localeCompare(b.id);\n });\n\n const { cursor, limit, direction = 'forward' } = opts;\n let startIdx = 0;\n\n if (cursor) {\n const [ts, id] = decodeCursor(cursor);\n const idx = all.findIndex(\n (i) => i.updatedAt.getTime() > ts || (i.updatedAt.getTime() === ts && i.id > id),\n );\n startIdx = idx === -1 ? all.length : idx;\n }\n\n if (direction === 'backward' && startIdx > 0) {\n startIdx = Math.max(0, startIdx - limit - 1);\n }\n\n const slice = all.slice(startIdx, startIdx + limit);\n const hasMore = startIdx + limit < all.length;\n const nextCursor = hasMore ? encodeCursor(slice[slice.length - 1]!) : undefined;\n const prevCursor = startIdx > 0 ? encodeCursor(all[startIdx - 1]!) : undefined;\n\n return { items: slice, nextCursor, prevCursor, hasMore };\n }\n\n async getIdempotentInstance(\n tenantId: string,\n idempotencyKey: string,\n ): Promise<ApprovalInstance | null> {\n for (const instance of this.instances.values()) {\n if (instance.tenantId === tenantId && instance.idempotencyKey === idempotencyKey) {\n return reviveDates(deepClone(instance));\n }\n }\n return null;\n }\n\n async appendAuditEntry(tenantId: string, instanceId: string, entry: AuditEntry): Promise<void> {\n const key = `${tenantId}:${instanceId}`;\n const instance = this.instances.get(key);\n if (!instance) return;\n instance.auditLog.push(deepClone(entry));\n instance.updatedAt = new Date(entry.timestamp);\n }\n\n /** Test helper — total stored instances across all tenants. */\n get size(): number {\n return this.instances.size;\n }\n}\n\nfunction paginate<T>(items: T[], opts?: PaginationOpts): PaginatedResult<T> {\n const total = items.length;\n if (!opts) return { items, total };\n return { items: items.slice(opts.offset, opts.offset + opts.limit), total };\n}\n\nfunction encodeCursor(instance: ApprovalInstance): string {\n return Buffer.from(`${instance.updatedAt.getTime()}|${instance.id}`).toString('base64');\n}\n\nfunction decodeCursor(cursor: string): [number, string] {\n const decoded = Buffer.from(cursor, 'base64').toString('utf8');\n const pipeIdx = decoded.indexOf('|');\n return [Number(decoded.slice(0, pipeIdx)), decoded.slice(pipeIdx + 1)];\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { L as Logger, C as Clock } from './ApprovalEngine-BcnLzfAU.cjs';
|
|
2
|
+
export { A as AddCommentOptions, a as ApprovalConflictError, b as ApprovalEngine, c as ApprovalEngineOptions, d as ApprovalError, e as ApprovalEvent, f as ApprovalEventMap, g as ApprovalEventName, h as ApprovalForbiddenError, i as ApprovalNotFoundError, j as ApprovalTemplateNotFoundError, k as ApprovalValidationError, l as ApproveOptions, m as ApprovedEvent, n as ApproverResolverFn, o as AuthorizationContext, B as BulkResult, p as CanApproveResult, q as CancelOptions, r as CancelledEvent, s as ConditionOperatorFn, D as DelegateOptions, t as DelegatedEvent, E as EscalateOptions, u as EscalatedEvent, v as ExpiredEvent, H as HealthResult, w as HistoryEntry, I as IAuditAdapter, x as IAuthorizationPolicy, y as IMetricsAdapter, z as INotificationAdapter, F as IOperationMiddleware, G as ISchedulerAdapter, J as IdGeneratorFn, K as IdempotencyKeyFn, M as LevelAdvancedEvent, N as MetricName, O as NotificationEvent, P as OperationContext, Q as OrgProvider, R as OverriddenEvent, S as OverrideOptions, T as PreviewChainLevel, U as PreviewResult, V as RejectOptions, W as RejectedEvent, X as ResubmitOptions, Y as ResubmittedEvent, Z as RetryPolicy, _ as SlaBreachedEvent, $ as SubmitOptions, a0 as SubmittedEvent, a1 as ValidationResult, a2 as defaultIdGenerator, a3 as noopLogger, a4 as systemClock } from './ApprovalEngine-BcnLzfAU.cjs';
|
|
3
|
+
import { I as IStorageAdapter } from './IStorageAdapter-RAiLF8bc.cjs';
|
|
4
|
+
export { a as ApprovalInstance, f as ApprovalLevelConfig, g as ApprovalLevelInstance, h as ApprovalMode, i as ApprovalStatus, A as ApprovalTemplate, j as ApprovalTemplateConfig, k as ApproverConfig, l as AuditAction, m as AuditContext, d as AuditEntry, n as Condition, o as ConditionOperator, p as ConditionRule, e as CursorPaginatedResult, C as CursorPaginationOpts, E as EscalationConfig, c as InstanceFilter, L as LevelStatus, b as PaginatedResult, P as PaginationOpts, R as ResolvedApprover, q as ResolverFn, T as TemplateSnapshot } from './IStorageAdapter-RAiLF8bc.cjs';
|
|
5
|
+
export { MemoryAdapter } from './adapters/MemoryAdapter.cjs';
|
|
6
|
+
import 'zod';
|
|
7
|
+
|
|
8
|
+
interface EscalationSchedulerOpts {
|
|
9
|
+
adapter: IStorageAdapter;
|
|
10
|
+
tenantId: string;
|
|
11
|
+
onEscalate: (instanceId: string) => Promise<void>;
|
|
12
|
+
onExpire?: (instanceId: string, deadlineAction: 'cancel' | 'reject') => Promise<void>;
|
|
13
|
+
onSlaBreach?: (instanceId: string) => Promise<void>;
|
|
14
|
+
onRevertDelegation?: (instanceId: string, levelNumber: number, fromApprover: string) => Promise<void>;
|
|
15
|
+
pollIntervalMs?: number;
|
|
16
|
+
logger?: Logger;
|
|
17
|
+
clock?: Clock;
|
|
18
|
+
}
|
|
19
|
+
declare class EscalationScheduler {
|
|
20
|
+
private intervalId;
|
|
21
|
+
private tickPromise;
|
|
22
|
+
lastTickAt: Date | null;
|
|
23
|
+
private readonly adapter;
|
|
24
|
+
private readonly tenantId;
|
|
25
|
+
private readonly onEscalate;
|
|
26
|
+
private readonly onExpire?;
|
|
27
|
+
private readonly onSlaBreach?;
|
|
28
|
+
private readonly onRevertDelegation?;
|
|
29
|
+
private readonly pollIntervalMs;
|
|
30
|
+
private readonly logger;
|
|
31
|
+
private readonly clock;
|
|
32
|
+
constructor(opts: EscalationSchedulerOpts);
|
|
33
|
+
get isRunning(): boolean;
|
|
34
|
+
start(): void;
|
|
35
|
+
stop(): Promise<void>;
|
|
36
|
+
tick(): Promise<void>;
|
|
37
|
+
static computeEscalationDue(escalationAfterDays: number, fromDate: Date): Date | undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { Clock, EscalationScheduler, type EscalationSchedulerOpts, IStorageAdapter, Logger };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { L as Logger, C as Clock } from './ApprovalEngine-DdZtyeB5.js';
|
|
2
|
+
export { A as AddCommentOptions, a as ApprovalConflictError, b as ApprovalEngine, c as ApprovalEngineOptions, d as ApprovalError, e as ApprovalEvent, f as ApprovalEventMap, g as ApprovalEventName, h as ApprovalForbiddenError, i as ApprovalNotFoundError, j as ApprovalTemplateNotFoundError, k as ApprovalValidationError, l as ApproveOptions, m as ApprovedEvent, n as ApproverResolverFn, o as AuthorizationContext, B as BulkResult, p as CanApproveResult, q as CancelOptions, r as CancelledEvent, s as ConditionOperatorFn, D as DelegateOptions, t as DelegatedEvent, E as EscalateOptions, u as EscalatedEvent, v as ExpiredEvent, H as HealthResult, w as HistoryEntry, I as IAuditAdapter, x as IAuthorizationPolicy, y as IMetricsAdapter, z as INotificationAdapter, F as IOperationMiddleware, G as ISchedulerAdapter, J as IdGeneratorFn, K as IdempotencyKeyFn, M as LevelAdvancedEvent, N as MetricName, O as NotificationEvent, P as OperationContext, Q as OrgProvider, R as OverriddenEvent, S as OverrideOptions, T as PreviewChainLevel, U as PreviewResult, V as RejectOptions, W as RejectedEvent, X as ResubmitOptions, Y as ResubmittedEvent, Z as RetryPolicy, _ as SlaBreachedEvent, $ as SubmitOptions, a0 as SubmittedEvent, a1 as ValidationResult, a2 as defaultIdGenerator, a3 as noopLogger, a4 as systemClock } from './ApprovalEngine-DdZtyeB5.js';
|
|
3
|
+
import { I as IStorageAdapter } from './IStorageAdapter-RAiLF8bc.js';
|
|
4
|
+
export { a as ApprovalInstance, f as ApprovalLevelConfig, g as ApprovalLevelInstance, h as ApprovalMode, i as ApprovalStatus, A as ApprovalTemplate, j as ApprovalTemplateConfig, k as ApproverConfig, l as AuditAction, m as AuditContext, d as AuditEntry, n as Condition, o as ConditionOperator, p as ConditionRule, e as CursorPaginatedResult, C as CursorPaginationOpts, E as EscalationConfig, c as InstanceFilter, L as LevelStatus, b as PaginatedResult, P as PaginationOpts, R as ResolvedApprover, q as ResolverFn, T as TemplateSnapshot } from './IStorageAdapter-RAiLF8bc.js';
|
|
5
|
+
export { MemoryAdapter } from './adapters/MemoryAdapter.js';
|
|
6
|
+
import 'zod';
|
|
7
|
+
|
|
8
|
+
interface EscalationSchedulerOpts {
|
|
9
|
+
adapter: IStorageAdapter;
|
|
10
|
+
tenantId: string;
|
|
11
|
+
onEscalate: (instanceId: string) => Promise<void>;
|
|
12
|
+
onExpire?: (instanceId: string, deadlineAction: 'cancel' | 'reject') => Promise<void>;
|
|
13
|
+
onSlaBreach?: (instanceId: string) => Promise<void>;
|
|
14
|
+
onRevertDelegation?: (instanceId: string, levelNumber: number, fromApprover: string) => Promise<void>;
|
|
15
|
+
pollIntervalMs?: number;
|
|
16
|
+
logger?: Logger;
|
|
17
|
+
clock?: Clock;
|
|
18
|
+
}
|
|
19
|
+
declare class EscalationScheduler {
|
|
20
|
+
private intervalId;
|
|
21
|
+
private tickPromise;
|
|
22
|
+
lastTickAt: Date | null;
|
|
23
|
+
private readonly adapter;
|
|
24
|
+
private readonly tenantId;
|
|
25
|
+
private readonly onEscalate;
|
|
26
|
+
private readonly onExpire?;
|
|
27
|
+
private readonly onSlaBreach?;
|
|
28
|
+
private readonly onRevertDelegation?;
|
|
29
|
+
private readonly pollIntervalMs;
|
|
30
|
+
private readonly logger;
|
|
31
|
+
private readonly clock;
|
|
32
|
+
constructor(opts: EscalationSchedulerOpts);
|
|
33
|
+
get isRunning(): boolean;
|
|
34
|
+
start(): void;
|
|
35
|
+
stop(): Promise<void>;
|
|
36
|
+
tick(): Promise<void>;
|
|
37
|
+
static computeEscalationDue(escalationAfterDays: number, fromDate: Date): Date | undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { Clock, EscalationScheduler, type EscalationSchedulerOpts, IStorageAdapter, Logger };
|