@qlever-llc/trellis 0.10.22 → 0.11.0-rc.1

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 (406) hide show
  1. package/esm/auth/mod.d.ts +1 -1
  2. package/esm/auth/mod.d.ts.map +1 -1
  3. package/esm/auth/mod.js +1 -1
  4. package/esm/auth/protocol.d.ts +55 -0
  5. package/esm/auth/protocol.d.ts.map +1 -1
  6. package/esm/browser.d.ts +3 -3
  7. package/esm/browser.d.ts.map +1 -1
  8. package/esm/browser.js +1 -1
  9. package/esm/client_connect.d.ts +12 -3
  10. package/esm/client_connect.d.ts.map +1 -1
  11. package/esm/client_connect.js +112 -7
  12. package/esm/codec.d.ts +7 -6
  13. package/esm/codec.d.ts.map +1 -1
  14. package/esm/codec.js +125 -6
  15. package/esm/contract_support/canonical.d.ts +3 -0
  16. package/esm/contract_support/canonical.d.ts.map +1 -1
  17. package/esm/contract_support/canonical.js +3 -0
  18. package/esm/contract_support/mod.d.ts +125 -10
  19. package/esm/contract_support/mod.d.ts.map +1 -1
  20. package/esm/contract_support/mod.js +159 -5
  21. package/esm/contract_support/protocol.d.ts +92 -7
  22. package/esm/contract_support/protocol.d.ts.map +1 -1
  23. package/esm/contract_support/protocol.js +41 -7
  24. package/esm/contract_support/runtime.d.ts +4 -1
  25. package/esm/contract_support/runtime.d.ts.map +1 -1
  26. package/esm/errors/SchemaValidationError.d.ts +49 -0
  27. package/esm/errors/SchemaValidationError.d.ts.map +1 -0
  28. package/esm/errors/SchemaValidationError.js +67 -0
  29. package/esm/errors/index.d.ts +38 -9
  30. package/esm/errors/index.d.ts.map +1 -1
  31. package/esm/errors/index.js +16 -0
  32. package/esm/generated-sdk/auth/api.d.ts +33 -605
  33. package/esm/generated-sdk/auth/api.d.ts.map +1 -1
  34. package/esm/generated-sdk/auth/api.js +6 -1
  35. package/esm/generated-sdk/auth/client.d.ts +129 -134
  36. package/esm/generated-sdk/auth/client.d.ts.map +1 -1
  37. package/esm/generated-sdk/auth/contract.d.ts +2 -601
  38. package/esm/generated-sdk/auth/contract.d.ts.map +1 -1
  39. package/esm/generated-sdk/auth/contract.js +310 -93
  40. package/esm/generated-sdk/auth/mod.d.ts +1 -1
  41. package/esm/generated-sdk/auth/mod.d.ts.map +1 -1
  42. package/esm/generated-sdk/auth/owned_api.d.ts +88 -86
  43. package/esm/generated-sdk/auth/owned_api.d.ts.map +1 -1
  44. package/esm/generated-sdk/auth/owned_api.js +6 -0
  45. package/esm/generated-sdk/auth/schemas.d.ts +284 -136
  46. package/esm/generated-sdk/auth/schemas.d.ts.map +1 -1
  47. package/esm/generated-sdk/auth/schemas.js +231 -92
  48. package/esm/generated-sdk/auth/types.d.ts +565 -89
  49. package/esm/generated-sdk/auth/types.d.ts.map +1 -1
  50. package/esm/generated-sdk/auth/types.js +1 -1
  51. package/esm/generated-sdk/health/api.d.ts +29 -18
  52. package/esm/generated-sdk/health/api.d.ts.map +1 -1
  53. package/esm/generated-sdk/health/client.d.ts +7 -21
  54. package/esm/generated-sdk/health/client.d.ts.map +1 -1
  55. package/esm/generated-sdk/health/contract.d.ts +2 -15
  56. package/esm/generated-sdk/health/contract.d.ts.map +1 -1
  57. package/esm/generated-sdk/health/contract.js +2 -10
  58. package/esm/generated-sdk/health/mod.d.ts +1 -1
  59. package/esm/generated-sdk/health/mod.d.ts.map +1 -1
  60. package/esm/generated-sdk/health/owned_api.d.ts +2 -2
  61. package/esm/generated-sdk/health/schemas.d.ts +1 -14
  62. package/esm/generated-sdk/health/schemas.d.ts.map +1 -1
  63. package/esm/generated-sdk/health/schemas.js +1 -9
  64. package/esm/generated-sdk/health/types.d.ts +10 -5
  65. package/esm/generated-sdk/health/types.d.ts.map +1 -1
  66. package/esm/generated-sdk/health/types.js +1 -2
  67. package/esm/generated-sdk/jobs/api.d.ts +29 -109
  68. package/esm/generated-sdk/jobs/api.d.ts.map +1 -1
  69. package/esm/generated-sdk/jobs/client.d.ts +21 -33
  70. package/esm/generated-sdk/jobs/client.d.ts.map +1 -1
  71. package/esm/generated-sdk/jobs/contract.d.ts +2 -106
  72. package/esm/generated-sdk/jobs/contract.d.ts.map +1 -1
  73. package/esm/generated-sdk/jobs/contract.js +268 -1
  74. package/esm/generated-sdk/jobs/mod.d.ts +1 -1
  75. package/esm/generated-sdk/jobs/mod.d.ts.map +1 -1
  76. package/esm/generated-sdk/jobs/owned_api.d.ts +22 -9
  77. package/esm/generated-sdk/jobs/owned_api.d.ts.map +1 -1
  78. package/esm/generated-sdk/jobs/owned_api.js +20 -1
  79. package/esm/generated-sdk/jobs/schemas.d.ts +437 -0
  80. package/esm/generated-sdk/jobs/schemas.d.ts.map +1 -1
  81. package/esm/generated-sdk/jobs/schemas.js +211 -0
  82. package/esm/generated-sdk/jobs/types.d.ts +195 -12
  83. package/esm/generated-sdk/jobs/types.d.ts.map +1 -1
  84. package/esm/generated-sdk/jobs/types.js +1 -1
  85. package/esm/generated-sdk/state/api.d.ts +29 -68
  86. package/esm/generated-sdk/state/api.d.ts.map +1 -1
  87. package/esm/generated-sdk/state/client.d.ts +17 -31
  88. package/esm/generated-sdk/state/client.d.ts.map +1 -1
  89. package/esm/generated-sdk/state/contract.d.ts +1 -64
  90. package/esm/generated-sdk/state/contract.d.ts.map +1 -1
  91. package/esm/generated-sdk/state/mod.d.ts +1 -1
  92. package/esm/generated-sdk/state/mod.d.ts.map +1 -1
  93. package/esm/generated-sdk/state/owned_api.d.ts +7 -7
  94. package/esm/generated-sdk/state/types.d.ts +52 -9
  95. package/esm/generated-sdk/state/types.d.ts.map +1 -1
  96. package/esm/generated-sdk/trellis-core/api.d.ts +33 -45
  97. package/esm/generated-sdk/trellis-core/api.d.ts.map +1 -1
  98. package/esm/generated-sdk/trellis-core/api.js +6 -1
  99. package/esm/generated-sdk/trellis-core/client.d.ts +31 -20
  100. package/esm/generated-sdk/trellis-core/client.d.ts.map +1 -1
  101. package/esm/generated-sdk/trellis-core/contract.d.ts +2 -41
  102. package/esm/generated-sdk/trellis-core/contract.d.ts.map +1 -1
  103. package/esm/generated-sdk/trellis-core/contract.js +91 -1
  104. package/esm/generated-sdk/trellis-core/mod.d.ts +1 -1
  105. package/esm/generated-sdk/trellis-core/mod.d.ts.map +1 -1
  106. package/esm/generated-sdk/trellis-core/owned_api.d.ts +4 -4
  107. package/esm/generated-sdk/trellis-core/schemas.d.ts +113 -0
  108. package/esm/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
  109. package/esm/generated-sdk/trellis-core/schemas.js +81 -0
  110. package/esm/generated-sdk/trellis-core/types.d.ts +54 -7
  111. package/esm/generated-sdk/trellis-core/types.d.ts.map +1 -1
  112. package/esm/generated-sdk/trellis-core/types.js +1 -1
  113. package/esm/health.d.ts +1 -1
  114. package/esm/health.d.ts.map +1 -1
  115. package/esm/health.js +1 -1
  116. package/esm/index.d.ts +4 -4
  117. package/esm/index.d.ts.map +1 -1
  118. package/esm/index.js +2 -2
  119. package/esm/jobs.d.ts +69 -3
  120. package/esm/jobs.d.ts.map +1 -1
  121. package/esm/jobs.js +92 -3
  122. package/esm/server/health.d.ts +2 -6
  123. package/esm/server/health.d.ts.map +1 -1
  124. package/esm/server/health_schemas.d.ts +0 -8
  125. package/esm/server/health_schemas.d.ts.map +1 -1
  126. package/esm/server/health_schemas.js +0 -5
  127. package/esm/server/internal_jobs/bindings.d.ts +11 -0
  128. package/esm/server/internal_jobs/bindings.d.ts.map +1 -1
  129. package/esm/server/internal_jobs/job-manager.d.ts +58 -2
  130. package/esm/server/internal_jobs/job-manager.d.ts.map +1 -1
  131. package/esm/server/internal_jobs/job-manager.js +429 -55
  132. package/esm/server/internal_jobs/key-coordinator.d.ts +269 -0
  133. package/esm/server/internal_jobs/key-coordinator.d.ts.map +1 -0
  134. package/esm/server/internal_jobs/key-coordinator.js +677 -0
  135. package/esm/server/internal_jobs/projection.d.ts.map +1 -1
  136. package/esm/server/internal_jobs/projection.js +2 -0
  137. package/esm/server/internal_jobs/runtime-worker.d.ts +5 -1
  138. package/esm/server/internal_jobs/runtime-worker.d.ts.map +1 -1
  139. package/esm/server/internal_jobs/runtime-worker.js +14 -2
  140. package/esm/server/internal_jobs/types.d.ts +5 -5
  141. package/esm/server/internal_jobs/types.d.ts.map +1 -1
  142. package/esm/server/internal_jobs/types.js +6 -0
  143. package/esm/server/runtime.d.ts.map +1 -1
  144. package/esm/server/service.d.ts +81 -112
  145. package/esm/server/service.d.ts.map +1 -1
  146. package/esm/server/service.js +372 -130
  147. package/esm/server.d.ts +3 -3
  148. package/esm/server.d.ts.map +1 -1
  149. package/esm/service/deno.d.ts +1 -1
  150. package/esm/service/deno.d.ts.map +1 -1
  151. package/esm/service/drizzle.d.ts +52 -0
  152. package/esm/service/drizzle.d.ts.map +1 -0
  153. package/esm/service/drizzle.js +108 -0
  154. package/esm/service/mod.d.ts +3 -3
  155. package/esm/service/mod.d.ts.map +1 -1
  156. package/esm/service/mod.js +2 -2
  157. package/esm/service/node.d.ts +1 -1
  158. package/esm/service/node.d.ts.map +1 -1
  159. package/esm/service/outbox_inbox.d.ts +76 -22
  160. package/esm/service/outbox_inbox.d.ts.map +1 -1
  161. package/esm/service/outbox_inbox.js +231 -70
  162. package/esm/telemetry/metrics.d.ts +55 -0
  163. package/esm/telemetry/metrics.d.ts.map +1 -1
  164. package/esm/telemetry/metrics.js +86 -0
  165. package/esm/telemetry/mod.d.ts +2 -1
  166. package/esm/telemetry/mod.d.ts.map +1 -1
  167. package/esm/telemetry/mod.js +1 -1
  168. package/esm/trellis.d.ts +62 -30
  169. package/esm/trellis.d.ts.map +1 -1
  170. package/esm/trellis.js +125 -42
  171. package/package.json +14 -2
  172. package/script/auth/mod.d.ts +1 -1
  173. package/script/auth/mod.d.ts.map +1 -1
  174. package/script/auth/mod.js +11 -4
  175. package/script/auth/protocol.d.ts +55 -0
  176. package/script/auth/protocol.d.ts.map +1 -1
  177. package/script/browser.d.ts +3 -3
  178. package/script/browser.d.ts.map +1 -1
  179. package/script/browser.js +3 -2
  180. package/script/client_connect.d.ts +12 -3
  181. package/script/client_connect.d.ts.map +1 -1
  182. package/script/client_connect.js +111 -6
  183. package/script/codec.d.ts +7 -6
  184. package/script/codec.d.ts.map +1 -1
  185. package/script/codec.js +124 -5
  186. package/script/contract_support/canonical.d.ts +3 -0
  187. package/script/contract_support/canonical.d.ts.map +1 -1
  188. package/script/contract_support/canonical.js +3 -0
  189. package/script/contract_support/mod.d.ts +125 -10
  190. package/script/contract_support/mod.d.ts.map +1 -1
  191. package/script/contract_support/mod.js +165 -5
  192. package/script/contract_support/protocol.d.ts +92 -7
  193. package/script/contract_support/protocol.d.ts.map +1 -1
  194. package/script/contract_support/protocol.js +42 -8
  195. package/script/contract_support/runtime.d.ts +4 -1
  196. package/script/contract_support/runtime.d.ts.map +1 -1
  197. package/script/errors/SchemaValidationError.d.ts +49 -0
  198. package/script/errors/SchemaValidationError.d.ts.map +1 -0
  199. package/script/errors/SchemaValidationError.js +74 -0
  200. package/script/errors/index.d.ts +38 -9
  201. package/script/errors/index.d.ts.map +1 -1
  202. package/script/errors/index.js +20 -1
  203. package/script/generated-sdk/auth/api.d.ts +33 -605
  204. package/script/generated-sdk/auth/api.d.ts.map +1 -1
  205. package/script/generated-sdk/auth/api.js +6 -1
  206. package/script/generated-sdk/auth/client.d.ts +129 -134
  207. package/script/generated-sdk/auth/client.d.ts.map +1 -1
  208. package/script/generated-sdk/auth/contract.d.ts +2 -601
  209. package/script/generated-sdk/auth/contract.d.ts.map +1 -1
  210. package/script/generated-sdk/auth/contract.js +310 -93
  211. package/script/generated-sdk/auth/mod.d.ts +1 -1
  212. package/script/generated-sdk/auth/mod.d.ts.map +1 -1
  213. package/script/generated-sdk/auth/owned_api.d.ts +88 -86
  214. package/script/generated-sdk/auth/owned_api.d.ts.map +1 -1
  215. package/script/generated-sdk/auth/owned_api.js +6 -0
  216. package/script/generated-sdk/auth/schemas.d.ts +284 -136
  217. package/script/generated-sdk/auth/schemas.d.ts.map +1 -1
  218. package/script/generated-sdk/auth/schemas.js +231 -92
  219. package/script/generated-sdk/auth/types.d.ts +565 -89
  220. package/script/generated-sdk/auth/types.d.ts.map +1 -1
  221. package/script/generated-sdk/auth/types.js +1 -1
  222. package/script/generated-sdk/health/api.d.ts +29 -18
  223. package/script/generated-sdk/health/api.d.ts.map +1 -1
  224. package/script/generated-sdk/health/client.d.ts +7 -21
  225. package/script/generated-sdk/health/client.d.ts.map +1 -1
  226. package/script/generated-sdk/health/contract.d.ts +2 -15
  227. package/script/generated-sdk/health/contract.d.ts.map +1 -1
  228. package/script/generated-sdk/health/contract.js +2 -10
  229. package/script/generated-sdk/health/mod.d.ts +1 -1
  230. package/script/generated-sdk/health/mod.d.ts.map +1 -1
  231. package/script/generated-sdk/health/owned_api.d.ts +2 -2
  232. package/script/generated-sdk/health/schemas.d.ts +1 -14
  233. package/script/generated-sdk/health/schemas.d.ts.map +1 -1
  234. package/script/generated-sdk/health/schemas.js +1 -9
  235. package/script/generated-sdk/health/types.d.ts +10 -5
  236. package/script/generated-sdk/health/types.d.ts.map +1 -1
  237. package/script/generated-sdk/health/types.js +1 -2
  238. package/script/generated-sdk/jobs/api.d.ts +29 -109
  239. package/script/generated-sdk/jobs/api.d.ts.map +1 -1
  240. package/script/generated-sdk/jobs/client.d.ts +21 -33
  241. package/script/generated-sdk/jobs/client.d.ts.map +1 -1
  242. package/script/generated-sdk/jobs/contract.d.ts +2 -106
  243. package/script/generated-sdk/jobs/contract.d.ts.map +1 -1
  244. package/script/generated-sdk/jobs/contract.js +268 -1
  245. package/script/generated-sdk/jobs/mod.d.ts +1 -1
  246. package/script/generated-sdk/jobs/mod.d.ts.map +1 -1
  247. package/script/generated-sdk/jobs/owned_api.d.ts +22 -9
  248. package/script/generated-sdk/jobs/owned_api.d.ts.map +1 -1
  249. package/script/generated-sdk/jobs/owned_api.js +19 -0
  250. package/script/generated-sdk/jobs/schemas.d.ts +437 -0
  251. package/script/generated-sdk/jobs/schemas.d.ts.map +1 -1
  252. package/script/generated-sdk/jobs/schemas.js +212 -1
  253. package/script/generated-sdk/jobs/types.d.ts +195 -12
  254. package/script/generated-sdk/jobs/types.d.ts.map +1 -1
  255. package/script/generated-sdk/jobs/types.js +1 -1
  256. package/script/generated-sdk/state/api.d.ts +29 -68
  257. package/script/generated-sdk/state/api.d.ts.map +1 -1
  258. package/script/generated-sdk/state/client.d.ts +17 -31
  259. package/script/generated-sdk/state/client.d.ts.map +1 -1
  260. package/script/generated-sdk/state/contract.d.ts +1 -64
  261. package/script/generated-sdk/state/contract.d.ts.map +1 -1
  262. package/script/generated-sdk/state/mod.d.ts +1 -1
  263. package/script/generated-sdk/state/mod.d.ts.map +1 -1
  264. package/script/generated-sdk/state/owned_api.d.ts +7 -7
  265. package/script/generated-sdk/state/types.d.ts +52 -9
  266. package/script/generated-sdk/state/types.d.ts.map +1 -1
  267. package/script/generated-sdk/trellis-core/api.d.ts +33 -45
  268. package/script/generated-sdk/trellis-core/api.d.ts.map +1 -1
  269. package/script/generated-sdk/trellis-core/api.js +6 -1
  270. package/script/generated-sdk/trellis-core/client.d.ts +31 -20
  271. package/script/generated-sdk/trellis-core/client.d.ts.map +1 -1
  272. package/script/generated-sdk/trellis-core/contract.d.ts +2 -41
  273. package/script/generated-sdk/trellis-core/contract.d.ts.map +1 -1
  274. package/script/generated-sdk/trellis-core/contract.js +91 -1
  275. package/script/generated-sdk/trellis-core/mod.d.ts +1 -1
  276. package/script/generated-sdk/trellis-core/mod.d.ts.map +1 -1
  277. package/script/generated-sdk/trellis-core/owned_api.d.ts +4 -4
  278. package/script/generated-sdk/trellis-core/schemas.d.ts +113 -0
  279. package/script/generated-sdk/trellis-core/schemas.d.ts.map +1 -1
  280. package/script/generated-sdk/trellis-core/schemas.js +81 -0
  281. package/script/generated-sdk/trellis-core/types.d.ts +54 -7
  282. package/script/generated-sdk/trellis-core/types.d.ts.map +1 -1
  283. package/script/generated-sdk/trellis-core/types.js +1 -1
  284. package/script/health.d.ts +1 -1
  285. package/script/health.d.ts.map +1 -1
  286. package/script/health.js +1 -2
  287. package/script/index.d.ts +4 -4
  288. package/script/index.d.ts.map +1 -1
  289. package/script/index.js +2 -2
  290. package/script/jobs.d.ts +69 -3
  291. package/script/jobs.d.ts.map +1 -1
  292. package/script/jobs.js +93 -3
  293. package/script/server/health.d.ts +2 -6
  294. package/script/server/health.d.ts.map +1 -1
  295. package/script/server/health_schemas.d.ts +0 -8
  296. package/script/server/health_schemas.d.ts.map +1 -1
  297. package/script/server/health_schemas.js +1 -6
  298. package/script/server/internal_jobs/bindings.d.ts +11 -0
  299. package/script/server/internal_jobs/bindings.d.ts.map +1 -1
  300. package/script/server/internal_jobs/job-manager.d.ts +58 -2
  301. package/script/server/internal_jobs/job-manager.d.ts.map +1 -1
  302. package/script/server/internal_jobs/job-manager.js +429 -54
  303. package/script/server/internal_jobs/key-coordinator.d.ts +269 -0
  304. package/script/server/internal_jobs/key-coordinator.d.ts.map +1 -0
  305. package/script/server/internal_jobs/key-coordinator.js +690 -0
  306. package/script/server/internal_jobs/projection.d.ts.map +1 -1
  307. package/script/server/internal_jobs/projection.js +2 -0
  308. package/script/server/internal_jobs/runtime-worker.d.ts +5 -1
  309. package/script/server/internal_jobs/runtime-worker.d.ts.map +1 -1
  310. package/script/server/internal_jobs/runtime-worker.js +14 -2
  311. package/script/server/internal_jobs/types.d.ts +5 -5
  312. package/script/server/internal_jobs/types.d.ts.map +1 -1
  313. package/script/server/internal_jobs/types.js +6 -0
  314. package/script/server/runtime.d.ts.map +1 -1
  315. package/script/server/service.d.ts +81 -112
  316. package/script/server/service.d.ts.map +1 -1
  317. package/script/server/service.js +369 -127
  318. package/script/server.d.ts +3 -3
  319. package/script/server.d.ts.map +1 -1
  320. package/script/service/deno.d.ts +1 -1
  321. package/script/service/deno.d.ts.map +1 -1
  322. package/script/service/drizzle.d.ts +52 -0
  323. package/script/service/drizzle.d.ts.map +1 -0
  324. package/script/service/drizzle.js +113 -0
  325. package/script/service/mod.d.ts +3 -3
  326. package/script/service/mod.d.ts.map +1 -1
  327. package/script/service/mod.js +4 -3
  328. package/script/service/node.d.ts +1 -1
  329. package/script/service/node.d.ts.map +1 -1
  330. package/script/service/outbox_inbox.d.ts +76 -22
  331. package/script/service/outbox_inbox.d.ts.map +1 -1
  332. package/script/service/outbox_inbox.js +233 -70
  333. package/script/telemetry/metrics.d.ts +55 -0
  334. package/script/telemetry/metrics.d.ts.map +1 -1
  335. package/script/telemetry/metrics.js +88 -0
  336. package/script/telemetry/mod.d.ts +2 -1
  337. package/script/telemetry/mod.d.ts.map +1 -1
  338. package/script/telemetry/mod.js +3 -1
  339. package/script/trellis.d.ts +62 -30
  340. package/script/trellis.d.ts.map +1 -1
  341. package/script/trellis.js +124 -41
  342. package/src/auth/mod.ts +7 -0
  343. package/src/browser.ts +5 -7
  344. package/src/client_connect.ts +200 -12
  345. package/src/codec.ts +186 -11
  346. package/src/contract_support/canonical.ts +3 -0
  347. package/src/contract_support/mod.ts +380 -9
  348. package/src/contract_support/protocol.ts +57 -10
  349. package/src/contract_support/runtime.ts +7 -0
  350. package/src/errors/SchemaValidationError.ts +67 -0
  351. package/src/errors/index.ts +28 -0
  352. package/src/health.ts +0 -1
  353. package/src/index.ts +7 -8
  354. package/src/jobs.ts +138 -1
  355. package/src/sdk/_generated/auth/api.ts +38 -7
  356. package/src/sdk/_generated/auth/client.ts +168 -530
  357. package/src/sdk/_generated/auth/contract.ts +310 -93
  358. package/src/sdk/_generated/auth/mod.ts +0 -1
  359. package/src/sdk/_generated/auth/owned_api.ts +92 -86
  360. package/src/sdk/_generated/auth/schemas.ts +231 -92
  361. package/src/sdk/_generated/auth/types.ts +1069 -273
  362. package/src/sdk/_generated/core/api.ts +38 -7
  363. package/src/sdk/_generated/core/client.ts +47 -73
  364. package/src/sdk/_generated/core/contract.ts +91 -1
  365. package/src/sdk/_generated/core/mod.ts +0 -1
  366. package/src/sdk/_generated/core/owned_api.ts +4 -4
  367. package/src/sdk/_generated/core/schemas.ts +81 -0
  368. package/src/sdk/_generated/core/types.ts +79 -15
  369. package/src/sdk/_generated/health/api.ts +29 -5
  370. package/src/sdk/_generated/health/client.ts +11 -58
  371. package/src/sdk/_generated/health/contract.ts +2 -10
  372. package/src/sdk/_generated/health/mod.ts +0 -1
  373. package/src/sdk/_generated/health/owned_api.ts +2 -2
  374. package/src/sdk/_generated/health/schemas.ts +1 -9
  375. package/src/sdk/_generated/health/types.ts +23 -2
  376. package/src/sdk/_generated/jobs/api.ts +29 -5
  377. package/src/sdk/_generated/jobs/client.ts +25 -109
  378. package/src/sdk/_generated/jobs/contract.ts +269 -1
  379. package/src/sdk/_generated/jobs/mod.ts +0 -1
  380. package/src/sdk/_generated/jobs/owned_api.ts +30 -9
  381. package/src/sdk/_generated/jobs/schemas.ts +213 -0
  382. package/src/sdk/_generated/jobs/types.ts +252 -18
  383. package/src/sdk/_generated/state/api.ts +29 -5
  384. package/src/sdk/_generated/state/client.ts +18 -95
  385. package/src/sdk/_generated/state/mod.ts +0 -1
  386. package/src/sdk/_generated/state/owned_api.ts +7 -7
  387. package/src/sdk/_generated/state/types.ts +91 -15
  388. package/src/server/health.ts +2 -6
  389. package/src/server/health_schemas.ts +0 -6
  390. package/src/server/internal_jobs/bindings.ts +11 -0
  391. package/src/server/internal_jobs/job-manager.ts +553 -24
  392. package/src/server/internal_jobs/key-coordinator.ts +1080 -0
  393. package/src/server/internal_jobs/projection.ts +2 -0
  394. package/src/server/internal_jobs/runtime-worker.ts +17 -1
  395. package/src/server/internal_jobs/types.ts +6 -0
  396. package/src/server/runtime.ts +4 -0
  397. package/src/server/service.ts +645 -625
  398. package/src/server.ts +14 -7
  399. package/src/service/deno.ts +0 -5
  400. package/src/service/drizzle.ts +184 -0
  401. package/src/service/mod.ts +17 -7
  402. package/src/service/node.ts +0 -5
  403. package/src/service/outbox_inbox.ts +354 -88
  404. package/src/telemetry/metrics.ts +198 -1
  405. package/src/telemetry/mod.ts +6 -0
  406. package/src/trellis.ts +286 -105
