deepline 0.3.89 → 0.3.90

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 (211) hide show
  1. package/contracts/install-commands.json +29 -0
  2. package/dist/bundling-sources/sdk/src/client.ts +120 -37
  3. package/dist/bundling-sources/sdk/src/index.ts +4 -0
  4. package/dist/bundling-sources/sdk/src/pagination.ts +25 -0
  5. package/dist/bundling-sources/sdk/src/plays/bundle-play-file.ts +1 -1
  6. package/dist/bundling-sources/sdk/src/release.ts +16 -9
  7. package/dist/bundling-sources/sdk/src/types.ts +23 -0
  8. package/dist/bundling-sources/shared_libs/monitors/analytics-public.ts +10 -0
  9. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +3 -0
  10. package/dist/bundling-sources/shared_libs/monitors/inbound-queue.ts +4 -4
  11. package/dist/bundling-sources/shared_libs/monitors/inventory-reconciliation.ts +59 -0
  12. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +7 -9
  13. package/dist/bundling-sources/shared_libs/monitors/package.json +7 -0
  14. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +44 -2
  15. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-consumer-health.ts +2 -2
  16. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-identity-claims.ts +2 -2
  17. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-public-aliases.ts +1 -1
  18. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +245 -0
  19. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-message.ts +38 -0
  20. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue-ack-probe.ts +94 -0
  21. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue-delivery.ts +60 -0
  22. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue.ts +60 -0
  23. package/dist/bundling-sources/shared_libs/monitors/snitcher-install-validation.ts +1 -1
  24. package/dist/bundling-sources/shared_libs/monitors/snitcher-ip2company.ts +2 -2
  25. package/dist/bundling-sources/shared_libs/monitors/snitcher-radar.ts +1 -1
  26. package/dist/bundling-sources/shared_libs/monitors/tracking-provider-integrations.ts +1 -1
  27. package/dist/bundling-sources/shared_libs/observability/build-context.ts +13 -0
  28. package/dist/bundling-sources/shared_libs/observability/log-metadata.ts +160 -0
  29. package/dist/bundling-sources/shared_libs/observability/request-context.ts +68 -0
  30. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +654 -0
  31. package/dist/bundling-sources/shared_libs/observability/scheduled-work-manual.ts +35 -0
  32. package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +5 -0
  33. package/dist/bundling-sources/shared_libs/play-data-plane/neon-constants.ts +9 -0
  34. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +272 -0
  35. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +45 -0
  36. package/dist/bundling-sources/shared_libs/play-runtime/async-operation.ts +66 -1
  37. package/dist/bundling-sources/shared_libs/play-runtime/async-play-invocation.ts +0 -1
  38. package/dist/bundling-sources/shared_libs/play-runtime/bounceban-batching.ts +137 -0
  39. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +779 -140
  40. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +46 -0
  41. package/dist/bundling-sources/shared_libs/play-runtime/daytona-payload-contract.ts +68 -0
  42. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +103 -0
  43. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +725 -0
  44. package/dist/bundling-sources/shared_libs/play-runtime/durable-call-cache.ts +29 -0
  45. package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +23 -0
  46. package/dist/bundling-sources/shared_libs/play-runtime/execution-gateway-invocation-fence.ts +442 -0
  47. package/dist/bundling-sources/shared_libs/play-runtime/execution-protocol.ts +3 -3
  48. package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +18 -0
  49. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +9 -0
  50. package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +1 -1
  51. package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +1 -1
  52. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/contracts.ts +66 -0
  53. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/job.ts +145 -0
  54. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/ports.ts +21 -0
  55. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/postgres-store.ts +170 -0
  56. package/dist/bundling-sources/shared_libs/play-runtime/internal-bootstrap-token.ts +1322 -0
  57. package/dist/bundling-sources/shared_libs/play-runtime/internal-step-ids.ts +2 -2
  58. package/dist/bundling-sources/shared_libs/play-runtime/lane-retirement-gate.ts +1 -1
  59. package/dist/bundling-sources/shared_libs/play-runtime/launch-source-policy.ts +112 -0
  60. package/dist/bundling-sources/shared_libs/play-runtime/map-execution-frame.ts +8 -0
  61. package/dist/bundling-sources/shared_libs/play-runtime/perf-trace.ts +127 -0
  62. package/dist/bundling-sources/shared_libs/play-runtime/play-artifact-runtime-contract.ts +5 -0
  63. package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +24 -1
  64. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/contracts.ts +56 -0
  65. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/index.ts +13 -0
  66. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/job.ts +41 -0
  67. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/ports.ts +17 -0
  68. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/postgres-adapter.ts +54 -0
  69. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/contracts.ts +114 -0
  70. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/engine-suspension.ts +108 -0
  71. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/index.ts +36 -0
  72. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/job.ts +97 -0
  73. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/ports.ts +104 -0
  74. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/postgres-fence-adapter.ts +263 -0
  75. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/worker-terminal-projection.ts +64 -0
  76. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/contracts.ts +29 -0
  77. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/gateway-adapter.ts +56 -0
  78. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/index.ts +15 -0
  79. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/job.ts +65 -0
  80. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/ports.ts +17 -0
  81. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +42 -0
  82. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/index.ts +17 -0
  83. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +142 -0
  84. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/ports.ts +42 -0
  85. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/postgres-adapter.ts +102 -0
  86. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/contracts.ts +60 -0
  87. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/index.ts +16 -0
  88. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/job.ts +78 -0
  89. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/ports.ts +54 -0
  90. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/postgres-adapter.ts +71 -0
  91. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +4 -0
  92. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +2 -0
  93. package/dist/bundling-sources/shared_libs/play-runtime/receipt-status.ts +5 -8
  94. package/dist/bundling-sources/shared_libs/play-runtime/run-failure.ts +3 -5
  95. package/dist/bundling-sources/shared_libs/play-runtime/run-identity.ts +168 -0
  96. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +72 -9
  97. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-payload-transport.ts +6 -12
  98. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +19 -0
  99. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/bundle.ts +0 -1
  100. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +14 -44
  101. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +57 -205
  102. package/dist/bundling-sources/shared_libs/play-runtime/runtime-authority.ts +201 -0
  103. package/dist/bundling-sources/shared_libs/play-runtime/runtime-env.ts +6 -0
  104. package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +67 -0
  105. package/dist/bundling-sources/shared_libs/play-runtime/runtime-release-environment.ts +2 -0
  106. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sandbox-contract.ts +68 -0
  107. package/dist/bundling-sources/shared_libs/play-runtime/runtime-scheduler-topology.ts +14 -2
  108. package/dist/bundling-sources/shared_libs/play-runtime/runtime-telemetry.ts +108 -0
  109. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +4 -0
  110. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +3 -0
  111. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +7 -0
  112. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-deadline-reconciliation.ts +88 -0
  113. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-play-deploy-task.ts +124 -0
  114. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-play-run-task.ts +68 -0
  115. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-pool.ts +193 -0
  116. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-queue-lifecycle.ts +269 -0
  117. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-queue-suffix.ts +73 -0
  118. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +6642 -0
  119. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-shared.ts +897 -0
  120. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-metrics.ts +120 -0
  121. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +76 -0
  122. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd.ts +476 -0
  123. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/gateway-heavy-request-admission.ts +47 -0
  124. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/gateway-progress-registry.ts +147 -0
  125. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/index.ts +27 -0
  126. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/lazy.ts +50 -0
  127. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/play-run-recovery.ts +98 -0
  128. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-budget-state.ts +260 -0
  129. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-pool.ts +1416 -0
  130. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +1255 -0
  131. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-rate-state.ts +942 -0
  132. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +14636 -0
  133. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +888 -0
  134. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +355 -0
  135. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-terminal-transition.ts +46 -0
  136. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runner-push.ts +60 -0
  137. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-api-origin.ts +33 -0
  138. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-receipt-gateway-health.ts +64 -0
  139. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +835 -0
  140. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +1218 -0
  141. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-operation.ts +207 -0
  142. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-scheduler-schema.ts +10 -0
  143. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/scheduler-capacity.ts +123 -0
  144. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/scheduler-launch-read-observability.ts +78 -0
  145. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/submit-admission.ts +169 -0
  146. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/terminal-contract.ts +20 -0
  147. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/worker-queue-metrics.ts +34 -0
  148. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/worker-resource-metrics.ts +249 -0
  149. package/dist/bundling-sources/shared_libs/play-runtime/sheet-attempt-sql.ts +7 -0
  150. package/dist/bundling-sources/shared_libs/play-runtime/step-progress.ts +296 -0
  151. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/native-batch.ts +3 -3
  152. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/runtime-step-receipts-adapter.ts +20 -1
  153. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +60 -15
  154. package/dist/bundling-sources/shared_libs/play-runtime/tool-execution-outcome.ts +20 -0
  155. package/dist/bundling-sources/shared_libs/play-runtime/transient-service-error.ts +12 -0
  156. package/dist/bundling-sources/shared_libs/play-runtime/vercel-protection.ts +14 -1
  157. package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +165 -0
  158. package/dist/bundling-sources/shared_libs/play-runtime/work-receipts.ts +15 -23
  159. package/dist/bundling-sources/shared_libs/play-runtime/workflow-executor-auth.ts +169 -0
  160. package/dist/bundling-sources/shared_libs/play-runtime/zerobounce-batching.ts +122 -0
  161. package/dist/bundling-sources/shared_libs/plays/artifact-types.ts +2 -0
  162. package/dist/bundling-sources/shared_libs/plays/contracts.ts +2 -0
  163. package/dist/bundling-sources/shared_libs/plays/deployment-status.ts +1 -1
  164. package/dist/bundling-sources/shared_libs/plays/docflow.ts +1 -1
  165. package/dist/bundling-sources/shared_libs/plays/play-grep-search.ts +39 -0
  166. package/dist/bundling-sources/shared_libs/plays/share/copy.ts +271 -0
  167. package/dist/bundling-sources/shared_libs/plays/share/metrics.ts +140 -0
  168. package/dist/bundling-sources/shared_libs/plays/share/public-read-model.ts +86 -0
  169. package/dist/bundling-sources/shared_libs/plays/share/seo-quality.ts +181 -0
  170. package/dist/bundling-sources/shared_libs/plays/share/static-pipeline-summary.ts +658 -0
  171. package/dist/bundling-sources/shared_libs/plays/share/types.ts +197 -0
  172. package/dist/bundling-sources/shared_libs/plays/slack-hitl-timeout-error.ts +37 -0
  173. package/dist/bundling-sources/shared_libs/plays/static-pipeline.ts +6 -1
  174. package/dist/bundling-sources/shared_libs/plays/tool-result-types.ts +1 -1
  175. package/dist/bundling-sources/shared_libs/product-notifications/configuration.ts +7 -1
  176. package/dist/bundling-sources/shared_libs/product-notifications/default-policy.ts +3 -2
  177. package/dist/bundling-sources/shared_libs/product-notifications/overflow.ts +18 -0
  178. package/dist/bundling-sources/shared_libs/product-notifications/rolling-limit.ts +24 -0
  179. package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +624 -0
  180. package/dist/bundling-sources/shared_libs/product-notifications/slack-payload.ts +140 -0
  181. package/dist/bundling-sources/shared_libs/product-notifications/slack-transport.ts +75 -0
  182. package/dist/bundling-sources/shared_libs/runtime-env.ts +6 -0
  183. package/dist/bundling-sources/shared_libs/security/email-blacklist.ts +42 -0
  184. package/dist/bundling-sources/shared_libs/security/header-safe-env.ts +10 -3
  185. package/dist/bundling-sources/shared_libs/security/slack-sanitize.ts +133 -0
  186. package/dist/cli/getting-started.d.mts +52 -0
  187. package/dist/cli/getting-started.d.ts +52 -0
  188. package/dist/cli/getting-started.js +65 -0
  189. package/dist/cli/getting-started.mjs +36 -0
  190. package/dist/cli/index.d.mts +9 -0
  191. package/dist/cli/index.d.ts +9 -0
  192. package/dist/cli/index.js +545 -264
  193. package/dist/cli/index.mjs +543 -271
  194. package/dist/{compiler-manifest-DsLbQaew.d.mts → compiler-manifest-BaJfE-5H.d.mts} +5 -3
  195. package/dist/{compiler-manifest-DsLbQaew.d.ts → compiler-manifest-BaJfE-5H.d.ts} +5 -3
  196. package/dist/index.d.mts +81 -148
  197. package/dist/index.d.ts +81 -148
  198. package/dist/index.js +83 -26
  199. package/dist/index.mjs +83 -26
  200. package/dist/install-integrity.json +130 -2
  201. package/dist/monitor-fleet-contract.d.mts +138 -0
  202. package/dist/monitor-fleet-contract.d.ts +138 -0
  203. package/dist/monitor-fleet-contract.js +404 -0
  204. package/dist/monitor-fleet-contract.mjs +367 -0
  205. package/dist/plays/bundle-play-file.d.mts +2 -2
  206. package/dist/plays/bundle-play-file.d.ts +2 -2
  207. package/dist/release.d.mts +255 -0
  208. package/dist/release.d.ts +255 -0
  209. package/dist/release.js +215 -0
  210. package/dist/release.mjs +188 -0
  211. package/package.json +21 -4
