@rudderhq/server 0.7.24-canary.2 → 0.7.24-canary.21

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 (353) hide show
  1. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  2. package/dist/agent-runtimes/registry.js +3 -17
  3. package/dist/agent-runtimes/registry.js.map +1 -1
  4. package/dist/agent-runtimes/registry.test.d.ts +2 -0
  5. package/dist/agent-runtimes/registry.test.d.ts.map +1 -0
  6. package/dist/agent-runtimes/registry.test.js +25 -0
  7. package/dist/agent-runtimes/registry.test.js.map +1 -0
  8. package/dist/app.d.ts +9 -0
  9. package/dist/app.d.ts.map +1 -1
  10. package/dist/app.js +20 -0
  11. package/dist/app.js.map +1 -1
  12. package/dist/bootstrap/create-http-app.d.ts +2 -0
  13. package/dist/bootstrap/create-http-app.d.ts.map +1 -1
  14. package/dist/bootstrap/create-http-app.js +57 -2
  15. package/dist/bootstrap/create-http-app.js.map +1 -1
  16. package/dist/bootstrap/public-ingress-startup.d.ts +12 -0
  17. package/dist/bootstrap/public-ingress-startup.d.ts.map +1 -0
  18. package/dist/bootstrap/public-ingress-startup.js +54 -0
  19. package/dist/bootstrap/public-ingress-startup.js.map +1 -0
  20. package/dist/bootstrap/register-api-routes.d.ts +2 -1
  21. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  22. package/dist/bootstrap/register-api-routes.js +5 -5
  23. package/dist/bootstrap/register-api-routes.js.map +1 -1
  24. package/dist/bootstrap/types.d.ts +14 -0
  25. package/dist/bootstrap/types.d.ts.map +1 -1
  26. package/dist/config.d.ts +8 -0
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +22 -0
  29. package/dist/config.js.map +1 -1
  30. package/dist/embedded-postgres-startup-logs.d.ts +6 -0
  31. package/dist/embedded-postgres-startup-logs.d.ts.map +1 -0
  32. package/dist/embedded-postgres-startup-logs.js +48 -0
  33. package/dist/embedded-postgres-startup-logs.js.map +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +24 -30
  36. package/dist/index.js.map +1 -1
  37. package/dist/middleware/auth.d.ts.map +1 -1
  38. package/dist/middleware/auth.js +10 -2
  39. package/dist/middleware/auth.js.map +1 -1
  40. package/dist/realtime/live-events-ws.d.ts.map +1 -1
  41. package/dist/realtime/live-events-ws.js +14 -0
  42. package/dist/realtime/live-events-ws.js.map +1 -1
  43. package/dist/routes/agents.d.ts +2 -1
  44. package/dist/routes/agents.d.ts.map +1 -1
  45. package/dist/routes/agents.js +2 -10
  46. package/dist/routes/agents.js.map +1 -1
  47. package/dist/routes/agents.management-routes.d.ts.map +1 -1
  48. package/dist/routes/agents.management-routes.js +16 -60
  49. package/dist/routes/agents.management-routes.js.map +1 -1
  50. package/dist/routes/onboarding.d.ts +2 -1
  51. package/dist/routes/onboarding.d.ts.map +1 -1
  52. package/dist/routes/onboarding.js +50 -17
  53. package/dist/routes/onboarding.js.map +1 -1
  54. package/dist/routes/organization-rust-foundation-routes.d.ts +21 -0
  55. package/dist/routes/organization-rust-foundation-routes.d.ts.map +1 -0
  56. package/dist/routes/organization-rust-foundation-routes.js +410 -0
  57. package/dist/routes/organization-rust-foundation-routes.js.map +1 -0
  58. package/dist/routes/orgs.d.ts +4 -1
  59. package/dist/routes/orgs.d.ts.map +1 -1
  60. package/dist/routes/orgs.js +38 -102
  61. package/dist/routes/orgs.js.map +1 -1
  62. package/dist/routes/projects.d.ts +2 -1
  63. package/dist/routes/projects.d.ts.map +1 -1
  64. package/dist/routes/projects.js +301 -28
  65. package/dist/routes/projects.js.map +1 -1
  66. package/dist/routes/public-ingress-auth.d.ts +8 -0
  67. package/dist/routes/public-ingress-auth.d.ts.map +1 -0
  68. package/dist/routes/public-ingress-auth.js +144 -0
  69. package/dist/routes/public-ingress-auth.js.map +1 -0
  70. package/dist/services/agent-run-context.d.ts.map +1 -1
  71. package/dist/services/agent-run-context.js +0 -1
  72. package/dist/services/agent-run-context.js.map +1 -1
  73. package/dist/services/agent-runtime-availability.d.ts.map +1 -1
  74. package/dist/services/agent-runtime-availability.js +0 -3
  75. package/dist/services/agent-runtime-availability.js.map +1 -1
  76. package/dist/services/assets.d.ts.map +1 -1
  77. package/dist/services/assets.js +9 -5
  78. package/dist/services/assets.js.map +1 -1
  79. package/dist/services/budgets.d.ts.map +1 -1
  80. package/dist/services/budgets.js +21 -19
  81. package/dist/services/budgets.js.map +1 -1
  82. package/dist/services/chat-assistant.helpers.d.ts +1 -1
  83. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  84. package/dist/services/chat-assistant.runtime-overrides.d.ts.map +1 -1
  85. package/dist/services/chat-assistant.runtime-overrides.js +0 -2
  86. package/dist/services/chat-assistant.runtime-overrides.js.map +1 -1
  87. package/dist/services/chats.annotation-persistence.d.ts.map +1 -1
  88. package/dist/services/chats.annotation-persistence.js +2 -0
  89. package/dist/services/chats.annotation-persistence.js.map +1 -1
  90. package/dist/services/chats.d.ts.map +1 -1
  91. package/dist/services/chats.helpers.d.ts +2 -0
  92. package/dist/services/chats.helpers.d.ts.map +1 -1
  93. package/dist/services/chats.helpers.js +17 -1
  94. package/dist/services/chats.helpers.js.map +1 -1
  95. package/dist/services/chats.js +17 -33
  96. package/dist/services/chats.js.map +1 -1
  97. package/dist/services/chats.queued-message-create.d.ts.map +1 -1
  98. package/dist/services/chats.queued-message-create.js +2 -0
  99. package/dist/services/chats.queued-message-create.js.map +1 -1
  100. package/dist/services/chats.user-state-initialization.d.ts +5 -0
  101. package/dist/services/chats.user-state-initialization.d.ts.map +1 -0
  102. package/dist/services/chats.user-state-initialization.js +27 -0
  103. package/dist/services/chats.user-state-initialization.js.map +1 -0
  104. package/dist/services/costs.d.ts.map +1 -1
  105. package/dist/services/costs.js +2 -0
  106. package/dist/services/costs.js.map +1 -1
  107. package/dist/services/goal-public-contract.d.ts +13 -0
  108. package/dist/services/goal-public-contract.d.ts.map +1 -0
  109. package/dist/services/goal-public-contract.js +106 -0
  110. package/dist/services/goal-public-contract.js.map +1 -0
  111. package/dist/services/goal-public-contract.test.d.ts +2 -0
  112. package/dist/services/goal-public-contract.test.d.ts.map +1 -0
  113. package/dist/services/goal-public-contract.test.js +45 -0
  114. package/dist/services/goal-public-contract.test.js.map +1 -0
  115. package/dist/services/goals.d.ts +1 -2
  116. package/dist/services/goals.d.ts.map +1 -1
  117. package/dist/services/goals.js +72 -137
  118. package/dist/services/goals.js.map +1 -1
  119. package/dist/services/index.d.ts +3 -0
  120. package/dist/services/index.d.ts.map +1 -1
  121. package/dist/services/index.js +3 -0
  122. package/dist/services/index.js.map +1 -1
  123. package/dist/services/issues.comments-attachments.d.ts.map +1 -1
  124. package/dist/services/issues.comments-attachments.js +3 -0
  125. package/dist/services/issues.comments-attachments.js.map +1 -1
  126. package/dist/services/issues.d.ts.map +1 -1
  127. package/dist/services/issues.helpers.d.ts +3 -0
  128. package/dist/services/issues.helpers.d.ts.map +1 -1
  129. package/dist/services/issues.helpers.js +23 -0
  130. package/dist/services/issues.helpers.js.map +1 -1
  131. package/dist/services/issues.js +12 -24
  132. package/dist/services/issues.js.map +1 -1
  133. package/dist/services/knowledge-portability/organization-portability.core.d.ts.map +1 -1
  134. package/dist/services/knowledge-portability/organization-portability.core.js +0 -4
  135. package/dist/services/knowledge-portability/organization-portability.core.js.map +1 -1
  136. package/dist/services/knowledge-portability/organization-portability.d.ts +6 -2
  137. package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
  138. package/dist/services/knowledge-portability/organization-portability.import.d.ts +5 -1
  139. package/dist/services/knowledge-portability/organization-portability.import.d.ts.map +1 -1
  140. package/dist/services/knowledge-portability/organization-portability.import.js +92 -9
  141. package/dist/services/knowledge-portability/organization-portability.import.js.map +1 -1
  142. package/dist/services/knowledge-portability/organization-portability.js +3 -1
  143. package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
  144. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
  145. package/dist/services/knowledge-portability/organization-skills.catalog.js +0 -6
  146. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
  147. package/dist/services/live-events.d.ts +2 -0
  148. package/dist/services/live-events.d.ts.map +1 -1
  149. package/dist/services/live-events.js +7 -1
  150. package/dist/services/live-events.js.map +1 -1
  151. package/dist/services/live-run-read-bridge.d.ts +11 -0
  152. package/dist/services/live-run-read-bridge.d.ts.map +1 -0
  153. package/dist/services/live-run-read-bridge.js +16 -0
  154. package/dist/services/live-run-read-bridge.js.map +1 -0
  155. package/dist/services/live-run-read-bridge.test.d.ts +2 -0
  156. package/dist/services/live-run-read-bridge.test.d.ts.map +1 -0
  157. package/dist/services/live-run-read-bridge.test.js +99 -0
  158. package/dist/services/live-run-read-bridge.test.js.map +1 -0
  159. package/dist/services/migration-preflight.d.ts.map +1 -1
  160. package/dist/services/migration-preflight.js +1 -0
  161. package/dist/services/migration-preflight.js.map +1 -1
  162. package/dist/services/migration-preflight.test.js +24 -0
  163. package/dist/services/migration-preflight.test.js.map +1 -1
  164. package/dist/services/organization-branding-fence.d.ts +30 -0
  165. package/dist/services/organization-branding-fence.d.ts.map +1 -0
  166. package/dist/services/organization-branding-fence.js +99 -0
  167. package/dist/services/organization-branding-fence.js.map +1 -0
  168. package/dist/services/organization-branding-fence.test.d.ts +2 -0
  169. package/dist/services/organization-branding-fence.test.d.ts.map +1 -0
  170. package/dist/services/organization-branding-fence.test.js +44 -0
  171. package/dist/services/organization-branding-fence.test.js.map +1 -0
  172. package/dist/services/organization-intelligence-profile-defaults.d.ts.map +1 -1
  173. package/dist/services/organization-intelligence-profile-defaults.js +32 -16
  174. package/dist/services/organization-intelligence-profile-defaults.js.map +1 -1
  175. package/dist/services/organization-intelligence-profiles.d.ts +1 -1
  176. package/dist/services/organization-intelligence-profiles.d.ts.map +1 -1
  177. package/dist/services/organization-intelligence-profiles.js +3 -2
  178. package/dist/services/organization-intelligence-profiles.js.map +1 -1
  179. package/dist/services/organization-mutation-fence.d.ts +21 -0
  180. package/dist/services/organization-mutation-fence.d.ts.map +1 -0
  181. package/dist/services/organization-mutation-fence.js +40 -0
  182. package/dist/services/organization-mutation-fence.js.map +1 -0
  183. package/dist/services/organization-mutation-outbox.d.ts +22 -0
  184. package/dist/services/organization-mutation-outbox.d.ts.map +1 -0
  185. package/dist/services/organization-mutation-outbox.js +125 -0
  186. package/dist/services/organization-mutation-outbox.js.map +1 -0
  187. package/dist/services/organization-mutation-outbox.test.d.ts +2 -0
  188. package/dist/services/organization-mutation-outbox.test.d.ts.map +1 -0
  189. package/dist/services/organization-mutation-outbox.test.js +80 -0
  190. package/dist/services/organization-mutation-outbox.test.js.map +1 -0
  191. package/dist/services/organization-resource-mutation-fence.d.ts +29 -0
  192. package/dist/services/organization-resource-mutation-fence.d.ts.map +1 -0
  193. package/dist/services/organization-resource-mutation-fence.js +75 -0
  194. package/dist/services/organization-resource-mutation-fence.js.map +1 -0
  195. package/dist/services/organization-resource-rust-authority.d.ts +7 -0
  196. package/dist/services/organization-resource-rust-authority.d.ts.map +1 -0
  197. package/dist/services/organization-resource-rust-authority.js +38 -0
  198. package/dist/services/organization-resource-rust-authority.js.map +1 -0
  199. package/dist/services/organization-resource-rust-authority.test.d.ts +2 -0
  200. package/dist/services/organization-resource-rust-authority.test.d.ts.map +1 -0
  201. package/dist/services/organization-resource-rust-authority.test.js +48 -0
  202. package/dist/services/organization-resource-rust-authority.test.js.map +1 -0
  203. package/dist/services/orgs.d.ts.map +1 -1
  204. package/dist/services/orgs.js +20 -2
  205. package/dist/services/orgs.js.map +1 -1
  206. package/dist/services/product-analytics.d.ts +1 -1
  207. package/dist/services/project-goal-mutation-fence.d.ts +35 -0
  208. package/dist/services/project-goal-mutation-fence.d.ts.map +1 -0
  209. package/dist/services/project-goal-mutation-fence.js +277 -0
  210. package/dist/services/project-goal-mutation-fence.js.map +1 -0
  211. package/dist/services/project-goal-mutation-fence.test.d.ts +2 -0
  212. package/dist/services/project-goal-mutation-fence.test.d.ts.map +1 -0
  213. package/dist/services/project-goal-mutation-fence.test.js +278 -0
  214. package/dist/services/project-goal-mutation-fence.test.js.map +1 -0
  215. package/dist/services/projects-create.test.d.ts +2 -0
  216. package/dist/services/projects-create.test.d.ts.map +1 -0
  217. package/dist/services/projects-create.test.js +174 -0
  218. package/dist/services/projects-create.test.js.map +1 -0
  219. package/dist/services/projects.d.ts +19 -3
  220. package/dist/services/projects.d.ts.map +1 -1
  221. package/dist/services/projects.js +215 -57
  222. package/dist/services/projects.js.map +1 -1
  223. package/dist/services/resource-catalog.d.ts.map +1 -1
  224. package/dist/services/resource-catalog.js +188 -112
  225. package/dist/services/resource-catalog.js.map +1 -1
  226. package/dist/services/run-intelligence.d.ts.map +1 -1
  227. package/dist/services/run-intelligence.js +3 -1
  228. package/dist/services/run-intelligence.js.map +1 -1
  229. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  230. package/dist/services/runtime-kernel/heartbeat.core.js +0 -1
  231. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  232. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  233. package/dist/services/runtime-kernel/heartbeat.misc.d.ts.map +1 -1
  234. package/dist/services/runtime-kernel/heartbeat.misc.js +8 -4
  235. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
  236. package/dist/services/runtime-kernel/heartbeat.sessions.d.ts.map +1 -1
  237. package/dist/services/runtime-kernel/heartbeat.sessions.js +2 -0
  238. package/dist/services/runtime-kernel/heartbeat.sessions.js.map +1 -1
  239. package/dist/services/rust-foundation-bridge.d.ts +95 -0
  240. package/dist/services/rust-foundation-bridge.d.ts.map +1 -0
  241. package/dist/services/rust-foundation-bridge.js +802 -0
  242. package/dist/services/rust-foundation-bridge.js.map +1 -0
  243. package/dist/services/rust-foundation-bridge.test.d.ts +2 -0
  244. package/dist/services/rust-foundation-bridge.test.d.ts.map +1 -0
  245. package/dist/services/rust-foundation-bridge.test.js +829 -0
  246. package/dist/services/rust-foundation-bridge.test.js.map +1 -0
  247. package/dist/services/side-chats.d.ts.map +1 -1
  248. package/dist/services/side-chats.js +38 -19
  249. package/dist/services/side-chats.js.map +1 -1
  250. package/package.json +19 -16
  251. package/resources/bundled-skills/rudder-docs/references/cli-reference.md +2 -1
  252. package/resources/bundled-skills/visualize/SKILL.md +1 -1
  253. package/resources/native/aarch64-apple-darwin/migration-preflight +0 -0
  254. package/resources/native/aarch64-apple-darwin/rudder-server-foundation +0 -0
  255. package/resources/native/aarch64-pc-windows-msvc/migration-preflight.exe +0 -0
  256. package/resources/native/aarch64-pc-windows-msvc/rudder-server-foundation.exe +0 -0
  257. package/resources/native/aarch64-unknown-linux-gnu/migration-preflight +0 -0
  258. package/resources/native/aarch64-unknown-linux-gnu/rudder-server-foundation +0 -0
  259. package/resources/native/x86_64-apple-darwin/migration-preflight +0 -0
  260. package/resources/native/x86_64-apple-darwin/rudder-server-foundation +0 -0
  261. package/resources/native/x86_64-pc-windows-msvc/migration-preflight.exe +0 -0
  262. package/resources/native/x86_64-pc-windows-msvc/rudder-server-foundation.exe +0 -0
  263. package/resources/native/x86_64-unknown-linux-gnu/migration-preflight +0 -0
  264. package/resources/native/x86_64-unknown-linux-gnu/rudder-server-foundation +0 -0
  265. package/resources/postinstall-embedded-postgres.mjs +193 -0
  266. package/resources/postinstall-native-mode.mjs +36 -0
  267. package/skills/rudder-docs/references/cli-reference.md +2 -1
  268. package/skills/visualize/SKILL.md +1 -1
  269. package/ui-dist/assets/{LibraryLiveSurface-BpUD1odP.js → LibraryLiveSurface-Bs8V_pMU.js} +1 -1
  270. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BPrBDdld.js → abnfDiagram-VRR7QNED-DneqWru9.js} +1 -1
  271. package/ui-dist/assets/{addon-fit-DNQtwoFo.js → addon-fit-DCRNyXYv.js} +1 -1
  272. package/ui-dist/assets/{arc-IXEjKK3z.js → arc-D_2I_R5Z.js} +1 -1
  273. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-D5-GsWPu.js → architectureDiagram-ZJ3FMSHR-C0ANAv78.js} +1 -1
  274. package/ui-dist/assets/{blockDiagram-677ZJIJ3-BT91oUno.js → blockDiagram-677ZJIJ3-BqFGOix5.js} +1 -1
  275. package/ui-dist/assets/{c4Diagram-LMCZKHZV-DZa4R-RY.js → c4Diagram-LMCZKHZV-82LfEi1P.js} +1 -1
  276. package/ui-dist/assets/channel-DjvWm5jR.js +1 -0
  277. package/ui-dist/assets/{chunk-2Q5K7J3B-BJn1mzn0.js → chunk-2Q5K7J3B-DijvvGcl.js} +1 -1
  278. package/ui-dist/assets/{chunk-32BRIVSS-DX4CN1No.js → chunk-32BRIVSS-Z09s337w.js} +1 -1
  279. package/ui-dist/assets/{chunk-5VM5RSS4-Bvq0Cx67.js → chunk-5VM5RSS4-DgQWkO6B.js} +1 -1
  280. package/ui-dist/assets/{chunk-EX3LRPZG-C9g5iHPO.js → chunk-EX3LRPZG-UTEQqeds.js} +1 -1
  281. package/ui-dist/assets/{chunk-JWPE2WC7-DoPFngr_.js → chunk-JWPE2WC7-DAaSu1vD.js} +1 -1
  282. package/ui-dist/assets/{chunk-MOJQB5TN-CZeNor1c.js → chunk-MOJQB5TN-D_fTXJM3.js} +1 -1
  283. package/ui-dist/assets/{chunk-RYQCIY6F-DSIa1gN4.js → chunk-RYQCIY6F-C7H_axhC.js} +1 -1
  284. package/ui-dist/assets/{chunk-V7JOEXUC-B-t9NovP.js → chunk-V7JOEXUC-B2toa05O.js} +1 -1
  285. package/ui-dist/assets/{chunk-VR4S4FIN-C17_to2o.js → chunk-VR4S4FIN-CkRvPkE2.js} +1 -1
  286. package/ui-dist/assets/{chunk-XXDRQBXY-CMKjuqZI.js → chunk-XXDRQBXY-DOO_r0VK.js} +1 -1
  287. package/ui-dist/assets/classDiagram-OUVF2IWQ-CNSRItW2.js +1 -0
  288. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CNSRItW2.js +1 -0
  289. package/ui-dist/assets/{cose-bilkent-JH36ORCC--JzUailr.js → cose-bilkent-JH36ORCC-BzYjE_M-.js} +1 -1
  290. package/ui-dist/assets/{cynefin-VYW2F7L2-Is3IDXR5.js → cynefin-VYW2F7L2-Dcf0eQJ5.js} +1 -1
  291. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-D9pZPkr_.js → cynefinDiagram-TSTJHNR4-Cs_Lv8Ua.js} +1 -1
  292. package/ui-dist/assets/{dagre-VKFMJZFB-DQtVOPbA.js → dagre-VKFMJZFB-B8oZME7g.js} +1 -1
  293. package/ui-dist/assets/{diagram-FQU43EPY-nzceu0kB.js → diagram-FQU43EPY-DFHkB-_t.js} +1 -1
  294. package/ui-dist/assets/{diagram-G47NLZAW-Dw-D5CH5.js → diagram-G47NLZAW-FGxRm1A-.js} +1 -1
  295. package/ui-dist/assets/{diagram-NH7WQ7WH-CoyPw9Uo.js → diagram-NH7WQ7WH-Ot83ScOb.js} +1 -1
  296. package/ui-dist/assets/{diagram-OA4YK3LP-Cqoi9a6k.js → diagram-OA4YK3LP-CkiHNUvw.js} +1 -1
  297. package/ui-dist/assets/{diagram-WEI45ONY-D8RWrHSh.js → diagram-WEI45ONY-CxM3g_L3.js} +1 -1
  298. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-By9B5HMb.js → ebnfDiagram-CCIWWBDH-DbcqsHcY.js} +1 -1
  299. package/ui-dist/assets/{erDiagram-Q63AITRT-rwMzFibF.js → erDiagram-Q63AITRT-DLROlxDN.js} +1 -1
  300. package/ui-dist/assets/{flowDiagram-23GEKE2U-BaCpiX-T.js → flowDiagram-23GEKE2U-DphM_YLM.js} +1 -1
  301. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-DzXDtk7b.js → ganttDiagram-NO4QXBWP--QIRtWYP.js} +1 -1
  302. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-C1RILXL1.js → gitGraphDiagram-IHSO6WYX-Bg3QwNvE.js} +1 -1
  303. package/ui-dist/assets/{graph-RzQsSMN0.js → graph-B_1y14m_.js} +1 -1
  304. package/ui-dist/assets/{index-DeIqk5X9.js → index-6O1Ef9oA.js} +1 -1
  305. package/ui-dist/assets/{index-Ufqpd6-1.js → index-Aj3Mi7R6.js} +1 -1
  306. package/ui-dist/assets/{index-C9N1nzkG.js → index-B-yeMW3t.js} +1 -1
  307. package/ui-dist/assets/{index-Dp0HIAhW.js → index-BABow2kh.js} +1 -1
  308. package/ui-dist/assets/{index-DUw2q_Tn.js → index-BEgTumxB.js} +1 -1
  309. package/ui-dist/assets/{index-QzfB2Hm8.js → index-BQheb_6L.js} +1 -1
  310. package/ui-dist/assets/index-B_tEQoXz.css +32 -0
  311. package/ui-dist/assets/{index-S_I6m7qi.js → index-Bi9I1TFJ.js} +561 -560
  312. package/ui-dist/assets/{index-1CcOBUAh.js → index-BlFoD6Gg.js} +1 -1
  313. package/ui-dist/assets/{index-Bj8AKsm3.js → index-BueQLOw6.js} +1 -1
  314. package/ui-dist/assets/{index-CTY5MHTT.js → index-CMUgKK2j.js} +1 -1
  315. package/ui-dist/assets/{index-DLz28cdj.js → index-CS2TW9nf.js} +1 -1
  316. package/ui-dist/assets/{index-B7vWk3jX.js → index-CcWXJMSa.js} +1 -1
  317. package/ui-dist/assets/{index-Cm40qa2n.js → index-CdAtz86o.js} +1 -1
  318. package/ui-dist/assets/{index-DobP_OA5.js → index-E2v-0TkN.js} +1 -1
  319. package/ui-dist/assets/{index-Cd1EZEkn.js → index-XWYyP2hU.js} +1 -1
  320. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-DVIzbK0n.js → infoDiagram-FWYZ7A6U-BxygKDVp.js} +1 -1
  321. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-BoCZRszc.js → ishikawaDiagram-FXEZZL3T-47zucfG2.js} +1 -1
  322. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-DCRkA_lv.js → journeyDiagram-5HDEW3XC-D8cyI8aY.js} +1 -1
  323. package/ui-dist/assets/{kanban-definition-HUTT4EX6-sttcO1jJ.js → kanban-definition-HUTT4EX6-CrxRNese.js} +1 -1
  324. package/ui-dist/assets/{layout-u47UnAg9.js → layout-OyZo5VN3.js} +1 -1
  325. package/ui-dist/assets/{linear-Hx-0ykqm.js → linear-CuiwlwQB.js} +1 -1
  326. package/ui-dist/assets/{map-JHAuHxTf.js → map-rixHzQ5d.js} +1 -1
  327. package/ui-dist/assets/{mermaid.core-duAMtZT0.js → mermaid.core-BBG92fxH.js} +4 -4
  328. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-BqImMmHB.js → mindmap-definition-LN4V7U3C-CivqbhCV.js} +1 -1
  329. package/ui-dist/assets/{pegDiagram-2B236MQR-BBqSimCZ.js → pegDiagram-2B236MQR-JrPSWk9k.js} +1 -1
  330. package/ui-dist/assets/{pieDiagram-ENE6RG2P-IvsJkrmf.js → pieDiagram-ENE6RG2P-F4HEWR5n.js} +1 -1
  331. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-CBW_UfNv.js → quadrantDiagram-ABIIQ3AL-BJNly8dn.js} +1 -1
  332. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-Zjn4XqMZ.js → railroadDiagram-RFXS5EU6-DNORDnb2.js} +1 -1
  333. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-DPk09fAM.js → requirementDiagram-TGXJPOKE-710xtGEU.js} +1 -1
  334. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-qzaGYd61.js → sankeyDiagram-HTMAVEWB-BmWJHmHA.js} +1 -1
  335. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-B-4BDFMx.js → sequenceDiagram-DBY2YBRQ-A73TFc3V.js} +1 -1
  336. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-S3KZiokK.js → sizeCapture-X5ZJPWSS-B8otrPI2.js} +1 -1
  337. package/ui-dist/assets/{stateDiagram-2N3HPSRC-BumYuIdY.js → stateDiagram-2N3HPSRC-BZ9k729q.js} +1 -1
  338. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DepHJpk7.js +1 -0
  339. package/ui-dist/assets/{swimlanes-5IMT3BWC-T_bbOzkS.js → swimlanes-5IMT3BWC-W_CH_z9Z.js} +2 -2
  340. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BRL-ddud.js +8 -0
  341. package/ui-dist/assets/{timeline-definition-FHXFAJF6-95nLoqCi.js → timeline-definition-FHXFAJF6-CcXbC6J1.js} +1 -1
  342. package/ui-dist/assets/{vennDiagram-L72KCM5P-DROzWeg9.js → vennDiagram-L72KCM5P-BMHmsQqg.js} +1 -1
  343. package/ui-dist/assets/{wardleyDiagram-EHGQE667-f6rn8OB5.js → wardleyDiagram-EHGQE667-Bq2-CEvU.js} +1 -1
  344. package/ui-dist/assets/{xterm-DOe84fOC.js → xterm-8vrqRuWm.js} +1 -1
  345. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-JdlcTNzG.js → xychartDiagram-FW5EYKEG-De3RUAME.js} +1 -1
  346. package/ui-dist/index.html +2 -2
  347. package/ui-dist/assets/channel-GV4x9fGv.js +0 -1
  348. package/ui-dist/assets/classDiagram-OUVF2IWQ-C9tnRpuJ.js +0 -1
  349. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-C9tnRpuJ.js +0 -1
  350. package/ui-dist/assets/index-3zlQxsgk.css +0 -32
  351. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-Cmr2JA9o.js +0 -1
  352. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BnoZ05uR.js +0 -8
  353. package/ui-dist/brands/google-gemini-logo.svg +0 -1
