@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
@@ -14,67 +14,137 @@ var _MemoryOutboxRepository_messages, _MemoryInboxRepository_seen, _OutboxDispat
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.OutboxDispatcher = exports.NatsKvInboxRepository = exports.NatsKvOutboxRepository = exports.KvOutboxRecordSchema = exports.SqlInboxRepository = exports.SqlOutboxRepository = exports.MemoryInboxRepository = exports.MemoryOutboxRepository = exports.defaultSqlOutboxTables = void 0;
16
16
  exports.createSqlOutboxAdapter = createSqlOutboxAdapter;
17
+ exports.getSqlOutboxMigrations = getSqlOutboxMigrations;
17
18
  exports.createSqliteOutboxSchema = createSqliteOutboxSchema;
18
19
  exports.createPostgresOutboxSchema = createPostgresOutboxSchema;
19
20
  exports.dispatchOutbox = dispatchOutbox;
20
- exports.outboxMessageToPrepared = outboxMessageToPrepared;
21
+ exports.outboxMessageToPreparedEvent = outboxMessageToPreparedEvent;
22
+ exports.preparedTrellisEventToOutboxRecord = preparedTrellisEventToOutboxRecord;
21
23
  const result_1 = require("@qlever-llc/result");
22
24
  const typebox_1 = require("typebox");
23
25
  const mod_js_1 = require("../telemetry/mod.js");
26
+ /** Default Trellis helper-table names for SQL outbox and inbox storage. */
24
27
  exports.defaultSqlOutboxTables = Object.freeze({
25
28
  outbox: "trellis_outbox",
26
29
  inbox: "trellis_inbox",
27
30
  });
31
+ const sqlIdentifierPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
28
32
  /**
29
- * Creates SQL outbox/inbox repositories plus DDL for caller-owned migrations.
33
+ * Creates SQL outbox/inbox repositories plus current helper-table DDL.
30
34
  *
31
- * Trellis does not import Drizzle here to avoid making every service depend on a
32
- * specific migration library. Services should include the returned DDL, or an
33
- * equivalent Drizzle table definition using these table and column names, in
34
- * their own Drizzle-managed migration flow.
35
+ * Use {@link getSqlOutboxMigrations} when services need versioned Trellis-owned
36
+ * migration artifacts for their normal database migration tooling.
35
37
  */
36
38
  function createSqlOutboxAdapter(executor, dialect, tables = exports.defaultSqlOutboxTables) {
39
+ const sqlTables = validateSqlOutboxTables(tables);
37
40
  return {
38
- outbox: new SqlOutboxRepository(executor, dialect, tables),
39
- inbox: new SqlInboxRepository(executor, dialect, tables),
41
+ outbox: new SqlOutboxRepository(executor, dialect, sqlTables),
42
+ inbox: new SqlInboxRepository(executor, dialect, sqlTables),
40
43
  ddl: dialect === "postgres"
41
- ? createPostgresOutboxSchema(tables)
42
- : createSqliteOutboxSchema(tables),
44
+ ? createPostgresOutboxSchema(sqlTables)
45
+ : createSqliteOutboxSchema(sqlTables),
43
46
  };
44
47
  }
48
+ /**
49
+ * Returns Trellis-owned SQL outbox/inbox migration artifacts for a dialect.
50
+ *
51
+ * Trellis generates the helper-table SQL, but services remain responsible for
52
+ * running these artifacts through their normal database migration tooling.
53
+ */
54
+ function getSqlOutboxMigrations(options) {
55
+ const tables = resolveSqlOutboxTables(options.tables);
56
+ const up = options.dialect === "postgres"
57
+ ? createPostgresOutboxSchema(tables)
58
+ : createSqliteOutboxSchema(tables);
59
+ const down = createSqlOutboxDownSchema(tables);
60
+ return Object.freeze([
61
+ Object.freeze({
62
+ id: `trellis_sql_outbox_inbox_${options.dialect}_v1`,
63
+ version: 1,
64
+ dialect: options.dialect,
65
+ up,
66
+ down,
67
+ checksum: checksumMigrationSql(up, down),
68
+ }),
69
+ ]);
70
+ }
45
71
  /** Returns SQLite DDL for Trellis outbox and inbox tables. */
