@zlink-systems/framework 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/contracts/Channels/IZLinkFanoutClient.d.ts +0 -6
  3. package/dist/contracts/Common/CoreTypes.d.ts +6 -0
  4. package/dist/contracts/Common/CoreTypes.js +7 -0
  5. package/dist/contracts/Common/index.d.ts +1 -1
  6. package/dist/contracts/Common/index.js +0 -1
  7. package/dist/contracts/Configuration/InternalDefaults.d.ts +8 -0
  8. package/dist/contracts/Configuration/InternalDefaults.js +9 -1
  9. package/dist/contracts/Configuration/Registration.d.ts +13 -2
  10. package/dist/contracts/Configuration/Registration.js +58 -36
  11. package/dist/contracts/Configuration/RegistrationBuilderPolicy.d.ts +13 -1
  12. package/dist/contracts/Configuration/RegistrationBuilderPolicy.js +38 -1
  13. package/dist/contracts/Configuration/RegistrationBuilders.d.ts +2 -3
  14. package/dist/contracts/Configuration/RegistrationBuilders.js +27 -32
  15. package/dist/contracts/Configuration/RegistrationTypes.d.ts +1 -0
  16. package/dist/contracts/Configuration/RegistrationValidators.js +15 -12
  17. package/dist/contracts/Configuration/TimerRegistrationValidator.js +3 -2
  18. package/dist/contracts/Dispatch/ZLinkDispatchOptions.d.ts +1 -1
  19. package/dist/contracts/Handlers/JsonContract.js +10 -4
  20. package/dist/contracts/Locations/Authority.d.ts +1 -1
  21. package/dist/contracts/Locations/Authority.js +3 -2
  22. package/dist/contracts/Locations/Options.js +1 -1
  23. package/dist/contracts/Locations/Stores.d.ts +12 -0
  24. package/dist/contracts/Locations/Stores.js +9 -0
  25. package/dist/contracts/RouteMesh/RuntimeTopology.d.ts +8 -0
  26. package/dist/contracts/Spots/Contracts.d.ts +1 -1
  27. package/dist/internal.d.ts +5 -0
  28. package/dist/internal.js +16 -1
  29. package/dist/nest-integration.d.ts +4 -2
  30. package/dist/nest-integration.js +14 -4
  31. package/dist/runtime/abort.d.ts +1 -0
  32. package/dist/runtime/abort.js +8 -5
  33. package/dist/runtime/activation-admission.d.ts +28 -0
  34. package/dist/runtime/activation-admission.js +57 -0
  35. package/dist/runtime/actors/actor-authority-payload-codec.d.ts +1 -2
  36. package/dist/runtime/actors/actor-authority-payload-codec.js +34 -18
  37. package/dist/runtime/actors/actor-client.d.ts +2 -2
  38. package/dist/runtime/actors/actor-client.js +42 -143
  39. package/dist/runtime/actors/actor-context.d.ts +3 -5
  40. package/dist/runtime/actors/actor-context.js +19 -17
  41. package/dist/runtime/actors/actor-handoff.d.ts +13 -7
  42. package/dist/runtime/actors/actor-handoff.js +36 -25
  43. package/dist/runtime/actors/actor-lifecycle-snapshot.js +2 -1
  44. package/dist/runtime/actors/actor-local-native-join.d.ts +11 -6
  45. package/dist/runtime/actors/actor-local-native-join.js +85 -123
  46. package/dist/runtime/actors/actor-native-lookup.js +2 -8
  47. package/dist/runtime/actors/actor-packet-relay-wire.d.ts +3 -3
  48. package/dist/runtime/actors/actor-packet-relay-wire.js +5 -3
  49. package/dist/runtime/actors/actor-remote-joiner.d.ts +3 -3
  50. package/dist/runtime/actors/actor-remote-joiner.js +11 -17
  51. package/dist/runtime/actors/actor-remote-wire.js +5 -3
  52. package/dist/runtime/actors/actor-request-deadline.d.ts +3 -0
  53. package/dist/runtime/actors/actor-request-deadline.js +31 -0
  54. package/dist/runtime/actors/actor-retry-delay.js +2 -1
  55. package/dist/runtime/actors/actor-runtime-contracts.d.ts +4 -2
  56. package/dist/runtime/actors/actor-runtime-state.d.ts +9 -21
  57. package/dist/runtime/actors/actor-runtime-state.js +70 -187
  58. package/dist/runtime/actors/actor-source-transfer.d.ts +5 -5
  59. package/dist/runtime/actors/bound-session-wire.js +2 -7
  60. package/dist/runtime/actors/deferred-join-completion.d.ts +19 -0
  61. package/dist/runtime/actors/deferred-join-completion.js +21 -0
  62. package/dist/runtime/actors/index.d.ts +10 -8
  63. package/dist/runtime/actors/index.js +101 -73
  64. package/dist/runtime/actors/spot-actor-dispatch.d.ts +3 -3
  65. package/dist/runtime/actors/spot-actor-dispatch.js +25 -10
  66. package/dist/runtime/actors/transferred-actor-rollback.d.ts +3 -5
  67. package/dist/runtime/actors/transferred-actor-rollback.js +9 -42
  68. package/dist/runtime/admission.d.ts +7 -1
  69. package/dist/runtime/admission.js +11 -1
  70. package/dist/runtime/application-jobs/application-job-queue-scope.d.ts +1 -1
  71. package/dist/runtime/application-jobs/application-job-queue-scope.js +1 -1
  72. package/dist/runtime/backend/contracts/index.d.ts +8 -33
  73. package/dist/runtime/backend/mesh-actor-session-node-adapter.js +3 -26
  74. package/dist/runtime/backend/mesh-dispatch-pump.d.ts +1 -2
  75. package/dist/runtime/backend/mesh-dispatch-pump.js +95 -107
  76. package/dist/runtime/backend/node/node-backend-adapter-factory.d.ts +1 -2
  77. package/dist/runtime/backend/node/node-backend-adapter-factory.js +4 -18
  78. package/dist/runtime/backend/node/node-backend-adapter-support.d.ts +7 -4
  79. package/dist/runtime/backend/node/node-backend-adapter-support.js +28 -34
  80. package/dist/runtime/backend/node/node-event-loop-poller.d.ts +2 -2
  81. package/dist/runtime/backend/node/node-event-loop-poller.js +11 -6
  82. package/dist/runtime/backend/node/node-monitor-backend-adapter.js +1 -0
  83. package/dist/runtime/backend/node/node-raw-binding-port.d.ts +1 -1
  84. package/dist/runtime/backend/node/node-raw-binding-port.js +51 -19
  85. package/dist/runtime/backend/node/node-raw-mesh-backend.d.ts +21 -19
  86. package/dist/runtime/backend/node/node-raw-mesh-backend.js +171 -111
  87. package/dist/runtime/backend/node/node-socket-backend-adapter.js +4 -3
  88. package/dist/runtime/backend/raw-binding-port.d.ts +13 -1
  89. package/dist/runtime/backend/runtime-values.d.ts +4 -1
  90. package/dist/runtime/backend/runtime-values.js +2 -0
  91. package/dist/runtime/channels/channel-clients.d.ts +20 -9
  92. package/dist/runtime/channels/channel-clients.js +68 -60
  93. package/dist/runtime/channels/channel-envelope-inspection.js +2 -1
  94. package/dist/runtime/channels/channel-envelope.js +47 -29
  95. package/dist/runtime/channels/channel-outbound-operations.d.ts +3 -0
  96. package/dist/runtime/channels/channel-outbound-operations.js +9 -18
  97. package/dist/runtime/channels/channel-receive-loops.d.ts +8 -3
  98. package/dist/runtime/channels/channel-receive-loops.js +27 -6
  99. package/dist/runtime/channels/channel-runtime-lifecycle.d.ts +12 -1
  100. package/dist/runtime/channels/channel-runtime-lifecycle.js +48 -28
  101. package/dist/runtime/channels/channel-runtime-manager.d.ts +2 -5
  102. package/dist/runtime/channels/channel-runtime-manager.js +4 -12
  103. package/dist/runtime/channels/channel-socket-options.js +3 -2
  104. package/dist/runtime/channels/channel-socket-registry.d.ts +30 -32
  105. package/dist/runtime/channels/channel-socket-registry.js +296 -235
  106. package/dist/runtime/channels/channel-transports.d.ts +11 -20
  107. package/dist/runtime/channels/channel-transports.js +68 -47
  108. package/dist/runtime/channels/client-server-location-runtime.d.ts +1 -1
  109. package/dist/runtime/channels/client-server-location-runtime.js +10 -11
  110. package/dist/runtime/channels/client-server-service-wire.d.ts +7 -2
  111. package/dist/runtime/channels/client-server-service-wire.js +32 -11
  112. package/dist/runtime/channels/dispatch-error-reporter.d.ts +1 -2
  113. package/dist/runtime/channels/dispatch-error-reporter.js +2 -1
  114. package/dist/runtime/channels/fanout-location-runtime.d.ts +16 -3
  115. package/dist/runtime/channels/fanout-location-runtime.js +133 -81
  116. package/dist/runtime/channels/spot-direct-envelope.d.ts +1 -0
  117. package/dist/runtime/channels/spot-direct-envelope.js +4 -3
  118. package/dist/runtime/channels/spot-node-route-transport.js +3 -2
  119. package/dist/runtime/diagnostics/diagnostic-text.d.ts +2 -0
  120. package/dist/runtime/diagnostics/diagnostic-text.js +7 -0
  121. package/dist/runtime/diagnostics/dispatch-error-details.d.ts +3 -0
  122. package/dist/runtime/diagnostics/dispatch-error-details.js +30 -2
  123. package/dist/runtime/diagnostics/flow-context.d.ts +6 -0
  124. package/dist/runtime/diagnostics/flow-context.js +16 -2
  125. package/dist/runtime/diagnostics/index.d.ts +4 -2
  126. package/dist/runtime/diagnostics/index.js +14 -4
  127. package/dist/runtime/diagnostics/message-flow.d.ts +1 -1
  128. package/dist/runtime/diagnostics/message-flow.js +10 -19
  129. package/dist/runtime/diagnostics/runtime-metrics.d.ts +94 -31
  130. package/dist/runtime/diagnostics/runtime-metrics.js +168 -105
  131. package/dist/runtime/diagnostics/runtime-observation-queue.js +3 -2
  132. package/dist/runtime/diagnostics/topology-runtime-projections.d.ts +2 -4
  133. package/dist/runtime/diagnostics/topology-runtime-projections.js +135 -154
  134. package/dist/runtime/disposal.d.ts +5 -0
  135. package/dist/runtime/disposal.js +22 -0
  136. package/dist/runtime/execution/index.d.ts +22 -9
  137. package/dist/runtime/execution/index.js +107 -37
  138. package/dist/runtime/execution/serial-execution-queue.d.ts +12 -7
  139. package/dist/runtime/execution/serial-execution-queue.js +99 -26
  140. package/dist/runtime/execution/state-lane.d.ts +8 -1
  141. package/dist/runtime/execution/state-lane.js +118 -3
  142. package/dist/runtime/foundation/actor-join-recovery-codec.d.ts +3 -0
  143. package/dist/runtime/foundation/actor-join-recovery-codec.js +15 -11
  144. package/dist/runtime/foundation/event-loop-resources.d.ts +2 -24
  145. package/dist/runtime/foundation/event-loop-resources.js +6 -119
  146. package/dist/runtime/foundation/listener-records.d.ts +11 -0
  147. package/dist/runtime/foundation/listener-records.js +20 -0
  148. package/dist/runtime/foundation/operation-identity.d.ts +2 -0
  149. package/dist/runtime/foundation/operation-identity.js +9 -5
  150. package/dist/runtime/foundation/operation-registry.d.ts +5 -7
  151. package/dist/runtime/foundation/operation-registry.js +34 -44
  152. package/dist/runtime/foundation/raw-service-mesh-runtime.d.ts +18 -26
  153. package/dist/runtime/foundation/raw-service-mesh-runtime.js +122 -469
  154. package/dist/runtime/foundation/runtime-state-projections.d.ts +3 -1
  155. package/dist/runtime/foundation/runtime-state-projections.js +8 -0
  156. package/dist/runtime/foundation/service-authority-payload-codec.d.ts +1 -0
  157. package/dist/runtime/foundation/service-authority-payload-codec.js +30 -12
  158. package/dist/runtime/foundation/service-discovery-registry.d.ts +4 -0
  159. package/dist/runtime/foundation/service-discovery-registry.js +22 -3
  160. package/dist/runtime/foundation/service-instance-activation-recovery-codec.js +8 -4
  161. package/dist/runtime/foundation/service-liveness-registry.js +2 -1
  162. package/dist/runtime/foundation/service-maintenance-runtime.d.ts +0 -1
  163. package/dist/runtime/foundation/service-maintenance-runtime.js +23 -8
  164. package/dist/runtime/foundation/service-metadata-codec.js +3 -3
  165. package/dist/runtime/foundation/service-relocation-aggregate-committer.d.ts +2 -5
  166. package/dist/runtime/foundation/service-relocation-aggregate-committer.js +1 -48
  167. package/dist/runtime/foundation/service-relocation-coordinator.d.ts +9 -0
  168. package/dist/runtime/foundation/service-relocation-coordinator.js +14 -1
  169. package/dist/runtime/foundation/service-relocation-object-owner.d.ts +8 -0
  170. package/dist/runtime/foundation/service-relocation-object-owner.js +19 -6
  171. package/dist/runtime/foundation/service-relocation-runtime.js +43 -32
  172. package/dist/runtime/foundation/service-runtime-contracts.d.ts +40 -8
  173. package/dist/runtime/foundation/service-runtime-contracts.js +25 -1
  174. package/dist/runtime/foundation/service-session-binding-ingress-port.d.ts +0 -19
  175. package/dist/runtime/foundation/service-stateful-registry.d.ts +2 -0
  176. package/dist/runtime/foundation/service-stateful-registry.js +10 -2
  177. package/dist/runtime/foundation/service-stateful-runtime.d.ts +28 -24
  178. package/dist/runtime/foundation/service-stateful-runtime.js +297 -244
  179. package/dist/runtime/foundation/service-stateful-wire-codec.d.ts +12 -7
  180. package/dist/runtime/foundation/service-stateful-wire-codec.js +240 -143
  181. package/dist/runtime/foundation/service-topology-registry.d.ts +1 -3
  182. package/dist/runtime/foundation/service-topology-registry.js +22 -61
  183. package/dist/runtime/foundation/service-wire-binary-primitives.d.ts +5 -0
  184. package/dist/runtime/foundation/service-wire-binary-primitives.js +6 -0
  185. package/dist/runtime/foundation/service-wire-codec.js +10 -8
  186. package/dist/runtime/foundation/service-wire-constants.generated.d.ts +1 -0
  187. package/dist/runtime/foundation/service-wire-constants.generated.js +2 -1
  188. package/dist/runtime/foundation/service-wire-m6a-codec.d.ts +2 -0
  189. package/dist/runtime/foundation/service-wire-m6a-codec.js +23 -13
  190. package/dist/runtime/framework-errors-internal.d.ts +2 -1
  191. package/dist/runtime/framework-errors-internal.js +343 -122
  192. package/dist/runtime/handlers/handler-instance-scope.d.ts +3 -1
  193. package/dist/runtime/handlers/handler-instance-scope.js +61 -74
  194. package/dist/runtime/host/actor-packet-relay.d.ts +9 -6
  195. package/dist/runtime/host/actor-packet-relay.js +48 -91
  196. package/dist/runtime/host/actor-placement-coordinator.js +7 -5
  197. package/dist/runtime/host/actor-runtime-options-factory.d.ts +2 -0
  198. package/dist/runtime/host/actor-runtime-options-factory.js +17 -4
  199. package/dist/runtime/host/actor-transfer-runtime.d.ts +28 -28
  200. package/dist/runtime/host/actor-transfer-runtime.js +210 -256
  201. package/dist/runtime/host/application-job-queue.js +16 -33
  202. package/dist/runtime/host/bound-session-relay.js +1 -1
  203. package/dist/runtime/host/channel-runtime-options-factory.js +1 -1
  204. package/dist/runtime/host/index.d.ts +19 -14
  205. package/dist/runtime/host/index.js +234 -175
  206. package/dist/runtime/host/instance-activation-authority.d.ts +2 -3
  207. package/dist/runtime/host/instance-activation-authority.js +17 -45
  208. package/dist/runtime/host/location-runtime-owner.d.ts +1 -1
  209. package/dist/runtime/host/location-runtime-owner.js +2 -2
  210. package/dist/runtime/host/remote-actor-join-receiver.d.ts +2 -2
  211. package/dist/runtime/host/remote-actor-join-receiver.js +1 -14
  212. package/dist/runtime/host/remote-actor-packet-target-store.d.ts +3 -2
  213. package/dist/runtime/host/remote-actor-packet-target-store.js +8 -47
  214. package/dist/runtime/host/remote-bound-session-relay.d.ts +2 -3
  215. package/dist/runtime/host/remote-bound-session-relay.js +11 -23
  216. package/dist/runtime/host/route-mesh-runtime.d.ts +14 -10
  217. package/dist/runtime/host/route-mesh-runtime.js +178 -257
  218. package/dist/runtime/host/runtime-shutdown.d.ts +2 -0
  219. package/dist/runtime/host/runtime-shutdown.js +18 -21
  220. package/dist/runtime/host/service-relocation-control.js +6 -1
  221. package/dist/runtime/host/service-relocation-host-runtime.d.ts +71 -38
  222. package/dist/runtime/host/service-relocation-host-runtime.js +816 -651
  223. package/dist/runtime/host/spot-address-transport.d.ts +2 -3
  224. package/dist/runtime/host/spot-address-transport.js +34 -136
  225. package/dist/runtime/host/spot-node-runtime-options-factory.d.ts +1 -1
  226. package/dist/runtime/host/spot-node-runtime-options-factory.js +3 -2
  227. package/dist/runtime/host/spot-runtime-options-factory.d.ts +4 -7
  228. package/dist/runtime/host/spot-runtime-options-factory.js +53 -21
  229. package/dist/runtime/host/stateful-authority-route-runtime.js +6 -2
  230. package/dist/runtime/host/user-spot-creation-coordinator.d.ts +14 -6
  231. package/dist/runtime/host/user-spot-creation-coordinator.js +96 -95
  232. package/dist/runtime/locations/aggregate-inventory-store.js +13 -10
  233. package/dist/runtime/locations/authority-key-codec.js +4 -3
  234. package/dist/runtime/locations/auto-connect-reconciler.d.ts +4 -0
  235. package/dist/runtime/locations/auto-connect-reconciler.js +37 -25
  236. package/dist/runtime/locations/creation-operation-id.js +6 -4
  237. package/dist/runtime/locations/domain-store-contract.d.ts +3 -3
  238. package/dist/runtime/locations/in-memory-authority-store.js +31 -15
  239. package/dist/runtime/locations/in-memory-location-store.d.ts +2 -2
  240. package/dist/runtime/locations/in-memory-location-store.js +17 -14
  241. package/dist/runtime/locations/in-memory-provider-location-store.d.ts +1 -0
  242. package/dist/runtime/locations/in-memory-provider-location-store.js +79 -27
  243. package/dist/runtime/locations/key-codec.js +3 -2
  244. package/dist/runtime/locations/lease-tracker.d.ts +3 -5
  245. package/dist/runtime/locations/lease-tracker.js +7 -11
  246. package/dist/runtime/locations/lifecycle.d.ts +5 -10
  247. package/dist/runtime/locations/lifecycle.js +4 -33
  248. package/dist/runtime/locations/location-store-failure.d.ts +2 -0
  249. package/dist/runtime/locations/location-store-failure.js +7 -0
  250. package/dist/runtime/locations/location-store-pages.d.ts +3 -0
  251. package/dist/runtime/locations/location-store-pages.js +13 -0
  252. package/dist/runtime/locations/location-store-repository.d.ts +5 -7
  253. package/dist/runtime/locations/location-store-repository.js +303 -332
  254. package/dist/runtime/locations/relocation-blob.js +18 -5
  255. package/dist/runtime/locations/resolvers.d.ts +5 -5
  256. package/dist/runtime/locations/resolvers.js +44 -30
  257. package/dist/runtime/locations/runtime.d.ts +5 -4
  258. package/dist/runtime/locations/runtime.js +123 -92
  259. package/dist/runtime/locations/spot-location-claims.d.ts +8 -2
  260. package/dist/runtime/locations/spot-location-claims.js +40 -23
  261. package/dist/runtime/messaging/payload-codec.js +26 -20
  262. package/dist/runtime/messaging/submission-result.d.ts +3 -0
  263. package/dist/runtime/messaging/submission-result.js +48 -0
  264. package/dist/runtime/protocol/service_wire_codec.generated.d.ts +2 -0
  265. package/dist/runtime/protocol/service_wire_codec.generated.js +17 -8
  266. package/dist/runtime/protocol/service_wire_pilot_codec.generated.d.ts +1 -0
  267. package/dist/runtime/protocol/service_wire_pilot_codec.generated.js +3 -2
  268. package/dist/runtime/spots/formal-remote-actor-admission-registry.d.ts +3 -3
  269. package/dist/runtime/spots/formal-remote-actor-admission-registry.js +4 -4
  270. package/dist/runtime/spots/formal-remote-actor-transfer-registry.d.ts +6 -3
  271. package/dist/runtime/spots/index.d.ts +29 -29
  272. package/dist/runtime/spots/index.js +441 -313
  273. package/dist/runtime/spots/spot-activation-registry.d.ts +4 -4
  274. package/dist/runtime/spots/spot-activation-registry.js +27 -60
  275. package/dist/runtime/spots/spot-activation-state.d.ts +2 -11
  276. package/dist/runtime/spots/spot-activation-state.js +4 -17
  277. package/dist/runtime/spots/spot-activation.d.ts +10 -9
  278. package/dist/runtime/spots/spot-activation.js +103 -81
  279. package/dist/runtime/spots/spot-actor-admission-coordinator.d.ts +1 -2
  280. package/dist/runtime/spots/spot-actor-admission-coordinator.js +3 -40
  281. package/dist/runtime/spots/spot-actor-join-dispatch.d.ts +10 -18
  282. package/dist/runtime/spots/spot-actor-join-dispatch.js +5 -55
  283. package/dist/runtime/spots/spot-actor-lifecycle-drain.js +2 -2
  284. package/dist/runtime/spots/spot-actor-membership.d.ts +7 -5
  285. package/dist/runtime/spots/spot-actor-membership.js +44 -53
  286. package/dist/runtime/spots/spot-actor-packet-dispatch.d.ts +0 -1
  287. package/dist/runtime/spots/spot-actor-packet-dispatch.js +0 -9
  288. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.d.ts +2 -2
  289. package/dist/runtime/spots/spot-actor-packet-relay-dispatch.js +1 -7
  290. package/dist/runtime/spots/spot-context.d.ts +2 -2
  291. package/dist/runtime/spots/spot-entry-activation.d.ts +3 -4
  292. package/dist/runtime/spots/spot-entry-activation.js +9 -21
  293. package/dist/runtime/spots/spot-lifecycle-metrics.js +3 -2
  294. package/dist/runtime/spots/spot-manager-public.d.ts +5 -6
  295. package/dist/runtime/spots/spot-manager-public.js +6 -5
  296. package/dist/runtime/spots/spot-node-autoconnect.js +22 -31
  297. package/dist/runtime/spots/spot-node-runtime-manager.d.ts +22 -21
  298. package/dist/runtime/spots/spot-node-runtime-manager.js +73 -82
  299. package/dist/runtime/spots/spot-outbound.d.ts +4 -3
  300. package/dist/runtime/spots/spot-outbound.js +10 -37
  301. package/dist/runtime/spots/spot-remote-codec.js +5 -3
  302. package/dist/runtime/spots/spot-route-packet-dispatch.d.ts +2 -2
  303. package/dist/runtime/spots/spot-route-packet-dispatch.js +8 -8
  304. package/dist/runtime/spots/spot-route-replies.d.ts +2 -2
  305. package/dist/runtime/spots/spot-route-replies.js +3 -1
  306. package/dist/runtime/spots/spot-routed-actor-admission.d.ts +3 -2
  307. package/dist/runtime/spots/spot-routed-actor-admission.js +3 -2
  308. package/dist/runtime/spots/spot-routed-frame-dispatch.d.ts +2 -7
  309. package/dist/runtime/spots/spot-routed-frame-dispatch.js +1 -70
  310. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.d.ts +4 -0
  311. package/dist/runtime/spots/spot-routed-spot-packet-dispatch.js +65 -15
  312. package/dist/runtime/spots/spot-runtime-ports.d.ts +4 -20
  313. package/dist/runtime/spots/spot-serial-executor.d.ts +5 -0
  314. package/dist/runtime/spots/spot-serial-executor.js +9 -2
  315. package/dist/runtime/spots/spot-serial-turn-executor.d.ts +29 -6
  316. package/dist/runtime/spots/spot-serial-turn-executor.js +89 -13
  317. package/dist/runtime/spots/spot-timer.d.ts +3 -2
  318. package/dist/runtime/streams/actor-session-binding-registry.d.ts +17 -32
  319. package/dist/runtime/streams/actor-session-binding-registry.js +145 -367
  320. package/dist/runtime/streams/actor-session-binding-runtime-owner.d.ts +2 -6
  321. package/dist/runtime/streams/bound-actor-relay-sender.d.ts +6 -2
  322. package/dist/runtime/streams/bound-actor-relay-sender.js +57 -33
  323. package/dist/runtime/streams/bound-session-service.d.ts +7 -0
  324. package/dist/runtime/streams/bound-session-service.js +12 -19
  325. package/dist/runtime/streams/index.d.ts +15 -14
  326. package/dist/runtime/streams/index.js +38 -39
  327. package/dist/runtime/streams/managed-stream.d.ts +3 -0
  328. package/dist/runtime/streams/managed-stream.js +17 -8
  329. package/dist/runtime/streams/native-fallback-bound-session.js +1 -3
  330. package/dist/runtime/streams/protocol.d.ts +6 -33
  331. package/dist/runtime/streams/protocol.js +38 -110
  332. package/dist/runtime/streams/session-actor-coordinator.d.ts +2 -3
  333. package/dist/runtime/streams/session-actor-coordinator.js +12 -4
  334. package/dist/runtime/streams/session-calls.d.ts +1 -1
  335. package/dist/runtime/streams/session-calls.js +5 -4
  336. package/dist/runtime/streams/session-context.d.ts +6 -6
  337. package/dist/runtime/streams/session-context.js +22 -4
  338. package/dist/runtime/streams/session-requests.js +2 -1
  339. package/dist/runtime/streams/session-serial-executor.js +2 -2
  340. package/dist/runtime/streams/stream-binding-runtime-ports.d.ts +16 -1
  341. package/dist/runtime/streams/stream-frame-factory.js +2 -2
  342. package/dist/runtime/streams/stream-session-runtime.d.ts +10 -11
  343. package/dist/runtime/streams/stream-session-runtime.js +25 -33
  344. package/dist/runtime/workers/index.d.ts +2 -2
  345. package/dist/runtime/workers/index.js +5 -4
  346. package/package.json +3 -3
  347. package/src/contracts/Channels/IZLinkFanoutClient.ts +0 -7
  348. package/src/contracts/Common/CoreTypes.ts +7 -0
  349. package/src/contracts/Common/index.ts +1 -1
  350. package/src/contracts/Configuration/InternalDefaults.ts +12 -0
  351. package/src/contracts/Configuration/Registration.ts +92 -48
  352. package/src/contracts/Configuration/RegistrationBuilderPolicy.ts +44 -2
  353. package/src/contracts/Configuration/RegistrationBuilders.ts +77 -68
  354. package/src/contracts/Configuration/RegistrationTypes.ts +1 -0
  355. package/src/contracts/Configuration/RegistrationValidators.ts +19 -13
  356. package/src/contracts/Configuration/TimerRegistrationValidator.ts +4 -2
  357. package/src/contracts/Dispatch/ZLinkDispatchOptions.ts +1 -0
  358. package/src/contracts/Handlers/JsonContract.ts +14 -4
  359. package/src/contracts/Locations/Authority.ts +7 -3
  360. package/src/contracts/Locations/Options.ts +1 -1
  361. package/src/contracts/Locations/Stores.ts +14 -0
  362. package/src/contracts/RouteMesh/RuntimeTopology.ts +10 -0
  363. package/src/contracts/Spots/Contracts.ts +1 -1
  364. package/src/internal.ts +15 -0
  365. package/src/nest-integration.ts +28 -10
  366. package/src/runtime/abort.ts +6 -5
  367. package/src/runtime/activation-admission.ts +72 -0
  368. package/src/runtime/actors/actor-authority-payload-codec.ts +58 -20
  369. package/src/runtime/actors/actor-client.ts +77 -204
  370. package/src/runtime/actors/actor-context.ts +45 -39
  371. package/src/runtime/actors/actor-handoff.ts +55 -45
  372. package/src/runtime/actors/actor-lifecycle-snapshot.ts +2 -1
  373. package/src/runtime/actors/actor-local-native-join.ts +174 -215
  374. package/src/runtime/actors/actor-native-lookup.ts +2 -9
  375. package/src/runtime/actors/actor-packet-relay-wire.ts +18 -12
  376. package/src/runtime/actors/actor-remote-joiner.ts +15 -36
  377. package/src/runtime/actors/actor-remote-wire.ts +5 -3
  378. package/src/runtime/actors/actor-request-deadline.ts +49 -0
  379. package/src/runtime/actors/actor-retry-delay.ts +2 -1
  380. package/src/runtime/actors/actor-runtime-contracts.ts +4 -10
  381. package/src/runtime/actors/actor-runtime-state.ts +85 -247
  382. package/src/runtime/actors/actor-source-transfer.ts +5 -18
  383. package/src/runtime/actors/bound-session-wire.ts +2 -8
  384. package/src/runtime/actors/deferred-join-completion.ts +44 -0
  385. package/src/runtime/actors/index.ts +122 -88
  386. package/src/runtime/actors/spot-actor-dispatch.ts +60 -29
  387. package/src/runtime/actors/transferred-actor-rollback.ts +11 -62
  388. package/src/runtime/admission.ts +13 -2
  389. package/src/runtime/application-jobs/application-job-queue-scope.ts +4 -4
  390. package/src/runtime/backend/contracts/index.ts +15 -42
  391. package/src/runtime/backend/mesh-actor-session-node-adapter.ts +4 -28
  392. package/src/runtime/backend/mesh-dispatch-pump.ts +111 -117
  393. package/src/runtime/backend/node/node-backend-adapter-factory.ts +5 -25
  394. package/src/runtime/backend/node/node-backend-adapter-support.ts +32 -35
  395. package/src/runtime/backend/node/node-event-loop-poller.ts +16 -8
  396. package/src/runtime/backend/node/node-monitor-backend-adapter.ts +1 -0
  397. package/src/runtime/backend/node/node-raw-binding-port.ts +58 -23
  398. package/src/runtime/backend/node/node-raw-mesh-backend.ts +252 -162
  399. package/src/runtime/backend/node/node-socket-backend-adapter.ts +5 -4
  400. package/src/runtime/backend/raw-binding-port.ts +14 -1
  401. package/src/runtime/backend/runtime-values.ts +4 -1
  402. package/src/runtime/channels/channel-clients.ts +132 -96
  403. package/src/runtime/channels/channel-envelope-inspection.ts +2 -1
  404. package/src/runtime/channels/channel-envelope.ts +58 -29
  405. package/src/runtime/channels/channel-outbound-operations.ts +10 -31
  406. package/src/runtime/channels/channel-receive-loops.ts +39 -7
  407. package/src/runtime/channels/channel-runtime-lifecycle.ts +60 -27
  408. package/src/runtime/channels/channel-runtime-manager.ts +8 -15
  409. package/src/runtime/channels/channel-socket-options.ts +8 -2
  410. package/src/runtime/channels/channel-socket-registry.ts +369 -262
  411. package/src/runtime/channels/channel-transports.ts +161 -115
  412. package/src/runtime/channels/client-server-location-runtime.ts +17 -17
  413. package/src/runtime/channels/client-server-service-wire.ts +40 -12
  414. package/src/runtime/channels/dispatch-error-reporter.ts +7 -5
  415. package/src/runtime/channels/fanout-location-runtime.ts +175 -106
  416. package/src/runtime/channels/spot-direct-envelope.ts +1 -1
  417. package/src/runtime/channels/spot-node-route-transport.ts +5 -2
  418. package/src/runtime/diagnostics/diagnostic-text.ts +4 -0
  419. package/src/runtime/diagnostics/dispatch-error-details.ts +36 -1
  420. package/src/runtime/diagnostics/flow-context.ts +16 -2
  421. package/src/runtime/diagnostics/index.ts +27 -17
  422. package/src/runtime/diagnostics/message-flow.ts +15 -25
  423. package/src/runtime/diagnostics/runtime-metrics.ts +181 -113
  424. package/src/runtime/diagnostics/runtime-observation-queue.ts +3 -2
  425. package/src/runtime/diagnostics/topology-runtime-projections.ts +194 -162
  426. package/src/runtime/disposal.ts +19 -0
  427. package/src/runtime/execution/index.ts +116 -38
  428. package/src/runtime/execution/serial-execution-queue.ts +179 -34
  429. package/src/runtime/execution/state-lane.ts +142 -4
  430. package/src/runtime/foundation/actor-join-recovery-codec.ts +13 -8
  431. package/src/runtime/foundation/event-loop-resources.ts +5 -122
  432. package/src/runtime/foundation/listener-records.ts +21 -0
  433. package/src/runtime/foundation/operation-identity.ts +11 -5
  434. package/src/runtime/foundation/operation-registry.ts +33 -50
  435. package/src/runtime/foundation/raw-service-mesh-runtime.ts +170 -571
  436. package/src/runtime/foundation/runtime-state-projections.ts +9 -1
  437. package/src/runtime/foundation/service-authority-payload-codec.ts +41 -13
  438. package/src/runtime/foundation/service-discovery-registry.ts +32 -3
  439. package/src/runtime/foundation/service-instance-activation-recovery-codec.ts +12 -4
  440. package/src/runtime/foundation/service-liveness-registry.ts +2 -1
  441. package/src/runtime/foundation/service-maintenance-runtime.ts +30 -19
  442. package/src/runtime/foundation/service-metadata-codec.ts +2 -2
  443. package/src/runtime/foundation/service-relocation-aggregate-committer.ts +3 -66
  444. package/src/runtime/foundation/service-relocation-coordinator.ts +13 -0
  445. package/src/runtime/foundation/service-relocation-object-owner.ts +23 -7
  446. package/src/runtime/foundation/service-relocation-runtime.ts +57 -35
  447. package/src/runtime/foundation/service-runtime-contracts.ts +46 -10
  448. package/src/runtime/foundation/service-session-binding-ingress-port.ts +0 -25
  449. package/src/runtime/foundation/service-stateful-registry.ts +14 -2
  450. package/src/runtime/foundation/service-stateful-runtime.ts +435 -327
  451. package/src/runtime/foundation/service-stateful-wire-codec.ts +329 -199
  452. package/src/runtime/foundation/service-topology-registry.ts +30 -79
  453. package/src/runtime/foundation/service-wire-binary-primitives.ts +6 -0
  454. package/src/runtime/foundation/service-wire-codec.ts +15 -8
  455. package/src/runtime/foundation/service-wire-constants.generated.ts +1 -0
  456. package/src/runtime/foundation/service-wire-m6a-codec.ts +29 -15
  457. package/src/runtime/framework-errors-internal.ts +380 -134
  458. package/src/runtime/handlers/handler-instance-scope.ts +68 -95
  459. package/src/runtime/host/actor-packet-relay.ts +57 -147
  460. package/src/runtime/host/actor-placement-coordinator.ts +8 -5
  461. package/src/runtime/host/actor-runtime-options-factory.ts +27 -8
  462. package/src/runtime/host/actor-transfer-runtime.ts +266 -418
  463. package/src/runtime/host/application-job-queue.ts +28 -34
  464. package/src/runtime/host/bound-session-relay.ts +1 -2
  465. package/src/runtime/host/channel-runtime-options-factory.ts +1 -2
  466. package/src/runtime/host/index.ts +408 -312
  467. package/src/runtime/host/instance-activation-authority.ts +89 -109
  468. package/src/runtime/host/location-runtime-owner.ts +4 -2
  469. package/src/runtime/host/remote-actor-join-receiver.ts +3 -31
  470. package/src/runtime/host/remote-actor-packet-target-store.ts +17 -58
  471. package/src/runtime/host/remote-bound-session-relay.ts +12 -44
  472. package/src/runtime/host/route-mesh-runtime.ts +236 -275
  473. package/src/runtime/host/runtime-shutdown.ts +17 -21
  474. package/src/runtime/host/service-relocation-control.ts +14 -1
  475. package/src/runtime/host/service-relocation-host-runtime.ts +1161 -904
  476. package/src/runtime/host/spot-address-transport.ts +73 -195
  477. package/src/runtime/host/spot-node-runtime-options-factory.ts +6 -3
  478. package/src/runtime/host/spot-runtime-options-factory.ts +92 -30
  479. package/src/runtime/host/stateful-authority-route-runtime.ts +8 -4
  480. package/src/runtime/host/user-spot-creation-coordinator.ts +182 -163
  481. package/src/runtime/locations/aggregate-inventory-store.ts +16 -13
  482. package/src/runtime/locations/authority-key-codec.ts +7 -3
  483. package/src/runtime/locations/auto-connect-reconciler.ts +39 -26
  484. package/src/runtime/locations/creation-operation-id.ts +6 -3
  485. package/src/runtime/locations/domain-store-contract.ts +12 -3
  486. package/src/runtime/locations/in-memory-authority-store.ts +44 -15
  487. package/src/runtime/locations/in-memory-location-store.ts +50 -39
  488. package/src/runtime/locations/in-memory-provider-location-store.ts +110 -31
  489. package/src/runtime/locations/key-codec.ts +3 -2
  490. package/src/runtime/locations/lease-tracker.ts +8 -14
  491. package/src/runtime/locations/lifecycle.ts +16 -45
  492. package/src/runtime/locations/location-store-failure.ts +4 -0
  493. package/src/runtime/locations/location-store-pages.ts +18 -0
  494. package/src/runtime/locations/location-store-repository.ts +450 -478
  495. package/src/runtime/locations/relocation-blob.ts +17 -6
  496. package/src/runtime/locations/resolvers.ts +90 -58
  497. package/src/runtime/locations/runtime.ts +220 -110
  498. package/src/runtime/locations/spot-location-claims.ts +54 -26
  499. package/src/runtime/messaging/payload-codec.ts +35 -24
  500. package/src/runtime/messaging/submission-result.ts +57 -1
  501. package/src/runtime/protocol/service_wire_codec.generated.ts +27 -10
  502. package/src/runtime/protocol/service_wire_pilot_codec.generated.ts +4 -4
  503. package/src/runtime/spots/formal-remote-actor-admission-registry.ts +6 -6
  504. package/src/runtime/spots/formal-remote-actor-transfer-registry.ts +6 -3
  505. package/src/runtime/spots/index.ts +687 -437
  506. package/src/runtime/spots/spot-activation-registry.ts +42 -71
  507. package/src/runtime/spots/spot-activation-state.ts +4 -16
  508. package/src/runtime/spots/spot-activation.ts +167 -115
  509. package/src/runtime/spots/spot-actor-admission-coordinator.ts +5 -57
  510. package/src/runtime/spots/spot-actor-join-dispatch.ts +25 -79
  511. package/src/runtime/spots/spot-actor-lifecycle-drain.ts +20 -18
  512. package/src/runtime/spots/spot-actor-membership.ts +107 -75
  513. package/src/runtime/spots/spot-actor-packet-dispatch.ts +0 -16
  514. package/src/runtime/spots/spot-actor-packet-relay-dispatch.ts +3 -15
  515. package/src/runtime/spots/spot-context.ts +3 -3
  516. package/src/runtime/spots/spot-entry-activation.ts +13 -33
  517. package/src/runtime/spots/spot-lifecycle-metrics.ts +3 -2
  518. package/src/runtime/spots/spot-manager-public.ts +29 -21
  519. package/src/runtime/spots/spot-node-autoconnect.ts +20 -26
  520. package/src/runtime/spots/spot-node-runtime-manager.ts +145 -140
  521. package/src/runtime/spots/spot-outbound.ts +47 -68
  522. package/src/runtime/spots/spot-remote-codec.ts +7 -3
  523. package/src/runtime/spots/spot-route-packet-dispatch.ts +25 -24
  524. package/src/runtime/spots/spot-route-replies.ts +6 -4
  525. package/src/runtime/spots/spot-routed-actor-admission.ts +13 -6
  526. package/src/runtime/spots/spot-routed-frame-dispatch.ts +6 -77
  527. package/src/runtime/spots/spot-routed-spot-packet-dispatch.ts +95 -22
  528. package/src/runtime/spots/spot-runtime-ports.ts +10 -43
  529. package/src/runtime/spots/spot-serial-executor.ts +10 -2
  530. package/src/runtime/spots/spot-serial-turn-executor.ts +120 -13
  531. package/src/runtime/spots/spot-timer.ts +3 -2
  532. package/src/runtime/streams/actor-session-binding-registry.ts +182 -560
  533. package/src/runtime/streams/actor-session-binding-runtime-owner.ts +1 -19
  534. package/src/runtime/streams/bound-actor-relay-sender.ts +89 -43
  535. package/src/runtime/streams/bound-session-service.ts +23 -37
  536. package/src/runtime/streams/index.ts +102 -88
  537. package/src/runtime/streams/managed-stream.ts +29 -10
  538. package/src/runtime/streams/native-fallback-bound-session.ts +1 -3
  539. package/src/runtime/streams/protocol.ts +34 -88
  540. package/src/runtime/streams/session-actor-coordinator.ts +17 -5
  541. package/src/runtime/streams/session-calls.ts +6 -5
  542. package/src/runtime/streams/session-context.ts +54 -10
  543. package/src/runtime/streams/session-requests.ts +2 -1
  544. package/src/runtime/streams/session-serial-executor.ts +2 -2
  545. package/src/runtime/streams/stream-binding-runtime-ports.ts +22 -1
  546. package/src/runtime/streams/stream-frame-factory.ts +2 -3
  547. package/src/runtime/streams/stream-session-runtime.ts +57 -59
  548. package/src/runtime/workers/index.ts +13 -12
  549. package/dist/runtime/actors/deferred-join-accepted-journal.d.ts +0 -47
  550. package/dist/runtime/actors/deferred-join-accepted-journal.js +0 -992
  551. package/dist/runtime/actors/post-commit-actor-location.d.ts +0 -19
  552. package/dist/runtime/actors/post-commit-actor-location.js +0 -72
  553. package/dist/runtime/spots/spot-native-actor-join-admission.d.ts +0 -26
  554. package/dist/runtime/spots/spot-native-actor-join-admission.js +0 -106
  555. package/src/runtime/actors/deferred-join-accepted-journal.ts +0 -1346
  556. package/src/runtime/actors/post-commit-actor-location.ts +0 -121
  557. package/src/runtime/spots/spot-native-actor-join-admission.ts +0 -155
