yaml-flow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +380 -0
- package/dist/core/index.cjs +557 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +102 -0
- package/dist/core/index.d.ts +102 -0
- package/dist/core/index.js +549 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.cjs +742 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +731 -0
- package/dist/index.js.map +1 -0
- package/dist/stores/file.cjs +115 -0
- package/dist/stores/file.cjs.map +1 -0
- package/dist/stores/file.d.cts +36 -0
- package/dist/stores/file.d.ts +36 -0
- package/dist/stores/file.js +113 -0
- package/dist/stores/file.js.map +1 -0
- package/dist/stores/localStorage.cjs +77 -0
- package/dist/stores/localStorage.cjs.map +1 -0
- package/dist/stores/localStorage.d.cts +34 -0
- package/dist/stores/localStorage.d.ts +34 -0
- package/dist/stores/localStorage.js +75 -0
- package/dist/stores/localStorage.js.map +1 -0
- package/dist/stores/memory.cjs +48 -0
- package/dist/stores/memory.cjs.map +1 -0
- package/dist/stores/memory.d.cts +27 -0
- package/dist/stores/memory.d.ts +27 -0
- package/dist/stores/memory.js +46 -0
- package/dist/stores/memory.js.map +1 -0
- package/dist/types-BoWndaAJ.d.cts +237 -0
- package/dist/types-BoWndaAJ.d.ts +237 -0
- package/package.json +83 -0
- package/schema/flow.schema.json +159 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// src/stores/localStorage.ts
|
|
2
|
+
var LocalStorageStore = class {
|
|
3
|
+
prefix;
|
|
4
|
+
constructor(options = {}) {
|
|
5
|
+
this.prefix = options.prefix ?? "yamlflow";
|
|
6
|
+
if (typeof localStorage === "undefined") {
|
|
7
|
+
throw new Error("LocalStorageStore requires localStorage (browser environment)");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
runKey(runId) {
|
|
11
|
+
return `${this.prefix}:run:${runId}`;
|
|
12
|
+
}
|
|
13
|
+
dataKey(runId) {
|
|
14
|
+
return `${this.prefix}:data:${runId}`;
|
|
15
|
+
}
|
|
16
|
+
indexKey() {
|
|
17
|
+
return `${this.prefix}:runs`;
|
|
18
|
+
}
|
|
19
|
+
async saveRunState(runId, state) {
|
|
20
|
+
localStorage.setItem(this.runKey(runId), JSON.stringify(state));
|
|
21
|
+
const runs = await this.listRuns();
|
|
22
|
+
if (!runs.includes(runId)) {
|
|
23
|
+
runs.push(runId);
|
|
24
|
+
localStorage.setItem(this.indexKey(), JSON.stringify(runs));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async loadRunState(runId) {
|
|
28
|
+
const raw = localStorage.getItem(this.runKey(runId));
|
|
29
|
+
return raw ? JSON.parse(raw) : null;
|
|
30
|
+
}
|
|
31
|
+
async deleteRunState(runId) {
|
|
32
|
+
localStorage.removeItem(this.runKey(runId));
|
|
33
|
+
localStorage.removeItem(this.dataKey(runId));
|
|
34
|
+
const runs = await this.listRuns();
|
|
35
|
+
const filtered = runs.filter((id) => id !== runId);
|
|
36
|
+
localStorage.setItem(this.indexKey(), JSON.stringify(filtered));
|
|
37
|
+
}
|
|
38
|
+
async setData(runId, key, value) {
|
|
39
|
+
const allData = await this.getAllData(runId);
|
|
40
|
+
allData[key] = value;
|
|
41
|
+
localStorage.setItem(this.dataKey(runId), JSON.stringify(allData));
|
|
42
|
+
}
|
|
43
|
+
async getData(runId, key) {
|
|
44
|
+
const allData = await this.getAllData(runId);
|
|
45
|
+
return allData[key];
|
|
46
|
+
}
|
|
47
|
+
async getAllData(runId) {
|
|
48
|
+
const raw = localStorage.getItem(this.dataKey(runId));
|
|
49
|
+
return raw ? JSON.parse(raw) : {};
|
|
50
|
+
}
|
|
51
|
+
async clearData(runId) {
|
|
52
|
+
localStorage.removeItem(this.dataKey(runId));
|
|
53
|
+
}
|
|
54
|
+
async listRuns() {
|
|
55
|
+
const raw = localStorage.getItem(this.indexKey());
|
|
56
|
+
return raw ? JSON.parse(raw) : [];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clear all flow data from localStorage
|
|
60
|
+
*/
|
|
61
|
+
clearAll() {
|
|
62
|
+
const keysToRemove = [];
|
|
63
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
64
|
+
const key = localStorage.key(i);
|
|
65
|
+
if (key?.startsWith(this.prefix + ":")) {
|
|
66
|
+
keysToRemove.push(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
keysToRemove.forEach((key) => localStorage.removeItem(key));
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export { LocalStorageStore };
|
|
74
|
+
//# sourceMappingURL=localStorage.js.map
|
|
75
|
+
//# sourceMappingURL=localStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stores/localStorage.ts"],"names":[],"mappings":"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","file":"localStorage.js","sourcesContent":["/**\n * yaml-flow - LocalStorage Store\n * \n * Browser localStorage-based store implementation.\n * Data persists across page reloads but is limited to ~5MB per origin.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport interface LocalStorageStoreOptions {\n /** Key prefix for namespacing (default: 'yamlflow') */\n prefix?: string;\n}\n\nexport class LocalStorageStore implements FlowStore {\n private prefix: string;\n\n constructor(options: LocalStorageStoreOptions = {}) {\n this.prefix = options.prefix ?? 'yamlflow';\n \n // Ensure localStorage is available\n if (typeof localStorage === 'undefined') {\n throw new Error('LocalStorageStore requires localStorage (browser environment)');\n }\n }\n\n private runKey(runId: string): string {\n return `${this.prefix}:run:${runId}`;\n }\n\n private dataKey(runId: string): string {\n return `${this.prefix}:data:${runId}`;\n }\n\n private indexKey(): string {\n return `${this.prefix}:runs`;\n }\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n localStorage.setItem(this.runKey(runId), JSON.stringify(state));\n \n // Update run index\n const runs = await this.listRuns();\n if (!runs.includes(runId)) {\n runs.push(runId);\n localStorage.setItem(this.indexKey(), JSON.stringify(runs));\n }\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n const raw = localStorage.getItem(this.runKey(runId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n localStorage.removeItem(this.runKey(runId));\n localStorage.removeItem(this.dataKey(runId));\n \n // Update run index\n const runs = await this.listRuns();\n const filtered = runs.filter(id => id !== runId);\n localStorage.setItem(this.indexKey(), JSON.stringify(filtered));\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n const allData = await this.getAllData(runId);\n allData[key] = value;\n localStorage.setItem(this.dataKey(runId), JSON.stringify(allData));\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n const allData = await this.getAllData(runId);\n return allData[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n const raw = localStorage.getItem(this.dataKey(runId));\n return raw ? JSON.parse(raw) : {};\n }\n\n async clearData(runId: string): Promise<void> {\n localStorage.removeItem(this.dataKey(runId));\n }\n\n async listRuns(): Promise<string[]> {\n const raw = localStorage.getItem(this.indexKey());\n return raw ? JSON.parse(raw) : [];\n }\n\n /**\n * Clear all flow data from localStorage\n */\n clearAll(): void {\n const keysToRemove: string[] = [];\n \n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix + ':')) {\n keysToRemove.push(key);\n }\n }\n \n keysToRemove.forEach(key => localStorage.removeItem(key));\n }\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/stores/memory.ts
|
|
4
|
+
var MemoryStore = class {
|
|
5
|
+
runs = /* @__PURE__ */ new Map();
|
|
6
|
+
data = /* @__PURE__ */ new Map();
|
|
7
|
+
async saveRunState(runId, state) {
|
|
8
|
+
this.runs.set(runId, { ...state });
|
|
9
|
+
}
|
|
10
|
+
async loadRunState(runId) {
|
|
11
|
+
const state = this.runs.get(runId);
|
|
12
|
+
return state ? { ...state } : null;
|
|
13
|
+
}
|
|
14
|
+
async deleteRunState(runId) {
|
|
15
|
+
this.runs.delete(runId);
|
|
16
|
+
this.data.delete(runId);
|
|
17
|
+
}
|
|
18
|
+
async setData(runId, key, value) {
|
|
19
|
+
if (!this.data.has(runId)) {
|
|
20
|
+
this.data.set(runId, {});
|
|
21
|
+
}
|
|
22
|
+
const runData = this.data.get(runId);
|
|
23
|
+
runData[key] = value;
|
|
24
|
+
}
|
|
25
|
+
async getData(runId, key) {
|
|
26
|
+
return this.data.get(runId)?.[key];
|
|
27
|
+
}
|
|
28
|
+
async getAllData(runId) {
|
|
29
|
+
return { ...this.data.get(runId) ?? {} };
|
|
30
|
+
}
|
|
31
|
+
async clearData(runId) {
|
|
32
|
+
this.data.delete(runId);
|
|
33
|
+
}
|
|
34
|
+
async listRuns() {
|
|
35
|
+
return Array.from(this.runs.keys());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Clear all data (useful for testing)
|
|
39
|
+
*/
|
|
40
|
+
clear() {
|
|
41
|
+
this.runs.clear();
|
|
42
|
+
this.data.clear();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
exports.MemoryStore = MemoryStore;
|
|
47
|
+
//# sourceMappingURL=memory.cjs.map
|
|
48
|
+
//# sourceMappingURL=memory.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stores/memory.ts"],"names":[],"mappings":";;;AASO,IAAM,cAAN,MAAuC;AAAA,EACpC,IAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,IAAA,uBAAiD,GAAA,EAAI;AAAA,EAE7D,MAAM,YAAA,CAAa,KAAA,EAAe,KAAA,EAAgC;AAChE,IAAA,IAAA,CAAK,KAAK,GAAA,CAAI,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAyC;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,IAAA,OAAO,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAM,GAAI,IAAA;AAAA,EAChC;AAAA,EAEA,MAAM,eAAe,KAAA,EAA8B;AACjD,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,GAAA,EAAa,KAAA,EAA+B;AACvE,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EACjB;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,GAAA,EAA+B;AAC1D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,GAAG,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,KAAA,EAAiD;AAChE,IAAA,OAAO,EAAE,GAAI,IAAA,CAAK,IAAA,CAAK,IAAI,KAAK,CAAA,IAAK,EAAC,EAAG;AAAA,EAC3C;AAAA,EAEA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,QAAA,GAA8B;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AACF","file":"memory.cjs","sourcesContent":["/**\n * yaml-flow - Memory Store\n * \n * In-memory store implementation. Works in both browser and Node.js.\n * Data is lost when the process exits - use for testing or short-lived flows.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport class MemoryStore implements FlowStore {\n private runs: Map<string, RunState> = new Map();\n private data: Map<string, Record<string, unknown>> = new Map();\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n this.runs.set(runId, { ...state });\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n const state = this.runs.get(runId);\n return state ? { ...state } : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n this.runs.delete(runId);\n this.data.delete(runId);\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n if (!this.data.has(runId)) {\n this.data.set(runId, {});\n }\n const runData = this.data.get(runId)!;\n runData[key] = value;\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n return this.data.get(runId)?.[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n return { ...(this.data.get(runId) ?? {}) };\n }\n\n async clearData(runId: string): Promise<void> {\n this.data.delete(runId);\n }\n\n async listRuns(): Promise<string[]> {\n return Array.from(this.runs.keys());\n }\n\n /**\n * Clear all data (useful for testing)\n */\n clear(): void {\n this.runs.clear();\n this.data.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { f as FlowStore, g as RunState } from '../types-BoWndaAJ.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* yaml-flow - Memory Store
|
|
5
|
+
*
|
|
6
|
+
* In-memory store implementation. Works in both browser and Node.js.
|
|
7
|
+
* Data is lost when the process exits - use for testing or short-lived flows.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare class MemoryStore implements FlowStore {
|
|
11
|
+
private runs;
|
|
12
|
+
private data;
|
|
13
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
14
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
15
|
+
deleteRunState(runId: string): Promise<void>;
|
|
16
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
17
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
18
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
19
|
+
clearData(runId: string): Promise<void>;
|
|
20
|
+
listRuns(): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Clear all data (useful for testing)
|
|
23
|
+
*/
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { MemoryStore };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { f as FlowStore, g as RunState } from '../types-BoWndaAJ.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* yaml-flow - Memory Store
|
|
5
|
+
*
|
|
6
|
+
* In-memory store implementation. Works in both browser and Node.js.
|
|
7
|
+
* Data is lost when the process exits - use for testing or short-lived flows.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
declare class MemoryStore implements FlowStore {
|
|
11
|
+
private runs;
|
|
12
|
+
private data;
|
|
13
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
14
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
15
|
+
deleteRunState(runId: string): Promise<void>;
|
|
16
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
17
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
18
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
19
|
+
clearData(runId: string): Promise<void>;
|
|
20
|
+
listRuns(): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Clear all data (useful for testing)
|
|
23
|
+
*/
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { MemoryStore };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// src/stores/memory.ts
|
|
2
|
+
var MemoryStore = class {
|
|
3
|
+
runs = /* @__PURE__ */ new Map();
|
|
4
|
+
data = /* @__PURE__ */ new Map();
|
|
5
|
+
async saveRunState(runId, state) {
|
|
6
|
+
this.runs.set(runId, { ...state });
|
|
7
|
+
}
|
|
8
|
+
async loadRunState(runId) {
|
|
9
|
+
const state = this.runs.get(runId);
|
|
10
|
+
return state ? { ...state } : null;
|
|
11
|
+
}
|
|
12
|
+
async deleteRunState(runId) {
|
|
13
|
+
this.runs.delete(runId);
|
|
14
|
+
this.data.delete(runId);
|
|
15
|
+
}
|
|
16
|
+
async setData(runId, key, value) {
|
|
17
|
+
if (!this.data.has(runId)) {
|
|
18
|
+
this.data.set(runId, {});
|
|
19
|
+
}
|
|
20
|
+
const runData = this.data.get(runId);
|
|
21
|
+
runData[key] = value;
|
|
22
|
+
}
|
|
23
|
+
async getData(runId, key) {
|
|
24
|
+
return this.data.get(runId)?.[key];
|
|
25
|
+
}
|
|
26
|
+
async getAllData(runId) {
|
|
27
|
+
return { ...this.data.get(runId) ?? {} };
|
|
28
|
+
}
|
|
29
|
+
async clearData(runId) {
|
|
30
|
+
this.data.delete(runId);
|
|
31
|
+
}
|
|
32
|
+
async listRuns() {
|
|
33
|
+
return Array.from(this.runs.keys());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Clear all data (useful for testing)
|
|
37
|
+
*/
|
|
38
|
+
clear() {
|
|
39
|
+
this.runs.clear();
|
|
40
|
+
this.data.clear();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { MemoryStore };
|
|
45
|
+
//# sourceMappingURL=memory.js.map
|
|
46
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/stores/memory.ts"],"names":[],"mappings":";AASO,IAAM,cAAN,MAAuC;AAAA,EACpC,IAAA,uBAAkC,GAAA,EAAI;AAAA,EACtC,IAAA,uBAAiD,GAAA,EAAI;AAAA,EAE7D,MAAM,YAAA,CAAa,KAAA,EAAe,KAAA,EAAgC;AAChE,IAAA,IAAA,CAAK,KAAK,GAAA,CAAI,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,KAAA,EAAyC;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,IAAA,OAAO,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAM,GAAI,IAAA;AAAA,EAChC;AAAA,EAEA,MAAM,eAAe,KAAA,EAA8B;AACjD,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,GAAA,EAAa,KAAA,EAA+B;AACvE,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,EACjB;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,GAAA,EAA+B;AAC1D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,GAAG,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,KAAA,EAAiD;AAChE,IAAA,OAAO,EAAE,GAAI,IAAA,CAAK,IAAA,CAAK,IAAI,KAAK,CAAA,IAAK,EAAC,EAAG;AAAA,EAC3C;AAAA,EAEA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,QAAA,GAA8B;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AACF","file":"memory.js","sourcesContent":["/**\n * yaml-flow - Memory Store\n * \n * In-memory store implementation. Works in both browser and Node.js.\n * Data is lost when the process exits - use for testing or short-lived flows.\n */\n\nimport type { FlowStore, RunState } from '../core/types.js';\n\nexport class MemoryStore implements FlowStore {\n private runs: Map<string, RunState> = new Map();\n private data: Map<string, Record<string, unknown>> = new Map();\n\n async saveRunState(runId: string, state: RunState): Promise<void> {\n this.runs.set(runId, { ...state });\n }\n\n async loadRunState(runId: string): Promise<RunState | null> {\n const state = this.runs.get(runId);\n return state ? { ...state } : null;\n }\n\n async deleteRunState(runId: string): Promise<void> {\n this.runs.delete(runId);\n this.data.delete(runId);\n }\n\n async setData(runId: string, key: string, value: unknown): Promise<void> {\n if (!this.data.has(runId)) {\n this.data.set(runId, {});\n }\n const runData = this.data.get(runId)!;\n runData[key] = value;\n }\n\n async getData(runId: string, key: string): Promise<unknown> {\n return this.data.get(runId)?.[key];\n }\n\n async getAllData(runId: string): Promise<Record<string, unknown>> {\n return { ...(this.data.get(runId) ?? {}) };\n }\n\n async clearData(runId: string): Promise<void> {\n this.data.delete(runId);\n }\n\n async listRuns(): Promise<string[]> {\n return Array.from(this.runs.keys());\n }\n\n /**\n * Clear all data (useful for testing)\n */\n clear(): void {\n this.runs.clear();\n this.data.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yaml-flow - Core Types
|
|
3
|
+
*
|
|
4
|
+
* All type definitions for the workflow engine.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Root flow configuration - maps to YAML file structure
|
|
8
|
+
*/
|
|
9
|
+
interface FlowConfig {
|
|
10
|
+
/** Optional flow identifier */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Flow settings */
|
|
13
|
+
settings: FlowSettings;
|
|
14
|
+
/** Step definitions */
|
|
15
|
+
steps: Record<string, StepConfig>;
|
|
16
|
+
/** Terminal state definitions */
|
|
17
|
+
terminal_states: Record<string, TerminalStateConfig>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Flow-level settings
|
|
21
|
+
*/
|
|
22
|
+
interface FlowSettings {
|
|
23
|
+
/** Step to start execution from */
|
|
24
|
+
start_step: string;
|
|
25
|
+
/** Maximum steps before forced termination (default: 100) */
|
|
26
|
+
max_total_steps?: number;
|
|
27
|
+
/** Flow timeout in milliseconds (optional) */
|
|
28
|
+
timeout_ms?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Individual step configuration
|
|
32
|
+
*/
|
|
33
|
+
interface StepConfig {
|
|
34
|
+
/** Human-readable description */
|
|
35
|
+
description?: string;
|
|
36
|
+
/** Data keys this step expects as input */
|
|
37
|
+
expects_data?: string[];
|
|
38
|
+
/** Data keys this step produces as output */
|
|
39
|
+
produces_data?: string[];
|
|
40
|
+
/** Transition mapping: result -> next step name */
|
|
41
|
+
transitions: Record<string, string>;
|
|
42
|
+
/** Retry configuration for failures */
|
|
43
|
+
retry?: RetryConfig;
|
|
44
|
+
/** Circuit breaker for loops */
|
|
45
|
+
circuit_breaker?: CircuitBreakerConfig;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Retry configuration for step failures
|
|
49
|
+
*/
|
|
50
|
+
interface RetryConfig {
|
|
51
|
+
/** Maximum retry attempts */
|
|
52
|
+
max_attempts: number;
|
|
53
|
+
/** Delay between retries in ms */
|
|
54
|
+
delay_ms?: number;
|
|
55
|
+
/** Backoff multiplier (e.g., 2 for exponential) */
|
|
56
|
+
backoff_multiplier?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Circuit breaker configuration
|
|
60
|
+
*/
|
|
61
|
+
interface CircuitBreakerConfig {
|
|
62
|
+
/** Maximum iterations before circuit opens */
|
|
63
|
+
max_iterations: number;
|
|
64
|
+
/** Step to transition to when circuit opens */
|
|
65
|
+
on_open: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Terminal state configuration
|
|
69
|
+
*/
|
|
70
|
+
interface TerminalStateConfig {
|
|
71
|
+
/** Human-readable description */
|
|
72
|
+
description?: string;
|
|
73
|
+
/** Intent/status to return (e.g., 'success', 'error', 'cancelled') */
|
|
74
|
+
return_intent: string;
|
|
75
|
+
/** Data key(s) to include in result, or false to exclude */
|
|
76
|
+
return_artifacts?: string | string[] | false;
|
|
77
|
+
/** Data keys this terminal state expects */
|
|
78
|
+
expects_data?: string[];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Step handler function signature
|
|
82
|
+
*/
|
|
83
|
+
type StepHandler = (input: StepInput, context: StepContext) => StepResult | Promise<StepResult>;
|
|
84
|
+
/**
|
|
85
|
+
* Input passed to step handlers
|
|
86
|
+
*/
|
|
87
|
+
interface StepInput {
|
|
88
|
+
/** Data from previous steps based on expects_data */
|
|
89
|
+
[key: string]: unknown;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Context available to step handlers
|
|
93
|
+
*/
|
|
94
|
+
interface StepContext {
|
|
95
|
+
/** Run identifier */
|
|
96
|
+
runId: string;
|
|
97
|
+
/** Current step name */
|
|
98
|
+
stepName: string;
|
|
99
|
+
/** Injected components (DB, API clients, etc.) */
|
|
100
|
+
components: Record<string, unknown>;
|
|
101
|
+
/** Store instance for direct access if needed */
|
|
102
|
+
store: FlowStore;
|
|
103
|
+
/** Abort signal for cancellation */
|
|
104
|
+
signal?: AbortSignal;
|
|
105
|
+
/** Emit events for UI updates */
|
|
106
|
+
emit: (event: string, data: unknown) => void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Result returned from step handlers
|
|
110
|
+
*/
|
|
111
|
+
interface StepResult {
|
|
112
|
+
/** Result key for transition routing (e.g., 'success', 'failure', 'retry') */
|
|
113
|
+
result: string;
|
|
114
|
+
/** Data to merge into flow state (must match produces_data) */
|
|
115
|
+
data?: Record<string, unknown>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Engine configuration options
|
|
119
|
+
*/
|
|
120
|
+
interface EngineOptions {
|
|
121
|
+
/** Persistence store (default: MemoryStore) */
|
|
122
|
+
store?: FlowStore;
|
|
123
|
+
/** Injected components available to handlers */
|
|
124
|
+
components?: Record<string, unknown>;
|
|
125
|
+
/** Abort signal for cancellation */
|
|
126
|
+
signal?: AbortSignal;
|
|
127
|
+
/** Callback on each step execution */
|
|
128
|
+
onStep?: (stepName: string, result: StepResult) => void;
|
|
129
|
+
/** Callback on step transition */
|
|
130
|
+
onTransition?: (from: string, to: string) => void;
|
|
131
|
+
/** Callback on flow completion */
|
|
132
|
+
onComplete?: (result: FlowResult) => void;
|
|
133
|
+
/** Callback on flow error */
|
|
134
|
+
onError?: (error: Error) => void;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Final result of flow execution
|
|
138
|
+
*/
|
|
139
|
+
interface FlowResult {
|
|
140
|
+
/** Run identifier */
|
|
141
|
+
runId: string;
|
|
142
|
+
/** Completion status */
|
|
143
|
+
status: 'completed' | 'failed' | 'cancelled' | 'timeout' | 'max_iterations';
|
|
144
|
+
/** Return intent from terminal state */
|
|
145
|
+
intent?: string;
|
|
146
|
+
/** Returned artifacts/data */
|
|
147
|
+
data: Record<string, unknown>;
|
|
148
|
+
/** Final step name */
|
|
149
|
+
finalStep: string;
|
|
150
|
+
/** Steps executed (in order) */
|
|
151
|
+
stepHistory: string[];
|
|
152
|
+
/** Total execution time in ms */
|
|
153
|
+
durationMs: number;
|
|
154
|
+
/** Error if failed */
|
|
155
|
+
error?: Error;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Pluggable store interface for persistence
|
|
159
|
+
*/
|
|
160
|
+
interface FlowStore {
|
|
161
|
+
/**
|
|
162
|
+
* Save run state
|
|
163
|
+
*/
|
|
164
|
+
saveRunState(runId: string, state: RunState): Promise<void>;
|
|
165
|
+
/**
|
|
166
|
+
* Load run state
|
|
167
|
+
*/
|
|
168
|
+
loadRunState(runId: string): Promise<RunState | null>;
|
|
169
|
+
/**
|
|
170
|
+
* Delete run state
|
|
171
|
+
*/
|
|
172
|
+
deleteRunState(runId: string): Promise<void>;
|
|
173
|
+
/**
|
|
174
|
+
* Set a data value for a run
|
|
175
|
+
*/
|
|
176
|
+
setData(runId: string, key: string, value: unknown): Promise<void>;
|
|
177
|
+
/**
|
|
178
|
+
* Get a data value for a run
|
|
179
|
+
*/
|
|
180
|
+
getData(runId: string, key: string): Promise<unknown>;
|
|
181
|
+
/**
|
|
182
|
+
* Get all data for a run
|
|
183
|
+
*/
|
|
184
|
+
getAllData(runId: string): Promise<Record<string, unknown>>;
|
|
185
|
+
/**
|
|
186
|
+
* Clear all data for a run
|
|
187
|
+
*/
|
|
188
|
+
clearData(runId: string): Promise<void>;
|
|
189
|
+
/**
|
|
190
|
+
* List all active run IDs (optional - for management)
|
|
191
|
+
*/
|
|
192
|
+
listRuns?(): Promise<string[]>;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Persisted run state
|
|
196
|
+
*/
|
|
197
|
+
interface RunState {
|
|
198
|
+
/** Run identifier */
|
|
199
|
+
runId: string;
|
|
200
|
+
/** Flow identifier */
|
|
201
|
+
flowId: string;
|
|
202
|
+
/** Current step name */
|
|
203
|
+
currentStep: string;
|
|
204
|
+
/** Execution status */
|
|
205
|
+
status: 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';
|
|
206
|
+
/** Ordered list of executed steps */
|
|
207
|
+
stepHistory: string[];
|
|
208
|
+
/** Iteration count per step (for circuit breakers) */
|
|
209
|
+
iterationCounts: Record<string, number>;
|
|
210
|
+
/** Retry counts per step */
|
|
211
|
+
retryCounts: Record<string, number>;
|
|
212
|
+
/** Timestamp when run started (ms since epoch) */
|
|
213
|
+
startedAt: number;
|
|
214
|
+
/** Timestamp of last update (ms since epoch) */
|
|
215
|
+
updatedAt: number;
|
|
216
|
+
/** Timestamp when paused (if applicable) */
|
|
217
|
+
pausedAt?: number;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Event types emitted by the engine
|
|
221
|
+
*/
|
|
222
|
+
type FlowEventType = 'step:start' | 'step:complete' | 'step:error' | 'transition' | 'flow:start' | 'flow:complete' | 'flow:error' | 'flow:paused' | 'flow:resumed';
|
|
223
|
+
/**
|
|
224
|
+
* Event payload structure
|
|
225
|
+
*/
|
|
226
|
+
interface FlowEvent {
|
|
227
|
+
type: FlowEventType;
|
|
228
|
+
runId: string;
|
|
229
|
+
timestamp: number;
|
|
230
|
+
data: Record<string, unknown>;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Event listener function
|
|
234
|
+
*/
|
|
235
|
+
type FlowEventListener = (event: FlowEvent) => void;
|
|
236
|
+
|
|
237
|
+
export type { CircuitBreakerConfig as C, EngineOptions as E, FlowConfig as F, RetryConfig as R, StepConfig as S, TerminalStateConfig as T, FlowEvent as a, FlowEventListener as b, FlowEventType as c, FlowResult as d, FlowSettings as e, FlowStore as f, RunState as g, StepContext as h, StepHandler as i, StepInput as j, StepResult as k };
|