@shipfox/expression 1.2.0 → 2.0.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.
Files changed (41) hide show
  1. package/README.md +25 -12
  2. package/dist/expression/create-workflow-expression.d.ts.map +1 -1
  3. package/dist/expression/create-workflow-expression.js +17 -3
  4. package/dist/expression/create-workflow-expression.js.map +1 -1
  5. package/dist/index.d.ts +4 -3
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/plan/context-key-access.d.ts +2 -0
  10. package/dist/plan/context-key-access.d.ts.map +1 -1
  11. package/dist/plan/context-key-access.js +3 -0
  12. package/dist/plan/context-key-access.js.map +1 -1
  13. package/dist/plan/evaluate-planned-predicate.d.ts.map +1 -1
  14. package/dist/plan/evaluate-planned-predicate.js +2 -2
  15. package/dist/plan/evaluate-planned-predicate.js.map +1 -1
  16. package/dist/run/hoist-run-command.d.ts +8 -0
  17. package/dist/run/hoist-run-command.d.ts.map +1 -1
  18. package/dist/run/hoist-run-command.js +28 -3
  19. package/dist/run/hoist-run-command.js.map +1 -1
  20. package/dist/run/shell-code-position.d.ts +21 -0
  21. package/dist/run/shell-code-position.d.ts.map +1 -0
  22. package/dist/run/shell-code-position.js +623 -0
  23. package/dist/run/shell-code-position.js.map +1 -0
  24. package/dist/run/shell-quoting.d.ts +5 -1
  25. package/dist/run/shell-quoting.d.ts.map +1 -1
  26. package/dist/run/shell-quoting.js +37 -6
  27. package/dist/run/shell-quoting.js.map +1 -1
  28. package/dist/tsconfig.test.tsbuildinfo +1 -1
  29. package/dist/workflow-context/workflow-context-docs.d.ts +185 -0
  30. package/dist/workflow-context/workflow-context-docs.d.ts.map +1 -0
  31. package/dist/workflow-context/workflow-context-docs.js +168 -0
  32. package/dist/workflow-context/workflow-context-docs.js.map +1 -0
  33. package/dist/workflow-context/workflow-context.d.ts +99 -114
  34. package/dist/workflow-context/workflow-context.d.ts.map +1 -1
  35. package/dist/workflow-context/workflow-context.js +201 -85
  36. package/dist/workflow-context/workflow-context.js.map +1 -1
  37. package/package.json +2 -2
  38. package/dist/template/extract-cel-untrusted-path-accesses.d.ts +0 -5
  39. package/dist/template/extract-cel-untrusted-path-accesses.d.ts.map +0 -1
  40. package/dist/template/extract-cel-untrusted-path-accesses.js +0 -140
  41. package/dist/template/extract-cel-untrusted-path-accesses.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workflow-context/workflow-context.ts"],"sourcesContent":["import 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 '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 const workflowContextTrustTiers = ['trusted', 'untrusted'] as const;\nexport type WorkflowContextTrustTier = (typeof workflowContextTrustTiers)[number];\n\nexport type WorkflowContextShape = 'known' | 'open';\n\nexport interface TypedWorkflowContextDefinition {\n readonly availability: AvailabilitySite;\n readonly trustTier: WorkflowContextTrustTier;\n readonly sensitivity: WorkflowContextSensitivity;\n readonly host: 'server';\n readonly shape: 'known';\n readonly checkMode: 'typed';\n readonly typeEnvironment: ExpressionTypeEnvironment;\n readonly untrustedPaths?: readonly string[];\n}\n\nexport interface OpenWorkflowContextDefinition {\n readonly availability: AvailabilitySite;\n readonly trustTier: WorkflowContextTrustTier;\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 trustTier: WorkflowContextTrustTier;\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\nconst runTypeEnvironment = {\n run: {\n kind: 'object',\n fields: {\n id: 'string',\n name: 'string',\n definition_id: 'string',\n project_id: 'string',\n workspace_id: 'string',\n created_at: 'timestamp',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst triggerTypeEnvironment = {\n trigger: {\n kind: 'object',\n fields: {\n source: 'string',\n event: 'string',\n },\n },\n} as const satisfies ExpressionTypeEnvironment;\n\nconst jobTypeEnvironment = {\n job: {\n kind: 'object',\n fields: {\n key: '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 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 failed: 'bool',\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: executionType,\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 stepTypeEnvironment = {\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 exit_code: 'int',\n status: 'string',\n outputs: {kind: 'map'},\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 run: {\n availability: 'run-creation',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: runTypeEnvironment,\n },\n trigger: {\n availability: 'ingest',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: triggerTypeEnvironment,\n },\n event: {\n availability: 'ingest',\n trustTier: 'untrusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n inputs: {\n availability: 'run-creation',\n trustTier: 'untrusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n job: {\n availability: 'run-creation',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: jobTypeEnvironment,\n },\n executions: {\n availability: 'execution-creation',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: executionsTypeEnvironment,\n untrustedPaths: ['events'],\n },\n execution: {\n availability: 'execution-creation',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: executionTypeEnvironment,\n untrustedPaths: ['events'],\n },\n jobs: {\n availability: 'job-activation',\n trustTier: 'untrusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n needs: {\n availability: 'job-activation',\n trustTier: 'untrusted',\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 trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n },\n step: {\n availability: 'step-dispatch',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'known',\n checkMode: 'typed',\n typeEnvironment: stepTypeEnvironment,\n untrustedPaths: ['outputs'],\n },\n vars: {\n availability: 'run-creation',\n trustTier: 'trusted',\n sensitivity: 'persistable',\n host: 'server',\n shape: 'open',\n checkMode: 'syntax',\n literalKeyOnly: true,\n },\n secrets: {\n trustTier: 'trusted',\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 | 'job.name'\n | 'step.name'\n | 'step.feedback';\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 acceptedTrustTiers: readonly WorkflowContextTrustTier[];\n readonly acceptedHosts: readonly WorkflowContextHost[];\n readonly failurePolicy: WorkflowInterpolationFailurePolicy;\n readonly renderSanitize: boolean;\n readonly minimumFillTarget?: AvailabilitySite;\n}\n\nconst trustedOnlyTrustTiers: readonly WorkflowContextTrustTier[] = ['trusted'];\nconst anyTrustTier: readonly WorkflowContextTrustTier[] = ['trusted', 'untrusted'];\nconst serverOnlyHosts: readonly WorkflowContextHost[] = ['server'];\nconst anyHost: readonly WorkflowContextHost[] = ['server', 'runner'];\n\nexport const workflowInterpolationFieldPolicies = {\n run: {\n acceptedTrustTiers: trustedOnlyTrustTiers,\n acceptedHosts: anyHost,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'env.value': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: anyHost,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'agent.prompt': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'agent.model': {\n acceptedTrustTiers: trustedOnlyTrustTiers,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'agent.provider': {\n acceptedTrustTiers: trustedOnlyTrustTiers,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'agent.thinking': {\n acceptedTrustTiers: trustedOnlyTrustTiers,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'job.runner': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n 'job.outputs': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n minimumFillTarget: 'execution-resolution',\n },\n 'job.name': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n renderSanitize: true,\n },\n 'step.name': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'degrade',\n renderSanitize: true,\n },\n 'step.feedback': {\n acceptedTrustTiers: anyTrustTier,\n acceptedHosts: serverOnlyHosts,\n failurePolicy: 'fail',\n renderSanitize: false,\n },\n} as const satisfies Record<WorkflowInterpolationField, WorkflowInterpolationFieldPolicy>;\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\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\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 getWorkflowContextUntrustedPaths(\n name: WorkflowContextName,\n): readonly string[] | undefined {\n const context = getWorkflowContextDefinition(name);\n return context.shape === 'known' ? context.untrustedPaths : undefined;\n}\n\nexport function workflowInterpolationFieldAcceptsTrustTier(\n field: WorkflowInterpolationField,\n trustTier: WorkflowContextTrustTier,\n): boolean {\n return workflowInterpolationFieldPolicies[field].acceptedTrustTiers.includes(trustTier);\n}\n\nexport function workflowInterpolationFieldAcceptsHost(\n field: WorkflowInterpolationField,\n host: WorkflowContextHost,\n): boolean {\n return workflowInterpolationFieldPolicies[field].acceptedHosts.includes(host);\n}\n\nexport function workflowInterpolationFieldAcceptsContext(\n field: WorkflowInterpolationField,\n context: WorkflowContextName,\n): boolean {\n return workflowInterpolationFieldAcceptsTrustTier(\n field,\n workflowContextDefinitions[context].trustTier,\n );\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 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 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","workflowContextTrustTiers","runTypeEnvironment","run","kind","fields","id","name","definition_id","project_id","workspace_id","created_at","triggerTypeEnvironment","trigger","source","event","jobTypeEnvironment","job","key","executionEventType","delivery_id","received_at","data","executionType","index","status","failed","started_at","finished_at","events","element","outputs","executionsTypeEnvironment","executions","executionTypeEnvironment","execution","stepGateType","passed","reason","exit_code","stepAttemptType","response","gate","stepEntityType","attempts","stepTypeEnvironment","step","attempt","is_retry","restart","from","feedback","buildTypedRootsEnvironment","params","steps","undefined","stepsRootType","currentStep","selfStepType","jobs","jobsRootType","needs","needsRootType","workflowContextDefinitions","trustTier","sensitivity","shape","checkMode","typeEnvironment","inputs","untrustedPaths","jobEntityType","vars","literalKeyOnly","secrets","workflowFieldFailurePolicies","trustedOnlyTrustTiers","anyTrustTier","serverOnlyHosts","anyHost","workflowInterpolationFieldPolicies","acceptedTrustTiers","acceptedHosts","failurePolicy","renderSanitize","minimumFillTarget","workflowInterpolationFields","Object","keys","workflowPredicateFields","workflowPredicateFieldFailurePolicy","workflowPredicateFieldMinimumFillTargets","getWorkflowContextDefinition","getWorkflowContextAvailability","definition","getWorkflowContextHost","resolveContextRootHost","root","isWorkflowContextName","isWorkflowContextReservedRoot","resolveContextRootAvailability","reservedRoot","getWorkflowContextSensitivity","rootsAvailableAt","site","targetSiteIndex","indexOf","filter","unavailableRootsAt","roots","availableRoots","Set","has","getWorkflowContextTypeEnvironment","context","getWorkflowContextUntrustedPaths","workflowInterpolationFieldAcceptsTrustTier","field","includes","workflowInterpolationFieldAcceptsHost","workflowInterpolationFieldAcceptsContext","workflowContextRootRequiresLiteralKey","getWorkflowInterpolationFieldFailurePolicy","getWorkflowInterpolationFieldMinimumFillTarget","policy","getWorkflowPredicateFieldMinimumFillTarget","workflowContextAvailabilityReference","map","noServerAvailabilityReferenceEntry","availabilityReferenceEntry","entries","reserved","availabilityIndex","availableAt","fromEntries","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 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":"AAEA,SAEEA,oCAAoC,QAC/B,oCAAoC;AAE3C,OAAO,MAAMC,uBAAuB;IAClC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAU;AAGX,OAAO,MAAMC,oBAAoB;IAC/B,iFAAiF;IACjF;IACA,8DAA8D;IAC9D;IACA,4EAA4E;IAC5E;IACA,mGAAmG;IACnG;IACA,oFAAoF;IACpF;IACA,yEAAyE;IACzE;IACA,kEAAkE;IAClE;IACA,iEAAiE;IACjE;CACD,CAAU;AAGX,OAAO,MAAMC,mBAAmB,cAAc;AAG9C,OAAO,MAAMC,+BAA+B;IAAC;IAAe;CAAY,CAAU;AAGlF,OAAO,MAAMC,uBAAuB;IAAC;IAAU;CAAS,CAAU;AAOlE,OAAO,MAAMC,+BAA+B;IAC1CC,QAAQ;QAACC,MAAM;QAAUC,cAAc;IAAgB;IACvDC,QAAQ;QAACF,MAAM;IAAQ;AACzB,EAA4D;AAoC5D,8EAA8E;AAC9E,iDAAiD;AACjD,MAAMG,0BAA0B;IAC9BC,UAAU;QACRC,MAAM;QACNC,QAAQ;YACNC,IAAI;YACJC,MAAM;QACR;IACF;AACF;AAEA,MAAMC,qBAAqB;IACzBC,KAAK;QACHL,MAAM;QACNC,QAAQ;YACNC,IAAI;YACJI,QAAQ;YACRH,MAAM;YACNI,YAAY;YACZC,cAAc;YACdC,YAAY;QACd;IACF;AACF;AAEA,MAAMC,yBAAyB;IAC7BC,SAAS;QACPX,MAAM;QACNC,QAAQ;YAACC,IAAI;QAAQ;IACvB;IACAU,YAAY;IACZC,KAAK;IACLC,QAAQ;AACV;AAEA,MAAMC,yBAAyB;IAC7BC,SAAS;QACPhB,MAAM;QACNC,QAAQ;YACNgB,QAAQ;YACRC,OAAO;YACP,GAAGR,sBAAsB;QAC3B;IACF;AACF;AAEA,MAAMS,qBAAqB;IACzBC,KAAK;QACHpB,MAAM;QACNC,QAAQ;YACNoB,KAAK;YACLlB,MAAM;QACR;IACF;AACF;AAEA,MAAMmB,qBAAqB;IACzBtB,MAAM;IACNC,QAAQ;QACNgB,QAAQ;QACRC,OAAO;QACPK,aAAa;QACbC,aAAa;QACb,GAAGd,sBAAsB;QACzBe,MAAM;YACJzB,MAAM;YACNC,QAAQ,CAAC;QACX;IACF;AACF;AAEA,MAAMyB,gBAAgB;IACpB1B,MAAM;IACNC,QAAQ;QACN0B,OAAO;QACPxB,MAAM;QACNyB,QAAQ;QACRC,YAAY;QACZC,aAAa;QACbC,QAAQ;YACN/B,MAAM;YACNgC,SAASV;QACX;QACAW,SAAS;YAACjC,MAAM;QAAK;IACvB;AACF;AAEA,MAAMkC,4BAA4B;IAChCC,YAAY;QACVnC,MAAM;QACNgC,SAASN;IACX;AACF;AAEA,MAAMU,2BAA2B;IAC/BC,WAAW;QACTrC,MAAM;QACNC,QAAQ;YACN,GAAGyB,cAAczB,MAAM;YACvBqC,QAAQ;QACV;IACF;AACF;AAEA,MAAMC,eAAe;IACnBvC,MAAM;IACNC,QAAQ;QACNuC,QAAQ;QACRvB,QAAQ;QACRwB,QAAQ;QACRC,WAAW;IACb;AACF;AAEA,MAAMC,kBAAkB;IACtB3C,MAAM;IACNC,QAAQ;QACN2B,QAAQ;QACRc,WAAW;QACXT,SAAS;YAACjC,MAAM;QAAK;QACrB4C,UAAU;QACVC,MAAMN;IACR;AACF;AAEA,MAAMO,iBAAiB;IACrB9C,MAAM;IACNC,QAAQ;QACN,GAAG0C,gBAAgB1C,MAAM;QACzB8C,UAAU;YACR/C,MAAM;YACNgC,SAASW;QACX;IACF;AACF;AAEA,MAAMK,8BAA8B;IAClCC,MAAM;QACJjD,MAAM;QACNC,QAAQ;YACNiD,SAAS;YACTC,UAAU;YACVC,SAAS;gBACPpD,MAAM;gBACNC,QAAQ;oBACNoD,MAAMP;oBACNQ,UAAU;gBACZ;YACF;QACF;IACF;AACF;AAEA,MAAMC,4BAA4B;IAChCN,MAAM;QACJjD,MAAM;QACNC,QAAQ;YACNyC,WAAW;YACXd,QAAQ;YACRK,SAAS;gBAACjC,MAAM;YAAK;QACvB;IACF;AACF;AAEA,MAAMwD,sBAAsB;IAC1BP,MAAM;QACJjD,MAAM;QACNC,QAAQ;YACN,GAAG+C,4BAA4BC,IAAI,CAAChD,MAAM;YAC1C,GAAGsD,0BAA0BN,IAAI,CAAChD,MAAM;QAC1C;IACF;AACF;AAcA,OAAO,SAASwD,2BAA2BC,MAK1C;IACC,OAAO;QACL,GAAIA,OAAOC,KAAK,KAAKC,YAAY,CAAC,IAAI;YAACD,OAAOE,cAAcH,OAAOC,KAAK;QAAC,CAAC;QAC1E,GAAID,OAAOI,WAAW,KAAKF,YAAY,CAAC,IAAI;YAACX,MAAMc,aAAaL,OAAOI,WAAW;QAAC,CAAC;QACpF,GAAIJ,OAAOM,IAAI,KAAKJ,YAAY,CAAC,IAAI;YAACI,MAAMC,aAAaP,OAAOM,IAAI;QAAC,CAAC;QACtE,GAAIN,OAAOQ,KAAK,KAAKN,YAAY,CAAC,IAAI;YAACM,OAAOC;QAAe,CAAC;IAChE;AACF;AAEA,OAAO,MAAMC,6BAA6B;IACxCrE,UAAU;QACRH,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiB1E;IACnB;IACAO,KAAK;QACHT,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiBpE;IACnB;IACAY,SAAS;QACPpB,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiBzD;IACnB;IACAG,OAAO;QACLtB,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;IACb;IACAE,QAAQ;QACN7E,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;IACb;IACAnD,KAAK;QACHxB,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiBrD;IACnB;IACAgB,YAAY;QACVvC,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiBtC;IACnB;IACAG,WAAW;QACTzC,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiBpC;IACnB;IACA4B,MAAM;QACJpE,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;IACb;IACAL,OAAO;QACLtE,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiB;YAACN,OAAO;gBAAClE,MAAM;gBAAQgC,SAAS0C,cAAc;oBAACrD,KAAK;gBAAO;YAAE;QAAC;IACjF;IACAsC,OAAO;QACL/D,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;IACb;IACAtB,MAAM;QACJrD,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXC,iBAAiBhB;IACnB;IACAmB,MAAM;QACJ/E,cAAc;QACdyE,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXK,gBAAgB;IAClB;IACAC,SAAS;QACPR,aAAa;QACb1E,MAAM;QACN2E,OAAO;QACPC,WAAW;QACXK,gBAAgB;IAClB;AACF,EAA4E;AAsB5E,OAAO,MAAME,+BAA+B;IAAC;IAAQ;IAAW;CAAc,CAAU;AAcxF,MAAMC,kBAAkD;IAAC;CAAS;AAClE,MAAMC,UAA0C;IAAC;IAAU;CAAS;AAEpE,OAAO,MAAMC,qCAET;IACF5E,KAAK;QACH6E,eAAeF;QACfG,eAAe;IACjB;IACA,aAAa;QACXD,eAAeF;QACfG,eAAe;IACjB;IACA,gBAAgB;QACdD,eAAeH;QACfI,eAAe;IACjB;IACA,eAAe;QACbD,eAAeH;QACfI,eAAe;IACjB;IACA,kBAAkB;QAChBD,eAAeH;QACfI,eAAe;IACjB;IACA,kBAAkB;QAChBD,eAAeH;QACfI,eAAe;IACjB;IACA,cAAc;QACZD,eAAeH;QACfI,eAAe;IACjB;IACA,eAAe;QACbD,eAAeH;QACfI,eAAe;QACfC,mBAAmB;IACrB;IACA,qBAAqB;QACnBF,eAAeH;QACfI,eAAe;QACfC,mBAAmB;QACnBC,eAAe;YAACC,MAAM;YAAOjE,KAAK;QAAM;IAC1C;IACA,sBAAsB;QACpB6D,eAAeH;QACfI,eAAe;QACfC,mBAAmB;QACnBC,eAAe;YAACC,MAAM;YAAajE,KAAK;QAAM;IAChD;IACA,aAAa;QACX6D,eAAeH;QACfI,eAAe;IACjB;IACA,0BAA0B;QACxBD,eAAeH;QACfI,eAAe;IACjB;IACA,iBAAiB;QACfD,eAAeH;QACfI,eAAe;IACjB;IACA,oBAAoB;QAClBD,eAAeH;QACfI,eAAe;IACjB;IACA,uBAAuB;QACrBD,eAAeH;QACfI,eAAe;IACjB;IACA,uBAAuB;QACrBD,eAAeH;QACfI,eAAe;IACjB;IACA,gBAAgB;QACdD,eAAeH;QACfI,eAAe;IACjB;IACA,iBAAiB;QACfD,eAAeH;QACfI,eAAe;IACjB;AACF,EAAE;AAEF,OAAO,MAAMI,8BAA8BC,OAAOC,IAAI,CACpDR,oCACyC;AAE3C,OAAO,MAAMS,0BAA0B;IACrC;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAU;AAGX,MAAMC,gCAAgC;IACpC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED;;;;;;CAMC,GACD,OAAO,MAAMC,gCAAgC;IAC3C,gBAAgB;QAAC;QAAQ;KAAO;IAChC,eAAe;QAAC;QAAc;QAAQ;KAAO;IAC7C,kBAAkB;QAAC;QAAS;KAAU;IACtC,eAAeD;IACf,kBAAkBA;IAClB,UAAU;QAAC;QAAY;QAAO;QAAW;QAAS;QAAU;QAAQ;QAAQ;KAAQ;IACpF,WAAW;QAAC;QAAQ;QAAQ;QAAa;QAAQ;KAAQ;AAC3D,EAAoF;AAMpF,OAAO,MAAME,sCACX,cAA4D;AAE9D,MAAMC,2CAA2C;IAC/C,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,UAAU;IACV,WAAW;AACb;AAEA,MAAMC,yCAEF;IACF,gBAAgBxC;IAChB,WAAWP;AACb;AAEA,OAAO,SAASgD,6BAA6B7F,IAAyB;IACpE,OAAOiE,0BAA0B,CAACjE,KAAK;AACzC;AAEA,OAAO,SAAS8F,+BACd9F,IAAyB;IAEzB,MAAM+F,aAAa9B,0BAA0B,CAACjE,KAAK;IACnD,OAAO+F,WAAWvG,IAAI,KAAK,WAAWuG,WAAWtG,YAAY,GAAGgE;AAClE;AAEA,OAAO,SAASuC,uBAAuBhG,IAAyB;IAC9D,OAAOiE,0BAA0B,CAACjE,KAAK,CAACR,IAAI;AAC9C;AAEA,OAAO,SAASyG,uBAAuBd,IAAY;IACjD,IAAIe,sBAAsBf,OAAO,OAAOlB,0BAA0B,CAACkB,KAAK,CAAC3F,IAAI;IAC7E,IAAI2G,8BAA8BhB,OAAO,OAAO7F,4BAA4B,CAAC6F,KAAK,CAAC3F,IAAI;IACvF,OAAOiE;AACT;AAEA,OAAO,SAAS2C,+BAA+BjB,IAAY;IACzD,IAAIe,sBAAsBf,OAAO;QAC/B,MAAMY,aAAa9B,0BAA0B,CAACkB,KAAK;QACnD,OAAOY,WAAWvG,IAAI,KAAK,WAAWuG,WAAWtG,YAAY,GAAGgE;IAClE;IAEA,IAAI,CAAC0C,8BAA8BhB,OAAO,OAAO1B;IACjD,MAAM4C,eAAe/G,4BAA4B,CAAC6F,KAAK;IACvD,OAAOkB,aAAa7G,IAAI,KAAK,WAAW6G,aAAa5G,YAAY,GAAGgE;AACtE;AAEA,OAAO,SAAS6C,8BACdtG,IAAyB;IAEzB,OAAOiE,0BAA0B,CAACjE,KAAK,CAACkE,WAAW;AACrD;AAEA,OAAO,SAASqC,iBAAiBC,IAAsB;IACrD,MAAMC,kBAAkBvH,kBAAkBwH,OAAO,CAACF;IAClD,OAAOvH,qBAAqB0H,MAAM,CAAC,CAAC3G;QAClC,MAAM+F,aAAa9B,0BAA0B,CAACjE,KAAK;QACnD,OACE+F,WAAWvG,IAAI,KAAK,YACpBN,kBAAkBwH,OAAO,CAACX,WAAWtG,YAAY,KAAKgH;IAE1D;AACF;AAEA,OAAO,SAASG,mBACdC,KAAqC,EACrCL,IAAsB;IAEtB,MAAMM,iBAAiB,IAAIC,IAAIR,iBAAiBC;IAChD,OAAOK,MAAMF,MAAM,CAAC,CAACxB,OAAS,CAAC2B,eAAeE,GAAG,CAAC7B;AACpD;AAEA,OAAO,SAAS8B,kCACdjH,IAAyB;IAEzB,MAAMkH,UAAUrB,6BAA6B7F;IAC7C,OAAOkH,QAAQ/C,KAAK,KAAK,UAAU+C,QAAQ7C,eAAe,GAAGZ;AAC/D;AAEA,OAAO,SAAS0D,sCACdC,KAAiC,EACjC5H,IAAyB;IAEzB,OAAOsF,kCAAkC,CAACsC,MAAM,CAACrC,aAAa,CAACsC,QAAQ,CAAC7H;AAC1E;AAEA,OAAO,SAAS8H,sCAAsCnC,IAAY;IAChE,IAAI,CAACe,sBAAsBf,OAAO,OAAO;IACzC,MAAMY,aAAa9B,0BAA0B,CAACkB,KAAK;IACnD,OAAO,oBAAoBY,cAAcA,WAAWtB,cAAc,KAAK;AACzE;AAEA,OAAO,SAAS8C,2CACdH,KAAiC;IAEjC,OAAOtC,kCAAkC,CAACsC,MAAM,CAACpC,aAAa;AAChE;AAEA,OAAO,SAASwC,2CACdJ,KAAiC;IAEjC,OAAOtC,kCAAkC,CAACsC,MAAM,CAAClC,aAAa;AAChE;AAEA,OAAO,SAASuC,+CACdL,KAAiC;IAEjC,MAAMM,SAAS5C,kCAAkC,CAACsC,MAAM;IACxD,OAAO,uBAAuBM,SAASA,OAAOzC,iBAAiB,GAAGxB;AACpE;AAEA,OAAO,SAASkE,2CACdP,KAA6B;IAE7B,OAAOzB,wCAAwC,CAACyB,MAAM;AACxD;AAEA,OAAO,SAASQ,yCACdR,KAA6B,EAC7BjC,IAAyB;IAEzB,MAAMd,kBACJuB,sCAAsC,CAACwB,MAAM;IAC/C,IAAI/C,oBAAoBZ,WAAW,OAAOwD,kCAAkC9B;IAC5E,MAAM0C,WAAWxD,eAAe,CAACc,KAAK;IACtC,OAAO0C,aAAapE,YAAYwD,kCAAkC9B,QAAQ;QAAC,CAACA,KAAK,EAAE0C;IAAQ;AAC7F;AAEA,OAAO,SAASC,iCACdV,KAAY;IAEZ,OAAO3B,6BAA6B,CAAC2B,MAAM;AAC7C;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASW,qBACdX,KAA0D;IAE1D,IAAIY,yBAAyBZ,QAAQ,OAAO3B,6BAA6B,CAAC2B,MAAM;IAEhF,MAAM,EAACrC,aAAa,EAAC,GAAGD,kCAAkC,CAACsC,MAAM;IACjE,OAAOnI,qBAAqB0H,MAAM,CAAC,CAAC3G,OAClC+E,cAAcsC,QAAQ,CAACpD,0BAA0B,CAACjE,KAAK,CAACR,IAAI;AAEhE;AAEA,OAAO,SAASwI,yBAAyBZ,KAAa;IACpD,OAAO,AAAC7B,wBAA8C8B,QAAQ,CAACD;AACjE;AAEA,OAAO,SAASa,gCACdb,KAA6B,EAC7BF,OAA4C;IAE5C,MAAML,QAAQ,IAAIE,IAAIe,iCAAiCV;IACvD,OAAO/B,OAAO6C,WAAW,CACvB7C,OAAO8C,OAAO,CAACjB,SAASP,MAAM,CAAC,CAAC,CAACxB,KAAK,GAAK0B,MAAMG,GAAG,CAAC7B;AAEzD;AASA,OAAO,SAASiD;IACd,OAAO;WACFnJ,qBAAqBoJ,GAAG,CAAC,CAAClD;YAC3B,MAAMY,aAAa9B,0BAA0B,CAACkB,KAAK;YACnD,IAAIY,WAAWvG,IAAI,KAAK,UAAU,OAAO8I,mCAAmCnD,MAAM;YAClF,OAAOoD,2BAA2BpD,MAAMY,WAAWtG,YAAY,EAAE;QACnE;WACG4F,OAAO8C,OAAO,CAAC7I,8BAA8B+I,GAAG,CAAC,CAAC,CAAClD,MAAMY,WAAW;YACrE,IAAIA,WAAWvG,IAAI,KAAK,UAAU;gBAChC,OAAO8I,mCAAmCnD,MAAqC;YACjF;YACA,OAAOoD,2BACLpD,MACAY,WAAWtG,YAAY,EACvB;QAEJ;KACD;AACH;AAEA,SAAS8I,2BACPpD,IAAuD,EACvD1F,YAA8B,EAC9B+I,QAAiB;IAEjB,MAAMC,oBAAoBvJ,kBAAkBwH,OAAO,CAACjH;IACpD,MAAMiJ,cAAcrD,OAAO6C,WAAW,CACpChJ,kBAAkBmJ,GAAG,CAAC,CAAC7B,OAAS;YAACA;YAAMtH,kBAAkBwH,OAAO,CAACF,SAASiC;SAAkB;IAG9F,OAAO;QAACtD;QAAM1F;QAAc+I;QAAUE;IAAW;AACnD;AAEA,SAASJ,mCACPnD,IAAuD,EACvDqD,QAAiB;IAEjB,MAAME,cAAcrD,OAAO6C,WAAW,CAAChJ,kBAAkBmJ,GAAG,CAAC,CAAC7B,OAAS;YAACA;YAAM;SAAM;IAKpF,OAAO;QAACrB;QAAMqD;QAAUE;IAAW;AACrC;AAEA,SAAShF,cAAcF,KAAyC;IAC9D,OAAO;QACL3D,MAAM;QACNC,QAAQuF,OAAO6C,WAAW,CAAC1E,MAAM6E,GAAG,CAAC,CAACvF,OAAS;gBAACA,KAAK5B,GAAG;gBAAEyH,sBAAsB7F;aAAM;IACxF;AACF;AAEA,SAAS6F,sBAAsB7F,IAA6B;IAC1D,MAAM8F,cAAcC,0BAA0BC,mBAAmBhG;IACjE,OAAO;QACLjD,MAAM;QACNC,QAAQ;YACN,GAAG8I,YAAY9I,MAAM;YACrB8C,UAAU;gBACR/C,MAAM;gBACNgC,SAAS+G;YACX;QACF;IACF;AACF;AAEA,SAAShF,aAAad,IAA6B;IACjD,OAAO;QACLjD,MAAM;QACNC,QAAQ;YACN,GAAGuD,oBAAoBP,IAAI,CAAChD,MAAM;YAClCgC,SAASgH,mBAAmBhG;QAC9B;IACF;AACF;AAEA,SAAS+F,0BAA0B/G,OAAuB;IACxD,OAAO;QACLjC,MAAM;QACNC,QAAQ;YACN,GAAG0C,gBAAgB1C,MAAM;YACzBgC;QACF;IACF;AACF;AAEA,SAASgH,mBAAmBhG,IAA6B;IACvD,IAAIA,KAAKhB,OAAO,KAAK2B,WAAW,OAAO;QAAC5D,MAAM;IAAK;IACnD,OAAO;QAACA,MAAM;QAAUC,QAAQd,qCAAqC8D,KAAKhB,OAAO;IAAC;AACpF;AAEA,SAASgC,aAAaD,IAAuC;IAC3D,OAAO;QACLhE,MAAM;QACNC,QAAQuF,OAAO6C,WAAW,CAACrE,KAAKwE,GAAG,CAAC,CAACpH,MAAQ;gBAACA,IAAIC,GAAG;gBAAEqD,cAActD;aAAK;IAC5E;AACF;AAEA,SAAS+C;IACP,OAAO;QACLnE,MAAM;QACNgC,SAASkH;IACX;AACF;AAEA,SAASA;IACP,OAAO;QACLlJ,MAAM;QACNC,QAAQ;YACNoB,KAAK;YACLO,QAAQ;YACRK,SAAS;gBAACjC,MAAM;YAAK;YACrBmC,YAAY;gBACVnC,MAAM;gBACNgC,SAASmH,yBAAyB;oBAACnJ,MAAM;gBAAK;YAChD;QACF;IACF;AACF;AAEA,SAAS0E,cAActD,GAA2B;IAChD,MAAMa,UAAUmH,eAAehI;IAC/B,MAAMiB,YAAY8G,yBAAyBlH;IAC3C,OAAO;QACLjC,MAAM;QACNC,QAAQ;YACNoB,KAAK;YACLO,QAAQ;YACRK;YACAE,YAAY;gBACVnC,MAAM;gBACNgC,SAASK;YACX;QACF;IACF;AACF;AAEA,SAAS+G,eAAehI,GAA2B;IACjD,OAAOA,IAAIa,OAAO,KAAK2B,YAClB;QAAC5D,MAAM;IAAK,IACZ;QAACA,MAAM;QAAUC,QAAQmB,IAAIa,OAAO;IAAA;AAC3C;AAEA,SAASkH,yBAAyBlH,OAAuB;IACvD,OAAO;QACLjC,MAAM;QACNC,QAAQ;YACN,GAAGyB,cAAczB,MAAM;YACvBgC;QACF;IACF;AACF;AAEA,SAASoE,sBAAsBf,IAAY;IACzC,OAAOE,OAAO6D,MAAM,CAACjF,4BAA4BkB;AACnD;AAEA,SAASgB,8BAA8BhB,IAAY;IACjD,OAAOE,OAAO6D,MAAM,CAAC5J,8BAA8B6F;AACrD"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@shipfox/expression",
3
3
  "license": "MIT",
4
4
  "private": false,
5
- "version": "1.2.0",
5
+ "version": "2.0.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": "2.1.3"
26
+ "@shipfox/workflow-document": "3.0.0"
27
27
  },
28
28
  "shipfox": {
29
29
  "architecture": {
@@ -1,5 +0,0 @@
1
- export declare function extractCelUntrustedPathAccesses(params: {
2
- source: string;
3
- untrustedPathsByRoot: ReadonlyMap<string, readonly string[]>;
4
- }): string[];
5
- //# sourceMappingURL=extract-cel-untrusted-path-accesses.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-cel-untrusted-path-accesses.d.ts","sourceRoot":"","sources":["../../src/template/extract-cel-untrusted-path-accesses.ts"],"names":[],"mappings":"AAiBA,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;CAC9D,GAAG,MAAM,EAAE,CASX"}
@@ -1,140 +0,0 @@
1
- import { parse as parseCel } from '@marcbachmann/cel-js';
2
- const binaryOperators = new Set([
3
- '!=',
4
- '==',
5
- 'in',
6
- '+',
7
- '-',
8
- '*',
9
- '/',
10
- '%',
11
- '<',
12
- '<=',
13
- '>',
14
- '>='
15
- ]);
16
- export function extractCelUntrustedPathAccesses(params) {
17
- const roots = new Set();
18
- collectUntrustedPathAccesses(parseCel(params.source).ast, params.untrustedPathsByRoot, roots, new Map());
19
- return [
20
- ...roots
21
- ].sort();
22
- }
23
- function collectUntrustedPathAccesses(node, untrustedPathsByRoot, roots, aliases) {
24
- if (binaryOperators.has(node.op) || node.op === '||' || node.op === '&&') {
25
- collectBinaryUntrustedPathAccesses(node.args, untrustedPathsByRoot, roots, aliases);
26
- return;
27
- }
28
- switch(node.op){
29
- case 'id':
30
- case 'value':
31
- return;
32
- case '.':
33
- case '.?':
34
- {
35
- const [target, field] = node.args;
36
- collectUntrustedPathAccesses(target, untrustedPathsByRoot, roots, aliases);
37
- const root = rootName(target, aliases);
38
- if (root && untrustedPathsByRoot.get(root)?.includes(field)) roots.add(root);
39
- return;
40
- }
41
- case '[]':
42
- case '[?]':
43
- {
44
- const [target, key] = node.args;
45
- collectUntrustedPathAccesses(target, untrustedPathsByRoot, roots, aliases);
46
- collectUntrustedPathAccesses(key, untrustedPathsByRoot, roots, aliases);
47
- const root = rootName(target, aliases);
48
- if (!root || !untrustedPathsByRoot.has(root)) return;
49
- const field = literalFieldName(key);
50
- if (field !== undefined) {
51
- if (untrustedPathsByRoot.get(root)?.includes(field)) roots.add(root);
52
- return;
53
- }
54
- if (!isAllowedListIndex(target, root)) roots.add(root);
55
- return;
56
- }
57
- case 'call':
58
- for (const argument of node.args[1]){
59
- collectUntrustedPathAccesses(argument, untrustedPathsByRoot, roots, aliases);
60
- }
61
- return;
62
- case 'rcall':
63
- {
64
- const [method, receiver, args] = node.args;
65
- collectUntrustedPathAccesses(receiver, untrustedPathsByRoot, roots, aliases);
66
- const nextAliases = comprehensionAliases(method, receiver, args, aliases);
67
- for (const argument of args){
68
- collectUntrustedPathAccesses(argument, untrustedPathsByRoot, roots, nextAliases);
69
- }
70
- return;
71
- }
72
- case 'list':
73
- for (const element of node.args){
74
- collectUntrustedPathAccesses(element, untrustedPathsByRoot, roots, aliases);
75
- }
76
- return;
77
- case 'map':
78
- for (const [key, value] of node.args){
79
- collectUntrustedPathAccesses(key, untrustedPathsByRoot, roots, aliases);
80
- collectUntrustedPathAccesses(value, untrustedPathsByRoot, roots, aliases);
81
- }
82
- return;
83
- case '?:':
84
- collectUntrustedPathAccesses(node.args[0], untrustedPathsByRoot, roots, aliases);
85
- collectUntrustedPathAccesses(node.args[1], untrustedPathsByRoot, roots, aliases);
86
- collectUntrustedPathAccesses(node.args[2], untrustedPathsByRoot, roots, aliases);
87
- return;
88
- case '!_':
89
- case '-_':
90
- collectUntrustedPathAccesses(node.args, untrustedPathsByRoot, roots, aliases);
91
- return;
92
- }
93
- throw new Error(`Unsupported CEL AST operator: ${node.op}`);
94
- }
95
- function collectBinaryUntrustedPathAccesses([left, right], untrustedPathsByRoot, roots, aliases) {
96
- collectUntrustedPathAccesses(left, untrustedPathsByRoot, roots, aliases);
97
- collectUntrustedPathAccesses(right, untrustedPathsByRoot, roots, aliases);
98
- }
99
- function rootName(node, aliases) {
100
- switch(node.op){
101
- case 'id':
102
- return aliases.get(node.args) ?? node.args;
103
- case '.':
104
- case '.?':
105
- return rootName(node.args[0], aliases);
106
- case '[]':
107
- case '[?]':
108
- return rootName(node.args[0], aliases);
109
- default:
110
- return undefined;
111
- }
112
- }
113
- function literalFieldName(node) {
114
- return node.op === 'value' && typeof node.args === 'string' ? node.args : undefined;
115
- }
116
- function isAllowedListIndex(target, root) {
117
- return root === 'executions' && target.op === 'id';
118
- }
119
- function comprehensionAliases(method, receiver, args, aliases) {
120
- if (![
121
- 'all',
122
- 'exists',
123
- 'exists_one',
124
- 'filter',
125
- 'map'
126
- ].includes(method)) return aliases;
127
- const [alias] = args;
128
- if (alias?.op !== 'id') return aliases;
129
- const root = rootName(receiver, aliases);
130
- if (root !== 'executions') return aliases;
131
- return new Map([
132
- ...aliases,
133
- [
134
- alias.args,
135
- root
136
- ]
137
- ]);
138
- }
139
-
140
- //# sourceMappingURL=extract-cel-untrusted-path-accesses.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/template/extract-cel-untrusted-path-accesses.ts"],"sourcesContent":["import {type ASTNode, type BinaryOperator, parse as parseCel} from '@marcbachmann/cel-js';\n\nconst binaryOperators = new Set<BinaryOperator>([\n '!=',\n '==',\n 'in',\n '+',\n '-',\n '*',\n '/',\n '%',\n '<',\n '<=',\n '>',\n '>=',\n]);\n\nexport function extractCelUntrustedPathAccesses(params: {\n source: string;\n untrustedPathsByRoot: ReadonlyMap<string, readonly string[]>;\n}): string[] {\n const roots = new Set<string>();\n collectUntrustedPathAccesses(\n parseCel(params.source).ast,\n params.untrustedPathsByRoot,\n roots,\n new Map(),\n );\n return [...roots].sort();\n}\n\nfunction collectUntrustedPathAccesses(\n node: ASTNode,\n untrustedPathsByRoot: ReadonlyMap<string, readonly string[]>,\n roots: Set<string>,\n aliases: ReadonlyMap<string, string>,\n): void {\n if (binaryOperators.has(node.op as BinaryOperator) || node.op === '||' || node.op === '&&') {\n collectBinaryUntrustedPathAccesses(\n node.args as [ASTNode, ASTNode],\n untrustedPathsByRoot,\n roots,\n aliases,\n );\n return;\n }\n\n switch (node.op) {\n case 'id':\n case 'value':\n return;\n case '.':\n case '.?': {\n const [target, field] = node.args as [ASTNode, string];\n collectUntrustedPathAccesses(target, untrustedPathsByRoot, roots, aliases);\n const root = rootName(target, aliases);\n if (root && untrustedPathsByRoot.get(root)?.includes(field)) roots.add(root);\n return;\n }\n case '[]':\n case '[?]': {\n const [target, key] = node.args as [ASTNode, ASTNode];\n collectUntrustedPathAccesses(target, untrustedPathsByRoot, roots, aliases);\n collectUntrustedPathAccesses(key, untrustedPathsByRoot, roots, aliases);\n const root = rootName(target, aliases);\n if (!root || !untrustedPathsByRoot.has(root)) return;\n\n const field = literalFieldName(key);\n if (field !== undefined) {\n if (untrustedPathsByRoot.get(root)?.includes(field)) roots.add(root);\n return;\n }\n\n if (!isAllowedListIndex(target, root)) roots.add(root);\n return;\n }\n case 'call':\n for (const argument of node.args[1]) {\n collectUntrustedPathAccesses(argument, untrustedPathsByRoot, roots, aliases);\n }\n return;\n case 'rcall': {\n const [method, receiver, args] = node.args as [string, ASTNode, ASTNode[]];\n collectUntrustedPathAccesses(receiver, untrustedPathsByRoot, roots, aliases);\n const nextAliases = comprehensionAliases(method, receiver, args, aliases);\n for (const argument of args) {\n collectUntrustedPathAccesses(argument, untrustedPathsByRoot, roots, nextAliases);\n }\n return;\n }\n case 'list':\n for (const element of node.args) {\n collectUntrustedPathAccesses(element, untrustedPathsByRoot, roots, aliases);\n }\n return;\n case 'map':\n for (const [key, value] of node.args) {\n collectUntrustedPathAccesses(key, untrustedPathsByRoot, roots, aliases);\n collectUntrustedPathAccesses(value, untrustedPathsByRoot, roots, aliases);\n }\n return;\n case '?:':\n collectUntrustedPathAccesses(node.args[0], untrustedPathsByRoot, roots, aliases);\n collectUntrustedPathAccesses(node.args[1], untrustedPathsByRoot, roots, aliases);\n collectUntrustedPathAccesses(node.args[2], untrustedPathsByRoot, roots, aliases);\n return;\n case '!_':\n case '-_':\n collectUntrustedPathAccesses(node.args, untrustedPathsByRoot, roots, aliases);\n return;\n }\n\n throw new Error(`Unsupported CEL AST operator: ${(node as {op: string}).op}`);\n}\n\nfunction collectBinaryUntrustedPathAccesses(\n [left, right]: [ASTNode, ASTNode],\n untrustedPathsByRoot: ReadonlyMap<string, readonly string[]>,\n roots: Set<string>,\n aliases: ReadonlyMap<string, string>,\n): void {\n collectUntrustedPathAccesses(left, untrustedPathsByRoot, roots, aliases);\n collectUntrustedPathAccesses(right, untrustedPathsByRoot, roots, aliases);\n}\n\nfunction rootName(node: ASTNode, aliases: ReadonlyMap<string, string>): string | undefined {\n switch (node.op) {\n case 'id':\n return aliases.get(node.args) ?? node.args;\n case '.':\n case '.?':\n return rootName(node.args[0], aliases);\n case '[]':\n case '[?]':\n return rootName(node.args[0], aliases);\n default:\n return undefined;\n }\n}\n\nfunction literalFieldName(node: ASTNode): string | undefined {\n return node.op === 'value' && typeof node.args === 'string' ? node.args : undefined;\n}\n\nfunction isAllowedListIndex(target: ASTNode, root: string): boolean {\n return root === 'executions' && target.op === 'id';\n}\n\nfunction comprehensionAliases(\n method: string,\n receiver: ASTNode,\n args: readonly ASTNode[],\n aliases: ReadonlyMap<string, string>,\n): ReadonlyMap<string, string> {\n if (!['all', 'exists', 'exists_one', 'filter', 'map'].includes(method)) return aliases;\n\n const [alias] = args;\n if (alias?.op !== 'id') return aliases;\n\n const root = rootName(receiver, aliases);\n if (root !== 'executions') return aliases;\n\n return new Map([...aliases, [alias.args, root]]);\n}\n"],"names":["parse","parseCel","binaryOperators","Set","extractCelUntrustedPathAccesses","params","roots","collectUntrustedPathAccesses","source","ast","untrustedPathsByRoot","Map","sort","node","aliases","has","op","collectBinaryUntrustedPathAccesses","args","target","field","root","rootName","get","includes","add","key","literalFieldName","undefined","isAllowedListIndex","argument","method","receiver","nextAliases","comprehensionAliases","element","value","Error","left","right","alias"],"mappings":"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"}