46
72
  function createSqliteOutboxSchema(tables = exports.defaultSqlOutboxTables) {
73
+ const sqlTables = validateSqlOutboxTables(tables);
47
74
  return [
48
- `CREATE TABLE IF NOT EXISTS ${tables.outbox} (id TEXT PRIMARY KEY, event TEXT NOT NULL, subject TEXT NOT NULL, payload TEXT NOT NULL, headers TEXT NOT NULL, state TEXT NOT NULL, attempts INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, next_attempt_at TEXT, last_error TEXT)`,
49
- `CREATE INDEX IF NOT EXISTS ${tables.outbox}_due_idx ON ${tables.outbox} (state, next_attempt_at)`,
50
- `CREATE TABLE IF NOT EXISTS ${tables.inbox} (message_id TEXT PRIMARY KEY, received_at TEXT NOT NULL)`,
75
+ `CREATE TABLE IF NOT EXISTS ${sqlTables.outbox} (id TEXT PRIMARY KEY, kind TEXT NOT NULL, name TEXT NOT NULL, subject TEXT NOT NULL, payload TEXT NOT NULL, headers TEXT NOT NULL, state TEXT NOT NULL, attempts INTEGER NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL, next_attempt_at TEXT, last_error TEXT, outcome TEXT)`,
76
+ `CREATE INDEX IF NOT EXISTS ${sqlTables.outbox}_due_idx ON ${sqlTables.outbox} (state, next_attempt_at)`,
77
+ `CREATE TABLE IF NOT EXISTS ${sqlTables.inbox} (message_id TEXT PRIMARY KEY, received_at TEXT NOT NULL)`,
51
78
  ];
52
79
  }
53
80
  /** Returns Postgres DDL for Trellis outbox and inbox tables. */
54
81
  function createPostgresOutboxSchema(tables = exports.defaultSqlOutboxTables) {
82
+ const sqlTables = validateSqlOutboxTables(tables);
55
83
  return [
56
- `CREATE TABLE IF NOT EXISTS ${tables.outbox} (id text PRIMARY KEY, event text NOT NULL, subject text NOT NULL, payload text NOT NULL, headers jsonb NOT NULL, state text NOT NULL, attempts integer NOT NULL, created_at timestamptz NOT NULL, updated_at timestamptz NOT NULL, next_attempt_at timestamptz, last_error text)`,
57
- `CREATE INDEX IF NOT EXISTS ${tables.outbox}_due_idx ON ${tables.outbox} (state, next_attempt_at)`,
58
- `CREATE TABLE IF NOT EXISTS ${tables.inbox} (message_id text PRIMARY KEY, received_at timestamptz NOT NULL)`,
84
+ `CREATE TABLE IF NOT EXISTS ${sqlTables.outbox} (id text PRIMARY KEY, kind text NOT NULL, name text NOT NULL, subject text NOT NULL, payload text NOT NULL, headers jsonb NOT NULL, state text NOT NULL, attempts integer NOT NULL, created_at timestamptz NOT NULL, updated_at timestamptz NOT NULL, next_attempt_at timestamptz, last_error text, outcome jsonb)`,
85
+ `CREATE INDEX IF NOT EXISTS ${sqlTables.outbox}_due_idx ON ${sqlTables.outbox} (state, next_attempt_at)`,
86
+ `CREATE TABLE IF NOT EXISTS ${sqlTables.inbox} (message_id text PRIMARY KEY, received_at timestamptz NOT NULL)`,
59
87
  ];
60
88
  }
