@rivetkit/engine 1.0.0 → 2.2.1-pr.4600.b74ff3b

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 (1038) hide show
  1. package/CLAUDE.md +38 -0
  2. package/artifacts/config-schema.json +1140 -0
  3. package/artifacts/errors/actor.kv_storage_quota_exceeded.json +5 -0
  4. package/artifacts/errors/actor.no_runner_config_configured.json +5 -0
  5. package/artifacts/errors/guard.actor_runner_failed.json +5 -0
  6. package/artifacts/errors/guard.invalid_request.json +5 -0
  7. package/artifacts/errors/guard.invalid_request_body.json +5 -0
  8. package/artifacts/errors/guard.invalid_response_body.json +5 -0
  9. package/artifacts/errors/guard.missing_query_parameter.json +5 -0
  10. package/artifacts/errors/guard.query_ambiguous_runner_configs.json +5 -0
  11. package/artifacts/errors/guard.query_duplicate_param.json +5 -0
  12. package/artifacts/errors/guard.query_empty_actor_name.json +5 -0
  13. package/artifacts/errors/guard.query_get_disallowed_params.json +5 -0
  14. package/artifacts/errors/guard.query_invalid_base64_input.json +5 -0
  15. package/artifacts/errors/guard.query_invalid_cbor_input.json +5 -0
  16. package/artifacts/errors/guard.query_invalid_params.json +5 -0
  17. package/artifacts/errors/guard.query_invalid_percent_encoding.json +5 -0
  18. package/artifacts/errors/guard.query_missing_runner_name.json +5 -0
  19. package/artifacts/errors/guard.query_no_runner_configs.json +5 -0
  20. package/artifacts/errors/guard.query_param_missing_equals.json +5 -0
  21. package/artifacts/errors/guard.query_path_token_syntax.json +5 -0
  22. package/artifacts/errors/guard.query_unknown_param.json +5 -0
  23. package/artifacts/errors/guard.request_body_too_large.json +5 -0
  24. package/artifacts/errors/guard.response_body_too_large.json +5 -0
  25. package/artifacts/errors/serverless_runner_pool.failed_to_fetch_metadata.json +5 -0
  26. package/artifacts/errors/serverless_runner_pool.not_found.json +5 -0
  27. package/artifacts/errors/{api.rate_limited.json → test.api_rate_limited.json} +2 -2
  28. package/artifacts/errors/{namespace.invalid_name.json → test.namespace_invalid_name.json} +2 -2
  29. package/artifacts/errors/ws.going_away.json +5 -0
  30. package/artifacts/openapi.json +458 -6
  31. package/docker/builder-base/linux-gnu.Dockerfile +21 -0
  32. package/docker/builder-base/linux-musl.Dockerfile +53 -0
  33. package/docker/builder-base/osxcross.Dockerfile +42 -0
  34. package/docker/builder-base/windows-mingw.Dockerfile +41 -0
  35. package/docker/builder-base/windows-msvc.Dockerfile +25 -0
  36. package/docker/dev/docker-compose.yml +43 -18
  37. package/docker/dev/grafana/dashboards/api.json +1077 -1239
  38. package/docker/dev/grafana/dashboards/cache.json +911 -1074
  39. package/docker/dev/grafana/dashboards/epoxy.json +1606 -0
  40. package/docker/dev/grafana/dashboards/futures.json +242 -229
  41. package/docker/dev/grafana/dashboards/gasoline.json +2663 -2476
  42. package/docker/dev/grafana/dashboards/guard.json +1433 -1273
  43. package/docker/dev/grafana/dashboards/operation.json +871 -0
  44. package/docker/dev/grafana/dashboards/pegboard.json +1274 -0
  45. package/docker/dev/grafana/dashboards/tokio.json +930 -1004
  46. package/docker/dev/grafana/dashboards/traces.json +35 -13
  47. package/docker/dev/grafana/provisioning/datasources/datasources.yaml +8 -0
  48. package/docker/{dev-multinode/otel-collector-server → dev/otel-collector}/config.yaml +18 -13
  49. package/docker/dev/prometheus/prometheus.yml +4 -0
  50. package/docker/dev/rivet-engine/config.jsonc +9 -16
  51. package/docker/dev-host/docker-compose.yml +38 -16
  52. package/docker/dev-host/grafana/dashboards/api.json +1077 -1239
  53. package/docker/dev-host/grafana/dashboards/cache.json +911 -1074
  54. package/docker/dev-host/grafana/dashboards/epoxy.json +1606 -0
  55. package/docker/dev-host/grafana/dashboards/futures.json +242 -229
  56. package/docker/dev-host/grafana/dashboards/gasoline.json +2663 -2476
  57. package/docker/dev-host/grafana/dashboards/guard.json +1433 -1273
  58. package/docker/dev-host/grafana/dashboards/operation.json +871 -0
  59. package/docker/dev-host/grafana/dashboards/pegboard.json +1274 -0
  60. package/docker/dev-host/grafana/dashboards/tokio.json +930 -1004
  61. package/docker/dev-host/grafana/dashboards/traces.json +35 -13
  62. package/docker/dev-host/grafana/provisioning/datasources/datasources.yaml +8 -0
  63. package/docker/dev-host/{otel-collector-server → otel-collector}/config.yaml +18 -13
  64. package/docker/dev-host/prometheus/prometheus.yml +4 -0
  65. package/docker/dev-host/rivet-engine/config.jsonc +9 -16
  66. package/docker/dev-multidc/core/grafana/dashboards/api.json +1077 -1239
  67. package/docker/dev-multidc/core/grafana/dashboards/cache.json +911 -1074
  68. package/docker/dev-multidc/core/grafana/dashboards/epoxy.json +1606 -0
  69. package/docker/dev-multidc/core/grafana/dashboards/futures.json +242 -229
  70. package/docker/dev-multidc/core/grafana/dashboards/gasoline.json +2663 -2476
  71. package/docker/dev-multidc/core/grafana/dashboards/guard.json +1433 -1273
  72. package/docker/dev-multidc/core/grafana/dashboards/operation.json +871 -0
  73. package/docker/dev-multidc/core/grafana/dashboards/pegboard.json +1274 -0
  74. package/docker/dev-multidc/core/grafana/dashboards/tokio.json +930 -1004
  75. package/docker/dev-multidc/core/grafana/dashboards/traces.json +35 -13
  76. package/docker/dev-multidc/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  77. package/docker/dev-multidc/core/prometheus/prometheus.yml +4 -0
  78. package/docker/dev-multidc/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +18 -13
  79. package/docker/dev-multidc/datacenters/dc-a/rivet-engine/config.jsonc +23 -22
  80. package/docker/{dev-multidc-multinode/datacenters/dc-b/otel-collector-server → dev-multidc/datacenters/dc-b/otel-collector}/config.yaml +18 -13
  81. package/docker/dev-multidc/datacenters/dc-b/rivet-engine/config.jsonc +23 -22
  82. package/docker/dev-multidc/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +18 -13
  83. package/docker/dev-multidc/datacenters/dc-c/rivet-engine/config.jsonc +23 -22
  84. package/docker/dev-multidc/docker-compose.yml +71 -64
  85. package/docker/dev-multidc-multinode/core/grafana/dashboards/api.json +1077 -1239
  86. package/docker/dev-multidc-multinode/core/grafana/dashboards/cache.json +911 -1074
  87. package/docker/dev-multidc-multinode/core/grafana/dashboards/epoxy.json +1606 -0
  88. package/docker/dev-multidc-multinode/core/grafana/dashboards/futures.json +242 -229
  89. package/docker/dev-multidc-multinode/core/grafana/dashboards/gasoline.json +2663 -2476
  90. package/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json +1433 -1273
  91. package/docker/dev-multidc-multinode/core/grafana/dashboards/operation.json +871 -0
  92. package/docker/dev-multidc-multinode/core/grafana/dashboards/pegboard.json +1274 -0
  93. package/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json +930 -1004
  94. package/docker/dev-multidc-multinode/core/grafana/dashboards/traces.json +35 -13
  95. package/docker/dev-multidc-multinode/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  96. package/docker/dev-multidc-multinode/core/prometheus/prometheus.yml +4 -0
  97. package/docker/dev-multidc-multinode/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +28 -13
  98. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/0/config.jsonc +23 -22
  99. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/1/config.jsonc +23 -22
  100. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/2/config.jsonc +23 -22
  101. package/docker/{dev-multidc/datacenters/dc-b/otel-collector-server → dev-multidc-multinode/datacenters/dc-b/otel-collector}/config.yaml +28 -13
  102. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/0/config.jsonc +23 -22
  103. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/1/config.jsonc +23 -22
  104. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/2/config.jsonc +23 -22
  105. package/docker/dev-multidc-multinode/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +28 -13
  106. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/0/config.jsonc +23 -22
  107. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/1/config.jsonc +23 -22
  108. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/2/config.jsonc +23 -22
  109. package/docker/dev-multidc-multinode/docker-compose.yml +113 -88
  110. package/docker/dev-multinode/docker-compose.yml +57 -26
  111. package/docker/dev-multinode/grafana/dashboards/api.json +1077 -1239
  112. package/docker/dev-multinode/grafana/dashboards/cache.json +911 -1074
  113. package/docker/dev-multinode/grafana/dashboards/epoxy.json +1606 -0
  114. package/docker/dev-multinode/grafana/dashboards/futures.json +242 -229
  115. package/docker/dev-multinode/grafana/dashboards/gasoline.json +2663 -2476
  116. package/docker/dev-multinode/grafana/dashboards/guard.json +1433 -1273
  117. package/docker/dev-multinode/grafana/dashboards/operation.json +871 -0
  118. package/docker/dev-multinode/grafana/dashboards/pegboard.json +1274 -0
  119. package/docker/dev-multinode/grafana/dashboards/tokio.json +930 -1004
  120. package/docker/dev-multinode/grafana/dashboards/traces.json +35 -13
  121. package/docker/dev-multinode/grafana/provisioning/datasources/datasources.yaml +8 -0
  122. package/docker/{dev/otel-collector-server → dev-multinode/otel-collector}/config.yaml +28 -13
  123. package/docker/dev-multinode/prometheus/prometheus.yml +4 -0
  124. package/docker/dev-multinode/rivet-engine/0/config.jsonc +9 -16
  125. package/docker/dev-multinode/rivet-engine/1/config.jsonc +9 -16
  126. package/docker/dev-multinode/rivet-engine/2/config.jsonc +9 -16
  127. package/docker/engine/linux-aarch64.Dockerfile +9 -49
  128. package/docker/engine/linux-x86_64.Dockerfile +7 -57
  129. package/docker/engine/macos-aarch64.Dockerfile +8 -54
  130. package/docker/engine/macos-x86_64.Dockerfile +9 -55
  131. package/docker/engine/windows.Dockerfile +5 -53
  132. package/docker/template/grafana-dashboards/api.json +1077 -1239
  133. package/docker/template/grafana-dashboards/cache.json +911 -1074
  134. package/docker/template/grafana-dashboards/epoxy.json +1606 -0
  135. package/docker/template/grafana-dashboards/futures.json +242 -229
  136. package/docker/template/grafana-dashboards/gasoline.json +2663 -2476
  137. package/docker/template/grafana-dashboards/guard.json +1433 -1273
  138. package/docker/template/grafana-dashboards/operation.json +871 -0
  139. package/docker/template/grafana-dashboards/pegboard.json +1274 -0
  140. package/docker/template/grafana-dashboards/tokio.json +930 -1004
  141. package/docker/template/grafana-dashboards/traces.json +35 -13
  142. package/docker/template/node_modules/.bin/js-yaml +4 -4
  143. package/docker/template/node_modules/.bin/tsc +4 -4
  144. package/docker/template/node_modules/.bin/tsserver +4 -4
  145. package/docker/template/node_modules/.bin/tsx +4 -4
  146. package/docker/template/src/docker-compose.ts +42 -29
  147. package/docker/template/src/main.ts +4 -4
  148. package/docker/template/src/services/core/grafana.ts +14 -1
  149. package/docker/template/src/services/core/prometheus.ts +20 -0
  150. package/docker/template/src/services/edge/{otel-collector-server.ts → otel-collector.ts} +55 -24
  151. package/docker/template/src/services/edge/rivet-engine.ts +4 -16
  152. package/docker/template/src/services/edge/runner.ts +2 -3
  153. package/docker/universal/Dockerfile +5 -3
  154. package/package.json +2 -5
  155. package/packages/api-builder/src/global_context.rs +1 -1
  156. package/packages/api-builder/src/metrics.rs +28 -24
  157. package/packages/api-builder/src/middleware.rs +30 -48
  158. package/packages/api-builder/src/router.rs +13 -1
  159. package/packages/api-peer/Cargo.toml +7 -9
  160. package/packages/api-peer/src/actors/delete.rs +56 -57
  161. package/packages/api-peer/src/actors/get_or_create.rs +139 -0
  162. package/packages/api-peer/src/actors/kv_get.rs +40 -28
  163. package/packages/api-peer/src/actors/list.rs +31 -14
  164. package/packages/api-peer/src/actors/list_names.rs +6 -6
  165. package/packages/api-peer/src/actors/mod.rs +3 -0
  166. package/packages/api-peer/src/actors/reschedule.rs +55 -0
  167. package/packages/api-peer/src/actors/sleep.rs +55 -0
  168. package/packages/api-peer/src/envoys.rs +57 -0
  169. package/packages/api-peer/src/internal.rs +441 -24
  170. package/packages/api-peer/src/lib.rs +2 -1
  171. package/packages/api-peer/src/namespaces.rs +24 -9
  172. package/packages/api-peer/src/router.rs +31 -7
  173. package/packages/api-peer/src/runner_configs.rs +66 -19
  174. package/packages/api-peer/src/runners.rs +30 -32
  175. package/packages/api-public/Cargo.toml +2 -0
  176. package/packages/api-public/src/actors/create.rs +8 -17
  177. package/packages/api-public/src/actors/delete.rs +11 -35
  178. package/packages/api-public/src/actors/get_or_create.rs +23 -95
  179. package/packages/api-public/src/actors/kv_get.rs +12 -29
  180. package/packages/api-public/src/actors/list.rs +56 -78
  181. package/packages/api-public/src/actors/list_names.rs +15 -14
  182. package/packages/api-public/src/actors/mod.rs +2 -0
  183. package/packages/api-public/src/actors/reschedule.rs +65 -0
  184. package/packages/api-public/src/actors/sleep.rs +64 -0
  185. package/packages/api-public/src/actors/utils.rs +12 -60
  186. package/packages/api-public/src/ctx.rs +14 -6
  187. package/packages/api-public/src/datacenters.rs +5 -5
  188. package/packages/api-public/src/envoys.rs +57 -0
  189. package/packages/api-public/src/errors.rs +0 -7
  190. package/packages/api-public/src/health.rs +51 -44
  191. package/packages/api-public/src/lib.rs +2 -1
  192. package/packages/api-public/src/metadata.rs +44 -14
  193. package/packages/api-public/src/namespaces.rs +11 -11
  194. package/packages/api-public/src/router.rs +22 -5
  195. package/packages/api-public/src/runner_configs/delete.rs +13 -10
  196. package/packages/api-public/src/runner_configs/list.rs +5 -2
  197. package/packages/api-public/src/runner_configs/refresh_metadata.rs +1 -1
  198. package/packages/api-public/src/runner_configs/serverless_health_check.rs +2 -2
  199. package/packages/api-public/src/runner_configs/upsert.rs +12 -9
  200. package/packages/api-public/src/runner_configs/utils.rs +35 -175
  201. package/packages/api-public/src/runners.rs +17 -45
  202. package/packages/{dump-openapi → api-public-openapi-gen}/Cargo.toml +1 -1
  203. package/packages/api-types/src/actors/create.rs +1 -0
  204. package/packages/api-types/src/actors/delete.rs +20 -0
  205. package/packages/api-types/src/actors/get_or_create.rs +30 -0
  206. package/packages/api-types/src/actors/kv_get.rs +25 -0
  207. package/packages/api-types/src/actors/list.rs +8 -1
  208. package/packages/api-types/src/actors/mod.rs +5 -0
  209. package/packages/api-types/src/actors/reschedule.rs +26 -0
  210. package/packages/api-types/src/actors/sleep.rs +26 -0
  211. package/packages/api-types/src/datacenters/list.rs +2 -2
  212. package/packages/api-types/src/envoys/list.rs +24 -0
  213. package/packages/api-types/src/envoys/mod.rs +1 -0
  214. package/packages/api-types/src/lib.rs +1 -0
  215. package/packages/api-types/src/namespaces/list.rs +4 -0
  216. package/packages/api-types/src/namespaces/runner_configs.rs +23 -2
  217. package/packages/api-types/src/runner_configs/list.rs +6 -1
  218. package/packages/api-types/src/runner_configs/mod.rs +12 -0
  219. package/packages/api-types/src/runners/list.rs +4 -0
  220. package/packages/api-types/src/runners/list_names.rs +21 -0
  221. package/packages/api-types/src/runners/mod.rs +1 -0
  222. package/packages/api-util/src/lib.rs +44 -21
  223. package/packages/bootstrap/Cargo.toml +7 -4
  224. package/packages/bootstrap/src/backfill.rs +53 -0
  225. package/packages/bootstrap/src/lib.rs +43 -7
  226. package/packages/cache/Cargo.toml +3 -1
  227. package/packages/cache/src/driver.rs +43 -151
  228. package/packages/cache/src/getter_ctx.rs +48 -70
  229. package/packages/cache/src/inner.rs +28 -18
  230. package/packages/cache/src/key.rs +17 -3
  231. package/packages/cache/src/lib.rs +0 -2
  232. package/packages/cache/src/metrics.rs +43 -31
  233. package/packages/cache/src/req_config.rs +219 -156
  234. package/packages/cache/tests/fetch.rs +91 -0
  235. package/packages/cache/tests/in_flight.rs +361 -0
  236. package/packages/cache/tests/ttl.rs +314 -0
  237. package/packages/cache-purge/src/lib.rs +1 -1
  238. package/packages/config/Cargo.toml +1 -0
  239. package/packages/config/src/config/cache.rs +10 -3
  240. package/packages/config/src/config/clickhouse.rs +0 -30
  241. package/packages/config/src/config/{db.rs → db/mod.rs} +3 -18
  242. package/packages/config/src/config/db/postgres.rs +59 -0
  243. package/packages/config/src/config/guard.rs +19 -0
  244. package/packages/config/src/config/metrics.rs +22 -0
  245. package/packages/config/src/config/mod.rs +44 -10
  246. package/packages/config/src/config/pegboard.rs +242 -16
  247. package/packages/config/src/config/pubsub.rs +11 -0
  248. package/packages/config/src/config/runtime.rs +58 -0
  249. package/packages/config/src/config/telemetry.rs +1 -0
  250. package/packages/config/src/config/topology.rs +78 -19
  251. package/packages/config/src/defaults.rs +3 -0
  252. package/packages/config/src/lib.rs +10 -1
  253. package/packages/config-schema-gen/Cargo.toml +11 -0
  254. package/packages/config-schema-gen/build.rs +26 -0
  255. package/packages/config-schema-gen/src/lib.rs +2 -0
  256. package/packages/engine/Cargo.toml +11 -2
  257. package/packages/engine/src/commands/db/mod.rs +0 -10
  258. package/packages/engine/src/commands/epoxy.rs +395 -0
  259. package/packages/engine/src/commands/mod.rs +1 -1
  260. package/packages/engine/src/commands/start.rs +43 -63
  261. package/packages/engine/src/commands/udb/cli.rs +148 -4
  262. package/packages/engine/src/commands/wf/mod.rs +83 -12
  263. package/packages/engine/src/commands/wf/signal.rs +38 -0
  264. package/packages/engine/src/lib.rs +6 -3
  265. package/packages/engine/src/main.rs +1 -1
  266. package/packages/engine/src/run_config.rs +6 -7
  267. package/packages/engine/src/util/db.rs +1 -25
  268. package/packages/engine/src/util/wf/mod.rs +39 -5
  269. package/packages/engine/tests/common/actors.rs +50 -332
  270. package/packages/engine/tests/common/api/mod.rs +7 -0
  271. package/packages/engine/tests/common/api/peer.rs +364 -0
  272. package/packages/engine/tests/common/api/public.rs +473 -0
  273. package/packages/engine/tests/common/ctx.rs +15 -3
  274. package/packages/engine/tests/common/mod.rs +8 -5
  275. package/packages/engine/tests/common/test_envoy.rs +87 -0
  276. package/packages/engine/tests/common/test_helpers.rs +218 -130
  277. package/packages/engine/tests/common/test_runner.rs +273 -0
  278. package/packages/engine/tests/envoy/actors_lifecycle.rs +1277 -0
  279. package/packages/engine/tests/envoy/mod.rs +1 -0
  280. package/packages/engine/tests/mod.rs +3 -0
  281. package/packages/engine/tests/runner/actors_alarm.rs +1453 -0
  282. package/packages/engine/tests/runner/actors_kv_crud.rs +996 -0
  283. package/packages/engine/tests/runner/actors_kv_delete_range.rs +126 -0
  284. package/packages/engine/tests/runner/actors_kv_drop.rs +255 -0
  285. package/packages/engine/tests/runner/actors_kv_list.rs +1061 -0
  286. package/packages/engine/tests/runner/actors_kv_misc.rs +882 -0
  287. package/packages/engine/tests/runner/actors_lifecycle.rs +1284 -0
  288. package/packages/engine/tests/runner/actors_scheduling_errors.rs +1005 -0
  289. package/packages/engine/tests/runner/api_actors_create.rs +422 -0
  290. package/packages/engine/tests/runner/api_actors_delete.rs +487 -0
  291. package/packages/engine/tests/runner/api_actors_get_or_create.rs +634 -0
  292. package/packages/engine/tests/runner/api_actors_list.rs +1771 -0
  293. package/packages/engine/tests/runner/api_actors_list_names.rs +691 -0
  294. package/packages/engine/tests/runner/api_namespaces_create.rs +428 -0
  295. package/packages/engine/tests/runner/api_namespaces_list.rs +760 -0
  296. package/packages/engine/tests/runner/api_runner_configs_list.rs +646 -0
  297. package/packages/engine/tests/runner/api_runner_configs_upsert.rs +651 -0
  298. package/packages/engine/tests/runner/api_runners_list.rs +166 -0
  299. package/packages/engine/tests/runner/api_runners_list_names.rs +386 -0
  300. package/packages/engine/tests/runner/mod.rs +20 -0
  301. package/packages/engine/tests/runner/runner_drain_on_version.rs +620 -0
  302. package/packages/env/Cargo.toml +0 -4
  303. package/packages/env/src/lib.rs +0 -18
  304. package/packages/epoxy/Cargo.toml +3 -2
  305. package/packages/epoxy/README.md +554 -93
  306. package/packages/epoxy/src/consts.rs +4 -36
  307. package/packages/epoxy/src/http_client.rs +59 -26
  308. package/packages/epoxy/src/http_routes.rs +73 -10
  309. package/packages/epoxy/src/keys/keys.rs +260 -11
  310. package/packages/epoxy/src/keys/mod.rs +11 -1
  311. package/packages/epoxy/src/keys/replica.rs +5 -260
  312. package/packages/epoxy/src/lib.rs +2 -1
  313. package/packages/epoxy/src/metrics.rs +118 -0
  314. package/packages/epoxy/src/ops/kv/get_local.rs +15 -24
  315. package/packages/epoxy/src/ops/kv/get_optimistic.rs +102 -64
  316. package/packages/epoxy/src/ops/kv/mod.rs +1 -0
  317. package/packages/epoxy/src/ops/kv/purge_local.rs +18 -9
  318. package/packages/epoxy/src/ops/kv/read_value.rs +92 -0
  319. package/packages/epoxy/src/ops/mod.rs +0 -1
  320. package/packages/epoxy/src/ops/propose.rs +1079 -194
  321. package/packages/epoxy/src/replica/ballot.rs +162 -102
  322. package/packages/epoxy/src/replica/changelog.rs +147 -0
  323. package/packages/epoxy/src/replica/commit_kv.rs +69 -66
  324. package/packages/epoxy/src/replica/message_request.rs +33 -48
  325. package/packages/epoxy/src/replica/messages/accept.rs +82 -41
  326. package/packages/epoxy/src/replica/messages/commit.rs +21 -33
  327. package/packages/epoxy/src/replica/messages/mod.rs +0 -8
  328. package/packages/epoxy/src/replica/messages/prepare.rs +68 -69
  329. package/packages/epoxy/src/replica/mod.rs +1 -6
  330. package/packages/epoxy/src/replica/update_config.rs +3 -1
  331. package/packages/epoxy/src/types.rs +30 -54
  332. package/packages/epoxy/src/utils.rs +149 -16
  333. package/packages/epoxy/src/workflows/backfill.rs +233 -0
  334. package/packages/epoxy/src/workflows/coordinator/mod.rs +33 -7
  335. package/packages/epoxy/src/workflows/coordinator/reconfigure.rs +44 -0
  336. package/packages/epoxy/src/workflows/coordinator/replica_status_change.rs +4 -3
  337. package/packages/epoxy/src/workflows/mod.rs +1 -1
  338. package/packages/epoxy/src/workflows/replica/mod.rs +4 -6
  339. package/packages/epoxy/src/workflows/replica/setup.rs +130 -771
  340. package/packages/epoxy/tests/backfill.rs +65 -0
  341. package/packages/epoxy/tests/backfill_snapshot.rs +233 -0
  342. package/packages/epoxy/tests/common/mod.rs +77 -21
  343. package/packages/epoxy/tests/common/utils.rs +366 -10
  344. package/packages/epoxy/tests/consensus_regressions.rs +285 -0
  345. package/packages/epoxy/tests/kv.rs +128 -167
  346. package/packages/epoxy/tests/kv_get_optimistic.rs +257 -157
  347. package/packages/epoxy/tests/migration.rs +75 -0
  348. package/packages/epoxy/tests/proposal.rs +133 -28
  349. package/packages/epoxy/tests/reconfigure.rs +92 -474
  350. package/packages/error/tests/basic.rs +8 -8
  351. package/packages/gasoline/Cargo.toml +1 -0
  352. package/packages/gasoline/src/builder/common/message.rs +19 -47
  353. package/packages/gasoline/src/builder/common/signal.rs +37 -21
  354. package/packages/gasoline/src/builder/common/workflow.rs +19 -15
  355. package/packages/gasoline/src/builder/workflow/lupe.rs +295 -0
  356. package/packages/gasoline/src/builder/workflow/message.rs +24 -47
  357. package/packages/gasoline/src/builder/workflow/mod.rs +1 -0
  358. package/packages/gasoline/src/builder/workflow/signal.rs +68 -22
  359. package/packages/gasoline/src/builder/workflow/sub_workflow.rs +6 -15
  360. package/packages/gasoline/src/ctx/activity.rs +46 -6
  361. package/packages/gasoline/src/ctx/common.rs +26 -23
  362. package/packages/gasoline/src/ctx/listen.rs +33 -50
  363. package/packages/gasoline/src/ctx/message.rs +76 -64
  364. package/packages/gasoline/src/ctx/operation.rs +15 -5
  365. package/packages/gasoline/src/ctx/standalone.rs +32 -4
  366. package/packages/gasoline/src/ctx/test.rs +31 -6
  367. package/packages/gasoline/src/ctx/versioned_workflow.rs +33 -7
  368. package/packages/gasoline/src/ctx/workflow.rs +194 -384
  369. package/packages/gasoline/src/db/debug.rs +49 -9
  370. package/packages/gasoline/src/db/kv/debug.rs +905 -15
  371. package/packages/gasoline/src/db/kv/keys/history.rs +434 -9
  372. package/packages/gasoline/src/db/kv/keys/metric.rs +70 -47
  373. package/packages/gasoline/src/db/kv/keys/signal.rs +19 -3
  374. package/packages/gasoline/src/db/kv/keys/workflow.rs +349 -3
  375. package/packages/gasoline/src/db/kv/mod.rs +975 -514
  376. package/packages/gasoline/src/db/kv/system.rs +155 -18
  377. package/packages/gasoline/src/db/mod.rs +29 -7
  378. package/packages/gasoline/src/error.rs +26 -21
  379. package/packages/gasoline/src/executable.rs +3 -1
  380. package/packages/gasoline/src/history/cursor.rs +436 -336
  381. package/packages/gasoline/src/history/event.rs +24 -15
  382. package/packages/gasoline/src/listen.rs +2 -14
  383. package/packages/gasoline/src/message.rs +1 -1
  384. package/packages/gasoline/src/metrics.rs +260 -143
  385. package/packages/gasoline/src/prelude.rs +1 -1
  386. package/packages/gasoline/src/registry.rs +6 -2
  387. package/packages/gasoline/src/signal.rs +34 -31
  388. package/packages/gasoline/src/utils/mod.rs +1 -18
  389. package/packages/gasoline/src/utils/topic.rs +35 -0
  390. package/packages/gasoline/src/worker.rs +71 -14
  391. package/packages/gasoline/src/workflow.rs +13 -0
  392. package/packages/gasoline/tests/workflows/eviction_test.rs +2 -2
  393. package/packages/gasoline-macros/src/lib.rs +74 -12
  394. package/packages/gasoline-runtime/Cargo.toml +18 -0
  395. package/packages/gasoline-runtime/src/lib.rs +12 -0
  396. package/packages/gasoline-runtime/src/workflows/mod.rs +1 -0
  397. package/packages/gasoline-runtime/src/workflows/pruner.rs +55 -0
  398. package/packages/guard/Cargo.toml +16 -8
  399. package/packages/guard/src/cache/mod.rs +63 -43
  400. package/packages/guard/src/cache/pegboard_gateway.rs +144 -0
  401. package/packages/guard/src/errors.rs +105 -0
  402. package/packages/guard/src/lib.rs +5 -15
  403. package/packages/guard/src/metrics.rs +12 -0
  404. package/packages/guard/src/routing/actor_path.rs +409 -0
  405. package/packages/guard/src/routing/api_public.rs +6 -14
  406. package/packages/guard/src/routing/envoy.rs +98 -0
  407. package/packages/guard/src/routing/mod.rs +152 -206
  408. package/packages/guard/src/routing/pegboard_gateway/mod.rs +572 -0
  409. package/packages/guard/src/routing/pegboard_gateway/resolve_actor_query.rs +236 -0
  410. package/packages/guard/src/routing/runner.rs +24 -54
  411. package/packages/guard/src/routing/ws_health.rs +61 -0
  412. package/packages/guard/src/shared_state.rs +11 -2
  413. package/packages/guard/tests/parse_actor_path.rs +418 -165
  414. package/packages/guard-core/Cargo.toml +3 -10
  415. package/packages/guard-core/src/custom_serve.rs +4 -10
  416. package/packages/guard-core/src/errors.rs +20 -4
  417. package/packages/guard-core/src/lib.rs +6 -4
  418. package/packages/guard-core/src/metrics.rs +66 -53
  419. package/packages/guard-core/src/proxy_service.rs +618 -1520
  420. package/packages/guard-core/src/request_context.rs +149 -169
  421. package/packages/guard-core/src/response_body.rs +65 -0
  422. package/packages/guard-core/src/route.rs +76 -0
  423. package/packages/guard-core/src/server.rs +60 -26
  424. package/packages/guard-core/src/task_group.rs +4 -0
  425. package/packages/guard-core/src/utils.rs +296 -0
  426. package/packages/guard-core/src/websocket_handle.rs +3 -3
  427. package/packages/guard-core/tests/common/mod.rs +0 -1
  428. package/packages/guard-core/tests/custom_serve.rs +4 -6
  429. package/packages/guard-core/tests/simple_websocket.rs +19 -19
  430. package/packages/guard-core/tests/streaming_response.rs +4 -9
  431. package/packages/metrics/Cargo.toml +3 -2
  432. package/packages/metrics/src/buckets.rs +5 -11
  433. package/packages/metrics/src/lib.rs +6 -3
  434. package/packages/metrics/src/providers.rs +2 -42
  435. package/packages/metrics/src/registry.rs +7 -0
  436. package/packages/metrics/src/server.rs +57 -0
  437. package/packages/namespace/Cargo.toml +0 -3
  438. package/packages/namespace/src/keys/metric.rs +301 -0
  439. package/packages/namespace/src/keys/mod.rs +1 -1
  440. package/packages/namespace/src/ops/get_global.rs +7 -4
  441. package/packages/namespace/src/ops/get_local.rs +32 -16
  442. package/packages/namespace/src/ops/mod.rs +0 -1
  443. package/packages/namespace/src/ops/resolve_for_name_global.rs +7 -4
  444. package/packages/namespace/src/ops/resolve_for_name_local.rs +39 -19
  445. package/packages/namespace/src/workflows/namespace.rs +3 -3
  446. package/packages/pegboard/Cargo.toml +22 -0
  447. package/packages/pegboard/src/actor_kv/entry.rs +47 -0
  448. package/packages/pegboard/src/actor_kv/metrics.rs +19 -0
  449. package/packages/pegboard/src/actor_kv/mod.rs +530 -0
  450. package/packages/pegboard/src/actor_kv/preload.rs +363 -0
  451. package/packages/{actor-kv/src → pegboard/src/actor_kv}/utils.rs +36 -35
  452. package/packages/pegboard/src/errors.rs +39 -5
  453. package/packages/pegboard/src/keys/actor.rs +285 -2
  454. package/packages/{actor-kv/src/entry.rs → pegboard/src/keys/actor_kv.rs} +73 -39
  455. package/packages/pegboard/src/keys/backfill.rs +49 -0
  456. package/packages/pegboard/src/keys/envoy.rs +1070 -0
  457. package/packages/pegboard/src/keys/epoxy/ns.rs +1 -1
  458. package/packages/pegboard/src/keys/mod.rs +4 -6
  459. package/packages/pegboard/src/keys/ns.rs +493 -14
  460. package/packages/pegboard/src/keys/runner.rs +281 -0
  461. package/packages/{namespace → pegboard}/src/keys/runner_config.rs +53 -0
  462. package/packages/pegboard/src/lib.rs +15 -2
  463. package/packages/pegboard/src/metrics.rs +57 -16
  464. package/packages/pegboard/src/ops/actor/create.rs +123 -53
  465. package/packages/pegboard/src/ops/actor/get.rs +14 -45
  466. package/packages/pegboard/src/ops/actor/get_for_gateway.rs +16 -0
  467. package/packages/pegboard/src/ops/actor/get_for_key.rs +3 -0
  468. package/packages/pegboard/src/ops/actor/get_for_kv.rs +43 -0
  469. package/packages/pegboard/src/ops/actor/get_for_runner.rs +99 -0
  470. package/packages/pegboard/src/ops/actor/get_reservation_for_key.rs +1 -0
  471. package/packages/pegboard/src/ops/actor/list_for_ns.rs +10 -38
  472. package/packages/pegboard/src/ops/actor/list_names.rs +3 -3
  473. package/packages/pegboard/src/ops/actor/mod.rs +3 -1
  474. package/packages/pegboard/src/ops/actor/util.rs +263 -0
  475. package/packages/pegboard/src/ops/envoy/drain.rs +101 -0
  476. package/packages/pegboard/src/ops/envoy/evict_actors.rs +54 -0
  477. package/packages/pegboard/src/ops/envoy/expire.rs +92 -0
  478. package/packages/pegboard/src/ops/envoy/get.rs +135 -0
  479. package/packages/pegboard/src/ops/envoy/list.rs +131 -0
  480. package/packages/pegboard/src/ops/envoy/mod.rs +6 -0
  481. package/packages/pegboard/src/ops/envoy/update_ping.rs +92 -0
  482. package/packages/pegboard/src/ops/mod.rs +3 -0
  483. package/packages/pegboard/src/ops/runner/drain.rs +110 -0
  484. package/packages/pegboard/src/ops/runner/list_names.rs +3 -3
  485. package/packages/pegboard/src/ops/runner/list_runner_config_enabled_dcs.rs +199 -0
  486. package/packages/pegboard/src/ops/runner/list_runner_config_epoxy_replica_ids.rs +51 -0
  487. package/packages/pegboard/src/ops/runner/mod.rs +3 -1
  488. package/packages/pegboard/src/ops/runner/update_alloc_idx.rs +17 -5
  489. package/packages/{namespace → pegboard}/src/ops/runner_config/delete.rs +18 -9
  490. package/packages/pegboard/src/ops/runner_config/ensure_normal_if_missing.rs +62 -0
  491. package/packages/{namespace → pegboard}/src/ops/runner_config/get.rs +15 -5
  492. package/packages/pegboard/src/ops/runner_config/get_error.rs +146 -0
  493. package/packages/{namespace → pegboard}/src/ops/runner_config/list.rs +13 -12
  494. package/packages/pegboard/src/ops/runner_config/mod.rs +7 -0
  495. package/packages/pegboard/src/ops/runner_config/refresh_metadata.rs +124 -0
  496. package/packages/pegboard/src/ops/runner_config/upsert.rs +206 -0
  497. package/packages/pegboard/src/ops/serverless_metadata/fetch.rs +223 -0
  498. package/packages/pegboard/src/ops/serverless_metadata/mod.rs +1 -0
  499. package/packages/pegboard/src/pubsub_subjects.rs +52 -0
  500. package/packages/pegboard/src/utils.rs +36 -2
  501. package/packages/pegboard/src/workflows/actor/destroy.rs +135 -99
  502. package/packages/pegboard/src/workflows/actor/keys.rs +59 -5
  503. package/packages/pegboard/src/workflows/actor/metrics.rs +345 -0
  504. package/packages/pegboard/src/workflows/actor/mod.rs +848 -204
  505. package/packages/pegboard/src/workflows/actor/runtime.rs +785 -212
  506. package/packages/pegboard/src/workflows/actor/setup.rs +61 -0
  507. package/packages/pegboard/src/workflows/actor2/keys.rs +337 -0
  508. package/packages/pegboard/src/workflows/actor2/metrics.rs +334 -0
  509. package/packages/pegboard/src/workflows/actor2/mod.rs +1251 -0
  510. package/packages/pegboard/src/workflows/actor2/runtime.rs +1005 -0
  511. package/packages/pegboard/src/workflows/actor_runner_name_selector_backfill.rs +266 -0
  512. package/packages/pegboard/src/workflows/metrics_aggregator.rs +282 -0
  513. package/packages/pegboard/src/workflows/mod.rs +8 -0
  514. package/packages/pegboard/src/workflows/runner.rs +62 -56
  515. package/packages/pegboard/src/workflows/runner2.rs +978 -0
  516. package/packages/pegboard/src/workflows/runner_pool.rs +298 -0
  517. package/packages/pegboard/src/workflows/runner_pool_error_tracker.rs +173 -0
  518. package/packages/pegboard/src/workflows/runner_pool_metadata_poller.rs +237 -0
  519. package/packages/pegboard/src/workflows/serverless/backfill.rs +120 -0
  520. package/packages/pegboard/src/workflows/serverless/conn.rs +702 -0
  521. package/packages/pegboard/src/workflows/serverless/mod.rs +3 -0
  522. package/packages/pegboard/src/workflows/serverless/receiver.rs +87 -0
  523. package/packages/pegboard/tests/actor_v1_pre_migration.rs +77 -0
  524. package/packages/{actor-kv/tests/list_edge_cases.rs → pegboard/tests/kv_list_edge_cases.rs} +74 -59
  525. package/packages/{actor-kv → pegboard}/tests/kv_operations.rs +77 -48
  526. package/packages/pegboard-envoy/Cargo.toml +43 -0
  527. package/packages/pegboard-envoy/src/actor_event_demuxer.rs +165 -0
  528. package/packages/pegboard-envoy/src/conn.rs +417 -0
  529. package/packages/pegboard-envoy/src/errors.rs +38 -0
  530. package/packages/pegboard-envoy/src/lib.rs +250 -0
  531. package/packages/pegboard-envoy/src/metrics.rs +44 -0
  532. package/packages/pegboard-envoy/src/ping_task.rs +61 -0
  533. package/packages/pegboard-envoy/src/tunnel_to_ws_task.rs +183 -0
  534. package/packages/pegboard-envoy/src/utils.rs +68 -0
  535. package/packages/pegboard-envoy/src/ws_to_tunnel_task.rs +536 -0
  536. package/packages/pegboard-envoy/tests/support/ws_to_tunnel_task.rs +82 -0
  537. package/packages/pegboard-gateway/Cargo.toml +2 -0
  538. package/packages/pegboard-gateway/src/keepalive_task.rs +1 -1
  539. package/packages/pegboard-gateway/src/lib.rs +506 -128
  540. package/packages/pegboard-gateway/src/metrics.rs +7 -11
  541. package/packages/pegboard-gateway/src/metrics_task.rs +80 -0
  542. package/packages/pegboard-gateway/src/ping_task.rs +9 -2
  543. package/packages/pegboard-gateway/src/shared_state.rs +110 -74
  544. package/packages/pegboard-gateway/src/tunnel_to_ws_task.rs +21 -7
  545. package/packages/pegboard-gateway/src/ws_to_tunnel_task.rs +12 -6
  546. package/packages/pegboard-gateway2/Cargo.toml +37 -0
  547. package/packages/pegboard-gateway2/src/keepalive_task.rs +61 -0
  548. package/packages/pegboard-gateway2/src/lib.rs +1044 -0
  549. package/packages/pegboard-gateway2/src/metrics.rs +10 -0
  550. package/packages/pegboard-gateway2/src/metrics_task.rs +80 -0
  551. package/packages/pegboard-gateway2/src/ping_task.rs +30 -0
  552. package/packages/pegboard-gateway2/src/shared_state.rs +601 -0
  553. package/packages/pegboard-gateway2/src/tunnel_to_ws_task.rs +99 -0
  554. package/packages/pegboard-gateway2/src/ws_to_tunnel_task.rs +71 -0
  555. package/packages/{pegboard-serverless → pegboard-outbound}/Cargo.toml +9 -9
  556. package/packages/pegboard-outbound/src/lib.rs +487 -0
  557. package/packages/pegboard-outbound/src/metrics.rs +17 -0
  558. package/packages/pegboard-runner/Cargo.toml +11 -5
  559. package/packages/pegboard-runner/src/actor_event_demuxer.rs +163 -0
  560. package/packages/pegboard-runner/src/conn.rs +358 -122
  561. package/packages/pegboard-runner/src/errors.rs +5 -0
  562. package/packages/pegboard-runner/src/lib.rs +62 -36
  563. package/packages/pegboard-runner/src/metrics.rs +44 -0
  564. package/packages/pegboard-runner/src/ping_task.rs +60 -13
  565. package/packages/pegboard-runner/src/tunnel_to_ws_task.rs +249 -110
  566. package/packages/pegboard-runner/src/ws_to_tunnel_task.rs +738 -113
  567. package/packages/pegboard-runner/tests/support/ws_to_tunnel_task.rs +150 -0
  568. package/packages/pools/Cargo.toml +1 -2
  569. package/packages/pools/src/db/clickhouse.rs +7 -6
  570. package/packages/pools/src/db/udb.rs +16 -3
  571. package/packages/pools/src/db/ups.rs +27 -5
  572. package/packages/pools/src/error.rs +0 -3
  573. package/packages/pools/src/lib.rs +0 -2
  574. package/packages/pools/src/metrics.rs +33 -28
  575. package/packages/pools/src/pools.rs +15 -39
  576. package/packages/pools/src/prelude.rs +1 -1
  577. package/packages/postgres-util/Cargo.toml +13 -0
  578. package/packages/postgres-util/src/lib.rs +84 -0
  579. package/packages/runner-protocol/build.rs +157 -0
  580. package/packages/runner-protocol/src/lib.rs +16 -0
  581. package/packages/runner-protocol/src/util.rs +14 -0
  582. package/packages/runner-protocol/src/versioned.rs +4345 -0
  583. package/packages/runtime/src/lib.rs +46 -46
  584. package/packages/runtime/src/metrics.rs +39 -30
  585. package/packages/runtime/src/term_signal.rs +25 -12
  586. package/packages/runtime/src/traces.rs +5 -8
  587. package/packages/service-manager/src/lib.rs +66 -15
  588. package/packages/test-deps/src/datacenter.rs +22 -8
  589. package/packages/test-deps/src/lib.rs +47 -25
  590. package/packages/test-deps-docker/src/database.rs +45 -36
  591. package/packages/test-snapshot-gen/Cargo.toml +39 -0
  592. package/packages/test-snapshot-gen/snapshots/.gitkeep +0 -0
  593. package/packages/test-snapshot-gen/snapshots/epoxy-v1/metadata.json +3 -0
  594. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000008.log +0 -0
  595. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000009.sst +3 -0
  596. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/CURRENT +3 -0
  597. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/MANIFEST-000005 +3 -0
  598. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/OPTIONS-000007 +3 -0
  599. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000008.log +0 -0
  600. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000009.sst +3 -0
  601. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/CURRENT +3 -0
  602. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/MANIFEST-000005 +3 -0
  603. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/OPTIONS-000007 +3 -0
  604. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/metadata.json +3 -0
  605. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000008.log +0 -0
  606. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000009.sst +3 -0
  607. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/CURRENT +3 -0
  608. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/MANIFEST-000005 +3 -0
  609. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/OPTIONS-000007 +3 -0
  610. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000008.log +0 -0
  611. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000009.sst +3 -0
  612. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/CURRENT +3 -0
  613. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/MANIFEST-000005 +3 -0
  614. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/OPTIONS-000007 +3 -0
  615. package/packages/test-snapshot-gen/src/lib.rs +328 -0
  616. package/packages/test-snapshot-gen/src/main.rs +145 -0
  617. package/packages/test-snapshot-gen/src/scenarios/epoxy_keys.rs +60 -0
  618. package/packages/test-snapshot-gen/src/scenarios/mod.rs +27 -0
  619. package/packages/test-snapshot-gen/src/scenarios/pb_actor_v1_pre_migration.rs +56 -0
  620. package/packages/test-snapshot-gen/src/test_cluster.rs +234 -0
  621. package/packages/tracing-reconfigure/src/lib.rs +1 -1
  622. package/packages/tracing-utils/src/lib.rs +12 -20
  623. package/packages/types/src/actor/error.rs +59 -0
  624. package/packages/types/src/actor/mod.rs +2 -0
  625. package/packages/types/src/actors.rs +5 -0
  626. package/packages/types/src/envoys.rs +21 -0
  627. package/packages/types/src/keys/backfill.rs +5 -0
  628. package/packages/types/src/keys/mod.rs +1 -0
  629. package/packages/types/src/lib.rs +2 -1
  630. package/packages/types/src/runner_configs.rs +43 -14
  631. package/packages/universaldb/Cargo.toml +4 -0
  632. package/packages/universaldb/src/database.rs +50 -5
  633. package/packages/universaldb/src/driver/mod.rs +12 -2
  634. package/packages/universaldb/src/driver/postgres/database.rs +88 -27
  635. package/packages/universaldb/src/driver/postgres/mod.rs +1 -1
  636. package/packages/universaldb/src/driver/postgres/transaction.rs +4 -7
  637. package/packages/universaldb/src/driver/postgres/transaction_task.rs +30 -52
  638. package/packages/universaldb/src/driver/rocksdb/database.rs +13 -7
  639. package/packages/universaldb/src/driver/rocksdb/transaction_conflict_tracker.rs +5 -5
  640. package/packages/universaldb/src/driver/rocksdb/transaction_task.rs +2 -1
  641. package/packages/universaldb/src/metrics.rs +39 -23
  642. package/packages/universaldb/src/prelude.rs +1 -1
  643. package/packages/universaldb/src/transaction.rs +9 -2
  644. package/packages/universaldb/src/utils/cherry_pick.rs +46 -46
  645. package/packages/universaldb/src/utils/keys.rs +21 -2
  646. package/packages/universaldb/src/utils/mod.rs +8 -0
  647. package/packages/universaldb/src/utils/subspace.rs +9 -4
  648. package/packages/universaldb/tests/integration.rs +5 -3
  649. package/packages/universaldb/tests/integration_gas.rs +5 -3
  650. package/packages/universaldb/tests/rocksdb.rs +152 -19
  651. package/packages/universalpubsub/Cargo.toml +8 -2
  652. package/packages/universalpubsub/benches/simple.rs +28 -8
  653. package/packages/universalpubsub/src/chunking.rs +27 -5
  654. package/packages/universalpubsub/src/driver/memory/mod.rs +131 -20
  655. package/packages/universalpubsub/src/driver/mod.rs +5 -0
  656. package/packages/universalpubsub/src/driver/nats/mod.rs +8 -0
  657. package/packages/universalpubsub/src/driver/postgres/mod.rs +505 -96
  658. package/packages/universalpubsub/src/lib.rs +3 -0
  659. package/packages/universalpubsub/src/metrics.rs +60 -0
  660. package/packages/universalpubsub/src/pubsub.rs +227 -87
  661. package/packages/universalpubsub/src/subject.rs +32 -0
  662. package/packages/universalpubsub/tests/chunking.rs +298 -0
  663. package/packages/universalpubsub/tests/integration.rs +148 -7
  664. package/packages/universalpubsub/tests/reconnect.rs +8 -6
  665. package/packages/util/Cargo.toml +1 -3
  666. package/packages/util/build.rs +6 -0
  667. package/packages/util/src/lib.rs +7 -2
  668. package/packages/util/src/metric.rs +1 -0
  669. package/packages/util/src/serde.rs +1 -516
  670. package/packages/{internal → util-serde}/Cargo.toml +4 -5
  671. package/packages/util-serde/src/lib.rs +517 -0
  672. package/packages/workflow-worker/Cargo.toml +4 -4
  673. package/packages/workflow-worker/src/lib.rs +3 -2
  674. package/sdks/go/api-full/client/client.go +17 -4
  675. package/sdks/go/api-full/metadata/client.go +50 -0
  676. package/sdks/go/api-full/namespaces/client.go +3 -0
  677. package/sdks/go/api-full/namespaces.go +6 -4
  678. package/sdks/go/api-full/runners/client.go +3 -0
  679. package/sdks/go/api-full/runners.go +8 -6
  680. package/sdks/go/api-full/types.go +107 -23
  681. package/sdks/rust/api-full/rust/.openapi-generator/FILES +6 -0
  682. package/sdks/rust/api-full/rust/Cargo.toml +1 -1
  683. package/sdks/rust/api-full/rust/README.md +5 -2
  684. package/sdks/rust/api-full/rust/docs/Actor.md +1 -0
  685. package/sdks/rust/api-full/rust/docs/ActorsDeleteApi.md +1 -1
  686. package/sdks/rust/api-full/rust/docs/ActorsKvGetApi.md +2 -1
  687. package/sdks/rust/api-full/rust/docs/ActorsListApi.md +3 -2
  688. package/sdks/rust/api-full/rust/docs/MetadataApi.md +34 -0
  689. package/sdks/rust/api-full/rust/docs/MetadataGetResponse.md +18 -0
  690. package/sdks/rust/api-full/rust/docs/NamespacesApi.md +3 -2
  691. package/sdks/rust/api-full/rust/docs/RunnerConfig.md +1 -0
  692. package/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf1Serverless.md +1 -0
  693. package/sdks/rust/api-full/rust/docs/RunnerConfigResponse.md +15 -0
  694. package/sdks/rust/api-full/rust/docs/RunnerConfigsListApi.md +3 -2
  695. package/sdks/rust/api-full/rust/docs/RunnerConfigsListResponseRunnerConfigsValue.md +1 -1
  696. package/sdks/rust/api-full/rust/docs/RunnersApi.md +3 -2
  697. package/sdks/rust/api-full/rust/src/apis/actors_create_api.rs +1 -1
  698. package/sdks/rust/api-full/rust/src/apis/actors_delete_api.rs +3 -5
  699. package/sdks/rust/api-full/rust/src/apis/actors_get_or_create_api.rs +1 -1
  700. package/sdks/rust/api-full/rust/src/apis/actors_kv_get_api.rs +4 -2
  701. package/sdks/rust/api-full/rust/src/apis/actors_list_api.rs +9 -2
  702. package/sdks/rust/api-full/rust/src/apis/actors_list_names_api.rs +1 -1
  703. package/sdks/rust/api-full/rust/src/apis/configuration.rs +2 -2
  704. package/sdks/rust/api-full/rust/src/apis/datacenters_api.rs +1 -1
  705. package/sdks/rust/api-full/rust/src/apis/health_api.rs +1 -1
  706. package/sdks/rust/api-full/rust/src/apis/metadata_api.rs +62 -0
  707. package/sdks/rust/api-full/rust/src/apis/mod.rs +1 -0
  708. package/sdks/rust/api-full/rust/src/apis/namespaces_api.rs +9 -2
  709. package/sdks/rust/api-full/rust/src/apis/runner_configs_delete_api.rs +1 -1
  710. package/sdks/rust/api-full/rust/src/apis/runner_configs_list_api.rs +9 -2
  711. package/sdks/rust/api-full/rust/src/apis/runner_configs_refresh_metadata_api.rs +1 -1
  712. package/sdks/rust/api-full/rust/src/apis/runner_configs_serverless_health_check_api.rs +1 -1
  713. package/sdks/rust/api-full/rust/src/apis/runner_configs_upsert_api.rs +1 -1
  714. package/sdks/rust/api-full/rust/src/apis/runners_api.rs +9 -2
  715. package/sdks/rust/api-full/rust/src/models/actor.rs +5 -1
  716. package/sdks/rust/api-full/rust/src/models/actor_name.rs +1 -1
  717. package/sdks/rust/api-full/rust/src/models/actors_create_request.rs +1 -1
  718. package/sdks/rust/api-full/rust/src/models/actors_create_response.rs +1 -1
  719. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_request.rs +1 -1
  720. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_response.rs +1 -1
  721. package/sdks/rust/api-full/rust/src/models/actors_kv_get_response.rs +1 -1
  722. package/sdks/rust/api-full/rust/src/models/actors_list_names_response.rs +1 -1
  723. package/sdks/rust/api-full/rust/src/models/actors_list_response.rs +1 -1
  724. package/sdks/rust/api-full/rust/src/models/crash_policy.rs +1 -1
  725. package/sdks/rust/api-full/rust/src/models/datacenter.rs +1 -1
  726. package/sdks/rust/api-full/rust/src/models/datacenter_health.rs +1 -1
  727. package/sdks/rust/api-full/rust/src/models/datacenters_list_response.rs +1 -1
  728. package/sdks/rust/api-full/rust/src/models/health_fanout_response.rs +1 -1
  729. package/sdks/rust/api-full/rust/src/models/health_response.rs +1 -1
  730. package/sdks/rust/api-full/rust/src/models/health_status.rs +1 -1
  731. package/sdks/rust/api-full/rust/src/models/metadata_get_response.rs +48 -0
  732. package/sdks/rust/api-full/rust/src/models/mod.rs +4 -0
  733. package/sdks/rust/api-full/rust/src/models/namespace.rs +1 -1
  734. package/sdks/rust/api-full/rust/src/models/namespace_list_response.rs +1 -1
  735. package/sdks/rust/api-full/rust/src/models/namespaces_create_request.rs +1 -1
  736. package/sdks/rust/api-full/rust/src/models/namespaces_create_response.rs +1 -1
  737. package/sdks/rust/api-full/rust/src/models/pagination.rs +1 -1
  738. package/sdks/rust/api-full/rust/src/models/runner.rs +1 -1
  739. package/sdks/rust/api-full/rust/src/models/runner_config.rs +4 -1
  740. package/sdks/rust/api-full/rust/src/models/runner_config_kind.rs +1 -1
  741. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of.rs +1 -1
  742. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1.rs +1 -1
  743. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1_serverless.rs +5 -1
  744. package/sdks/rust/api-full/rust/src/models/runner_config_response.rs +39 -0
  745. package/sdks/rust/api-full/rust/src/models/runner_config_variant.rs +1 -1
  746. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response.rs +1 -1
  747. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response_runner_configs_value.rs +3 -3
  748. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_request.rs +1 -1
  749. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response.rs +1 -1
  750. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of.rs +1 -1
  751. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1.rs +1 -1
  752. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1_failure.rs +1 -1
  753. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_success.rs +1 -1
  754. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error.rs +1 -1
  755. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of.rs +1 -1
  756. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_1.rs +1 -1
  757. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_2.rs +1 -1
  758. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3.rs +1 -1
  759. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3_non_success_status.rs +1 -1
  760. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4.rs +1 -1
  761. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4_invalid_response_json.rs +1 -1
  762. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5.rs +1 -1
  763. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5_invalid_response_schema.rs +1 -1
  764. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_request_body.rs +1 -1
  765. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_response.rs +1 -1
  766. package/sdks/rust/api-full/rust/src/models/runners_list_names_response.rs +1 -1
  767. package/sdks/rust/api-full/rust/src/models/runners_list_response.rs +1 -1
  768. package/sdks/rust/api-full/src/apis/actors_api.rs +8 -4
  769. package/sdks/rust/api-full/src/apis/ns_api.rs +8 -4
  770. package/sdks/rust/data/src/converted.rs +7 -4
  771. package/sdks/rust/data/src/lib.rs +2 -2
  772. package/sdks/rust/data/src/versioned/mod.rs +47 -4
  773. package/sdks/rust/data/src/versioned/namespace_runner_config.rs +256 -6
  774. package/sdks/rust/envoy-client/Cargo.toml +25 -0
  775. package/sdks/rust/envoy-client/src/actor.rs +992 -0
  776. package/sdks/rust/envoy-client/src/commands.rs +88 -0
  777. package/sdks/rust/envoy-client/src/config.rs +159 -0
  778. package/sdks/rust/envoy-client/src/connection.rs +288 -0
  779. package/sdks/rust/envoy-client/src/context.rs +24 -0
  780. package/sdks/rust/envoy-client/src/envoy.rs +432 -0
  781. package/sdks/rust/envoy-client/src/events.rs +62 -0
  782. package/sdks/rust/envoy-client/src/handle.rs +355 -0
  783. package/sdks/rust/envoy-client/src/kv.rs +132 -0
  784. package/sdks/rust/envoy-client/src/latency_channel.rs +27 -0
  785. package/sdks/rust/envoy-client/src/lib.rs +15 -0
  786. package/sdks/rust/envoy-client/src/stringify.rs +322 -0
  787. package/sdks/rust/envoy-client/src/tunnel.rs +265 -0
  788. package/sdks/rust/envoy-client/src/utils.rs +172 -0
  789. package/sdks/rust/envoy-protocol/Cargo.toml +22 -0
  790. package/sdks/rust/envoy-protocol/build.rs +200 -0
  791. package/sdks/rust/envoy-protocol/src/generated.rs +1 -0
  792. package/sdks/rust/envoy-protocol/src/lib.rs +8 -0
  793. package/sdks/rust/envoy-protocol/src/versioned.rs +208 -0
  794. package/sdks/rust/epoxy-protocol/Cargo.toml +0 -2
  795. package/sdks/rust/epoxy-protocol/build.rs +7 -0
  796. package/sdks/rust/epoxy-protocol/src/lib.rs +2 -5
  797. package/sdks/rust/epoxy-protocol/src/protocol.rs +128 -0
  798. package/sdks/rust/test-envoy/Cargo.toml +23 -0
  799. package/sdks/rust/test-envoy/Dockerfile +22 -0
  800. package/sdks/rust/test-envoy/src/behaviors.rs +141 -0
  801. package/sdks/rust/test-envoy/src/lib.rs +11 -0
  802. package/sdks/rust/test-envoy/src/main.rs +4 -0
  803. package/sdks/rust/test-envoy/src/server.rs +269 -0
  804. package/sdks/schemas/README.md +1 -2
  805. package/sdks/schemas/data/namespace.runner_config.v3.bare +24 -0
  806. package/sdks/schemas/data/namespace.runner_config.v4.bare +25 -0
  807. package/sdks/schemas/data/namespace.runner_config.v5.bare +26 -0
  808. package/sdks/schemas/data/pegboard.namespace.runner_alloc_idx.v2.bare +8 -0
  809. package/sdks/schemas/envoy-protocol/v1.bare +459 -0
  810. package/sdks/schemas/epoxy-protocol/v2.bare +220 -0
  811. package/sdks/schemas/runner-protocol/v4.bare +438 -0
  812. package/sdks/schemas/runner-protocol/v5.bare +430 -0
  813. package/sdks/schemas/runner-protocol/v6.bare +432 -0
  814. package/sdks/schemas/runner-protocol/v7.bare +438 -0
  815. package/sdks/typescript/api-full/.turbo/turbo-build.log +28 -27
  816. package/sdks/typescript/api-full/build.js +7 -1
  817. package/sdks/typescript/api-full/package.json +66 -57
  818. package/sdks/typescript/api-full/rivetkit-engine-api-full-25.5.3.tgz +0 -0
  819. package/sdks/typescript/api-full/src/Client.ts +41 -10
  820. package/sdks/typescript/api-full/src/api/client/requests/ActorsDeleteRequest.ts +4 -2
  821. package/sdks/typescript/api-full/src/api/client/requests/ActorsKvGetRequest.ts +13 -0
  822. package/sdks/typescript/api-full/src/api/client/requests/ActorsListRequest.ts +6 -0
  823. package/sdks/typescript/api-full/src/api/client/requests/RunnerConfigsListRequest.ts +4 -0
  824. package/sdks/typescript/api-full/src/api/client/requests/index.ts +1 -0
  825. package/sdks/typescript/api-full/src/api/resources/index.ts +1 -0
  826. package/sdks/typescript/api-full/src/api/resources/metadata/client/Client.ts +97 -0
  827. package/sdks/typescript/api-full/src/api/resources/metadata/client/index.ts +1 -0
  828. package/sdks/typescript/api-full/src/api/resources/metadata/index.ts +1 -0
  829. package/sdks/typescript/api-full/src/api/resources/namespaces/client/Client.ts +12 -2
  830. package/sdks/typescript/api-full/src/api/resources/namespaces/client/requests/NamespacesListRequest.ts +6 -0
  831. package/sdks/typescript/api-full/src/api/resources/runners/client/Client.ts +12 -2
  832. package/sdks/typescript/api-full/src/api/resources/runners/client/requests/RunnersListRequest.ts +6 -0
  833. package/sdks/typescript/api-full/src/api/types/Actor.ts +2 -0
  834. package/sdks/typescript/api-full/src/api/types/MetadataGetResponse.ts +14 -0
  835. package/sdks/typescript/api-full/src/api/types/RunnerConfig.ts +1 -0
  836. package/sdks/typescript/api-full/src/api/types/RunnerConfigKindServerlessServerless.ts +2 -0
  837. package/sdks/typescript/api-full/src/api/types/RunnerConfigResponse.ts +9 -0
  838. package/sdks/typescript/api-full/src/api/types/RunnerConfigServerless.ts +2 -0
  839. package/sdks/typescript/api-full/src/api/types/RunnerConfigsListResponseRunnerConfigsValue.ts +1 -1
  840. package/sdks/typescript/api-full/src/api/types/index.ts +2 -0
  841. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +6 -4
  842. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +4 -3
  843. package/sdks/typescript/api-full/src/serialization/types/Actor.ts +2 -0
  844. package/sdks/typescript/api-full/src/serialization/types/MetadataGetResponse.ts +34 -0
  845. package/sdks/typescript/api-full/src/serialization/types/RunnerConfig.ts +5 -0
  846. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigKindServerlessServerless.ts +2 -0
  847. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigResponse.ts +26 -0
  848. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigServerless.ts +2 -0
  849. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigsListResponseRunnerConfigsValue.ts +3 -3
  850. package/sdks/typescript/api-full/src/serialization/types/index.ts +2 -0
  851. package/sdks/typescript/api-full/turbo.json +9 -0
  852. package/sdks/typescript/envoy-protocol/.turbo/turbo-build.log +23 -0
  853. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.cjs +466 -281
  854. package/sdks/typescript/envoy-protocol/dist/index.cjs.map +1 -0
  855. package/sdks/typescript/envoy-protocol/dist/index.d.cts +699 -0
  856. package/sdks/typescript/envoy-protocol/dist/index.d.ts +699 -0
  857. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.js +530 -345
  858. package/sdks/typescript/envoy-protocol/dist/index.js.map +1 -0
  859. package/sdks/typescript/{runner-protocol → envoy-protocol}/node_modules/.bin/tsc +4 -4
  860. package/{tests/load → sdks/typescript/envoy-protocol}/node_modules/.bin/tsserver +4 -4
  861. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup +21 -0
  862. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup-node +21 -0
  863. package/sdks/typescript/envoy-protocol/package.json +36 -0
  864. package/sdks/typescript/envoy-protocol/src/index.ts +2331 -0
  865. package/sdks/typescript/envoy-protocol/tsconfig.json +9 -0
  866. package/sdks/typescript/envoy-protocol/tsup.config.ts +4 -0
  867. package/sdks/typescript/runner/package.json +8 -2
  868. package/sdks/typescript/runner/src/actor.ts +38 -0
  869. package/sdks/typescript/runner/src/mod.ts +435 -229
  870. package/sdks/typescript/runner/src/stringify.ts +36 -33
  871. package/sdks/typescript/runner/src/tunnel.ts +52 -56
  872. package/sdks/typescript/runner/src/utils.ts +19 -0
  873. package/sdks/typescript/runner/src/websocket-tunnel-adapter.ts +98 -435
  874. package/sdks/typescript/runner-protocol/package.json +11 -9
  875. package/sdks/typescript/runner-protocol/src/index.ts +224 -156
  876. package/sdks/typescript/runner-protocol/tsconfig.json +1 -9
  877. package/sdks/typescript/test-runner/.turbo/turbo-build.log +5 -5
  878. package/sdks/typescript/test-runner/dist/index.js +53 -44
  879. package/sdks/typescript/test-runner/dist/index.js.map +1 -1
  880. package/sdks/typescript/test-runner/node_modules/.bin/pino +2 -2
  881. package/sdks/typescript/test-runner/node_modules/.bin/tsc +4 -4
  882. package/sdks/typescript/test-runner/node_modules/.bin/tsserver +4 -4
  883. package/sdks/typescript/test-runner/node_modules/.bin/tsup +4 -4
  884. package/sdks/typescript/test-runner/node_modules/.bin/tsup-node +4 -4
  885. package/sdks/typescript/test-runner/node_modules/.bin/tsx +4 -4
  886. package/sdks/typescript/test-runner/node_modules/.bin/vitest +4 -4
  887. package/sdks/typescript/test-runner/package.json +3 -3
  888. package/sdks/typescript/test-runner/src/index.ts +65 -42
  889. package/sdks/typescript/test-runner/src/log.ts +4 -18
  890. package/artifacts/errors/actor.no_runners_available.json +0 -5
  891. package/artifacts/errors/guard.actor_destroyed.json +0 -5
  892. package/artifacts/errors/guard.actor_not_found.json +0 -5
  893. package/contrib-docs/ACTOR_KEY_RESERVATION.md +0 -101
  894. package/contrib-docs/API.md +0 -11
  895. package/contrib-docs/DOCKER.md +0 -5
  896. package/contrib-docs/ERRORS.md +0 -13
  897. package/contrib-docs/GUARD.md +0 -76
  898. package/contrib-docs/PEGBOARD_TUNNEL_RETRIES.md +0 -83
  899. package/contrib-docs/RUNNER_LIFECYCLE.md +0 -172
  900. package/contrib-docs/SDKS.md +0 -9
  901. package/contrib-docs/TEST_DEPENDENCIES.md +0 -43
  902. package/contrib-docs/design-choicse/EMBEDDED_KV.md +0 -80
  903. package/contrib-docs/operate/TRACING_RECONFIGURE.md +0 -78
  904. package/docker/dev/otel-collector-client/config.yaml +0 -39
  905. package/docker/dev-host/otel-collector-client/config.yaml +0 -39
  906. package/docker/dev-multidc/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  907. package/docker/dev-multidc/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  908. package/docker/dev-multidc/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  909. package/docker/dev-multidc-multinode/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  910. package/docker/dev-multidc-multinode/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  911. package/docker/dev-multidc-multinode/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  912. package/docker/dev-multinode/otel-collector-client/config.yaml +0 -39
  913. package/docker/template/src/services/edge/otel-collector-client.ts +0 -64
  914. package/packages/actor-kv/Cargo.toml +0 -31
  915. package/packages/actor-kv/src/key.rs +0 -81
  916. package/packages/actor-kv/src/lib.rs +0 -357
  917. package/packages/cache/src/rate_limit.rs +0 -109
  918. package/packages/cache/tests/integration.rs +0 -582
  919. package/packages/clickhouse-inserter/Cargo.toml +0 -17
  920. package/packages/clickhouse-inserter/src/error.rs +0 -16
  921. package/packages/clickhouse-inserter/src/lib.rs +0 -179
  922. package/packages/clickhouse-user-query/Cargo.toml +0 -16
  923. package/packages/clickhouse-user-query/examples/case_sensitivity_demo.rs +0 -100
  924. package/packages/clickhouse-user-query/examples/group_by_example.rs +0 -53
  925. package/packages/clickhouse-user-query/examples/string_contains_demo.rs +0 -96
  926. package/packages/clickhouse-user-query/src/builder.rs +0 -445
  927. package/packages/clickhouse-user-query/src/error.rs +0 -37
  928. package/packages/clickhouse-user-query/src/lib.rs +0 -61
  929. package/packages/clickhouse-user-query/src/query.rs +0 -143
  930. package/packages/clickhouse-user-query/src/schema.rs +0 -78
  931. package/packages/clickhouse-user-query/tests/builder_tests.rs +0 -619
  932. package/packages/clickhouse-user-query/tests/case_sensitivity_tests.rs +0 -307
  933. package/packages/clickhouse-user-query/tests/integration_tests.rs +0 -540
  934. package/packages/clickhouse-user-query/tests/query_tests.rs +0 -263
  935. package/packages/clickhouse-user-query/tests/schema_tests.rs +0 -44
  936. package/packages/config/src/config/vector.rs +0 -18
  937. package/packages/engine/src/commands/udb_keys.rs +0 -200
  938. package/packages/engine/tests/actors_create.rs +0 -524
  939. package/packages/engine/tests/actors_delete.rs +0 -243
  940. package/packages/engine/tests/actors_general.rs +0 -191
  941. package/packages/engine/tests/actors_get.rs +0 -230
  942. package/packages/engine/tests/actors_get_by_id.rs +0 -170
  943. package/packages/engine/tests/actors_get_or_create.rs +0 -294
  944. package/packages/engine/tests/actors_get_or_create_by_id.rs +0 -147
  945. package/packages/engine/tests/actors_lifecycle.rs +0 -165
  946. package/packages/engine/tests/actors_list.rs +0 -798
  947. package/packages/engine/tests/actors_list_names.rs +0 -353
  948. package/packages/engine/tests/common/ns.rs +0 -36
  949. package/packages/engine/tests/common/runner.rs +0 -134
  950. package/packages/engine/tests/runners_dupe_key.rs +0 -27
  951. package/packages/engine/tests/runners_version.rs +0 -50
  952. package/packages/env/build.rs +0 -8
  953. package/packages/epoxy/spec/KEYS.md +0 -33
  954. package/packages/epoxy/spec/PROPOSAL.md +0 -125
  955. package/packages/epoxy/spec/RECONFIGURE.md +0 -40
  956. package/packages/epoxy/src/ops/explicit_prepare.rs +0 -342
  957. package/packages/epoxy/src/replica/decide_path.rs +0 -51
  958. package/packages/epoxy/src/replica/lead_consensus.rs +0 -65
  959. package/packages/epoxy/src/replica/log.rs +0 -84
  960. package/packages/epoxy/src/replica/messages/accepted.rs +0 -35
  961. package/packages/epoxy/src/replica/messages/committed.rs +0 -41
  962. package/packages/epoxy/src/replica/messages/download_instances.rs +0 -69
  963. package/packages/epoxy/src/replica/messages/pre_accept.rs +0 -69
  964. package/packages/epoxy/src/replica/utils.rs +0 -111
  965. package/packages/epoxy/src/workflows/purger.rs +0 -81
  966. package/packages/guard/src/cache/actor.rs +0 -43
  967. package/packages/guard/src/middleware.rs +0 -42
  968. package/packages/guard/src/routing/pegboard_gateway.rs +0 -260
  969. package/packages/guard-core/src/analytics.rs +0 -46
  970. package/packages/internal/README.md +0 -1
  971. package/packages/internal/src/lib.rs +0 -1
  972. package/packages/internal/src/ops/bump_serverless_autoscaler_global.rs +0 -64
  973. package/packages/internal/src/ops/cache/mod.rs +0 -1
  974. package/packages/internal/src/ops/cache/purge_global.rs +0 -81
  975. package/packages/internal/src/ops/mod.rs +0 -2
  976. package/packages/namespace/src/ops/runner_config/mod.rs +0 -4
  977. package/packages/namespace/src/ops/runner_config/upsert.rs +0 -148
  978. package/packages/pegboard/src/ops/actor/get_runner.rs +0 -64
  979. package/packages/pegboard/src/ops/runner/find_dc_with_runner.rs +0 -222
  980. package/packages/pegboard-serverless/src/lib.rs +0 -523
  981. package/packages/types/src/msgs/mod.rs +0 -1
  982. package/packages/types/src/msgs/pegboard.rs +0 -5
  983. package/sdks/rust/epoxy-protocol/src/versioned.rs +0 -206
  984. package/sdks/rust/runner-protocol/build.rs +0 -115
  985. package/sdks/rust/runner-protocol/src/lib.rs +0 -10
  986. package/sdks/rust/runner-protocol/src/versioned.rs +0 -1734
  987. package/sdks/schemas/epoxy-protocol/v1.bare +0 -260
  988. package/sdks/typescript/runner/.turbo/turbo-build.log +0 -22
  989. package/sdks/typescript/runner/dist/mod.cjs +0 -2951
  990. package/sdks/typescript/runner/dist/mod.cjs.map +0 -1
  991. package/sdks/typescript/runner/dist/mod.d.cts +0 -326
  992. package/sdks/typescript/runner/dist/mod.d.ts +0 -326
  993. package/sdks/typescript/runner/dist/mod.js +0 -2951
  994. package/sdks/typescript/runner/dist/mod.js.map +0 -1
  995. package/sdks/typescript/runner/node_modules/.bin/pino +0 -21
  996. package/sdks/typescript/runner/node_modules/.bin/tsc +0 -21
  997. package/sdks/typescript/runner/node_modules/.bin/tsserver +0 -21
  998. package/sdks/typescript/runner/node_modules/.bin/tsup +0 -21
  999. package/sdks/typescript/runner/node_modules/.bin/tsup-node +0 -21
  1000. package/sdks/typescript/runner/node_modules/.bin/tsx +0 -21
  1001. package/sdks/typescript/runner/node_modules/.bin/uuid +0 -21
  1002. package/sdks/typescript/runner/node_modules/.bin/vitest +0 -21
  1003. package/sdks/typescript/runner-protocol/.turbo/turbo-build.log +0 -22
  1004. package/sdks/typescript/runner-protocol/dist/index.cjs.map +0 -1
  1005. package/sdks/typescript/runner-protocol/dist/index.d.cts +0 -666
  1006. package/sdks/typescript/runner-protocol/dist/index.d.ts +0 -666
  1007. package/sdks/typescript/runner-protocol/dist/index.js.map +0 -1
  1008. package/sdks/typescript/runner-protocol/node_modules/.bin/tsserver +0 -21
  1009. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup +0 -21
  1010. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup-node +0 -21
  1011. package/sdks/typescript/test-runner/Dockerfile +0 -26
  1012. package/tests/load/README.md +0 -28
  1013. package/tests/load/actor-lifecycle/README.md +0 -26
  1014. package/tests/load/actor-lifecycle/actor.ts +0 -41
  1015. package/tests/load/actor-lifecycle/config.ts +0 -14
  1016. package/tests/load/actor-lifecycle/index.ts +0 -62
  1017. package/tests/load/actor-lifecycle/rivet_api.ts +0 -140
  1018. package/tests/load/actor-lifecycle/types.ts +0 -17
  1019. package/tests/load/node_modules/.bin/biome +0 -21
  1020. package/tests/load/node_modules/.bin/tsc +0 -21
  1021. package/tests/load/package.json +0 -15
  1022. package/tests/load/tsconfig.json +0 -20
  1023. package/tests/smoke/README.md +0 -32
  1024. package/tests/smoke/package.json +0 -19
  1025. package/tests/smoke/scripts/connect.ts +0 -41
  1026. package/tests/smoke/src/server/registry.ts +0 -32
  1027. package/tests/smoke/src/server/server.ts +0 -7
  1028. package/tests/smoke/src/smoke-test/index.ts +0 -161
  1029. package/tests/smoke/src/smoke-test/spawn-actor.ts +0 -109
  1030. package/tests/smoke/tsconfig.json +0 -43
  1031. /package/packages/{dump-openapi → api-public-openapi-gen}/build.rs +0 -0
  1032. /package/packages/{dump-openapi → api-public-openapi-gen}/src/lib.rs +0 -0
  1033. /package/{sdks/rust → packages}/runner-protocol/Cargo.toml +0 -0
  1034. /package/{sdks/rust → packages}/runner-protocol/src/compat.rs +0 -0
  1035. /package/{sdks/rust → packages}/runner-protocol/src/generated.rs +0 -0
  1036. /package/{sdks/rust → packages}/runner-protocol/src/uuid_compat.rs +0 -0
  1037. /package/sdks/rust/{runner-protocol → envoy-protocol}/src/util.rs +0 -0
  1038. /package/{tests/smoke → sdks/typescript/envoy-protocol}/turbo.json +0 -0