@@ -1,24 +1,10 @@
1
+ import { ZLinkFrameworkException, ZLinkSpotKind, type RoutingId } from '../../contracts';
1
2
  import {
2
- ZLinkFrameworkInternalErrorKind,
3
- createInternalFrameworkException,
4
- internalFrameworkErrorKind,
5
- internalFrameworkErrorKindFromWireReply,
6
- isCanonicalWireReplyTerminal
7
- } from '../framework-errors-internal';
8
- import {
9
- RequestResult,
10
- SubmitResult,
11
- type ZLinkBackendMessageLike as MessageLike
12
- } from '../backend/runtime-values';
13
- import { ZLinkFrameworkException, type RoutingId } from '../../contracts';
14
- import { ZLinkSubmitStatus, type ZLinkSubmitResult } from '../messaging/submission-result';
15
- import { ZLinkSpotKind } from '../../contracts';
16
- import {
17
- ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome,
18
3
  ZLinkRuntimeDispatchErrorAction as ZLinkDispatchErrorAction,
19
4
  ZLinkRuntimeDispatchErrorReason as ZLinkDispatchErrorReason,
20
5
  ZLinkDispatchErrorSurface,
21
- ZLinkDispatchMessageKind
6
+ ZLinkDispatchMessageKind,
7
+ ZLinkRuntimeMessageFlowOutcome as ZLinkMessageFlowOutcome
22
8
  } from '../../contracts/Dispatch/ZLinkDispatchOptions';
