@shipfox/api-workflows 12.7.0 → 13.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 (97) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/CHANGELOG.md +9 -0
  3. package/dist/db/index.d.ts +1 -1
  4. package/dist/db/index.d.ts.map +1 -1
  5. package/dist/db/index.js +1 -1
  6. package/dist/db/index.js.map +1 -1
  7. package/dist/db/job-listeners.d.ts.map +1 -1
  8. package/dist/db/job-listeners.js +17 -1
  9. package/dist/db/job-listeners.js.map +1 -1
  10. package/dist/db/workflow-runs/job-executions.d.ts +2 -3
  11. package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
  12. package/dist/db/workflow-runs/job-executions.js +48 -20
  13. package/dist/db/workflow-runs/job-executions.js.map +1 -1
  14. package/dist/db/workflow-runs/outbox.d.ts +15 -0
  15. package/dist/db/workflow-runs/outbox.d.ts.map +1 -1
  16. package/dist/db/workflow-runs/outbox.js +35 -1
  17. package/dist/db/workflow-runs/outbox.js.map +1 -1
  18. package/dist/db/workflow-runs/run-graph.d.ts.map +1 -1
  19. package/dist/db/workflow-runs/run-graph.js +12 -0
  20. package/dist/db/workflow-runs/run-graph.js.map +1 -1
  21. package/dist/db/workflow-runs/run-status.d.ts.map +1 -1
  22. package/dist/db/workflow-runs/run-status.js +13 -1
  23. package/dist/db/workflow-runs/run-status.js.map +1 -1
  24. package/dist/db/workflow-runs.d.ts +2 -2
  25. package/dist/db/workflow-runs.d.ts.map +1 -1
  26. package/dist/db/workflow-runs.js +2 -2
  27. package/dist/db/workflow-runs.js.map +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -4
  30. package/dist/index.js.map +1 -1
  31. package/dist/presentation/index.d.ts +1 -1
  32. package/dist/presentation/index.d.ts.map +1 -1
  33. package/dist/presentation/index.js +1 -1
  34. package/dist/presentation/index.js.map +1 -1
  35. package/dist/presentation/subscribers/index.d.ts +0 -1
  36. package/dist/presentation/subscribers/index.d.ts.map +1 -1
  37. package/dist/presentation/subscribers/index.js +0 -1
  38. package/dist/presentation/subscribers/index.js.map +1 -1
  39. package/dist/temporal/activities/index.d.ts +2 -18
  40. package/dist/temporal/activities/index.d.ts.map +1 -1
  41. package/dist/temporal/activities/index.js +3 -5
  42. package/dist/temporal/activities/index.js.map +1 -1
  43. package/dist/temporal/activities/orchestration-activities.d.ts +5 -14
  44. package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
  45. package/dist/temporal/activities/orchestration-activities.js +13 -34
  46. package/dist/temporal/activities/orchestration-activities.js.map +1 -1
  47. package/dist/temporal/workflows/index.bundle.js +20 -68
  48. package/dist/temporal/workflows/job-execution-orchestration.d.ts +0 -3
  49. package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -1
  50. package/dist/temporal/workflows/job-execution-orchestration.js +17 -41
  51. package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -1
  52. package/dist/temporal/workflows/job-listener-orchestration.d.ts +0 -3
  53. package/dist/temporal/workflows/job-listener-orchestration.d.ts.map +1 -1
  54. package/dist/temporal/workflows/job-listener-orchestration.js +1 -9
  55. package/dist/temporal/workflows/job-listener-orchestration.js.map +1 -1
  56. package/dist/temporal/workflows/run-orchestration.d.ts.map +1 -1
  57. package/dist/temporal/workflows/run-orchestration.js +2 -18
  58. package/dist/temporal/workflows/run-orchestration.js.map +1 -1
  59. package/dist/temporal/workflows/test-env.d.ts +4 -6
  60. package/dist/temporal/workflows/test-env.d.ts.map +1 -1
  61. package/dist/temporal/workflows/test-env.js +13 -24
  62. package/dist/temporal/workflows/test-env.js.map +1 -1
  63. package/dist/tsconfig.test.tsbuildinfo +1 -1
  64. package/package.json +3 -3
  65. package/src/db/index.ts +1 -1
  66. package/src/db/job-listeners.test.ts +21 -0
  67. package/src/db/job-listeners.ts +18 -0
  68. package/src/db/workflow-runs/job-executions.test.ts +110 -12
  69. package/src/db/workflow-runs/job-executions.ts +54 -29
  70. package/src/db/workflow-runs/outbox.ts +63 -0
  71. package/src/db/workflow-runs/run-graph.ts +17 -0
  72. package/src/db/workflow-runs/run-status.test.ts +13 -0
  73. package/src/db/workflow-runs/run-status.ts +15 -1
  74. package/src/db/workflow-runs.ts +3 -1
  75. package/src/index.ts +1 -5
  76. package/src/presentation/index.ts +0 -1
  77. package/src/presentation/subscribers/index.ts +0 -1
  78. package/src/temporal/activities/index.ts +2 -8
  79. package/src/temporal/activities/orchestration-activities.test.ts +17 -1
  80. package/src/temporal/activities/orchestration-activities.ts +13 -46
  81. package/src/temporal/workflows/job-execution-orchestration.test.ts +6 -25
  82. package/src/temporal/workflows/job-execution-orchestration.ts +17 -43
  83. package/src/temporal/workflows/job-listener-orchestration-continuation.test.ts +0 -3
  84. package/src/temporal/workflows/job-listener-orchestration.test.ts +9 -12
  85. package/src/temporal/workflows/job-listener-orchestration.ts +0 -8
  86. package/src/temporal/workflows/run-orchestration.test.ts +22 -33
  87. package/src/temporal/workflows/run-orchestration.ts +4 -28
  88. package/src/temporal/workflows/test-env.ts +14 -34
  89. package/test/fixtures/runners-inter-module.ts +0 -3
  90. package/test/helpers/workflow-runs.ts +25 -0
  91. package/tsconfig.build.tsbuildinfo +1 -1
  92. package/dist/presentation/subscribers/on-runner-job-queued.d.ts +0 -3
  93. package/dist/presentation/subscribers/on-runner-job-queued.d.ts.map +0 -1
  94. package/dist/presentation/subscribers/on-runner-job-queued.js +0 -20
  95. package/dist/presentation/subscribers/on-runner-job-queued.js.map +0 -1
  96. package/src/presentation/subscribers/on-runner-job-queued.test.ts +0 -57
  97. package/src/presentation/subscribers/on-runner-job-queued.ts +0 -23