@@ -3,15 +3,21 @@ use gas::prelude::*;
3
3
  use rivet_runner_protocol as protocol;
4
4
  use rivet_types::actors::CrashPolicy;
5
5
 
6
- use crate::{errors, workflows::runner::AllocatePendingActorsInput};
6
+ use crate::{errors, workflows::runner2::AllocatePendingActorsInput};
7
7
 
8
8
  mod destroy;
9
9
  mod keys;
10
+ pub mod metrics;
10
11
  mod runtime;
11
12
  mod setup;
12
13
 
13
14
  pub use runtime::AllocationOverride;
14
15
 
16
+ /// Batch size of how many events to ack.
17
+ const EVENT_ACK_BATCH_SIZE: i64 = 250;
18
+ /// How long an actor with crash_policy Restart should wait pending before setting itself to sleep.
19
+ const RESTART_PENDING_TIMEOUT_MS: i64 = util::duration::seconds(60);
20
+
15
21
  #[derive(Clone, Debug, Serialize, Deserialize, Hash)]
16
22
  pub struct Input {
17
23
  pub actor_id: Id,
@@ -22,81 +28,12 @@ pub struct Input {
22
28
  pub runner_name_selector: String,
23
29
  pub crash_policy: CrashPolicy,
24
30
 
25
- /// Arbitrary user string.
31
+ /// Arbitrary user-provided binary encoded in base64. We assume this is valid base64.
26
32
  pub input: Option<String>,
27
33
  }
28
34
 
29
- #[derive(Deserialize, Serialize, Clone)]
30
- pub struct State {
31
- pub name: String,
32
- pub key: Option<String>,
33
-
34
- pub namespace_id: Id,
35
- pub runner_name_selector: String,
36
- pub crash_policy: CrashPolicy,
37
-
38
- pub create_ts: i64,
39
- pub create_complete_ts: Option<i64>,
40
-
41
- #[serde(default)]
42
- pub for_serverless: bool,
43
- // This is used for state management for incrementing/decrementing the serverless desired slots key
44
- #[serde(default)]
45
- pub allocated_serverless_slot: bool,
46
-
47
- pub start_ts: Option<i64>,
48
- // NOTE: This is not the alarm ts, this is when the actor started sleeping. See `LifecycleState` for alarm
49
- pub sleep_ts: Option<i64>,
50
- pub complete_ts: Option<i64>,
51
- pub connectable_ts: Option<i64>,
52
- pub pending_allocation_ts: Option<i64>,
53
- #[serde(default)]
54
- pub reschedule_ts: Option<i64>,
55
- pub destroy_ts: Option<i64>,
56
-
57
- // Null if not allocated
58
- pub runner_id: Option<Id>,
59
- pub runner_workflow_id: Option<Id>,
60
- }
61
-
62
- impl State {
63
- pub fn new(
64
- name: String,
65
- key: Option<String>,
66
- namespace_id: Id,
67
- runner_name_selector: String,
68
- crash_policy: CrashPolicy,
69
- create_ts: i64,
70
- ) -> Self {
71
- State {
72
- name,
73
- key,
74
-
75
- namespace_id,
76
- runner_name_selector,
77
- crash_policy,
78
-
79
- create_ts,
80
- create_complete_ts: None,
81
-
82
- for_serverless: false,
83
- allocated_serverless_slot: false,
84
-
85
- start_ts: None,
86
- pending_allocation_ts: None,
87
- sleep_ts: None,
88
- connectable_ts: None,
89
- complete_ts: None,
90
- reschedule_ts: None,
91
- destroy_ts: None,
92
-
93
- runner_id: None,
94
- runner_workflow_id: None,
95
- }
96
- }
97
- }
98
-
99
35
  #[workflow]
36
+ #[prune = history] // Don't prune state, required for actor::list_for_ns
100
37
  pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()> {
101
38
  // Actor creation follows a careful sequence to prevent race conditions:
102
39
  //
@@ -122,11 +59,10 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
122
59
 
123
60
  if let Err(error) = validation_res {
124
61
  ctx.msg(Failed { error })
125
- .tag("actor_id", input.actor_id)
62
+ .topic(("actor_id", input.actor_id))
126
63
  .send()
127
64
  .await?;
128
65
 
129
- // TODO(RVT-3928): return Ok(Err);
130
66
  return Ok(());
131
67
  }
132
68
 
@@ -141,6 +77,20 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
141
77
  })
