@marktoflow/core 2.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +307 -0
  2. package/dist/bundle.d.ts +43 -0
  3. package/dist/bundle.d.ts.map +1 -0
  4. package/dist/bundle.js +202 -0
  5. package/dist/bundle.js.map +1 -0
  6. package/dist/config.d.ts +33 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +27 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/core-tools.d.ts +39 -0
  11. package/dist/core-tools.d.ts.map +1 -0
  12. package/dist/core-tools.js +58 -0
  13. package/dist/core-tools.js.map +1 -0
  14. package/dist/costs.d.ts +182 -0
  15. package/dist/costs.d.ts.map +1 -0
  16. package/dist/costs.js +464 -0
  17. package/dist/costs.js.map +1 -0
  18. package/dist/credentials.d.ts +162 -0
  19. package/dist/credentials.d.ts.map +1 -0
  20. package/dist/credentials.js +646 -0
  21. package/dist/credentials.js.map +1 -0
  22. package/dist/engine.d.ts +243 -0
  23. package/dist/engine.d.ts.map +1 -0
  24. package/dist/engine.js +1453 -0
  25. package/dist/engine.js.map +1 -0
  26. package/dist/env.d.ts +59 -0
  27. package/dist/env.d.ts.map +1 -0
  28. package/dist/env.js +256 -0
  29. package/dist/env.js.map +1 -0
  30. package/dist/failover.d.ts +43 -0
  31. package/dist/failover.d.ts.map +1 -0
  32. package/dist/failover.js +53 -0
  33. package/dist/failover.js.map +1 -0
  34. package/dist/filewatcher.d.ts +32 -0
  35. package/dist/filewatcher.d.ts.map +1 -0
  36. package/dist/filewatcher.js +92 -0
  37. package/dist/filewatcher.js.map +1 -0
  38. package/dist/index.d.ts +40 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +77 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/logging.d.ts +62 -0
  43. package/dist/logging.d.ts.map +1 -0
  44. package/dist/logging.js +211 -0
  45. package/dist/logging.js.map +1 -0
  46. package/dist/mcp-loader.d.ts +29 -0
  47. package/dist/mcp-loader.d.ts.map +1 -0
  48. package/dist/mcp-loader.js +60 -0
  49. package/dist/mcp-loader.js.map +1 -0
  50. package/dist/metrics.d.ts +19 -0
  51. package/dist/metrics.d.ts.map +1 -0
  52. package/dist/metrics.js +65 -0
  53. package/dist/metrics.js.map +1 -0
  54. package/dist/models.d.ts +1686 -0
  55. package/dist/models.d.ts.map +1 -0
  56. package/dist/models.js +333 -0
  57. package/dist/models.js.map +1 -0
  58. package/dist/parser.d.ts +40 -0
  59. package/dist/parser.d.ts.map +1 -0
  60. package/dist/parser.js +532 -0
  61. package/dist/parser.js.map +1 -0
  62. package/dist/permissions.d.ts +49 -0
  63. package/dist/permissions.d.ts.map +1 -0
  64. package/dist/permissions.js +286 -0
  65. package/dist/permissions.js.map +1 -0
  66. package/dist/plugins.d.ts +105 -0
  67. package/dist/plugins.d.ts.map +1 -0
  68. package/dist/plugins.js +182 -0
  69. package/dist/plugins.js.map +1 -0
  70. package/dist/prompt-loader.d.ts +47 -0
  71. package/dist/prompt-loader.d.ts.map +1 -0
  72. package/dist/prompt-loader.js +268 -0
  73. package/dist/prompt-loader.js.map +1 -0
  74. package/dist/queue.d.ts +114 -0
  75. package/dist/queue.d.ts.map +1 -0
  76. package/dist/queue.js +385 -0
  77. package/dist/queue.js.map +1 -0
  78. package/dist/rollback.d.ts +117 -0
  79. package/dist/rollback.d.ts.map +1 -0
  80. package/dist/rollback.js +374 -0
  81. package/dist/rollback.js.map +1 -0
  82. package/dist/routing.d.ts +144 -0
  83. package/dist/routing.d.ts.map +1 -0
  84. package/dist/routing.js +457 -0
  85. package/dist/routing.js.map +1 -0
  86. package/dist/scheduler.d.ts +91 -0
  87. package/dist/scheduler.d.ts.map +1 -0
  88. package/dist/scheduler.js +259 -0
  89. package/dist/scheduler.js.map +1 -0
  90. package/dist/script-tool.d.ts +22 -0
  91. package/dist/script-tool.d.ts.map +1 -0
  92. package/dist/script-tool.js +90 -0
  93. package/dist/script-tool.js.map +1 -0
  94. package/dist/sdk-registry.d.ts +94 -0
  95. package/dist/sdk-registry.d.ts.map +1 -0
  96. package/dist/sdk-registry.js +328 -0
  97. package/dist/sdk-registry.js.map +1 -0
  98. package/dist/security.d.ts +155 -0
  99. package/dist/security.d.ts.map +1 -0
  100. package/dist/security.js +362 -0
  101. package/dist/security.js.map +1 -0
  102. package/dist/state.d.ts +67 -0
  103. package/dist/state.d.ts.map +1 -0
  104. package/dist/state.js +276 -0
  105. package/dist/state.js.map +1 -0
  106. package/dist/templates.d.ts +70 -0
  107. package/dist/templates.d.ts.map +1 -0
  108. package/dist/templates.js +244 -0
  109. package/dist/templates.js.map +1 -0
  110. package/dist/tool-base.d.ts +54 -0
  111. package/dist/tool-base.d.ts.map +1 -0
  112. package/dist/tool-base.js +43 -0
  113. package/dist/tool-base.js.map +1 -0
  114. package/dist/tool-registry.d.ts +24 -0
  115. package/dist/tool-registry.d.ts.map +1 -0
  116. package/dist/tool-registry.js +164 -0
  117. package/dist/tool-registry.js.map +1 -0
  118. package/dist/tools/custom-tool.d.ts +16 -0
  119. package/dist/tools/custom-tool.d.ts.map +1 -0
  120. package/dist/tools/custom-tool.js +85 -0
  121. package/dist/tools/custom-tool.js.map +1 -0
  122. package/dist/tools/mcp-tool.d.ts +16 -0
  123. package/dist/tools/mcp-tool.d.ts.map +1 -0
  124. package/dist/tools/mcp-tool.js +98 -0
  125. package/dist/tools/mcp-tool.js.map +1 -0
  126. package/dist/tools/openapi-tool.d.ts +17 -0
  127. package/dist/tools/openapi-tool.d.ts.map +1 -0
  128. package/dist/tools/openapi-tool.js +165 -0
  129. package/dist/tools/openapi-tool.js.map +1 -0
  130. package/dist/trigger-manager.d.ts +26 -0
  131. package/dist/trigger-manager.d.ts.map +1 -0
  132. package/dist/trigger-manager.js +107 -0
  133. package/dist/trigger-manager.js.map +1 -0
  134. package/dist/webhook.d.ts +95 -0
  135. package/dist/webhook.d.ts.map +1 -0
  136. package/dist/webhook.js +261 -0
  137. package/dist/webhook.js.map +1 -0
  138. package/dist/workflow-tools.d.ts +102 -0
  139. package/dist/workflow-tools.d.ts.map +1 -0
  140. package/dist/workflow-tools.js +130 -0
  141. package/dist/workflow-tools.js.map +1 -0
  142. package/package.json +62 -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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"}