@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.
Files changed (212) hide show
  1. package/README.md +25 -22
  2. package/dist/src/dataflow/api-compat.d.ts +90 -0
  3. package/dist/src/dataflow/api-compat.d.ts.map +1 -0
  4. package/dist/src/dataflow/api-compat.js +139 -0
  5. package/dist/src/dataflow/api-compat.js.map +1 -0
  6. package/dist/src/dataflow/index.d.ts +18 -0
  7. package/dist/src/dataflow/index.d.ts.map +1 -0
  8. package/dist/src/dataflow/index.js +23 -0
  9. package/dist/src/dataflow/index.js.map +1 -0
  10. package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts +76 -0
  11. package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts.map +1 -0
  12. package/dist/src/dataflow/orchestrator/LocalOrchestrator.js +729 -0
  13. package/dist/src/dataflow/orchestrator/LocalOrchestrator.js.map +1 -0
  14. package/dist/src/dataflow/orchestrator/index.d.ts +12 -0
  15. package/dist/src/dataflow/orchestrator/index.d.ts.map +1 -0
  16. package/dist/src/dataflow/orchestrator/index.js +12 -0
  17. package/dist/src/dataflow/orchestrator/index.js.map +1 -0
  18. package/dist/src/dataflow/orchestrator/interfaces.d.ts +163 -0
  19. package/dist/src/dataflow/orchestrator/interfaces.d.ts.map +1 -0
  20. package/dist/src/dataflow/orchestrator/interfaces.js +52 -0
  21. package/dist/src/dataflow/orchestrator/interfaces.js.map +1 -0
  22. package/dist/src/dataflow/state-store/FileStateStore.d.ts +67 -0
  23. package/dist/src/dataflow/state-store/FileStateStore.d.ts.map +1 -0
  24. package/dist/src/dataflow/state-store/FileStateStore.js +300 -0
  25. package/dist/src/dataflow/state-store/FileStateStore.js.map +1 -0
  26. package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts +42 -0
  27. package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts.map +1 -0
  28. package/dist/src/dataflow/state-store/InMemoryStateStore.js +229 -0
  29. package/dist/src/dataflow/state-store/InMemoryStateStore.js.map +1 -0
  30. package/dist/src/dataflow/state-store/index.d.ts +13 -0
  31. package/dist/src/dataflow/state-store/index.d.ts.map +1 -0
  32. package/dist/src/dataflow/state-store/index.js +13 -0
  33. package/dist/src/dataflow/state-store/index.js.map +1 -0
  34. package/dist/src/dataflow/state-store/interfaces.d.ts +159 -0
  35. package/dist/src/dataflow/state-store/interfaces.d.ts.map +1 -0
  36. package/dist/src/dataflow/state-store/interfaces.js +6 -0
  37. package/dist/src/dataflow/state-store/interfaces.js.map +1 -0
  38. package/dist/src/dataflow/steps.d.ts +222 -0
  39. package/dist/src/dataflow/steps.d.ts.map +1 -0
  40. package/dist/src/dataflow/steps.js +707 -0
  41. package/dist/src/dataflow/steps.js.map +1 -0
  42. package/dist/src/dataflow/types.d.ts +127 -0
  43. package/dist/src/dataflow/types.d.ts.map +1 -0
  44. package/dist/src/dataflow/types.js +7 -0
  45. package/dist/src/dataflow/types.js.map +1 -0
  46. package/dist/src/dataflow.d.ts +113 -38
  47. package/dist/src/dataflow.d.ts.map +1 -1
  48. package/dist/src/dataflow.js +269 -416
  49. package/dist/src/dataflow.js.map +1 -1
  50. package/dist/src/dataset-refs.d.ts +124 -0
  51. package/dist/src/dataset-refs.d.ts.map +1 -0
  52. package/dist/src/dataset-refs.js +319 -0
  53. package/dist/src/dataset-refs.js.map +1 -0
  54. package/dist/src/errors.d.ts +39 -9
  55. package/dist/src/errors.d.ts.map +1 -1
  56. package/dist/src/errors.js +51 -8
  57. package/dist/src/errors.js.map +1 -1
  58. package/dist/src/execution/LocalTaskRunner.d.ts +73 -0
  59. package/dist/src/execution/LocalTaskRunner.d.ts.map +1 -0
  60. package/dist/src/execution/LocalTaskRunner.js +399 -0
  61. package/dist/src/execution/LocalTaskRunner.js.map +1 -0
  62. package/dist/src/execution/MockTaskRunner.d.ts +49 -0
  63. package/dist/src/execution/MockTaskRunner.d.ts.map +1 -0
  64. package/dist/src/execution/MockTaskRunner.js +54 -0
  65. package/dist/src/execution/MockTaskRunner.js.map +1 -0
  66. package/dist/src/execution/index.d.ts +16 -0
  67. package/dist/src/execution/index.d.ts.map +1 -0
  68. package/dist/src/execution/index.js +8 -0
  69. package/dist/src/execution/index.js.map +1 -0
  70. package/dist/src/execution/interfaces.d.ts +246 -0
  71. package/dist/src/execution/interfaces.d.ts.map +1 -0
  72. package/dist/src/execution/interfaces.js +6 -0
  73. package/dist/src/execution/interfaces.js.map +1 -0
  74. package/dist/src/execution/processHelpers.d.ts +20 -0
  75. package/dist/src/execution/processHelpers.d.ts.map +1 -0
  76. package/dist/src/execution/processHelpers.js +62 -0
  77. package/dist/src/execution/processHelpers.js.map +1 -0
  78. package/dist/src/executions.d.ts +71 -104
  79. package/dist/src/executions.d.ts.map +1 -1
  80. package/dist/src/executions.js +110 -476
  81. package/dist/src/executions.js.map +1 -1
  82. package/dist/src/index.d.ts +20 -10
  83. package/dist/src/index.d.ts.map +1 -1
  84. package/dist/src/index.js +48 -18
  85. package/dist/src/index.js.map +1 -1
  86. package/dist/src/objects.d.ts +7 -53
  87. package/dist/src/objects.d.ts.map +1 -1
  88. package/dist/src/objects.js +13 -232
  89. package/dist/src/objects.js.map +1 -1
  90. package/dist/src/packages.d.ts +41 -14
  91. package/dist/src/packages.d.ts.map +1 -1
  92. package/dist/src/packages.js +145 -88
  93. package/dist/src/packages.js.map +1 -1
  94. package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts +35 -0
  95. package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts.map +1 -0
  96. package/dist/src/storage/in-memory/InMemoryRepoStore.js +107 -0
  97. package/dist/src/storage/in-memory/InMemoryRepoStore.js.map +1 -0
  98. package/dist/src/storage/in-memory/InMemoryStorage.d.ts +139 -0
  99. package/dist/src/storage/in-memory/InMemoryStorage.d.ts.map +1 -0
  100. package/dist/src/storage/in-memory/InMemoryStorage.js +439 -0
  101. package/dist/src/storage/in-memory/InMemoryStorage.js.map +1 -0
  102. package/dist/src/storage/in-memory/index.d.ts +12 -0
  103. package/dist/src/storage/in-memory/index.d.ts.map +1 -0
  104. package/dist/src/storage/in-memory/index.js +12 -0
  105. package/dist/src/storage/in-memory/index.js.map +1 -0
  106. package/dist/src/storage/index.d.ts +18 -0
  107. package/dist/src/storage/index.d.ts.map +1 -0
  108. package/dist/src/storage/index.js +10 -0
  109. package/dist/src/storage/index.js.map +1 -0
  110. package/dist/src/storage/interfaces.d.ts +581 -0
  111. package/dist/src/storage/interfaces.d.ts.map +1 -0
  112. package/dist/src/storage/interfaces.js +6 -0
  113. package/dist/src/storage/interfaces.js.map +1 -0
  114. package/dist/src/storage/local/LocalBackend.d.ts +56 -0
  115. package/dist/src/storage/local/LocalBackend.d.ts.map +1 -0
  116. package/dist/src/storage/local/LocalBackend.js +145 -0
  117. package/dist/src/storage/local/LocalBackend.js.map +1 -0
  118. package/dist/src/storage/local/LocalDatasetRefStore.d.ts +22 -0
  119. package/dist/src/storage/local/LocalDatasetRefStore.d.ts.map +1 -0
  120. package/dist/src/storage/local/LocalDatasetRefStore.js +118 -0
  121. package/dist/src/storage/local/LocalDatasetRefStore.js.map +1 -0
  122. package/dist/src/storage/local/LocalLockService.d.ts +111 -0
  123. package/dist/src/storage/local/LocalLockService.d.ts.map +1 -0
  124. package/dist/src/storage/local/LocalLockService.js +364 -0
  125. package/dist/src/storage/local/LocalLockService.js.map +1 -0
  126. package/dist/src/storage/local/LocalLogStore.d.ts +23 -0
  127. package/dist/src/storage/local/LocalLogStore.d.ts.map +1 -0
  128. package/dist/src/storage/local/LocalLogStore.js +66 -0
  129. package/dist/src/storage/local/LocalLogStore.js.map +1 -0
  130. package/dist/src/storage/local/LocalObjectStore.d.ts +55 -0
  131. package/dist/src/storage/local/LocalObjectStore.d.ts.map +1 -0
  132. package/dist/src/storage/local/LocalObjectStore.js +300 -0
  133. package/dist/src/storage/local/LocalObjectStore.js.map +1 -0
  134. package/dist/src/storage/local/LocalRefStore.d.ts +50 -0
  135. package/dist/src/storage/local/LocalRefStore.d.ts.map +1 -0
  136. package/dist/src/storage/local/LocalRefStore.js +337 -0
  137. package/dist/src/storage/local/LocalRefStore.js.map +1 -0
  138. package/dist/src/storage/local/LocalRepoStore.d.ts +55 -0
  139. package/dist/src/storage/local/LocalRepoStore.d.ts.map +1 -0
  140. package/dist/src/storage/local/LocalRepoStore.js +365 -0
  141. package/dist/src/storage/local/LocalRepoStore.js.map +1 -0
  142. package/dist/src/storage/local/gc.d.ts +92 -0
  143. package/dist/src/storage/local/gc.d.ts.map +1 -0
  144. package/dist/src/storage/local/gc.js +377 -0
  145. package/dist/src/storage/local/gc.js.map +1 -0
  146. package/dist/src/storage/local/index.d.ts +18 -0
  147. package/dist/src/storage/local/index.d.ts.map +1 -0
  148. package/dist/src/storage/local/index.js +18 -0
  149. package/dist/src/storage/local/index.js.map +1 -0
  150. package/dist/src/storage/local/localHelpers.d.ts +25 -0
  151. package/dist/src/storage/local/localHelpers.d.ts.map +1 -0
  152. package/dist/src/storage/local/localHelpers.js +69 -0
  153. package/dist/src/storage/local/localHelpers.js.map +1 -0
  154. package/dist/src/{repository.d.ts → storage/local/repository.d.ts} +8 -4
  155. package/dist/src/storage/local/repository.d.ts.map +1 -0
  156. package/dist/src/{repository.js → storage/local/repository.js} +31 -29
  157. package/dist/src/storage/local/repository.js.map +1 -0
  158. package/dist/src/tasks.d.ts +16 -10
  159. package/dist/src/tasks.d.ts.map +1 -1
  160. package/dist/src/tasks.js +35 -41
  161. package/dist/src/tasks.js.map +1 -1
  162. package/dist/src/test-helpers.d.ts +5 -4
  163. package/dist/src/test-helpers.d.ts.map +1 -1
  164. package/dist/src/test-helpers.js +9 -21
  165. package/dist/src/test-helpers.js.map +1 -1
  166. package/dist/src/transfer/InMemoryTransferBackend.d.ts +75 -0
  167. package/dist/src/transfer/InMemoryTransferBackend.d.ts.map +1 -0
  168. package/dist/src/transfer/InMemoryTransferBackend.js +211 -0
  169. package/dist/src/transfer/InMemoryTransferBackend.js.map +1 -0
  170. package/dist/src/transfer/index.d.ts +9 -0
  171. package/dist/src/transfer/index.d.ts.map +1 -0
  172. package/dist/src/transfer/index.js +11 -0
  173. package/dist/src/transfer/index.js.map +1 -0
  174. package/dist/src/transfer/interfaces.d.ts +103 -0
  175. package/dist/src/transfer/interfaces.d.ts.map +1 -0
  176. package/dist/src/transfer/interfaces.js +6 -0
  177. package/dist/src/transfer/interfaces.js.map +1 -0
  178. package/dist/src/transfer/process.d.ts +55 -0
  179. package/dist/src/transfer/process.d.ts.map +1 -0
  180. package/dist/src/transfer/process.js +144 -0
  181. package/dist/src/transfer/process.js.map +1 -0
  182. package/dist/src/transfer/types.d.ts +106 -0
  183. package/dist/src/transfer/types.d.ts.map +1 -0
  184. package/dist/src/transfer/types.js +61 -0
  185. package/dist/src/transfer/types.js.map +1 -0
  186. package/dist/src/trees.d.ts +147 -59
  187. package/dist/src/trees.d.ts.map +1 -1
  188. package/dist/src/trees.js +372 -419
  189. package/dist/src/trees.js.map +1 -1
  190. package/dist/src/uuid.d.ts +26 -0
  191. package/dist/src/uuid.d.ts.map +1 -0
  192. package/dist/src/uuid.js +80 -0
  193. package/dist/src/uuid.js.map +1 -0
  194. package/dist/src/workspaceStatus.d.ts +6 -4
  195. package/dist/src/workspaceStatus.d.ts.map +1 -1
  196. package/dist/src/workspaceStatus.js +46 -60
  197. package/dist/src/workspaceStatus.js.map +1 -1
  198. package/dist/src/workspaces.d.ts +46 -47
  199. package/dist/src/workspaces.d.ts.map +1 -1
  200. package/dist/src/workspaces.js +281 -221
  201. package/dist/src/workspaces.js.map +1 -1
  202. package/package.json +4 -4
  203. package/dist/src/gc.d.ts +0 -54
  204. package/dist/src/gc.d.ts.map +0 -1
  205. package/dist/src/gc.js +0 -233
  206. package/dist/src/gc.js.map +0 -1
  207. package/dist/src/repository.d.ts.map +0 -1
  208. package/dist/src/repository.js.map +0 -1
  209. package/dist/src/workspaceLock.d.ts +0 -67
  210. package/dist/src/workspaceLock.d.ts.map +0 -1
  211. package/dist/src/workspaceLock.js +0 -217
  212. 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":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAMvE,OAAO,EACL,0BAA0B,GAK3B,MAAM,aAAa,CAAC;AAErB,kDAAkD;AAClD,MAAM,MAAM,GAAG,eAAe,CAAC,0BAA0B,CAAC,CAAC;AAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,0BAA0B,CAAC,CAAC;AAK3D;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAc;IAMI;IAL7B;;;;OAIG;IACH,YAA6B,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;IAAG,CAAC;IAEtD;;OAEG;IACK,aAAa,CAAC,SAAiB;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAA6B;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE7C,oCAAoC;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,EAAE,iCAAiC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QAC5F,CAAC;QAED,+CAA+C;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,SAAiB,EAAE,EAAU;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAE3B,2CAA2C;YAC3C,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,kCAAkC;YAClC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,SAAiB;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAA6B;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,iEAAiE;QACjE,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACnC,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,GAAG,CAAC;YAClE,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,SAAiB,EACjB,WAAmB,EACnB,IAAY,EACZ,MAAkB,EAClB,OAA2B;QAE3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,aAAa,WAAW,4BAA4B,SAAS,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAmC,CAAC;QAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,4BAA4B,WAAW,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,YAAY,GAAG,KAAwC,CAAC;QAE9D,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;gBAAE,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACtF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAEzC,kCAAkC;QAClC,IAAI,MAAM,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YAC9C,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QAC1C,CAAC;aAAM,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,YAAY,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,YAAY,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QAC1C,CAAC;aAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAY,EACZ,SAAiB,EACjB,WAAmB,EACnB,MAAwD,EACxD,OAAgC;QAEhC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,aAAa,WAAW,4BAA4B,SAAS,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,YAAY,GAAG,KAAwC,CAAC;QAE9D,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzD,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrD,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrD,YAAY,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,SAAiB,EACjB,WAAmB,EACnB,KAAqB;QAErB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,aAAa,WAAW,4BAA4B,SAAS,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,8DAA8D;QAC7D,KAAK,CAAC,MAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/C,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,IAAY,EACZ,SAAiB,EACjB,WAAmB,EACnB,QAAgB;QAEhB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,kCAAkC;QAClC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YAC7B,wDAAwD;YACxD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;YACxB,OAAO,GAAG,GAAG,cAAc,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,SAAiB;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;QACzB,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,SAAiB,EAAE,WAAmB;QAChE,+DAA+D;QAC/D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE5C,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrD,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,sBAAsB,CAAC,IAAY,EAAE,SAAiB;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,OAAmB;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvF,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,OAAe;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvF,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -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"}