@elaraai/e3-core 0.0.2-beta.5 → 0.0.2-beta.51
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/README.md +25 -22
- package/dist/src/dataflow/api-compat.d.ts +90 -0
- package/dist/src/dataflow/api-compat.d.ts.map +1 -0
- package/dist/src/dataflow/api-compat.js +139 -0
- package/dist/src/dataflow/api-compat.js.map +1 -0
- package/dist/src/dataflow/index.d.ts +18 -0
- package/dist/src/dataflow/index.d.ts.map +1 -0
- package/dist/src/dataflow/index.js +23 -0
- package/dist/src/dataflow/index.js.map +1 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts +76 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts.map +1 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.js +729 -0
- package/dist/src/dataflow/orchestrator/LocalOrchestrator.js.map +1 -0
- package/dist/src/dataflow/orchestrator/index.d.ts +12 -0
- package/dist/src/dataflow/orchestrator/index.d.ts.map +1 -0
- package/dist/src/dataflow/orchestrator/index.js +12 -0
- package/dist/src/dataflow/orchestrator/index.js.map +1 -0
- package/dist/src/dataflow/orchestrator/interfaces.d.ts +163 -0
- package/dist/src/dataflow/orchestrator/interfaces.d.ts.map +1 -0
- package/dist/src/dataflow/orchestrator/interfaces.js +52 -0
- package/dist/src/dataflow/orchestrator/interfaces.js.map +1 -0
- package/dist/src/dataflow/state-store/FileStateStore.d.ts +67 -0
- package/dist/src/dataflow/state-store/FileStateStore.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/FileStateStore.js +300 -0
- package/dist/src/dataflow/state-store/FileStateStore.js.map +1 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts +42 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.js +229 -0
- package/dist/src/dataflow/state-store/InMemoryStateStore.js.map +1 -0
- package/dist/src/dataflow/state-store/index.d.ts +13 -0
- package/dist/src/dataflow/state-store/index.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/index.js +13 -0
- package/dist/src/dataflow/state-store/index.js.map +1 -0
- package/dist/src/dataflow/state-store/interfaces.d.ts +159 -0
- package/dist/src/dataflow/state-store/interfaces.d.ts.map +1 -0
- package/dist/src/dataflow/state-store/interfaces.js +6 -0
- package/dist/src/dataflow/state-store/interfaces.js.map +1 -0
- package/dist/src/dataflow/steps.d.ts +222 -0
- package/dist/src/dataflow/steps.d.ts.map +1 -0
- package/dist/src/dataflow/steps.js +707 -0
- package/dist/src/dataflow/steps.js.map +1 -0
- package/dist/src/dataflow/types.d.ts +127 -0
- package/dist/src/dataflow/types.d.ts.map +1 -0
- package/dist/src/dataflow/types.js +7 -0
- package/dist/src/dataflow/types.js.map +1 -0
- package/dist/src/dataflow.d.ts +113 -38
- package/dist/src/dataflow.d.ts.map +1 -1
- package/dist/src/dataflow.js +269 -416
- package/dist/src/dataflow.js.map +1 -1
- package/dist/src/dataset-refs.d.ts +124 -0
- package/dist/src/dataset-refs.d.ts.map +1 -0
- package/dist/src/dataset-refs.js +319 -0
- package/dist/src/dataset-refs.js.map +1 -0
- package/dist/src/errors.d.ts +39 -9
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +51 -8
- package/dist/src/errors.js.map +1 -1
- package/dist/src/execution/LocalTaskRunner.d.ts +73 -0
- package/dist/src/execution/LocalTaskRunner.d.ts.map +1 -0
- package/dist/src/execution/LocalTaskRunner.js +399 -0
- package/dist/src/execution/LocalTaskRunner.js.map +1 -0
- package/dist/src/execution/MockTaskRunner.d.ts +49 -0
- package/dist/src/execution/MockTaskRunner.d.ts.map +1 -0
- package/dist/src/execution/MockTaskRunner.js +54 -0
- package/dist/src/execution/MockTaskRunner.js.map +1 -0
- package/dist/src/execution/index.d.ts +16 -0
- package/dist/src/execution/index.d.ts.map +1 -0
- package/dist/src/execution/index.js +8 -0
- package/dist/src/execution/index.js.map +1 -0
- package/dist/src/execution/interfaces.d.ts +246 -0
- package/dist/src/execution/interfaces.d.ts.map +1 -0
- package/dist/src/execution/interfaces.js +6 -0
- package/dist/src/execution/interfaces.js.map +1 -0
- package/dist/src/execution/processHelpers.d.ts +20 -0
- package/dist/src/execution/processHelpers.d.ts.map +1 -0
- package/dist/src/execution/processHelpers.js +62 -0
- package/dist/src/execution/processHelpers.js.map +1 -0
- package/dist/src/executions.d.ts +71 -104
- package/dist/src/executions.d.ts.map +1 -1
- package/dist/src/executions.js +110 -476
- package/dist/src/executions.js.map +1 -1
- package/dist/src/index.d.ts +20 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +48 -18
- package/dist/src/index.js.map +1 -1
- package/dist/src/objects.d.ts +7 -53
- package/dist/src/objects.d.ts.map +1 -1
- package/dist/src/objects.js +13 -232
- package/dist/src/objects.js.map +1 -1
- package/dist/src/packages.d.ts +41 -14
- package/dist/src/packages.d.ts.map +1 -1
- package/dist/src/packages.js +145 -88
- package/dist/src/packages.js.map +1 -1
- package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts +35 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts.map +1 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.js +107 -0
- package/dist/src/storage/in-memory/InMemoryRepoStore.js.map +1 -0
- package/dist/src/storage/in-memory/InMemoryStorage.d.ts +139 -0
- package/dist/src/storage/in-memory/InMemoryStorage.d.ts.map +1 -0
- package/dist/src/storage/in-memory/InMemoryStorage.js +439 -0
- package/dist/src/storage/in-memory/InMemoryStorage.js.map +1 -0
- package/dist/src/storage/in-memory/index.d.ts +12 -0
- package/dist/src/storage/in-memory/index.d.ts.map +1 -0
- package/dist/src/storage/in-memory/index.js +12 -0
- package/dist/src/storage/in-memory/index.js.map +1 -0
- package/dist/src/storage/index.d.ts +18 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +10 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +581 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -0
- package/dist/src/storage/interfaces.js +6 -0
- package/dist/src/storage/interfaces.js.map +1 -0
- package/dist/src/storage/local/LocalBackend.d.ts +56 -0
- package/dist/src/storage/local/LocalBackend.d.ts.map +1 -0
- package/dist/src/storage/local/LocalBackend.js +145 -0
- package/dist/src/storage/local/LocalBackend.js.map +1 -0
- package/dist/src/storage/local/LocalDatasetRefStore.d.ts +22 -0
- package/dist/src/storage/local/LocalDatasetRefStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalDatasetRefStore.js +118 -0
- package/dist/src/storage/local/LocalDatasetRefStore.js.map +1 -0
- package/dist/src/storage/local/LocalLockService.d.ts +111 -0
- package/dist/src/storage/local/LocalLockService.d.ts.map +1 -0
- package/dist/src/storage/local/LocalLockService.js +364 -0
- package/dist/src/storage/local/LocalLockService.js.map +1 -0
- package/dist/src/storage/local/LocalLogStore.d.ts +23 -0
- package/dist/src/storage/local/LocalLogStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalLogStore.js +66 -0
- package/dist/src/storage/local/LocalLogStore.js.map +1 -0
- package/dist/src/storage/local/LocalObjectStore.d.ts +55 -0
- package/dist/src/storage/local/LocalObjectStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalObjectStore.js +300 -0
- package/dist/src/storage/local/LocalObjectStore.js.map +1 -0
- package/dist/src/storage/local/LocalRefStore.d.ts +50 -0
- package/dist/src/storage/local/LocalRefStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalRefStore.js +337 -0
- package/dist/src/storage/local/LocalRefStore.js.map +1 -0
- package/dist/src/storage/local/LocalRepoStore.d.ts +55 -0
- package/dist/src/storage/local/LocalRepoStore.d.ts.map +1 -0
- package/dist/src/storage/local/LocalRepoStore.js +365 -0
- package/dist/src/storage/local/LocalRepoStore.js.map +1 -0
- package/dist/src/storage/local/gc.d.ts +92 -0
- package/dist/src/storage/local/gc.d.ts.map +1 -0
- package/dist/src/storage/local/gc.js +377 -0
- package/dist/src/storage/local/gc.js.map +1 -0
- package/dist/src/storage/local/index.d.ts +18 -0
- package/dist/src/storage/local/index.d.ts.map +1 -0
- package/dist/src/storage/local/index.js +18 -0
- package/dist/src/storage/local/index.js.map +1 -0
- package/dist/src/storage/local/localHelpers.d.ts +25 -0
- package/dist/src/storage/local/localHelpers.d.ts.map +1 -0
- package/dist/src/storage/local/localHelpers.js +69 -0
- package/dist/src/storage/local/localHelpers.js.map +1 -0
- package/dist/src/{repository.d.ts → storage/local/repository.d.ts} +8 -4
- package/dist/src/storage/local/repository.d.ts.map +1 -0
- package/dist/src/{repository.js → storage/local/repository.js} +31 -29
- package/dist/src/storage/local/repository.js.map +1 -0
- package/dist/src/tasks.d.ts +16 -10
- package/dist/src/tasks.d.ts.map +1 -1
- package/dist/src/tasks.js +35 -41
- package/dist/src/tasks.js.map +1 -1
- package/dist/src/test-helpers.d.ts +5 -4
- package/dist/src/test-helpers.d.ts.map +1 -1
- package/dist/src/test-helpers.js +9 -21
- package/dist/src/test-helpers.js.map +1 -1
- package/dist/src/transfer/InMemoryTransferBackend.d.ts +75 -0
- package/dist/src/transfer/InMemoryTransferBackend.d.ts.map +1 -0
- package/dist/src/transfer/InMemoryTransferBackend.js +211 -0
- package/dist/src/transfer/InMemoryTransferBackend.js.map +1 -0
- package/dist/src/transfer/index.d.ts +9 -0
- package/dist/src/transfer/index.d.ts.map +1 -0
- package/dist/src/transfer/index.js +11 -0
- package/dist/src/transfer/index.js.map +1 -0
- package/dist/src/transfer/interfaces.d.ts +103 -0
- package/dist/src/transfer/interfaces.d.ts.map +1 -0
- package/dist/src/transfer/interfaces.js +6 -0
- package/dist/src/transfer/interfaces.js.map +1 -0
- package/dist/src/transfer/process.d.ts +55 -0
- package/dist/src/transfer/process.d.ts.map +1 -0
- package/dist/src/transfer/process.js +144 -0
- package/dist/src/transfer/process.js.map +1 -0
- package/dist/src/transfer/types.d.ts +106 -0
- package/dist/src/transfer/types.d.ts.map +1 -0
- package/dist/src/transfer/types.js +61 -0
- package/dist/src/transfer/types.js.map +1 -0
- package/dist/src/trees.d.ts +147 -59
- package/dist/src/trees.d.ts.map +1 -1
- package/dist/src/trees.js +372 -419
- package/dist/src/trees.js.map +1 -1
- package/dist/src/uuid.d.ts +26 -0
- package/dist/src/uuid.d.ts.map +1 -0
- package/dist/src/uuid.js +80 -0
- package/dist/src/uuid.js.map +1 -0
- package/dist/src/workspaceStatus.d.ts +6 -4
- package/dist/src/workspaceStatus.d.ts.map +1 -1
- package/dist/src/workspaceStatus.js +46 -60
- package/dist/src/workspaceStatus.js.map +1 -1
- package/dist/src/workspaces.d.ts +46 -47
- package/dist/src/workspaces.d.ts.map +1 -1
- package/dist/src/workspaces.js +281 -221
- package/dist/src/workspaces.js.map +1 -1
- package/package.json +4 -4
- package/dist/src/gc.d.ts +0 -54
- package/dist/src/gc.d.ts.map +0 -1
- package/dist/src/gc.js +0 -233
- package/dist/src/gc.js.map +0 -1
- package/dist/src/repository.d.ts.map +0 -1
- package/dist/src/repository.js.map +0 -1
- package/dist/src/workspaceLock.d.ts +0 -67
- package/dist/src/workspaceLock.d.ts.map +0 -1
- package/dist/src/workspaceLock.js +0 -217
- package/dist/src/workspaceLock.js.map +0 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* File-based implementation of ExecutionStateStore.
|
|
7
|
+
*
|
|
8
|
+
* Persists execution state to the workspace directory structure:
|
|
9
|
+
* - workspaces/{ws}/execution.beast2 - Current/last execution state (binary format)
|
|
10
|
+
* - workspaces/{ws}/execution-counter - Auto-increment counter
|
|
11
|
+
*
|
|
12
|
+
* Events are stored inline in the execution state (not as a separate file).
|
|
13
|
+
* This enables crash recovery and external monitoring of execution progress.
|
|
14
|
+
*/
|
|
15
|
+
import { promises as fs } from 'node:fs';
|
|
16
|
+
import { join, dirname } from 'node:path';
|
|
17
|
+
import { encodeBeast2For, decodeBeast2For, some } from '@elaraai/east';
|
|
18
|
+
import { DataflowExecutionStateType, } from '../types.js';
|
|
19
|
+
// Create encoder/decoder for beast2 serialization
|
|
20
|
+
const encode = encodeBeast2For(DataflowExecutionStateType);
|
|
21
|
+
const decode = decodeBeast2For(DataflowExecutionStateType);
|
|
22
|
+
/**
|
|
23
|
+
* File-based state store for local filesystem persistence.
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* - Uses atomic writes (write to temp, then rename) for durability
|
|
27
|
+
* - State is stored in beast2 binary format for type safety
|
|
28
|
+
* - Events are stored inline in the execution state
|
|
29
|
+
* - Thread-safe for concurrent access within a single process (via file locking)
|
|
30
|
+
* - Suitable for local CLI and API server usage
|
|
31
|
+
*/
|
|
32
|
+
export class FileStateStore {
|
|
33
|
+
workspacesDir;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new FileStateStore.
|
|
36
|
+
*
|
|
37
|
+
* @param workspacesDir - Path to the workspaces directory (e.g., repo/workspaces)
|
|
38
|
+
*/
|
|
39
|
+
constructor(workspacesDir) {
|
|
40
|
+
this.workspacesDir = workspacesDir;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the path to a workspace's directory.
|
|
44
|
+
*/
|
|
45
|
+
workspacePath(workspace) {
|
|
46
|
+
return join(this.workspacesDir, workspace);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the path to a workspace's execution state file.
|
|
50
|
+
*/
|
|
51
|
+
statePath(workspace) {
|
|
52
|
+
return join(this.workspacePath(workspace), 'execution.beast2');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the path to a workspace's execution counter file.
|
|
56
|
+
*/
|
|
57
|
+
counterPath(workspace) {
|
|
58
|
+
return join(this.workspacePath(workspace), 'execution-counter');
|
|
59
|
+
}
|
|
60
|
+
async create(state) {
|
|
61
|
+
const path = this.statePath(state.workspace);
|
|
62
|
+
// Check if execution already exists
|
|
63
|
+
const existing = await this.read(state.repo, state.workspace, state.id);
|
|
64
|
+
if (existing) {
|
|
65
|
+
throw new Error(`Execution ${state.id} already exists in workspace '${state.workspace}'`);
|
|
66
|
+
}
|
|
67
|
+
// Write state atomically using beast2 encoding
|
|
68
|
+
const data = encode(state);
|
|
69
|
+
await this.atomicWrite(path, data);
|
|
70
|
+
}
|
|
71
|
+
async read(repo, workspace, id) {
|
|
72
|
+
const path = this.statePath(workspace);
|
|
73
|
+
try {
|
|
74
|
+
const data = await fs.readFile(path);
|
|
75
|
+
const state = decode(data);
|
|
76
|
+
// Check if this is the requested execution
|
|
77
|
+
if (state.id !== id) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Verify repo matches (if stored)
|
|
81
|
+
if (state.repo && state.repo !== repo) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return state;
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
if (err.code === 'ENOENT') {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async readLatest(_repo, workspace) {
|
|
94
|
+
const path = this.statePath(workspace);
|
|
95
|
+
try {
|
|
96
|
+
const data = await fs.readFile(path);
|
|
97
|
+
return decode(data);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (err.code === 'ENOENT') {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async update(state) {
|
|
107
|
+
const path = this.statePath(state.workspace);
|
|
108
|
+
// Guard: never overwrite 'cancelled' with a non-cancelled status
|
|
109
|
+
if (state.status !== 'cancelled') {
|
|
110
|
+
try {
|
|
111
|
+
const existing = await fs.readFile(path);
|
|
112
|
+
const current = decode(existing);
|
|
113
|
+
if (current.status === 'cancelled') {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
if (err.code !== 'ENOENT')
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const data = encode(state);
|
|
123
|
+
await this.atomicWrite(path, data);
|
|
124
|
+
}
|
|
125
|
+
async updateTaskStatus(repo, workspace, executionId, task, status, details) {
|
|
126
|
+
const state = await this.read(repo, workspace, executionId);
|
|
127
|
+
if (!state) {
|
|
128
|
+
throw new Error(`Execution ${executionId} not found in workspace '${workspace}'`);
|
|
129
|
+
}
|
|
130
|
+
const taskState = state.tasks.get(task);
|
|
131
|
+
if (!taskState) {
|
|
132
|
+
throw new Error(`Task '${task}' not found in execution ${executionId}`);
|
|
133
|
+
}
|
|
134
|
+
const mutableState = state;
|
|
135
|
+
taskState.status = status;
|
|
136
|
+
if (details) {
|
|
137
|
+
if (details.cached !== undefined)
|
|
138
|
+
taskState.cached = some(details.cached);
|
|
139
|
+
if (details.outputHash !== undefined)
|
|
140
|
+
taskState.outputHash = some(details.outputHash);
|
|
141
|
+
if (details.error !== undefined)
|
|
142
|
+
taskState.error = some(details.error);
|
|
143
|
+
if (details.exitCode !== undefined)
|
|
144
|
+
taskState.exitCode = some(BigInt(details.exitCode));
|
|
145
|
+
if (details.duration !== undefined)
|
|
146
|
+
taskState.duration = some(BigInt(details.duration));
|
|
147
|
+
}
|
|
148
|
+
taskState.completedAt = some(new Date());
|
|
149
|
+
// Update counters based on status
|
|
150
|
+
if (status === 'completed' && details?.cached) {
|
|
151
|
+
mutableState.cached = state.cached + 1n;
|
|
152
|
+
}
|
|
153
|
+
else if (status === 'completed') {
|
|
154
|
+
mutableState.executed = state.executed + 1n;
|
|
155
|
+
}
|
|
156
|
+
else if (status === 'failed') {
|
|
157
|
+
mutableState.failed = state.failed + 1n;
|
|
158
|
+
}
|
|
159
|
+
else if (status === 'skipped') {
|
|
160
|
+
mutableState.skipped = state.skipped + 1n;
|
|
161
|
+
}
|
|
162
|
+
await this.update(state);
|
|
163
|
+
}
|
|
164
|
+
async updateStatus(repo, workspace, executionId, status, details) {
|
|
165
|
+
const state = await this.read(repo, workspace, executionId);
|
|
166
|
+
if (!state) {
|
|
167
|
+
throw new Error(`Execution ${executionId} not found in workspace '${workspace}'`);
|
|
168
|
+
}
|
|
169
|
+
const mutableState = state;
|
|
170
|
+
mutableState.status = status;
|
|
171
|
+
if (status !== 'running') {
|
|
172
|
+
mutableState.completedAt = some(new Date());
|
|
173
|
+
}
|
|
174
|
+
if (details?.error) {
|
|
175
|
+
mutableState.error = some(details.error);
|
|
176
|
+
}
|
|
177
|
+
if (details?.summary) {
|
|
178
|
+
mutableState.executed = BigInt(details.summary.executed);
|
|
179
|
+
mutableState.cached = BigInt(details.summary.cached);
|
|
180
|
+
mutableState.failed = BigInt(details.summary.failed);
|
|
181
|
+
mutableState.skipped = BigInt(details.summary.skipped);
|
|
182
|
+
}
|
|
183
|
+
await this.update(state);
|
|
184
|
+
}
|
|
185
|
+
async recordEvent(repo, workspace, executionId, event) {
|
|
186
|
+
const state = await this.read(repo, workspace, executionId);
|
|
187
|
+
if (!state) {
|
|
188
|
+
throw new Error(`Execution ${executionId} not found in workspace '${workspace}'`);
|
|
189
|
+
}
|
|
190
|
+
// Append event to inline events array (cast to mutable array)
|
|
191
|
+
state.events.push(event);
|
|
192
|
+
await this.update(state);
|
|
193
|
+
}
|
|
194
|
+
async getEventsSince(repo, workspace, executionId, sinceSeq) {
|
|
195
|
+
const state = await this.read(repo, workspace, executionId);
|
|
196
|
+
if (!state) {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
// Filter events from inline array
|
|
200
|
+
const sinceSeqBigInt = BigInt(sinceSeq);
|
|
201
|
+
return state.events.filter(e => {
|
|
202
|
+
// Events are variants, so we access seq via e.value.seq
|
|
203
|
+
const seq = e.value.seq;
|
|
204
|
+
return seq > sinceSeqBigInt;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async nextExecutionId(_repo, workspace) {
|
|
208
|
+
const path = this.counterPath(workspace);
|
|
209
|
+
let current = 0;
|
|
210
|
+
try {
|
|
211
|
+
const data = await fs.readFile(path, 'utf-8');
|
|
212
|
+
current = parseInt(data.trim(), 10) || 0;
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
if (err.code !== 'ENOENT') {
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const next = current + 1;
|
|
220
|
+
await this.atomicWriteText(path, String(next));
|
|
221
|
+
return String(next);
|
|
222
|
+
}
|
|
223
|
+
async delete(_repo, workspace, executionId) {
|
|
224
|
+
// Only delete if the stored execution matches the requested ID
|
|
225
|
+
const state = await this.readLatest(_repo, workspace);
|
|
226
|
+
if (state && state.id === executionId) {
|
|
227
|
+
const statePath = this.statePath(workspace);
|
|
228
|
+
try {
|
|
229
|
+
await fs.unlink(statePath);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
if (err.code !== 'ENOENT') {
|
|
233
|
+
throw err;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if an incomplete execution exists for a workspace.
|
|
240
|
+
*
|
|
241
|
+
* An execution is incomplete if its status is 'running'.
|
|
242
|
+
* This is used to detect crash recovery scenarios.
|
|
243
|
+
*
|
|
244
|
+
* @param repo - Repository identifier
|
|
245
|
+
* @param workspace - Workspace name
|
|
246
|
+
* @returns The incomplete execution if one exists, null otherwise
|
|
247
|
+
*/
|
|
248
|
+
async getIncompleteExecution(repo, workspace) {
|
|
249
|
+
const state = await this.readLatest(repo, workspace);
|
|
250
|
+
if (state && state.status === 'running') {
|
|
251
|
+
return state;
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Write a binary file atomically using temp file + rename.
|
|
257
|
+
*/
|
|
258
|
+
async atomicWrite(path, content) {
|
|
259
|
+
const dir = dirname(path);
|
|
260
|
+
const tmpPath = join(dir, `.tmp-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
261
|
+
try {
|
|
262
|
+
await fs.mkdir(dir, { recursive: true });
|
|
263
|
+
await fs.writeFile(tmpPath, content);
|
|
264
|
+
await fs.rename(tmpPath, path);
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
// Clean up temp file on failure
|
|
268
|
+
try {
|
|
269
|
+
await fs.unlink(tmpPath);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Ignore cleanup errors
|
|
273
|
+
}
|
|
274
|
+
throw err;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Write a text file atomically using temp file + rename.
|
|
279
|
+
*/
|
|
280
|
+
async atomicWriteText(path, content) {
|
|
281
|
+
const dir = dirname(path);
|
|
282
|
+
const tmpPath = join(dir, `.tmp-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
283
|
+
try {
|
|
284
|
+
await fs.mkdir(dir, { recursive: true });
|
|
285
|
+
await fs.writeFile(tmpPath, content, 'utf-8');
|
|
286
|
+
await fs.rename(tmpPath, path);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
// Clean up temp file on failure
|
|
290
|
+
try {
|
|
291
|
+
await fs.unlink(tmpPath);
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Ignore cleanup errors
|
|
295
|
+
}
|
|
296
|
+
throw err;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=FileStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileStateStore.js","sourceRoot":"","sources":["../../../../src/dataflow/state-store/FileStateStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExecutionStateStore, TaskStatusDetails, ExecutionStatusDetails } from './interfaces.js';
|
|
6
|
+
import type { DataflowExecutionState, ExecutionEvent, TaskStatus } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* In-memory state store for testing and simple use cases.
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* - Thread-safe for concurrent access within a single process
|
|
12
|
+
* - State is lost on process exit
|
|
13
|
+
* - No durability guarantees
|
|
14
|
+
*/
|
|
15
|
+
export declare class InMemoryStateStore implements ExecutionStateStore {
|
|
16
|
+
/** Map of "repo::workspace" -> execution ID -> state */
|
|
17
|
+
private states;
|
|
18
|
+
/** Map of "repo::workspace" -> next execution ID counter */
|
|
19
|
+
private counters;
|
|
20
|
+
private makeKey;
|
|
21
|
+
create(state: DataflowExecutionState): Promise<void>;
|
|
22
|
+
read(repo: string, workspace: string, id: string): Promise<DataflowExecutionState | null>;
|
|
23
|
+
readLatest(repo: string, workspace: string): Promise<DataflowExecutionState | null>;
|
|
24
|
+
update(state: DataflowExecutionState): Promise<void>;
|
|
25
|
+
updateTaskStatus(repo: string, workspace: string, executionId: string, task: string, status: TaskStatus, details?: TaskStatusDetails): Promise<void>;
|
|
26
|
+
updateStatus(repo: string, workspace: string, executionId: string, status: 'running' | 'completed' | 'failed' | 'cancelled', details?: ExecutionStatusDetails): Promise<void>;
|
|
27
|
+
recordEvent(repo: string, workspace: string, executionId: string, event: ExecutionEvent): Promise<void>;
|
|
28
|
+
getEventsSince(repo: string, workspace: string, executionId: string, sinceSeq: number): Promise<ExecutionEvent[]>;
|
|
29
|
+
nextExecutionId(repo: string, workspace: string): Promise<string>;
|
|
30
|
+
delete(repo: string, workspace: string, executionId: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all state (for testing).
|
|
33
|
+
*/
|
|
34
|
+
clear(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Deep clone execution state to prevent external mutation.
|
|
37
|
+
*
|
|
38
|
+
* Note: We use spread and some() to properly clone the branded option types.
|
|
39
|
+
*/
|
|
40
|
+
private cloneState;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=InMemoryStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryStateStore.d.ts","sourceRoot":"","sources":["../../../../src/dataflow/state-store/InMemoryStateStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,sBAAsB,EAEtB,cAAc,EACd,UAAU,EAEX,MAAM,aAAa,CAAC;AAKrB;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,wDAAwD;IACxD,OAAO,CAAC,MAAM,CAA0D;IAExE,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,OAAO;IAKT,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAYzF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAwBnF,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBpD,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwBV,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,EACxD,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC;IAyBV,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC;IAaV,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,EAAE,CAAC;IActB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASjE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;;OAIG;IACH,OAAO,CAAC,UAAU;CA4CnB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* In-memory implementation of ExecutionStateStore.
|
|
7
|
+
*
|
|
8
|
+
* Useful for testing and simple cases where persistence is not required.
|
|
9
|
+
* State is lost when the process exits.
|
|
10
|
+
*/
|
|
11
|
+
import { some } from '@elaraai/east';
|
|
12
|
+
/**
|
|
13
|
+
* In-memory state store for testing and simple use cases.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* - Thread-safe for concurrent access within a single process
|
|
17
|
+
* - State is lost on process exit
|
|
18
|
+
* - No durability guarantees
|
|
19
|
+
*/
|
|
20
|
+
export class InMemoryStateStore {
|
|
21
|
+
/** Map of "repo::workspace" -> execution ID -> state */
|
|
22
|
+
states = new Map();
|
|
23
|
+
/** Map of "repo::workspace" -> next execution ID counter */
|
|
24
|
+
counters = new Map();
|
|
25
|
+
makeKey(repo, workspace) {
|
|
26
|
+
return `${repo}::${workspace}`;
|
|
27
|
+
}
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
29
|
+
async create(state) {
|
|
30
|
+
const key = this.makeKey(state.repo, state.workspace);
|
|
31
|
+
if (!this.states.has(key)) {
|
|
32
|
+
this.states.set(key, new Map());
|
|
33
|
+
}
|
|
34
|
+
const wsStates = this.states.get(key);
|
|
35
|
+
if (wsStates.has(state.id)) {
|
|
36
|
+
throw new Error(`Execution ${state.id} already exists in ${key}`);
|
|
37
|
+
}
|
|
38
|
+
// Deep clone to prevent external mutation
|
|
39
|
+
wsStates.set(state.id, this.cloneState(state));
|
|
40
|
+
}
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
42
|
+
async read(repo, workspace, id) {
|
|
43
|
+
const key = this.makeKey(repo, workspace);
|
|
44
|
+
const wsStates = this.states.get(key);
|
|
45
|
+
if (!wsStates)
|
|
46
|
+
return null;
|
|
47
|
+
const state = wsStates.get(id);
|
|
48
|
+
if (!state)
|
|
49
|
+
return null;
|
|
50
|
+
return this.cloneState(state);
|
|
51
|
+
}
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
53
|
+
async readLatest(repo, workspace) {
|
|
54
|
+
const key = this.makeKey(repo, workspace);
|
|
55
|
+
const wsStates = this.states.get(key);
|
|
56
|
+
if (!wsStates || wsStates.size === 0)
|
|
57
|
+
return null;
|
|
58
|
+
// Find the highest execution ID (assuming numeric string IDs)
|
|
59
|
+
let latestId = null;
|
|
60
|
+
let latestNum = -1;
|
|
61
|
+
for (const id of wsStates.keys()) {
|
|
62
|
+
const num = parseInt(id, 10);
|
|
63
|
+
if (!isNaN(num) && num > latestNum) {
|
|
64
|
+
latestNum = num;
|
|
65
|
+
latestId = id;
|
|
66
|
+
}
|
|
67
|
+
else if (latestId === null) {
|
|
68
|
+
// Fallback for non-numeric IDs: just take the first one
|
|
69
|
+
latestId = id;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (latestId === null)
|
|
73
|
+
return null;
|
|
74
|
+
return this.cloneState(wsStates.get(latestId));
|
|
75
|
+
}
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
77
|
+
async update(state) {
|
|
78
|
+
const key = this.makeKey(state.repo, state.workspace);
|
|
79
|
+
const wsStates = this.states.get(key);
|
|
80
|
+
if (!wsStates || !wsStates.has(state.id)) {
|
|
81
|
+
throw new Error(`Execution ${state.id} not found in ${key}`);
|
|
82
|
+
}
|
|
83
|
+
// Guard: never overwrite 'cancelled' with a non-cancelled status
|
|
84
|
+
if (state.status !== 'cancelled') {
|
|
85
|
+
const current = wsStates.get(state.id);
|
|
86
|
+
if (current.status === 'cancelled') {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
wsStates.set(state.id, this.cloneState(state));
|
|
91
|
+
}
|
|
92
|
+
async updateTaskStatus(repo, workspace, executionId, task, status, details) {
|
|
93
|
+
const state = await this.read(repo, workspace, executionId);
|
|
94
|
+
if (!state) {
|
|
95
|
+
throw new Error(`Execution ${executionId} not found in ${repo}::${workspace}`);
|
|
96
|
+
}
|
|
97
|
+
const taskState = state.tasks.get(task);
|
|
98
|
+
if (!taskState) {
|
|
99
|
+
throw new Error(`Task '${task}' not found in execution ${executionId}`);
|
|
100
|
+
}
|
|
101
|
+
taskState.status = status;
|
|
102
|
+
if (details) {
|
|
103
|
+
if (details.cached !== undefined)
|
|
104
|
+
taskState.cached = some(details.cached);
|
|
105
|
+
if (details.outputHash !== undefined)
|
|
106
|
+
taskState.outputHash = some(details.outputHash);
|
|
107
|
+
if (details.error !== undefined)
|
|
108
|
+
taskState.error = some(details.error);
|
|
109
|
+
if (details.exitCode !== undefined)
|
|
110
|
+
taskState.exitCode = some(BigInt(details.exitCode));
|
|
111
|
+
if (details.duration !== undefined)
|
|
112
|
+
taskState.duration = some(BigInt(details.duration));
|
|
113
|
+
}
|
|
114
|
+
taskState.completedAt = some(new Date());
|
|
115
|
+
await this.update(state);
|
|
116
|
+
}
|
|
117
|
+
async updateStatus(repo, workspace, executionId, status, details) {
|
|
118
|
+
const state = await this.read(repo, workspace, executionId);
|
|
119
|
+
if (!state) {
|
|
120
|
+
throw new Error(`Execution ${executionId} not found in ${repo}::${workspace}`);
|
|
121
|
+
}
|
|
122
|
+
const mutableState = state;
|
|
123
|
+
mutableState.status = status;
|
|
124
|
+
if (status !== 'running') {
|
|
125
|
+
mutableState.completedAt = some(new Date());
|
|
126
|
+
}
|
|
127
|
+
if (details?.error) {
|
|
128
|
+
mutableState.error = some(details.error);
|
|
129
|
+
}
|
|
130
|
+
if (details?.summary) {
|
|
131
|
+
mutableState.executed = BigInt(details.summary.executed);
|
|
132
|
+
mutableState.cached = BigInt(details.summary.cached);
|
|
133
|
+
mutableState.failed = BigInt(details.summary.failed);
|
|
134
|
+
mutableState.skipped = BigInt(details.summary.skipped);
|
|
135
|
+
}
|
|
136
|
+
await this.update(state);
|
|
137
|
+
}
|
|
138
|
+
async recordEvent(repo, workspace, executionId, event) {
|
|
139
|
+
const state = await this.read(repo, workspace, executionId);
|
|
140
|
+
if (!state) {
|
|
141
|
+
throw new Error(`Execution ${executionId} not found in ${repo}::${workspace}`);
|
|
142
|
+
}
|
|
143
|
+
// Append event to inline events array (cast to mutable array)
|
|
144
|
+
state.events.push(event);
|
|
145
|
+
await this.update(state);
|
|
146
|
+
}
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
148
|
+
async getEventsSince(repo, workspace, executionId, sinceSeq) {
|
|
149
|
+
const key = this.makeKey(repo, workspace);
|
|
150
|
+
const wsStates = this.states.get(key);
|
|
151
|
+
if (!wsStates)
|
|
152
|
+
return [];
|
|
153
|
+
const state = wsStates.get(executionId);
|
|
154
|
+
if (!state)
|
|
155
|
+
return [];
|
|
156
|
+
// Filter events from inline array
|
|
157
|
+
const sinceSeqBigInt = BigInt(sinceSeq);
|
|
158
|
+
return state.events.filter(e => e.value.seq > sinceSeqBigInt);
|
|
159
|
+
}
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
161
|
+
async nextExecutionId(repo, workspace) {
|
|
162
|
+
const key = this.makeKey(repo, workspace);
|
|
163
|
+
const current = this.counters.get(key) ?? 0;
|
|
164
|
+
const next = current + 1;
|
|
165
|
+
this.counters.set(key, next);
|
|
166
|
+
return String(next);
|
|
167
|
+
}
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
169
|
+
async delete(repo, workspace, executionId) {
|
|
170
|
+
const key = this.makeKey(repo, workspace);
|
|
171
|
+
const wsStates = this.states.get(key);
|
|
172
|
+
if (wsStates) {
|
|
173
|
+
wsStates.delete(executionId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Clear all state (for testing).
|
|
178
|
+
*/
|
|
179
|
+
clear() {
|
|
180
|
+
this.states.clear();
|
|
181
|
+
this.counters.clear();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Deep clone execution state to prevent external mutation.
|
|
185
|
+
*
|
|
186
|
+
* Note: We use spread and some() to properly clone the branded option types.
|
|
187
|
+
*/
|
|
188
|
+
cloneState(state) {
|
|
189
|
+
const tasks = new Map();
|
|
190
|
+
for (const [name, taskState] of state.tasks) {
|
|
191
|
+
// Shallow clone is sufficient since we use some() for options
|
|
192
|
+
tasks.set(name, { ...taskState });
|
|
193
|
+
}
|
|
194
|
+
// Clone graph if present
|
|
195
|
+
let graph = state.graph;
|
|
196
|
+
if (state.graph.type === 'some') {
|
|
197
|
+
const graphValue = {
|
|
198
|
+
tasks: state.graph.value.tasks.map(t => ({
|
|
199
|
+
...t,
|
|
200
|
+
inputs: [...t.inputs],
|
|
201
|
+
dependsOn: [...t.dependsOn],
|
|
202
|
+
})),
|
|
203
|
+
};
|
|
204
|
+
graph = some(graphValue);
|
|
205
|
+
}
|
|
206
|
+
// Clone completedAt if present
|
|
207
|
+
let completedAt = state.completedAt;
|
|
208
|
+
if (state.completedAt.type === 'some') {
|
|
209
|
+
completedAt = some(new Date(state.completedAt.value.getTime()));
|
|
210
|
+
}
|
|
211
|
+
// Deep clone versionVectors (Map<string, Map<string, string>>)
|
|
212
|
+
const versionVectors = new Map();
|
|
213
|
+
for (const [k, v] of state.versionVectors) {
|
|
214
|
+
versionVectors.set(k, new Map(v));
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
...state,
|
|
218
|
+
startedAt: new Date(state.startedAt.getTime()),
|
|
219
|
+
completedAt,
|
|
220
|
+
graph,
|
|
221
|
+
tasks,
|
|
222
|
+
events: [...state.events],
|
|
223
|
+
versionVectors,
|
|
224
|
+
inputSnapshot: new Map(state.inputSnapshot),
|
|
225
|
+
taskOutputPaths: [...state.taskOutputPaths],
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=InMemoryStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryStateStore.js","sourceRoot":"","sources":["../../../../src/dataflow/state-store/InMemoryStateStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* State store implementations for dataflow execution.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export * from './interfaces.js';
|
|
11
|
+
export * from './InMemoryStateStore.js';
|
|
12
|
+
export * from './FileStateStore.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/dataflow/state-store/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* State store implementations for dataflow execution.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
export * from './interfaces.js';
|
|
11
|
+
export * from './InMemoryStateStore.js';
|
|
12
|
+
export * from './FileStateStore.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/dataflow/state-store/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC"}
|