142
78
  .await?;
143
79
 
80
+ match ctx.check_version(2).await? {
81
+ 1 => {
82
+ ctx.v(2)
83
+ .activity(setup::BackfillUdbKeysAndMetricsInput {
84
+ actor_id: input.actor_id,
85
+ })
86
+ .await?;
87
+ }
88
+ _latest => {
89
+ // Do nothing, already using the new version of init_state_and_udb which has the new udb keys and
90
+ // metrics
91
+ }
92
+ }
93
+
144
94
  if let Some(key) = &input.key {
145
95
  match keys::reserve_key(
146
96
  ctx,
@@ -148,6 +98,7 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
148
98
  input.name.clone(),
149
99
  key.clone(),
150
100
  input.actor_id,
101
+ input.runner_name_selector.clone(),
151
102
  )
152
103
  .await?
153
104
  {
@@ -158,7 +109,7 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
158
109
  datacenter_label: dc_label,
159
110
  },
160
111
  })
161
- .tag("actor_id", input.actor_id)
112
+ .topic(("actor_id", input.actor_id))
162
113
  .send()
163
114
  .await?;
164
115
 
@@ -182,7 +133,7 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
182
133
  existing_actor_id,
183
134
  },
184
135
  })
185
- .tag("actor_id", input.actor_id)
136
+ .topic(("actor_id", input.actor_id))
186
137
  .send()