89
+ function createSqlOutboxDownSchema(tables) {
90
+ const sqlTables = validateSqlOutboxTables(tables);
91
+ return [
92
+ `DROP INDEX IF EXISTS ${sqlTables.outbox}_due_idx`,
93
+ `DROP TABLE IF EXISTS ${sqlTables.inbox}`,
94
+ `DROP TABLE IF EXISTS ${sqlTables.outbox}`,
95
+ ];
96
+ }
97
+ function resolveSqlOutboxTables(tables) {
98
+ return validateSqlOutboxTables({
99
+ outbox: tables?.outbox ?? exports.defaultSqlOutboxTables.outbox,
100
+ inbox: tables?.inbox ?? exports.defaultSqlOutboxTables.inbox,
101
+ });
102
+ }
103
+ function validateSqlOutboxTables(tables) {
104
+ validateSqlIdentifier("outbox", tables.outbox);
105
+ validateSqlIdentifier("inbox", tables.inbox);
106
+ return Object.freeze({ outbox: tables.outbox, inbox: tables.inbox });
107
+ }
108
+ function validateSqlIdentifier(kind, name) {
109
+ if (!sqlIdentifierPattern.test(name)) {
110
+ throw new Error(`Invalid SQL ${kind} table name "${name}". Use a simple identifier matching ${sqlIdentifierPattern.source}.`);
111
+ }
112
+ }
113
+ function checksumMigrationSql(up, down) {
114
+ return `fnv1a64:${fnv1a64Hex([
115
+ "-- up",
116
+ ...up,
117
+ "-- down",
118
+ ...down,
119
+ ].join("\n"))}`;
120
+ }
121
+ function fnv1a64Hex(input) {
122
+ let hash = 0xcbf29ce484222325n;
123
+ const prime = 0x100000001b3n;
124
+ for (const character of input) {
125
+ hash ^= BigInt(character.codePointAt(0) ?? 0);
126
+ hash = BigInt.asUintN(64, hash * prime);
127
+ }
128
+ return hash.toString(16).padStart(16, "0");
129
+ }
61
130
  /** In-memory outbox repository intended for tests and local process adapters. */