@@ -28,6 +28,7 @@ import {
28
28
  import {
29
29
  DAYTONA_CANCELLED_ERROR,
30
30
  DaytonaSandboxAcquisitionUnavailableError,
31
+ DaytonaSandboxTransitionPendingError,
31
32
  createDaytonaSandboxCleanupManager,
32
33
  createOneShotDaytonaSandboxLifecycle,
33
34
  type AcquiredDaytonaSandbox,
@@ -37,6 +38,7 @@ import {
37
38
  type OneShotDaytonaSandboxLifecycle,
38
39
  validateDaytonaExecutionContext,
39
40
  } from './daytona-lifecycle';
41
+ import { recoveryForDaytonaSandboxTransitionPending } from '../../play-run-recovery-policy';
40
42
  import { stageDaytonaRunnerPayload } from './daytona-payload-transport';
41
43
  import {
42
44
  DaytonaRunnerInitializationError,
@@ -69,6 +71,12 @@ const RUNTIME_API_TRANSPORT_RETRY_PATTERN =
69
71
  // with user code that has already had side effects.
70
72
  const DAYTONA_PUBLIC_STATUS_TRANSIENT_RETRY_PATTERN =
71
73
  /\bDaytonaValidationError:\s*bad request:\s*failed to get sandbox public status:\s*an unexpected error occurred\.?\b/i;
74
+ // A detached runner sends its first authenticated heartbeat before it can run
75
+ // customer code. Persisted terminal results retain the bounded startup
76
+ // diagnostic, so the worker can distinguish that proven pre-code transport
77
+ // failure from a generic readiness timeout on a later wake.
78
+ const DAYTONA_RUNNER_STARTUP_TRANSPORT_RETRY_PATTERN =
79
+ /\bDaytonaRunnerInitializationError:\s*RUNTIME_SANDBOX_START_FAILED:.*\bScheduler diagnosis:\s*runner_heartbeat_not_observed\..*"schedulerReadinessObserved":false.*"commandFound":true.*"exitCode":null.*"sessionFound":true.*"exitCodeFile":null.*"runnerStartup":\{"phase":"heartbeat_transport","outcome":"network_error","errorCode":"(?:ECONNRESET|ECONNREFUSED|ETIMEDOUT|UND_ERR_CONNECT_TIMEOUT)"/i;
72
80
  const DAYTONA_INFRASTRUCTURE_RETRY_PATTERN =
73
81
  /\b(?:Request failed with status code (?:408|429|500|502|503|504)|ECONNRESET|ECONNREFUSED|ETIMEDOUT|UND_ERR_CONNECT_TIMEOUT|fetch failed|socket hang up|Daytona sandbox create failed across|Daytona sandbox create did not complete|Daytona readiness baseline)\b/i;
74
82
 
@@ -902,6 +910,7 @@ export function retryableRuntimeInitializationFailureReason(
902
910
  | 'runtime_api_transport'
903
911
  | 'runtime_receipt_gateway_transport'
904
912
  | 'daytona_public_status'
913
+ | 'daytona_runner_startup_transport'
905
914
  | null {
906
915
  if (result.status !== 'failed') return null;
907
916
  if (RUNTIME_POSTGRES_CONNECT_RETRY_PATTERN.test(result.error)) {
@@ -911,6 +920,13 @@ export function retryableRuntimeInitializationFailureReason(
911
920
  return 'runtime_receipt_gateway_transport';
912
921
  }
913
922
  const rowsProcessed = Number(result.stats?.rowsProcessed ?? 0);
923
+ if (
924
+ rowsProcessed === 0 &&
925
+ result.steps.length === 0 &&
926
+ DAYTONA_RUNNER_STARTUP_TRANSPORT_RETRY_PATTERN.test(result.error)
927
+ ) {
928
+ return 'daytona_runner_startup_transport';
929
+ }
914
930
  if (
915
931
  rowsProcessed === 0 &&
916
932
  result.steps.length === 0 &&
@@ -1470,6 +1486,9 @@ export const daytonaPlayRunnerBackend: PlayRunnerBackend = {
1470
1486
  if (error instanceof SandboxRunnerPreCodeDeferralError) {
1471
1487
  throw error;
1472
1488
  }
1489
+ if (error instanceof DaytonaSandboxTransitionPendingError) {
1490
+ throw recoveryForDaytonaSandboxTransitionPending(error);
1491
+ }
1473
1492
  if (error instanceof DaytonaSandboxAcquisitionUnavailableError) {
1474
1493
  throw error;
1475
1494
  }
@@ -206,7 +206,6 @@ export async function buildPlayRunnerBundle(): Promise<string> {
206
206
  resolve(process.cwd(), 'packages', 'play-runtime'),
207
207
  resolve(process.cwd(), 'packages', 'plays'),
208
208
  resolve(process.cwd(), 'packages', 'security'),
209
- resolve(process.cwd(), 'shared_libs'),
210
209
  ];
211
210
  const sourceHash = await hashRunnerSources(sourceRoots);
212
211
  setSpanAttributes(span, {
@@ -6,17 +6,17 @@ import {
6
6
  deleteModalSandboxById,
7
7
  readDetachedModalRuntimeCompletion,
8
8
  } from './backends/modal';
9
+ import {
10
+ readPersistedRuntimeSandboxRef,
11
+ type RuntimeSandboxProviderId,
12
+ type RuntimeSandboxRef,
13
+ } from '../runtime-sandbox-contract';
9
14
  import type { DetachedRunnerSuspension } from '../suspension';
10
15
 
11
- export type RuntimeSandboxProviderId = 'daytona' | 'modal';
12
-
13
- export type RuntimeSandboxRef = {
14
- /** Frozen at 1: persisted in suspension_json, so readers must keep taking 1. */
15
- schemaVersion: 1;
16
- provider: RuntimeSandboxProviderId;
17
- resourceId: string;
18
- routingDomain: string | null;
19
- };
16
+ export type {
17
+ RuntimeSandboxProviderId,
18
+ RuntimeSandboxRef,
19
+ } from '../runtime-sandbox-contract';
20
20
 
21
21
  export type RuntimeSandboxReconciliationAdapter = {
22
22
  provider: RuntimeSandboxProviderId;
@@ -139,41 +139,11 @@ export function runtimeSandboxRefFromSuspension(
139
139
  const storedRef = (suspension as { runtimeSandboxRef?: unknown })
140
140
  .runtimeSandboxRef;
141
141
  if (storedRef !== undefined) {
142
- if (
143
- !storedRef ||
144
- typeof storedRef !== 'object' ||
145
- Array.isArray(storedRef)
146
- ) {
147
- throw new Error('Persisted Runtime Sandbox Ref is not an object.');
148
- }
149
- const candidate = storedRef as Record<string, unknown>;
150
- const resourceId =
151
- typeof candidate.resourceId === 'string'
152
- ? candidate.resourceId.trim()
153
- : '';
154
- const provider = candidate.provider;
155
- const routingDomain = candidate.routingDomain;
156
- if (
157
- candidate.schemaVersion !== 1 ||
158
- (provider !== 'daytona' && provider !== 'modal') ||
159
- !resourceId ||
160
- resourceId !== suspension.sandboxId.trim() ||
161
- (routingDomain !== null && typeof routingDomain !== 'string') ||
162
- (typeof routingDomain === 'string' && !routingDomain.trim()) ||
163
- (suspension.sandboxProvider !== undefined &&
164
- suspension.sandboxProvider !== provider)
165
- ) {
166
- throw new Error(
167
- `Persisted Runtime Sandbox Ref is invalid or inconsistent for sandbox ${suspension.sandboxId}.`,
168
- );
169
- }
170
- return {
171
- schemaVersion: 1,
172
- provider,
173
- resourceId,
174
- routingDomain:
175
- typeof routingDomain === 'string' ? routingDomain.trim() : null,
176
- };
142
+ return readPersistedRuntimeSandboxRef({
143
+ raw: storedRef,
144
+ expectedSandboxId: suspension.sandboxId,
145
+ expectedProvider: suspension.sandboxProvider,
146
+ });
177
147
  }
178
148
  if (
179
149
  suspension.sandboxProvider !== undefined &&
@@ -68,6 +68,7 @@ import {
68
68
  stringifyPostgresJson,
69
69
  } from './postgres-json';
70
70
  import { RECEIPT_STATUS_CODE, receiptStatusFromCode } from './receipt-status';
71
+ import { WORK_RECEIPT_EXECUTION_LOCK_TABLE } from './work-receipt-storage-contract';
71
72
  import {
72
73
  workReceiptClaimableStatusCodes,
73
74
  workReceiptActiveOwnerPredicateSql,
@@ -298,7 +299,6 @@ const dbSessionCache = new Map<string, DbSessionCacheEntry>();
298
299
  const dbSessionInFlight = new Map<string, Promise<CreateDbSessionResponse>>();
299
300
  const postgresPools = new Map<string, CachedRuntimePostgresPool>();
300
301
  const runtimePostgresAdmissions = new Map<string, RuntimePostgresAdmission>();
301
- const runtimeWorkReceiptEnsureCache = new Map<string, Promise<void>>();
302
302
  const runtimeSheetEnsureCache = new Map<
303
303
  string,
304
304
  { expiresAt: number; promise: Promise<void> }
@@ -313,19 +313,6 @@ const APPEND_KEY_SUFFIX_LENGTH = 12;
313
313
  // 60-min alignment fixed. A shorter TTL only causes periodic re-mints (cheap;
314
314
  // the tenant runtime role is long-lived), not run failures.
315
315
  const RUNTIME_DB_SESSION_TTL_SECONDS = 10 * 60;
316
- const RUNTIME_WORK_RECEIPT_LEASE_COLUMNS = [
317
- 'lease_id',
318
- 'lease_owner_run_id',
319
- 'lease_owner_attempt',
320
- 'lease_expires_at',
321
- ] as const;
322
- const RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN = 'failure_kind';
323
- const RUNTIME_WORK_RECEIPT_ERROR_PAYLOAD_COLUMN = 'error_payload';
324
- const RUNTIME_WORK_RECEIPT_SELF_HEAL_COLUMNS = [
325
- ...RUNTIME_WORK_RECEIPT_LEASE_COLUMNS,
326
- RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN,
327
- RUNTIME_WORK_RECEIPT_ERROR_PAYLOAD_COLUMN,
328
- ] as const;
329
316
  const RUNTIME_SHEET_ATTEMPT_COLUMNS = [
330
317
  '_attempt_id',
331
318
  '_attempt_owner_run_id',
@@ -2483,11 +2470,7 @@ function workReceiptTable(session: RuntimePostgresSession): string {
2483
2470
  }
2484
2471
 
2485
2472
  function receiptExecutionLockTable(session: RuntimePostgresSession): string {
2486
- return fqRuntimeTable(session, '_deepline_receipt_execution_locks');
2487
- }
2488
-
2489
- function postgresUrlCacheKey(value: string): string {
2490
- return createHash('sha256').update(value).digest('hex').slice(0, 24);
2473
+ return fqRuntimeTable(session, WORK_RECEIPT_EXECUTION_LOCK_TABLE);
2491
2474
  }
2492
2475
 
2493
2476
  function workReceiptKeyHex(key: string): string {
@@ -2548,134 +2531,6 @@ function mapRuntimeWorkReceiptRow(raw: Record<string, unknown>): WorkReceipt {
2548
2531
  };
2549
2532
  }
2550
2533
 
2551
- function isMissingRuntimeWorkReceiptSelfHealColumnError(
2552
- error: unknown,
2553
- ): boolean {
2554
- if (!error || typeof error !== 'object') {
2555
- return false;
2556
- }
2557
- const code = 'code' in error ? String(error.code) : '';
2558
- const message = 'message' in error ? String(error.message) : '';
2559
- if (code !== '42703' && !/column .* does not exist/i.test(message)) {
2560
- return false;
2561
- }
2562
- return RUNTIME_WORK_RECEIPT_SELF_HEAL_COLUMNS.some((column) =>
2563
- message.includes(column),
2564
- );
2565
- }
2566
-
2567
- function runtimeWorkReceiptEnsureCacheKey(
2568
- session: RuntimePostgresSession,
2569
- ): string {
2570
- return `${postgresUrlCacheKey(session.postgresUrl)}::${session.postgres.schema}::${session.postgres.receiptTable ?? RUNTIME_WORK_RECEIPT_POSTGRES_TABLE}`;
2571
- }
2572
-
2573
- async function missingRuntimeWorkReceiptSelfHealColumns(
2574
- session: RuntimePostgresSession,
2575
- client: RuntimeQueryClient,
2576
- ): Promise<string[]> {
2577
- const result = await client.query(
2578
- `
2579
- SELECT column_name
2580
- FROM information_schema.columns
2581
- WHERE table_schema = $1
2582
- AND table_name = $2
2583
- AND column_name = ANY($3::text[])
2584
- `,
2585
- [
2586
- session.postgres.schema,
2587
- session.postgres.receiptTable ?? RUNTIME_WORK_RECEIPT_POSTGRES_TABLE,
2588
- [...RUNTIME_WORK_RECEIPT_SELF_HEAL_COLUMNS],
2589
- ],
2590
- );
2591
- const present = new Set(
2592
- result.rows.map((row) => String(row.column_name ?? '')),
2593
- );
2594
- return RUNTIME_WORK_RECEIPT_SELF_HEAL_COLUMNS.filter(
2595
- (column) => !present.has(column),
2596
- );
2597
- }
2598
-
2599
- // COMPAT / SELF-HEAL — owner: runtime. Removal milestone: runtime-ledger
2600
- // cutover. The customer-Neon
2601
- // work-receipt table (lease columns + failure_kind) is the dying surface. The
2602
- // F2 rolling migration (scripts/migrate-play-runtime-storage.ts) backfills these
2603
- // columns; this lazy CREATE/ALTER self-heal is a compat-window safety net and is
2604
- // deleted together with the Neon receipt path at M1.
2605
- async function ensureRuntimeWorkReceiptTable(
2606
- session: RuntimePostgresSession,
2607
- client: RuntimeQueryClient,
2608
- ): Promise<void> {
2609
- const cacheKey = runtimeWorkReceiptEnsureCacheKey(session);
2610
- const cached = runtimeWorkReceiptEnsureCache.get(cacheKey);
2611
- if (cached) {
2612
- await cached;
2613
- return;
2614
- }
2615
- const promise = client
2616
- .query(
2617
- `
2618
- CREATE TABLE IF NOT EXISTS ${workReceiptTable(session)} (
2619
- k bytea PRIMARY KEY,
2620
- status smallint NOT NULL DEFAULT 0,
2621
- output jsonb,
2622
- error text,
2623
- error_payload jsonb,
2624
- failure_kind smallint NOT NULL DEFAULT 0,
2625
- run_id text,
2626
- lease_id text,
2627
- lease_owner_run_id text,
2628
- lease_owner_attempt integer,
2629
- lease_expires_at timestamptz,
2630
- updated_at timestamptz NOT NULL DEFAULT now()
2631
- )
2632
- `,
2633
- )
2634
- .then(async () => {
2635
- await client.query(`
2636
- CREATE TABLE IF NOT EXISTS ${receiptExecutionLockTable(session)} (
2637
- k bytea PRIMARY KEY,
2638
- owner_execution_id text NOT NULL,
2639
- expires_at timestamptz NOT NULL,
2640
- updated_at timestamptz NOT NULL DEFAULT now()
2641
- )
2642
- `);
2643
- const missingColumns = await missingRuntimeWorkReceiptSelfHealColumns(
2644
- session,
2645
- client,
2646
- );
2647
- if (missingColumns.length === 0) return;
2648
- await client.query(`
2649
- ALTER TABLE ${workReceiptTable(session)}
2650
- ${missingColumns
2651
- .map((column) => {
2652
- const type =
2653
- column === 'lease_expires_at'
2654
- ? 'timestamptz'
2655
- : column === 'lease_owner_attempt'
2656
- ? 'integer'
2657
- : column === RUNTIME_WORK_RECEIPT_FAILURE_KIND_COLUMN
2658
- ? 'smallint NOT NULL DEFAULT 0'
2659
- : column === RUNTIME_WORK_RECEIPT_ERROR_PAYLOAD_COLUMN
2660
- ? 'jsonb'
2661
- : 'text';
2662
- return `ADD COLUMN IF NOT EXISTS ${column} ${type}`;
2663
- })
2664
- .join(',\n ')}
2665
- `);
2666
- })
2667
- .then(() => undefined);
2668
- runtimeWorkReceiptEnsureCache.set(cacheKey, promise);
2669
- try {
2670
- await promise;
2671
- } catch (error) {
2672
- if (runtimeWorkReceiptEnsureCache.get(cacheKey) === promise) {
2673
- runtimeWorkReceiptEnsureCache.delete(cacheKey);
2674
- }
2675
- throw error;
2676
- }
2677
- }
2678
-
2679
2534
  export async function acquireRuntimeReceiptExecutionLock(
2680
2535
  context: RuntimeApiContext,
2681
2536
  input: {
@@ -2752,13 +2607,10 @@ async function withRuntimeWorkReceiptClient<T>(
2752
2607
  session: RuntimePostgresSession,
2753
2608
  operation: (client: RuntimeQueryClient) => Promise<T>,
2754
2609
  ): Promise<T> {
2755
- // Receipt tables are part of customer Postgres bootstrap, so the hot path
2756
- // should not pay DDL on every fresh runtime isolate. Try the receipt query
2757
- // first, then self-heal once on a missing relation/column. Permission loss
2758
- // during an operational receipt query must fail loud: silently repairing it
2759
- // can let provider work continue after durable receipt persistence is gone.
2760
- // Only the schema-migration branch below may repair ownership before its
2761
- // retry. A genuinely missing schema or second failure also rethrows loudly.
2610
+ // Receipt tables are customer-Postgres bootstrap state. The operation path
2611
+ // never performs DDL or schema repair: a missing table/column is the real
2612
+ // operation failure and must remain visible to the caller. We retry only
2613
+ // transient connection/transport failures, never a semantic SQL error.
2762
2614
  const withClient = async <R>(
2763
2615
  run: (client: RuntimeQueryClient) => Promise<R>,
2764
2616
  ): Promise<R> =>
@@ -2768,8 +2620,6 @@ async function withRuntimeWorkReceiptClient<T>(
2768
2620
  cachePool: !context.disablePostgresPoolCache,
2769
2621
  signal: context.abortSignal,
2770
2622
  });
2771
- let selfHealAttempted = false;
2772
-
2773
2623
  for (
2774
2624
  let attempt = 1;
2775
2625
  attempt <= RUNTIME_WORK_RECEIPT_QUERY_MAX_ATTEMPTS;
@@ -2778,34 +2628,6 @@ async function withRuntimeWorkReceiptClient<T>(
2778
2628
  try {
2779
2629
  return await withClient(operation);
2780
2630
  } catch (error) {
2781
- const missingStorage =
2782
- isMissingRelationError(error) ||
2783
- isMissingRuntimeWorkReceiptSelfHealColumnError(error);
2784
- if (missingStorage && !selfHealAttempted) {
2785
- selfHealAttempted = true;
2786
- runtimeWorkReceiptEnsureCache.delete(
2787
- runtimeWorkReceiptEnsureCacheKey(session),
2788
- );
2789
- try {
2790
- await withClient((client) =>
2791
- ensureRuntimeWorkReceiptTable(session, client),
2792
- );
2793
- } catch (ensureError) {
2794
- if (!isPostgresPermissionDeniedError(ensureError)) {
2795
- throw ensureError;
2796
- }
2797
- runtimeWorkReceiptEnsureCache.delete(
2798
- runtimeWorkReceiptEnsureCacheKey(session),
2799
- );
2800
- await repairRuntimeStorageGrants(context, {
2801
- playName: context.playName?.trim() || session.playName,
2802
- });
2803
- await withClient((client) =>
2804
- ensureRuntimeWorkReceiptTable(session, client),
2805
- );
2806
- }
2807
- continue;
2808
- }
2809
2631
  if (
2810
2632
  attempt >= RUNTIME_WORK_RECEIPT_QUERY_MAX_ATTEMPTS ||
2811
2633
  !isTransientRuntimePostgresOperationError(error)
@@ -7047,11 +6869,6 @@ async function completeRuntimeMapRowChunks(
7047
6869
  OR coalesce(target._attempt_owner_run_id, target._run_id) IS DISTINCT FROM $10::text
7048
6870
  )
7049
6871
  )`;
7050
- const sameOwnerTerminalEpochSql = sameOwnerTerminalAttemptEpochSql(
7051
- 'target',
7052
- '$10::text',
7053
- '$12',
7054
- );
7055
6872
  const { rows } = await client.query<{
7056
6873
  updated: number;
7057
6874
  matched_keys: string[];
@@ -7106,6 +6923,15 @@ async function completeRuntimeMapRowChunks(
7106
6923
  target._status <> 'enriched'
7107
6924
  OR (${targetChangedPatchedCellSql})
7108
6925
  )
6926
+ -- First terminal wins: suppress conflict for same owner+epoch already-terminal row.
6927
+ -- Durable replay (omitted_terminal_replay) from same attempt epoch is idempotent.
6928
+ AND NOT (
6929
+ $10::text IS NOT NULL
6930
+ AND $12::integer IS NOT NULL
6931
+ AND target._status = 'enriched'
6932
+ AND coalesce(target._attempt_owner_run_id, target._run_id) = $10::text
6933
+ AND COALESCE(target._attempt_seq, 0) = $12::integer
6934
+ )
7109
6935
  ),
7110
6936
  applied_rows AS (
7111
6937
  UPDATE ${sheetTable(session)} AS target
@@ -7127,13 +6953,21 @@ async function completeRuntimeMapRowChunks(
7127
6953
  AND ($13::bigint IS NULL OR target._write_version = $13::bigint)
7128
6954
  AND ($13::bigint IS NOT NULL OR target._status <> 'enriched')
7129
6955
  AND NOT (${newerTerminalRuntimeSheetRowSql('target', '$11::timestamptz', '$12::integer', '$9::text', '$10::text')})
7130
- AND NOT (${sameOwnerTerminalEpochSql})
7131
6956
  AND (
7132
6957
  ($9::text IS NULL AND target._run_id = $5::text)
7133
6958
  OR ($9::text IS NOT NULL AND ${writableNonTerminalAttemptSql})
7134
6959
  OR ($9::text IS NOT NULL AND ${activeRuntimeSheetAttemptFenceSql('target', '$9::text', '$10::text', '$11::timestamptz', '$12::integer')})
7135
6960
  OR ($9::text IS NOT NULL AND ${writableEnrichedAttemptSql})
7136
6961
  )
6962
+ -- First terminal wins: skip UPDATE for already-terminal same-owner+epoch row.
6963
+ -- Even though we excluded from conflicts, we still no-op here for idempotency.
6964
+ AND NOT (
6965
+ $10::text IS NOT NULL
6966
+ AND $12::integer IS NOT NULL
6967
+ AND target._status = 'enriched'
6968
+ AND coalesce(target._attempt_owner_run_id, target._run_id) = $10::text
6969
+ AND COALESCE(target._attempt_seq, 0) = $12::integer
6970
+ )
7137
6971
  AND (
7138
6972
  target._status <> 'enriched'
7139
6973
  OR target._run_id IS DISTINCT FROM $5::text
@@ -7339,11 +7173,6 @@ async function completeRuntimeMapRowChunksWithInputIndexRepair(
7339
7173
  '$11::timestamptz',
7340
7174
  '$12',
7341
7175
  );
7342
- const sameOwnerTerminalEpochSql = sameOwnerTerminalAttemptEpochSql(
7343
- 'target',
7344
- '$10::text',
7345
- '$12',
7346
- );
7347
7176
  const { rows } = await client.query<{
7348
7177
  _key?: string;
7349
7178
  fenced_keys?: string[];
@@ -7403,6 +7232,15 @@ async function completeRuntimeMapRowChunksWithInputIndexRepair(
7403
7232
  target._status <> 'enriched'
7404
7233
  OR (${targetChangedPatchedCellSql})
7405
7234
  )
7235
+ -- First terminal wins: suppress conflict for same owner+epoch already-terminal row.
7236
+ -- Durable replay (omitted_terminal_replay) from same attempt epoch is idempotent.
7237
+ AND NOT (
7238
+ $10::text IS NOT NULL
7239
+ AND $12::integer IS NOT NULL
7240
+ AND target._status = 'enriched'
7241
+ AND coalesce(target._attempt_owner_run_id, target._run_id) = $10::text
7242
+ AND COALESCE(target._attempt_seq, 0) = $12::integer
7243
+ )
7406
7244
  ),
7407
7245
  applied_rows AS (
7408
7246
  UPDATE ${sheetTable(session)} AS target
@@ -7425,7 +7263,6 @@ async function completeRuntimeMapRowChunksWithInputIndexRepair(
7425
7263
  AND ($13::bigint IS NULL OR target._write_version = $13::bigint)
7426
7264
  AND ($13::bigint IS NOT NULL OR target._status <> 'enriched')
7427
7265
  AND NOT (${newerTerminalRuntimeSheetRowSql('target', '$11::timestamptz', '$12::integer', '$9::text', '$10::text')})
7428
- AND NOT (${sameOwnerTerminalEpochSql})
7429
7266
  AND (
7430
7267
  ($9::text IS NULL AND target._run_id = $5::text)
7431
7268
  OR ($9::text IS NOT NULL AND ${activeRuntimeSheetAttemptFenceSql('target', '$9::text', '$10::text', '$11::timestamptz', '$12::integer')})
@@ -7862,6 +7699,16 @@ async function failRuntimeMapRowChunks(
7862
7699
  OR target._error IS DISTINCT FROM updates.error
7863
7700
  OR (${targetChangedPatchedCellSql})
7864
7701
  )
7702
+ -- Same-owner terminal replay is not a conflict. Normal replay
7703
+ -- preserves the first value below; explicit force-failure may update it.
7704
+ -- Different owners and attempt epochs still conflict.
7705
+ AND NOT (
7706
+ $12::text IS NOT NULL
7707
+ AND $14::integer IS NOT NULL
7708
+ AND target._status IN ('failed', 'enriched')
7709
+ AND coalesce(target._attempt_owner_run_id, target._run_id) = $12::text
7710
+ AND COALESCE(target._attempt_seq, 0) = $14::integer
7711
+ )
7865
7712
  ),
7866
7713
  applied_rows AS (
7867
7714
  UPDATE ${sheetTable(session)} AS target
@@ -7888,13 +7735,15 @@ async function failRuntimeMapRowChunks(
7888
7735
  ($11::text IS NULL AND target._run_id = $6::text)
7889
7736
  OR ($11::text IS NOT NULL AND ${activeRuntimeSheetAttemptFenceSql('target', '$11::text', '$12::text', '$13::timestamptz', '$14::integer')})
7890
7737
  )
7738
+ -- First terminal wins for failed rows too, BUT only when NOT force-failing.
7739
+ -- Normal replay: no-op when already-failed OR already-enriched from same owner+epoch.
7891
7740
  AND NOT (
7892
- $16::bigint IS NOT NULL
7893
- AND target._write_version = $16::bigint
7894
- AND target._run_id = $6::text
7895
- AND target._status = 'failed'
7896
- AND target._error IS NOT DISTINCT FROM updates.error
7897
- AND NOT (${targetChangedPatchedCellSql})
7741
+ $15::boolean = FALSE
7742
+ AND $12::text IS NOT NULL
7743
+ AND $14::integer IS NOT NULL
7744
+ AND target._status IN ('failed', 'enriched')
7745
+ AND coalesce(target._attempt_owner_run_id, target._run_id) = $12::text
7746
+ AND COALESCE(target._attempt_seq, 0) = $14::integer
7898
7747
  )
7899
7748
  RETURNING target._key, prev._status AS prev_status
7900
7749
  ),
@@ -8006,9 +7855,12 @@ async function failRuntimeMapRowChunks(
8006
7855
  input.writeVersion,
8007
7856
  ],
8008
7857
  );
8009
- updated += Number(rows[0]?.updated ?? 0);
8010
- fencedKeys.push(...(rows[0]?.fenced_keys ?? []));
8011
- conflictKeys.push(...(rows[0]?.conflict_keys ?? []));
7858
+ const appliedCount = Number(rows[0]?.updated ?? 0);
7859
+ const chunkFencedKeys = rows[0]?.fenced_keys ?? [];
7860
+ const chunkConflictKeys = rows[0]?.conflict_keys ?? [];
7861
+ updated += appliedCount;
7862
+ fencedKeys.push(...chunkFencedKeys);
7863
+ conflictKeys.push(...chunkConflictKeys);
8012
7864
  }
8013
7865
  return { updated, fencedKeys, conflictKeys };
8014
7866
  }