@a5c-ai/babysitter-sdk 0.0.16
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/cli/main.d.ts +5 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +1343 -0
- package/dist/cli/nodeTaskRunner.d.ts +16 -0
- package/dist/cli/nodeTaskRunner.d.ts.map +1 -0
- package/dist/cli/nodeTaskRunner.js +46 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/runner/env.d.ts +58 -0
- package/dist/runner/env.d.ts.map +1 -0
- package/dist/runner/env.js +113 -0
- package/dist/runner/index.d.ts +3 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +18 -0
- package/dist/runner/nodeRunner.d.ts +60 -0
- package/dist/runner/nodeRunner.d.ts.map +1 -0
- package/dist/runner/nodeRunner.js +354 -0
- package/dist/runtime/commitEffectResult.d.ts +3 -0
- package/dist/runtime/commitEffectResult.d.ts.map +1 -0
- package/dist/runtime/commitEffectResult.js +172 -0
- package/dist/runtime/constants.d.ts +2 -0
- package/dist/runtime/constants.d.ts.map +1 -0
- package/dist/runtime/constants.js +5 -0
- package/dist/runtime/createRun.d.ts +3 -0
- package/dist/runtime/createRun.d.ts.map +1 -0
- package/dist/runtime/createRun.js +81 -0
- package/dist/runtime/errorUtils.d.ts +10 -0
- package/dist/runtime/errorUtils.d.ts.map +1 -0
- package/dist/runtime/errorUtils.js +42 -0
- package/dist/runtime/exceptions.d.ts +45 -0
- package/dist/runtime/exceptions.d.ts.map +1 -0
- package/dist/runtime/exceptions.js +99 -0
- package/dist/runtime/index.d.ts +12 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +34 -0
- package/dist/runtime/instrumentation.d.ts +6 -0
- package/dist/runtime/instrumentation.d.ts.map +1 -0
- package/dist/runtime/instrumentation.js +14 -0
- package/dist/runtime/intrinsics/breakpoint.d.ts +4 -0
- package/dist/runtime/intrinsics/breakpoint.d.ts.map +1 -0
- package/dist/runtime/intrinsics/breakpoint.js +42 -0
- package/dist/runtime/intrinsics/index.d.ts +7 -0
- package/dist/runtime/intrinsics/index.d.ts.map +1 -0
- package/dist/runtime/intrinsics/index.js +15 -0
- package/dist/runtime/intrinsics/orchestratorTask.d.ts +4 -0
- package/dist/runtime/intrinsics/orchestratorTask.d.ts.map +1 -0
- package/dist/runtime/intrinsics/orchestratorTask.js +28 -0
- package/dist/runtime/intrinsics/parallel.d.ts +5 -0
- package/dist/runtime/intrinsics/parallel.d.ts.map +1 -0
- package/dist/runtime/intrinsics/parallel.js +45 -0
- package/dist/runtime/intrinsics/sleep.d.ts +4 -0
- package/dist/runtime/intrinsics/sleep.d.ts.map +1 -0
- package/dist/runtime/intrinsics/sleep.js +70 -0
- package/dist/runtime/intrinsics/task.d.ts +20 -0
- package/dist/runtime/intrinsics/task.d.ts.map +1 -0
- package/dist/runtime/intrinsics/task.js +237 -0
- package/dist/runtime/invocation/hashInvocationKey.d.ts +12 -0
- package/dist/runtime/invocation/hashInvocationKey.d.ts.map +1 -0
- package/dist/runtime/invocation/hashInvocationKey.js +12 -0
- package/dist/runtime/invocation/index.d.ts +3 -0
- package/dist/runtime/invocation/index.d.ts.map +1 -0
- package/dist/runtime/invocation/index.js +5 -0
- package/dist/runtime/orchestrateIteration.d.ts +3 -0
- package/dist/runtime/orchestrateIteration.d.ts.map +1 -0
- package/dist/runtime/orchestrateIteration.js +195 -0
- package/dist/runtime/processContext.d.ts +19 -0
- package/dist/runtime/processContext.d.ts.map +1 -0
- package/dist/runtime/processContext.js +55 -0
- package/dist/runtime/replay/createReplayEngine.d.ts +31 -0
- package/dist/runtime/replay/createReplayEngine.d.ts.map +1 -0
- package/dist/runtime/replay/createReplayEngine.js +82 -0
- package/dist/runtime/replay/effectIndex.d.ts +34 -0
- package/dist/runtime/replay/effectIndex.d.ts.map +1 -0
- package/dist/runtime/replay/effectIndex.js +241 -0
- package/dist/runtime/replay/index.d.ts +7 -0
- package/dist/runtime/replay/index.d.ts.map +1 -0
- package/dist/runtime/replay/index.js +19 -0
- package/dist/runtime/replay/replayCursor.d.ts +7 -0
- package/dist/runtime/replay/replayCursor.d.ts.map +1 -0
- package/dist/runtime/replay/replayCursor.js +22 -0
- package/dist/runtime/replay/stateCache.d.ts +48 -0
- package/dist/runtime/replay/stateCache.d.ts.map +1 -0
- package/dist/runtime/replay/stateCache.js +211 -0
- package/dist/runtime/types.d.ts +147 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/storage/atomic.d.ts +2 -0
- package/dist/storage/atomic.d.ts.map +1 -0
- package/dist/storage/atomic.js +54 -0
- package/dist/storage/cleanup.d.ts +4 -0
- package/dist/storage/cleanup.d.ts.map +1 -0
- package/dist/storage/cleanup.js +96 -0
- package/dist/storage/clock.d.ts +6 -0
- package/dist/storage/clock.d.ts.map +1 -0
- package/dist/storage/clock.js +29 -0
- package/dist/storage/createRunDir.d.ts +6 -0
- package/dist/storage/createRunDir.d.ts.map +1 -0
- package/dist/storage/createRunDir.js +59 -0
- package/dist/storage/index.d.ts +9 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +28 -0
- package/dist/storage/journal.d.ts +4 -0
- package/dist/storage/journal.d.ts.map +1 -0
- package/dist/storage/journal.js +103 -0
- package/dist/storage/lock.d.ts +5 -0
- package/dist/storage/lock.d.ts.map +1 -0
- package/dist/storage/lock.js +41 -0
- package/dist/storage/paths.d.ts +19 -0
- package/dist/storage/paths.d.ts.map +1 -0
- package/dist/storage/paths.js +46 -0
- package/dist/storage/runFiles.d.ts +5 -0
- package/dist/storage/runFiles.d.ts.map +1 -0
- package/dist/storage/runFiles.js +39 -0
- package/dist/storage/snapshotState.d.ts +10 -0
- package/dist/storage/snapshotState.d.ts.map +1 -0
- package/dist/storage/snapshotState.js +15 -0
- package/dist/storage/storeTaskArtifacts.d.ts +6 -0
- package/dist/storage/storeTaskArtifacts.d.ts.map +1 -0
- package/dist/storage/storeTaskArtifacts.js +58 -0
- package/dist/storage/tasks.d.ts +17 -0
- package/dist/storage/tasks.d.ts.map +1 -0
- package/dist/storage/tasks.js +82 -0
- package/dist/storage/types.d.ts +112 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/ulids.d.ts +11 -0
- package/dist/storage/ulids.d.ts.map +1 -0
- package/dist/storage/ulids.js +25 -0
- package/dist/tasks/batching.d.ts +29 -0
- package/dist/tasks/batching.d.ts.map +1 -0
- package/dist/tasks/batching.js +66 -0
- package/dist/tasks/context.d.ts +11 -0
- package/dist/tasks/context.d.ts.map +1 -0
- package/dist/tasks/context.js +181 -0
- package/dist/tasks/defineTask.d.ts +9 -0
- package/dist/tasks/defineTask.d.ts.map +1 -0
- package/dist/tasks/defineTask.js +58 -0
- package/dist/tasks/index.d.ts +8 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +23 -0
- package/dist/tasks/kinds/index.d.ts +7 -0
- package/dist/tasks/kinds/index.d.ts.map +1 -0
- package/dist/tasks/kinds/index.js +333 -0
- package/dist/tasks/registry.d.ts +53 -0
- package/dist/tasks/registry.d.ts.map +1 -0
- package/dist/tasks/registry.js +145 -0
- package/dist/tasks/serializer.d.ts +60 -0
- package/dist/tasks/serializer.d.ts.map +1 -0
- package/dist/tasks/serializer.js +193 -0
- package/dist/tasks/types.d.ts +148 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +2 -0
- package/dist/test-fixtures/kinds/index.d.ts +56 -0
- package/dist/test-fixtures/kinds/index.d.ts.map +1 -0
- package/dist/test-fixtures/kinds/index.js +44 -0
- package/dist/testing/deterministic.d.ts +90 -0
- package/dist/testing/deterministic.d.ts.map +1 -0
- package/dist/testing/deterministic.js +449 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +23 -0
- package/dist/testing/runHarness.d.ts +64 -0
- package/dist/testing/runHarness.d.ts.map +1 -0
- package/dist/testing/runHarness.js +161 -0
- package/dist/testing/snapshots.d.ts +17 -0
- package/dist/testing/snapshots.d.ts.map +1 -0
- package/dist/testing/snapshots.js +24 -0
- package/package.json +35 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeTaskResult = exports.readTaskResult = exports.readTaskDefinition = exports.writeTaskDefinition = exports.writeRunOutput = exports.readRunInputs = exports.readRunMetadata = exports.readRunLock = exports.releaseRunLock = exports.acquireRunLock = exports.findOrphanedBlobs = exports.getDiskUsage = exports.storeTaskArtifacts = exports.snapshotState = exports.loadJournal = exports.appendEvent = exports.createRunDir = void 0;
|
|
4
|
+
var createRunDir_1 = require("./createRunDir");
|
|
5
|
+
Object.defineProperty(exports, "createRunDir", { enumerable: true, get: function () { return createRunDir_1.createRunDir; } });
|
|
6
|
+
var journal_1 = require("./journal");
|
|
7
|
+
Object.defineProperty(exports, "appendEvent", { enumerable: true, get: function () { return journal_1.appendEvent; } });
|
|
8
|
+
Object.defineProperty(exports, "loadJournal", { enumerable: true, get: function () { return journal_1.loadJournal; } });
|
|
9
|
+
var snapshotState_1 = require("./snapshotState");
|
|
10
|
+
Object.defineProperty(exports, "snapshotState", { enumerable: true, get: function () { return snapshotState_1.snapshotState; } });
|
|
11
|
+
var storeTaskArtifacts_1 = require("./storeTaskArtifacts");
|
|
12
|
+
Object.defineProperty(exports, "storeTaskArtifacts", { enumerable: true, get: function () { return storeTaskArtifacts_1.storeTaskArtifacts; } });
|
|
13
|
+
var cleanup_1 = require("./cleanup");
|
|
14
|
+
Object.defineProperty(exports, "getDiskUsage", { enumerable: true, get: function () { return cleanup_1.getDiskUsage; } });
|
|
15
|
+
Object.defineProperty(exports, "findOrphanedBlobs", { enumerable: true, get: function () { return cleanup_1.findOrphanedBlobs; } });
|
|
16
|
+
var lock_1 = require("./lock");
|
|
17
|
+
Object.defineProperty(exports, "acquireRunLock", { enumerable: true, get: function () { return lock_1.acquireRunLock; } });
|
|
18
|
+
Object.defineProperty(exports, "releaseRunLock", { enumerable: true, get: function () { return lock_1.releaseRunLock; } });
|
|
19
|
+
Object.defineProperty(exports, "readRunLock", { enumerable: true, get: function () { return lock_1.readRunLock; } });
|
|
20
|
+
var runFiles_1 = require("./runFiles");
|
|
21
|
+
Object.defineProperty(exports, "readRunMetadata", { enumerable: true, get: function () { return runFiles_1.readRunMetadata; } });
|
|
22
|
+
Object.defineProperty(exports, "readRunInputs", { enumerable: true, get: function () { return runFiles_1.readRunInputs; } });
|
|
23
|
+
Object.defineProperty(exports, "writeRunOutput", { enumerable: true, get: function () { return runFiles_1.writeRunOutput; } });
|
|
24
|
+
var tasks_1 = require("./tasks");
|
|
25
|
+
Object.defineProperty(exports, "writeTaskDefinition", { enumerable: true, get: function () { return tasks_1.writeTaskDefinition; } });
|
|
26
|
+
Object.defineProperty(exports, "readTaskDefinition", { enumerable: true, get: function () { return tasks_1.readTaskDefinition; } });
|
|
27
|
+
Object.defineProperty(exports, "readTaskResult", { enumerable: true, get: function () { return tasks_1.readTaskResult; } });
|
|
28
|
+
Object.defineProperty(exports, "writeTaskResult", { enumerable: true, get: function () { return tasks_1.writeTaskResult; } });
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { AppendEventOptions, AppendEventResult, JournalEvent } from "./types";
|
|
2
|
+
export declare function appendEvent(opts: AppendEventOptions): Promise<AppendEventResult>;
|
|
3
|
+
export declare function loadJournal(runDir: string): Promise<JournalEvent[]>;
|
|
4
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/storage/journal.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAc,MAAM,SAAS,CAAC;AAuB1F,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBtF;AAWD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6BzE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.appendEvent = appendEvent;
|
|
7
|
+
exports.loadJournal = loadJournal;
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
const paths_1 = require("./paths");
|
|
12
|
+
const atomic_1 = require("./atomic");
|
|
13
|
+
const ulids_1 = require("./ulids");
|
|
14
|
+
const clock_1 = require("./clock");
|
|
15
|
+
function formatSeq(seq) {
|
|
16
|
+
return seq.toString().padStart(6, "0");
|
|
17
|
+
}
|
|
18
|
+
async function getExistingSeqs(journalDir) {
|
|
19
|
+
try {
|
|
20
|
+
const entries = await fs_1.promises.readdir(journalDir);
|
|
21
|
+
return entries
|
|
22
|
+
.map((name) => Number(name.split(".")[0]))
|
|
23
|
+
.filter((n) => Number.isFinite(n));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const err = error;
|
|
27
|
+
if (err.code === "ENOENT")
|
|
28
|
+
return [];
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function appendEvent(opts) {
|
|
33
|
+
const journalDir = (0, paths_1.getJournalDir)(opts.runDir);
|
|
34
|
+
await fs_1.promises.mkdir(journalDir, { recursive: true });
|
|
35
|
+
const seqs = await getExistingSeqs(journalDir);
|
|
36
|
+
const seq = (seqs.length ? Math.max(...seqs) : 0) + 1;
|
|
37
|
+
const ulid = (0, ulids_1.nextUlid)();
|
|
38
|
+
const filename = `${formatSeq(seq)}.${ulid}.json`;
|
|
39
|
+
const recordedAt = (0, clock_1.getClockIsoString)();
|
|
40
|
+
const eventPayload = {
|
|
41
|
+
type: opts.eventType,
|
|
42
|
+
recordedAt,
|
|
43
|
+
data: opts.event,
|
|
44
|
+
};
|
|
45
|
+
const contents = JSON.stringify(eventPayload, null, 2) + "\n";
|
|
46
|
+
const checksum = crypto_1.default.createHash("sha256").update(contents).digest("hex");
|
|
47
|
+
const payloadWithChecksum = JSON.stringify({ ...eventPayload, checksum }, null, 2) + "\n";
|
|
48
|
+
const targetPath = path_1.default.join(journalDir, filename);
|
|
49
|
+
await (0, atomic_1.writeFileAtomic)(targetPath, payloadWithChecksum);
|
|
50
|
+
return { seq, ulid, filename, checksum, path: targetPath, recordedAt };
|
|
51
|
+
}
|
|
52
|
+
function parseJournalFilename(filename) {
|
|
53
|
+
const [seqPart, ulidPart] = filename.replace(/\.json$/i, "").split(".");
|
|
54
|
+
const seq = Number(seqPart);
|
|
55
|
+
if (!Number.isFinite(seq) || !ulidPart) {
|
|
56
|
+
throw new Error(`Invalid journal filename: ${filename}`);
|
|
57
|
+
}
|
|
58
|
+
return { seq, ulid: ulidPart };
|
|
59
|
+
}
|
|
60
|
+
async function loadJournal(runDir) {
|
|
61
|
+
const journalDir = (0, paths_1.getJournalDir)(runDir);
|
|
62
|
+
try {
|
|
63
|
+
const entries = await fs_1.promises.readdir(journalDir);
|
|
64
|
+
const sorted = entries
|
|
65
|
+
.filter((name) => name.endsWith(".json"))
|
|
66
|
+
.sort();
|
|
67
|
+
const events = [];
|
|
68
|
+
for (const file of sorted) {
|
|
69
|
+
const { seq, ulid } = parseJournalFilename(file);
|
|
70
|
+
const fullPath = path_1.default.join(journalDir, file);
|
|
71
|
+
const raw = await parseJournalFile(fullPath);
|
|
72
|
+
events.push({
|
|
73
|
+
seq,
|
|
74
|
+
ulid,
|
|
75
|
+
filename: file,
|
|
76
|
+
path: fullPath,
|
|
77
|
+
type: raw.type,
|
|
78
|
+
recordedAt: typeof raw.recordedAt === "string" ? raw.recordedAt : (0, clock_1.getClockIsoString)(),
|
|
79
|
+
data: (raw.data ?? {}),
|
|
80
|
+
checksum: typeof raw.checksum === "string" ? raw.checksum : undefined,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return events;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const err = error;
|
|
87
|
+
if (err.code === "ENOENT")
|
|
88
|
+
return [];
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function parseJournalFile(fullPath) {
|
|
93
|
+
const contents = await fs_1.promises.readFile(fullPath, "utf8");
|
|
94
|
+
try {
|
|
95
|
+
return JSON.parse(contents);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const parseError = new Error(`Failed to parse journal file ${fullPath}: ${error.message}`);
|
|
99
|
+
parseError.code = "JOURNAL_PARSE_FAILED";
|
|
100
|
+
parseError.path = fullPath;
|
|
101
|
+
throw parseError;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RunLockInfo } from "./types";
|
|
2
|
+
export declare function acquireRunLock(runDir: string, owner: string): Promise<RunLockInfo>;
|
|
3
|
+
export declare function releaseRunLock(runDir: string): Promise<void>;
|
|
4
|
+
export declare function readRunLock(runDir: string): Promise<RunLockInfo | null>;
|
|
5
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/storage/lock.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAcxF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,iBAGlD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAU7E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.acquireRunLock = acquireRunLock;
|
|
4
|
+
exports.releaseRunLock = releaseRunLock;
|
|
5
|
+
exports.readRunLock = readRunLock;
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const paths_1 = require("./paths");
|
|
8
|
+
const clock_1 = require("./clock");
|
|
9
|
+
async function acquireRunLock(runDir, owner) {
|
|
10
|
+
const lockPath = (0, paths_1.getLockPath)(runDir);
|
|
11
|
+
const lockInfo = { pid: process.pid, owner, acquiredAt: (0, clock_1.getClockIsoString)() };
|
|
12
|
+
try {
|
|
13
|
+
await fs_1.promises.writeFile(lockPath, JSON.stringify(lockInfo, null, 2) + "\n", { flag: "wx" });
|
|
14
|
+
return lockInfo;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const err = error;
|
|
18
|
+
if (err.code === "EEXIST") {
|
|
19
|
+
const existing = JSON.parse(await fs_1.promises.readFile(lockPath, "utf8"));
|
|
20
|
+
throw new Error(`run.lock already held by pid ${existing.pid} (${existing.owner})`);
|
|
21
|
+
}
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function releaseRunLock(runDir) {
|
|
26
|
+
const lockPath = (0, paths_1.getLockPath)(runDir);
|
|
27
|
+
await fs_1.promises.rm(lockPath, { force: true });
|
|
28
|
+
}
|
|
29
|
+
async function readRunLock(runDir) {
|
|
30
|
+
const lockPath = (0, paths_1.getLockPath)(runDir);
|
|
31
|
+
try {
|
|
32
|
+
const data = await fs_1.promises.readFile(lockPath, "utf8");
|
|
33
|
+
return JSON.parse(data);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const err = error;
|
|
37
|
+
if (err.code === "ENOENT")
|
|
38
|
+
return null;
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const JOURNAL_DIR = "journal";
|
|
2
|
+
export declare const TASKS_DIR = "tasks";
|
|
3
|
+
export declare const BLOBS_DIR = "blobs";
|
|
4
|
+
export declare const STATE_DIR = "state";
|
|
5
|
+
export declare const ORPHANED_DIR = "orphaned";
|
|
6
|
+
export declare const PROCESS_DIR = "process";
|
|
7
|
+
export declare const RUN_METADATA_FILE = "run.json";
|
|
8
|
+
export declare const INPUTS_FILE = "inputs.json";
|
|
9
|
+
export declare const LOCK_FILE = "run.lock";
|
|
10
|
+
export declare const STATE_FILE = "state.json";
|
|
11
|
+
export declare const DEFAULT_LAYOUT_VERSION = "2026.01-storage-preview";
|
|
12
|
+
export declare function getRunDir(runsRoot: string, runId: string): string;
|
|
13
|
+
export declare function getJournalDir(runDir: string): string;
|
|
14
|
+
export declare function getTasksDir(runDir: string): string;
|
|
15
|
+
export declare function getBlobsDir(runDir: string): string;
|
|
16
|
+
export declare function getStateDir(runDir: string): string;
|
|
17
|
+
export declare function getStateFile(runDir: string): string;
|
|
18
|
+
export declare function getLockPath(runDir: string): string;
|
|
19
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,UAAU,eAAe,CAAC;AAEvC,eAAO,MAAM,sBAAsB,4BAA4B,CAAC;AAEhE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_LAYOUT_VERSION = exports.STATE_FILE = exports.LOCK_FILE = exports.INPUTS_FILE = exports.RUN_METADATA_FILE = exports.PROCESS_DIR = exports.ORPHANED_DIR = exports.STATE_DIR = exports.BLOBS_DIR = exports.TASKS_DIR = exports.JOURNAL_DIR = void 0;
|
|
7
|
+
exports.getRunDir = getRunDir;
|
|
8
|
+
exports.getJournalDir = getJournalDir;
|
|
9
|
+
exports.getTasksDir = getTasksDir;
|
|
10
|
+
exports.getBlobsDir = getBlobsDir;
|
|
11
|
+
exports.getStateDir = getStateDir;
|
|
12
|
+
exports.getStateFile = getStateFile;
|
|
13
|
+
exports.getLockPath = getLockPath;
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
exports.JOURNAL_DIR = "journal";
|
|
16
|
+
exports.TASKS_DIR = "tasks";
|
|
17
|
+
exports.BLOBS_DIR = "blobs";
|
|
18
|
+
exports.STATE_DIR = "state";
|
|
19
|
+
exports.ORPHANED_DIR = "orphaned";
|
|
20
|
+
exports.PROCESS_DIR = "process";
|
|
21
|
+
exports.RUN_METADATA_FILE = "run.json";
|
|
22
|
+
exports.INPUTS_FILE = "inputs.json";
|
|
23
|
+
exports.LOCK_FILE = "run.lock";
|
|
24
|
+
exports.STATE_FILE = "state.json";
|
|
25
|
+
exports.DEFAULT_LAYOUT_VERSION = "2026.01-storage-preview";
|
|
26
|
+
function getRunDir(runsRoot, runId) {
|
|
27
|
+
return path_1.default.join(runsRoot, runId);
|
|
28
|
+
}
|
|
29
|
+
function getJournalDir(runDir) {
|
|
30
|
+
return path_1.default.join(runDir, exports.JOURNAL_DIR);
|
|
31
|
+
}
|
|
32
|
+
function getTasksDir(runDir) {
|
|
33
|
+
return path_1.default.join(runDir, exports.TASKS_DIR);
|
|
34
|
+
}
|
|
35
|
+
function getBlobsDir(runDir) {
|
|
36
|
+
return path_1.default.join(runDir, exports.BLOBS_DIR);
|
|
37
|
+
}
|
|
38
|
+
function getStateDir(runDir) {
|
|
39
|
+
return path_1.default.join(runDir, exports.STATE_DIR);
|
|
40
|
+
}
|
|
41
|
+
function getStateFile(runDir) {
|
|
42
|
+
return path_1.default.join(getStateDir(runDir), exports.STATE_FILE);
|
|
43
|
+
}
|
|
44
|
+
function getLockPath(runDir) {
|
|
45
|
+
return path_1.default.join(runDir, exports.LOCK_FILE);
|
|
46
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RunMetadata } from "./types";
|
|
2
|
+
export declare function readRunMetadata(runDir: string): Promise<RunMetadata>;
|
|
3
|
+
export declare function readRunInputs(runDir: string): Promise<unknown | undefined>;
|
|
4
|
+
export declare function writeRunOutput(runDir: string, output: unknown): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=runFiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runFiles.d.ts","sourceRoot":"","sources":["../../src/storage/runFiles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKtC,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAI1E;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAYhF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,mBAMnE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readRunMetadata = readRunMetadata;
|
|
7
|
+
exports.readRunInputs = readRunInputs;
|
|
8
|
+
exports.writeRunOutput = writeRunOutput;
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const paths_1 = require("./paths");
|
|
12
|
+
const atomic_1 = require("./atomic");
|
|
13
|
+
const OUTPUT_FILE = "output.json";
|
|
14
|
+
async function readRunMetadata(runDir) {
|
|
15
|
+
const metadataPath = path_1.default.join(runDir, paths_1.RUN_METADATA_FILE);
|
|
16
|
+
const raw = await fs_1.promises.readFile(metadataPath, "utf8");
|
|
17
|
+
return JSON.parse(raw);
|
|
18
|
+
}
|
|
19
|
+
async function readRunInputs(runDir) {
|
|
20
|
+
const inputsPath = path_1.default.join(runDir, paths_1.INPUTS_FILE);
|
|
21
|
+
try {
|
|
22
|
+
const raw = await fs_1.promises.readFile(inputsPath, "utf8");
|
|
23
|
+
return JSON.parse(raw);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const err = error;
|
|
27
|
+
if (err.code === "ENOENT") {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async function writeRunOutput(runDir, output) {
|
|
34
|
+
const stateDir = path_1.default.join(runDir, paths_1.STATE_DIR);
|
|
35
|
+
await fs_1.promises.mkdir(stateDir, { recursive: true });
|
|
36
|
+
const outputPath = path_1.default.join(stateDir, OUTPUT_FILE);
|
|
37
|
+
await (0, atomic_1.writeFileAtomic)(outputPath, JSON.stringify(output, null, 2) + "\n");
|
|
38
|
+
return path_1.default.relative(runDir, outputPath).replace(/\\/g, "/");
|
|
39
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SnapshotStateOptions } from "./types";
|
|
2
|
+
export declare function snapshotState(options: SnapshotStateOptions): Promise<{
|
|
3
|
+
journalHead: {
|
|
4
|
+
seq: number;
|
|
5
|
+
ulid: string;
|
|
6
|
+
} | null;
|
|
7
|
+
savedAt: string;
|
|
8
|
+
state: import("./types").JsonRecord;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=snapshotState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshotState.d.ts","sourceRoot":"","sources":["../../src/storage/snapshotState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAK/C,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;;;;;GAQhE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.snapshotState = snapshotState;
|
|
4
|
+
const paths_1 = require("./paths");
|
|
5
|
+
const atomic_1 = require("./atomic");
|
|
6
|
+
const clock_1 = require("./clock");
|
|
7
|
+
async function snapshotState(options) {
|
|
8
|
+
const payload = {
|
|
9
|
+
journalHead: options.journalHead ?? null,
|
|
10
|
+
savedAt: (0, clock_1.getClockIsoString)(),
|
|
11
|
+
state: options.state,
|
|
12
|
+
};
|
|
13
|
+
await (0, atomic_1.writeFileAtomic)((0, paths_1.getStateFile)(options.runDir), JSON.stringify(payload, null, 2) + "\n");
|
|
14
|
+
return payload;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeTaskArtifacts.d.ts","sourceRoot":"","sources":["../../src/storage/storeTaskArtifacts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAoBpD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB;UAWrC,MAAM;cAAY,MAAM;KAsB7D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.storeTaskArtifacts = storeTaskArtifacts;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const paths_1 = require("./paths");
|
|
10
|
+
const atomic_1 = require("./atomic");
|
|
11
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
12
|
+
const ARTIFACT_SPILL_THRESHOLD = 512 * 1024; // 512 KB
|
|
13
|
+
async function writeArtifact(targetPath, data) {
|
|
14
|
+
if (typeof data === "string") {
|
|
15
|
+
await (0, atomic_1.writeFileAtomic)(targetPath, data);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
await (0, atomic_1.writeFileAtomic)(targetPath, data);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function hashBuffer(data) {
|
|
22
|
+
const buf = typeof data === "string" ? Buffer.from(data) : data;
|
|
23
|
+
return crypto_1.default.createHash("sha256").update(buf).digest("hex");
|
|
24
|
+
}
|
|
25
|
+
async function storeTaskArtifacts(options) {
|
|
26
|
+
const taskDir = path_1.default.join((0, paths_1.getTasksDir)(options.runDir), options.effectId);
|
|
27
|
+
await fs_1.promises.mkdir(taskDir, { recursive: true });
|
|
28
|
+
if (options.task) {
|
|
29
|
+
await (0, atomic_1.writeFileAtomic)(path_1.default.join(taskDir, "task.json"), JSON.stringify(options.task, null, 2) + "\n");
|
|
30
|
+
}
|
|
31
|
+
if (options.result) {
|
|
32
|
+
await (0, atomic_1.writeFileAtomic)(path_1.default.join(taskDir, "result.json"), JSON.stringify(options.result, null, 2) + "\n");
|
|
33
|
+
}
|
|
34
|
+
const savedArtifacts = [];
|
|
35
|
+
for (const artifact of options.artifacts ?? []) {
|
|
36
|
+
const data = typeof artifact.data === "string" ? Buffer.from(artifact.data) : artifact.data;
|
|
37
|
+
if (data.length > ARTIFACT_SPILL_THRESHOLD) {
|
|
38
|
+
const hash = hashBuffer(data);
|
|
39
|
+
const blobPath = path_1.default.join((0, paths_1.getBlobsDir)(options.runDir), hash);
|
|
40
|
+
try {
|
|
41
|
+
await fs_1.promises.access(blobPath);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
await writeArtifact(blobPath, data);
|
|
45
|
+
}
|
|
46
|
+
savedArtifacts.push({ name: artifact.name, storedAt: `blobs/${hash}` });
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const artifactPath = path_1.default.join(taskDir, "artifacts");
|
|
50
|
+
await fs_1.promises.mkdir(artifactPath, { recursive: true });
|
|
51
|
+
const filePath = path_1.default.join(artifactPath, artifact.name);
|
|
52
|
+
await writeArtifact(filePath, data);
|
|
53
|
+
savedArtifacts.push({ name: artifact.name, storedAt: `tasks/${options.effectId}/artifacts/${artifact.name}` });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
await (0, atomic_1.writeFileAtomic)(path_1.default.join(taskDir, "artifacts.json"), JSON.stringify(savedArtifacts, null, 2) + "\n");
|
|
57
|
+
return savedArtifacts;
|
|
58
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { JsonRecord, StoredTaskResult } from "./types";
|
|
2
|
+
export declare function writeTaskDefinition(runDir: string, effectId: string, taskDef: JsonRecord): Promise<string>;
|
|
3
|
+
export declare function readTaskDefinition(runDir: string, effectId: string): Promise<JsonRecord | undefined>;
|
|
4
|
+
export declare function readTaskResult(runDir: string, effectId: string, resultRef?: string): Promise<StoredTaskResult | undefined>;
|
|
5
|
+
export interface WriteTaskResultOptions {
|
|
6
|
+
runDir: string;
|
|
7
|
+
effectId: string;
|
|
8
|
+
result: StoredTaskResult;
|
|
9
|
+
stdout?: string;
|
|
10
|
+
stderr?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function writeTaskResult(options: WriteTaskResultOptions): Promise<{
|
|
13
|
+
resultRef: string;
|
|
14
|
+
stdoutRef: string | undefined;
|
|
15
|
+
stderrRef: string | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/storage/tasks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAOvD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,mBAM9F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAY1G;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAgBvC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB;;;;GAuBpE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.writeTaskDefinition = writeTaskDefinition;
|
|
7
|
+
exports.readTaskDefinition = readTaskDefinition;
|
|
8
|
+
exports.readTaskResult = readTaskResult;
|
|
9
|
+
exports.writeTaskResult = writeTaskResult;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const paths_1 = require("./paths");
|
|
13
|
+
const atomic_1 = require("./atomic");
|
|
14
|
+
function resolveTaskPath(runDir, effectId, relative) {
|
|
15
|
+
return path_1.default.join((0, paths_1.getTasksDir)(runDir), effectId, relative);
|
|
16
|
+
}
|
|
17
|
+
async function writeTaskDefinition(runDir, effectId, taskDef) {
|
|
18
|
+
const taskDir = path_1.default.join((0, paths_1.getTasksDir)(runDir), effectId);
|
|
19
|
+
await fs_1.promises.mkdir(taskDir, { recursive: true });
|
|
20
|
+
const taskPath = path_1.default.join(taskDir, "task.json");
|
|
21
|
+
await (0, atomic_1.writeFileAtomic)(taskPath, JSON.stringify(taskDef, null, 2) + "\n");
|
|
22
|
+
return path_1.default.relative(runDir, taskPath).replace(/\\/g, "/");
|
|
23
|
+
}
|
|
24
|
+
async function readTaskDefinition(runDir, effectId) {
|
|
25
|
+
const taskPath = resolveTaskPath(runDir, effectId, "task.json");
|
|
26
|
+
try {
|
|
27
|
+
const raw = await fs_1.promises.readFile(taskPath, "utf8");
|
|
28
|
+
return JSON.parse(raw);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const err = error;
|
|
32
|
+
if (err.code === "ENOENT") {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function readTaskResult(runDir, effectId, resultRef) {
|
|
39
|
+
const resolvedPath = resultRef
|
|
40
|
+
? path_1.default.isAbsolute(resultRef)
|
|
41
|
+
? resultRef
|
|
42
|
+
: path_1.default.join(runDir, resultRef)
|
|
43
|
+
: resolveTaskPath(runDir, effectId, "result.json");
|
|
44
|
+
try {
|
|
45
|
+
const raw = await fs_1.promises.readFile(resolvedPath, "utf8");
|
|
46
|
+
return JSON.parse(raw);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const err = error;
|
|
50
|
+
if (err.code === "ENOENT") {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function writeTaskResult(options) {
|
|
57
|
+
const taskDir = path_1.default.join((0, paths_1.getTasksDir)(options.runDir), options.effectId);
|
|
58
|
+
await fs_1.promises.mkdir(taskDir, { recursive: true });
|
|
59
|
+
const resultPath = path_1.default.join(taskDir, "result.json");
|
|
60
|
+
const relativeResultPath = path_1.default.relative(options.runDir, resultPath).replace(/\\/g, "/");
|
|
61
|
+
const stdoutRef = await writeTextIfProvided(options.runDir, options.effectId, "stdout.log", options.stdout);
|
|
62
|
+
const stderrRef = await writeTextIfProvided(options.runDir, options.effectId, "stderr.log", options.stderr);
|
|
63
|
+
if (stdoutRef && !options.result.stdoutRef) {
|
|
64
|
+
options.result.stdoutRef = stdoutRef;
|
|
65
|
+
}
|
|
66
|
+
if (stderrRef && !options.result.stderrRef) {
|
|
67
|
+
options.result.stderrRef = stderrRef;
|
|
68
|
+
}
|
|
69
|
+
await (0, atomic_1.writeFileAtomic)(resultPath, JSON.stringify(options.result, null, 2) + "\n");
|
|
70
|
+
return {
|
|
71
|
+
resultRef: relativeResultPath,
|
|
72
|
+
stdoutRef,
|
|
73
|
+
stderrRef,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function writeTextIfProvided(runDir, effectId, filename, contents) {
|
|
77
|
+
if (typeof contents !== "string")
|
|
78
|
+
return undefined;
|
|
79
|
+
const filePath = resolveTaskPath(runDir, effectId, filename);
|
|
80
|
+
await (0, atomic_1.writeFileAtomic)(filePath, contents);
|
|
81
|
+
return path_1.default.relative(runDir, filePath).replace(/\\/g, "/");
|
|
82
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Stats } from "fs";
|
|
2
|
+
export type JsonRecord = Record<string, unknown>;
|
|
3
|
+
export interface RunEntrypointMetadata {
|
|
4
|
+
importPath: string;
|
|
5
|
+
exportName: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RunMetadata extends JsonRecord {
|
|
8
|
+
runId: string;
|
|
9
|
+
request: string;
|
|
10
|
+
processId: string;
|
|
11
|
+
entrypoint: RunEntrypointMetadata;
|
|
12
|
+
processPath?: string;
|
|
13
|
+
processRevision?: string;
|
|
14
|
+
layoutVersion: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CreateRunDirOptions {
|
|
18
|
+
runsRoot: string;
|
|
19
|
+
runId: string;
|
|
20
|
+
request: string;
|
|
21
|
+
processId?: string;
|
|
22
|
+
entrypoint?: {
|
|
23
|
+
importPath: string;
|
|
24
|
+
exportName?: string;
|
|
25
|
+
};
|
|
26
|
+
processPath?: string;
|
|
27
|
+
processRevision?: string;
|
|
28
|
+
layoutVersion?: string;
|
|
29
|
+
inputs?: unknown;
|
|
30
|
+
extraMetadata?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface AppendEventOptions {
|
|
33
|
+
runDir: string;
|
|
34
|
+
event: JsonRecord;
|
|
35
|
+
eventType: string;
|
|
36
|
+
}
|
|
37
|
+
export interface AppendEventResult {
|
|
38
|
+
seq: number;
|
|
39
|
+
ulid: string;
|
|
40
|
+
filename: string;
|
|
41
|
+
checksum: string;
|
|
42
|
+
path: string;
|
|
43
|
+
recordedAt: string;
|
|
44
|
+
}
|
|
45
|
+
export interface SnapshotStateOptions {
|
|
46
|
+
runDir: string;
|
|
47
|
+
state: JsonRecord;
|
|
48
|
+
journalHead?: {
|
|
49
|
+
seq: number;
|
|
50
|
+
ulid: string;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export interface StoreTaskArtifactsOptions {
|
|
54
|
+
runDir: string;
|
|
55
|
+
effectId: string;
|
|
56
|
+
task?: JsonRecord;
|
|
57
|
+
result?: JsonRecord;
|
|
58
|
+
artifacts?: Array<{
|
|
59
|
+
name: string;
|
|
60
|
+
data: Buffer | string;
|
|
61
|
+
}>;
|
|
62
|
+
}
|
|
63
|
+
export interface DiskUsageReport {
|
|
64
|
+
totalBytes: number;
|
|
65
|
+
journalBytes: number;
|
|
66
|
+
tasksBytes: number;
|
|
67
|
+
blobsBytes: number;
|
|
68
|
+
stateBytes: number;
|
|
69
|
+
}
|
|
70
|
+
export interface OrphanedBlobInfo {
|
|
71
|
+
hash: string;
|
|
72
|
+
bytes: number;
|
|
73
|
+
path: string;
|
|
74
|
+
}
|
|
75
|
+
export interface RunLockInfo {
|
|
76
|
+
pid: number;
|
|
77
|
+
owner: string;
|
|
78
|
+
acquiredAt: string;
|
|
79
|
+
}
|
|
80
|
+
export type FileStatGetter = (path: string) => Promise<Stats>;
|
|
81
|
+
export interface JournalEvent {
|
|
82
|
+
seq: number;
|
|
83
|
+
ulid: string;
|
|
84
|
+
filename: string;
|
|
85
|
+
path: string;
|
|
86
|
+
type: string;
|
|
87
|
+
recordedAt: string;
|
|
88
|
+
data: JsonRecord;
|
|
89
|
+
checksum?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface StoredTaskResult {
|
|
92
|
+
schemaVersion: string;
|
|
93
|
+
effectId: string;
|
|
94
|
+
taskId: string;
|
|
95
|
+
invocationKey: string;
|
|
96
|
+
status: "ok" | "error";
|
|
97
|
+
result?: unknown;
|
|
98
|
+
value?: unknown;
|
|
99
|
+
resultRef?: string;
|
|
100
|
+
error?: {
|
|
101
|
+
name?: string;
|
|
102
|
+
message?: string;
|
|
103
|
+
stack?: string;
|
|
104
|
+
data?: unknown;
|
|
105
|
+
};
|
|
106
|
+
stdoutRef?: string;
|
|
107
|
+
stderrRef?: string;
|
|
108
|
+
startedAt?: string;
|
|
109
|
+
finishedAt?: string;
|
|
110
|
+
metadata?: JsonRecord;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
|