62
131
  class MemoryOutboxRepository {
63
132
  constructor() {
64
133
  _MemoryOutboxRepository_messages.set(this, new Map());
65
134
  }
66
- async enqueue(event) {
135
+ async enqueue(record) {
67
136
  const now = new Date().toISOString();
68
- const id = messageId(event);
137
+ const id = record.id;
69
138
  const existing = __classPrivateFieldGet(this, _MemoryOutboxRepository_messages, "f").get(id);
70
139
  if (existing)
71
140
  return existing;
72
141
  const message = {
73
142
  id,
74
- event: event.event,
75
- subject: event.subject,
76
- payload: event.encodedPayload,
77
- headers: { ...event.headers },
143
+ kind: record.kind,
144
+ name: record.name,
145
+ subject: record.subject,
146
+ payload: record.payload,
147
+ headers: { ...record.headers },
78
148
  state: "pending",
79
149
  attempts: 0,
80
150
  createdAt: now,
@@ -98,7 +168,7 @@ class MemoryOutboxRepository {
98
168
  }
99
169
  return claimed;
100
170
  }
101
- async markDispatched(id, now) {
171
+ async markDispatched(id, now, outcome) {
102
172
  const message = __classPrivateFieldGet(this, _MemoryOutboxRepository_messages, "f").get(id);
103
173
  if (!message)
104
174
  return;
@@ -108,6 +178,7 @@ class MemoryOutboxRepository {
108
178
  updatedAt: now.toISOString(),
109
179
  nextAttemptAt: undefined,
110
180
  lastError: undefined,
181
+ outcome: outcome ?? message.outcome,
111
182
  });
112
183
  }
113
184
  async markFailed(id, failure) {
@@ -165,17 +236,19 @@ class SqlOutboxRepository {
165
236
  enumerable: true,
166
237
  configurable: true,
167
238
  writable: true,
168
- value: tables
239
+ value: void 0
169
240
  });
241
+ this.tables = validateSqlOutboxTables(tables);
170
242
  }
171
- async enqueue(event) {
243
+ async enqueue(record) {
172
244
  const now = new Date().toISOString();
173
245
  const message = {
174
- id: messageId(event),
175
- event: event.event,
176
- subject: event.subject,
177
- payload: event.encodedPayload,
178
- headers: { ...event.headers },
246
+ id: record.id,
247
+ kind: record.kind,
248
+ name: record.name,
249
+ subject: record.subject,
250
+ payload: record.payload,
251
+ headers: { ...record.headers },
179
252
  state: "pending",
180
253
  attempts: 0,
181
254
  createdAt: now,
@@ -185,9 +258,10 @@ class SqlOutboxRepository {
185
258
  const conflict = this.dialect === "postgres"
186
259
  ? "ON CONFLICT (id) DO NOTHING"
187
260
  : "ON CONFLICT(id) DO NOTHING";
188
- await this.executor.execute(`INSERT INTO ${this.tables.outbox} (id, event, subject, payload, headers, state, attempts, created_at, updated_at, next_attempt_at, last_error) VALUES (${placeholders(this.dialect, 11)}) ${conflict}`, [
261
+ await this.executor.execute(`INSERT INTO ${this.tables.outbox} (id, kind, name, subject, payload, headers, state, attempts, created_at, updated_at, next_attempt_at, last_error, outcome) VALUES (${placeholders(this.dialect, 13)}) ${conflict}`, [
189
262
  message.id,
190
- message.event,
263
+ message.kind,
264
+ message.name,
191
265
  message.subject,
192
266
  message.payload,
193
267
  headers,
@@ -197,15 +271,17 @@ class SqlOutboxRepository {
197
271
  message.updatedAt,
198
272
  null,
199
273
  null,
274
+ null,
200
275
  ]);
201
276
  return message;
202
277
  }
203
278
  async claimDue(limit, now) {
204
- const rows = await this.executor.query(`SELECT id, event, subject, payload, headers, state, attempts, created_at, updated_at, next_attempt_at, last_error FROM ${this.tables.outbox} WHERE state != ${placeholder(this.dialect, 1)} AND (next_attempt_at IS NULL OR next_attempt_at <= ${placeholder(this.dialect, 2)}) ORDER BY created_at LIMIT ${placeholder(this.dialect, 3)}`, ["dispatched", now.toISOString(), limit]);
279
+ const rows = await this.executor.query(`SELECT id, kind, name, subject, payload, headers, state, attempts, created_at, updated_at, next_attempt_at, last_error, outcome FROM ${this.tables.outbox} WHERE state != ${placeholder(this.dialect, 1)} AND (next_attempt_at IS NULL OR next_attempt_at <= ${placeholder(this.dialect, 2)}) ORDER BY created_at LIMIT ${placeholder(this.dialect, 3)}`, ["dispatched", now.toISOString(), limit]);
205
280
  return rows.map(rowToOutboxMessage);
206
281
  }
207
- async markDispatched(id, now) {
208
- await this.executor.execute(`UPDATE ${this.tables.outbox} SET state = ${placeholder(this.dialect, 1)}, updated_at = ${placeholder(this.dialect, 2)}, next_attempt_at = NULL, last_error = NULL WHERE id = ${placeholder(this.dialect, 3)}`, ["dispatched", now.toISOString(), id]);
282
+ async markDispatched(id, now, outcome) {
283
+ const outcomeJson = outcome !== undefined ? JSON.stringify(outcome) : null;
284
+ await this.executor.execute(`UPDATE ${this.tables.outbox} SET state = ${placeholder(this.dialect, 1)}, updated_at = ${placeholder(this.dialect, 2)}, next_attempt_at = NULL, last_error = NULL, outcome = ${placeholder(this.dialect, 3)} WHERE id = ${placeholder(this.dialect, 4)}`, ["dispatched", now.toISOString(), outcomeJson, id]);
209
285
  }
210
286
  async markFailed(id, failure) {
211
287
  await this.executor.execute(`UPDATE ${this.tables.outbox} SET state = ${placeholder(this.dialect, 1)}, attempts = attempts + 1, updated_at = ${placeholder(this.dialect, 2)}, next_attempt_at = ${placeholder(this.dialect, 3)}, last_error = ${placeholder(this.dialect, 4)} WHERE id = ${placeholder(this.dialect, 5)}`, [
@@ -237,8 +313,9 @@ class SqlInboxRepository {
237
313
  enumerable: true,
238
314
  configurable: true,
239
315
  writable: true,
240
- value: tables
316
+ value: void 0
241
317
  });
318
+ this.tables = validateSqlOutboxTables(tables);
242
319
  }
243
320
  async record(messageId, now = new Date()) {
244
321
  try {
@@ -266,7 +343,8 @@ const KvInboxRecordSchema = typebox_1.Type.Object({
266
343
  });
267
344
  exports.KvOutboxRecordSchema = typebox_1.Type.Object({
268
345
  id: typebox_1.Type.String(),
269
- event: typebox_1.Type.String(),
346
+ kind: typebox_1.Type.String(),
347
+ name: typebox_1.Type.String(),
270
348
  subject: typebox_1.Type.String(),
271
349
  payload: typebox_1.Type.String(),
272
350
  headers: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.String()),
@@ -281,6 +359,7 @@ exports.KvOutboxRecordSchema = typebox_1.Type.Object({
281
359
  updatedAt: typebox_1.Type.String(),
282
360
  nextAttemptAt: typebox_1.Type.Optional(typebox_1.Type.String()),
283
361
  lastError: typebox_1.Type.Optional(typebox_1.Type.String()),
362
+ outcome: typebox_1.Type.Optional(typebox_1.Type.String()),
284
363
  });
285
364
  /** Durable NATS KV outbox repository for services without SQL state. */
286
365
  class NatsKvOutboxRepository {
@@ -292,14 +371,15 @@ class NatsKvOutboxRepository {
292
371
  value: kv
293
372
  });
294
373
  }
295
- async enqueue(event) {
374
+ async enqueue(rec) {
296
375
  const now = new Date().toISOString();
297
376
  const record = {
298
- id: messageId(event),
299
- event: event.event,
300
- subject: event.subject,
301
- payload: event.encodedPayload,
302
- headers: { ...event.headers },
377
+ id: rec.id,
378
+ kind: rec.kind,
379
+ name: rec.name,
380
+ subject: rec.subject,
381
+ payload: rec.payload,
382
+ headers: { ...rec.headers },
303
383
  state: "pending",
304
384
  attempts: 0,
305
385
  createdAt: now,
@@ -353,19 +433,23 @@ class NatsKvOutboxRepository {
353
433
  }
354
434
  return claimed;
355
435
  }
356
- async markDispatched(id, now) {
436
+ async markDispatched(id, now, outcome) {
357
437
  const loaded = await this.kv.get(id).take();
358
438
  if ((0, result_1.isErr)(loaded)) {
359
439
  if (hasKvReason(loaded.error, "not found"))
360
440
  return;
361
441
  throw loaded.error;
362
442
  }
443
+ const outcomeStr = outcome !== undefined
444
+ ? JSON.stringify(outcome)
445
+ : undefined;
363
446
  const stored = await loaded.put({
364
447
  ...loaded.value,
365
448
  state: "dispatched",
366
449
  updatedAt: now.toISOString(),
367
450
  nextAttemptAt: undefined,
368
451
  lastError: undefined,
452
+ outcome: outcomeStr ?? loaded.value.outcome,
369
453
  }, true).take();
370
454
  if ((0, result_1.isErr)(stored))
371
455
  throw stored.error;
@@ -565,7 +649,7 @@ _OutboxDispatcher_repository = new WeakMap(), _OutboxDispatcher_runtime = new We
565
649
  __classPrivateFieldSet(this, _OutboxDispatcher_idleTimer, undefined, "f");
566
650
  }
567
651
  };
568
- /** Dispatches due outbox messages through a Trellis runtime publisher. */
652
+ /** Dispatches due outbox messages through a dispatch runtime. */
569
653
  async function dispatchOutbox(repository, runtime, options = {}) {
570
654
  const now = options.now ?? new Date();
571
655
  const retryDelayMs = options.retryDelayMs ?? 1000;
@@ -573,47 +657,115 @@ async function dispatchOutbox(repository, runtime, options = {}) {
573
657
  let dispatched = 0;
574
658
  let failed = 0;
575
659
  for (const message of messages) {
576
- const result = await runtime.publishPrepared(outboxMessageToPrepared(message));
577
- const value = result.take();
578
- if ((0, result_1.isErr)(value)) {
579
- (0, mod_js_1.recordTrellisError)(value.error, {
660
+ if (message.kind === "event.publish") {
661
+ const result = await runtime.publishPreparedEvent(outboxMessageToPreparedEvent(message));
662
+ const value = result.take();
663
+ if ((0, result_1.isErr)(value)) {
664
+ (0, mod_js_1.recordTrellisError)(value.error, {
665
+ surface: "outbox",
666
+ direction: "dispatcher",
667
+ operation: message.name,
668
+ phase: "publish",
669
+ messagingSystem: "nats",
670
+ });
671
+ failed += 1;
672
+ await repository.markFailed(message.id, {
673
+ error: value.error.message,
674
+ nextAttemptAt: new Date(now.getTime() + retryDelayMs),
675
+ now,
676
+ });
677
+ continue;
678
+ }
679
+ dispatched += 1;
680
+ await repository.markDispatched(message.id, now);
681
+ }
682
+ else if (message.kind === "job.create" || message.kind === "job.submit") {
683
+ if (runtime.dispatchJobSubmission) {
684
+ const result = await runtime.dispatchJobSubmission(message);
685
+ const value = result.take();
686
+ if ((0, result_1.isErr)(value)) {
687
+ (0, mod_js_1.recordTrellisError)(value.error, {
688
+ surface: "outbox",
689
+ direction: "dispatcher",
690
+ operation: message.name,
691
+ phase: "job.dispatch",
692
+ });
693
+ failed += 1;
694
+ await repository.markFailed(message.id, {
695
+ error: value.error.message,
696
+ nextAttemptAt: new Date(now.getTime() + retryDelayMs),
697
+ now,
698
+ });
699
+ continue;
700
+ }
701
+ dispatched += 1;
702
+ await repository.markDispatched(message.id, now);
703
+ }
704
+ else {
705
+ (0, mod_js_1.recordTrellisError)(new Error(`job dispatch not supported`), {
706
+ surface: "outbox",
707
+ direction: "dispatcher",
708
+ operation: message.name,
709
+ phase: "dispatch",
710
+ });
711
+ await repository.markDispatched(message.id, now, {
712
+ error: "job dispatch not supported",
713
+ });
714
+ }
715
+ }
716
+ else {
717
+ const error = `Unknown outbox record kind: ${message.kind}`;
718
+ (0, mod_js_1.recordTrellisError)(new Error(error), {
580
719
  surface: "outbox",
581
720
  direction: "dispatcher",
582
- operation: message.event,
583
- phase: "publish",
584
- messagingSystem: "nats",
721
+ operation: message.name,
722
+ phase: "dispatch",
585
723
  });
586
- failed += 1;
587
- await repository.markFailed(message.id, {
588
- error: value.error.message,
589
- nextAttemptAt: new Date(now.getTime() + retryDelayMs),
590
- now,
591
- });
592
- continue;
724
+ await repository.markDispatched(message.id, now, { error });
593
725
  }
594
- dispatched += 1;
595
- await repository.markDispatched(message.id, now);
596
726
  }
597
727
  return { dispatched, failed };
598
728
  }
599
- /** Rehydrates a persisted outbox row into a prepared event. */
600
- function outboxMessageToPrepared(message) {
729
+ /** Rehydrates a persisted outbox event row into a prepared event. */
730
+ function outboxMessageToPreparedEvent(message) {
731
+ if (message.kind !== "event.publish") {
732
+ throw new Error(`Expected event.publish kind, got ${message.kind}`);
733
+ }
734
+ const payload = JSON.parse(message.payload);
735
+ const header = eventHeaderFromMessage(message.headers);
601
736
  return Object.freeze({
602
- event: message.event,
737
+ event: message.name,
603
738
  subject: message.subject,
604
- payload: Object.freeze(JSON.parse(message.payload)),
739
+ header: Object.freeze(header),
740
+ payload: Object.freeze(payload),
605
741
  encodedPayload: message.payload,
606
742
  headers: Object.freeze({ ...message.headers }),
607
743
  });
608
744
  }
609
- function messageId(event) {
610
- return event.headers["Nats-Msg-Id"] ?? event.headers["nats-msg-id"] ??
611
- event.payload.header.id;
745
+ /** Adapts a prepared Trellis event into a generic outbox record. */
746
+ function preparedTrellisEventToOutboxRecord(event) {
747
+ return {
748
+ id: event.headers["Nats-Msg-Id"] ?? event.header.id,
749
+ kind: "event.publish",
750
+ name: event.event,
751
+ subject: event.subject,
752
+ payload: event.encodedPayload,
753
+ headers: event.headers,
754
+ };
755
+ }
756
+ function eventHeaderFromMessage(headers) {
757
+ const id = headers["Nats-Msg-Id"] ?? headers["nats-msg-id"];
758
+ const time = headers["Trellis-Event-Time"] ?? headers["trellis-event-time"];
759
+ return {
760
+ id: typeof id === "string" ? id : "",
761
+ time: typeof time === "string" ? time : new Date(0).toISOString(),
762
+ };
612
763
  }
613
764
  function rowToOutboxMessage(row) {
614
765
  return {
615
766
  id: stringField(row, "id"),
616
- event: stringField(row, "event"),
767
+ kind: kindField(row, "kind"),
768
+ name: stringField(row, "name"),
617
769
  subject: stringField(row, "subject"),
618
770
  payload: stringField(row, "payload"),
619
771
  headers: parseHeaders(row["headers"]),
@@ -623,12 +775,14 @@ function rowToOutboxMessage(row) {
623
775
  updatedAt: stringField(row, "updated_at"),
624
776
  nextAttemptAt: optionalStringField(row, "next_attempt_at"),
625
777
  lastError: optionalStringField(row, "last_error"),
778
+ outcome: optionalStringField(row, "outcome"),
626
779
  };
627
780
  }
628
781
  function kvRecordToOutboxMessage(record) {
629
782
  return {
630
783
  id: record.id,
631
- event: record.event,
784
+ kind: record.kind,
785
+ name: record.name,
632
786
  subject: record.subject,
633
787
  payload: record.payload,
634
788
  headers: { ...record.headers },
@@ -638,6 +792,7 @@ function kvRecordToOutboxMessage(record) {
638
792
  updatedAt: record.updatedAt,
639
793
  nextAttemptAt: record.nextAttemptAt,
640
794
  lastError: record.lastError,
795
+ outcome: record.outcome,
641
796
  };
642
797
  }
643
798
  function placeholder(dialect, index) {
@@ -692,6 +847,14 @@ function numberField(row, field) {
692
847
  }
693
848
  return value;
694
849
  }
850
+ function kindField(row, field) {
851
+ const value = stringField(row, field);
852
+ if (value === "event.publish" || value === "job.create" ||
853
+ value === "job.submit") {
854
+ return value;
855
+ }
856
+ throw new Error(`Expected SQL field ${field} to be an outbox record kind`);
857
+ }
695
858
  function stateField(row, field) {
696
859
  const value = stringField(row, field);
697
860
  if (value === "pending" || value === "dispatched" || value === "failed") {
@@ -20,8 +20,63 @@ export type TrellisErrorMetricAttributes = {
20
20
  /** Static messaging operation name, when already known. */
21
21
  messagingOperation?: string;
22
22
  };
23
+ /** Duration metric names accepted by {@link recordTrellisDuration}. */
24
+ export type TrellisDurationMetricName = "trellis.connect.duration" | "trellis.auth.flow.duration" | "trellis.auth.approval_resolution.duration" | "trellis.auth.callout.duration" | "trellis.admin.workflow.duration" | "trellis.contract.analysis.duration";
25
+ /** Low-cardinality attributes accepted by {@link recordTrellisDuration}. */
26
+ export type TrellisDurationMetricAttributes = {
27
+ /** Stable Trellis surface name, such as `rpc`, `jobs`, or `operations`. */
28
+ surface?: string;
29
+ /** Stable operation kind or method name. Do not pass IDs, subjects, or URLs. */
30
+ operation?: string;
31
+ /** Stable lifecycle phase such as `bootstrap`, `encode`, or `total`. */
32
+ phase?: string;
33
+ /** Stable outcome label such as `ok` or `error`. */
34
+ outcome?: string;
35
+ /** Participant kind such as `admin`, `client`, `service`, or `device`. */
36
+ participantKind?: string;
37
+ /** Session kind such as `user`, `service`, or `device`. */
38
+ sessionKind?: string;
39
+ /** Auth flow such as `local`, `oauth`, `device`, or `bootstrap`. */
40
+ authFlow?: string;
41
+ /** Auth approval outcome such as `approved`, `denied`, `required`, or `none`. */
42
+ authApproval?: string;
43
+ /** Whether a deployment authority is present. */
44
+ authorityPresent?: boolean;
45
+ /** Plan classification such as `install`, `update`, `migration`, `noop`, or `unknown`. */
46
+ planClassification?: string;
47
+ /** Contract kind such as `app`, `service`, `device`, `builtin`, or `unknown`. */
48
+ contractKind?: string;
49
+ /** Static messaging system name, when already known. */
50
+ messagingSystem?: string;
51
+ /** Static messaging operation name, when already known. */
52
+ messagingOperation?: string;
53
+ };
23
54
  /** Returns the shared Trellis OpenTelemetry meter. */
24
55
  export declare function getTrellisMeter(): Meter;
25
56
  /** Records one Trellis error with only stable, low-cardinality attributes. */
26
57
  export declare function recordTrellisError(error: unknown, attributes?: TrellisErrorMetricAttributes): void;
58
+ /**
59
+ * Records one duration measurement on the given Trellis histogram.
60
+ *
61
+ * Converts `durationMs` to seconds. Negative, NaN, and infinite values are
62
+ * silently ignored.
63
+ *
64
+ * Histogram instruments are cached by metric name so `createHistogram` is
65
+ * called at most once per metric name.
66
+ *
67
+ * @param name - The duration metric name.
68
+ * @param durationMs - The measured duration in milliseconds.
69
+ * @param attributes - Optional low-cardinality attributes. Only values that
70
+ * pass sanitization are included.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * recordTrellisDuration("trellis.connect.duration", 42.5, {
75
+ * phase: "nats_connect",
76
+ * outcome: "ok",
77
+ * participantKind: "client",
78
+ * });
79
+ * ```
80
+ */
81
+ export declare function recordTrellisDuration(name: TrellisDurationMetricName, durationMs: number, attributes?: TrellisDurationMetricAttributes): void;
27
82
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAW,MAAM,oBAAoB,CAAC;AAiDzD,yEAAyE;AACzE,MAAM,MAAM,4BAA4B,GAAG;IACzC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AASF,sDAAsD;AACtD,wBAAgB,eAAe,IAAI,KAAK,CAEvC;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,UAAU,GAAE,4BAAiC,GAC5C,IAAI,CAWN"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,KAAK,EAAW,MAAM,oBAAoB,CAAC;AAiDzE,yEAAyE;AACzE,MAAM,MAAM,4BAA4B,GAAG;IACzC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,yBAAyB,GACjC,0BAA0B,GAC1B,4BAA4B,GAC5B,2CAA2C,GAC3C,+BAA+B,GAC/B,iCAAiC,GACjC,oCAAoC,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0FAA0F;IAC1F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAWF,sDAAsD;AACtD,wBAAgB,eAAe,IAAI,KAAK,CAEvC;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,UAAU,GAAE,4BAAiC,GAC5C,IAAI,CAWN;AAsJD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,yBAAyB,EAC/B,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,+BAA+B,GAC3C,IAAI,CAaN"}