@rudderhq/server 0.5.0 → 0.5.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 (352) hide show
  1. package/dist/agent-runtimes/http/execute.d.ts.map +1 -1
  2. package/dist/agent-runtimes/http/execute.js +56 -1
  3. package/dist/agent-runtimes/http/execute.js.map +1 -1
  4. package/dist/agent-runtimes/http/index.d.ts.map +1 -1
  5. package/dist/agent-runtimes/http/index.js +10 -0
  6. package/dist/agent-runtimes/http/index.js.map +1 -1
  7. package/dist/agent-runtimes/process/execute.d.ts.map +1 -1
  8. package/dist/agent-runtimes/process/execute.js +9 -1
  9. package/dist/agent-runtimes/process/execute.js.map +1 -1
  10. package/dist/agent-runtimes/process/index.d.ts.map +1 -1
  11. package/dist/agent-runtimes/process/index.js +7 -0
  12. package/dist/agent-runtimes/process/index.js.map +1 -1
  13. package/dist/agent-runtimes/registry.d.ts.map +1 -1
  14. package/dist/agent-runtimes/registry.js +21 -1
  15. package/dist/agent-runtimes/registry.js.map +1 -1
  16. package/dist/agent-runtimes/utils.d.ts +1 -0
  17. package/dist/agent-runtimes/utils.d.ts.map +1 -1
  18. package/dist/agent-runtimes/utils.js.map +1 -1
  19. package/dist/bundled-plugins/plugin-linear/dist/worker.js +183 -10
  20. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
  21. package/dist/home-paths.d.ts +7 -0
  22. package/dist/home-paths.d.ts.map +1 -1
  23. package/dist/home-paths.js +46 -2
  24. package/dist/home-paths.js.map +1 -1
  25. package/dist/index.js +23 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/routes/access.d.ts.map +1 -1
  28. package/dist/routes/access.helpers.d.ts +1 -1
  29. package/dist/routes/access.helpers.d.ts.map +1 -1
  30. package/dist/routes/access.helpers.js +0 -3
  31. package/dist/routes/access.helpers.js.map +1 -1
  32. package/dist/routes/access.js +0 -4
  33. package/dist/routes/access.js.map +1 -1
  34. package/dist/routes/agents.js +2 -2
  35. package/dist/routes/agents.js.map +1 -1
  36. package/dist/routes/chats.d.ts.map +1 -1
  37. package/dist/routes/chats.generated-attachments.d.ts +16 -0
  38. package/dist/routes/chats.generated-attachments.d.ts.map +1 -0
  39. package/dist/routes/chats.generated-attachments.js +157 -0
  40. package/dist/routes/chats.generated-attachments.js.map +1 -0
  41. package/dist/routes/chats.helpers.d.ts +27 -0
  42. package/dist/routes/chats.helpers.d.ts.map +1 -0
  43. package/dist/routes/chats.helpers.js +52 -0
  44. package/dist/routes/chats.helpers.js.map +1 -0
  45. package/dist/routes/chats.js +126 -188
  46. package/dist/routes/chats.js.map +1 -1
  47. package/dist/routes/chats.stream-routes.d.ts.map +1 -1
  48. package/dist/routes/chats.stream-routes.js +185 -16
  49. package/dist/routes/chats.stream-routes.js.map +1 -1
  50. package/dist/routes/llms.js +3 -3
  51. package/dist/routes/llms.js.map +1 -1
  52. package/dist/routes/messenger.d.ts.map +1 -1
  53. package/dist/routes/messenger.js +48 -6
  54. package/dist/routes/messenger.js.map +1 -1
  55. package/dist/services/activity.d.ts.map +1 -1
  56. package/dist/services/activity.js +7 -2
  57. package/dist/services/activity.js.map +1 -1
  58. package/dist/services/agents.d.ts +65 -65
  59. package/dist/services/agents.d.ts.map +1 -1
  60. package/dist/services/agents.js +5 -4
  61. package/dist/services/agents.js.map +1 -1
  62. package/dist/services/approvals.d.ts +1 -1
  63. package/dist/services/assets.d.ts +2 -2
  64. package/dist/services/automation-chat-output.d.ts +1 -1
  65. package/dist/services/automation-chat-output.d.ts.map +1 -1
  66. package/dist/services/automation-chat-output.js +38 -23
  67. package/dist/services/automation-chat-output.js.map +1 -1
  68. package/dist/services/automations.d.ts.map +1 -1
  69. package/dist/services/automations.js +39 -41
  70. package/dist/services/automations.js.map +1 -1
  71. package/dist/services/budgets.d.ts +1 -1
  72. package/dist/services/chat-assistant.d.ts +23 -1
  73. package/dist/services/chat-assistant.d.ts.map +1 -1
  74. package/dist/services/chat-assistant.helpers.d.ts +21 -0
  75. package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
  76. package/dist/services/chat-assistant.helpers.js +29 -10
  77. package/dist/services/chat-assistant.helpers.js.map +1 -1
  78. package/dist/services/chat-assistant.inline-visuals.d.ts +23 -0
  79. package/dist/services/chat-assistant.inline-visuals.d.ts.map +1 -0
  80. package/dist/services/chat-assistant.inline-visuals.js +129 -0
  81. package/dist/services/chat-assistant.inline-visuals.js.map +1 -0
  82. package/dist/services/chat-assistant.inline-visuals.test.js +85 -1
  83. package/dist/services/chat-assistant.inline-visuals.test.js.map +1 -1
  84. package/dist/services/chat-assistant.js +262 -38
  85. package/dist/services/chat-assistant.js.map +1 -1
  86. package/dist/services/chat-family-groups.d.ts +14 -0
  87. package/dist/services/chat-family-groups.d.ts.map +1 -0
  88. package/dist/services/chat-family-groups.js +96 -0
  89. package/dist/services/chat-family-groups.js.map +1 -0
  90. package/dist/services/chat-generation-protocol.d.ts +17 -31
  91. package/dist/services/chat-generation-protocol.d.ts.map +1 -1
  92. package/dist/services/chat-generation-protocol.helpers.d.ts +36 -0
  93. package/dist/services/chat-generation-protocol.helpers.d.ts.map +1 -0
  94. package/dist/services/chat-generation-protocol.helpers.js +53 -0
  95. package/dist/services/chat-generation-protocol.helpers.js.map +1 -0
  96. package/dist/services/chat-generation-protocol.js +86 -55
  97. package/dist/services/chat-generation-protocol.js.map +1 -1
  98. package/dist/services/chat-generation-protocol.test.js +31 -3
  99. package/dist/services/chat-generation-protocol.test.js.map +1 -1
  100. package/dist/services/chat-steer-messages.d.ts +117 -0
  101. package/dist/services/chat-steer-messages.d.ts.map +1 -0
  102. package/dist/services/chat-steer-messages.js +410 -0
  103. package/dist/services/chat-steer-messages.js.map +1 -0
  104. package/dist/services/chat-title-generation.d.ts +1 -0
  105. package/dist/services/chat-title-generation.d.ts.map +1 -1
  106. package/dist/services/chat-title-generation.js +12 -9
  107. package/dist/services/chat-title-generation.js.map +1 -1
  108. package/dist/services/chat-work-manifest.d.ts.map +1 -1
  109. package/dist/services/chat-work-manifest.js +39 -2
  110. package/dist/services/chat-work-manifest.js.map +1 -1
  111. package/dist/services/chats.constants.d.ts +5 -0
  112. package/dist/services/chats.constants.d.ts.map +1 -0
  113. package/dist/services/chats.constants.js +13 -0
  114. package/dist/services/chats.constants.js.map +1 -0
  115. package/dist/services/chats.create.d.ts +75 -0
  116. package/dist/services/chats.create.d.ts.map +1 -0
  117. package/dist/services/chats.create.js +159 -0
  118. package/dist/services/chats.create.js.map +1 -0
  119. package/dist/services/chats.d.ts +85 -76
  120. package/dist/services/chats.d.ts.map +1 -1
  121. package/dist/services/chats.fork-helpers.d.ts +8 -0
  122. package/dist/services/chats.fork-helpers.d.ts.map +1 -0
  123. package/dist/services/chats.fork-helpers.js +45 -0
  124. package/dist/services/chats.fork-helpers.js.map +1 -0
  125. package/dist/services/chats.inline-visual-persistence.d.ts +30 -0
  126. package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -0
  127. package/dist/services/chats.inline-visual-persistence.js +209 -0
  128. package/dist/services/chats.inline-visual-persistence.js.map +1 -0
  129. package/dist/services/chats.js +288 -273
  130. package/dist/services/chats.js.map +1 -1
  131. package/dist/services/chats.types.d.ts +31 -0
  132. package/dist/services/chats.types.d.ts.map +1 -0
  133. package/dist/services/chats.types.js +2 -0
  134. package/dist/services/chats.types.js.map +1 -0
  135. package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts.map +1 -1
  136. package/dist/services/integrations/feishu/inbound-dispatcher-db.js +81 -53
  137. package/dist/services/integrations/feishu/inbound-dispatcher-db.js.map +1 -1
  138. package/dist/services/integrations/feishu/inbound-dispatcher.d.ts +1 -0
  139. package/dist/services/integrations/feishu/inbound-dispatcher.d.ts.map +1 -1
  140. package/dist/services/integrations/feishu/inbound-dispatcher.js.map +1 -1
  141. package/dist/services/issues.comments-attachments.d.ts.map +1 -1
  142. package/dist/services/issues.comments-attachments.js +11 -2
  143. package/dist/services/issues.comments-attachments.js.map +1 -1
  144. package/dist/services/issues.d.ts.map +1 -1
  145. package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
  146. package/dist/services/knowledge-portability/organization-skills.catalog.js +7 -1
  147. package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
  148. package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
  149. package/dist/services/knowledge-portability/organization-skills.js +13 -1
  150. package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
  151. package/dist/services/messenger-run-origin.d.ts +18 -0
  152. package/dist/services/messenger-run-origin.d.ts.map +1 -0
  153. package/dist/services/messenger-run-origin.js +248 -0
  154. package/dist/services/messenger-run-origin.js.map +1 -0
  155. package/dist/services/messenger-run-summary.d.ts +4 -0
  156. package/dist/services/messenger-run-summary.d.ts.map +1 -0
  157. package/dist/services/messenger-run-summary.js +6 -0
  158. package/dist/services/messenger-run-summary.js.map +1 -0
  159. package/dist/services/messenger-saved-views.d.ts +133 -0
  160. package/dist/services/messenger-saved-views.d.ts.map +1 -0
  161. package/dist/services/messenger-saved-views.js +275 -0
  162. package/dist/services/messenger-saved-views.js.map +1 -0
  163. package/dist/services/messenger.d.ts +17 -3
  164. package/dist/services/messenger.d.ts.map +1 -1
  165. package/dist/services/messenger.js +276 -56
  166. package/dist/services/messenger.js.map +1 -1
  167. package/dist/services/operator-event-visibility.d.ts +3 -0
  168. package/dist/services/operator-event-visibility.d.ts.map +1 -0
  169. package/dist/services/operator-event-visibility.js +5 -0
  170. package/dist/services/operator-event-visibility.js.map +1 -0
  171. package/dist/services/orgs.d.ts +5 -5
  172. package/dist/services/plugin-registry.d.ts +4 -4
  173. package/dist/services/projects.d.ts +2 -2
  174. package/dist/services/run-intelligence.d.ts.map +1 -1
  175. package/dist/services/run-intelligence.js +7 -3
  176. package/dist/services/run-intelligence.js.map +1 -1
  177. package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
  178. package/dist/services/runtime-kernel/heartbeat.core.js +9 -8
  179. package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
  180. package/dist/services/runtime-kernel/heartbeat.d.ts +2 -2
  181. package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
  182. package/dist/services/runtime-kernel/heartbeat.js +3 -2
  183. package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
  184. package/dist/services/runtime-kernel/heartbeat.misc.js +1 -1
  185. package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
  186. package/dist/services/runtime-kernel/heartbeat.recovery.js +1 -1
  187. package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
  188. package/dist/services/side-chats.d.ts +1 -46
  189. package/dist/services/side-chats.d.ts.map +1 -1
  190. package/dist/services/side-chats.js +58 -65
  191. package/dist/services/side-chats.js.map +1 -1
  192. package/dist/services/title-generation.d.ts +3 -0
  193. package/dist/services/title-generation.d.ts.map +1 -1
  194. package/dist/services/title-generation.js +178 -6
  195. package/dist/services/title-generation.js.map +1 -1
  196. package/dist/services/workspace-backups.d.ts +19 -8
  197. package/dist/services/workspace-backups.d.ts.map +1 -1
  198. package/dist/services/workspace-backups.js +335 -127
  199. package/dist/services/workspace-backups.js.map +1 -1
  200. package/package.json +14 -13
  201. package/resources/bundled-skills/browser/references/tool-contract.md +2 -2
  202. package/resources/bundled-skills/rudder-docs/SKILL.md +20 -4
  203. package/resources/bundled-skills/rudder-docs/evals/retrieval-authority-evals.json +262 -0
  204. package/resources/bundled-skills/rudder-docs/evals/trigger-evals.json +11 -11
  205. package/resources/bundled-skills/rudder-docs/references/agent-creation.md +153 -0
  206. package/resources/bundled-skills/rudder-docs/references/api-reference.md +9 -2
  207. package/resources/bundled-skills/rudder-docs/references/cli-reference.md +12 -12
  208. package/{skills/rudder-docs/references/control-plane-practices.md → resources/bundled-skills/rudder-docs/references/operating-practices.md} +4 -4
  209. package/resources/bundled-skills/rudder-docs/references/organization-skills.md +3 -3
  210. package/resources/bundled-skills/rudder-docs/references/plugin-authoring.md +116 -0
  211. package/resources/bundled-skills/rudder-docs/references/source-map.md +26 -2
  212. package/resources/bundled-skills/visualize/SKILL.md +29 -27
  213. package/resources/bundled-skills/visualize/references/runtime-contract.md +18 -8
  214. package/skills/browser/references/tool-contract.md +2 -2
  215. package/skills/rudder-docs/SKILL.md +20 -4
  216. package/skills/rudder-docs/evals/retrieval-authority-evals.json +262 -0
  217. package/skills/rudder-docs/evals/trigger-evals.json +11 -11
  218. package/skills/rudder-docs/references/agent-creation.md +153 -0
  219. package/skills/rudder-docs/references/api-reference.md +9 -2
  220. package/skills/rudder-docs/references/cli-reference.md +12 -12
  221. package/{resources/bundled-skills/rudder-docs/references/control-plane-practices.md → skills/rudder-docs/references/operating-practices.md} +4 -4
  222. package/skills/rudder-docs/references/organization-skills.md +3 -3
  223. package/skills/rudder-docs/references/plugin-authoring.md +116 -0
  224. package/skills/rudder-docs/references/source-map.md +26 -2
  225. package/skills/visualize/SKILL.md +29 -27
  226. package/skills/visualize/references/runtime-contract.md +18 -8
  227. package/ui-dist/assets/{abnfDiagram-VRR7QNED-Dpnx79fp.js → abnfDiagram-VRR7QNED-CAAPm9Nj.js} +1 -1
  228. package/ui-dist/assets/{arc-Cpvh_rCf.js → arc-DOFoNr3M.js} +1 -1
  229. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-sDD_mBAI.js → architectureDiagram-ZJ3FMSHR-DRg6yhG8.js} +1 -1
  230. package/ui-dist/assets/{blockDiagram-677ZJIJ3-4O4wWti1.js → blockDiagram-677ZJIJ3-e3ShzsXT.js} +1 -1
  231. package/ui-dist/assets/{c4Diagram-LMCZKHZV-BkGODE4P.js → c4Diagram-LMCZKHZV-Csd_18O2.js} +1 -1
  232. package/ui-dist/assets/channel-BFLsBJOK.js +1 -0
  233. package/ui-dist/assets/{chunk-2Q5K7J3B-DsDQQpID.js → chunk-2Q5K7J3B-eF77FV1C.js} +1 -1
  234. package/ui-dist/assets/{chunk-32BRIVSS-Bzx_VnIw.js → chunk-32BRIVSS-CpMx72B5.js} +1 -1
  235. package/ui-dist/assets/{chunk-5VM5RSS4-D4LoPCni.js → chunk-5VM5RSS4-Be6WylCu.js} +1 -1
  236. package/ui-dist/assets/{chunk-EX3LRPZG-BO0R-mS4.js → chunk-EX3LRPZG-D-A_TfL-.js} +1 -1
  237. package/ui-dist/assets/{chunk-JWPE2WC7-B4Nr8KRL.js → chunk-JWPE2WC7-CdBLDqvo.js} +1 -1
  238. package/ui-dist/assets/{chunk-MOJQB5TN--uaDDrYM.js → chunk-MOJQB5TN-DkLjRENV.js} +1 -1
  239. package/ui-dist/assets/{chunk-RYQCIY6F-CyBY2w_j.js → chunk-RYQCIY6F-57VqTsE9.js} +1 -1
  240. package/ui-dist/assets/{chunk-V7JOEXUC-BMid_x8S.js → chunk-V7JOEXUC-DI_m8pt6.js} +1 -1
  241. package/ui-dist/assets/{chunk-VR4S4FIN-DVqdPKuG.js → chunk-VR4S4FIN-CM_944j4.js} +1 -1
  242. package/ui-dist/assets/{chunk-XXDRQBXY-vy03lLSS.js → chunk-XXDRQBXY--WTAlt82.js} +1 -1
  243. package/ui-dist/assets/classDiagram-OUVF2IWQ-Dah6C4Dl.js +1 -0
  244. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-Dah6C4Dl.js +1 -0
  245. package/ui-dist/assets/{cose-bilkent-JH36ORCC-jQDZmrG3.js → cose-bilkent-JH36ORCC-CR0qu31s.js} +1 -1
  246. package/ui-dist/assets/{cynefin-VYW2F7L2-BxBj6aea.js → cynefin-VYW2F7L2-f41lF5RD.js} +1 -1
  247. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BuUubF5I.js → cynefinDiagram-TSTJHNR4-88wJ2LA8.js} +1 -1
  248. package/ui-dist/assets/{dagre-VKFMJZFB-B8HipJ3a.js → dagre-VKFMJZFB-B1yJCIRh.js} +1 -1
  249. package/ui-dist/assets/{diagram-FQU43EPY-r7gkbKSt.js → diagram-FQU43EPY-C0iYYFUe.js} +1 -1
  250. package/ui-dist/assets/{diagram-G47NLZAW-CxClRsxD.js → diagram-G47NLZAW-Cp6S0siK.js} +1 -1
  251. package/ui-dist/assets/{diagram-NH7WQ7WH-C8HYTLlq.js → diagram-NH7WQ7WH-CmZb5OSk.js} +1 -1
  252. package/ui-dist/assets/{diagram-OA4YK3LP-CjwqqLKz.js → diagram-OA4YK3LP-9rFYGY7H.js} +1 -1
  253. package/ui-dist/assets/{diagram-WEI45ONY-2IWfCqZb.js → diagram-WEI45ONY-Og8vyDQh.js} +1 -1
  254. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-DVGZkgjy.js → ebnfDiagram-CCIWWBDH--5sMape2.js} +1 -1
  255. package/ui-dist/assets/{erDiagram-Q63AITRT-C_-u3Gmw.js → erDiagram-Q63AITRT-DG10Bza-.js} +1 -1
  256. package/ui-dist/assets/{flowDiagram-23GEKE2U-BvGg0NCq.js → flowDiagram-23GEKE2U-BW-aZfEk.js} +1 -1
  257. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-U3CZUUUR.js → ganttDiagram-NO4QXBWP-DcA7on8t.js} +1 -1
  258. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-CIWuEBIo.js → gitGraphDiagram-IHSO6WYX-ygGufg32.js} +1 -1
  259. package/ui-dist/assets/{graph-D3P5q-7m.js → graph-BXl6uBoM.js} +1 -1
  260. package/ui-dist/assets/{index-DOPIV8vd.js → index-9bXlV2sq.js} +1 -1
  261. package/ui-dist/assets/{index-CjztBLJi.js → index-B58ems-F.js} +1 -1
  262. package/ui-dist/assets/{index-mnl55Stn.js → index-BM-SJNCx.js} +1 -1
  263. package/ui-dist/assets/index-BcdA9dZc.css +1 -0
  264. package/ui-dist/assets/{index-BAgtKYR1.js → index-BmTNDbzy.js} +1 -1
  265. package/ui-dist/assets/{index-DidCCw78.js → index-CCDynlok.js} +1 -1
  266. package/ui-dist/assets/{index-CbHqnWUe.js → index-CRLl2Ck7.js} +1 -1
  267. package/ui-dist/assets/{index-D7ycf1qU.js → index-CqmU1PxY.js} +1 -1
  268. package/ui-dist/assets/{index-B1rLBtZ1.js → index-CssgLJwf.js} +605 -493
  269. package/ui-dist/assets/{index-DRxLJD40.js → index-DOVMMhyj.js} +1 -1
  270. package/ui-dist/assets/{index-Ds_qma4-.js → index-DTlR8bJV.js} +1 -1
  271. package/ui-dist/assets/{index-DCFf9dps.js → index-Dl6nXXNc.js} +1 -1
  272. package/ui-dist/assets/{index-DAYlwxsg.js → index-DoiNhQrY.js} +1 -1
  273. package/ui-dist/assets/{index-CBOr9F6w.js → index-Dug5GX1J.js} +1 -1
  274. package/ui-dist/assets/{index-HkQRx1D6.js → index-DxXOCTVe.js} +1 -1
  275. package/ui-dist/assets/{index-BAMXpiI5.js → index-GdN-7KLt.js} +1 -1
  276. package/ui-dist/assets/{index-ikpL--zj.js → index-ZA8lPH2n.js} +1 -1
  277. package/ui-dist/assets/{index-Cu1iMhjl.js → index-fkDP349f.js} +1 -1
  278. package/ui-dist/assets/{index-DYMtCDKT.js → index-uKIvv9n9.js} +1 -1
  279. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Cx8Fa-I4.js → infoDiagram-FWYZ7A6U-27INMkBm.js} +1 -1
  280. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-Cmuz1QUN.js → ishikawaDiagram-FXEZZL3T-Bp6XQ1_r.js} +1 -1
  281. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-CJgkiVXG.js → journeyDiagram-5HDEW3XC-9vaIwdZ3.js} +1 -1
  282. package/ui-dist/assets/{kanban-definition-HUTT4EX6-RAWpefOB.js → kanban-definition-HUTT4EX6-DjsMaR6l.js} +1 -1
  283. package/ui-dist/assets/{layout-DyWQv0Rr.js → layout-C0oWcIiC.js} +1 -1
  284. package/ui-dist/assets/{linear-D5pdgIf9.js → linear-DNbmenmQ.js} +1 -1
  285. package/ui-dist/assets/{map-bVSzNLl2.js → map-B1s9kpcR.js} +1 -1
  286. package/ui-dist/assets/{mermaid.core-CeaXGD6B.js → mermaid.core-DsYT9DxL.js} +4 -4
  287. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-B8B8AX5C.js → mindmap-definition-LN4V7U3C-vVHeRI83.js} +1 -1
  288. package/ui-dist/assets/{pegDiagram-2B236MQR-C4Sv-ua6.js → pegDiagram-2B236MQR-ohrgWLo_.js} +1 -1
  289. package/ui-dist/assets/{pieDiagram-ENE6RG2P-CLARlOHx.js → pieDiagram-ENE6RG2P-B0EqPrjn.js} +1 -1
  290. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-DPCXQmeT.js → quadrantDiagram-ABIIQ3AL-D44iYm0o.js} +1 -1
  291. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-BpqRuKUQ.js → railroadDiagram-RFXS5EU6-BQU5bpbU.js} +1 -1
  292. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-Dd-h62HZ.js → requirementDiagram-TGXJPOKE-DGJciRxB.js} +1 -1
  293. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DylT_pqq.js → sankeyDiagram-HTMAVEWB-NMXZW_Qb.js} +1 -1
  294. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-RiCF1REj.js → sequenceDiagram-DBY2YBRQ-8uWY67Bb.js} +1 -1
  295. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-DXW4JQz2.js → sizeCapture-X5ZJPWSS-BnUUR-On.js} +1 -1
  296. package/ui-dist/assets/{stateDiagram-2N3HPSRC-6U3ESIGT.js → stateDiagram-2N3HPSRC-B37bcKMy.js} +1 -1
  297. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-p6H0vL7N.js +1 -0
  298. package/ui-dist/assets/{swimlanes-5IMT3BWC-CeNHVNCi.js → swimlanes-5IMT3BWC-Bi2ZzUMi.js} +2 -2
  299. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BX6FiLF9.js +8 -0
  300. package/ui-dist/assets/{timeline-definition-FHXFAJF6-Vlwoe_1b.js → timeline-definition-FHXFAJF6-CkWauU5D.js} +1 -1
  301. package/ui-dist/assets/{vennDiagram-L72KCM5P-DBP7D3HE.js → vennDiagram-L72KCM5P-BrmBXmnk.js} +1 -1
  302. package/ui-dist/assets/{wardleyDiagram-EHGQE667-DG-wzqpy.js → wardleyDiagram-EHGQE667-kO5cojc6.js} +1 -1
  303. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BAq3mbha.js → xychartDiagram-FW5EYKEG-CUBDaCDm.js} +1 -1
  304. package/ui-dist/index.html +5 -4
  305. package/resources/bundled-skills/rudder-create-agent/SKILL.md +0 -185
  306. package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +0 -179
  307. package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +0 -132
  308. package/resources/bundled-skills/rudder-create-plugin/SKILL.md +0 -103
  309. package/resources/bundled-skills/skill-optimizer/CHANGELOG.md +0 -29
  310. package/resources/bundled-skills/skill-optimizer/SKILL.md +0 -205
  311. package/resources/bundled-skills/skill-optimizer/references/adapters/creative-brand-content.md +0 -30
  312. package/resources/bundled-skills/skill-optimizer/references/adapters/customer-support-sales.md +0 -30
  313. package/resources/bundled-skills/skill-optimizer/references/adapters/document-data-processing.md +0 -31
  314. package/resources/bundled-skills/skill-optimizer/references/adapters/education-training.md +0 -31
  315. package/resources/bundled-skills/skill-optimizer/references/adapters/finance-accounting.md +0 -31
  316. package/resources/bundled-skills/skill-optimizer/references/adapters/healthcare-operations.md +0 -30
  317. package/resources/bundled-skills/skill-optimizer/references/adapters/hr-people-ops.md +0 -31
  318. package/resources/bundled-skills/skill-optimizer/references/adapters/legal-compliance.md +0 -31
  319. package/resources/bundled-skills/skill-optimizer/references/adapters/operations-supply-chain.md +0 -31
  320. package/resources/bundled-skills/skill-optimizer/references/adapters/personal-productivity.md +0 -29
  321. package/resources/bundled-skills/skill-optimizer/references/adapters/research-knowledge.md +0 -31
  322. package/resources/bundled-skills/skill-optimizer/references/adapters/software-ai.md +0 -31
  323. package/resources/bundled-skills/skill-optimizer/references/domain-adapter-patterns.md +0 -66
  324. package/resources/bundled-skills/skill-optimizer/references/eval-method.md +0 -17
  325. package/resources/bundled-skills/skill-optimizer/references/universal-optimization-lens.md +0 -73
  326. package/skills/rudder-create-agent/SKILL.md +0 -185
  327. package/skills/rudder-create-agent/references/api-reference.md +0 -179
  328. package/skills/rudder-create-agent/references/cli-reference.md +0 -132
  329. package/skills/rudder-create-plugin/SKILL.md +0 -103
  330. package/skills/skill-optimizer/CHANGELOG.md +0 -29
  331. package/skills/skill-optimizer/SKILL.md +0 -205
  332. package/skills/skill-optimizer/references/adapters/creative-brand-content.md +0 -30
  333. package/skills/skill-optimizer/references/adapters/customer-support-sales.md +0 -30
  334. package/skills/skill-optimizer/references/adapters/document-data-processing.md +0 -31
  335. package/skills/skill-optimizer/references/adapters/education-training.md +0 -31
  336. package/skills/skill-optimizer/references/adapters/finance-accounting.md +0 -31
  337. package/skills/skill-optimizer/references/adapters/healthcare-operations.md +0 -30
  338. package/skills/skill-optimizer/references/adapters/hr-people-ops.md +0 -31
  339. package/skills/skill-optimizer/references/adapters/legal-compliance.md +0 -31
  340. package/skills/skill-optimizer/references/adapters/operations-supply-chain.md +0 -31
  341. package/skills/skill-optimizer/references/adapters/personal-productivity.md +0 -29
  342. package/skills/skill-optimizer/references/adapters/research-knowledge.md +0 -31
  343. package/skills/skill-optimizer/references/adapters/software-ai.md +0 -31
  344. package/skills/skill-optimizer/references/domain-adapter-patterns.md +0 -66
  345. package/skills/skill-optimizer/references/eval-method.md +0 -17
  346. package/skills/skill-optimizer/references/universal-optimization-lens.md +0 -73
  347. package/ui-dist/assets/channel-CM4Myg_6.js +0 -1
  348. package/ui-dist/assets/classDiagram-OUVF2IWQ-CtlIEzTt.js +0 -1
  349. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CtlIEzTt.js +0 -1
  350. package/ui-dist/assets/index-DekHKOsL.css +0 -1
  351. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KQTrcZvp.js +0 -1
  352. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-CcxS1c6r.js +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-backups.d.ts","sourceRoot":"","sources":["../../src/services/workspace-backups.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-backups.d.ts","sourceRoot":"","sources":["../../src/services/workspace-backups.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ const SKIPPED_ENTRY_NAMES = new Set([
23
23
  ".nvm",
24
24
  ".pnpm-store",
25
25
  ".rudder",
26
+ ".tmp",
26
27
  ".turbo",
27
28
  ".vite",
28
29
  "Library",
@@ -65,6 +66,32 @@ function addDays(date, days) {
65
66
  function sha256Buffer(buffer) {
66
67
  return crypto.createHash("sha256").update(buffer).digest("hex");
67
68
  }
69
+ async function sha256File(filePath) {
70
+ const handle = await fs.open(filePath, "r");
71
+ const hash = crypto.createHash("sha256");
72
+ const buffer = Buffer.allocUnsafe(1024 * 1024);
73
+ let position = 0;
74
+ try {
75
+ while (true) {
76
+ const { bytesRead } = await handle.read(buffer, 0, buffer.byteLength, position);
77
+ if (bytesRead === 0)
78
+ break;
79
+ hash.update(buffer.subarray(0, bytesRead));
80
+ position += bytesRead;
81
+ }
82
+ }
83
+ finally {
84
+ await handle.close();
85
+ }
86
+ return hash.digest("hex");
87
+ }
88
+ function compareCanonicalPaths(left, right) {
89
+ if (left.path < right.path)
90
+ return -1;
91
+ if (left.path > right.path)
92
+ return 1;
93
+ return 0;
94
+ }
68
95
  function writeUInt16(value) {
69
96
  const buffer = Buffer.allocUnsafe(2);
70
97
  buffer.writeUInt16LE(value, 0);
@@ -85,7 +112,7 @@ function buildWorkspaceBackupZip(artifact, rootFolderName) {
85
112
  const localParts = [];
86
113
  const centralParts = [];
87
114
  let offset = 0;
88
- const sortedEntries = [...artifact.entries].sort((left, right) => left.path.localeCompare(right.path));
115
+ const sortedEntries = [...artifact.entries].sort(compareCanonicalPaths);
89
116
  const normalizedRoot = sanitizeZipPathSegment(rootFolderName);
90
117
  const createdAt = new Date(artifact.createdAt);
91
118
  const zipEntries = [
@@ -175,6 +202,16 @@ function addWarning(warnings, warning) {
175
202
  warnings.push("Additional backup warnings omitted.");
176
203
  }
177
204
  }
205
+ function isSkippedEntryName(name) {
206
+ if (SKIPPED_ENTRY_NAMES.has(name))
207
+ return true;
208
+ return name.endsWith("~")
209
+ || name.endsWith(".swp")
210
+ || name.endsWith(".swo")
211
+ || name.endsWith(".partial")
212
+ || name.endsWith(".crdownload")
213
+ || /\.tmp(?:[-.]|$)/.test(name);
214
+ }
178
215
  function toPortableRelativePath(relativePath) {
179
216
  return relativePath.split(path.sep).join("/");
180
217
  }
@@ -235,7 +272,8 @@ function mapBackupRow(row) {
235
272
  }
236
273
  function buildTreeHash(entries) {
237
274
  const hash = crypto.createHash("sha256");
238
- for (const entry of [...entries].sort((left, right) => left.path.localeCompare(right.path))) {
275
+ for (const entry of [...entries].sort(compareCanonicalPaths)) {
276
+ // Scheduled identity is content-based: timestamps and permission bits do not create new versions.
239
277
  hash.update(entry.path);
240
278
  hash.update("\0");
241
279
  hash.update(entry.kind);
@@ -427,6 +465,20 @@ async function fileExists(filePath) {
427
465
  throw error;
428
466
  }
429
467
  }
468
+ async function backupArtifactLooksUsable(row) {
469
+ try {
470
+ const stat = await fs.stat(row.artifactRef);
471
+ if (!stat.isFile() || (row.compressedSize > 0 && stat.size !== row.compressedSize))
472
+ return false;
473
+ return !row.archiveSha256 || await sha256File(row.artifactRef) === row.archiveSha256;
474
+ }
475
+ catch (error) {
476
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
477
+ return false;
478
+ }
479
+ throw error;
480
+ }
481
+ }
430
482
  async function pathExists(targetPath) {
431
483
  try {
432
484
  return await fs.lstat(targetPath);
@@ -438,10 +490,10 @@ async function pathExists(targetPath) {
438
490
  throw error;
439
491
  }
440
492
  }
441
- async function walkWorkspace(rootPath, currentPath, warnings, entries = [], state = { byteSize: 0 }) {
493
+ async function walkWorkspace(rootPath, currentPath, warnings, entries = [], state = { byteSize: 0 }, options = { includeFileData: true }) {
442
494
  const dirents = await fs.readdir(currentPath, { withFileTypes: true });
443
495
  for (const dirent of dirents) {
444
- if (SKIPPED_ENTRY_NAMES.has(dirent.name)) {
496
+ if (isSkippedEntryName(dirent.name)) {
445
497
  const skippedPath = toPortableRelativePath(path.relative(rootPath, path.join(currentPath, dirent.name)));
446
498
  addWarning(warnings, `Skipped ${skippedPath}`);
447
499
  continue;
@@ -462,7 +514,7 @@ async function walkWorkspace(rootPath, currentPath, warnings, entries = [], stat
462
514
  mode: stat.mode,
463
515
  sha256: null,
464
516
  });
465
- await walkWorkspace(rootPath, absolutePath, warnings, entries, state);
517
+ await walkWorkspace(rootPath, absolutePath, warnings, entries, state, options);
466
518
  continue;
467
519
  }
468
520
  if (stat.isFile()) {
@@ -483,7 +535,7 @@ async function walkWorkspace(rootPath, currentPath, warnings, entries = [], stat
483
535
  mtimeMs: stat.mtimeMs,
484
536
  mode: stat.mode,
485
537
  sha256: sha256Buffer(data),
486
- dataBase64: data.toString("base64"),
538
+ ...(options.includeFileData ? { dataBase64: data.toString("base64") } : {}),
487
539
  });
488
540
  continue;
489
541
  }
@@ -491,6 +543,30 @@ async function walkWorkspace(rootPath, currentPath, warnings, entries = [], stat
491
543
  }
492
544
  return entries;
493
545
  }
546
+ async function countBackupEligibleWorkspaceFiles(currentPath, stopAfter, state = { byteSize: 0, fileCount: 0 }) {
547
+ const dirents = await fs.readdir(currentPath, { withFileTypes: true });
548
+ for (const dirent of dirents) {
549
+ if (state.fileCount > stopAfter)
550
+ break;
551
+ if (isSkippedEntryName(dirent.name))
552
+ continue;
553
+ const absolutePath = path.join(currentPath, dirent.name);
554
+ const stat = await fs.lstat(absolutePath);
555
+ if (stat.isSymbolicLink())
556
+ continue;
557
+ if (stat.isDirectory()) {
558
+ await countBackupEligibleWorkspaceFiles(absolutePath, stopAfter, state);
559
+ continue;
560
+ }
561
+ if (!stat.isFile() || stat.size > MAX_BACKUP_FILE_BYTES)
562
+ continue;
563
+ if (state.byteSize + stat.size > MAX_BACKUP_TOTAL_BYTES)
564
+ continue;
565
+ state.byteSize += stat.size;
566
+ state.fileCount += 1;
567
+ }
568
+ return state.fileCount;
569
+ }
494
570
  function buildManifest(input) {
495
571
  return {
496
572
  version: input.artifact.version,
@@ -506,6 +582,29 @@ function buildManifest(input) {
506
582
  warnings: input.artifact.warnings,
507
583
  };
508
584
  }
585
+ function lastScheduledCheckAt(row) {
586
+ const value = row.manifest?.lastScheduledCheck;
587
+ if (!value || typeof value !== "object" || Array.isArray(value))
588
+ return null;
589
+ const checkedAt = value.checkedAt;
590
+ if (typeof checkedAt !== "string")
591
+ return null;
592
+ const parsed = new Date(checkedAt);
593
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
594
+ }
595
+ function manifestWithUnchangedCheck(row, checkedAt, treeSha256) {
596
+ const manifest = row.manifest && typeof row.manifest === "object" && !Array.isArray(row.manifest)
597
+ ? row.manifest
598
+ : {};
599
+ return {
600
+ ...manifest,
601
+ lastScheduledCheck: {
602
+ checkedAt: checkedAt.toISOString(),
603
+ result: "unchanged",
604
+ treeSha256,
605
+ },
606
+ };
607
+ }
509
608
  async function restoreMissingArtifactFiles(input) {
510
609
  let restoredFileCount = 0;
511
610
  const skippedConflictingFiles = [];
@@ -613,9 +712,7 @@ export function workspaceBackupService(db) {
613
712
  }
614
713
  async function recoverSparseWorkspaceFromLatestBackup(orgId) {
615
714
  const layout = await ensureOrganizationWorkspaceLayout(orgId);
616
- const warnings = [];
617
- const currentEntries = await walkWorkspace(layout.root, layout.root, warnings);
618
- const currentFileCount = currentEntries.filter((entry) => entry.kind === "file").length;
715
+ const currentFileCount = await countBackupEligibleWorkspaceFiles(layout.root, SPARSE_WORKSPACE_RECOVERY_MAX_CURRENT_FILES);
619
716
  if (currentFileCount > SPARSE_WORKSPACE_RECOVERY_MAX_CURRENT_FILES) {
620
717
  return {
621
718
  orgId,
@@ -682,8 +779,121 @@ export function workspaceBackupService(db) {
682
779
  error: lastError,
683
780
  };
684
781
  }
782
+ async function claimBackup(input) {
783
+ const organization = await orgs.getById(input.orgId);
784
+ if (!organization)
785
+ throw notFound("Organization not found");
786
+ const startedAt = new Date();
787
+ const expiresAt = addDays(startedAt, input.retentionDays ?? WORKSPACE_BACKUP_DEFAULT_RETENTION_DAYS);
788
+ const backupId = crypto.randomUUID();
789
+ const triggerSource = input.triggerSource ?? "manual";
790
+ const organizationStorageKey = resolveOrganizationStorageKey(input.orgId);
791
+ const backupDir = path.resolve(resolveDefaultBackupDir(), "workspaces", organizationStorageKey);
792
+ const artifactRef = path.resolve(backupDir, `workspace-${organizationStorageKey}-${timestamp(startedAt)}-${backupId.slice(0, 8)}.json`);
793
+ const [runningRow] = await db
794
+ .insert(workspaceBackups)
795
+ .values({
796
+ id: backupId,
797
+ orgId: input.orgId,
798
+ status: "running",
799
+ triggerSource,
800
+ artifactProvider: "local_file",
801
+ artifactRef,
802
+ startedAt,
803
+ expiresAt,
804
+ createdByUserId: input.createdByUserId ?? null,
805
+ restoredFromBackupId: input.restoredFromBackupId ?? null,
806
+ })
807
+ .returning();
808
+ if (!runningRow)
809
+ throw new Error("Workspace backup row was not created.");
810
+ return runningRow;
811
+ }
812
+ async function finalizeClaimedBackup(runningRow) {
813
+ const backupId = runningRow.id;
814
+ const artifactRef = runningRow.artifactRef;
815
+ const tempArtifactRef = `${artifactRef}.tmp`;
816
+ try {
817
+ await fs.mkdir(path.dirname(artifactRef), { recursive: true });
818
+ const layout = await ensureOrganizationWorkspaceLayout(runningRow.orgId);
819
+ const warnings = [];
820
+ const entries = await walkWorkspace(layout.root, layout.root, warnings);
821
+ const fileCount = entries.filter((entry) => entry.kind === "file").length;
822
+ const byteSize = entries.reduce((total, entry) => total + (entry.kind === "file" ? entry.byteSize : 0), 0);
823
+ const treeSha256 = buildTreeHash(entries);
824
+ const activeRunCount = await countActiveRuns(runningRow.orgId);
825
+ const artifact = {
826
+ version: ARTIFACT_VERSION,
827
+ orgId: runningRow.orgId,
828
+ instanceId: resolveRudderInstanceId(),
829
+ createdAt: runningRow.startedAt?.toISOString() ?? runningRow.createdAt.toISOString(),
830
+ rootPath: layout.root,
831
+ entries: entries.sort(compareCanonicalPaths),
832
+ warnings,
833
+ };
834
+ const manifest = buildManifest({ artifact, fileCount, byteSize, treeSha256, activeRunCount });
835
+ const serialized = JSON.stringify(artifact, null, 2);
836
+ const archiveSha256 = sha256Buffer(serialized);
837
+ await fs.writeFile(tempArtifactRef, serialized, { encoding: "utf8", mode: 0o600 });
838
+ await fs.rename(tempArtifactRef, artifactRef);
839
+ const stat = await fs.stat(artifactRef);
840
+ const finishedAt = new Date();
841
+ const [row] = await db
842
+ .update(workspaceBackups)
843
+ .set({
844
+ status: "succeeded",
845
+ archiveSha256,
846
+ treeSha256,
847
+ fileCount,
848
+ byteSize,
849
+ compressedSize: stat.size,
850
+ manifest,
851
+ warnings,
852
+ finishedAt,
853
+ updatedAt: finishedAt,
854
+ })
855
+ .where(and(eq(workspaceBackups.id, backupId), eq(workspaceBackups.status, "running")))
856
+ .returning();
857
+ if (row)
858
+ return mapBackupRow(row);
859
+ const [currentRow] = await db
860
+ .select()
861
+ .from(workspaceBackups)
862
+ .where(eq(workspaceBackups.id, backupId))
863
+ .limit(1);
864
+ if (currentRow)
865
+ return mapBackupRow(currentRow);
866
+ throw new Error("Workspace backup row was not updated.");
867
+ }
868
+ catch (error) {
869
+ await fs.rm(tempArtifactRef, { force: true }).catch(() => undefined);
870
+ const finishedAt = new Date();
871
+ const [row] = await db
872
+ .update(workspaceBackups)
873
+ .set({
874
+ status: "failed",
875
+ error: error instanceof Error ? error.message : String(error),
876
+ finishedAt,
877
+ updatedAt: finishedAt,
878
+ })
879
+ .where(and(eq(workspaceBackups.id, backupId), eq(workspaceBackups.status, "running")))
880
+ .returning();
881
+ if (row)
882
+ return mapBackupRow(row);
883
+ const [currentRow] = await db
884
+ .select()
885
+ .from(workspaceBackups)
886
+ .where(eq(workspaceBackups.id, backupId))
887
+ .limit(1);
888
+ if (currentRow)
889
+ return mapBackupRow(currentRow);
890
+ return mapBackupRow(runningRow);
891
+ }
892
+ }
685
893
  const service = {
686
894
  recoverSparseWorkspaceFromLatestBackup,
895
+ claimBackup,
896
+ finalizeClaimedBackup,
687
897
  async list(orgId) {
688
898
  const organization = await orgs.getById(orgId);
689
899
  if (!organization)
@@ -696,95 +906,8 @@ export function workspaceBackupService(db) {
696
906
  return rows.map(mapBackupRow);
697
907
  },
698
908
  async create(input) {
699
- const organization = await orgs.getById(input.orgId);
700
- if (!organization)
701
- throw notFound("Organization not found");
702
- const startedAt = new Date();
703
- const expiresAt = addDays(startedAt, input.retentionDays ?? WORKSPACE_BACKUP_DEFAULT_RETENTION_DAYS);
704
- const backupId = crypto.randomUUID();
705
- const triggerSource = input.triggerSource ?? "manual";
706
- const organizationStorageKey = resolveOrganizationStorageKey(input.orgId);
707
- const backupDir = path.resolve(resolveDefaultBackupDir(), "workspaces", organizationStorageKey);
708
- const artifactRef = path.resolve(backupDir, `workspace-${organizationStorageKey}-${timestamp(startedAt)}-${backupId.slice(0, 8)}.json`);
709
- await fs.mkdir(backupDir, { recursive: true });
710
- const [runningRow] = await db
711
- .insert(workspaceBackups)
712
- .values({
713
- id: backupId,
714
- orgId: input.orgId,
715
- status: "running",
716
- triggerSource,
717
- artifactProvider: "local_file",
718
- artifactRef,
719
- startedAt,
720
- expiresAt,
721
- createdByUserId: input.createdByUserId ?? null,
722
- restoredFromBackupId: input.restoredFromBackupId ?? null,
723
- })
724
- .returning();
725
- try {
726
- const layout = await ensureOrganizationWorkspaceLayout(input.orgId);
727
- const warnings = [];
728
- const entries = await walkWorkspace(layout.root, layout.root, warnings);
729
- const fileCount = entries.filter((entry) => entry.kind === "file").length;
730
- const byteSize = entries.reduce((total, entry) => total + (entry.kind === "file" ? entry.byteSize : 0), 0);
731
- const treeSha256 = buildTreeHash(entries);
732
- const activeRunCount = await countActiveRuns(input.orgId);
733
- const artifact = {
734
- version: ARTIFACT_VERSION,
735
- orgId: input.orgId,
736
- instanceId: resolveRudderInstanceId(),
737
- createdAt: startedAt.toISOString(),
738
- rootPath: layout.root,
739
- entries: entries.sort((left, right) => left.path.localeCompare(right.path)),
740
- warnings,
741
- };
742
- const manifest = buildManifest({ artifact, fileCount, byteSize, treeSha256, activeRunCount });
743
- const serialized = JSON.stringify(artifact, null, 2);
744
- const archiveSha256 = sha256Buffer(serialized);
745
- const tempArtifactRef = `${artifactRef}.tmp`;
746
- await fs.writeFile(tempArtifactRef, serialized, { encoding: "utf8", mode: 0o600 });
747
- await fs.rename(tempArtifactRef, artifactRef);
748
- const stat = await fs.stat(artifactRef);
749
- const finishedAt = new Date();
750
- const [row] = await db
751
- .update(workspaceBackups)
752
- .set({
753
- status: "succeeded",
754
- archiveSha256,
755
- treeSha256,
756
- fileCount,
757
- byteSize,
758
- compressedSize: stat.size,
759
- manifest,
760
- warnings,
761
- finishedAt,
762
- updatedAt: finishedAt,
763
- })
764
- .where(eq(workspaceBackups.id, backupId))
765
- .returning();
766
- if (!row)
767
- throw new Error("Workspace backup row was not updated.");
768
- return mapBackupRow(row);
769
- }
770
- catch (error) {
771
- const finishedAt = new Date();
772
- const [row] = await db
773
- .update(workspaceBackups)
774
- .set({
775
- status: "failed",
776
- error: error instanceof Error ? error.message : String(error),
777
- finishedAt,
778
- updatedAt: finishedAt,
779
- })
780
- .where(eq(workspaceBackups.id, backupId))
781
- .returning();
782
- if (row)
783
- return mapBackupRow(row);
784
- if (!runningRow)
785
- throw new Error("Workspace backup row was not created.");
786
- return mapBackupRow(runningRow);
787
- }
909
+ const runningRow = await claimBackup(input);
910
+ return await finalizeClaimedBackup(runningRow);
788
911
  },
789
912
  async listFiles(orgId, backupId, directoryPath = "") {
790
913
  const row = await getBackupRow(orgId, backupId);
@@ -894,39 +1017,116 @@ export function workspaceBackupService(db) {
894
1017
  const failed = [...staleFailed];
895
1018
  const errors = [];
896
1019
  const sparseRecoveries = [];
897
- let skipped = 0;
1020
+ const skippedDetails = [];
898
1021
  for (const organization of organizations) {
899
1022
  try {
900
- const [latest] = await db
901
- .select()
902
- .from(workspaceBackups)
903
- .where(and(eq(workspaceBackups.orgId, organization.id), ne(workspaceBackups.status, "deleted")))
904
- .orderBy(desc(workspaceBackups.createdAt))
905
- .limit(1);
906
- if (latest?.status === "running" || (latest && latest.createdAt > dueBefore)) {
907
- skipped += 1;
908
- continue;
909
- }
910
- const sparseRecovery = await recoverSparseWorkspaceFromLatestBackup(organization.id);
911
- if (sparseRecovery.recovered || sparseRecovery.error) {
912
- sparseRecoveries.push(sparseRecovery);
913
- }
914
- if (sparseRecovery.error) {
915
- errors.push({
1023
+ const outcome = await db.transaction(async (tx) => {
1024
+ await tx.execute(sql `select pg_advisory_xact_lock(hashtext(${`workspace-backup-scheduled:${organization.id}`}))`);
1025
+ const lockedService = workspaceBackupService(tx);
1026
+ const [running] = await tx
1027
+ .select()
1028
+ .from(workspaceBackups)
1029
+ .where(and(eq(workspaceBackups.orgId, organization.id), eq(workspaceBackups.status, "running")))
1030
+ .orderBy(desc(workspaceBackups.createdAt))
1031
+ .limit(1);
1032
+ if (running) {
1033
+ return {
1034
+ kind: "skipped",
1035
+ detail: {
1036
+ orgId: organization.id,
1037
+ reason: "running",
1038
+ comparedBackupId: running.id,
1039
+ treeSha256: running.treeSha256,
1040
+ },
1041
+ sparseRecovery: null,
1042
+ };
1043
+ }
1044
+ const [latestSuccessful] = await tx
1045
+ .select()
1046
+ .from(workspaceBackups)
1047
+ .where(and(eq(workspaceBackups.orgId, organization.id), inArray(workspaceBackups.status, ["succeeded", "restored"])))
1048
+ .orderBy(desc(workspaceBackups.createdAt))
1049
+ .limit(1);
1050
+ const unchangedCheckAt = latestSuccessful ? lastScheduledCheckAt(latestSuccessful) : null;
1051
+ const latestCheckAt = latestSuccessful
1052
+ ? new Date(Math.max(latestSuccessful.createdAt.getTime(), unchangedCheckAt?.getTime() ?? 0))
1053
+ : null;
1054
+ if (latestSuccessful && latestCheckAt && latestCheckAt > dueBefore) {
1055
+ return {
1056
+ kind: "skipped",
1057
+ detail: {
1058
+ orgId: organization.id,
1059
+ reason: "not_due",
1060
+ comparedBackupId: latestSuccessful.id,
1061
+ treeSha256: latestSuccessful.treeSha256,
1062
+ },
1063
+ sparseRecovery: null,
1064
+ };
1065
+ }
1066
+ const sparseRecovery = await lockedService.recoverSparseWorkspaceFromLatestBackup(organization.id);
1067
+ if (sparseRecovery.error) {
1068
+ return {
1069
+ kind: "error",
1070
+ message: `Sparse workspace recovery failed before scheduled backup: ${sparseRecovery.error}`,
1071
+ sparseRecovery,
1072
+ };
1073
+ }
1074
+ if (latestSuccessful?.treeSha256
1075
+ && await backupArtifactLooksUsable(latestSuccessful)) {
1076
+ try {
1077
+ const layout = await ensureOrganizationWorkspaceLayout(organization.id);
1078
+ const warnings = [];
1079
+ const entries = await walkWorkspace(layout.root, layout.root, warnings, [], { byteSize: 0 }, { includeFileData: false });
1080
+ const treeSha256 = buildTreeHash(entries);
1081
+ if (treeSha256 === latestSuccessful.treeSha256) {
1082
+ await tx
1083
+ .update(workspaceBackups)
1084
+ .set({
1085
+ manifest: manifestWithUnchangedCheck(latestSuccessful, now, treeSha256),
1086
+ updatedAt: now,
1087
+ })
1088
+ .where(eq(workspaceBackups.id, latestSuccessful.id));
1089
+ return {
1090
+ kind: "skipped",
1091
+ detail: {
1092
+ orgId: organization.id,
1093
+ reason: "unchanged",
1094
+ comparedBackupId: latestSuccessful.id,
1095
+ treeSha256,
1096
+ },
1097
+ sparseRecovery,
1098
+ };
1099
+ }
1100
+ }
1101
+ catch {
1102
+ // Preserve the existing failed-backup row behavior by letting create() retry the full snapshot.
1103
+ }
1104
+ }
1105
+ const backup = await lockedService.claimBackup({
916
1106
  orgId: organization.id,
917
- message: `Sparse workspace recovery failed before scheduled backup: ${sparseRecovery.error}`,
1107
+ triggerSource: "scheduled",
1108
+ retentionDays: input?.retentionDays,
918
1109
  });
919
- continue;
920
- }
921
- const backup = await service.create({
922
- orgId: organization.id,
923
- triggerSource: "scheduled",
924
- retentionDays: input?.retentionDays,
1110
+ return {
1111
+ kind: "claimed",
1112
+ backup,
1113
+ sparseRecovery,
1114
+ };
925
1115
  });
926
- if (backup.status === "failed")
927
- failed.push(backup);
928
- else
929
- created.push(backup);
1116
+ if (outcome.sparseRecovery && (outcome.sparseRecovery.recovered || outcome.sparseRecovery.error)) {
1117
+ sparseRecoveries.push(outcome.sparseRecovery);
1118
+ }
1119
+ if (outcome.kind === "skipped")
1120
+ skippedDetails.push(outcome.detail);
1121
+ else if (outcome.kind === "claimed") {
1122
+ const backup = await service.finalizeClaimedBackup(outcome.backup);
1123
+ if (backup.status === "failed")
1124
+ failed.push(backup);
1125
+ else
1126
+ created.push(backup);
1127
+ }
1128
+ else if (outcome.kind === "error")
1129
+ errors.push({ orgId: organization.id, message: outcome.message });
930
1130
  }
931
1131
  catch (error) {
932
1132
  errors.push({
@@ -935,7 +1135,15 @@ export function workspaceBackupService(db) {
935
1135
  });
936
1136
  }
937
1137
  }
938
- return { created, failed, deleted, sparseRecoveries, skipped, errors };
1138
+ return {
1139
+ created,
1140
+ failed,
1141
+ deleted,
1142
+ sparseRecoveries,
1143
+ skipped: skippedDetails.length,
1144
+ skippedDetails,
1145
+ errors,
1146
+ };
939
1147
  },
940
1148
  async restore(orgId, backupId, input) {
941
1149
  const row = await getBackupRow(orgId, backupId);