hierarchical-approval 3.2.0 → 3.3.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/CHANGELOG.md +24 -0
- package/dist/adapters/MemoryAdapter.cjs +1 -2
- package/dist/adapters/MemoryAdapter.cjs.map +1 -1
- package/dist/adapters/MemoryAdapter.js +1 -2
- package/dist/adapters/MemoryAdapter.js.map +1 -1
- package/dist/index.cjs +1 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/nestjs.cjs +1 -2
- package/dist/nestjs.cjs.map +1 -1
- package/dist/nestjs.js +1 -2
- package/dist/nestjs.js.map +1 -1
- package/dist/testing.cjs +1 -2
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.js +1 -2
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/validate.ts","../src/errors.ts","../src/adapters/MemoryAdapter.ts","../src/utils/EventBus.ts","../src/utils/Logger.ts","../src/utils/Clock.ts","../src/utils/IdGenerator.ts","../src/engine/TemplateRegistry.ts","../src/engine/LevelResolver.ts","../src/engine/EscalationScheduler.ts","../src/engine/ConditionEvaluator.ts","../src/engine/StateMachine.ts","../src/plugins/metrics/stats.ts","../src/engine/ApprovalEngine.ts","../src/utils/BusinessCalendar.ts"],"names":["z","EventEmitter","p","result","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 * Which open level this decision is for. Only needed inside a parallel group\n * when the approver sits on more than one open branch.\n */\n level: z.number().int().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 /** Which open level this decision is for; see {@link ApproveOptionsSchema}. */\n level: z.number().int().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 * Which open level to act on. Only needed inside a parallel group, where the\n * approver may hold more than one open branch.\n */\n level: z.number().int().optional(),\n});\n\nexport const ReassignOptionsSchema = z.object({\n reassignedBy: z.string().min(1),\n fromApprover: z.string().min(1),\n toApprover: z.string().min(1),\n reason: z.string().min(1),\n /** Which open level to act on; see {@link DelegateOptionsSchema}. */\n level: z.number().int().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 /** The comment being replied to, forming a thread. */\n parentCommentId: z.string().optional(),\n /** Users named in the comment; they are notified when it is posted. */\n mentions: z.array(z.string().min(1)).optional(),\n});\n\nexport const OverrideOptionsSchema = z.object({\n overriddenBy: z.string().min(1),\n justification: z.string().min(1),\n});\n\nexport const RequestInfoOptionsSchema = z.object({\n approverId: z.string().min(1),\n question: z.string().min(1),\n /** Which open level is asking; only needed inside a parallel group. */\n level: z.number().int().optional(),\n});\n\nexport const ProvideInfoOptionsSchema = z.object({\n respondedBy: z.string().min(1),\n response: z.string().min(1),\n});\n\nexport const AddAttachmentOptionsSchema = z.object({\n actorId: z.string().min(1),\n name: z.string().min(1),\n /** Where the file lives. A reference — the engine never stores bytes. */\n uri: z.string().min(1),\n contentType: z.string().optional(),\n sizeBytes: z.number().int().nonnegative().optional(),\n});\n\nexport const RemoveAttachmentOptionsSchema = z.object({\n actorId: z.string().min(1),\n attachmentId: z.string().min(1),\n reason: z.string().optional(),\n});\n\nexport const TransferApprovalsOptionsSchema = z.object({\n fromApprover: z.string().min(1),\n toApprover: z.string().min(1),\n transferredBy: z.string().min(1),\n reason: z.string().min(1),\n /** Restrict the sweep to one document type. */\n documentType: z.string().optional(),\n /** Report what would move without changing anything. */\n dryRun: z.boolean().default(false),\n /** Safety cap on how many instances one sweep will touch. */\n limit: z.number().int().positive().default(500),\n});\n\nexport const UpdateDataOptionsSchema = z.object({\n updatedBy: z.string().min(1),\n data: z.record(z.string(), z.unknown()),\n /** Merge into existing data (default) or replace it wholesale. */\n mode: z.enum(['merge', 'replace']).default('merge'),\n reason: z.string().optional(),\n /** Re-evaluate template conditions against the new data (default true). */\n recomputeChain: z.boolean().default(true),\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 ReassignOptions = z.infer<typeof ReassignOptionsSchema>;\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>;\nexport type UpdateDataOptions = z.infer<typeof UpdateDataOptionsSchema>;\nexport type RequestInfoOptions = z.infer<typeof RequestInfoOptionsSchema>;\nexport type ProvideInfoOptions = z.infer<typeof ProvideInfoOptionsSchema>;\nexport type AddAttachmentOptions = z.infer<typeof AddAttachmentOptionsSchema>;\nexport type RemoveAttachmentOptions = z.infer<typeof RemoveAttachmentOptionsSchema>;\nexport type TransferApprovalsOptions = z.infer<typeof TransferApprovalsOptionsSchema>;\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 {\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\n/**\n * Restore every `Date` the JSON clone flattened to a string.\n *\n * Every date-bearing field must be listed here. Missing one leaves a value the\n * type says is a `Date` holding a string, which `PostgresAdapter` revives\n * correctly — so the two adapters disagree and the bug only shows up under one\n * of them. That is how `attachments[].addedAt` and `infoRequest.askedAt` came\n * to read back as strings.\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 infoRequest: instance.infoRequest\n ? { ...instance.infoRequest, askedAt: new Date(instance.infoRequest.askedAt) }\n : undefined,\n attachments: instance.attachments\n ? instance.attachments.map((a) => ({ ...a, addedAt: new Date(a.addedAt) }))\n : undefined,\n comments: instance.comments\n ? instance.comments.map((c) => ({ ...c, createdAt: new Date(c.createdAt) }))\n : undefined,\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 if (l.reminderDueAt) level.reminderDueAt = new Date(l.reminderDueAt);\n if (l.openedAt) level.openedAt = new Date(l.openedAt);\n return level;\n }),\n };\n}\n\nfunction reviveTemplateDates(template: ApprovalTemplate): ApprovalTemplate {\n return { ...template, createdAt: new Date(template.createdAt) };\n}\n\n/**\n * Read a dot-path from a document, over **own** properties only.\n *\n * Mirrors how conditions resolve field paths, so a filter and a condition\n * written against the same path agree about what that path means — and an\n * inherited prototype member can never make an instance match a query.\n */\nfunction readPath(data: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((obj, key) => {\n if (obj !== null && typeof obj === 'object' && Object.prototype.hasOwnProperty.call(obj, key)) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, data);\n}\n\n/** Structural equality, so a filter can match an object or array value. */\nfunction deepEquals(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const aKeys = Object.keys(a as Record<string, unknown>);\n const bKeys = Object.keys(b as Record<string, unknown>);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(\n (k) =>\n Object.prototype.hasOwnProperty.call(b, k) &&\n deepEquals((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\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.templateName && instance.templateName !== filter.templateName) return false;\n // Stored instances carry string dates (deepClone JSON round-trip), so wrap before comparing.\n if (filter.fromDate && new Date(instance.createdAt) < filter.fromDate) return false;\n if (filter.toDate && new Date(instance.createdAt) > filter.toDate) return false;\n if (filter.data) {\n for (const [path, expected] of Object.entries(filter.data)) {\n if (!deepEquals(readPath(instance.data ?? {}, path), expected)) return false;\n }\n }\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 const template = this.templates.get(`${tenantId}:${name}`);\n return template ? reviveTemplateDates(deepClone(template)) : 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(reviveTemplateDates(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(\n all.map((i) => reviveDates(deepClone(i))),\n opts,\n );\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(\n all.map((i) => reviveDates(deepClone(i))),\n opts,\n );\n }\n\n async getOverdueInstances(\n tenantId: string,\n asOf: Date,\n filter: InstanceFilter = {},\n ): Promise<ApprovalInstance[]> {\n return [...this.instances.values()]\n .filter((i) => {\n if (i.tenantId !== tenantId) return false;\n // Honour the whole filter, not a hand-picked subset. getStatistics()\n // passes its filter straight through, so a partial match here made\n // `overdue` count instances the other figures had excluded — reporting\n // more overdue approvals than the filter said existed.\n if (!applyFilter(i, { ...filter, status: 'pending' })) return false;\n // Escalation overdue on ANY open branch. Filtering to i.currentLevel\n // would miss the upper branches of a parallel group entirely, and left\n // this adapter disagreeing with PostgresAdapter, which already scans\n // every level.\n const hasOverdueEscalation = i.levels.some(\n (l) => l.escalationDueAt != null && new Date(l.escalationDueAt) <= asOf,\n );\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 // Reminder due on any open branch. Without this the scheduler never\n // sees the instance and no reminder is ever sent.\n const hasDueReminder = i.levels.some(\n (l) =>\n l.status === 'pending' && l.reminderDueAt != null && new Date(l.reminderDueAt) <= asOf,\n );\n return (\n hasOverdueEscalation || isExpired || hasSLABreach || hasDelegationExpiry || hasDueReminder\n );\n })\n .map((i) => reviveDates(deepClone(i)));\n }\n\n async deleteInstance(tenantId: string, id: string): Promise<boolean> {\n const key = `${tenantId}:${id}`;\n // The audit trail lives on the instance in this adapter, so removing the\n // instance removes it too — matching PostgresAdapter, which cascades.\n return this.instances.delete(key);\n }\n\n async countInstances(tenantId: string, filter: InstanceFilter): Promise<number> {\n let count = 0;\n for (const instance of this.instances.values()) {\n if (instance.tenantId === tenantId && applyFilter(instance, filter)) count++;\n }\n return count;\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(\n _tenantId: string,\n _instanceId: string,\n _entry: AuditEntry,\n ): Promise<void> {\n // No-op by design. The engine already pushes each entry onto instance.auditLog\n // and persists the whole instance via saveInstance()/updateInstance(), so the\n // embedded log is the source of truth for this adapter. Pushing here too would\n // duplicate every entry (as a dedicated, append-only audit table would in\n // PostgresAdapter, this method exists to satisfy that separate-sink contract).\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","import EventEmitter from 'eventemitter3';\nimport type { ApprovalEventMap, ApprovalEventName } from '../types/index.js';\n\n/**\n * Invoked when a subscriber's listener throws synchronously or returns a\n * rejecting promise. Receives the thrown value and the event that was being\n * delivered.\n */\nexport type ListenerErrorHandler = (error: unknown, event: ApprovalEventName) => void;\n\ntype Wrapped = (...args: unknown[]) => void;\n\n/**\n * Typed event bus for approval lifecycle events.\n *\n * Listener failures are **isolated**: a subscriber that throws cannot abort the\n * engine operation that emitted the event, nor prevent the remaining listeners\n * from running. Before this isolation existed, one buggy `engine.on()` handler\n * would propagate out of `emit()` mid-operation — after the instance had already\n * been persisted — and skip notification dispatch and after-middleware entirely.\n * Failures are reported through {@link setListenerErrorHandler}, matching the\n * swallow-and-log contract the notification and audit adapter paths already use.\n */\nexport class EventBus {\n private emitter = new EventEmitter();\n /** Per-event map of caller-supplied listener to the wrapper actually registered, so `off` can find it. */\n private wrappers = new Map<ApprovalEventName, Map<unknown, Wrapped>>();\n private onListenerError?: ListenerErrorHandler;\n\n /** Route listener failures somewhere. Without this they are swallowed silently. */\n setListenerErrorHandler(handler: ListenerErrorHandler): void {\n this.onListenerError = handler;\n }\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, this.wrap(event, listener, false));\n return this;\n }\n\n off<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n ): this {\n const wrapped = this.wrappers.get(event)?.get(listener);\n if (wrapped) {\n this.emitter.off(event, wrapped);\n this.forget(event, listener);\n }\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, this.wrap(event, listener, true));\n return this;\n }\n\n /**\n * Wraps a caller listener so its failure is contained. The wrapper is recorded\n * per event so {@link off} can unregister by the original function reference.\n */\n private wrap<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n once: boolean,\n ): Wrapped {\n const wrapped: Wrapped = (...args: unknown[]) => {\n try {\n const result: unknown = listener(args[0] as ApprovalEventMap[K]);\n // A listener declared `void` may still be `async`; an unhandled\n // rejection would otherwise escape as a process-level warning.\n if (typeof (result as PromiseLike<void> | undefined)?.then === 'function') {\n void Promise.resolve(result).catch((err: unknown) => {\n this.onListenerError?.(err, event);\n });\n }\n } catch (err) {\n this.onListenerError?.(err, event);\n } finally {\n // eventemitter3 removes a `once` registration itself; drop our bookkeeping too.\n if (once) this.forget(event, listener);\n }\n };\n\n let perEvent = this.wrappers.get(event);\n if (!perEvent) {\n perEvent = new Map<unknown, Wrapped>();\n this.wrappers.set(event, perEvent);\n }\n perEvent.set(listener, wrapped);\n return wrapped;\n }\n\n private forget(event: ApprovalEventName, listener: unknown): void {\n const perEvent = this.wrappers.get(event);\n if (!perEvent) return;\n perEvent.delete(listener);\n if (perEvent.size === 0) this.wrappers.delete(event);\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 fatal(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 fatal: () => {},\n debug: () => {},\n};\n","export interface Clock {\n now(): Date;\n}\n\nexport const systemClock: Clock = { now: () => new Date() };\n","export type IdGeneratorPrefix = 'inst' | 'tpl' | 'att' | 'cmt';\n\nexport type IdGeneratorFn = (prefix: IdGeneratorPrefix) => string;\n\nexport const defaultIdGenerator: IdGeneratorFn = (prefix) =>\n `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n","import type { IStorageAdapter } from '../adapters/IStorageAdapter.js';\nimport type {\n ApprovalTemplateConfig,\n ApprovalTemplate,\n ApprovalLevelConfig,\n} 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 /**\n * Flatten a template that declares `extends` against its base.\n *\n * Resolution is done once, at define time, and the flattened result is what\n * gets stored. Resolving lazily on read would mean editing a base silently\n * reshapes every derived template — and every in-flight instance running\n * against one — which is exactly the surprise `templateSnapshot` exists to\n * prevent elsewhere in the engine.\n *\n * Merge rules:\n * - **Levels** are keyed by level number. A child level with the same number\n * overrides the base level field by field, so a derived template can change\n * just the approvers and inherit the rest. Child-only levels are appended,\n * and `removeLevels` drops inherited ones.\n * - **conditions** are replaced wholesale when the child supplies them.\n * Concatenating two rule lists would produce a chain neither author\n * intended, and there is no meaningful way to \"merge\" boolean rules.\n * - **escalation**, **slaDeadlineDays** and **allowOverride** are taken from\n * the child when set, otherwise inherited.\n *\n * A base that itself extends something is already flattened in storage, so\n * chains resolve naturally and cycles cannot form: the base must exist before\n * the child can name it.\n *\n * @param config - The raw config as supplied by the caller.\n * @returns The config with inheritance applied, or unchanged if no `extends`.\n */\n async resolveInheritance(config: ApprovalTemplateConfig): Promise<ApprovalTemplateConfig> {\n if (!config.extends) return config;\n\n if (config.extends === config.name) {\n throw new ApprovalValidationError(`Template \"${config.name}\" cannot extend itself.`);\n }\n\n const base = await this.adapter.getTemplate(this.tenantId, config.extends);\n if (!base) {\n throw new ApprovalTemplateNotFoundError(\n `${config.extends} (referenced by \"${config.name}\" via extends)`,\n );\n }\n\n const removed = new Set(config.removeLevels ?? []);\n const byLevel = new Map<number, ApprovalLevelConfig>();\n for (const lvl of base.levels) {\n if (!removed.has(lvl.level)) byLevel.set(lvl.level, lvl);\n }\n for (const lvl of config.levels ?? []) {\n const inherited = byLevel.get(lvl.level);\n byLevel.set(lvl.level, inherited ? { ...inherited, ...lvl } : lvl);\n }\n\n const levels = [...byLevel.values()].sort((a, b) => a.level - b.level);\n\n const resolved: ApprovalTemplateConfig = {\n ...config,\n levels,\n conditions: config.conditions ?? base.conditions,\n escalation: config.escalation ?? base.escalation,\n slaDeadlineDays: config.slaDeadlineDays ?? base.slaDeadlineDays,\n allowOverride: config.allowOverride ?? base.allowOverride,\n };\n // `extends`/`removeLevels` are directives for this call, not state to persist:\n // the stored template is already flattened.\n delete resolved.extends;\n delete resolved.removeLevels;\n return resolved;\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\n/** Cap on transitive out-of-office substitution, so a cover cycle terminates. */\nconst MAX_OOO_HOPS = 5;\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?(\n attr: string,\n value: unknown,\n tenantId?: string,\n ): Promise<string[]> | string[];\n}\n\n/**\n * Supplies out-of-office cover so an approver on leave does not stall a chain.\n *\n * Consulted whenever a level's approvers are resolved — at submit, when a level\n * activates, and when a chain is previewed. Kept as an injected provider rather\n * than engine-owned state because absence lives in the HR or directory system\n * that already knows about leave; duplicating it here would guarantee the two\n * disagree.\n */\nexport interface OutOfOfficeProvider {\n /**\n * @param userId - The approver about to be assigned.\n * @param at - The moment cover is being resolved for.\n * @returns The user to stand in, or null/undefined when the approver is available.\n */\n getDelegateFor(\n userId: string,\n at: Date,\n ): Promise<string | null | undefined> | string | null | undefined;\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 /**\n * Copy every custom resolver and approver type onto another resolver.\n *\n * Used when the engine builds a throwaway copy of itself for a simulation: a\n * simulation that could not resolve the caller's own `dynamic` approvers\n * would answer a different question from the one asked.\n */\n copyRegistrationsTo(target: LevelResolver): void {\n for (const [name, fn] of this.resolvers) target.register(name, fn);\n for (const [name, fn] of this.approverTypes) target.registerApproverType(name, fn);\n }\n\n async resolveApprovers(\n approvers: ApproverConfig[],\n submittedBy: string,\n data: Record<string, unknown>,\n orgProvider?: OrgProvider,\n outOfOffice?: OutOfOfficeProvider,\n at?: Date,\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(\n (approver as { type: 'dynamic'; resolver: string }).resolver,\n );\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>, {\n submittedBy,\n data,\n orgProvider,\n });\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 this.applyOutOfOffice(result, outOfOffice, at);\n }\n\n /**\n * Replace approvers who are away with their cover.\n *\n * Substitution is transitive up to {@link MAX_OOO_HOPS} so an A→B→C chain of\n * absences still lands on someone present, but a cycle (A covers B while B\n * covers A) simply stops rather than looping — leaving the original approver\n * assigned, which is visible and fixable, unlike a hang.\n *\n * A provider that throws is treated as \"no cover known\": an HR lookup failing\n * must not block an approval from being routed at all.\n */\n private async applyOutOfOffice(\n userIds: string[],\n provider: OutOfOfficeProvider | undefined,\n at: Date | undefined,\n ): Promise<string[]> {\n if (!provider) return userIds;\n const asOf = at ?? new Date();\n const covered: string[] = [];\n\n for (const original of userIds) {\n let current = original;\n const seen = new Set<string>([current]);\n for (let hop = 0; hop < MAX_OOO_HOPS; hop++) {\n let delegate: string | null | undefined;\n try {\n delegate = await provider.getDelegateFor(current, asOf);\n } catch {\n break;\n }\n if (!delegate || delegate === current || seen.has(delegate)) break;\n seen.add(delegate);\n current = delegate;\n }\n covered.push(current);\n }\n\n return [...new Set(covered)];\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, levelNumber?: number) => Promise<void>;\n onExpire?: (instanceId: string, deadlineAction: 'cancel' | 'reject') => Promise<void>;\n onSlaBreach?: (instanceId: string) => Promise<void>;\n onRevertDelegation?: (\n instanceId: string,\n levelNumber: number,\n fromApprover: string,\n ) => Promise<void>;\n /** Called when a pending level's reminder falls due. */\n onRemind?: (instanceId: string, levelNumber: number) => 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 onRemind?: EscalationSchedulerOpts['onRemind'];\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.onRemind = opts.onRemind;\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()\n .catch((err) => {\n this.logger.error('EscalationScheduler: unhandled error in tick', err, {\n tenantId: this.tenantId,\n });\n })\n .finally(() => {\n this.tickPromise = null;\n });\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 // 0. An open clarification request puts the instance on hold: its\n // deadlines do not advance while the submitter owes an answer. Skipping\n // the whole tick is what makes that true — extending deadlines only on\n // resume would still let a long hold escalate or expire mid-wait.\n if (instance.infoRequest) {\n this.logger.debug('EscalationScheduler: skipping instance on hold', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\n continue;\n }\n\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. Send any due reminders, per open branch.\n if (this.onRemind) {\n for (const level of instance.levels) {\n if (\n level.status === 'pending' &&\n level.reminderDueAt &&\n new Date(level.reminderDueAt) <= now\n ) {\n try {\n await this.onRemind(instance.id, level.level);\n } catch (err) {\n this.logger.error('EscalationScheduler: failed to send reminder', err, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n levelNumber: level.level,\n });\n }\n }\n }\n }\n\n // 5. Check escalation on EVERY open branch. A parallel group has more\n // than one level collecting decisions, each with its own deadline;\n // checking only instance.currentLevel would leave the upper branches\n // of a group unable to escalate at all.\n for (const level of instance.levels) {\n if (\n level.status === 'pending' &&\n level.escalationDueAt &&\n new Date(level.escalationDueAt) <= now\n ) {\n await this.onEscalate(instance.id, level.level);\n this.logger.debug('EscalationScheduler: escalated instance', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n levelNumber: level.level,\n });\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(escalationAfterDays: number, fromDate: Date): 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 {\n Condition,\n ConditionExpression,\n ConditionGroup,\n ConditionRule,\n ApprovalLevelConfig,\n} from '../types/index.js';\nimport { ApprovalValidationError } from '../errors.js';\n\nexport type ConditionOperatorFn = (actual: unknown, expected: unknown) => boolean;\n\n/**\n * Coerce a value to a number *only* when it unambiguously represents one.\n *\n * Plain `Number()` maps `null`, `''`, `' '`, `[]` and `false` all to `0`, which\n * in an approval engine is an approval-bypass hazard: a rule such as\n * `{ amount: '<' 5000 } -> skipLevels: [2, 3]` would fire on a document whose\n * `amount` is missing or blank, silently skipping two approval levels. Numeric\n * comparison against a value that is not a number is not \"false-y\", it is\n * *undecidable*, so this returns `null` and the comparison reports no match —\n * the same outcome `undefined` has always produced.\n *\n * Accepted: finite numbers, bigints, `Date` (compared as epoch ms), and numeric\n * strings such as `'100'` or `' 1e3 '` (ERP payloads routinely arrive as JSON\n * strings). Rejected: `null`, `undefined`, booleans, arrays, objects, blank\n * strings, and the non-finite `NaN` / `Infinity`.\n *\n * @param value - The raw value taken from the condition or the context data.\n * @returns The numeric value, or `null` when the value is not comparable.\n */\nexport function toComparableNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'bigint') return Number(value);\n if (value instanceof Date) {\n const time = value.getTime();\n return Number.isFinite(time) ? time : null;\n }\n if (typeof value === 'string') {\n // Number('') and Number(' ') are both 0 — reject blanks before coercing.\n if (value.trim() === '') return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\n/** Build a numeric operator that reports no match unless BOTH operands are comparable numbers. */\nfunction numeric(compare: (left: number, right: number) => boolean): ConditionOperatorFn {\n return (actual, expected) => {\n const left = toComparableNumber(actual);\n const right = toComparableNumber(expected);\n if (left === null || right === null) return false;\n return compare(left, right);\n };\n}\n\n// Built-in operators seeded at module load time.\nconst operatorRegistry = new Map<string, ConditionOperatorFn>([\n ['>', numeric((a, e) => a > e)],\n ['<', numeric((a, e) => a < e)],\n ['>=', numeric((a, e) => a >= e)],\n ['<=', numeric((a, e) => a <= 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// Names reserved at module load so built-ins can never be shadowed by a custom operator.\nconst builtinOperatorNames = new Set(operatorRegistry.keys());\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 if (builtinOperatorNames.has(name)) {\n throw new ApprovalValidationError(\n `Condition operator \"${name}\" is a built-in and cannot be overridden. Choose a different name.`,\n );\n }\n operatorRegistry.set(name, fn);\n}\n\n/**\n * Resolve a dot-separated path against the context data, reading **own**\n * properties only.\n *\n * The `in` operator this previously used walks the prototype chain, so a\n * condition on `isFastTrack` would be satisfied by an inherited\n * `Object.prototype.isFastTrack` that no document ever declared. Prototype\n * pollution is a common enough hazard in a JavaScript dependency tree that an\n * approval engine must not let it decide whether a level is skipped — so a path\n * segment that is not an own property resolves to `undefined`, exactly as a\n * genuinely absent field does. This also blocks `__proto__`, `constructor`, and\n * `prototype`, none of which are own properties of a data object.\n *\n * @param data - The instance context data the condition is evaluated against.\n * @param path - Dot-separated field path, e.g. `'vendor.country'`.\n * @returns The value at the path, or `undefined` if any segment is absent.\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' && Object.prototype.hasOwnProperty.call(obj, key)) {\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\n/** Narrow an expression to a boolean combinator, or return null if it is a leaf condition. */\nfunction asGroup(expression: ConditionExpression): ConditionGroup | null {\n if (expression === null || typeof expression !== 'object' || Array.isArray(expression)) {\n return null;\n }\n const candidate = expression as Partial<Record<'all' | 'any' | 'not', unknown>>;\n const keys = (['all', 'any', 'not'] as const).filter((k) => candidate[k] !== undefined);\n if (keys.length === 0) return null;\n if (keys.length > 1) {\n throw new ApprovalValidationError(\n `Condition group must set exactly one of \"all\", \"any\" or \"not\" (got ${keys.join(', ')}).`,\n );\n }\n const key = keys[0] as 'all' | 'any' | 'not';\n if (key !== 'not' && !Array.isArray(candidate[key])) {\n throw new ApprovalValidationError(`Condition group \"${key}\" must be an array of expressions.`);\n }\n if (key !== 'not' && (candidate[key] as unknown[]).length === 0) {\n // An empty `all` is vacuously true and an empty `any` vacuously false; both are\n // far more likely to be a construction bug than an intent, so reject them.\n throw new ApprovalValidationError(`Condition group \"${key}\" must not be empty.`);\n }\n return expression as ConditionGroup;\n}\n\n/**\n * Evaluate a condition expression tree.\n *\n * A bare condition is a leaf; an array is shorthand for `all`, which is what a\n * `when: [...]` meant before groups existed; and a group applies its\n * combinator to nested expressions, recursing to any depth.\n */\nfunction evaluateExpression(\n expression: ConditionExpression,\n data: Record<string, unknown>,\n): boolean {\n if (Array.isArray(expression)) {\n return expression.every((child) => evaluateExpression(child, data));\n }\n\n const group = asGroup(expression);\n if (group === null) {\n return evaluateCondition(expression as Condition, data);\n }\n if (group.all !== undefined) {\n return group.all.every((child) => evaluateExpression(child, data));\n }\n if (group.any !== undefined) {\n return group.any.some((child) => evaluateExpression(child, data));\n }\n return !evaluateExpression(group.not, data);\n}\n\n/**\n * Statically check a condition expression tree, collecting every problem rather\n * than throwing on the first.\n *\n * Runs at template-definition time so a malformed group is caught while the\n * author is looking at it, instead of at submit time on a real document. The\n * operator check is deliberately deferred: custom operators can be registered\n * after a template is defined, so an unknown name is only an error once the\n * condition is actually evaluated.\n *\n * @param expression - The `when` expression to check.\n * @param path - Field path prefix used in reported errors.\n * @returns One entry per problem found; empty when the tree is well formed.\n */\nexport function validateConditionExpression(\n expression: ConditionExpression,\n path: string,\n): Array<{ field: string; message: string }> {\n const errors: Array<{ field: string; message: string }> = [];\n\n const walk = (node: ConditionExpression, at: string): void => {\n if (Array.isArray(node)) {\n if (node.length === 0) {\n errors.push({ field: at, message: 'Condition list must not be empty.' });\n }\n node.forEach((child, i) => walk(child, `${at}[${i}]`));\n return;\n }\n\n let group: ConditionGroup | null;\n try {\n group = asGroup(node);\n } catch (err) {\n errors.push({ field: at, message: (err as Error).message });\n return;\n }\n\n if (group === null) {\n const leaf = node as Partial<Condition>;\n if (typeof leaf?.field !== 'string' || leaf.field.length === 0) {\n errors.push({\n field: `${at}.field`,\n message: 'Condition requires a non-empty field path.',\n });\n }\n if (typeof leaf?.operator !== 'string' || leaf.operator.length === 0) {\n errors.push({ field: `${at}.operator`, message: 'Condition requires an operator.' });\n }\n return;\n }\n\n if (group.all !== undefined) {\n group.all.forEach((child, i) => walk(child, `${at}.all[${i}]`));\n } else if (group.any !== undefined) {\n group.any.forEach((child, i) => walk(child, `${at}.any[${i}]`));\n } else {\n walk(group.not, `${at}.not`);\n }\n };\n\n walk(expression, path);\n return errors;\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 (evaluateExpression(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\nfunction assertHasApprovers(level: ApprovalLevelInstance): number {\n const total = level.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 return total;\n}\n\n/** Fail compilation when a new mode is added without a matching case. */\nfunction assertNeverMode(mode: never): never {\n throw new Error(`Unhandled approval mode: ${String(mode)}`);\n}\n\n/** Resolve the minimum-approvals threshold for a quorum level, validating configuration. */\nfunction quorumThreshold(level: ApprovalLevelInstance, total: number): number {\n const min = level.minApprovals;\n if (min === undefined || !Number.isInteger(min) || min < 1) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") uses 'quorum' mode but minApprovals is not a positive integer (got ${String(min)}).`,\n );\n }\n if (min > total) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") requires ${min} approvals (quorum) but only ${total} approver(s) are assigned.`,\n );\n }\n return min;\n}\n\nfunction weightOf(level: ApprovalLevelInstance, approverId: string): number {\n const w = level.weights?.[approverId];\n return typeof w === 'number' && w >= 0 ? w : 1;\n}\n\nfunction sumWeights(level: ApprovalLevelInstance, ids: string[]): number {\n return ids.reduce((acc, id) => acc + weightOf(level, id), 0);\n}\n\n/** Resolve the weight threshold for a weighted level, validating configuration. */\nfunction weightedThreshold(level: ApprovalLevelInstance, totalWeight: number): number {\n const threshold = level.threshold;\n if (threshold === undefined || threshold <= 0) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") uses 'weighted' mode but threshold is not a positive number (got ${String(threshold)}).`,\n );\n }\n if (threshold > totalWeight) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") needs a weight of ${threshold} but the assigned approvers total only ${totalWeight}.`,\n );\n }\n return threshold;\n}\n\nexport function isLevelApproved(level: ApprovalLevelInstance): boolean {\n const total = assertHasApprovers(level);\n const { mode, approvedBy } = level;\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 case 'quorum':\n return count >= quorumThreshold(level, total);\n case 'weighted': {\n const totalWeight = sumWeights(level, level.approverIds);\n return sumWeights(level, approvedBy) >= weightedThreshold(level, totalWeight);\n }\n default:\n return assertNeverMode(mode);\n }\n}\n\nexport function isLevelRejected(level: ApprovalLevelInstance): boolean {\n const total = assertHasApprovers(level);\n const { mode, rejectedBy } = level;\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 case 'quorum': {\n // Rejected once the remaining (not-yet-rejected) approvers can no longer reach the quorum.\n const min = quorumThreshold(level, total);\n return total - rejectCount < min;\n }\n case 'weighted': {\n // Rejected once the achievable weight (total minus rejected) drops below the threshold.\n const totalWeight = sumWeights(level, level.approverIds);\n const threshold = weightedThreshold(level, totalWeight);\n return totalWeight - sumWeights(level, rejectedBy) < threshold;\n }\n default:\n return assertNeverMode(mode);\n }\n}\n","/**\n * Statistical summary of a set of timing samples.\n *\n * For an empty sample set every field is `0` (never `NaN`).\n */\nexport interface TimingStats {\n /** Number of samples observed. */\n count: number;\n /** Sum of all samples. */\n sum: number;\n /** Smallest observed sample (`0` when empty). */\n min: number;\n /** Largest observed sample (`0` when empty). */\n max: number;\n /** Arithmetic mean, `sum / count` (`0` when empty). */\n avg: number;\n /** 50th percentile (median) via the nearest-rank method (`0` when empty). */\n p50: number;\n /** 95th percentile via the nearest-rank method (`0` when empty). */\n p95: number;\n}\n\n/**\n * Compute a percentile using the **nearest-rank** method on a pre-sorted\n * ascending array.\n *\n * The nearest-rank rank is `ceil(p/100 * N)`, clamped to `[1, N]`; the result\n * is the sample at that 1-based rank. This method:\n *\n * - returns an actual observed sample (no interpolation between samples);\n * - for a single sample yields that sample for every percentile (so\n * `p50 === p95 === value`);\n * - is exact and deterministic for small fixed sample sets, which makes it\n * straightforward to assert in unit tests.\n *\n * @param sortedAsc - Samples sorted ascending. Must be non-empty.\n * @param p - Percentile in the range `(0, 100]`.\n * @returns The sample value at the nearest rank.\n */\nexport function percentileNearestRank(sortedAsc: readonly number[], p: number): number {\n const n = sortedAsc.length;\n if (n === 0) return 0;\n const rank = Math.ceil((p / 100) * n);\n const index = Math.min(Math.max(rank, 1), n) - 1;\n return sortedAsc[index] as number;\n}\n\n/**\n * Compute a full {@link TimingStats} summary from raw, unsorted samples.\n *\n * Percentiles use {@link percentileNearestRank}. An empty input yields all-zero\n * stats so callers never have to special-case `NaN`.\n *\n * @param samples - Raw timing samples (already sanitized: finite, `>= 0`).\n * @returns The computed statistics.\n */\nexport function computeTimingStats(samples: readonly number[]): TimingStats {\n const count = samples.length;\n if (count === 0) {\n return { count: 0, sum: 0, min: 0, max: 0, avg: 0, p50: 0, p95: 0 };\n }\n const sorted = [...samples].sort((a, b) => a - b);\n let sum = 0;\n for (const s of sorted) sum += s;\n const min = sorted[0] as number;\n const max = sorted[count - 1] as number;\n return {\n count,\n sum,\n min,\n max,\n avg: sum / count,\n p50: percentileNearestRank(sorted, 50),\n p95: percentileNearestRank(sorted, 95),\n };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n IStorageAdapter,\n InstanceFilter,\n PaginationOpts,\n PaginatedResult,\n CursorPaginationOpts,\n CursorPaginatedResult,\n} from '../adapters/IStorageAdapter.js';\nimport type {\n ApprovalTemplate,\n ApprovalTemplateConfig,\n ApprovalLevelConfig,\n ApprovalInstance,\n ApprovalLevelInstance,\n ApprovalStatus,\n LevelStatus,\n Comment,\n EscalationStep,\n Attachment,\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 ReassignOptionsSchema,\n CancelOptionsSchema,\n EscalateOptionsSchema,\n ResubmitOptionsSchema,\n AddCommentOptionsSchema,\n OverrideOptionsSchema,\n UpdateDataOptionsSchema,\n RequestInfoOptionsSchema,\n AddAttachmentOptionsSchema,\n RemoveAttachmentOptionsSchema,\n TransferApprovalsOptionsSchema,\n ProvideInfoOptionsSchema,\n type SubmitOptions,\n type ApproveOptions,\n type RejectOptions,\n type DelegateOptions,\n type ReassignOptions,\n type CancelOptions,\n type EscalateOptions,\n type ResubmitOptions,\n type AddCommentOptions,\n type OverrideOptions,\n type UpdateDataOptions,\n type RequestInfoOptions,\n type AddAttachmentOptions,\n type RemoveAttachmentOptions,\n type TransferApprovalsOptions,\n type ProvideInfoOptions,\n} from '../utils/validate.js';\nimport { MemoryAdapter } from '../adapters/MemoryAdapter.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 { BusinessCalendar } from '../utils/BusinessCalendar.js';\nimport type { IdGeneratorPrefix } from '../utils/IdGenerator.js';\nimport { defaultIdGenerator } from '../utils/IdGenerator.js';\nimport { TemplateRegistry } from './TemplateRegistry.js';\nimport {\n LevelResolver,\n type OrgProvider,\n type ApproverResolverFn,\n type OutOfOfficeProvider,\n} from './LevelResolver.js';\nimport { EscalationScheduler } from './EscalationScheduler.js';\nimport {\n evaluateConditions,\n registerConditionOperator,\n validateConditionExpression,\n type ConditionOperatorFn,\n} 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 ApprovalTemplateNotFoundError,\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';\nimport { computeTimingStats, type TimingStats } from '../plugins/metrics/stats.js';\n\nexport { ApprovalError } from '../errors.js';\nexport {\n ApprovalNotFoundError,\n ApprovalConflictError,\n ApprovalForbiddenError,\n ApprovalValidationError,\n ApprovalTemplateNotFoundError,\n} from '../errors.js';\n\n/** Reminders sent for one level before the engine stops nudging, absent an explicit cap. */\n/** How deep sub-workflows may nest before the engine refuses, so a template cycle terminates. */\nconst MAX_SUBWORKFLOW_DEPTH = 5;\n/** Instances one purge sweep will remove unless the caller raises it. */\nconst DEFAULT_PURGE_LIMIT = 1000;\nconst DEFAULT_MAX_REMINDERS = 3;\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 50;\nconst TERMINAL_STATUSES = new Set<ApprovalInstance['status']>([\n 'approved',\n 'rejected',\n 'cancelled',\n 'expired',\n]);\n/** Statuses counted as \"completed\" for cycle-time analytics — see {@link ApprovalStatistics.cycleTime}. */\nconst CYCLE_TIME_STATUSES: ApprovalInstance['status'][] = ['approved', 'rejected', 'cancelled'];\n/** Page size used when paging through a full result set via `getInstancesByFilter`. */\nconst CYCLE_TIME_FETCH_BATCH_SIZE = 500;\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?:\n | 'not_an_approver'\n | 'already_acted'\n | 'self_approval'\n | 'wrong_status'\n | '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\n/** Where one level in an explained chain came from. */\nexport interface ExplainedLevel {\n level: number;\n name: string;\n mode: ApprovalMode;\n /** `'template'` for a statically declared level, `'condition'` for one a rule added. */\n source: 'template' | 'condition';\n /** Index of the condition rule that added it, when `source` is `'condition'`. */\n addedByRule?: number;\n resolvedApprovers: string[];\n /** Why approver resolution failed, when it did. The level is still listed. */\n resolutionError?: string;\n /** Set when this level hands off to a child approval. */\n subWorkflowTemplate?: string;\n}\n\n/** A level the template declares that will not run, and the rule that removed it. */\nexport interface ExplainedSkip {\n level: number;\n name: string;\n /** Index of the condition rule whose `skipLevels` removed it. */\n skippedByRule: number;\n}\n\n/** How one condition rule evaluated against the data. */\nexport interface ExplainedRule {\n index: number;\n matched: boolean;\n /** Levels this rule would add. Present whether or not it matched. */\n addsLevels: number[];\n /** Levels this rule would skip. Present whether or not it matched. */\n skipsLevels: number[];\n /** Why the rule could not be evaluated, e.g. an unregistered operator. */\n error?: string;\n}\n\n/**\n * A full account of why a chain looks the way it does.\n *\n * `previewApprovalChain()` answers *what* the chain will be; this answers *why*,\n * which is the question a support engineer actually has when a purchase order\n * arrives with a level nobody expected.\n */\nexport interface ChainExplanation {\n templateName: string;\n levels: ExplainedLevel[];\n skipped: ExplainedSkip[];\n rules: ExplainedRule[];\n}\n\n/** One scripted decision in a {@link ApprovalEngine.simulate} run. */\nexport type SimulatedDecision =\n | { approve: string; level?: number; comment?: string }\n | { reject: string; level?: number; reason?: string };\n\n/** What one scripted decision did. */\nexport interface SimulationStep {\n /** 1-based position in the script. */\n step: number;\n action: 'approve' | 'reject';\n actorId: string;\n /** The level the decision landed on, when it was accepted. */\n level?: number;\n /** Instance status after the decision. */\n status: ApprovalStatus;\n /** Why the decision was refused, when it was. The run stops at the first refusal. */\n error?: string;\n}\n\n/** Outcome of a {@link ApprovalEngine.simulate} run. */\nexport interface SimulationResult {\n finalStatus: ApprovalStatus;\n /** The chain the document would get, in order. */\n levels: Array<{ level: number; name: string; status: LevelStatus; approvers: string[] }>;\n transcript: SimulationStep[];\n /** Levels never reached because the run ended first. */\n unreachedLevels: number[];\n /** True when the script ran out before the approval finished. */\n incomplete: boolean;\n}\n\nexport interface BulkResult {\n succeeded: ApprovalInstance[];\n failed: Array<{ instanceId: string; error: ApprovalError }>;\n total: number;\n}\n\n/** Outcome of a {@link ApprovalEngine.transferApprovals} sweep. */\nexport interface TransferResult {\n /** One entry per level actually moved (an instance can hold the approver on several open branches). */\n transferred: Array<{ instanceId: string; level: number; documentId: string }>;\n /** Instances that could not be moved, with the reason. */\n failed: Array<{ instanceId: string; error: ApprovalError }>;\n /** Instances examined. */\n scanned: number;\n /** True when nothing was written. */\n dryRun: boolean;\n}\n\n/**\n * What one approver currently owes a decision on.\n *\n * Durations are milliseconds. An approver appears only while they hold at least\n * one open level.\n */\nexport interface ApproverWorkload {\n approverId: string;\n /** Open levels assigned to them. One instance can contribute several across parallel branches. */\n pending: number;\n /** Distinct documents involved — usually, but not always, equal to {@link pending}. */\n instances: number;\n /** Open levels already past their escalation deadline. */\n overdue: number;\n /** Open levels currently paused by a clarification request. */\n onHold: number;\n /** When the oldest of their open items was submitted. */\n oldestPendingAt?: Date;\n /** Age of that oldest item. `0` when they hold nothing. */\n oldestAgeMs: number;\n}\n\n/** Version stamp on an exported bundle, so an importer can reject a shape it does not understand. */\nexport const TEMPLATE_BUNDLE_VERSION = 1;\n\n/**\n * A portable set of templates, safe to move between environments.\n *\n * Deliberately carries no `id`, `tenantId`, `createdAt`, `version` or\n * `previousVersionId`: those describe one row in one database, and importing\n * them would either collide with the target's own ids or silently claim a\n * lineage the target never had.\n */\nexport interface TemplateBundle {\n bundleVersion: number;\n exportedAt: Date;\n templates: ApprovalTemplateConfig[];\n}\n\n/** Outcome of {@link ApprovalEngine.importTemplates}. */\nexport interface ImportResult {\n created: string[];\n updated: string[];\n skipped: string[];\n errors: Array<{ name: string; message: string }>;\n dryRun: boolean;\n}\n\n/** Outcome of a {@link ApprovalEngine.purgeInstances} sweep. */\nexport interface PurgeResult {\n /** Instances actually removed (or that would be, under `dryRun`). */\n purged: Array<{ instanceId: string; documentId: string; status: ApprovalInstance['status'] }>;\n /** Instances examined. */\n scanned: number;\n /** True when nothing was written. */\n dryRun: boolean;\n}\n\nexport interface ApprovalStatistics {\n /** Total instances matching the filter (across all statuses). */\n total: number;\n /** Count per status. */\n byStatus: Record<ApprovalInstance['status'], number>;\n /** Instances still pending past their escalation/expiry deadline. */\n overdue: number;\n /** approved / (approved + rejected); 0 when nothing has been resolved. */\n approvalRate: number;\n /**\n * Counts broken down per template name. Only populated (non-empty) when the\n * global statistics are scoped with a filter that already lists the tenant's\n * templates — i.e. this engine always returns the per-template breakdown for\n * its own tenant. Absent when no instances match the filter.\n */\n byTemplate: Record<\n string,\n { total: number; approved: number; rejected: number; pending: number }\n >;\n /**\n * Time-to-decision (\"cycle time\") analytics, in milliseconds, for\n * **completed** instances matching the filter — status `'approved'`,\n * `'rejected'`, or `'cancelled'`. `'expired'` instances are excluded: their\n * terminal timestamp reflects a scheduler deadline firing, not a decision\n * being made, so they would skew the distribution rather than describe it.\n *\n * Elapsed time per instance is `updatedAt - createdAt`: `createdAt` is the\n * submission instant, and `updatedAt` is set at the moment the instance\n * transitions to its terminal status (see {@link ApprovalEngine.approve},\n * {@link ApprovalEngine.reject}, {@link ApprovalEngine.cancel}). See\n * {@link CycleTimeStats} for the zeroed shape returned when there are no\n * completed instances.\n */\n cycleTime: CycleTimeStats;\n /**\n * The same {@link cycleTime} analytics broken down per template name.\n * Mirrors the {@link byTemplate} population rule: a template only appears\n * here when at least one of its instances is completed (`count > 0`).\n */\n cycleTimeByTemplate: Record<string, CycleTimeStats>;\n}\n\n/**\n * Time-to-decision (\"cycle time\") statistics for a set of completed approval\n * instances. All duration fields are in **milliseconds**.\n *\n * When {@link count} is `0` (no completed instances matched), every other\n * field is `0` — never `NaN` — mirroring {@link computeTimingStats}'s\n * empty-input behavior, which this type's values are derived from.\n */\nexport interface CycleTimeStats {\n /** Number of completed instances included in this computation. */\n count: number;\n /** Arithmetic mean time-to-decision. `0` when {@link count} is `0`. */\n averageMs: number;\n /** 50th percentile (median) time-to-decision, via nearest-rank. `0` when {@link count} is `0`. */\n p50Ms: number;\n /** 95th percentile time-to-decision, via nearest-rank. `0` when {@link count} is `0`. */\n p95Ms: number;\n /** Smallest observed time-to-decision. `0` when {@link count} is `0`. */\n minMs: number;\n /** Largest observed time-to-decision. `0` when {@link count} is `0`. */\n maxMs: 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 /**\n * Supplies stand-ins for approvers who are away, so leave does not stall a\n * chain. Consulted every time approvers are resolved.\n */\n outOfOfficeProvider?: OutOfOfficeProvider;\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 /**\n * Optional business-day calendar. When provided, escalationAfterDays and\n * slaDeadlineDays are interpreted as business days (skipping weekends and\n * holidays) instead of plain calendar days. See weekendCalendar().\n */\n calendar?: BusinessCalendar;\n /** Custom ID generator for instances and templates. Defaults to timestamp+random. */\n generateId?: (prefix: IdGeneratorPrefix) => string;\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 /**\n * Custom scheduler adapter (BullMQ, Temporal, cron) that drives the recurring\n * escalation/expiry/SLA-breach/delegation-revert scan.\n *\n * When provided, the built-in `setInterval` poll (see\n * {@link EscalationScheduler.start}) is never started. Instead,\n * {@link ISchedulerAdapter.scheduleAt} schedules each scan, and its callback\n * reschedules the next one itself once the scan completes — the adapter\n * changes *how* the periodic scan is triggered, not *what* it scans; every\n * tick still runs the exact same overdue-instance query the built-in poller\n * runs. {@link ISchedulerAdapter.cancel} and {@link ISchedulerAdapter.shutdown}\n * are invoked during {@link ApprovalEngine.shutdown}. Omitting this option\n * preserves the built-in `setInterval` polling behavior unchanged.\n */\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 escalationPollIntervalMs: number;\n private readonly tenantId: string;\n private readonly logger: Logger;\n private readonly clock: Clock;\n private readonly calendar?: BusinessCalendar;\n private readonly generateId: (prefix: IdGeneratorPrefix) => string;\n private readonly maxBulkItems: number;\n private readonly retryPolicy: Required<RetryPolicy>;\n private readonly idempotencyKeyFn: IdempotencyKeyFn;\n /** Handle for the currently-scheduled escalation tick when {@link ApprovalEngineOptions.schedulerAdapter} is set. */\n private schedulerAdapterHandle: string | null = null;\n /** Set by {@link shutdown}; stops the self-rescheduling loop from scheduling another tick. */\n private schedulerStopped = false;\n\n constructor(private readonly opts: ApprovalEngineOptions) {\n this.tenantId = opts.tenantId ?? 'default';\n this.logger = opts.logger ?? noopLogger;\n // A subscriber's listener must never abort the operation that emitted the\n // event; report and carry on, as the notification/audit paths do.\n this.bus.setListenerErrorHandler((err, event) => {\n this.logger.error('event listener threw', err, { tenantId: this.tenantId, event });\n });\n this.clock = opts.clock ?? systemClock;\n this.calendar = opts.calendar;\n this.generateId = opts.generateId ?? defaultIdGenerator;\n this.maxBulkItems = opts.maxBulkItems ?? 200;\n this.escalationPollIntervalMs = opts.escalationPollIntervalMs ?? 60_000;\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, levelNumber) => {\n await this.escalateInternal(id, 'system', undefined, levelNumber);\n },\n onExpire: async (id, action) => {\n await this.expireInstance(id, action);\n },\n onSlaBreach: async (id) => {\n await this.markSlaBreached(id);\n },\n onRevertDelegation: async (id, level, from) => {\n await this.revertDelegation(id, level, from);\n },\n onRemind: async (id, levelNumber) => {\n await this.sendReminder(id, levelNumber);\n },\n pollIntervalMs: this.escalationPollIntervalMs,\n logger: this.logger,\n clock: this.clock,\n });\n if (opts.schedulerAdapter) {\n this.scheduleNextEscalationTick(opts.schedulerAdapter);\n } else {\n this.escalation.start();\n }\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 // A config that declares `extends` may legitimately carry no levels of its\n // own — the chain comes from the base. defineTemplate validates the\n // flattened result, which is what instances actually run against.\n const hasOwnLevels = Boolean(config.levels && config.levels.length > 0);\n if (!hasOwnLevels && config.extends === undefined) {\n errors.push({ field: 'levels', message: 'Template must have at least one level.' });\n }\n if (hasOwnLevels) {\n const levelNums = new Set<number>();\n config.levels.forEach((l, i) => {\n if (levelNums.has(l.level)) {\n errors.push({\n field: `levels[${i}].level`,\n message: `Duplicate level number: ${l.level}.`,\n });\n }\n levelNums.add(l.level);\n\n // A sub-workflow level is decided by its child approval, so it needs no\n // approvers of its own — requiring them would force template authors to\n // invent a placeholder nobody ever asks.\n if (!l.subWorkflow && (!l.approvers || l.approvers.length === 0)) {\n errors.push({\n field: `levels[${i}].approvers`,\n message: `Level ${l.level} must have at least one approver.`,\n });\n }\n if (l.subWorkflow) {\n if (!l.subWorkflow.templateName) {\n errors.push({\n field: `levels[${i}].subWorkflow.templateName`,\n message: `Level ${l.level} declares a subWorkflow without a templateName.`,\n });\n }\n if (l.subWorkflow.templateName === config.name) {\n errors.push({\n field: `levels[${i}].subWorkflow.templateName`,\n message: `Level ${l.level} would spawn a sub-workflow of its own template (\"${config.name}\"), which cannot terminate.`,\n });\n }\n if (l.approvers && l.approvers.length > 0) {\n errors.push({\n field: `levels[${i}].approvers`,\n message: `Level ${l.level} sets both approvers and subWorkflow; a sub-workflow level is decided by its child approval, so its approvers would never be asked.`,\n });\n }\n }\n if (l.reminderAfterDays !== undefined && l.reminderAfterDays <= 0) {\n errors.push({\n field: `levels[${i}].reminderAfterDays`,\n message: `Level ${l.level} reminderAfterDays must be a positive number.`,\n });\n }\n if (l.reminderEveryDays !== undefined && l.reminderEveryDays <= 0) {\n errors.push({\n field: `levels[${i}].reminderEveryDays`,\n message: `Level ${l.level} reminderEveryDays must be a positive number.`,\n });\n }\n if (\n l.maxReminders !== undefined &&\n (!Number.isInteger(l.maxReminders) || l.maxReminders < 1)\n ) {\n errors.push({\n field: `levels[${i}].maxReminders`,\n message: `Level ${l.level} maxReminders must be a positive integer.`,\n });\n }\n if (l.reminderEveryDays !== undefined && l.reminderAfterDays === undefined) {\n errors.push({\n field: `levels[${i}].reminderEveryDays`,\n message: `Level ${l.level} sets reminderEveryDays without reminderAfterDays, so no reminder would ever be sent.`,\n });\n }\n if (l.escalationAfterHours !== undefined && l.escalationAfterHours <= 0) {\n errors.push({\n field: `levels[${i}].escalationAfterHours`,\n message: `Level ${l.level} escalationAfterHours must be a positive number.`,\n });\n }\n if (l.escalationAfterDays !== undefined && l.escalationAfterHours !== undefined) {\n errors.push({\n field: `levels[${i}].escalationAfterHours`,\n message: `Level ${l.level} sets both escalationAfterDays and escalationAfterHours; pick one so the deadline is unambiguous.`,\n });\n }\n if (l.escalationAfterDays !== undefined && l.escalationAfterDays <= 0) {\n errors.push({\n field: `levels[${i}].escalationAfterDays`,\n message: `Level ${l.level} escalationAfterDays must be a positive number.`,\n });\n }\n\n if (l.mode === 'quorum') {\n if (\n l.minApprovals === undefined ||\n !Number.isInteger(l.minApprovals) ||\n l.minApprovals < 1\n ) {\n errors.push({\n field: `levels[${i}].minApprovals`,\n message: `Level ${l.level} uses 'quorum' mode and requires minApprovals to be a positive integer.`,\n });\n } else if (l.approvers && l.minApprovals > l.approvers.length) {\n // Conservative static check: only meaningful when every approver is a static 'user'.\n const allStaticUsers = l.approvers.every((a) => a.type === 'user');\n if (allStaticUsers) {\n errors.push({\n field: `levels[${i}].minApprovals`,\n message: `Level ${l.level} requires ${l.minApprovals} approvals but only ${l.approvers.length} approver(s) are configured.`,\n });\n }\n }\n }\n\n if (l.mode === 'weighted') {\n if (l.threshold === undefined || l.threshold <= 0) {\n errors.push({\n field: `levels[${i}].threshold`,\n message: `Level ${l.level} uses 'weighted' mode and requires threshold to be a positive number.`,\n });\n }\n if (l.weights) {\n for (const [id, w] of Object.entries(l.weights)) {\n if (typeof w !== 'number' || w < 0 || Number.isNaN(w)) {\n errors.push({\n field: `levels[${i}].weights.${id}`,\n message: `Weight for \"${id}\" must be a non-negative number.`,\n });\n }\n }\n }\n }\n });\n }\n\n // A group's levels must form one unbroken run, so that \"advance past the\n // group\" and \"advance past a level\" cannot disagree about what comes next.\n // An interleaved group would otherwise activate a level from outside it.\n if (config.levels && config.levels.length > 0) {\n const ordered = [...config.levels].sort((a, b) => a.level - b.level);\n const seenGroups = new Set<string>();\n let previousGroup: string | null = null;\n ordered.forEach((l) => {\n const key = l.group;\n if (key === undefined) {\n previousGroup = null;\n return;\n }\n if (key !== previousGroup) {\n if (seenGroups.has(key)) {\n errors.push({\n field: 'levels',\n message: `Parallel group \"${key}\" is not contiguous — its levels must occupy consecutive level numbers with no other level in between.`,\n });\n }\n seenGroups.add(key);\n previousGroup = key;\n }\n });\n }\n\n if (config.slaDeadlineDays !== undefined && config.slaDeadlineHours !== undefined) {\n errors.push({\n field: 'slaDeadlineHours',\n message:\n 'Template sets both slaDeadlineDays and slaDeadlineHours; pick one so the SLA is unambiguous.',\n });\n }\n if (config.slaDeadlineHours !== undefined && config.slaDeadlineHours <= 0) {\n errors.push({\n field: 'slaDeadlineHours',\n message: 'slaDeadlineHours must be a positive number.',\n });\n }\n\n if (config.conditions) {\n config.conditions.forEach((rule, ruleIdx) => {\n errors.push(...validateConditionExpression(rule.when, `conditions[${ruleIdx}].when`));\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 // Validate the RESOLVED template: a derived config is often invalid on its\n // own (it may declare no levels at all, inheriting the whole chain), and it\n // is the flattened result that instances actually run against.\n const resolved = await this.registry.resolveInheritance(config);\n const validation = this.validateTemplate(resolved);\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(resolved);\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 resolved = await this.registry.resolveInheritance(config);\n const validation = this.validateTemplate(resolved);\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(resolved);\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(\n raw: SubmitOptions,\n auditCtx?: AuditContext,\n /**\n * @internal Set only when the engine spawns a sub-workflow child. Passed at\n * creation rather than stamped afterwards, because the child spawns its own\n * children before any post-submit update could reach it — which is how a\n * grandchild ended up recorded at depth 1.\n */\n link?: { parentInstanceId: string; parentLevel: number; depth: number },\n ): 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(\n this.tenantId,\n opts.documentType,\n opts.documentId,\n opts.templateName,\n opts.data,\n );\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 // The opening step is a whole group, not a single level: every branch of a\n // leading parallel group starts collecting decisions at once.\n const firstCfg = allLevelCfgs[0];\n const firstGroupKey = firstCfg ? ApprovalEngine.groupKeyOf(firstCfg) : null;\n\n const firstRung = this.firstRungOf(template.escalationSteps);\n const levels: ApprovalLevelInstance[] = allLevelCfgs.map((cfg) =>\n this.buildLevelInstance(cfg, {\n open: ApprovalEngine.groupKeyOf(cfg) === firstGroupKey,\n now,\n firstRung,\n }),\n );\n\n for (const lvl of levels.filter((l) => l.status === 'pending')) {\n // A sub-workflow level has no approvers of its own — a child approval\n // decides it — so resolving here would fail on an empty approver list.\n if (lvl.subWorkflowTemplate) {\n lvl.approverIds = [];\n continue;\n }\n lvl.approverIds = await this.resolver.resolveApprovers(\n lvl.approverConfigs,\n opts.submittedBy,\n opts.data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n now,\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.slaDeadlineHours\n ? this.deadlineFromHours(now, template.slaDeadlineHours)\n : template.slaDeadlineDays\n ? this.deadlineFrom(now, template.slaDeadlineDays)\n : undefined;\n\n const instance: ApprovalInstance = {\n id: instanceId,\n tenantId: this.tenantId,\n parentInstanceId: link?.parentInstanceId,\n parentLevel: link?.parentLevel,\n subWorkflowDepth: link?.depth,\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 escalationSteps: template.escalationSteps,\n slaDeadlineDays: template.slaDeadlineDays,\n slaDeadlineHours: template.slaDeadlineHours,\n allowOverride: template.allowOverride,\n },\n };\n\n await this.runMiddlewareBefore({\n operation: 'submit',\n actorId: opts.submittedBy,\n tenantId: this.tenantId,\n input: opts,\n });\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', {\n tenantId: this.tenantId,\n templateName: template.name,\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'submit' },\n );\n\n const eventPayload = {\n instanceId: instance.id,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n submittedBy: opts.submittedBy,\n // Union across the opening group — a parallel group has several open branches.\n currentApprovers: [\n ...new Set(levels.filter((l) => l.status === 'pending').flatMap((l) => l.approverIds)),\n ],\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(\n { operation: 'submit', actorId: opts.submittedBy, tenantId: this.tenantId, input: opts },\n instance,\n );\n\n // Done after the parent is persisted, never inside its optimistic write:\n // the child's own submit reads and writes, and nesting that under the\n // parent's compare-and-set would turn a slow child template into spurious\n // version conflicts on the parent.\n await this.startSubWorkflows(instance);\n\n return instance;\n }\n\n async approve(\n instanceId: string,\n raw: ApproveOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ApproveOptionsSchema.parse(raw));\n const startMs = this.clock.now().getTime();\n const decided = await 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.resolveActorLevel(instance, opts.approverId, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'approve',\n actorId: opts.approverId,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n });\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 level.reminderDueAt = undefined;\n\n // Inside a parallel group the instance holds until every branch resolves;\n // a single branch finishing is not progress the rest of the chain can see.\n const siblingsStillOpen = this.groupMembers(instance, level).some(\n (l) => l.status === 'pending' || l.status === 'waiting',\n );\n const nextGroup = siblingsStillOpen ? [] : this.findNextGroup(instance);\n const nextLevel = nextGroup[0] ?? null;\n\n if (siblingsStillOpen) {\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', {\n tenantId: this.tenantId,\n isFinal: 'false',\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: false,\n };\n this.bus.emit('approval:approved', p);\n await this.notifyAdapters('approval:approved', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n }\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', {\n tenantId: this.tenantId,\n instanceId,\n });\n this.opts.metricsAdapter?.increment('approval.approved', {\n tenantId: this.tenantId,\n isFinal: 'true',\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: true,\n };\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.notifyAdapters('approval:completed', instance, instance);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n }\n\n await this.activateGroup(instance, nextGroup, 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.approved', {\n tenantId: this.tenantId,\n isFinal: 'false',\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const pAdv = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: false,\n };\n this.bus.emit('approval:approved', pAdv);\n const pLvl = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n fromLevel: level.level,\n toLevel: nextLevel.level,\n newApprovers: nextLevel.approverIds,\n };\n this.bus.emit('approval:level_advanced', pLvl);\n await this.notifyAdapters('approval:level_advanced', instance, pLvl);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\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(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: false,\n };\n this.bus.emit('approval:approved', p);\n await this.notifyAdapters('approval:approved', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n }\n\n return instance;\n });\n\n await this.afterDecision(decided);\n return decided;\n }\n\n async reject(\n instanceId: string,\n raw: RejectOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RejectOptionsSchema.parse(raw));\n const decided = await 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.resolveActorLevel(instance, opts.approverId, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'reject',\n actorId: opts.approverId,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'reject',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n });\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n reason: opts.reason,\n returnTo: 'previous' as const,\n };\n this.bus.emit('approval:rejected', p);\n await this.notifyAdapters('approval:rejected', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'reject',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n reason: opts.reason,\n returnTo: opts.returnTo === 'originator' ? ('originator' as const) : null,\n };\n this.bus.emit('approval:rejected', p);\n await this.notifyAdapters('approval:rejected', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'reject',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\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 await this.afterDecision(decided);\n return decided;\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.resolveActorLevel(instance, opts.fromApprover, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'delegate',\n actorId: opts.fromApprover,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'delegate',\n instanceId,\n actorId: opts.fromApprover,\n tenantId: this.tenantId,\n input: opts,\n });\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n level: level.level,\n reason: opts.reason,\n };\n this.bus.emit('approval:delegated', p);\n await this.notifyAdapters('approval:delegated', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'delegate',\n instanceId,\n actorId: opts.fromApprover,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Administratively replace an approver on the current level. Unlike delegate(),\n * this is performed by a third party (e.g. an admin handling an unavailable\n * approver) and does not require the original approver to initiate it. The\n * target approver must still be pending — an approver who has already acted\n * cannot be reassigned.\n */\n async reassign(\n instanceId: string,\n raw: ReassignOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ReassignOptionsSchema.parse(raw));\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n\n if (opts.fromApprover === opts.toApprover) {\n throw new ApprovalForbiddenError('Cannot reassign an approver to themselves.');\n }\n\n const level = this.resolveActorLevel(instance, opts.fromApprover, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'reassign',\n actorId: opts.reassignedBy,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'reassign',\n instanceId,\n actorId: opts.reassignedBy,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const idx = level.approverIds.indexOf(opts.fromApprover);\n if (idx < 0) {\n throw new ApprovalForbiddenError(\n `Cannot reassign: \"${opts.fromApprover}\" is not an approver on level ${level.level}.`,\n );\n }\n if (hasAlreadyActed(level, opts.fromApprover)) {\n throw new ApprovalForbiddenError(\n `Cannot reassign after acting: \"${opts.fromApprover}\" has already approved or rejected level ${level.level}.`,\n );\n }\n if (level.approverIds.includes(opts.toApprover)) {\n throw new ApprovalForbiddenError(\n `Cannot reassign: \"${opts.toApprover}\" is already an approver on level ${level.level}.`,\n );\n }\n\n const now = this.clock.now();\n level.approverIds[idx] = opts.toApprover;\n\n // If the slot being reassigned carries an active time-limited delegation, clear it.\n if (level.delegatedTo === opts.fromApprover || level.delegatedFrom === opts.fromApprover) {\n level.delegatedUntil = undefined;\n level.delegatedFrom = undefined;\n level.delegatedTo = undefined;\n }\n\n const auditEntry: AuditEntry = {\n action: 'reassigned',\n actorId: opts.reassignedBy,\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 this.opts.metricsAdapter?.increment('approval.reassigned', { tenantId: this.tenantId });\n this.logger.info('reassign: approver replaced', {\n tenantId: this.tenantId,\n instanceId,\n from: opts.fromApprover,\n to: opts.toApprover,\n });\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n reassignedBy: opts.reassignedBy,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n level: level.level,\n reason: opts.reason,\n };\n this.bus.emit('approval:reassigned', p);\n await this.notifyAdapters('approval:reassigned', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'reassign',\n instanceId,\n actorId: opts.reassignedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n async cancel(\n instanceId: string,\n raw: CancelOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => CancelOptionsSchema.parse(raw));\n let cancelled: ApprovalInstance | null = null;\n const result = await 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({\n operation: 'cancel',\n actorId: opts.cancelledBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'cancel',\n instanceId,\n actorId: opts.cancelledBy,\n tenantId: this.tenantId,\n input: opts,\n });\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n cancelledBy: opts.cancelledBy,\n reason: opts.reason,\n };\n this.bus.emit('approval:cancelled', p);\n await this.notifyAdapters('approval:cancelled', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'cancel',\n instanceId,\n actorId: opts.cancelledBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n cancelled = instance;\n return instance;\n });\n\n if (cancelled) {\n // Cancelling a parent must not leave its children running, and a\n // cancelled child still owes its own parent an outcome.\n await this.cancelOrphanedChildren(cancelled);\n await this.propagateToParent(cancelled);\n }\n return result;\n }\n\n async escalate(\n instanceId: string,\n raw: EscalateOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n parseOrThrow(() => EscalateOptionsSchema.parse(raw));\n return this.escalateInternal(instanceId, raw.escalatedBy, auditCtx);\n }\n\n /**\n * Change an instance's document data while it is still pending, and\n * re-evaluate the template's conditions against the new values.\n *\n * Documents change after submission — a line item is corrected, a vendor is\n * reclassified, an amount is revised — and the approval chain that was\n * computed at submit time can be wrong the moment that happens. Without this,\n * the only way to reflect a correction was to cancel and resubmit, losing the\n * approvals already collected and the audit trail with them.\n *\n * **Only the part of the chain that has not been reached is recomputed.**\n * Levels before {@link ApprovalInstance.currentLevel}, and the current level\n * itself, are frozen: an approval that has already been given cannot be\n * retracted by editing data, and a level that is actively collecting\n * decisions is not pulled out from under its approvers. Conditions that would\n * skip such a level are therefore ignored — history cannot be rewritten — and\n * a condition that would *insert* a level at or before the current one throws\n * rather than silently dropping an approval step that should have run.\n *\n * @param instanceId - The pending instance to update.\n * @param raw - Who is updating, the new data, and how to apply it.\n * @param auditCtx - Optional compliance context recorded on the audit entry.\n * @returns The updated instance.\n * @throws ApprovalError if the instance is not pending.\n * @throws ApprovalValidationError if re-evaluation would insert a level at or\n * before the current level, or would leave the chain with no levels.\n */\n async updateData(\n instanceId: string,\n raw: UpdateDataOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => UpdateDataOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') {\n throw new ApprovalError(\n `Cannot update data on a \"${instance.status}\" approval. Only pending instances can be edited.`,\n 'CANNOT_UPDATE_DATA',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'updateData',\n actorId: opts.updatedBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'updateData',\n instanceId,\n actorId: opts.updatedBy,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const previousData = instance.data;\n const nextData: Record<string, unknown> =\n opts.mode === 'replace' ? { ...opts.data } : { ...previousData, ...opts.data };\n\n const changedFields = [...new Set([...Object.keys(previousData), ...Object.keys(nextData)])]\n .filter((k) => !Object.is(previousData[k], nextData[k]))\n .sort();\n\n const now = this.clock.now();\n let addedLevels: number[] = [];\n let removedLevels: number[] = [];\n\n if (opts.recomputeChain) {\n const recomputed = await this.recomputeFutureChain(instance, nextData);\n addedLevels = recomputed.addedLevels;\n removedLevels = recomputed.removedLevels;\n }\n\n instance.data = nextData;\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'data_updated',\n actorId: opts.updatedBy,\n level: instance.currentLevel,\n timestamp: now,\n reason: opts.reason,\n oldValue: { data: previousData },\n newValue: { data: nextData, addedLevels, removedLevels },\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.data_updated', { tenantId: this.tenantId });\n this.logger.info('updateData: instance data updated', {\n tenantId: this.tenantId,\n instanceId,\n changedFields,\n addedLevels,\n removedLevels,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n updatedBy: opts.updatedBy,\n reason: opts.reason,\n changedFields,\n addedLevels,\n removedLevels,\n };\n this.bus.emit('approval:data_updated', payload);\n await this.notifyAdapters('approval:data_updated', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'updateData',\n instanceId,\n actorId: opts.updatedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Recompute the not-yet-reached portion of an instance's level chain against\n * new data, mutating `instance.levels` in place.\n *\n * Levels at or before `currentLevel` are treated as immutable history. See\n * {@link updateData} for why.\n */\n private async recomputeFutureChain(\n instance: ApprovalInstance,\n nextData: Record<string, unknown>,\n ): Promise<{ addedLevels: number[]; removedLevels: number[] }> {\n const template = await this.registry.get(instance.templateName);\n const mutations = evaluateConditions(template.conditions ?? [], nextData);\n\n const desired = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n const frozen = instance.levels.filter((l) => l.level <= instance.currentLevel);\n const frozenNums = new Set(frozen.map((l) => l.level));\n const futureCfgs = desired.filter((l) => l.level > instance.currentLevel);\n\n // A level the new data introduces behind the cursor cannot be honoured: the\n // instance has already moved past that point. Failing loudly beats silently\n // dropping an approval step the template says is required.\n const behindCursor = desired.find(\n (l) => l.level <= instance.currentLevel && !frozenNums.has(l.level),\n );\n if (behindCursor) {\n throw new ApprovalValidationError(\n `Re-evaluating conditions would insert level ${behindCursor.level} (\"${behindCursor.name}\"), which is at or before the current level ${instance.currentLevel}. Cancel and resubmit if the chain must change retroactively.`,\n );\n }\n\n const existingFuture = new Map(\n instance.levels.filter((l) => l.level > instance.currentLevel).map((l) => [l.level, l]),\n );\n const desiredNums = new Set(futureCfgs.map((l) => l.level));\n\n const addedLevels = futureCfgs.filter((l) => !existingFuture.has(l.level)).map((l) => l.level);\n const removedLevels = [...existingFuture.keys()]\n .filter((n) => !desiredNums.has(n))\n .sort((a, b) => a - b);\n\n if (frozen.length === 0 && futureCfgs.length === 0) {\n throw new ApprovalValidationError(\n 'Re-evaluating conditions would leave the instance with no levels. Check that skipLevels conditions are not removing all levels.',\n );\n }\n\n const rebuiltFuture: ApprovalLevelInstance[] = futureCfgs.map((cfg) => {\n const kept = existingFuture.get(cfg.level);\n // Preserve an untouched waiting level as-is so any delegation already\n // arranged on it survives a data edit elsewhere in the document.\n if (kept) return kept;\n // Same construction submit() uses, so a condition-added level cannot come\n // out missing fields the template configured on it.\n return this.buildLevelInstance(cfg, { open: false, now: this.clock.now() });\n });\n\n instance.levels = [...frozen, ...rebuiltFuture];\n return { addedLevels: addedLevels.sort((a, b) => a - b), removedLevels };\n }\n\n /**\n * Ask the submitter for clarification without rejecting.\n *\n * Approvers routinely need one fact before they can decide. The only ways to\n * express that were to reject — which throws away every approval already\n * collected and forces a resubmit — or to leave the request sitting while the\n * question is chased by email, which quietly burns the SLA the approver is\n * measured on.\n *\n * The instance stays `pending` and keeps its approvers: this is a question,\n * not a decision. What changes is the clock — escalation, SLA and expiry\n * deadlines stop advancing while the question is open, because time spent\n * waiting on the submitter is not time the approver is sitting on their hands.\n *\n * @throws ApprovalError if the instance is not pending, or a question is already open.\n */\n async requestInfo(\n instanceId: string,\n raw: RequestInfoOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RequestInfoOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n if (instance.infoRequest) {\n throw new ApprovalError(\n `A clarification request is already open on this approval (asked by \"${instance.infoRequest.askedBy}\"). Answer it with provideInfo() first.`,\n 'INFO_ALREADY_REQUESTED',\n );\n }\n\n const level = this.resolveActorLevel(instance, opts.approverId, opts.level);\n assertApproverOnLevel(level, opts.approverId);\n\n await this.runAuthorizationPolicy({\n operation: 'requestInfo',\n actorId: opts.approverId,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'requestInfo',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n instance.infoRequest = {\n askedBy: opts.approverId,\n question: opts.question,\n askedAt: now,\n level: level.level,\n };\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'info_requested',\n actorId: opts.approverId,\n level: level.level,\n timestamp: now,\n comment: opts.question,\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.info_requested', { tenantId: this.tenantId });\n this.logger.info('requestInfo: clarification requested', {\n tenantId: this.tenantId,\n instanceId,\n level: level.level,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n askedBy: opts.approverId,\n question: opts.question,\n level: level.level,\n recipients: [instance.submittedBy],\n };\n this.bus.emit('approval:info_requested', payload);\n await this.notifyAdapters('approval:info_requested', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'requestInfo',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Answer an open clarification request and take the instance off hold.\n *\n * Every deadline that was paused is pushed out by exactly how long the\n * question was open, so an approver gets back the full remaining time they\n * had before asking rather than being penalised for asking at all.\n *\n * @throws ApprovalError if no question is open.\n */\n async provideInfo(\n instanceId: string,\n raw: ProvideInfoOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ProvideInfoOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n const open = instance.infoRequest;\n if (!open) {\n throw new ApprovalError(\n 'No clarification request is open on this approval.',\n 'NO_INFO_REQUESTED',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'provideInfo',\n actorId: opts.respondedBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'provideInfo',\n instanceId,\n actorId: opts.respondedBy,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n const heldForMs = Math.max(0, now.getTime() - new Date(open.askedAt).getTime());\n this.extendDeadlinesBy(instance, heldForMs);\n\n instance.infoRequest = undefined;\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'info_provided',\n actorId: opts.respondedBy,\n level: open.level,\n timestamp: now,\n comment: opts.response,\n oldValue: { question: open.question, askedBy: open.askedBy },\n newValue: { heldForMs },\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.info_provided', { tenantId: this.tenantId });\n this.logger.info('provideInfo: clarification answered', {\n tenantId: this.tenantId,\n instanceId,\n heldForMs,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n respondedBy: opts.respondedBy,\n response: opts.response,\n level: open.level,\n heldForMs,\n recipients: [...new Set(this.pendingLevels(instance).flatMap((l) => l.approverIds))],\n };\n this.bus.emit('approval:info_provided', payload);\n await this.notifyAdapters('approval:info_provided', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'provideInfo',\n instanceId,\n actorId: opts.respondedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Push every pending deadline out by `ms`.\n *\n * Used to give back time an instance spent on hold. Deadlines that are not\n * set stay unset — a level with no escalation configured does not acquire one\n * by being held.\n */\n private extendDeadlinesBy(instance: ApprovalInstance, ms: number): void {\n if (ms <= 0) return;\n const shift = (d: Date | undefined): Date | undefined =>\n d === undefined ? undefined : new Date(new Date(d).getTime() + ms);\n\n instance.expiresAt = shift(instance.expiresAt);\n instance.slaDeadlineAt = shift(instance.slaDeadlineAt);\n for (const level of instance.levels) {\n if (level.status !== 'pending') continue;\n level.escalationDueAt = shift(level.escalationDueAt);\n level.reminderDueAt = shift(level.reminderDueAt);\n level.delegatedUntil = shift(level.delegatedUntil);\n }\n }\n\n /**\n * Attach supporting evidence to an approval — a quote PDF, a signed contract,\n * a screenshot of a system of record.\n *\n * Stores a **reference**, never bytes. Approval documents belong in the object\n * store or DMS the organisation already runs, which handles retention, virus\n * scanning and access control far better than an approval table could;\n * copying them here would make the audit database the largest and least\n * governed copy of them.\n *\n * Allowed on any non-terminal instance, by anyone the authorization policy\n * permits: the submitter adding a missing quote and an approver adding the\n * note that justifies their decision are both ordinary.\n */\n async addAttachment(\n instanceId: string,\n raw: AddAttachmentOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => AddAttachmentOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (TERMINAL_STATUSES.has(instance.status)) {\n throw new ApprovalError(\n `Cannot attach to a \"${instance.status}\" approval.`,\n 'CANNOT_ATTACH',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'addAttachment',\n actorId: opts.actorId,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'addAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n const attachment: Attachment = {\n id: this.generateId('att'),\n name: opts.name,\n uri: opts.uri,\n contentType: opts.contentType,\n sizeBytes: opts.sizeBytes,\n addedBy: opts.actorId,\n addedAt: now,\n level: instance.currentLevel,\n };\n instance.attachments = [...(instance.attachments ?? []), attachment];\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'attachment_added',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n newValue: { id: attachment.id, name: attachment.name, uri: attachment.uri },\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.attachment_added', {\n tenantId: this.tenantId,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n actorId: opts.actorId,\n attachmentId: attachment.id,\n name: attachment.name,\n uri: attachment.uri,\n level: attachment.level,\n };\n this.bus.emit('approval:attachment_added', payload);\n await this.notifyAdapters('approval:attachment_added', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'addAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Detach a reference from an approval.\n *\n * The audit entry keeps the name and URI of what was removed, so the record\n * still shows an approver saw evidence that is no longer listed — dropping\n * that would let the trail imply a decision was made on less than it was.\n * Nothing is deleted from the underlying store; that is the DMS's call.\n */\n async removeAttachment(\n instanceId: string,\n raw: RemoveAttachmentOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RemoveAttachmentOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (TERMINAL_STATUSES.has(instance.status)) {\n throw new ApprovalError(\n `Cannot modify attachments on a \"${instance.status}\" approval.`,\n 'CANNOT_ATTACH',\n );\n }\n\n const existing = (instance.attachments ?? []).find((a) => a.id === opts.attachmentId);\n if (!existing) {\n throw new ApprovalError(\n `Attachment \"${opts.attachmentId}\" is not on this approval.`,\n 'ATTACHMENT_NOT_FOUND',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'removeAttachment',\n actorId: opts.actorId,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'removeAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n instance.attachments = (instance.attachments ?? []).filter((a) => a.id !== opts.attachmentId);\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'attachment_removed',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n reason: opts.reason,\n oldValue: { id: existing.id, name: existing.name, uri: existing.uri },\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.attachment_removed', {\n tenantId: this.tenantId,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n actorId: opts.actorId,\n attachmentId: existing.id,\n name: existing.name,\n uri: existing.uri,\n level: existing.level,\n };\n this.bus.emit('approval:attachment_removed', payload);\n await this.notifyAdapters('approval:attachment_removed', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'removeAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /** Add a comment to an instance without approving or rejecting. */\n async addComment(\n instanceId: string,\n raw: AddCommentOptions,\n auditCtx?: AuditContext,\n ): Promise<void> {\n const opts = parseOrThrow(() => AddCommentOptionsSchema.parse(raw));\n const instance = await this.requireInstance(instanceId);\n\n await this.runAuthorizationPolicy({\n operation: 'addComment',\n actorId: opts.actorId,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'addComment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n if (opts.parentCommentId) {\n const parent = (instance.comments ?? []).find((c) => c.id === opts.parentCommentId);\n if (!parent) {\n throw new ApprovalError(\n `Comment \"${opts.parentCommentId}\" is not on this approval, so there is nothing to reply to.`,\n 'COMMENT_NOT_FOUND',\n );\n }\n }\n\n const now = this.clock.now();\n const comment: Comment = {\n id: this.generateId('cmt'),\n authorId: opts.actorId,\n body: opts.comment,\n createdAt: now,\n level: instance.currentLevel,\n parentCommentId: opts.parentCommentId,\n mentions: opts.mentions,\n };\n instance.comments = [...(instance.comments ?? []), comment];\n\n const auditEntry: AuditEntry = {\n action: 'commented',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n comment: opts.comment,\n newValue: { commentId: comment.id, parentCommentId: opts.parentCommentId },\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\n // Recipients are the people named, not the current approvers: a remark\n // aimed at somebody should reach them, and one aimed at nobody should not\n // page the whole level.\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n commentId: comment.id,\n authorId: opts.actorId,\n body: opts.comment,\n level: comment.level,\n parentCommentId: opts.parentCommentId,\n recipients: opts.mentions ?? [],\n };\n this.bus.emit('approval:commented', payload);\n await this.notifyAdapters('approval:commented', instance, payload);\n\n await this.runMiddlewareAfter({\n operation: 'addComment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n }\n\n /**\n * Comments on an approval, oldest first.\n *\n * Returns a flat list carrying `parentCommentId`, rather than a nested tree:\n * a UI that wants threads can build them, and one that wants a chronological\n * feed — which is what most approval screens actually show — does not have to\n * flatten a structure it never wanted.\n */\n async getComments(instanceId: string): Promise<Comment[]> {\n const instance = await this.requireInstance(instanceId);\n return [...(instance.comments ?? [])].sort(\n (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n }\n\n /** Resubmit a rejected instance, creating a new linked instance from level 1. */\n async resubmit(\n instanceId: string,\n raw: ResubmitOptions,\n auditCtx?: AuditContext,\n ): 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({\n operation: 'resubmit',\n actorId: opts.resubmittedBy,\n instance: original,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'resubmit',\n instanceId,\n actorId: opts.resubmittedBy,\n tenantId: this.tenantId,\n input: opts,\n });\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(\n 'Template has no active levels after condition evaluation.',\n );\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 minApprovals: cfg.minApprovals,\n threshold: cfg.threshold,\n weights: cfg.weights,\n escalationAfterDays: cfg.escalationAfterDays,\n escalationDueAt:\n idx === 0 && cfg.escalationAfterDays\n ? this.deadlineFrom(now, cfg.escalationAfterDays)\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.slaDeadlineHours\n ? this.deadlineFromHours(now, template.slaDeadlineHours)\n : template.slaDeadlineDays\n ? this.deadlineFrom(now, template.slaDeadlineDays)\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 escalationSteps: template.escalationSteps,\n slaDeadlineDays: template.slaDeadlineDays,\n slaDeadlineHours: template.slaDeadlineHours,\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(\n {\n operation: 'resubmit',\n instanceId,\n actorId: opts.resubmittedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n newInstance,\n );\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 // Preview must show who would actually be assigned, cover included —\n // otherwise it disagrees with what submit() goes on to do.\n const resolvedApprovers = await this.resolver.resolveApprovers(\n cfg.approvers,\n submittedBy,\n data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n this.clock.now(),\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 /**\n * Explain why a chain resolves the way it does for a given document.\n *\n * `previewApprovalChain()` answers *what* the chain will be. This answers\n * *why*: which rule added a level, which rule removed one, which rules were\n * evaluated and did not match, and where each level's approvers came from —\n * the question behind \"why does this purchase order have a CFO level?\", which\n * previously meant reading the template and re-evaluating the conditions by\n * hand.\n *\n * A rule that throws — an operator nobody registered, a malformed group — is\n * reported against that rule rather than failing the whole explanation. The\n * explanation is a diagnostic tool, and it is least useful at exactly the\n * moment a broken rule makes it throw.\n *\n * Reads nothing and writes nothing; safe to expose to a support UI.\n *\n * @param templateName - Template to explain.\n * @param data - Document data the conditions are evaluated against.\n * @param submittedBy - Submitter, used for approver resolution.\n */\n async explainChain(\n templateName: string,\n data: Record<string, unknown>,\n submittedBy: string,\n ): Promise<ChainExplanation> {\n const template = await this.registry.get(templateName);\n const conditions = template.conditions ?? [];\n\n const rules: ExplainedRule[] = [];\n const addedBy = new Map<number, number>();\n const skippedBy = new Map<number, number>();\n\n conditions.forEach((rule, index) => {\n const addsLevels = (rule.addLevels ?? []).map((l) => l.level);\n const skipsLevels = rule.skipLevels ?? [];\n try {\n const outcome = evaluateConditions([rule], data);\n const matched = outcome.addLevels.length > 0 || outcome.skipLevels.size > 0;\n rules.push({ index, matched, addsLevels, skipsLevels });\n if (matched) {\n for (const l of outcome.addLevels) if (!addedBy.has(l.level)) addedBy.set(l.level, index);\n for (const l of outcome.skipLevels) if (!skippedBy.has(l)) skippedBy.set(l, index);\n }\n } catch (err) {\n rules.push({\n index,\n matched: false,\n addsLevels,\n skipsLevels,\n error: (err as Error).message,\n });\n }\n });\n\n // Re-evaluate as a whole so the level set matches what submit() would build.\n let mutations: { addLevels: ApprovalLevelConfig[]; skipLevels: Set<number> };\n try {\n mutations = evaluateConditions(conditions, data);\n } catch {\n mutations = { addLevels: [], skipLevels: new Set<number>() };\n }\n\n const active = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n const levels: ExplainedLevel[] = [];\n for (const cfg of active) {\n const fromCondition = addedBy.has(cfg.level);\n const base: ExplainedLevel = {\n level: cfg.level,\n name: cfg.name,\n mode: cfg.mode,\n source: fromCondition ? 'condition' : 'template',\n ...(fromCondition ? { addedByRule: addedBy.get(cfg.level) } : {}),\n resolvedApprovers: [],\n ...(cfg.subWorkflow ? { subWorkflowTemplate: cfg.subWorkflow.templateName } : {}),\n };\n\n if (cfg.subWorkflow) {\n levels.push(base);\n continue;\n }\n\n try {\n base.resolvedApprovers = await this.resolver.resolveApprovers(\n cfg.approvers,\n submittedBy,\n data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n this.clock.now(),\n );\n } catch (err) {\n // Naming the level with an unresolvable approver is the whole point.\n base.resolutionError = (err as Error).message;\n }\n levels.push(base);\n }\n\n const skipped: ExplainedSkip[] = template.levels\n .filter((l) => mutations.skipLevels.has(l.level))\n .map((l) => ({\n level: l.level,\n name: l.name,\n skippedByRule: skippedBy.get(l.level) ?? -1,\n }))\n .sort((a, b) => a.level - b.level);\n\n return { templateName: template.name, levels, skipped, rules };\n }\n\n /**\n * Run a document through a template against scripted decisions, without\n * persisting anything.\n *\n * `explainChain()` says what the chain will be; this says what happens to it —\n * \"if the CFO rejects at level 3, does it go back to the submitter or die?\" —\n * which previously meant submitting a real approval into a real store and\n * cleaning it up afterwards, or reasoning about the state machine by hand.\n *\n * The run executes against a private in-memory store seeded with a copy of\n * the template, so the caller's storage is untouched and no events reach the\n * caller's notification adapters. Custom resolvers and approver types are\n * copied across, because a simulation that could not resolve the caller's own\n * `dynamic` approvers would answer a different question from the one asked.\n *\n * A refused decision — wrong approver, wrong level, already acted — stops the\n * run and is reported in the transcript rather than thrown: the refusal is\n * usually the answer the caller was looking for.\n *\n * @param opts - Template, document data, submitter and the decisions to play.\n */\n async simulate(opts: {\n templateName: string;\n data: Record<string, unknown>;\n submittedBy: string;\n decisions?: SimulatedDecision[];\n }): Promise<SimulationResult> {\n const template = await this.registry.get(opts.templateName);\n\n const scratch = new ApprovalEngine({\n ...this.opts,\n adapter: new MemoryAdapter(),\n // A simulation must not page anybody, write anybody's audit log, or move\n // anybody's metrics.\n notificationAdapter: undefined,\n auditAdapter: undefined,\n metricsAdapter: undefined,\n authorizationPolicy: undefined,\n middleware: undefined,\n escalationPollIntervalMs: undefined,\n });\n this.resolver.copyRegistrationsTo(scratch.resolver);\n\n try {\n const {\n id: _id,\n tenantId: _t,\n createdAt: _c,\n version: _v,\n previousVersionId: _p,\n ...config\n } = template;\n await scratch.registry.define(config);\n\n const instance = await scratch.submit({\n templateName: opts.templateName,\n documentId: `simulation-${opts.templateName}`,\n documentType: template.documentType,\n submittedBy: opts.submittedBy,\n data: opts.data,\n metadata: {},\n });\n\n const transcript: SimulationStep[] = [];\n let current = instance;\n\n for (const [i, decision] of (opts.decisions ?? []).entries()) {\n const isApprove = 'approve' in decision;\n const actorId = isApprove ? decision.approve : decision.reject;\n try {\n current = isApprove\n ? await scratch.approve(current.id, {\n approverId: actorId,\n level: decision.level,\n comment: decision.comment,\n })\n : await scratch.reject(current.id, {\n approverId: actorId,\n level: decision.level,\n reason: decision.reason ?? 'simulated rejection',\n });\n transcript.push({\n step: i + 1,\n action: isApprove ? 'approve' : 'reject',\n actorId,\n level: decision.level,\n status: current.status,\n });\n } catch (err) {\n transcript.push({\n step: i + 1,\n action: isApprove ? 'approve' : 'reject',\n actorId,\n level: decision.level,\n status: current.status,\n error: (err as Error).message,\n });\n break;\n }\n if (TERMINAL_STATUSES.has(current.status)) break;\n }\n\n const finalInstance = await scratch.getInstance(current.id);\n return {\n finalStatus: finalInstance.status,\n levels: finalInstance.levels.map((l) => ({\n level: l.level,\n name: l.name,\n status: l.status,\n approvers: l.approverIds,\n })),\n transcript,\n unreachedLevels: finalInstance.levels\n .filter((l) => l.status === 'waiting')\n .map((l) => l.level),\n incomplete: finalInstance.status === 'pending',\n };\n } finally {\n await scratch.shutdown();\n }\n }\n\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 openForUser = this.pendingLevels(instance).find((l) => l.approverIds.includes(userId));\n const level = openForUser ?? 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(\n instanceId: string,\n raw: OverrideOptions,\n auditCtx?: AuditContext,\n ): 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('Override cannot be performed by the original submitter.');\n }\n\n await this.runAuthorizationPolicy({\n operation: 'override',\n actorId: opts.overriddenBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'override',\n instanceId,\n actorId: opts.overriddenBy,\n tenantId: this.tenantId,\n input: opts,\n });\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.notifyAdapters('approval:completed', instance, instance);\n await this.runMiddlewareAfter(\n {\n operation: 'override',\n instanceId,\n actorId: opts.overriddenBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n\n return instance;\n });\n }\n\n /** Approve multiple instances in one call. Never throws — failures collected in result.failed. */\n /**\n * Move every pending approval assigned to one person over to another.\n *\n * Someone leaves, changes team, or goes on long-term leave, and their queue\n * has to go somewhere. Doing it by hand means finding every open instance\n * first — across parallel branches, where one person can hold several open\n * levels on the same document — and missing one leaves an approval that can\n * never complete.\n *\n * Each move goes through {@link reassign}, so every guard, audit entry, event\n * and authorization check that applies to a single reassignment applies here\n * too. There is no bulk short-cut around them.\n *\n * The sweep is **not atomic**: it reassigns one level at a time and reports\n * per-instance failures rather than rolling back. A partial transfer is the\n * useful outcome — the approvals that could move should move, and the ones\n * that could not are named so a human can look at them.\n *\n * @param raw - Who is moving to whom, and why.\n * @returns What moved, what did not, and why. With `dryRun` nothing is written.\n */\n async transferApprovals(\n raw: TransferApprovalsOptions,\n auditCtx?: AuditContext,\n ): Promise<TransferResult> {\n const opts = parseOrThrow(() => TransferApprovalsOptionsSchema.parse(raw));\n\n if (opts.fromApprover === opts.toApprover) {\n throw new ApprovalValidationError(\n 'transferApprovals requires different fromApprover and toApprover.',\n );\n }\n\n const queue = await this.opts.adapter.getInstancesByApprover(this.tenantId, opts.fromApprover, {\n limit: opts.limit,\n offset: 0,\n });\n\n const result: TransferResult = {\n transferred: [],\n failed: [],\n scanned: 0,\n dryRun: opts.dryRun,\n };\n\n for (const instance of queue.items) {\n if (opts.documentType && instance.documentType !== opts.documentType) continue;\n result.scanned++;\n\n // One person can hold several open branches of a parallel group on the\n // same document; each is a separate level and must be moved separately.\n const levels = instance.levels.filter(\n (l) => l.status === 'pending' && l.approverIds.includes(opts.fromApprover),\n );\n\n for (const level of levels) {\n if (opts.dryRun) {\n result.transferred.push({\n instanceId: instance.id,\n level: level.level,\n documentId: instance.documentId,\n });\n continue;\n }\n try {\n await this.reassign(\n instance.id,\n {\n reassignedBy: opts.transferredBy,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n reason: opts.reason,\n level: level.level,\n },\n auditCtx,\n );\n result.transferred.push({\n instanceId: instance.id,\n level: level.level,\n documentId: instance.documentId,\n });\n } catch (err) {\n result.failed.push({\n instanceId: instance.id,\n error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN'),\n });\n }\n }\n }\n\n this.logger.info('transferApprovals: sweep complete', {\n tenantId: this.tenantId,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n scanned: result.scanned,\n transferred: result.transferred.length,\n failed: result.failed.length,\n dryRun: opts.dryRun,\n });\n\n return result;\n }\n\n async bulkApprove(\n instanceIds: string[],\n raw: ApproveOptions,\n auditCtx?: AuditContext,\n ): 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({\n instanceId: id,\n error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN'),\n });\n }\n }\n return result;\n }\n\n /** Reject multiple instances in one call. Never throws — failures collected in result.failed. */\n async bulkReject(\n instanceIds: string[],\n raw: RejectOptions,\n auditCtx?: AuditContext,\n ): 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({\n instanceId: id,\n error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN'),\n });\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 // Union across every open branch: inside a parallel group more than one\n // level is collecting decisions at the same time.\n return [...new Set(this.pendingLevels(instance).flatMap((l) => l.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 pendingCount = await this.opts.adapter.countInstances(this.tenantId, { status: 'pending' });\n } catch {\n adapterStatus = 'error';\n }\n\n if (adapterStatus === 'connected') {\n try {\n const overdue = await this.opts.adapter.getOverdueInstances(\n this.tenantId,\n this.clock.now(),\n );\n overdueCount = overdue.length;\n } catch {\n adapterStatus = 'error';\n }\n }\n\n const status =\n adapterStatus === 'error' ? 'unhealthy' : overdueCount > 0 ? 'degraded' : '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 /**\n * Aggregate counts for dashboards. Accepts an optional filter (documentType,\n * submittedBy, date range) — `status` is ignored since every status is counted.\n * Adapter-agnostic: issues one cheap count query per status plus an overdue scan.\n */\n /**\n * Who currently owes a decision, and how overdue they are.\n *\n * `getStatistics()` answers how the tenant is doing; this answers who is\n * holding it up — the question behind rebalancing a queue, spotting the\n * approver who has been on leave for a week, or deciding whom to\n * {@link transferApprovals} a departing colleague's work to.\n *\n * Computed from pending instances rather than a dedicated index, so it works\n * on any storage adapter with no new adapter methods. That means it reads\n * every pending instance in the tenant: fine for the operational volumes an\n * approval queue reaches, but it is a reporting call, not something to put on\n * a hot path.\n *\n * Rows are sorted by {@link ApproverWorkload.pending} descending, so the\n * busiest queue is first.\n *\n * @param filter - Optional scoping; `status` is ignored, since only pending work counts.\n * @returns One row per approver holding at least one open level.\n */\n async getWorkload(filter: Omit<InstanceFilter, 'status'> = {}): Promise<ApproverWorkload[]> {\n const pending = await this.fetchAllByFilter({ ...filter, status: 'pending' });\n const now = this.clock.now();\n\n const byApprover = new Map<\n string,\n { pending: number; instances: Set<string>; overdue: number; onHold: number; oldest: number }\n >();\n\n for (const instance of pending) {\n const submittedAt = new Date(instance.createdAt).getTime();\n const held = Boolean(instance.infoRequest);\n\n for (const level of instance.levels) {\n if (level.status !== 'pending') continue;\n\n const isOverdue =\n level.escalationDueAt !== undefined && new Date(level.escalationDueAt) <= now;\n\n for (const approverId of level.approverIds) {\n // An approver who has already voted on this level owes nothing more,\n // even though the level itself is still open waiting on others.\n if (level.approvedBy.includes(approverId) || level.rejectedBy.includes(approverId)) {\n continue;\n }\n\n const row = byApprover.get(approverId) ?? {\n pending: 0,\n instances: new Set<string>(),\n overdue: 0,\n onHold: 0,\n oldest: Number.POSITIVE_INFINITY,\n };\n row.pending++;\n row.instances.add(instance.id);\n if (isOverdue) row.overdue++;\n if (held) row.onHold++;\n row.oldest = Math.min(row.oldest, submittedAt);\n byApprover.set(approverId, row);\n }\n }\n }\n\n return [...byApprover.entries()]\n .map(([approverId, row]) => ({\n approverId,\n pending: row.pending,\n instances: row.instances.size,\n overdue: row.overdue,\n onHold: row.onHold,\n oldestPendingAt: Number.isFinite(row.oldest) ? new Date(row.oldest) : undefined,\n oldestAgeMs: Number.isFinite(row.oldest) ? now.getTime() - row.oldest : 0,\n }))\n .sort((a, b) => b.pending - a.pending || a.approverId.localeCompare(b.approverId));\n }\n\n /**\n * Export templates as a portable bundle.\n *\n * Approval configuration is written once and then has to travel — authored in\n * a sandbox, reviewed, promoted to production. Reading `listTemplates()` and\n * re-posting the rows carried each environment's own `id`, `tenantId` and\n * version lineage with it, which either collided on arrival or silently\n * claimed a history the target never had. This strips all of it.\n *\n * @param names - Templates to include; omit for all of them.\n */\n async exportTemplates(names?: string[]): Promise<TemplateBundle> {\n const all = await this.registry.list();\n const wanted = names ? all.filter((t) => names.includes(t.name)) : all;\n\n if (names) {\n const missing = names.filter((n) => !all.some((t) => t.name === n));\n if (missing.length > 0) {\n throw new ApprovalTemplateNotFoundError(missing.join(', '));\n }\n }\n\n return {\n bundleVersion: TEMPLATE_BUNDLE_VERSION,\n exportedAt: this.clock.now(),\n templates: wanted.map((t) => {\n // Everything environment-specific is dropped, not blanked, so a\n // round-trip cannot reintroduce a stale id.\n const {\n id: _id,\n tenantId: _tenantId,\n createdAt: _createdAt,\n version: _version,\n previousVersionId: _previousVersionId,\n ...config\n } = t;\n return config;\n }),\n };\n }\n\n /**\n * Import a bundle produced by {@link exportTemplates}.\n *\n * **Every template is validated before any is written.** A bundle that is\n * half-applied is worse than one rejected outright: the tenant is left in a\n * state matching neither environment, and the operator has no way to tell\n * which half landed. Per-template failures during the write phase are still\n * reported individually, since a storage error can occur after validation\n * passes.\n *\n * @param bundle - The bundle to apply.\n * @param opts - `mode: 'create'` (default) refuses to touch existing\n * templates; `'upsert'` updates them. `dryRun` reports without writing.\n */\n async importTemplates(\n bundle: TemplateBundle,\n opts: { mode?: 'create' | 'upsert'; dryRun?: boolean } = {},\n ): Promise<ImportResult> {\n const mode = opts.mode ?? 'create';\n const dryRun = opts.dryRun ?? false;\n\n if (bundle.bundleVersion !== TEMPLATE_BUNDLE_VERSION) {\n throw new ApprovalValidationError(\n `Unsupported template bundle version ${bundle.bundleVersion}; this engine reads version ${TEMPLATE_BUNDLE_VERSION}.`,\n );\n }\n if (!Array.isArray(bundle.templates) || bundle.templates.length === 0) {\n throw new ApprovalValidationError('Template bundle contains no templates.');\n }\n\n const duplicates = bundle.templates\n .map((t) => t.name)\n .filter((name, i, all) => all.indexOf(name) !== i);\n if (duplicates.length > 0) {\n throw new ApprovalValidationError(\n `Template bundle contains duplicate names: ${[...new Set(duplicates)].join(', ')}.`,\n );\n }\n\n // Validate everything first — see the note above on half-applied bundles.\n const invalid: Array<{ name: string; message: string }> = [];\n for (const config of bundle.templates) {\n const result = this.validateTemplate(config);\n if (!result.valid) {\n invalid.push({\n name: config.name,\n message: result.errors[0]?.message ?? 'unknown validation error',\n });\n }\n }\n if (invalid.length > 0) {\n throw new ApprovalValidationError(\n `Template bundle failed validation and was not applied: ${invalid\n .map((e) => `${e.name}: ${e.message}`)\n .join('; ')}`,\n );\n }\n\n const result: ImportResult = { created: [], updated: [], skipped: [], errors: [], dryRun };\n\n for (const config of bundle.templates) {\n const existing = await this.opts.adapter.getTemplate(this.tenantId, config.name);\n try {\n if (existing && mode === 'create') {\n result.skipped.push(config.name);\n continue;\n }\n if (existing) {\n if (!dryRun) await this.registry.update(config);\n result.updated.push(config.name);\n } else {\n if (!dryRun) await this.registry.define(config);\n result.created.push(config.name);\n }\n } catch (err) {\n result.errors.push({ name: config.name, message: (err as Error).message });\n }\n }\n\n this.logger.info('importTemplates: bundle applied', {\n tenantId: this.tenantId,\n mode,\n dryRun,\n created: result.created.length,\n updated: result.updated.length,\n skipped: result.skipped.length,\n errors: result.errors.length,\n });\n\n return result;\n }\n\n /**\n * Permanently remove finished approvals older than a cut-off.\n *\n * Approval tables only grow, and data-minimisation rules eventually require\n * old records to go. There was no way to remove one, so operators reached\n * around the library and deleted rows directly — which is exactly where\n * orphaned audit rows and half-deleted instances come from.\n *\n * **Only terminal instances are eligible.** A pending approval is live work;\n * deleting one would strand a document with no way to finish and no record of\n * why. Passing a non-terminal status is rejected rather than quietly ignored,\n * because a caller who asked to purge pending work has misunderstood\n * something and should hear about it.\n *\n * This is irreversible and removes the audit trail with the instance. In many\n * deployments that trail *is* the compliance record, which is why the\n * underlying `deleteInstance` is an optional adapter method: an adapter that\n * does not implement it makes the whole operation unavailable, and this\n * throws rather than reporting a successful purge of nothing.\n *\n * @param opts - Cut-off, optional status/type scoping, safety limit, dry run.\n * @returns What was removed, or would be under `dryRun`.\n */\n async purgeInstances(opts: {\n olderThan: Date;\n statuses?: ApprovalInstance['status'][];\n documentType?: string;\n limit?: number;\n dryRun?: boolean;\n }): Promise<PurgeResult> {\n const dryRun = opts.dryRun ?? false;\n const limit = opts.limit ?? DEFAULT_PURGE_LIMIT;\n\n if (!(opts.olderThan instanceof Date) || Number.isNaN(opts.olderThan.getTime())) {\n throw new ApprovalValidationError('purgeInstances requires a valid olderThan date.');\n }\n\n const requested = opts.statuses ?? [...TERMINAL_STATUSES];\n const nonTerminal = requested.filter((st) => !TERMINAL_STATUSES.has(st));\n if (nonTerminal.length > 0) {\n throw new ApprovalValidationError(\n `purgeInstances refuses non-terminal statuses (${nonTerminal.join(', ')}): a pending approval is live work, and removing it would strand the document it belongs to.`,\n );\n }\n\n const deleteInstance = this.opts.adapter.deleteInstance?.bind(this.opts.adapter);\n if (!deleteInstance && !dryRun) {\n throw new ApprovalValidationError(\n 'The configured storage adapter does not implement deleteInstance(), so instances cannot be purged.',\n );\n }\n\n const result: PurgeResult = { purged: [], scanned: 0, dryRun };\n // Parent and child usually share a terminal status, so both turn up in the\n // scan; without this the family sweep would report each of them twice.\n const handled = new Set<string>();\n\n for (const status of requested) {\n if (result.purged.length >= limit) break;\n\n const page = await this.opts.adapter.getInstancesByFilter(\n this.tenantId,\n {\n status,\n toDate: opts.olderThan,\n ...(opts.documentType ? { documentType: opts.documentType } : {}),\n },\n { limit, offset: 0 },\n );\n\n for (const instance of page.items) {\n if (result.purged.length >= limit) break;\n if (handled.has(instance.id)) continue;\n result.scanned++;\n\n // Defence in depth: the filter should already exclude these, but a\n // custom adapter with a loose filter must not be able to delete live work.\n if (!TERMINAL_STATUSES.has(instance.status)) continue;\n if (new Date(instance.createdAt) > opts.olderThan) continue;\n\n // Sub-workflow children go with the parent. Leaving them behind would\n // orphan rows whose parentInstanceId points at something that no longer\n // exists — unreachable, and invisible to a purge scoped by document type.\n const family = await this.collectSubWorkflowFamily(instance);\n for (const member of family) {\n if (handled.has(member.id)) continue;\n handled.add(member.id);\n if (!dryRun) await deleteInstance!(this.tenantId, member.id);\n result.purged.push({\n instanceId: member.id,\n documentId: member.documentId,\n status: member.status,\n });\n }\n }\n }\n\n this.logger.info('purgeInstances: sweep complete', {\n tenantId: this.tenantId,\n olderThan: opts.olderThan.toISOString(),\n scanned: result.scanned,\n purged: result.purged.length,\n dryRun,\n });\n\n return result;\n }\n\n async getStatistics(filter: Omit<InstanceFilter, 'status'> = {}): Promise<ApprovalStatistics> {\n const statuses: ApprovalInstance['status'][] = [\n 'pending',\n 'approved',\n 'rejected',\n 'cancelled',\n 'expired',\n ];\n\n const counts = await Promise.all(\n statuses.map((status) =>\n this.opts.adapter.countInstances(this.tenantId, { ...filter, status }),\n ),\n );\n\n const byStatus = statuses.reduce(\n (acc, status, i) => {\n acc[status] = counts[i] ?? 0;\n return acc;\n },\n {} as Record<ApprovalInstance['status'], number>,\n );\n\n const total = counts.reduce((a, b) => a + b, 0);\n const overdueList = await this.opts.adapter.getOverdueInstances(\n this.tenantId,\n this.clock.now(),\n filter,\n );\n const resolved = byStatus.approved + byStatus.rejected;\n const approvalRate = resolved === 0 ? 0 : byStatus.approved / resolved;\n const cycleTime = await this.computeCycleTimeStats(filter);\n\n // Per-template breakdown. Issue one aggregate query per template so the\n // result is accurate even when combined with the other filters (documentType,\n // submittedBy, date range). Adapter-agnostic: built only from\n // getInstancesByFilter counts plus a per-template approved/rejected count.\n const templates = await this.registry.list();\n const byTemplate: ApprovalStatistics['byTemplate'] = {};\n const cycleTimeByTemplate: ApprovalStatistics['cycleTimeByTemplate'] = {};\n if (templates.length > 0) {\n await Promise.all(\n templates.map(async (template) => {\n const base = { ...filter, templateName: template.name };\n const [tTotal, tApproved, tRejected, tPending, tCycleTime] = await Promise.all([\n this.opts.adapter.countInstances(this.tenantId, base),\n this.opts.adapter.countInstances(this.tenantId, { ...base, status: 'approved' }),\n this.opts.adapter.countInstances(this.tenantId, { ...base, status: 'rejected' }),\n this.opts.adapter.countInstances(this.tenantId, { ...base, status: 'pending' }),\n this.computeCycleTimeStats(base),\n ]);\n if (tTotal > 0) {\n byTemplate[template.name] = {\n total: tTotal,\n approved: tApproved,\n rejected: tRejected,\n pending: tPending,\n };\n }\n if (tCycleTime.count > 0) {\n cycleTimeByTemplate[template.name] = tCycleTime;\n }\n }),\n );\n }\n\n return {\n total,\n byStatus,\n overdue: overdueList.length,\n approvalRate,\n byTemplate,\n cycleTime,\n cycleTimeByTemplate,\n };\n }\n\n async shutdown(): Promise<void> {\n this.schedulerStopped = true;\n await this.escalation.stop();\n if (this.opts.schedulerAdapter && this.schedulerAdapterHandle !== null) {\n await this.opts.schedulerAdapter.cancel(this.schedulerAdapterHandle);\n this.schedulerAdapterHandle = null;\n }\n await this.opts.schedulerAdapter?.shutdown();\n }\n\n // ─── Internals ────────────────────────────────────────────────────────────\n\n /**\n * Schedules the next escalation scan via {@link ApprovalEngineOptions.schedulerAdapter}.\n *\n * Called once from the constructor to start the loop, then re-invoked by the\n * scheduled callback itself after each scan completes — a self-rescheduling\n * chain of one-shot {@link ISchedulerAdapter.scheduleAt} calls standing in for\n * the `setInterval` that {@link EscalationScheduler.start} would otherwise\n * use. Each invocation runs the exact same {@link EscalationScheduler.tick}\n * scan the built-in poller runs; only the timer mechanism differs.\n *\n * A no-op once {@link shutdown} has set {@link schedulerStopped} — this is\n * what stops the chain from rescheduling itself forever after teardown.\n */\n private scheduleNextEscalationTick(schedulerAdapter: ISchedulerAdapter): void {\n if (this.schedulerStopped) return;\n const runAt = new Date(this.clock.now().getTime() + this.escalationPollIntervalMs);\n schedulerAdapter\n .scheduleAt(this.tenantId, runAt, async () => {\n if (this.schedulerStopped) return;\n try {\n await this.escalation.tick();\n } finally {\n this.scheduleNextEscalationTick(schedulerAdapter);\n }\n })\n .then((handle) => {\n this.schedulerAdapterHandle = handle;\n })\n .catch((err: unknown) => {\n this.logger.error(\n 'ApprovalEngine: failed to schedule the next escalation tick via schedulerAdapter',\n err,\n { tenantId: this.tenantId },\n );\n });\n }\n\n /**\n * Compute {@link CycleTimeStats} for every \"completed\" instance (see\n * {@link CYCLE_TIME_STATUSES}) matching `filter`. Adapter-agnostic: fetches\n * full instances (not just counts) via {@link fetchAllByFilter} so the\n * actual `createdAt`/`updatedAt` timestamps are available, then reuses the\n * shared {@link computeTimingStats} quantile routine from the metrics\n * plugin rather than a second implementation.\n */\n private async computeCycleTimeStats(\n filter: Omit<InstanceFilter, 'status'>,\n ): Promise<CycleTimeStats> {\n const perStatusLists = await Promise.all(\n CYCLE_TIME_STATUSES.map((status) => this.fetchAllByFilter({ ...filter, status })),\n );\n const durationsMs = perStatusLists\n .flat()\n .map((instance) => instance.updatedAt.getTime() - instance.createdAt.getTime());\n return toCycleTimeStats(computeTimingStats(durationsMs));\n }\n\n /**\n * Page through every instance matching `filter` via the adapter's\n * `getInstancesByFilter`, accumulating pages until the adapter reports no\n * more results. Needed because adapters may impose a default page size\n * (e.g. `PostgresAdapter` defaults to 50) when no explicit `limit` is given,\n * so a single unbounded call cannot be relied on to return everything.\n */\n private async fetchAllByFilter(filter: InstanceFilter): Promise<ApprovalInstance[]> {\n const items: ApprovalInstance[] = [];\n let offset = 0;\n for (;;) {\n const page = await this.opts.adapter.getInstancesByFilter(this.tenantId, filter, {\n limit: CYCLE_TIME_FETCH_BATCH_SIZE,\n offset,\n });\n items.push(...page.items);\n offset += page.items.length;\n if (page.items.length === 0 || items.length >= page.total) break;\n }\n return items;\n }\n\n private async escalateInternal(\n instanceId: string,\n escalatedBy = 'system',\n auditCtx?: AuditContext,\n levelNumber?: number,\n ): Promise<ApprovalInstance> {\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n\n const ladder = await this.escalationLadder(instance);\n const targetLevel =\n levelNumber === undefined\n ? this.currentLevelInstance(instance)\n : (instance.levels.find((l) => l.level === levelNumber) ??\n this.currentLevelInstance(instance));\n const rungIndex = targetLevel.escalationStep ?? 0;\n const rung = ladder[rungIndex];\n\n const escalateTo =\n rung?.escalateTo ??\n (\n instance.templateSnapshot?.escalation ??\n (await this.registry.get(instance.templateName)).escalation\n )?.escalateTo;\n if (!escalateTo) return instance;\n\n const newApprovers = await this.resolver.resolveApprovers(\n [escalateTo],\n instance.submittedBy,\n instance.data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n this.clock.now(),\n );\n\n const filteredApprovers = newApprovers.filter((id) => id !== instance.submittedBy);\n if (filteredApprovers.length === 0) {\n this.logger.warn(\n 'escalateInternal: escalation resolved to submitter only — no approvers added',\n {\n tenantId: this.tenantId,\n instanceId,\n },\n );\n return instance;\n }\n\n // A parallel group has several open branches, each with its own deadline;\n // escalating \"the current level\" would leave the others stuck forever.\n const level = targetLevel;\n level.approverIds = [...new Set([...level.approverIds, ...filteredApprovers])];\n\n const now = this.clock.now();\n\n // Arm the next rung, if the ladder has one. Rung delays are measured from\n // when the level opened, not from the previous escalation, so a ladder\n // reads the way it is written: \"2 days, then 4 days, then 7\".\n level.escalationStep = rungIndex + 1;\n const nextRung = ladder[rungIndex + 1];\n const levelOpenedAt = this.levelOpenedAt(instance, level, now);\n level.escalationDueAt = nextRung ? this.stepDueAt(levelOpenedAt, nextRung) : undefined;\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', {\n tenantId: this.tenantId,\n instanceId,\n escalatedTo,\n });\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n level: level.level,\n escalatedTo,\n };\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(\n instanceId: string,\n deadlineAction: 'cancel' | 'reject',\n ): 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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n deadlineAction,\n };\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n slaDeadlineAt: instance.slaDeadlineAt ?? now,\n };\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(\n instanceId: string,\n levelNumber: number,\n fromApprover: string,\n ): 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', {\n tenantId: this.tenantId,\n attempt: String(attempt),\n });\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 /** Compute a deadline `days` from `from`, honouring the business calendar if one is configured. */\n private deadlineFrom(from: Date, days: number): Date {\n return this.calendar\n ? this.calendar.addBusinessDays(from, days)\n : new Date(from.getTime() + days * 86_400_000);\n }\n\n /**\n * Resolve an hour-based deadline.\n *\n * A calendar that only knows whole days — `weekendCalendar`, say — has no\n * `addBusinessHours`, and this falls back to elapsed clock time rather than\n * quietly pretending the calendar was applied. Configure\n * `businessHoursCalendar` to have hours skip evenings and weekends.\n */\n private deadlineFromHours(from: Date, hours: number): Date {\n const addHours = this.calendar?.addBusinessHours?.bind(this.calendar);\n return addHours ? addHours(from, hours) : new Date(from.getTime() + hours * 3_600_000);\n }\n\n /**\n * Build a level instance from its template config.\n *\n * The single place a level is constructed. It previously happened twice — in\n * `submit()` and again in `recomputeFutureChain()` — and the second copy was\n * missing `group`, `subWorkflowTemplate`, `escalationAfterHours` and the\n * reminder fields, so a level added by a condition during `updateData()` came\n * out silently different from the same level created at submit.\n *\n * @param cfg - The template's configuration for this level.\n * @param opts - `open` activates the level now, computing deadlines from `now`.\n */\n private buildLevelInstance(\n cfg: ApprovalLevelConfig,\n opts: { open: boolean; now: Date; firstRung?: EscalationStep },\n ): ApprovalLevelInstance {\n const level: ApprovalLevelInstance = {\n level: cfg.level,\n name: cfg.name,\n group: cfg.group,\n mode: cfg.mode,\n approverConfigs: cfg.approvers,\n approverIds: [],\n approvedBy: [],\n rejectedBy: [],\n status: opts.open ? 'pending' : 'waiting',\n minApprovals: cfg.minApprovals,\n threshold: cfg.threshold,\n weights: cfg.weights,\n subWorkflowTemplate: cfg.subWorkflow?.templateName,\n escalationAfterDays: cfg.escalationAfterDays,\n escalationAfterHours: cfg.escalationAfterHours,\n escalationStep: 0,\n reminderAfterDays: cfg.reminderAfterDays,\n reminderEveryDays: cfg.reminderEveryDays,\n maxReminders: cfg.maxReminders,\n remindersSent: 0,\n };\n\n if (opts.open) {\n level.openedAt = opts.now;\n level.escalationDueAt = this.levelEscalationDue(opts.now, cfg, opts.firstRung);\n this.scheduleReminder(level, opts.now);\n }\n return level;\n }\n\n /** Level deadline from whichever of days/hours the template configured. */\n private levelEscalationDue(\n from: Date,\n level: { escalationAfterDays?: number; escalationAfterHours?: number },\n firstRung?: EscalationStep,\n ): Date | undefined {\n // An explicit per-level delay wins: it is the more specific statement of\n // when this particular level is late.\n if (level.escalationAfterHours) return this.deadlineFromHours(from, level.escalationAfterHours);\n if (level.escalationAfterDays) return this.deadlineFrom(from, level.escalationAfterDays);\n return firstRung ? this.stepDueAt(from, firstRung) : undefined;\n }\n\n /** First rung of a ladder, sorted by delay, or undefined when there is none. */\n private firstRungOf(steps: EscalationStep[] | undefined): EscalationStep | undefined {\n if (!steps || steps.length === 0) return undefined;\n return [...steps].sort(\n (a, b) =>\n (a.afterHours ?? (a.afterDays ?? 0) * 24) - (b.afterHours ?? (b.afterDays ?? 0) * 24),\n )[0];\n }\n\n /**\n * The escalation ladder for an instance, sorted by delay.\n *\n * Read from the instance's template snapshot so an in-flight approval keeps\n * the ladder it was submitted under, exactly as the single-step\n * {@link EscalationConfig} already did.\n */\n private async escalationLadder(instance: ApprovalInstance): Promise<EscalationStep[]> {\n const snapshot = instance.templateSnapshot;\n const steps =\n snapshot?.escalationSteps ??\n (await this.registry.get(instance.templateName)).escalationSteps ??\n [];\n return [...steps].sort(\n (a, b) =>\n (a.afterHours ?? (a.afterDays ?? 0) * 24) - (b.afterHours ?? (b.afterDays ?? 0) * 24),\n );\n }\n\n /**\n * When a level started collecting decisions.\n *\n * Escalation rungs are measured from this, not from the previous rung, so a\n * ladder reads the way it is written. Recovered from the audit trail — the\n * `submitted` entry for the opening level, the `level_advanced` entry\n * otherwise — and falls back to `now` when no entry exists, which only leaves\n * the ladder no worse off than the single-step behaviour it replaces.\n */\n private levelOpenedAt(\n instance: ApprovalInstance,\n level: ApprovalLevelInstance,\n fallback: Date,\n ): Date {\n // Recorded on the level since 3.1.0. The audit scan below remains for\n // instances submitted before that and still in flight.\n if (level.openedAt) return new Date(level.openedAt);\n\n for (let i = instance.auditLog.length - 1; i >= 0; i--) {\n const entry = instance.auditLog[i];\n if (!entry) continue;\n const opensThisLevel =\n (entry.action === 'level_advanced' || entry.action === 'submitted') &&\n entry.level === level.level;\n if (opensThisLevel) return new Date(entry.timestamp);\n }\n return fallback;\n }\n\n /** Deadline for one rung, measured from when the level opened. */\n private stepDueAt(from: Date, step: EscalationStep): Date | undefined {\n if (step.afterHours) return this.deadlineFromHours(from, step.afterHours);\n if (step.afterDays) return this.deadlineFrom(from, step.afterDays);\n return undefined;\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 /**\n * Identity of the parallel branch group a level belongs to.\n *\n * An ungrouped level is its own group of one, keyed by its level number, so\n * sequential and parallel levels can be handled by the same code paths. The\n * `#` prefix keeps a synthetic key from ever colliding with a real group\n * name a template author chose.\n */\n private static groupKeyOf(level: { level: number; group?: string }): string {\n return level.group ?? `#${level.level}`;\n }\n\n /** Every level currently collecting decisions — more than one inside a parallel group. */\n private pendingLevels(instance: ApprovalInstance): ApprovalLevelInstance[] {\n return instance.levels.filter((l) => l.status === 'pending');\n }\n\n /** All levels sharing a group with the given level, including it. */\n private groupMembers(\n instance: ApprovalInstance,\n level: ApprovalLevelInstance,\n ): ApprovalLevelInstance[] {\n const key = ApprovalEngine.groupKeyOf(level);\n return instance.levels.filter((l) => ApprovalEngine.groupKeyOf(l) === key);\n }\n\n /**\n * Pick which pending level an actor is operating on.\n *\n * With sequential levels there is only ever one candidate. Inside a parallel\n * group an approver may sit on several branches at once, and guessing which\n * one they meant would silently record the decision against the wrong branch —\n * so that case demands an explicit `level`.\n */\n private resolveActorLevel(\n instance: ApprovalInstance,\n actorId: string,\n explicitLevel?: number,\n ): ApprovalLevelInstance {\n const pending = this.pendingLevels(instance);\n if (pending.length === 0) {\n throw new ApprovalError(\n `Instance has no level awaiting a decision (status: ${instance.status}).`,\n 'INVALID_LEVEL',\n );\n }\n\n if (explicitLevel !== undefined) {\n const chosen = pending.find((l) => l.level === explicitLevel);\n if (!chosen) {\n const open = pending.map((l) => l.level).join(', ');\n throw new ApprovalError(\n `Level ${explicitLevel} is not awaiting a decision (open levels: ${open}).`,\n 'INVALID_LEVEL',\n );\n }\n return chosen;\n }\n\n if (pending.length === 1) return pending[0] as ApprovalLevelInstance;\n\n const candidates = pending.filter((l) => l.approverIds.includes(actorId));\n if (candidates.length === 1) return candidates[0] as ApprovalLevelInstance;\n if (candidates.length > 1) {\n const open = candidates.map((l) => `${l.level} (\"${l.name}\")`).join(', ');\n throw new ApprovalValidationError(\n `Approver \"${actorId}\" is assigned to more than one open parallel level (${open}). Pass an explicit \"level\" to say which one this decision is for.`,\n );\n }\n // Not an approver anywhere; hand back the lowest open level so the caller's\n // own membership check produces the usual \"not an approver\" error.\n return pending[0] as ApprovalLevelInstance;\n }\n\n private currentLevelInstance(instance: ApprovalInstance): ApprovalLevelInstance {\n const pending = this.pendingLevels(instance);\n const lowestPending = pending.reduce<ApprovalLevelInstance | null>(\n (acc, l) => (acc === null || l.level < acc.level ? l : acc),\n null,\n );\n const level =\n instance.levels.find((l) => l.level === instance.currentLevel) ?? lowestPending ?? null;\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 /**\n * The next group of levels to activate: every level sharing the group of the\n * lowest-numbered waiting level.\n */\n private findNextGroup(instance: ApprovalInstance): ApprovalLevelInstance[] {\n const waiting = instance.levels\n .filter((l) => l.status === 'waiting')\n .sort((a, b) => a.level - b.level);\n const head = waiting[0];\n if (!head) return [];\n const key = ApprovalEngine.groupKeyOf(head);\n return waiting.filter((l) => ApprovalEngine.groupKeyOf(l) === key);\n }\n\n /** Resolve approvers for a group, set its deadlines, and mark it pending. */\n private async activateGroup(\n instance: ApprovalInstance,\n group: ApprovalLevelInstance[],\n now: Date,\n ): Promise<void> {\n const firstRung = this.firstRungOf(instance.templateSnapshot?.escalationSteps);\n for (const lvl of group) {\n if (lvl.subWorkflowTemplate) {\n // Nobody approves this level directly — a child approval decides it.\n lvl.approverIds = [];\n } else {\n lvl.approverIds = await this.resolver.resolveApprovers(\n lvl.approverConfigs,\n instance.submittedBy,\n instance.data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n now,\n );\n }\n lvl.openedAt = now;\n lvl.escalationDueAt = this.levelEscalationDue(now, lvl, firstRung);\n lvl.escalationStep = 0;\n this.scheduleReminder(lvl, now);\n lvl.status = 'pending';\n }\n instance.currentLevel = group.reduce((min, l) => Math.min(min, l.level), Infinity);\n }\n\n /**\n * Set (or clear) the next reminder deadline for a level that has just opened.\n *\n * Called wherever a level becomes pending, so a level activated by submit,\n * by advancing, or by a group activation all schedule alike.\n */\n private scheduleReminder(level: ApprovalLevelInstance, from: Date): void {\n if (!level.reminderAfterDays || level.reminderAfterDays <= 0) {\n level.reminderDueAt = undefined;\n return;\n }\n level.remindersSent = level.remindersSent ?? 0;\n level.reminderDueAt = this.deadlineFrom(from, level.reminderAfterDays);\n }\n\n /**\n * Nudge the approvers who still owe a decision on a pending level.\n *\n * Reminders never change who can approve or when the level escalates — they\n * only notify. Recipients exclude anyone who has already voted, so a\n * half-decided quorum level stops pestering the approvers who did their part.\n */\n private async sendReminder(instanceId: string, levelNumber: number): Promise<void> {\n try {\n await this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n const level = instance.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending' || !level.reminderDueAt) return instance;\n\n const sentSoFar = level.remindersSent ?? 0;\n const cap = level.maxReminders ?? DEFAULT_MAX_REMINDERS;\n if (sentSoFar >= cap) {\n level.reminderDueAt = undefined;\n await this.opts.adapter.updateInstance(instance, instance.version);\n return instance;\n }\n\n const now = this.clock.now();\n const reminderNumber = sentSoFar + 1;\n level.remindersSent = reminderNumber;\n\n // Schedule the next one, or stop if this was the last permitted.\n level.reminderDueAt =\n level.reminderEveryDays && reminderNumber < cap\n ? this.deadlineFrom(now, level.reminderEveryDays)\n : undefined;\n\n const recipients = level.approverIds.filter(\n (id) => !level.approvedBy.includes(id) && !level.rejectedBy.includes(id),\n );\n\n const auditEntry: AuditEntry = {\n action: 'reminded',\n actorId: 'system',\n level: level.level,\n timestamp: now,\n newValue: { reminderNumber, recipients },\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.reminded', { tenantId: this.tenantId });\n this.logger.info('reminder: nudged pending approvers', {\n tenantId: this.tenantId,\n instanceId,\n levelNumber,\n reminderNumber,\n recipients,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n level: level.level,\n recipients,\n reminderNumber,\n };\n this.bus.emit('approval:reminder', payload);\n await this.notifyAdapters('approval:reminder', instance, payload);\n return instance;\n });\n } catch (err) {\n this.logger.error('reminder: failed to send', err, { tenantId: this.tenantId, instanceId });\n }\n }\n\n /**\n * Start child approvals for any open level that delegates to a sub-workflow.\n *\n * Run after the parent has been persisted, never inside the same optimistic\n * write: the child's own `submit()` performs its own reads and writes, and\n * nesting them under the parent's compare-and-set would make a slow child\n * template a source of spurious version conflicts on the parent.\n */\n private async startSubWorkflows(instance: ApprovalInstance): Promise<void> {\n const pendingSubs = instance.levels.filter(\n (l) => l.status === 'pending' && l.subWorkflowTemplate && !l.childInstanceId,\n );\n if (pendingSubs.length === 0) return;\n\n const depth = (instance.subWorkflowDepth ?? 0) + 1;\n if (depth > MAX_SUBWORKFLOW_DEPTH) {\n throw new ApprovalValidationError(\n `Sub-workflow nesting exceeded ${MAX_SUBWORKFLOW_DEPTH} levels at template \"${instance.templateName}\". Check for a template that reaches itself.`,\n );\n }\n\n for (const level of pendingSubs) {\n const templateName = level.subWorkflowTemplate as string;\n const childTemplate = await this.registry.get(templateName);\n\n const child = await this.submit(\n {\n templateName,\n // Unique per parent level, so a resubmitted parent does not collide\n // with the child it spawned last time.\n documentId: `${instance.documentId}#L${level.level}`,\n documentType: childTemplate.documentType,\n submittedBy: instance.submittedBy,\n data: instance.data,\n metadata: { ...instance.metadata, parentInstanceId: instance.id },\n },\n undefined,\n { parentInstanceId: instance.id, parentLevel: level.level, depth },\n );\n\n await this.withOptimisticRetry(instance.id, async (parent) => {\n const lvl = parent.levels.find((l) => l.level === level.level);\n if (!lvl || lvl.childInstanceId) return parent;\n lvl.childInstanceId = child.id;\n parent.updatedAt = this.clock.now();\n await this.opts.adapter.updateInstance(parent, parent.version);\n return parent;\n });\n\n const payload = {\n instanceId: instance.id,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: this.clock.now(),\n level: level.level,\n childInstanceId: child.id,\n childTemplateName: templateName,\n };\n this.bus.emit('approval:subworkflow_started', payload);\n await this.notifyAdapters('approval:subworkflow_started', instance, payload);\n this.logger.info('subWorkflow: child approval started', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n level: level.level,\n childInstanceId: child.id,\n });\n }\n }\n\n /**\n * Return a finished child's outcome to the parent level that is waiting on it.\n *\n * An approved child approves its parent level and lets the chain advance; any\n * other terminal outcome — rejected, cancelled, expired — rejects the parent,\n * because the approval the parent was waiting for did not happen. Collapsing\n * those into one rejection is deliberate: a parent that treated a cancelled\n * child as \"carry on\" would advance past a gate nobody cleared.\n */\n private async propagateToParent(child: ApprovalInstance): Promise<void> {\n if (!child.parentInstanceId || child.parentLevel === undefined) return;\n\n const outcome = child.status;\n const parentId = child.parentInstanceId;\n const parentLevelNumber = child.parentLevel;\n\n try {\n const parent = await this.opts.adapter.getInstance(this.tenantId, parentId);\n if (!parent || parent.status !== 'pending') return;\n\n const payload = {\n instanceId: parentId,\n documentId: parent.documentId,\n documentType: parent.documentType,\n timestamp: this.clock.now(),\n level: parentLevelNumber,\n childInstanceId: child.id,\n childTemplateName: child.templateName,\n outcome: outcome as 'approved' | 'rejected' | 'cancelled' | 'expired',\n };\n\n if (outcome === 'approved') {\n await this.completeSubWorkflowLevel(parentId, parentLevelNumber, child);\n } else {\n await this.rejectFromSubWorkflow(parentId, parentLevelNumber, child);\n }\n\n const refreshed = await this.opts.adapter.getInstance(this.tenantId, parentId);\n this.bus.emit('approval:subworkflow_completed', payload);\n if (refreshed) {\n await this.notifyAdapters('approval:subworkflow_completed', refreshed, payload);\n }\n } catch (err) {\n // A parent that cannot be advanced must not fail the child's own decision,\n // which is already recorded. Surface it loudly instead.\n this.logger.error('subWorkflow: failed to propagate outcome to parent', err, {\n tenantId: this.tenantId,\n childInstanceId: child.id,\n parentInstanceId: parentId,\n });\n }\n }\n\n /** Mark a sub-workflow level approved and advance the parent chain. */\n private async completeSubWorkflowLevel(\n parentId: string,\n levelNumber: number,\n child: ApprovalInstance,\n ): Promise<void> {\n let advanced: ApprovalInstance | null = null;\n\n await this.withOptimisticRetry(parentId, async (parent) => {\n const level = parent.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending') return parent;\n\n const now = this.clock.now();\n level.status = 'approved';\n level.reminderDueAt = undefined;\n level.escalationDueAt = undefined;\n\n const auditEntry: AuditEntry = {\n action: 'subworkflow_completed',\n actorId: 'system',\n level: levelNumber,\n timestamp: now,\n newValue: { childInstanceId: child.id, outcome: 'approved' },\n };\n parent.auditLog.push(auditEntry);\n parent.updatedAt = now;\n\n // The whole group must be done before the chain moves on, exactly as for\n // an ordinary level inside a parallel group.\n const siblingsOpen = this.groupMembers(parent, level).some(\n (l) => l.status === 'pending' || l.status === 'waiting',\n );\n if (!siblingsOpen) {\n const nextGroup = this.findNextGroup(parent);\n if (nextGroup.length === 0) {\n parent.status = 'approved';\n } else {\n await this.activateGroup(parent, nextGroup, now);\n }\n }\n\n await this.opts.adapter.updateInstance(parent, parent.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, parentId, auditEntry);\n await this.runExternalAudit(parent, auditEntry);\n advanced = parent;\n return parent;\n });\n\n if (advanced) {\n const parent = advanced as ApprovalInstance;\n if (parent.status === 'approved') {\n this.bus.emit('approval:completed', parent);\n await this.notifyAdapters('approval:completed', parent, parent);\n await this.propagateToParent(parent);\n } else {\n // A newly opened group may itself contain sub-workflow levels.\n await this.startSubWorkflows(parent);\n }\n }\n }\n\n /** Reject a parent because the child approval it was waiting on did not succeed. */\n private async rejectFromSubWorkflow(\n parentId: string,\n levelNumber: number,\n child: ApprovalInstance,\n ): Promise<void> {\n let rejected: ApprovalInstance | null = null;\n\n await this.withOptimisticRetry(parentId, async (parent) => {\n const level = parent.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending') return parent;\n\n const now = this.clock.now();\n level.status = 'rejected';\n level.reminderDueAt = undefined;\n level.escalationDueAt = undefined;\n parent.status = 'rejected';\n parent.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'subworkflow_completed',\n actorId: 'system',\n level: levelNumber,\n timestamp: now,\n reason: `Child approval ${child.id} ended as \"${child.status}\".`,\n newValue: { childInstanceId: child.id, outcome: child.status },\n };\n parent.auditLog.push(auditEntry);\n\n await this.opts.adapter.updateInstance(parent, parent.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, parentId, auditEntry);\n await this.runExternalAudit(parent, auditEntry);\n rejected = parent;\n return parent;\n });\n\n if (rejected) {\n const parent = rejected as ApprovalInstance;\n const payload = {\n instanceId: parent.id,\n documentId: parent.documentId,\n documentType: parent.documentType,\n timestamp: this.clock.now(),\n approverId: 'system',\n level: levelNumber,\n reason: `Child approval ${child.id} ended as \"${child.status}\".`,\n returnTo: null,\n };\n this.bus.emit('approval:rejected', payload);\n await this.notifyAdapters('approval:rejected', parent, payload);\n await this.propagateToParent(parent);\n }\n }\n\n /**\n * Work that must happen after a decision is durably recorded, not inside it.\n *\n * Both branches touch other instances — a newly opened level may spawn a\n * child approval, and a finished instance may be a child that owes its\n * outcome to a parent. Doing either inside the deciding instance's\n * compare-and-set would nest writes under a version guard that knows nothing\n * about them, so a slow child template would surface as a spurious conflict\n * on the decision the user just made.\n */\n /**\n * An instance and every sub-workflow descendant beneath it, parents first.\n *\n * A child is only reachable through its parent's `childInstanceId`, so a\n * purge that removed the parent alone would strand the rest of the tree.\n * Depth is bounded by the same cap that limits spawning, and an already-seen\n * id is skipped so a corrupted link cannot loop.\n */\n private async collectSubWorkflowFamily(root: ApprovalInstance): Promise<ApprovalInstance[]> {\n const family: ApprovalInstance[] = [root];\n const seen = new Set<string>([root.id]);\n const queue: ApprovalInstance[] = [root];\n\n for (let depth = 0; queue.length > 0 && depth <= MAX_SUBWORKFLOW_DEPTH; depth++) {\n const generation = queue.splice(0, queue.length);\n for (const parent of generation) {\n for (const level of parent.levels) {\n const childId = level.childInstanceId;\n if (!childId || seen.has(childId)) continue;\n seen.add(childId);\n const child = await this.opts.adapter.getInstance(this.tenantId, childId);\n if (!child) continue;\n family.push(child);\n queue.push(child);\n }\n }\n }\n return family;\n }\n\n /**\n * Cancel sub-workflow children whose parent has finished.\n *\n * A child outlives its parent otherwise: it stays pending, keeps notifying\n * and escalating, and keeps appearing in {@link getWorkload} — asking people\n * to decide something whose outcome nobody will ever read, because\n * {@link propagateToParent} ignores a parent that is no longer pending.\n *\n * Cancelling rather than deleting keeps the child's own audit trail intact:\n * the people who were asked, and why the request stopped, stay on the record.\n */\n private async cancelOrphanedChildren(parent: ApprovalInstance): Promise<void> {\n const childIds = parent.levels\n .map((l) => l.childInstanceId)\n .filter((id): id is string => typeof id === 'string');\n if (childIds.length === 0) return;\n\n for (const childId of childIds) {\n try {\n const child = await this.opts.adapter.getInstance(this.tenantId, childId);\n if (!child || TERMINAL_STATUSES.has(child.status)) continue;\n await this.cancel(childId, {\n cancelledBy: 'system',\n reason: `Parent approval ${parent.id} ended as \"${parent.status}\".`,\n });\n } catch (err) {\n // A child that cannot be cancelled must not undo the parent's own\n // decision, which is already recorded.\n this.logger.error('subWorkflow: failed to cancel orphaned child', err, {\n tenantId: this.tenantId,\n parentInstanceId: parent.id,\n childInstanceId: childId,\n });\n }\n }\n }\n\n private async afterDecision(instance: ApprovalInstance): Promise<void> {\n if (TERMINAL_STATUSES.has(instance.status)) {\n await this.cancelOrphanedChildren(instance);\n await this.propagateToParent(instance);\n return;\n }\n await this.startSubWorkflows(instance);\n }\n\n private findNextLevel(instance: ApprovalInstance): ApprovalLevelInstance | null {\n return (\n instance.levels.find((l) => l.level > instance.currentLevel && l.status === 'waiting') ?? null\n );\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, {\n tenantId: this.tenantId,\n });\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(\n ctx: OperationContext,\n result?: ApprovalInstance | void,\n ): 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, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\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, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\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\n/** Map the shared {@link TimingStats} shape onto the ms-suffixed {@link CycleTimeStats} field names. */\nfunction toCycleTimeStats(timing: TimingStats): CycleTimeStats {\n return {\n count: timing.count,\n averageMs: timing.avg,\n p50Ms: timing.p50,\n p95Ms: timing.p95,\n minMs: timing.min,\n maxMs: timing.max,\n };\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(err instanceof Error ? err.message : 'Invalid input', err);\n }\n}\n","/**\n * Computes deadline dates from a number of days. The default engine behaviour\n * treats day offsets (escalationAfterDays, slaDeadlineDays) as plain calendar\n * days; provide a BusinessCalendar on ApprovalEngine to interpret them as\n * business days instead — skipping weekends and configured holidays.\n */\nexport interface BusinessCalendar {\n /**\n * Return the date that is `days` business days after `from`. A fractional\n * `days` adds whole business days first, then the remaining fraction as\n * elapsed clock time within the resulting business day.\n */\n addBusinessDays(from: Date, days: number): Date;\n /**\n * Return the date that is `hours` **working** hours after `from`, skipping\n * non-working hours, weekends and holidays.\n *\n * Optional. A calendar that only knows about whole days — such as\n * {@link weekendCalendar} — omits it, and the engine falls back to elapsed\n * clock time for any hour-based deadline rather than silently pretending the\n * calendar was applied.\n */\n addBusinessHours?(from: Date, hours: number): Date;\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction dayKey(d: Date): string {\n // Local-date key (YYYY-MM-DD) for holiday comparison.\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nexport interface WeekendCalendarOptions {\n /** Dates to treat as non-working days (compared by local calendar date). */\n holidays?: Date[];\n /**\n * Weekday numbers (0 = Sunday … 6 = Saturday) that count as weekend.\n * Defaults to [0, 6]. Override for regions with different work weeks\n * (e.g. [5, 6] for a Friday/Saturday weekend).\n */\n weekendDays?: number[];\n}\n\n/**\n * A calendar that skips weekends (Sat/Sun by default) and any supplied\n * holidays. Day arithmetic is performed in the host's local timezone.\n */\nexport function weekendCalendar(options: WeekendCalendarOptions = {}): BusinessCalendar {\n const weekend = new Set(options.weekendDays ?? [0, 6]);\n const holidays = new Set((options.holidays ?? []).map(dayKey));\n\n const isBusinessDay = (d: Date): boolean => !weekend.has(d.getDay()) && !holidays.has(dayKey(d));\n\n return {\n addBusinessDays(from: Date, days: number): Date {\n if (days <= 0 || Number.isNaN(days)) return new Date(from.getTime());\n\n const whole = Math.floor(days);\n const fraction = days - whole;\n\n const cursor = new Date(from.getTime());\n let remaining = whole;\n // Advance one calendar day at a time, counting only business days.\n while (remaining > 0) {\n cursor.setDate(cursor.getDate() + 1);\n if (isBusinessDay(cursor)) remaining--;\n }\n\n return fraction > 0 ? new Date(cursor.getTime() + fraction * DAY_MS) : cursor;\n },\n };\n}\n\nconst HOUR_MS = 3_600_000;\n\nexport interface BusinessHoursCalendarOptions extends WeekendCalendarOptions {\n /** First working hour of the day, 0-23 in local time. Defaults to 9. */\n workdayStartHour?: number;\n /**\n * Hour at which the working day ends, 0-24 in local time. Defaults to 17.\n * Must be greater than {@link workdayStartHour}.\n */\n workdayEndHour?: number;\n}\n\n/**\n * A calendar that counts only working hours within working days.\n *\n * SLAs in an ERP are quoted in hours far more often than days — \"respond within\n * four working hours\" — and counting those as elapsed clock time makes a\n * request submitted at 16:00 on a Friday overdue before anybody could have\n * looked at it. This advances the clock only through the configured working\n * window, skipping evenings, weekends and holidays.\n *\n * A `from` outside working hours is first moved forward to the next working\n * moment, so a deadline never starts counting from a time nobody was at work.\n *\n * Arithmetic is performed in the host's local timezone, matching\n * {@link weekendCalendar}.\n *\n * @example\n * ```ts\n * const calendar = businessHoursCalendar({ workdayStartHour: 9, workdayEndHour: 17 });\n * // Friday 16:00 + 4 working hours -> Monday 12:00\n * ```\n */\nexport function businessHoursCalendar(\n options: BusinessHoursCalendarOptions = {},\n): Required<Pick<BusinessCalendar, 'addBusinessDays' | 'addBusinessHours'>> {\n const startHour = options.workdayStartHour ?? 9;\n const endHour = options.workdayEndHour ?? 17;\n if (!(endHour > startHour)) {\n throw new Error(\n `businessHoursCalendar: workdayEndHour (${endHour}) must be greater than workdayStartHour (${startHour}).`,\n );\n }\n\n const weekend = new Set(options.weekendDays ?? [0, 6]);\n const holidays = new Set((options.holidays ?? []).map(dayKey));\n const isBusinessDay = (d: Date): boolean => !weekend.has(d.getDay()) && !holidays.has(dayKey(d));\n\n const startOfWorkday = (d: Date): Date => {\n const out = new Date(d.getTime());\n out.setHours(startHour, 0, 0, 0);\n return out;\n };\n const endOfWorkday = (d: Date): Date => {\n const out = new Date(d.getTime());\n out.setHours(endHour, 0, 0, 0);\n return out;\n };\n\n /** Move to the next moment that is inside a working window. */\n const toWorkingMoment = (from: Date): Date => {\n const cursor = new Date(from.getTime());\n for (let guard = 0; guard < 3660; guard++) {\n if (!isBusinessDay(cursor)) {\n cursor.setDate(cursor.getDate() + 1);\n cursor.setHours(startHour, 0, 0, 0);\n continue;\n }\n if (cursor.getTime() < startOfWorkday(cursor).getTime()) return startOfWorkday(cursor);\n if (cursor.getTime() >= endOfWorkday(cursor).getTime()) {\n cursor.setDate(cursor.getDate() + 1);\n cursor.setHours(startHour, 0, 0, 0);\n continue;\n }\n return cursor;\n }\n // Every day for ten years was a holiday; a caller misconfigured the calendar.\n throw new Error(\n 'businessHoursCalendar: no working day found within 10 years of the start date.',\n );\n };\n\n const base = weekendCalendar(options);\n\n return {\n addBusinessDays: base.addBusinessDays,\n\n addBusinessHours(from: Date, hours: number): Date {\n if (hours <= 0 || Number.isNaN(hours)) return new Date(from.getTime());\n\n let cursor = toWorkingMoment(from);\n let remainingMs = Math.round(hours * HOUR_MS);\n\n for (let guard = 0; remainingMs > 0 && guard < 3660; guard++) {\n const dayEnd = endOfWorkday(cursor);\n const availableMs = dayEnd.getTime() - cursor.getTime();\n\n if (remainingMs <= availableMs) {\n return new Date(cursor.getTime() + remainingMs);\n }\n remainingMs -= availableMs;\n // Next working day, from its first working minute.\n const next = new Date(cursor.getTime());\n next.setDate(next.getDate() + 1);\n next.setHours(startHour, 0, 0, 0);\n cursor = toWorkingMoment(next);\n }\n\n throw new Error(\n `businessHoursCalendar: ${hours} working hours could not be scheduled within 10 years — check weekendDays and holidays.`,\n );\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/validate.ts","../src/errors.ts","../src/adapters/MemoryAdapter.ts","../src/utils/EventBus.ts","../src/utils/Logger.ts","../src/utils/Clock.ts","../src/utils/IdGenerator.ts","../src/engine/TemplateRegistry.ts","../src/engine/LevelResolver.ts","../src/engine/EscalationScheduler.ts","../src/engine/ConditionEvaluator.ts","../src/engine/StateMachine.ts","../src/plugins/metrics/stats.ts","../src/engine/ApprovalEngine.ts","../src/utils/BusinessCalendar.ts"],"names":["z","EventEmitter","p","result","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 * Which open level this decision is for. Only needed inside a parallel group\n * when the approver sits on more than one open branch.\n */\n level: z.number().int().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 /** Which open level this decision is for; see {@link ApproveOptionsSchema}. */\n level: z.number().int().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 * Which open level to act on. Only needed inside a parallel group, where the\n * approver may hold more than one open branch.\n */\n level: z.number().int().optional(),\n});\n\nexport const ReassignOptionsSchema = z.object({\n reassignedBy: z.string().min(1),\n fromApprover: z.string().min(1),\n toApprover: z.string().min(1),\n reason: z.string().min(1),\n /** Which open level to act on; see {@link DelegateOptionsSchema}. */\n level: z.number().int().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 /** The comment being replied to, forming a thread. */\n parentCommentId: z.string().optional(),\n /** Users named in the comment; they are notified when it is posted. */\n mentions: z.array(z.string().min(1)).optional(),\n});\n\nexport const OverrideOptionsSchema = z.object({\n overriddenBy: z.string().min(1),\n justification: z.string().min(1),\n});\n\nexport const RequestInfoOptionsSchema = z.object({\n approverId: z.string().min(1),\n question: z.string().min(1),\n /** Which open level is asking; only needed inside a parallel group. */\n level: z.number().int().optional(),\n});\n\nexport const ProvideInfoOptionsSchema = z.object({\n respondedBy: z.string().min(1),\n response: z.string().min(1),\n});\n\nexport const AddAttachmentOptionsSchema = z.object({\n actorId: z.string().min(1),\n name: z.string().min(1),\n /** Where the file lives. A reference — the engine never stores bytes. */\n uri: z.string().min(1),\n contentType: z.string().optional(),\n sizeBytes: z.number().int().nonnegative().optional(),\n});\n\nexport const RemoveAttachmentOptionsSchema = z.object({\n actorId: z.string().min(1),\n attachmentId: z.string().min(1),\n reason: z.string().optional(),\n});\n\nexport const TransferApprovalsOptionsSchema = z.object({\n fromApprover: z.string().min(1),\n toApprover: z.string().min(1),\n transferredBy: z.string().min(1),\n reason: z.string().min(1),\n /** Restrict the sweep to one document type. */\n documentType: z.string().optional(),\n /** Report what would move without changing anything. */\n dryRun: z.boolean().default(false),\n /** Safety cap on how many instances one sweep will touch. */\n limit: z.number().int().positive().default(500),\n});\n\nexport const UpdateDataOptionsSchema = z.object({\n updatedBy: z.string().min(1),\n data: z.record(z.string(), z.unknown()),\n /** Merge into existing data (default) or replace it wholesale. */\n mode: z.enum(['merge', 'replace']).default('merge'),\n reason: z.string().optional(),\n /** Re-evaluate template conditions against the new data (default true). */\n recomputeChain: z.boolean().default(true),\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 ReassignOptions = z.infer<typeof ReassignOptionsSchema>;\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>;\nexport type UpdateDataOptions = z.infer<typeof UpdateDataOptionsSchema>;\nexport type RequestInfoOptions = z.infer<typeof RequestInfoOptionsSchema>;\nexport type ProvideInfoOptions = z.infer<typeof ProvideInfoOptionsSchema>;\nexport type AddAttachmentOptions = z.infer<typeof AddAttachmentOptionsSchema>;\nexport type RemoveAttachmentOptions = z.infer<typeof RemoveAttachmentOptionsSchema>;\nexport type TransferApprovalsOptions = z.infer<typeof TransferApprovalsOptionsSchema>;\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 {\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\n/**\n * Restore every `Date` the JSON clone flattened to a string.\n *\n * Every date-bearing field must be listed here. Missing one leaves a value the\n * type says is a `Date` holding a string, which `PostgresAdapter` revives\n * correctly — so the two adapters disagree and the bug only shows up under one\n * of them. That is how `attachments[].addedAt` and `infoRequest.askedAt` came\n * to read back as strings.\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 infoRequest: instance.infoRequest\n ? { ...instance.infoRequest, askedAt: new Date(instance.infoRequest.askedAt) }\n : undefined,\n attachments: instance.attachments\n ? instance.attachments.map((a) => ({ ...a, addedAt: new Date(a.addedAt) }))\n : undefined,\n comments: instance.comments\n ? instance.comments.map((c) => ({ ...c, createdAt: new Date(c.createdAt) }))\n : undefined,\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 if (l.reminderDueAt) level.reminderDueAt = new Date(l.reminderDueAt);\n if (l.openedAt) level.openedAt = new Date(l.openedAt);\n return level;\n }),\n };\n}\n\nfunction reviveTemplateDates(template: ApprovalTemplate): ApprovalTemplate {\n return { ...template, createdAt: new Date(template.createdAt) };\n}\n\n/**\n * Read a dot-path from a document, over **own** properties only.\n *\n * Mirrors how conditions resolve field paths, so a filter and a condition\n * written against the same path agree about what that path means — and an\n * inherited prototype member can never make an instance match a query.\n */\nfunction readPath(data: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((obj, key) => {\n if (obj !== null && typeof obj === 'object' && Object.prototype.hasOwnProperty.call(obj, key)) {\n return (obj as Record<string, unknown>)[key];\n }\n return undefined;\n }, data);\n}\n\n/** Structural equality, so a filter can match an object or array value. */\nfunction deepEquals(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const aKeys = Object.keys(a as Record<string, unknown>);\n const bKeys = Object.keys(b as Record<string, unknown>);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every(\n (k) =>\n Object.prototype.hasOwnProperty.call(b, k) &&\n deepEquals((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\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.templateName && instance.templateName !== filter.templateName) return false;\n // Stored instances carry string dates (deepClone JSON round-trip), so wrap before comparing.\n if (filter.fromDate && new Date(instance.createdAt) < filter.fromDate) return false;\n if (filter.toDate && new Date(instance.createdAt) > filter.toDate) return false;\n if (filter.data) {\n for (const [path, expected] of Object.entries(filter.data)) {\n if (!deepEquals(readPath(instance.data ?? {}, path), expected)) return false;\n }\n }\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 const template = this.templates.get(`${tenantId}:${name}`);\n return template ? reviveTemplateDates(deepClone(template)) : 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(reviveTemplateDates(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 // Any level that is open, not just the one matching i.currentLevel.\n // currentLevel names a single level, so inside a parallel group it\n // identifies only the lowest branch — an approver assigned to an upper\n // branch got an empty inbox, and transferApprovals left their work\n // behind. PostgresAdapter already matched every pending level.\n return i.levels.some((l) => l.status === 'pending' && l.approverIds.includes(approverId));\n });\n return paginate(\n all.map((i) => reviveDates(deepClone(i))),\n opts,\n );\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(\n all.map((i) => reviveDates(deepClone(i))),\n opts,\n );\n }\n\n async getOverdueInstances(\n tenantId: string,\n asOf: Date,\n filter: InstanceFilter = {},\n ): Promise<ApprovalInstance[]> {\n return [...this.instances.values()]\n .filter((i) => {\n if (i.tenantId !== tenantId) return false;\n // Honour the whole filter, not a hand-picked subset. getStatistics()\n // passes its filter straight through, so a partial match here made\n // `overdue` count instances the other figures had excluded — reporting\n // more overdue approvals than the filter said existed.\n if (!applyFilter(i, { ...filter, status: 'pending' })) return false;\n // Escalation overdue on ANY open branch. Filtering to i.currentLevel\n // would miss the upper branches of a parallel group entirely, and left\n // this adapter disagreeing with PostgresAdapter, which already scans\n // every level.\n const hasOverdueEscalation = i.levels.some(\n (l) => l.escalationDueAt != null && new Date(l.escalationDueAt) <= asOf,\n );\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 // Reminder due on any open branch. Without this the scheduler never\n // sees the instance and no reminder is ever sent.\n const hasDueReminder = i.levels.some(\n (l) =>\n l.status === 'pending' && l.reminderDueAt != null && new Date(l.reminderDueAt) <= asOf,\n );\n return (\n hasOverdueEscalation || isExpired || hasSLABreach || hasDelegationExpiry || hasDueReminder\n );\n })\n .map((i) => reviveDates(deepClone(i)));\n }\n\n async deleteInstance(tenantId: string, id: string): Promise<boolean> {\n const key = `${tenantId}:${id}`;\n // The audit trail lives on the instance in this adapter, so removing the\n // instance removes it too — matching PostgresAdapter, which cascades.\n return this.instances.delete(key);\n }\n\n async countInstances(tenantId: string, filter: InstanceFilter): Promise<number> {\n let count = 0;\n for (const instance of this.instances.values()) {\n if (instance.tenantId === tenantId && applyFilter(instance, filter)) count++;\n }\n return count;\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(\n _tenantId: string,\n _instanceId: string,\n _entry: AuditEntry,\n ): Promise<void> {\n // No-op by design. The engine already pushes each entry onto instance.auditLog\n // and persists the whole instance via saveInstance()/updateInstance(), so the\n // embedded log is the source of truth for this adapter. Pushing here too would\n // duplicate every entry (as a dedicated, append-only audit table would in\n // PostgresAdapter, this method exists to satisfy that separate-sink contract).\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","import EventEmitter from 'eventemitter3';\nimport type { ApprovalEventMap, ApprovalEventName } from '../types/index.js';\n\n/**\n * Invoked when a subscriber's listener throws synchronously or returns a\n * rejecting promise. Receives the thrown value and the event that was being\n * delivered.\n */\nexport type ListenerErrorHandler = (error: unknown, event: ApprovalEventName) => void;\n\ntype Wrapped = (...args: unknown[]) => void;\n\n/**\n * Typed event bus for approval lifecycle events.\n *\n * Listener failures are **isolated**: a subscriber that throws cannot abort the\n * engine operation that emitted the event, nor prevent the remaining listeners\n * from running. Before this isolation existed, one buggy `engine.on()` handler\n * would propagate out of `emit()` mid-operation — after the instance had already\n * been persisted — and skip notification dispatch and after-middleware entirely.\n * Failures are reported through {@link setListenerErrorHandler}, matching the\n * swallow-and-log contract the notification and audit adapter paths already use.\n */\nexport class EventBus {\n private emitter = new EventEmitter();\n /** Per-event map of caller-supplied listener to the wrapper actually registered, so `off` can find it. */\n private wrappers = new Map<ApprovalEventName, Map<unknown, Wrapped>>();\n private onListenerError?: ListenerErrorHandler;\n\n /** Route listener failures somewhere. Without this they are swallowed silently. */\n setListenerErrorHandler(handler: ListenerErrorHandler): void {\n this.onListenerError = handler;\n }\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, this.wrap(event, listener, false));\n return this;\n }\n\n off<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n ): this {\n const wrapped = this.wrappers.get(event)?.get(listener);\n if (wrapped) {\n this.emitter.off(event, wrapped);\n this.forget(event, listener);\n }\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, this.wrap(event, listener, true));\n return this;\n }\n\n /**\n * Wraps a caller listener so its failure is contained. The wrapper is recorded\n * per event so {@link off} can unregister by the original function reference.\n */\n private wrap<K extends ApprovalEventName>(\n event: K,\n listener: (payload: ApprovalEventMap[K]) => void,\n once: boolean,\n ): Wrapped {\n const wrapped: Wrapped = (...args: unknown[]) => {\n try {\n const result: unknown = listener(args[0] as ApprovalEventMap[K]);\n // A listener declared `void` may still be `async`; an unhandled\n // rejection would otherwise escape as a process-level warning.\n if (typeof (result as PromiseLike<void> | undefined)?.then === 'function') {\n void Promise.resolve(result).catch((err: unknown) => {\n this.onListenerError?.(err, event);\n });\n }\n } catch (err) {\n this.onListenerError?.(err, event);\n } finally {\n // eventemitter3 removes a `once` registration itself; drop our bookkeeping too.\n if (once) this.forget(event, listener);\n }\n };\n\n let perEvent = this.wrappers.get(event);\n if (!perEvent) {\n perEvent = new Map<unknown, Wrapped>();\n this.wrappers.set(event, perEvent);\n }\n perEvent.set(listener, wrapped);\n return wrapped;\n }\n\n private forget(event: ApprovalEventName, listener: unknown): void {\n const perEvent = this.wrappers.get(event);\n if (!perEvent) return;\n perEvent.delete(listener);\n if (perEvent.size === 0) this.wrappers.delete(event);\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 fatal(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 fatal: () => {},\n debug: () => {},\n};\n","export interface Clock {\n now(): Date;\n}\n\nexport const systemClock: Clock = { now: () => new Date() };\n","export type IdGeneratorPrefix = 'inst' | 'tpl' | 'att' | 'cmt';\n\nexport type IdGeneratorFn = (prefix: IdGeneratorPrefix) => string;\n\nexport const defaultIdGenerator: IdGeneratorFn = (prefix) =>\n `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n","import type { IStorageAdapter } from '../adapters/IStorageAdapter.js';\nimport type {\n ApprovalTemplateConfig,\n ApprovalTemplate,\n ApprovalLevelConfig,\n} 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 /**\n * Flatten a template that declares `extends` against its base.\n *\n * Resolution is done once, at define time, and the flattened result is what\n * gets stored. Resolving lazily on read would mean editing a base silently\n * reshapes every derived template — and every in-flight instance running\n * against one — which is exactly the surprise `templateSnapshot` exists to\n * prevent elsewhere in the engine.\n *\n * Merge rules:\n * - **Levels** are keyed by level number. A child level with the same number\n * overrides the base level field by field, so a derived template can change\n * just the approvers and inherit the rest. Child-only levels are appended,\n * and `removeLevels` drops inherited ones.\n * - **conditions** are replaced wholesale when the child supplies them.\n * Concatenating two rule lists would produce a chain neither author\n * intended, and there is no meaningful way to \"merge\" boolean rules.\n * - **escalation**, **slaDeadlineDays** and **allowOverride** are taken from\n * the child when set, otherwise inherited.\n *\n * A base that itself extends something is already flattened in storage, so\n * chains resolve naturally and cycles cannot form: the base must exist before\n * the child can name it.\n *\n * @param config - The raw config as supplied by the caller.\n * @returns The config with inheritance applied, or unchanged if no `extends`.\n */\n async resolveInheritance(config: ApprovalTemplateConfig): Promise<ApprovalTemplateConfig> {\n if (!config.extends) return config;\n\n if (config.extends === config.name) {\n throw new ApprovalValidationError(`Template \"${config.name}\" cannot extend itself.`);\n }\n\n const base = await this.adapter.getTemplate(this.tenantId, config.extends);\n if (!base) {\n throw new ApprovalTemplateNotFoundError(\n `${config.extends} (referenced by \"${config.name}\" via extends)`,\n );\n }\n\n const removed = new Set(config.removeLevels ?? []);\n const byLevel = new Map<number, ApprovalLevelConfig>();\n for (const lvl of base.levels) {\n if (!removed.has(lvl.level)) byLevel.set(lvl.level, lvl);\n }\n for (const lvl of config.levels ?? []) {\n const inherited = byLevel.get(lvl.level);\n byLevel.set(lvl.level, inherited ? { ...inherited, ...lvl } : lvl);\n }\n\n const levels = [...byLevel.values()].sort((a, b) => a.level - b.level);\n\n const resolved: ApprovalTemplateConfig = {\n ...config,\n levels,\n conditions: config.conditions ?? base.conditions,\n escalation: config.escalation ?? base.escalation,\n slaDeadlineDays: config.slaDeadlineDays ?? base.slaDeadlineDays,\n allowOverride: config.allowOverride ?? base.allowOverride,\n };\n // `extends`/`removeLevels` are directives for this call, not state to persist:\n // the stored template is already flattened.\n delete resolved.extends;\n delete resolved.removeLevels;\n return resolved;\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\n/** Cap on transitive out-of-office substitution, so a cover cycle terminates. */\nconst MAX_OOO_HOPS = 5;\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?(\n attr: string,\n value: unknown,\n tenantId?: string,\n ): Promise<string[]> | string[];\n}\n\n/**\n * Supplies out-of-office cover so an approver on leave does not stall a chain.\n *\n * Consulted whenever a level's approvers are resolved — at submit, when a level\n * activates, and when a chain is previewed. Kept as an injected provider rather\n * than engine-owned state because absence lives in the HR or directory system\n * that already knows about leave; duplicating it here would guarantee the two\n * disagree.\n */\nexport interface OutOfOfficeProvider {\n /**\n * @param userId - The approver about to be assigned.\n * @param at - The moment cover is being resolved for.\n * @returns The user to stand in, or null/undefined when the approver is available.\n */\n getDelegateFor(\n userId: string,\n at: Date,\n ): Promise<string | null | undefined> | string | null | undefined;\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 /**\n * Copy every custom resolver and approver type onto another resolver.\n *\n * Used when the engine builds a throwaway copy of itself for a simulation: a\n * simulation that could not resolve the caller's own `dynamic` approvers\n * would answer a different question from the one asked.\n */\n copyRegistrationsTo(target: LevelResolver): void {\n for (const [name, fn] of this.resolvers) target.register(name, fn);\n for (const [name, fn] of this.approverTypes) target.registerApproverType(name, fn);\n }\n\n async resolveApprovers(\n approvers: ApproverConfig[],\n submittedBy: string,\n data: Record<string, unknown>,\n orgProvider?: OrgProvider,\n outOfOffice?: OutOfOfficeProvider,\n at?: Date,\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(\n (approver as { type: 'dynamic'; resolver: string }).resolver,\n );\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>, {\n submittedBy,\n data,\n orgProvider,\n });\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 this.applyOutOfOffice(result, outOfOffice, at);\n }\n\n /**\n * Replace approvers who are away with their cover.\n *\n * Substitution is transitive up to {@link MAX_OOO_HOPS} so an A→B→C chain of\n * absences still lands on someone present, but a cycle (A covers B while B\n * covers A) simply stops rather than looping — leaving the original approver\n * assigned, which is visible and fixable, unlike a hang.\n *\n * A provider that throws is treated as \"no cover known\": an HR lookup failing\n * must not block an approval from being routed at all.\n */\n private async applyOutOfOffice(\n userIds: string[],\n provider: OutOfOfficeProvider | undefined,\n at: Date | undefined,\n ): Promise<string[]> {\n if (!provider) return userIds;\n const asOf = at ?? new Date();\n const covered: string[] = [];\n\n for (const original of userIds) {\n let current = original;\n const seen = new Set<string>([current]);\n for (let hop = 0; hop < MAX_OOO_HOPS; hop++) {\n let delegate: string | null | undefined;\n try {\n delegate = await provider.getDelegateFor(current, asOf);\n } catch {\n break;\n }\n if (!delegate || delegate === current || seen.has(delegate)) break;\n seen.add(delegate);\n current = delegate;\n }\n covered.push(current);\n }\n\n return [...new Set(covered)];\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, levelNumber?: number) => Promise<void>;\n onExpire?: (instanceId: string, deadlineAction: 'cancel' | 'reject') => Promise<void>;\n onSlaBreach?: (instanceId: string) => Promise<void>;\n onRevertDelegation?: (\n instanceId: string,\n levelNumber: number,\n fromApprover: string,\n ) => Promise<void>;\n /** Called when a pending level's reminder falls due. */\n onRemind?: (instanceId: string, levelNumber: number) => 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 onRemind?: EscalationSchedulerOpts['onRemind'];\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.onRemind = opts.onRemind;\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()\n .catch((err) => {\n this.logger.error('EscalationScheduler: unhandled error in tick', err, {\n tenantId: this.tenantId,\n });\n })\n .finally(() => {\n this.tickPromise = null;\n });\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 // 0. An open clarification request puts the instance on hold: its\n // deadlines do not advance while the submitter owes an answer. Skipping\n // the whole tick is what makes that true — extending deadlines only on\n // resume would still let a long hold escalate or expire mid-wait.\n if (instance.infoRequest) {\n this.logger.debug('EscalationScheduler: skipping instance on hold', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\n continue;\n }\n\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. Send any due reminders, per open branch.\n if (this.onRemind) {\n for (const level of instance.levels) {\n if (\n level.status === 'pending' &&\n level.reminderDueAt &&\n new Date(level.reminderDueAt) <= now\n ) {\n try {\n await this.onRemind(instance.id, level.level);\n } catch (err) {\n this.logger.error('EscalationScheduler: failed to send reminder', err, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n levelNumber: level.level,\n });\n }\n }\n }\n }\n\n // 5. Check escalation on EVERY open branch. A parallel group has more\n // than one level collecting decisions, each with its own deadline;\n // checking only instance.currentLevel would leave the upper branches\n // of a group unable to escalate at all.\n for (const level of instance.levels) {\n if (\n level.status === 'pending' &&\n level.escalationDueAt &&\n new Date(level.escalationDueAt) <= now\n ) {\n await this.onEscalate(instance.id, level.level);\n this.logger.debug('EscalationScheduler: escalated instance', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n levelNumber: level.level,\n });\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(escalationAfterDays: number, fromDate: Date): 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 {\n Condition,\n ConditionExpression,\n ConditionGroup,\n ConditionRule,\n ApprovalLevelConfig,\n} from '../types/index.js';\nimport { ApprovalValidationError } from '../errors.js';\n\nexport type ConditionOperatorFn = (actual: unknown, expected: unknown) => boolean;\n\n/**\n * Coerce a value to a number *only* when it unambiguously represents one.\n *\n * Plain `Number()` maps `null`, `''`, `' '`, `[]` and `false` all to `0`, which\n * in an approval engine is an approval-bypass hazard: a rule such as\n * `{ amount: '<' 5000 } -> skipLevels: [2, 3]` would fire on a document whose\n * `amount` is missing or blank, silently skipping two approval levels. Numeric\n * comparison against a value that is not a number is not \"false-y\", it is\n * *undecidable*, so this returns `null` and the comparison reports no match —\n * the same outcome `undefined` has always produced.\n *\n * Accepted: finite numbers, bigints, `Date` (compared as epoch ms), and numeric\n * strings such as `'100'` or `' 1e3 '` (ERP payloads routinely arrive as JSON\n * strings). Rejected: `null`, `undefined`, booleans, arrays, objects, blank\n * strings, and the non-finite `NaN` / `Infinity`.\n *\n * @param value - The raw value taken from the condition or the context data.\n * @returns The numeric value, or `null` when the value is not comparable.\n */\nexport function toComparableNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'bigint') return Number(value);\n if (value instanceof Date) {\n const time = value.getTime();\n return Number.isFinite(time) ? time : null;\n }\n if (typeof value === 'string') {\n // Number('') and Number(' ') are both 0 — reject blanks before coercing.\n if (value.trim() === '') return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\n/** Build a numeric operator that reports no match unless BOTH operands are comparable numbers. */\nfunction numeric(compare: (left: number, right: number) => boolean): ConditionOperatorFn {\n return (actual, expected) => {\n const left = toComparableNumber(actual);\n const right = toComparableNumber(expected);\n if (left === null || right === null) return false;\n return compare(left, right);\n };\n}\n\n// Built-in operators seeded at module load time.\nconst operatorRegistry = new Map<string, ConditionOperatorFn>([\n ['>', numeric((a, e) => a > e)],\n ['<', numeric((a, e) => a < e)],\n ['>=', numeric((a, e) => a >= e)],\n ['<=', numeric((a, e) => a <= 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// Names reserved at module load so built-ins can never be shadowed by a custom operator.\nconst builtinOperatorNames = new Set(operatorRegistry.keys());\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 if (builtinOperatorNames.has(name)) {\n throw new ApprovalValidationError(\n `Condition operator \"${name}\" is a built-in and cannot be overridden. Choose a different name.`,\n );\n }\n operatorRegistry.set(name, fn);\n}\n\n/**\n * Resolve a dot-separated path against the context data, reading **own**\n * properties only.\n *\n * The `in` operator this previously used walks the prototype chain, so a\n * condition on `isFastTrack` would be satisfied by an inherited\n * `Object.prototype.isFastTrack` that no document ever declared. Prototype\n * pollution is a common enough hazard in a JavaScript dependency tree that an\n * approval engine must not let it decide whether a level is skipped — so a path\n * segment that is not an own property resolves to `undefined`, exactly as a\n * genuinely absent field does. This also blocks `__proto__`, `constructor`, and\n * `prototype`, none of which are own properties of a data object.\n *\n * @param data - The instance context data the condition is evaluated against.\n * @param path - Dot-separated field path, e.g. `'vendor.country'`.\n * @returns The value at the path, or `undefined` if any segment is absent.\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' && Object.prototype.hasOwnProperty.call(obj, key)) {\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\n/** Narrow an expression to a boolean combinator, or return null if it is a leaf condition. */\nfunction asGroup(expression: ConditionExpression): ConditionGroup | null {\n if (expression === null || typeof expression !== 'object' || Array.isArray(expression)) {\n return null;\n }\n const candidate = expression as Partial<Record<'all' | 'any' | 'not', unknown>>;\n const keys = (['all', 'any', 'not'] as const).filter((k) => candidate[k] !== undefined);\n if (keys.length === 0) return null;\n if (keys.length > 1) {\n throw new ApprovalValidationError(\n `Condition group must set exactly one of \"all\", \"any\" or \"not\" (got ${keys.join(', ')}).`,\n );\n }\n const key = keys[0] as 'all' | 'any' | 'not';\n if (key !== 'not' && !Array.isArray(candidate[key])) {\n throw new ApprovalValidationError(`Condition group \"${key}\" must be an array of expressions.`);\n }\n if (key !== 'not' && (candidate[key] as unknown[]).length === 0) {\n // An empty `all` is vacuously true and an empty `any` vacuously false; both are\n // far more likely to be a construction bug than an intent, so reject them.\n throw new ApprovalValidationError(`Condition group \"${key}\" must not be empty.`);\n }\n return expression as ConditionGroup;\n}\n\n/**\n * Evaluate a condition expression tree.\n *\n * A bare condition is a leaf; an array is shorthand for `all`, which is what a\n * `when: [...]` meant before groups existed; and a group applies its\n * combinator to nested expressions, recursing to any depth.\n */\nfunction evaluateExpression(\n expression: ConditionExpression,\n data: Record<string, unknown>,\n): boolean {\n if (Array.isArray(expression)) {\n return expression.every((child) => evaluateExpression(child, data));\n }\n\n const group = asGroup(expression);\n if (group === null) {\n return evaluateCondition(expression as Condition, data);\n }\n if (group.all !== undefined) {\n return group.all.every((child) => evaluateExpression(child, data));\n }\n if (group.any !== undefined) {\n return group.any.some((child) => evaluateExpression(child, data));\n }\n return !evaluateExpression(group.not, data);\n}\n\n/**\n * Statically check a condition expression tree, collecting every problem rather\n * than throwing on the first.\n *\n * Runs at template-definition time so a malformed group is caught while the\n * author is looking at it, instead of at submit time on a real document. The\n * operator check is deliberately deferred: custom operators can be registered\n * after a template is defined, so an unknown name is only an error once the\n * condition is actually evaluated.\n *\n * @param expression - The `when` expression to check.\n * @param path - Field path prefix used in reported errors.\n * @returns One entry per problem found; empty when the tree is well formed.\n */\nexport function validateConditionExpression(\n expression: ConditionExpression,\n path: string,\n): Array<{ field: string; message: string }> {\n const errors: Array<{ field: string; message: string }> = [];\n\n const walk = (node: ConditionExpression, at: string): void => {\n if (Array.isArray(node)) {\n if (node.length === 0) {\n errors.push({ field: at, message: 'Condition list must not be empty.' });\n }\n node.forEach((child, i) => walk(child, `${at}[${i}]`));\n return;\n }\n\n let group: ConditionGroup | null;\n try {\n group = asGroup(node);\n } catch (err) {\n errors.push({ field: at, message: (err as Error).message });\n return;\n }\n\n if (group === null) {\n const leaf = node as Partial<Condition>;\n if (typeof leaf?.field !== 'string' || leaf.field.length === 0) {\n errors.push({\n field: `${at}.field`,\n message: 'Condition requires a non-empty field path.',\n });\n }\n if (typeof leaf?.operator !== 'string' || leaf.operator.length === 0) {\n errors.push({ field: `${at}.operator`, message: 'Condition requires an operator.' });\n }\n return;\n }\n\n if (group.all !== undefined) {\n group.all.forEach((child, i) => walk(child, `${at}.all[${i}]`));\n } else if (group.any !== undefined) {\n group.any.forEach((child, i) => walk(child, `${at}.any[${i}]`));\n } else {\n walk(group.not, `${at}.not`);\n }\n };\n\n walk(expression, path);\n return errors;\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 (evaluateExpression(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\nfunction assertHasApprovers(level: ApprovalLevelInstance): number {\n const total = level.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 return total;\n}\n\n/** Fail compilation when a new mode is added without a matching case. */\nfunction assertNeverMode(mode: never): never {\n throw new Error(`Unhandled approval mode: ${String(mode)}`);\n}\n\n/** Resolve the minimum-approvals threshold for a quorum level, validating configuration. */\nfunction quorumThreshold(level: ApprovalLevelInstance, total: number): number {\n const min = level.minApprovals;\n if (min === undefined || !Number.isInteger(min) || min < 1) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") uses 'quorum' mode but minApprovals is not a positive integer (got ${String(min)}).`,\n );\n }\n if (min > total) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") requires ${min} approvals (quorum) but only ${total} approver(s) are assigned.`,\n );\n }\n return min;\n}\n\nfunction weightOf(level: ApprovalLevelInstance, approverId: string): number {\n const w = level.weights?.[approverId];\n return typeof w === 'number' && w >= 0 ? w : 1;\n}\n\nfunction sumWeights(level: ApprovalLevelInstance, ids: string[]): number {\n return ids.reduce((acc, id) => acc + weightOf(level, id), 0);\n}\n\n/** Resolve the weight threshold for a weighted level, validating configuration. */\nfunction weightedThreshold(level: ApprovalLevelInstance, totalWeight: number): number {\n const threshold = level.threshold;\n if (threshold === undefined || threshold <= 0) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") uses 'weighted' mode but threshold is not a positive number (got ${String(threshold)}).`,\n );\n }\n if (threshold > totalWeight) {\n throw new ApprovalValidationError(\n `Level ${level.level} (\"${level.name}\") needs a weight of ${threshold} but the assigned approvers total only ${totalWeight}.`,\n );\n }\n return threshold;\n}\n\nexport function isLevelApproved(level: ApprovalLevelInstance): boolean {\n const total = assertHasApprovers(level);\n const { mode, approvedBy } = level;\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 case 'quorum':\n return count >= quorumThreshold(level, total);\n case 'weighted': {\n const totalWeight = sumWeights(level, level.approverIds);\n return sumWeights(level, approvedBy) >= weightedThreshold(level, totalWeight);\n }\n default:\n return assertNeverMode(mode);\n }\n}\n\nexport function isLevelRejected(level: ApprovalLevelInstance): boolean {\n const total = assertHasApprovers(level);\n const { mode, rejectedBy } = level;\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 case 'quorum': {\n // Rejected once the remaining (not-yet-rejected) approvers can no longer reach the quorum.\n const min = quorumThreshold(level, total);\n return total - rejectCount < min;\n }\n case 'weighted': {\n // Rejected once the achievable weight (total minus rejected) drops below the threshold.\n const totalWeight = sumWeights(level, level.approverIds);\n const threshold = weightedThreshold(level, totalWeight);\n return totalWeight - sumWeights(level, rejectedBy) < threshold;\n }\n default:\n return assertNeverMode(mode);\n }\n}\n","/**\n * Statistical summary of a set of timing samples.\n *\n * For an empty sample set every field is `0` (never `NaN`).\n */\nexport interface TimingStats {\n /** Number of samples observed. */\n count: number;\n /** Sum of all samples. */\n sum: number;\n /** Smallest observed sample (`0` when empty). */\n min: number;\n /** Largest observed sample (`0` when empty). */\n max: number;\n /** Arithmetic mean, `sum / count` (`0` when empty). */\n avg: number;\n /** 50th percentile (median) via the nearest-rank method (`0` when empty). */\n p50: number;\n /** 95th percentile via the nearest-rank method (`0` when empty). */\n p95: number;\n}\n\n/**\n * Compute a percentile using the **nearest-rank** method on a pre-sorted\n * ascending array.\n *\n * The nearest-rank rank is `ceil(p/100 * N)`, clamped to `[1, N]`; the result\n * is the sample at that 1-based rank. This method:\n *\n * - returns an actual observed sample (no interpolation between samples);\n * - for a single sample yields that sample for every percentile (so\n * `p50 === p95 === value`);\n * - is exact and deterministic for small fixed sample sets, which makes it\n * straightforward to assert in unit tests.\n *\n * @param sortedAsc - Samples sorted ascending. Must be non-empty.\n * @param p - Percentile in the range `(0, 100]`.\n * @returns The sample value at the nearest rank.\n */\nexport function percentileNearestRank(sortedAsc: readonly number[], p: number): number {\n const n = sortedAsc.length;\n if (n === 0) return 0;\n const rank = Math.ceil((p / 100) * n);\n const index = Math.min(Math.max(rank, 1), n) - 1;\n return sortedAsc[index] as number;\n}\n\n/**\n * Compute a full {@link TimingStats} summary from raw, unsorted samples.\n *\n * Percentiles use {@link percentileNearestRank}. An empty input yields all-zero\n * stats so callers never have to special-case `NaN`.\n *\n * @param samples - Raw timing samples (already sanitized: finite, `>= 0`).\n * @returns The computed statistics.\n */\nexport function computeTimingStats(samples: readonly number[]): TimingStats {\n const count = samples.length;\n if (count === 0) {\n return { count: 0, sum: 0, min: 0, max: 0, avg: 0, p50: 0, p95: 0 };\n }\n const sorted = [...samples].sort((a, b) => a - b);\n let sum = 0;\n for (const s of sorted) sum += s;\n const min = sorted[0] as number;\n const max = sorted[count - 1] as number;\n return {\n count,\n sum,\n min,\n max,\n avg: sum / count,\n p50: percentileNearestRank(sorted, 50),\n p95: percentileNearestRank(sorted, 95),\n };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n IStorageAdapter,\n InstanceFilter,\n PaginationOpts,\n PaginatedResult,\n CursorPaginationOpts,\n CursorPaginatedResult,\n} from '../adapters/IStorageAdapter.js';\nimport type {\n ApprovalTemplate,\n ApprovalTemplateConfig,\n ApprovalLevelConfig,\n ApprovalInstance,\n ApprovalLevelInstance,\n ApprovalStatus,\n LevelStatus,\n Comment,\n EscalationStep,\n Attachment,\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 ReassignOptionsSchema,\n CancelOptionsSchema,\n EscalateOptionsSchema,\n ResubmitOptionsSchema,\n AddCommentOptionsSchema,\n OverrideOptionsSchema,\n UpdateDataOptionsSchema,\n RequestInfoOptionsSchema,\n AddAttachmentOptionsSchema,\n RemoveAttachmentOptionsSchema,\n TransferApprovalsOptionsSchema,\n ProvideInfoOptionsSchema,\n type SubmitOptions,\n type ApproveOptions,\n type RejectOptions,\n type DelegateOptions,\n type ReassignOptions,\n type CancelOptions,\n type EscalateOptions,\n type ResubmitOptions,\n type AddCommentOptions,\n type OverrideOptions,\n type UpdateDataOptions,\n type RequestInfoOptions,\n type AddAttachmentOptions,\n type RemoveAttachmentOptions,\n type TransferApprovalsOptions,\n type ProvideInfoOptions,\n} from '../utils/validate.js';\nimport { MemoryAdapter } from '../adapters/MemoryAdapter.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 { BusinessCalendar } from '../utils/BusinessCalendar.js';\nimport type { IdGeneratorPrefix } from '../utils/IdGenerator.js';\nimport { defaultIdGenerator } from '../utils/IdGenerator.js';\nimport { TemplateRegistry } from './TemplateRegistry.js';\nimport {\n LevelResolver,\n type OrgProvider,\n type ApproverResolverFn,\n type OutOfOfficeProvider,\n} from './LevelResolver.js';\nimport { EscalationScheduler } from './EscalationScheduler.js';\nimport {\n evaluateConditions,\n registerConditionOperator,\n validateConditionExpression,\n type ConditionOperatorFn,\n} 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 ApprovalTemplateNotFoundError,\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';\nimport { computeTimingStats, type TimingStats } from '../plugins/metrics/stats.js';\n\nexport { ApprovalError } from '../errors.js';\nexport {\n ApprovalNotFoundError,\n ApprovalConflictError,\n ApprovalForbiddenError,\n ApprovalValidationError,\n ApprovalTemplateNotFoundError,\n} from '../errors.js';\n\n/** Reminders sent for one level before the engine stops nudging, absent an explicit cap. */\n/** How deep sub-workflows may nest before the engine refuses, so a template cycle terminates. */\nconst MAX_SUBWORKFLOW_DEPTH = 5;\n/** Instances one purge sweep will remove unless the caller raises it. */\nconst DEFAULT_PURGE_LIMIT = 1000;\nconst DEFAULT_MAX_REMINDERS = 3;\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 50;\nconst TERMINAL_STATUSES = new Set<ApprovalInstance['status']>([\n 'approved',\n 'rejected',\n 'cancelled',\n 'expired',\n]);\n/** Statuses counted as \"completed\" for cycle-time analytics — see {@link ApprovalStatistics.cycleTime}. */\nconst CYCLE_TIME_STATUSES: ApprovalInstance['status'][] = ['approved', 'rejected', 'cancelled'];\n/** Page size used when paging through a full result set via `getInstancesByFilter`. */\nconst CYCLE_TIME_FETCH_BATCH_SIZE = 500;\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?:\n | 'not_an_approver'\n | 'already_acted'\n | 'self_approval'\n | 'wrong_status'\n | '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\n/** Where one level in an explained chain came from. */\nexport interface ExplainedLevel {\n level: number;\n name: string;\n mode: ApprovalMode;\n /** `'template'` for a statically declared level, `'condition'` for one a rule added. */\n source: 'template' | 'condition';\n /** Index of the condition rule that added it, when `source` is `'condition'`. */\n addedByRule?: number;\n resolvedApprovers: string[];\n /** Why approver resolution failed, when it did. The level is still listed. */\n resolutionError?: string;\n /** Set when this level hands off to a child approval. */\n subWorkflowTemplate?: string;\n}\n\n/** A level the template declares that will not run, and the rule that removed it. */\nexport interface ExplainedSkip {\n level: number;\n name: string;\n /** Index of the condition rule whose `skipLevels` removed it. */\n skippedByRule: number;\n}\n\n/** How one condition rule evaluated against the data. */\nexport interface ExplainedRule {\n index: number;\n matched: boolean;\n /** Levels this rule would add. Present whether or not it matched. */\n addsLevels: number[];\n /** Levels this rule would skip. Present whether or not it matched. */\n skipsLevels: number[];\n /** Why the rule could not be evaluated, e.g. an unregistered operator. */\n error?: string;\n}\n\n/**\n * A full account of why a chain looks the way it does.\n *\n * `previewApprovalChain()` answers *what* the chain will be; this answers *why*,\n * which is the question a support engineer actually has when a purchase order\n * arrives with a level nobody expected.\n */\nexport interface ChainExplanation {\n templateName: string;\n levels: ExplainedLevel[];\n skipped: ExplainedSkip[];\n rules: ExplainedRule[];\n}\n\n/** One scripted decision in a {@link ApprovalEngine.simulate} run. */\nexport type SimulatedDecision =\n | { approve: string; level?: number; comment?: string }\n | { reject: string; level?: number; reason?: string };\n\n/** What one scripted decision did. */\nexport interface SimulationStep {\n /** 1-based position in the script. */\n step: number;\n action: 'approve' | 'reject';\n actorId: string;\n /** The level the decision landed on, when it was accepted. */\n level?: number;\n /** Instance status after the decision. */\n status: ApprovalStatus;\n /** Why the decision was refused, when it was. The run stops at the first refusal. */\n error?: string;\n}\n\n/** Outcome of a {@link ApprovalEngine.simulate} run. */\nexport interface SimulationResult {\n finalStatus: ApprovalStatus;\n /** The chain the document would get, in order. */\n levels: Array<{ level: number; name: string; status: LevelStatus; approvers: string[] }>;\n transcript: SimulationStep[];\n /** Levels never reached because the run ended first. */\n unreachedLevels: number[];\n /** True when the script ran out before the approval finished. */\n incomplete: boolean;\n}\n\nexport interface BulkResult {\n succeeded: ApprovalInstance[];\n failed: Array<{ instanceId: string; error: ApprovalError }>;\n total: number;\n}\n\n/** Outcome of a {@link ApprovalEngine.transferApprovals} sweep. */\nexport interface TransferResult {\n /** One entry per level actually moved (an instance can hold the approver on several open branches). */\n transferred: Array<{ instanceId: string; level: number; documentId: string }>;\n /** Instances that could not be moved, with the reason. */\n failed: Array<{ instanceId: string; error: ApprovalError }>;\n /** Instances examined. */\n scanned: number;\n /** True when nothing was written. */\n dryRun: boolean;\n}\n\n/**\n * What one approver currently owes a decision on.\n *\n * Durations are milliseconds. An approver appears only while they hold at least\n * one open level.\n */\nexport interface ApproverWorkload {\n approverId: string;\n /** Open levels assigned to them. One instance can contribute several across parallel branches. */\n pending: number;\n /** Distinct documents involved — usually, but not always, equal to {@link pending}. */\n instances: number;\n /** Open levels already past their escalation deadline. */\n overdue: number;\n /** Open levels currently paused by a clarification request. */\n onHold: number;\n /** When the oldest of their open items was submitted. */\n oldestPendingAt?: Date;\n /** Age of that oldest item. `0` when they hold nothing. */\n oldestAgeMs: number;\n}\n\n/** Version stamp on an exported bundle, so an importer can reject a shape it does not understand. */\nexport const TEMPLATE_BUNDLE_VERSION = 1;\n\n/**\n * A portable set of templates, safe to move between environments.\n *\n * Deliberately carries no `id`, `tenantId`, `createdAt`, `version` or\n * `previousVersionId`: those describe one row in one database, and importing\n * them would either collide with the target's own ids or silently claim a\n * lineage the target never had.\n */\nexport interface TemplateBundle {\n bundleVersion: number;\n exportedAt: Date;\n templates: ApprovalTemplateConfig[];\n}\n\n/** Outcome of {@link ApprovalEngine.importTemplates}. */\nexport interface ImportResult {\n created: string[];\n updated: string[];\n skipped: string[];\n errors: Array<{ name: string; message: string }>;\n dryRun: boolean;\n}\n\n/** Outcome of a {@link ApprovalEngine.purgeInstances} sweep. */\nexport interface PurgeResult {\n /** Instances actually removed (or that would be, under `dryRun`). */\n purged: Array<{ instanceId: string; documentId: string; status: ApprovalInstance['status'] }>;\n /** Instances examined. */\n scanned: number;\n /** True when nothing was written. */\n dryRun: boolean;\n}\n\nexport interface ApprovalStatistics {\n /** Total instances matching the filter (across all statuses). */\n total: number;\n /** Count per status. */\n byStatus: Record<ApprovalInstance['status'], number>;\n /** Instances still pending past their escalation/expiry deadline. */\n overdue: number;\n /** approved / (approved + rejected); 0 when nothing has been resolved. */\n approvalRate: number;\n /**\n * Counts broken down per template name. Only populated (non-empty) when the\n * global statistics are scoped with a filter that already lists the tenant's\n * templates — i.e. this engine always returns the per-template breakdown for\n * its own tenant. Absent when no instances match the filter.\n */\n byTemplate: Record<\n string,\n { total: number; approved: number; rejected: number; pending: number }\n >;\n /**\n * Time-to-decision (\"cycle time\") analytics, in milliseconds, for\n * **completed** instances matching the filter — status `'approved'`,\n * `'rejected'`, or `'cancelled'`. `'expired'` instances are excluded: their\n * terminal timestamp reflects a scheduler deadline firing, not a decision\n * being made, so they would skew the distribution rather than describe it.\n *\n * Elapsed time per instance is `updatedAt - createdAt`: `createdAt` is the\n * submission instant, and `updatedAt` is set at the moment the instance\n * transitions to its terminal status (see {@link ApprovalEngine.approve},\n * {@link ApprovalEngine.reject}, {@link ApprovalEngine.cancel}). See\n * {@link CycleTimeStats} for the zeroed shape returned when there are no\n * completed instances.\n */\n cycleTime: CycleTimeStats;\n /**\n * The same {@link cycleTime} analytics broken down per template name.\n * Mirrors the {@link byTemplate} population rule: a template only appears\n * here when at least one of its instances is completed (`count > 0`).\n */\n cycleTimeByTemplate: Record<string, CycleTimeStats>;\n}\n\n/**\n * Time-to-decision (\"cycle time\") statistics for a set of completed approval\n * instances. All duration fields are in **milliseconds**.\n *\n * When {@link count} is `0` (no completed instances matched), every other\n * field is `0` — never `NaN` — mirroring {@link computeTimingStats}'s\n * empty-input behavior, which this type's values are derived from.\n */\nexport interface CycleTimeStats {\n /** Number of completed instances included in this computation. */\n count: number;\n /** Arithmetic mean time-to-decision. `0` when {@link count} is `0`. */\n averageMs: number;\n /** 50th percentile (median) time-to-decision, via nearest-rank. `0` when {@link count} is `0`. */\n p50Ms: number;\n /** 95th percentile time-to-decision, via nearest-rank. `0` when {@link count} is `0`. */\n p95Ms: number;\n /** Smallest observed time-to-decision. `0` when {@link count} is `0`. */\n minMs: number;\n /** Largest observed time-to-decision. `0` when {@link count} is `0`. */\n maxMs: 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 /**\n * Supplies stand-ins for approvers who are away, so leave does not stall a\n * chain. Consulted every time approvers are resolved.\n */\n outOfOfficeProvider?: OutOfOfficeProvider;\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 /**\n * Optional business-day calendar. When provided, escalationAfterDays and\n * slaDeadlineDays are interpreted as business days (skipping weekends and\n * holidays) instead of plain calendar days. See weekendCalendar().\n */\n calendar?: BusinessCalendar;\n /** Custom ID generator for instances and templates. Defaults to timestamp+random. */\n generateId?: (prefix: IdGeneratorPrefix) => string;\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 /**\n * Custom scheduler adapter (BullMQ, Temporal, cron) that drives the recurring\n * escalation/expiry/SLA-breach/delegation-revert scan.\n *\n * When provided, the built-in `setInterval` poll (see\n * {@link EscalationScheduler.start}) is never started. Instead,\n * {@link ISchedulerAdapter.scheduleAt} schedules each scan, and its callback\n * reschedules the next one itself once the scan completes — the adapter\n * changes *how* the periodic scan is triggered, not *what* it scans; every\n * tick still runs the exact same overdue-instance query the built-in poller\n * runs. {@link ISchedulerAdapter.cancel} and {@link ISchedulerAdapter.shutdown}\n * are invoked during {@link ApprovalEngine.shutdown}. Omitting this option\n * preserves the built-in `setInterval` polling behavior unchanged.\n */\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 escalationPollIntervalMs: number;\n private readonly tenantId: string;\n private readonly logger: Logger;\n private readonly clock: Clock;\n private readonly calendar?: BusinessCalendar;\n private readonly generateId: (prefix: IdGeneratorPrefix) => string;\n private readonly maxBulkItems: number;\n private readonly retryPolicy: Required<RetryPolicy>;\n private readonly idempotencyKeyFn: IdempotencyKeyFn;\n /** Handle for the currently-scheduled escalation tick when {@link ApprovalEngineOptions.schedulerAdapter} is set. */\n private schedulerAdapterHandle: string | null = null;\n /** Set by {@link shutdown}; stops the self-rescheduling loop from scheduling another tick. */\n private schedulerStopped = false;\n\n constructor(private readonly opts: ApprovalEngineOptions) {\n this.tenantId = opts.tenantId ?? 'default';\n this.logger = opts.logger ?? noopLogger;\n // A subscriber's listener must never abort the operation that emitted the\n // event; report and carry on, as the notification/audit paths do.\n this.bus.setListenerErrorHandler((err, event) => {\n this.logger.error('event listener threw', err, { tenantId: this.tenantId, event });\n });\n this.clock = opts.clock ?? systemClock;\n this.calendar = opts.calendar;\n this.generateId = opts.generateId ?? defaultIdGenerator;\n this.maxBulkItems = opts.maxBulkItems ?? 200;\n this.escalationPollIntervalMs = opts.escalationPollIntervalMs ?? 60_000;\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, levelNumber) => {\n await this.escalateInternal(id, 'system', undefined, levelNumber);\n },\n onExpire: async (id, action) => {\n await this.expireInstance(id, action);\n },\n onSlaBreach: async (id) => {\n await this.markSlaBreached(id);\n },\n onRevertDelegation: async (id, level, from) => {\n await this.revertDelegation(id, level, from);\n },\n onRemind: async (id, levelNumber) => {\n await this.sendReminder(id, levelNumber);\n },\n pollIntervalMs: this.escalationPollIntervalMs,\n logger: this.logger,\n clock: this.clock,\n });\n if (opts.schedulerAdapter) {\n this.scheduleNextEscalationTick(opts.schedulerAdapter);\n } else {\n this.escalation.start();\n }\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 // A config that declares `extends` may legitimately carry no levels of its\n // own — the chain comes from the base. defineTemplate validates the\n // flattened result, which is what instances actually run against.\n const hasOwnLevels = Boolean(config.levels && config.levels.length > 0);\n if (!hasOwnLevels && config.extends === undefined) {\n errors.push({ field: 'levels', message: 'Template must have at least one level.' });\n }\n if (hasOwnLevels) {\n const levelNums = new Set<number>();\n config.levels.forEach((l, i) => {\n if (levelNums.has(l.level)) {\n errors.push({\n field: `levels[${i}].level`,\n message: `Duplicate level number: ${l.level}.`,\n });\n }\n levelNums.add(l.level);\n\n // A sub-workflow level is decided by its child approval, so it needs no\n // approvers of its own — requiring them would force template authors to\n // invent a placeholder nobody ever asks.\n if (!l.subWorkflow && (!l.approvers || l.approvers.length === 0)) {\n errors.push({\n field: `levels[${i}].approvers`,\n message: `Level ${l.level} must have at least one approver.`,\n });\n }\n if (l.subWorkflow) {\n if (!l.subWorkflow.templateName) {\n errors.push({\n field: `levels[${i}].subWorkflow.templateName`,\n message: `Level ${l.level} declares a subWorkflow without a templateName.`,\n });\n }\n if (l.subWorkflow.templateName === config.name) {\n errors.push({\n field: `levels[${i}].subWorkflow.templateName`,\n message: `Level ${l.level} would spawn a sub-workflow of its own template (\"${config.name}\"), which cannot terminate.`,\n });\n }\n if (l.approvers && l.approvers.length > 0) {\n errors.push({\n field: `levels[${i}].approvers`,\n message: `Level ${l.level} sets both approvers and subWorkflow; a sub-workflow level is decided by its child approval, so its approvers would never be asked.`,\n });\n }\n }\n if (l.reminderAfterDays !== undefined && l.reminderAfterDays <= 0) {\n errors.push({\n field: `levels[${i}].reminderAfterDays`,\n message: `Level ${l.level} reminderAfterDays must be a positive number.`,\n });\n }\n if (l.reminderEveryDays !== undefined && l.reminderEveryDays <= 0) {\n errors.push({\n field: `levels[${i}].reminderEveryDays`,\n message: `Level ${l.level} reminderEveryDays must be a positive number.`,\n });\n }\n if (\n l.maxReminders !== undefined &&\n (!Number.isInteger(l.maxReminders) || l.maxReminders < 1)\n ) {\n errors.push({\n field: `levels[${i}].maxReminders`,\n message: `Level ${l.level} maxReminders must be a positive integer.`,\n });\n }\n if (l.reminderEveryDays !== undefined && l.reminderAfterDays === undefined) {\n errors.push({\n field: `levels[${i}].reminderEveryDays`,\n message: `Level ${l.level} sets reminderEveryDays without reminderAfterDays, so no reminder would ever be sent.`,\n });\n }\n if (l.escalationAfterHours !== undefined && l.escalationAfterHours <= 0) {\n errors.push({\n field: `levels[${i}].escalationAfterHours`,\n message: `Level ${l.level} escalationAfterHours must be a positive number.`,\n });\n }\n if (l.escalationAfterDays !== undefined && l.escalationAfterHours !== undefined) {\n errors.push({\n field: `levels[${i}].escalationAfterHours`,\n message: `Level ${l.level} sets both escalationAfterDays and escalationAfterHours; pick one so the deadline is unambiguous.`,\n });\n }\n if (l.escalationAfterDays !== undefined && l.escalationAfterDays <= 0) {\n errors.push({\n field: `levels[${i}].escalationAfterDays`,\n message: `Level ${l.level} escalationAfterDays must be a positive number.`,\n });\n }\n\n if (l.mode === 'quorum') {\n if (\n l.minApprovals === undefined ||\n !Number.isInteger(l.minApprovals) ||\n l.minApprovals < 1\n ) {\n errors.push({\n field: `levels[${i}].minApprovals`,\n message: `Level ${l.level} uses 'quorum' mode and requires minApprovals to be a positive integer.`,\n });\n } else if (l.approvers && l.minApprovals > l.approvers.length) {\n // Conservative static check: only meaningful when every approver is a static 'user'.\n const allStaticUsers = l.approvers.every((a) => a.type === 'user');\n if (allStaticUsers) {\n errors.push({\n field: `levels[${i}].minApprovals`,\n message: `Level ${l.level} requires ${l.minApprovals} approvals but only ${l.approvers.length} approver(s) are configured.`,\n });\n }\n }\n }\n\n if (l.mode === 'weighted') {\n if (l.threshold === undefined || l.threshold <= 0) {\n errors.push({\n field: `levels[${i}].threshold`,\n message: `Level ${l.level} uses 'weighted' mode and requires threshold to be a positive number.`,\n });\n }\n if (l.weights) {\n for (const [id, w] of Object.entries(l.weights)) {\n if (typeof w !== 'number' || w < 0 || Number.isNaN(w)) {\n errors.push({\n field: `levels[${i}].weights.${id}`,\n message: `Weight for \"${id}\" must be a non-negative number.`,\n });\n }\n }\n }\n }\n });\n }\n\n // A group's levels must form one unbroken run, so that \"advance past the\n // group\" and \"advance past a level\" cannot disagree about what comes next.\n // An interleaved group would otherwise activate a level from outside it.\n if (config.levels && config.levels.length > 0) {\n const ordered = [...config.levels].sort((a, b) => a.level - b.level);\n const seenGroups = new Set<string>();\n let previousGroup: string | null = null;\n ordered.forEach((l) => {\n const key = l.group;\n if (key === undefined) {\n previousGroup = null;\n return;\n }\n if (key !== previousGroup) {\n if (seenGroups.has(key)) {\n errors.push({\n field: 'levels',\n message: `Parallel group \"${key}\" is not contiguous — its levels must occupy consecutive level numbers with no other level in between.`,\n });\n }\n seenGroups.add(key);\n previousGroup = key;\n }\n });\n }\n\n if (config.slaDeadlineDays !== undefined && config.slaDeadlineHours !== undefined) {\n errors.push({\n field: 'slaDeadlineHours',\n message:\n 'Template sets both slaDeadlineDays and slaDeadlineHours; pick one so the SLA is unambiguous.',\n });\n }\n if (config.slaDeadlineHours !== undefined && config.slaDeadlineHours <= 0) {\n errors.push({\n field: 'slaDeadlineHours',\n message: 'slaDeadlineHours must be a positive number.',\n });\n }\n\n if (config.conditions) {\n config.conditions.forEach((rule, ruleIdx) => {\n errors.push(...validateConditionExpression(rule.when, `conditions[${ruleIdx}].when`));\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 // Validate the RESOLVED template: a derived config is often invalid on its\n // own (it may declare no levels at all, inheriting the whole chain), and it\n // is the flattened result that instances actually run against.\n const resolved = await this.registry.resolveInheritance(config);\n const validation = this.validateTemplate(resolved);\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(resolved);\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 resolved = await this.registry.resolveInheritance(config);\n const validation = this.validateTemplate(resolved);\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(resolved);\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(\n raw: SubmitOptions,\n auditCtx?: AuditContext,\n /**\n * @internal Set only when the engine spawns a sub-workflow child. Passed at\n * creation rather than stamped afterwards, because the child spawns its own\n * children before any post-submit update could reach it — which is how a\n * grandchild ended up recorded at depth 1.\n */\n link?: { parentInstanceId: string; parentLevel: number; depth: number },\n ): 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(\n this.tenantId,\n opts.documentType,\n opts.documentId,\n opts.templateName,\n opts.data,\n );\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 // The opening step is a whole group, not a single level: every branch of a\n // leading parallel group starts collecting decisions at once.\n const firstCfg = allLevelCfgs[0];\n const firstGroupKey = firstCfg ? ApprovalEngine.groupKeyOf(firstCfg) : null;\n\n const firstRung = this.firstRungOf(template.escalationSteps);\n const levels: ApprovalLevelInstance[] = allLevelCfgs.map((cfg) =>\n this.buildLevelInstance(cfg, {\n open: ApprovalEngine.groupKeyOf(cfg) === firstGroupKey,\n now,\n firstRung,\n }),\n );\n\n for (const lvl of levels.filter((l) => l.status === 'pending')) {\n // A sub-workflow level has no approvers of its own — a child approval\n // decides it — so resolving here would fail on an empty approver list.\n if (lvl.subWorkflowTemplate) {\n lvl.approverIds = [];\n continue;\n }\n lvl.approverIds = await this.resolver.resolveApprovers(\n lvl.approverConfigs,\n opts.submittedBy,\n opts.data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n now,\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.slaDeadlineHours\n ? this.deadlineFromHours(now, template.slaDeadlineHours)\n : template.slaDeadlineDays\n ? this.deadlineFrom(now, template.slaDeadlineDays)\n : undefined;\n\n const instance: ApprovalInstance = {\n id: instanceId,\n tenantId: this.tenantId,\n parentInstanceId: link?.parentInstanceId,\n parentLevel: link?.parentLevel,\n subWorkflowDepth: link?.depth,\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 escalationSteps: template.escalationSteps,\n slaDeadlineDays: template.slaDeadlineDays,\n slaDeadlineHours: template.slaDeadlineHours,\n allowOverride: template.allowOverride,\n },\n };\n\n await this.runMiddlewareBefore({\n operation: 'submit',\n actorId: opts.submittedBy,\n tenantId: this.tenantId,\n input: opts,\n });\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', {\n tenantId: this.tenantId,\n templateName: template.name,\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'submit' },\n );\n\n const eventPayload = {\n instanceId: instance.id,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n submittedBy: opts.submittedBy,\n // Union across the opening group — a parallel group has several open branches.\n currentApprovers: [\n ...new Set(levels.filter((l) => l.status === 'pending').flatMap((l) => l.approverIds)),\n ],\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(\n { operation: 'submit', actorId: opts.submittedBy, tenantId: this.tenantId, input: opts },\n instance,\n );\n\n // Done after the parent is persisted, never inside its optimistic write:\n // the child's own submit reads and writes, and nesting that under the\n // parent's compare-and-set would turn a slow child template into spurious\n // version conflicts on the parent.\n await this.startSubWorkflows(instance);\n\n return instance;\n }\n\n async approve(\n instanceId: string,\n raw: ApproveOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ApproveOptionsSchema.parse(raw));\n const startMs = this.clock.now().getTime();\n const decided = await 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.resolveActorLevel(instance, opts.approverId, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'approve',\n actorId: opts.approverId,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n });\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 level.reminderDueAt = undefined;\n\n // Inside a parallel group the instance holds until every branch resolves;\n // a single branch finishing is not progress the rest of the chain can see.\n const siblingsStillOpen = this.groupMembers(instance, level).some(\n (l) => l.status === 'pending' || l.status === 'waiting',\n );\n const nextGroup = siblingsStillOpen ? [] : this.findNextGroup(instance);\n const nextLevel = nextGroup[0] ?? null;\n\n if (siblingsStillOpen) {\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', {\n tenantId: this.tenantId,\n isFinal: 'false',\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: false,\n };\n this.bus.emit('approval:approved', p);\n await this.notifyAdapters('approval:approved', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n }\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', {\n tenantId: this.tenantId,\n instanceId,\n });\n this.opts.metricsAdapter?.increment('approval.approved', {\n tenantId: this.tenantId,\n isFinal: 'true',\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: true,\n };\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.notifyAdapters('approval:completed', instance, instance);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n }\n\n await this.activateGroup(instance, nextGroup, 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.approved', {\n tenantId: this.tenantId,\n isFinal: 'false',\n });\n this.opts.metricsAdapter?.timing(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const pAdv = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: false,\n };\n this.bus.emit('approval:approved', pAdv);\n const pLvl = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n fromLevel: level.level,\n toLevel: nextLevel.level,\n newApprovers: nextLevel.approverIds,\n };\n this.bus.emit('approval:level_advanced', pLvl);\n await this.notifyAdapters('approval:level_advanced', instance, pLvl);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\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(\n 'approval.operation_duration_ms',\n this.clock.now().getTime() - startMs,\n { operation: 'approve' },\n );\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n comment: opts.comment,\n isFinal: false,\n };\n this.bus.emit('approval:approved', p);\n await this.notifyAdapters('approval:approved', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'approve',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n }\n\n return instance;\n });\n\n await this.afterDecision(decided);\n return decided;\n }\n\n async reject(\n instanceId: string,\n raw: RejectOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RejectOptionsSchema.parse(raw));\n const decided = await 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.resolveActorLevel(instance, opts.approverId, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'reject',\n actorId: opts.approverId,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'reject',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n });\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n reason: opts.reason,\n returnTo: 'previous' as const,\n };\n this.bus.emit('approval:rejected', p);\n await this.notifyAdapters('approval:rejected', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'reject',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n approverId: opts.approverId,\n level: level.level,\n reason: opts.reason,\n returnTo: opts.returnTo === 'originator' ? ('originator' as const) : null,\n };\n this.bus.emit('approval:rejected', p);\n await this.notifyAdapters('approval:rejected', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'reject',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\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 await this.afterDecision(decided);\n return decided;\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.resolveActorLevel(instance, opts.fromApprover, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'delegate',\n actorId: opts.fromApprover,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'delegate',\n instanceId,\n actorId: opts.fromApprover,\n tenantId: this.tenantId,\n input: opts,\n });\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n level: level.level,\n reason: opts.reason,\n };\n this.bus.emit('approval:delegated', p);\n await this.notifyAdapters('approval:delegated', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'delegate',\n instanceId,\n actorId: opts.fromApprover,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Administratively replace an approver on the current level. Unlike delegate(),\n * this is performed by a third party (e.g. an admin handling an unavailable\n * approver) and does not require the original approver to initiate it. The\n * target approver must still be pending — an approver who has already acted\n * cannot be reassigned.\n */\n async reassign(\n instanceId: string,\n raw: ReassignOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ReassignOptionsSchema.parse(raw));\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n\n if (opts.fromApprover === opts.toApprover) {\n throw new ApprovalForbiddenError('Cannot reassign an approver to themselves.');\n }\n\n const level = this.resolveActorLevel(instance, opts.fromApprover, opts.level);\n await this.runAuthorizationPolicy({\n operation: 'reassign',\n actorId: opts.reassignedBy,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'reassign',\n instanceId,\n actorId: opts.reassignedBy,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const idx = level.approverIds.indexOf(opts.fromApprover);\n if (idx < 0) {\n throw new ApprovalForbiddenError(\n `Cannot reassign: \"${opts.fromApprover}\" is not an approver on level ${level.level}.`,\n );\n }\n if (hasAlreadyActed(level, opts.fromApprover)) {\n throw new ApprovalForbiddenError(\n `Cannot reassign after acting: \"${opts.fromApprover}\" has already approved or rejected level ${level.level}.`,\n );\n }\n if (level.approverIds.includes(opts.toApprover)) {\n throw new ApprovalForbiddenError(\n `Cannot reassign: \"${opts.toApprover}\" is already an approver on level ${level.level}.`,\n );\n }\n\n const now = this.clock.now();\n level.approverIds[idx] = opts.toApprover;\n\n // If the slot being reassigned carries an active time-limited delegation, clear it.\n if (level.delegatedTo === opts.fromApprover || level.delegatedFrom === opts.fromApprover) {\n level.delegatedUntil = undefined;\n level.delegatedFrom = undefined;\n level.delegatedTo = undefined;\n }\n\n const auditEntry: AuditEntry = {\n action: 'reassigned',\n actorId: opts.reassignedBy,\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 this.opts.metricsAdapter?.increment('approval.reassigned', { tenantId: this.tenantId });\n this.logger.info('reassign: approver replaced', {\n tenantId: this.tenantId,\n instanceId,\n from: opts.fromApprover,\n to: opts.toApprover,\n });\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n reassignedBy: opts.reassignedBy,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n level: level.level,\n reason: opts.reason,\n };\n this.bus.emit('approval:reassigned', p);\n await this.notifyAdapters('approval:reassigned', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'reassign',\n instanceId,\n actorId: opts.reassignedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n async cancel(\n instanceId: string,\n raw: CancelOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => CancelOptionsSchema.parse(raw));\n let cancelled: ApprovalInstance | null = null;\n const result = await 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({\n operation: 'cancel',\n actorId: opts.cancelledBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'cancel',\n instanceId,\n actorId: opts.cancelledBy,\n tenantId: this.tenantId,\n input: opts,\n });\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n cancelledBy: opts.cancelledBy,\n reason: opts.reason,\n };\n this.bus.emit('approval:cancelled', p);\n await this.notifyAdapters('approval:cancelled', instance, p);\n await this.runMiddlewareAfter(\n {\n operation: 'cancel',\n instanceId,\n actorId: opts.cancelledBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n cancelled = instance;\n return instance;\n });\n\n if (cancelled) {\n // Cancelling a parent must not leave its children running, and a\n // cancelled child still owes its own parent an outcome.\n await this.cancelOrphanedChildren(cancelled);\n await this.propagateToParent(cancelled);\n }\n return result;\n }\n\n async escalate(\n instanceId: string,\n raw: EscalateOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n parseOrThrow(() => EscalateOptionsSchema.parse(raw));\n return this.escalateInternal(instanceId, raw.escalatedBy, auditCtx);\n }\n\n /**\n * Change an instance's document data while it is still pending, and\n * re-evaluate the template's conditions against the new values.\n *\n * Documents change after submission — a line item is corrected, a vendor is\n * reclassified, an amount is revised — and the approval chain that was\n * computed at submit time can be wrong the moment that happens. Without this,\n * the only way to reflect a correction was to cancel and resubmit, losing the\n * approvals already collected and the audit trail with them.\n *\n * **Only the part of the chain that has not been reached is recomputed.**\n * Levels before {@link ApprovalInstance.currentLevel}, and the current level\n * itself, are frozen: an approval that has already been given cannot be\n * retracted by editing data, and a level that is actively collecting\n * decisions is not pulled out from under its approvers. Conditions that would\n * skip such a level are therefore ignored — history cannot be rewritten — and\n * a condition that would *insert* a level at or before the current one throws\n * rather than silently dropping an approval step that should have run.\n *\n * @param instanceId - The pending instance to update.\n * @param raw - Who is updating, the new data, and how to apply it.\n * @param auditCtx - Optional compliance context recorded on the audit entry.\n * @returns The updated instance.\n * @throws ApprovalError if the instance is not pending.\n * @throws ApprovalValidationError if re-evaluation would insert a level at or\n * before the current level, or would leave the chain with no levels.\n */\n async updateData(\n instanceId: string,\n raw: UpdateDataOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => UpdateDataOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') {\n throw new ApprovalError(\n `Cannot update data on a \"${instance.status}\" approval. Only pending instances can be edited.`,\n 'CANNOT_UPDATE_DATA',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'updateData',\n actorId: opts.updatedBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'updateData',\n instanceId,\n actorId: opts.updatedBy,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const previousData = instance.data;\n const nextData: Record<string, unknown> =\n opts.mode === 'replace' ? { ...opts.data } : { ...previousData, ...opts.data };\n\n const changedFields = [...new Set([...Object.keys(previousData), ...Object.keys(nextData)])]\n .filter((k) => !Object.is(previousData[k], nextData[k]))\n .sort();\n\n const now = this.clock.now();\n let addedLevels: number[] = [];\n let removedLevels: number[] = [];\n\n if (opts.recomputeChain) {\n const recomputed = await this.recomputeFutureChain(instance, nextData);\n addedLevels = recomputed.addedLevels;\n removedLevels = recomputed.removedLevels;\n }\n\n instance.data = nextData;\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'data_updated',\n actorId: opts.updatedBy,\n level: instance.currentLevel,\n timestamp: now,\n reason: opts.reason,\n oldValue: { data: previousData },\n newValue: { data: nextData, addedLevels, removedLevels },\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.data_updated', { tenantId: this.tenantId });\n this.logger.info('updateData: instance data updated', {\n tenantId: this.tenantId,\n instanceId,\n changedFields,\n addedLevels,\n removedLevels,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n updatedBy: opts.updatedBy,\n reason: opts.reason,\n changedFields,\n addedLevels,\n removedLevels,\n };\n this.bus.emit('approval:data_updated', payload);\n await this.notifyAdapters('approval:data_updated', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'updateData',\n instanceId,\n actorId: opts.updatedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Recompute the not-yet-reached portion of an instance's level chain against\n * new data, mutating `instance.levels` in place.\n *\n * Levels at or before `currentLevel` are treated as immutable history. See\n * {@link updateData} for why.\n */\n private async recomputeFutureChain(\n instance: ApprovalInstance,\n nextData: Record<string, unknown>,\n ): Promise<{ addedLevels: number[]; removedLevels: number[] }> {\n const template = await this.registry.get(instance.templateName);\n const mutations = evaluateConditions(template.conditions ?? [], nextData);\n\n const desired = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n const frozen = instance.levels.filter((l) => l.level <= instance.currentLevel);\n const frozenNums = new Set(frozen.map((l) => l.level));\n const futureCfgs = desired.filter((l) => l.level > instance.currentLevel);\n\n // A level the new data introduces behind the cursor cannot be honoured: the\n // instance has already moved past that point. Failing loudly beats silently\n // dropping an approval step the template says is required.\n const behindCursor = desired.find(\n (l) => l.level <= instance.currentLevel && !frozenNums.has(l.level),\n );\n if (behindCursor) {\n throw new ApprovalValidationError(\n `Re-evaluating conditions would insert level ${behindCursor.level} (\"${behindCursor.name}\"), which is at or before the current level ${instance.currentLevel}. Cancel and resubmit if the chain must change retroactively.`,\n );\n }\n\n const existingFuture = new Map(\n instance.levels.filter((l) => l.level > instance.currentLevel).map((l) => [l.level, l]),\n );\n const desiredNums = new Set(futureCfgs.map((l) => l.level));\n\n const addedLevels = futureCfgs.filter((l) => !existingFuture.has(l.level)).map((l) => l.level);\n const removedLevels = [...existingFuture.keys()]\n .filter((n) => !desiredNums.has(n))\n .sort((a, b) => a - b);\n\n if (frozen.length === 0 && futureCfgs.length === 0) {\n throw new ApprovalValidationError(\n 'Re-evaluating conditions would leave the instance with no levels. Check that skipLevels conditions are not removing all levels.',\n );\n }\n\n const rebuiltFuture: ApprovalLevelInstance[] = futureCfgs.map((cfg) => {\n const kept = existingFuture.get(cfg.level);\n // Preserve an untouched waiting level as-is so any delegation already\n // arranged on it survives a data edit elsewhere in the document.\n if (kept) return kept;\n // Same construction submit() uses, so a condition-added level cannot come\n // out missing fields the template configured on it.\n return this.buildLevelInstance(cfg, { open: false, now: this.clock.now() });\n });\n\n instance.levels = [...frozen, ...rebuiltFuture];\n return { addedLevels: addedLevels.sort((a, b) => a - b), removedLevels };\n }\n\n /**\n * Ask the submitter for clarification without rejecting.\n *\n * Approvers routinely need one fact before they can decide. The only ways to\n * express that were to reject — which throws away every approval already\n * collected and forces a resubmit — or to leave the request sitting while the\n * question is chased by email, which quietly burns the SLA the approver is\n * measured on.\n *\n * The instance stays `pending` and keeps its approvers: this is a question,\n * not a decision. What changes is the clock — escalation, SLA and expiry\n * deadlines stop advancing while the question is open, because time spent\n * waiting on the submitter is not time the approver is sitting on their hands.\n *\n * @throws ApprovalError if the instance is not pending, or a question is already open.\n */\n async requestInfo(\n instanceId: string,\n raw: RequestInfoOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RequestInfoOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n if (instance.infoRequest) {\n throw new ApprovalError(\n `A clarification request is already open on this approval (asked by \"${instance.infoRequest.askedBy}\"). Answer it with provideInfo() first.`,\n 'INFO_ALREADY_REQUESTED',\n );\n }\n\n const level = this.resolveActorLevel(instance, opts.approverId, opts.level);\n assertApproverOnLevel(level, opts.approverId);\n\n await this.runAuthorizationPolicy({\n operation: 'requestInfo',\n actorId: opts.approverId,\n instance,\n level,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'requestInfo',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n instance.infoRequest = {\n askedBy: opts.approverId,\n question: opts.question,\n askedAt: now,\n level: level.level,\n };\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'info_requested',\n actorId: opts.approverId,\n level: level.level,\n timestamp: now,\n comment: opts.question,\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.info_requested', { tenantId: this.tenantId });\n this.logger.info('requestInfo: clarification requested', {\n tenantId: this.tenantId,\n instanceId,\n level: level.level,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n askedBy: opts.approverId,\n question: opts.question,\n level: level.level,\n recipients: [instance.submittedBy],\n };\n this.bus.emit('approval:info_requested', payload);\n await this.notifyAdapters('approval:info_requested', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'requestInfo',\n instanceId,\n actorId: opts.approverId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Answer an open clarification request and take the instance off hold.\n *\n * Every deadline that was paused is pushed out by exactly how long the\n * question was open, so an approver gets back the full remaining time they\n * had before asking rather than being penalised for asking at all.\n *\n * @throws ApprovalError if no question is open.\n */\n async provideInfo(\n instanceId: string,\n raw: ProvideInfoOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => ProvideInfoOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n assertStatus(instance, 'pending');\n const open = instance.infoRequest;\n if (!open) {\n throw new ApprovalError(\n 'No clarification request is open on this approval.',\n 'NO_INFO_REQUESTED',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'provideInfo',\n actorId: opts.respondedBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'provideInfo',\n instanceId,\n actorId: opts.respondedBy,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n const heldForMs = Math.max(0, now.getTime() - new Date(open.askedAt).getTime());\n this.extendDeadlinesBy(instance, heldForMs);\n\n instance.infoRequest = undefined;\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'info_provided',\n actorId: opts.respondedBy,\n level: open.level,\n timestamp: now,\n comment: opts.response,\n oldValue: { question: open.question, askedBy: open.askedBy },\n newValue: { heldForMs },\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.info_provided', { tenantId: this.tenantId });\n this.logger.info('provideInfo: clarification answered', {\n tenantId: this.tenantId,\n instanceId,\n heldForMs,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n respondedBy: opts.respondedBy,\n response: opts.response,\n level: open.level,\n heldForMs,\n recipients: [...new Set(this.pendingLevels(instance).flatMap((l) => l.approverIds))],\n };\n this.bus.emit('approval:info_provided', payload);\n await this.notifyAdapters('approval:info_provided', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'provideInfo',\n instanceId,\n actorId: opts.respondedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Push every pending deadline out by `ms`.\n *\n * Used to give back time an instance spent on hold. Deadlines that are not\n * set stay unset — a level with no escalation configured does not acquire one\n * by being held.\n */\n private extendDeadlinesBy(instance: ApprovalInstance, ms: number): void {\n if (ms <= 0) return;\n const shift = (d: Date | undefined): Date | undefined =>\n d === undefined ? undefined : new Date(new Date(d).getTime() + ms);\n\n instance.expiresAt = shift(instance.expiresAt);\n instance.slaDeadlineAt = shift(instance.slaDeadlineAt);\n for (const level of instance.levels) {\n if (level.status !== 'pending') continue;\n level.escalationDueAt = shift(level.escalationDueAt);\n level.reminderDueAt = shift(level.reminderDueAt);\n level.delegatedUntil = shift(level.delegatedUntil);\n }\n }\n\n /**\n * Attach supporting evidence to an approval — a quote PDF, a signed contract,\n * a screenshot of a system of record.\n *\n * Stores a **reference**, never bytes. Approval documents belong in the object\n * store or DMS the organisation already runs, which handles retention, virus\n * scanning and access control far better than an approval table could;\n * copying them here would make the audit database the largest and least\n * governed copy of them.\n *\n * Allowed on any non-terminal instance, by anyone the authorization policy\n * permits: the submitter adding a missing quote and an approver adding the\n * note that justifies their decision are both ordinary.\n */\n async addAttachment(\n instanceId: string,\n raw: AddAttachmentOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => AddAttachmentOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (TERMINAL_STATUSES.has(instance.status)) {\n throw new ApprovalError(\n `Cannot attach to a \"${instance.status}\" approval.`,\n 'CANNOT_ATTACH',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'addAttachment',\n actorId: opts.actorId,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'addAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n const attachment: Attachment = {\n id: this.generateId('att'),\n name: opts.name,\n uri: opts.uri,\n contentType: opts.contentType,\n sizeBytes: opts.sizeBytes,\n addedBy: opts.actorId,\n addedAt: now,\n level: instance.currentLevel,\n };\n instance.attachments = [...(instance.attachments ?? []), attachment];\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'attachment_added',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n newValue: { id: attachment.id, name: attachment.name, uri: attachment.uri },\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.attachment_added', {\n tenantId: this.tenantId,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n actorId: opts.actorId,\n attachmentId: attachment.id,\n name: attachment.name,\n uri: attachment.uri,\n level: attachment.level,\n };\n this.bus.emit('approval:attachment_added', payload);\n await this.notifyAdapters('approval:attachment_added', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'addAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /**\n * Detach a reference from an approval.\n *\n * The audit entry keeps the name and URI of what was removed, so the record\n * still shows an approver saw evidence that is no longer listed — dropping\n * that would let the trail imply a decision was made on less than it was.\n * Nothing is deleted from the underlying store; that is the DMS's call.\n */\n async removeAttachment(\n instanceId: string,\n raw: RemoveAttachmentOptions,\n auditCtx?: AuditContext,\n ): Promise<ApprovalInstance> {\n const opts = parseOrThrow(() => RemoveAttachmentOptionsSchema.parse(raw));\n\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (TERMINAL_STATUSES.has(instance.status)) {\n throw new ApprovalError(\n `Cannot modify attachments on a \"${instance.status}\" approval.`,\n 'CANNOT_ATTACH',\n );\n }\n\n const existing = (instance.attachments ?? []).find((a) => a.id === opts.attachmentId);\n if (!existing) {\n throw new ApprovalError(\n `Attachment \"${opts.attachmentId}\" is not on this approval.`,\n 'ATTACHMENT_NOT_FOUND',\n );\n }\n\n await this.runAuthorizationPolicy({\n operation: 'removeAttachment',\n actorId: opts.actorId,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'removeAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n const now = this.clock.now();\n instance.attachments = (instance.attachments ?? []).filter((a) => a.id !== opts.attachmentId);\n instance.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'attachment_removed',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n reason: opts.reason,\n oldValue: { id: existing.id, name: existing.name, uri: existing.uri },\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.attachment_removed', {\n tenantId: this.tenantId,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n actorId: opts.actorId,\n attachmentId: existing.id,\n name: existing.name,\n uri: existing.uri,\n level: existing.level,\n };\n this.bus.emit('approval:attachment_removed', payload);\n await this.notifyAdapters('approval:attachment_removed', instance, payload);\n await this.runMiddlewareAfter(\n {\n operation: 'removeAttachment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n return instance;\n });\n }\n\n /** Add a comment to an instance without approving or rejecting. */\n async addComment(\n instanceId: string,\n raw: AddCommentOptions,\n auditCtx?: AuditContext,\n ): Promise<void> {\n const opts = parseOrThrow(() => AddCommentOptionsSchema.parse(raw));\n const instance = await this.requireInstance(instanceId);\n\n await this.runAuthorizationPolicy({\n operation: 'addComment',\n actorId: opts.actorId,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'addComment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n\n if (opts.parentCommentId) {\n const parent = (instance.comments ?? []).find((c) => c.id === opts.parentCommentId);\n if (!parent) {\n throw new ApprovalError(\n `Comment \"${opts.parentCommentId}\" is not on this approval, so there is nothing to reply to.`,\n 'COMMENT_NOT_FOUND',\n );\n }\n }\n\n const now = this.clock.now();\n const comment: Comment = {\n id: this.generateId('cmt'),\n authorId: opts.actorId,\n body: opts.comment,\n createdAt: now,\n level: instance.currentLevel,\n parentCommentId: opts.parentCommentId,\n mentions: opts.mentions,\n };\n instance.comments = [...(instance.comments ?? []), comment];\n\n const auditEntry: AuditEntry = {\n action: 'commented',\n actorId: opts.actorId,\n level: instance.currentLevel,\n timestamp: now,\n comment: opts.comment,\n newValue: { commentId: comment.id, parentCommentId: opts.parentCommentId },\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\n // Recipients are the people named, not the current approvers: a remark\n // aimed at somebody should reach them, and one aimed at nobody should not\n // page the whole level.\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n commentId: comment.id,\n authorId: opts.actorId,\n body: opts.comment,\n level: comment.level,\n parentCommentId: opts.parentCommentId,\n recipients: opts.mentions ?? [],\n };\n this.bus.emit('approval:commented', payload);\n await this.notifyAdapters('approval:commented', instance, payload);\n\n await this.runMiddlewareAfter({\n operation: 'addComment',\n instanceId,\n actorId: opts.actorId,\n tenantId: this.tenantId,\n input: opts,\n });\n }\n\n /**\n * Comments on an approval, oldest first.\n *\n * Returns a flat list carrying `parentCommentId`, rather than a nested tree:\n * a UI that wants threads can build them, and one that wants a chronological\n * feed — which is what most approval screens actually show — does not have to\n * flatten a structure it never wanted.\n */\n async getComments(instanceId: string): Promise<Comment[]> {\n const instance = await this.requireInstance(instanceId);\n return [...(instance.comments ?? [])].sort(\n (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n }\n\n /** Resubmit a rejected instance, creating a new linked instance from level 1. */\n async resubmit(\n instanceId: string,\n raw: ResubmitOptions,\n auditCtx?: AuditContext,\n ): 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({\n operation: 'resubmit',\n actorId: opts.resubmittedBy,\n instance: original,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'resubmit',\n instanceId,\n actorId: opts.resubmittedBy,\n tenantId: this.tenantId,\n input: opts,\n });\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(\n 'Template has no active levels after condition evaluation.',\n );\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 minApprovals: cfg.minApprovals,\n threshold: cfg.threshold,\n weights: cfg.weights,\n escalationAfterDays: cfg.escalationAfterDays,\n escalationDueAt:\n idx === 0 && cfg.escalationAfterDays\n ? this.deadlineFrom(now, cfg.escalationAfterDays)\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.slaDeadlineHours\n ? this.deadlineFromHours(now, template.slaDeadlineHours)\n : template.slaDeadlineDays\n ? this.deadlineFrom(now, template.slaDeadlineDays)\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 escalationSteps: template.escalationSteps,\n slaDeadlineDays: template.slaDeadlineDays,\n slaDeadlineHours: template.slaDeadlineHours,\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(\n {\n operation: 'resubmit',\n instanceId,\n actorId: opts.resubmittedBy,\n tenantId: this.tenantId,\n input: opts,\n },\n newInstance,\n );\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 // Preview must show who would actually be assigned, cover included —\n // otherwise it disagrees with what submit() goes on to do.\n const resolvedApprovers = await this.resolver.resolveApprovers(\n cfg.approvers,\n submittedBy,\n data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n this.clock.now(),\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 /**\n * Explain why a chain resolves the way it does for a given document.\n *\n * `previewApprovalChain()` answers *what* the chain will be. This answers\n * *why*: which rule added a level, which rule removed one, which rules were\n * evaluated and did not match, and where each level's approvers came from —\n * the question behind \"why does this purchase order have a CFO level?\", which\n * previously meant reading the template and re-evaluating the conditions by\n * hand.\n *\n * A rule that throws — an operator nobody registered, a malformed group — is\n * reported against that rule rather than failing the whole explanation. The\n * explanation is a diagnostic tool, and it is least useful at exactly the\n * moment a broken rule makes it throw.\n *\n * Reads nothing and writes nothing; safe to expose to a support UI.\n *\n * @param templateName - Template to explain.\n * @param data - Document data the conditions are evaluated against.\n * @param submittedBy - Submitter, used for approver resolution.\n */\n async explainChain(\n templateName: string,\n data: Record<string, unknown>,\n submittedBy: string,\n ): Promise<ChainExplanation> {\n const template = await this.registry.get(templateName);\n const conditions = template.conditions ?? [];\n\n const rules: ExplainedRule[] = [];\n const addedBy = new Map<number, number>();\n const skippedBy = new Map<number, number>();\n\n conditions.forEach((rule, index) => {\n const addsLevels = (rule.addLevels ?? []).map((l) => l.level);\n const skipsLevels = rule.skipLevels ?? [];\n try {\n const outcome = evaluateConditions([rule], data);\n const matched = outcome.addLevels.length > 0 || outcome.skipLevels.size > 0;\n rules.push({ index, matched, addsLevels, skipsLevels });\n if (matched) {\n for (const l of outcome.addLevels) if (!addedBy.has(l.level)) addedBy.set(l.level, index);\n for (const l of outcome.skipLevels) if (!skippedBy.has(l)) skippedBy.set(l, index);\n }\n } catch (err) {\n rules.push({\n index,\n matched: false,\n addsLevels,\n skipsLevels,\n error: (err as Error).message,\n });\n }\n });\n\n // Re-evaluate as a whole so the level set matches what submit() would build.\n let mutations: { addLevels: ApprovalLevelConfig[]; skipLevels: Set<number> };\n try {\n mutations = evaluateConditions(conditions, data);\n } catch {\n mutations = { addLevels: [], skipLevels: new Set<number>() };\n }\n\n const active = [...template.levels, ...mutations.addLevels]\n .filter((l) => !mutations.skipLevels.has(l.level))\n .sort((a, b) => a.level - b.level);\n\n const levels: ExplainedLevel[] = [];\n for (const cfg of active) {\n const fromCondition = addedBy.has(cfg.level);\n const base: ExplainedLevel = {\n level: cfg.level,\n name: cfg.name,\n mode: cfg.mode,\n source: fromCondition ? 'condition' : 'template',\n ...(fromCondition ? { addedByRule: addedBy.get(cfg.level) } : {}),\n resolvedApprovers: [],\n ...(cfg.subWorkflow ? { subWorkflowTemplate: cfg.subWorkflow.templateName } : {}),\n };\n\n if (cfg.subWorkflow) {\n levels.push(base);\n continue;\n }\n\n try {\n base.resolvedApprovers = await this.resolver.resolveApprovers(\n cfg.approvers,\n submittedBy,\n data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n this.clock.now(),\n );\n } catch (err) {\n // Naming the level with an unresolvable approver is the whole point.\n base.resolutionError = (err as Error).message;\n }\n levels.push(base);\n }\n\n const skipped: ExplainedSkip[] = template.levels\n .filter((l) => mutations.skipLevels.has(l.level))\n .map((l) => ({\n level: l.level,\n name: l.name,\n skippedByRule: skippedBy.get(l.level) ?? -1,\n }))\n .sort((a, b) => a.level - b.level);\n\n return { templateName: template.name, levels, skipped, rules };\n }\n\n /**\n * Run a document through a template against scripted decisions, without\n * persisting anything.\n *\n * `explainChain()` says what the chain will be; this says what happens to it —\n * \"if the CFO rejects at level 3, does it go back to the submitter or die?\" —\n * which previously meant submitting a real approval into a real store and\n * cleaning it up afterwards, or reasoning about the state machine by hand.\n *\n * The run executes against a private in-memory store seeded with a copy of\n * the template, so the caller's storage is untouched and no events reach the\n * caller's notification adapters. Custom resolvers and approver types are\n * copied across, because a simulation that could not resolve the caller's own\n * `dynamic` approvers would answer a different question from the one asked.\n *\n * A refused decision — wrong approver, wrong level, already acted — stops the\n * run and is reported in the transcript rather than thrown: the refusal is\n * usually the answer the caller was looking for.\n *\n * @param opts - Template, document data, submitter and the decisions to play.\n */\n async simulate(opts: {\n templateName: string;\n data: Record<string, unknown>;\n submittedBy: string;\n decisions?: SimulatedDecision[];\n }): Promise<SimulationResult> {\n const template = await this.registry.get(opts.templateName);\n\n const scratch = new ApprovalEngine({\n ...this.opts,\n adapter: new MemoryAdapter(),\n // A simulation must not page anybody, write anybody's audit log, or move\n // anybody's metrics.\n notificationAdapter: undefined,\n auditAdapter: undefined,\n metricsAdapter: undefined,\n authorizationPolicy: undefined,\n middleware: undefined,\n escalationPollIntervalMs: undefined,\n });\n this.resolver.copyRegistrationsTo(scratch.resolver);\n\n try {\n const {\n id: _id,\n tenantId: _t,\n createdAt: _c,\n version: _v,\n previousVersionId: _p,\n ...config\n } = template;\n await scratch.registry.define(config);\n\n const instance = await scratch.submit({\n templateName: opts.templateName,\n documentId: `simulation-${opts.templateName}`,\n documentType: template.documentType,\n submittedBy: opts.submittedBy,\n data: opts.data,\n metadata: {},\n });\n\n const transcript: SimulationStep[] = [];\n let current = instance;\n\n for (const [i, decision] of (opts.decisions ?? []).entries()) {\n const isApprove = 'approve' in decision;\n const actorId = isApprove ? decision.approve : decision.reject;\n try {\n current = isApprove\n ? await scratch.approve(current.id, {\n approverId: actorId,\n level: decision.level,\n comment: decision.comment,\n })\n : await scratch.reject(current.id, {\n approverId: actorId,\n level: decision.level,\n reason: decision.reason ?? 'simulated rejection',\n });\n transcript.push({\n step: i + 1,\n action: isApprove ? 'approve' : 'reject',\n actorId,\n level: decision.level,\n status: current.status,\n });\n } catch (err) {\n transcript.push({\n step: i + 1,\n action: isApprove ? 'approve' : 'reject',\n actorId,\n level: decision.level,\n status: current.status,\n error: (err as Error).message,\n });\n break;\n }\n if (TERMINAL_STATUSES.has(current.status)) break;\n }\n\n const finalInstance = await scratch.getInstance(current.id);\n return {\n finalStatus: finalInstance.status,\n levels: finalInstance.levels.map((l) => ({\n level: l.level,\n name: l.name,\n status: l.status,\n approvers: l.approverIds,\n })),\n transcript,\n unreachedLevels: finalInstance.levels\n .filter((l) => l.status === 'waiting')\n .map((l) => l.level),\n incomplete: finalInstance.status === 'pending',\n };\n } finally {\n await scratch.shutdown();\n }\n }\n\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 openForUser = this.pendingLevels(instance).find((l) => l.approverIds.includes(userId));\n const level = openForUser ?? 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(\n instanceId: string,\n raw: OverrideOptions,\n auditCtx?: AuditContext,\n ): 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('Override cannot be performed by the original submitter.');\n }\n\n await this.runAuthorizationPolicy({\n operation: 'override',\n actorId: opts.overriddenBy,\n instance,\n opts: opts as Record<string, unknown>,\n });\n await this.runMiddlewareBefore({\n operation: 'override',\n instanceId,\n actorId: opts.overriddenBy,\n tenantId: this.tenantId,\n input: opts,\n });\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.notifyAdapters('approval:completed', instance, instance);\n await this.runMiddlewareAfter(\n {\n operation: 'override',\n instanceId,\n actorId: opts.overriddenBy,\n tenantId: this.tenantId,\n input: opts,\n },\n instance,\n );\n\n return instance;\n });\n }\n\n /** Approve multiple instances in one call. Never throws — failures collected in result.failed. */\n /**\n * Move every pending approval assigned to one person over to another.\n *\n * Someone leaves, changes team, or goes on long-term leave, and their queue\n * has to go somewhere. Doing it by hand means finding every open instance\n * first — across parallel branches, where one person can hold several open\n * levels on the same document — and missing one leaves an approval that can\n * never complete.\n *\n * Each move goes through {@link reassign}, so every guard, audit entry, event\n * and authorization check that applies to a single reassignment applies here\n * too. There is no bulk short-cut around them.\n *\n * The sweep is **not atomic**: it reassigns one level at a time and reports\n * per-instance failures rather than rolling back. A partial transfer is the\n * useful outcome — the approvals that could move should move, and the ones\n * that could not are named so a human can look at them.\n *\n * @param raw - Who is moving to whom, and why.\n * @returns What moved, what did not, and why. With `dryRun` nothing is written.\n */\n async transferApprovals(\n raw: TransferApprovalsOptions,\n auditCtx?: AuditContext,\n ): Promise<TransferResult> {\n const opts = parseOrThrow(() => TransferApprovalsOptionsSchema.parse(raw));\n\n if (opts.fromApprover === opts.toApprover) {\n throw new ApprovalValidationError(\n 'transferApprovals requires different fromApprover and toApprover.',\n );\n }\n\n const queue = await this.opts.adapter.getInstancesByApprover(this.tenantId, opts.fromApprover, {\n limit: opts.limit,\n offset: 0,\n });\n\n const result: TransferResult = {\n transferred: [],\n failed: [],\n scanned: 0,\n dryRun: opts.dryRun,\n };\n\n for (const instance of queue.items) {\n if (opts.documentType && instance.documentType !== opts.documentType) continue;\n result.scanned++;\n\n // One person can hold several open branches of a parallel group on the\n // same document; each is a separate level and must be moved separately.\n const levels = instance.levels.filter(\n (l) => l.status === 'pending' && l.approverIds.includes(opts.fromApprover),\n );\n\n for (const level of levels) {\n if (opts.dryRun) {\n result.transferred.push({\n instanceId: instance.id,\n level: level.level,\n documentId: instance.documentId,\n });\n continue;\n }\n try {\n await this.reassign(\n instance.id,\n {\n reassignedBy: opts.transferredBy,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n reason: opts.reason,\n level: level.level,\n },\n auditCtx,\n );\n result.transferred.push({\n instanceId: instance.id,\n level: level.level,\n documentId: instance.documentId,\n });\n } catch (err) {\n result.failed.push({\n instanceId: instance.id,\n error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN'),\n });\n }\n }\n }\n\n this.logger.info('transferApprovals: sweep complete', {\n tenantId: this.tenantId,\n fromApprover: opts.fromApprover,\n toApprover: opts.toApprover,\n scanned: result.scanned,\n transferred: result.transferred.length,\n failed: result.failed.length,\n dryRun: opts.dryRun,\n });\n\n return result;\n }\n\n async bulkApprove(\n instanceIds: string[],\n raw: ApproveOptions,\n auditCtx?: AuditContext,\n ): 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({\n instanceId: id,\n error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN'),\n });\n }\n }\n return result;\n }\n\n /** Reject multiple instances in one call. Never throws — failures collected in result.failed. */\n async bulkReject(\n instanceIds: string[],\n raw: RejectOptions,\n auditCtx?: AuditContext,\n ): 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({\n instanceId: id,\n error: err instanceof ApprovalError ? err : new ApprovalError(String(err), 'UNKNOWN'),\n });\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 // Union across every open branch: inside a parallel group more than one\n // level is collecting decisions at the same time.\n return [...new Set(this.pendingLevels(instance).flatMap((l) => l.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 pendingCount = await this.opts.adapter.countInstances(this.tenantId, { status: 'pending' });\n } catch {\n adapterStatus = 'error';\n }\n\n if (adapterStatus === 'connected') {\n try {\n const overdue = await this.opts.adapter.getOverdueInstances(\n this.tenantId,\n this.clock.now(),\n );\n overdueCount = overdue.length;\n } catch {\n adapterStatus = 'error';\n }\n }\n\n const status =\n adapterStatus === 'error' ? 'unhealthy' : overdueCount > 0 ? 'degraded' : '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 /**\n * Aggregate counts for dashboards. Accepts an optional filter (documentType,\n * submittedBy, date range) — `status` is ignored since every status is counted.\n * Adapter-agnostic: issues one cheap count query per status plus an overdue scan.\n */\n /**\n * Who currently owes a decision, and how overdue they are.\n *\n * `getStatistics()` answers how the tenant is doing; this answers who is\n * holding it up — the question behind rebalancing a queue, spotting the\n * approver who has been on leave for a week, or deciding whom to\n * {@link transferApprovals} a departing colleague's work to.\n *\n * Computed from pending instances rather than a dedicated index, so it works\n * on any storage adapter with no new adapter methods. That means it reads\n * every pending instance in the tenant: fine for the operational volumes an\n * approval queue reaches, but it is a reporting call, not something to put on\n * a hot path.\n *\n * Rows are sorted by {@link ApproverWorkload.pending} descending, so the\n * busiest queue is first.\n *\n * @param filter - Optional scoping; `status` is ignored, since only pending work counts.\n * @returns One row per approver holding at least one open level.\n */\n async getWorkload(filter: Omit<InstanceFilter, 'status'> = {}): Promise<ApproverWorkload[]> {\n const pending = await this.fetchAllByFilter({ ...filter, status: 'pending' });\n const now = this.clock.now();\n\n const byApprover = new Map<\n string,\n { pending: number; instances: Set<string>; overdue: number; onHold: number; oldest: number }\n >();\n\n for (const instance of pending) {\n const submittedAt = new Date(instance.createdAt).getTime();\n const held = Boolean(instance.infoRequest);\n\n for (const level of instance.levels) {\n if (level.status !== 'pending') continue;\n\n const isOverdue =\n level.escalationDueAt !== undefined && new Date(level.escalationDueAt) <= now;\n\n for (const approverId of level.approverIds) {\n // An approver who has already voted on this level owes nothing more,\n // even though the level itself is still open waiting on others.\n if (level.approvedBy.includes(approverId) || level.rejectedBy.includes(approverId)) {\n continue;\n }\n\n const row = byApprover.get(approverId) ?? {\n pending: 0,\n instances: new Set<string>(),\n overdue: 0,\n onHold: 0,\n oldest: Number.POSITIVE_INFINITY,\n };\n row.pending++;\n row.instances.add(instance.id);\n if (isOverdue) row.overdue++;\n if (held) row.onHold++;\n row.oldest = Math.min(row.oldest, submittedAt);\n byApprover.set(approverId, row);\n }\n }\n }\n\n return [...byApprover.entries()]\n .map(([approverId, row]) => ({\n approverId,\n pending: row.pending,\n instances: row.instances.size,\n overdue: row.overdue,\n onHold: row.onHold,\n oldestPendingAt: Number.isFinite(row.oldest) ? new Date(row.oldest) : undefined,\n oldestAgeMs: Number.isFinite(row.oldest) ? now.getTime() - row.oldest : 0,\n }))\n .sort((a, b) => b.pending - a.pending || a.approverId.localeCompare(b.approverId));\n }\n\n /**\n * Export templates as a portable bundle.\n *\n * Approval configuration is written once and then has to travel — authored in\n * a sandbox, reviewed, promoted to production. Reading `listTemplates()` and\n * re-posting the rows carried each environment's own `id`, `tenantId` and\n * version lineage with it, which either collided on arrival or silently\n * claimed a history the target never had. This strips all of it.\n *\n * @param names - Templates to include; omit for all of them.\n */\n async exportTemplates(names?: string[]): Promise<TemplateBundle> {\n const all = await this.registry.list();\n const wanted = names ? all.filter((t) => names.includes(t.name)) : all;\n\n if (names) {\n const missing = names.filter((n) => !all.some((t) => t.name === n));\n if (missing.length > 0) {\n throw new ApprovalTemplateNotFoundError(missing.join(', '));\n }\n }\n\n return {\n bundleVersion: TEMPLATE_BUNDLE_VERSION,\n exportedAt: this.clock.now(),\n templates: wanted.map((t) => {\n // Everything environment-specific is dropped, not blanked, so a\n // round-trip cannot reintroduce a stale id.\n const {\n id: _id,\n tenantId: _tenantId,\n createdAt: _createdAt,\n version: _version,\n previousVersionId: _previousVersionId,\n ...config\n } = t;\n return config;\n }),\n };\n }\n\n /**\n * Import a bundle produced by {@link exportTemplates}.\n *\n * **Every template is validated before any is written.** A bundle that is\n * half-applied is worse than one rejected outright: the tenant is left in a\n * state matching neither environment, and the operator has no way to tell\n * which half landed. Per-template failures during the write phase are still\n * reported individually, since a storage error can occur after validation\n * passes.\n *\n * @param bundle - The bundle to apply.\n * @param opts - `mode: 'create'` (default) refuses to touch existing\n * templates; `'upsert'` updates them. `dryRun` reports without writing.\n */\n async importTemplates(\n bundle: TemplateBundle,\n opts: { mode?: 'create' | 'upsert'; dryRun?: boolean } = {},\n ): Promise<ImportResult> {\n const mode = opts.mode ?? 'create';\n const dryRun = opts.dryRun ?? false;\n\n if (bundle.bundleVersion !== TEMPLATE_BUNDLE_VERSION) {\n throw new ApprovalValidationError(\n `Unsupported template bundle version ${bundle.bundleVersion}; this engine reads version ${TEMPLATE_BUNDLE_VERSION}.`,\n );\n }\n if (!Array.isArray(bundle.templates) || bundle.templates.length === 0) {\n throw new ApprovalValidationError('Template bundle contains no templates.');\n }\n\n const duplicates = bundle.templates\n .map((t) => t.name)\n .filter((name, i, all) => all.indexOf(name) !== i);\n if (duplicates.length > 0) {\n throw new ApprovalValidationError(\n `Template bundle contains duplicate names: ${[...new Set(duplicates)].join(', ')}.`,\n );\n }\n\n // Validate everything first — see the note above on half-applied bundles.\n const invalid: Array<{ name: string; message: string }> = [];\n for (const config of bundle.templates) {\n const result = this.validateTemplate(config);\n if (!result.valid) {\n invalid.push({\n name: config.name,\n message: result.errors[0]?.message ?? 'unknown validation error',\n });\n }\n }\n if (invalid.length > 0) {\n throw new ApprovalValidationError(\n `Template bundle failed validation and was not applied: ${invalid\n .map((e) => `${e.name}: ${e.message}`)\n .join('; ')}`,\n );\n }\n\n const result: ImportResult = { created: [], updated: [], skipped: [], errors: [], dryRun };\n\n for (const config of bundle.templates) {\n const existing = await this.opts.adapter.getTemplate(this.tenantId, config.name);\n try {\n if (existing && mode === 'create') {\n result.skipped.push(config.name);\n continue;\n }\n if (existing) {\n if (!dryRun) await this.registry.update(config);\n result.updated.push(config.name);\n } else {\n if (!dryRun) await this.registry.define(config);\n result.created.push(config.name);\n }\n } catch (err) {\n result.errors.push({ name: config.name, message: (err as Error).message });\n }\n }\n\n this.logger.info('importTemplates: bundle applied', {\n tenantId: this.tenantId,\n mode,\n dryRun,\n created: result.created.length,\n updated: result.updated.length,\n skipped: result.skipped.length,\n errors: result.errors.length,\n });\n\n return result;\n }\n\n /**\n * Permanently remove finished approvals older than a cut-off.\n *\n * Approval tables only grow, and data-minimisation rules eventually require\n * old records to go. There was no way to remove one, so operators reached\n * around the library and deleted rows directly — which is exactly where\n * orphaned audit rows and half-deleted instances come from.\n *\n * **Only terminal instances are eligible.** A pending approval is live work;\n * deleting one would strand a document with no way to finish and no record of\n * why. Passing a non-terminal status is rejected rather than quietly ignored,\n * because a caller who asked to purge pending work has misunderstood\n * something and should hear about it.\n *\n * This is irreversible and removes the audit trail with the instance. In many\n * deployments that trail *is* the compliance record, which is why the\n * underlying `deleteInstance` is an optional adapter method: an adapter that\n * does not implement it makes the whole operation unavailable, and this\n * throws rather than reporting a successful purge of nothing.\n *\n * @param opts - Cut-off, optional status/type scoping, safety limit, dry run.\n * @returns What was removed, or would be under `dryRun`.\n */\n async purgeInstances(opts: {\n olderThan: Date;\n statuses?: ApprovalInstance['status'][];\n documentType?: string;\n limit?: number;\n dryRun?: boolean;\n }): Promise<PurgeResult> {\n const dryRun = opts.dryRun ?? false;\n const limit = opts.limit ?? DEFAULT_PURGE_LIMIT;\n\n if (!(opts.olderThan instanceof Date) || Number.isNaN(opts.olderThan.getTime())) {\n throw new ApprovalValidationError('purgeInstances requires a valid olderThan date.');\n }\n\n const requested = opts.statuses ?? [...TERMINAL_STATUSES];\n const nonTerminal = requested.filter((st) => !TERMINAL_STATUSES.has(st));\n if (nonTerminal.length > 0) {\n throw new ApprovalValidationError(\n `purgeInstances refuses non-terminal statuses (${nonTerminal.join(', ')}): a pending approval is live work, and removing it would strand the document it belongs to.`,\n );\n }\n\n const deleteInstance = this.opts.adapter.deleteInstance?.bind(this.opts.adapter);\n if (!deleteInstance && !dryRun) {\n throw new ApprovalValidationError(\n 'The configured storage adapter does not implement deleteInstance(), so instances cannot be purged.',\n );\n }\n\n const result: PurgeResult = { purged: [], scanned: 0, dryRun };\n // Parent and child usually share a terminal status, so both turn up in the\n // scan; without this the family sweep would report each of them twice.\n const handled = new Set<string>();\n\n for (const status of requested) {\n if (result.purged.length >= limit) break;\n\n const page = await this.opts.adapter.getInstancesByFilter(\n this.tenantId,\n {\n status,\n toDate: opts.olderThan,\n ...(opts.documentType ? { documentType: opts.documentType } : {}),\n },\n { limit, offset: 0 },\n );\n\n for (const instance of page.items) {\n if (result.purged.length >= limit) break;\n if (handled.has(instance.id)) continue;\n result.scanned++;\n\n // Defence in depth: the filter should already exclude these, but a\n // custom adapter with a loose filter must not be able to delete live work.\n if (!TERMINAL_STATUSES.has(instance.status)) continue;\n if (new Date(instance.createdAt) > opts.olderThan) continue;\n\n // Sub-workflow children go with the parent. Leaving them behind would\n // orphan rows whose parentInstanceId points at something that no longer\n // exists — unreachable, and invisible to a purge scoped by document type.\n const family = await this.collectSubWorkflowFamily(instance);\n for (const member of family) {\n if (handled.has(member.id)) continue;\n handled.add(member.id);\n if (!dryRun) await deleteInstance!(this.tenantId, member.id);\n result.purged.push({\n instanceId: member.id,\n documentId: member.documentId,\n status: member.status,\n });\n }\n }\n }\n\n this.logger.info('purgeInstances: sweep complete', {\n tenantId: this.tenantId,\n olderThan: opts.olderThan.toISOString(),\n scanned: result.scanned,\n purged: result.purged.length,\n dryRun,\n });\n\n return result;\n }\n\n async getStatistics(filter: Omit<InstanceFilter, 'status'> = {}): Promise<ApprovalStatistics> {\n const statuses: ApprovalInstance['status'][] = [\n 'pending',\n 'approved',\n 'rejected',\n 'cancelled',\n 'expired',\n ];\n\n const counts = await Promise.all(\n statuses.map((status) =>\n this.opts.adapter.countInstances(this.tenantId, { ...filter, status }),\n ),\n );\n\n const byStatus = statuses.reduce(\n (acc, status, i) => {\n acc[status] = counts[i] ?? 0;\n return acc;\n },\n {} as Record<ApprovalInstance['status'], number>,\n );\n\n const total = counts.reduce((a, b) => a + b, 0);\n const overdueList = await this.opts.adapter.getOverdueInstances(\n this.tenantId,\n this.clock.now(),\n filter,\n );\n const resolved = byStatus.approved + byStatus.rejected;\n const approvalRate = resolved === 0 ? 0 : byStatus.approved / resolved;\n const cycleTime = await this.computeCycleTimeStats(filter);\n\n // Per-template breakdown. Issue one aggregate query per template so the\n // result is accurate even when combined with the other filters (documentType,\n // submittedBy, date range). Adapter-agnostic: built only from\n // getInstancesByFilter counts plus a per-template approved/rejected count.\n const templates = await this.registry.list();\n const byTemplate: ApprovalStatistics['byTemplate'] = {};\n const cycleTimeByTemplate: ApprovalStatistics['cycleTimeByTemplate'] = {};\n if (templates.length > 0) {\n await Promise.all(\n templates.map(async (template) => {\n const base = { ...filter, templateName: template.name };\n const [tTotal, tApproved, tRejected, tPending, tCycleTime] = await Promise.all([\n this.opts.adapter.countInstances(this.tenantId, base),\n this.opts.adapter.countInstances(this.tenantId, { ...base, status: 'approved' }),\n this.opts.adapter.countInstances(this.tenantId, { ...base, status: 'rejected' }),\n this.opts.adapter.countInstances(this.tenantId, { ...base, status: 'pending' }),\n this.computeCycleTimeStats(base),\n ]);\n if (tTotal > 0) {\n byTemplate[template.name] = {\n total: tTotal,\n approved: tApproved,\n rejected: tRejected,\n pending: tPending,\n };\n }\n if (tCycleTime.count > 0) {\n cycleTimeByTemplate[template.name] = tCycleTime;\n }\n }),\n );\n }\n\n return {\n total,\n byStatus,\n overdue: overdueList.length,\n approvalRate,\n byTemplate,\n cycleTime,\n cycleTimeByTemplate,\n };\n }\n\n async shutdown(): Promise<void> {\n this.schedulerStopped = true;\n await this.escalation.stop();\n if (this.opts.schedulerAdapter && this.schedulerAdapterHandle !== null) {\n await this.opts.schedulerAdapter.cancel(this.schedulerAdapterHandle);\n this.schedulerAdapterHandle = null;\n }\n await this.opts.schedulerAdapter?.shutdown();\n }\n\n // ─── Internals ────────────────────────────────────────────────────────────\n\n /**\n * Schedules the next escalation scan via {@link ApprovalEngineOptions.schedulerAdapter}.\n *\n * Called once from the constructor to start the loop, then re-invoked by the\n * scheduled callback itself after each scan completes — a self-rescheduling\n * chain of one-shot {@link ISchedulerAdapter.scheduleAt} calls standing in for\n * the `setInterval` that {@link EscalationScheduler.start} would otherwise\n * use. Each invocation runs the exact same {@link EscalationScheduler.tick}\n * scan the built-in poller runs; only the timer mechanism differs.\n *\n * A no-op once {@link shutdown} has set {@link schedulerStopped} — this is\n * what stops the chain from rescheduling itself forever after teardown.\n */\n private scheduleNextEscalationTick(schedulerAdapter: ISchedulerAdapter): void {\n if (this.schedulerStopped) return;\n const runAt = new Date(this.clock.now().getTime() + this.escalationPollIntervalMs);\n schedulerAdapter\n .scheduleAt(this.tenantId, runAt, async () => {\n if (this.schedulerStopped) return;\n try {\n await this.escalation.tick();\n } finally {\n this.scheduleNextEscalationTick(schedulerAdapter);\n }\n })\n .then((handle) => {\n this.schedulerAdapterHandle = handle;\n })\n .catch((err: unknown) => {\n this.logger.error(\n 'ApprovalEngine: failed to schedule the next escalation tick via schedulerAdapter',\n err,\n { tenantId: this.tenantId },\n );\n });\n }\n\n /**\n * Compute {@link CycleTimeStats} for every \"completed\" instance (see\n * {@link CYCLE_TIME_STATUSES}) matching `filter`. Adapter-agnostic: fetches\n * full instances (not just counts) via {@link fetchAllByFilter} so the\n * actual `createdAt`/`updatedAt` timestamps are available, then reuses the\n * shared {@link computeTimingStats} quantile routine from the metrics\n * plugin rather than a second implementation.\n */\n private async computeCycleTimeStats(\n filter: Omit<InstanceFilter, 'status'>,\n ): Promise<CycleTimeStats> {\n const perStatusLists = await Promise.all(\n CYCLE_TIME_STATUSES.map((status) => this.fetchAllByFilter({ ...filter, status })),\n );\n const durationsMs = perStatusLists\n .flat()\n .map((instance) => instance.updatedAt.getTime() - instance.createdAt.getTime());\n return toCycleTimeStats(computeTimingStats(durationsMs));\n }\n\n /**\n * Page through every instance matching `filter` via the adapter's\n * `getInstancesByFilter`, accumulating pages until the adapter reports no\n * more results. Needed because adapters may impose a default page size\n * (e.g. `PostgresAdapter` defaults to 50) when no explicit `limit` is given,\n * so a single unbounded call cannot be relied on to return everything.\n */\n private async fetchAllByFilter(filter: InstanceFilter): Promise<ApprovalInstance[]> {\n const items: ApprovalInstance[] = [];\n let offset = 0;\n for (;;) {\n const page = await this.opts.adapter.getInstancesByFilter(this.tenantId, filter, {\n limit: CYCLE_TIME_FETCH_BATCH_SIZE,\n offset,\n });\n items.push(...page.items);\n offset += page.items.length;\n if (page.items.length === 0 || items.length >= page.total) break;\n }\n return items;\n }\n\n private async escalateInternal(\n instanceId: string,\n escalatedBy = 'system',\n auditCtx?: AuditContext,\n levelNumber?: number,\n ): Promise<ApprovalInstance> {\n return this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n\n const ladder = await this.escalationLadder(instance);\n const targetLevel =\n levelNumber === undefined\n ? this.currentLevelInstance(instance)\n : (instance.levels.find((l) => l.level === levelNumber) ??\n this.currentLevelInstance(instance));\n const rungIndex = targetLevel.escalationStep ?? 0;\n const rung = ladder[rungIndex];\n\n const escalateTo =\n rung?.escalateTo ??\n (\n instance.templateSnapshot?.escalation ??\n (await this.registry.get(instance.templateName)).escalation\n )?.escalateTo;\n if (!escalateTo) return instance;\n\n const newApprovers = await this.resolver.resolveApprovers(\n [escalateTo],\n instance.submittedBy,\n instance.data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n this.clock.now(),\n );\n\n const filteredApprovers = newApprovers.filter((id) => id !== instance.submittedBy);\n if (filteredApprovers.length === 0) {\n this.logger.warn(\n 'escalateInternal: escalation resolved to submitter only — no approvers added',\n {\n tenantId: this.tenantId,\n instanceId,\n },\n );\n return instance;\n }\n\n // A parallel group has several open branches, each with its own deadline;\n // escalating \"the current level\" would leave the others stuck forever.\n const level = targetLevel;\n level.approverIds = [...new Set([...level.approverIds, ...filteredApprovers])];\n\n const now = this.clock.now();\n\n // Arm the next rung, if the ladder has one. Rung delays are measured from\n // when the level opened, not from the previous escalation, so a ladder\n // reads the way it is written: \"2 days, then 4 days, then 7\".\n level.escalationStep = rungIndex + 1;\n const nextRung = ladder[rungIndex + 1];\n const levelOpenedAt = this.levelOpenedAt(instance, level, now);\n level.escalationDueAt = nextRung ? this.stepDueAt(levelOpenedAt, nextRung) : undefined;\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', {\n tenantId: this.tenantId,\n instanceId,\n escalatedTo,\n });\n const p = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n level: level.level,\n escalatedTo,\n };\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(\n instanceId: string,\n deadlineAction: 'cancel' | 'reject',\n ): 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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n deadlineAction,\n };\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 = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n slaDeadlineAt: instance.slaDeadlineAt ?? now,\n };\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(\n instanceId: string,\n levelNumber: number,\n fromApprover: string,\n ): 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', {\n tenantId: this.tenantId,\n attempt: String(attempt),\n });\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 /** Compute a deadline `days` from `from`, honouring the business calendar if one is configured. */\n private deadlineFrom(from: Date, days: number): Date {\n return this.calendar\n ? this.calendar.addBusinessDays(from, days)\n : new Date(from.getTime() + days * 86_400_000);\n }\n\n /**\n * Resolve an hour-based deadline.\n *\n * A calendar that only knows whole days — `weekendCalendar`, say — has no\n * `addBusinessHours`, and this falls back to elapsed clock time rather than\n * quietly pretending the calendar was applied. Configure\n * `businessHoursCalendar` to have hours skip evenings and weekends.\n */\n private deadlineFromHours(from: Date, hours: number): Date {\n const addHours = this.calendar?.addBusinessHours?.bind(this.calendar);\n return addHours ? addHours(from, hours) : new Date(from.getTime() + hours * 3_600_000);\n }\n\n /**\n * Build a level instance from its template config.\n *\n * The single place a level is constructed. It previously happened twice — in\n * `submit()` and again in `recomputeFutureChain()` — and the second copy was\n * missing `group`, `subWorkflowTemplate`, `escalationAfterHours` and the\n * reminder fields, so a level added by a condition during `updateData()` came\n * out silently different from the same level created at submit.\n *\n * @param cfg - The template's configuration for this level.\n * @param opts - `open` activates the level now, computing deadlines from `now`.\n */\n private buildLevelInstance(\n cfg: ApprovalLevelConfig,\n opts: { open: boolean; now: Date; firstRung?: EscalationStep },\n ): ApprovalLevelInstance {\n const level: ApprovalLevelInstance = {\n level: cfg.level,\n name: cfg.name,\n group: cfg.group,\n mode: cfg.mode,\n approverConfigs: cfg.approvers,\n approverIds: [],\n approvedBy: [],\n rejectedBy: [],\n status: opts.open ? 'pending' : 'waiting',\n minApprovals: cfg.minApprovals,\n threshold: cfg.threshold,\n weights: cfg.weights,\n subWorkflowTemplate: cfg.subWorkflow?.templateName,\n escalationAfterDays: cfg.escalationAfterDays,\n escalationAfterHours: cfg.escalationAfterHours,\n escalationStep: 0,\n reminderAfterDays: cfg.reminderAfterDays,\n reminderEveryDays: cfg.reminderEveryDays,\n maxReminders: cfg.maxReminders,\n remindersSent: 0,\n };\n\n if (opts.open) {\n level.openedAt = opts.now;\n level.escalationDueAt = this.levelEscalationDue(opts.now, cfg, opts.firstRung);\n this.scheduleReminder(level, opts.now);\n }\n return level;\n }\n\n /** Level deadline from whichever of days/hours the template configured. */\n private levelEscalationDue(\n from: Date,\n level: { escalationAfterDays?: number; escalationAfterHours?: number },\n firstRung?: EscalationStep,\n ): Date | undefined {\n // An explicit per-level delay wins: it is the more specific statement of\n // when this particular level is late.\n if (level.escalationAfterHours) return this.deadlineFromHours(from, level.escalationAfterHours);\n if (level.escalationAfterDays) return this.deadlineFrom(from, level.escalationAfterDays);\n return firstRung ? this.stepDueAt(from, firstRung) : undefined;\n }\n\n /** First rung of a ladder, sorted by delay, or undefined when there is none. */\n private firstRungOf(steps: EscalationStep[] | undefined): EscalationStep | undefined {\n if (!steps || steps.length === 0) return undefined;\n return [...steps].sort(\n (a, b) =>\n (a.afterHours ?? (a.afterDays ?? 0) * 24) - (b.afterHours ?? (b.afterDays ?? 0) * 24),\n )[0];\n }\n\n /**\n * The escalation ladder for an instance, sorted by delay.\n *\n * Read from the instance's template snapshot so an in-flight approval keeps\n * the ladder it was submitted under, exactly as the single-step\n * {@link EscalationConfig} already did.\n */\n private async escalationLadder(instance: ApprovalInstance): Promise<EscalationStep[]> {\n const snapshot = instance.templateSnapshot;\n const steps =\n snapshot?.escalationSteps ??\n (await this.registry.get(instance.templateName)).escalationSteps ??\n [];\n return [...steps].sort(\n (a, b) =>\n (a.afterHours ?? (a.afterDays ?? 0) * 24) - (b.afterHours ?? (b.afterDays ?? 0) * 24),\n );\n }\n\n /**\n * When a level started collecting decisions.\n *\n * Escalation rungs are measured from this, not from the previous rung, so a\n * ladder reads the way it is written. Recovered from the audit trail — the\n * `submitted` entry for the opening level, the `level_advanced` entry\n * otherwise — and falls back to `now` when no entry exists, which only leaves\n * the ladder no worse off than the single-step behaviour it replaces.\n */\n private levelOpenedAt(\n instance: ApprovalInstance,\n level: ApprovalLevelInstance,\n fallback: Date,\n ): Date {\n // Recorded on the level since 3.1.0. The audit scan below remains for\n // instances submitted before that and still in flight.\n if (level.openedAt) return new Date(level.openedAt);\n\n for (let i = instance.auditLog.length - 1; i >= 0; i--) {\n const entry = instance.auditLog[i];\n if (!entry) continue;\n const opensThisLevel =\n (entry.action === 'level_advanced' || entry.action === 'submitted') &&\n entry.level === level.level;\n if (opensThisLevel) return new Date(entry.timestamp);\n }\n return fallback;\n }\n\n /** Deadline for one rung, measured from when the level opened. */\n private stepDueAt(from: Date, step: EscalationStep): Date | undefined {\n if (step.afterHours) return this.deadlineFromHours(from, step.afterHours);\n if (step.afterDays) return this.deadlineFrom(from, step.afterDays);\n return undefined;\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 /**\n * Identity of the parallel branch group a level belongs to.\n *\n * An ungrouped level is its own group of one, keyed by its level number, so\n * sequential and parallel levels can be handled by the same code paths. The\n * `#` prefix keeps a synthetic key from ever colliding with a real group\n * name a template author chose.\n */\n private static groupKeyOf(level: { level: number; group?: string }): string {\n return level.group ?? `#${level.level}`;\n }\n\n /** Every level currently collecting decisions — more than one inside a parallel group. */\n private pendingLevels(instance: ApprovalInstance): ApprovalLevelInstance[] {\n return instance.levels.filter((l) => l.status === 'pending');\n }\n\n /** All levels sharing a group with the given level, including it. */\n private groupMembers(\n instance: ApprovalInstance,\n level: ApprovalLevelInstance,\n ): ApprovalLevelInstance[] {\n const key = ApprovalEngine.groupKeyOf(level);\n return instance.levels.filter((l) => ApprovalEngine.groupKeyOf(l) === key);\n }\n\n /**\n * Pick which pending level an actor is operating on.\n *\n * With sequential levels there is only ever one candidate. Inside a parallel\n * group an approver may sit on several branches at once, and guessing which\n * one they meant would silently record the decision against the wrong branch —\n * so that case demands an explicit `level`.\n */\n private resolveActorLevel(\n instance: ApprovalInstance,\n actorId: string,\n explicitLevel?: number,\n ): ApprovalLevelInstance {\n const pending = this.pendingLevels(instance);\n if (pending.length === 0) {\n throw new ApprovalError(\n `Instance has no level awaiting a decision (status: ${instance.status}).`,\n 'INVALID_LEVEL',\n );\n }\n\n if (explicitLevel !== undefined) {\n const chosen = pending.find((l) => l.level === explicitLevel);\n if (!chosen) {\n const open = pending.map((l) => l.level).join(', ');\n throw new ApprovalError(\n `Level ${explicitLevel} is not awaiting a decision (open levels: ${open}).`,\n 'INVALID_LEVEL',\n );\n }\n return chosen;\n }\n\n if (pending.length === 1) return pending[0] as ApprovalLevelInstance;\n\n const candidates = pending.filter((l) => l.approverIds.includes(actorId));\n if (candidates.length === 1) return candidates[0] as ApprovalLevelInstance;\n if (candidates.length > 1) {\n const open = candidates.map((l) => `${l.level} (\"${l.name}\")`).join(', ');\n throw new ApprovalValidationError(\n `Approver \"${actorId}\" is assigned to more than one open parallel level (${open}). Pass an explicit \"level\" to say which one this decision is for.`,\n );\n }\n // Not an approver anywhere; hand back the lowest open level so the caller's\n // own membership check produces the usual \"not an approver\" error.\n return pending[0] as ApprovalLevelInstance;\n }\n\n private currentLevelInstance(instance: ApprovalInstance): ApprovalLevelInstance {\n const pending = this.pendingLevels(instance);\n const lowestPending = pending.reduce<ApprovalLevelInstance | null>(\n (acc, l) => (acc === null || l.level < acc.level ? l : acc),\n null,\n );\n const level =\n instance.levels.find((l) => l.level === instance.currentLevel) ?? lowestPending ?? null;\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 /**\n * The next group of levels to activate: every level sharing the group of the\n * lowest-numbered waiting level.\n */\n private findNextGroup(instance: ApprovalInstance): ApprovalLevelInstance[] {\n const waiting = instance.levels\n .filter((l) => l.status === 'waiting')\n .sort((a, b) => a.level - b.level);\n const head = waiting[0];\n if (!head) return [];\n const key = ApprovalEngine.groupKeyOf(head);\n return waiting.filter((l) => ApprovalEngine.groupKeyOf(l) === key);\n }\n\n /** Resolve approvers for a group, set its deadlines, and mark it pending. */\n private async activateGroup(\n instance: ApprovalInstance,\n group: ApprovalLevelInstance[],\n now: Date,\n ): Promise<void> {\n const firstRung = this.firstRungOf(instance.templateSnapshot?.escalationSteps);\n for (const lvl of group) {\n if (lvl.subWorkflowTemplate) {\n // Nobody approves this level directly — a child approval decides it.\n lvl.approverIds = [];\n } else {\n lvl.approverIds = await this.resolver.resolveApprovers(\n lvl.approverConfigs,\n instance.submittedBy,\n instance.data,\n this.opts.orgProvider,\n this.opts.outOfOfficeProvider,\n now,\n );\n }\n lvl.openedAt = now;\n lvl.escalationDueAt = this.levelEscalationDue(now, lvl, firstRung);\n lvl.escalationStep = 0;\n this.scheduleReminder(lvl, now);\n lvl.status = 'pending';\n }\n instance.currentLevel = group.reduce((min, l) => Math.min(min, l.level), Infinity);\n }\n\n /**\n * Set (or clear) the next reminder deadline for a level that has just opened.\n *\n * Called wherever a level becomes pending, so a level activated by submit,\n * by advancing, or by a group activation all schedule alike.\n */\n private scheduleReminder(level: ApprovalLevelInstance, from: Date): void {\n if (!level.reminderAfterDays || level.reminderAfterDays <= 0) {\n level.reminderDueAt = undefined;\n return;\n }\n level.remindersSent = level.remindersSent ?? 0;\n level.reminderDueAt = this.deadlineFrom(from, level.reminderAfterDays);\n }\n\n /**\n * Nudge the approvers who still owe a decision on a pending level.\n *\n * Reminders never change who can approve or when the level escalates — they\n * only notify. Recipients exclude anyone who has already voted, so a\n * half-decided quorum level stops pestering the approvers who did their part.\n */\n private async sendReminder(instanceId: string, levelNumber: number): Promise<void> {\n try {\n await this.withOptimisticRetry(instanceId, async (instance) => {\n if (instance.status !== 'pending') return instance;\n const level = instance.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending' || !level.reminderDueAt) return instance;\n\n const sentSoFar = level.remindersSent ?? 0;\n const cap = level.maxReminders ?? DEFAULT_MAX_REMINDERS;\n if (sentSoFar >= cap) {\n level.reminderDueAt = undefined;\n await this.opts.adapter.updateInstance(instance, instance.version);\n return instance;\n }\n\n const now = this.clock.now();\n const reminderNumber = sentSoFar + 1;\n level.remindersSent = reminderNumber;\n\n // Schedule the next one, or stop if this was the last permitted.\n level.reminderDueAt =\n level.reminderEveryDays && reminderNumber < cap\n ? this.deadlineFrom(now, level.reminderEveryDays)\n : undefined;\n\n const recipients = level.approverIds.filter(\n (id) => !level.approvedBy.includes(id) && !level.rejectedBy.includes(id),\n );\n\n const auditEntry: AuditEntry = {\n action: 'reminded',\n actorId: 'system',\n level: level.level,\n timestamp: now,\n newValue: { reminderNumber, recipients },\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.reminded', { tenantId: this.tenantId });\n this.logger.info('reminder: nudged pending approvers', {\n tenantId: this.tenantId,\n instanceId,\n levelNumber,\n reminderNumber,\n recipients,\n });\n\n const payload = {\n instanceId,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: now,\n level: level.level,\n recipients,\n reminderNumber,\n };\n this.bus.emit('approval:reminder', payload);\n await this.notifyAdapters('approval:reminder', instance, payload);\n return instance;\n });\n } catch (err) {\n this.logger.error('reminder: failed to send', err, { tenantId: this.tenantId, instanceId });\n }\n }\n\n /**\n * Start child approvals for any open level that delegates to a sub-workflow.\n *\n * Run after the parent has been persisted, never inside the same optimistic\n * write: the child's own `submit()` performs its own reads and writes, and\n * nesting them under the parent's compare-and-set would make a slow child\n * template a source of spurious version conflicts on the parent.\n */\n private async startSubWorkflows(instance: ApprovalInstance): Promise<void> {\n const pendingSubs = instance.levels.filter(\n (l) => l.status === 'pending' && l.subWorkflowTemplate && !l.childInstanceId,\n );\n if (pendingSubs.length === 0) return;\n\n const depth = (instance.subWorkflowDepth ?? 0) + 1;\n if (depth > MAX_SUBWORKFLOW_DEPTH) {\n throw new ApprovalValidationError(\n `Sub-workflow nesting exceeded ${MAX_SUBWORKFLOW_DEPTH} levels at template \"${instance.templateName}\". Check for a template that reaches itself.`,\n );\n }\n\n for (const level of pendingSubs) {\n const templateName = level.subWorkflowTemplate as string;\n const childTemplate = await this.registry.get(templateName);\n\n const child = await this.submit(\n {\n templateName,\n // Unique per parent level, so a resubmitted parent does not collide\n // with the child it spawned last time.\n documentId: `${instance.documentId}#L${level.level}`,\n documentType: childTemplate.documentType,\n submittedBy: instance.submittedBy,\n data: instance.data,\n metadata: { ...instance.metadata, parentInstanceId: instance.id },\n },\n undefined,\n { parentInstanceId: instance.id, parentLevel: level.level, depth },\n );\n\n await this.withOptimisticRetry(instance.id, async (parent) => {\n const lvl = parent.levels.find((l) => l.level === level.level);\n if (!lvl || lvl.childInstanceId) return parent;\n lvl.childInstanceId = child.id;\n parent.updatedAt = this.clock.now();\n await this.opts.adapter.updateInstance(parent, parent.version);\n return parent;\n });\n\n const payload = {\n instanceId: instance.id,\n documentId: instance.documentId,\n documentType: instance.documentType,\n timestamp: this.clock.now(),\n level: level.level,\n childInstanceId: child.id,\n childTemplateName: templateName,\n };\n this.bus.emit('approval:subworkflow_started', payload);\n await this.notifyAdapters('approval:subworkflow_started', instance, payload);\n this.logger.info('subWorkflow: child approval started', {\n tenantId: this.tenantId,\n instanceId: instance.id,\n level: level.level,\n childInstanceId: child.id,\n });\n }\n }\n\n /**\n * Return a finished child's outcome to the parent level that is waiting on it.\n *\n * An approved child approves its parent level and lets the chain advance; any\n * other terminal outcome — rejected, cancelled, expired — rejects the parent,\n * because the approval the parent was waiting for did not happen. Collapsing\n * those into one rejection is deliberate: a parent that treated a cancelled\n * child as \"carry on\" would advance past a gate nobody cleared.\n */\n private async propagateToParent(child: ApprovalInstance): Promise<void> {\n if (!child.parentInstanceId || child.parentLevel === undefined) return;\n\n const outcome = child.status;\n const parentId = child.parentInstanceId;\n const parentLevelNumber = child.parentLevel;\n\n try {\n const parent = await this.opts.adapter.getInstance(this.tenantId, parentId);\n if (!parent || parent.status !== 'pending') return;\n\n const payload = {\n instanceId: parentId,\n documentId: parent.documentId,\n documentType: parent.documentType,\n timestamp: this.clock.now(),\n level: parentLevelNumber,\n childInstanceId: child.id,\n childTemplateName: child.templateName,\n outcome: outcome as 'approved' | 'rejected' | 'cancelled' | 'expired',\n };\n\n if (outcome === 'approved') {\n await this.completeSubWorkflowLevel(parentId, parentLevelNumber, child);\n } else {\n await this.rejectFromSubWorkflow(parentId, parentLevelNumber, child);\n }\n\n const refreshed = await this.opts.adapter.getInstance(this.tenantId, parentId);\n this.bus.emit('approval:subworkflow_completed', payload);\n if (refreshed) {\n await this.notifyAdapters('approval:subworkflow_completed', refreshed, payload);\n }\n } catch (err) {\n // A parent that cannot be advanced must not fail the child's own decision,\n // which is already recorded. Surface it loudly instead.\n this.logger.error('subWorkflow: failed to propagate outcome to parent', err, {\n tenantId: this.tenantId,\n childInstanceId: child.id,\n parentInstanceId: parentId,\n });\n }\n }\n\n /** Mark a sub-workflow level approved and advance the parent chain. */\n private async completeSubWorkflowLevel(\n parentId: string,\n levelNumber: number,\n child: ApprovalInstance,\n ): Promise<void> {\n let advanced: ApprovalInstance | null = null;\n\n await this.withOptimisticRetry(parentId, async (parent) => {\n const level = parent.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending') return parent;\n\n const now = this.clock.now();\n level.status = 'approved';\n level.reminderDueAt = undefined;\n level.escalationDueAt = undefined;\n\n const auditEntry: AuditEntry = {\n action: 'subworkflow_completed',\n actorId: 'system',\n level: levelNumber,\n timestamp: now,\n newValue: { childInstanceId: child.id, outcome: 'approved' },\n };\n parent.auditLog.push(auditEntry);\n parent.updatedAt = now;\n\n // The whole group must be done before the chain moves on, exactly as for\n // an ordinary level inside a parallel group.\n const siblingsOpen = this.groupMembers(parent, level).some(\n (l) => l.status === 'pending' || l.status === 'waiting',\n );\n if (!siblingsOpen) {\n const nextGroup = this.findNextGroup(parent);\n if (nextGroup.length === 0) {\n parent.status = 'approved';\n } else {\n await this.activateGroup(parent, nextGroup, now);\n }\n }\n\n await this.opts.adapter.updateInstance(parent, parent.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, parentId, auditEntry);\n await this.runExternalAudit(parent, auditEntry);\n advanced = parent;\n return parent;\n });\n\n if (advanced) {\n const parent = advanced as ApprovalInstance;\n if (parent.status === 'approved') {\n this.bus.emit('approval:completed', parent);\n await this.notifyAdapters('approval:completed', parent, parent);\n await this.propagateToParent(parent);\n } else {\n // A newly opened group may itself contain sub-workflow levels.\n await this.startSubWorkflows(parent);\n }\n }\n }\n\n /** Reject a parent because the child approval it was waiting on did not succeed. */\n private async rejectFromSubWorkflow(\n parentId: string,\n levelNumber: number,\n child: ApprovalInstance,\n ): Promise<void> {\n let rejected: ApprovalInstance | null = null;\n\n await this.withOptimisticRetry(parentId, async (parent) => {\n const level = parent.levels.find((l) => l.level === levelNumber);\n if (!level || level.status !== 'pending') return parent;\n\n const now = this.clock.now();\n level.status = 'rejected';\n level.reminderDueAt = undefined;\n level.escalationDueAt = undefined;\n parent.status = 'rejected';\n parent.updatedAt = now;\n\n const auditEntry: AuditEntry = {\n action: 'subworkflow_completed',\n actorId: 'system',\n level: levelNumber,\n timestamp: now,\n reason: `Child approval ${child.id} ended as \"${child.status}\".`,\n newValue: { childInstanceId: child.id, outcome: child.status },\n };\n parent.auditLog.push(auditEntry);\n\n await this.opts.adapter.updateInstance(parent, parent.version);\n await this.opts.adapter.appendAuditEntry(this.tenantId, parentId, auditEntry);\n await this.runExternalAudit(parent, auditEntry);\n rejected = parent;\n return parent;\n });\n\n if (rejected) {\n const parent = rejected as ApprovalInstance;\n const payload = {\n instanceId: parent.id,\n documentId: parent.documentId,\n documentType: parent.documentType,\n timestamp: this.clock.now(),\n approverId: 'system',\n level: levelNumber,\n reason: `Child approval ${child.id} ended as \"${child.status}\".`,\n returnTo: null,\n };\n this.bus.emit('approval:rejected', payload);\n await this.notifyAdapters('approval:rejected', parent, payload);\n await this.propagateToParent(parent);\n }\n }\n\n /**\n * Work that must happen after a decision is durably recorded, not inside it.\n *\n * Both branches touch other instances — a newly opened level may spawn a\n * child approval, and a finished instance may be a child that owes its\n * outcome to a parent. Doing either inside the deciding instance's\n * compare-and-set would nest writes under a version guard that knows nothing\n * about them, so a slow child template would surface as a spurious conflict\n * on the decision the user just made.\n */\n /**\n * An instance and every sub-workflow descendant beneath it, parents first.\n *\n * A child is only reachable through its parent's `childInstanceId`, so a\n * purge that removed the parent alone would strand the rest of the tree.\n * Depth is bounded by the same cap that limits spawning, and an already-seen\n * id is skipped so a corrupted link cannot loop.\n */\n private async collectSubWorkflowFamily(root: ApprovalInstance): Promise<ApprovalInstance[]> {\n const family: ApprovalInstance[] = [root];\n const seen = new Set<string>([root.id]);\n const queue: ApprovalInstance[] = [root];\n\n for (let depth = 0; queue.length > 0 && depth <= MAX_SUBWORKFLOW_DEPTH; depth++) {\n const generation = queue.splice(0, queue.length);\n for (const parent of generation) {\n for (const level of parent.levels) {\n const childId = level.childInstanceId;\n if (!childId || seen.has(childId)) continue;\n seen.add(childId);\n const child = await this.opts.adapter.getInstance(this.tenantId, childId);\n if (!child) continue;\n family.push(child);\n queue.push(child);\n }\n }\n }\n return family;\n }\n\n /**\n * Cancel sub-workflow children whose parent has finished.\n *\n * A child outlives its parent otherwise: it stays pending, keeps notifying\n * and escalating, and keeps appearing in {@link getWorkload} — asking people\n * to decide something whose outcome nobody will ever read, because\n * {@link propagateToParent} ignores a parent that is no longer pending.\n *\n * Cancelling rather than deleting keeps the child's own audit trail intact:\n * the people who were asked, and why the request stopped, stay on the record.\n */\n private async cancelOrphanedChildren(parent: ApprovalInstance): Promise<void> {\n const childIds = parent.levels\n .map((l) => l.childInstanceId)\n .filter((id): id is string => typeof id === 'string');\n if (childIds.length === 0) return;\n\n for (const childId of childIds) {\n try {\n const child = await this.opts.adapter.getInstance(this.tenantId, childId);\n if (!child || TERMINAL_STATUSES.has(child.status)) continue;\n await this.cancel(childId, {\n cancelledBy: 'system',\n reason: `Parent approval ${parent.id} ended as \"${parent.status}\".`,\n });\n } catch (err) {\n // A child that cannot be cancelled must not undo the parent's own\n // decision, which is already recorded.\n this.logger.error('subWorkflow: failed to cancel orphaned child', err, {\n tenantId: this.tenantId,\n parentInstanceId: parent.id,\n childInstanceId: childId,\n });\n }\n }\n }\n\n private async afterDecision(instance: ApprovalInstance): Promise<void> {\n if (TERMINAL_STATUSES.has(instance.status)) {\n await this.cancelOrphanedChildren(instance);\n await this.propagateToParent(instance);\n return;\n }\n await this.startSubWorkflows(instance);\n }\n\n private findNextLevel(instance: ApprovalInstance): ApprovalLevelInstance | null {\n return (\n instance.levels.find((l) => l.level > instance.currentLevel && l.status === 'waiting') ?? null\n );\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, {\n tenantId: this.tenantId,\n });\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(\n ctx: OperationContext,\n result?: ApprovalInstance | void,\n ): 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, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\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, {\n tenantId: this.tenantId,\n instanceId: instance.id,\n });\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\n/** Map the shared {@link TimingStats} shape onto the ms-suffixed {@link CycleTimeStats} field names. */\nfunction toCycleTimeStats(timing: TimingStats): CycleTimeStats {\n return {\n count: timing.count,\n averageMs: timing.avg,\n p50Ms: timing.p50,\n p95Ms: timing.p95,\n minMs: timing.min,\n maxMs: timing.max,\n };\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(err instanceof Error ? err.message : 'Invalid input', err);\n }\n}\n","/**\n * Computes deadline dates from a number of days. The default engine behaviour\n * treats day offsets (escalationAfterDays, slaDeadlineDays) as plain calendar\n * days; provide a BusinessCalendar on ApprovalEngine to interpret them as\n * business days instead — skipping weekends and configured holidays.\n */\nexport interface BusinessCalendar {\n /**\n * Return the date that is `days` business days after `from`. A fractional\n * `days` adds whole business days first, then the remaining fraction as\n * elapsed clock time within the resulting business day.\n */\n addBusinessDays(from: Date, days: number): Date;\n /**\n * Return the date that is `hours` **working** hours after `from`, skipping\n * non-working hours, weekends and holidays.\n *\n * Optional. A calendar that only knows about whole days — such as\n * {@link weekendCalendar} — omits it, and the engine falls back to elapsed\n * clock time for any hour-based deadline rather than silently pretending the\n * calendar was applied.\n */\n addBusinessHours?(from: Date, hours: number): Date;\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction dayKey(d: Date): string {\n // Local-date key (YYYY-MM-DD) for holiday comparison.\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nexport interface WeekendCalendarOptions {\n /** Dates to treat as non-working days (compared by local calendar date). */\n holidays?: Date[];\n /**\n * Weekday numbers (0 = Sunday … 6 = Saturday) that count as weekend.\n * Defaults to [0, 6]. Override for regions with different work weeks\n * (e.g. [5, 6] for a Friday/Saturday weekend).\n */\n weekendDays?: number[];\n}\n\n/**\n * A calendar that skips weekends (Sat/Sun by default) and any supplied\n * holidays. Day arithmetic is performed in the host's local timezone.\n */\nexport function weekendCalendar(options: WeekendCalendarOptions = {}): BusinessCalendar {\n const weekend = new Set(options.weekendDays ?? [0, 6]);\n const holidays = new Set((options.holidays ?? []).map(dayKey));\n\n const isBusinessDay = (d: Date): boolean => !weekend.has(d.getDay()) && !holidays.has(dayKey(d));\n\n return {\n addBusinessDays(from: Date, days: number): Date {\n if (days <= 0 || Number.isNaN(days)) return new Date(from.getTime());\n\n const whole = Math.floor(days);\n const fraction = days - whole;\n\n const cursor = new Date(from.getTime());\n let remaining = whole;\n // Advance one calendar day at a time, counting only business days.\n while (remaining > 0) {\n cursor.setDate(cursor.getDate() + 1);\n if (isBusinessDay(cursor)) remaining--;\n }\n\n return fraction > 0 ? new Date(cursor.getTime() + fraction * DAY_MS) : cursor;\n },\n };\n}\n\nconst HOUR_MS = 3_600_000;\n\nexport interface BusinessHoursCalendarOptions extends WeekendCalendarOptions {\n /** First working hour of the day, 0-23 in local time. Defaults to 9. */\n workdayStartHour?: number;\n /**\n * Hour at which the working day ends, 0-24 in local time. Defaults to 17.\n * Must be greater than {@link workdayStartHour}.\n */\n workdayEndHour?: number;\n}\n\n/**\n * A calendar that counts only working hours within working days.\n *\n * SLAs in an ERP are quoted in hours far more often than days — \"respond within\n * four working hours\" — and counting those as elapsed clock time makes a\n * request submitted at 16:00 on a Friday overdue before anybody could have\n * looked at it. This advances the clock only through the configured working\n * window, skipping evenings, weekends and holidays.\n *\n * A `from` outside working hours is first moved forward to the next working\n * moment, so a deadline never starts counting from a time nobody was at work.\n *\n * Arithmetic is performed in the host's local timezone, matching\n * {@link weekendCalendar}.\n *\n * @example\n * ```ts\n * const calendar = businessHoursCalendar({ workdayStartHour: 9, workdayEndHour: 17 });\n * // Friday 16:00 + 4 working hours -> Monday 12:00\n * ```\n */\nexport function businessHoursCalendar(\n options: BusinessHoursCalendarOptions = {},\n): Required<Pick<BusinessCalendar, 'addBusinessDays' | 'addBusinessHours'>> {\n const startHour = options.workdayStartHour ?? 9;\n const endHour = options.workdayEndHour ?? 17;\n if (!(endHour > startHour)) {\n throw new Error(\n `businessHoursCalendar: workdayEndHour (${endHour}) must be greater than workdayStartHour (${startHour}).`,\n );\n }\n\n const weekend = new Set(options.weekendDays ?? [0, 6]);\n const holidays = new Set((options.holidays ?? []).map(dayKey));\n const isBusinessDay = (d: Date): boolean => !weekend.has(d.getDay()) && !holidays.has(dayKey(d));\n\n const startOfWorkday = (d: Date): Date => {\n const out = new Date(d.getTime());\n out.setHours(startHour, 0, 0, 0);\n return out;\n };\n const endOfWorkday = (d: Date): Date => {\n const out = new Date(d.getTime());\n out.setHours(endHour, 0, 0, 0);\n return out;\n };\n\n /** Move to the next moment that is inside a working window. */\n const toWorkingMoment = (from: Date): Date => {\n const cursor = new Date(from.getTime());\n for (let guard = 0; guard < 3660; guard++) {\n if (!isBusinessDay(cursor)) {\n cursor.setDate(cursor.getDate() + 1);\n cursor.setHours(startHour, 0, 0, 0);\n continue;\n }\n if (cursor.getTime() < startOfWorkday(cursor).getTime()) return startOfWorkday(cursor);\n if (cursor.getTime() >= endOfWorkday(cursor).getTime()) {\n cursor.setDate(cursor.getDate() + 1);\n cursor.setHours(startHour, 0, 0, 0);\n continue;\n }\n return cursor;\n }\n // Every day for ten years was a holiday; a caller misconfigured the calendar.\n throw new Error(\n 'businessHoursCalendar: no working day found within 10 years of the start date.',\n );\n };\n\n const base = weekendCalendar(options);\n\n return {\n addBusinessDays: base.addBusinessDays,\n\n addBusinessHours(from: Date, hours: number): Date {\n if (hours <= 0 || Number.isNaN(hours)) return new Date(from.getTime());\n\n let cursor = toWorkingMoment(from);\n let remainingMs = Math.round(hours * HOUR_MS);\n\n for (let guard = 0; remainingMs > 0 && guard < 3660; guard++) {\n const dayEnd = endOfWorkday(cursor);\n const availableMs = dayEnd.getTime() - cursor.getTime();\n\n if (remainingMs <= availableMs) {\n return new Date(cursor.getTime() + remainingMs);\n }\n remainingMs -= availableMs;\n // Next working day, from its first working minute.\n const next = new Date(cursor.getTime());\n next.setDate(next.getDate() + 1);\n next.setHours(startHour, 0, 0, 0);\n cursor = toWorkingMoment(next);\n }\n\n throw new Error(\n `businessHoursCalendar: ${hours} working hours could not be scheduled within 10 years — check weekendDays and holidays.`,\n );\n },\n };\n}\n"]}
|