@shipfox/expression 2.2.1 → 2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workflow-context/workflow-context.ts"],"sourcesContent":["import type {WorkflowExpressionEvaluationContext} from '../evaluator/evaluate-workflow-expression.js';\nimport type {ExpressionType, ExpressionTypeEnvironment} from '../expression/workflow-expression.js';\nimport {\n type OutputDeclarations,\n outputDeclarationsToExpressionFields,\n} from '../outputs/output-declarations.js';\n\nexport const workflowContextNames = [\n 'workflow',\n 'run',\n 'trigger',\n 'event',\n 'inputs',\n 'job',\n 'executions',\n 'execution',\n 'jobs',\n 'needs',\n 'steps',\n 'step',\n 'vars',\n 'secrets',\n] as const;\nexport type WorkflowContextName = (typeof workflowContextNames)[number];\n\nexport const availabilitySites = [\n // Server receives an external trigger or manual request before a run row exists.\n 'ingest',\n // Server creates the workflow run and its run-scoped context.\n 'run-creation',\n // Server creates a concrete job execution and its execution-scoped context.\n 'execution-creation',\n // Server activates a queued job after dependencies, matrix expansion, and runner demand are known.\n 'job-activation',\n // Server dispatches a job step to a runner with all server-filled context resolved.\n 'step-dispatch',\n // Server receives a step report and makes step result context available.\n 'step-report',\n // Server resolves one job execution after its steps have settled.\n 'execution-resolution',\n // Server resolves the job after all of its executions are known.\n 'job-resolution',\n] as const;\nexport type AvailabilitySite = (typeof availabilitySites)[number];\n\nexport const runnerFillTarget = 'runner-fill';\nexport type FillTarget = AvailabilitySite | typeof runnerFillTarget;\n\nexport const workflowContextSensitivities = ['persistable', 'ephemeral'] as const;\nexport type WorkflowContextSensitivity = (typeof workflowContextSensitivities)[number];\n\nexport const workflowContextHosts = ['server', 'runner'] as const;\nexport type WorkflowContextHost = (typeof workflowContextHosts)[number];\n\nexport type ReservedRootDefinition =\n | {readonly host: 'server'; readonly availability: AvailabilitySite}\n | {readonly host: 'runner'};\n\nexport const workflowContextReservedRoots = {\n matrix: {host: 'server', availability: 'job-activation'},\n runner: {host: 'runner'},\n} as const satisfies Record<string, ReservedRootDefinition>;\nexport type WorkflowContextReservedRoot = keyof typeof workflowContextReservedRoots;\n\nexport type WorkflowContextShape = 'known' | 'open';\n\nexport interface TypedWorkflowContextDefinition {\n readonly availability: AvailabilitySite;\n readonly sensitivity: WorkflowContextSensitivity;\n readonly host: 'server';\n readonly shape: 'known';\n readonly checkMode: 'typed';\n readonly typeEnvironment: ExpressionTypeEnvironment;\n}\n\nexport interface OpenWorkflowContextDefinition {\n readonly availability: AvailabilitySite;\n readonly sensitivity: WorkflowContextSensitivity;\n readonly host: 'server';\n readonly shape: 'open';\n readonly checkMode: 'syntax';\n readonly literalKeyOnly?: boolean;\n}\n\nexport interface RunnerWorkflowContextDefinition {\n readonly sensitivity: 'ephemeral';\n readonly host: 'runner';\n readonly shape: 'open';\n readonly checkMode: 'syntax';\n readonly literalKeyOnly?: boolean;\n}\n\nexport type WorkflowContextDefinition =\n | TypedWorkflowContextDefinition\n | OpenWorkflowContextDefinition\n | RunnerWorkflowContextDefinition;\n\n// `workflow` holds definition facts and `run` holds instance facts, mirroring\n// the `job` and `execution` pair one level down.\nconst workflowTypeEnvironment = {\n workflow: {\n kind: 'object',\n fields: {\n id: 'string',\n name: 'string',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst runTypeEnvironment = {\n run: {\n kind: 'object',\n fields: {\n id: 'string',\n number: 'int',\n name: 'string',\n project_id: 'string',\n workspace_id: 'string',\n created_at: 'timestamp',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst triggerReferenceFields = {\n project: {\n kind: 'object',\n fields: {id: 'string'},\n },\n repository: 'string',\n ref: 'string',\n commit: 'string',\n} as const;\n\nconst triggerTypeEnvironment = {\n trigger: {\n kind: 'object',\n fields: {\n source: 'string',\n event: 'string',\n ...triggerReferenceFields,\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst jobTypeEnvironment = {\n job: {\n kind: 'object',\n fields: {\n key: 'string',\n name: 'string',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst executionEventType = {\n kind: 'object',\n fields: {\n source: 'string',\n event: 'string',\n delivery_id: 'string',\n received_at: 'timestamp',\n ...triggerReferenceFields,\n data: {\n kind: 'object',\n fields: {},\n },\n },\n} as const;\n\nconst executionType = {\n kind: 'object',\n fields: {\n index: 'int',\n name: 'string',\n status: 'string',\n started_at: 'timestamp',\n finished_at: 'timestamp',\n events: {\n kind: 'list',\n element: executionEventType,\n },\n outputs: {kind: 'map'},\n },\n} as const;\n\nconst executionsTypeEnvironment = {\n executions: {\n kind: 'list',\n element: executionType,\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst executionTypeEnvironment = {\n execution: {\n kind: 'object',\n fields: {\n ...executionType.fields,\n failed: 'bool',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst stepGateType = {\n kind: 'object',\n fields: {\n passed: 'bool',\n source: 'string',\n reason: 'string',\n exit_code: 'int',\n },\n} as const;\n\nconst stepAttemptType = {\n kind: 'object',\n fields: {\n status: 'string',\n exit_code: 'int',\n outputs: {kind: 'map'},\n response: 'string',\n gate: stepGateType,\n },\n} as const;\n\nconst stepEntityType = {\n kind: 'object',\n fields: {\n ...stepAttemptType.fields,\n attempts: {\n kind: 'list',\n element: stepAttemptType,\n },\n },\n} as const;\n\nconst stepDispatchTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n attempt: 'int',\n is_retry: 'bool',\n restart: {\n kind: 'object',\n fields: {\n from: stepEntityType,\n feedback: 'string',\n },\n },\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst stepReportTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n exit_code: 'int',\n status: 'string',\n outputs: {kind: 'map'},\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst stepTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n ...stepDispatchTypeEnvironment.step.fields,\n ...stepReportTypeEnvironment.step.fields,\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\ntype ObjectExpressionType = Extract<ExpressionType, {kind: 'object'}>;\n\nexport interface WorkflowStepTypeOverlay {\n readonly key: string;\n readonly outputs?: OutputDeclarations;\n}\n\nexport interface WorkflowJobTypeOverlay {\n readonly key: string;\n readonly outputs?: Readonly<Record<string, ExpressionType>>;\n}\n\nexport function buildTypedRootsEnvironment(params: {\n readonly steps?: readonly WorkflowStepTypeOverlay[];\n readonly currentStep?: WorkflowStepTypeOverlay;\n readonly jobs?: readonly WorkflowJobTypeOverlay[];\n readonly needs?: readonly WorkflowJobTypeOverlay[];\n}): ExpressionTypeEnvironment {\n return {\n ...(params.steps === undefined ? {} : {steps: stepsRootType(params.steps)}),\n ...(params.currentStep === undefined ? {} : {step: selfStepType(params.currentStep)}),\n ...(params.jobs === undefined ? {} : {jobs: jobsRootType(params.jobs)}),\n ...(params.needs === undefined ? {} : {needs: needsRootType()}),\n };\n}\n\nexport const workflowContextDefinitions = {\n workflow: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: workflowTypeEnvironment,\n },\n run: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: runTypeEnvironment,\n },\n trigger: {\n availability: 'ingest',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: triggerTypeEnvironment,\n },\n event: {\n availability: 'ingest',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n inputs: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n job: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: jobTypeEnvironment,\n },\n executions: {\n availability: 'execution-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: executionsTypeEnvironment,\n },\n execution: {\n availability: 'execution-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: executionTypeEnvironment,\n },\n jobs: {\n availability: 'job-activation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n needs: {\n availability: 'job-activation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: {needs: {kind: 'list', element: jobEntityType({key: '$need'})}},\n },\n steps: {\n availability: 'step-dispatch',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n step: {\n availability: 'step-dispatch',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: stepTypeEnvironment,\n },\n vars: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n literalKeyOnly: true,\n },\n secrets: {\n sensitivity: 'ephemeral',\n host: 'runner',\n shape: 'open',\n checkMode: 'syntax',\n literalKeyOnly: true,\n },\n} as const satisfies Record<WorkflowContextName, WorkflowContextDefinition>;\n\nexport type WorkflowInterpolationField =\n | 'run'\n | 'env.value'\n | 'agent.prompt'\n | 'agent.model'\n | 'agent.provider'\n | 'agent.thinking'\n | 'job.runner'\n | 'job.outputs'\n | 'workflow.run_name'\n | 'job.execution_name'\n | 'step.name'\n | 'step.working_directory'\n | 'step.feedback'\n | 'checkout.project'\n | 'checkout.connection'\n | 'checkout.repository'\n | 'checkout.ref'\n | 'checkout.path';\n\nexport const workflowFieldFailurePolicies = ['fail', 'degrade', 'fail-closed'] as const;\nexport type WorkflowFieldFailurePolicy = (typeof workflowFieldFailurePolicies)[number];\nexport type WorkflowInterpolationFailurePolicy = Exclude<WorkflowFieldFailurePolicy, 'fail-closed'>;\n\nexport interface WorkflowInterpolationFieldPolicy {\n readonly acceptedHosts: readonly WorkflowContextHost[];\n readonly failurePolicy: WorkflowInterpolationFailurePolicy;\n readonly minimumFillTarget?: AvailabilitySite;\n readonly selfReference?: {\n readonly root: WorkflowContextName;\n readonly key: string;\n };\n}\n\nconst serverOnlyHosts: readonly WorkflowContextHost[] = ['server'];\nconst anyHost: readonly WorkflowContextHost[] = ['server', 'runner'];\n\nexport const workflowInterpolationFieldPolicies: Readonly<\n Record<WorkflowInterpolationField, WorkflowInterpolationFieldPolicy>\n> = {\n run: {\n acceptedHosts: anyHost,\n failurePolicy: 'fail',\n },\n 'env.value': {\n acceptedHosts: anyHost,\n failurePolicy: 'fail',\n },\n 'agent.prompt': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'agent.model': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'agent.provider': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'agent.thinking': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'job.runner': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'job.outputs': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n minimumFillTarget: 'execution-resolution',\n },\n 'workflow.run_name': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n minimumFillTarget: 'run-creation',\n selfReference: {root: 'run', key: 'name'},\n },\n 'job.execution_name': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n minimumFillTarget: 'execution-creation',\n selfReference: {root: 'execution', key: 'name'},\n },\n 'step.name': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n },\n 'step.working_directory': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'step.feedback': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.project': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.connection': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.repository': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.ref': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.path': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n};\n\nexport const workflowInterpolationFields = Object.keys(\n workflowInterpolationFieldPolicies,\n) as readonly WorkflowInterpolationField[];\n\nexport const workflowPredicateFields = [\n 'step.success',\n 'job.success',\n 'trigger.filter',\n 'listener.on',\n 'listener.until',\n 'job.if',\n 'step.if',\n] as const;\nexport type WorkflowPredicateField = (typeof workflowPredicateFields)[number];\n\nconst listenerPredicateContextRoots = [\n 'event',\n 'workflow',\n 'run',\n 'trigger',\n 'inputs',\n 'vars',\n 'job',\n 'jobs',\n] as const satisfies readonly WorkflowContextName[];\n\n/**\n * The roots that the runtime passes to each server-evaluated predicate.\n *\n * This is intentionally narrower than lifecycle availability. A root can\n * exist by the time a predicate runs and still not belong to that predicate's\n * evaluation context.\n */\nexport const workflowPredicateContextRoots = {\n 'step.success': ['step', 'vars'],\n 'job.success': ['executions', 'jobs', 'vars'],\n 'trigger.filter': ['event', 'trigger'],\n 'listener.on': listenerPredicateContextRoots,\n 'listener.until': listenerPredicateContextRoots,\n 'job.if': ['workflow', 'run', 'trigger', 'event', 'inputs', 'vars', 'jobs', 'needs'],\n 'step.if': ['vars', 'jobs', 'execution', 'step', 'steps'],\n} as const satisfies Record<WorkflowPredicateField, readonly WorkflowContextName[]>;\n\nexport type WorkflowPredicateContextRoot<\n Field extends WorkflowPredicateField = WorkflowPredicateField,\n> = (typeof workflowPredicateContextRoots)[Field][number];\n\nexport const workflowPredicateFieldFailurePolicy =\n 'fail-closed' as const satisfies WorkflowFieldFailurePolicy;\n\nconst workflowPredicateFieldMinimumFillTargets = {\n 'step.success': 'step-report',\n 'job.success': 'job-resolution',\n 'trigger.filter': 'ingest',\n 'listener.on': 'job-activation',\n 'listener.until': 'job-activation',\n 'job.if': 'job-activation',\n 'step.if': 'step-dispatch',\n} as const satisfies Record<WorkflowPredicateField, AvailabilitySite>;\n\nconst workflowPredicateFieldTypeEnvironments: Partial<\n Record<WorkflowPredicateField, ExpressionTypeEnvironment>\n> = {\n 'step.success': stepReportTypeEnvironment,\n 'step.if': stepDispatchTypeEnvironment,\n};\n\nexport function getWorkflowContextDefinition(name: WorkflowContextName): WorkflowContextDefinition {\n return workflowContextDefinitions[name];\n}\n\nexport function getWorkflowContextAvailability(\n name: WorkflowContextName,\n): AvailabilitySite | undefined {\n const definition = workflowContextDefinitions[name];\n return definition.host === 'server' ? definition.availability : undefined;\n}\n\nexport function getWorkflowContextHost(name: WorkflowContextName): WorkflowContextHost {\n return workflowContextDefinitions[name].host;\n}\n\nexport function resolveContextRootHost(root: string): WorkflowContextHost | undefined {\n if (isWorkflowContextName(root)) return workflowContextDefinitions[root].host;\n if (isWorkflowContextReservedRoot(root)) return workflowContextReservedRoots[root].host;\n return undefined;\n}\n\nexport function resolveContextRootAvailability(root: string): AvailabilitySite | undefined {\n if (isWorkflowContextName(root)) {\n const definition = workflowContextDefinitions[root];\n return definition.host === 'server' ? definition.availability : undefined;\n }\n\n if (!isWorkflowContextReservedRoot(root)) return undefined;\n const reservedRoot = workflowContextReservedRoots[root];\n return reservedRoot.host === 'server' ? reservedRoot.availability : undefined;\n}\n\nexport function getWorkflowContextSensitivity(\n name: WorkflowContextName,\n): WorkflowContextSensitivity {\n return workflowContextDefinitions[name].sensitivity;\n}\n\nexport function rootsAvailableAt(site: AvailabilitySite): readonly WorkflowContextName[] {\n const targetSiteIndex = availabilitySites.indexOf(site);\n return workflowContextNames.filter((name) => {\n const definition = workflowContextDefinitions[name];\n return (\n definition.host === 'server' &&\n availabilitySites.indexOf(definition.availability) <= targetSiteIndex\n );\n });\n}\n\nexport function unavailableRootsAt(\n roots: readonly WorkflowContextName[],\n site: AvailabilitySite,\n): readonly WorkflowContextName[] {\n const availableRoots = new Set(rootsAvailableAt(site));\n return roots.filter((root) => !availableRoots.has(root));\n}\n\nexport function getWorkflowContextTypeEnvironment(\n name: WorkflowContextName,\n): ExpressionTypeEnvironment | undefined {\n const context = getWorkflowContextDefinition(name);\n return context.shape === 'known' ? context.typeEnvironment : undefined;\n}\n\nexport function workflowInterpolationFieldAcceptsHost(\n field: WorkflowInterpolationField,\n host: WorkflowContextHost,\n): boolean {\n return workflowInterpolationFieldPolicies[field].acceptedHosts.includes(host);\n}\n\nexport function workflowContextRootRequiresLiteralKey(root: string): boolean {\n if (!isWorkflowContextName(root)) return false;\n const definition = workflowContextDefinitions[root];\n return 'literalKeyOnly' in definition && definition.literalKeyOnly === true;\n}\n\nexport function getWorkflowInterpolationFieldFailurePolicy(\n field: WorkflowInterpolationField,\n): WorkflowInterpolationFailurePolicy {\n return workflowInterpolationFieldPolicies[field].failurePolicy;\n}\n\nexport function getWorkflowInterpolationFieldSelfReference(\n field: WorkflowInterpolationField,\n): WorkflowInterpolationFieldPolicy['selfReference'] {\n return workflowInterpolationFieldPolicies[field].selfReference;\n}\n\nexport function getWorkflowInterpolationFieldMinimumFillTarget(\n field: WorkflowInterpolationField,\n): AvailabilitySite | undefined {\n const policy = workflowInterpolationFieldPolicies[field];\n return 'minimumFillTarget' in policy ? policy.minimumFillTarget : undefined;\n}\n\nexport function getWorkflowPredicateFieldMinimumFillTarget(\n field: WorkflowPredicateField,\n): AvailabilitySite {\n return workflowPredicateFieldMinimumFillTargets[field];\n}\n\nexport function getWorkflowPredicateFieldTypeEnvironment(\n field: WorkflowPredicateField,\n root: WorkflowContextName,\n): ExpressionTypeEnvironment | undefined {\n const typeEnvironment: ExpressionTypeEnvironment | undefined =\n workflowPredicateFieldTypeEnvironments[field];\n if (typeEnvironment === undefined) return getWorkflowContextTypeEnvironment(root);\n const rootType = typeEnvironment[root];\n return rootType === undefined ? getWorkflowContextTypeEnvironment(root) : {[root]: rootType};\n}\n\nexport function getWorkflowPredicateContextRoots<Field extends WorkflowPredicateField>(\n field: Field,\n): readonly WorkflowPredicateContextRoot<Field>[] {\n return workflowPredicateContextRoots[field];\n}\n\n/**\n * The roots a field can read, whichever kind of field it is.\n *\n * A predicate has an enumerated contract because the runtime assembles one\n * context for it. A template has no single context: each reference is filled\n * where its data arrives, so its only field-level constraint is which host can\n * resolve it. Callers that document or check fields should use this instead of\n * choosing a mechanism themselves.\n */\nexport function contextRootsForField(\n field: WorkflowPredicateField | WorkflowInterpolationField,\n): readonly WorkflowContextName[] {\n if (isWorkflowPredicateField(field)) return workflowPredicateContextRoots[field];\n\n const {acceptedHosts} = workflowInterpolationFieldPolicies[field];\n return workflowContextNames.filter((name) =>\n acceptedHosts.includes(workflowContextDefinitions[name].host),\n );\n}\n\nexport function isWorkflowPredicateField(field: string): field is WorkflowPredicateField {\n return (workflowPredicateFields as readonly string[]).includes(field);\n}\n\nexport function projectWorkflowPredicateContext(\n field: WorkflowPredicateField,\n context: WorkflowExpressionEvaluationContext,\n): WorkflowExpressionEvaluationContext {\n const roots = new Set(getWorkflowPredicateContextRoots(field));\n return Object.fromEntries(\n Object.entries(context).filter(([root]) => roots.has(root as WorkflowPredicateContextRoot)),\n );\n}\n\nexport interface WorkflowContextAvailabilityReferenceEntry {\n readonly root: WorkflowContextName | WorkflowContextReservedRoot;\n readonly availability?: AvailabilitySite;\n readonly reserved: boolean;\n readonly availableAt: Readonly<Record<AvailabilitySite, boolean>>;\n}\n\nexport function workflowContextAvailabilityReference(): readonly WorkflowContextAvailabilityReferenceEntry[] {\n return [\n ...workflowContextNames.map((root) => {\n const definition = workflowContextDefinitions[root];\n if (definition.host === 'runner') return noServerAvailabilityReferenceEntry(root, false);\n return availabilityReferenceEntry(root, definition.availability, false);\n }),\n ...Object.entries(workflowContextReservedRoots).map(([root, definition]) => {\n if (definition.host === 'runner') {\n return noServerAvailabilityReferenceEntry(root as WorkflowContextReservedRoot, true);\n }\n return availabilityReferenceEntry(\n root as WorkflowContextReservedRoot,\n definition.availability,\n true,\n );\n }),\n ];\n}\n\nfunction availabilityReferenceEntry(\n root: WorkflowContextName | WorkflowContextReservedRoot,\n availability: AvailabilitySite,\n reserved: boolean,\n): WorkflowContextAvailabilityReferenceEntry {\n const availabilityIndex = availabilitySites.indexOf(availability);\n const availableAt = Object.fromEntries(\n availabilitySites.map((site) => [site, availabilitySites.indexOf(site) >= availabilityIndex]),\n ) as Record<AvailabilitySite, boolean>;\n\n return {root, availability, reserved, availableAt};\n}\n\nfunction noServerAvailabilityReferenceEntry(\n root: WorkflowContextName | WorkflowContextReservedRoot,\n reserved: boolean,\n): WorkflowContextAvailabilityReferenceEntry {\n const availableAt = Object.fromEntries(availabilitySites.map((site) => [site, false])) as Record<\n AvailabilitySite,\n boolean\n >;\n\n return {root, reserved, availableAt};\n}\n\nfunction stepsRootType(steps: readonly WorkflowStepTypeOverlay[]): ExpressionType {\n return {\n kind: 'object',\n fields: Object.fromEntries(steps.map((step) => [step.key, stepEntityTypeForStep(step)])),\n };\n}\n\nfunction stepEntityTypeForStep(step: WorkflowStepTypeOverlay): ExpressionType {\n const attemptType = stepAttemptTypeForOutputs(outputsTypeForStep(step));\n return {\n kind: 'object',\n fields: {\n ...attemptType.fields,\n attempts: {\n kind: 'list',\n element: attemptType,\n },\n },\n };\n}\n\nfunction selfStepType(step: WorkflowStepTypeOverlay): ExpressionType {\n return {\n kind: 'object',\n fields: {\n ...stepTypeEnvironment.step.fields,\n outputs: outputsTypeForStep(step),\n },\n };\n}\n\nfunction stepAttemptTypeForOutputs(outputs: ExpressionType): ObjectExpressionType {\n return {\n kind: 'object',\n fields: {\n ...stepAttemptType.fields,\n outputs,\n },\n };\n}\n\nfunction outputsTypeForStep(step: WorkflowStepTypeOverlay): ExpressionType {\n if (step.outputs === undefined) return {kind: 'map'};\n return {kind: 'object', fields: outputDeclarationsToExpressionFields(step.outputs)};\n}\n\nfunction jobsRootType(jobs: readonly WorkflowJobTypeOverlay[]): ExpressionType {\n return {\n kind: 'object',\n fields: Object.fromEntries(jobs.map((job) => [job.key, jobEntityType(job)])),\n };\n}\n\nfunction needsRootType(): ExpressionType {\n return {\n kind: 'list',\n element: jobEntityTypeForNeeds(),\n };\n}\n\nfunction jobEntityTypeForNeeds(): ExpressionType {\n return {\n kind: 'object',\n fields: {\n key: 'string',\n status: 'string',\n outputs: {kind: 'map'},\n executions: {\n kind: 'list',\n element: executionTypeWithOutputs({kind: 'map'}),\n },\n },\n };\n}\n\nfunction jobEntityType(job: WorkflowJobTypeOverlay): ExpressionType {\n const outputs = jobOutputsType(job);\n const execution = executionTypeWithOutputs(outputs);\n return {\n kind: 'object',\n fields: {\n key: 'string',\n status: 'string',\n outputs,\n executions: {\n kind: 'list',\n element: execution,\n },\n },\n };\n}\n\nfunction jobOutputsType(job: WorkflowJobTypeOverlay): ExpressionType {\n return job.outputs === undefined\n ? ({kind: 'map'} as const satisfies ExpressionType)\n : ({kind: 'object', fields: job.outputs} as const satisfies ExpressionType);\n}\n\nfunction executionTypeWithOutputs(outputs: ExpressionType): ExpressionType {\n return {\n kind: 'object',\n fields: {\n ...executionType.fields,\n outputs,\n },\n };\n}\n\nfunction isWorkflowContextName(root: string): root is WorkflowContextName {\n return Object.hasOwn(workflowContextDefinitions, root);\n}\n\nfunction isWorkflowContextReservedRoot(root: string): root is WorkflowContextReservedRoot {\n return Object.hasOwn(workflowContextReservedRoots, root);\n}\n"],"names":["outputDeclarationsToExpressionFields","workflowContextNames","availabilitySites","runnerFillTarget","workflowContextSensitivities","workflowContextHosts","workflowContextReservedRoots","matrix","host","availability","runner","workflowTypeEnvironment","workflow","kind","fields","id","name","runTypeEnvironment","run","number","project_id","workspace_id","created_at","triggerReferenceFields","project","repository","ref","commit","triggerTypeEnvironment","trigger","source","event","jobTypeEnvironment","job","key","executionEventType","delivery_id","received_at","data","executionType","index","status","started_at","finished_at","events","element","outputs","executionsTypeEnvironment","executions","executionTypeEnvironment","execution","failed","stepGateType","passed","reason","exit_code","stepAttemptType","response","gate","stepEntityType","attempts","stepDispatchTypeEnvironment","step","attempt","is_retry","restart","from","feedback","stepReportTypeEnvironment","stepTypeEnvironment","buildTypedRootsEnvironment","params","steps","undefined","stepsRootType","currentStep","selfStepType","jobs","jobsRootType","needs","needsRootType","workflowContextDefinitions","sensitivity","shape","checkMode","typeEnvironment","inputs","jobEntityType","vars","literalKeyOnly","secrets","workflowFieldFailurePolicies","serverOnlyHosts","anyHost","workflowInterpolationFieldPolicies","acceptedHosts","failurePolicy","minimumFillTarget","selfReference","root","workflowInterpolationFields","Object","keys","workflowPredicateFields","listenerPredicateContextRoots","workflowPredicateContextRoots","workflowPredicateFieldFailurePolicy","workflowPredicateFieldMinimumFillTargets","workflowPredicateFieldTypeEnvironments","getWorkflowContextDefinition","getWorkflowContextAvailability","definition","getWorkflowContextHost","resolveContextRootHost","isWorkflowContextName","isWorkflowContextReservedRoot","resolveContextRootAvailability","reservedRoot","getWorkflowContextSensitivity","rootsAvailableAt","site","targetSiteIndex","indexOf","filter","unavailableRootsAt","roots","availableRoots","Set","has","getWorkflowContextTypeEnvironment","context","workflowInterpolationFieldAcceptsHost","field","includes","workflowContextRootRequiresLiteralKey","getWorkflowInterpolationFieldFailurePolicy","getWorkflowInterpolationFieldSelfReference","getWorkflowInterpolationFieldMinimumFillTarget","policy","getWorkflowPredicateFieldMinimumFillTarget","getWorkflowPredicateFieldTypeEnvironment","rootType","getWorkflowPredicateContextRoots","contextRootsForField","isWorkflowPredicateField","projectWorkflowPredicateContext","fromEntries","entries","workflowContextAvailabilityReference","map","noServerAvailabilityReferenceEntry","availabilityReferenceEntry","reserved","availabilityIndex","availableAt","stepEntityTypeForStep","attemptType","stepAttemptTypeForOutputs","outputsTypeForStep","jobEntityTypeForNeeds","executionTypeWithOutputs","jobOutputsType","hasOwn"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/workflow-context/workflow-context.ts"],"sourcesContent":["import type {WorkflowExpressionEvaluationContext} from '../evaluator/evaluate-workflow-expression.js';\nimport type {ExpressionType, ExpressionTypeEnvironment} from '../expression/workflow-expression.js';\nimport {\n jsonSchemaToExpressionType,\n type OutputDeclarations,\n outputDeclarationsToExpressionFields,\n} from '../outputs/output-declarations.js';\n\nexport const workflowContextNames = [\n 'workflow',\n 'run',\n 'trigger',\n 'event',\n 'inputs',\n 'job',\n 'executions',\n 'execution',\n 'jobs',\n 'needs',\n 'steps',\n 'step',\n 'vars',\n 'secrets',\n] as const;\nexport type WorkflowContextName = (typeof workflowContextNames)[number];\n\nexport const availabilitySites = [\n // Server receives an external trigger or manual request before a run row exists.\n 'ingest',\n // Server creates the workflow run and its run-scoped context.\n 'run-creation',\n // Server creates a concrete job execution and its execution-scoped context.\n 'execution-creation',\n // Server activates a queued job after dependencies, matrix expansion, and runner demand are known.\n 'job-activation',\n // Server dispatches a job step to a runner with all server-filled context resolved.\n 'step-dispatch',\n // Server receives a step report and makes step result context available.\n 'step-report',\n // Server resolves one job execution after its steps have settled.\n 'execution-resolution',\n // Server resolves the job after all of its executions are known.\n 'job-resolution',\n] as const;\nexport type AvailabilitySite = (typeof availabilitySites)[number];\n\nexport const runnerFillTarget = 'runner-fill';\nexport type FillTarget = AvailabilitySite | typeof runnerFillTarget;\n\nexport const workflowContextSensitivities = ['persistable', 'ephemeral'] as const;\nexport type WorkflowContextSensitivity = (typeof workflowContextSensitivities)[number];\n\nexport const workflowContextHosts = ['server', 'runner'] as const;\nexport type WorkflowContextHost = (typeof workflowContextHosts)[number];\n\nexport type ReservedRootDefinition =\n | {readonly host: 'server'; readonly availability: AvailabilitySite}\n | {readonly host: 'runner'};\n\nexport const workflowContextReservedRoots = {\n matrix: {host: 'server', availability: 'job-activation'},\n runner: {host: 'runner'},\n // The result of a tool step call; readable only from `tool.outputs` mappings.\n result: {host: 'server', availability: 'step-report'},\n} as const satisfies Record<string, ReservedRootDefinition>;\nexport type WorkflowContextReservedRoot = keyof typeof workflowContextReservedRoots;\n\nexport type WorkflowContextShape = 'known' | 'open';\n\nexport interface TypedWorkflowContextDefinition {\n readonly availability: AvailabilitySite;\n readonly sensitivity: WorkflowContextSensitivity;\n readonly host: 'server';\n readonly shape: 'known';\n readonly checkMode: 'typed';\n readonly typeEnvironment: ExpressionTypeEnvironment;\n}\n\nexport interface OpenWorkflowContextDefinition {\n readonly availability: AvailabilitySite;\n readonly sensitivity: WorkflowContextSensitivity;\n readonly host: 'server';\n readonly shape: 'open';\n readonly checkMode: 'syntax';\n readonly literalKeyOnly?: boolean;\n}\n\nexport interface RunnerWorkflowContextDefinition {\n readonly sensitivity: 'ephemeral';\n readonly host: 'runner';\n readonly shape: 'open';\n readonly checkMode: 'syntax';\n readonly literalKeyOnly?: boolean;\n}\n\nexport type WorkflowContextDefinition =\n | TypedWorkflowContextDefinition\n | OpenWorkflowContextDefinition\n | RunnerWorkflowContextDefinition;\n\n// `workflow` holds definition facts and `run` holds instance facts, mirroring\n// the `job` and `execution` pair one level down.\nconst workflowTypeEnvironment = {\n workflow: {\n kind: 'object',\n fields: {\n id: 'string',\n name: 'string',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst runTypeEnvironment = {\n run: {\n kind: 'object',\n fields: {\n id: 'string',\n number: 'int',\n name: 'string',\n project_id: 'string',\n workspace_id: 'string',\n created_at: 'timestamp',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst triggerReferenceFields = {\n project: {\n kind: 'object',\n fields: {id: 'string'},\n },\n repository: 'string',\n ref: 'string',\n commit: 'string',\n} as const;\n\nconst triggerTypeEnvironment = {\n trigger: {\n kind: 'object',\n fields: {\n source: 'string',\n event: 'string',\n ...triggerReferenceFields,\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst jobTypeEnvironment = {\n job: {\n kind: 'object',\n fields: {\n key: 'string',\n name: 'string',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst executionEventType = {\n kind: 'object',\n fields: {\n source: 'string',\n event: 'string',\n delivery_id: 'string',\n received_at: 'timestamp',\n ...triggerReferenceFields,\n data: {\n kind: 'map',\n },\n },\n} as const;\n\nconst executionType = {\n kind: 'object',\n fields: {\n index: 'int',\n name: 'string',\n status: 'string',\n started_at: 'timestamp',\n finished_at: 'timestamp',\n events: {\n kind: 'list',\n element: executionEventType,\n },\n outputs: {kind: 'map'},\n },\n} as const;\n\nconst executionsTypeEnvironment = {\n executions: {\n kind: 'list',\n element: executionType,\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst executionTypeEnvironment = {\n execution: {\n kind: 'object',\n fields: {\n ...executionType.fields,\n failed: 'bool',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst stepGateType = {\n kind: 'object',\n fields: {\n passed: 'bool',\n source: 'string',\n reason: 'string',\n exit_code: 'int',\n },\n} as const;\n\nconst toolStepGateType = {\n kind: 'object',\n fields: {\n passed: 'bool',\n source: 'string',\n reason: 'string',\n },\n} as const;\n\nconst stepAttemptType = {\n kind: 'object',\n fields: {\n status: 'string',\n exit_code: 'int',\n outputs: {kind: 'map'},\n response: 'string',\n gate: stepGateType,\n },\n} as const;\n\nconst stepEntityType = {\n kind: 'object',\n fields: {\n ...stepAttemptType.fields,\n attempts: {\n kind: 'list',\n element: stepAttemptType,\n },\n },\n} as const;\n\nconst stepDispatchTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n attempt: 'int',\n is_retry: 'bool',\n restart: {\n kind: 'object',\n fields: {\n from: stepEntityType,\n feedback: 'string',\n },\n },\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst stepReportTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n exit_code: 'int',\n status: 'string',\n outputs: {kind: 'map'},\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\n/**\n * Gate context for a tool step: `status` and `outputs`, with no `exit_code`\n * because a tool step never reports one.\n */\nexport const toolStepReportTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n status: 'string',\n outputs: {kind: 'map'},\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\n// A tool step never reports an exit code: the call outcome is the attempt\n// status, and the gate context of a tool step reads `status` and `outputs` only.\nconst toolStepAttemptType = {\n kind: 'object',\n fields: {\n status: 'string',\n outputs: {kind: 'map'},\n response: 'string',\n gate: toolStepGateType,\n },\n} as const;\n\n// The self root of a tool step drops `exit_code` from the shared step fields.\nconst toolStepSelfTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n ...stepDispatchTypeEnvironment.step.fields,\n status: 'string',\n outputs: {kind: 'map'},\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst stepTypeEnvironment = {\n step: {\n kind: 'object',\n fields: {\n ...stepDispatchTypeEnvironment.step.fields,\n ...stepReportTypeEnvironment.step.fields,\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\ntype ObjectExpressionType = Extract<ExpressionType, {kind: 'object'}>;\n\nexport type WorkflowStepKind = 'run' | 'agent' | 'checkout' | 'tool';\n\nexport interface WorkflowStepTypeOverlay {\n readonly key: string;\n readonly kind?: WorkflowStepKind;\n readonly outputs?: OutputDeclarations;\n /**\n * Catalog output schema of a tool step. Types the implicit `result` output\n * that every tool step exposes, merged with the inferred mapped outputs.\n */\n readonly outputSchema?: unknown;\n}\n\nexport interface WorkflowJobTypeOverlay {\n readonly key: string;\n readonly outputs?: Readonly<Record<string, ExpressionType>>;\n}\n\nexport function buildTypedRootsEnvironment(params: {\n readonly steps?: readonly WorkflowStepTypeOverlay[];\n readonly currentStep?: WorkflowStepTypeOverlay;\n readonly jobs?: readonly WorkflowJobTypeOverlay[];\n readonly needs?: readonly WorkflowJobTypeOverlay[];\n}): ExpressionTypeEnvironment {\n return {\n ...(params.steps === undefined ? {} : {steps: stepsRootType(params.steps)}),\n ...(params.currentStep === undefined ? {} : {step: selfStepType(params.currentStep)}),\n ...(params.jobs === undefined ? {} : {jobs: jobsRootType(params.jobs)}),\n ...(params.needs === undefined ? {} : {needs: needsRootType()}),\n };\n}\n\nexport const workflowContextDefinitions = {\n workflow: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: workflowTypeEnvironment,\n },\n run: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: runTypeEnvironment,\n },\n trigger: {\n availability: 'ingest',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: triggerTypeEnvironment,\n },\n event: {\n availability: 'ingest',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n inputs: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n job: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: jobTypeEnvironment,\n },\n executions: {\n availability: 'execution-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: executionsTypeEnvironment,\n },\n execution: {\n availability: 'execution-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: executionTypeEnvironment,\n },\n jobs: {\n availability: 'job-activation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n needs: {\n availability: 'job-activation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: {needs: {kind: 'list', element: jobEntityType({key: '$need'})}},\n },\n steps: {\n availability: 'step-dispatch',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n step: {\n availability: 'step-dispatch',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: stepTypeEnvironment,\n },\n vars: {\n availability: 'run-creation',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n literalKeyOnly: true,\n },\n secrets: {\n sensitivity: 'ephemeral',\n host: 'runner',\n shape: 'open',\n checkMode: 'syntax',\n literalKeyOnly: true,\n },\n} as const satisfies Record<WorkflowContextName, WorkflowContextDefinition>;\n\nexport type WorkflowInterpolationField =\n | 'run'\n | 'env.value'\n | 'agent.prompt'\n | 'agent.model'\n | 'agent.provider'\n | 'agent.thinking'\n | 'job.runner'\n | 'job.outputs'\n | 'workflow.run_name'\n | 'job.execution_name'\n | 'step.name'\n | 'step.working_directory'\n | 'step.feedback'\n | 'checkout.project'\n | 'checkout.connection'\n | 'checkout.repository'\n | 'checkout.ref'\n | 'checkout.path'\n | 'tool.with'\n | 'tool.outputs';\n\nexport const workflowFieldFailurePolicies = ['fail', 'degrade', 'fail-closed'] as const;\nexport type WorkflowFieldFailurePolicy = (typeof workflowFieldFailurePolicies)[number];\nexport type WorkflowInterpolationFailurePolicy = Exclude<WorkflowFieldFailurePolicy, 'fail-closed'>;\n\nexport interface WorkflowInterpolationFieldPolicy {\n readonly acceptedHosts: readonly WorkflowContextHost[];\n readonly failurePolicy: WorkflowInterpolationFailurePolicy;\n readonly minimumFillTarget?: AvailabilitySite;\n readonly selfReference?: {\n readonly root: WorkflowContextName;\n readonly key: string;\n };\n /**\n * Explicit root enumeration for fields whose references are not just\n * host-constrained, such as `tool.outputs` with its reserved `result` root.\n * When present, callers should use this instead of the accepted-hosts filter.\n */\n readonly roots?: readonly (WorkflowContextName | WorkflowContextReservedRoot)[];\n}\n\nconst serverOnlyHosts: readonly WorkflowContextHost[] = ['server'];\nconst anyHost: readonly WorkflowContextHost[] = ['server', 'runner'];\n\nexport const workflowInterpolationFieldPolicies: Readonly<\n Record<WorkflowInterpolationField, WorkflowInterpolationFieldPolicy>\n> = {\n run: {\n acceptedHosts: anyHost,\n failurePolicy: 'fail',\n },\n 'env.value': {\n acceptedHosts: anyHost,\n failurePolicy: 'fail',\n },\n 'agent.prompt': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'agent.model': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'agent.provider': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'agent.thinking': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'job.runner': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'job.outputs': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n minimumFillTarget: 'execution-resolution',\n },\n 'workflow.run_name': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n minimumFillTarget: 'run-creation',\n selfReference: {root: 'run', key: 'name'},\n },\n 'job.execution_name': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n minimumFillTarget: 'execution-creation',\n selfReference: {root: 'execution', key: 'name'},\n },\n 'step.name': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n },\n 'step.working_directory': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'step.feedback': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.project': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.connection': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.repository': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.ref': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'checkout.path': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n },\n 'tool.with': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n minimumFillTarget: 'step-dispatch',\n },\n 'tool.outputs': {\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n minimumFillTarget: 'step-report',\n roots: ['result', 'vars'],\n },\n};\n\nexport const workflowInterpolationFields = Object.keys(\n workflowInterpolationFieldPolicies,\n) as readonly WorkflowInterpolationField[];\n\nexport const workflowPredicateFields = [\n 'step.success',\n 'job.success',\n 'trigger.filter',\n 'listener.on',\n 'listener.until',\n 'job.if',\n 'step.if',\n] as const;\nexport type WorkflowPredicateField = (typeof workflowPredicateFields)[number];\n\nconst listenerPredicateContextRoots = [\n 'event',\n 'workflow',\n 'run',\n 'trigger',\n 'inputs',\n 'vars',\n 'job',\n 'jobs',\n] as const satisfies readonly WorkflowContextName[];\n\n/**\n * The roots that the runtime passes to each server-evaluated predicate.\n *\n * This is intentionally narrower than lifecycle availability. A root can\n * exist by the time a predicate runs and still not belong to that predicate's\n * evaluation context.\n */\nexport const workflowPredicateContextRoots = {\n 'step.success': ['step', 'vars'],\n 'job.success': ['executions', 'jobs', 'vars'],\n 'trigger.filter': ['event', 'trigger'],\n 'listener.on': listenerPredicateContextRoots,\n 'listener.until': listenerPredicateContextRoots,\n 'job.if': ['workflow', 'run', 'trigger', 'event', 'inputs', 'vars', 'jobs', 'needs'],\n 'step.if': ['vars', 'jobs', 'execution', 'step', 'steps'],\n} as const satisfies Record<WorkflowPredicateField, readonly WorkflowContextName[]>;\n\nexport type WorkflowPredicateContextRoot<\n Field extends WorkflowPredicateField = WorkflowPredicateField,\n> = (typeof workflowPredicateContextRoots)[Field][number];\n\nexport const workflowPredicateFieldFailurePolicy =\n 'fail-closed' as const satisfies WorkflowFieldFailurePolicy;\n\nconst workflowPredicateFieldMinimumFillTargets = {\n 'step.success': 'step-report',\n 'job.success': 'job-resolution',\n 'trigger.filter': 'ingest',\n 'listener.on': 'job-activation',\n 'listener.until': 'job-activation',\n 'job.if': 'job-activation',\n 'step.if': 'step-dispatch',\n} as const satisfies Record<WorkflowPredicateField, AvailabilitySite>;\n\nconst workflowPredicateFieldTypeEnvironments: Partial<\n Record<WorkflowPredicateField, ExpressionTypeEnvironment>\n> = {\n 'step.success': stepReportTypeEnvironment,\n 'step.if': stepDispatchTypeEnvironment,\n};\n\nexport function getWorkflowContextDefinition(name: WorkflowContextName): WorkflowContextDefinition {\n return workflowContextDefinitions[name];\n}\n\nexport function getWorkflowContextAvailability(\n name: WorkflowContextName,\n): AvailabilitySite | undefined {\n const definition = workflowContextDefinitions[name];\n return definition.host === 'server' ? definition.availability : undefined;\n}\n\nexport function getWorkflowContextHost(name: WorkflowContextName): WorkflowContextHost {\n return workflowContextDefinitions[name].host;\n}\n\nexport function resolveContextRootHost(root: string): WorkflowContextHost | undefined {\n if (isWorkflowContextName(root)) return workflowContextDefinitions[root].host;\n if (isWorkflowContextReservedRoot(root)) return workflowContextReservedRoots[root].host;\n return undefined;\n}\n\nexport function resolveContextRootAvailability(root: string): AvailabilitySite | undefined {\n if (isWorkflowContextName(root)) {\n const definition = workflowContextDefinitions[root];\n return definition.host === 'server' ? definition.availability : undefined;\n }\n\n if (!isWorkflowContextReservedRoot(root)) return undefined;\n const reservedRoot = workflowContextReservedRoots[root];\n return reservedRoot.host === 'server' ? reservedRoot.availability : undefined;\n}\n\nexport function getWorkflowContextSensitivity(\n name: WorkflowContextName,\n): WorkflowContextSensitivity {\n return workflowContextDefinitions[name].sensitivity;\n}\n\nexport function rootsAvailableAt(site: AvailabilitySite): readonly WorkflowContextName[] {\n const targetSiteIndex = availabilitySites.indexOf(site);\n return workflowContextNames.filter((name) => {\n const definition = workflowContextDefinitions[name];\n return (\n definition.host === 'server' &&\n availabilitySites.indexOf(definition.availability) <= targetSiteIndex\n );\n });\n}\n\nexport function unavailableRootsAt(\n roots: readonly (WorkflowContextName | WorkflowContextReservedRoot)[],\n site: AvailabilitySite,\n): readonly (WorkflowContextName | WorkflowContextReservedRoot)[] {\n const targetSiteIndex = availabilitySites.indexOf(site);\n return roots.filter((root) => {\n const availability = resolveContextRootAvailability(root);\n return availability === undefined || availabilitySites.indexOf(availability) > targetSiteIndex;\n });\n}\n\nexport function getWorkflowContextTypeEnvironment(\n name: WorkflowContextName,\n): ExpressionTypeEnvironment | undefined {\n const context = getWorkflowContextDefinition(name);\n return context.shape === 'known' ? context.typeEnvironment : undefined;\n}\n\nexport function getWorkflowInterpolationFieldTypeEnvironment(\n field: WorkflowInterpolationField,\n root: WorkflowContextName | WorkflowContextReservedRoot,\n): ExpressionTypeEnvironment | undefined {\n if (field === 'tool.with' && root === 'step') return stepDispatchTypeEnvironment;\n if (!isWorkflowContextName(root)) return undefined;\n return getWorkflowContextTypeEnvironment(root);\n}\n\nexport function workflowInterpolationFieldAcceptsHost(\n field: WorkflowInterpolationField,\n host: WorkflowContextHost,\n): boolean {\n return workflowInterpolationFieldPolicies[field].acceptedHosts.includes(host);\n}\n\nexport function workflowContextRootRequiresLiteralKey(root: string): boolean {\n if (!isWorkflowContextName(root)) return false;\n const definition = workflowContextDefinitions[root];\n return 'literalKeyOnly' in definition && definition.literalKeyOnly === true;\n}\n\nexport function getWorkflowInterpolationFieldFailurePolicy(\n field: WorkflowInterpolationField,\n): WorkflowInterpolationFailurePolicy {\n return workflowInterpolationFieldPolicies[field].failurePolicy;\n}\n\nexport function getWorkflowInterpolationFieldSelfReference(\n field: WorkflowInterpolationField,\n): WorkflowInterpolationFieldPolicy['selfReference'] {\n return workflowInterpolationFieldPolicies[field].selfReference;\n}\n\nexport function getWorkflowInterpolationFieldMinimumFillTarget(\n field: WorkflowInterpolationField,\n): AvailabilitySite | undefined {\n const policy = workflowInterpolationFieldPolicies[field];\n return 'minimumFillTarget' in policy ? policy.minimumFillTarget : undefined;\n}\n\nexport function getWorkflowPredicateFieldMinimumFillTarget(\n field: WorkflowPredicateField,\n): AvailabilitySite {\n return workflowPredicateFieldMinimumFillTargets[field];\n}\n\nexport function getWorkflowPredicateFieldTypeEnvironment(\n field: WorkflowPredicateField,\n root: WorkflowContextName,\n stepKind?: WorkflowStepKind,\n): ExpressionTypeEnvironment | undefined {\n const fieldTypeEnvironment =\n field === 'step.success' && stepKind === 'tool'\n ? toolStepReportTypeEnvironment\n : workflowPredicateFieldTypeEnvironments[field];\n const typeEnvironment: ExpressionTypeEnvironment | undefined = fieldTypeEnvironment;\n if (typeEnvironment === undefined) return getWorkflowContextTypeEnvironment(root);\n const rootType = typeEnvironment[root];\n return rootType === undefined ? getWorkflowContextTypeEnvironment(root) : {[root]: rootType};\n}\n\nexport function getWorkflowPredicateContextRoots<Field extends WorkflowPredicateField>(\n field: Field,\n): readonly WorkflowPredicateContextRoot<Field>[] {\n return workflowPredicateContextRoots[field];\n}\n\n/**\n * The roots a field can read, whichever kind of field it is.\n *\n * A predicate has an enumerated contract because the runtime assembles one\n * context for it. A template has no single context: each reference is filled\n * where its data arrives, so its field-level constraint is which host can\n * resolve it, except for fields that declare an explicit root list (such as\n * `tool.outputs`, whose reserved `result` root is not a referenceable context\n * name). Callers that document or check fields should use this instead of\n * choosing a mechanism themselves.\n */\nexport function contextRootsForField(\n field: WorkflowPredicateField | WorkflowInterpolationField,\n): readonly (WorkflowContextName | WorkflowContextReservedRoot)[] {\n if (isWorkflowPredicateField(field)) return workflowPredicateContextRoots[field];\n\n const policy = workflowInterpolationFieldPolicies[field];\n if (policy.roots !== undefined) return policy.roots;\n\n const {acceptedHosts} = policy;\n return workflowContextNames.filter((name) =>\n acceptedHosts.includes(workflowContextDefinitions[name].host),\n );\n}\n\nexport function isWorkflowPredicateField(field: string): field is WorkflowPredicateField {\n return (workflowPredicateFields as readonly string[]).includes(field);\n}\n\nexport function projectWorkflowPredicateContext(\n field: WorkflowPredicateField,\n context: WorkflowExpressionEvaluationContext,\n): WorkflowExpressionEvaluationContext {\n const roots = new Set(getWorkflowPredicateContextRoots(field));\n return Object.fromEntries(\n Object.entries(context).filter(([root]) => roots.has(root as WorkflowPredicateContextRoot)),\n );\n}\n\nexport interface WorkflowContextAvailabilityReferenceEntry {\n readonly root: WorkflowContextName | WorkflowContextReservedRoot;\n readonly availability?: AvailabilitySite;\n readonly reserved: boolean;\n readonly availableAt: Readonly<Record<AvailabilitySite, boolean>>;\n}\n\nexport function workflowContextAvailabilityReference(): readonly WorkflowContextAvailabilityReferenceEntry[] {\n return [\n ...workflowContextNames.map((root) => {\n const definition = workflowContextDefinitions[root];\n if (definition.host === 'runner') return noServerAvailabilityReferenceEntry(root, false);\n return availabilityReferenceEntry(root, definition.availability, false);\n }),\n ...Object.entries(workflowContextReservedRoots).map(([root, definition]) => {\n if (definition.host === 'runner') {\n return noServerAvailabilityReferenceEntry(root as WorkflowContextReservedRoot, true);\n }\n return availabilityReferenceEntry(\n root as WorkflowContextReservedRoot,\n definition.availability,\n true,\n );\n }),\n ];\n}\n\nfunction availabilityReferenceEntry(\n root: WorkflowContextName | WorkflowContextReservedRoot,\n availability: AvailabilitySite,\n reserved: boolean,\n): WorkflowContextAvailabilityReferenceEntry {\n const availabilityIndex = availabilitySites.indexOf(availability);\n const availableAt = Object.fromEntries(\n availabilitySites.map((site) => [site, availabilitySites.indexOf(site) >= availabilityIndex]),\n ) as Record<AvailabilitySite, boolean>;\n\n return {root, availability, reserved, availableAt};\n}\n\nfunction noServerAvailabilityReferenceEntry(\n root: WorkflowContextName | WorkflowContextReservedRoot,\n reserved: boolean,\n): WorkflowContextAvailabilityReferenceEntry {\n const availableAt = Object.fromEntries(availabilitySites.map((site) => [site, false])) as Record<\n AvailabilitySite,\n boolean\n >;\n\n return {root, reserved, availableAt};\n}\n\nfunction stepsRootType(steps: readonly WorkflowStepTypeOverlay[]): ExpressionType {\n return {\n kind: 'object',\n fields: Object.fromEntries(steps.map((step) => [step.key, stepEntityTypeForStep(step)])),\n };\n}\n\nfunction stepEntityTypeForStep(step: WorkflowStepTypeOverlay): ExpressionType {\n const attemptType = stepAttemptTypeForOutputs(outputsTypeForStep(step), step.kind === 'tool');\n return {\n kind: 'object',\n fields: {\n ...attemptType.fields,\n attempts: {\n kind: 'list',\n element: attemptType,\n },\n },\n };\n}\n\nfunction selfStepType(step: WorkflowStepTypeOverlay): ExpressionType {\n const selfType = step.kind === 'tool' ? toolStepSelfTypeEnvironment : stepTypeEnvironment;\n return {\n kind: 'object',\n fields: {\n ...selfType.step.fields,\n outputs: outputsTypeForStep(step),\n },\n };\n}\n\nfunction stepAttemptTypeForOutputs(\n outputs: ExpressionType,\n toolStep: boolean,\n): ObjectExpressionType {\n return {\n kind: 'object',\n fields: {\n ...(toolStep ? toolStepAttemptType : stepAttemptType).fields,\n outputs,\n },\n };\n}\n\nfunction outputsTypeForStep(step: WorkflowStepTypeOverlay): ExpressionType {\n if (step.kind === 'tool') {\n // Every tool step exposes `outputs.result`, typed from the catalog output\n // schema when one is declared and open otherwise; `result` always wins\n // over a mapped output that tries to redeclare it.\n return {\n kind: 'object',\n fields: {\n ...(step.outputs === undefined ? {} : outputDeclarationsToExpressionFields(step.outputs)),\n result:\n step.outputSchema === undefined\n ? ({kind: 'map'} as const satisfies ExpressionType)\n : jsonSchemaToExpressionType(step.outputSchema),\n },\n };\n }\n\n if (step.outputs === undefined) return {kind: 'map'};\n return {kind: 'object', fields: outputDeclarationsToExpressionFields(step.outputs)};\n}\n\nfunction jobsRootType(jobs: readonly WorkflowJobTypeOverlay[]): ExpressionType {\n return {\n kind: 'object',\n fields: Object.fromEntries(jobs.map((job) => [job.key, jobEntityType(job)])),\n };\n}\n\nfunction needsRootType(): ExpressionType {\n return {\n kind: 'list',\n element: jobEntityTypeForNeeds(),\n };\n}\n\nfunction jobEntityTypeForNeeds(): ExpressionType {\n return {\n kind: 'object',\n fields: {\n key: 'string',\n status: 'string',\n outputs: {kind: 'map'},\n executions: {\n kind: 'list',\n element: executionTypeWithOutputs({kind: 'map'}),\n },\n },\n };\n}\n\nfunction jobEntityType(job: WorkflowJobTypeOverlay): ExpressionType {\n const outputs = jobOutputsType(job);\n const execution = executionTypeWithOutputs(outputs);\n return {\n kind: 'object',\n fields: {\n key: 'string',\n status: 'string',\n outputs,\n executions: {\n kind: 'list',\n element: execution,\n },\n },\n };\n}\n\nfunction jobOutputsType(job: WorkflowJobTypeOverlay): ExpressionType {\n return job.outputs === undefined\n ? ({kind: 'map'} as const satisfies ExpressionType)\n : ({kind: 'object', fields: job.outputs} as const satisfies ExpressionType);\n}\n\nfunction executionTypeWithOutputs(outputs: ExpressionType): ExpressionType {\n return {\n kind: 'object',\n fields: {\n ...executionType.fields,\n outputs,\n },\n };\n}\n\nfunction isWorkflowContextName(root: string): root is WorkflowContextName {\n return Object.hasOwn(workflowContextDefinitions, root);\n}\n\nfunction isWorkflowContextReservedRoot(root: string): root is WorkflowContextReservedRoot {\n return Object.hasOwn(workflowContextReservedRoots, root);\n}\n"],"names":["jsonSchemaToExpressionType","outputDeclarationsToExpressionFields","workflowContextNames","availabilitySites","runnerFillTarget","workflowContextSensitivities","workflowContextHosts","workflowContextReservedRoots","matrix","host","availability","runner","result","workflowTypeEnvironment","workflow","kind","fields","id","name","runTypeEnvironment","run","number","project_id","workspace_id","created_at","triggerReferenceFields","project","repository","ref","commit","triggerTypeEnvironment","trigger","source","event","jobTypeEnvironment","job","key","executionEventType","delivery_id","received_at","data","executionType","index","status","started_at","finished_at","events","element","outputs","executionsTypeEnvironment","executions","executionTypeEnvironment","execution","failed","stepGateType","passed","reason","exit_code","toolStepGateType","stepAttemptType","response","gate","stepEntityType","attempts","stepDispatchTypeEnvironment","step","attempt","is_retry","restart","from","feedback","stepReportTypeEnvironment","toolStepReportTypeEnvironment","toolStepAttemptType","toolStepSelfTypeEnvironment","stepTypeEnvironment","buildTypedRootsEnvironment","params","steps","undefined","stepsRootType","currentStep","selfStepType","jobs","jobsRootType","needs","needsRootType","workflowContextDefinitions","sensitivity","shape","checkMode","typeEnvironment","inputs","jobEntityType","vars","literalKeyOnly","secrets","workflowFieldFailurePolicies","serverOnlyHosts","anyHost","workflowInterpolationFieldPolicies","acceptedHosts","failurePolicy","minimumFillTarget","selfReference","root","roots","workflowInterpolationFields","Object","keys","workflowPredicateFields","listenerPredicateContextRoots","workflowPredicateContextRoots","workflowPredicateFieldFailurePolicy","workflowPredicateFieldMinimumFillTargets","workflowPredicateFieldTypeEnvironments","getWorkflowContextDefinition","getWorkflowContextAvailability","definition","getWorkflowContextHost","resolveContextRootHost","isWorkflowContextName","isWorkflowContextReservedRoot","resolveContextRootAvailability","reservedRoot","getWorkflowContextSensitivity","rootsAvailableAt","site","targetSiteIndex","indexOf","filter","unavailableRootsAt","getWorkflowContextTypeEnvironment","context","getWorkflowInterpolationFieldTypeEnvironment","field","workflowInterpolationFieldAcceptsHost","includes","workflowContextRootRequiresLiteralKey","getWorkflowInterpolationFieldFailurePolicy","getWorkflowInterpolationFieldSelfReference","getWorkflowInterpolationFieldMinimumFillTarget","policy","getWorkflowPredicateFieldMinimumFillTarget","getWorkflowPredicateFieldTypeEnvironment","stepKind","fieldTypeEnvironment","rootType","getWorkflowPredicateContextRoots","contextRootsForField","isWorkflowPredicateField","projectWorkflowPredicateContext","Set","fromEntries","entries","has","workflowContextAvailabilityReference","map","noServerAvailabilityReferenceEntry","availabilityReferenceEntry","reserved","availabilityIndex","availableAt","stepEntityTypeForStep","attemptType","stepAttemptTypeForOutputs","outputsTypeForStep","selfType","toolStep","outputSchema","jobEntityTypeForNeeds","executionTypeWithOutputs","jobOutputsType","hasOwn"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-function-registry.d.ts","sourceRoot":"","sources":["../src/workflow-function-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,sBAAsB,CAAC;AAGjF,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AAExC,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAgB/C,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;CACtD;AA+BD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,GAAG,uBAAuB,CAqC3F"}
1
+ {"version":3,"file":"workflow-function-registry.d.ts","sourceRoot":"","sources":["../src/workflow-function-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,sBAAsB,CAAC;AAGjF,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AAExC,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAoB/C,gFAAgF;AAChF,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;CACtD;AA0ED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,WAAW,GAAG,uBAAuB,CAqC3F"}
@@ -6,6 +6,10 @@ const utf8Encoder = new TextEncoder();
6
6
  const RANGE_FUNCTION_SIGNATURE = 'range(dyn, dyn, dyn): list<int>';
7
7
  const TO_JSON_FUNCTION_SIGNATURE = 'toJson(dyn): string';
8
8
  const FROM_JSON_FUNCTION_SIGNATURE = 'fromJson(string): dyn';
9
+ const FIRST_FUNCTION_SIGNATURE = 'list<T>.first(): T';
10
+ const DYNAMIC_FIRST_FUNCTION_SIGNATURE = 'list<dyn>.first(): dyn';
11
+ const LAST_FUNCTION_SIGNATURE = 'list<T>.last(): T';
12
+ const DYNAMIC_LAST_FUNCTION_SIGNATURE = 'list<dyn>.last(): dyn';
9
13
  const workflowFunctionRegistry = [
10
14
  {
11
15
  signature: RANGE_FUNCTION_SIGNATURE,
@@ -21,8 +25,49 @@ const workflowFunctionRegistry = [
21
25
  if (typeof value !== 'string') throw new TypeError('fromJson() expects a JSON string');
22
26
  return JSON.parse(value, reviveJsonNumber);
23
27
  }
28
+ },
29
+ {
30
+ signature: FIRST_FUNCTION_SIGNATURE,
31
+ createHandler: ()=>firstListElement
32
+ },
33
+ {
34
+ signature: DYNAMIC_FIRST_FUNCTION_SIGNATURE,
35
+ createHandler: ()=>firstListElement
36
+ },
37
+ {
38
+ signature: LAST_FUNCTION_SIGNATURE,
39
+ createHandler: ()=>lastListElement
40
+ },
41
+ {
42
+ signature: DYNAMIC_LAST_FUNCTION_SIGNATURE,
43
+ createHandler: ()=>lastListElement
24
44
  }
25
45
  ];
46
+ function firstListElement(value) {
47
+ if (Array.isArray(value)) {
48
+ if (value.length === 0) throw new RangeError('first() requires a non-empty list');
49
+ return value[0];
50
+ }
51
+ if (value instanceof Set) {
52
+ const first = value.values().next();
53
+ if (first.done) throw new RangeError('first() requires a non-empty list');
54
+ return first.value;
55
+ }
56
+ throw new TypeError('first() expects a list');
57
+ }
58
+ function lastListElement(value) {
59
+ if (Array.isArray(value)) {
60
+ if (value.length === 0) throw new RangeError('last() requires a non-empty list');
61
+ return value[value.length - 1];
62
+ }
63
+ if (value instanceof Set) {
64
+ if (value.size === 0) throw new RangeError('last() requires a non-empty list');
65
+ let last;
66
+ for (const element of value)last = element;
67
+ return last;
68
+ }
69
+ throw new TypeError('last() expects a list');
70
+ }
26
71
  /**
27
72
  * Register the shared functions and return the budgets their handlers close over.
28
73
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/workflow-function-registry.ts"],"sourcesContent":["import type {Environment, RegisteredFunctionHandler} from '@marcbachmann/cel-js';\nimport {stringifyBigint} from './json.js';\n\n/** Maximum number of values one evaluation's range calls may materialize. */\nexport const MAX_RANGE_ELEMENTS = 1_000;\n\n/** Maximum context-byte fan-out one evaluation's range calls may represent. */\nexport const MAX_RANGE_FANOUT_BYTES = 1_000_000;\n\n/** Maximum UTF-8 bytes returned by toJson() calls in one evaluation. */\nexport const MAX_JSON_OUTPUT_BYTES = 1_000_000;\n\nconst utf8Encoder = new TextEncoder();\n\nconst RANGE_FUNCTION_SIGNATURE = 'range(dyn, dyn, dyn): list<int>';\nconst TO_JSON_FUNCTION_SIGNATURE = 'toJson(dyn): string';\nconst FROM_JSON_FUNCTION_SIGNATURE = 'fromJson(string): dyn';\n\ninterface WorkflowFunctionBudget {\n remainingRangeElements: number;\n remainingRangeFanoutBytes: number;\n remainingJsonOutputBytes: number;\n context: unknown;\n contextBytes: number | undefined;\n}\n\n/** Per-evaluation budgets held by the handlers registered on an environment. */\nexport interface WorkflowFunctionBudgets {\n isolate<T>(context: unknown, evaluation: () => T): T;\n}\n\ninterface WorkflowFunctionDefinition {\n readonly signature: string;\n readonly createHandler: (budget: WorkflowFunctionBudget) => RegisteredFunctionHandler;\n}\n\nconst workflowFunctionRegistry = [\n {\n signature: RANGE_FUNCTION_SIGNATURE,\n createHandler:\n (budget: WorkflowFunctionBudget): RegisteredFunctionHandler =>\n (start: unknown, stop: unknown, step: unknown) =>\n evaluateRange(budget, start, stop, step),\n },\n {\n signature: TO_JSON_FUNCTION_SIGNATURE,\n createHandler:\n (budget: WorkflowFunctionBudget): RegisteredFunctionHandler =>\n (value: unknown) =>\n serializeJson(budget, value),\n },\n {\n signature: FROM_JSON_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => (value: unknown) => {\n if (typeof value !== 'string') throw new TypeError('fromJson() expects a JSON string');\n return JSON.parse(value, reviveJsonNumber) as unknown;\n },\n },\n] satisfies readonly WorkflowFunctionDefinition[];\n\n/**\n * Register the shared functions and return the budgets their handlers close over.\n *\n * Callers that reuse one environment across evaluations must wrap each evaluation\n * in `isolate` so it gets a full budget without consuming an enclosing one. A\n * context accessor can re-enter the evaluator, so the enclosing budget is\n * restored rather than reset.\n */\nexport function registerWorkflowFunctions(environment: Environment): WorkflowFunctionBudgets {\n const budget: WorkflowFunctionBudget = {\n remainingRangeElements: MAX_RANGE_ELEMENTS,\n remainingRangeFanoutBytes: MAX_RANGE_FANOUT_BYTES,\n remainingJsonOutputBytes: MAX_JSON_OUTPUT_BYTES,\n context: undefined,\n contextBytes: undefined,\n };\n for (const definition of workflowFunctionRegistry) {\n environment.registerFunction(definition.signature, definition.createHandler(budget));\n }\n\n return {\n isolate<T>(context: unknown, evaluation: () => T): T {\n const enclosing = {\n rangeElements: budget.remainingRangeElements,\n rangeFanoutBytes: budget.remainingRangeFanoutBytes,\n jsonOutputBytes: budget.remainingJsonOutputBytes,\n context: budget.context,\n contextBytes: budget.contextBytes,\n };\n budget.remainingRangeElements = MAX_RANGE_ELEMENTS;\n budget.remainingRangeFanoutBytes = MAX_RANGE_FANOUT_BYTES;\n budget.remainingJsonOutputBytes = MAX_JSON_OUTPUT_BYTES;\n budget.context = context;\n budget.contextBytes = undefined;\n try {\n return evaluation();\n } finally {\n budget.remainingRangeElements = enclosing.rangeElements;\n budget.remainingRangeFanoutBytes = enclosing.rangeFanoutBytes;\n budget.remainingJsonOutputBytes = enclosing.jsonOutputBytes;\n budget.context = enclosing.context;\n budget.contextBytes = enclosing.contextBytes;\n }\n },\n };\n}\n\nfunction materializeRange(start: bigint, stop: bigint, step: bigint): bigint[] {\n const values: bigint[] = [];\n for (let value = start; value <= stop; value += step) values.push(value);\n return values;\n}\n\nfunction rangeElementCount(start: bigint, stop: bigint, step: bigint): bigint {\n if (step <= 0n) throw new RangeError('range step must be positive');\n if (start > stop) return 0n;\n\n return (stop - start) / step + 1n;\n}\n\nfunction toCelInteger(value: unknown, name: string): bigint {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value);\n throw new RangeError(`${name} must be a safe integer`);\n}\n\nfunction evaluateRange(\n budget: WorkflowFunctionBudget,\n start: unknown,\n stop: unknown,\n step: unknown,\n): bigint[] {\n const startValue = toCelInteger(start, 'range start');\n const stopValue = toCelInteger(stop, 'range stop');\n const stepValue = toCelInteger(step, 'range step');\n const count = rangeElementCount(startValue, stopValue, stepValue);\n if (count > BigInt(budget.remainingRangeElements)) {\n throw new RangeError(\n `range evaluation budget exceeded; ${count} elements requested with ${budget.remainingRangeElements} remaining`,\n );\n }\n\n const contextBytes = getContextBytes(budget);\n const fanoutBytes = count * BigInt(contextBytes);\n if (fanoutBytes > BigInt(budget.remainingRangeFanoutBytes)) {\n throw new RangeError(\n `range fan-out budget exceeded; ${count} elements requested for ${contextBytes} context bytes with ${budget.remainingRangeFanoutBytes} remaining`,\n );\n }\n\n const values = materializeRange(startValue, stopValue, stepValue);\n budget.remainingRangeElements -= values.length;\n budget.remainingRangeFanoutBytes -= Number(fanoutBytes);\n return values;\n}\n\nfunction getContextBytes(budget: WorkflowFunctionBudget): number {\n if (budget.contextBytes !== undefined) return budget.contextBytes;\n\n try {\n const json = JSON.stringify(budget.context, stringifyBigint);\n if (json === undefined) {\n budget.contextBytes = 0;\n return 0;\n }\n\n budget.contextBytes = Math.min(MAX_RANGE_FANOUT_BYTES + 1, utf8Encoder.encode(json).byteLength);\n return budget.contextBytes;\n } catch {\n // A context that cannot be serialized is not safe to fan out over.\n budget.contextBytes = MAX_RANGE_FANOUT_BYTES + 1;\n return budget.contextBytes;\n }\n}\n\nfunction serializeJson(budget: WorkflowFunctionBudget, value: unknown): string {\n const json = JSON.stringify(value, stringifyBigint);\n if (json === undefined) throw new TypeError('toJson() value must be JSON-serializable');\n\n const outputBytes = utf8Encoder.encode(json).byteLength;\n if (outputBytes > budget.remainingJsonOutputBytes) {\n throw new RangeError(\n `toJson evaluation budget exceeded; ${outputBytes} bytes requested with ${budget.remainingJsonOutputBytes} remaining`,\n );\n }\n\n budget.remainingJsonOutputBytes -= outputBytes;\n return json;\n}\n\nfunction reviveJsonNumber(_key: string, value: unknown): unknown {\n return typeof value === 'number' && Number.isSafeInteger(value) ? BigInt(value) : value;\n}\n"],"names":["stringifyBigint","MAX_RANGE_ELEMENTS","MAX_RANGE_FANOUT_BYTES","MAX_JSON_OUTPUT_BYTES","utf8Encoder","TextEncoder","RANGE_FUNCTION_SIGNATURE","TO_JSON_FUNCTION_SIGNATURE","FROM_JSON_FUNCTION_SIGNATURE","workflowFunctionRegistry","signature","createHandler","budget","start","stop","step","evaluateRange","value","serializeJson","TypeError","JSON","parse","reviveJsonNumber","registerWorkflowFunctions","environment","remainingRangeElements","remainingRangeFanoutBytes","remainingJsonOutputBytes","context","undefined","contextBytes","definition","registerFunction","isolate","evaluation","enclosing","rangeElements","rangeFanoutBytes","jsonOutputBytes","materializeRange","values","push","rangeElementCount","RangeError","toCelInteger","name","Number","isSafeInteger","BigInt","startValue","stopValue","stepValue","count","getContextBytes","fanoutBytes","length","json","stringify","Math","min","encode","byteLength","outputBytes","_key"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/workflow-function-registry.ts"],"sourcesContent":["import type {Environment, RegisteredFunctionHandler} from '@marcbachmann/cel-js';\nimport {stringifyBigint} from './json.js';\n\n/** Maximum number of values one evaluation's range calls may materialize. */\nexport const MAX_RANGE_ELEMENTS = 1_000;\n\n/** Maximum context-byte fan-out one evaluation's range calls may represent. */\nexport const MAX_RANGE_FANOUT_BYTES = 1_000_000;\n\n/** Maximum UTF-8 bytes returned by toJson() calls in one evaluation. */\nexport const MAX_JSON_OUTPUT_BYTES = 1_000_000;\n\nconst utf8Encoder = new TextEncoder();\n\nconst RANGE_FUNCTION_SIGNATURE = 'range(dyn, dyn, dyn): list<int>';\nconst TO_JSON_FUNCTION_SIGNATURE = 'toJson(dyn): string';\nconst FROM_JSON_FUNCTION_SIGNATURE = 'fromJson(string): dyn';\nconst FIRST_FUNCTION_SIGNATURE = 'list<T>.first(): T';\nconst DYNAMIC_FIRST_FUNCTION_SIGNATURE = 'list<dyn>.first(): dyn';\nconst LAST_FUNCTION_SIGNATURE = 'list<T>.last(): T';\nconst DYNAMIC_LAST_FUNCTION_SIGNATURE = 'list<dyn>.last(): dyn';\n\ninterface WorkflowFunctionBudget {\n remainingRangeElements: number;\n remainingRangeFanoutBytes: number;\n remainingJsonOutputBytes: number;\n context: unknown;\n contextBytes: number | undefined;\n}\n\n/** Per-evaluation budgets held by the handlers registered on an environment. */\nexport interface WorkflowFunctionBudgets {\n isolate<T>(context: unknown, evaluation: () => T): T;\n}\n\ninterface WorkflowFunctionDefinition {\n readonly signature: string;\n readonly createHandler: (budget: WorkflowFunctionBudget) => RegisteredFunctionHandler;\n}\n\nconst workflowFunctionRegistry = [\n {\n signature: RANGE_FUNCTION_SIGNATURE,\n createHandler:\n (budget: WorkflowFunctionBudget): RegisteredFunctionHandler =>\n (start: unknown, stop: unknown, step: unknown) =>\n evaluateRange(budget, start, stop, step),\n },\n {\n signature: TO_JSON_FUNCTION_SIGNATURE,\n createHandler:\n (budget: WorkflowFunctionBudget): RegisteredFunctionHandler =>\n (value: unknown) =>\n serializeJson(budget, value),\n },\n {\n signature: FROM_JSON_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => (value: unknown) => {\n if (typeof value !== 'string') throw new TypeError('fromJson() expects a JSON string');\n return JSON.parse(value, reviveJsonNumber) as unknown;\n },\n },\n {\n signature: FIRST_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => firstListElement,\n },\n {\n signature: DYNAMIC_FIRST_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => firstListElement,\n },\n {\n signature: LAST_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => lastListElement,\n },\n {\n signature: DYNAMIC_LAST_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => lastListElement,\n },\n] satisfies readonly WorkflowFunctionDefinition[];\n\nfunction firstListElement(value: unknown): unknown {\n if (Array.isArray(value)) {\n if (value.length === 0) throw new RangeError('first() requires a non-empty list');\n return value[0];\n }\n if (value instanceof Set) {\n const first = value.values().next();\n if (first.done) throw new RangeError('first() requires a non-empty list');\n return first.value;\n }\n throw new TypeError('first() expects a list');\n}\n\nfunction lastListElement(value: unknown): unknown {\n if (Array.isArray(value)) {\n if (value.length === 0) throw new RangeError('last() requires a non-empty list');\n return value[value.length - 1];\n }\n if (value instanceof Set) {\n if (value.size === 0) throw new RangeError('last() requires a non-empty list');\n let last: unknown;\n for (const element of value) last = element;\n return last;\n }\n throw new TypeError('last() expects a list');\n}\n\n/**\n * Register the shared functions and return the budgets their handlers close over.\n *\n * Callers that reuse one environment across evaluations must wrap each evaluation\n * in `isolate` so it gets a full budget without consuming an enclosing one. A\n * context accessor can re-enter the evaluator, so the enclosing budget is\n * restored rather than reset.\n */\nexport function registerWorkflowFunctions(environment: Environment): WorkflowFunctionBudgets {\n const budget: WorkflowFunctionBudget = {\n remainingRangeElements: MAX_RANGE_ELEMENTS,\n remainingRangeFanoutBytes: MAX_RANGE_FANOUT_BYTES,\n remainingJsonOutputBytes: MAX_JSON_OUTPUT_BYTES,\n context: undefined,\n contextBytes: undefined,\n };\n for (const definition of workflowFunctionRegistry) {\n environment.registerFunction(definition.signature, definition.createHandler(budget));\n }\n\n return {\n isolate<T>(context: unknown, evaluation: () => T): T {\n const enclosing = {\n rangeElements: budget.remainingRangeElements,\n rangeFanoutBytes: budget.remainingRangeFanoutBytes,\n jsonOutputBytes: budget.remainingJsonOutputBytes,\n context: budget.context,\n contextBytes: budget.contextBytes,\n };\n budget.remainingRangeElements = MAX_RANGE_ELEMENTS;\n budget.remainingRangeFanoutBytes = MAX_RANGE_FANOUT_BYTES;\n budget.remainingJsonOutputBytes = MAX_JSON_OUTPUT_BYTES;\n budget.context = context;\n budget.contextBytes = undefined;\n try {\n return evaluation();\n } finally {\n budget.remainingRangeElements = enclosing.rangeElements;\n budget.remainingRangeFanoutBytes = enclosing.rangeFanoutBytes;\n budget.remainingJsonOutputBytes = enclosing.jsonOutputBytes;\n budget.context = enclosing.context;\n budget.contextBytes = enclosing.contextBytes;\n }\n },\n };\n}\n\nfunction materializeRange(start: bigint, stop: bigint, step: bigint): bigint[] {\n const values: bigint[] = [];\n for (let value = start; value <= stop; value += step) values.push(value);\n return values;\n}\n\nfunction rangeElementCount(start: bigint, stop: bigint, step: bigint): bigint {\n if (step <= 0n) throw new RangeError('range step must be positive');\n if (start > stop) return 0n;\n\n return (stop - start) / step + 1n;\n}\n\nfunction toCelInteger(value: unknown, name: string): bigint {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value);\n throw new RangeError(`${name} must be a safe integer`);\n}\n\nfunction evaluateRange(\n budget: WorkflowFunctionBudget,\n start: unknown,\n stop: unknown,\n step: unknown,\n): bigint[] {\n const startValue = toCelInteger(start, 'range start');\n const stopValue = toCelInteger(stop, 'range stop');\n const stepValue = toCelInteger(step, 'range step');\n const count = rangeElementCount(startValue, stopValue, stepValue);\n if (count > BigInt(budget.remainingRangeElements)) {\n throw new RangeError(\n `range evaluation budget exceeded; ${count} elements requested with ${budget.remainingRangeElements} remaining`,\n );\n }\n\n const contextBytes = getContextBytes(budget);\n const fanoutBytes = count * BigInt(contextBytes);\n if (fanoutBytes > BigInt(budget.remainingRangeFanoutBytes)) {\n throw new RangeError(\n `range fan-out budget exceeded; ${count} elements requested for ${contextBytes} context bytes with ${budget.remainingRangeFanoutBytes} remaining`,\n );\n }\n\n const values = materializeRange(startValue, stopValue, stepValue);\n budget.remainingRangeElements -= values.length;\n budget.remainingRangeFanoutBytes -= Number(fanoutBytes);\n return values;\n}\n\nfunction getContextBytes(budget: WorkflowFunctionBudget): number {\n if (budget.contextBytes !== undefined) return budget.contextBytes;\n\n try {\n const json = JSON.stringify(budget.context, stringifyBigint);\n if (json === undefined) {\n budget.contextBytes = 0;\n return 0;\n }\n\n budget.contextBytes = Math.min(MAX_RANGE_FANOUT_BYTES + 1, utf8Encoder.encode(json).byteLength);\n return budget.contextBytes;\n } catch {\n // A context that cannot be serialized is not safe to fan out over.\n budget.contextBytes = MAX_RANGE_FANOUT_BYTES + 1;\n return budget.contextBytes;\n }\n}\n\nfunction serializeJson(budget: WorkflowFunctionBudget, value: unknown): string {\n const json = JSON.stringify(value, stringifyBigint);\n if (json === undefined) throw new TypeError('toJson() value must be JSON-serializable');\n\n const outputBytes = utf8Encoder.encode(json).byteLength;\n if (outputBytes > budget.remainingJsonOutputBytes) {\n throw new RangeError(\n `toJson evaluation budget exceeded; ${outputBytes} bytes requested with ${budget.remainingJsonOutputBytes} remaining`,\n );\n }\n\n budget.remainingJsonOutputBytes -= outputBytes;\n return json;\n}\n\nfunction reviveJsonNumber(_key: string, value: unknown): unknown {\n return typeof value === 'number' && Number.isSafeInteger(value) ? BigInt(value) : value;\n}\n"],"names":["stringifyBigint","MAX_RANGE_ELEMENTS","MAX_RANGE_FANOUT_BYTES","MAX_JSON_OUTPUT_BYTES","utf8Encoder","TextEncoder","RANGE_FUNCTION_SIGNATURE","TO_JSON_FUNCTION_SIGNATURE","FROM_JSON_FUNCTION_SIGNATURE","FIRST_FUNCTION_SIGNATURE","DYNAMIC_FIRST_FUNCTION_SIGNATURE","LAST_FUNCTION_SIGNATURE","DYNAMIC_LAST_FUNCTION_SIGNATURE","workflowFunctionRegistry","signature","createHandler","budget","start","stop","step","evaluateRange","value","serializeJson","TypeError","JSON","parse","reviveJsonNumber","firstListElement","lastListElement","Array","isArray","length","RangeError","Set","first","values","next","done","size","last","element","registerWorkflowFunctions","environment","remainingRangeElements","remainingRangeFanoutBytes","remainingJsonOutputBytes","context","undefined","contextBytes","definition","registerFunction","isolate","evaluation","enclosing","rangeElements","rangeFanoutBytes","jsonOutputBytes","materializeRange","push","rangeElementCount","toCelInteger","name","Number","isSafeInteger","BigInt","startValue","stopValue","stepValue","count","getContextBytes","fanoutBytes","json","stringify","Math","min","encode","byteLength","outputBytes","_key"],"mappings":"AACA,SAAQA,eAAe,QAAO,YAAY;AAE1C,2EAA2E,GAC3E,OAAO,MAAMC,qBAAqB,MAAM;AAExC,6EAA6E,GAC7E,OAAO,MAAMC,yBAAyB,UAAU;AAEhD,sEAAsE,GACtE,OAAO,MAAMC,wBAAwB,UAAU;AAE/C,MAAMC,cAAc,IAAIC;AAExB,MAAMC,2BAA2B;AACjC,MAAMC,6BAA6B;AACnC,MAAMC,+BAA+B;AACrC,MAAMC,2BAA2B;AACjC,MAAMC,mCAAmC;AACzC,MAAMC,0BAA0B;AAChC,MAAMC,kCAAkC;AAoBxC,MAAMC,2BAA2B;IAC/B;QACEC,WAAWR;QACXS,eACE,CAACC,SACD,CAACC,OAAgBC,MAAeC,OAC9BC,cAAcJ,QAAQC,OAAOC,MAAMC;IACzC;IACA;QACEL,WAAWP;QACXQ,eACE,CAACC,SACD,CAACK,QACCC,cAAcN,QAAQK;IAC5B;IACA;QACEP,WAAWN;QACXO,eAAe,IAAiC,CAACM;gBAC/C,IAAI,OAAOA,UAAU,UAAU,MAAM,IAAIE,UAAU;gBACnD,OAAOC,KAAKC,KAAK,CAACJ,OAAOK;YAC3B;IACF;IACA;QACEZ,WAAWL;QACXM,eAAe,IAAiCY;IAClD;IACA;QACEb,WAAWJ;QACXK,eAAe,IAAiCY;IAClD;IACA;QACEb,WAAWH;QACXI,eAAe,IAAiCa;IAClD;IACA;QACEd,WAAWF;QACXG,eAAe,IAAiCa;IAClD;CACD;AAED,SAASD,iBAAiBN,KAAc;IACtC,IAAIQ,MAAMC,OAAO,CAACT,QAAQ;QACxB,IAAIA,MAAMU,MAAM,KAAK,GAAG,MAAM,IAAIC,WAAW;QAC7C,OAAOX,KAAK,CAAC,EAAE;IACjB;IACA,IAAIA,iBAAiBY,KAAK;QACxB,MAAMC,QAAQb,MAAMc,MAAM,GAAGC,IAAI;QACjC,IAAIF,MAAMG,IAAI,EAAE,MAAM,IAAIL,WAAW;QACrC,OAAOE,MAAMb,KAAK;IACpB;IACA,MAAM,IAAIE,UAAU;AACtB;AAEA,SAASK,gBAAgBP,KAAc;IACrC,IAAIQ,MAAMC,OAAO,CAACT,QAAQ;QACxB,IAAIA,MAAMU,MAAM,KAAK,GAAG,MAAM,IAAIC,WAAW;QAC7C,OAAOX,KAAK,CAACA,MAAMU,MAAM,GAAG,EAAE;IAChC;IACA,IAAIV,iBAAiBY,KAAK;QACxB,IAAIZ,MAAMiB,IAAI,KAAK,GAAG,MAAM,IAAIN,WAAW;QAC3C,IAAIO;QACJ,KAAK,MAAMC,WAAWnB,MAAOkB,OAAOC;QACpC,OAAOD;IACT;IACA,MAAM,IAAIhB,UAAU;AACtB;AAEA;;;;;;;CAOC,GACD,OAAO,SAASkB,0BAA0BC,WAAwB;IAChE,MAAM1B,SAAiC;QACrC2B,wBAAwB1C;QACxB2C,2BAA2B1C;QAC3B2C,0BAA0B1C;QAC1B2C,SAASC;QACTC,cAAcD;IAChB;IACA,KAAK,MAAME,cAAcpC,yBAA0B;QACjD6B,YAAYQ,gBAAgB,CAACD,WAAWnC,SAAS,EAAEmC,WAAWlC,aAAa,CAACC;IAC9E;IAEA,OAAO;QACLmC,SAAWL,OAAgB,EAAEM,UAAmB;YAC9C,MAAMC,YAAY;gBAChBC,eAAetC,OAAO2B,sBAAsB;gBAC5CY,kBAAkBvC,OAAO4B,yBAAyB;gBAClDY,iBAAiBxC,OAAO6B,wBAAwB;gBAChDC,SAAS9B,OAAO8B,OAAO;gBACvBE,cAAchC,OAAOgC,YAAY;YACnC;YACAhC,OAAO2B,sBAAsB,GAAG1C;YAChCe,OAAO4B,yBAAyB,GAAG1C;YACnCc,OAAO6B,wBAAwB,GAAG1C;YAClCa,OAAO8B,OAAO,GAAGA;YACjB9B,OAAOgC,YAAY,GAAGD;YACtB,IAAI;gBACF,OAAOK;YACT,SAAU;gBACRpC,OAAO2B,sBAAsB,GAAGU,UAAUC,aAAa;gBACvDtC,OAAO4B,yBAAyB,GAAGS,UAAUE,gBAAgB;gBAC7DvC,OAAO6B,wBAAwB,GAAGQ,UAAUG,eAAe;gBAC3DxC,OAAO8B,OAAO,GAAGO,UAAUP,OAAO;gBAClC9B,OAAOgC,YAAY,GAAGK,UAAUL,YAAY;YAC9C;QACF;IACF;AACF;AAEA,SAASS,iBAAiBxC,KAAa,EAAEC,IAAY,EAAEC,IAAY;IACjE,MAAMgB,SAAmB,EAAE;IAC3B,IAAK,IAAId,QAAQJ,OAAOI,SAASH,MAAMG,SAASF,KAAMgB,OAAOuB,IAAI,CAACrC;IAClE,OAAOc;AACT;AAEA,SAASwB,kBAAkB1C,KAAa,EAAEC,IAAY,EAAEC,IAAY;IAClE,IAAIA,QAAQ,EAAE,EAAE,MAAM,IAAIa,WAAW;IACrC,IAAIf,QAAQC,MAAM,OAAO,EAAE;IAE3B,OAAO,AAACA,CAAAA,OAAOD,KAAI,IAAKE,OAAO,EAAE;AACnC;AAEA,SAASyC,aAAavC,KAAc,EAAEwC,IAAY;IAChD,IAAI,OAAOxC,UAAU,UAAU,OAAOA;IACtC,IAAI,OAAOA,UAAU,YAAYyC,OAAOC,aAAa,CAAC1C,QAAQ,OAAO2C,OAAO3C;IAC5E,MAAM,IAAIW,WAAW,GAAG6B,KAAK,uBAAuB,CAAC;AACvD;AAEA,SAASzC,cACPJ,MAA8B,EAC9BC,KAAc,EACdC,IAAa,EACbC,IAAa;IAEb,MAAM8C,aAAaL,aAAa3C,OAAO;IACvC,MAAMiD,YAAYN,aAAa1C,MAAM;IACrC,MAAMiD,YAAYP,aAAazC,MAAM;IACrC,MAAMiD,QAAQT,kBAAkBM,YAAYC,WAAWC;IACvD,IAAIC,QAAQJ,OAAOhD,OAAO2B,sBAAsB,GAAG;QACjD,MAAM,IAAIX,WACR,CAAC,kCAAkC,EAAEoC,MAAM,yBAAyB,EAAEpD,OAAO2B,sBAAsB,CAAC,UAAU,CAAC;IAEnH;IAEA,MAAMK,eAAeqB,gBAAgBrD;IACrC,MAAMsD,cAAcF,QAAQJ,OAAOhB;IACnC,IAAIsB,cAAcN,OAAOhD,OAAO4B,yBAAyB,GAAG;QAC1D,MAAM,IAAIZ,WACR,CAAC,+BAA+B,EAAEoC,MAAM,wBAAwB,EAAEpB,aAAa,oBAAoB,EAAEhC,OAAO4B,yBAAyB,CAAC,UAAU,CAAC;IAErJ;IAEA,MAAMT,SAASsB,iBAAiBQ,YAAYC,WAAWC;IACvDnD,OAAO2B,sBAAsB,IAAIR,OAAOJ,MAAM;IAC9Cf,OAAO4B,yBAAyB,IAAIkB,OAAOQ;IAC3C,OAAOnC;AACT;AAEA,SAASkC,gBAAgBrD,MAA8B;IACrD,IAAIA,OAAOgC,YAAY,KAAKD,WAAW,OAAO/B,OAAOgC,YAAY;IAEjE,IAAI;QACF,MAAMuB,OAAO/C,KAAKgD,SAAS,CAACxD,OAAO8B,OAAO,EAAE9C;QAC5C,IAAIuE,SAASxB,WAAW;YACtB/B,OAAOgC,YAAY,GAAG;YACtB,OAAO;QACT;QAEAhC,OAAOgC,YAAY,GAAGyB,KAAKC,GAAG,CAACxE,yBAAyB,GAAGE,YAAYuE,MAAM,CAACJ,MAAMK,UAAU;QAC9F,OAAO5D,OAAOgC,YAAY;IAC5B,EAAE,OAAM;QACN,mEAAmE;QACnEhC,OAAOgC,YAAY,GAAG9C,yBAAyB;QAC/C,OAAOc,OAAOgC,YAAY;IAC5B;AACF;AAEA,SAAS1B,cAAcN,MAA8B,EAAEK,KAAc;IACnE,MAAMkD,OAAO/C,KAAKgD,SAAS,CAACnD,OAAOrB;IACnC,IAAIuE,SAASxB,WAAW,MAAM,IAAIxB,UAAU;IAE5C,MAAMsD,cAAczE,YAAYuE,MAAM,CAACJ,MAAMK,UAAU;IACvD,IAAIC,cAAc7D,OAAO6B,wBAAwB,EAAE;QACjD,MAAM,IAAIb,WACR,CAAC,mCAAmC,EAAE6C,YAAY,sBAAsB,EAAE7D,OAAO6B,wBAAwB,CAAC,UAAU,CAAC;IAEzH;IAEA7B,OAAO6B,wBAAwB,IAAIgC;IACnC,OAAON;AACT;AAEA,SAAS7C,iBAAiBoD,IAAY,EAAEzD,KAAc;IACpD,OAAO,OAAOA,UAAU,YAAYyC,OAAOC,aAAa,CAAC1C,SAAS2C,OAAO3C,SAASA;AACpF"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@shipfox/expression",
3
3
  "license": "MIT",
4
4
  "private": false,
5
- "version": "2.2.1",
5
+ "version": "2.3.0",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/ShipfoxHQ/shipfox.git",
@@ -23,7 +23,7 @@
23
23
  "dependencies": {
24
24
  "@marcbachmann/cel-js": "7.6.1",
25
25
  "ajv": "^8.20.0",
26
- "@shipfox/workflow-document": "3.1.0"
26
+ "@shipfox/workflow-document": "3.2.0"
27
27
  },
28
28
  "shipfox": {
29
29
  "architecture": {