@@ -43,7 +43,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
43
43
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
44
44
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
45
45
  };
46
- var _InternalStoreHandle_nc, _TrellisService_instances, _TrellisService_server, _TrellisService_nc, _TrellisService_handlerTrellis, _TrellisService_operationTransfer, _TrellisService_stopHealthPublishing, _TrellisService_managedJobWorkers, _TrellisService_waitPromise, _TrellisService_stopPromise, _TrellisService_createBoundHealth, _TrellisService_createBoundEventFacade, _TrellisService_createHandleFacade, _TrellisService_createBoundHandleFacade, _TrellisService_operation;
46
+ var _InternalStoreHandle_nc, _TrellisService_instances, _TrellisService_server, _TrellisService_nc, _TrellisService_handlerTrellis, _TrellisService_operationTransfer, _TrellisService_stopHealthPublishing, _TrellisService_managedJobWorkers, _TrellisService_contractJobs, _TrellisService_jobsBinding, _TrellisService_ownedOutboxDispatchers, _TrellisService_waitPromise, _TrellisService_stopPromise, _TrellisService_createHandleFacade, _TrellisService_createSqlOutboxBinding, _TrellisService_createSqlOutbox, _TrellisService_operation;
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.TrellisService = exports.StoreHandle = void 0;
49
49
  exports.createConnectedService = createConnectedService;