@@ -10,11 +10,11 @@ export interface TestConfig {
10
10
  dag: RunDag;
11
11
  /** Map of jobId → status the mock runner should signal back */
12
12
  jobResults: Map<string, RuntimeCompletionStatus>;
13
- /** If set, enqueueJobExecutionForRunner will throw with this message instead of signaling */
14
- enqueueError?: string;
15
- /** If true, enqueueJobExecutionForRunner sends two job-finished signals (for dedup testing) */
13
+ /** If set, queueJobExecutionActivity will throw with this message instead of signaling */
14
+ queueError?: string;
15
+ /** If true, queueJobExecutionActivity sends two job-finished signals (for dedup testing) */
16
16
  duplicateSignal?: boolean;
17
- /** If true, enqueueJobExecutionForRunner does nothing without a signal for timeout testing */
17
+ /** If true, queueJobExecutionActivity does nothing without a signal for timeout testing */
18
18
  skipSignal?: boolean;
19
19
  /** If true, emit the claim but hold back the terminal outcome (for deadline testing) */
20
20
  skipOutcomeSignal?: boolean;
@@ -28,8 +28,6 @@ export interface TestConfig {
28
28
  leaseExpiredStatus?: RuntimeCompletionStatus;
29
29
  /** If set, resolveJobStatusFromJobExecutionsActivity throws with this message */
30
30
  resolveJobStatusError?: string;
31
- /** If set, releaseLeaseActivity throws (non-retryable) to prove the workflow still returns */
32
- releaseLeaseError?: string;
33
31
  /** Scripted job activation decisions keyed by job id; defaults to start */
34
32
  activationDecisions?: Map<string, JobActivationDecision>;
35
33
  /** If set, failJobExecutionAsTimedOutActivity throws (for timeout error-path testing) */
@@ -1 +1 @@
1
- {"version":3,"file":"test-env.d.ts","sourceRoot":"","sources":["../../../src/temporal/workflows/test-env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-env.d.ts","sourceRoot":"","sources":["../../../src/temporal/workflows/test-env.ts"],"names":[],"mappings":"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"}
@@ -180,37 +180,35 @@ function createMockActivities() {
180
180
  params
181
181
  });
182
182
  },
183
- cancelRunnerJobsActivity: (params)=>{
184
- calls.push({
185
- name: 'cancelRunnerJobsActivity',
186
- params
187
- });
188
- },
189
183
  // Scheduling is step-less. The mock runner reports the job outcome by signalling
190
184
  // the per-step terminal-completion signal (job-finished) and/or the lease-expiry
191
185
  // signal, reproducing the outbox → subscriber → signal rail.
192
- enqueueJobExecutionForRunner: async (params)=>{
186
+ queueJobExecutionActivity: async (params)=>{
193
187
  calls.push({
194
- name: 'enqueueJobExecutionForRunner',
188
+ name: 'queueJobExecutionActivity',
195
189
  params
196
190
  });
197
- if (cfg.enqueueError) {
191
+ if (cfg.queueError) {
198
192
  const { ApplicationFailure } = await import('@temporalio/common');
199
- throw ApplicationFailure.nonRetryable(cfg.enqueueError);
193
+ throw ApplicationFailure.nonRetryable(cfg.queueError);
200
194
  }
201
- if (cfg.skipSignal) return;
195
+ const queued = {
196
+ newVersion: nextVersion(),
197
+ status: 'pending'
198
+ };
199
+ if (cfg.skipSignal) return queued;
202
200
  const status = cfg.jobResults.get(params.jobId) ?? 'succeeded';
203
201
  const handle = testEnv.client.workflow.getHandle(`job:${params.jobId}`);
204
202
  await handle.signal(JOB_CLAIMED_SIGNAL, {
205
203
  jobExecutionId: params.jobExecutionId,
206
204
  claimedAt: cfg.claimedAt ?? '2026-06-22T10:05:00.000Z'
207
205
  });
208
- if (cfg.skipOutcomeSignal) return;
206
+ if (cfg.skipOutcomeSignal) return queued;
209
207
  if (cfg.signalLeaseExpired) {
210
208
  await handle.signal(JOB_LEASE_EXPIRED_SIGNAL, {
211
209
  jobExecutionId: params.jobExecutionId
212
210
  });
213
- return;
211
+ return queued;
214
212
  }
215
213
  if (cfg.signalBoth) {
216
214
  await handle.signal(JOB_FINISHED_SIGNAL, {
@@ -220,7 +218,7 @@ function createMockActivities() {
220
218
  await handle.signal(JOB_LEASE_EXPIRED_SIGNAL, {
221
219
  jobExecutionId: params.jobExecutionId
222
220
  });
223
- return;
221
+ return queued;
224
222
  }
225
223
  // The terminal outbox is independent from the claim, but the mock delivers it from the
226
224
  // pending → running activity. This gives the workflow a deterministic ordering boundary
@@ -230,6 +228,7 @@ function createMockActivities() {
230
228
  status,
231
229
  duplicateSignal: cfg.duplicateSignal ?? false
232
230
  });
231
+ return queued;
233
232
  },
234
233
  resolveLeaseExpiredJobExecutionActivity: (params)=>{
235
234
  calls.push({
@@ -258,16 +257,6 @@ function createMockActivities() {
258
257
  jobVersion: nextVersion()
259
258
  };
260
259
  },
261
- releaseLeaseActivity: async (params)=>{
262
- calls.push({
263
- name: 'releaseLeaseActivity',
264
- params
265
- });
266
- if (cfg.releaseLeaseError) {
267
- const { ApplicationFailure } = await import('@temporalio/common');
268
- throw ApplicationFailure.nonRetryable(cfg.releaseLeaseError);
269
- }
270
- },
271
260
  failJobExecutionAsTimedOutActivity: async (params)=>{
272
261
  calls.push({
273
262
  name: 'failJobExecutionAsTimedOutActivity',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/temporal/workflows/test-env.ts"],"sourcesContent":["import {resolve} from 'node:path';\nimport {TestWorkflowEnvironment} from '@temporalio/testing';\nimport {Worker} from '@temporalio/worker';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport type {JobActivationDecision} from '#db/index.js';\nimport type {\n ActivateJobListenerResult,\n DrainListenerEventsResult,\n ListenerBufferPeek,\n} from '#db/job-listeners.js';\nimport type {RunDag} from '../activities/orchestration-activities.js';\nimport {JOB_CLAIMED_SIGNAL, JOB_FINISHED_SIGNAL, JOB_LEASE_EXPIRED_SIGNAL} from '../constants.js';\n\nconst TASK_QUEUE = 'test-orchestration';\nconst WORKFLOWS_PATH = resolve(import.meta.dirname, '../../../dist/temporal/workflows/index.js');\n\nexport {TASK_QUEUE};\n\n// ---------------------------------------------------------------------------\n// Shared mutable test config: each test sets this before starting a workflow.\n// Activities read from it via closure. Tests run serially within a describe.\n// ---------------------------------------------------------------------------\n\nexport interface TestConfig {\n dag: RunDag;\n /** Map of jobId → status the mock runner should signal back */\n jobResults: Map<string, RuntimeCompletionStatus>;\n /** If set, enqueueJobExecutionForRunner will throw with this message instead of signaling */\n enqueueError?: string;\n /** If true, enqueueJobExecutionForRunner sends two job-finished signals (for dedup testing) */\n duplicateSignal?: boolean;\n /** If true, enqueueJobExecutionForRunner does nothing without a signal for timeout testing */\n skipSignal?: boolean;\n /** If true, emit the claim but hold back the terminal outcome (for deadline testing) */\n skipOutcomeSignal?: boolean;\n /** Runner-owned claim timestamp used by the mock claim event */\n claimedAt?: string;\n /** If true, signal job-lease-expired instead of job-finished */\n signalLeaseExpired?: boolean;\n /** If true, signal BOTH job-finished and job-lease-expired (precedence testing) */\n signalBoth?: boolean;\n /** Status resolveLeaseExpiredJobExecutionActivity returns (defaults to 'failed') */\n leaseExpiredStatus?: RuntimeCompletionStatus;\n /** If set, resolveJobStatusFromJobExecutionsActivity throws with this message */\n resolveJobStatusError?: string;\n /** If set, releaseLeaseActivity throws (non-retryable) to prove the workflow still returns */\n releaseLeaseError?: string;\n /** Scripted job activation decisions keyed by job id; defaults to start */\n activationDecisions?: Map<string, JobActivationDecision>;\n /** If set, failJobExecutionAsTimedOutActivity throws (for timeout error-path testing) */\n failJobExecutionAsTimedOutError?: string;\n /** Effective status returned by the initial running setRunAttemptStatus call */\n initialRunStatus?: string;\n /** Effective status returned by a running setJobStatus call */\n runningJobStatus?: string;\n /** Result returned by activateJobListenerActivity (defaults to a running listener) */\n listenerActivated?: ActivateJobListenerResult;\n /** Scripted drain results consumed in order; once exhausted, drain returns {kind: 'empty'} */\n drainResults?: DrainListenerEventsResult[];\n /** Scripted listener buffer peeks consumed in order; once exhausted, returns an empty buffer */\n peekResults?: ListenerBufferPeek[];\n /** Result returned by resolveJobListenerActivity (defaults to succeeded) */\n listenerResolved?: {status: 'succeeded' | 'failed'; jobVersion: number};\n}\n\nexport let cfg: TestConfig;\n\nexport function setCfg(value: TestConfig): void {\n cfg = value;\n}\n\n// Track every activity call for assertions\nexport interface ActivityCall {\n name: string;\n params: unknown;\n}\n\nexport let calls: ActivityCall[];\nlet versionSeq: number;\nconst pendingJobOutcomes = new Map<\n string,\n {\n handle: ReturnType<typeof testEnv.client.workflow.getHandle>;\n status: RuntimeCompletionStatus;\n duplicateSignal: boolean;\n }\n>();\n\nfunction nextVersion(): number {\n return ++versionSeq;\n}\n\nexport function resetCalls(): void {\n calls = [];\n versionSeq = 0;\n pendingJobOutcomes.clear();\n}\n\nexport function callsNamed(name: string): ActivityCall[] {\n return calls.filter((c) => c.name === name);\n}\n\nexport function setRunAttemptStatusCalls() {\n return callsNamed('setRunAttemptStatus') as Array<{\n name: string;\n params: {runAttemptId: string; status: string; version: number};\n }>;\n}\n\nexport function setJobStatusCalls() {\n return callsNamed('setJobStatus') as Array<{\n name: string;\n params: {jobId: string; status: string; version: number; statusReason?: string | null};\n }>;\n}\n\nexport function setExecutionStatusCalls() {\n return callsNamed('setJobExecutionStatus') as Array<{\n name: string;\n params: {jobExecutionId: string; status: string; version: number; statusReason?: string | null};\n }>;\n}\n\nexport function listenerFiringOutcomeCalls() {\n return callsNamed('recordListenerFiringOutcomeActivity') as Array<{\n name: string;\n params: {outcome: 'succeeded' | 'failed' | 'cancelled'};\n }>;\n}\n\nexport function resolveJobListenerCalls() {\n return callsNamed('resolveJobListenerActivity') as Array<{\n name: string;\n params: {jobId: string; reason: string};\n }>;\n}\n\nexport function settleListenerCalls() {\n return callsNamed('settleListenerJobExecutionActivity') as Array<{\n name: string;\n params: {jobExecutionId: string; status: 'failed' | 'cancelled'};\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// DAG helpers\n// ---------------------------------------------------------------------------\n\nexport function dagJob(\n id: string,\n key: string,\n deps: string[] = [],\n options: {\n mode?: RunDag['jobs'][number]['mode'] | undefined;\n status?: RunDag['jobs'][number]['status'] | undefined;\n hasActivationCondition?: boolean | undefined;\n } = {},\n): RunDag['jobs'][number] {\n const mode = options.mode ?? 'one_shot';\n return {\n id,\n key,\n mode,\n status: options.status ?? 'pending',\n ...(mode === 'listening' ? {} : {jobExecutionId: id, executionVersion: 1}),\n executionTimeoutMs: null,\n listeningTimeoutMs: null,\n maxExecutions: null,\n onResolve: null,\n hasActivationCondition: options.hasActivationCondition ?? false,\n dependencies: deps,\n runner: ['ubuntu22'],\n version: 1,\n };\n}\n\nexport function makeDag(jobs: RunDag['jobs'], workflowRunId = 'run-1'): RunDag {\n return {\n workflowRunId,\n runAttemptId: `${workflowRunId}-attempt-1`,\n workspaceId: 'workspace-1',\n projectId: 'project-1',\n runVersion: 1,\n runTimeoutMs: 30 * 24 * 60 * 60 * 1000,\n jobs,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Environment lifecycle\n// ---------------------------------------------------------------------------\n\nexport let testEnv: TestWorkflowEnvironment;\nexport let worker: Worker;\n\nlet workerRunPromise: Promise<void> | undefined;\n\nexport async function setupEnv(): Promise<void> {\n testEnv = await TestWorkflowEnvironment.createLocal();\n\n worker = await Worker.create({\n connection: testEnv.nativeConnection,\n taskQueue: TASK_QUEUE,\n workflowsPath: WORKFLOWS_PATH,\n activities: createMockActivities(),\n });\n\n // Run worker in background: it processes tasks until shutdown is called\n workerRunPromise = worker.run();\n workerRunPromise.catch(() => {\n // Suppress unhandled rejection on shutdown\n });\n}\n\nexport async function teardownEnv(): Promise<void> {\n worker?.shutdown();\n await workerRunPromise;\n await testEnv?.teardown();\n}\n\nfunction createMockActivities() {\n return {\n loadRunAttemptDag: (runAttemptId: string): RunDag => {\n calls.push({name: 'loadRunAttemptDag', params: runAttemptId});\n return cfg.dag;\n },\n\n setRunAttemptStatus: (params: {runAttemptId: string; status: string; version: number}) => {\n calls.push({name: 'setRunAttemptStatus', params});\n const status =\n params.status === 'running' && cfg.initialRunStatus ? cfg.initialRunStatus : params.status;\n return {newVersion: nextVersion(), status};\n },\n\n setJobStatus: (params: {\n jobId: string;\n status: string;\n version: number;\n statusReason?: string | null;\n }) => {\n calls.push({name: 'setJobStatus', params});\n const status =\n params.status === 'running' && cfg.runningJobStatus ? cfg.runningJobStatus : params.status;\n return {newVersion: nextVersion(), status};\n },\n\n evaluateJobActivationsActivity: (params: {\n runAttemptId: string;\n jobs: readonly {jobId: string; expectedVersion: number}[];\n }): JobActivationDecision[] => {\n calls.push({name: 'evaluateJobActivationsActivity', params});\n return params.jobs.map((job) => {\n const decision = cfg.activationDecisions?.get(job.jobId);\n return decision ?? {kind: 'start-job', jobId: job.jobId};\n });\n },\n\n setJobExecutionStatus: async (params: {\n jobExecutionId: string;\n status: string;\n version: number;\n statusReason?: string | null;\n }) => {\n calls.push({name: 'setJobExecutionStatus', params});\n const status =\n params.status === 'running' && cfg.runningJobStatus ? cfg.runningJobStatus : params.status;\n\n if (params.status === 'running') {\n const outcome = pendingJobOutcomes.get(params.jobExecutionId);\n pendingJobOutcomes.delete(params.jobExecutionId);\n if (outcome && status === 'running') {\n await outcome.handle.signal(JOB_FINISHED_SIGNAL, {\n status: outcome.status,\n jobExecutionId: params.jobExecutionId,\n });\n if (outcome.duplicateSignal) {\n await outcome.handle.signal(JOB_FINISHED_SIGNAL, {\n status: 'failed',\n jobExecutionId: params.jobExecutionId,\n });\n }\n }\n }\n\n return {newVersion: nextVersion(), status};\n },\n\n bulkSetStepStatuses: (params: {jobExecutionId: string; status: string}) => {\n calls.push({name: 'bulkSetStepStatuses', params});\n },\n\n cancelRunnerJobsActivity: (params: {jobIds: string[]}) => {\n calls.push({name: 'cancelRunnerJobsActivity', params});\n },\n\n // Scheduling is step-less. The mock runner reports the job outcome by signalling\n // the per-step terminal-completion signal (job-finished) and/or the lease-expiry\n // signal, reproducing the outbox → subscriber → signal rail.\n enqueueJobExecutionForRunner: async (params: {\n workspaceId: string;\n workflowRunId: string;\n runAttemptId: string;\n jobId: string;\n jobExecutionId: string;\n projectId: string;\n requiredLabels: string[];\n }) => {\n calls.push({name: 'enqueueJobExecutionForRunner', params});\n\n if (cfg.enqueueError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.enqueueError);\n }\n\n if (cfg.skipSignal) return;\n\n const status = cfg.jobResults.get(params.jobId) ?? 'succeeded';\n const handle = testEnv.client.workflow.getHandle(`job:${params.jobId}`);\n await handle.signal(JOB_CLAIMED_SIGNAL, {\n jobExecutionId: params.jobExecutionId,\n claimedAt: cfg.claimedAt ?? '2026-06-22T10:05:00.000Z',\n });\n\n if (cfg.skipOutcomeSignal) return;\n\n if (cfg.signalLeaseExpired) {\n await handle.signal(JOB_LEASE_EXPIRED_SIGNAL, {jobExecutionId: params.jobExecutionId});\n return;\n }\n\n if (cfg.signalBoth) {\n await handle.signal(JOB_FINISHED_SIGNAL, {status, jobExecutionId: params.jobExecutionId});\n await handle.signal(JOB_LEASE_EXPIRED_SIGNAL, {jobExecutionId: params.jobExecutionId});\n return;\n }\n\n // The terminal outbox is independent from the claim, but the mock delivers it from the\n // pending → running activity. This gives the workflow a deterministic ordering boundary\n // without leaving a polling promise alive after the test finishes.\n pendingJobOutcomes.set(params.jobExecutionId, {\n handle,\n status,\n duplicateSignal: cfg.duplicateSignal ?? false,\n });\n },\n\n resolveLeaseExpiredJobExecutionActivity: (params: {\n jobExecutionId: string;\n expectedVersion: number;\n }) => {\n calls.push({name: 'resolveLeaseExpiredJobExecutionActivity', params});\n return {status: cfg.leaseExpiredStatus ?? 'failed', executionVersion: nextVersion()};\n },\n\n resolveJobStatusFromJobExecutionsActivity: async (params: {jobId: string}) => {\n calls.push({name: 'resolveJobStatusFromJobExecutionsActivity', params});\n if (cfg.resolveJobStatusError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.resolveJobStatusError);\n }\n const terminalExecutionStatus = [...setExecutionStatusCalls()]\n .reverse()\n .find(\n (call) => call.params.jobExecutionId === params.jobId && call.params.status !== 'running',\n )?.params.status as RuntimeCompletionStatus | undefined;\n return {\n status: cfg.leaseExpiredStatus ?? terminalExecutionStatus ?? 'succeeded',\n jobVersion: nextVersion(),\n };\n },\n\n releaseLeaseActivity: async (params: {jobExecutionId: string}) => {\n calls.push({name: 'releaseLeaseActivity', params});\n if (cfg.releaseLeaseError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.releaseLeaseError);\n }\n },\n\n failJobExecutionAsTimedOutActivity: async (params: {\n jobExecutionId: string;\n runAttemptId: string;\n expectedVersion: number;\n }) => {\n calls.push({name: 'failJobExecutionAsTimedOutActivity', params});\n if (cfg.failJobExecutionAsTimedOutError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.failJobExecutionAsTimedOutError);\n }\n return {newVersion: nextVersion()};\n },\n\n activateJobListenerActivity: (params: {jobId: string; expectedVersion: number}) => {\n calls.push({name: 'activateJobListenerActivity', params});\n return (\n cfg.listenerActivated ?? {\n status: 'running',\n jobStatus: 'running',\n jobVersion: nextVersion(),\n executionCount: 0,\n }\n );\n },\n\n // Each call consumes the next scripted drain result. An exhausted script means\n // \"no events buffered\", which parks the listener until a signal or its deadline.\n drainListenerEventsActivity: (params: {\n jobId: string;\n expectedSequence: number;\n maxSize?: number;\n }) => {\n calls.push({name: 'drainListenerEventsActivity', params});\n return cfg.drainResults?.shift() ?? {kind: 'empty'};\n },\n\n peekListenerBufferActivity: (params: {jobId: string}) => {\n calls.push({name: 'peekListenerBufferActivity', params});\n return (\n cfg.peekResults?.shift() ?? {\n fireCount: 0,\n resolvePending: false,\n oldestAgeMs: 0,\n newestAgeMs: 0,\n }\n );\n },\n\n resolveJobListenerActivity: (params: {jobId: string; reason: string}) => {\n calls.push({name: 'resolveJobListenerActivity', params});\n return cfg.listenerResolved ?? {status: 'succeeded', jobVersion: nextVersion()};\n },\n\n settleListenerJobExecutionActivity: (params: {\n jobExecutionId: string;\n status: 'failed' | 'cancelled';\n }) => {\n calls.push({name: 'settleListenerJobExecutionActivity', params});\n },\n\n recordListenerFiringOutcomeActivity: (params: {\n outcome: 'succeeded' | 'failed' | 'cancelled';\n }) => {\n calls.push({name: 'recordListenerFiringOutcomeActivity', params});\n },\n };\n}\n"],"names":["resolve","TestWorkflowEnvironment","Worker","JOB_CLAIMED_SIGNAL","JOB_FINISHED_SIGNAL","JOB_LEASE_EXPIRED_SIGNAL","TASK_QUEUE","WORKFLOWS_PATH","dirname","cfg","setCfg","value","calls","versionSeq","pendingJobOutcomes","Map","nextVersion","resetCalls","clear","callsNamed","name","filter","c","setRunAttemptStatusCalls","setJobStatusCalls","setExecutionStatusCalls","listenerFiringOutcomeCalls","resolveJobListenerCalls","settleListenerCalls","dagJob","id","key","deps","options","mode","status","jobExecutionId","executionVersion","executionTimeoutMs","listeningTimeoutMs","maxExecutions","onResolve","hasActivationCondition","dependencies","runner","version","makeDag","jobs","workflowRunId","runAttemptId","workspaceId","projectId","runVersion","runTimeoutMs","testEnv","worker","workerRunPromise","setupEnv","createLocal","create","connection","nativeConnection","taskQueue","workflowsPath","activities","createMockActivities","run","catch","teardownEnv","shutdown","teardown","loadRunAttemptDag","push","params","dag","setRunAttemptStatus","initialRunStatus","newVersion","setJobStatus","runningJobStatus","evaluateJobActivationsActivity","map","job","decision","activationDecisions","get","jobId","kind","setJobExecutionStatus","outcome","delete","handle","signal","duplicateSignal","bulkSetStepStatuses","cancelRunnerJobsActivity","enqueueJobExecutionForRunner","enqueueError","ApplicationFailure","nonRetryable","skipSignal","jobResults","client","workflow","getHandle","claimedAt","skipOutcomeSignal","signalLeaseExpired","signalBoth","set","resolveLeaseExpiredJobExecutionActivity","leaseExpiredStatus","resolveJobStatusFromJobExecutionsActivity","resolveJobStatusError","terminalExecutionStatus","reverse","find","call","jobVersion","releaseLeaseActivity","releaseLeaseError","failJobExecutionAsTimedOutActivity","failJobExecutionAsTimedOutError","activateJobListenerActivity","listenerActivated","jobStatus","executionCount","drainListenerEventsActivity","drainResults","shift","peekListenerBufferActivity","peekResults","fireCount","resolvePending","oldestAgeMs","newestAgeMs","resolveJobListenerActivity","listenerResolved","settleListenerJobExecutionActivity","recordListenerFiringOutcomeActivity"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/temporal/workflows/test-env.ts"],"sourcesContent":["import {resolve} from 'node:path';\nimport {TestWorkflowEnvironment} from '@temporalio/testing';\nimport {Worker} from '@temporalio/worker';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport type {JobActivationDecision} from '#db/index.js';\nimport type {\n ActivateJobListenerResult,\n DrainListenerEventsResult,\n ListenerBufferPeek,\n} from '#db/job-listeners.js';\nimport type {RunDag} from '../activities/orchestration-activities.js';\nimport {JOB_CLAIMED_SIGNAL, JOB_FINISHED_SIGNAL, JOB_LEASE_EXPIRED_SIGNAL} from '../constants.js';\n\nconst TASK_QUEUE = 'test-orchestration';\nconst WORKFLOWS_PATH = resolve(import.meta.dirname, '../../../dist/temporal/workflows/index.js');\n\nexport {TASK_QUEUE};\n\n// ---------------------------------------------------------------------------\n// Shared mutable test config: each test sets this before starting a workflow.\n// Activities read from it via closure. Tests run serially within a describe.\n// ---------------------------------------------------------------------------\n\nexport interface TestConfig {\n dag: RunDag;\n /** Map of jobId → status the mock runner should signal back */\n jobResults: Map<string, RuntimeCompletionStatus>;\n /** If set, queueJobExecutionActivity will throw with this message instead of signaling */\n queueError?: string;\n /** If true, queueJobExecutionActivity sends two job-finished signals (for dedup testing) */\n duplicateSignal?: boolean;\n /** If true, queueJobExecutionActivity does nothing without a signal for timeout testing */\n skipSignal?: boolean;\n /** If true, emit the claim but hold back the terminal outcome (for deadline testing) */\n skipOutcomeSignal?: boolean;\n /** Runner-owned claim timestamp used by the mock claim event */\n claimedAt?: string;\n /** If true, signal job-lease-expired instead of job-finished */\n signalLeaseExpired?: boolean;\n /** If true, signal BOTH job-finished and job-lease-expired (precedence testing) */\n signalBoth?: boolean;\n /** Status resolveLeaseExpiredJobExecutionActivity returns (defaults to 'failed') */\n leaseExpiredStatus?: RuntimeCompletionStatus;\n /** If set, resolveJobStatusFromJobExecutionsActivity throws with this message */\n resolveJobStatusError?: string;\n /** Scripted job activation decisions keyed by job id; defaults to start */\n activationDecisions?: Map<string, JobActivationDecision>;\n /** If set, failJobExecutionAsTimedOutActivity throws (for timeout error-path testing) */\n failJobExecutionAsTimedOutError?: string;\n /** Effective status returned by the initial running setRunAttemptStatus call */\n initialRunStatus?: string;\n /** Effective status returned by a running setJobStatus call */\n runningJobStatus?: string;\n /** Result returned by activateJobListenerActivity (defaults to a running listener) */\n listenerActivated?: ActivateJobListenerResult;\n /** Scripted drain results consumed in order; once exhausted, drain returns {kind: 'empty'} */\n drainResults?: DrainListenerEventsResult[];\n /** Scripted listener buffer peeks consumed in order; once exhausted, returns an empty buffer */\n peekResults?: ListenerBufferPeek[];\n /** Result returned by resolveJobListenerActivity (defaults to succeeded) */\n listenerResolved?: {status: 'succeeded' | 'failed'; jobVersion: number};\n}\n\nexport let cfg: TestConfig;\n\nexport function setCfg(value: TestConfig): void {\n cfg = value;\n}\n\n// Track every activity call for assertions\nexport interface ActivityCall {\n name: string;\n params: unknown;\n}\n\nexport let calls: ActivityCall[];\nlet versionSeq: number;\nconst pendingJobOutcomes = new Map<\n string,\n {\n handle: ReturnType<typeof testEnv.client.workflow.getHandle>;\n status: RuntimeCompletionStatus;\n duplicateSignal: boolean;\n }\n>();\n\nfunction nextVersion(): number {\n return ++versionSeq;\n}\n\nexport function resetCalls(): void {\n calls = [];\n versionSeq = 0;\n pendingJobOutcomes.clear();\n}\n\nexport function callsNamed(name: string): ActivityCall[] {\n return calls.filter((c) => c.name === name);\n}\n\nexport function setRunAttemptStatusCalls() {\n return callsNamed('setRunAttemptStatus') as Array<{\n name: string;\n params: {runAttemptId: string; status: string; version: number};\n }>;\n}\n\nexport function setJobStatusCalls() {\n return callsNamed('setJobStatus') as Array<{\n name: string;\n params: {jobId: string; status: string; version: number; statusReason?: string | null};\n }>;\n}\n\nexport function setExecutionStatusCalls() {\n return callsNamed('setJobExecutionStatus') as Array<{\n name: string;\n params: {jobExecutionId: string; status: string; version: number; statusReason?: string | null};\n }>;\n}\n\nexport function listenerFiringOutcomeCalls() {\n return callsNamed('recordListenerFiringOutcomeActivity') as Array<{\n name: string;\n params: {outcome: 'succeeded' | 'failed' | 'cancelled'};\n }>;\n}\n\nexport function resolveJobListenerCalls() {\n return callsNamed('resolveJobListenerActivity') as Array<{\n name: string;\n params: {jobId: string; reason: string};\n }>;\n}\n\nexport function settleListenerCalls() {\n return callsNamed('settleListenerJobExecutionActivity') as Array<{\n name: string;\n params: {jobExecutionId: string; status: 'failed' | 'cancelled'};\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// DAG helpers\n// ---------------------------------------------------------------------------\n\nexport function dagJob(\n id: string,\n key: string,\n deps: string[] = [],\n options: {\n mode?: RunDag['jobs'][number]['mode'] | undefined;\n status?: RunDag['jobs'][number]['status'] | undefined;\n hasActivationCondition?: boolean | undefined;\n } = {},\n): RunDag['jobs'][number] {\n const mode = options.mode ?? 'one_shot';\n return {\n id,\n key,\n mode,\n status: options.status ?? 'pending',\n ...(mode === 'listening' ? {} : {jobExecutionId: id, executionVersion: 1}),\n executionTimeoutMs: null,\n listeningTimeoutMs: null,\n maxExecutions: null,\n onResolve: null,\n hasActivationCondition: options.hasActivationCondition ?? false,\n dependencies: deps,\n runner: ['ubuntu22'],\n version: 1,\n };\n}\n\nexport function makeDag(jobs: RunDag['jobs'], workflowRunId = 'run-1'): RunDag {\n return {\n workflowRunId,\n runAttemptId: `${workflowRunId}-attempt-1`,\n workspaceId: 'workspace-1',\n projectId: 'project-1',\n runVersion: 1,\n runTimeoutMs: 30 * 24 * 60 * 60 * 1000,\n jobs,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Environment lifecycle\n// ---------------------------------------------------------------------------\n\nexport let testEnv: TestWorkflowEnvironment;\nexport let worker: Worker;\n\nlet workerRunPromise: Promise<void> | undefined;\n\nexport async function setupEnv(): Promise<void> {\n testEnv = await TestWorkflowEnvironment.createLocal();\n\n worker = await Worker.create({\n connection: testEnv.nativeConnection,\n taskQueue: TASK_QUEUE,\n workflowsPath: WORKFLOWS_PATH,\n activities: createMockActivities(),\n });\n\n // Run worker in background: it processes tasks until shutdown is called\n workerRunPromise = worker.run();\n workerRunPromise.catch(() => {\n // Suppress unhandled rejection on shutdown\n });\n}\n\nexport async function teardownEnv(): Promise<void> {\n worker?.shutdown();\n await workerRunPromise;\n await testEnv?.teardown();\n}\n\nfunction createMockActivities() {\n return {\n loadRunAttemptDag: (runAttemptId: string): RunDag => {\n calls.push({name: 'loadRunAttemptDag', params: runAttemptId});\n return cfg.dag;\n },\n\n setRunAttemptStatus: (params: {runAttemptId: string; status: string; version: number}) => {\n calls.push({name: 'setRunAttemptStatus', params});\n const status =\n params.status === 'running' && cfg.initialRunStatus ? cfg.initialRunStatus : params.status;\n return {newVersion: nextVersion(), status};\n },\n\n setJobStatus: (params: {\n jobId: string;\n status: string;\n version: number;\n statusReason?: string | null;\n }) => {\n calls.push({name: 'setJobStatus', params});\n const status =\n params.status === 'running' && cfg.runningJobStatus ? cfg.runningJobStatus : params.status;\n return {newVersion: nextVersion(), status};\n },\n\n evaluateJobActivationsActivity: (params: {\n runAttemptId: string;\n jobs: readonly {jobId: string; expectedVersion: number}[];\n }): JobActivationDecision[] => {\n calls.push({name: 'evaluateJobActivationsActivity', params});\n return params.jobs.map((job) => {\n const decision = cfg.activationDecisions?.get(job.jobId);\n return decision ?? {kind: 'start-job', jobId: job.jobId};\n });\n },\n\n setJobExecutionStatus: async (params: {\n jobExecutionId: string;\n status: string;\n version: number;\n statusReason?: string | null;\n }) => {\n calls.push({name: 'setJobExecutionStatus', params});\n const status =\n params.status === 'running' && cfg.runningJobStatus ? cfg.runningJobStatus : params.status;\n\n if (params.status === 'running') {\n const outcome = pendingJobOutcomes.get(params.jobExecutionId);\n pendingJobOutcomes.delete(params.jobExecutionId);\n if (outcome && status === 'running') {\n await outcome.handle.signal(JOB_FINISHED_SIGNAL, {\n status: outcome.status,\n jobExecutionId: params.jobExecutionId,\n });\n if (outcome.duplicateSignal) {\n await outcome.handle.signal(JOB_FINISHED_SIGNAL, {\n status: 'failed',\n jobExecutionId: params.jobExecutionId,\n });\n }\n }\n }\n\n return {newVersion: nextVersion(), status};\n },\n\n bulkSetStepStatuses: (params: {jobExecutionId: string; status: string}) => {\n calls.push({name: 'bulkSetStepStatuses', params});\n },\n\n // Scheduling is step-less. The mock runner reports the job outcome by signalling\n // the per-step terminal-completion signal (job-finished) and/or the lease-expiry\n // signal, reproducing the outbox → subscriber → signal rail.\n queueJobExecutionActivity: async (params: {jobId: string; jobExecutionId: string}) => {\n calls.push({name: 'queueJobExecutionActivity', params});\n\n if (cfg.queueError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.queueError);\n }\n\n const queued = {newVersion: nextVersion(), status: 'pending' as const};\n if (cfg.skipSignal) return queued;\n\n const status = cfg.jobResults.get(params.jobId) ?? 'succeeded';\n const handle = testEnv.client.workflow.getHandle(`job:${params.jobId}`);\n await handle.signal(JOB_CLAIMED_SIGNAL, {\n jobExecutionId: params.jobExecutionId,\n claimedAt: cfg.claimedAt ?? '2026-06-22T10:05:00.000Z',\n });\n\n if (cfg.skipOutcomeSignal) return queued;\n\n if (cfg.signalLeaseExpired) {\n await handle.signal(JOB_LEASE_EXPIRED_SIGNAL, {jobExecutionId: params.jobExecutionId});\n return queued;\n }\n\n if (cfg.signalBoth) {\n await handle.signal(JOB_FINISHED_SIGNAL, {status, jobExecutionId: params.jobExecutionId});\n await handle.signal(JOB_LEASE_EXPIRED_SIGNAL, {jobExecutionId: params.jobExecutionId});\n return queued;\n }\n\n // The terminal outbox is independent from the claim, but the mock delivers it from the\n // pending → running activity. This gives the workflow a deterministic ordering boundary\n // without leaving a polling promise alive after the test finishes.\n pendingJobOutcomes.set(params.jobExecutionId, {\n handle,\n status,\n duplicateSignal: cfg.duplicateSignal ?? false,\n });\n return queued;\n },\n\n resolveLeaseExpiredJobExecutionActivity: (params: {\n jobExecutionId: string;\n expectedVersion: number;\n }) => {\n calls.push({name: 'resolveLeaseExpiredJobExecutionActivity', params});\n return {status: cfg.leaseExpiredStatus ?? 'failed', executionVersion: nextVersion()};\n },\n\n resolveJobStatusFromJobExecutionsActivity: async (params: {jobId: string}) => {\n calls.push({name: 'resolveJobStatusFromJobExecutionsActivity', params});\n if (cfg.resolveJobStatusError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.resolveJobStatusError);\n }\n const terminalExecutionStatus = [...setExecutionStatusCalls()]\n .reverse()\n .find(\n (call) => call.params.jobExecutionId === params.jobId && call.params.status !== 'running',\n )?.params.status as RuntimeCompletionStatus | undefined;\n return {\n status: cfg.leaseExpiredStatus ?? terminalExecutionStatus ?? 'succeeded',\n jobVersion: nextVersion(),\n };\n },\n\n failJobExecutionAsTimedOutActivity: async (params: {\n jobExecutionId: string;\n runAttemptId: string;\n expectedVersion: number;\n }) => {\n calls.push({name: 'failJobExecutionAsTimedOutActivity', params});\n if (cfg.failJobExecutionAsTimedOutError) {\n const {ApplicationFailure} = await import('@temporalio/common');\n throw ApplicationFailure.nonRetryable(cfg.failJobExecutionAsTimedOutError);\n }\n return {newVersion: nextVersion()};\n },\n\n activateJobListenerActivity: (params: {jobId: string; expectedVersion: number}) => {\n calls.push({name: 'activateJobListenerActivity', params});\n return (\n cfg.listenerActivated ?? {\n status: 'running',\n jobStatus: 'running',\n jobVersion: nextVersion(),\n executionCount: 0,\n }\n );\n },\n\n // Each call consumes the next scripted drain result. An exhausted script means\n // \"no events buffered\", which parks the listener until a signal or its deadline.\n drainListenerEventsActivity: (params: {\n jobId: string;\n expectedSequence: number;\n maxSize?: number;\n }) => {\n calls.push({name: 'drainListenerEventsActivity', params});\n return cfg.drainResults?.shift() ?? {kind: 'empty'};\n },\n\n peekListenerBufferActivity: (params: {jobId: string}) => {\n calls.push({name: 'peekListenerBufferActivity', params});\n return (\n cfg.peekResults?.shift() ?? {\n fireCount: 0,\n resolvePending: false,\n oldestAgeMs: 0,\n newestAgeMs: 0,\n }\n );\n },\n\n resolveJobListenerActivity: (params: {jobId: string; reason: string}) => {\n calls.push({name: 'resolveJobListenerActivity', params});\n return cfg.listenerResolved ?? {status: 'succeeded', jobVersion: nextVersion()};\n },\n\n settleListenerJobExecutionActivity: (params: {\n jobExecutionId: string;\n status: 'failed' | 'cancelled';\n }) => {\n calls.push({name: 'settleListenerJobExecutionActivity', params});\n },\n\n recordListenerFiringOutcomeActivity: (params: {\n outcome: 'succeeded' | 'failed' | 'cancelled';\n }) => {\n calls.push({name: 'recordListenerFiringOutcomeActivity', params});\n },\n };\n}\n"],"names":["resolve","TestWorkflowEnvironment","Worker","JOB_CLAIMED_SIGNAL","JOB_FINISHED_SIGNAL","JOB_LEASE_EXPIRED_SIGNAL","TASK_QUEUE","WORKFLOWS_PATH","dirname","cfg","setCfg","value","calls","versionSeq","pendingJobOutcomes","Map","nextVersion","resetCalls","clear","callsNamed","name","filter","c","setRunAttemptStatusCalls","setJobStatusCalls","setExecutionStatusCalls","listenerFiringOutcomeCalls","resolveJobListenerCalls","settleListenerCalls","dagJob","id","key","deps","options","mode","status","jobExecutionId","executionVersion","executionTimeoutMs","listeningTimeoutMs","maxExecutions","onResolve","hasActivationCondition","dependencies","runner","version","makeDag","jobs","workflowRunId","runAttemptId","workspaceId","projectId","runVersion","runTimeoutMs","testEnv","worker","workerRunPromise","setupEnv","createLocal","create","connection","nativeConnection","taskQueue","workflowsPath","activities","createMockActivities","run","catch","teardownEnv","shutdown","teardown","loadRunAttemptDag","push","params","dag","setRunAttemptStatus","initialRunStatus","newVersion","setJobStatus","runningJobStatus","evaluateJobActivationsActivity","map","job","decision","activationDecisions","get","jobId","kind","setJobExecutionStatus","outcome","delete","handle","signal","duplicateSignal","bulkSetStepStatuses","queueJobExecutionActivity","queueError","ApplicationFailure","nonRetryable","queued","skipSignal","jobResults","client","workflow","getHandle","claimedAt","skipOutcomeSignal","signalLeaseExpired","signalBoth","set","resolveLeaseExpiredJobExecutionActivity","leaseExpiredStatus","resolveJobStatusFromJobExecutionsActivity","resolveJobStatusError","terminalExecutionStatus","reverse","find","call","jobVersion","failJobExecutionAsTimedOutActivity","failJobExecutionAsTimedOutError","activateJobListenerActivity","listenerActivated","jobStatus","executionCount","drainListenerEventsActivity","drainResults","shift","peekListenerBufferActivity","peekResults","fireCount","resolvePending","oldestAgeMs","newestAgeMs","resolveJobListenerActivity","listenerResolved","settleListenerJobExecutionActivity","recordListenerFiringOutcomeActivity"],"mappings":"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"}