@rudderhq/server 0.1.0-canary.9 → 0.1.0
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/bootstrap/register-api-routes.d.ts.map +1 -1
- package/dist/bootstrap/register-api-routes.js +2 -0
- package/dist/bootstrap/register-api-routes.js.map +1 -1
- package/dist/bundled-plugins/plugin-linear/README.md +22 -0
- package/dist/bundled-plugins/plugin-linear/dist/manifest.js +183 -0
- package/dist/bundled-plugins/plugin-linear/dist/manifest.js.map +7 -0
- package/dist/bundled-plugins/plugin-linear/dist/ui/index.js +1229 -0
- package/dist/bundled-plugins/plugin-linear/dist/ui/index.js.map +7 -0
- package/dist/bundled-plugins/plugin-linear/dist/worker.js +8251 -0
- package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +7 -0
- package/dist/bundled-plugins/plugin-linear/package.json +42 -0
- package/dist/dev-server-status.d.ts +1 -7
- package/dist/dev-server-status.d.ts.map +1 -1
- package/dist/dev-server-status.js +1 -4
- package/dist/dev-server-status.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -1
- package/dist/index.js.map +1 -1
- package/dist/langfuse-transcript.d.ts +1 -0
- package/dist/langfuse-transcript.d.ts.map +1 -1
- package/dist/langfuse-transcript.js +24 -0
- package/dist/langfuse-transcript.js.map +1 -1
- package/dist/onboarding-assets/ceo/MEMORY.md +13 -0
- package/dist/onboarding-assets/ceo/SOUL.md +28 -0
- package/dist/onboarding-assets/ceo/TOOLS.md +1 -1
- package/dist/onboarding-assets/default/MEMORY.md +13 -0
- package/dist/onboarding-assets/default/SOUL.md +29 -0
- package/dist/onboarding-assets/default/TOOLS.md +1 -1
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +4 -3
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/calendar.d.ts +3 -0
- package/dist/routes/calendar.d.ts.map +1 -0
- package/dist/routes/calendar.js +265 -0
- package/dist/routes/calendar.js.map +1 -0
- package/dist/routes/chats.d.ts.map +1 -1
- package/dist/routes/chats.js +149 -21
- package/dist/routes/chats.js.map +1 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +24 -0
- package/dist/routes/dashboard.js.map +1 -1
- package/dist/routes/goals.d.ts.map +1 -1
- package/dist/routes/goals.js +10 -0
- package/dist/routes/goals.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +3 -12
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/instance-settings.d.ts.map +1 -1
- package/dist/routes/instance-settings.js +1 -26
- package/dist/routes/instance-settings.js.map +1 -1
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +74 -34
- package/dist/routes/issues.js.map +1 -1
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +161 -145
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/plugins.d.ts.map +1 -1
- package/dist/routes/plugins.js +30 -7
- package/dist/routes/plugins.js.map +1 -1
- package/dist/services/agent-instructions.d.ts.map +1 -1
- package/dist/services/agent-instructions.js +23 -7
- package/dist/services/agent-instructions.js.map +1 -1
- package/dist/services/agent-run-context.d.ts +1 -1
- package/dist/services/agent-run-context.js +1 -1
- package/dist/services/agent-run-context.js.map +1 -1
- package/dist/services/agents.d.ts +13 -13
- package/dist/services/assets.d.ts +2 -2
- package/dist/services/calendar.d.ts +137 -0
- package/dist/services/calendar.d.ts.map +1 -0
- package/dist/services/calendar.js +1279 -0
- package/dist/services/calendar.js.map +1 -0
- package/dist/services/chat-assistant.d.ts.map +1 -1
- package/dist/services/chat-assistant.js +75 -15
- package/dist/services/chat-assistant.js.map +1 -1
- package/dist/services/chat-generation-locks.d.ts +2 -1
- package/dist/services/chat-generation-locks.d.ts.map +1 -1
- package/dist/services/chat-generation-locks.js +12 -3
- package/dist/services/chat-generation-locks.js.map +1 -1
- package/dist/services/chats.d.ts +4 -2
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +2 -15
- package/dist/services/chats.js.map +1 -1
- package/dist/services/costs.d.ts +2 -2
- package/dist/services/default-agent-instructions.d.ts +2 -2
- package/dist/services/default-agent-instructions.js +2 -2
- package/dist/services/documents.d.ts +23 -0
- package/dist/services/documents.d.ts.map +1 -1
- package/dist/services/documents.js +17 -1
- package/dist/services/documents.js.map +1 -1
- package/dist/services/export-jobs.d.ts +16 -0
- package/dist/services/export-jobs.d.ts.map +1 -0
- package/dist/services/export-jobs.js +147 -0
- package/dist/services/export-jobs.js.map +1 -0
- package/dist/services/finance.d.ts +6 -6
- package/dist/services/goals.d.ts +16 -10
- package/dist/services/goals.d.ts.map +1 -1
- package/dist/services/goals.js +201 -18
- package/dist/services/goals.js.map +1 -1
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/instance-settings.d.ts +1 -3
- package/dist/services/instance-settings.d.ts.map +1 -1
- package/dist/services/instance-settings.js +1 -38
- package/dist/services/instance-settings.js.map +1 -1
- package/dist/services/issue-approvals.d.ts +1 -1
- package/dist/services/issues.d.ts +12 -0
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +107 -1
- package/dist/services/issues.js.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.d.ts +12 -2
- package/dist/services/knowledge-portability/organization-portability.d.ts.map +1 -1
- package/dist/services/knowledge-portability/organization-portability.js +77 -4
- package/dist/services/knowledge-portability/organization-portability.js.map +1 -1
- package/dist/services/messenger.d.ts +2 -2
- package/dist/services/messenger.d.ts.map +1 -1
- package/dist/services/messenger.js +67 -27
- package/dist/services/messenger.js.map +1 -1
- package/dist/services/organization-workspace-browser.d.ts.map +1 -1
- package/dist/services/organization-workspace-browser.js +3 -0
- package/dist/services/organization-workspace-browser.js.map +1 -1
- package/dist/services/plugin-registry.d.ts +8 -8
- package/dist/services/runtime-kernel/heartbeat.d.ts +6 -0
- package/dist/services/runtime-kernel/heartbeat.d.ts.map +1 -1
- package/dist/services/runtime-kernel/heartbeat.js +236 -99
- package/dist/services/runtime-kernel/heartbeat.js.map +1 -1
- package/dist/services/runtime-kernel/model-fallback.d.ts +10 -0
- package/dist/services/runtime-kernel/model-fallback.d.ts.map +1 -0
- package/dist/services/runtime-kernel/model-fallback.js +147 -0
- package/dist/services/runtime-kernel/model-fallback.js.map +1 -0
- package/dist/services/secrets.d.ts +1 -3
- package/dist/services/secrets.d.ts.map +1 -1
- package/dist/services/secrets.js +55 -30
- package/dist/services/secrets.js.map +1 -1
- package/dist/services/workspace-backups.d.ts +34 -0
- package/dist/services/workspace-backups.d.ts.map +1 -0
- package/dist/services/workspace-backups.js +519 -0
- package/dist/services/workspace-backups.js.map +1 -0
- package/dist/services/workspace-runtime.d.ts +2 -2
- package/package.json +14 -14
- package/resources/bundled-skills/para-memory-files/SKILL.md +3 -1
- package/resources/bundled-skills/rudder-create-agent/SKILL.md +21 -4
- package/resources/bundled-skills/rudder-create-agent/references/api-reference.md +8 -3
- package/resources/bundled-skills/rudder-create-agent/references/cli-reference.md +8 -2
- package/skills/para-memory-files/SKILL.md +3 -1
- package/skills/rudder-create-agent/SKILL.md +21 -4
- package/skills/rudder-create-agent/references/api-reference.md +8 -3
- package/skills/rudder-create-agent/references/cli-reference.md +8 -2
- package/ui-dist/assets/{_basePickBy-C5FevVGb.js → _basePickBy-9EA6dBFj.js} +1 -1
- package/ui-dist/assets/{_baseUniq-Bp5Cq-Lt.js → _baseUniq-puJRDjRm.js} +1 -1
- package/ui-dist/assets/{arc-DxCinQZQ.js → arc-BuvB_2Wz.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-Bt4OB6rg.js → architectureDiagram-2XIMDMQ5-DNH3NcPr.js} +1 -1
- package/ui-dist/assets/{blockDiagram-WCTKOSBZ-AfUyCHdW.js → blockDiagram-WCTKOSBZ-CCjA-egI.js} +1 -1
- package/ui-dist/assets/{c4Diagram-IC4MRINW-ZQmapm_f.js → c4Diagram-IC4MRINW-DaAxG30_.js} +1 -1
- package/ui-dist/assets/channel-BHmUwLHY.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-b-nhg8XG.js → chunk-4BX2VUAB-CuuLnPLx.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-D_mWeaWL.js → chunk-55IACEB6-7KqKHU50.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-CvCBPkxY.js → chunk-FMBD7UC4-CquRnk_C.js} +1 -1
- package/ui-dist/assets/{chunk-JSJVCQXG-CyIzde6d.js → chunk-JSJVCQXG-Cub6UI-9.js} +1 -1
- package/ui-dist/assets/{chunk-KX2RTZJC-664uOAt1.js → chunk-KX2RTZJC-D-R4Pk61.js} +1 -1
- package/ui-dist/assets/{chunk-NQ4KR5QH-zC9eKlQL.js → chunk-NQ4KR5QH-YQLRgLCT.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-Bso6mrAm.js → chunk-QZHKN3VN-BgxQG6QM.js} +1 -1
- package/ui-dist/assets/{chunk-WL4C6EOR-CGgjDf4Q.js → chunk-WL4C6EOR-CVJNOFb-.js} +1 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-BykYYXhO.js +1 -0
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-BykYYXhO.js +1 -0
- package/ui-dist/assets/clone-BjbqkGJk.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-ChfhiHs0.js → cose-bilkent-S5V4N54A-BGYYdPRC.js} +1 -1
- package/ui-dist/assets/{dagre-KLK3FWXG-BtdGql15.js → dagre-KLK3FWXG-CDgRaJNK.js} +1 -1
- package/ui-dist/assets/{diagram-E7M64L7V-CcQq6lyW.js → diagram-E7M64L7V-CQEBiicN.js} +1 -1
- package/ui-dist/assets/{diagram-IFDJBPK2-C8MRQ8-O.js → diagram-IFDJBPK2-cGKTVrZq.js} +1 -1
- package/ui-dist/assets/{diagram-P4PSJMXO-wDtyafSS.js → diagram-P4PSJMXO-fGAfKBU_.js} +1 -1
- package/ui-dist/assets/{erDiagram-INFDFZHY-DSPOGKs9.js → erDiagram-INFDFZHY-DW5vJI98.js} +1 -1
- package/ui-dist/assets/{flowDiagram-PKNHOUZH-CMRO_o51.js → flowDiagram-PKNHOUZH-CikVuzCR.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-A5KZAMGK-ByVpG5X7.js → ganttDiagram-A5KZAMGK-Ca4perbO.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-C0hZhA2f.js → gitGraphDiagram-K3NZZRJ6-hkDkX0wB.js} +1 -1
- package/ui-dist/assets/{graph-8ZSpiLvu.js → graph-CKVwuNpm.js} +1 -1
- package/ui-dist/assets/{index-Jl3ZTphD.js → index-B24_1Y25.js} +1 -1
- package/ui-dist/assets/{index-Bnqrds93.js → index-BCSq0Y_A.js} +1 -1
- package/ui-dist/assets/{index-LxYtcd2q.js → index-BbX5RwLL.js} +1 -1
- package/ui-dist/assets/{index-BuxAGDe1.js → index-Bj5f8srw.js} +1 -1
- package/ui-dist/assets/{index-CrjKYwlq.js → index-Bm5RRuGQ.js} +1 -1
- package/ui-dist/assets/{index-Byt3a14a.js → index-BzHEDVXA.js} +1 -1
- package/ui-dist/assets/{index-C96r3ncF.js → index-C5IbLmrM.js} +1 -1
- package/ui-dist/assets/{index-DSa_Y_jA.js → index-CBuiHrHJ.js} +1 -1
- package/ui-dist/assets/{index-CsgWTWOx.js → index-CGtsmbZm.js} +1 -1
- package/ui-dist/assets/{index-Dolr9Kee.js → index-CIlRDiw5.js} +1 -1
- package/ui-dist/assets/{index-tGztn4Is.js → index-CT8eqX9W.js} +1 -1
- package/ui-dist/assets/{index-CeJdOYIF.js → index-CjD2xZdW.js} +1 -1
- package/ui-dist/assets/{index-C7DEZ3Ju.js → index-DFeHRm34.js} +1 -1
- package/ui-dist/assets/{index-ChJl_hqp.js → index-DI-FLO2Z.js} +1 -1
- package/ui-dist/assets/{index-D083o6by.js → index-DJ84yjUf.js} +1 -1
- package/ui-dist/assets/index-DTw34fFZ.js +1398 -0
- package/ui-dist/assets/{index--8IW0gQi.js → index-DZ6kUIBM.js} +1 -1
- package/ui-dist/assets/{index-D5fB3OrO.js → index-DdFp0EEO.js} +1 -1
- package/ui-dist/assets/{index-BYlbpnGO.js → index-Dm4kNTCW.js} +1 -1
- package/ui-dist/assets/{index-DIlroFT7.js → index-aK5eezHP.js} +1 -1
- package/ui-dist/assets/{index-DoCNo7J9.js → index-dd4k0fyq.js} +1 -1
- package/ui-dist/assets/index-jnv9Ql_2.css +1 -0
- package/ui-dist/assets/{index-Do2QEU2O.js → index-kGMjx6qb.js} +1 -1
- package/ui-dist/assets/{index-DGliz_Zl.js → index-qEEWalog.js} +1 -1
- package/ui-dist/assets/{infoDiagram-LFFYTUFH-CRObxa1Q.js → infoDiagram-LFFYTUFH-aDNdkSKW.js} +1 -1
- package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-ksXzVP6h.js → ishikawaDiagram-PHBUUO56-CmclzHhC.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-4ABVD52K-DhLhkeS3.js → journeyDiagram-4ABVD52K-BFnBxKuG.js} +1 -1
- package/ui-dist/assets/{kanban-definition-K7BYSVSG-CJPHwSur.js → kanban-definition-K7BYSVSG-eJfOZg7R.js} +1 -1
- package/ui-dist/assets/{layout-CbB6lAw2.js → layout-CLRiNHgA.js} +1 -1
- package/ui-dist/assets/{linear-HPte01nq.js → linear-B-J9sUer.js} +1 -1
- package/ui-dist/assets/{mermaid.core-CaHTquLw.js → mermaid.core-C1MjBOIN.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-YRQLILUH-CeZ9z-BE.js → mindmap-definition-YRQLILUH-BdvCmP6e.js} +1 -1
- package/ui-dist/assets/{pieDiagram-SKSYHLDU-YB621clF.js → pieDiagram-SKSYHLDU-BAITPD_t.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-337W2JSQ-KPDGBXfE.js → quadrantDiagram-337W2JSQ-BFnjyhzq.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-CnMP-_Rj.js → requirementDiagram-Z7DCOOCP-Bxg6tlLh.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK-rWDbj38-.js → sankeyDiagram-WA2Y5GQK-LPpklLQK.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-D5IlEfYm.js → sequenceDiagram-2WXFIKYE-D-W6lss0.js} +1 -1
- package/ui-dist/assets/{stateDiagram-RAJIS63D-CI6m7yMI.js → stateDiagram-RAJIS63D-Bzo5M8P7.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DJ1MxF2S.js +1 -0
- package/ui-dist/assets/{timeline-definition-YZTLITO2-Bl1-YzON.js → timeline-definition-YZTLITO2-luuVqyTW.js} +1 -1
- package/ui-dist/assets/{treemap-KZPCXAKY-CcFSGzuM.js → treemap-KZPCXAKY-ChGqzx5u.js} +1 -1
- package/ui-dist/assets/{vennDiagram-LZ73GAT5-DpgfFxeZ.js → vennDiagram-LZ73GAT5-BCEjZinK.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-JWTSCODW-Bas4tWGP.js → xychartDiagram-JWTSCODW-mAsE6hMg.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/dist/onboarding-assets/ceo/AGENTS.md +0 -33
- package/dist/onboarding-assets/default/AGENTS.md +0 -9
- package/ui-dist/assets/channel-B-3UKZ6E.js +0 -1
- package/ui-dist/assets/classDiagram-VBA2DB6C-DJbF61vn.js +0 -1
- package/ui-dist/assets/classDiagram-v2-RAHNMMFH-DJbF61vn.js +0 -1
- package/ui-dist/assets/clone-B7Z_Fd8l.js +0 -1
- package/ui-dist/assets/index-B4jXCLTd.js +0 -1358
- package/ui-dist/assets/index-C187WwUh.css +0 -1
- package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-DMNsLapT.js +0 -1
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { and, desc, eq, inArray, isNotNull, isNull, lte, ne, or, sql } from "drizzle-orm";
|
|
5
|
+
import { heartbeatRuns, workspaceBackups, } from "@rudderhq/db";
|
|
6
|
+
import { WORKSPACE_BACKUP_DEFAULT_INTERVAL_HOURS, WORKSPACE_BACKUP_DEFAULT_RETENTION_DAYS, } from "@rudderhq/shared";
|
|
7
|
+
import { conflict, notFound, unprocessable } from "../errors.js";
|
|
8
|
+
import { ensureOrganizationWorkspaceLayout, resolveDefaultBackupDir, resolveOrganizationWorkspaceRoot, resolveRudderInstanceId, } from "../home-paths.js";
|
|
9
|
+
import { organizationService } from "./orgs.js";
|
|
10
|
+
const ARTIFACT_VERSION = 1;
|
|
11
|
+
const MAX_PREVIEW_BYTES = 200_000;
|
|
12
|
+
const SKIPPED_ENTRY_NAMES = new Set([".DS_Store", ".cache", ".npm", ".nvm", "node_modules"]);
|
|
13
|
+
const ACTIVE_RUN_STATUSES = ["queued", "running"];
|
|
14
|
+
const WORKSPACE_BACKUP_DEFAULT_INTERVAL_MS = WORKSPACE_BACKUP_DEFAULT_INTERVAL_HOURS * 60 * 60 * 1000;
|
|
15
|
+
function timestamp(date = new Date()) {
|
|
16
|
+
const pad = (value) => String(value).padStart(2, "0");
|
|
17
|
+
return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`;
|
|
18
|
+
}
|
|
19
|
+
function addDays(date, days) {
|
|
20
|
+
const normalizedDays = Math.max(1, Math.trunc(days));
|
|
21
|
+
return new Date(date.getTime() + normalizedDays * 24 * 60 * 60 * 1000);
|
|
22
|
+
}
|
|
23
|
+
function sha256Buffer(buffer) {
|
|
24
|
+
return crypto.createHash("sha256").update(buffer).digest("hex");
|
|
25
|
+
}
|
|
26
|
+
function toPortableRelativePath(relativePath) {
|
|
27
|
+
return relativePath.split(path.sep).join("/");
|
|
28
|
+
}
|
|
29
|
+
function normalizeRequestedPath(value) {
|
|
30
|
+
return typeof value === "string" ? value.trim().replace(/^\/+/, "").replace(/\/+$/g, "") : "";
|
|
31
|
+
}
|
|
32
|
+
function assertSafeRelativePath(value) {
|
|
33
|
+
const normalized = normalizeRequestedPath(value);
|
|
34
|
+
if (!normalized)
|
|
35
|
+
return "";
|
|
36
|
+
if (path.isAbsolute(normalized) || normalized.split("/").includes("..")) {
|
|
37
|
+
throw unprocessable("Backup path must stay inside the organization workspace root");
|
|
38
|
+
}
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
41
|
+
function resolveWithinRoot(rootPath, relativePath) {
|
|
42
|
+
const normalized = assertSafeRelativePath(relativePath);
|
|
43
|
+
const resolvedRoot = path.resolve(rootPath);
|
|
44
|
+
const resolvedTarget = normalized ? path.resolve(resolvedRoot, normalized) : resolvedRoot;
|
|
45
|
+
const relative = path.relative(resolvedRoot, resolvedTarget);
|
|
46
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
47
|
+
throw unprocessable("Backup path must stay inside the organization workspace root");
|
|
48
|
+
}
|
|
49
|
+
return { resolvedRoot, resolvedTarget, normalizedPath: toPortableRelativePath(relative === "" ? "" : relative) };
|
|
50
|
+
}
|
|
51
|
+
function isBinaryBuffer(buffer) {
|
|
52
|
+
for (const byte of buffer) {
|
|
53
|
+
if (byte === 0)
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
function mapBackupRow(row) {
|
|
59
|
+
const expiresAt = row.expiresAt ?? addDays(row.createdAt, WORKSPACE_BACKUP_DEFAULT_RETENTION_DAYS);
|
|
60
|
+
return {
|
|
61
|
+
id: row.id,
|
|
62
|
+
orgId: row.orgId,
|
|
63
|
+
status: row.status,
|
|
64
|
+
triggerSource: row.triggerSource,
|
|
65
|
+
artifactProvider: "local_file",
|
|
66
|
+
artifactRef: row.artifactRef,
|
|
67
|
+
archiveSha256: row.archiveSha256,
|
|
68
|
+
treeSha256: row.treeSha256,
|
|
69
|
+
fileCount: row.fileCount,
|
|
70
|
+
byteSize: row.byteSize,
|
|
71
|
+
compressedSize: row.compressedSize,
|
|
72
|
+
manifest: row.manifest ?? null,
|
|
73
|
+
warnings: Array.isArray(row.warnings) ? row.warnings : [],
|
|
74
|
+
error: row.error,
|
|
75
|
+
startedAt: row.startedAt?.toISOString() ?? null,
|
|
76
|
+
finishedAt: row.finishedAt?.toISOString() ?? null,
|
|
77
|
+
expiresAt: expiresAt.toISOString(),
|
|
78
|
+
restoredFromBackupId: row.restoredFromBackupId,
|
|
79
|
+
createdByUserId: row.createdByUserId,
|
|
80
|
+
createdAt: row.createdAt.toISOString(),
|
|
81
|
+
updatedAt: row.updatedAt.toISOString(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function buildTreeHash(entries) {
|
|
85
|
+
const hash = crypto.createHash("sha256");
|
|
86
|
+
for (const entry of [...entries].sort((left, right) => left.path.localeCompare(right.path))) {
|
|
87
|
+
hash.update(entry.path);
|
|
88
|
+
hash.update("\0");
|
|
89
|
+
hash.update(entry.kind);
|
|
90
|
+
hash.update("\0");
|
|
91
|
+
hash.update(String(entry.byteSize));
|
|
92
|
+
hash.update("\0");
|
|
93
|
+
hash.update(entry.sha256 ?? "");
|
|
94
|
+
hash.update("\n");
|
|
95
|
+
}
|
|
96
|
+
return hash.digest("hex");
|
|
97
|
+
}
|
|
98
|
+
function directChildrenFromArtifact(artifact, directoryPath) {
|
|
99
|
+
const normalizedDirectory = assertSafeRelativePath(directoryPath);
|
|
100
|
+
const prefix = normalizedDirectory ? `${normalizedDirectory}/` : "";
|
|
101
|
+
const children = new Map();
|
|
102
|
+
for (const entry of artifact.entries) {
|
|
103
|
+
if (normalizedDirectory && entry.path === normalizedDirectory && entry.kind === "directory")
|
|
104
|
+
continue;
|
|
105
|
+
if (!entry.path.startsWith(prefix))
|
|
106
|
+
continue;
|
|
107
|
+
const remainder = entry.path.slice(prefix.length);
|
|
108
|
+
if (!remainder)
|
|
109
|
+
continue;
|
|
110
|
+
const [name] = remainder.split("/");
|
|
111
|
+
if (!name)
|
|
112
|
+
continue;
|
|
113
|
+
const isNested = remainder.includes("/");
|
|
114
|
+
const childPath = prefix ? `${prefix}${name}` : name;
|
|
115
|
+
const current = children.get(childPath);
|
|
116
|
+
const isDirectory = isNested || entry.kind === "directory";
|
|
117
|
+
if (!current || isDirectory) {
|
|
118
|
+
children.set(childPath, {
|
|
119
|
+
name,
|
|
120
|
+
path: childPath,
|
|
121
|
+
isDirectory,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return [...children.values()].sort((left, right) => {
|
|
126
|
+
if (left.isDirectory !== right.isDirectory)
|
|
127
|
+
return left.isDirectory ? -1 : 1;
|
|
128
|
+
return left.name.localeCompare(right.name);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function findArtifactFile(artifact, filePath) {
|
|
132
|
+
const normalized = assertSafeRelativePath(filePath);
|
|
133
|
+
return artifact.entries.find((entry) => entry.path === normalized && entry.kind === "file") ?? null;
|
|
134
|
+
}
|
|
135
|
+
async function fileExists(filePath) {
|
|
136
|
+
try {
|
|
137
|
+
return (await fs.stat(filePath)).isFile();
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function walkWorkspace(rootPath, currentPath, warnings) {
|
|
147
|
+
const entries = [];
|
|
148
|
+
const dirents = await fs.readdir(currentPath, { withFileTypes: true });
|
|
149
|
+
for (const dirent of dirents) {
|
|
150
|
+
if (SKIPPED_ENTRY_NAMES.has(dirent.name)) {
|
|
151
|
+
const skippedPath = toPortableRelativePath(path.relative(rootPath, path.join(currentPath, dirent.name)));
|
|
152
|
+
warnings.push(`Skipped ${skippedPath}`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const absolutePath = path.join(currentPath, dirent.name);
|
|
156
|
+
const relativePath = assertSafeRelativePath(toPortableRelativePath(path.relative(rootPath, absolutePath)));
|
|
157
|
+
const stat = await fs.lstat(absolutePath);
|
|
158
|
+
if (stat.isSymbolicLink()) {
|
|
159
|
+
warnings.push(`Skipped symlink ${relativePath}`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (stat.isDirectory()) {
|
|
163
|
+
entries.push({
|
|
164
|
+
path: relativePath,
|
|
165
|
+
kind: "directory",
|
|
166
|
+
byteSize: 0,
|
|
167
|
+
mtimeMs: stat.mtimeMs,
|
|
168
|
+
mode: stat.mode,
|
|
169
|
+
sha256: null,
|
|
170
|
+
});
|
|
171
|
+
entries.push(...await walkWorkspace(rootPath, absolutePath, warnings));
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (stat.isFile()) {
|
|
175
|
+
const data = await fs.readFile(absolutePath);
|
|
176
|
+
entries.push({
|
|
177
|
+
path: relativePath,
|
|
178
|
+
kind: "file",
|
|
179
|
+
byteSize: data.byteLength,
|
|
180
|
+
mtimeMs: stat.mtimeMs,
|
|
181
|
+
mode: stat.mode,
|
|
182
|
+
sha256: sha256Buffer(data),
|
|
183
|
+
dataBase64: data.toString("base64"),
|
|
184
|
+
});
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
warnings.push(`Skipped unsupported file ${relativePath}`);
|
|
188
|
+
}
|
|
189
|
+
return entries;
|
|
190
|
+
}
|
|
191
|
+
function buildManifest(input) {
|
|
192
|
+
return {
|
|
193
|
+
version: input.artifact.version,
|
|
194
|
+
orgId: input.artifact.orgId,
|
|
195
|
+
instanceId: input.artifact.instanceId,
|
|
196
|
+
rootPath: input.artifact.rootPath,
|
|
197
|
+
createdAt: input.artifact.createdAt,
|
|
198
|
+
entryCount: input.artifact.entries.length,
|
|
199
|
+
fileCount: input.fileCount,
|
|
200
|
+
byteSize: input.byteSize,
|
|
201
|
+
treeSha256: input.treeSha256,
|
|
202
|
+
activeRunCount: input.activeRunCount,
|
|
203
|
+
warnings: input.artifact.warnings,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
export function workspaceBackupService(db) {
|
|
207
|
+
const orgs = organizationService(db);
|
|
208
|
+
async function getBackupRow(orgId, backupId) {
|
|
209
|
+
const [row] = await db
|
|
210
|
+
.select()
|
|
211
|
+
.from(workspaceBackups)
|
|
212
|
+
.where(and(eq(workspaceBackups.orgId, orgId), eq(workspaceBackups.id, backupId)));
|
|
213
|
+
if (!row || row.status === "deleted")
|
|
214
|
+
throw notFound("Workspace backup not found");
|
|
215
|
+
return row;
|
|
216
|
+
}
|
|
217
|
+
async function readArtifact(row) {
|
|
218
|
+
if (!(await fileExists(row.artifactRef))) {
|
|
219
|
+
throw notFound("Workspace backup artifact not found");
|
|
220
|
+
}
|
|
221
|
+
const raw = await fs.readFile(row.artifactRef, "utf8");
|
|
222
|
+
if (row.archiveSha256 && sha256Buffer(raw) !== row.archiveSha256) {
|
|
223
|
+
throw unprocessable("Workspace backup artifact checksum does not match the recorded backup metadata");
|
|
224
|
+
}
|
|
225
|
+
const parsed = JSON.parse(raw);
|
|
226
|
+
if (parsed.version !== ARTIFACT_VERSION || parsed.orgId !== row.orgId || !Array.isArray(parsed.entries)) {
|
|
227
|
+
throw unprocessable("Workspace backup artifact is invalid");
|
|
228
|
+
}
|
|
229
|
+
for (const entry of parsed.entries) {
|
|
230
|
+
assertSafeRelativePath(entry.path);
|
|
231
|
+
}
|
|
232
|
+
return parsed;
|
|
233
|
+
}
|
|
234
|
+
async function countActiveRuns(orgId) {
|
|
235
|
+
const [row] = await db
|
|
236
|
+
.select({ count: sql `count(*)::int` })
|
|
237
|
+
.from(heartbeatRuns)
|
|
238
|
+
.where(and(eq(heartbeatRuns.orgId, orgId), inArray(heartbeatRuns.status, [...ACTIVE_RUN_STATUSES])));
|
|
239
|
+
return row?.count ?? 0;
|
|
240
|
+
}
|
|
241
|
+
const service = {
|
|
242
|
+
async list(orgId) {
|
|
243
|
+
const organization = await orgs.getById(orgId);
|
|
244
|
+
if (!organization)
|
|
245
|
+
throw notFound("Organization not found");
|
|
246
|
+
const rows = await db
|
|
247
|
+
.select()
|
|
248
|
+
.from(workspaceBackups)
|
|
249
|
+
.where(and(eq(workspaceBackups.orgId, orgId), sql `${workspaceBackups.status} <> 'deleted'`))
|
|
250
|
+
.orderBy(desc(workspaceBackups.createdAt));
|
|
251
|
+
return rows.map(mapBackupRow);
|
|
252
|
+
},
|
|
253
|
+
async create(input) {
|
|
254
|
+
const organization = await orgs.getById(input.orgId);
|
|
255
|
+
if (!organization)
|
|
256
|
+
throw notFound("Organization not found");
|
|
257
|
+
const startedAt = new Date();
|
|
258
|
+
const expiresAt = addDays(startedAt, input.retentionDays ?? WORKSPACE_BACKUP_DEFAULT_RETENTION_DAYS);
|
|
259
|
+
const backupId = crypto.randomUUID();
|
|
260
|
+
const triggerSource = input.triggerSource ?? "manual";
|
|
261
|
+
const backupDir = path.resolve(resolveDefaultBackupDir(), "workspaces", input.orgId);
|
|
262
|
+
const artifactRef = path.resolve(backupDir, `workspace-${input.orgId}-${timestamp(startedAt)}-${backupId.slice(0, 8)}.json`);
|
|
263
|
+
await fs.mkdir(backupDir, { recursive: true });
|
|
264
|
+
const [runningRow] = await db
|
|
265
|
+
.insert(workspaceBackups)
|
|
266
|
+
.values({
|
|
267
|
+
id: backupId,
|
|
268
|
+
orgId: input.orgId,
|
|
269
|
+
status: "running",
|
|
270
|
+
triggerSource,
|
|
271
|
+
artifactProvider: "local_file",
|
|
272
|
+
artifactRef,
|
|
273
|
+
startedAt,
|
|
274
|
+
expiresAt,
|
|
275
|
+
createdByUserId: input.createdByUserId ?? null,
|
|
276
|
+
restoredFromBackupId: input.restoredFromBackupId ?? null,
|
|
277
|
+
})
|
|
278
|
+
.returning();
|
|
279
|
+
try {
|
|
280
|
+
const layout = await ensureOrganizationWorkspaceLayout(input.orgId);
|
|
281
|
+
const warnings = [];
|
|
282
|
+
const entries = await walkWorkspace(layout.root, layout.root, warnings);
|
|
283
|
+
const fileCount = entries.filter((entry) => entry.kind === "file").length;
|
|
284
|
+
const byteSize = entries.reduce((total, entry) => total + (entry.kind === "file" ? entry.byteSize : 0), 0);
|
|
285
|
+
const treeSha256 = buildTreeHash(entries);
|
|
286
|
+
const activeRunCount = await countActiveRuns(input.orgId);
|
|
287
|
+
const artifact = {
|
|
288
|
+
version: ARTIFACT_VERSION,
|
|
289
|
+
orgId: input.orgId,
|
|
290
|
+
instanceId: resolveRudderInstanceId(),
|
|
291
|
+
createdAt: startedAt.toISOString(),
|
|
292
|
+
rootPath: layout.root,
|
|
293
|
+
entries: entries.sort((left, right) => left.path.localeCompare(right.path)),
|
|
294
|
+
warnings,
|
|
295
|
+
};
|
|
296
|
+
const manifest = buildManifest({ artifact, fileCount, byteSize, treeSha256, activeRunCount });
|
|
297
|
+
const serialized = JSON.stringify(artifact, null, 2);
|
|
298
|
+
const archiveSha256 = sha256Buffer(serialized);
|
|
299
|
+
const tempArtifactRef = `${artifactRef}.tmp`;
|
|
300
|
+
await fs.writeFile(tempArtifactRef, serialized, { encoding: "utf8", mode: 0o600 });
|
|
301
|
+
await fs.rename(tempArtifactRef, artifactRef);
|
|
302
|
+
const stat = await fs.stat(artifactRef);
|
|
303
|
+
const finishedAt = new Date();
|
|
304
|
+
const [row] = await db
|
|
305
|
+
.update(workspaceBackups)
|
|
306
|
+
.set({
|
|
307
|
+
status: "succeeded",
|
|
308
|
+
archiveSha256,
|
|
309
|
+
treeSha256,
|
|
310
|
+
fileCount,
|
|
311
|
+
byteSize,
|
|
312
|
+
compressedSize: stat.size,
|
|
313
|
+
manifest,
|
|
314
|
+
warnings,
|
|
315
|
+
finishedAt,
|
|
316
|
+
updatedAt: finishedAt,
|
|
317
|
+
})
|
|
318
|
+
.where(eq(workspaceBackups.id, backupId))
|
|
319
|
+
.returning();
|
|
320
|
+
if (!row)
|
|
321
|
+
throw new Error("Workspace backup row was not updated.");
|
|
322
|
+
return mapBackupRow(row);
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
const finishedAt = new Date();
|
|
326
|
+
const [row] = await db
|
|
327
|
+
.update(workspaceBackups)
|
|
328
|
+
.set({
|
|
329
|
+
status: "failed",
|
|
330
|
+
error: error instanceof Error ? error.message : String(error),
|
|
331
|
+
finishedAt,
|
|
332
|
+
updatedAt: finishedAt,
|
|
333
|
+
})
|
|
334
|
+
.where(eq(workspaceBackups.id, backupId))
|
|
335
|
+
.returning();
|
|
336
|
+
if (row)
|
|
337
|
+
return mapBackupRow(row);
|
|
338
|
+
if (!runningRow)
|
|
339
|
+
throw new Error("Workspace backup row was not created.");
|
|
340
|
+
return mapBackupRow(runningRow);
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
async listFiles(orgId, backupId, directoryPath = "") {
|
|
344
|
+
const row = await getBackupRow(orgId, backupId);
|
|
345
|
+
const artifact = await readArtifact(row);
|
|
346
|
+
const normalizedPath = assertSafeRelativePath(directoryPath);
|
|
347
|
+
const entries = directChildrenFromArtifact(artifact, normalizedPath);
|
|
348
|
+
return {
|
|
349
|
+
source: "org_root",
|
|
350
|
+
rootPath: `backup:${backupId}`,
|
|
351
|
+
repoUrl: null,
|
|
352
|
+
directoryPath: normalizedPath,
|
|
353
|
+
rootExists: true,
|
|
354
|
+
entries,
|
|
355
|
+
message: entries.length === 0 ? "This backup folder is empty." : null,
|
|
356
|
+
};
|
|
357
|
+
},
|
|
358
|
+
async readFile(orgId, backupId, filePath) {
|
|
359
|
+
const row = await getBackupRow(orgId, backupId);
|
|
360
|
+
const artifact = await readArtifact(row);
|
|
361
|
+
const normalizedPath = assertSafeRelativePath(filePath);
|
|
362
|
+
const file = findArtifactFile(artifact, normalizedPath);
|
|
363
|
+
if (!file?.dataBase64)
|
|
364
|
+
throw notFound("File not found inside the workspace backup");
|
|
365
|
+
const buffer = Buffer.from(file.dataBase64, "base64");
|
|
366
|
+
if (isBinaryBuffer(buffer)) {
|
|
367
|
+
return {
|
|
368
|
+
source: "org_root",
|
|
369
|
+
rootPath: `backup:${backupId}`,
|
|
370
|
+
repoUrl: null,
|
|
371
|
+
filePath: normalizedPath,
|
|
372
|
+
rootExists: true,
|
|
373
|
+
content: null,
|
|
374
|
+
message: "Binary files are not previewed in workspace backups.",
|
|
375
|
+
truncated: false,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
const truncated = buffer.byteLength > MAX_PREVIEW_BYTES;
|
|
379
|
+
return {
|
|
380
|
+
source: "org_root",
|
|
381
|
+
rootPath: `backup:${backupId}`,
|
|
382
|
+
repoUrl: null,
|
|
383
|
+
filePath: normalizedPath,
|
|
384
|
+
rootExists: true,
|
|
385
|
+
content: buffer.subarray(0, MAX_PREVIEW_BYTES).toString("utf8"),
|
|
386
|
+
message: truncated ? "Preview truncated to the first 200 KB." : null,
|
|
387
|
+
truncated,
|
|
388
|
+
};
|
|
389
|
+
},
|
|
390
|
+
async remove(orgId, backupId) {
|
|
391
|
+
const row = await getBackupRow(orgId, backupId);
|
|
392
|
+
await fs.rm(row.artifactRef, { force: true });
|
|
393
|
+
const updatedAt = new Date();
|
|
394
|
+
const [updated] = await db
|
|
395
|
+
.update(workspaceBackups)
|
|
396
|
+
.set({ status: "deleted", updatedAt })
|
|
397
|
+
.where(eq(workspaceBackups.id, backupId))
|
|
398
|
+
.returning();
|
|
399
|
+
if (!updated)
|
|
400
|
+
throw notFound("Workspace backup not found");
|
|
401
|
+
return mapBackupRow(updated);
|
|
402
|
+
},
|
|
403
|
+
async pruneExpired(now = new Date()) {
|
|
404
|
+
const legacyCutoff = new Date(now.getTime() - WORKSPACE_BACKUP_DEFAULT_RETENTION_DAYS * 24 * 60 * 60 * 1000);
|
|
405
|
+
const rows = await db
|
|
406
|
+
.select()
|
|
407
|
+
.from(workspaceBackups)
|
|
408
|
+
.where(and(ne(workspaceBackups.status, "deleted"), ne(workspaceBackups.status, "running"), or(and(isNotNull(workspaceBackups.expiresAt), lte(workspaceBackups.expiresAt, now)), and(isNull(workspaceBackups.expiresAt), lte(workspaceBackups.createdAt, legacyCutoff)))));
|
|
409
|
+
const deleted = [];
|
|
410
|
+
for (const row of rows) {
|
|
411
|
+
deleted.push(await service.remove(row.orgId, row.id));
|
|
412
|
+
}
|
|
413
|
+
return deleted;
|
|
414
|
+
},
|
|
415
|
+
async runScheduledBackups(input) {
|
|
416
|
+
const now = input?.now ?? new Date();
|
|
417
|
+
const intervalMs = Math.max(60_000, Math.trunc(input?.intervalMs ?? WORKSPACE_BACKUP_DEFAULT_INTERVAL_MS));
|
|
418
|
+
const dueBefore = new Date(now.getTime() - intervalMs);
|
|
419
|
+
const deleted = await service.pruneExpired(now);
|
|
420
|
+
const organizations = (await orgs.list()).filter((organization) => organization.status === "active");
|
|
421
|
+
const created = [];
|
|
422
|
+
const failed = [];
|
|
423
|
+
const errors = [];
|
|
424
|
+
let skipped = 0;
|
|
425
|
+
for (const organization of organizations) {
|
|
426
|
+
try {
|
|
427
|
+
const [latest] = await db
|
|
428
|
+
.select()
|
|
429
|
+
.from(workspaceBackups)
|
|
430
|
+
.where(and(eq(workspaceBackups.orgId, organization.id), ne(workspaceBackups.status, "deleted")))
|
|
431
|
+
.orderBy(desc(workspaceBackups.createdAt))
|
|
432
|
+
.limit(1);
|
|
433
|
+
if (latest?.status === "running" || (latest && latest.createdAt > dueBefore)) {
|
|
434
|
+
skipped += 1;
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
const backup = await service.create({
|
|
438
|
+
orgId: organization.id,
|
|
439
|
+
triggerSource: "scheduled",
|
|
440
|
+
retentionDays: input?.retentionDays,
|
|
441
|
+
});
|
|
442
|
+
if (backup.status === "failed")
|
|
443
|
+
failed.push(backup);
|
|
444
|
+
else
|
|
445
|
+
created.push(backup);
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
errors.push({
|
|
449
|
+
orgId: organization.id,
|
|
450
|
+
message: error instanceof Error ? error.message : String(error),
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
return { created, failed, deleted, skipped, errors };
|
|
455
|
+
},
|
|
456
|
+
async restore(orgId, backupId, input) {
|
|
457
|
+
const row = await getBackupRow(orgId, backupId);
|
|
458
|
+
const activeRunCount = await countActiveRuns(orgId);
|
|
459
|
+
if (activeRunCount > 0) {
|
|
460
|
+
throw conflict("Workspace restore is blocked while this organization has active runs.", { activeRunCount });
|
|
461
|
+
}
|
|
462
|
+
const artifact = await readArtifact(row);
|
|
463
|
+
const preRestoreBackup = await service.create({
|
|
464
|
+
orgId,
|
|
465
|
+
triggerSource: "pre_restore",
|
|
466
|
+
createdByUserId: input?.createdByUserId ?? null,
|
|
467
|
+
restoredFromBackupId: backupId,
|
|
468
|
+
});
|
|
469
|
+
if (preRestoreBackup.status !== "succeeded") {
|
|
470
|
+
throw conflict("Pre-restore backup failed; workspace was not changed.", { backupId: preRestoreBackup.id });
|
|
471
|
+
}
|
|
472
|
+
const activeRunCountAfterPreRestore = await countActiveRuns(orgId);
|
|
473
|
+
if (activeRunCountAfterPreRestore > 0) {
|
|
474
|
+
throw conflict("Workspace restore is blocked while this organization has active runs.", {
|
|
475
|
+
activeRunCount: activeRunCountAfterPreRestore,
|
|
476
|
+
preRestoreBackupId: preRestoreBackup.id,
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
const workspaceRoot = resolveOrganizationWorkspaceRoot(orgId);
|
|
480
|
+
const stagingRoot = path.resolve(resolveDefaultBackupDir(), "workspace-restore-staging", `${orgId}-${backupId}-${Date.now()}`);
|
|
481
|
+
await fs.rm(stagingRoot, { recursive: true, force: true });
|
|
482
|
+
await fs.mkdir(stagingRoot, { recursive: true, mode: 0o700 });
|
|
483
|
+
try {
|
|
484
|
+
const directories = artifact.entries.filter((entry) => entry.kind === "directory");
|
|
485
|
+
const files = artifact.entries.filter((entry) => entry.kind === "file");
|
|
486
|
+
for (const entry of directories) {
|
|
487
|
+
const { resolvedTarget } = resolveWithinRoot(stagingRoot, entry.path);
|
|
488
|
+
await fs.mkdir(resolvedTarget, { recursive: true });
|
|
489
|
+
}
|
|
490
|
+
for (const entry of files) {
|
|
491
|
+
const { resolvedTarget } = resolveWithinRoot(stagingRoot, entry.path);
|
|
492
|
+
await fs.mkdir(path.dirname(resolvedTarget), { recursive: true });
|
|
493
|
+
await fs.writeFile(resolvedTarget, Buffer.from(entry.dataBase64 ?? "", "base64"), { mode: entry.mode ?? 0o600 });
|
|
494
|
+
}
|
|
495
|
+
await fs.rm(workspaceRoot, { recursive: true, force: true });
|
|
496
|
+
await fs.mkdir(path.dirname(workspaceRoot), { recursive: true });
|
|
497
|
+
await fs.rename(stagingRoot, workspaceRoot);
|
|
498
|
+
await ensureOrganizationWorkspaceLayout(orgId);
|
|
499
|
+
}
|
|
500
|
+
finally {
|
|
501
|
+
await fs.rm(stagingRoot, { recursive: true, force: true });
|
|
502
|
+
}
|
|
503
|
+
const updatedAt = new Date();
|
|
504
|
+
const [restoredRow] = await db
|
|
505
|
+
.update(workspaceBackups)
|
|
506
|
+
.set({ status: "restored", updatedAt })
|
|
507
|
+
.where(eq(workspaceBackups.id, backupId))
|
|
508
|
+
.returning();
|
|
509
|
+
if (!restoredRow)
|
|
510
|
+
throw notFound("Workspace backup not found");
|
|
511
|
+
return {
|
|
512
|
+
restoredBackup: mapBackupRow(restoredRow),
|
|
513
|
+
preRestoreBackup,
|
|
514
|
+
};
|
|
515
|
+
},
|
|
516
|
+
};
|
|
517
|
+
return service;
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=workspace-backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-backups.js","sourceRoot":"","sources":["../../src/services/workspace-backups.ts"],"names":[],"mappings":"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"}
|
|
@@ -126,13 +126,13 @@ export declare function listWorkspaceRuntimeServicesForProjectWorkspaces(db: Db,
|
|
|
126
126
|
executionWorkspaceId: string | null;
|
|
127
127
|
startedAt: Date;
|
|
128
128
|
createdAt: Date;
|
|
129
|
+
ownerAgentId: string | null;
|
|
129
130
|
scopeType: string;
|
|
130
131
|
scopeId: string | null;
|
|
131
132
|
provider: string;
|
|
132
133
|
cwd: string | null;
|
|
133
|
-
healthStatus: string;
|
|
134
|
-
ownerAgentId: string | null;
|
|
135
134
|
issueId: string | null;
|
|
135
|
+
healthStatus: string;
|
|
136
136
|
command: string | null;
|
|
137
137
|
port: number | null;
|
|
138
138
|
lastUsedAt: Date;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rudderhq/server",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"homepage": "https://github.com/Undertone0809/rudder",
|
|
6
6
|
"bugs": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"dev": "tsx src/index.ts",
|
|
37
37
|
"dev:watch": "cross-env RUDDER_MIGRATION_PROMPT=never RUDDER_MIGRATION_AUTO_APPLY=true tsx watch --ignore ../ui/node_modules --ignore ../ui/.vite --ignore ../ui/dist src/index.ts",
|
|
38
38
|
"prepare:ui-dist": "bash ../scripts/prepare-server-ui-dist.sh",
|
|
39
|
-
"build": "node ../scripts/build-tsc-copy-assets.mjs --copy src/onboarding-assets dist/onboarding-assets",
|
|
39
|
+
"build": "pnpm --filter @rudderhq/plugin-sdk build && pnpm --filter @rudderhq/plugin-linear build && node ../scripts/build-tsc-copy-assets.mjs --copy src/onboarding-assets dist/onboarding-assets && node ../scripts/stage-bundled-plugins.mjs",
|
|
40
40
|
"prepack": "pnpm run prepare:ui-dist",
|
|
41
41
|
"postpack": "rm -rf ui-dist",
|
|
42
42
|
"clean": "rm -rf dist",
|
|
@@ -49,18 +49,18 @@
|
|
|
49
49
|
"@langfuse/otel": "^5.1.0",
|
|
50
50
|
"@langfuse/tracing": "^5.1.0",
|
|
51
51
|
"@opentelemetry/sdk-trace-node": "^2.1.0",
|
|
52
|
-
"@rudderhq/agent-runtime-claude-local": "0.1.0
|
|
53
|
-
"@rudderhq/agent-runtime-codex-local": "0.1.0
|
|
54
|
-
"@rudderhq/agent-runtime-cursor-local": "0.1.0
|
|
55
|
-
"@rudderhq/agent-runtime-gemini-local": "0.1.0
|
|
56
|
-
"@rudderhq/agent-runtime-openclaw-gateway": "0.1.0
|
|
57
|
-
"@rudderhq/agent-runtime-opencode-local": "0.1.0
|
|
58
|
-
"@rudderhq/agent-runtime-pi-local": "0.1.0
|
|
59
|
-
"@rudderhq/agent-runtime-utils": "0.1.0
|
|
60
|
-
"@rudderhq/db": "0.1.0
|
|
61
|
-
"@rudderhq/plugin-sdk": "0.1.0
|
|
62
|
-
"@rudderhq/run-intelligence-core": "0.1.0
|
|
63
|
-
"@rudderhq/shared": "0.1.0
|
|
52
|
+
"@rudderhq/agent-runtime-claude-local": "0.1.0",
|
|
53
|
+
"@rudderhq/agent-runtime-codex-local": "0.1.0",
|
|
54
|
+
"@rudderhq/agent-runtime-cursor-local": "0.1.0",
|
|
55
|
+
"@rudderhq/agent-runtime-gemini-local": "0.1.0",
|
|
56
|
+
"@rudderhq/agent-runtime-openclaw-gateway": "0.1.0",
|
|
57
|
+
"@rudderhq/agent-runtime-opencode-local": "0.1.0",
|
|
58
|
+
"@rudderhq/agent-runtime-pi-local": "0.1.0",
|
|
59
|
+
"@rudderhq/agent-runtime-utils": "0.1.0",
|
|
60
|
+
"@rudderhq/db": "0.1.0",
|
|
61
|
+
"@rudderhq/plugin-sdk": "0.1.0",
|
|
62
|
+
"@rudderhq/run-intelligence-core": "0.1.0",
|
|
63
|
+
"@rudderhq/shared": "0.1.0",
|
|
64
64
|
"ajv": "^8.18.0",
|
|
65
65
|
"ajv-formats": "^3.0.1",
|
|
66
66
|
"better-auth": "1.4.18",
|
|
@@ -71,12 +71,13 @@ Raw timeline of events -- the "when" layer.
|
|
|
71
71
|
- Write continuously during conversations.
|
|
72
72
|
- Extract durable facts to Layer 1 during heartbeats.
|
|
73
73
|
|
|
74
|
-
### Layer 3: Tacit Knowledge (`$AGENT_HOME/MEMORY.md`)
|
|
74
|
+
### Layer 3: Tacit Knowledge (`$AGENT_HOME/instructions/MEMORY.md`)
|
|
75
75
|
|
|
76
76
|
How the user operates -- patterns, preferences, lessons learned.
|
|
77
77
|
|
|
78
78
|
- Not facts about the world; facts about the user.
|
|
79
79
|
- Update whenever you learn new operating patterns.
|
|
80
|
+
- This file is part of the instruction bundle and is automatically loaded at runtime when present.
|
|
80
81
|
|
|
81
82
|
## Write It Down -- No Mental Notes
|
|
82
83
|
|
|
@@ -84,6 +85,7 @@ Memory does not survive session restarts. Files do.
|
|
|
84
85
|
|
|
85
86
|
- Want to remember something -> WRITE IT TO A FILE.
|
|
86
87
|
- "Remember this" -> update `$AGENT_HOME/memory/YYYY-MM-DD.md` or the relevant entity file.
|
|
88
|
+
- Stable user preferences or operating lessons -> update `$AGENT_HOME/instructions/MEMORY.md`.
|
|
87
89
|
- Learn a lesson -> update AGENTS.md, TOOLS.md, or the relevant skill file.
|
|
88
90
|
- Make a mistake -> document it so future-you does not repeat it.
|
|
89
91
|
- On-disk text files are always better than holding it in temporary context.
|