@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
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  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");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- 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;
12
+ 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;
13
13
  import { headers as natsHeaders, jwtAuthenticator, } from "@nats-io/nats-core";
14
14
  import { TypedKV } from "../kv.js";
15
15
  import { TypedStore, } from "../store.js";
@@ -28,13 +28,72 @@ import { ServiceTransfer } from "./transfer.js";
28
28
  import { logger as noopLogger } from "../globals.js";
29
29
  import { DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS, DEFAULT_SERVICE_RUNTIME_WAIT_ON_FIRST_CONNECT, loadDefaultRuntimeTransport, selectRuntimeTransportServers, } from "../runtime_transport.js";
30
30
  import { serverLogger } from "../server_logger.js";
31
- import { TransportError, UnexpectedError, } from "../errors/index.js";
32
- import { ActiveJob as PublicActiveJob, JobRef, JobWorkerHostAdapter, } from "../jobs.js";
33
- import { JobManager as InternalJobManager, JobProcessError as InternalJobProcessError, } from "./internal_jobs/job-manager.js";
31
+ import { TransportError, UnexpectedError, ValidationError, } from "../errors/index.js";
32
+ import { ActiveJob as PublicActiveJob, JobNotEnqueuedError, JobRef, JobWorkerHostAdapter, } from "../jobs.js";
33
+ import { ulid } from "ulid";
34
+ import { createJobContext, JobManager as InternalJobManager, JobProcessError as InternalJobProcessError, } from "./internal_jobs/job-manager.js";
34
35
  import { startNatsWorkerHostFromBinding } from "./internal_jobs/runtime-worker.js";
36
+ import { createNatsJobKeyCoordinator, normalizeJobKeyPolicy, } from "./internal_jobs/key-coordinator.js";
35
37
  import { JobEventSchema, } from "./internal_jobs/types.js";
36
38
  import { observeNatsTrellisConnection, } from "../connection.js";
37
39
  import { initTelemetry } from "../telemetry/init.js";
40
+ import { recordTrellisDuration } from "../telemetry/mod.js";
41
+ import { defaultSqlOutboxTables, OutboxDispatcher, preparedTrellisEventToOutboxRecord, SqlOutboxRepository, } from "../service/outbox_inbox.js";
42
+ function normalizeResourceJobsBinding(binding) {
43
+ const queues = {};
44
+ for (const [name, queue] of Object.entries(binding.queues)) {
45
+ const baseQueue = baseJobsQueueBinding(queue);
46
+ if (!queue.keyConcurrency) {
47
+ queues[name] = {
48
+ ...baseQueue,
49
+ ...(queue.queue ? { queue: normalizeQueuePolicy(queue.queue) } : {}),
50
+ };
51
+ continue;
52
+ }
53
+ const policy = normalizeJobKeyPolicy({
54
+ keyConcurrency: queue.keyConcurrency,
55
+ queue: queue.queue,
56
+ });
57
+ queues[name] = {
58
+ ...baseQueue,
59
+ keyConcurrency: {
60
+ key: policy.key,
61
+ maxActive: policy.maxActive,
62
+ heartbeatIntervalMs: policy.heartbeatIntervalMs,
63
+ heartbeatTtlMs: policy.heartbeatTtlMs,
64
+ stalePolicy: policy.stalePolicy,
65
+ },
66
+ queue: policy.queue,
67
+ };
68
+ }
69
+ return { namespace: binding.namespace, queues };
70
+ }
71
+ function baseJobsQueueBinding(queue) {
72
+ return {
73
+ queueType: queue.queueType,
74
+ publishPrefix: queue.publishPrefix,
75
+ workSubject: queue.workSubject,
76
+ consumerName: queue.consumerName,
77
+ payload: queue.payload,
78
+ ...(queue.result ? { result: queue.result } : {}),
79
+ maxDeliver: queue.maxDeliver,
80
+ backoffMs: queue.backoffMs,
81
+ ackWaitMs: queue.ackWaitMs,
82
+ ...(queue.defaultDeadlineMs !== undefined
83
+ ? { defaultDeadlineMs: queue.defaultDeadlineMs }
84
+ : {}),
85
+ progress: queue.progress,
86
+ logs: queue.logs,
87
+ dlq: queue.dlq,
88
+ concurrency: queue.concurrency,
89
+ };
90
+ }
91
+ function normalizeQueuePolicy(queue) {
92
+ return {
93
+ maxQueuedPerKey: queue.maxQueuedPerKey ?? 0,
94
+ whenFull: queue.whenFull ?? "reject",
95
+ };
96
+ }
38
97
  const ClientTransportEndpointsSchema = Type.Object({
39
98
  natsServers: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),
40
99
  });
