@spine-event-engine/server 2.0.0-snapshot.24 → 2.0.0-snapshot.26

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 (374) hide show
  1. package/README.md +86 -19
  2. package/REFERENCE.md +538 -150
  3. package/dist/agent/agent-acceptance-receipts.d.ts +69 -0
  4. package/dist/agent/agent-acceptance-receipts.d.ts.map +1 -0
  5. package/dist/agent/agent-acceptance-receipts.js +198 -0
  6. package/dist/agent/agent-acceptance-receipts.js.map +1 -0
  7. package/dist/agent/agent-execution-capacity.d.ts +37 -9
  8. package/dist/agent/agent-execution-capacity.d.ts.map +1 -1
  9. package/dist/agent/agent-execution-capacity.js +73 -15
  10. package/dist/agent/agent-execution-capacity.js.map +1 -1
  11. package/dist/agent/agent-history.d.ts +33 -12
  12. package/dist/agent/agent-history.d.ts.map +1 -1
  13. package/dist/agent/agent-history.js +61 -18
  14. package/dist/agent/agent-history.js.map +1 -1
  15. package/dist/agent/agent-live-ai-audit.d.ts +95 -0
  16. package/dist/agent/agent-live-ai-audit.d.ts.map +1 -0
  17. package/dist/agent/agent-live-ai-audit.js +290 -0
  18. package/dist/agent/agent-live-ai-audit.js.map +1 -0
  19. package/dist/agent/agent-live-ai-runtime.d.ts +300 -0
  20. package/dist/agent/agent-live-ai-runtime.d.ts.map +1 -0
  21. package/dist/agent/agent-live-ai-runtime.js +611 -0
  22. package/dist/agent/agent-live-ai-runtime.js.map +1 -0
  23. package/dist/agent/agent-live-audit.d.ts +67 -0
  24. package/dist/agent/agent-live-audit.d.ts.map +1 -0
  25. package/dist/agent/agent-live-audit.js +121 -0
  26. package/dist/agent/agent-live-audit.js.map +1 -0
  27. package/dist/agent/agent-live-budget.d.ts +84 -0
  28. package/dist/agent/agent-live-budget.d.ts.map +1 -0
  29. package/dist/agent/agent-live-budget.js +161 -0
  30. package/dist/agent/agent-live-budget.js.map +1 -0
  31. package/dist/agent/agent-live-fault.d.ts +18 -0
  32. package/dist/agent/agent-live-fault.d.ts.map +1 -0
  33. package/dist/agent/{agent-execution-fault.js → agent-live-fault.js} +7 -7
  34. package/dist/agent/agent-live-fault.js.map +1 -0
  35. package/dist/agent/agent-live-inputs.d.ts +74 -0
  36. package/dist/agent/agent-live-inputs.d.ts.map +1 -0
  37. package/dist/agent/agent-live-inputs.js +15 -0
  38. package/dist/agent/agent-live-inputs.js.map +1 -0
  39. package/dist/agent/agent-live-interaction-events.d.ts +46 -0
  40. package/dist/agent/agent-live-interaction-events.d.ts.map +1 -0
  41. package/dist/agent/agent-live-interaction-events.js +104 -0
  42. package/dist/agent/agent-live-interaction-events.js.map +1 -0
  43. package/dist/agent/agent-live-mcp-controls.d.ts +129 -0
  44. package/dist/agent/agent-live-mcp-controls.d.ts.map +1 -0
  45. package/dist/agent/agent-live-mcp-controls.js +228 -0
  46. package/dist/agent/agent-live-mcp-controls.js.map +1 -0
  47. package/dist/agent/agent-live-mcp-host.d.ts +88 -0
  48. package/dist/agent/agent-live-mcp-host.d.ts.map +1 -0
  49. package/dist/agent/{agent-mcp-host.js → agent-live-mcp-host.js} +1 -1
  50. package/dist/agent/agent-live-mcp-host.js.map +1 -0
  51. package/dist/agent/{agent-mcp-runtime.d.ts → agent-live-mcp-runtime.d.ts} +6 -6
  52. package/dist/agent/agent-live-mcp-runtime.d.ts.map +1 -0
  53. package/dist/agent/{agent-mcp-runtime.js → agent-live-mcp-runtime.js} +13 -42
  54. package/dist/agent/agent-live-mcp-runtime.js.map +1 -0
  55. package/dist/agent/agent-live-read-runtime.d.ts +72 -0
  56. package/dist/agent/agent-live-read-runtime.d.ts.map +1 -0
  57. package/dist/agent/agent-live-read-runtime.js +122 -0
  58. package/dist/agent/agent-live-read-runtime.js.map +1 -0
  59. package/dist/agent/agent-model-selection.d.ts +21 -34
  60. package/dist/agent/agent-model-selection.d.ts.map +1 -1
  61. package/dist/agent/agent-model-selection.js +61 -78
  62. package/dist/agent/agent-model-selection.js.map +1 -1
  63. package/dist/browser/browser-server.d.ts +163 -0
  64. package/dist/browser/browser-server.d.ts.map +1 -1
  65. package/dist/browser/browser-server.js +579 -188
  66. package/dist/browser/browser-server.js.map +1 -1
  67. package/dist/browser/durable-subscription-bindings.d.ts +5 -0
  68. package/dist/browser/durable-subscription-bindings.d.ts.map +1 -1
  69. package/dist/browser/durable-subscription-bindings.js +226 -38
  70. package/dist/browser/durable-subscription-bindings.js.map +1 -1
  71. package/dist/browser/options.d.ts +5 -0
  72. package/dist/browser/options.d.ts.map +1 -1
  73. package/dist/bus/command-bus.d.ts +17 -18
  74. package/dist/bus/command-bus.d.ts.map +1 -1
  75. package/dist/bus/command-bus.js +97 -54
  76. package/dist/bus/command-bus.js.map +1 -1
  77. package/dist/bus/command-errors.d.ts +20 -4
  78. package/dist/bus/command-errors.d.ts.map +1 -1
  79. package/dist/bus/command-errors.js +47 -7
  80. package/dist/bus/command-errors.js.map +1 -1
  81. package/dist/bus/event-bus.d.ts +20 -4
  82. package/dist/bus/event-bus.d.ts.map +1 -1
  83. package/dist/bus/event-bus.js +166 -14
  84. package/dist/bus/event-bus.js.map +1 -1
  85. package/dist/context/bounded-context.d.ts +169 -98
  86. package/dist/context/bounded-context.d.ts.map +1 -1
  87. package/dist/context/bounded-context.js +837 -503
  88. package/dist/context/bounded-context.js.map +1 -1
  89. package/dist/context/entity-inbox.d.ts +7 -2
  90. package/dist/context/entity-inbox.d.ts.map +1 -1
  91. package/dist/context/entity-inbox.js +22 -13
  92. package/dist/context/entity-inbox.js.map +1 -1
  93. package/dist/context/local-inbox-handoff.d.ts +34 -34
  94. package/dist/context/local-inbox-handoff.d.ts.map +1 -1
  95. package/dist/context/local-inbox-handoff.js +108 -150
  96. package/dist/context/local-inbox-handoff.js.map +1 -1
  97. package/dist/context/projection-handoff.d.ts +2 -2
  98. package/dist/context/projection-handoff.d.ts.map +1 -1
  99. package/dist/context/projection-handoff.js +10 -8
  100. package/dist/context/projection-handoff.js.map +1 -1
  101. package/dist/context/tenant-index.d.ts +36 -31
  102. package/dist/context/tenant-index.d.ts.map +1 -1
  103. package/dist/context/tenant-index.js +123 -125
  104. package/dist/context/tenant-index.js.map +1 -1
  105. package/dist/context/tenant-unknown-error.d.ts +33 -0
  106. package/dist/context/tenant-unknown-error.d.ts.map +1 -0
  107. package/dist/context/tenant-unknown-error.js +75 -0
  108. package/dist/context/tenant-unknown-error.js.map +1 -0
  109. package/dist/delivery/agent-delivery-scope.d.ts +66 -0
  110. package/dist/delivery/agent-delivery-scope.d.ts.map +1 -0
  111. package/dist/delivery/agent-delivery-scope.js +44 -0
  112. package/dist/delivery/agent-delivery-scope.js.map +1 -0
  113. package/dist/delivery/delivery-builder.d.ts +25 -1
  114. package/dist/delivery/delivery-builder.d.ts.map +1 -1
  115. package/dist/delivery/delivery-builder.js +89 -0
  116. package/dist/delivery/delivery-builder.js.map +1 -1
  117. package/dist/delivery/delivery-monitor.d.ts +1 -1
  118. package/dist/delivery/delivery-monitor.js +1 -1
  119. package/dist/delivery/delivery-run-control.d.ts +6 -0
  120. package/dist/delivery/delivery-run-control.d.ts.map +1 -1
  121. package/dist/delivery/delivery-run-control.js +10 -0
  122. package/dist/delivery/delivery-run-control.js.map +1 -1
  123. package/dist/delivery/delivery-supervisor.d.ts.map +1 -1
  124. package/dist/delivery/delivery-supervisor.js +28 -4
  125. package/dist/delivery/delivery-supervisor.js.map +1 -1
  126. package/dist/delivery/delivery-tenant.d.ts +17 -0
  127. package/dist/delivery/delivery-tenant.d.ts.map +1 -0
  128. package/dist/delivery/delivery-tenant.js +50 -0
  129. package/dist/delivery/delivery-tenant.js.map +1 -0
  130. package/dist/delivery/delivery.d.ts +96 -2
  131. package/dist/delivery/delivery.d.ts.map +1 -1
  132. package/dist/delivery/delivery.js +693 -53
  133. package/dist/delivery/delivery.js.map +1 -1
  134. package/dist/delivery/inbox-records.d.ts.map +1 -1
  135. package/dist/delivery/inbox-records.js +9 -16
  136. package/dist/delivery/inbox-records.js.map +1 -1
  137. package/dist/delivery/inbox-storage.d.ts +6 -0
  138. package/dist/delivery/inbox-storage.d.ts.map +1 -1
  139. package/dist/delivery/inbox-storage.js +43 -6
  140. package/dist/delivery/inbox-storage.js.map +1 -1
  141. package/dist/delivery/inbox.d.ts.map +1 -1
  142. package/dist/delivery/inbox.js +3 -2
  143. package/dist/delivery/inbox.js.map +1 -1
  144. package/dist/delivery/reception-observation.d.ts +12 -4
  145. package/dist/delivery/reception-observation.d.ts.map +1 -1
  146. package/dist/delivery/reception-observation.js +14 -3
  147. package/dist/delivery/reception-observation.js.map +1 -1
  148. package/dist/delivery/sharded-work-registry.d.ts +6 -0
  149. package/dist/delivery/sharded-work-registry.d.ts.map +1 -1
  150. package/dist/delivery/sharded-work-registry.js +41 -4
  151. package/dist/delivery/sharded-work-registry.js.map +1 -1
  152. package/dist/entity/entity-storage-descriptor.d.ts.map +1 -1
  153. package/dist/entity/entity-storage-descriptor.js +7 -4
  154. package/dist/entity/entity-storage-descriptor.js.map +1 -1
  155. package/dist/entity/entity.d.ts +59 -0
  156. package/dist/entity/entity.d.ts.map +1 -1
  157. package/dist/entity/entity.js +60 -0
  158. package/dist/entity/entity.js.map +1 -1
  159. package/dist/handler/app-query-handler.d.ts +60 -0
  160. package/dist/handler/app-query-handler.d.ts.map +1 -0
  161. package/dist/{bus/saved-dispatcher-binding.js → handler/app-query-handler.js} +8 -12
  162. package/dist/handler/app-query-handler.js.map +1 -0
  163. package/dist/handler/generated-registry-discovery.d.ts +6 -0
  164. package/dist/handler/generated-registry-discovery.d.ts.map +1 -1
  165. package/dist/handler/generated-registry-discovery.js +71 -2
  166. package/dist/handler/generated-registry-discovery.js.map +1 -1
  167. package/dist/handler/handler-decorators.d.ts +8 -29
  168. package/dist/handler/handler-decorators.d.ts.map +1 -1
  169. package/dist/handler/handler-decorators.js +33 -210
  170. package/dist/handler/handler-decorators.js.map +1 -1
  171. package/dist/handler/spine-metadata-inventory.d.ts +99 -0
  172. package/dist/handler/spine-metadata-inventory.d.ts.map +1 -0
  173. package/dist/handler/spine-metadata-inventory.js +162 -0
  174. package/dist/handler/spine-metadata-inventory.js.map +1 -0
  175. package/dist/index.d.ts +9 -5
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +6 -3
  178. package/dist/index.js.map +1 -1
  179. package/dist/integration/external-messages.d.ts.map +1 -1
  180. package/dist/integration/external-messages.js +9 -15
  181. package/dist/integration/external-messages.js.map +1 -1
  182. package/dist/integration/integration-broker.d.ts.map +1 -1
  183. package/dist/integration/integration-broker.js +112 -6
  184. package/dist/integration/integration-broker.js.map +1 -1
  185. package/dist/integration/third-party-context.d.ts.map +1 -1
  186. package/dist/integration/third-party-context.js +7 -10
  187. package/dist/integration/third-party-context.js.map +1 -1
  188. package/dist/repository/primitive-id.js +26 -11
  189. package/dist/repository/primitive-id.js.map +1 -1
  190. package/dist/repository/repository.d.ts +75 -60
  191. package/dist/repository/repository.d.ts.map +1 -1
  192. package/dist/repository/repository.js +1757 -1818
  193. package/dist/repository/repository.js.map +1 -1
  194. package/dist/runtime/runtime.d.ts +13 -0
  195. package/dist/runtime/runtime.d.ts.map +1 -1
  196. package/dist/runtime/runtime.js +18 -0
  197. package/dist/runtime/runtime.js.map +1 -1
  198. package/dist/runtime/signal-metadata.d.ts.map +1 -1
  199. package/dist/runtime/signal-metadata.js +6 -6
  200. package/dist/runtime/signal-metadata.js.map +1 -1
  201. package/dist/runtime/signal-publisher.d.ts +0 -6
  202. package/dist/runtime/signal-publisher.d.ts.map +1 -1
  203. package/dist/runtime/signal-publisher.js +1 -9
  204. package/dist/runtime/signal-publisher.js.map +1 -1
  205. package/dist/runtime/standalone-handler-runtime.d.ts +0 -7
  206. package/dist/runtime/standalone-handler-runtime.d.ts.map +1 -1
  207. package/dist/runtime/standalone-handler-runtime.js +13 -99
  208. package/dist/runtime/standalone-handler-runtime.js.map +1 -1
  209. package/dist/server/managed-delivery-gate.d.ts +34 -0
  210. package/dist/server/managed-delivery-gate.d.ts.map +1 -0
  211. package/dist/server/managed-delivery-gate.js +70 -0
  212. package/dist/server/managed-delivery-gate.js.map +1 -0
  213. package/dist/server/managed-server-application.d.ts +12 -11
  214. package/dist/server/managed-server-application.d.ts.map +1 -1
  215. package/dist/server/managed-server-application.js +48 -29
  216. package/dist/server/managed-server-application.js.map +1 -1
  217. package/dist/server/node-coordinator.d.ts +18 -5
  218. package/dist/server/node-coordinator.d.ts.map +1 -1
  219. package/dist/server/node-coordinator.js +554 -84
  220. package/dist/server/node-coordinator.js.map +1 -1
  221. package/dist/server/reserved-spine-rpc-paths.json +1 -0
  222. package/dist/server/server-environment.d.ts +220 -25
  223. package/dist/server/server-environment.d.ts.map +1 -1
  224. package/dist/server/server-environment.js +734 -145
  225. package/dist/server/server-environment.js.map +1 -1
  226. package/dist/server/server-log.d.ts +7 -0
  227. package/dist/server/server-log.d.ts.map +1 -1
  228. package/dist/server/server-log.js +14 -1
  229. package/dist/server/server-log.js.map +1 -1
  230. package/dist/server/server.d.ts +60 -29
  231. package/dist/server/server.d.ts.map +1 -1
  232. package/dist/server/server.js +155 -201
  233. package/dist/server/server.js.map +1 -1
  234. package/dist/services/app-query-execution.d.ts +53 -0
  235. package/dist/services/app-query-execution.d.ts.map +1 -0
  236. package/dist/services/app-query-execution.js +408 -0
  237. package/dist/services/app-query-execution.js.map +1 -0
  238. package/dist/services/query-reader.d.ts +32 -7
  239. package/dist/services/query-reader.d.ts.map +1 -1
  240. package/dist/services/query-reader.js +22 -2
  241. package/dist/services/query-reader.js.map +1 -1
  242. package/dist/services/read-request-status.d.ts +65 -0
  243. package/dist/services/read-request-status.d.ts.map +1 -0
  244. package/dist/services/read-request-status.js +151 -0
  245. package/dist/services/read-request-status.js.map +1 -0
  246. package/dist/services/spine-services.d.ts +37 -8
  247. package/dist/services/spine-services.d.ts.map +1 -1
  248. package/dist/services/spine-services.js +1103 -470
  249. package/dist/services/spine-services.js.map +1 -1
  250. package/dist/services/trusted-reader-ingress.d.ts +92 -0
  251. package/dist/services/trusted-reader-ingress.d.ts.map +1 -0
  252. package/dist/services/trusted-reader-ingress.js +89 -0
  253. package/dist/services/trusted-reader-ingress.js.map +1 -0
  254. package/dist/spi/handler-registry.d.ts +2 -0
  255. package/dist/spi/handler-registry.d.ts.map +1 -1
  256. package/dist/spi/handler-registry.js +1 -1
  257. package/dist/spi/handler-registry.js.map +1 -1
  258. package/dist/stand/event-origin-filter.js +3 -3
  259. package/dist/stand/event-origin-filter.js.map +1 -1
  260. package/dist/stand/read-side-filter-engine.d.ts +46 -0
  261. package/dist/stand/read-side-filter-engine.d.ts.map +1 -0
  262. package/dist/stand/read-side-filter-engine.js +356 -0
  263. package/dist/stand/read-side-filter-engine.js.map +1 -0
  264. package/dist/stand/read-side-filter.d.ts +247 -0
  265. package/dist/stand/read-side-filter.d.ts.map +1 -0
  266. package/dist/stand/read-side-filter.js +39 -0
  267. package/dist/stand/read-side-filter.js.map +1 -0
  268. package/dist/stand/read-side-message.d.ts +66 -0
  269. package/dist/stand/read-side-message.d.ts.map +1 -0
  270. package/dist/stand/read-side-message.js +167 -0
  271. package/dist/stand/read-side-message.js.map +1 -0
  272. package/dist/stand/stand-direct-delivery.d.ts +161 -0
  273. package/dist/stand/stand-direct-delivery.d.ts.map +1 -0
  274. package/dist/stand/stand-direct-delivery.js +210 -0
  275. package/dist/stand/stand-direct-delivery.js.map +1 -0
  276. package/dist/stand/stand.d.ts +94 -42
  277. package/dist/stand/stand.d.ts.map +1 -1
  278. package/dist/stand/stand.js +460 -60
  279. package/dist/stand/stand.js.map +1 -1
  280. package/dist/stand/subscription-observer.d.ts.map +1 -1
  281. package/dist/stand/subscription-observer.js +157 -40
  282. package/dist/stand/subscription-observer.js.map +1 -1
  283. package/dist/stand/subscription-read-filters.d.ts +40 -0
  284. package/dist/stand/subscription-read-filters.d.ts.map +1 -0
  285. package/dist/stand/subscription-read-filters.js +91 -0
  286. package/dist/stand/subscription-read-filters.js.map +1 -0
  287. package/dist/stand/subscription-reader-binding.d.ts +20 -0
  288. package/dist/stand/subscription-reader-binding.d.ts.map +1 -0
  289. package/dist/stand/subscription-reader-binding.js +56 -0
  290. package/dist/stand/subscription-reader-binding.js.map +1 -0
  291. package/dist/stand/subscription-records.d.ts +30 -3
  292. package/dist/stand/subscription-records.d.ts.map +1 -1
  293. package/dist/stand/subscription-records.js +61 -16
  294. package/dist/stand/subscription-records.js.map +1 -1
  295. package/dist/stand/subscription-registry.d.ts +54 -15
  296. package/dist/stand/subscription-registry.d.ts.map +1 -1
  297. package/dist/stand/subscription-registry.js +164 -41
  298. package/dist/stand/subscription-registry.js.map +1 -1
  299. package/dist/stand/subscription-runtime.d.ts +12 -5
  300. package/dist/stand/subscription-runtime.d.ts.map +1 -1
  301. package/dist/stand/subscription-runtime.js +183 -34
  302. package/dist/stand/subscription-runtime.js.map +1 -1
  303. package/dist/testing/index.d.ts.map +1 -1
  304. package/dist/testing/index.js +4 -3
  305. package/dist/testing/index.js.map +1 -1
  306. package/dist/tsconfig.tsbuildinfo +1 -1
  307. package/package.json +14 -14
  308. package/dist/agent/agent-admission.d.ts +0 -80
  309. package/dist/agent/agent-admission.d.ts.map +0 -1
  310. package/dist/agent/agent-admission.js +0 -127
  311. package/dist/agent/agent-admission.js.map +0 -1
  312. package/dist/agent/agent-ai-runtime.d.ts +0 -76
  313. package/dist/agent/agent-ai-runtime.d.ts.map +0 -1
  314. package/dist/agent/agent-ai-runtime.js +0 -1269
  315. package/dist/agent/agent-ai-runtime.js.map +0 -1
  316. package/dist/agent/agent-execution-fault.d.ts +0 -18
  317. package/dist/agent/agent-execution-fault.d.ts.map +0 -1
  318. package/dist/agent/agent-execution-fault.js.map +0 -1
  319. package/dist/agent/agent-execution-session.d.ts +0 -103
  320. package/dist/agent/agent-execution-session.d.ts.map +0 -1
  321. package/dist/agent/agent-execution-session.js +0 -238
  322. package/dist/agent/agent-execution-session.js.map +0 -1
  323. package/dist/agent/agent-interaction-audit.d.ts +0 -58
  324. package/dist/agent/agent-interaction-audit.d.ts.map +0 -1
  325. package/dist/agent/agent-interaction-audit.js +0 -114
  326. package/dist/agent/agent-interaction-audit.js.map +0 -1
  327. package/dist/agent/agent-interaction-events.d.ts +0 -40
  328. package/dist/agent/agent-interaction-events.d.ts.map +0 -1
  329. package/dist/agent/agent-interaction-events.js +0 -129
  330. package/dist/agent/agent-interaction-events.js.map +0 -1
  331. package/dist/agent/agent-mcp-budget.d.ts +0 -125
  332. package/dist/agent/agent-mcp-budget.d.ts.map +0 -1
  333. package/dist/agent/agent-mcp-budget.js +0 -566
  334. package/dist/agent/agent-mcp-budget.js.map +0 -1
  335. package/dist/agent/agent-mcp-host.d.ts +0 -125
  336. package/dist/agent/agent-mcp-host.d.ts.map +0 -1
  337. package/dist/agent/agent-mcp-host.js.map +0 -1
  338. package/dist/agent/agent-mcp-runtime.d.ts.map +0 -1
  339. package/dist/agent/agent-mcp-runtime.js.map +0 -1
  340. package/dist/agent/agent-read-runtime.d.ts +0 -70
  341. package/dist/agent/agent-read-runtime.d.ts.map +0 -1
  342. package/dist/agent/agent-read-runtime.js +0 -320
  343. package/dist/agent/agent-read-runtime.js.map +0 -1
  344. package/dist/agent/agent-revisions.d.ts +0 -35
  345. package/dist/agent/agent-revisions.d.ts.map +0 -1
  346. package/dist/agent/agent-revisions.js +0 -133
  347. package/dist/agent/agent-revisions.js.map +0 -1
  348. package/dist/agent/agent-scheduler.d.ts +0 -99
  349. package/dist/agent/agent-scheduler.d.ts.map +0 -1
  350. package/dist/agent/agent-scheduler.js +0 -398
  351. package/dist/agent/agent-scheduler.js.map +0 -1
  352. package/dist/bus/saved-dispatcher-binding.d.ts +0 -53
  353. package/dist/bus/saved-dispatcher-binding.d.ts.map +0 -1
  354. package/dist/bus/saved-dispatcher-binding.js.map +0 -1
  355. package/dist/delivery/delivery-run-coordinator.d.ts +0 -218
  356. package/dist/delivery/delivery-run-coordinator.d.ts.map +0 -1
  357. package/dist/delivery/delivery-run-coordinator.js +0 -609
  358. package/dist/delivery/delivery-run-coordinator.js.map +0 -1
  359. package/dist/delivery/parked-delivery-obligations.d.ts +0 -182
  360. package/dist/delivery/parked-delivery-obligations.d.ts.map +0 -1
  361. package/dist/delivery/parked-delivery-obligations.js +0 -390
  362. package/dist/delivery/parked-delivery-obligations.js.map +0 -1
  363. package/dist/server/environment-attachment.d.ts +0 -356
  364. package/dist/server/environment-attachment.d.ts.map +0 -1
  365. package/dist/server/environment-attachment.js +0 -2062
  366. package/dist/server/environment-attachment.js.map +0 -1
  367. package/dist/server/environment-delivery-records.d.ts +0 -77
  368. package/dist/server/environment-delivery-records.d.ts.map +0 -1
  369. package/dist/server/environment-delivery-records.js +0 -282
  370. package/dist/server/environment-delivery-records.js.map +0 -1
  371. package/dist/server/environment-delivery-worker.d.ts +0 -161
  372. package/dist/server/environment-delivery-worker.d.ts.map +0 -1
  373. package/dist/server/environment-delivery-worker.js +0 -973
  374. package/dist/server/environment-delivery-worker.js.map +0 -1
