deepline 0.3.88 → 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 (280) hide show
  1. package/contracts/install-commands.json +29 -0
  2. package/dist/bundling-sources/sdk/src/client.ts +652 -39
  3. package/dist/bundling-sources/sdk/src/config.ts +77 -0
  4. package/dist/bundling-sources/sdk/src/http.ts +76 -30
  5. package/dist/bundling-sources/sdk/src/index.ts +10 -0
  6. package/dist/bundling-sources/sdk/src/monitor-fleet-contract.ts +1 -1
  7. package/dist/bundling-sources/sdk/src/pagination.ts +25 -0
  8. package/dist/bundling-sources/sdk/src/play.ts +15 -1
  9. package/dist/bundling-sources/sdk/src/plays/bundle-play-file.ts +3 -3
  10. package/dist/bundling-sources/sdk/src/release.ts +16 -9
  11. package/dist/bundling-sources/sdk/src/types.ts +106 -4
  12. package/dist/bundling-sources/shared_libs/integration-contracts/AGENTS.md +9 -0
  13. package/dist/bundling-sources/shared_libs/integration-contracts/README.md +3 -0
  14. package/dist/bundling-sources/shared_libs/integration-contracts/index.ts +2 -0
  15. package/dist/bundling-sources/shared_libs/monitors/analytics-install-guides.ts +77 -0
  16. package/dist/bundling-sources/shared_libs/monitors/analytics-public.ts +10 -0
  17. package/dist/bundling-sources/shared_libs/monitors/billing/charges.ts +125 -0
  18. package/dist/bundling-sources/shared_libs/monitors/billing/policy-builders.ts +686 -0
  19. package/dist/bundling-sources/shared_libs/monitors/billing/pricing.ts +54 -0
  20. package/dist/bundling-sources/shared_libs/monitors/billing/public-pricing.ts +72 -0
  21. package/dist/bundling-sources/shared_libs/monitors/billing/session.ts +45 -0
  22. package/dist/bundling-sources/shared_libs/monitors/billing/state.ts +454 -0
  23. package/dist/bundling-sources/shared_libs/monitors/billing/tamradar.ts +260 -0
  24. package/dist/bundling-sources/shared_libs/monitors/billing/types.ts +215 -0
  25. package/dist/bundling-sources/shared_libs/monitors/callback-security.ts +333 -0
  26. package/dist/bundling-sources/shared_libs/monitors/cursor-page.ts +42 -0
  27. package/dist/bundling-sources/shared_libs/monitors/deactivation-reasons.ts +16 -0
  28. package/dist/bundling-sources/shared_libs/monitors/framework-managed-payload-fields.ts +71 -0
  29. package/dist/bundling-sources/shared_libs/monitors/generated/provider-monitor-callback-admission-targets.ts +16 -0
  30. package/dist/bundling-sources/shared_libs/monitors/http-error-response.ts +270 -0
  31. package/dist/bundling-sources/shared_libs/monitors/inbound-publish-key.ts +39 -0
  32. package/dist/bundling-sources/shared_libs/monitors/inbound-queue.ts +82 -0
  33. package/dist/bundling-sources/shared_libs/monitors/inventory-reconciliation.ts +59 -0
  34. package/dist/bundling-sources/shared_libs/monitors/lifecycle-notifications.ts +471 -0
  35. package/dist/bundling-sources/shared_libs/monitors/org-monitor-limits.ts +1 -1
  36. package/dist/bundling-sources/shared_libs/monitors/package.json +36 -0
  37. package/dist/bundling-sources/shared_libs/monitors/provider-callback-verification.ts +1125 -0
  38. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-batch-operation.ts +305 -0
  39. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-capability.ts +964 -0
  40. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-consumer-health.ts +56 -0
  41. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-errors.ts +131 -0
  42. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-identity-claims.ts +535 -0
  43. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-legacy-aliases.ts +16 -0
  44. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-priority-execution.ts +56 -0
  45. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-public-aliases.ts +28 -0
  46. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-runtime-read-eligibility.ts +38 -0
  47. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-state.ts +122 -0
  48. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-status.ts +10 -0
  49. package/dist/bundling-sources/shared_libs/monitors/provider-monitor-upstream-identity.ts +112 -0
  50. package/dist/bundling-sources/shared_libs/monitors/provider-webhook-monitor-runtime.ts +300 -0
  51. package/dist/bundling-sources/shared_libs/monitors/quickstart-prompts.ts +22 -0
  52. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-dead-letter.ts +245 -0
  53. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-message.ts +38 -0
  54. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue-ack-probe.ts +94 -0
  55. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue-delivery.ts +60 -0
  56. package/dist/bundling-sources/shared_libs/monitors/signal-radars/inbound-queue.ts +60 -0
  57. package/dist/bundling-sources/shared_libs/monitors/snitcher-install-validation.ts +93 -0
  58. package/dist/bundling-sources/shared_libs/monitors/snitcher-ip2company.ts +332 -0
  59. package/dist/bundling-sources/shared_libs/monitors/snitcher-radar.ts +221 -0
  60. package/dist/bundling-sources/shared_libs/monitors/starter-templates.ts +105 -0
  61. package/dist/bundling-sources/shared_libs/monitors/tracking-provider-guidance.ts +73 -0
  62. package/dist/bundling-sources/shared_libs/monitors/tracking-provider-integrations.ts +81 -0
  63. package/dist/bundling-sources/shared_libs/monitors/tsconfig.json +10 -0
  64. package/dist/bundling-sources/shared_libs/observability/build-context.ts +13 -0
  65. package/dist/bundling-sources/shared_libs/observability/log-metadata.ts +160 -0
  66. package/dist/bundling-sources/shared_libs/observability/request-context.ts +68 -0
  67. package/dist/bundling-sources/shared_libs/observability/scheduled-jobs.json +654 -0
  68. package/dist/bundling-sources/shared_libs/observability/scheduled-work-manual.ts +35 -0
  69. package/dist/bundling-sources/shared_libs/observability/scheduled-work.ts +5 -0
  70. package/dist/bundling-sources/shared_libs/play-data-plane/neon-constants.ts +9 -0
  71. package/dist/bundling-sources/shared_libs/play-data-plane/r2.ts +272 -0
  72. package/dist/bundling-sources/shared_libs/play-runtime/activity-observation.ts +6 -11
  73. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +135 -12
  74. package/dist/bundling-sources/shared_libs/play-runtime/async-operation.ts +66 -1
  75. package/dist/bundling-sources/shared_libs/play-runtime/async-play-invocation.ts +77 -0
  76. package/dist/bundling-sources/shared_libs/play-runtime/bounceban-batching.ts +137 -0
  77. package/dist/bundling-sources/shared_libs/play-runtime/checkpoint-boundaries.ts +70 -0
  78. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +1159 -166
  79. package/dist/bundling-sources/shared_libs/play-runtime/coordinator-headers.ts +1 -32
  80. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +103 -0
  81. package/dist/bundling-sources/shared_libs/play-runtime/daytona-payload-contract.ts +68 -0
  82. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-janitor.ts +103 -0
  83. package/dist/bundling-sources/shared_libs/play-runtime/daytona-sandbox-reaper.ts +725 -0
  84. package/dist/bundling-sources/shared_libs/play-runtime/default-batch-strategies.ts +20 -1
  85. package/dist/bundling-sources/shared_libs/play-runtime/durable-call-cache.ts +29 -0
  86. package/dist/bundling-sources/shared_libs/play-runtime/execution-capabilities.ts +29 -0
  87. package/dist/bundling-sources/shared_libs/play-runtime/execution-gateway-invocation-fence.ts +442 -0
  88. package/dist/bundling-sources/shared_libs/play-runtime/execution-protocol.ts +7 -1
  89. package/dist/bundling-sources/shared_libs/play-runtime/fixture-behavior.ts +18 -0
  90. package/dist/bundling-sources/shared_libs/play-runtime/governor/app-runtime-rate-state-backend.ts +9 -0
  91. package/dist/bundling-sources/shared_libs/play-runtime/governor/policy.ts +1 -1
  92. package/dist/bundling-sources/shared_libs/play-runtime/governor/rate-state-backend.ts +1 -1
  93. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/contracts.ts +66 -0
  94. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/job.ts +145 -0
  95. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/ports.ts +21 -0
  96. package/dist/bundling-sources/shared_libs/play-runtime/integration-operation-reader-fence/postgres-store.ts +170 -0
  97. package/dist/bundling-sources/shared_libs/play-runtime/internal-bootstrap-token.ts +1322 -0
  98. package/dist/bundling-sources/shared_libs/play-runtime/internal-step-ids.ts +2 -2
  99. package/dist/bundling-sources/shared_libs/play-runtime/lane-retirement-gate.ts +189 -0
  100. package/dist/bundling-sources/shared_libs/play-runtime/launch-source-policy.ts +112 -0
  101. package/dist/bundling-sources/shared_libs/play-runtime/map-execution-frame.ts +8 -0
  102. package/dist/bundling-sources/shared_libs/play-runtime/perf-trace.ts +127 -0
  103. package/dist/bundling-sources/shared_libs/play-runtime/play-artifact-runtime-contract.ts +5 -0
  104. package/dist/bundling-sources/shared_libs/play-runtime/play-run-recovery-policy.ts +24 -1
  105. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/contracts.ts +56 -0
  106. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/index.ts +13 -0
  107. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/job.ts +41 -0
  108. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/ports.ts +17 -0
  109. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/admission/postgres-adapter.ts +54 -0
  110. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/contracts.ts +114 -0
  111. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/engine-suspension.ts +108 -0
  112. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/index.ts +36 -0
  113. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/job.ts +97 -0
  114. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/ports.ts +104 -0
  115. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/postgres-fence-adapter.ts +263 -0
  116. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/attempts/worker-terminal-projection.ts +64 -0
  117. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/contracts.ts +29 -0
  118. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/gateway-adapter.ts +56 -0
  119. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/index.ts +15 -0
  120. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/job.ts +65 -0
  121. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/ports.ts +17 -0
  122. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/contracts.ts +42 -0
  123. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/index.ts +17 -0
  124. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/job.ts +142 -0
  125. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/ports.ts +42 -0
  126. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/sandbox-cleanup/postgres-adapter.ts +102 -0
  127. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/contracts.ts +60 -0
  128. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/index.ts +16 -0
  129. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/job.ts +78 -0
  130. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/ports.ts +54 -0
  131. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/terminal/postgres-adapter.ts +71 -0
  132. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-batching-registry.ts +4 -0
  133. package/dist/bundling-sources/shared_libs/play-runtime/play-runtime-semantics.ts +28 -0
  134. package/dist/bundling-sources/shared_libs/play-runtime/protocol.ts +4 -0
  135. package/dist/bundling-sources/shared_libs/play-runtime/receipt-status.ts +5 -8
  136. package/dist/bundling-sources/shared_libs/play-runtime/run-failure.ts +23 -2
  137. package/dist/bundling-sources/shared_libs/play-runtime/run-identity.ts +168 -0
  138. package/dist/bundling-sources/shared_libs/play-runtime/run-snapshot-stream.ts +1 -1
  139. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-lifecycle.ts +90 -13
  140. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-payload-transport.ts +6 -12
  141. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona-start-admission.ts +68 -0
  142. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/backends/daytona.ts +21 -0
  143. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/bundle.ts +0 -1
  144. package/dist/bundling-sources/shared_libs/play-runtime/runner-backends/runtime-sandbox-reconciliation.ts +14 -43
  145. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +67 -213
  146. package/dist/bundling-sources/shared_libs/play-runtime/runtime-authority.ts +201 -0
  147. package/dist/bundling-sources/shared_libs/play-runtime/runtime-capacity-policy.ts +20 -0
  148. package/dist/bundling-sources/shared_libs/play-runtime/runtime-contract.ts +6 -0
  149. package/dist/bundling-sources/shared_libs/play-runtime/runtime-env.ts +12 -0
  150. package/dist/bundling-sources/shared_libs/play-runtime/runtime-operation-contract.ts +67 -0
  151. package/dist/bundling-sources/shared_libs/play-runtime/runtime-release-environment.ts +2 -0
  152. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sandbox-contract.ts +68 -0
  153. package/dist/bundling-sources/shared_libs/play-runtime/runtime-scheduler-topology.ts +38 -2
  154. package/dist/bundling-sources/shared_libs/play-runtime/runtime-telemetry.ts +108 -0
  155. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/contract.ts +4 -0
  156. package/dist/bundling-sources/shared_libs/play-runtime/sandbox-runs/runner-backend-adapter.ts +3 -0
  157. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +37 -1
  158. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-deadline-reconciliation.ts +88 -0
  159. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-play-deploy-task.ts +124 -0
  160. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-play-run-task.ts +68 -0
  161. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-pool.ts +193 -0
  162. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-queue-lifecycle.ts +269 -0
  163. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-queue-suffix.ts +73 -0
  164. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +6642 -0
  165. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-shared.ts +897 -0
  166. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-metrics.ts +120 -0
  167. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-worker-required-env.ts +76 -0
  168. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd.ts +476 -0
  169. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/gateway-heavy-request-admission.ts +47 -0
  170. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/gateway-progress-registry.ts +147 -0
  171. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/index.ts +27 -0
  172. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/lazy.ts +50 -0
  173. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/play-run-recovery.ts +98 -0
  174. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-budget-state.ts +260 -0
  175. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-pool.ts +1416 -0
  176. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +1255 -0
  177. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-rate-state.ts +942 -0
  178. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +14636 -0
  179. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/receipt-gateway.ts +888 -0
  180. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +355 -0
  181. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-terminal-transition.ts +46 -0
  182. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runner-push.ts +60 -0
  183. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-api-origin.ts +33 -0
  184. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-receipt-gateway-health.ts +64 -0
  185. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-capacity.ts +835 -0
  186. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-ledger-reconciliation.ts +1218 -0
  187. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-sandbox-operation.ts +207 -0
  188. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-scheduler-schema.ts +10 -0
  189. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/scheduler-capacity.ts +123 -0
  190. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/scheduler-launch-read-observability.ts +78 -0
  191. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/submit-admission.ts +169 -0
  192. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/terminal-contract.ts +20 -0
  193. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/worker-queue-metrics.ts +34 -0
  194. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/worker-resource-metrics.ts +249 -0
  195. package/dist/bundling-sources/shared_libs/play-runtime/sheet-attempt-sql.ts +7 -0
  196. package/dist/bundling-sources/shared_libs/play-runtime/step-progress.ts +296 -0
  197. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/native-batch.ts +3 -3
  198. package/dist/bundling-sources/shared_libs/play-runtime/tool-call/runtime-step-receipts-adapter.ts +20 -1
  199. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +60 -15
  200. package/dist/bundling-sources/shared_libs/play-runtime/tool-execution-outcome.ts +20 -0
  201. package/dist/bundling-sources/shared_libs/play-runtime/tool-http-errors.ts +1 -1
  202. package/dist/bundling-sources/shared_libs/play-runtime/tool-result.ts +1 -1
  203. package/dist/bundling-sources/shared_libs/play-runtime/transient-service-error.ts +12 -0
  204. package/dist/bundling-sources/shared_libs/play-runtime/vercel-protection.ts +14 -1
  205. package/dist/bundling-sources/shared_libs/play-runtime/work-receipt-storage-contract.ts +165 -0
  206. package/dist/bundling-sources/shared_libs/play-runtime/work-receipts.ts +15 -23
  207. package/dist/bundling-sources/shared_libs/play-runtime/workflow-executor-auth.ts +169 -0
  208. package/dist/bundling-sources/shared_libs/play-runtime/zerobounce-batching.ts +122 -0
  209. package/dist/bundling-sources/shared_libs/plays/artifact-types.ts +8 -3
  210. package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +454 -17
  211. package/dist/bundling-sources/shared_libs/plays/bundling/index.ts +19 -4
  212. package/dist/bundling-sources/shared_libs/plays/contracts.ts +8 -14
  213. package/dist/bundling-sources/shared_libs/plays/core.ts +11 -6
  214. package/dist/bundling-sources/shared_libs/plays/deployment-status.ts +1 -1
  215. package/dist/bundling-sources/shared_libs/plays/docflow-binding-owner.ts +16 -11
  216. package/dist/bundling-sources/shared_libs/plays/docflow.ts +1 -1
  217. package/dist/bundling-sources/shared_libs/plays/email-status.ts +1 -1
  218. package/dist/bundling-sources/shared_libs/plays/play-grep-search.ts +39 -0
  219. package/dist/bundling-sources/shared_libs/plays/resolve-static-pipeline.ts +1 -1
  220. package/dist/bundling-sources/shared_libs/plays/share/copy.ts +271 -0
  221. package/dist/bundling-sources/shared_libs/plays/share/metrics.ts +140 -0
  222. package/dist/bundling-sources/shared_libs/plays/share/public-read-model.ts +86 -0
  223. package/dist/bundling-sources/shared_libs/plays/share/seo-quality.ts +181 -0
  224. package/dist/bundling-sources/shared_libs/plays/share/static-pipeline-summary.ts +658 -0
  225. package/dist/bundling-sources/shared_libs/plays/share/types.ts +197 -0
  226. package/dist/bundling-sources/shared_libs/plays/slack-hitl-timeout-error.ts +37 -0
  227. package/dist/bundling-sources/shared_libs/plays/slug.ts +115 -0
  228. package/dist/bundling-sources/shared_libs/plays/static-pipeline.ts +50 -15
  229. package/dist/bundling-sources/shared_libs/plays/tool-category-descriptions.ts +2 -2
  230. package/dist/bundling-sources/shared_libs/plays/tool-result-types.ts +1 -1
  231. package/dist/bundling-sources/shared_libs/product-notifications/catalog.ts +877 -0
  232. package/dist/bundling-sources/shared_libs/product-notifications/configuration-draft.ts +456 -0
  233. package/dist/bundling-sources/shared_libs/product-notifications/configuration.ts +566 -0
  234. package/dist/bundling-sources/shared_libs/product-notifications/content.ts +28 -0
  235. package/dist/bundling-sources/shared_libs/product-notifications/default-policy.ts +60 -0
  236. package/dist/bundling-sources/shared_libs/product-notifications/email.ts +246 -0
  237. package/dist/bundling-sources/shared_libs/product-notifications/evaluation.ts +280 -0
  238. package/dist/bundling-sources/shared_libs/product-notifications/events.ts +433 -0
  239. package/dist/bundling-sources/shared_libs/product-notifications/legacy-slack.ts +80 -0
  240. package/dist/bundling-sources/shared_libs/product-notifications/overflow.ts +18 -0
  241. package/dist/bundling-sources/shared_libs/product-notifications/rolling-limit.ts +24 -0
  242. package/dist/bundling-sources/shared_libs/product-notifications/slack-delivery.ts +624 -0
  243. package/dist/bundling-sources/shared_libs/product-notifications/slack-payload.ts +140 -0
  244. package/dist/bundling-sources/shared_libs/product-notifications/slack-transport.ts +75 -0
  245. package/dist/bundling-sources/shared_libs/product-notifications/workspace.ts +38 -0
  246. package/dist/bundling-sources/shared_libs/runtime-env.ts +12 -0
  247. package/dist/bundling-sources/shared_libs/security/email-blacklist.ts +42 -0
  248. package/dist/bundling-sources/shared_libs/security/header-safe-env.ts +35 -0
  249. package/dist/bundling-sources/shared_libs/security/internal-actor.ts +50 -0
  250. package/dist/bundling-sources/shared_libs/security/secret-redaction.ts +267 -0
  251. package/dist/bundling-sources/shared_libs/security/slack-sanitize.ts +133 -0
  252. package/dist/cli/getting-started.d.mts +52 -0
  253. package/dist/cli/getting-started.d.ts +52 -0
  254. package/dist/cli/getting-started.js +65 -0
  255. package/dist/cli/getting-started.mjs +36 -0
  256. package/dist/cli/index.d.mts +9 -0
  257. package/dist/cli/index.d.ts +9 -0
  258. package/dist/cli/index.js +1611 -453
  259. package/dist/cli/index.mjs +1596 -447
  260. package/dist/{compiler-manifest-Dbov16F7.d.mts → compiler-manifest-BaJfE-5H.d.mts} +136 -10
  261. package/dist/{compiler-manifest-Dbov16F7.d.ts → compiler-manifest-BaJfE-5H.d.ts} +136 -10
  262. package/dist/index.d.mts +910 -155
  263. package/dist/index.d.ts +910 -155
  264. package/dist/index.js +550 -64
  265. package/dist/index.mjs +550 -64
  266. package/dist/install-integrity.json +193 -4
  267. package/dist/monitor-fleet-contract.d.mts +138 -0
  268. package/dist/monitor-fleet-contract.d.ts +138 -0
  269. package/dist/monitor-fleet-contract.js +404 -0
  270. package/dist/monitor-fleet-contract.mjs +367 -0
  271. package/dist/plays/bundle-play-file.d.mts +8 -3
  272. package/dist/plays/bundle-play-file.d.ts +8 -3
  273. package/dist/plays/bundle-play-file.mjs +100 -20
  274. package/dist/release.d.mts +255 -0
  275. package/dist/release.d.ts +255 -0
  276. package/dist/release.js +215 -0
  277. package/dist/release.mjs +188 -0
  278. package/package.json +23 -4
  279. /package/dist/bundling-sources/shared_libs/{integrations/bettercontact-execution-policy.ts → integration-contracts/bettercontact/execution-policy.ts} +0 -0
  280. /package/dist/bundling-sources/shared_libs/{integrations/theirstack-execution-policy.ts → integration-contracts/theirstack/execution-policy.ts} +0 -0