@@ -68,11 +68,70 @@ const runtime_transport_js_1 = require("../runtime_transport.js");
68
68
  const server_logger_js_1 = require("../server_logger.js");
69
69
  const index_js_1 = require("../errors/index.js");
70
70
  const jobs_js_1 = require("../jobs.js");
71
+ const ulid_1 = require("ulid");
71
72
  const job_manager_js_1 = require("./internal_jobs/job-manager.js");
72
73
  const runtime_worker_js_1 = require("./internal_jobs/runtime-worker.js");
74
+ const key_coordinator_js_1 = require("./internal_jobs/key-coordinator.js");
73
75
  const types_js_1 = require("./internal_jobs/types.js");
74
76
  const connection_js_1 = require("../connection.js");
75
77
  const init_js_1 = require("../telemetry/init.js");
78
+ const mod_js_2 = require("../telemetry/mod.js");
79
+ const outbox_inbox_js_1 = require("../service/outbox_inbox.js");
80
+ function normalizeResourceJobsBinding(binding) {
81
+ const queues = {};
82
+ for (const [name, queue] of Object.entries(binding.queues)) {
83
+ const baseQueue = baseJobsQueueBinding(queue);
84
+ if (!queue.keyConcurrency) {
85
+ queues[name] = {
86
+ ...baseQueue,
87
+ ...(queue.queue ? { queue: normalizeQueuePolicy(queue.queue) } : {}),
88
+ };
89
+ continue;
90
+ }
91
+ const policy = (0, key_coordinator_js_1.normalizeJobKeyPolicy)({
92
+ keyConcurrency: queue.keyConcurrency,
93
+ queue: queue.queue,
94
+ });
95
+ queues[name] = {
96
+ ...baseQueue,
97
+ keyConcurrency: {
98
+ key: policy.key,
99
+ maxActive: policy.maxActive,
100
+ heartbeatIntervalMs: policy.heartbeatIntervalMs,
101
+ heartbeatTtlMs: policy.heartbeatTtlMs,
102
+ stalePolicy: policy.stalePolicy,
103
+ },
104
+ queue: policy.queue,
105
+ };
106
+ }
107
+ return { namespace: binding.namespace, queues };
108
+ }
109
+ function baseJobsQueueBinding(queue) {
110
+ return {
111
+ queueType: queue.queueType,
112
+ publishPrefix: queue.publishPrefix,
113
+ workSubject: queue.workSubject,
114
+ consumerName: queue.consumerName,
115
+ payload: queue.payload,
116
+ ...(queue.result ? { result: queue.result } : {}),
117
+ maxDeliver: queue.maxDeliver,
118
+ backoffMs: queue.backoffMs,
119
+ ackWaitMs: queue.ackWaitMs,
120
+ ...(queue.defaultDeadlineMs !== undefined
121
+ ? { defaultDeadlineMs: queue.defaultDeadlineMs }
122
+ : {}),
123
+ progress: queue.progress,
124
+ logs: queue.logs,
125
+ dlq: queue.dlq,
126
+ concurrency: queue.concurrency,
127
+ };
128
+ }
129
+ function normalizeQueuePolicy(queue) {
130
+ return {
131
+ maxQueuedPerKey: queue.maxQueuedPerKey ?? 0,
132
+ whenFull: queue.whenFull ?? "reject",
133
+ };
134
+ }
76
135
  const ClientTransportEndpointsSchema = typebox_1.Type.Object({
77
136
  natsServers: typebox_1.Type.Array(typebox_1.Type.String({ minLength: 1 }), { minItems: 1 }),
78
137
  });
