@minded-ai/mindedjs 3.0.4-beta.3 → 3.0.6-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +6 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/validateFlow.d.ts +47 -0
- package/dist/cli/validateFlow.d.ts.map +1 -0
- package/dist/cli/validateFlow.js +454 -0
- package/dist/cli/validateFlow.js.map +1 -0
- package/dist/playbooks/playbooks.d.ts +2 -1
- package/dist/playbooks/playbooks.d.ts.map +1 -1
- package/dist/playbooks/playbooks.js +8 -2
- package/dist/playbooks/playbooks.js.map +1 -1
- package/docs/.gitbook/assets/agent-lifecycle-security.svg +4 -0
- package/docs/.gitbook/assets/credentials-lifecycle.svg +4 -0
- package/docs/.gitbook/assets/rpa-execution-flow.svg +4 -0
- package/docs/.gitbook/assets/system-overview.svg +4 -0
- package/docs/.gitbook/assets/tenant-isolation-overview.svg +4 -0
- package/docs/SUMMARY.md +1 -0
- package/docs/platform/security-architecture.md +343 -0
- package/package.json +2 -1
- package/src/cli/index.ts +5 -1
- package/src/cli/validateFlow.ts +502 -0
- package/src/playbooks/playbooks.ts +10 -3
package/dist/cli/index.js
CHANGED
|
@@ -39,6 +39,7 @@ const path = __importStar(require("path"));
|
|
|
39
39
|
const logger_1 = require("../utils/logger");
|
|
40
40
|
const child_process_1 = require("child_process");
|
|
41
41
|
const localOperatorSetup_1 = require("./localOperatorSetup");
|
|
42
|
+
const validateFlow_1 = require("./validateFlow");
|
|
42
43
|
const ENV_FILE = '.env';
|
|
43
44
|
function getEnvFilePath() {
|
|
44
45
|
return path.join(process.cwd(), ENV_FILE);
|
|
@@ -195,9 +196,13 @@ async function main() {
|
|
|
195
196
|
process.exit(1);
|
|
196
197
|
}
|
|
197
198
|
}
|
|
199
|
+
else if (command === 'validate') {
|
|
200
|
+
// Command to validate a flow YAML file
|
|
201
|
+
(0, validateFlow_1.runValidateCommand)();
|
|
202
|
+
}
|
|
198
203
|
else {
|
|
199
204
|
logger_1.logger.error({
|
|
200
|
-
msg: 'Unknown command. Available commands: token, setup-local-operator, check-local-operator, generate-lambda-ts-handler',
|
|
205
|
+
msg: 'Unknown command. Available commands: token, setup-local-operator, check-local-operator, generate-lambda-ts-handler, validate',
|
|
201
206
|
});
|
|
202
207
|
process.exit(1);
|
|
203
208
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAyB;AACzB,2CAA6B;AAC7B,4CAAyC;AACzC,iDAAyC;AACzC,6DAAgF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
interface ValidationResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
flowName?: string;
|
|
4
|
+
stats?: {
|
|
5
|
+
nodes: number;
|
|
6
|
+
edges: number;
|
|
7
|
+
nodeTypes: string[];
|
|
8
|
+
edgeTypes: string[];
|
|
9
|
+
};
|
|
10
|
+
errors?: string[];
|
|
11
|
+
warnings?: string[];
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validates a cron expression format using cron-parser.
|
|
16
|
+
* Cron format: minute hour day month day-of-week (5 fields)
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateCronExpression(cronExpression: string): {
|
|
19
|
+
valid: boolean;
|
|
20
|
+
error?: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Validates an IANA timezone identifier.
|
|
24
|
+
* Uses Intl.DateTimeFormat to check if the timezone is valid.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateTimezone(timezone: string): {
|
|
27
|
+
valid: boolean;
|
|
28
|
+
error?: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Validates a schedule trigger node configuration.
|
|
32
|
+
* Returns an array of error messages (empty if valid).
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateScheduleTrigger(node: any, nodeIndex: string): {
|
|
35
|
+
errors: string[];
|
|
36
|
+
warnings: string[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Validates a MindedJS YAML flow file.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateFlow(flowPath: string): ValidationResult;
|
|
42
|
+
/**
|
|
43
|
+
* CLI command handler for validate
|
|
44
|
+
*/
|
|
45
|
+
export declare function runValidateCommand(): void;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=validateFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateFlow.d.ts","sourceRoot":"","sources":["../../src/cli/validateFlow.ts"],"names":[],"mappings":"AAKA,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAcjG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBrF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA2B1C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAwQ/D;AAiCD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAoGzC"}
|
|
@@ -0,0 +1,454 @@
|
|
|
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.validateCronExpression = validateCronExpression;
|
|
37
|
+
exports.validateTimezone = validateTimezone;
|
|
38
|
+
exports.validateScheduleTrigger = validateScheduleTrigger;
|
|
39
|
+
exports.validateFlow = validateFlow;
|
|
40
|
+
exports.runValidateCommand = runValidateCommand;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const yaml = __importStar(require("js-yaml"));
|
|
44
|
+
const cron_parser_1 = require("cron-parser");
|
|
45
|
+
/**
|
|
46
|
+
* Validates a cron expression format using cron-parser.
|
|
47
|
+
* Cron format: minute hour day month day-of-week (5 fields)
|
|
48
|
+
*/
|
|
49
|
+
function validateCronExpression(cronExpression) {
|
|
50
|
+
if (typeof cronExpression !== 'string' || cronExpression.trim() === '') {
|
|
51
|
+
return { valid: false, error: 'Cron expression must be a non-empty string' };
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
cron_parser_1.CronExpressionParser.parse(cronExpression.trim());
|
|
55
|
+
return { valid: true };
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
error: error instanceof Error ? error.message : 'Invalid cron expression format',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Validates an IANA timezone identifier.
|
|
66
|
+
* Uses Intl.DateTimeFormat to check if the timezone is valid.
|
|
67
|
+
*/
|
|
68
|
+
function validateTimezone(timezone) {
|
|
69
|
+
if (typeof timezone !== 'string' || timezone.trim() === '') {
|
|
70
|
+
return { valid: false, error: 'Timezone must be a non-empty string' };
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Try to create a date formatter with the timezone
|
|
74
|
+
const formatter = new Intl.DateTimeFormat('en-US', { timeZone: timezone });
|
|
75
|
+
// Test if the timezone is valid by trying to format a date
|
|
76
|
+
formatter.format(new Date());
|
|
77
|
+
return { valid: true };
|
|
78
|
+
}
|
|
79
|
+
catch (_a) {
|
|
80
|
+
return {
|
|
81
|
+
valid: false,
|
|
82
|
+
error: `Invalid IANA timezone identifier: "${timezone}"`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Validates a schedule trigger node configuration.
|
|
88
|
+
* Returns an array of error messages (empty if valid).
|
|
89
|
+
*/
|
|
90
|
+
function validateScheduleTrigger(node, nodeIndex) {
|
|
91
|
+
const errors = [];
|
|
92
|
+
const warnings = [];
|
|
93
|
+
if (!node.cronExpression) {
|
|
94
|
+
errors.push(`${nodeIndex} "${node.name}": schedule trigger missing required field "cronExpression"`);
|
|
95
|
+
}
|
|
96
|
+
else if (typeof node.cronExpression !== 'string') {
|
|
97
|
+
errors.push(`${nodeIndex} "${node.name}": schedule trigger "cronExpression" must be a string`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const cronValidation = validateCronExpression(node.cronExpression);
|
|
101
|
+
if (!cronValidation.valid) {
|
|
102
|
+
errors.push(`${nodeIndex} "${node.name}": invalid cron expression - ${cronValidation.error}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (node.timezone !== undefined) {
|
|
106
|
+
if (typeof node.timezone !== 'string') {
|
|
107
|
+
errors.push(`${nodeIndex} "${node.name}": schedule trigger "timezone" must be a string`);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const timezoneValidation = validateTimezone(node.timezone);
|
|
111
|
+
if (!timezoneValidation.valid) {
|
|
112
|
+
errors.push(`${nodeIndex} "${node.name}": ${timezoneValidation.error}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { errors, warnings };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates a MindedJS YAML flow file.
|
|
120
|
+
*/
|
|
121
|
+
function validateFlow(flowPath) {
|
|
122
|
+
// Resolve the path
|
|
123
|
+
const resolvedPath = path.isAbsolute(flowPath) ? flowPath : path.join(process.cwd(), flowPath);
|
|
124
|
+
// Read the file
|
|
125
|
+
let flowContent;
|
|
126
|
+
try {
|
|
127
|
+
flowContent = fs.readFileSync(resolvedPath, 'utf-8');
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
message: `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Parse YAML
|
|
136
|
+
let flow;
|
|
137
|
+
try {
|
|
138
|
+
flow = yaml.load(flowContent);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
message: `Invalid YAML syntax: ${error instanceof Error ? error.message : String(error)}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Validate flow structure
|
|
147
|
+
const errors = [];
|
|
148
|
+
const warnings = [];
|
|
149
|
+
// Check for required top-level fields
|
|
150
|
+
if (!flow.name) {
|
|
151
|
+
errors.push('Flow is missing required field: "name"');
|
|
152
|
+
}
|
|
153
|
+
if (!flow.nodes || !Array.isArray(flow.nodes)) {
|
|
154
|
+
errors.push('Flow is missing required field: "nodes" (must be an array)');
|
|
155
|
+
}
|
|
156
|
+
if (!flow.edges || !Array.isArray(flow.edges)) {
|
|
157
|
+
errors.push('Flow is missing required field: "edges" (must be an array)');
|
|
158
|
+
}
|
|
159
|
+
// If basic structure is invalid, return early
|
|
160
|
+
if (errors.length > 0) {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
errors,
|
|
164
|
+
warnings,
|
|
165
|
+
message: `Flow validation failed with ${errors.length} error(s)`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Create a set of node names for validation
|
|
169
|
+
const nodeNames = new Set();
|
|
170
|
+
const nodesByName = new Map();
|
|
171
|
+
// Validate nodes
|
|
172
|
+
for (let i = 0; i < flow.nodes.length; i++) {
|
|
173
|
+
const node = flow.nodes[i];
|
|
174
|
+
const nodeIndex = `Node ${i + 1}`;
|
|
175
|
+
// Check for required name field
|
|
176
|
+
if (!node.name) {
|
|
177
|
+
errors.push(`${nodeIndex}: Missing required field "name"`);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
// Check for duplicate node names
|
|
181
|
+
if (nodeNames.has(node.name)) {
|
|
182
|
+
errors.push(`${nodeIndex} "${node.name}": Duplicate node name`);
|
|
183
|
+
}
|
|
184
|
+
nodeNames.add(node.name);
|
|
185
|
+
nodesByName.set(node.name, node);
|
|
186
|
+
// Check for required type field
|
|
187
|
+
if (!node.type) {
|
|
188
|
+
errors.push(`${nodeIndex} "${node.name}": Missing required field "type"`);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// Validate node based on type
|
|
192
|
+
switch (node.type) {
|
|
193
|
+
case 'trigger':
|
|
194
|
+
if (!node.triggerType) {
|
|
195
|
+
errors.push(`${nodeIndex} "${node.name}": trigger node missing required field "triggerType"`);
|
|
196
|
+
}
|
|
197
|
+
else if (!['manual', 'app', 'webhook', 'schedule'].includes(node.triggerType)) {
|
|
198
|
+
errors.push(`${nodeIndex} "${node.name}": invalid triggerType "${node.triggerType}". Must be one of: manual, app, webhook, schedule`);
|
|
199
|
+
}
|
|
200
|
+
if (node.triggerType === 'app' && !node.appTriggerId) {
|
|
201
|
+
errors.push(`${nodeIndex} "${node.name}": app trigger missing required field "appTriggerId"`);
|
|
202
|
+
}
|
|
203
|
+
if (node.triggerType === 'schedule') {
|
|
204
|
+
const scheduleValidation = validateScheduleTrigger(node, nodeIndex);
|
|
205
|
+
errors.push(...scheduleValidation.errors);
|
|
206
|
+
warnings.push(...scheduleValidation.warnings);
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
case 'promptNode':
|
|
210
|
+
if (!node.prompt) {
|
|
211
|
+
errors.push(`${nodeIndex} "${node.name}": promptNode missing required field "prompt"`);
|
|
212
|
+
}
|
|
213
|
+
if (!node.displayName || node.displayName.trim() === '') {
|
|
214
|
+
errors.push(`${nodeIndex} "${node.name}": promptNode missing required non-empty field "displayName"`);
|
|
215
|
+
}
|
|
216
|
+
if (node.llmConfig) {
|
|
217
|
+
if (!node.llmConfig.name) {
|
|
218
|
+
errors.push(`${nodeIndex} "${node.name}": llmConfig missing required field "name"`);
|
|
219
|
+
}
|
|
220
|
+
if (!node.llmConfig.properties) {
|
|
221
|
+
warnings.push(`${nodeIndex} "${node.name}": llmConfig missing "properties" field`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
case 'thinking':
|
|
226
|
+
if (!node.prompt) {
|
|
227
|
+
errors.push(`${nodeIndex} "${node.name}": thinking node missing required field "prompt"`);
|
|
228
|
+
}
|
|
229
|
+
if (node.humanInTheLoop !== undefined) {
|
|
230
|
+
errors.push(`${nodeIndex} "${node.name}": thinking node does not support "humanInTheLoop" property (only prompt nodes support this)`);
|
|
231
|
+
}
|
|
232
|
+
if (node.canStayOnNode !== undefined) {
|
|
233
|
+
errors.push(`${nodeIndex} "${node.name}": thinking node does not support "canStayOnNode" property (only prompt nodes support this)`);
|
|
234
|
+
}
|
|
235
|
+
if (node.llmConfig) {
|
|
236
|
+
if (!node.llmConfig.name) {
|
|
237
|
+
errors.push(`${nodeIndex} "${node.name}": llmConfig missing required field "name"`);
|
|
238
|
+
}
|
|
239
|
+
if (!node.llmConfig.properties) {
|
|
240
|
+
warnings.push(`${nodeIndex} "${node.name}": llmConfig missing "properties" field`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
break;
|
|
244
|
+
case 'tool':
|
|
245
|
+
if (!node.toolName) {
|
|
246
|
+
errors.push(`${nodeIndex} "${node.name}": tool node missing required field "toolName"`);
|
|
247
|
+
}
|
|
248
|
+
break;
|
|
249
|
+
case 'junction':
|
|
250
|
+
// Junction only requires name and type, which we already checked
|
|
251
|
+
break;
|
|
252
|
+
case 'jumpToNode':
|
|
253
|
+
if (!node.targetNodeId) {
|
|
254
|
+
errors.push(`${nodeIndex} "${node.name}": jumpToNode missing required field "targetNodeId"`);
|
|
255
|
+
}
|
|
256
|
+
break;
|
|
257
|
+
case 'browserTask':
|
|
258
|
+
if (!node.prompt) {
|
|
259
|
+
errors.push(`${nodeIndex} "${node.name}": browserTask node missing required field "prompt"`);
|
|
260
|
+
}
|
|
261
|
+
break;
|
|
262
|
+
default:
|
|
263
|
+
warnings.push(`${nodeIndex} "${node.name}": unknown node type "${node.type}"`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Create a map to track which nodes have edges
|
|
267
|
+
const nodesWithEdges = new Set();
|
|
268
|
+
// Validate edges
|
|
269
|
+
for (let i = 0; i < flow.edges.length; i++) {
|
|
270
|
+
const edge = flow.edges[i];
|
|
271
|
+
const edgeIndex = `Edge ${i + 1}`;
|
|
272
|
+
// Check for required fields
|
|
273
|
+
if (!edge.source) {
|
|
274
|
+
errors.push(`${edgeIndex}: Missing required field "source"`);
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (!edge.target) {
|
|
278
|
+
errors.push(`${edgeIndex}: Missing required field "target"`);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (!edge.type) {
|
|
282
|
+
errors.push(`${edgeIndex}: Missing required field "type"`);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
// Track nodes that have edges
|
|
286
|
+
nodesWithEdges.add(edge.source);
|
|
287
|
+
nodesWithEdges.add(edge.target);
|
|
288
|
+
// Check if source and target nodes exist
|
|
289
|
+
if (!nodeNames.has(edge.source)) {
|
|
290
|
+
errors.push(`${edgeIndex}: source node "${edge.source}" does not exist`);
|
|
291
|
+
}
|
|
292
|
+
if (!nodeNames.has(edge.target)) {
|
|
293
|
+
errors.push(`${edgeIndex}: target node "${edge.target}" does not exist`);
|
|
294
|
+
}
|
|
295
|
+
// Validate edge based on type
|
|
296
|
+
switch (edge.type) {
|
|
297
|
+
case 'stepForward':
|
|
298
|
+
// stepForward only requires source, target, and type
|
|
299
|
+
break;
|
|
300
|
+
case 'promptCondition':
|
|
301
|
+
if (!edge.prompt) {
|
|
302
|
+
errors.push(`${edgeIndex}: promptCondition edge missing required field "prompt"`);
|
|
303
|
+
}
|
|
304
|
+
break;
|
|
305
|
+
case 'logicalCondition':
|
|
306
|
+
if (!edge.condition) {
|
|
307
|
+
errors.push(`${edgeIndex}: logicalCondition edge missing required field "condition"`);
|
|
308
|
+
}
|
|
309
|
+
break;
|
|
310
|
+
default:
|
|
311
|
+
warnings.push(`${edgeIndex}: unknown edge type "${edge.type}"`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Check for orphaned nodes (nodes without any edges)
|
|
315
|
+
// Note: Trigger nodes can be entry points without incoming edges
|
|
316
|
+
for (const nodeName of nodeNames) {
|
|
317
|
+
const node = nodesByName.get(nodeName);
|
|
318
|
+
if (!nodesWithEdges.has(nodeName) && node.type !== 'trigger') {
|
|
319
|
+
warnings.push(`Node "${nodeName}": orphaned node (not connected to any edges)`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Check for trigger nodes - at least one trigger should exist
|
|
323
|
+
const triggerNodes = flow.nodes.filter((n) => n.type === 'trigger');
|
|
324
|
+
if (triggerNodes.length === 0) {
|
|
325
|
+
warnings.push('Flow has no trigger nodes (entry points)');
|
|
326
|
+
}
|
|
327
|
+
const success = errors.length === 0;
|
|
328
|
+
return {
|
|
329
|
+
success,
|
|
330
|
+
flowName: flow.name,
|
|
331
|
+
stats: {
|
|
332
|
+
nodes: flow.nodes.length,
|
|
333
|
+
edges: flow.edges.length,
|
|
334
|
+
nodeTypes: [...new Set(flow.nodes.map((n) => n.type))],
|
|
335
|
+
edgeTypes: [...new Set(flow.edges.map((e) => e.type))],
|
|
336
|
+
},
|
|
337
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
338
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
339
|
+
message: errors.length === 0
|
|
340
|
+
? warnings.length === 0
|
|
341
|
+
? 'Flow is valid with no issues'
|
|
342
|
+
: `Flow is valid but has ${warnings.length} warning(s)`
|
|
343
|
+
: `Flow validation failed with ${errors.length} error(s)`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Finds all YAML files in a directory recursively.
|
|
348
|
+
*/
|
|
349
|
+
function findYamlFiles(dir) {
|
|
350
|
+
const files = [];
|
|
351
|
+
if (!fs.existsSync(dir)) {
|
|
352
|
+
return files;
|
|
353
|
+
}
|
|
354
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
355
|
+
for (const entry of entries) {
|
|
356
|
+
const fullPath = path.join(dir, entry.name);
|
|
357
|
+
if (entry.isDirectory()) {
|
|
358
|
+
files.push(...findYamlFiles(fullPath));
|
|
359
|
+
}
|
|
360
|
+
else if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {
|
|
361
|
+
files.push(fullPath);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return files;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* CLI command handler for validate
|
|
368
|
+
*/
|
|
369
|
+
function runValidateCommand() {
|
|
370
|
+
var _a, _b, _c, _d;
|
|
371
|
+
const mindedConfigPath = path.join(process.cwd(), 'minded.json');
|
|
372
|
+
// Check if minded.json exists
|
|
373
|
+
if (!fs.existsSync(mindedConfigPath)) {
|
|
374
|
+
console.error('Error: minded.json not found in the current directory');
|
|
375
|
+
console.error('Make sure you are running this command from a MindedJS agent project root');
|
|
376
|
+
process.exit(1);
|
|
377
|
+
}
|
|
378
|
+
// Read and parse minded.json
|
|
379
|
+
let mindedConfig;
|
|
380
|
+
try {
|
|
381
|
+
const configContent = fs.readFileSync(mindedConfigPath, 'utf8');
|
|
382
|
+
mindedConfig = JSON.parse(configContent);
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
console.error(`Error: Failed to read or parse minded.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
386
|
+
process.exit(1);
|
|
387
|
+
}
|
|
388
|
+
// Get flows folders
|
|
389
|
+
const flowsFolders = mindedConfig.flows;
|
|
390
|
+
if (!flowsFolders || flowsFolders.length === 0) {
|
|
391
|
+
console.error('Error: No flows folders configured in minded.json');
|
|
392
|
+
process.exit(1);
|
|
393
|
+
}
|
|
394
|
+
// Find all YAML files in flow folders
|
|
395
|
+
const flowFiles = [];
|
|
396
|
+
for (const folder of flowsFolders) {
|
|
397
|
+
const resolvedFolder = path.isAbsolute(folder) ? folder : path.join(process.cwd(), folder);
|
|
398
|
+
flowFiles.push(...findYamlFiles(resolvedFolder));
|
|
399
|
+
}
|
|
400
|
+
if (flowFiles.length === 0) {
|
|
401
|
+
console.error('Error: No flow YAML files found in configured flows folders');
|
|
402
|
+
process.exit(1);
|
|
403
|
+
}
|
|
404
|
+
console.log(`\nValidating ${flowFiles.length} flow(s)...\n`);
|
|
405
|
+
// Validate each flow
|
|
406
|
+
const results = [];
|
|
407
|
+
let totalErrors = 0;
|
|
408
|
+
let totalWarnings = 0;
|
|
409
|
+
for (const flowFile of flowFiles) {
|
|
410
|
+
const result = validateFlow(flowFile);
|
|
411
|
+
results.push({ path: flowFile, result });
|
|
412
|
+
totalErrors += (_b = (_a = result.errors) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
|
|
413
|
+
totalWarnings += (_d = (_c = result.warnings) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0;
|
|
414
|
+
}
|
|
415
|
+
// Print results for each flow
|
|
416
|
+
for (const { path: flowPath, result } of results) {
|
|
417
|
+
const relativePath = path.relative(process.cwd(), flowPath);
|
|
418
|
+
const statusIcon = result.success ? '✅' : '❌';
|
|
419
|
+
console.log(`${statusIcon} ${relativePath}`);
|
|
420
|
+
if (result.flowName) {
|
|
421
|
+
console.log(` Flow: ${result.flowName}`);
|
|
422
|
+
}
|
|
423
|
+
if (result.stats) {
|
|
424
|
+
console.log(` Stats: ${result.stats.nodes} nodes, ${result.stats.edges} edges`);
|
|
425
|
+
}
|
|
426
|
+
if (result.errors && result.errors.length > 0) {
|
|
427
|
+
console.log(' Errors:');
|
|
428
|
+
result.errors.forEach((error) => {
|
|
429
|
+
console.log(` ❌ ${error}`);
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
if (result.warnings && result.warnings.length > 0) {
|
|
433
|
+
console.log(' Warnings:');
|
|
434
|
+
result.warnings.forEach((warning) => {
|
|
435
|
+
console.log(` ⚠️ ${warning}`);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
console.log('');
|
|
439
|
+
}
|
|
440
|
+
// Print summary
|
|
441
|
+
const allPassed = totalErrors === 0;
|
|
442
|
+
console.log('─'.repeat(50));
|
|
443
|
+
if (allPassed) {
|
|
444
|
+
console.log(`\n✅ All ${flowFiles.length} flow(s) validated successfully!`);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
console.log(`\n❌ Validation failed!`);
|
|
448
|
+
}
|
|
449
|
+
console.log(` Total: ${flowFiles.length} flow(s), ${totalErrors} error(s), ${totalWarnings} warning(s)\n`);
|
|
450
|
+
if (!allPassed) {
|
|
451
|
+
process.exit(1);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
//# sourceMappingURL=validateFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateFlow.js","sourceRoot":"","sources":["../../src/cli/validateFlow.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,wDAcC;AAMD,4CAiBC;AAMD,0DA8BC;AAKD,oCAwQC;AAoCD,gDAoGC;AArfD,uCAAyB;AACzB,2CAA6B;AAC7B,8CAAgC;AAChC,6CAAmD;AAgBnD;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,cAAsB;IAC3D,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,CAAC;QACH,kCAAoB,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC;SACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;IACxE,CAAC;IAED,IAAI,CAAC;QACH,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3E,2DAA2D;QAC3D,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,WAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,sCAAsC,QAAQ,GAAG;SACzD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CACrC,IAAS,EACT,SAAiB;IAEjB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,6DAA6D,CAAC,CAAC;IACvG,CAAC;SAAM,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,uDAAuD,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,GAAG,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,gCAAgC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,MAAM,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,QAAgB;IAC3C,mBAAmB;IACnB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE/F,gBAAgB;IAChB,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC1F,CAAC;IACJ,CAAC;IAED,aAAa;IACb,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC1F,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,sCAAsC;IACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC5E,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM;YACN,QAAQ;YACR,OAAO,EAAE,+BAA+B,MAAM,CAAC,MAAM,WAAW;SACjE,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAe,CAAC;IAE3C,iBAAiB;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAElC,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,iCAAiC,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;QAClE,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEjC,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,kCAAkC,CAAC,CAAC;YAC1E,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,SAAS;gBACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,sDAAsD,CAAC,CAAC;gBAChG,CAAC;qBAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;oBAChF,MAAM,CAAC,IAAI,CACT,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,2BAA2B,IAAI,CAAC,WAAW,mDAAmD,CACzH,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,sDAAsD,CAAC,CAAC;gBAChG,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;oBACpC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;oBACpE,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAChD,CAAC;gBACD,MAAM;YAER,KAAK,YAAY;gBACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,+CAA+C,CAAC,CAAC;gBACzF,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACxD,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,8DAA8D,CAAC,CAAC;gBACxG,CAAC;gBACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;wBACzB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,4CAA4C,CAAC,CAAC;oBACtF,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;wBAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,yCAAyC,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;gBACD,MAAM;YAER,KAAK,UAAU;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,kDAAkD,CAAC,CAAC;gBAC5F,CAAC;gBACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBACtC,MAAM,CAAC,IAAI,CACT,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,8FAA8F,CACzH,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,CACT,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,6FAA6F,CACxH,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;wBACzB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,4CAA4C,CAAC,CAAC;oBACtF,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;wBAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,yCAAyC,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;gBACD,MAAM;YAER,KAAK,MAAM;gBACT,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,gDAAgD,CAAC,CAAC;gBAC1F,CAAC;gBACD,MAAM;YAER,KAAK,UAAU;gBACb,iEAAiE;gBACjE,MAAM;YAER,KAAK,YAAY;gBACf,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,qDAAqD,CAAC,CAAC;gBAC/F,CAAC;gBACD,MAAM;YAER,KAAK,aAAa;gBAChB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,qDAAqD,CAAC,CAAC;gBAC/F,CAAC;gBACD,MAAM;YAER;gBACE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,yBAAyB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,iBAAiB;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAElC,4BAA4B;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,iCAAiC,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,8BAA8B;QAC9B,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhC,yCAAyC;QACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,kBAAkB,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,kBAAkB,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAC3E,CAAC;QAED,8BAA8B;QAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,aAAa;gBAChB,qDAAqD;gBACrD,MAAM;YAER,KAAK,iBAAiB;gBACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,wDAAwD,CAAC,CAAC;gBACpF,CAAC;gBACD,MAAM;YAER,KAAK,kBAAkB;gBACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,4DAA4D,CAAC,CAAC;gBACxF,CAAC;gBACD,MAAM;YAER;gBACE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,wBAAwB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,iEAAiE;IACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,SAAS,QAAQ,+CAA+C,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACzE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAEpC,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,KAAK,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACxB,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa;YACvE,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAa;SACxE;QACD,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC9C,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACpD,OAAO,EACL,MAAM,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBACrB,CAAC,CAAC,8BAA8B;gBAChC,CAAC,CAAC,yBAAyB,QAAQ,CAAC,MAAM,aAAa;YACzD,CAAC,CAAC,+BAA+B,MAAM,CAAC,MAAM,WAAW;KAC9D,CAAC;AACJ,CAAC;AASD;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC3F,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;;IAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAEjE,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAChE,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+CAA+C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC;IACxC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3F,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,MAAM,eAAe,CAAC,CAAC;IAE7D,qBAAqB;IACrB,MAAM,OAAO,GAAiD,EAAE,CAAC;IACjE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,WAAW,IAAI,MAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,MAAM,mCAAI,CAAC,CAAC;QAC1C,aAAa,IAAI,MAAA,MAAA,MAAM,CAAC,QAAQ,0CAAE,MAAM,mCAAI,CAAC,CAAC;IAChD,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,YAAY,EAAE,CAAC,CAAC;QAE7C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,KAAK,WAAW,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAClC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,WAAW,KAAK,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,CAAC,MAAM,kCAAkC,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,MAAM,aAAa,WAAW,cAAc,aAAa,eAAe,CAAC,CAAC;IAE7G,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playbooks.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbooks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"playbooks.d.ts","sourceRoot":"","sources":["../../src/playbooks/playbooks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAyFF;;GAEG;AACH,wBAAsB,aAAa,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsBxF;AAuDD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,GAAG,IAAI,CAmBrE"}
|
|
@@ -158,7 +158,7 @@ function loadPlaybooksFromDirectories(directories) {
|
|
|
158
158
|
try {
|
|
159
159
|
const fileContent = fs.readFileSync(file, 'utf8');
|
|
160
160
|
const playbook = yaml.load(fileContent);
|
|
161
|
-
if (playbook && playbook.name && playbook.blocks) {
|
|
161
|
+
if (playbook && playbook.name && (playbook.blocks || playbook.prompt)) {
|
|
162
162
|
playbooks.push(playbook);
|
|
163
163
|
logger_1.logger.info({ msg: `Loaded playbook: ${playbook.name} from ${file}` });
|
|
164
164
|
}
|
|
@@ -199,7 +199,13 @@ function combinePlaybooks(playbooks) {
|
|
|
199
199
|
}
|
|
200
200
|
// Combine all playbooks into sections
|
|
201
201
|
const sections = playbooks.map((playbook) => {
|
|
202
|
-
|
|
202
|
+
let markdownContent = playbook.prompt;
|
|
203
|
+
if (!markdownContent && playbook.blocks) {
|
|
204
|
+
markdownContent = editorJsToMarkdown(playbook.blocks);
|
|
205
|
+
}
|
|
206
|
+
if (!markdownContent) {
|
|
207
|
+
throw new Error('Playbook must have either a prompt or blocks');
|
|
208
|
+
}
|
|
203
209
|
return `# ${playbook.name}\n${markdownContent}`;
|
|
204
210
|
});
|
|
205
211
|
const combinedPlaybooks = sections.join('\n\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playbooks.js","sourceRoot":"","sources":["../../src/playbooks/playbooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"playbooks.js","sourceRoot":"","sources":["../../src/playbooks/playbooks.ts"],"names":[],"mappings":"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"}
|