187
138
  .await?;
188
139
 
@@ -203,13 +154,24 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
203
154
  }
204
155
  }
205
156
 
157
+ let metrics_workflow_id = ctx
158
+ .v(2)
159
+ .workflow(metrics::Input {
160
+ actor_id: input.actor_id,
161
+ namespace_id: input.namespace_id,
162
+ name: input.name.clone(),
163
+ })
164
+ .tag("actor_id", input.actor_id)
165
+ .dispatch()
166
+ .await?;
167
+
206
168
  ctx.activity(setup::AddIndexesAndSetCreateCompleteInput {
207
169
  actor_id: input.actor_id,
208
170
  })
209
171
  .await?;
210
172
 
211
173
  ctx.msg(CreateComplete {})
212
- .tag("actor_id", input.actor_id)
174
+ .topic(("actor_id", input.actor_id))
213
175
  .send()
214
176
  .await?;
215
177
 
@@ -218,9 +180,11 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
218
180
  runtime::SpawnActorOutput::Allocated {
219
181
  runner_id,
220
182
  runner_workflow_id,
183
+ runner_protocol_version,
221
184
  } => runtime::LifecycleState::new(
222
185
  runner_id,
223
186
  runner_workflow_id,
187
+ runner_protocol_version,
224
188
  ctx.config().pegboard().actor_start_threshold(),
225
189
  ),
