@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.
- package/dist/agent-runtimes/http/execute.d.ts.map +1 -1
- package/dist/agent-runtimes/http/execute.js +56 -1
- package/dist/agent-runtimes/http/execute.js.map +1 -1
- package/dist/agent-runtimes/http/index.d.ts.map +1 -1
- package/dist/agent-runtimes/http/index.js +10 -0
- package/dist/agent-runtimes/http/index.js.map +1 -1
- package/dist/agent-runtimes/process/execute.d.ts.map +1 -1
- package/dist/agent-runtimes/process/execute.js +9 -1
- package/dist/agent-runtimes/process/execute.js.map +1 -1
- package/dist/agent-runtimes/process/index.d.ts.map +1 -1
- package/dist/agent-runtimes/process/index.js +7 -0
- package/dist/agent-runtimes/process/index.js.map +1 -1
- package/dist/agent-runtimes/registry.d.ts.map +1 -1
- package/dist/agent-runtimes/registry.js +21 -1
- package/dist/agent-runtimes/registry.js.map +1 -1
- package/dist/agent-runtimes/utils.d.ts +1 -0
- package/dist/agent-runtimes/utils.d.ts.map +1 -1
- package/dist/agent-runtimes/utils.js.map +1 -1
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +183 -10
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +3 -3
- package/dist/home-paths.d.ts +7 -0
- package/dist/home-paths.d.ts.map +1 -1
- package/dist/home-paths.js +46 -2
- package/dist/home-paths.js.map +1 -1
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/routes/access.d.ts.map +1 -1
- package/dist/routes/access.helpers.d.ts +1 -1
- package/dist/routes/access.helpers.d.ts.map +1 -1
- package/dist/routes/access.helpers.js +0 -3
- package/dist/routes/access.helpers.js.map +1 -1
- package/dist/routes/access.js +0 -4
- package/dist/routes/access.js.map +1 -1
- package/dist/routes/agents.js +2 -2
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.generated-attachments.d.ts +16 -0
- package/dist/routes/chats.generated-attachments.d.ts.map +1 -0
- package/dist/routes/chats.generated-attachments.js +157 -0
- package/dist/routes/chats.generated-attachments.js.map +1 -0
- package/dist/routes/chats.helpers.d.ts +27 -0
- package/dist/routes/chats.helpers.d.ts.map +1 -0
- package/dist/routes/chats.helpers.js +52 -0
- package/dist/routes/chats.helpers.js.map +1 -0
- package/dist/routes/chats.js +126 -188
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/chats.stream-routes.d.ts.map +1 -1
- package/dist/routes/chats.stream-routes.js +185 -16
- package/dist/routes/chats.stream-routes.js.map +1 -1
- package/dist/routes/llms.js +3 -3
- package/dist/routes/llms.js.map +1 -1
- package/dist/routes/messenger.d.ts.map +1 -1
- package/dist/routes/messenger.js +48 -6
- package/dist/routes/messenger.js.map +1 -1
- package/dist/services/activity.d.ts.map +1 -1
- package/dist/services/activity.js +7 -2
- package/dist/services/activity.js.map +1 -1
- package/dist/services/agents.d.ts +65 -65
- package/dist/services/agents.d.ts.map +1 -1
- package/dist/services/agents.js +5 -4
- package/dist/services/agents.js.map +1 -1
- package/dist/services/approvals.d.ts +1 -1
- package/dist/services/assets.d.ts +2 -2
- package/dist/services/automation-chat-output.d.ts +1 -1
- package/dist/services/automation-chat-output.d.ts.map +1 -1
- package/dist/services/automation-chat-output.js +38 -23
- package/dist/services/automation-chat-output.js.map +1 -1
- package/dist/services/automations.d.ts.map +1 -1
- package/dist/services/automations.js +39 -41
- package/dist/services/automations.js.map +1 -1
- package/dist/services/budgets.d.ts +1 -1
- package/dist/services/chat-assistant.d.ts +23 -1
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.d.ts +21 -0
- package/dist/services/chat-assistant.helpers.d.ts.map +1 -1
- package/dist/services/chat-assistant.helpers.js +29 -10
- package/dist/services/chat-assistant.helpers.js.map +1 -1
- package/dist/services/chat-assistant.inline-visuals.d.ts +23 -0
- package/dist/services/chat-assistant.inline-visuals.d.ts.map +1 -0
- package/dist/services/chat-assistant.inline-visuals.js +129 -0
- package/dist/services/chat-assistant.inline-visuals.js.map +1 -0
- package/dist/services/chat-assistant.inline-visuals.test.js +85 -1
- package/dist/services/chat-assistant.inline-visuals.test.js.map +1 -1
- package/dist/services/chat-assistant.js +262 -38
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-family-groups.d.ts +14 -0
- package/dist/services/chat-family-groups.d.ts.map +1 -0
- package/dist/services/chat-family-groups.js +96 -0
- package/dist/services/chat-family-groups.js.map +1 -0
- package/dist/services/chat-generation-protocol.d.ts +17 -31
- package/dist/services/chat-generation-protocol.d.ts.map +1 -1
- package/dist/services/chat-generation-protocol.helpers.d.ts +36 -0
- package/dist/services/chat-generation-protocol.helpers.d.ts.map +1 -0
- package/dist/services/chat-generation-protocol.helpers.js +53 -0
- package/dist/services/chat-generation-protocol.helpers.js.map +1 -0
- package/dist/services/chat-generation-protocol.js +86 -55
- package/dist/services/chat-generation-protocol.js.map +1 -1
- package/dist/services/chat-generation-protocol.test.js +31 -3
- package/dist/services/chat-generation-protocol.test.js.map +1 -1
- package/dist/services/chat-steer-messages.d.ts +117 -0
- package/dist/services/chat-steer-messages.d.ts.map +1 -0
- package/dist/services/chat-steer-messages.js +410 -0
- package/dist/services/chat-steer-messages.js.map +1 -0
- package/dist/services/chat-title-generation.d.ts +1 -0
- package/dist/services/chat-title-generation.d.ts.map +1 -1
- package/dist/services/chat-title-generation.js +12 -9
- package/dist/services/chat-title-generation.js.map +1 -1
- package/dist/services/chat-work-manifest.d.ts.map +1 -1
- package/dist/services/chat-work-manifest.js +39 -2
- package/dist/services/chat-work-manifest.js.map +1 -1
- package/dist/services/chats.constants.d.ts +5 -0
- package/dist/services/chats.constants.d.ts.map +1 -0
- package/dist/services/chats.constants.js +13 -0
- package/dist/services/chats.constants.js.map +1 -0
- package/dist/services/chats.create.d.ts +75 -0
- package/dist/services/chats.create.d.ts.map +1 -0
- package/dist/services/chats.create.js +159 -0
- package/dist/services/chats.create.js.map +1 -0
- package/dist/services/chats.d.ts +85 -76
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.fork-helpers.d.ts +8 -0
- package/dist/services/chats.fork-helpers.d.ts.map +1 -0
- package/dist/services/chats.fork-helpers.js +45 -0
- package/dist/services/chats.fork-helpers.js.map +1 -0
- package/dist/services/chats.inline-visual-persistence.d.ts +30 -0
- package/dist/services/chats.inline-visual-persistence.d.ts.map +1 -0
- package/dist/services/chats.inline-visual-persistence.js +209 -0
- package/dist/services/chats.inline-visual-persistence.js.map +1 -0
- package/dist/services/chats.js +288 -273
- package/dist/services/chats.js.map +1 -1
- package/dist/services/chats.types.d.ts +31 -0
- package/dist/services/chats.types.d.ts.map +1 -0
- package/dist/services/chats.types.js +2 -0
- package/dist/services/chats.types.js.map +1 -0
- package/dist/services/integrations/feishu/inbound-dispatcher-db.d.ts.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher-db.js +81 -53
- package/dist/services/integrations/feishu/inbound-dispatcher-db.js.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher.d.ts +1 -0
- package/dist/services/integrations/feishu/inbound-dispatcher.d.ts.map +1 -1
- package/dist/services/integrations/feishu/inbound-dispatcher.js.map +1 -1
- package/dist/services/issues.comments-attachments.d.ts.map +1 -1
- package/dist/services/issues.comments-attachments.js +11 -2
- package/dist/services/issues.comments-attachments.js.map +1 -1
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.js +7 -1
- package/dist/services/knowledge-portability/organization-skills.catalog.js.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-skills.js +13 -1
- package/dist/services/knowledge-portability/organization-skills.js.map +1 -1
- package/dist/services/messenger-run-origin.d.ts +18 -0
- package/dist/services/messenger-run-origin.d.ts.map +1 -0
- package/dist/services/messenger-run-origin.js +248 -0
- package/dist/services/messenger-run-origin.js.map +1 -0
- package/dist/services/messenger-run-summary.d.ts +4 -0
- package/dist/services/messenger-run-summary.d.ts.map +1 -0
- package/dist/services/messenger-run-summary.js +6 -0
- package/dist/services/messenger-run-summary.js.map +1 -0
- package/dist/services/messenger-saved-views.d.ts +133 -0
- package/dist/services/messenger-saved-views.d.ts.map +1 -0
- package/dist/services/messenger-saved-views.js +275 -0
- package/dist/services/messenger-saved-views.js.map +1 -0
- package/dist/services/messenger.d.ts +17 -3
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +276 -56
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/operator-event-visibility.d.ts +3 -0
- package/dist/services/operator-event-visibility.d.ts.map +1 -0
- package/dist/services/operator-event-visibility.js +5 -0
- package/dist/services/operator-event-visibility.js.map +1 -0
- package/dist/services/orgs.d.ts +5 -5
- package/dist/services/plugin-registry.d.ts +4 -4
- package/dist/services/projects.d.ts +2 -2
- package/dist/services/run-intelligence.d.ts.map +1 -1
- package/dist/services/run-intelligence.js +7 -3
- package/dist/services/run-intelligence.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.core.js +9 -8
- package/dist/services/runtime-kernel/heartbeat.core.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.d.ts +2 -2
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +3 -2
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.misc.js +1 -1
- package/dist/services/runtime-kernel/heartbeat.misc.js.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.recovery.js +1 -1
- package/dist/services/runtime-kernel/heartbeat.recovery.js.map +1 -1
- package/dist/services/side-chats.d.ts +1 -46
- package/dist/services/side-chats.d.ts.map +1 -1
- package/dist/services/side-chats.js +58 -65
- package/dist/services/side-chats.js.map +1 -1
- package/dist/services/title-generation.d.ts +3 -0
- package/dist/services/title-generation.d.ts.map +1 -1
- package/dist/services/title-generation.js +178 -6
- package/dist/services/title-generation.js.map +1 -1
- package/dist/services/workspace-backups.d.ts +19 -8
- package/dist/services/workspace-backups.d.ts.map +1 -1
- package/dist/services/workspace-backups.js +335 -127
- package/dist/services/workspace-backups.js.map +1 -1
- package/package.json +14 -13
- package/resources/bundled-skills/browser/references/tool-contract.md +2 -2
- package/resources/bundled-skills/rudder-docs/SKILL.md +20 -4
- package/resources/bundled-skills/rudder-docs/evals/retrieval-authority-evals.json +262 -0
- package/resources/bundled-skills/rudder-docs/evals/trigger-evals.json +11 -11
- package/resources/bundled-skills/rudder-docs/references/agent-creation.md +153 -0
- package/resources/bundled-skills/rudder-docs/references/api-reference.md +9 -2
- package/resources/bundled-skills/rudder-docs/references/cli-reference.md +12 -12
- package/{skills/rudder-docs/references/control-plane-practices.md → resources/bundled-skills/rudder-docs/references/operating-practices.md} +4 -4
- package/resources/bundled-skills/rudder-docs/references/organization-skills.md +3 -3
- package/resources/bundled-skills/rudder-docs/references/plugin-authoring.md +116 -0
- package/resources/bundled-skills/rudder-docs/references/source-map.md +26 -2
- package/resources/bundled-skills/visualize/SKILL.md +29 -27
- package/resources/bundled-skills/visualize/references/runtime-contract.md +18 -8
- package/skills/browser/references/tool-contract.md +2 -2
- package/skills/rudder-docs/SKILL.md +20 -4
- package/skills/rudder-docs/evals/retrieval-authority-evals.json +262 -0
- package/skills/rudder-docs/evals/trigger-evals.json +11 -11
- package/skills/rudder-docs/references/agent-creation.md +153 -0
- package/skills/rudder-docs/references/api-reference.md +9 -2
- package/skills/rudder-docs/references/cli-reference.md +12 -12
- package/{resources/bundled-skills/rudder-docs/references/control-plane-practices.md → skills/rudder-docs/references/operating-practices.md} +4 -4
- package/skills/rudder-docs/references/organization-skills.md +3 -3
- package/skills/rudder-docs/references/plugin-authoring.md +116 -0
- package/skills/rudder-docs/references/source-map.md +26 -2
- package/skills/visualize/SKILL.md +29 -27
- package/skills/visualize/references/runtime-contract.md +18 -8
- package/ui-dist/assets/{abnfDiagram-VRR7QNED-Dpnx79fp.js → abnfDiagram-VRR7QNED-CAAPm9Nj.js} +1 -1
- package/ui-dist/assets/{arc-Cpvh_rCf.js → arc-DOFoNr3M.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-sDD_mBAI.js → architectureDiagram-ZJ3FMSHR-DRg6yhG8.js} +1 -1
- package/ui-dist/assets/{blockDiagram-677ZJIJ3-4O4wWti1.js → blockDiagram-677ZJIJ3-e3ShzsXT.js} +1 -1
- package/ui-dist/assets/{c4Diagram-LMCZKHZV-BkGODE4P.js → c4Diagram-LMCZKHZV-Csd_18O2.js} +1 -1
- package/ui-dist/assets/channel-BFLsBJOK.js +1 -0
- package/ui-dist/assets/{chunk-2Q5K7J3B-DsDQQpID.js → chunk-2Q5K7J3B-eF77FV1C.js} +1 -1
- package/ui-dist/assets/{chunk-32BRIVSS-Bzx_VnIw.js → chunk-32BRIVSS-CpMx72B5.js} +1 -1
- package/ui-dist/assets/{chunk-5VM5RSS4-D4LoPCni.js → chunk-5VM5RSS4-Be6WylCu.js} +1 -1
- package/ui-dist/assets/{chunk-EX3LRPZG-BO0R-mS4.js → chunk-EX3LRPZG-D-A_TfL-.js} +1 -1
- package/ui-dist/assets/{chunk-JWPE2WC7-B4Nr8KRL.js → chunk-JWPE2WC7-CdBLDqvo.js} +1 -1
- package/ui-dist/assets/{chunk-MOJQB5TN--uaDDrYM.js → chunk-MOJQB5TN-DkLjRENV.js} +1 -1
- package/ui-dist/assets/{chunk-RYQCIY6F-CyBY2w_j.js → chunk-RYQCIY6F-57VqTsE9.js} +1 -1
- package/ui-dist/assets/{chunk-V7JOEXUC-BMid_x8S.js → chunk-V7JOEXUC-DI_m8pt6.js} +1 -1
- package/ui-dist/assets/{chunk-VR4S4FIN-DVqdPKuG.js → chunk-VR4S4FIN-CM_944j4.js} +1 -1
- package/ui-dist/assets/{chunk-XXDRQBXY-vy03lLSS.js → chunk-XXDRQBXY--WTAlt82.js} +1 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-Dah6C4Dl.js +1 -0
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-Dah6C4Dl.js +1 -0
- package/ui-dist/assets/{cose-bilkent-JH36ORCC-jQDZmrG3.js → cose-bilkent-JH36ORCC-CR0qu31s.js} +1 -1
- package/ui-dist/assets/{cynefin-VYW2F7L2-BxBj6aea.js → cynefin-VYW2F7L2-f41lF5RD.js} +1 -1
- package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-BuUubF5I.js → cynefinDiagram-TSTJHNR4-88wJ2LA8.js} +1 -1
- package/ui-dist/assets/{dagre-VKFMJZFB-B8HipJ3a.js → dagre-VKFMJZFB-B1yJCIRh.js} +1 -1
- package/ui-dist/assets/{diagram-FQU43EPY-r7gkbKSt.js → diagram-FQU43EPY-C0iYYFUe.js} +1 -1
- package/ui-dist/assets/{diagram-G47NLZAW-CxClRsxD.js → diagram-G47NLZAW-Cp6S0siK.js} +1 -1
- package/ui-dist/assets/{diagram-NH7WQ7WH-C8HYTLlq.js → diagram-NH7WQ7WH-CmZb5OSk.js} +1 -1
- package/ui-dist/assets/{diagram-OA4YK3LP-CjwqqLKz.js → diagram-OA4YK3LP-9rFYGY7H.js} +1 -1
- package/ui-dist/assets/{diagram-WEI45ONY-2IWfCqZb.js → diagram-WEI45ONY-Og8vyDQh.js} +1 -1
- package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-DVGZkgjy.js → ebnfDiagram-CCIWWBDH--5sMape2.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q63AITRT-C_-u3Gmw.js → erDiagram-Q63AITRT-DG10Bza-.js} +1 -1
- package/ui-dist/assets/{flowDiagram-23GEKE2U-BvGg0NCq.js → flowDiagram-23GEKE2U-BW-aZfEk.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-NO4QXBWP-U3CZUUUR.js → ganttDiagram-NO4QXBWP-DcA7on8t.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-CIWuEBIo.js → gitGraphDiagram-IHSO6WYX-ygGufg32.js} +1 -1
- package/ui-dist/assets/{graph-D3P5q-7m.js → graph-BXl6uBoM.js} +1 -1
- package/ui-dist/assets/{index-DOPIV8vd.js → index-9bXlV2sq.js} +1 -1
- package/ui-dist/assets/{index-CjztBLJi.js → index-B58ems-F.js} +1 -1
- package/ui-dist/assets/{index-mnl55Stn.js → index-BM-SJNCx.js} +1 -1
- package/ui-dist/assets/index-BcdA9dZc.css +1 -0
- package/ui-dist/assets/{index-BAgtKYR1.js → index-BmTNDbzy.js} +1 -1
- package/ui-dist/assets/{index-DidCCw78.js → index-CCDynlok.js} +1 -1
- package/ui-dist/assets/{index-CbHqnWUe.js → index-CRLl2Ck7.js} +1 -1
- package/ui-dist/assets/{index-D7ycf1qU.js → index-CqmU1PxY.js} +1 -1
- package/ui-dist/assets/{index-B1rLBtZ1.js → index-CssgLJwf.js} +605 -493
- package/ui-dist/assets/{index-DRxLJD40.js → index-DOVMMhyj.js} +1 -1
- package/ui-dist/assets/{index-Ds_qma4-.js → index-DTlR8bJV.js} +1 -1
- package/ui-dist/assets/{index-DCFf9dps.js → index-Dl6nXXNc.js} +1 -1
- package/ui-dist/assets/{index-DAYlwxsg.js → index-DoiNhQrY.js} +1 -1
- package/ui-dist/assets/{index-CBOr9F6w.js → index-Dug5GX1J.js} +1 -1
- package/ui-dist/assets/{index-HkQRx1D6.js → index-DxXOCTVe.js} +1 -1
- package/ui-dist/assets/{index-BAMXpiI5.js → index-GdN-7KLt.js} +1 -1
- package/ui-dist/assets/{index-ikpL--zj.js → index-ZA8lPH2n.js} +1 -1
- package/ui-dist/assets/{index-Cu1iMhjl.js → index-fkDP349f.js} +1 -1
- package/ui-dist/assets/{index-DYMtCDKT.js → index-uKIvv9n9.js} +1 -1
- package/ui-dist/assets/{infoDiagram-FWYZ7A6U-Cx8Fa-I4.js → infoDiagram-FWYZ7A6U-27INMkBm.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-Cmuz1QUN.js → ishikawaDiagram-FXEZZL3T-Bp6XQ1_r.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-5HDEW3XC-CJgkiVXG.js → journeyDiagram-5HDEW3XC-9vaIwdZ3.js} +1 -1
- package/ui-dist/assets/{kanban-definition-HUTT4EX6-RAWpefOB.js → kanban-definition-HUTT4EX6-DjsMaR6l.js} +1 -1
- package/ui-dist/assets/{layout-DyWQv0Rr.js → layout-C0oWcIiC.js} +1 -1
- package/ui-dist/assets/{linear-D5pdgIf9.js → linear-DNbmenmQ.js} +1 -1
- package/ui-dist/assets/{map-bVSzNLl2.js → map-B1s9kpcR.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CeaXGD6B.js → mermaid.core-DsYT9DxL.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-LN4V7U3C-B8B8AX5C.js → mindmap-definition-LN4V7U3C-vVHeRI83.js} +1 -1
- package/ui-dist/assets/{pegDiagram-2B236MQR-C4Sv-ua6.js → pegDiagram-2B236MQR-ohrgWLo_.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ENE6RG2P-CLARlOHx.js → pieDiagram-ENE6RG2P-B0EqPrjn.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-DPCXQmeT.js → quadrantDiagram-ABIIQ3AL-D44iYm0o.js} +1 -1
- package/ui-dist/assets/{railroadDiagram-RFXS5EU6-BpqRuKUQ.js → railroadDiagram-RFXS5EU6-BQU5bpbU.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-TGXJPOKE-Dd-h62HZ.js → requirementDiagram-TGXJPOKE-DGJciRxB.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-DylT_pqq.js → sankeyDiagram-HTMAVEWB-NMXZW_Qb.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-RiCF1REj.js → sequenceDiagram-DBY2YBRQ-8uWY67Bb.js} +1 -1
- package/ui-dist/assets/{sizeCapture-X5ZJPWSS-DXW4JQz2.js → sizeCapture-X5ZJPWSS-BnUUR-On.js} +1 -1
- package/ui-dist/assets/{stateDiagram-2N3HPSRC-6U3ESIGT.js → stateDiagram-2N3HPSRC-B37bcKMy.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-p6H0vL7N.js +1 -0
- package/ui-dist/assets/{swimlanes-5IMT3BWC-CeNHVNCi.js → swimlanes-5IMT3BWC-Bi2ZzUMi.js} +2 -2
- package/ui-dist/assets/swimlanesDiagram-G3AALYLV-BX6FiLF9.js +8 -0
- package/ui-dist/assets/{timeline-definition-FHXFAJF6-Vlwoe_1b.js → timeline-definition-FHXFAJF6-CkWauU5D.js} +1 -1
- package/ui-dist/assets/{vennDiagram-L72KCM5P-DBP7D3HE.js → vennDiagram-L72KCM5P-BrmBXmnk.js} +1 -1
- package/ui-dist/assets/{wardleyDiagram-EHGQE667-DG-wzqpy.js → wardleyDiagram-EHGQE667-kO5cojc6.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BAq3mbha.js → xychartDiagram-FW5EYKEG-CUBDaCDm.js} +1 -1
- package/ui-dist/index.html +5 -4
- package/resources/bundled-skills/rudder-create-agent/SKILL.md +0 -185
- package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +0 -179
- package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +0 -132
- package/resources/bundled-skills/rudder-create-plugin/SKILL.md +0 -103
- package/resources/bundled-skills/skill-optimizer/CHANGELOG.md +0 -29
- package/resources/bundled-skills/skill-optimizer/SKILL.md +0 -205
- package/resources/bundled-skills/skill-optimizer/references/adapters/creative-brand-content.md +0 -30
- package/resources/bundled-skills/skill-optimizer/references/adapters/customer-support-sales.md +0 -30
- package/resources/bundled-skills/skill-optimizer/references/adapters/document-data-processing.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/education-training.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/finance-accounting.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/healthcare-operations.md +0 -30
- package/resources/bundled-skills/skill-optimizer/references/adapters/hr-people-ops.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/legal-compliance.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/operations-supply-chain.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/personal-productivity.md +0 -29
- package/resources/bundled-skills/skill-optimizer/references/adapters/research-knowledge.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/adapters/software-ai.md +0 -31
- package/resources/bundled-skills/skill-optimizer/references/domain-adapter-patterns.md +0 -66
- package/resources/bundled-skills/skill-optimizer/references/eval-method.md +0 -17
- package/resources/bundled-skills/skill-optimizer/references/universal-optimization-lens.md +0 -73
- package/skills/rudder-create-agent/SKILL.md +0 -185
- package/skills/rudder-create-agent/references/api-reference.md +0 -179
- package/skills/rudder-create-agent/references/cli-reference.md +0 -132
- package/skills/rudder-create-plugin/SKILL.md +0 -103
- package/skills/skill-optimizer/CHANGELOG.md +0 -29
- package/skills/skill-optimizer/SKILL.md +0 -205
- package/skills/skill-optimizer/references/adapters/creative-brand-content.md +0 -30
- package/skills/skill-optimizer/references/adapters/customer-support-sales.md +0 -30
- package/skills/skill-optimizer/references/adapters/document-data-processing.md +0 -31
- package/skills/skill-optimizer/references/adapters/education-training.md +0 -31
- package/skills/skill-optimizer/references/adapters/finance-accounting.md +0 -31
- package/skills/skill-optimizer/references/adapters/healthcare-operations.md +0 -30
- package/skills/skill-optimizer/references/adapters/hr-people-ops.md +0 -31
- package/skills/skill-optimizer/references/adapters/legal-compliance.md +0 -31
- package/skills/skill-optimizer/references/adapters/operations-supply-chain.md +0 -31
- package/skills/skill-optimizer/references/adapters/personal-productivity.md +0 -29
- package/skills/skill-optimizer/references/adapters/research-knowledge.md +0 -31
- package/skills/skill-optimizer/references/adapters/software-ai.md +0 -31
- package/skills/skill-optimizer/references/domain-adapter-patterns.md +0 -66
- package/skills/skill-optimizer/references/eval-method.md +0 -17
- package/skills/skill-optimizer/references/universal-optimization-lens.md +0 -73
- package/ui-dist/assets/channel-CM4Myg_6.js +0 -1
- package/ui-dist/assets/classDiagram-OUVF2IWQ-CtlIEzTt.js +0 -1
- package/ui-dist/assets/classDiagram-v2-EOCWNBFH-CtlIEzTt.js +0 -1
- package/ui-dist/assets/index-DekHKOsL.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-KQTrcZvp.js +0 -1
- 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":"AAIA,OAAO,
|
|
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(
|
|
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(
|
|
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 (
|
|
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
|
|
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
|
|
700
|
-
|
|
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
|
-
|
|
1020
|
+
const skippedDetails = [];
|
|
898
1021
|
for (const organization of organizations) {
|
|
899
1022
|
try {
|
|
900
|
-
const
|
|
901
|
-
.select()
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
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
|
-
|
|
1107
|
+
triggerSource: "scheduled",
|
|
1108
|
+
retentionDays: input?.retentionDays,
|
|
918
1109
|
});
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
retentionDays: input?.retentionDays,
|
|
1110
|
+
return {
|
|
1111
|
+
kind: "claimed",
|
|
1112
|
+
backup,
|
|
1113
|
+
sparseRecovery,
|
|
1114
|
+
};
|
|
925
1115
|
});
|
|
926
|
-
if (
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
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 {
|
|
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);
|