@@ -12,10 +12,18 @@
12
12
  * the License.
13
13
  */
14
14
  import * as http2 from "node:http2";
15
+ import { clone } from "@bufbuild/protobuf";
16
+ import { ActorContextSchema } from "@spine-event-engine/proto";
17
+ import { snapshotTrustedReader, } from "@spine-event-engine/core/spi/trusted-reader";
15
18
  import { connectNodeAdapter } from "@connectrpc/connect-node";
16
19
  import { BoundedContext, BoundedContextBuilder, boundedContextAccess, } from "../context/bounded-context.js";
17
20
  import { SpineServices, spineServicesAccess, } from "../services/spine-services.js";
18
21
  import { RegisteredTargets } from "../services/registered-targets.js";
22
+ import { AppQueryExecution } from "../services/app-query-execution.js";
23
+ import { ReadSideFilter } from "../stand/read-side-filter.js";
24
+ import { ReadSideFilterEngine } from "../stand/read-side-filter-engine.js";
25
+ import { TypeRegistry } from "@spine-event-engine/core";
26
+ import { registeredProtoModules } from "@spine-event-engine/proto/codegen";
19
27
  import { ProcessServerCoordinator } from "./process-server-coordinator.js";
20
28
  import { CloseErrors, RetryableCloseGroup } from "./retryable-close.js";