23
9
  import { awaitWithAbort } from '../abort';
24
10
  import type { ZLinkBackendMeshNode } from '../backend/contracts';
@@ -27,16 +13,32 @@ import {
27
13
  type ZLinkMeshCompletionTable
28
14
  } from '../backend/mesh-completion-table';
29
15
  import {
16
+ RequestResult,
17
+ type ZLinkBackendMessageLike as MessageLike
18
+ } from '../backend/runtime-values';
19
+ import type { ZLinkDispatchErrorReporter } from '../channels';
20
+ import {
21
+ ZLinkChannelMessageKind,
30
22
  decodeChannelReply,
31
23
  encodeChannelEnvelopeParts,
32
24
  encodeChannelEnvelopePartsAtDeadline,
33
- type ZLinkChannelEnvelopeCodecRegistry,
34
- ZLinkChannelMessageKind
25
+ type ZLinkChannelEnvelopeCodecRegistry
35
26
  } from '../channels/channel-envelope';
36
- import type { ZLinkDispatchErrorReporter } from '../channels';
37
27
  import { flowIfEnabled } from '../diagnostics';
38
28
  import { runWithOutboundFlow } from '../diagnostics/flow-context';
29
+ import {
30
+ ZLinkFrameworkInternalErrorKind,
31
+ createInternalFrameworkException,
32
+ internalFrameworkErrorKind,
33
+ internalFrameworkErrorKindFromWireReply,
34
+ isCanonicalWireReplyTerminal
35
+ } from '../framework-errors-internal';
39
36
  import { resolveFrameworkPacketName } from '../messaging/packet-name';