226
190
  runtime::SpawnActorOutput::Sleep => {
@@ -232,6 +196,14 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
232
196
  runtime::LifecycleState::new_sleeping()
233
197
  }
234
198
  runtime::SpawnActorOutput::Destroy => {
199
+ ctx.v(2)
200
+ .signal(metrics::Destroy {
201
+ ts: util::timestamp::now(),
202
+ })
203
+ .to_workflow_id(metrics_workflow_id)
204
+ .send()
205
+ .await?;
206
+
235
207
  // Destroyed early
236
208
  ctx.workflow(destroy::Input {
237
209
  namespace_id: input.namespace_id,
@@ -243,61 +215,101 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
243
215
  .output()
244
216
  .await?;
245
217
 
218
+ return Ok(());
219
+ }
220
+ runtime::SpawnActorOutput::MigrateToV2 => {
221
+ ctx.signal(metrics::Destroy {
222
+ ts: util::timestamp::now(),
223
+ })
224
+ .to_workflow_id(metrics_workflow_id)
225
+ .send()
226
+ .await?;
227
+
228
+ ctx.workflow(crate::workflows::actor2::Input {
229
+ actor_id: input.actor_id,
230
+ name: input.name.clone(),
231
+ pool_name: input.runner_name_selector.clone(),
232
+ key: input.key.clone(),
233
+ namespace_id: input.namespace_id,
234
+ input: input.input.clone(),
235
+ from_v1: true,
236
+ })
237
+ .tag("actor_id", input.actor_id)
238
+ .dispatch()
239
+ .await?;
240
+
241
+ ctx.msg(MigratedToV2 {})
242
+ .topic(("actor_id", input.actor_id))
243
+ .send()
244
+ .await?;
245
+
246
246
  return Ok(());
247
247
  }
248
248
  };
249
249
 
250
250
  let lifecycle_res = ctx
251
- .loope(
252
- lifecycle_state,
253
- |ctx, state| {
254
- let input = input.clone();
255
-
256
- async move {
257
- let sig = if let Some(gc_timeout_ts) = state.gc_timeout_ts {
258
- // Listen for signal with gc timeout. if a timeout happens, it means this actor is lost
259
- if let Some(sig) = ctx.listen_until::<Main>(gc_timeout_ts).await? {
260
- sig
261
- } else {
262
- tracing::warn!(actor_id=?input.actor_id, "actor lost");
263
-
264
- // Fake signal
265
- Main::Lost(Lost {
266
- generation: state.generation,
267
- force_reschedule: false,
268
- reset_rescheduling: false,
269
- })
270
- }
271
- } else if let Some(alarm_ts) = state.alarm_ts {
272
- // Listen for signal with timeout. if a timeout happens, it means this actor should
273
- // wake up
274
- if let Some(sig) = ctx.listen_until::<Main>(alarm_ts).await? {
275
- sig
276
- } else {
277
- tracing::debug!(actor_id=?input.actor_id, "actor wake");
278
-
279
- // Fake signal
280
- Main::Wake(Wake { allocation_override: AllocationOverride::DontSleep { pending_timeout: None } })
281
- }
251
+ .loope(lifecycle_state, |ctx, state| {
252
+ let input = input.clone();
253
+
254
+ async move {
255
+ let signals = if let Some(gc_timeout_ts) = state.gc_timeout_ts {
256
+ // Listen for signals with gc timeout. if a timeout happens, it means this actor is lost
257
+ let signals = ctx.listen_n_until::<Main>(gc_timeout_ts, 256).await?;
258
+ if signals.is_empty() {
259
+ tracing::warn!(actor_id=?input.actor_id, "actor lost");
260
+
261
+ // Fake signal
262
+ vec![Main::Lost(Lost {
263
+ generation: state.generation,
264
+ force_reschedule: false,
265
+ reset_rescheduling: false,
266
+ reason: Some(LostReason::RunnerNoResponse),
267
+ })]
268
+ } else {
269
+ signals
270
+ }
271
+ } else if let Some(alarm_ts) = state.alarm_ts {
272
+ // Listen for signals with timeout. if a timeout happens, it means this actor should
273
+ // wake up
274
+ let signals = ctx.listen_n_until::<Main>(alarm_ts, 256).await?;
275
+ if signals.is_empty() {
276
+ tracing::debug!(actor_id=?input.actor_id, "actor wake");
277
+
278
+ // Fake signal
279
+ vec![Main::Wake(Wake {
280
+ allocation_override: AllocationOverride::DontSleep {
281
+ pending_timeout: None,
282
+ },
283
+ })]
282
284
  } else {
283
- // Listen for signal normally
284
- ctx.listen::<Main>().await?
285
- };
285
+ signals
286
+ }
287
+ } else {
288
+ // Listen for signals normally
289
+ ctx.listen_n::<Main>(256).await?
290
+ };
286
291
 
292
+ for sig in signals {
287
293
  match sig {
294
+ // NOTE: This is only received when allocated to mk1 runner
288
295
  Main::Event(sig) => {
289
- // Ignore state updates for previous generations
290
- if crate::utils::event_generation(&sig.inner) != state.generation {
291
- return Ok(Loop::Continue);
292
- }
293
-
294
- let (Some(runner_id), Some(runner_workflow_id)) =
295
- (state.runner_id, state.runner_workflow_id)
296
+ let (
297
+ Some(runner_id),
298
+ Some(runner_workflow_id),
299
+ ) = (
300
+ state.runner_id,
301
+ state.runner_workflow_id,
302
+ )
296
303
  else {
297
- tracing::warn!("actor not allocated, ignoring event");
298
- return Ok(Loop::Continue);
304
+ tracing::warn!(?sig, "actor not allocated, ignoring event");
305
+ continue;
299
306
  };
300
307
 
308
+ // Ignore events for previous generations
309
+ if crate::utils::event_generation_mk1(&sig.inner) != state.generation {
310
+ continue;
311
+ }
312
+
301
313
  match sig.inner {
302
314
  protocol::Event::EventActorIntent(protocol::EventActorIntent {
303
315
  intent,
@@ -377,24 +389,41 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
377
389
  .await?;
378
390
 
379
391
  ctx.msg(Ready { runner_id })
380
- .tag("actor_id", input.actor_id)
392
+ .topic(("actor_id", input.actor_id))
381
393
  .send()
382
394
  .await?;
383
395
  }
384
396
  protocol::ActorState::ActorStateStopped(
385
- protocol::ActorStateStopped { code, .. },
397
+ protocol::ActorStateStopped { code, message },
386
398
  ) => {
387
- if let StoppedResult::Destroy = handle_stopped(
399
+ match handle_stopped(
388
400
  ctx,
389
401
  &input,
390
402
  state,
391
- StoppedVariant::Normal { code },
403
+ metrics_workflow_id,
404
+ StoppedVariant::Normal {
405
+ code: match code {
406
+ protocol::StopCode::Ok => protocol::mk2::StopCode::Ok,
407
+ protocol::StopCode::Error => protocol::mk2::StopCode::Error,
408
+ },
409
+ message,
410
+ },
392
411
  )
393
412
  .await?
394
413
  {
395
- return Ok(Loop::Break(runtime::LifecycleResult {
396
- generation: state.generation,
397
- }));
414
+ StoppedResult::Continue => {}
415
+ StoppedResult::Destroy => {
416
+ return Ok(Loop::Break(runtime::LifecycleResult {
417
+ generation: state.generation,
418
+ migrate_to_v2: false,
419
+ }));
420
+ }
421
+ StoppedResult::MigrateToV2 => {
422
+ return Ok(Loop::Break(runtime::LifecycleResult {
423
+ generation: state.generation,
424
+ migrate_to_v2: true,
425
+ }));
426
+ }
398
427
  }
399
428
  }
400
429
  },
@@ -402,27 +431,254 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
402
431
  protocol::EventActorSetAlarm { alarm_ts, .. },
403
432
  ) => {
404
433
  state.alarm_ts = alarm_ts;
434
+
435
+ ctx.activity(runtime::RecordEventMetricsInput {
436
+ namespace_id: input.namespace_id,
437
+ name: input.name.clone(),
438
+ alarms_set: 1,
439
+ }).await?;
405
440
  }
406
441
  }
407
442
  }
443
+ // NOTE: This signal is only received when allocated to a mk2 runner
444
+ Main::Events(sig) => {
445
+ let Some(runner_id) = state.runner_id else {
446
+ tracing::warn!(?sig, "actor not allocated, ignoring events");
447
+ continue;
448
+ };
449
+
450
+ if sig.runner_id != runner_id {
451
+ tracing::debug!("events not from current runner, ignoring");
452
+ continue;
453
+ }
454
+
455
+ // Fetch the last event index for the current runner
456
+ let last_event_idx =
457
+ state.runner_state.get_or_insert_default().last_event_idx;
458
+
459
+ // Filter already received events and events from previous generations
460
+ let generation = state.generation;
461
+ let new_events = sig.events
462
+ .iter()
463
+ .filter(|event| {
464
+ event.checkpoint.generation == generation &&
465
+ event.checkpoint.index > last_event_idx
466
+ });
467
+ let mut new_event_count = 0;
468
+ let new_last_event_idx =
469
+ new_events.clone().last().map(|event| event.checkpoint.index);
470
+ let mut alarms_set = 0;
471
+
472
+ for event in new_events {
473
+ new_event_count += 1;
474
+
475
+ match &event.inner {
476
+ protocol::mk2::Event::EventActorIntent(
477
+ protocol::mk2::EventActorIntent { intent, .. },
478
+ ) => match intent {
479
+ protocol::mk2::ActorIntent::ActorIntentSleep => {
480
+ if !state.sleeping {
481
+ state.gc_timeout_ts = Some(
482
+ util::timestamp::now()
483
+ + ctx
484
+ .config()
485
+ .pegboard()
486
+ .actor_stop_threshold(),
487
+ );
488
+ state.sleeping = true;
489
+
490
+ ctx.activity(runtime::SetSleepingInput {
491
+ actor_id: input.actor_id,
492
+ })
493
+ .await?;
494
+
495
+ ctx.activity(runtime::InsertAndSendCommandsInput {
496
+ actor_id: input.actor_id,
497
+ generation: state.generation,
498
+ runner_id,
499
+ commands: vec![protocol::mk2::Command::CommandStopActor],
500
+ })
501
+ .await?;
502
+ }
503
+ }
504
+ protocol::mk2::ActorIntent::ActorIntentStop => {
505
+ if !state.stopping {
506
+ state.gc_timeout_ts = Some(
507
+ util::timestamp::now()
508
+ + ctx
509
+ .config()
510
+ .pegboard()
511
+ .actor_stop_threshold(),
512
+ );
513
+ state.stopping = true;
514
+
515
+ ctx.activity(runtime::SetNotConnectableInput {
516
+ actor_id: input.actor_id,
517
+ })
518
+ .await?;
519
+
520
+ ctx.activity(runtime::InsertAndSendCommandsInput {
521
+ actor_id: input.actor_id,
522
+ generation: state.generation,
523
+ runner_id,
524
+ commands: vec![protocol::mk2::Command::CommandStopActor],
525
+ })
526
+ .await?;
527
+ }
528
+ }
529
+ },
530
+ protocol::mk2::Event::EventActorStateUpdate(
531
+ protocol::mk2::EventActorStateUpdate {
532
+ state: actor_state,
533
+ ..
534
+ },
535
+ ) => match actor_state {
536
+ protocol::mk2::ActorState::ActorStateRunning => {
537
+ state.gc_timeout_ts = None;
538
+
539
+ ctx.activity(runtime::SetStartedInput {
540
+ actor_id: input.actor_id,
541
+ })
542
+ .await?;
543
+
544
+ ctx.msg(Ready { runner_id })
545
+ .topic(("actor_id", input.actor_id))
546
+ .send()
547
+ .await?;
548
+ }
549
+ protocol::mk2::ActorState::ActorStateStopped(
550
+ protocol::mk2::ActorStateStopped { code, message },
551
+ ) => {
552
+ match handle_stopped(
553
+ ctx,
554
+ &input,
555
+ state,
556
+ metrics_workflow_id,
557
+ StoppedVariant::Normal {
558
+ code: code.clone(),
559
+ message: message.clone(),
560
+ },
561
+ )
562
+ .await?
563
+ {
564
+ StoppedResult::Continue => {}
565
+ StoppedResult::Destroy => {
566
+ return Ok(Loop::Break(runtime::LifecycleResult {
567
+ generation: state.generation,
568
+ migrate_to_v2: false,
569
+ }));
570
+ }
571
+ StoppedResult::MigrateToV2 => {
572
+ return Ok(Loop::Break(runtime::LifecycleResult {
573
+ generation: state.generation,
574
+ migrate_to_v2: true,
575
+ }));
576
+ }
577
+ }
578
+ }
579
+ },
580
+ protocol::mk2::Event::EventActorSetAlarm(
581
+ protocol::mk2::EventActorSetAlarm { alarm_ts, .. },
582
+ ) => {
583
+ state.alarm_ts = *alarm_ts;
584
+ alarms_set += 1;
585
+ }
586
+ }
587
+ }
588
+
589
+ let diff = sig.events.len().saturating_sub(new_event_count);
590
+ if diff != 0 {
591
+ tracing::warn!(count=%diff, "ignored events due to generation/index filter");
592
+ }
593
+
594
+ ctx.join((
595
+ if let (Some(runner_state), Some(new_last_event_idx)) = (state.runner_state.as_mut(), new_last_event_idx) {
596
+ runner_state.last_event_idx = runner_state.last_event_idx.max(new_last_event_idx);
597
+
598
+ // Ack events in batch
599
+ if runner_state.last_event_idx
600
+ > runner_state.last_event_ack_idx.saturating_add(EVENT_ACK_BATCH_SIZE)
601
+ {
602
+ runner_state.last_event_ack_idx = runner_state.last_event_idx;
603
+
604
+ Some(activity(runtime::SendMessagesToRunnerInput {
605
+ runner_id,
606
+ messages: vec![protocol::mk2::ToRunner::ToClientAckEvents(
607
+ protocol::mk2::ToClientAckEvents {
608
+ last_event_checkpoints: vec![
609
+ protocol::mk2::ActorCheckpoint {
610
+ actor_id: input.actor_id.to_string(),
611
+ generation: state.generation,
612
+ index: runner_state.last_event_ack_idx,
613
+ },
614
+ ],
615
+ },
616
+ )],
617
+ }))
618
+ } else {
619
+ None
620
+ }
621
+ } else {
622
+ None
623
+ },
624
+ (alarms_set > 0).then(|| activity(runtime::RecordEventMetricsInput {
625
+ namespace_id: input.namespace_id,
626
+ name: input.name.clone(),
627
+ alarms_set,
628
+ }))
629
+ )).await?;
630
+ }
408
631
  Main::Wake(sig) => {
632
+ tracing::debug!(
633
+ actor_id = ?input.actor_id,
634
+ sleeping = state.sleeping,
635
+ runner_id = ?state.runner_id,
636
+ will_wake = state.will_wake,
637
+ "received wake signal"
638
+ );
639
+
640
+ // Clear alarm
641
+ if let Some(alarm_ts) = state.alarm_ts {
642
+ let now = ctx.v(3).activity(GetTsInput {}).await?;
643
+
644
+ if now >= alarm_ts {
645
+ state.alarm_ts = None;
646
+ }
647
+ }
648
+
409
649
  if state.sleeping {
410
650
  if state.runner_id.is_none() {
411
- state.alarm_ts = None;
412
651
  state.sleeping = false;
413
652
  state.will_wake = false;
414
653
 
415
- match runtime::reschedule_actor(ctx, &input, state, sig.allocation_override)
416
- .await?
654
+ match runtime::reschedule_actor(
655
+ ctx,
656
+ &input,
657
+ state,
658
+ metrics_workflow_id,
659
+ sig.allocation_override,
660
+ )
661
+ .await?
417
662
  {
418
663
  runtime::SpawnActorOutput::Allocated { .. } => {}
419
664
  runtime::SpawnActorOutput::Sleep => {
420
665
  state.sleeping = true;
666
+
667
+ // We do not have to run set_sleeping here because the actor went
668
+ // from sleeping -> attempt allocation -> sleeping. It was never
669
+ // allocated
421
670
  }
422
671
  runtime::SpawnActorOutput::Destroy => {
423
672
  // Destroyed early
424
673
  return Ok(Loop::Break(runtime::LifecycleResult {
425
674
  generation: state.generation,
675
+ migrate_to_v2: false,
676
+ }));
677
+ }
678
+ runtime::SpawnActorOutput::MigrateToV2 => {
679
+ return Ok(Loop::Break(runtime::LifecycleResult {
680
+ generation: state.generation,
681
+ migrate_to_v2: true,
426
682
  }));
427
683
  }
428
684
  }
@@ -444,32 +700,65 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
444
700
  Main::Lost(sig) => {
445
701
  // Ignore signals for previous generations
446
702
  if sig.generation != state.generation {
447
- return Ok(Loop::Continue);
703
+ continue;
448
704
  }
449
705
 
450
706
  if sig.reset_rescheduling {
451
707
  state.reschedule_state = Default::default();
452
708
  }
453
709
 
454
- if let StoppedResult::Destroy = handle_stopped(
710
+ // Build failure reason from lost reason
711
+ let failure_reason = if let Some(runner_id) = state.runner_id {
712
+ match &sig.reason {
713
+ Some(LostReason::RunnerNoResponse) => {
714
+ Some(FailureReason::RunnerNoResponse { runner_id })
715
+ }
716
+ Some(LostReason::RunnerConnectionLost) => {
717
+ Some(FailureReason::RunnerConnectionLost { runner_id })
718
+ }
719
+ Some(LostReason::RunnerDrainingTimeout) => {
720
+ Some(FailureReason::RunnerDrainingTimeout { runner_id })
721
+ }
722
+ // Draining is expected, no error needed
723
+ Some(LostReason::RunnerDraining) => None,
724
+ // Legacy signal without reason
725
+ None => None,
726
+ }
727
+ } else {
728
+ None
729
+ };
730
+
731
+ match handle_stopped(
455
732
  ctx,
456
733
  &input,
457
734
  state,
735
+ metrics_workflow_id,
458
736
  StoppedVariant::Lost {
459
737
  force_reschedule: sig.force_reschedule,
738
+ failure_reason,
460
739
  },
461
740
  )
462
741
  .await?
463
742
  {
464
- return Ok(Loop::Break(runtime::LifecycleResult {
465
- generation: state.generation,
466
- }));
743
+ StoppedResult::Continue => {}
744
+ StoppedResult::Destroy => {
745
+ return Ok(Loop::Break(runtime::LifecycleResult {
746
+ generation: state.generation,
747
+ migrate_to_v2: false,
748
+ }));
749
+ }
750
+ StoppedResult::MigrateToV2 => {
751
+ return Ok(Loop::Break(runtime::LifecycleResult {
752
+ generation: state.generation,
753
+ migrate_to_v2: true,
754
+ }));
755
+ }
467
756
  }
468
757
  }
469
758
  Main::GoingAway(sig) => {
470
759
  // Ignore signals for previous generations
471
760
  if sig.generation != state.generation {
472
- return Ok(Loop::Continue);
761
+ continue;
473
762
  }
474
763
 
475
764
  if sig.reset_rescheduling {
@@ -477,8 +766,10 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
477
766
  }
478
767
 
479
768
  if !state.going_away {
480
- let Some(runner_workflow_id) = state.runner_workflow_id else {
481
- return Ok(Loop::Continue);
769
+ let (Some(runner_id), Some(runner_workflow_id), Some(runner_protocol_version)) =
770
+ (state.runner_id, state.runner_workflow_id, state.runner_protocol_version)
771
+ else {
772
+ continue;
482
773
  };
483
774
 
484
775
  state.gc_timeout_ts = Some(
@@ -492,96 +783,323 @@ pub async fn pegboard_actor(ctx: &mut WorkflowCtx, input: &Input) -> Result<()>
492
783
  })
493
784
  .await?;
494
785
 
495
- ctx.signal(crate::workflows::runner::Command {
496
- inner: protocol::Command::CommandStopActor(protocol::CommandStopActor {
497
- actor_id: input.actor_id.to_string(),
786
+ if protocol::is_mk2(runner_protocol_version) {
787
+ ctx.activity(runtime::InsertAndSendCommandsInput {
788
+ actor_id: input.actor_id,
498
789
  generation: state.generation,
499
- }),
500
- })
501
- .to_workflow_id(runner_workflow_id)
502
- .send()
503
- .await?;
790
+ runner_id,
791
+ commands: vec![protocol::mk2::Command::CommandStopActor],
792
+ })
793
+ .await?;
794
+ } else {
795
+ ctx.signal(crate::workflows::runner::Command {
796
+ inner: protocol::Command::CommandStopActor(
797
+ protocol::CommandStopActor {
798
+ actor_id: input.actor_id.to_string(),
799
+ generation: state.generation,
800
+ },
801
+ ),
802
+ })
803
+ .to_workflow_id(runner_workflow_id)
804
+ .send()
805
+ .await?;
806
+ }
504
807
  }
505
808
  }
506
809
  Main::Destroy(_) => {
507
810
  // If allocated, send stop actor command
508
- if let Some(runner_workflow_id) = state.runner_workflow_id {
509
- ctx.signal(crate::workflows::runner::Command {
510
- inner: protocol::Command::CommandStopActor(protocol::CommandStopActor {
511
- actor_id: input.actor_id.to_string(),
811
+ if let (Some(runner_id), Some(runner_workflow_id), Some(runner_protocol_version)) =
812
+ (state.runner_id, state.runner_workflow_id, state.runner_protocol_version)
813
+ {
814
+ if protocol::is_mk2(runner_protocol_version) {
815
+ ctx.activity(runtime::InsertAndSendCommandsInput {
816
+ actor_id: input.actor_id,
512
817
  generation: state.generation,
513
- }),
514
- })
515
- .to_workflow_id(runner_workflow_id)
516
- .send()
517
- .await?;
818
+ runner_id,
819
+ commands: vec![protocol::mk2::Command::CommandStopActor],
820
+ })
821
+ .await?;
822
+ } else {
823
+ ctx.signal(crate::workflows::runner::Command {
824
+ inner: protocol::Command::CommandStopActor(
825
+ protocol::CommandStopActor {
826
+ actor_id: input.actor_id.to_string(),
827
+ generation: state.generation,
828
+ },
829
+ ),
830
+ })
831
+ .to_workflow_id(runner_workflow_id)
832
+ .send()
833
+ .await?;
834
+ }
518
835
  }
519
836
 
520
837
  return Ok(Loop::Break(runtime::LifecycleResult {
521
838
  generation: state.generation,
839
+ migrate_to_v2: false,
522
840
  }));
523
841
  }
524
842
  }
525
-
526
- Ok(Loop::Continue)
527
843
  }
528
- .boxed()
529
- },
530
- )
844
+
845
+ Ok(Loop::Continue)
846
+ }
847
+ .boxed()
848
+ })
531
849
  .await?;
532
850
 
533
851
  // At this point, the actor is not allocated so no cleanup related to alloc idx/desired slots needs to be
534
852
  // done.
535
853
 
536
- ctx.workflow(destroy::Input {
537
- namespace_id: input.namespace_id,
538
- actor_id: input.actor_id,
539
- name: input.name.clone(),
540
- key: input.key.clone(),
541
- generation: lifecycle_res.generation,
542
- })
543
- .output()
544
- .await?;
854
+ ctx.v(2)
855
+ .signal(metrics::Destroy {
856
+ ts: util::timestamp::now(),
857
+ })
858
+ .to_workflow_id(metrics_workflow_id)
859
+ .send()
860
+ .await?;
861
+
862
+ if lifecycle_res.migrate_to_v2 {
863
+ ctx.workflow(crate::workflows::actor2::Input {
864
+ actor_id: input.actor_id,
865
+ name: input.name.clone(),
866
+ pool_name: input.runner_name_selector.clone(),
867
+ key: input.key.clone(),
868
+ namespace_id: input.namespace_id,
869
+ input: input.input.clone(),
870
+ from_v1: true,
871
+ })
872
+ .tag("actor_id", input.actor_id)
873
+ .dispatch()
874
+ .await?;
875
+
876
+ ctx.msg(MigratedToV2 {})
877
+ .topic(("actor_id", input.actor_id))
878
+ .send()
879
+ .await?;
880
+ } else {
881
+ ctx.workflow(destroy::Input {
882
+ namespace_id: input.namespace_id,
883
+ actor_id: input.actor_id,
884
+ name: input.name.clone(),
885
+ key: input.key.clone(),
886
+ generation: lifecycle_res.generation,
887
+ })
888
+ .output()
889
+ .await?;
890
+ }
545
891
 
546
892
  Ok(())
547
893
  }
548
894
 
895
+ #[derive(Deserialize, Serialize)]
896
+ pub struct State {
897
+ pub name: String,
898
+ pub key: Option<String>,
899
+
900
+ pub namespace_id: Id,
901
+ pub runner_name_selector: String,
902
+ pub crash_policy: CrashPolicy,
903
+
904
+ pub create_ts: i64,
905
+ pub create_complete_ts: Option<i64>,
906
+
907
+ // As opposed to allocated_serverless_slot, this is only set when allocating if the chosen runner has a
908
+ // serverless config
909
+ #[serde(default)]
910
+ pub for_serverless: bool,
911
+ // This is used for state management for incrementing/decrementing the serverless desired slots key
912
+ #[serde(default)]
913
+ pub allocated_serverless_slot: bool,
914
+
915
+ pub start_ts: Option<i64>,
916
+ // NOTE: This is not the alarm ts, this is when the actor started sleeping. See `LifecycleState` for alarm
917
+ pub sleep_ts: Option<i64>,
918
+ pub complete_ts: Option<i64>,
919
+ pub connectable_ts: Option<i64>,
920
+ pub pending_allocation_ts: Option<i64>,
921
+ #[serde(default)]
922
+ pub reschedule_ts: Option<i64>,
923
+ pub destroy_ts: Option<i64>,
924
+
925
+ // Null if not allocated
926
+ pub runner_id: Option<Id>,
927
+ pub runner_workflow_id: Option<Id>,
928
+ pub runner_state: Option<RunnerState>,
929
+
930
+ /// Explains why the actor is NOT healthy, either due to failure to allocate or a failed
931
+ /// runner.
932
+ ///
933
+ /// # When failure_reason is cleared
934
+ ///
935
+ /// - When actor is allocated (gets a runner assigned)
936
+ /// - When actor becomes connectable
937
+ #[serde(default)]
938
+ pub failure_reason: Option<FailureReason>,
939
+ }
940
+
941
+ impl State {
942
+ pub fn new(
943
+ name: String,
944
+ key: Option<String>,
945
+ namespace_id: Id,
946
+ runner_name_selector: String,
947
+ crash_policy: CrashPolicy,
948
+ create_ts: i64,
949
+ ) -> Self {
950
+ State {
951
+ name,
952
+ key,
953
+
954
+ namespace_id,
955
+ runner_name_selector,
956
+ crash_policy,
957
+
958
+ create_ts,
959
+ create_complete_ts: None,
960
+
961
+ for_serverless: false,
962
+ allocated_serverless_slot: false,
963
+
964
+ start_ts: None,
965
+ pending_allocation_ts: None,
966
+ sleep_ts: None,
967
+ connectable_ts: None,
968
+ complete_ts: None,
969
+ reschedule_ts: None,
970
+ destroy_ts: None,
971
+
972
+ runner_id: None,
973
+ runner_workflow_id: None,
974
+ runner_state: None,
975
+
976
+ failure_reason: None,
977
+ }
978
+ }
979
+ }
980
+
981
+ /// Reason why an actor failed to allocate or run.
982
+ ///
983
+ /// Distinct from `errors::Actor` which represents user-facing API errors.
984
+ #[derive(Debug, Clone, Serialize, Deserialize, Hash)]
985
+ #[serde(rename_all = "snake_case")]
986
+ pub enum FailureReason {
987
+ /// Actor cannot allocate due to no available runner capacity. Only set if `failure_reason`
988
+ /// is currently `None` (runner failures take precedence as root causes).
989
+ NoCapacity,
990
+ /// Runner did not respond with expected events (GC timeout).
991
+ RunnerNoResponse { runner_id: Id },
992
+ /// Runner connection was lost (no recent ping, network issue, or crash).
993
+ RunnerConnectionLost { runner_id: Id },
994
+ /// Runner was draining but actor didn't stop in time.
995
+ RunnerDrainingTimeout { runner_id: Id },
996
+ /// Actor crashed during execution.
997
+ Crashed { message: Option<String> },
998
+ }
999
+
1000
+ impl FailureReason {
1001
+ /// Used to determine the category of this error.
1002
+ ///
1003
+ /// Actor errors will not override runner errors.
1004
+ pub fn is_runner_failure(&self) -> bool {
1005
+ match self {
1006
+ FailureReason::NoCapacity | FailureReason::Crashed { .. } => false,
1007
+ FailureReason::RunnerNoResponse { .. }
1008
+ | FailureReason::RunnerConnectionLost { .. }
1009
+ | FailureReason::RunnerDrainingTimeout { .. } => true,
1010
+ }
1011
+ }
1012
+ }
1013
+
1014
+ #[derive(Deserialize, Serialize)]
1015
+ pub struct RunnerState {
1016
+ pub last_command_idx: i64,
1017
+ }
1018
+
1019
+ impl Default for RunnerState {
1020
+ fn default() -> Self {
1021
+ RunnerState {
1022
+ last_command_idx: -1,
1023
+ }
1024
+ }
1025
+ }
1026
+
549
1027
  #[derive(Debug)]
550
1028
  enum StoppedVariant {
551
- Normal { code: protocol::StopCode },
552
- Lost { force_reschedule: bool },
1029
+ Normal {
1030
+ code: protocol::mk2::StopCode,
1031
+ message: Option<String>,
1032
+ },
1033
+ Lost {
1034
+ force_reschedule: bool,
1035
+ failure_reason: Option<FailureReason>,
1036
+ },
553
1037
  }
554
1038
 
555
1039
  enum StoppedResult {
556
1040
  Continue,
557
1041
  Destroy,
1042
+ MigrateToV2,
558
1043
  }
559
1044
 
560
1045
  async fn handle_stopped(
561
1046
  ctx: &mut WorkflowCtx,
562
1047
  input: &Input,
563
1048
  state: &mut runtime::LifecycleState,
1049
+ metrics_workflow_id: Id,
564
1050
  variant: StoppedVariant,
565
1051
  ) -> Result<StoppedResult> {
566
1052
  tracing::debug!(?variant, "actor stopped");
567
1053
 
568
1054
  let force_reschedule = match &variant {
569
- StoppedVariant::Normal { code } => {
1055
+ StoppedVariant::Normal {
1056
+ code: protocol::mk2::StopCode::Ok,
1057
+ ..
1058
+ } => {
570
1059
  // Reset retry count on successful exit
571
- if let protocol::StopCode::Ok = code {
572
- state.reschedule_state = Default::default();
573
- }
1060
+ state.reschedule_state = Default::default();
1061
+
1062
+ false
1063
+ }
1064
+ StoppedVariant::Normal {
1065
+ code: protocol::mk2::StopCode::Error,
1066
+ message,
1067
+ } => {
1068
+ ctx.v(3)
1069
+ .activity(runtime::SetFailureReasonInput {
1070
+ failure_reason: FailureReason::Crashed {
1071
+ message: message.clone(),
1072
+ },
1073
+ })
1074
+ .await?;
574
1075
 
575
1076
  false
576
1077
  }
577
- StoppedVariant::Lost { force_reschedule } => *force_reschedule,
1078
+ StoppedVariant::Lost {
1079
+ force_reschedule,
1080
+ failure_reason,
1081
+ } => {
1082
+ // Set runner failure reason if actor was lost unexpectedly.
1083
+ // This is set early (before crash policy handling) because it applies to all crash policies.
1084
+ if let Some(failure_reason) = &failure_reason {
1085
+ ctx.v(3)
1086
+ .activity(runtime::SetFailureReasonInput {
1087
+ failure_reason: failure_reason.clone(),
1088
+ })
1089
+ .await?;
1090
+ }
1091
+
1092
+ *force_reschedule
1093
+ }
578
1094
  };
579
1095
 
580
1096
  // Clear stop gc timeout to prevent being marked as lost in the lifecycle loop
581
1097
  state.gc_timeout_ts = None;
582
1098
  state.stopping = false;
583
- state.runner_id = None;
1099
+ let old_runner_id = state.runner_id.take();
584
1100
  let old_runner_workflow_id = state.runner_workflow_id.take();
1101
+ let old_runner_protocol_version = state.runner_protocol_version.take();
1102
+ state.runner_state = None;
585
1103
 
586
1104
  let deallocate_res = ctx
587
1105
  .activity(runtime::DeallocateInput {
@@ -589,9 +1107,6 @@ async fn handle_stopped(
589
1107
  })
590
1108
  .await?;
591
1109
 
592
- // NOTE: The reason we allocate other actors from this actor workflow is because if we instead sent a
593
- // signal to the runner wf here it would incur a heavy throughput hit and we need the runner wf to be as
594
- // lightweight as possible; processing as few signals that aren't events/commands.
595
1110
  // Allocate other pending actors from queue since a slot has now cleared
596
1111
  let allocate_pending_res = ctx
597
1112
  .activity(AllocatePendingActorsInput {
@@ -600,12 +1115,43 @@ async fn handle_stopped(
600
1115
  })
601
1116
  .await?;
602
1117
 
1118
+ // Pause periodic metrics workflow
1119
+ ctx.v(3)
1120
+ .signal(metrics::Pause {
1121
+ ts: util::timestamp::now(),
1122
+ })
1123
+ .to_workflow_id(metrics_workflow_id)
1124
+ .send()
1125
+ .await?;
1126
+
603
1127
  if allocate_pending_res.allocations.is_empty() {
604
- // Bump autoscaler so it can scale down if needed
1128
+ // Bump pool so it can scale down if needed
605
1129
  if deallocate_res.for_serverless {
606
- ctx.msg(rivet_types::msgs::pegboard::BumpServerlessAutoscaler {})
607
- .send()
1130
+ ctx.removed::<Message<BumpServerlessAutoscalerStub>>()
608
1131
  .await?;
1132
+
1133
+ let res = ctx
1134
+ .v(2)
1135
+ .signal(crate::workflows::runner_pool::Bump::default())
1136
+ .to_workflow::<crate::workflows::runner_pool::Workflow>()
1137
+ .tag("namespace_id", input.namespace_id)
1138
+ .tag("runner_name", input.runner_name_selector.clone())
1139
+ .send()
1140
+ .await;
1141
+
1142
+ if let Some(WorkflowError::WorkflowNotFound) = res
1143
+ .as_ref()
1144
+ .err()
1145
+ .and_then(|x| x.chain().find_map(|x| x.downcast_ref::<WorkflowError>()))
1146
+ {
1147
+ tracing::warn!(
1148
+ namespace_id=%input.namespace_id,
1149
+ runner_name=%input.runner_name_selector,
1150
+ "serverless pool workflow not found, respective runner config likely deleted"
1151
+ );
1152
+ } else {
1153
+ res?;
1154
+ }
609
1155
  }
610
1156
  } else {
611
1157
  // Dispatch pending allocs (if any)
@@ -620,18 +1166,36 @@ async fn handle_stopped(
620
1166
 
621
1167
  // We don't know the state of the previous generation of this actor actor if it becomes lost, send stop
622
1168
  // command in case it ended up allocating
623
- if let (StoppedVariant::Lost { .. }, Some(old_runner_workflow_id)) =
624
- (&variant, old_runner_workflow_id)
625
- {
626
- ctx.signal(crate::workflows::runner::Command {
627
- inner: protocol::Command::CommandStopActor(protocol::CommandStopActor {
628
- actor_id: input.actor_id.to_string(),
1169
+ if let (
1170
+ StoppedVariant::Lost { .. },
1171
+ Some(old_runner_id),
1172
+ Some(old_runner_workflow_id),
1173
+ Some(old_runner_protocol_version),
1174
+ ) = (
1175
+ &variant,
1176
+ old_runner_id,
1177
+ old_runner_workflow_id,
1178
+ old_runner_protocol_version,
1179
+ ) {
1180
+ if protocol::is_mk2(old_runner_protocol_version) {
1181
+ ctx.activity(runtime::InsertAndSendCommandsInput {
1182
+ actor_id: input.actor_id,
629
1183
  generation: state.generation,
630
- }),
631
- })
632
- .to_workflow_id(old_runner_workflow_id)
633
- .send()
634
- .await?;
1184
+ runner_id: old_runner_id,
1185
+ commands: vec![protocol::mk2::Command::CommandStopActor],
1186
+ })
1187
+ .await?;
1188
+ } else {
1189
+ ctx.signal(crate::workflows::runner::Command {
1190
+ inner: protocol::Command::CommandStopActor(protocol::CommandStopActor {
1191
+ actor_id: input.actor_id.to_string(),
1192
+ generation: state.generation,
1193
+ }),
1194
+ })
1195
+ .to_workflow_id(old_runner_workflow_id)
1196
+ .send()
1197
+ .await?;
1198
+ }
635
1199
  }
636
1200
 
637
1201
  // Reschedule no matter what
@@ -640,6 +1204,7 @@ async fn handle_stopped(
640
1204
  ctx,
641
1205
  &input,
642
1206
  state,
1207
+ metrics_workflow_id,
643
1208
  AllocationOverride::DontSleep {
644
1209
  pending_timeout: None,
645
1210
  },
@@ -658,6 +1223,7 @@ async fn handle_stopped(
658
1223
  }
659
1224
  // Destroyed early
660
1225
  runtime::SpawnActorOutput::Destroy => return Ok(StoppedResult::Destroy),
1226
+ runtime::SpawnActorOutput::MigrateToV2 => return Ok(StoppedResult::MigrateToV2),
661
1227
  }
662
1228
  }
663
1229
  // Handle rescheduling if not marked as sleeping
@@ -666,29 +1232,52 @@ async fn handle_stopped(
666
1232
  && matches!(
667
1233
  variant,
668
1234
  StoppedVariant::Normal {
669
- code: protocol::StopCode::Ok
1235
+ code: protocol::mk2::StopCode::Ok,
1236
+ ..
670
1237
  }
671
1238
  );
672
1239
 
673
1240
  match (input.crash_policy, graceful_exit) {
674
1241
  (CrashPolicy::Restart, false) => {
675
- match runtime::reschedule_actor(ctx, &input, state, AllocationOverride::None)
676
- .await?
1242
+ match runtime::reschedule_actor(
1243
+ ctx,
1244
+ &input,
1245
+ state,
1246
+ metrics_workflow_id,
1247
+ AllocationOverride::PendingTimeout {
1248
+ pending_timeout: RESTART_PENDING_TIMEOUT_MS,
1249
+ },
1250
+ )
1251
+ .await?
677
1252
  {
678
1253
  runtime::SpawnActorOutput::Allocated { .. } => {}
679
- // NOTE: Its not possible for `SpawnActorOutput::Sleep` to be returned here, the crash
680
- // policy is `Restart`.
681
- runtime::SpawnActorOutput::Sleep | runtime::SpawnActorOutput::Destroy => {
1254
+ runtime::SpawnActorOutput::Sleep => {
1255
+ tracing::debug!(actor_id=?input.actor_id, "actor sleeping due to failure to allocate");
1256
+
1257
+ state.sleeping = true;
1258
+
1259
+ ctx.v(2)
1260
+ .activity(runtime::SetSleepingInput {
1261
+ actor_id: input.actor_id,
1262
+ })
1263
+ .await?;
1264
+ }
1265
+ runtime::SpawnActorOutput::Destroy => {
682
1266
  // Destroyed early
683
1267
  return Ok(StoppedResult::Destroy);
684
1268
  }
1269
+ runtime::SpawnActorOutput::MigrateToV2 => {
1270
+ return Ok(StoppedResult::MigrateToV2);
1271
+ }
685
1272
  }
686
1273
  }
687
1274
  (CrashPolicy::Sleep, false) => {
688
- tracing::debug!(actor_id=?input.actor_id, "actor sleeping due to crash");
1275
+ tracing::debug!(actor_id=?input.actor_id, "actor sleeping due to ungraceful exit");
689
1276
 
690
1277
  state.sleeping = true;
691
1278
 
1279
+ ctx.removed::<Activity<runtime::SetFailureReason>>().await?;
1280
+
692
1281
  ctx.activity(runtime::SetSleepingInput {
693
1282
  actor_id: input.actor_id,
694
1283
  })
@@ -705,13 +1294,22 @@ async fn handle_stopped(
705
1294
  else if state.will_wake {
706
1295
  state.sleeping = false;
707
1296
 
708
- match runtime::reschedule_actor(ctx, &input, state, AllocationOverride::None).await? {
1297
+ match runtime::reschedule_actor(
1298
+ ctx,
1299
+ &input,
1300
+ state,
1301
+ metrics_workflow_id,
1302
+ AllocationOverride::None,
1303
+ )
1304
+ .await?
1305
+ {
709
1306
  runtime::SpawnActorOutput::Allocated { .. } => {}
710
1307
  runtime::SpawnActorOutput::Sleep => {
711
1308
  state.sleeping = true;
712
1309
  }
713
1310
  // Destroyed early
714
1311
  runtime::SpawnActorOutput::Destroy => return Ok(StoppedResult::Destroy),
1312
+ runtime::SpawnActorOutput::MigrateToV2 => return Ok(StoppedResult::MigrateToV2),
715
1313
  }
716
1314
  }
717
1315
 
@@ -719,13 +1317,23 @@ async fn handle_stopped(
719
1317
  state.going_away = false;
720
1318
 
721
1319
  ctx.msg(Stopped {})
722
- .tag("actor_id", input.actor_id)
1320
+ .topic(("actor_id", input.actor_id))
723
1321
  .send()
724
1322
  .await?;
725
1323
 
1324
+ ctx.removed::<Activity<runtime::CheckRunnersStub>>().await?;
1325
+
726
1326
  Ok(StoppedResult::Continue)
727
1327
  }
728
1328
 
1329
+ #[derive(Debug, Serialize, Deserialize, Hash)]
1330
+ struct GetTsInput {}
1331
+
1332
+ #[activity(GetTs)]
1333
+ async fn get_ts(ctx: &ActivityCtx, input: &GetTsInput) -> Result<i64> {
1334
+ Ok(util::timestamp::now())
1335
+ }
1336
+
729
1337
  #[message("pegboard_actor_create_complete")]
730
1338
  pub struct CreateComplete {}
731
1339
 
@@ -747,19 +1355,43 @@ pub struct Stopped {}
747
1355
  pub struct Allocate {
748
1356
  pub runner_id: Id,
749
1357
  pub runner_workflow_id: Id,
1358
+ #[serde(default)]
1359
+ pub runner_protocol_version: Option<u16>,
750
1360
  }
751
1361
 
1362
+ #[derive(Debug)]
752
1363
  #[signal("pegboard_actor_event")]
753
1364
  pub struct Event {
754
1365
  pub inner: protocol::Event,
755
1366
  }
756
1367
 
1368
+ #[derive(Debug)]
1369
+ #[signal("pegboard_actor_events")]
1370
+ pub struct Events {
1371
+ pub runner_id: Id,
1372
+ pub events: Vec<protocol::mk2::EventWrapper>,
1373
+ }
1374
+
757
1375
  #[signal("pegboard_actor_wake")]
758
1376
  pub struct Wake {
759
1377
  #[serde(default)]
760
1378
  pub allocation_override: AllocationOverride,
761
1379
  }
762
1380
 
1381
+ /// Reason why an actor was lost.
1382
+ #[derive(Debug, Clone, Serialize, Deserialize)]
1383
+ #[serde(rename_all = "snake_case")]
1384
+ pub enum LostReason {
1385
+ /// Runner did not respond with expected events (GC timeout).
1386
+ RunnerNoResponse,
1387
+ /// Runner is gracefully draining.
1388
+ RunnerDraining,
1389
+ /// Runner connection was lost (no recent ping, network issue, or crash).
1390
+ RunnerConnectionLost,
1391
+ /// Runner was draining but actor didn't stop in time.
1392
+ RunnerDrainingTimeout,
1393
+ }
1394
+
763
1395
  #[derive(Debug)]
764
1396
  #[signal("pegboard_actor_lost")]
765
1397
  pub struct Lost {
@@ -769,6 +1401,10 @@ pub struct Lost {
769
1401
  /// Resets the rescheduling retry count to 0.
770
1402
  #[serde(default)]
771
1403
  pub reset_rescheduling: bool,
1404
+ /// Why the actor was lost. If not provided, no failure reason is set
1405
+ /// (legacy signals before this field was added).
1406
+ #[serde(default)]
1407
+ pub reason: Option<LostReason>,
772
1408
  }
773
1409
 
774
1410
  #[derive(Debug)]
@@ -780,6 +1416,9 @@ pub struct GoingAway {
780
1416
  pub reset_rescheduling: bool,
781
1417
  }
782
1418
 
1419
+ #[message("pegboard_actor_migrated_to_v2")]
1420
+ pub struct MigratedToV2 {}
1421
+
783
1422
  #[signal("pegboard_actor_destroy")]
784
1423
  pub struct Destroy {}
785
1424
 
@@ -796,9 +1435,14 @@ join_signal!(PendingAllocation {
796
1435
  });
797
1436
 
798
1437
  join_signal!(Main {
799
- Event(Event),
1438
+ Event,
1439
+ Events,
800
1440
  Wake,
801
1441
  Lost,
802
1442
  GoingAway,
803
1443
  Destroy,
1444
+ // Comment to prevent invalid formatting
804
1445
  });
1446
+
1447
+ #[message("pegboard_bump_serverless_autoscaler")]
1448
+ pub(crate) struct BumpServerlessAutoscalerStub {}