21
29
  import { ServerEnvironment, serverEnvironmentAccess } from "./server-environment.js";
@@ -30,10 +38,9 @@ const assemblingStands = new WeakMap();
30
38
  /**
31
39
  * Configures and starts local Spine Connect/gRPC-compatible services.
32
40
  *
33
- * A server assembles its bounded contexts, completes finite environment
34
- * delivery recovery, and opens its generated services before accepting network
35
- * requests. It also owns the ordered cleanup of contexts and resources added
36
- * to this assembly.
41
+ * A server assembles its bounded contexts and opens generated services before
42
+ * accepting network requests. It closes its contexts and added resources in
43
+ * order while environment Delivery remains available to sibling contexts.
37
44
  */
38
45
  export class Server {
39
46
  #host;
@@ -41,14 +48,16 @@ export class Server {
41
48
  #readMaxBytes;
42
49
  #writeMaxBytes;
43
50
  #contexts = [];
44
- #aiRegistry;
45
51
  #resources = [];
46
52
  #listenerLifecycles = [];
53
+ #appQueries;
54
+ #readFilters;
47
55
  #services;
48
56
  #environment;
49
57
  #starting;
50
58
  #startingOwnership;
51
59
  #run;
60
+ #active;
52
61
  #failedStartCleanup;
53
62
  #failedListenerLifecycle;
54
63
  #failedStartConsumed = false;
@@ -63,6 +72,8 @@ export class Server {
63
72
  this.#readMaxBytes = ServerValues.normalizeMessageMaxBytes(options.readMaxBytes ?? defaultMessageMaxBytes, "readMaxBytes");
64
73
  this.#writeMaxBytes = ServerValues.normalizeMessageMaxBytes(options.writeMaxBytes ?? defaultMessageMaxBytes, "writeMaxBytes");
65
74
  this.#contexts.push(...(options.contexts ?? []));
75
+ this.#appQueries = Object.freeze([...(options.appQueries ?? [])]);
76
+ this.#readFilters = Object.freeze([...new Set(options.readSideFilters ?? [])]);
66
77
  this.#resources.push(...(options.resources ?? []));
67
78
  this.#services = options.services ?? {};
68
79
  this.#environment = ServerEnvironment.instance();
@@ -81,10 +92,9 @@ export class Server {
81
92
  /**
82
93
  * Adds one bounded context or builder to the assembly.
83
94
  *
84
- * Builders assemble during {@link start} before recovery and listener open.
85
- * They use {@link ServerEnvironment.storageFactory} unless a more specific
86
- * `withStorageFactory(...)` factory is selected. The running server owns and
87
- * closes added contexts only after services, sessions, and active work stop.
95
+ * Builders assemble during {@link start} before the listener opens.
96
+ * They use {@link ServerEnvironment.storageFactory}. The running server closes
97
+ * added contexts after services, sessions, and active work stop.
88
98
  *
89
99
  * @param context Supplies the context or builder to expose.
90
100
  * @returns This server builder.
@@ -94,15 +104,22 @@ export class Server {
94
104
  return this;
95
105
  }
96
106
  /**
97
- * Sets the default AI registry for Bounded Context builders added to this server.
98
- * An explicit Bounded Context registry takes precedence.
107
+ * Executes a generated application request through this Server's active handler table.
99
108
  *
100
- * @param registry Factory-created deployment registry.
101
- * @returns This server builder.
109
+ * @typeParam Q Generated request with a declared paired response.
110
+ * @param query Generated application request, captured before any await.
111
+ * @param executionContext Effective actor and verified facts from framework execution.
112
+ * @returns The paired generated application result.
102
113
  */
103
- withAi(registry) {
104
- this.#aiRegistry = registry;
105
- return this;
114
+ async query(query, executionContext) {
115
+ const detached = structuredClone(query);
116
+ const actor = clone(ActorContextSchema, executionContext.actorContext);
117
+ const reader = snapshotTrustedReader(executionContext);
118
+ const signal = executionContext.signal;
119
+ const running = this.#starting === undefined ? this.#active : await this.#starting;
120
+ if (!(running instanceof RunningHttp2Server))
121
+ throw new Error("Server App Query execution requires a running Server.");
122
+ return running.queryTyped(detached, actor, reader, signal);
106
123
  }
107
124
  /**
108
125
  * Adds a framework closeable owned by this server assembly.
@@ -128,15 +145,13 @@ export class Server {
128
145
  return this;
129
146
  }
130
147
  /**
131
- * Starts the server after completing assembly and delivery recovery.
148
+ * Starts the server after assembling contexts and services.
132
149
  *
133
- * Built contexts attach to delivery in deterministic input order before the
134
- * generated services and listener open. A failed assembly or listener open
135
- * leaves no listener and closes acquired resources. Network cleanup is a hard
136
- * gate before delivery or dependencies close.
137
- * It shares only a caller-managed active environment generation, rejects
138
- * while run-managed ownership is active, installs no signal handlers, and
139
- * never closes the environment.
150
+ * Built contexts register recipients before generated services and the listener
151
+ * open. A failed assembly or listener open leaves no listener and closes acquired
152
+ * resources. Network cleanup is a hard gate before context or dependency cleanup.
153
+ * Caller-managed startup shares the active environment, rejects during a managed
154
+ * server run, installs no signal handlers, and never closes the environment.
140
155
  * A later call after incomplete cleanup retries only that cleanup and leaves
141
156
  * this server terminal. A fresh server may reuse the singleton environment.
142
157
  * Concurrent callers share one start or cleanup attempt.
@@ -146,6 +161,9 @@ export class Server {
146
161
  start() {
147
162
  return this.#start("caller");
148
163
  }
164
+ /**
165
+ * Shares or begins startup under the selected environment lifecycle mode.
166
+ */
149
167
  #start(ownership) {
150
168
  const current = this.#starting;
151
169
  if (current !== undefined) {
@@ -162,7 +180,7 @@ export class Server {
162
180
  const starting = lifecycle !== undefined
163
181
  ? this.#retryFailedListenerLifecycle(lifecycle)
164
182
  : cleanup === undefined
165
- ? this.#startOnce(ownership)
183
+ ? this.#startOnce()
166
184
  : this.#retryFailedStartCleanup(cleanup);
167
185
  this.#starting = starting;
168
186
  this.#startingOwnership = ownership;
@@ -206,37 +224,35 @@ export class Server {
206
224
  return running;
207
225
  }
208
226
  /**
209
- * Builds contexts, attaches delivery, and opens the listener for one start attempt.
227
+ * Builds contexts and opens the listener for one start attempt.
210
228
  *
211
- * @param ownership Whether the environment is managed by this Server.
212
229
  * @returns The running listener after lifecycle startup.
213
230
  */
214
- async #startOnce(ownership) {
231
+ async #startOnce() {
232
+ await serverEnvironmentAccess.awaitSetup(this.#environment);
215
233
  const admission = { token: {}, contexts: [] };
216
234
  const contexts = await this.#prepareContexts(admission);
217
- const { attachment, routes } = await this.#attachContexts(contexts, ownership, admission);
218
- const running = await this.#openListener(contexts, attachment, routes);
235
+ const routes = await this.#installContexts(contexts, admission);
236
+ const running = await this.#openListener(contexts, routes);
219
237
  await this.#startLifecycles(running);
238
+ this.#active = running;
220
239
  return running;
221
240
  }
222
241
  /**
223
242
  * Opens the service listener with retryable cleanup for every preparation phase.
224
243
  *
225
244
  * @param contexts Contexts exposed by the listener.
226
- * @param attachment Active environment delivery attachment.
227
245
  * @param routes Routes installed for these contexts.
228
246
  * @returns The prepared running listener.
229
247
  */
230
- async #openListener(contexts, attachment, routes) {
248
+ async #openListener(contexts, routes) {
231
249
  const closeables = [...contexts, ...this.#resources];
232
250
  const cleanup = {
233
251
  closeGroup: new RetryableCloseGroup(closeables, "Server start cleanup failed while closing owned contexts/resources."),
234
- attachment,
235
252
  routes,
236
- failedStartRollback: undefined,
237
253
  };
238
254
  try {
239
- return await this.#prepareListener(contexts, attachment, routes, closeables, cleanup);
255
+ return await this.#prepareListener(contexts, routes, closeables, cleanup);
240
256
  }
241
257
  catch (error) {
242
258
  this.#failedStartCleanup = cleanup;
@@ -247,16 +263,13 @@ export class Server {
247
263
  * Constructs services and the HTTP adapter, then binds the listener.
248
264
  *
249
265
  * @param contexts Contexts exposed by this Server.
250
- * @param attachment Active delivery attachment.
251
266
  * @param routes Installed state routes.
252
267
  * @param closeables Contexts and resources for eventual shutdown.
253
268
  * @param cleanup Retained cleanup state if preparation fails.
254
269
  * @returns The prepared running listener.
255
270
  */
256
- async #prepareListener(contexts, attachment, routes, closeables, cleanup) {
257
- const services = new SpineServices({ contexts, ...this.#services });
258
- cleanup.services = services;
259
- spineServicesAccess.installLogger(services, serverEnvironmentAccess.loggerFor(this.#environment));
271
+ async #prepareListener(contexts, routes, closeables, cleanup) {
272
+ const { queries, services } = this.#createReadServices(contexts, routes, cleanup);
260
273
  const { httpServer, sessions } = this.#createHttpListener(services);
261
274
  cleanup.network = { server: httpServer, sessions };
262
275
  const address = await ServerValues.listen(httpServer, this.#host, this.#port);
@@ -265,8 +278,8 @@ export class Server {
265
278
  server: httpServer,
266
279
  sessions,
267
280
  environment: this.#environment,
268
- attachment,
269
281
  routes,
282
+ queries,
270
283
  services,
271
284
  host,
272
285
  port: address.port,
@@ -274,6 +287,31 @@ export class Server {
274
287
  closeables,
275
288
  });
276
289
  }
290
+ /**
291
+ * Installs Server result policies and query execution into one listener's services.
292
+ *
293
+ * @param contexts Exposed Bounded Contexts.
294
+ * @param routes Validated Entity state routes.
295
+ * @param cleanup Retained failure cleanup state.
296
+ * @returns Listener services and App Query execution lifetime.
297
+ */
298
+ #createReadServices(contexts, routes, cleanup) {
299
+ const filters = this.#readFilters.length === 0
300
+ ? undefined
301
+ : new ReadSideFilterEngine(this.#readFilters, TypeRegistry.from(...registeredProtoModules()));
302
+ const queries = new AppQueryExecution(this.#appQueries, routes, filters);
303
+ const services = new SpineServices({
304
+ contexts,
305
+ readMaxBytes: this.#readMaxBytes,
306
+ ...this.#services,
307
+ });
308
+ cleanup.services = services;
309
+ spineServicesAccess.installAppQueries(services, queries);
310
+ if (filters !== undefined)
311
+ spineServicesAccess.installReadFilters(services, filters);
312
+ spineServicesAccess.installLogger(services, serverEnvironmentAccess.loggerFor(this.#environment));
313
+ return { queries, services };
314
+ }
277
315
  /**
278
316
  * Prepares an HTTP listener and its tracked sessions for startup.
279
317
  *
@@ -326,7 +364,7 @@ export class Server {
326
364
  throw conflict;
327
365
  for (const entry of this.#contexts) {
328
366
  const context = boundedContextAccess.isBuilder(entry)
329
- ? await boundedContextAccess.build(entry, this.#environment.storageFactory, this.#aiRegistry)
367
+ ? await boundedContextAccess.build(entry)
330
368
  : entry;
331
369
  if (boundedContextAccess.isBuilder(entry))
332
370
  this.#admitContext(context, admission);
@@ -335,7 +373,7 @@ export class Server {
335
373
  return contexts;
336
374
  }
337
375
  catch (error) {
338
- await this.#cleanupFailedAttachment(admission.contexts, undefined, error, admission);
376
+ await this.#cleanupFailedRegistration(admission.contexts, undefined, error, admission);
339
377
  throw error;
340
378
  }
341
379
  }
@@ -368,14 +406,13 @@ export class Server {
368
406
  admission.contexts.length = 0;
369
407
  }
370
408
  /**
371
- * Validates state routes before delivery recovery can invoke handlers.
409
+ * Installs state routes for the assembled contexts.
372
410
  *
373
411
  * @param contexts Built contexts for this Server.
374
- * @param ownership Environment attachment mode.
375
- * @param admission Reservations transferred to installed routes before attachment.
376
- * @returns The environment attachment and its installed routes.
412
+ * @param admission Reservations transferred to installed routes.
413
+ * @returns The installed routes.
377
414
  */
378
- async #attachContexts(contexts, ownership, admission) {
415
+ async #installContexts(contexts, admission) {
379
416
  const freshContexts = contexts.filter((context) => RegisteredTargets.forStand(context.stand()) === undefined);
380
417
  let routes;
381
418
  try {
@@ -387,42 +424,29 @@ export class Server {
387
424
  boundedContextAccess.installLogger(context, logger);
388
425
  serverEnvironmentAccess.warnVolatileRegistry(this.#environment, context);
389
426
  }
390
- const attachment = await serverEnvironmentAccess.attach(this.#environment, {
391
- ownership,
392
- descriptors: contexts.map((context) => boundedContextAccess.delivery(context)),
393
- });
394
- return { attachment, routes };
427
+ return routes;
395
428
  }
396
429
  catch (error) {
397
- await this.#cleanupFailedAttachment(freshContexts, routes, error, admission);
430
+ await this.#cleanupFailedRegistration(freshContexts, routes, error, admission);
398
431
  throw error;
399
432
  }
400
433
  }
401
434
  /**
402
- * Retains retryable cleanup when route validation or attachment fails.
435
+ * Retains retryable cleanup when route installation fails.
403
436
  *
404
437
  * @param contexts Fresh contexts to close after failure.
405
438
  * @param routes Routes installed by this attempt, if any.
406
- * @param error Original route or attachment failure.
439
+ * @param error Original route failure.
407
440
  * @param admission Reservations retained until context cleanup succeeds.
408
441
  */
409
- async #cleanupFailedAttachment(contexts, routes, error, admission) {
442
+ async #cleanupFailedRegistration(contexts, routes, error, admission) {
410
443
  const closeGroup = new RetryableCloseGroup([...contexts, ...this.#resources], "Server start cleanup failed while closing owned contexts/resources.");
411
- if (serverEnvironmentAccess.failedStartRetryPending(this.#environment, error)) {
412
- this.#failedStartCleanup = {
413
- closeGroup,
414
- failedStartRollback: { rejection: error },
415
- routes,
416
- admission,
417
- };
418
- return;
419
- }
420
444
  try {
421
445
  await closeGroup.close();
422
446
  }
423
447
  catch (cleanupError) {
424
- this.#failedStartCleanup = { closeGroup, failedStartRollback: undefined, routes, admission };
425
- throw ServerValues.attachmentCleanupError(error, cleanupError);
448
+ this.#failedStartCleanup = { closeGroup, routes, admission };
449
+ throw ServerValues.registrationCleanupError(error, cleanupError);
426
450
  }
427
451
  routes?.release();
428
452
  if (admission !== undefined)
@@ -446,6 +470,9 @@ export class Server {
446
470
  throw error;
447
471
  }
448
472
  }
473
+ /**
474
+ * Retries deferred network and resource cleanup from a failed startup, then reports the prior failure.
475
+ */
449
476
  async #retryFailedStartCleanup(cleanup) {
450
477
  const errors = [];
451
478
  if (!(await this.#closeFailedStartNetwork(cleanup, errors))) {
@@ -457,12 +484,18 @@ export class Server {
457
484
  }
458
485
  throw new Error("Server deferred cleanup completed after an earlier failed start.");
459
486
  }
487
+ /**
488
+ * Retries a failed listener lifecycle close and leaves the server terminal.
489
+ */
460
490
  async #retryFailedListenerLifecycle(running) {
461
491
  await running.close();
462
492
  this.#failedListenerLifecycle = undefined;
463
493
  this.#failedStartConsumed = true;
464
494
  throw new Error("Server deferred cleanup completed after an earlier failed start.");
465
495
  }
496
+ /**
497
+ * Cleans up startup resources after listener lifecycle startup fails.
498
+ */
466
499
  async #cleanupFailedListenerStart(cleanup, startError) {
467
500
  const errors = [];
468
501
  if (!(await this.#closeFailedStartNetwork(cleanup, errors))) {
@@ -471,11 +504,10 @@ export class Server {
471
504
  await this.#advanceFailedStartCleanup(cleanup, errors);
472
505
  return ServerValues.throwListenerStartError(startError, errors);
473
506
  }
507
+ /**
508
+ * Closes acquired dependencies and releases startup registrations after network cleanup succeeds.
509
+ */
474
510
  async #advanceFailedStartCleanup(cleanup, errors) {
475
- if (!(await this.#advanceFailedStartAttachment(cleanup, errors))) {
476
- return;
477
- }
478
- await this.#retryFailedStartRollback(cleanup, errors);
479
511
  let closeFailed = false;
480
512
  try {
481
513
  await cleanup.closeGroup.close();
@@ -484,7 +516,7 @@ export class Server {
484
516
  closeFailed = true;
485
517
  CloseErrors.collect(error, errors);
486
518
  }
487
- if (!closeFailed && cleanup.attachment === undefined && this.#failedStartCleanup === cleanup) {
519
+ if (!closeFailed && this.#failedStartCleanup === cleanup) {
488
520
  cleanup.routes?.release();
489
521
  if (cleanup.admission !== undefined)
490
522
  this.#releaseAdmission(cleanup.admission);
@@ -495,26 +527,8 @@ export class Server {
495
527
  }
496
528
  }
497
529
  /**
498
- * Retries environment rollback before closing contexts from a failed start.
499
- *
500
- * @param cleanup Retained failed-start state.
501
- * @param errors Errors collected across cleanup phases.
530
+ * Attempts listener and session shutdown, retaining cleanup state if it fails.
502
531
  */
503
- async #retryFailedStartRollback(cleanup, errors) {
504
- const failedStartRollback = cleanup.failedStartRollback;
505
- if (failedStartRollback !== undefined &&
506
- serverEnvironmentAccess.failedStartRetryPending(this.#environment, failedStartRollback.rejection)) {
507
- try {
508
- await serverEnvironmentAccess.retryFailedStart(this.#environment);
509
- }
510
- catch (error) {
511
- if (serverEnvironmentAccess.failedStartRetryPending(this.#environment, failedStartRollback.rejection)) {
512
- throw error;
513
- }
514
- CloseErrors.collect(error, errors);
515
- }
516
- }
517
- }
518
532
  async #closeFailedStartNetwork(cleanup, errors) {
519
533
  const network = cleanup.network;
520
534
  if (network === undefined) {
@@ -530,34 +544,9 @@ export class Server {
530
544
  return false;
531
545
  }
532
546
  }
533
- async #advanceFailedStartAttachment(cleanup, errors) {
534
- const attachment = cleanup.attachment;
535
- if (attachment === undefined) {
536
- return true;
537
- }
538
- try {
539
- if (serverEnvironmentAccess.detachRetryPending(this.#environment, attachment)) {
540
- await serverEnvironmentAccess.retryDetach(this.#environment, attachment);
541
- }
542
- else {
543
- await serverEnvironmentAccess.detach(this.#environment, attachment);
544
- }
545
- delete cleanup.attachment;
546
- return true;
547
- }
548
- catch (error) {
549
- CloseErrors.collect(error, errors);
550
- }
551
- try {
552
- if (serverEnvironmentAccess.endpointSafe(this.#environment, attachment)) {
553
- return true;
554
- }
555
- }
556
- catch (error) {
557
- CloseErrors.collect(error, errors);
558
- }
559
- return false;
560
- }
547
+ /**
548
+ * Clears the in-progress startup marker after the shared attempt settles.
549
+ */
561
550
  #finishStart(starting) {
562
551
  if (this.#starting === starting) {
563
552
  this.#starting = undefined;
@@ -571,11 +560,17 @@ export class Server {
571
560
  * @internal
572
561
  */
573
562
  export const serverBuilderAccess = Object.freeze({
563
+ /**
564
+ * Reports whether the configured server host resolves to a loopback address.
565
+ */
574
566
  isLoopback(server) {
575
567
  const host = serverHosts.get(server);
576
568
  return host !== undefined && isLoopbackHost(host);
577
569
  },
578
570
  });
571
+ /**
572
+ * Recognizes IPv4 and IPv6 loopback host spellings accepted by the server.
573
+ */
579
574
  function isLoopbackHost(host) {
580
575
  if (host === "::1" || host === "::ffff:127.0.0.1")
581
576
  return true;
@@ -588,11 +583,17 @@ function isLoopbackHost(host) {
588
583
  * @internal
589
584
  */
590
585
  export const runningServerAccess = Object.freeze({
586
+ /**
587
+ * Returns subscription registries for contexts in this running server, when available.
588
+ */
591
589
  subscriptionRegistries(server) {
592
590
  return runningContexts
593
591
  .get(server)
594
592
  ?.map((context) => boundedContextAccess.subscriptionRegistry(context));
595
593
  },
594
+ /**
595
+ * Waits for admitted Delivery work across this server’s contexts to settle.
596
+ */
596
597
  drainDelivery(server) {
597
598
  return server instanceof RunningHttp2Server ? server.drainDelivery() : Promise.resolve();
598
599
  },
@@ -608,15 +609,14 @@ class RunningHttp2Server {
608
609
  #listenerLifecycles;
609
610
  #startedLifecycles = [];
610
611
  #environment;
611
- #attachment;
612
612
  #routes;
613
613
  #services;
614
+ #queries;
614
615
  host;
615
616
  port;
616
617
  baseUrl;
617
618
  #closed;
618
619
  #networkClosed = false;
619
- #attachmentDetached = false;
620
620
  #closeGroup;
621
621
  /**
622
622
  * Captures the running listener's network, environment, and cleanup resources.
@@ -630,20 +630,36 @@ class RunningHttp2Server {
630
630
  this.#contexts = options.contexts;
631
631
  this.#listenerLifecycles = options.listenerLifecycles;
632
632
  this.#environment = options.environment;
633
- this.#attachment = options.attachment;
634
633
  this.#routes = options.routes;
635
634
  this.#services = options.services;
635
+ this.#queries = options.queries;
636
636
  this.host = options.host;
637
637
  this.port = options.port;
638
638
  this.baseUrl = `http://${ServerValues.formatHostForUrl(options.host)}:${options.port.toString()}`;
639
639
  this.#closeGroup = new RetryableCloseGroup(this.#closeables, "Server close failed while closing owned contexts/resources.");
640
640
  }
641
+ /**
642
+ * Dispatches a generated request only while this listener remains active.
643
+ *
644
+ * @typeParam Q Generated application request with a paired response.
645
+ * @param query Captured generated request.
646
+ * @param actor Current effective actor and tenant.
647
+ * @param reader Verified current invocation facts.
648
+ * @param signal Current invocation cancellation, when available.
649
+ * @returns The paired generated application result.
650
+ */
651
+ queryTyped(query, actor, reader, signal) {
652
+ if (this.#closed !== undefined)
653
+ return Promise.reject(new Error("Server App Query execution is closed."));
654
+ return this.#queries.executeTyped(query, actor, reader, signal);
655
+ }
641
656
  /**
642
657
  * Closes this listener once, preserving a failed close for retry.
643
658
  *
644
659
  * @returns Completion after resources close.
645
660
  */
646
661
  close() {
662
+ this.#queries.beginClose();
647
663
  this.#closed ??= this.#closeOnce().catch((error) => {
648
664
  this.#closed = undefined;
649
665
  throw error;
@@ -651,9 +667,9 @@ class RunningHttp2Server {
651
667
  return this.#closed;
652
668
  }
653
669
  /**
654
- * Starts listener-ready attachments after the native listener accepts connections.
670
+ * Starts listener lifecycles after the native listener accepts connections.
655
671
  *
656
- * @returns Completes after all attachments start or their admitted rollback settles.
672
+ * @returns Completes after all listener lifecycles start or their rollback settles.
657
673
  */
658
674
  async startLifecycles() {
659
675
  try {
@@ -681,20 +697,12 @@ class RunningHttp2Server {
681
697
  return this.#closed === undefined;
682
698
  }
683
699
  /**
684
- * Completes the server's Delivery detachment while network sessions remain available.
700
+ * Waits for the environment's admitted Delivery work.
685
701
  *
686
- * @returns Completion after the attachment drains.
702
+ * @returns Completion after active shard runs settle.
687
703
  */
688
- async drainDelivery() {
689
- if (this.#attachmentDetached)
690
- return;
691
- if (serverEnvironmentAccess.detachRetryPending(this.#environment, this.#attachment)) {
692
- await serverEnvironmentAccess.retryDetach(this.#environment, this.#attachment);
693
- }
694
- else {
695
- await serverEnvironmentAccess.detach(this.#environment, this.#attachment);
696
- }
697
- this.#attachmentDetached = true;
704
+ drainDelivery() {
705
+ return serverEnvironmentAccess.whenDeliveryIdle(this.#environment);
698
706
  }
699
707
  /**
700
708
  * Closes network, delivery, accepted context work, and registered resources.
@@ -703,7 +711,6 @@ class RunningHttp2Server {
703
711
  */
704
712
  async #closeOnce() {
705
713
  await this.#closeListenerAndNetwork();
706
- const { detachErrors, detachRejected } = await this.#detachDelivery();
707
714
  const errors = [];
708
715
  try {
709
716
  await this.#drainContexts();
@@ -718,14 +725,6 @@ class RunningHttp2Server {
718
725
  catch (error) {
719
726
  errors.push(error);
720
727
  }
721
- if (detachRejected) {
722
- if (errors.length === 0)
723
- ServerValues.throwRunningDetachErrors(detachErrors);
724
- const combined = [...detachErrors];
725
- for (const error of errors)
726
- CloseErrors.collect(error, combined);
727
- throw new AggregateError(combined, "Server close failed while draining contexts and resources.");
728
- }
729
728
  if (errors.length > 1)
730
729
  throw new AggregateError(errors, "Server close failed while draining contexts and resources.");
731
730
  if (errors.length === 1)
@@ -733,7 +732,7 @@ class RunningHttp2Server {
733
732
  spineServicesAccess.clearLogger(this.#services);
734
733
  }
735
734
  /**
736
- * Closes lifecycle attachments and network intake before delivery detachment.
735
+ * Closes lifecycle callbacks and network intake before context cleanup.
737
736
  *
738
737
  * @returns Completion after the listener and sessions close.
739
738
  */
@@ -750,53 +749,20 @@ class RunningHttp2Server {
750
749
  this.#networkClosed = true;
751
750
  }
752
751
  }
753
- /**
754
- * Completes Delivery detachment while retaining errors for safe endpoint cleanup.
755
- *
756
- * @returns Detachment errors and whether detachment itself was rejected.
757
- */
758
- async #detachDelivery() {
759
- const detachErrors = [];
760
- let detachRejected = false;
761
- if (!this.#attachmentDetached) {
762
- try {
763
- if (serverEnvironmentAccess.detachRetryPending(this.#environment, this.#attachment)) {
764
- await serverEnvironmentAccess.retryDetach(this.#environment, this.#attachment);
765
- }
766
- else {
767
- await serverEnvironmentAccess.detach(this.#environment, this.#attachment);
768
- }
769
- this.#attachmentDetached = true;
770
- }
771
- catch (error) {
772
- detachRejected = true;
773
- CloseErrors.collect(error, detachErrors);
774
- }
775
- if (detachRejected) {
776
- let endpointSafe = false;
777
- try {
778
- endpointSafe = serverEnvironmentAccess.endpointSafe(this.#environment, this.#attachment);
779
- }
780
- catch (error) {
781
- CloseErrors.collect(error, detachErrors);
782
- }
783
- if (!endpointSafe) {
784
- ServerValues.throwRunningDetachErrors(detachErrors);
785
- }
786
- }
787
- }
788
- return { detachErrors, detachRejected };
789
- }
790
752
  /**
791
753
  * Waits for every context's accepted work before any Stand closes.
792
754
  *
793
755
  * @returns Completion after all context work drains.
794
756
  */
795
757
  async #drainContexts() {
758
+ await this.#queries.drain();
796
759
  for (const context of this.#contexts)
797
760
  boundedContextAccess.beginClose(context);
798
761
  const drained = await Promise.allSettled(this.#contexts.map((context) => boundedContextAccess.drainWork(context)));
799
- const drainErrors = drained.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
762
+ const delivery = await Promise.allSettled([
763
+ serverEnvironmentAccess.whenDeliveryIdle(this.#environment),
764
+ ]);
765
+ const drainErrors = [...drained, ...delivery].flatMap((result) => result.status === "rejected" ? [result.reason] : []);
800
766
  if (drainErrors.length > 0) {
801
767
  throw new AggregateError(drainErrors, "Server close failed while draining contexts.");
802
768
  }
@@ -859,17 +825,17 @@ const ServerValues = Object.freeze({
859
825
  });
860
826
  },
861
827
  /**
862
- * Collects attachment and immediate cleanup failures for startup reporting.
828
+ * Collects route registration and immediate cleanup failures for startup reporting.
863
829
  *
864
- * @param startError Attachment or duplicate registration failure.
830
+ * @param startError Route or duplicate registration failure.
865
831
  * @param cleanupError Failure while closing prepared resources.
866
832
  * @returns Both failures in one AggregateError.
867
833
  */
868
- attachmentCleanupError(startError, cleanupError) {
834
+ registrationCleanupError(startError, cleanupError) {
869
835
  const errors = [];
870
836
  CloseErrors.collect(startError, errors);
871
837
  CloseErrors.collect(cleanupError, errors);
872
- return new AggregateError(errors, "Server attachment failed and immediate dependency cleanup also failed.");
838
+ return new AggregateError(errors, "Server registration failed and immediate dependency cleanup also failed.");
873
839
  },
874
840
  /**
875
841
  * Throws one deferred cleanup failure or groups several.
@@ -901,18 +867,6 @@ const ServerValues = Object.freeze({
901
867
  }
902
868
  throw new AggregateError(errors, "Server start failed while opening listener and cleanup also failed.");
903
869
  },
904
- /**
905
- * Throws one delivery-detachment error or groups several.
906
- *
907
- * @param errors Delivery-detachment failures.
908
- * @returns Never; this method throws.
909
- */
910
- throwRunningDetachErrors(errors) {
911
- if (errors.length === 1) {
912
- throw errors[0];
913
- }
914
- throw new AggregateError(errors, "Server close failed while detaching delivery.");
915
- },
916
870
  /**
917
871
  * Closes the HTTP/2 server and all tracked sessions.
918
872
  *