@@ -0,0 +1,802 @@
1
+ import { resolveRudderNativeTarget } from "@rudderhq/shared";
2
+ import { spawn } from "node:child_process";
3
+ import { createHash, createHmac, randomBytes, randomUUID } from "node:crypto";
4
+ import { accessSync, existsSync, constants as fsConstants, statSync } from "node:fs";
5
+ import { basename, dirname, join, resolve } from "node:path";
6
+ import { createInterface } from "node:readline";
7
+ import { setTimeout as delay } from "node:timers/promises";
8
+ import { fileURLToPath } from "node:url";
9
+ export class RustFoundationBridgeError extends Error {
10
+ code;
11
+ constructor(code, message, options) {
12
+ super(message, options);
13
+ this.code = code;
14
+ this.name = "RustFoundationBridgeError";
15
+ }
16
+ }
17
+ const ACTOR_ENVELOPE_AUDIENCE = "rudder-server-foundation";
18
+ const ACTOR_ENVELOPE_ACTION = "organization.members.directory.read";
19
+ const ORGANIZATION_BRANDING_ACTION = "organization.branding.update";
20
+ const ORGANIZATION_RESOURCE_ACTION = "organization.resource.mutate";
21
+ const PROJECT_GOAL_SET_ACTION = "project.goal_set.replace";
22
+ const PROJECT_DELETE_ACTION = "project.delete";
23
+ const PROJECT_CREATE_ACTION = "project.create";
24
+ const PROJECT_READ_ACTION = "project.read";
25
+ const ACTOR_ENVELOPE_PROTOCOL_VERSION = 2;
26
+ const ACTOR_ENVELOPE_SCHEMA = "rudder.actor-envelope.v2";
27
+ const ACTOR_ENVELOPE_LIFETIME_SECONDS = 60;
28
+ const DEFAULT_REQUEST_TIMEOUT_MS = 3_000;
29
+ const DEFAULT_READY_TIMEOUT_MS = 5_000;
30
+ function debugBridge(message) {
31
+ if (process.env.RUDDER_RUST_BRIDGE_DEBUG === "true") {
32
+ process.stderr.write(`[rudder-rust-bridge] ${message}\n`);
33
+ }
34
+ }
35
+ function configuredMode(value, envName, defaultMode = "off") {
36
+ const mode = value?.trim() || defaultMode;
37
+ if (mode === "off" || mode === "shadow" || mode === "required")
38
+ return mode;
39
+ throw new RustFoundationBridgeError("invalid_mode", `${envName} must be off, shadow, or required; received ${mode}`);
40
+ }
41
+ function actorIdentity(actor) {
42
+ if (actor.type === "agent") {
43
+ if (!actor.agentId)
44
+ throw new RustFoundationBridgeError("request_failed", "Authenticated agent has no agent id");
45
+ return { kind: "agent", id: actor.agentId };
46
+ }
47
+ if (actor.type === "board") {
48
+ return { kind: "user", id: actor.userId ?? "local-board" };
49
+ }
50
+ throw new RustFoundationBridgeError("request_failed", "Rust bridge requires an authenticated actor");
51
+ }
52
+ function actorSession(actor) {
53
+ const explicit = actor.sessionId?.trim();
54
+ if (explicit)
55
+ return explicit;
56
+ return `${actor.source}:${actor.keyId ?? actor.userId ?? actor.agentId ?? "unknown"}`;
57
+ }
58
+ function appendLengthPrefixed(output, value) {
59
+ const bytes = Buffer.from(value, "utf8");
60
+ const length = Buffer.allocUnsafe(8);
61
+ length.writeBigUInt64BE(BigInt(bytes.byteLength));
62
+ output.push(length, bytes);
63
+ }
64
+ function canonicalSigningBytes(input) {
65
+ const output = [Buffer.from(ACTOR_ENVELOPE_SCHEMA, "utf8"), Buffer.from([0])];
66
+ const protocol = Buffer.allocUnsafe(2);
67
+ protocol.writeUInt16BE(ACTOR_ENVELOPE_PROTOCOL_VERSION);
68
+ output.push(protocol);
69
+ for (const field of [
70
+ input.actor.kind,
71
+ input.actor.id,
72
+ input.organizationId,
73
+ input.sessionId,
74
+ input.audience,
75
+ input.method,
76
+ input.path,
77
+ input.action,
78
+ input.bodySha256,
79
+ input.requestId,
80
+ input.nonce,
81
+ ]) {
82
+ appendLengthPrefixed(output, field);
83
+ }
84
+ if (input.idempotencyKey) {
85
+ appendLengthPrefixed(output, input.idempotencyKey);
86
+ }
87
+ for (const value of [input.authEpoch, input.issuedAt, input.expiresAt]) {
88
+ const encoded = Buffer.allocUnsafe(8);
89
+ encoded.writeBigUInt64BE(BigInt(value));
90
+ output.push(encoded);
91
+ }
92
+ return Buffer.concat(output);
93
+ }
94
+ export function createRustActorEnvelope(input) {
95
+ const now = input.nowSeconds ?? Math.floor(Date.now() / 1000);
96
+ const requestId = input.requestId ?? randomUUID();
97
+ const nonce = input.nonce ?? randomUUID();
98
+ const actor = actorIdentity(input.actor);
99
+ const sessionId = actorSession(input.actor);
100
+ const authEpoch = Number.isSafeInteger(input.actor.authEpoch) && (input.actor.authEpoch ?? 0) > 0
101
+ ? input.actor.authEpoch
102
+ : 1;
103
+ const unsigned = {
104
+ protocolVersion: ACTOR_ENVELOPE_PROTOCOL_VERSION,
105
+ actor,
106
+ organizationId: input.organizationId,
107
+ sessionId,
108
+ authEpoch,
109
+ audience: ACTOR_ENVELOPE_AUDIENCE,
110
+ method: input.method,
111
+ path: input.path,
112
+ action: input.action,
113
+ bodySha256: createHash("sha256").update(input.body).digest("hex"),
114
+ requestId,
115
+ nonce,
116
+ idempotencyKey: input.idempotencyKey ?? null,
117
+ issuedAt: Math.max(1, now - 1),
118
+ expiresAt: now + ACTOR_ENVELOPE_LIFETIME_SECONDS,
119
+ };
120
+ const signature = createHmac("sha256", Buffer.from(input.secret, "utf8")).update(canonicalSigningBytes(unsigned)).digest("hex");
121
+ return { ...unsigned, signature };
122
+ }
123
+ function isLoopbackBoundAddress(value) {
124
+ const [host] = value.startsWith("[")
125
+ ? [value.slice(1, value.indexOf("]"))]
126
+ : value.split(":");
127
+ return host === "127.0.0.1" || host === "localhost" || host === "::1";
128
+ }
129
+ function candidateBinaryPaths(configured) {
130
+ const explicit = configured?.trim();
131
+ if (explicit)
132
+ return [explicit];
133
+ const moduleDirectory = dirname(fileURLToPath(import.meta.url));
134
+ const repositoryRoot = resolve(moduleDirectory, "../../..");
135
+ const serverPackageRoot = resolve(moduleDirectory, "../..");
136
+ const isSourceRuntime = basename(moduleDirectory) === "services"
137
+ && basename(dirname(moduleDirectory)) === "src";
138
+ const binaryName = process.platform === "win32"
139
+ ? "rudder-server-foundation.exe"
140
+ : "rudder-server-foundation";
141
+ const candidates = [];
142
+ const target = resolveRudderNativeTarget();
143
+ if (target) {
144
+ candidates.push(join(serverPackageRoot, "resources", "native", target, binaryName));
145
+ }
146
+ // Only source modules get repository build outputs; installed modules fail closed without their packaged asset.
147
+ if (isSourceRuntime) {
148
+ candidates.push(join(repositoryRoot, "native", "target", "debug", binaryName), join(repositoryRoot, "native", "target", "release", binaryName));
149
+ }
150
+ return candidates;
151
+ }
152
+ function createFoundationChildEnvironment(input) {
153
+ return {
154
+ RUDDER_NATIVE_LISTEN: "127.0.0.1:0",
155
+ RUDDER_NATIVE_DATABASE_URL: input.databaseUrl,
156
+ RUDDER_NATIVE_DATABASE_REQUIRED: "true",
157
+ RUDDER_NATIVE_ACTOR_ENVELOPE_KEY: input.actorEnvelopeKey,
158
+ ...(input.publicIngress ? {
159
+ RUDDER_NATIVE_PUBLIC_LISTEN: input.publicIngress.listenAddr,
160
+ RUDDER_NATIVE_NODE_UPSTREAM: input.publicIngress.nodeUpstream,
161
+ RUDDER_NATIVE_INGRESS_AUTH_KEY: input.publicIngress.authorizationKey,
162
+ ...(input.publicIngress.trustedProxies ? { RUDDER_NATIVE_INGRESS_TRUSTED_PROXIES: input.publicIngress.trustedProxies } : {}),
163
+ } : {}),
164
+ };
165
+ }
166
+ function resolveBinaryPath(configured) {
167
+ const candidate = candidateBinaryPaths(configured).find((value) => {
168
+ try {
169
+ if (!existsSync(value) || !statSync(value).isFile())
170
+ return false;
171
+ accessSync(value, process.platform === "win32" ? fsConstants.F_OK : fsConstants.X_OK);
172
+ return true;
173
+ }
174
+ catch {
175
+ return false;
176
+ }
177
+ });
178
+ return candidate ?? null;
179
+ }
180
+ function childHasExited(child) {
181
+ return child.exitCode !== null || child.signalCode !== null;
182
+ }
183
+ function waitForChildExit(child, timeoutMs) {
184
+ if (childHasExited(child))
185
+ return Promise.resolve(true);
186
+ return new Promise((resolveExit) => {
187
+ let settled = false;
188
+ let timer;
189
+ const finish = (exited) => {
190
+ if (settled)
191
+ return;
192
+ settled = true;
193
+ if (timer)
194
+ clearTimeout(timer);
195
+ child.off("exit", onExit);
196
+ child.off("error", onError);
197
+ resolveExit(exited);
198
+ };
199
+ const onExit = () => finish(true);
200
+ const onError = () => finish(true);
201
+ child.once("exit", onExit);
202
+ child.once("error", onError);
203
+ if (childHasExited(child)) {
204
+ finish(true);
205
+ }
206
+ else if (timeoutMs !== undefined) {
207
+ timer = setTimeout(() => finish(false), timeoutMs);
208
+ }
209
+ });
210
+ }
211
+ async function stopChild(child, spawnFailed = false) {
212
+ if (spawnFailed || childHasExited(child))
213
+ return;
214
+ try {
215
+ child.kill("SIGTERM");
216
+ }
217
+ catch {
218
+ // The process may have exited between the state check and the signal.
219
+ }
220
+ if (await waitForChildExit(child, 2_000))
221
+ return;
222
+ try {
223
+ child.kill("SIGKILL");
224
+ }
225
+ catch {
226
+ // The process may have exited while the graceful-stop timeout elapsed.
227
+ }
228
+ await waitForChildExit(child);
229
+ }
230
+ export function createRustFoundationBridge(options) {
231
+ const mode = configuredMode(options.mode ?? process.env.RUDDER_RUST_MEMBER_DIRECTORY_MODE, "RUDDER_RUST_MEMBER_DIRECTORY_MODE", "required");
232
+ const organizationBrandingMode = configuredMode(options.organizationBrandingMode ?? process.env.RUDDER_RUST_ORGANIZATION_BRANDING_MODE, "RUDDER_RUST_ORGANIZATION_BRANDING_MODE");
233
+ const projectGoalSetMode = configuredMode(options.projectGoalSetMode ?? process.env.RUDDER_RUST_PROJECT_GOAL_SET_MODE, "RUDDER_RUST_PROJECT_GOAL_SET_MODE", "required");
234
+ const actorEnvelopeKey = options.actorEnvelopeKey?.trim()
235
+ || process.env.RUDDER_NATIVE_ACTOR_ENVELOPE_KEY?.trim()
236
+ || randomBytes(32).toString("hex");
237
+ // Project and live-run reads are API-wide Rust capabilities, independent
238
+ // of entity mutation ownership and the remaining mutation pilot switches.
239
+ const requiresStartup = true;
240
+ let child = null;
241
+ let baseUrl = null;
242
+ let publicIngressBaseUrl = null;
243
+ let lifecycleState = "idle";
244
+ let lifecycleTail = Promise.resolve();
245
+ let lastStderr = "";
246
+ const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
247
+ const start = async () => {
248
+ lifecycleState = "starting";
249
+ let spawned = null;
250
+ let spawnFailed = false;
251
+ try {
252
+ if (!options.databaseUrl.trim()) {
253
+ throw new RustFoundationBridgeError("database_unconfigured", "Rust foundation bridge requires the active database URL");
254
+ }
255
+ const binary = resolveBinaryPath(options.binaryPath ?? process.env.RUDDER_SERVER_FOUNDATION_PATH);
256
+ if (!binary) {
257
+ throw new RustFoundationBridgeError("binary_unavailable", "rudder-server-foundation binary is unavailable");
258
+ }
259
+ lastStderr = "";
260
+ const processHandle = spawn(binary, [], {
261
+ cwd: resolve(dirname(fileURLToPath(import.meta.url)), "../../.."),
262
+ env: createFoundationChildEnvironment({
263
+ databaseUrl: options.databaseUrl,
264
+ actorEnvelopeKey,
265
+ publicIngress: options.publicIngress,
266
+ }),
267
+ stdio: ["ignore", "pipe", "pipe"],
268
+ });
269
+ spawned = processHandle;
270
+ child = spawned;
271
+ debugBridge(`started pid=${spawned.pid ?? "unknown"}`);
272
+ spawned.once("error", () => {
273
+ spawnFailed = true;
274
+ });
275
+ spawned.stderr.on("data", (chunk) => {
276
+ lastStderr = `${lastStderr}${chunk.toString("utf8")}`.slice(-2_000);
277
+ });
278
+ spawned.once("exit", () => {
279
+ if (child === spawned) {
280
+ child = null;
281
+ baseUrl = null;
282
+ publicIngressBaseUrl = null;
283
+ if (lifecycleState !== "closing")
284
+ lifecycleState = "idle";
285
+ }
286
+ });
287
+ const stdout = createInterface({ input: spawned.stdout });
288
+ const startupLine = await new Promise((resolveLine, rejectLine) => {
289
+ const onLine = (line) => {
290
+ cleanup();
291
+ resolveLine(line);
292
+ };
293
+ const onError = (error) => {
294
+ cleanup();
295
+ rejectLine(error);
296
+ };
297
+ const onExit = (code, signal) => {
298
+ cleanup();
299
+ rejectLine(new Error(`Rust foundation exited before startup (${code ?? signal ?? "unknown"})`));
300
+ };
301
+ const cleanup = () => {
302
+ stdout.off("line", onLine);
303
+ spawned?.off("error", onError);
304
+ spawned?.off("exit", onExit);
305
+ stdout.close();
306
+ };
307
+ stdout.once("line", onLine);
308
+ processHandle.once("error", onError);
309
+ processHandle.once("exit", onExit);
310
+ }).catch((error) => {
311
+ throw new RustFoundationBridgeError("startup_failed", `Rust foundation startup failed${lastStderr ? `: ${lastStderr.trim()}` : ""}`, { cause: error });
312
+ });
313
+ let receipt;
314
+ try {
315
+ const parsed = JSON.parse(startupLine);
316
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
317
+ throw new Error("startup receipt must be a JSON object");
318
+ }
319
+ receipt = parsed;
320
+ }
321
+ catch (error) {
322
+ throw new RustFoundationBridgeError("startup_failed", "Rust foundation emitted an invalid startup receipt", { cause: error });
323
+ }
324
+ const boundAddr = typeof receipt.boundAddr === "string" ? receipt.boundAddr : null;
325
+ if (!boundAddr || !isLoopbackBoundAddress(boundAddr) || receipt.publicListener === true || receipt.productWriteAuthority === true) {
326
+ throw new RustFoundationBridgeError("startup_failed", "Rust foundation startup receipt violated the private bridge contract");
327
+ }
328
+ baseUrl = `http://${boundAddr}`;
329
+ if (options.publicIngress) {
330
+ const publicAddr = receipt.publicIngress?.boundAddr;
331
+ const expected = options.publicIngress.listenAddr;
332
+ const expectedPort = expected.slice(expected.lastIndexOf(":") + 1);
333
+ const expectedHost = expected.slice(0, expected.lastIndexOf(":") + 1);
334
+ if (typeof publicAddr !== "string"
335
+ || receipt.publicIngress?.publicListener !== true
336
+ || !publicAddr.startsWith(expectedHost)
337
+ || (expectedPort !== "0" && publicAddr !== expected)
338
+ || !/^\d+$/.test(publicAddr.slice(publicAddr.lastIndexOf(":") + 1))
339
+ || Number(publicAddr.slice(publicAddr.lastIndexOf(":") + 1)) < 1
340
+ || Number(publicAddr.slice(publicAddr.lastIndexOf(":") + 1)) > 65535
341
+ || publicAddr === boundAddr) {
342
+ throw new RustFoundationBridgeError("startup_failed", "Rust public ingress binding did not match the requested listener");
343
+ }
344
+ publicIngressBaseUrl = `http://${publicAddr}`;
345
+ }
346
+ else if (receipt.publicIngress !== undefined) {
347
+ throw new RustFoundationBridgeError("startup_failed", "Unexpected Rust public ingress listener");
348
+ }
349
+ const deadline = Date.now() + DEFAULT_READY_TIMEOUT_MS;
350
+ while (Date.now() < deadline) {
351
+ try {
352
+ const response = await fetch(`${baseUrl}/readyz`, {
353
+ signal: AbortSignal.timeout(Math.min(requestTimeoutMs, 1_000)),
354
+ });
355
+ if (response.status === 200) {
356
+ lifecycleState = "ready";
357
+ return;
358
+ }
359
+ }
360
+ catch {
361
+ // The process may need a short interval between binding and readiness.
362
+ }
363
+ await delay(50);
364
+ }
365
+ throw new RustFoundationBridgeError("not_ready", "Rust foundation did not become ready", {
366
+ cause: new Error(lastStderr || "ready probe failed"),
367
+ });
368
+ }
369
+ catch (error) {
370
+ const startupError = error instanceof RustFoundationBridgeError
371
+ ? error
372
+ : new RustFoundationBridgeError("startup_failed", "Rust foundation startup failed", { cause: error });
373
+ baseUrl = null;
374
+ publicIngressBaseUrl = null;
375
+ if (spawned)
376
+ await stopChild(spawned, spawnFailed);
377
+ if (child === spawned)
378
+ child = null;
379
+ lifecycleState = "idle";
380
+ throw startupError;
381
+ }
382
+ };
383
+ const enqueueLifecycle = (operation) => {
384
+ const run = lifecycleTail.then(operation, operation);
385
+ lifecycleTail = run.then(() => undefined, () => undefined);
386
+ return run;
387
+ };
388
+ const ensureStarted = () => enqueueLifecycle(async () => {
389
+ if (lifecycleState === "ready" && child && baseUrl && !childHasExited(child))
390
+ return;
391
+ await start();
392
+ });
393
+ const close = () => enqueueLifecycle(async () => {
394
+ lifecycleState = "closing";
395
+ const current = child;
396
+ baseUrl = null;
397
+ publicIngressBaseUrl = null;
398
+ debugBridge(`close requested pid=${current?.pid ?? "none"}`);
399
+ try {
400
+ if (current)
401
+ await stopChild(current);
402
+ }
403
+ finally {
404
+ if (child === current)
405
+ child = null;
406
+ baseUrl = null;
407
+ lifecycleState = "idle";
408
+ debugBridge(`close completed pid=${current?.pid ?? "none"} exitCode=${current?.exitCode ?? "none"} signal=${current?.signalCode ?? "none"}`);
409
+ }
410
+ });
411
+ return {
412
+ mode,
413
+ organizationBrandingMode,
414
+ projectGoalSetMode,
415
+ requiresStartup,
416
+ get publicIngressBaseUrl() { return publicIngressBaseUrl; },
417
+ async waitForPublicIngressReady() {
418
+ if (!options.publicIngress || !publicIngressBaseUrl || !child || childHasExited(child)) {
419
+ throw new RustFoundationBridgeError("not_ready", "Rust public ingress is not running");
420
+ }
421
+ // Called after the private Node listener binds: public readiness includes
422
+ // that upstream, whereas start() checks only the private Rust listener.
423
+ const probeUrl = publicIngressBaseUrl.replace("http://0.0.0.0:", "http://127.0.0.1:")
424
+ .replace("http://[::]:", "http://[::1]:");
425
+ const deadline = Date.now() + DEFAULT_READY_TIMEOUT_MS;
426
+ while (Date.now() < deadline && child && !childHasExited(child)) {
427
+ try {
428
+ const response = await fetch(`${probeUrl}/readyz`, {
429
+ signal: AbortSignal.timeout(Math.min(requestTimeoutMs, 1_000)),
430
+ });
431
+ if (response.status === 200)
432
+ return;
433
+ }
434
+ catch { /* Remain fail-closed while the upstream starts. */ }
435
+ await delay(50);
436
+ }
437
+ throw new RustFoundationBridgeError("not_ready", "Rust public ingress did not become ready");
438
+ },
439
+ start: ensureStarted,
440
+ async projectRead(actor, orgId, input) {
441
+ await ensureStarted();
442
+ if (!baseUrl)
443
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
444
+ const requestPath = `/internal/orgs/${encodeURIComponent(orgId)}/project-reads`;
445
+ const body = Buffer.from(JSON.stringify(input), "utf8");
446
+ const requestId = randomUUID();
447
+ const envelope = createRustActorEnvelope({
448
+ actor,
449
+ organizationId: orgId,
450
+ method: "POST",
451
+ path: requestPath,
452
+ action: PROJECT_READ_ACTION,
453
+ body,
454
+ secret: actorEnvelopeKey,
455
+ requestId,
456
+ });
457
+ try {
458
+ const response = await fetch(`${baseUrl}${requestPath}`, {
459
+ method: "POST",
460
+ headers: {
461
+ "content-type": "application/json",
462
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
463
+ "x-rudder-request-id": requestId,
464
+ },
465
+ body: body,
466
+ signal: AbortSignal.timeout(requestTimeoutMs),
467
+ });
468
+ return {
469
+ status: response.status,
470
+ contentType: response.headers.get("content-type") ?? "application/json",
471
+ body: Buffer.from(await response.arrayBuffer()),
472
+ };
473
+ }
474
+ catch (error) {
475
+ throw new RustFoundationBridgeError("request_failed", "Rust Project read request failed", { cause: error });
476
+ }
477
+ },
478
+ async liveRunRead(actor, orgId, input) {
479
+ await ensureStarted();
480
+ if (!baseUrl)
481
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
482
+ const requestPath = `/internal/orgs/${encodeURIComponent(orgId)}/live-run-reads`;
483
+ const body = Buffer.from(JSON.stringify(input));
484
+ const requestId = randomUUID();
485
+ const envelope = createRustActorEnvelope({
486
+ actor,
487
+ organizationId: orgId,
488
+ method: "POST",
489
+ path: requestPath,
490
+ action: "live_run.read",
491
+ body,
492
+ secret: actorEnvelopeKey,
493
+ requestId,
494
+ });
495
+ try {
496
+ const response = await fetch(`${baseUrl}${requestPath}`, {
497
+ method: "POST",
498
+ headers: {
499
+ "content-type": "application/json",
500
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
501
+ "x-rudder-request-id": requestId,
502
+ },
503
+ body: body,
504
+ signal: AbortSignal.timeout(requestTimeoutMs),
505
+ });
506
+ return {
507
+ status: response.status,
508
+ contentType: response.headers.get("content-type") ?? "application/json",
509
+ body: Buffer.from(await response.arrayBuffer()),
510
+ };
511
+ }
512
+ catch (error) {
513
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation request failed", { cause: error });
514
+ }
515
+ },
516
+ async projectCreate(actor, orgId, data, idempotencyKey, activityDetails, roots) {
517
+ if (projectGoalSetMode !== "required") {
518
+ throw new RustFoundationBridgeError("request_failed", "Rust Project creation requires required mode");
519
+ }
520
+ const normalizedIdempotencyKey = idempotencyKey.trim();
521
+ if (!normalizedIdempotencyKey) {
522
+ throw new RustFoundationBridgeError("request_failed", "Rust Project creation requires an idempotency key");
523
+ }
524
+ await ensureStarted();
525
+ if (!baseUrl)
526
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
527
+ const requestPath = `/api/orgs/${encodeURIComponent(orgId)}/projects`;
528
+ const body = Buffer.from(JSON.stringify({
529
+ runId: actor.runId ?? null,
530
+ data,
531
+ activityDetails,
532
+ organizationWorkspaceRoot: roots.organizationWorkspaceRoot,
533
+ projectCreateStateRoot: roots.projectCreateStateRoot,
534
+ }));
535
+ const requestId = randomUUID();
536
+ const envelope = createRustActorEnvelope({
537
+ actor,
538
+ organizationId: orgId,
539
+ method: "POST",
540
+ path: requestPath,
541
+ action: PROJECT_CREATE_ACTION,
542
+ body,
543
+ secret: actorEnvelopeKey,
544
+ requestId,
545
+ idempotencyKey: normalizedIdempotencyKey,
546
+ });
547
+ let response;
548
+ try {
549
+ response = await fetch(`${baseUrl}${requestPath}`, {
550
+ method: "POST",
551
+ headers: {
552
+ "content-type": "application/json",
553
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
554
+ "x-rudder-request-id": requestId,
555
+ "x-rudder-idempotency-key": normalizedIdempotencyKey,
556
+ },
557
+ body: body,
558
+ signal: AbortSignal.timeout(requestTimeoutMs),
559
+ });
560
+ }
561
+ catch (error) {
562
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation request failed", { cause: error });
563
+ }
564
+ return {
565
+ status: response.status,
566
+ contentType: response.headers.get("content-type") ?? "application/json",
567
+ body: Buffer.from(await response.arrayBuffer()),
568
+ };
569
+ },
570
+ async memberDirectory(req, orgId) {
571
+ if (mode === "off") {
572
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation member directory bridge is disabled");
573
+ }
574
+ await ensureStarted();
575
+ if (!baseUrl)
576
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
577
+ const body = Buffer.alloc(0);
578
+ const requestId = randomUUID();
579
+ const envelope = createRustActorEnvelope({
580
+ actor: req.actor,
581
+ organizationId: orgId,
582
+ method: "GET",
583
+ path: req.originalUrl,
584
+ action: ACTOR_ENVELOPE_ACTION,
585
+ body,
586
+ secret: actorEnvelopeKey,
587
+ requestId,
588
+ });
589
+ let response;
590
+ try {
591
+ response = await fetch(`${baseUrl}${req.originalUrl}`, {
592
+ method: "GET",
593
+ headers: {
594
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
595
+ "x-rudder-request-id": requestId,
596
+ },
597
+ signal: AbortSignal.timeout(requestTimeoutMs),
598
+ });
599
+ }
600
+ catch (error) {
601
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation request failed", { cause: error });
602
+ }
603
+ return {
604
+ status: response.status,
605
+ contentType: response.headers.get("content-type") ?? "application/json",
606
+ body: Buffer.from(await response.arrayBuffer()),
607
+ };
608
+ },
609
+ async organizationBranding(req, orgId, body, requestPath = req.originalUrl) {
610
+ if (organizationBrandingMode === "off") {
611
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation organization branding bridge is disabled");
612
+ }
613
+ await ensureStarted();
614
+ if (!baseUrl)
615
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
616
+ const requestId = randomUUID();
617
+ const idempotencyKey = req.header("x-rudder-idempotency-key")?.trim();
618
+ if (!idempotencyKey) {
619
+ throw new RustFoundationBridgeError("request_failed", "Rust organization branding requires x-rudder-idempotency-key");
620
+ }
621
+ const envelope = createRustActorEnvelope({
622
+ actor: req.actor,
623
+ organizationId: orgId,
624
+ method: "PATCH",
625
+ path: requestPath,
626
+ action: ORGANIZATION_BRANDING_ACTION,
627
+ body,
628
+ secret: actorEnvelopeKey,
629
+ requestId,
630
+ idempotencyKey,
631
+ });
632
+ let response;
633
+ try {
634
+ response = await fetch(`${baseUrl}${requestPath}`, {
635
+ method: "PATCH",
636
+ headers: {
637
+ "content-type": req.header("content-type") ?? "application/json",
638
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
639
+ "x-rudder-request-id": requestId,
640
+ "x-rudder-idempotency-key": idempotencyKey,
641
+ },
642
+ body: body,
643
+ signal: AbortSignal.timeout(requestTimeoutMs),
644
+ });
645
+ }
646
+ catch (error) {
647
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation request failed", { cause: error });
648
+ }
649
+ const responseBody = Buffer.from(await response.arrayBuffer());
650
+ debugBridge(`organization-branding response status=${response.status} body=${responseBody.toString("utf8").slice(0, 512)}`);
651
+ return {
652
+ status: response.status,
653
+ contentType: response.headers.get("content-type") ?? "application/json",
654
+ body: responseBody,
655
+ };
656
+ },
657
+ async projectGoalSet(req, orgId, projectId, body, requestPath = `/api/orgs/${encodeURIComponent(orgId)}/projects/${encodeURIComponent(projectId)}/goal-set`) {
658
+ if (projectGoalSetMode !== "required") {
659
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation Project-Goal writes require required mode");
660
+ }
661
+ await ensureStarted();
662
+ if (!baseUrl)
663
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
664
+ const requestId = randomUUID();
665
+ const idempotencyKey = req.header("x-rudder-idempotency-key")?.trim();
666
+ if (!idempotencyKey) {
667
+ throw new RustFoundationBridgeError("request_failed", "Rust Project-Goal replacement requires x-rudder-idempotency-key");
668
+ }
669
+ const envelope = createRustActorEnvelope({
670
+ actor: req.actor,
671
+ organizationId: orgId,
672
+ method: "PATCH",
673
+ path: requestPath,
674
+ action: PROJECT_GOAL_SET_ACTION,
675
+ body,
676
+ secret: actorEnvelopeKey,
677
+ requestId,
678
+ idempotencyKey,
679
+ });
680
+ let response;
681
+ try {
682
+ response = await fetch(`${baseUrl}${requestPath}`, {
683
+ method: "PATCH",
684
+ headers: {
685
+ "content-type": req.header("content-type") ?? "application/json",
686
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
687
+ "x-rudder-request-id": requestId,
688
+ "x-rudder-idempotency-key": idempotencyKey,
689
+ },
690
+ body: body,
691
+ signal: AbortSignal.timeout(requestTimeoutMs),
692
+ });
693
+ }
694
+ catch (error) {
695
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation request failed", { cause: error });
696
+ }
697
+ const responseBody = Buffer.from(await response.arrayBuffer());
698
+ debugBridge(`project-goal response status=${response.status} body=${responseBody.toString("utf8").slice(0, 512)}`);
699
+ return {
700
+ status: response.status,
701
+ contentType: response.headers.get("content-type") ?? "application/json",
702
+ body: responseBody,
703
+ };
704
+ },
705
+ async organizationResourceMutation(req, orgId, resourceId, operation, body, idempotencyKey) {
706
+ if (projectGoalSetMode !== "required") {
707
+ throw new RustFoundationBridgeError("request_failed", "Rust organization resource writes require required mode");
708
+ }
709
+ await ensureStarted();
710
+ if (!baseUrl)
711
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
712
+ const normalizedKey = idempotencyKey.trim();
713
+ if (!normalizedKey)
714
+ throw new RustFoundationBridgeError("request_failed", "Rust resource mutation requires an idempotency key");
715
+ const requestPath = `/api/orgs/${encodeURIComponent(orgId)}/resources/${encodeURIComponent(resourceId)}`;
716
+ const method = operation === "update" ? "PATCH" : "DELETE";
717
+ const requestId = randomUUID();
718
+ const envelope = createRustActorEnvelope({
719
+ actor: req.actor,
720
+ organizationId: orgId,
721
+ method,
722
+ path: requestPath,
723
+ action: ORGANIZATION_RESOURCE_ACTION,
724
+ body,
725
+ secret: actorEnvelopeKey,
726
+ requestId,
727
+ idempotencyKey: normalizedKey,
728
+ });
729
+ try {
730
+ const response = await fetch(`${baseUrl}${requestPath}`, {
731
+ method,
732
+ headers: {
733
+ "content-type": "application/json",
734
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
735
+ "x-rudder-request-id": requestId,
736
+ "x-rudder-idempotency-key": normalizedKey,
737
+ },
738
+ body: body,
739
+ signal: AbortSignal.timeout(requestTimeoutMs),
740
+ });
741
+ return {
742
+ status: response.status,
743
+ contentType: response.headers.get("content-type") ?? "application/json",
744
+ body: Buffer.from(await response.arrayBuffer()),
745
+ };
746
+ }
747
+ catch (error) {
748
+ throw new RustFoundationBridgeError("request_failed", "Rust organization resource request failed", { cause: error });
749
+ }
750
+ },
751
+ async projectDelete(req, orgId, projectId, body, idempotencyKey, requestPath = `/api/orgs/${encodeURIComponent(orgId)}/projects/${encodeURIComponent(projectId)}`) {
752
+ if (projectGoalSetMode !== "required") {
753
+ throw new RustFoundationBridgeError("request_failed", "Rust Project deletion requires required mode");
754
+ }
755
+ await ensureStarted();
756
+ if (!baseUrl)
757
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation bridge is not running");
758
+ const requestId = randomUUID();
759
+ const normalizedIdempotencyKey = idempotencyKey.trim();
760
+ if (!normalizedIdempotencyKey) {
761
+ throw new RustFoundationBridgeError("request_failed", "Rust Project deletion requires an idempotency key");
762
+ }
763
+ const envelope = createRustActorEnvelope({
764
+ actor: req.actor,
765
+ organizationId: orgId,
766
+ method: "DELETE",
767
+ path: requestPath,
768
+ action: PROJECT_DELETE_ACTION,
769
+ body,
770
+ secret: actorEnvelopeKey,
771
+ requestId,
772
+ idempotencyKey: normalizedIdempotencyKey,
773
+ });
774
+ let response;
775
+ try {
776
+ response = await fetch(`${baseUrl}${requestPath}`, {
777
+ method: "DELETE",
778
+ headers: {
779
+ "content-type": req.header("content-type") ?? "application/json",
780
+ "x-rudder-actor-envelope": JSON.stringify(envelope),
781
+ "x-rudder-request-id": requestId,
782
+ "x-rudder-idempotency-key": normalizedIdempotencyKey,
783
+ },
784
+ body: body,
785
+ signal: AbortSignal.timeout(requestTimeoutMs),
786
+ });
787
+ }
788
+ catch (error) {
789
+ throw new RustFoundationBridgeError("request_failed", "Rust foundation request failed", { cause: error });
790
+ }
791
+ const responseBody = Buffer.from(await response.arrayBuffer());
792
+ debugBridge(`project-delete response status=${response.status} body=${responseBody.toString("utf8").slice(0, 512)}`);
793
+ return {
794
+ status: response.status,
795
+ contentType: response.headers.get("content-type") ?? "application/json",
796
+ body: responseBody,
797
+ };
798
+ },
799
+ close,
800
+ };
801
+ }
802
+ //# sourceMappingURL=rust-foundation-bridge.js.map