@@ -0,0 +1,249 @@
1
+ import { statfsSync } from 'node:fs';
2
+ import { cpus } from 'node:os';
3
+
4
+ type ReadFile = (path: string, encoding: 'utf8') => string;
5
+
6
+ export type WorkerResourceMetrics = {
7
+ cpuUtilizationRatio: number;
8
+ cpuLimitCores: number;
9
+ memoryUsageBytes: number;
10
+ memoryLimitBytes: number;
11
+ memoryUtilizationRatio: number;
12
+ filesystemUsageBytes: number;
13
+ filesystemAvailableBytes: number;
14
+ filesystemTotalBytes: number;
15
+ filesystemUtilizationRatio: number;
16
+ };
17
+
18
+ /** A zero-sized filesystem report means the probe itself is unavailable; a
19
+ * nonzero filesystem with zero free bytes is the most urgent pressure state. */
20
+ export function hasFilesystemPressure(
21
+ metrics: Pick<
22
+ WorkerResourceMetrics,
23
+ 'filesystemAvailableBytes' | 'filesystemTotalBytes'
24
+ >,
25
+ reserveBytes: number,
26
+ ): boolean {
27
+ return (
28
+ metrics.filesystemTotalBytes > 0 &&
29
+ metrics.filesystemAvailableBytes < reserveBytes
30
+ );
31
+ }
32
+
33
+ type FileSystemStats = {
34
+ bsize: number;
35
+ blocks: number;
36
+ bfree: number;
37
+ bavail: number;
38
+ };
39
+
40
+ /** Renders the small common CPU/RAM surface used by runtime processes. */
41
+ export function renderRuntimeProcessResourceMetrics(input: {
42
+ service: 'scheduler' | 'receipt_gateway' | 'execution_gateway' | 'scaler';
43
+ machine: string;
44
+ metrics: WorkerResourceMetrics;
45
+ }): string {
46
+ const labels = `service="${input.service}",machine="${input.machine}"`;
47
+ return [
48
+ '# HELP deepline_runtime_process_cpu_utilization_percent Container CPU utilization normalized to its CPU limit.',
49
+ '# TYPE deepline_runtime_process_cpu_utilization_percent gauge',
50
+ `deepline_runtime_process_cpu_utilization_percent{${labels}} ${input.metrics.cpuUtilizationRatio * 100}`,
51
+ '# HELP deepline_runtime_process_cpu_limit_cores Container CPU limit in cores.',
52
+ '# TYPE deepline_runtime_process_cpu_limit_cores gauge',
53
+ `deepline_runtime_process_cpu_limit_cores{${labels}} ${input.metrics.cpuLimitCores}`,
54
+ '# HELP deepline_runtime_process_memory_usage_bytes Container memory currently used.',
55
+ '# TYPE deepline_runtime_process_memory_usage_bytes gauge',
56
+ `deepline_runtime_process_memory_usage_bytes{${labels}} ${input.metrics.memoryUsageBytes}`,
57
+ '# HELP deepline_runtime_process_memory_limit_bytes Container memory limit.',
58
+ '# TYPE deepline_runtime_process_memory_limit_bytes gauge',
59
+ `deepline_runtime_process_memory_limit_bytes{${labels}} ${input.metrics.memoryLimitBytes}`,
60
+ '# HELP deepline_runtime_process_memory_utilization_percent Container memory utilization normalized to its memory limit.',
61
+ '# TYPE deepline_runtime_process_memory_utilization_percent gauge',
62
+ `deepline_runtime_process_memory_utilization_percent{${labels}} ${input.metrics.memoryUtilizationRatio * 100}`,
63
+ '# HELP deepline_runtime_process_filesystem_usage_bytes Local /tmp filesystem space used.',
64
+ '# TYPE deepline_runtime_process_filesystem_usage_bytes gauge',
65
+ `deepline_runtime_process_filesystem_usage_bytes{${labels}} ${input.metrics.filesystemUsageBytes}`,
66
+ '# HELP deepline_runtime_process_filesystem_available_bytes Local /tmp filesystem space available.',
67
+ '# TYPE deepline_runtime_process_filesystem_available_bytes gauge',
68
+ `deepline_runtime_process_filesystem_available_bytes{${labels}} ${input.metrics.filesystemAvailableBytes}`,
69
+ '# HELP deepline_runtime_process_filesystem_total_bytes Local /tmp filesystem total capacity.',
70
+ '# TYPE deepline_runtime_process_filesystem_total_bytes gauge',
71
+ `deepline_runtime_process_filesystem_total_bytes{${labels}} ${input.metrics.filesystemTotalBytes}`,
72
+ '# HELP deepline_runtime_process_filesystem_utilization_percent Local /tmp filesystem utilization normalized to its capacity.',
73
+ '# TYPE deepline_runtime_process_filesystem_utilization_percent gauge',
74
+ `deepline_runtime_process_filesystem_utilization_percent{${labels}} ${input.metrics.filesystemUtilizationRatio * 100}`,
75
+ ].join('\n');
76
+ }
77
+
78
+ type CpuSample = {
79
+ usageMicroseconds: number;
80
+ sampledAtMs: number;
81
+ };
82
+
83
+ function finiteNonNegative(value: number, fallback: number): number {
84
+ return Number.isFinite(value) && value >= 0 ? value : fallback;
85
+ }
86
+
87
+ export function parseCgroupCpuLimit(raw: string, fallback: number): number {
88
+ const [quota, period] = raw.trim().split(/\s+/, 2);
89
+ if (!quota || quota === 'max' || !period) return fallback;
90
+ const parsedQuota = Number(quota);
91
+ const parsedPeriod = Number(period);
92
+ if (
93
+ !Number.isFinite(parsedQuota) ||
94
+ !Number.isFinite(parsedPeriod) ||
95
+ parsedQuota <= 0 ||
96
+ parsedPeriod <= 0
97
+ ) {
98
+ return fallback;
99
+ }
100
+ return Math.max(parsedQuota / parsedPeriod, 0.01);
101
+ }
102
+
103
+ /** cgroup v1 reports aggregate CPU time in nanoseconds. */
104
+ export function parseCgroupV1CpuUsageMicroseconds(raw: string): number | null {
105
+ const nanoseconds = Number(raw.trim());
106
+ return Number.isFinite(nanoseconds) && nanoseconds >= 0
107
+ ? nanoseconds / 1_000
108
+ : null;
109
+ }
110
+
111
+ export function parseCgroupCpuUsageMicroseconds(raw: string): number | null {
112
+ const match = raw.match(/^usage_usec\s+(\d+)$/m);
113
+ if (!match) return null;
114
+ const usage = Number(match[1]);
115
+ return Number.isFinite(usage) && usage >= 0 ? usage : null;
116
+ }
117
+
118
+ export function parseCgroupLimit(raw: string, fallback: number): number {
119
+ const value = raw.trim();
120
+ if (!value || value === 'max') return fallback;
121
+ return finiteNonNegative(Number(value), fallback);
122
+ }
123
+
124
+ export function parseFileSystemStats(stats: FileSystemStats | null): {
125
+ usageBytes: number;
126
+ availableBytes: number;
127
+ totalBytes: number;
128
+ } {
129
+ if (!stats) {
130
+ return { usageBytes: 0, availableBytes: 0, totalBytes: 0 };
131
+ }
132
+ const blockSize = finiteNonNegative(stats.bsize, 0);
133
+ const blocks = finiteNonNegative(stats.blocks, 0);
134
+ const freeBlocks = Math.min(blocks, finiteNonNegative(stats.bfree, 0));
135
+ const availableBlocks = Math.min(blocks, finiteNonNegative(stats.bavail, 0));
136
+ const totalBytes = blocks * blockSize;
137
+ const availableBytes = availableBlocks * blockSize;
138
+ return {
139
+ // `bavail` excludes filesystem-reserved blocks. It is right for admission
140
+ // (what user work can still allocate), but treating the reservation as
141
+ // used makes a fresh Fly worker appear 5–6% full. `bfree` is the actual
142
+ // used-space denominator reported by df.
143
+ usageBytes: Math.max(0, (blocks - freeBlocks) * blockSize),
144
+ availableBytes,
145
+ totalBytes,
146
+ };
147
+ }
148
+
149
+ /**
150
+ * Produces container-scoped CPU and memory gauges for one Fly worker process.
151
+ * Fly's guest exposes cgroup v1 memory files and may expose cgroup v2 CPU
152
+ * files. Local development falls back to process RSS and host core count,
153
+ * preserving a useful metric endpoint without pretending local values are
154
+ * container quotas.
155
+ */
156
+ export function createWorkerResourceMetricsReader(input: {
157
+ readFile: ReadFile;
158
+ now?: () => number;
159
+ cpuCount?: () => number;
160
+ memoryUsage?: () => NodeJS.MemoryUsage;
161
+ statfs?: (path: string) => FileSystemStats;
162
+ }) {
163
+ const now = input.now ?? Date.now;
164
+ const cpuCount = input.cpuCount ?? (() => cpus().length || 1);
165
+ const memoryUsage = input.memoryUsage ?? process.memoryUsage;
166
+ const statfs = input.statfs ?? statfsSync;
167
+ let previousCpu: CpuSample | null = null;
168
+
169
+ const read = (path: string): string | null => {
170
+ try {
171
+ return input.readFile(path, 'utf8');
172
+ } catch {
173
+ return null;
174
+ }
175
+ };
176
+
177
+ return (): WorkerResourceMetrics => {
178
+ const fallbackCpuLimit = Math.max(cpuCount(), 1);
179
+ const cpuQuota = read('/sys/fs/cgroup/cpu/cpu.cfs_quota_us');
180
+ const cpuPeriod = read('/sys/fs/cgroup/cpu/cpu.cfs_period_us');
181
+ const cpuLimitCores = parseCgroupCpuLimit(
182
+ read('/sys/fs/cgroup/cpu.max') ??
183
+ (cpuQuota !== null && cpuPeriod !== null
184
+ ? `${cpuQuota} ${cpuPeriod}`
185
+ : 'max'),
186
+ fallbackCpuLimit,
187
+ );
188
+ const sampledAtMs = now();
189
+ const cpuUsageMicroseconds =
190
+ parseCgroupCpuUsageMicroseconds(read('/sys/fs/cgroup/cpu.stat') ?? '') ??
191
+ parseCgroupV1CpuUsageMicroseconds(
192
+ read('/sys/fs/cgroup/cpuacct/cpuacct.usage') ?? '',
193
+ );
194
+ const cpuUtilizationRatio =
195
+ cpuUsageMicroseconds === null || previousCpu === null
196
+ ? 0
197
+ : Math.max(
198
+ 0,
199
+ Math.min(
200
+ 1,
201
+ (cpuUsageMicroseconds - previousCpu.usageMicroseconds) /
202
+ ((sampledAtMs - previousCpu.sampledAtMs) *
203
+ 1_000 *
204
+ cpuLimitCores),
205
+ ),
206
+ );
207
+ if (cpuUsageMicroseconds !== null) {
208
+ previousCpu = { usageMicroseconds: cpuUsageMicroseconds, sampledAtMs };
209
+ }
210
+
211
+ const fallbackMemory = memoryUsage().rss;
212
+ const filesystem = (() => {
213
+ try {
214
+ return parseFileSystemStats(statfs('/tmp'));
215
+ } catch {
216
+ return parseFileSystemStats(null);
217
+ }
218
+ })();
219
+ const memoryUsageBytes = parseCgroupLimit(
220
+ read('/sys/fs/cgroup/memory.current') ??
221
+ read('/sys/fs/cgroup/memory/memory.usage_in_bytes') ??
222
+ '',
223
+ fallbackMemory,
224
+ );
225
+ const memoryLimitBytes = parseCgroupLimit(
226
+ read('/sys/fs/cgroup/memory.max') ??
227
+ read('/sys/fs/cgroup/memory/memory.limit_in_bytes') ??
228
+ '',
229
+ fallbackMemory,
230
+ );
231
+ return {
232
+ cpuUtilizationRatio,
233
+ cpuLimitCores,
234
+ memoryUsageBytes,
235
+ memoryLimitBytes,
236
+ memoryUtilizationRatio:
237
+ memoryLimitBytes > 0
238
+ ? Math.min(1, memoryUsageBytes / memoryLimitBytes)
239
+ : 0,
240
+ filesystemUsageBytes: filesystem.usageBytes,
241
+ filesystemAvailableBytes: filesystem.availableBytes,
242
+ filesystemTotalBytes: filesystem.totalBytes,
243
+ filesystemUtilizationRatio:
244
+ filesystem.totalBytes > 0
245
+ ? Math.min(1, filesystem.usageBytes / filesystem.totalBytes)
246
+ : 0,
247
+ };
248
+ };
249
+ }
@@ -40,6 +40,13 @@ export function releasableRuntimeSheetAttemptFenceSql(
40
40
  )`;
41
41
  }
42
42
 
43
+ /**
44
+ * Predicate for durable replay idempotency: matches rows that are already
45
+ * terminal (enriched or failed) from the same attempt owner + epoch. Used to
46
+ * suppress same-version conflicts when a worker restarts and re-runs map rows
47
+ * that it already completed. First terminal state wins; payload/error drift on
48
+ * replay is accepted as a no-op rather than rejected as a conflict.
49
+ */
43
50
  export function sameOwnerTerminalAttemptEpochSql(
44
51
  tableAlias: string,
45
52
  attemptOwnerRunIdExpression: string,
@@ -0,0 +1,296 @@
1
+ import type { PlayStaticSubstep } from '../plays/static-pipeline';
2
+ import {
3
+ normalizePlayDocflowNodeIoState,
4
+ type PlayDocflowNodeIoState,
5
+ } from './/docflow-node-io';
6
+ import type { PlayVisualNodeUsageSnapshot } from './/live-state-contract';
7
+
8
+ export type PlayStepMetricLike = {
9
+ pulse?: boolean;
10
+ tone?: string;
11
+ };
12
+
13
+ export type PlayVisualNodeStatus =
14
+ | 'idle'
15
+ | 'running'
16
+ | 'completed'
17
+ | 'failed'
18
+ | 'skipped';
19
+
20
+ export type PlayVisualNodeProgress = {
21
+ completed?: number;
22
+ total?: number;
23
+ failed?: number;
24
+ startedRows?: number;
25
+ activeRows?: number;
26
+ waitingRows?: number;
27
+ completedRows?: number;
28
+ message?: string;
29
+ updatedAt?: number | null;
30
+ startedAt?: number | null;
31
+ completedAt?: number | null;
32
+ artifactTableNamespace?: string | null;
33
+ nodeIo?: PlayDocflowNodeIoState;
34
+ };
35
+
36
+ export type PlayVisualNodeState = {
37
+ nodeId: string;
38
+ status: PlayVisualNodeStatus;
39
+ artifactTableNamespace?: string | null;
40
+ progress?: PlayVisualNodeProgress | null;
41
+ startedAt?: number | null;
42
+ completedAt?: number | null;
43
+ updatedAt?: number | null;
44
+ nodeIo?: PlayDocflowNodeIoState;
45
+ /** Observed provider usage for this node (ADR 0018). */
46
+ usage?: PlayVisualNodeUsageSnapshot;
47
+ };
48
+
49
+ export type PlayVisualNodeProgressMap = Record<string, PlayVisualNodeProgress>;
50
+
51
+ export function getStaticSubstepNodeId(
52
+ substep: PlayStaticSubstep,
53
+ index: number,
54
+ ): string {
55
+ switch (substep.type) {
56
+ case 'csv':
57
+ return `csv:${substep.field || index}`;
58
+ case 'dataset':
59
+ return `map:${substep.tableNamespace ?? substep.field}`;
60
+ case 'tool':
61
+ return `tool:${substep.field}:${substep.toolId}`;
62
+ case 'waterfall':
63
+ return `waterfall:${substep.id ?? substep.field}`;
64
+ case 'step_suite':
65
+ return `step_suite:${substep.field}`;
66
+ case 'control_flow':
67
+ return `control_flow:${substep.kind}:${substep.field}`;
68
+ case 'play_call':
69
+ return `play_call:${substep.field}:${substep.playId}`;
70
+ case 'play_launch':
71
+ return `play_launch:${substep.field}:${substep.playId}`;
72
+ case 'run_javascript':
73
+ return `run_javascript:${substep.alias}`;
74
+ case 'code':
75
+ return `code:${substep.field || index}`;
76
+ default:
77
+ return `node:${index}`;
78
+ }
79
+ }
80
+
81
+ function isRecord(value: unknown): value is Record<string, unknown> {
82
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
83
+ }
84
+
85
+ export function normalizePlayVisualNodeProgressMap(
86
+ value: unknown,
87
+ ): PlayVisualNodeProgressMap {
88
+ if (!isRecord(value)) {
89
+ return {};
90
+ }
91
+
92
+ const normalized: PlayVisualNodeProgressMap = {};
93
+ for (const [nodeId, rawProgress] of Object.entries(value)) {
94
+ if (!nodeId.trim() || !isRecord(rawProgress)) {
95
+ continue;
96
+ }
97
+ const completed =
98
+ typeof rawProgress.completed === 'number' &&
99
+ Number.isFinite(rawProgress.completed)
100
+ ? rawProgress.completed
101
+ : undefined;
102
+ const total =
103
+ typeof rawProgress.total === 'number' &&
104
+ Number.isFinite(rawProgress.total)
105
+ ? rawProgress.total
106
+ : undefined;
107
+ const failed =
108
+ typeof rawProgress.failed === 'number' &&
109
+ Number.isFinite(rawProgress.failed)
110
+ ? rawProgress.failed
111
+ : undefined;
112
+ const startedRows =
113
+ typeof rawProgress.startedRows === 'number' &&
114
+ Number.isFinite(rawProgress.startedRows)
115
+ ? rawProgress.startedRows
116
+ : undefined;
117
+ const activeRows =
118
+ typeof rawProgress.activeRows === 'number' &&
119
+ Number.isFinite(rawProgress.activeRows)
120
+ ? rawProgress.activeRows
121
+ : undefined;
122
+ const waitingRows =
123
+ typeof rawProgress.waitingRows === 'number' &&
124
+ Number.isFinite(rawProgress.waitingRows)
125
+ ? rawProgress.waitingRows
126
+ : undefined;
127
+ const completedRows =
128
+ typeof rawProgress.completedRows === 'number' &&
129
+ Number.isFinite(rawProgress.completedRows)
130
+ ? rawProgress.completedRows
131
+ : undefined;
132
+ const updatedAt =
133
+ typeof rawProgress.updatedAt === 'number' &&
134
+ Number.isFinite(rawProgress.updatedAt)
135
+ ? rawProgress.updatedAt
136
+ : undefined;
137
+ const startedAt =
138
+ typeof rawProgress.startedAt === 'number' &&
139
+ Number.isFinite(rawProgress.startedAt)
140
+ ? rawProgress.startedAt
141
+ : undefined;
142
+ const completedAt =
143
+ typeof rawProgress.completedAt === 'number' &&
144
+ Number.isFinite(rawProgress.completedAt)
145
+ ? rawProgress.completedAt
146
+ : undefined;
147
+ const message =
148
+ typeof rawProgress.message === 'string' && rawProgress.message.trim()
149
+ ? rawProgress.message.trim()
150
+ : undefined;
151
+ const artifactTableNamespace =
152
+ typeof rawProgress.artifactTableNamespace === 'string' &&
153
+ rawProgress.artifactTableNamespace.trim()
154
+ ? rawProgress.artifactTableNamespace.trim()
155
+ : rawProgress.artifactTableNamespace === null
156
+ ? null
157
+ : undefined;
158
+ const nodeIo = normalizePlayDocflowNodeIoState(rawProgress.nodeIo);
159
+
160
+ normalized[nodeId] = {
161
+ ...(completed !== undefined ? { completed } : {}),
162
+ ...(total !== undefined ? { total } : {}),
163
+ ...(failed !== undefined ? { failed } : {}),
164
+ ...(startedRows !== undefined ? { startedRows } : {}),
165
+ ...(activeRows !== undefined ? { activeRows } : {}),
166
+ ...(waitingRows !== undefined ? { waitingRows } : {}),
167
+ ...(completedRows !== undefined ? { completedRows } : {}),
168
+ ...(updatedAt !== undefined ? { updatedAt } : {}),
169
+ ...(startedAt !== undefined ? { startedAt } : {}),
170
+ ...(completedAt !== undefined ? { completedAt } : {}),
171
+ ...(message !== undefined ? { message } : {}),
172
+ ...(artifactTableNamespace !== undefined
173
+ ? { artifactTableNamespace }
174
+ : {}),
175
+ ...(nodeIo ? { nodeIo } : {}),
176
+ };
177
+ }
178
+ return normalized;
179
+ }
180
+
181
+ export function applyVisualNodeProgress(input: {
182
+ nodeStates: readonly PlayVisualNodeState[];
183
+ progressByNode: PlayVisualNodeProgressMap;
184
+ }): PlayVisualNodeState[] {
185
+ const activeProgressIndex = input.nodeStates.findIndex((nodeState) => {
186
+ const progress = input.progressByNode[nodeState.nodeId];
187
+ if (!progress) {
188
+ return false;
189
+ }
190
+ const completed = Number(progress.completed ?? 0);
191
+ const total = Number(progress.total ?? 0);
192
+ return (
193
+ Number.isFinite(total) &&
194
+ total > 0 &&
195
+ Number.isFinite(completed) &&
196
+ completed < total
197
+ );
198
+ });
199
+
200
+ return input.nodeStates.map((nodeState, index) => {
201
+ const progress = input.progressByNode[nodeState.nodeId] ?? null;
202
+ if (
203
+ !progress &&
204
+ activeProgressIndex >= 0 &&
205
+ index > activeProgressIndex &&
206
+ nodeState.status === 'running'
207
+ ) {
208
+ return {
209
+ ...nodeState,
210
+ status: 'idle',
211
+ };
212
+ }
213
+ if (!progress) {
214
+ return nodeState;
215
+ }
216
+ const completed = Number(progress.completed ?? 0);
217
+ const total = Number(progress.total ?? 0);
218
+ const progressStatus =
219
+ nodeState.status === 'failed'
220
+ ? 'failed'
221
+ : Number.isFinite(total) && total > 0
222
+ ? Number.isFinite(completed) && completed >= total
223
+ ? 'completed'
224
+ : 'running'
225
+ : progress.completedAt
226
+ ? 'completed'
227
+ : nodeState.status;
228
+ return {
229
+ ...nodeState,
230
+ status: progressStatus,
231
+ artifactTableNamespace:
232
+ nodeState.artifactTableNamespace ??
233
+ progress.artifactTableNamespace ??
234
+ null,
235
+ startedAt: nodeState.startedAt ?? progress.startedAt ?? null,
236
+ completedAt: nodeState.completedAt ?? progress.completedAt ?? null,
237
+ progress,
238
+ };
239
+ });
240
+ }
241
+
242
+ export function findActiveStepMetricIndex(
243
+ metrics: readonly (PlayStepMetricLike | null | undefined)[],
244
+ ): number | null {
245
+ const runningIndex = metrics.findIndex(
246
+ (metric) => metric?.pulse || metric?.tone === 'running',
247
+ );
248
+ if (runningIndex >= 0) {
249
+ return runningIndex;
250
+ }
251
+
252
+ const waitingIndex = metrics.findIndex(
253
+ (metric) => metric?.tone === 'waiting',
254
+ );
255
+ return waitingIndex >= 0 ? waitingIndex : null;
256
+ }
257
+
258
+ export function resolveSubstepSequenceStatus(input: {
259
+ substeps: readonly PlayStaticSubstep[];
260
+ substep: PlayStaticSubstep;
261
+ nodeStates?: readonly PlayVisualNodeState[];
262
+ liveStatus?: string;
263
+ }): string | undefined {
264
+ const nodeId = getStaticSubstepNodeId(
265
+ input.substep,
266
+ input.substeps.indexOf(input.substep),
267
+ );
268
+ const derivedStatus = input.nodeStates?.find(
269
+ (candidate) => candidate.nodeId === nodeId,
270
+ )?.status;
271
+ if (derivedStatus) {
272
+ if (derivedStatus === 'idle') {
273
+ return undefined;
274
+ }
275
+ return derivedStatus;
276
+ }
277
+
278
+ const normalizedLiveStatus = input.liveStatus?.toLowerCase();
279
+ if (!normalizedLiveStatus) {
280
+ return undefined;
281
+ }
282
+
283
+ if (
284
+ normalizedLiveStatus === 'completed' ||
285
+ normalizedLiveStatus === 'failed' ||
286
+ normalizedLiveStatus === 'cancelled' ||
287
+ normalizedLiveStatus === 'terminated'
288
+ ) {
289
+ return normalizedLiveStatus;
290
+ }
291
+
292
+ if (normalizedLiveStatus !== 'running') {
293
+ return normalizedLiveStatus;
294
+ }
295
+ return 'running';
296
+ }
@@ -35,7 +35,7 @@ export type NativeBatchToolCallInput = {
35
35
  */
36
36
  buildPhysicalCall(input: {
37
37
  members: NativeBatchOwnedToolCallMember[];
38
- }): ToolCallInput;
38
+ }): ToolCallInput | Promise<ToolCallInput>;
39
39
  /**
40
40
  * Decodes one aggregate provider result into exactly one result for every
41
41
  * owned receipt. The Module validates the correspondence before publishing
@@ -88,9 +88,9 @@ export function createNativeBatchToolCallJob(dependencies: {
88
88
  const executeOwned = async (): Promise<void> => {
89
89
  const owned = ownedMembers(cohort, input.members);
90
90
  if (owned.length === 0) return;
91
- const physical = input.buildPhysicalCall({ members: owned });
92
- validatePhysicalCall(physical, input.owner);
93
91
  try {
92
+ const physical = await input.buildPhysicalCall({ members: owned });
93
+ validatePhysicalCall(physical, input.owner);
94
94
  const aggregate = await dependencies.physicalToolCall.call(physical);
95
95
  const split = await input.splitResult({
96
96
  result: aggregate,
@@ -81,6 +81,15 @@ export type RuntimeStepToolResultReceiptsInput = {
81
81
  resultReceiptKey: string;
82
82
  source: ToolCallReceiptRecoverySource | 'owner';
83
83
  }) => ToolExecuteResult;
84
+ /**
85
+ * Best-effort observer after a canonical completed result converges. The
86
+ * adapter keeps receipt semantics; callers can use this to record a compact
87
+ * source-run replay pointer without another provider operation.
88
+ */
89
+ onStored?: (input: {
90
+ result: ToolExecuteResult;
91
+ resultReceiptKey: string;
92
+ }) => void | Promise<void>;
84
93
  /** Injectable only for deterministic adapter conformance tests. */
85
94
  sleep?: (milliseconds: number) => Promise<void>;
86
95
  };
@@ -433,6 +442,10 @@ export function createRuntimeStepToolResultReceipts(
433
442
  ? null
434
443
  : completedResult(persisted, record.resultReceiptKey);
435
444
  if (result) {
445
+ await input.onStored?.({
446
+ result,
447
+ resultReceiptKey: record.resultReceiptKey,
448
+ });
436
449
  return {
437
450
  // The legacy storage operation returns the converged completed row
438
451
  // for both an insert and a concurrent winner. The exact distinction
@@ -443,7 +456,13 @@ export function createRuntimeStepToolResultReceipts(
443
456
  };
444
457
  }
445
458
  const converged = await readCompleted(record.resultReceiptKey, 'owner');
446
- if (converged) return { kind: 'existing', result: converged };
459
+ if (converged) {
460
+ await input.onStored?.({
461
+ result: converged,
462
+ resultReceiptKey: record.resultReceiptKey,
463
+ });
464
+ return { kind: 'existing', result: converged };
465
+ }
447
466
  throw new Error(
448
467
  `Tool Result Receipt ${record.resultReceiptKey} could not publish a completed result.`,
449
468
  );