@@ -509,6 +568,7 @@ export async function createConnectedService(args) {
509
568
  metadata: args.contractEventConsumers,
510
569
  bindings: args.bindings.eventConsumers,
511
570
  },
571
+ durableEventConsumerBeforeReadinessCheck: args.durableEventConsumerBeforeReadinessCheck,
512
572
  connection,
513
573
  });
514
574
  let transfer;
@@ -534,6 +594,7 @@ export async function createConnectedService(args) {
534
594
  prepare: (event, data) => outbound.prepare(event, data),
535
595
  publish: (event, data) => outbound.publish(event, data),
536
596
  publishPrepared: (event) => outbound.publishPrepared(event),
597
+ stopEventListeners: () => outbound.stopEventListeners(),
537
598
  get kv() {
538
599
  return getHandlerResources().kv;
539
600
  },
@@ -637,6 +698,147 @@ function toUnexpectedError(cause) {
637
698
  ? cause
638
699
  : new UnexpectedError({ cause });
639
700
  }
701
+ function resolveSqlOutboxTables(tables) {
702
+ return {
703
+ outbox: tables?.outbox ?? defaultSqlOutboxTables.outbox,
704
+ inbox: tables?.inbox ?? defaultSqlOutboxTables.inbox,
705
+ };
706
+ }
707
+ function createSqlOutboxBaseExecutor(options) {
708
+ return options.executor;
709
+ }
710
+ function createSqlOutboxTransactionRunner(options) {
711
+ return options.transaction;
712
+ }
713
+ function createSqlOutboxEventEnqueueFacade(args) {
714
+ const facade = {};
715
+ const source = args.event;
716
+ for (const [groupName, leaves] of Object.entries(source)) {
717
+ const group = {};
718
+ for (const [leafName, leaf] of Object.entries(leaves)) {
719
+ group[leafName] = {
720
+ enqueue: (payload) => AsyncResult.from((async () => {
721
+ const prepared = leaf.prepare(payload).take();
722
+ if (isErr(prepared))
723
+ return Result.err(prepared.error);
724
+ const record = preparedTrellisEventToOutboxRecord(prepared);
725
+ try {
726
+ const message = await args.repository.enqueue(record);
727
+ args.onEnqueued();
728
+ return Result.ok(message);
729
+ }
730
+ catch (cause) {
731
+ return Result.err(toUnexpectedError(cause));
732
+ }
733
+ })()),
734
+ };
735
+ }
736
+ Object.defineProperty(facade, groupName, {
737
+ value: group,
738
+ enumerable: true,
739
+ configurable: true,
740
+ });
741
+ }
742
+ return facade;
743
+ }
744
+ function createSqlOutboxJobEnqueueFacade(args) {
745
+ const facade = {};
746
+ for (const queueType of Object.keys(args.contractJobs)) {
747
+ const queueBinding = args.jobsBinding?.queues[queueType];
748
+ const queue = queueType;
749
+ facade[queue] = {
750
+ create: (payload) => {
751
+ if (!queueBinding) {
752
+ return AsyncResult.err(new ValidationError({
753
+ errors: [{
754
+ path: "/",
755
+ message: `Jobs binding unavailable for queue '${queue}'`,
756
+ }],
757
+ }));
758
+ }
759
+ const submissionId = ulid();
760
+ const jobId = ulid();
761
+ const context = createJobContext();
762
+ const record = {
763
+ id: submissionId,
764
+ kind: "job.create",
765
+ name: queue,
766
+ subject: `${queueBinding.publishPrefix}.${jobId}.created`,
767
+ payload: JSON.stringify({
768
+ ...payload,
769
+ jobId,
770
+ submissionId,
771
+ }),
772
+ headers: {
773
+ "request-id": context.requestId,
774
+ "traceparent": context.traceparent,
775
+ ...(context.tracestate ? { "tracestate": context.tracestate } : {}),
776
+ },
777
+ };
778
+ return AsyncResult.from((async () => {
779
+ try {
780
+ await args.repository.enqueue(record);
781
+ args.onEnqueued();
782
+ return Result.ok({
783
+ submissionId,
784
+ jobId,
785
+ queue,
786
+ mode: "create",
787
+ });
788
+ }
789
+ catch (cause) {
790
+ return Result.err(toUnexpectedError(cause));
791
+ }
792
+ })());
793
+ },
794
+ submit: (payload) => {
795
+ if (!queueBinding) {
796
+ return AsyncResult.err(new ValidationError({
797
+ errors: [{
798
+ path: "/",
799
+ message: `Jobs binding unavailable for queue '${queue}'`,
800
+ }],
801
+ }));
802
+ }
803
+ const submissionId = ulid();
804
+ const jobId = ulid();
805
+ const context = createJobContext();
806
+ const record = {
807
+ id: submissionId,
808
+ kind: "job.submit",
809
+ name: queue,
810
+ subject: `${queueBinding.publishPrefix}.${jobId}.created`,
811
+ payload: JSON.stringify({
812
+ ...payload,
813
+ jobId,
814
+ submissionId,
815
+ }),
816
+ headers: {
817
+ "request-id": context.requestId,
818
+ "traceparent": context.traceparent,
819
+ ...(context.tracestate ? { "tracestate": context.tracestate } : {}),
820
+ },
821
+ };
822
+ return AsyncResult.from((async () => {
823
+ try {
824
+ await args.repository.enqueue(record);
825
+ args.onEnqueued();
826
+ return Result.ok({
827
+ submissionId,
828
+ jobId,
829
+ queue,
830
+ mode: "submit",
831
+ });
832
+ }
833
+ catch (cause) {
834
+ return Result.err(toUnexpectedError(cause));
835
+ }
836
+ })());
837
+ },
838
+ };
839
+ }
840
+ return facade;
841
+ }
640
842
  function serializeJobHandlerError(error) {
641
843
  try {
642
844
  return JSON.stringify(error.toSerializable());
@@ -661,7 +863,8 @@ function wrapVoidTask(task) {
661
863
  }
662
864
  function isTerminalJobState(state) {
663
865
  return state === "completed" || state === "failed" || state === "cancelled" ||
664
- state === "expired" || state === "dead" || state === "dismissed";
866
+ state === "expired" || state === "skipped" || state === "stale" ||
867
+ state === "dead" || state === "dismissed";
665
868
  }
666
869
  function isTerminalJobSnapshot(snapshot) {
667
870
  return isTerminalJobState(snapshot.state);
@@ -759,6 +962,9 @@ function snapshotFromLifecycleEvent(current, event) {
759
962
  case "failed":
760
963
  case "cancelled":
761
964
  case "expired":
965
+ case "skipped":
966
+ case "stale":
967
+ case "staleCompletionIgnored":
762
968
  case "dead":
763
969
  case "dismissed":
764
970
  return event.error === undefined ? base : {
@@ -935,17 +1141,20 @@ function createJobsFacade(args) {
935
1141
  const handlers = new Map();
936
1142
  const jobsFacade = {};
937
1143
  const lifecycle = createJobLifecycleTracker(args.nc);
1144
+ const keyCoordinator = createNatsJobKeyCoordinator(args.nc);
1145
+ const jobsBinding = args.jobsBinding
1146
+ ? normalizeResourceJobsBinding(args.jobsBinding)
1147
+ : undefined;
938
1148
  let activeHost;
939
1149
  let startupPromise;
940
1150
  let stopPromise;
941
1151
  for (const queueType of Object.keys(args.contractJobs ?? {})) {
942
- const queueBinding = args.jobsBinding?.queues[queueType];
1152
+ const queueBinding = jobsBinding?.queues[queueType];
943
1153
  if (queueBinding)
944
1154
  lifecycle.watch(queueBinding);
945
1155
  jobsFacade[queueType] = {
946
1156
  create: (payload) => AsyncResult.from((async () => {
947
1157
  try {
948
- const jobsBinding = args.jobsBinding;
949
1158
  if (!jobsBinding) {
950
1159
  return Result.err(toUnexpectedError(new Error("Jobs bindings are unavailable")));
951
1160
  }
@@ -956,6 +1165,7 @@ function createJobsFacade(args) {
956
1165
  const manager = new InternalJobManager({
957
1166
  nc: args.nc,
958
1167
  jobs: jobsBinding,
1168
+ keyCoordinator,
959
1169
  });
960
1170
  await args.nc.flush();
961
1171
  const created = await manager.create(queueType, payload);
@@ -968,6 +1178,60 @@ function createJobsFacade(args) {
968
1178
  lifecycle,
969
1179
  }));
970
1180
  }
1181
+ catch (cause) {
1182
+ if (cause instanceof JobNotEnqueuedError) {
1183
+ return Result.err(cause);
1184
+ }
1185
+ return Result.err(toUnexpectedError(cause));
1186
+ }
1187
+ })()),
1188
+ submit: (payload) => AsyncResult.from((async () => {
1189
+ try {
1190
+ if (!jobsBinding) {
1191
+ return Result.err(toUnexpectedError(new Error("Jobs bindings are unavailable")));
1192
+ }
1193
+ const queueBinding = jobsBinding.queues[queueType];
1194
+ if (!queueBinding) {
1195
+ return Result.err(toUnexpectedError(new Error(`Jobs binding for queue '${queueType}' is unavailable`)));
1196
+ }
1197
+ const manager = new InternalJobManager({
1198
+ nc: args.nc,
1199
+ jobs: jobsBinding,
1200
+ keyCoordinator,
1201
+ });
1202
+ await args.nc.flush();
1203
+ const outcome = await manager.submit(queueType, payload);
1204
+ if (outcome.kind === "accepted") {
1205
+ return Result.ok({
1206
+ kind: "accepted",
1207
+ key: outcome.key,
1208
+ ref: createJobRef({
1209
+ nc: args.nc,
1210
+ queueType,
1211
+ jobsBinding,
1212
+ queueBinding,
1213
+ seed: outcome.job,
1214
+ lifecycle,
1215
+ }),
1216
+ });
1217
+ }
1218
+ if (outcome.kind === "replaced") {
1219
+ return Result.ok({
1220
+ kind: "replaced",
1221
+ key: outcome.key,
1222
+ replaced: outcome.replaced,
1223
+ ref: createJobRef({
1224
+ nc: args.nc,
1225
+ queueType,
1226
+ jobsBinding,
1227
+ queueBinding,
1228
+ seed: outcome.job,
1229
+ lifecycle,
1230
+ }),
1231
+ });
1232
+ }
1233
+ return Result.ok(outcome);
1234
+ }
971
1235
  catch (cause) {
972
1236
  return Result.err(toUnexpectedError(cause));
973
1237
  }
@@ -1001,10 +1265,9 @@ function createJobsFacade(args) {
1001
1265
  activeHost = host;
1002
1266
  return Result.ok(host);
1003
1267
  }
1004
- if (!args.jobsBinding || !args.workStream) {
1268
+ if (!jobsBinding || !args.workStream) {
1005
1269
  return Result.err(toUnexpectedError(new Error("Jobs infrastructure bindings are unavailable for this service")));
1006
1270
  }
1007
- const jobsBinding = args.jobsBinding;
1008
1271
  const workStream = args.workStream;
1009
1272
  const hosts = [];
1010
1273
  try {
@@ -1020,6 +1283,7 @@ function createJobsFacade(args) {
1020
1283
  const manager = new InternalJobManager({
1021
1284
  nc: args.nc,
1022
1285
  jobs: jobsBinding,
1286
+ keyCoordinator,
1023
1287
  });
1024
1288
  const host = await startNatsWorkerHostFromBinding({
1025
1289
  jobs: jobsBinding,
@@ -1029,6 +1293,7 @@ function createJobsFacade(args) {
1029
1293
  instanceId: `${args.serviceName}-worker`,
1030
1294
  queueTypes: [queueType],
1031
1295
  manager,
1296
+ heartbeatPublisher: args.nc,
1032
1297
  getProjectedJob: async (job) => {
1033
1298
  return lifecycle.get({
1034
1299
  service: job.service,
@@ -1137,24 +1402,6 @@ function createJobsFacade(args) {
1137
1402
  });
1138
1403
  return jobsFacade;
1139
1404
  }
1140
- function createBoundJobsFacade(args) {
1141
- const boundJobs = {};
1142
- const jobs = args.jobs;
1143
- for (const queueType of Object.keys(jobs)) {
1144
- const queue = jobs[queueType];
1145
- if (!queue)
1146
- continue;
1147
- boundJobs[queueType] = {
1148
- create: (payload) => queue.create(payload),
1149
- handle: (handler) => queue.handle(({ job, client }) => handler({
1150
- job,
1151
- client,
1152
- deps: args.deps,
1153
- })),
1154
- };
1155
- }
1156
- return boundJobs;
1157
- }
1158
1405
  /**
1159
1406
  * Connects a service with caller-supplied runtime dependencies for tests and
1160
1407
  * Trellis-owned internals. This helper is intentionally not re-exported from
@@ -1164,6 +1411,7 @@ function createBoundJobsFacade(args) {
1164
1411
  */
1165
1412
  export function connectTrellisServiceWithRuntimeDeps(args, deps) {
1166
1413
  return AsyncResult.from((async () => {
1414
+ const totalStartedAt = performance.now();
1167
1415
  try {
1168
1416
  const runtimeDeps = {
1169
1417
  ...(await loadDefaultServiceRuntimeDeps()),
@@ -1174,6 +1422,7 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
1174
1422
  }
1175
1423
  const auth = await createAuth({ sessionKeySeed: args.sessionKeySeed });
1176
1424
  const bootstrapLog = resolveServiceLogger(args.server?.log);
1425
+ const bootstrapStartedAt = performance.now();
1177
1426
  const bootstrap = await fetchServiceBootstrapInfo({
1178
1427
  trellisUrl: args.trellisUrl,
1179
1428
  serviceName: args.name,
@@ -1183,12 +1432,18 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
1183
1432
  auth,
1184
1433
  log: bootstrapLog,
1185
1434
  });
1435
+ recordTrellisDuration("trellis.connect.duration", performance.now() - bootstrapStartedAt, {
1436
+ phase: "bootstrap",
1437
+ participantKind: "service",
1438
+ outcome: "ok",
1439
+ });
1186
1440
  const { authenticator: authTokenAuthenticator, inboxPrefix } = await auth
1187
1441
  .natsConnectOptions({
1188
1442
  contractDigest: args.contract.CONTRACT_DIGEST,
1189
1443
  });
1190
1444
  let nc;
1191
1445
  try {
1446
+ const natsStartedAt = performance.now();
1192
1447
  nc = await runtimeDeps.connect({
1193
1448
  servers: selectRuntimeTransportServers(bootstrap.connectInfo.transports),
1194
1449
  maxReconnectAttempts: DEFAULT_RUNTIME_MAX_RECONNECT_ATTEMPTS,
@@ -1199,6 +1454,11 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
1199
1454
  jwtAuthenticator(bootstrap.connectInfo.transport.sentinel.jwt, new TextEncoder().encode(bootstrap.connectInfo.transport.sentinel.seed)),
1200
1455
  ],
1201
1456
  });
1457
+ recordTrellisDuration("trellis.connect.duration", performance.now() - natsStartedAt, {
1458
+ phase: "nats_connect",
1459
+ participantKind: "service",
1460
+ outcome: "ok",
1461
+ });
1202
1462
  }
1203
1463
  catch (cause) {
1204
1464
  throw new TransportError({
@@ -1224,7 +1484,7 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
1224
1484
  ...(args.server ?? {}),
1225
1485
  api: args.contract.API.owned,
1226
1486
  };
1227
- return Result.ok(await createConnectedService({
1487
+ const service = await createConnectedService({
1228
1488
  name: args.name,
1229
1489
  auth,
1230
1490
  nc,
@@ -1235,7 +1495,14 @@ export function connectTrellisServiceWithRuntimeDeps(args, deps) {
1235
1495
  contractEventConsumers: args.contract.CONTRACT.eventConsumers,
1236
1496
  server,
1237
1497
  bindings: bootstrap.binding.resources,
1238
- }));
1498
+ durableEventConsumerBeforeReadinessCheck: runtimeDeps.durableEventConsumerBeforeReadinessCheck,
1499
+ });
1500
+ recordTrellisDuration("trellis.connect.duration", performance.now() - totalStartedAt, {
1501
+ phase: "total",
1502
+ participantKind: "service",
1503
+ outcome: "ok",
1504
+ });
1505
+ return Result.ok(service);
1239
1506
  }
1240
1507
  catch (cause) {
1241
1508
  await closeFailedServiceBootstrapConnection(nc);
@@ -1312,6 +1579,9 @@ export class TrellisService {
1312
1579
  _TrellisService_operationTransfer.set(this, void 0);
1313
1580
  _TrellisService_stopHealthPublishing.set(this, void 0);
1314
1581
  _TrellisService_managedJobWorkers.set(this, void 0);
1582
+ _TrellisService_contractJobs.set(this, void 0);
1583
+ _TrellisService_jobsBinding.set(this, void 0);
1584
+ _TrellisService_ownedOutboxDispatchers.set(this, new Set());
1315
1585
  _TrellisService_waitPromise.set(this, void 0);
1316
1586
  _TrellisService_stopPromise.set(this, void 0);
1317
1587
  if (token !== trellisServiceConstructorToken) {
@@ -1346,33 +1616,20 @@ export class TrellisService {
1346
1616
  });
1347
1617
  this.jobs = jobs;
1348
1618
  __classPrivateFieldSet(this, _TrellisService_managedJobWorkers, jobs[MANAGED_JOB_WORKERS], "f");
1619
+ __classPrivateFieldSet(this, _TrellisService_contractJobs, contractJobs, "f");
1620
+ __classPrivateFieldSet(this, _TrellisService_jobsBinding, bindings.jobs, "f");
1349
1621
  this.health = health;
1350
1622
  this.handle = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createHandleFacade).call(this);
1351
1623
  this.connection = connection;
1352
1624
  __classPrivateFieldSet(this, _TrellisService_stopHealthPublishing, stopHealthPublishing, "f");
1353
1625
  }
1354
1626
  /**
1355
- * Returns a service wrapper that injects application dependencies into
1356
- * service-owned handler argument objects as `args.deps`.
1627
+ * Creates an explicit SQL outbox helper for service-owned transactions.
1628
+ * Services should create this at startup and close over it in handlers.
1357
1629
  */
1358
- with(deps) {
1359
- return {
1360
- name: this.name,
1361
- auth: this.auth,
1362
- event: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundEventFacade).call(this, deps),
1363
- kv: this.kv,
1364
- store: this.store,
1365
- jobs: createBoundJobsFacade({ jobs: this.jobs, deps }),
1366
- health: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundHealth).call(this, deps),
1367
- handle: __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createBoundHandleFacade).call(this, deps),
1368
- connection: this.connection,
1369
- createTransfer: (args) => this.createTransfer(args),
1370
- completeOperation: (operationId, output) => this.completeOperation(operationId, output),
1371
- publishPrepared: (event) => this.publishPrepared(event),
1372
- wait: () => this.wait(),
1373
- stop: () => this.stop(),
1374
- with: (nextDeps) => this.with(nextDeps),
1375
- };
1630
+ createSqlOutbox(options) {
1631
+ const binding = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createSqlOutboxBinding).call(this, options);
1632
+ return __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_createSqlOutbox).call(this, binding);
1376
1633
  }
1377
1634
  /** Publishes a prepared event through the service runtime connection. */
1378
1635
  publishPrepared(event) {
@@ -1433,6 +1690,11 @@ export class TrellisService {
1433
1690
  async stop() {
1434
1691
  __classPrivateFieldSet(this, _TrellisService_stopPromise, __classPrivateFieldGet(this, _TrellisService_stopPromise, "f") ?? (async () => {
1435
1692
  this.connection.stopObserving();
1693
+ __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f").stopEventListeners();
1694
+ for (const dispatcher of __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f")) {
1695
+ dispatcher.stop();
1696
+ }
1697
+ __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f").clear();
1436
1698
  try {
1437
1699
  await __classPrivateFieldGet(this, _TrellisService_stopHealthPublishing, "f").call(this);
1438
1700
  }
@@ -1459,91 +1721,13 @@ export class TrellisService {
1459
1721
  await __classPrivateFieldGet(this, _TrellisService_stopPromise, "f");
1460
1722
  }
1461
1723
  }
1462
- _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) {
1463
- const health = this.health;
1464
- return {
1465
- serviceName: health.serviceName,
1466
- kind: health.kind,
1467
- instanceId: health.instanceId,
1468
- contractId: health.contractId,
1469
- contractDigest: health.contractDigest,
1470
- startedAt: health.startedAt,
1471
- publishIntervalMs: health.publishIntervalMs,
1472
- setInfo(info) {
1473
- if (typeof info !== "function") {
1474
- health.setInfo(info);
1475
- return;
1476
- }
1477
- health.setInfo(() => info({ deps }));
1478
- },
1479
- add(name, check) {
1480
- return health.add(name, () => check({ deps }));
1481
- },
1482
- checks: () => health.checks(),
1483
- response: () => health.response(),
1484
- heartbeat: () => health.heartbeat(),
1485
- };
1486
- }, _TrellisService_createBoundEventFacade = function _TrellisService_createBoundEventFacade(deps) {
1487
- const event = {};
1488
- const source = this.event;
1489
- for (const [groupName, leaves] of Object.entries(source)) {
1490
- const group = {};
1491
- for (const [leafName, leaf] of Object.entries(leaves)) {
1492
- group[leafName] = {
1493
- prepare: (payload) => leaf.prepare(payload),
1494
- publish: (payload) => leaf.publish(payload),
1495
- listen: (handler, subjectData, opts) => leaf.listen((payload, context) => handler({
1496
- event: payload,
1497
- context,
1498
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1499
- deps,
1500
- }), subjectData, opts),
1501
- };
1502
- }
1503
- Object.defineProperty(event, groupName, {
1504
- value: group,
1505
- enumerable: true,
1506
- configurable: true,
1507
- });
1508
- }
1509
- return event;
1510
- }, _TrellisService_createHandleFacade = function _TrellisService_createHandleFacade() {
1511
- const rpc = {};
1512
- for (const method of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.rpc ?? {})) {
1513
- addSurfaceLeaf(rpc, method, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").mountRuntime(method, async ({ input, context }) => await Promise.resolve(handler({
1514
- input,
1515
- context,
1516
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1517
- }))));
1518
- }
1519
- const feed = {};
1520
- for (const feedName of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.feeds ?? {})) {
1521
- addSurfaceLeaf(feed, feedName, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").feedHandle(feedName).handle((context) => handler({
1522
- ...context,
1523
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1524
- })));
1525
- }
1526
- const operation = {};
1527
- for (const operationName of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.operations ?? {})) {
1528
- const registration = __classPrivateFieldGet(this, _TrellisService_instances, "m", _TrellisService_operation).call(this, operationName);
1529
- const leaf = Object.assign((handler) => registration.handle((context) => handler({
1530
- ...context,
1531
- client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1532
- })), {
1533
- accept: (args) => registration.accept(args),
1534
- control: (operationId) => registration.control(operationId),
1535
- });
1536
- addSurfaceLeaf(operation, operationName, leaf);
1537
- }
1538
- return { rpc, feed, operation };
1539
- }, _TrellisService_createBoundHandleFacade = function _TrellisService_createBoundHandleFacade(deps) {
1724
+ _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() {
1540
1725
  const rpc = {};
1541
1726
  for (const method of Object.keys(__classPrivateFieldGet(this, _TrellisService_server, "f").api.rpc ?? {})) {
1542
1727
  addSurfaceLeaf(rpc, method, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").mountRuntime(method, async ({ input, context }) => await Promise.resolve(handler({
1543
1728
  input,
1544
1729
  context,
1545
1730
  client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1546
- deps,
1547
1731
  }))));
1548
1732
  }
1549
1733
  const feed = {};
@@ -1551,7 +1735,6 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
1551
1735
  addSurfaceLeaf(feed, feedName, (handler) => __classPrivateFieldGet(this, _TrellisService_server, "f").feedHandle(feedName).handle((context) => handler({
1552
1736
  ...context,
1553
1737
  client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1554
- deps,
1555
1738
  })));
1556
1739
  }
1557
1740
  const operation = {};
@@ -1560,7 +1743,6 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
1560
1743
  const leaf = Object.assign((handler) => registration.handle((context) => handler({
1561
1744
  ...context,
1562
1745
  client: __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f"),
1563
- deps,
1564
1746
  })), {
1565
1747
  accept: (args) => registration.accept(args),
1566
1748
  control: (operationId) => registration.control(operationId),
@@ -1568,6 +1750,66 @@ _TrellisService_server = new WeakMap(), _TrellisService_nc = new WeakMap(), _Tre
1568
1750
  addSurfaceLeaf(operation, operationName, leaf);
1569
1751
  }
1570
1752
  return { rpc, feed, operation };
1753
+ }, _TrellisService_createSqlOutboxBinding = function _TrellisService_createSqlOutboxBinding(options) {
1754
+ const tables = resolveSqlOutboxTables(options.tables);
1755
+ const executor = createSqlOutboxBaseExecutor(options);
1756
+ const repository = new SqlOutboxRepository(executor, options.dialect, tables);
1757
+ const dispatchRuntime = {
1758
+ publishPreparedEvent: (event) => __classPrivateFieldGet(this, _TrellisService_handlerTrellis, "f").publishPrepared(event),
1759
+ // dispatchJobSubmission: stub — filled in by Phase 3
1760
+ };
1761
+ const dispatcher = new OutboxDispatcher(repository, dispatchRuntime, options.dispatcher);
1762
+ __classPrivateFieldGet(this, _TrellisService_ownedOutboxDispatchers, "f").add(dispatcher);
1763
+ return {
1764
+ dialect: options.dialect,
1765
+ tables,
1766
+ transaction: createSqlOutboxTransactionRunner(options),
1767
+ dispatcher,
1768
+ };
1769
+ }, _TrellisService_createSqlOutbox = function _TrellisService_createSqlOutbox(binding) {
1770
+ return {
1771
+ transaction: (work) => AsyncResult.from((() => {
1772
+ let enqueued = 0;
1773
+ const toResultError = (cause) => {
1774
+ if (cause instanceof ValidationError ||
1775
+ cause instanceof UnexpectedError) {
1776
+ return Result.err(cause);
1777
+ }
1778
+ return Result.err(toUnexpectedError(cause));
1779
+ };
1780
+ let transaction;
1781
+ try {
1782
+ transaction = binding.transaction(({ tx, executor }) => {
1783
+ const repository = new SqlOutboxRepository(executor, binding.dialect, binding.tables);
1784
+ const event = createSqlOutboxEventEnqueueFacade({
1785
+ event: this.event,
1786
+ repository,
1787
+ onEnqueued: () => {
1788
+ enqueued += 1;
1789
+ },
1790
+ });
1791
+ const job = createSqlOutboxJobEnqueueFacade({
1792
+ serviceName: this.name,
1793
+ contractJobs: __classPrivateFieldGet(this, _TrellisService_contractJobs, "f"),
1794
+ jobsBinding: __classPrivateFieldGet(this, _TrellisService_jobsBinding, "f"),
1795
+ repository,
1796
+ onEnqueued: () => {
1797
+ enqueued += 1;
1798
+ },
1799
+ });
1800
+ return work({ tx, event, job });
1801
+ });
1802
+ }
1803
+ catch (cause) {
1804
+ return Promise.resolve(toResultError(cause));
1805
+ }
1806
+ return transaction.then((result) => {
1807
+ if (enqueued > 0)
1808
+ binding.dispatcher.notify();
1809
+ return Result.ok(result);
1810
+ }, toResultError);
1811
+ })()),
1812
+ };
1571
1813
  }, _TrellisService_operation = function _TrellisService_operation(operation) {
1572
1814
  const registration = __classPrivateFieldGet(this, _TrellisService_server, "f").operationHandle(operation);
1573
1815
  return {