@crewx/workflow 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,YAAY,EACZ,cAAc,EAEd,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAyPjB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;;IAevB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,GAAG,IAAI;IA8BnD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAyDjG,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;CAGtC"}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.WorkflowEngine = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const yaml = __importStar(require("js-yaml"));
40
+ const mermaid_1 = require("./mermaid");
41
+ const NODE_REQUIRED_FIELDS = {
42
+ agent_task: ['agent'],
43
+ parallel: ['branches', 'join'],
44
+ join: [],
45
+ branch: ['condition', 'branches'],
46
+ approval: ['description', 'on_approve', 'on_reject'],
47
+ end: [],
48
+ };
49
+ function resolveRef(ref, root, depth) {
50
+ if (depth > 10)
51
+ return null;
52
+ const parts = ref.replace('#/', '').split('/');
53
+ let node = root;
54
+ for (const p of parts) {
55
+ node = node?.[p];
56
+ if (!node)
57
+ return null;
58
+ }
59
+ const schemaNode = node;
60
+ if (schemaNode.$ref)
61
+ return resolveRef(schemaNode.$ref, root, depth + 1);
62
+ return schemaNode;
63
+ }
64
+ function getJsonType(value) {
65
+ if (value === null || value === undefined)
66
+ return 'null';
67
+ if (Array.isArray(value))
68
+ return 'array';
69
+ return typeof value;
70
+ }
71
+ function validateSchema(value, schemaNode, root, jsonPath, errors, depth) {
72
+ if (depth > 20 || !schemaNode)
73
+ return;
74
+ if (schemaNode.$ref) {
75
+ const resolved = resolveRef(schemaNode.$ref, root, 0);
76
+ if (!resolved) {
77
+ errors.push({ path: jsonPath, message: `cannot resolve $ref "${schemaNode.$ref}"` });
78
+ return;
79
+ }
80
+ schemaNode = resolved;
81
+ }
82
+ if (schemaNode.type) {
83
+ const actualType = getJsonType(value);
84
+ if (schemaNode.type !== actualType) {
85
+ errors.push({ path: jsonPath, message: `expected type "${schemaNode.type}", got "${actualType}"` });
86
+ return;
87
+ }
88
+ }
89
+ if (schemaNode.enum) {
90
+ if (!schemaNode.enum.includes(value)) {
91
+ errors.push({ path: jsonPath, message: `value "${value}" not in enum [${schemaNode.enum.join(', ')}]` });
92
+ }
93
+ }
94
+ if (schemaNode.type === 'object' && typeof value === 'object' && value !== null && !Array.isArray(value)) {
95
+ const obj = value;
96
+ if (schemaNode.required) {
97
+ for (const req of schemaNode.required) {
98
+ if (!(req in obj)) {
99
+ errors.push({ path: `${jsonPath}.${req}`, message: 'required field missing' });
100
+ }
101
+ }
102
+ }
103
+ if (schemaNode.properties) {
104
+ for (const [key, propSchema] of Object.entries(schemaNode.properties)) {
105
+ if (key in obj) {
106
+ validateSchema(obj[key], propSchema, root, `${jsonPath}.${key}`, errors, depth + 1);
107
+ }
108
+ }
109
+ }
110
+ if (schemaNode.additionalProperties && typeof schemaNode.additionalProperties === 'object') {
111
+ const knownKeys = schemaNode.properties ? Object.keys(schemaNode.properties) : [];
112
+ for (const key of Object.keys(obj)) {
113
+ if (!knownKeys.includes(key)) {
114
+ validateSchema(obj[key], schemaNode.additionalProperties, root, `${jsonPath}.${key}`, errors, depth + 1);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ if (schemaNode.type === 'array' && Array.isArray(value)) {
120
+ if (schemaNode.items) {
121
+ value.forEach((item, i) => {
122
+ validateSchema(item, schemaNode.items, root, `${jsonPath}[${i}]`, errors, depth + 1);
123
+ });
124
+ }
125
+ }
126
+ }
127
+ function validateNodeTypeRequirements(nodeId, node, jsonPath, errors) {
128
+ const required = NODE_REQUIRED_FIELDS[node.type];
129
+ if (!required)
130
+ return;
131
+ for (const field of required) {
132
+ if (!(field in node)) {
133
+ errors.push({ path: `${jsonPath}.${field}`, message: `"${node.type}" node requires "${field}" field` });
134
+ }
135
+ }
136
+ if (node.type === 'parallel' && node.branches && !Array.isArray(node.branches)) {
137
+ errors.push({ path: `${jsonPath}.branches`, message: '"parallel" node branches must be an array of node IDs' });
138
+ }
139
+ if (node.type === 'branch' && node.branches && Array.isArray(node.branches)) {
140
+ errors.push({ path: `${jsonPath}.branches`, message: '"branch" node branches must be a Record (object), not an array' });
141
+ }
142
+ }
143
+ function levenshtein(a, b) {
144
+ const m = a.length;
145
+ const n = b.length;
146
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
147
+ for (let i = 0; i <= m; i++)
148
+ dp[i][0] = i;
149
+ for (let j = 0; j <= n; j++)
150
+ dp[0][j] = j;
151
+ for (let i = 1; i <= m; i++) {
152
+ for (let j = 1; j <= n; j++) {
153
+ dp[i][j] = a[i - 1] === b[j - 1]
154
+ ? dp[i - 1][j - 1]
155
+ : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
156
+ }
157
+ }
158
+ return dp[m][n];
159
+ }
160
+ function findSimilar(target, candidates) {
161
+ let best = null;
162
+ let bestScore = Infinity;
163
+ for (const c of candidates) {
164
+ const score = levenshtein(target, c);
165
+ if (score < bestScore && score <= 3) {
166
+ bestScore = score;
167
+ best = c;
168
+ }
169
+ }
170
+ return best;
171
+ }
172
+ function validateReferences(wfName, spec, agents, errors) {
173
+ const nodes = spec.nodes;
174
+ const nodeIds = new Set(Object.keys(nodes));
175
+ const prefix = `workflows.${wfName}`;
176
+ for (const [nodeId, node] of Object.entries(nodes)) {
177
+ const np = `${prefix}.nodes.${nodeId}`;
178
+ if (node.next && !nodeIds.has(node.next)) {
179
+ errors.push({ path: `${np}.next`, message: `"${node.next}" node not found` });
180
+ }
181
+ if (node.agent && agents && !agents[node.agent]) {
182
+ errors.push({ path: `${np}.agent`, message: `agent "${node.agent}" not found in agents section` });
183
+ }
184
+ if (node.type === 'parallel' && Array.isArray(node.branches)) {
185
+ node.branches.forEach((branchId, i) => {
186
+ if (!nodeIds.has(branchId)) {
187
+ errors.push({ path: `${np}.branches[${i}]`, message: `"${branchId}" node not found` });
188
+ }
189
+ });
190
+ if (node.join && !nodeIds.has(node.join)) {
191
+ errors.push({ path: `${np}.join`, message: `"${node.join}" node not found` });
192
+ }
193
+ }
194
+ if (node.type === 'branch' && node.branches && typeof node.branches === 'object' && !Array.isArray(node.branches)) {
195
+ for (const [condVal, targetId] of Object.entries(node.branches)) {
196
+ if (!nodeIds.has(targetId)) {
197
+ const similar = findSimilar(targetId, nodeIds);
198
+ let msg = `"${targetId}" node not found`;
199
+ if (similar)
200
+ msg += ` (did you mean "${similar}"?)`;
201
+ errors.push({ path: `${np}.branches.${condVal}`, message: msg });
202
+ }
203
+ }
204
+ }
205
+ if (node.default && !nodeIds.has(node.default)) {
206
+ errors.push({ path: `${np}.default`, message: `"${node.default}" node not found` });
207
+ }
208
+ if (node.type === 'approval') {
209
+ if (node.on_approve && !nodeIds.has(node.on_approve)) {
210
+ errors.push({ path: `${np}.on_approve`, message: `"${node.on_approve}" node not found` });
211
+ }
212
+ if (node.on_reject && !nodeIds.has(node.on_reject)) {
213
+ errors.push({ path: `${np}.on_reject`, message: `"${node.on_reject}" node not found` });
214
+ }
215
+ }
216
+ if (node.on_error?.fallback_node && !nodeIds.has(node.on_error.fallback_node)) {
217
+ errors.push({ path: `${np}.on_error.fallback_node`, message: `"${node.on_error.fallback_node}" node not found` });
218
+ }
219
+ }
220
+ }
221
+ class WorkflowEngine {
222
+ constructor() {
223
+ let schemaPath = path.join(__dirname, '..', 'workflow-schema.json');
224
+ if (!fs.existsSync(schemaPath)) {
225
+ schemaPath = path.join(__dirname, '..', '..', 'workflow-schema.json');
226
+ }
227
+ this.schema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
228
+ }
229
+ loadWorkflows(dir) {
230
+ if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
231
+ return null;
232
+ }
233
+ const files = fs.readdirSync(dir).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
234
+ const workflows = [];
235
+ for (const file of files) {
236
+ const filePath = path.join(dir, file);
237
+ try {
238
+ const content = fs.readFileSync(filePath, 'utf-8');
239
+ const doc = yaml.load(content);
240
+ if (!doc?.workflows || typeof doc.workflows !== 'object')
241
+ continue;
242
+ for (const [id, spec] of Object.entries(doc.workflows)) {
243
+ workflows.push({ id, filePath, spec });
244
+ }
245
+ }
246
+ catch {
247
+ }
248
+ }
249
+ return workflows;
250
+ }
251
+ validateFile(filePath) {
252
+ let content;
253
+ try {
254
+ content = fs.readFileSync(filePath, 'utf-8');
255
+ }
256
+ catch {
257
+ return { success: false, results: [], error: `File not found or unreadable: ${filePath}` };
258
+ }
259
+ let doc;
260
+ try {
261
+ doc = yaml.load(content);
262
+ }
263
+ catch (err) {
264
+ const message = err instanceof Error ? err.message : String(err);
265
+ return { success: false, results: [], error: `YAML parse error: ${message}` };
266
+ }
267
+ if (!doc || typeof doc !== 'object') {
268
+ return { success: false, results: [], error: 'Invalid YAML: document is empty or not an object' };
269
+ }
270
+ if (!doc.workflows || typeof doc.workflows !== 'object') {
271
+ return { success: true, results: [] };
272
+ }
273
+ const agents = doc.agents ?? null;
274
+ const results = [];
275
+ let hasErrors = false;
276
+ for (const [wfName, wfSpec] of Object.entries(doc.workflows)) {
277
+ const errors = [];
278
+ const basePath = `workflows.${wfName}`;
279
+ validateSchema(wfSpec, this.schema.definitions['WorkflowSpec'], this.schema, basePath, errors, 0);
280
+ if (wfSpec.nodes && typeof wfSpec.nodes === 'object') {
281
+ for (const [nodeId, node] of Object.entries(wfSpec.nodes)) {
282
+ if (node && typeof node === 'object' && node.type) {
283
+ validateNodeTypeRequirements(nodeId, node, `${basePath}.nodes.${nodeId}`, errors);
284
+ }
285
+ }
286
+ }
287
+ validateReferences(wfName, wfSpec, agents, errors);
288
+ if (errors.length > 0)
289
+ hasErrors = true;
290
+ results.push({ name: wfName, valid: errors.length === 0, errors });
291
+ }
292
+ return { success: !hasErrors, results };
293
+ }
294
+ toMermaid(spec) {
295
+ return (0, mermaid_1.toMermaid)(spec);
296
+ }
297
+ }
298
+ exports.WorkflowEngine = WorkflowEngine;
299
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { WorkflowSpec } from './types';
2
+ export declare function safeNodeId(nodeId: string): string;
3
+ export declare function escapeMermaidLabel(s: string): string;
4
+ export declare function toMermaid(spec: WorkflowSpec): string;
5
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/mermaid.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAQ1D,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAMD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD;AAiDD,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAuDpD"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeNodeId = safeNodeId;
4
+ exports.escapeMermaidLabel = escapeMermaidLabel;
5
+ exports.toMermaid = toMermaid;
6
+ const MERMAID_RESERVED = new Set([
7
+ 'end', 'subgraph', 'direction', 'click', 'style', 'classDef', 'class', 'linkStyle',
8
+ ]);
9
+ function safeNodeId(nodeId) {
10
+ return MERMAID_RESERVED.has(nodeId) ? `node_${nodeId}` : nodeId;
11
+ }
12
+ function escapeMermaidLabel(s) {
13
+ return s
14
+ .replace(/"/g, '#quot;')
15
+ .replace(/</g, '#lt;')
16
+ .replace(/>/g, '#gt;')
17
+ .replace(/\{/g, '#123;')
18
+ .replace(/\}/g, '#125;')
19
+ .slice(0, 50);
20
+ }
21
+ function buildLabel(nodeId, node) {
22
+ const agent = node.agent ? `@${escapeMermaidLabel(node.agent)}` : '';
23
+ const desc = node.description
24
+ ?? node.input?.split('\n')[0]?.trim()
25
+ ?? nodeId;
26
+ const escapedDesc = escapeMermaidLabel(desc);
27
+ if (agent) {
28
+ return `${agent} — ${escapedDesc}`;
29
+ }
30
+ return escapedDesc;
31
+ }
32
+ function wrapShape(nodeId, label, type) {
33
+ const safe = safeNodeId(nodeId);
34
+ const q = `"${label}"`;
35
+ switch (type) {
36
+ case 'branch':
37
+ return `${safe}{${q}}`;
38
+ case 'parallel':
39
+ return `${safe}[/${q}/]`;
40
+ case 'join':
41
+ return `${safe}[\\${q}\\]`;
42
+ case 'end':
43
+ return `${safe}((${q}))`;
44
+ default:
45
+ return `${safe}[${q}]`;
46
+ }
47
+ }
48
+ function toMermaid(spec) {
49
+ const lines = ['flowchart TD'];
50
+ const nodes = spec.nodes;
51
+ for (const [nodeId, node] of Object.entries(nodes)) {
52
+ const label = buildLabel(nodeId, node);
53
+ lines.push(` ${wrapShape(nodeId, label, node.type)}`);
54
+ }
55
+ lines.push('');
56
+ for (const [nodeId, node] of Object.entries(nodes)) {
57
+ const src = safeNodeId(nodeId);
58
+ if (node.next) {
59
+ lines.push(` ${src} --> ${safeNodeId(node.next)}`);
60
+ }
61
+ if (node.type === 'branch' && node.branches && !Array.isArray(node.branches)) {
62
+ for (const [condLabel, target] of Object.entries(node.branches)) {
63
+ const edgeLabel = escapeMermaidLabel(condLabel === 'true' ? '통과' : condLabel === 'false' ? '반려' : condLabel);
64
+ lines.push(` ${src} -->|${edgeLabel}| ${safeNodeId(target)}`);
65
+ }
66
+ }
67
+ if (node.type === 'parallel' && Array.isArray(node.branches)) {
68
+ for (const branchId of node.branches) {
69
+ lines.push(` ${src} --> ${safeNodeId(branchId)}`);
70
+ }
71
+ if (node.join) {
72
+ for (const branchId of node.branches) {
73
+ const branchNode = nodes[branchId];
74
+ if (!branchNode?.next) {
75
+ lines.push(` ${safeNodeId(branchId)} --> ${safeNodeId(node.join)}`);
76
+ }
77
+ }
78
+ }
79
+ }
80
+ if (node.type === 'approval') {
81
+ if (node.on_approve) {
82
+ lines.push(` ${src} -->|${escapeMermaidLabel('승인')}| ${safeNodeId(node.on_approve)}`);
83
+ }
84
+ if (node.on_reject) {
85
+ lines.push(` ${src} -->|${escapeMermaidLabel('반려')}| ${safeNodeId(node.on_reject)}`);
86
+ }
87
+ }
88
+ }
89
+ return lines.join('\n');
90
+ }
91
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/mermaid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { RunExecution } from './types';
2
+ export declare function parseSetArgs(args: string[]): Record<string, string>;
3
+ export declare function readStdin(): Promise<string>;
4
+ export declare class RunManager {
5
+ private runsDir;
6
+ private readonly resolvedDir;
7
+ constructor(runsDir?: string);
8
+ ensureRunsDir(): void;
9
+ loadRun(execId: string): RunExecution | null;
10
+ saveRun(run: RunExecution): void;
11
+ private loadWorkflowYaml;
12
+ start(yamlPath: string, workflowId?: string, overrides?: Record<string, string>): RunExecution;
13
+ getState(execId: string): Record<string, unknown>;
14
+ setState(execId: string, updates: Record<string, string>): void;
15
+ moveNode(execId: string, nodeId: string): RunExecution;
16
+ reset(execId: string): RunExecution;
17
+ listRuns(): RunExecution[];
18
+ }
19
+ //# sourceMappingURL=run-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-manager.d.ts","sourceRoot":"","sources":["../../src/run-manager.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM5C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAenE;AAKD,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAMjD;AAMD,qBAAa,UAAU;IAGT,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEjB,OAAO,GAAE,MAA+B;IAI5D,aAAa,IAAI,IAAI;IAMrB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAM5C,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAOhC,OAAO,CAAC,gBAAgB;IAQxB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY;IAiD9F,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQjD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAS/D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY;IAgBtD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAanC,QAAQ,IAAI,YAAY,EAAE;CAqB3B"}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RunManager = void 0;
37
+ exports.parseSetArgs = parseSetArgs;
38
+ exports.readStdin = readStdin;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const yaml = __importStar(require("js-yaml"));
42
+ function parseSetArgs(args) {
43
+ const sets = {};
44
+ for (let i = 0; i < args.length; i++) {
45
+ if (args[i] === '--set' && i + 1 < args.length) {
46
+ const pair = args[i + 1];
47
+ const eqIdx = pair.indexOf('=');
48
+ if (eqIdx !== -1) {
49
+ const key = pair.substring(0, eqIdx);
50
+ const value = pair.substring(eqIdx + 1);
51
+ sets[key] = value;
52
+ }
53
+ i++;
54
+ }
55
+ }
56
+ return sets;
57
+ }
58
+ async function readStdin() {
59
+ const chunks = [];
60
+ for await (const chunk of process.stdin) {
61
+ chunks.push(chunk);
62
+ }
63
+ return Buffer.concat(chunks).toString('utf-8').trimEnd();
64
+ }
65
+ class RunManager {
66
+ constructor(runsDir = '.crewx/workflow-runs') {
67
+ this.runsDir = runsDir;
68
+ this.resolvedDir = path.resolve(process.cwd(), this.runsDir);
69
+ }
70
+ ensureRunsDir() {
71
+ if (!fs.existsSync(this.resolvedDir)) {
72
+ fs.mkdirSync(this.resolvedDir, { recursive: true });
73
+ }
74
+ }
75
+ loadRun(execId) {
76
+ const filePath = path.join(this.resolvedDir, `${execId}.json`);
77
+ if (!fs.existsSync(filePath))
78
+ return null;
79
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
80
+ }
81
+ saveRun(run) {
82
+ this.ensureRunsDir();
83
+ run.updated_at = new Date().toISOString();
84
+ const filePath = path.join(this.resolvedDir, `${run.id}.json`);
85
+ fs.writeFileSync(filePath, JSON.stringify(run, null, 2) + '\n', 'utf-8');
86
+ }
87
+ loadWorkflowYaml(yamlPath) {
88
+ if (!fs.existsSync(yamlPath))
89
+ return null;
90
+ const content = fs.readFileSync(yamlPath, 'utf-8');
91
+ const doc = yaml.load(content);
92
+ if (!doc || !doc.workflows || typeof doc.workflows !== 'object')
93
+ return null;
94
+ return doc;
95
+ }
96
+ start(yamlPath, workflowId, overrides) {
97
+ const doc = this.loadWorkflowYaml(yamlPath);
98
+ if (!doc) {
99
+ throw new Error(`Failed to load workflow: ${yamlPath}`);
100
+ }
101
+ const workflowEntries = Object.entries(doc.workflows);
102
+ if (workflowEntries.length === 0) {
103
+ throw new Error(`No workflows found in ${yamlPath}`);
104
+ }
105
+ let resolvedId;
106
+ let spec;
107
+ if (workflowId) {
108
+ if (!doc.workflows[workflowId]) {
109
+ throw new Error(`Workflow "${workflowId}" not found in ${yamlPath}`);
110
+ }
111
+ resolvedId = workflowId;
112
+ spec = doc.workflows[workflowId];
113
+ }
114
+ else {
115
+ [resolvedId, spec] = workflowEntries[0];
116
+ }
117
+ const timestamp = Date.now();
118
+ const execId = `${resolvedId}-${timestamp}`;
119
+ const initialState = spec.state
120
+ ? JSON.parse(JSON.stringify(spec.state))
121
+ : {};
122
+ const sets = overrides ?? {};
123
+ const state = { ...initialState, ...sets };
124
+ const run = {
125
+ id: execId,
126
+ workflow_id: resolvedId,
127
+ workflow_file: yamlPath,
128
+ created_at: new Date().toISOString(),
129
+ updated_at: new Date().toISOString(),
130
+ current_node: '',
131
+ completed_nodes: [],
132
+ state,
133
+ initial_state: { ...initialState, ...sets },
134
+ };
135
+ this.saveRun(run);
136
+ return run;
137
+ }
138
+ getState(execId) {
139
+ const run = this.loadRun(execId);
140
+ if (!run) {
141
+ throw new Error(`Execution not found: ${execId}`);
142
+ }
143
+ return run.state;
144
+ }
145
+ setState(execId, updates) {
146
+ const run = this.loadRun(execId);
147
+ if (!run) {
148
+ throw new Error(`Execution not found: ${execId}`);
149
+ }
150
+ Object.assign(run.state, updates);
151
+ this.saveRun(run);
152
+ }
153
+ moveNode(execId, nodeId) {
154
+ const run = this.loadRun(execId);
155
+ if (!run) {
156
+ throw new Error(`Execution not found: ${execId}`);
157
+ }
158
+ if (run.current_node && !run.completed_nodes.includes(run.current_node)) {
159
+ run.completed_nodes.push(run.current_node);
160
+ }
161
+ run.current_node = nodeId;
162
+ this.saveRun(run);
163
+ return run;
164
+ }
165
+ reset(execId) {
166
+ const run = this.loadRun(execId);
167
+ if (!run) {
168
+ throw new Error(`Execution not found: ${execId}`);
169
+ }
170
+ run.state = JSON.parse(JSON.stringify(run.initial_state));
171
+ run.current_node = '';
172
+ run.completed_nodes = [];
173
+ this.saveRun(run);
174
+ return run;
175
+ }
176
+ listRuns() {
177
+ this.ensureRunsDir();
178
+ const files = fs.readdirSync(this.resolvedDir).filter(f => f.endsWith('.json'));
179
+ const runs = [];
180
+ for (const file of files) {
181
+ try {
182
+ const run = JSON.parse(fs.readFileSync(path.join(this.resolvedDir, file), 'utf-8'));
183
+ runs.push(run);
184
+ }
185
+ catch {
186
+ }
187
+ }
188
+ runs.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
189
+ return runs;
190
+ }
191
+ }
192
+ exports.RunManager = RunManager;
193
+ //# sourceMappingURL=run-manager.js.map