@marktoflow/core 2.0.0-alpha.3
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/bundle.d.ts +43 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +202 -0
- package/dist/bundle.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -0
- package/dist/costs.d.ts +182 -0
- package/dist/costs.d.ts.map +1 -0
- package/dist/costs.js +464 -0
- package/dist/costs.js.map +1 -0
- package/dist/credentials.d.ts +162 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +646 -0
- package/dist/credentials.js.map +1 -0
- package/dist/engine.d.ts +137 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +514 -0
- package/dist/engine.js.map +1 -0
- package/dist/env.d.ts +59 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +256 -0
- package/dist/env.js.map +1 -0
- package/dist/failover.d.ts +43 -0
- package/dist/failover.d.ts.map +1 -0
- package/dist/failover.js +53 -0
- package/dist/failover.js.map +1 -0
- package/dist/filewatcher.d.ts +32 -0
- package/dist/filewatcher.d.ts.map +1 -0
- package/dist/filewatcher.js +92 -0
- package/dist/filewatcher.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +62 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +211 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp-loader.d.ts +29 -0
- package/dist/mcp-loader.d.ts.map +1 -0
- package/dist/mcp-loader.js +60 -0
- package/dist/mcp-loader.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +65 -0
- package/dist/metrics.js.map +1 -0
- package/dist/models.d.ts +419 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +111 -0
- package/dist/models.js.map +1 -0
- package/dist/parser.d.ts +40 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +287 -0
- package/dist/parser.js.map +1 -0
- package/dist/plugins.d.ts +105 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +182 -0
- package/dist/plugins.js.map +1 -0
- package/dist/queue.d.ts +114 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +385 -0
- package/dist/queue.js.map +1 -0
- package/dist/rollback.d.ts +117 -0
- package/dist/rollback.d.ts.map +1 -0
- package/dist/rollback.js +374 -0
- package/dist/rollback.js.map +1 -0
- package/dist/routing.d.ts +144 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +457 -0
- package/dist/routing.js.map +1 -0
- package/dist/scheduler.d.ts +91 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +259 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/script-tool.d.ts +22 -0
- package/dist/script-tool.d.ts.map +1 -0
- package/dist/script-tool.js +90 -0
- package/dist/script-tool.js.map +1 -0
- package/dist/sdk-registry.d.ts +81 -0
- package/dist/sdk-registry.d.ts.map +1 -0
- package/dist/sdk-registry.js +264 -0
- package/dist/sdk-registry.js.map +1 -0
- package/dist/security.d.ts +155 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +362 -0
- package/dist/security.js.map +1 -0
- package/dist/state.d.ts +67 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +276 -0
- package/dist/state.js.map +1 -0
- package/dist/templates.d.ts +70 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +244 -0
- package/dist/templates.js.map +1 -0
- package/dist/tool-base.d.ts +54 -0
- package/dist/tool-base.d.ts.map +1 -0
- package/dist/tool-base.js +43 -0
- package/dist/tool-base.js.map +1 -0
- package/dist/tool-registry.d.ts +24 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +164 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tools/custom-tool.d.ts +16 -0
- package/dist/tools/custom-tool.d.ts.map +1 -0
- package/dist/tools/custom-tool.js +85 -0
- package/dist/tools/custom-tool.js.map +1 -0
- package/dist/tools/mcp-tool.d.ts +16 -0
- package/dist/tools/mcp-tool.d.ts.map +1 -0
- package/dist/tools/mcp-tool.js +98 -0
- package/dist/tools/mcp-tool.js.map +1 -0
- package/dist/tools/openapi-tool.d.ts +17 -0
- package/dist/tools/openapi-tool.d.ts.map +1 -0
- package/dist/tools/openapi-tool.js +165 -0
- package/dist/tools/openapi-tool.js.map +1 -0
- package/dist/trigger-manager.d.ts +26 -0
- package/dist/trigger-manager.d.ts.map +1 -0
- package/dist/trigger-manager.js +107 -0
- package/dist/trigger-manager.js.map +1 -0
- package/dist/webhook.d.ts +95 -0
- package/dist/webhook.d.ts.map +1 -0
- package/dist/webhook.js +261 -0
- package/dist/webhook.js.map +1 -0
- package/package.json +60 -0
package/dist/state.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State persistence for marktoflow v2.0
|
|
3
|
+
*
|
|
4
|
+
* Provides SQLite-based state storage for workflow checkpoints,
|
|
5
|
+
* execution history, and recovery.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import { WorkflowStatus, StepStatus } from './models.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// StateStore Implementation
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const SCHEMA_VERSION = 1;
|
|
13
|
+
const CREATE_TABLES_SQL = `
|
|
14
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
15
|
+
version INTEGER PRIMARY KEY
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE TABLE IF NOT EXISTS executions (
|
|
19
|
+
run_id TEXT PRIMARY KEY,
|
|
20
|
+
workflow_id TEXT NOT NULL,
|
|
21
|
+
workflow_path TEXT NOT NULL,
|
|
22
|
+
status TEXT NOT NULL,
|
|
23
|
+
started_at TEXT NOT NULL,
|
|
24
|
+
completed_at TEXT,
|
|
25
|
+
current_step INTEGER DEFAULT 0,
|
|
26
|
+
total_steps INTEGER DEFAULT 0,
|
|
27
|
+
inputs TEXT,
|
|
28
|
+
outputs TEXT,
|
|
29
|
+
error TEXT,
|
|
30
|
+
metadata TEXT
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE IF NOT EXISTS checkpoints (
|
|
34
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
+
run_id TEXT NOT NULL,
|
|
36
|
+
step_index INTEGER NOT NULL,
|
|
37
|
+
step_name TEXT NOT NULL,
|
|
38
|
+
status TEXT NOT NULL,
|
|
39
|
+
started_at TEXT NOT NULL,
|
|
40
|
+
completed_at TEXT,
|
|
41
|
+
inputs TEXT,
|
|
42
|
+
outputs TEXT,
|
|
43
|
+
error TEXT,
|
|
44
|
+
retry_count INTEGER DEFAULT 0,
|
|
45
|
+
FOREIGN KEY (run_id) REFERENCES executions(run_id),
|
|
46
|
+
UNIQUE(run_id, step_index)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_executions_workflow_id ON executions(workflow_id);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_executions_status ON executions(status);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_executions_started_at ON executions(started_at);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_checkpoints_run_id ON checkpoints(run_id);
|
|
53
|
+
`;
|
|
54
|
+
export class StateStore {
|
|
55
|
+
db;
|
|
56
|
+
constructor(dbPath = '.marktoflow/state/workflow-state.db') {
|
|
57
|
+
this.db = new Database(dbPath);
|
|
58
|
+
this.db.pragma('journal_mode = WAL');
|
|
59
|
+
this.initialize();
|
|
60
|
+
}
|
|
61
|
+
initialize() {
|
|
62
|
+
this.db.exec(CREATE_TABLES_SQL);
|
|
63
|
+
// Check schema version
|
|
64
|
+
const versionRow = this.db.prepare('SELECT version FROM schema_version LIMIT 1').get();
|
|
65
|
+
if (!versionRow) {
|
|
66
|
+
this.db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(SCHEMA_VERSION);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Execution Records
|
|
71
|
+
// ============================================================================
|
|
72
|
+
createExecution(record) {
|
|
73
|
+
const stmt = this.db.prepare(`
|
|
74
|
+
INSERT INTO executions (
|
|
75
|
+
run_id, workflow_id, workflow_path, status, started_at, completed_at,
|
|
76
|
+
current_step, total_steps, inputs, outputs, error, metadata
|
|
77
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
78
|
+
`);
|
|
79
|
+
stmt.run(record.runId, record.workflowId, record.workflowPath, record.status, record.startedAt.toISOString(), record.completedAt?.toISOString() ?? null, record.currentStep, record.totalSteps, record.inputs ? JSON.stringify(record.inputs) : null, record.outputs ? JSON.stringify(record.outputs) : null, record.error, record.metadata ? JSON.stringify(record.metadata) : null);
|
|
80
|
+
}
|
|
81
|
+
updateExecution(runId, updates) {
|
|
82
|
+
const fields = [];
|
|
83
|
+
const values = [];
|
|
84
|
+
if (updates.status !== undefined) {
|
|
85
|
+
fields.push('status = ?');
|
|
86
|
+
values.push(updates.status);
|
|
87
|
+
}
|
|
88
|
+
if (updates.completedAt !== undefined) {
|
|
89
|
+
fields.push('completed_at = ?');
|
|
90
|
+
values.push(updates.completedAt?.toISOString() ?? null);
|
|
91
|
+
}
|
|
92
|
+
if (updates.currentStep !== undefined) {
|
|
93
|
+
fields.push('current_step = ?');
|
|
94
|
+
values.push(updates.currentStep);
|
|
95
|
+
}
|
|
96
|
+
if (updates.totalSteps !== undefined) {
|
|
97
|
+
fields.push('total_steps = ?');
|
|
98
|
+
values.push(updates.totalSteps);
|
|
99
|
+
}
|
|
100
|
+
if (updates.outputs !== undefined) {
|
|
101
|
+
fields.push('outputs = ?');
|
|
102
|
+
values.push(updates.outputs ? JSON.stringify(updates.outputs) : null);
|
|
103
|
+
}
|
|
104
|
+
if (updates.error !== undefined) {
|
|
105
|
+
fields.push('error = ?');
|
|
106
|
+
values.push(updates.error);
|
|
107
|
+
}
|
|
108
|
+
if (updates.metadata !== undefined) {
|
|
109
|
+
fields.push('metadata = ?');
|
|
110
|
+
values.push(updates.metadata ? JSON.stringify(updates.metadata) : null);
|
|
111
|
+
}
|
|
112
|
+
if (fields.length === 0)
|
|
113
|
+
return;
|
|
114
|
+
values.push(runId);
|
|
115
|
+
const sql = `UPDATE executions SET ${fields.join(', ')} WHERE run_id = ?`;
|
|
116
|
+
this.db.prepare(sql).run(...values);
|
|
117
|
+
}
|
|
118
|
+
getExecution(runId) {
|
|
119
|
+
const row = this.db
|
|
120
|
+
.prepare('SELECT * FROM executions WHERE run_id = ?')
|
|
121
|
+
.get(runId);
|
|
122
|
+
return row ? this.rowToExecution(row) : null;
|
|
123
|
+
}
|
|
124
|
+
listExecutions(options = {}) {
|
|
125
|
+
let sql = 'SELECT * FROM executions WHERE 1=1';
|
|
126
|
+
const params = [];
|
|
127
|
+
if (options.workflowId) {
|
|
128
|
+
sql += ' AND workflow_id = ?';
|
|
129
|
+
params.push(options.workflowId);
|
|
130
|
+
}
|
|
131
|
+
if (options.status) {
|
|
132
|
+
sql += ' AND status = ?';
|
|
133
|
+
params.push(options.status);
|
|
134
|
+
}
|
|
135
|
+
sql += ' ORDER BY started_at DESC';
|
|
136
|
+
if (options.limit) {
|
|
137
|
+
sql += ' LIMIT ?';
|
|
138
|
+
params.push(options.limit);
|
|
139
|
+
}
|
|
140
|
+
if (options.offset) {
|
|
141
|
+
sql += ' OFFSET ?';
|
|
142
|
+
params.push(options.offset);
|
|
143
|
+
}
|
|
144
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
145
|
+
return rows.map((row) => this.rowToExecution(row));
|
|
146
|
+
}
|
|
147
|
+
getRunningExecutions() {
|
|
148
|
+
return this.listExecutions({ status: WorkflowStatus.RUNNING });
|
|
149
|
+
}
|
|
150
|
+
getFailedExecutions(limit = 10) {
|
|
151
|
+
return this.listExecutions({ status: WorkflowStatus.FAILED, limit });
|
|
152
|
+
}
|
|
153
|
+
rowToExecution(row) {
|
|
154
|
+
return {
|
|
155
|
+
runId: row['run_id'],
|
|
156
|
+
workflowId: row['workflow_id'],
|
|
157
|
+
workflowPath: row['workflow_path'],
|
|
158
|
+
status: row['status'],
|
|
159
|
+
startedAt: new Date(row['started_at']),
|
|
160
|
+
completedAt: row['completed_at'] ? new Date(row['completed_at']) : null,
|
|
161
|
+
currentStep: row['current_step'],
|
|
162
|
+
totalSteps: row['total_steps'],
|
|
163
|
+
inputs: row['inputs'] ? JSON.parse(row['inputs']) : null,
|
|
164
|
+
outputs: row['outputs'] ? JSON.parse(row['outputs']) : null,
|
|
165
|
+
error: row['error'],
|
|
166
|
+
metadata: row['metadata'] ? JSON.parse(row['metadata']) : null,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// ============================================================================
|
|
170
|
+
// Step Checkpoints
|
|
171
|
+
// ============================================================================
|
|
172
|
+
saveCheckpoint(checkpoint) {
|
|
173
|
+
const stmt = this.db.prepare(`
|
|
174
|
+
INSERT OR REPLACE INTO checkpoints (
|
|
175
|
+
run_id, step_index, step_name, status, started_at, completed_at,
|
|
176
|
+
inputs, outputs, error, retry_count
|
|
177
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
178
|
+
`);
|
|
179
|
+
stmt.run(checkpoint.runId, checkpoint.stepIndex, checkpoint.stepName, checkpoint.status, checkpoint.startedAt.toISOString(), checkpoint.completedAt?.toISOString() ?? null, checkpoint.inputs ? JSON.stringify(checkpoint.inputs) : null, checkpoint.outputs !== undefined ? JSON.stringify(checkpoint.outputs) : null, checkpoint.error, checkpoint.retryCount);
|
|
180
|
+
}
|
|
181
|
+
getCheckpoints(runId) {
|
|
182
|
+
const rows = this.db
|
|
183
|
+
.prepare('SELECT * FROM checkpoints WHERE run_id = ? ORDER BY step_index')
|
|
184
|
+
.all(runId);
|
|
185
|
+
return rows.map((row) => this.rowToCheckpoint(row));
|
|
186
|
+
}
|
|
187
|
+
getLastCheckpoint(runId) {
|
|
188
|
+
const row = this.db
|
|
189
|
+
.prepare('SELECT * FROM checkpoints WHERE run_id = ? ORDER BY step_index DESC LIMIT 1')
|
|
190
|
+
.get(runId);
|
|
191
|
+
return row ? this.rowToCheckpoint(row) : null;
|
|
192
|
+
}
|
|
193
|
+
getResumePoint(runId) {
|
|
194
|
+
const lastCheckpoint = this.getLastCheckpoint(runId);
|
|
195
|
+
if (!lastCheckpoint)
|
|
196
|
+
return 0;
|
|
197
|
+
// If last step completed, resume from next step
|
|
198
|
+
if (lastCheckpoint.status === StepStatus.COMPLETED) {
|
|
199
|
+
return lastCheckpoint.stepIndex + 1;
|
|
200
|
+
}
|
|
201
|
+
// Otherwise resume from the failed/pending step
|
|
202
|
+
return lastCheckpoint.stepIndex;
|
|
203
|
+
}
|
|
204
|
+
rowToCheckpoint(row) {
|
|
205
|
+
return {
|
|
206
|
+
runId: row['run_id'],
|
|
207
|
+
stepIndex: row['step_index'],
|
|
208
|
+
stepName: row['step_name'],
|
|
209
|
+
status: row['status'],
|
|
210
|
+
startedAt: new Date(row['started_at']),
|
|
211
|
+
completedAt: row['completed_at'] ? new Date(row['completed_at']) : null,
|
|
212
|
+
inputs: row['inputs'] ? JSON.parse(row['inputs']) : null,
|
|
213
|
+
outputs: row['outputs'] ? JSON.parse(row['outputs']) : null,
|
|
214
|
+
error: row['error'],
|
|
215
|
+
retryCount: row['retry_count'],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
// ============================================================================
|
|
219
|
+
// Statistics
|
|
220
|
+
// ============================================================================
|
|
221
|
+
getStats(workflowId) {
|
|
222
|
+
let whereClause = '';
|
|
223
|
+
const params = [];
|
|
224
|
+
if (workflowId) {
|
|
225
|
+
whereClause = 'WHERE workflow_id = ?';
|
|
226
|
+
params.push(workflowId);
|
|
227
|
+
}
|
|
228
|
+
const countRow = this.db
|
|
229
|
+
.prepare(`SELECT
|
|
230
|
+
COUNT(*) as total,
|
|
231
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
232
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
233
|
+
SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) as running
|
|
234
|
+
FROM executions ${whereClause}`)
|
|
235
|
+
.get(...params);
|
|
236
|
+
const durationRow = this.db
|
|
237
|
+
.prepare(`SELECT AVG(
|
|
238
|
+
(julianday(completed_at) - julianday(started_at)) * 86400000
|
|
239
|
+
) as avg_duration
|
|
240
|
+
FROM executions
|
|
241
|
+
${whereClause ? whereClause + ' AND' : 'WHERE'} completed_at IS NOT NULL`)
|
|
242
|
+
.get(...params);
|
|
243
|
+
const total = countRow['total'] || 0;
|
|
244
|
+
const completed = countRow['completed'] || 0;
|
|
245
|
+
return {
|
|
246
|
+
totalExecutions: total,
|
|
247
|
+
completed,
|
|
248
|
+
failed: countRow['failed'] || 0,
|
|
249
|
+
running: countRow['running'] || 0,
|
|
250
|
+
successRate: total > 0 ? completed / total : 0,
|
|
251
|
+
averageDuration: durationRow.avg_duration,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// ============================================================================
|
|
255
|
+
// Cleanup
|
|
256
|
+
// ============================================================================
|
|
257
|
+
cleanup(retentionDays = 30) {
|
|
258
|
+
const cutoffDate = new Date();
|
|
259
|
+
cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
|
|
260
|
+
// Delete old checkpoints first (foreign key)
|
|
261
|
+
this.db
|
|
262
|
+
.prepare(`DELETE FROM checkpoints WHERE run_id IN (
|
|
263
|
+
SELECT run_id FROM executions WHERE started_at < ?
|
|
264
|
+
)`)
|
|
265
|
+
.run(cutoffDate.toISOString());
|
|
266
|
+
// Delete old executions
|
|
267
|
+
const result = this.db
|
|
268
|
+
.prepare('DELETE FROM executions WHERE started_at < ?')
|
|
269
|
+
.run(cutoffDate.toISOString());
|
|
270
|
+
return result.changes;
|
|
271
|
+
}
|
|
272
|
+
close() {
|
|
273
|
+
this.db.close();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow template library for marktoflow.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum TemplateCategory {
|
|
5
|
+
CODE_QUALITY = "code_quality",
|
|
6
|
+
DEPLOYMENT = "deployment",
|
|
7
|
+
TESTING = "testing",
|
|
8
|
+
DOCUMENTATION = "documentation",
|
|
9
|
+
SECURITY = "security",
|
|
10
|
+
MONITORING = "monitoring",
|
|
11
|
+
DATA = "data",
|
|
12
|
+
INTEGRATION = "integration",
|
|
13
|
+
GENERAL = "general"
|
|
14
|
+
}
|
|
15
|
+
export interface TemplateVariable {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
type?: 'string' | 'integer' | 'boolean' | 'array' | 'object';
|
|
19
|
+
required?: boolean;
|
|
20
|
+
default?: unknown;
|
|
21
|
+
example?: unknown;
|
|
22
|
+
pattern?: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface TemplateMetadata {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
category: TemplateCategory;
|
|
29
|
+
version?: string;
|
|
30
|
+
author?: string;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
license?: string;
|
|
33
|
+
homepage?: string;
|
|
34
|
+
variables?: TemplateVariable[];
|
|
35
|
+
requirements?: Record<string, unknown>;
|
|
36
|
+
examples?: Array<Record<string, unknown>>;
|
|
37
|
+
}
|
|
38
|
+
export declare class WorkflowTemplate {
|
|
39
|
+
metadata: TemplateMetadata;
|
|
40
|
+
content: string;
|
|
41
|
+
source: 'builtin' | 'file' | 'registry';
|
|
42
|
+
path?: string | undefined;
|
|
43
|
+
readonly createdAt: Date;
|
|
44
|
+
constructor(metadata: TemplateMetadata, content: string, source?: 'builtin' | 'file' | 'registry', path?: string | undefined);
|
|
45
|
+
get id(): string;
|
|
46
|
+
get name(): string;
|
|
47
|
+
get category(): TemplateCategory;
|
|
48
|
+
get variables(): TemplateVariable[];
|
|
49
|
+
validateVariables(values: Record<string, unknown>): {
|
|
50
|
+
valid: boolean;
|
|
51
|
+
errors: string[];
|
|
52
|
+
};
|
|
53
|
+
render(variables?: Record<string, unknown>): string;
|
|
54
|
+
instantiate(outputPath: string, variables?: Record<string, unknown>, workflowId?: string): string;
|
|
55
|
+
static fromFile(path: string): WorkflowTemplate;
|
|
56
|
+
}
|
|
57
|
+
export declare class TemplateRegistry {
|
|
58
|
+
private templateDirs;
|
|
59
|
+
private templates;
|
|
60
|
+
constructor(templateDirs?: string[], loadBuiltins?: boolean);
|
|
61
|
+
register(template: WorkflowTemplate): void;
|
|
62
|
+
unregister(id: string): boolean;
|
|
63
|
+
get(id: string): WorkflowTemplate | undefined;
|
|
64
|
+
list(category?: TemplateCategory, tags?: string[]): WorkflowTemplate[];
|
|
65
|
+
search(query: string): WorkflowTemplate[];
|
|
66
|
+
discover(): string[];
|
|
67
|
+
}
|
|
68
|
+
export declare const HELLO_TEMPLATE: WorkflowTemplate;
|
|
69
|
+
export declare const BUILTIN_TEMPLATES: WorkflowTemplate[];
|
|
70
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow template library for marktoflow.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { dirname } from 'node:path';
|
|
6
|
+
import { parse, stringify } from 'yaml';
|
|
7
|
+
export var TemplateCategory;
|
|
8
|
+
(function (TemplateCategory) {
|
|
9
|
+
TemplateCategory["CODE_QUALITY"] = "code_quality";
|
|
10
|
+
TemplateCategory["DEPLOYMENT"] = "deployment";
|
|
11
|
+
TemplateCategory["TESTING"] = "testing";
|
|
12
|
+
TemplateCategory["DOCUMENTATION"] = "documentation";
|
|
13
|
+
TemplateCategory["SECURITY"] = "security";
|
|
14
|
+
TemplateCategory["MONITORING"] = "monitoring";
|
|
15
|
+
TemplateCategory["DATA"] = "data";
|
|
16
|
+
TemplateCategory["INTEGRATION"] = "integration";
|
|
17
|
+
TemplateCategory["GENERAL"] = "general";
|
|
18
|
+
})(TemplateCategory || (TemplateCategory = {}));
|
|
19
|
+
export class WorkflowTemplate {
|
|
20
|
+
metadata;
|
|
21
|
+
content;
|
|
22
|
+
source;
|
|
23
|
+
path;
|
|
24
|
+
createdAt;
|
|
25
|
+
constructor(metadata, content, source = 'builtin', path) {
|
|
26
|
+
this.metadata = metadata;
|
|
27
|
+
this.content = content;
|
|
28
|
+
this.source = source;
|
|
29
|
+
this.path = path;
|
|
30
|
+
this.createdAt = new Date();
|
|
31
|
+
}
|
|
32
|
+
get id() {
|
|
33
|
+
return this.metadata.id;
|
|
34
|
+
}
|
|
35
|
+
get name() {
|
|
36
|
+
return this.metadata.name;
|
|
37
|
+
}
|
|
38
|
+
get category() {
|
|
39
|
+
return this.metadata.category;
|
|
40
|
+
}
|
|
41
|
+
get variables() {
|
|
42
|
+
return this.metadata.variables ?? [];
|
|
43
|
+
}
|
|
44
|
+
validateVariables(values) {
|
|
45
|
+
const errors = [];
|
|
46
|
+
for (const variable of this.variables) {
|
|
47
|
+
const value = values[variable.name];
|
|
48
|
+
if (value === undefined || value === null) {
|
|
49
|
+
if (variable.required && variable.default === undefined) {
|
|
50
|
+
errors.push(`Variable '${variable.name}' is required`);
|
|
51
|
+
}
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (variable.type) {
|
|
55
|
+
const typeMap = {
|
|
56
|
+
string: 'string',
|
|
57
|
+
integer: 'number',
|
|
58
|
+
boolean: 'boolean',
|
|
59
|
+
array: 'object',
|
|
60
|
+
object: 'object',
|
|
61
|
+
};
|
|
62
|
+
const expected = typeMap[variable.type];
|
|
63
|
+
if (expected === 'number' && typeof value !== 'number') {
|
|
64
|
+
errors.push(`Variable '${variable.name}' must be a number`);
|
|
65
|
+
}
|
|
66
|
+
else if (expected === 'string' && typeof value !== 'string') {
|
|
67
|
+
errors.push(`Variable '${variable.name}' must be a string`);
|
|
68
|
+
}
|
|
69
|
+
else if (expected === 'boolean' && typeof value !== 'boolean') {
|
|
70
|
+
errors.push(`Variable '${variable.name}' must be a boolean`);
|
|
71
|
+
}
|
|
72
|
+
else if (variable.type === 'array' && !Array.isArray(value)) {
|
|
73
|
+
errors.push(`Variable '${variable.name}' must be an array`);
|
|
74
|
+
}
|
|
75
|
+
else if (variable.type === 'object' && typeof value !== 'object') {
|
|
76
|
+
errors.push(`Variable '${variable.name}' must be an object`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (variable.pattern && typeof value === 'string') {
|
|
80
|
+
const regex = new RegExp(variable.pattern);
|
|
81
|
+
if (!regex.test(value)) {
|
|
82
|
+
errors.push(`Variable '${variable.name}' must match pattern ${variable.pattern}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { valid: errors.length === 0, errors };
|
|
87
|
+
}
|
|
88
|
+
render(variables = {}) {
|
|
89
|
+
const values = { ...variables };
|
|
90
|
+
for (const variable of this.variables) {
|
|
91
|
+
if (values[variable.name] === undefined && variable.default !== undefined) {
|
|
92
|
+
values[variable.name] = variable.default;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
let result = this.content;
|
|
96
|
+
for (const [name, value] of Object.entries(values)) {
|
|
97
|
+
let strValue = '';
|
|
98
|
+
if (Array.isArray(value) || typeof value === 'object') {
|
|
99
|
+
strValue = stringify(value).trim();
|
|
100
|
+
}
|
|
101
|
+
else if (typeof value === 'boolean') {
|
|
102
|
+
strValue = String(value).toLowerCase();
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
strValue = String(value);
|
|
106
|
+
}
|
|
107
|
+
result = result.replace(new RegExp(`\\{\\{\\s*template\\.${name}\\s*\\}\\}`, 'g'), strValue);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
instantiate(outputPath, variables = {}, workflowId) {
|
|
112
|
+
const { valid, errors } = this.validateVariables(variables);
|
|
113
|
+
if (!valid) {
|
|
114
|
+
throw new Error(`Invalid variables: ${errors.join('; ')}`);
|
|
115
|
+
}
|
|
116
|
+
let content = this.render(variables);
|
|
117
|
+
if (workflowId) {
|
|
118
|
+
content = content.replace(/(id:\\s*\")[^\"]*(\")/g, `$1${workflowId}$2`);
|
|
119
|
+
content = content.replace(/(id:\\s*)'[^']*(')/g, `$1'${workflowId}'$2`);
|
|
120
|
+
content = content.replace(/(id:\\s*)(\\S+)/g, `$1${workflowId}`);
|
|
121
|
+
}
|
|
122
|
+
const dir = dirname(outputPath);
|
|
123
|
+
if (!existsSync(dir)) {
|
|
124
|
+
mkdirSync(dir, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
const fs = require('node:fs');
|
|
127
|
+
fs.writeFileSync(outputPath, content);
|
|
128
|
+
return outputPath;
|
|
129
|
+
}
|
|
130
|
+
static fromFile(path) {
|
|
131
|
+
const content = readFileSync(path, 'utf8');
|
|
132
|
+
if (content.startsWith('---')) {
|
|
133
|
+
const parts = content.split('---', 3);
|
|
134
|
+
if (parts.length >= 3) {
|
|
135
|
+
const frontmatter = parse(parts[1]);
|
|
136
|
+
const templateMeta = frontmatter?.template ?? {};
|
|
137
|
+
const metadata = {
|
|
138
|
+
id: templateMeta.id ?? path.split('/').pop()?.replace(/\\.md$/, '') ?? 'template',
|
|
139
|
+
name: templateMeta.name ?? path.split('/').pop()?.replace(/\\.md$/, '') ?? 'Template',
|
|
140
|
+
description: templateMeta.description ?? '',
|
|
141
|
+
category: templateMeta.category ?? TemplateCategory.GENERAL,
|
|
142
|
+
version: templateMeta.version ?? '1.0.0',
|
|
143
|
+
author: templateMeta.author ?? '',
|
|
144
|
+
tags: templateMeta.tags ?? [],
|
|
145
|
+
variables: templateMeta.variables ?? [],
|
|
146
|
+
requirements: templateMeta.requirements ?? {},
|
|
147
|
+
};
|
|
148
|
+
return new WorkflowTemplate(metadata, content, 'file', path);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const fallback = {
|
|
152
|
+
id: path.split('/').pop()?.replace(/\\.md$/, '') ?? 'template',
|
|
153
|
+
name: path.split('/').pop()?.replace(/\\.md$/, '') ?? 'Template',
|
|
154
|
+
category: TemplateCategory.GENERAL,
|
|
155
|
+
};
|
|
156
|
+
return new WorkflowTemplate(fallback, content, 'file', path);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export class TemplateRegistry {
|
|
160
|
+
templateDirs;
|
|
161
|
+
templates = new Map();
|
|
162
|
+
constructor(templateDirs = [], loadBuiltins = true) {
|
|
163
|
+
this.templateDirs = templateDirs;
|
|
164
|
+
if (loadBuiltins) {
|
|
165
|
+
for (const template of BUILTIN_TEMPLATES) {
|
|
166
|
+
this.templates.set(template.id, template);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
register(template) {
|
|
171
|
+
this.templates.set(template.id, template);
|
|
172
|
+
}
|
|
173
|
+
unregister(id) {
|
|
174
|
+
return this.templates.delete(id);
|
|
175
|
+
}
|
|
176
|
+
get(id) {
|
|
177
|
+
return this.templates.get(id);
|
|
178
|
+
}
|
|
179
|
+
list(category, tags) {
|
|
180
|
+
let items = Array.from(this.templates.values());
|
|
181
|
+
if (category) {
|
|
182
|
+
items = items.filter((t) => t.category === category);
|
|
183
|
+
}
|
|
184
|
+
if (tags && tags.length > 0) {
|
|
185
|
+
items = items.filter((t) => (t.metadata.tags ?? []).some((tag) => tags.includes(tag)));
|
|
186
|
+
}
|
|
187
|
+
return items.sort((a, b) => a.name.localeCompare(b.name));
|
|
188
|
+
}
|
|
189
|
+
search(query) {
|
|
190
|
+
const q = query.toLowerCase();
|
|
191
|
+
return Array.from(this.templates.values()).filter((t) => {
|
|
192
|
+
if (t.name.toLowerCase().includes(q))
|
|
193
|
+
return true;
|
|
194
|
+
if ((t.metadata.description ?? '').toLowerCase().includes(q))
|
|
195
|
+
return true;
|
|
196
|
+
return (t.metadata.tags ?? []).some((tag) => tag.toLowerCase().includes(q));
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
discover() {
|
|
200
|
+
const discovered = [];
|
|
201
|
+
for (const dir of this.templateDirs) {
|
|
202
|
+
if (!existsSync(dir))
|
|
203
|
+
continue;
|
|
204
|
+
const fs = require('node:fs');
|
|
205
|
+
const entries = fs.readdirSync(dir);
|
|
206
|
+
for (const entry of entries) {
|
|
207
|
+
if (!entry.endsWith('.md'))
|
|
208
|
+
continue;
|
|
209
|
+
const path = `${dir}/${entry}`;
|
|
210
|
+
try {
|
|
211
|
+
const tmpl = WorkflowTemplate.fromFile(path);
|
|
212
|
+
if (!this.templates.has(tmpl.id)) {
|
|
213
|
+
this.templates.set(tmpl.id, tmpl);
|
|
214
|
+
discovered.push(tmpl.id);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// ignore invalid templates
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return discovered;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export const HELLO_TEMPLATE = new WorkflowTemplate({
|
|
226
|
+
id: 'hello-world',
|
|
227
|
+
name: 'Hello World',
|
|
228
|
+
description: 'A minimal example workflow template',
|
|
229
|
+
category: TemplateCategory.GENERAL,
|
|
230
|
+
version: '1.0.0',
|
|
231
|
+
author: 'marktoflow',
|
|
232
|
+
tags: ['example', 'starter'],
|
|
233
|
+
variables: [
|
|
234
|
+
{
|
|
235
|
+
name: 'message',
|
|
236
|
+
description: 'Message to print',
|
|
237
|
+
type: 'string',
|
|
238
|
+
required: true,
|
|
239
|
+
default: 'Hello from marktoflow!',
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
}, `---\nworkflow:\n id: hello-world\n name: \"Hello World\"\n version: \"1.0.0\"\n description: \"A simple example workflow\"\n\nsteps:\n - id: greet\n action: console.log\n inputs:\n message: \"{{ template.message }}\"\n---\n\n# Hello World\n\nThis is a simple example workflow.\n`);
|
|
243
|
+
export const BUILTIN_TEMPLATES = [HELLO_TEMPLATE];
|
|
244
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|