37
+ import {
38
+ ZLinkSubmitStatus,
39
+ classifySubmitResult,
40
+ type ZLinkSubmitResult
41
+ } from '../messaging/submission-result';
40
42
  import type {
41
43
  ZLinkSpotAddressCallOptions,
42
44
  ZLinkSpotAddressTransport,
@@ -84,11 +86,6 @@ type MissingTargetSelection =
84
86
  | { readonly kind: 'capacity' }
85
87
  | { readonly kind: 'unavailable' };
86
88
 
87
- // Only a synchronous target-admission rejection is safe to retry. A
88
- // completion with the same public error kind may already represent an
89
- // admitted application operation, so it must not enter the retry loop.
90
- const PRE_ADMISSION_MISSING_INSTANCE_ERRORS = new WeakSet<ZLinkFrameworkException>();
91
-
92
89
  /** Owns global Spot authority lookup and Missing Instance placement. */
93
90
  export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport {
94
91
  constructor(private readonly options: ZLinkHostSpotAddressTransportOptions) {}
@@ -123,6 +120,7 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
123
120
  try {
124
121
  const result = await awaitWithAbort(
125
122
  this.options.routed.sendToSpot(existing, message, {
123
+ instanceSpot: call.instanceSpot,
126
124
  timeoutMs: deadline.requireRemaining(),
127
125
  signal: deadline.signal,
128
126
  metadata: call.metadata
@@ -226,7 +224,7 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
226
224
  const encoded = this.encode(ZLinkChannelMessageKind.Command, selected.meshName, message);
227
225
  const sourceSpotId =
228
226
  call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId);
229
- const mapped = mapSubmitResult(
227
+ const mapped = classifySubmitResult(
230
228
  await awaitWithAbort(
231
229
  selected.node.sendToMissingInstanceSpot(
232
230
  selected.target,
@@ -236,7 +234,8 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
236
234
  call.metadata
237
235
  ),
238
236
  deadline.signal
239
- )
237
+ ),
238
+ 'Instance Spot submission'
240
239
  );
241
240
  this.traceInstanceAddress(
242
241
  submitResultFlowOutcome(mapped.status),
@@ -280,57 +279,41 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
280
279
  const timeoutMs = call.timeoutMs ?? this.options.defaultRequestTimeoutMs;
281
280
  const deadline = createSpotAddressDeadline(timeoutMs, call.signal);
282
281
  try {
283
- for (;;) {
284
- const existing = await this.resolveExisting(spotId, deadline.signal);
285
- deadline.requireRemaining();
286
-
287
- if (existing !== undefined) {
288
- this.validateExisting(existing, call);
289
- try {
290
- return await this.requestToExistingSpot(spotId, request, call, existing, deadline);
291
- } catch (error) {
292
- if (isSpotRouteRefreshError(error)) {
293
- this.options.resolver()?.invalidate?.(spotId);
294
- }
295
- const recovery = await this.recoverStaleInstanceRoute(
296
- spotId,
297
- call,
298
- deadline,
299
- error,
300
- existing
301
- );
302
- if (recovery.kind === 'route') {
303
- // Retry only after the resolver exposes a different route. The
304
- // stale target cannot have admitted the application operation.
305
- continue;
306
- }
307
- if (recovery.kind !== 'cold') {
308
- this.reportInstanceRequestError(
309
- spotId,
310
- request,
311
- error,
312
- existing.routerChannelId,
313
- existing.targetNodeRid,
314
- existing.stableType,
315
- addressedInstanceErrorReason(error)
316
- );
317
- throw error;
318
- }
319
- // The logical authority is no longer Ready, so the Instance
320
- // intent path below may submit the original operation once.
321
- }
282
+ const existing = await this.resolveExisting(spotId, deadline.signal);
283
+ deadline.requireRemaining();
284
+ if (existing === undefined) {
285
+ return await this.requestToMissingInstance(spotId, request, call, deadline);
286
+ }
287
+ this.validateExisting(existing, call);
288
+ try {
289
+ return await this.requestToExistingSpot(spotId, request, call, existing, deadline);
290
+ } catch (error) {
291
+ if (isSpotRouteRefreshError(error)) {
292
+ this.options.resolver()?.invalidate?.(spotId);
322
293
  }
323
-
324
- try {
294
+ // Failover policy §4.4: SpotMoving is the owner's Ready owner-fence
295
+ // refusal, made before admission. With Instance intent, one authority
296
+ // read under the same deadline decides: Missing means Close released
297
+ // the incarnation, so the request activates a new one. Any other
298
+ // answer, and any message the owner admitted, keeps this terminal.
299
+ if (
300
+ call.instanceSpot &&
301
+ isOwnerFenceRefusal(error) &&
302
+ (await this.resolveExisting(spotId, deadline.signal)) === undefined
303
+ ) {
304
+ deadline.requireRemaining();
325
305
  return await this.requestToMissingInstance(spotId, request, call, deadline);
326
- } catch (error) {
327
- if (!isMissingInstanceRetryError(error)) throw error;
328
- // A placement node can finish cleanup before its stale native result
329
- // reaches this process. Refresh authority and select again under the
330
- // same end-to-end deadline; the old envelope was not admitted.
331
- this.options.resolver()?.invalidate?.(spotId);
332
- await waitForSpotRouteRefresh(Math.min(10, deadline.requireRemaining()), deadline.signal);
333
306
  }
307
+ this.reportInstanceRequestError(
308
+ spotId,
309
+ request,
310
+ error,
311
+ existing.routerChannelId,
312
+ existing.targetNodeRid,
313
+ existing.stableType,
314
+ addressedInstanceErrorReason(error)
315
+ );
316
+ throw error;
334
317
  }
335
318
  } catch (error) {
336
319
  if (
@@ -372,6 +355,7 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
372
355
  );
373
356
  const reply = await awaitWithAbort(
374
357
  this.options.routed.requestToSpot<TReply>(existing, request, {
358
+ instanceSpot: call.instanceSpot,
375
359
  timeoutMs: deadline.requireRemaining(),
376
360
  signal: deadline.signal,
377
361
  metadata: call.metadata
@@ -446,28 +430,17 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
446
430
  const table = this.options.completions(selected.meshName);
447
431
  if (table === undefined)
448
432
  throw new Error(`MeshNode '${selected.meshName}' completion table is not started.`);
449
- let completionPromise: ReturnType<ZLinkMeshCompletionTable['submit']>;
450
- try {
451
- completionPromise = table.submit(
452
- () =>
453
- selected.node.requestToMissingInstanceSpot(
454
- selected.target,
455
- encoded,
456
- deadlineUnixMs,
457
- call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId),
458
- call.metadata
459
- ),
460
- deadline.signal
461
- );
462
- } catch (error) {
463
- if (
464
- error instanceof ZLinkFrameworkException &&
465
- internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.RequestTargetNotFound
466
- ) {
467
- PRE_ADMISSION_MISSING_INSTANCE_ERRORS.add(error);
468
- }
469
- throw error;
470
- }
433
+ const completionPromise = table.submit(
434
+ () =>
435
+ selected.node.requestToMissingInstanceSpot(
436
+ selected.target,
437
+ encoded,
438
+ deadlineUnixMs,
439
+ call.sourceSpot === undefined ? undefined : String(call.sourceSpot.routingId),
440
+ call.metadata
441
+ ),
442
+ deadline.signal
443
+ );
471
444
  this.traceInstanceAddress(
472
445
  ZLinkMessageFlowOutcome.Sent,
473
446
  ZLinkDispatchMessageKind.Request,
@@ -580,35 +553,6 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
580
553
  }
581
554
  }
582
555
 
583
- private async recoverStaleInstanceRoute(
584
- spotId: RoutingId,
585
- call: ZLinkSpotAddressCallOptions,
586
- deadline: ZLinkSpotAddressDeadline,
587
- error: unknown,
588
- staleRoute: ZLinkSpotRouteTarget
589
- ): Promise<
590
- | { readonly kind: 'route'; readonly route: ZLinkSpotRouteTarget }
591
- | { readonly kind: 'cold' }
592
- | { readonly kind: 'fail' }
593
- > {
594
- if (
595
- !call.instanceSpot ||
596
- !(error instanceof ZLinkFrameworkException) ||
597
- !isInstanceRouteStaleError(error)
598
- ) {
599
- return { kind: 'fail' };
600
- }
601
- for (;;) {
602
- deadline.requireRemaining();
603
- const current = await this.resolveExisting(spotId, deadline.signal);
604
- if (current === undefined) return { kind: 'cold' };
605
- if (!sameSpotRouteSnapshot(current, staleRoute)) {
606
- return { kind: 'route', route: current };
607
- }
608
- await waitForSpotRouteRefresh(Math.min(10, deadline.requireRemaining()), deadline.signal);
609
- }
610
- }
611
-
612
556
  private selectMissingTarget(
613
557
  spotId: RoutingId,
614
558
  call: ZLinkSpotAddressCallOptions
@@ -771,25 +715,6 @@ export class ZLinkHostSpotAddressTransport implements ZLinkSpotAddressTransport
771
715
  }
772
716
  }
773
717
 
774
- function isInstanceRouteStaleError(error: unknown): error is ZLinkFrameworkException {
775
- if (!(error instanceof ZLinkFrameworkException)) return false;
776
- const kind = internalFrameworkErrorKind(error);
777
- // RequestTargetNotFound from an existing route is a pre-admission route
778
- // lookup failure. A stale owner result is terminal for this application
779
- // operation: the routed request may already have crossed the transport
780
- // boundary, so refreshing the route and resubmitting it could execute the
781
- // same operation twice. Instance cold activation is selected only when the
782
- // authority resolver itself reports that the Ready route is absent.
783
- if (kind === ZLinkFrameworkInternalErrorKind.RequestTargetNotFound) return true;
784
- return false;
785
- }
786
-
787
- function isMissingInstanceRetryError(error: unknown): error is ZLinkFrameworkException {
788
- return (
789
- error instanceof ZLinkFrameworkException && PRE_ADMISSION_MISSING_INSTANCE_ERRORS.has(error)
790
- );
791
- }
792
-
793
718
  function missingInstanceRequestFailure(
794
719
  result: number,
795
720
  nativeErrno: number
@@ -819,27 +744,6 @@ function missingInstanceRequestFailure(
819
744
  );
820
745
  }
821
746
 
822
- function mapSubmitResult(result: number): ZLinkSubmitResult {
823
- switch (result) {
824
- case SubmitResult.Ok:
825
- return { status: ZLinkSubmitStatus.Submitted };
826
- case SubmitResult.Backpressured:
827
- case SubmitResult.NotAdmitted:
828
- return { status: ZLinkSubmitStatus.Backpressured };
829
- case SubmitResult.NotFound:
830
- return { status: ZLinkSubmitStatus.TargetNotFound };
831
- case SubmitResult.NotConnected:
832
- return { status: ZLinkSubmitStatus.RouteNotConnected };
833
- case SubmitResult.Terminated:
834
- return { status: ZLinkSubmitStatus.Shutdown };
835
- default:
836
- throw createInternalFrameworkException(
837
- ZLinkFrameworkInternalErrorKind.RequestFailed,
838
- `Instance Spot submission failed with result ${result}.`
839
- );
840
- }
841
- }
842
-
843
747
  function missingInstancePlacementCapacity(
844
748
  spotId: RoutingId,
845
749
  stableType: string | undefined
@@ -877,39 +781,13 @@ function isSpotRouteRefreshError(error: unknown): error is ZLinkFrameworkExcepti
877
781
  );
878
782
  }
879
783
 
880
- function sameSpotRouteSnapshot(left: ZLinkSpotRouteTarget, right: ZLinkSpotRouteTarget): boolean {
784
+ function isOwnerFenceRefusal(error: unknown): boolean {
881
785
  return (
882
- String(left.targetNodeRid) === String(right.targetNodeRid) &&
883
- String(left.spotId) === String(right.spotId) &&
884
- left.routerChannelId === right.routerChannelId &&
885
- left.spotKind === right.spotKind &&
886
- left.stableType === right.stableType &&
887
- left.targetSpotGeneration === right.targetSpotGeneration &&
888
- left.targetNodeGeneration === right.targetNodeGeneration &&
889
- left.authorityOwnerGeneration === right.authorityOwnerGeneration &&
890
- left.targetOwnerId === right.targetOwnerId &&
891
- left.ownerLeaseGeneration === right.ownerLeaseGeneration &&
892
- left.authorityStoreVersion === right.authorityStoreVersion
786
+ error instanceof ZLinkFrameworkException &&
787
+ internalFrameworkErrorKind(error) === ZLinkFrameworkInternalErrorKind.SpotMoving
893
788
  );
894
789
  }
895
790
 
896
- function waitForSpotRouteRefresh(delayMs: number, signal: AbortSignal): Promise<void> {
897
- return new Promise((resolve, reject) => {
898
- const finish = () => {
899
- signal.removeEventListener('abort', abort);
900
- resolve();
901
- };
902
- const abort = () => {
903
- clearTimeout(timer);
904
- signal.removeEventListener('abort', abort);
905
- reject(signal.reason);
906
- };
907
- const timer = setTimeout(finish, delayMs);
908
- signal.addEventListener('abort', abort, { once: true });
909
- if (signal.aborted) abort();
910
- });
911
- }
912
-
913
791
  function submitResultReason(status: ZLinkSubmitStatus): ZLinkDispatchErrorReason {
914
792
  switch (status) {
915
793
  case ZLinkSubmitStatus.Backpressured:
@@ -51,7 +51,8 @@ export interface ZLinkSpotNodeRuntimeOptionsFactoryOptions {
51
51
  export class ZLinkSpotNodeRuntimeOptionsFactory {
52
52
  constructor(private readonly options: ZLinkSpotNodeRuntimeOptionsFactoryOptions) {}
53
53
 
54
- create(): ZLinkSpotNodeRuntimeManagerOptions {
54
+ create(): Omit<ZLinkSpotNodeRuntimeManagerOptions, 'errorSink'> {
55
+ const spotRouterChannelIdForMesh = this.options.meshRouters.spotRouterChannelIdByMesh();
55
56
  return {
56
57
  registration: this.options.registration,
57
58
  primaryMeshName: this.options.meshRouters.primaryMeshName(),
@@ -59,7 +60,9 @@ export class ZLinkSpotNodeRuntimeOptionsFactory {
59
60
  context: this.options.context,
60
61
  channelClient: new DefaultZLinkChannelClient(
61
62
  this.options.registration,
62
- this.options.channelTransport
63
+ this.options.channelTransport,
64
+ this.options.routeTransport,
65
+ spotRouterChannelIdForMesh
63
66
  ),
64
67
  fanoutClient: new DefaultZLinkFanoutClient(
65
68
  this.options.registration,
@@ -70,7 +73,7 @@ export class ZLinkSpotNodeRuntimeOptionsFactory {
70
73
  this.options.spotPublisherTransport
71
74
  ),
72
75
  routedTransport: this.options.routeTransport,
73
- spotRouterChannelIdForMesh: this.options.meshRouters.spotRouterChannelIdByMesh(),
76
+ spotRouterChannelIdForMesh,
74
77
  providerResolver: this.options.providerResolver,
75
78
  dispatchErrors: this.options.dispatchErrors,
76
79
  runtimeEventPublisher: this.options.runtimeEventPublisher,
@@ -49,12 +49,26 @@ export interface ZLinkSpotRuntimeOptionsFactoryOptions {
49
49
  ) => Promise<void>;
50
50
  readonly beginInstanceIdleClosingAuthority: (
51
51
  meshName: string,
52
- spotId: string
53
- ) => Promise<{ restoreReady(): Promise<void> } | undefined>;
52
+ spotId: string,
53
+ onCommitted: () => void
54
+ ) => Promise<
55
+ import('../locations/spot-location-claims').ZLinkInstanceClosingAuthority | undefined
56
+ >;
54
57
  readonly beginInstanceClosingAuthority: (
55
58
  meshName: string,
56
- spotId: string
57
- ) => Promise<{ restoreReady(): Promise<void> } | undefined>;
59
+ spotId: string,
60
+ onCommitted: () => void
61
+ ) => Promise<
62
+ import('../locations/spot-location-claims').ZLinkInstanceClosingAuthority | undefined
63
+ >;
64
+ readonly beginUserClosingAuthority: (
65
+ meshName: string,
66
+ spotId: string,
67
+ objectGeneration: bigint,
68
+ onCommitted: () => void
69
+ ) => Promise<
70
+ import('../locations/spot-location-claims').ZLinkInstanceClosingAuthority | undefined
71
+ >;
58
72
  readonly createLocationSpotRouteResolver: () => ZLinkSpotRouteResolver | undefined;
59
73
  readonly boundSessionRelay: ZLinkBoundSessionRelay;
60
74
  readonly actorHandoff: ZLinkActorHandoffCoordinator;
@@ -63,13 +77,14 @@ export interface ZLinkSpotRuntimeOptionsFactoryOptions {
63
77
  readonly detachedTaskRunner: ZLinkDetachedTaskRunner;
64
78
  readonly metrics: import('../diagnostics').ZLinkRuntimeMetrics;
65
79
  readonly admission: ZLinkRuntimeAdmissionGate;
66
- readonly statefulExecutionAllowed: () => boolean;
80
+ readonly statefulExecution: NonNullable<ZLinkSpotManagerOptions['statefulExecution']>;
67
81
  }
68
82
 
69
83
  export class ZLinkSpotRuntimeOptionsFactory {
70
84
  constructor(private readonly options: ZLinkSpotRuntimeOptionsFactoryOptions) {}
71
85
 
72
86
  create(actorTransferRuntime: ZLinkActorTransferRuntime): Partial<ZLinkSpotManagerOptions> {
87
+ const spotRouterChannelIdForMesh = this.options.meshRouters.spotRouterChannelIdByMesh();
73
88
  return {
74
89
  nodeRid: undefined,
75
90
  nodeRidProvider: (meshName) => this.meshNodeRoutingId(meshName),
@@ -120,9 +135,20 @@ export class ZLinkSpotRuntimeOptionsFactory {
120
135
  }
121
136
  await runtime.dispatchEntryActorJoin(meshName, actor, handoffBacklog);
122
137
  },
138
+ executeEntryActor: (meshName, actorId, operation) => {
139
+ const runtime = this.options.spotNodeRuntime();
140
+ if (runtime === undefined) {
141
+ throw new ZLinkConfigurationException(
142
+ 'Entry Spot Actor completion requires the MeshNode runtime.'
143
+ );
144
+ }
145
+ return runtime.executeEntryActor(meshName, actorId, operation);
146
+ },
123
147
  channelClient: new DefaultZLinkChannelClient(
124
148
  this.options.registration,
125
- this.options.channelTransport
149
+ this.options.channelTransport,
150
+ this.options.routeTransport,
151
+ spotRouterChannelIdForMesh
126
152
  ),
127
153
  fanoutClient: new DefaultZLinkFanoutClient(
128
154
  this.options.registration,
@@ -134,25 +160,70 @@ export class ZLinkSpotRuntimeOptionsFactory {
134
160
  ),
135
161
  routedTransport: this.options.routeTransport,
136
162
  addressTransport: this.options.addressTransport,
137
- spotRouterChannelIdForMesh: this.options.meshRouters.spotRouterChannelIdByMesh(),
138
- channelMeshNameForChannel: (channelName) => {
139
- const matches = [...this.options.registration.spotNodes.entries()]
140
- .filter(([, node]) =>
141
- Object.prototype.hasOwnProperty.call(node.meshChannels ?? {}, channelName)
142
- )
143
- .map(([meshName]) => meshName);
144
- return matches.length === 1 ? matches[0] : undefined;
145
- },
163
+ spotRouterChannelIdForMesh,
146
164
  messageSerializers: this.options.registration.messageSerializers,
147
165
  runtimeEventPublisher: this.options.runtimeEventPublisher,
148
166
  detachedTaskRunner: this.options.detachedTaskRunner,
149
167
  locationLifecycle: this.options.locationLifecycle(),
150
168
  releaseInstanceAuthority: (meshName, spotId, objectGeneration) =>
151
169
  this.options.releaseInstanceAuthority(meshName, String(spotId), objectGeneration),
152
- beginInstanceIdleClosingAuthority: (meshName, spotId) =>
153
- this.options.beginInstanceIdleClosingAuthority(meshName, String(spotId)),
154
- beginInstanceClosingAuthority: (meshName, spotId) =>
155
- this.options.beginInstanceClosingAuthority(meshName, String(spotId)),
170
+ beginInstanceIdleClosingAuthority: (meshName, spotId, onCommitted) =>
171
+ this.options.beginInstanceIdleClosingAuthority(meshName, String(spotId), onCommitted),
172
+ beginInstanceClosingAuthority: async (meshName, spotId, onCommitted, objectGeneration) => {
173
+ const authority = await this.options.beginInstanceClosingAuthority(
174
+ meshName,
175
+ String(spotId),
176
+ onCommitted
177
+ );
178
+ if (authority === undefined) return undefined;
179
+ // A Close without Reincarnate ends this incarnation. The Instance authority
180
+ // release also forgets the node's Ready projection, so a request on a cached
181
+ // Ready route is refused instead of rematerializing the closed generation.
182
+ const release = () =>
183
+ this.options.releaseInstanceAuthority(meshName, String(spotId), objectGeneration);
184
+ if (authority.reincarnate === undefined) return { release };
185
+ return {
186
+ release,
187
+ reincarnate: async (initialize) => {
188
+ const current = await authority.reincarnate!(initialize);
189
+ const node = this.options.spotNodeRuntime()?.meshNode(meshName);
190
+ const route = {
191
+ targetSpotId: String(spotId),
192
+ targetNodeRid: String(current.allocation.descriptor.rid),
193
+ targetNodeGeneration: current.allocation.descriptorLifecycleGeneration,
194
+ objectGeneration: current.objectGeneration,
195
+ authorityOwnerGeneration: current.authorityOwnerGeneration,
196
+ ownerId: current.ownerId,
197
+ leaseGeneration: current.ownerLeaseGeneration,
198
+ storeVersion: current.storeVersion.value
199
+ };
200
+ node?.restoreSpotAuthority?.(
201
+ String(spotId),
202
+ 'instance_spot',
203
+ current.stableType,
204
+ current.objectGeneration,
205
+ current.authorityOwnerGeneration
206
+ );
207
+ node?.registerInstanceIntent?.(current.stableType, route);
208
+ node?.rememberSpotRoute?.({
209
+ spot: { spotId: String(spotId), generation: current.objectGeneration },
210
+ targetNodeRid: route.targetNodeRid,
211
+ targetNodeGeneration: route.targetNodeGeneration,
212
+ authorityOwnerGeneration: route.authorityOwnerGeneration,
213
+ ownerLeaseGeneration: route.leaseGeneration,
214
+ storeVersion: route.storeVersion
215
+ });
216
+ return current;
217
+ }
218
+ };
219
+ },
220
+ beginUserClosingAuthority: (meshName, spotId, objectGeneration, onCommitted) =>
221
+ this.options.beginUserClosingAuthority(
222
+ meshName,
223
+ String(spotId),
224
+ objectGeneration,
225
+ onCommitted
226
+ ),
156
227
  instanceSpotApplicationTargetProvider: (meshName, spotId) =>
157
228
  this.options
158
229
  .spotNodeRuntime()
@@ -196,11 +267,6 @@ export class ZLinkSpotRuntimeOptionsFactory {
196
267
  }
197
268
  } as never;
198
269
  },
199
- createReceived: () => {
200
- const runtime = this.options.spotNodeRuntime();
201
- if (runtime === undefined) throw new Error('Spot backend runtime is not initialized.');
202
- return runtime.createReceived();
203
- },
204
270
  createTopicMessage: () => {
205
271
  const runtime = this.options.spotNodeRuntime();
206
272
  if (runtime === undefined) throw new Error('Spot backend runtime is not initialized.');
@@ -264,17 +330,13 @@ export class ZLinkSpotRuntimeOptionsFactory {
264
330
  ZLinkSpotRelocationCoordinationMode.FrameworkManaged
265
331
  );
266
332
  },
267
- actorBindingGenerationObserver: (actorId, generation) =>
268
- this.options
269
- .actorManager()
270
- ?.getState(actorId)
271
- ?.setBoundSessionBindingGeneration(generation),
272
333
  actorTransferRuntime,
273
334
  boundSessionRuntime: this.options.boundSessionRelay.boundSessions,
274
335
  actorHandoffRuntime: this.options.actorHandoff,
275
336
  metrics: this.options.metrics,
276
337
  admission: this.options.admission,
277
- statefulExecutionAllowed: this.options.statefulExecutionAllowed,
338
+ statefulExecution: this.options.statefulExecution,
339
+ closeErrorSink: this.options.runtimeOrPreStartErrorSink,
278
340
  dispatchErrors: this.options.dispatchErrorReporter(this.options.runtimeOrPreStartErrorSink)
279
341
  };
280
342
  }
@@ -19,6 +19,7 @@ import type {
19
19
  } from '../foundation/service-stateful-wire-codec';
20
20
  import { routingIdsEqual } from '../routing-id';
21
21
  import {
22
+ decodeServiceClosingSpotAuthority,
22
23
  decodeServiceInstanceAuthorityPayload,
23
24
  decodeServiceReadySpotAuthority,
24
25
  type ServiceActivationRecoveryState
@@ -74,6 +75,7 @@ interface StatefulAuthorityRouteSink {
74
75
 
75
76
  interface AppliedAuthorityRoute {
76
77
  readonly kind: 'user_spot' | 'instance_spot';
78
+ readonly closing: boolean;
77
79
  readonly stableType: string;
78
80
  readonly meshName: string;
79
81
  readonly spotRoute: ServiceDirectSpotRouteFence;
@@ -189,7 +191,7 @@ export class ZLinkStatefulAuthorityRouteRuntime {
189
191
  const expectedInstanceRoute =
190
192
  previousRoute?.kind === 'instance_spot' ? previousRoute.instanceRoute : null;
191
193
  sink.rememberSpotRoute(route.spotRoute, expectedSpotRoute);
192
- if (route.kind === 'instance_spot') {
194
+ if (route.kind === 'instance_spot' && !route.closing) {
193
195
  const status = sink.status();
194
196
  if (
195
197
  routingIdsEqual(status.routingId, route.instanceRoute.targetNodeRid) &&
@@ -555,9 +557,9 @@ function pendingInstanceActivation(
555
557
 
556
558
  function authorityRoute(snapshot: ZLinkAuthoritySnapshot): AppliedAuthorityRoute | undefined {
557
559
  const allocation = snapshot.allocation;
558
- const decoded = decodeServiceReadySpotAuthority(
559
- serviceRelocationAuthorityApplicationPayload(snapshot.payload)
560
- );
560
+ const payload = serviceRelocationAuthorityApplicationPayload(snapshot.payload);
561
+ const ready = decodeServiceReadySpotAuthority(payload);
562
+ const decoded = ready ?? decodeServiceClosingSpotAuthority(payload);
561
563
  if (
562
564
  allocation.state !== 'active' ||
563
565
  allocation.objectKind === 'actor' ||
@@ -585,6 +587,7 @@ function authorityRoute(snapshot: ZLinkAuthoritySnapshot): AppliedAuthorityRoute
585
587
  };
586
588
  return {
587
589
  kind: allocation.objectKind,
590
+ closing: ready === undefined,
588
591
  stableType: allocation.stableType,
589
592
  meshName: allocation.descriptor.meshName,
590
593
  spotRoute,
@@ -617,6 +620,7 @@ function sameAppliedRoute(
617
620
  if (right === undefined) return false;
618
621
  return (
619
622
  left.kind === right.kind &&
623
+ left.closing === right.closing &&
620
624
  left.stableType === right.stableType &&
621
625
  left.meshName === right.meshName &&
622
626
  left.instanceRoute.targetNodeRid === right.instanceRoute.targetNodeRid &&