@@ -548,6 +607,7 @@ async function createConnectedService(args) {
548
607
  metadata: args.contractEventConsumers,
549
608
  bindings: args.bindings.eventConsumers,
550
609
  },
610
+ durableEventConsumerBeforeReadinessCheck: args.durableEventConsumerBeforeReadinessCheck,
551
611
  connection,
552
612
  });
553
613
  let transfer;
@@ -573,6 +633,7 @@ async function createConnectedService(args) {
573
633
  prepare: (event, data) => outbound.prepare(event, data),
574
634
  publish: (event, data) => outbound.publish(event, data),
575
635
  publishPrepared: (event) => outbound.publishPrepared(event),
636
+ stopEventListeners: () => outbound.stopEventListeners(),
576
637
  get kv() {
577
638
  return getHandlerResources().kv;
578
639
  },
@@ -676,6 +737,147 @@ function toUnexpectedError(cause) {
676
737
  ? cause
677
738
  : new index_js_1.UnexpectedError({ cause });
678
739
  }
740
+ function resolveSqlOutboxTables(tables) {
741
+ return {
742
+ outbox: tables?.outbox ?? outbox_inbox_js_1.defaultSqlOutboxTables.outbox,
743
+ inbox: tables?.inbox ?? outbox_inbox_js_1.defaultSqlOutboxTables.inbox,
744
+ };
745
+ }
746
+ function createSqlOutboxBaseExecutor(options) {
747
+ return options.executor;
748
+ }
749
+ function createSqlOutboxTransactionRunner(options) {
750
+ return options.transaction;
751
+ }
752
+ function createSqlOutboxEventEnqueueFacade(args) {
753
+ const facade = {};
754
+ const source = args.event;
755
+ for (const [groupName, leaves] of Object.entries(source)) {
756
+ const group = {};
757
+ for (const [leafName, leaf] of Object.entries(leaves)) {
758
+ group[leafName] = {
759
+ enqueue: (payload) => result_1.AsyncResult.from((async () => {
760
+ const prepared = leaf.prepare(payload).take();
761
+ if ((0, result_1.isErr)(prepared))
762
+ return result_1.Result.err(prepared.error);
763
+ const record = (0, outbox_inbox_js_1.preparedTrellisEventToOutboxRecord)(prepared);
764
+ try {
765
+ const message = await args.repository.enqueue(record);
766
+ args.onEnqueued();
767
+ return result_1.Result.ok(message);
768
+ }
769
+ catch (cause) {
770
+ return result_1.Result.err(toUnexpectedError(cause));
771
+ }
772
+ })()),
773
+ };
774
+ }
775
+ Object.defineProperty(facade, groupName, {
776
+ value: group,
777
+ enumerable: true,
778
+ configurable: true,
779
+ });
780
+ }
781
+ return facade;
782
+ }
783
+ function createSqlOutboxJobEnqueueFacade(args) {
784
+ const facade = {};
785
+ for (const queueType of Object.keys(args.contractJobs)) {
786
+ const queueBinding = args.jobsBinding?.queues[queueType];
787
+ const queue = queueType;
788
+ facade[queue] = {
789
+ create: (payload) => {
790
+ if (!queueBinding) {
791
+ return result_1.AsyncResult.err(new index_js_1.ValidationError({
792
+ errors: [{
793
+ path: "/",
794
+ message: `Jobs binding unavailable for queue '${queue}'`,
795
+ }],
796
+ }));
797
+ }
798
+ const submissionId = (0, ulid_1.ulid)();
799
+ const jobId = (0, ulid_1.ulid)();
800
+ const context = (0, job_manager_js_1.createJobContext)();
801
+ const record = {
802
+ id: submissionId,
803
+ kind: "job.create",
804
+ name: queue,
805
+ subject: `${queueBinding.publishPrefix}.${jobId}.created`,
806
+ payload: JSON.stringify({
807
+ ...payload,
808
+ jobId,
809
+ submissionId,
810
+ }),
811
+ headers: {
812
+ "request-id": context.requestId,
813
+ "traceparent": context.traceparent,
814
+ ...(context.tracestate ? { "tracestate": context.tracestate } : {}),
815
+ },
816
+ };
817
+ return result_1.AsyncResult.from((async () => {
818
+ try {
819
+ await args.repository.enqueue(record);
820
+ args.onEnqueued();
821
+ return result_1.Result.ok({
822
+ submissionId,
823
+ jobId,
824
+ queue,
825
+ mode: "create",
826
+ });
827
+ }
828
+ catch (cause) {
829
+ return result_1.Result.err(toUnexpectedError(cause));
830
+ }
831
+ })());
832
+ },
833
+ submit: (payload) => {
834
+ if (!queueBinding) {
835
+ return result_1.AsyncResult.err(new index_js_1.ValidationError({
836
+ errors: [{
837
+ path: "/",
838
+ message: `Jobs binding unavailable for queue '${queue}'`,
839
+ }],
840
+ }));
841
+ }
842
+ const submissionId = (0, ulid_1.ulid)();
843
+ const jobId = (0, ulid_1.ulid)();
844
+ const context = (0, job_manager_js_1.createJobContext)();
845
+ const record = {
846
+ id: submissionId,
847
+ kind: "job.submit",
848
+ name: queue,
849
+ subject: `${queueBinding.publishPrefix}.${jobId}.created`,
850
+ payload: JSON.stringify({
851
+ ...payload,
852
+ jobId,
853
+ submissionId,
854
+ }),
855
+ headers: {
856
+ "request-id": context.requestId,
857
+ "traceparent": context.traceparent,
858
+ ...(context.tracestate ? { "tracestate": context.tracestate } : {}),
859
+ },
860
+ };
861
+ return result_1.AsyncResult.from((async () => {
862
+ try {
863
+ await args.repository.enqueue(record);
864
+ args.onEnqueued();
865
+ return result_1.Result.ok({
866
+ submissionId,
867
+ jobId,
868
+ queue,
869
+ mode: "submit",
870
+ });
871
+ }
872
+ catch (cause) {
873
+ return result_1.Result.err(toUnexpectedError(cause));
874
+ }
875
+ })());
876
+ },
877
+ };
878
+ }
879
+ return facade;
880
+ }
679
881
  function serializeJobHandlerError(error) {
680
882
  try {
681
883
  return JSON.stringify(error.toSerializable());
@@ -700,7 +902,8 @@ function wrapVoidTask(task) {
700
902
  }
701
903
  function isTerminalJobState(state) {
702
904
  return state === "completed" || state === "failed" || state === "cancelled" ||
703
- state === "expired" || state === "dead" || state === "dismissed";
905
+ state === "expired" || state === "skipped" || state === "stale" ||
906
+ state === "dead" || state === "dismissed";
704
907
  }
705
908
  function isTerminalJobSnapshot(snapshot) {
706
909
  return isTerminalJobState(snapshot.state);
@@ -798,6 +1001,9 @@ function snapshotFromLifecycleEvent(current, event) {
798
1001
  case "failed":
799
1002
  case "cancelled":
800
1003
  case "expired":
1004
+ case "skipped":
1005
+ case "stale":
1006
+ case "staleCompletionIgnored":
801
1007
  case "dead":
802
1008
  case "dismissed":
803
1009
  return event.error === undefined ? base : {
@@ -974,17 +1180,20 @@ function createJobsFacade(args) {
974
1180
  const handlers = new Map();
975
1181
  const jobsFacade = {};
976
1182
  const lifecycle = createJobLifecycleTracker(args.nc);
1183
+ const keyCoordinator = (0, key_coordinator_js_1.createNatsJobKeyCoordinator)(args.nc);
1184
+ const jobsBinding = args.jobsBinding
1185
+ ? normalizeResourceJobsBinding(args.jobsBinding)
1186
+ : undefined;
977
1187
  let activeHost;
978
1188
  let startupPromise;
979
1189
  let stopPromise;
980
1190
  for (const queueType of Object.keys(args.contractJobs ?? {})) {
981
- const queueBinding = args.jobsBinding?.queues[queueType];
1191
+ const queueBinding = jobsBinding?.queues[queueType];
982
1192
  if (queueBinding)
983
1193
  lifecycle.watch(queueBinding);
984
1194
  jobsFacade[queueType] = {
985
1195
  create: (payload) => result_1.AsyncResult.from((async () => {
986
1196
  try {
987
- const jobsBinding = args.jobsBinding;
988
1197
  if (!jobsBinding) {
989
1198
  return result_1.Result.err(toUnexpectedError(new Error("Jobs bindings are unavailable")));
990
1199
  }
@@ -995,6 +1204,7 @@ function createJobsFacade(args) {
995
1204
  const manager = new job_manager_js_1.JobManager({
996
1205
  nc: args.nc,
997
1206
  jobs: jobsBinding,
1207
+ keyCoordinator,
998
1208
  });
999
1209
  await args.nc.flush();
1000
1210
  const created = await manager.create(queueType, payload);
@@ -1007,6 +1217,60 @@ function createJobsFacade(args) {
1007
1217
  lifecycle,
1008
1218
  }));
1009
1219
  }
1220
+ catch (cause) {
1221
+ if (cause instanceof jobs_js_1.JobNotEnqueuedError) {
1222
+ return result_1.Result.err(cause);
1223
+ }
1224
+ return result_1.Result.err(toUnexpectedError(cause));
1225
+ }
1226
+ })()),
1227
+ submit: (payload) => result_1.AsyncResult.from((async () => {
1228
+ try {
1229
+ if (!jobsBinding) {
1230
+ return result_1.Result.err(toUnexpectedError(new Error("Jobs bindings are unavailable")));
1231
+ }
1232
+ const queueBinding = jobsBinding.queues[queueType];
1233
+ if (!queueBinding) {
1234
+ return result_1.Result.err(toUnexpectedError(new Error(`Jobs binding for queue '${queueType}' is unavailable`)));
1235
+ }
1236
+ const manager = new job_manager_js_1.JobManager({
1237
+ nc: args.nc,
1238
+ jobs: jobsBinding,
1239
+ keyCoordinator,
1240
+ });
1241
+ await args.nc.flush();
1242
+ const outcome = await manager.submit(queueType, payload);
1243
+ if (outcome.kind === "accepted") {
1244
+ return result_1.Result.ok({
1245
+ kind: "accepted",
1246
+ key: outcome.key,
1247
+ ref: createJobRef({
1248
+ nc: args.nc,
1249
+ queueType,
1250
+ jobsBinding,
1251
+ queueBinding,
1252
+ seed: outcome.job,
1253
+ lifecycle,
1254
+ }),
1255
+ });
1256
+ }
1257
+ if (outcome.kind === "replaced") {
1258
+ return result_1.Result.ok({
1259
+ kind: "replaced",
1260
+ key: outcome.key,
1261
+ replaced: outcome.replaced,
1262
+ ref: createJobRef({
1263
+ nc: args.nc,
1264
+ queueType,
1265
+ jobsBinding,
1266
+ queueBinding,
1267
+ seed: outcome.job,
1268
+ lifecycle,
1269
+ }),
1270
+ });
1271
+ }
1272
+ return result_1.Result.ok(outcome);
1273
+ }
1010
1274
  catch (cause) {
1011
1275
  return result_1.Result.err(toUnexpectedError(cause));
1012
1276
  }
@@ -1040,10 +1304,9 @@ function createJobsFacade(args) {
1040
1304
  activeHost = host;
1041
1305
  return result_1.Result.ok(host);
1042
1306
  }
1043
- if (!args.jobsBinding || !args.workStream) {
1307
+ if (!jobsBinding || !args.workStream) {
1044
1308
  return result_1.Result.err(toUnexpectedError(new Error("Jobs infrastructure bindings are unavailable for this service")));
1045
1309
  }
1046
- const jobsBinding = args.jobsBinding;
1047
1310
  const workStream = args.workStream;
1048
1311
  const hosts = [];
1049
1312
  try {
@@ -1059,6 +1322,7 @@ function createJobsFacade(args) {
1059
1322
  const manager = new job_manager_js_1.JobManager({
1060
1323
  nc: args.nc,
1061
1324
  jobs: jobsBinding,
1325
+ keyCoordinator,
1062
1326
  });
1063
1327
  const host = await (0, runtime_worker_js_1.startNatsWorkerHostFromBinding)({
1064
1328
  jobs: jobsBinding,
@@ -1068,6 +1332,7 @@ function createJobsFacade(args) {
1068
1332
  instanceId: `${args.serviceName}-worker`,
1069
1333
  queueTypes: [queueType],
1070
1334
  manager,
1335
+ heartbeatPublisher: args.nc,
1071
1336
  getProjectedJob: async (job) => {
1072
1337
  return lifecycle.get({
1073
1338
  service: job.service,
@@ -1176,24 +1441,6 @@ function createJobsFacade(args) {
1176
1441
  });
1177
1442
  return jobsFacade;
1178
1443
  }
1179
- function createBoundJobsFacade(args) {
1180
- const boundJobs = {};
1181
- const jobs = args.jobs;
1182
- for (const queueType of Object.keys(jobs)) {
1183
- const queue = jobs[queueType];
1184
- if (!queue)
1185
- continue;
1186
- boundJobs[queueType] = {
1187
- create: (payload) => queue.create(payload),
1188
- handle: (handler) => queue.handle(({ job, client }) => handler({
1189
- job,
1190
- client,
1191
- deps: args.deps,
1192
- })),
1193
- };
1194
- }
1195
- return boundJobs;
1196
- }
1197
1444
  /**
1198
1445
  * Connects a service with caller-supplied runtime dependencies for tests and
1199
1446
  * Trellis-owned internals. This helper is intentionally not re-exported from
@@ -1203,6 +1450,7 @@ function createBoundJobsFacade(args) {
1203
1450
  */
1204
1451
  function connectTrellisServiceWithRuntimeDeps(args, deps) {
1205
1452
  return result_1.AsyncResult.from((async () => {
1453
+ const totalStartedAt = performance.now();
1206
1454
  try {
1207
1455
  const runtimeDeps = {
1208
1456
  ...(await loadDefaultServiceRuntimeDeps()),
@@ -1213,6 +1461,7 @@ function connectTrellisServiceWithRuntimeDeps(args, deps) {
1213
1461
  }
1214
1462
  const auth = await (0, auth_js_2.createAuth)({ sessionKeySeed: args.sessionKeySeed });
1215
1463
  const bootstrapLog = resolveServiceLogger(args.server?.log);
1464
+ const bootstrapStartedAt = performance.now();
1216
1465
  const bootstrap = await fetchServiceBootstrapInfo({
1217
1466
  trellisUrl: args.trellisUrl,
1218
1467
  serviceName: args.name,
@@ -1222,12 +1471,18 @@ function connectTrellisServiceWithRuntimeDeps(args, deps) {
1222
1471
  auth,
1223
1472
  log: bootstrapLog,
1224
1473
  });
1474
+ (0, mod_js_2.recordTrellisDuration)("trellis.connect.duration", performance.now() - bootstrapStartedAt, {
1475
+ phase: "bootstrap",
1476
+ participantKind: "service",
1477
+ outcome: "ok",
1478
+ });
1225
1479
  const { authenticator: authTokenAuthenticator, inboxPrefix } = await auth
1226
1480
  .natsConnectOptions({
1227
1481
  contractDigest: args.contract.CONTRACT_DIGEST,
1228
1482
  });
1229
1483
  let nc;
1230
1484
  try {
1485
+ const natsStartedAt = performance.now();
1231
1486
  nc = await runtimeDeps.connect({
1232
1487
  servers: (0, runtime_transport_js_1.selectRuntimeTransportServers)(bootstrap.connectInfo.transports),
1233
1488
  maxReconnectAttempts: runtime_transport_js_1.DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS,
@@ -1238,6 +1493,11 @@ function connectTrellisServiceWithRuntimeDeps(args, deps) {
1238
1493
  (0, nats_core_1.jwtAuthenticator)(bootstrap.connectInfo.transport.sentinel.jwt, new TextEncoder().encode(bootstrap.connectInfo.transport.sentinel.seed)),
1239
1494
  ],
1240
1495
  });
1496
+ (0, mod_js_2.recordTrellisDuration)("trellis.connect.duration", performance.now() - natsStartedAt, {
1497
+ phase: "nats_connect",
1498
+ participantKind: "service",
1499
+ outcome: "ok",
1500
+ });
1241
1501
  }
1242
1502
  catch (cause) {
1243
1503
  throw new index_js_1.TransportError({
@@ -1263,7 +1523,7 @@ function connectTrellisServiceWithRuntimeDeps(args, deps) {
1263
1523
  ...(args.server ?? {}),
1264
1524
  api: args.contract.API.owned,
1265
1525
  };
1266
- return result_1.Result.ok(await createConnectedService({
1526
+ const service = await createConnectedService({
1267
1527
  name: args.name,
1268
1528
  auth,
1269
1529
  nc,
@@ -1274,7 +1534,14 @@ function connectTrellisServiceWithRuntimeDeps(args, deps) {
1274
1534
  contractEventConsumers: args.contract.CONTRACT.eventConsumers,
1275
1535
  server,
1276
1536
  bindings: bootstrap.binding.resources,
1277
- }));
1537
+ durableEventConsumerBeforeReadinessCheck: runtimeDeps.durableEventConsumerBeforeReadinessCheck,
1538
+ });
1539
+ (0, mod_js_2.recordTrellisDuration)("trellis.connect.duration", performance.now() - totalStartedAt, {
1540
+ phase: "total",
1541
+ participantKind: "service",
1542
+ outcome: "ok",
1543
+ });
1544
+ return result_1.Result.ok(service);
1278
1545
  }
1279
1546
  catch (cause) {
1280
1547
  await closeFailedServiceBootstrapConnection(nc);
@@ -1351,6 +1618,9 @@ class TrellisService {
1351
1618
  _TrellisService_operationTransfer.set(this, void 0);
1352
1619
  _TrellisService_stopHealthPublishing.set(this, void 0);
1353
1620
  _TrellisService_managedJobWorkers.set(this, void 0);
1621
+ _TrellisService_contractJobs.set(this, void 0);
1622
+ _TrellisService_jobsBinding.set(this, void 0);
1623
+ _TrellisService_ownedOutboxDispatchers.set(this, new Set());
1354
1624
  _TrellisService_waitPromise.set(this, void 0);
1355
1625
  _TrellisService_stopPromise.set(this, void 0);
1356
1626
  if (token !== trellisServiceConstructorToken) {
@@ -1385,33 +1655,20 @@ class TrellisService {
1385
1655
  });
1386
1656
  this.jobs = jobs;
1387
1657
  __classPrivateFieldSet(this, _TrellisService_managedJobWorkers, jobs[MANAGED_JOB_WORKERS], "f");
1658
+ __classPrivateFieldSet(this, _TrellisService_contractJobs, contractJobs, "f");
1659
+ __classPrivateFieldSet(this, _TrellisService_jobsBinding, bindings.jobs, "f");
1388
1660
  this.health = health;
1389
1661
  this.handle = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createHandleFacade).call(this);
1390
1662
  this.connection = connection;
1391
1663
  __classPrivateFieldSet(this, _TrellisService_stopHealthPublishing, stopHealthPublishing, "f");
1392
1664
  }
1393
1665
  /**
1394
- * Returns a service wrapper that injects application dependencies into
1395
- * service-owned handler argument objects as `args.deps`.
1666
+ * Creates an explicit SQL outbox helper for service-owned transactions.
1667
+ * Services should create this at startup and close over it in handlers.
1396
1668
  */
1397
- with(deps) {
1398
- return {
1399
- name: this.name,
1400
- auth: this.auth,
1401
- event: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundEventFacade).call(this, deps),
1402
- kv: this.kv,
1403
- store: this.store,
1404
- jobs: createBoundJobsFacade({ jobs: this.jobs, deps }),
1405
- health: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundHealth).call(this, deps),
1406
- handle: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundHandleFacade).call(this, deps),
1407
- connection: this.connection,
1408
- createTransfer: (args) => this.createTransfer(args),
1409
- completeOperation: (operationId, output) => this.completeOperation(operationId, output),
1410
- publishPrepared: (event) => this.publishPrepared(event),
1411
- wait: () => this.wait(),
1412
- stop: () => this.stop(),
1413
- with: (nextDeps) => this.with(nextDeps),
1414
- };
1669
+ createSqlOutbox(options) {
1670
+ const binding = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createSqlOutboxBinding).call(this, options);
1671
+ return __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createSqlOutbox).call(this, binding);
1415
1672
  }
1416
1673
  /** Publishes a prepared event through the service runtime connection. */
1417
1674
  publishPrepared(event) {
@@ -1472,6 +1729,11 @@ class TrellisService {
1472
1729
  async stop() {
1473
1730
  __classPrivateFieldSet(this, _TrellisService_stopPromise, __classPrivateFieldGet(this, _TrellisService_stopPromise, "f") ?? (async () => {
1474
1731
  this.connection.stopObserving();
1732
+ __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f").stopEventListeners();
1733
+ for (const dispatcher of __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f")) {
1734
+ dispatcher.stop();
1735
+ }
1736
+ __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f").clear();
1475
1737
  try {
1476
1738
  await __classPrivateFieldGet(this, _TrellisService_stopHealthPublishing, "f").call(this);
1477
1739
  }
@@ -1499,91 +1761,13 @@ class TrellisService {
1499
1761
  }
1500
1762
  }
1501
1763
  exports.TrellisService = TrellisService;
1502
- _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _TrellisService_handlerTrellis = new WeakMap(), _TrellisService_operationTransfer = new WeakMap(), _TrellisService_stopHealthPublishing = new WeakMap(), _TrellisService_managedJobWorkers = new WeakMap(), _TrellisService_waitPromise = new WeakMap(), _TrellisService_stopPromise = new WeakMap(), _TrellisService_instances = new WeakSet(), _TrellisService_createBoundHealth = function _TrellisService_createBoundHealth(deps) {
1503
- const health = this.health;
1504
- return {
1505
- serviceName: health.serviceName,
1506
- kind: health.kind,
1507
- instanceId: health.instanceId,
1508
- contractId: health.contractId,
1509
- contractDigest: health.contractDigest,
1510
- startedAt: health.startedAt,
1511
- publishIntervalMs: health.publishIntervalMs,
1512
- setInfo(info) {
1513
- if (typeof info !== "function") {
1514
- health.setInfo(info);
1515
- return;
1516
- }
1517
- health.setInfo(() => info({ deps }));
1518
- },
1519
- add(name, check) {
1520
- return health.add(name, () => check({ deps }));
1521
- },
1522
- checks: () => health.checks(),
1523
- response: () => health.response(),
1524
- heartbeat: () => health.heartbeat(),
1525
- };
1526
- }, _TrellisService_createBoundEventFacade = function _TrellisService_createBoundEventFacade(deps) {
1527
- const event = {};
1528
- const source = this.event;
1529
- for (const [groupName, leaves] of Object.entries(source)) {
1530
- const group = {};
1531
- for (const [leafName, leaf] of Object.entries(leaves)) {
1532
- group[leafName] = {
1533
- prepare: (payload) => leaf.prepare(payload),
1534
- publish: (payload) => leaf.publish(payload),
1535
- listen: (handler, subjectData, opts) => leaf.listen((payload, context) => handler({
1536
- event: payload,
1537
- context,
1538
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1539
- deps,
1540
- }), subjectData, opts),
1541
- };
1542
- }
1543
- Object.defineProperty(event, groupName, {
1544
- value: group,
1545
- enumerable: true,
1546
- configurable: true,
1547
- });
1548
- }
1549
- return event;
1550
- }, _TrellisService_createHandleFacade = function _TrellisService_createHandleFacade() {
1551
- const rpc = {};
1552
- for (const method of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.rpc ?? {})) {
1553
- addSurfaceLeaf(rpc, method, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").mountRuntime(method, async ({ input, context }) => await Promise.resolve(handler({
1554
- input,
1555
- context,
1556
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1557
- }))));
1558
- }
1559
- const feed = {};
1560
- for (const feedName of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.feeds ?? {})) {
1561
- addSurfaceLeaf(feed, feedName, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").feedHandle(feedName).handle((context) => handler({
1562
- ...context,
1563
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1564
- })));
1565
- }
1566
- const operation = {};
1567
- for (const operationName of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.operations ?? {})) {
1568
- const registration = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_operation).call(this, operationName);
1569
- const leaf = Object.assign((handler) => registration.handle((context) => handler({
1570
- ...context,
1571
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1572
- })), {
1573
- accept: (args) => registration.accept(args),
1574
- control: (operationId) => registration.control(operationId),
1575
- });
1576
- addSurfaceLeaf(operation, operationName, leaf);
1577
- }
1578
- return { rpc, feed, operation };
1579
- }, _TrellisService_createBoundHandleFacade = function _TrellisService_createBoundHandleFacade(deps) {
1764
+ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _TrellisService_handlerTrellis = new WeakMap(), _TrellisService_operationTransfer = new WeakMap(), _TrellisService_stopHealthPublishing = new WeakMap(), _TrellisService_managedJobWorkers = new WeakMap(), _TrellisService_contractJobs = new WeakMap(), _TrellisService_jobsBinding = new WeakMap(), _TrellisService_ownedOutboxDispatchers = new WeakMap(), _TrellisService_waitPromise = new WeakMap(), _TrellisService_stopPromise = new WeakMap(), _TrellisService_instances = new WeakSet(), _TrellisService_createHandleFacade = function _TrellisService_createHandleFacade() {
1580
1765
  const rpc = {};
1581
1766
  for (const method of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.rpc ?? {})) {
1582
1767
  addSurfaceLeaf(rpc, method, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").mountRuntime(method, async ({ input, context }) => await Promise.resolve(handler({
1583
1768
  input,
1584
1769
  context,
1585
1770
  client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1586
- deps,
1587
1771
  }))));
1588
1772
  }
1589
1773
  const feed = {};
@@ -1591,7 +1775,6 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
1591
1775
  addSurfaceLeaf(feed, feedName, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").feedHandle(feedName).handle((context) => handler({
1592
1776
  ...context,
1593
1777
  client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1594
- deps,
1595
1778
  })));
1596
1779
  }
1597
1780
  const operation = {};
@@ -1600,7 +1783,6 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
1600
1783
  const leaf = Object.assign((handler) => registration.handle((context) => handler({
1601
1784
  ...context,
1602
1785
  client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1603
- deps,
1604
1786
  })), {
1605
1787
  accept: (args) => registration.accept(args),
1606
1788
  control: (operationId) => registration.control(operationId),
@@ -1608,6 +1790,66 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
1608
1790
  addSurfaceLeaf(operation, operationName, leaf);
1609
1791
  }
1610
1792
  return { rpc, feed, operation };
1793
+ }, _TrellisService_createSqlOutboxBinding = function _TrellisService_createSqlOutboxBinding(options) {
1794
+ const tables = resolveSqlOutboxTables(options.tables);
1795
+ const executor = createSqlOutboxBaseExecutor(options);
1796
+ const repository = new outbox_inbox_js_1.SqlOutboxRepository(executor, options.dialect, tables);
1797
+ const dispatchRuntime = {
1798
+ publishPreparedEvent: (event) => __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f").publishPrepared(event),
1799
+ // dispatchJobSubmission: stub — filled in by Phase 3
1800
+ };
1801
+ const dispatcher = new outbox_inbox_js_1.OutboxDispatcher(repository, dispatchRuntime, options.dispatcher);
1802
+ __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f").add(dispatcher);
1803
+ return {
1804
+ dialect: options.dialect,
1805
+ tables,
1806
+ transaction: createSqlOutboxTransactionRunner(options),
1807
+ dispatcher,
1808
+ };
1809
+ }, _TrellisService_createSqlOutbox = function _TrellisService_createSqlOutbox(binding) {
1810
+ return {
1811
+ transaction: (work) => result_1.AsyncResult.from((() => {
1812
+ let enqueued = 0;
1813
+ const toResultError = (cause) => {
1814
+ if (cause instanceof index_js_1.ValidationError ||
1815
+ cause instanceof index_js_1.UnexpectedError) {
1816
+ return result_1.Result.err(cause);
1817
+ }
1818
+ return result_1.Result.err(toUnexpectedError(cause));
1819
+ };
1820
+ let transaction;
1821
+ try {
1822
+ transaction = binding.transaction(({ tx, executor }) => {
1823
+ const repository = new outbox_inbox_js_1.SqlOutboxRepository(executor, binding.dialect, binding.tables);
1824
+ const event = createSqlOutboxEventEnqueueFacade({
1825
+ event: this.event,
1826
+ repository,
1827
+ onEnqueued: () => {
1828
+ enqueued += 1;
1829
+ },
1830
+ });
1831
+ const job = createSqlOutboxJobEnqueueFacade({
1832
+ serviceName: this.name,
1833
+ contractJobs: __classPrivateFieldGet(this, _TrellisService_contractJobs, "f"),
1834
+ jobsBinding: __classPrivateFieldGet(this, _TrellisService_jobsBinding, "f"),
1835
+ repository,
1836
+ onEnqueued: () => {
1837
+ enqueued += 1;
1838
+ },
1839
+ });
1840
+ return work({ tx, event, job });
1841
+ });
1842
+ }
1843
+ catch (cause) {
1844
+ return Promise.resolve(toResultError(cause));
1845
+ }
1846
+ return transaction.then((result) => {
1847
+ if (enqueued > 0)
1848
+ binding.dispatcher.notify();
1849
+ return result_1.Result.ok(result);
1850
+ }, toResultError);
1851
+ })()),
1852
+ };
1611
1853
  }, _TrellisService_operation = function _TrellisService_operation(operation) {
1612
1854
  const registration = __classPrivateFieldGet(this, _TrellisService_server, "f").operationHandle(operation);
1613
1855
  return {