@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.
Files changed (125) hide show
  1. package/dist/bundle.d.ts +43 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +202 -0
  4. package/dist/bundle.js.map +1 -0
  5. package/dist/config.d.ts +33 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +27 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/costs.d.ts +182 -0
  10. package/dist/costs.d.ts.map +1 -0
  11. package/dist/costs.js +464 -0
  12. package/dist/costs.js.map +1 -0
  13. package/dist/credentials.d.ts +162 -0
  14. package/dist/credentials.d.ts.map +1 -0
  15. package/dist/credentials.js +646 -0
  16. package/dist/credentials.js.map +1 -0
  17. package/dist/engine.d.ts +137 -0
  18. package/dist/engine.d.ts.map +1 -0
  19. package/dist/engine.js +514 -0
  20. package/dist/engine.js.map +1 -0
  21. package/dist/env.d.ts +59 -0
  22. package/dist/env.d.ts.map +1 -0
  23. package/dist/env.js +256 -0
  24. package/dist/env.js.map +1 -0
  25. package/dist/failover.d.ts +43 -0
  26. package/dist/failover.d.ts.map +1 -0
  27. package/dist/failover.js +53 -0
  28. package/dist/failover.js.map +1 -0
  29. package/dist/filewatcher.d.ts +32 -0
  30. package/dist/filewatcher.d.ts.map +1 -0
  31. package/dist/filewatcher.js +92 -0
  32. package/dist/filewatcher.js.map +1 -0
  33. package/dist/index.d.ts +36 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +69 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/logging.d.ts +62 -0
  38. package/dist/logging.d.ts.map +1 -0
  39. package/dist/logging.js +211 -0
  40. package/dist/logging.js.map +1 -0
  41. package/dist/mcp-loader.d.ts +29 -0
  42. package/dist/mcp-loader.d.ts.map +1 -0
  43. package/dist/mcp-loader.js +60 -0
  44. package/dist/mcp-loader.js.map +1 -0
  45. package/dist/metrics.d.ts +19 -0
  46. package/dist/metrics.d.ts.map +1 -0
  47. package/dist/metrics.js +65 -0
  48. package/dist/metrics.js.map +1 -0
  49. package/dist/models.d.ts +419 -0
  50. package/dist/models.d.ts.map +1 -0
  51. package/dist/models.js +111 -0
  52. package/dist/models.js.map +1 -0
  53. package/dist/parser.d.ts +40 -0
  54. package/dist/parser.d.ts.map +1 -0
  55. package/dist/parser.js +287 -0
  56. package/dist/parser.js.map +1 -0
  57. package/dist/plugins.d.ts +105 -0
  58. package/dist/plugins.d.ts.map +1 -0
  59. package/dist/plugins.js +182 -0
  60. package/dist/plugins.js.map +1 -0
  61. package/dist/queue.d.ts +114 -0
  62. package/dist/queue.d.ts.map +1 -0
  63. package/dist/queue.js +385 -0
  64. package/dist/queue.js.map +1 -0
  65. package/dist/rollback.d.ts +117 -0
  66. package/dist/rollback.d.ts.map +1 -0
  67. package/dist/rollback.js +374 -0
  68. package/dist/rollback.js.map +1 -0
  69. package/dist/routing.d.ts +144 -0
  70. package/dist/routing.d.ts.map +1 -0
  71. package/dist/routing.js +457 -0
  72. package/dist/routing.js.map +1 -0
  73. package/dist/scheduler.d.ts +91 -0
  74. package/dist/scheduler.d.ts.map +1 -0
  75. package/dist/scheduler.js +259 -0
  76. package/dist/scheduler.js.map +1 -0
  77. package/dist/script-tool.d.ts +22 -0
  78. package/dist/script-tool.d.ts.map +1 -0
  79. package/dist/script-tool.js +90 -0
  80. package/dist/script-tool.js.map +1 -0
  81. package/dist/sdk-registry.d.ts +81 -0
  82. package/dist/sdk-registry.d.ts.map +1 -0
  83. package/dist/sdk-registry.js +264 -0
  84. package/dist/sdk-registry.js.map +1 -0
  85. package/dist/security.d.ts +155 -0
  86. package/dist/security.d.ts.map +1 -0
  87. package/dist/security.js +362 -0
  88. package/dist/security.js.map +1 -0
  89. package/dist/state.d.ts +67 -0
  90. package/dist/state.d.ts.map +1 -0
  91. package/dist/state.js +276 -0
  92. package/dist/state.js.map +1 -0
  93. package/dist/templates.d.ts +70 -0
  94. package/dist/templates.d.ts.map +1 -0
  95. package/dist/templates.js +244 -0
  96. package/dist/templates.js.map +1 -0
  97. package/dist/tool-base.d.ts +54 -0
  98. package/dist/tool-base.d.ts.map +1 -0
  99. package/dist/tool-base.js +43 -0
  100. package/dist/tool-base.js.map +1 -0
  101. package/dist/tool-registry.d.ts +24 -0
  102. package/dist/tool-registry.d.ts.map +1 -0
  103. package/dist/tool-registry.js +164 -0
  104. package/dist/tool-registry.js.map +1 -0
  105. package/dist/tools/custom-tool.d.ts +16 -0
  106. package/dist/tools/custom-tool.d.ts.map +1 -0
  107. package/dist/tools/custom-tool.js +85 -0
  108. package/dist/tools/custom-tool.js.map +1 -0
  109. package/dist/tools/mcp-tool.d.ts +16 -0
  110. package/dist/tools/mcp-tool.d.ts.map +1 -0
  111. package/dist/tools/mcp-tool.js +98 -0
  112. package/dist/tools/mcp-tool.js.map +1 -0
  113. package/dist/tools/openapi-tool.d.ts +17 -0
  114. package/dist/tools/openapi-tool.d.ts.map +1 -0
  115. package/dist/tools/openapi-tool.js +165 -0
  116. package/dist/tools/openapi-tool.js.map +1 -0
  117. package/dist/trigger-manager.d.ts +26 -0
  118. package/dist/trigger-manager.d.ts.map +1 -0
  119. package/dist/trigger-manager.js +107 -0
  120. package/dist/trigger-manager.js.map +1 -0
  121. package/dist/webhook.d.ts +95 -0
  122. package/dist/webhook.d.ts.map +1 -0
  123. package/dist/webhook.js +261 -0
  124. package/dist/webhook.js.map +1 -0
  125. 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":"AAAA;;GAEG;AAMH,oBAAY,gBAAgB;IAC1B,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,OAAO,YAAY;IACnB,aAAa,kBAAkB;IAC/B,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,IAAI,SAAS;IACb,WAAW,gBAAgB;IAC3B,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAIlB,QAAQ,EAAE,gBAAgB;IAC1B,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU;IACvC,IAAI,CAAC,EAAE,MAAM;IANtB,SAAgB,SAAS,EAAE,IAAI,CAAC;gBAGvB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAS,GAAG,MAAM,GAAG,UAAsB,EACnD,IAAI,CAAC,EAAE,MAAM,YAAA;IAKtB,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,gBAAgB,CAE/B;IAED,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAElC;IAED,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAyCxF,MAAM,CAAC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM;IAuBvD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAoBrG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;CA4BhD;AAED,qBAAa,gBAAgB;IAGf,OAAO,CAAC,YAAY;IAFhC,OAAO,CAAC,SAAS,CAAuC;gBAEpC,YAAY,GAAE,MAAM,EAAO,EAAE,YAAY,GAAE,OAAc;IAQ7E,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI7C,IAAI,CAAC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE;IAWtE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE;IASzC,QAAQ,IAAI,MAAM,EAAE;CAsBrB;AAED,eAAO,MAAM,cAAc,kBAoB1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAAqB,CAAC"}
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAExC,MAAM,CAAN,IAAY,gBAUX;AAVD,WAAY,gBAAgB;IAC1B,iDAA6B,CAAA;IAC7B,6CAAyB,CAAA;IACzB,uCAAmB,CAAA;IACnB,mDAA+B,CAAA;IAC/B,yCAAqB,CAAA;IACrB,6CAAyB,CAAA;IACzB,iCAAa,CAAA;IACb,+CAA2B,CAAA;IAC3B,uCAAmB,CAAA;AACrB,CAAC,EAVW,gBAAgB,KAAhB,gBAAgB,QAU3B;AA2BD,MAAM,OAAO,gBAAgB;IAIlB;IACA;IACA;IACA;IANO,SAAS,CAAO;IAEhC,YACS,QAA0B,EAC1B,OAAe,EACf,SAA0C,SAAS,EACnD,IAAa;QAHb,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAA6C;QACnD,SAAI,GAAJ,IAAI,CAAS;QAEpB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,iBAAiB,CAAC,MAA+B;QAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBACxD,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,eAAe,CAAC,CAAC;gBACzD,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,OAAO,GAA2B;oBACtC,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,QAAQ;oBACjB,OAAO,EAAE,SAAS;oBAClB,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,QAAQ;iBACjB,CAAC;gBACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvD,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9D,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;oBAChE,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,qBAAqB,CAAC,CAAC;gBAC/D,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9D,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,oBAAoB,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACnE,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,qBAAqB,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YACD,IAAI,QAAQ,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,wBAAwB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,YAAqC,EAAE;QAC5C,MAAM,MAAM,GAA4B,EAAE,GAAG,SAAS,EAAE,CAAC;QACzD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1E,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACtD,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,wBAAwB,IAAI,YAAY,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,UAAkB,EAAE,YAAqC,EAAE,EAAE,UAAmB;QAC1F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC;YACzE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,UAAU,KAAK,CAAC,CAAC;YACxE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,UAAU,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9B,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAwB,CAAC;gBAC3D,MAAM,YAAY,GAAG,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAqB;oBACjC,EAAE,EAAE,YAAY,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,UAAU;oBACjF,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,UAAU;oBACrF,WAAW,EAAE,YAAY,CAAC,WAAW,IAAI,EAAE;oBAC3C,QAAQ,EAAG,YAAY,CAAC,QAA6B,IAAI,gBAAgB,CAAC,OAAO;oBACjF,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,OAAO;oBACxC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;oBACjC,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE;oBAC7B,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,EAAE;oBACvC,YAAY,EAAE,YAAY,CAAC,YAAY,IAAI,EAAE;iBAC9C,CAAC;gBACF,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAqB;YACjC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,UAAU;YAC9D,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,UAAU;YAChE,QAAQ,EAAE,gBAAgB,CAAC,OAAO;SACnC,CAAC;QACF,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IAGP;IAFZ,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IAExD,YAAoB,eAAyB,EAAE,EAAE,eAAwB,IAAI;QAAzD,iBAAY,GAAZ,YAAY,CAAe;QAC7C,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;gBACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,QAA0B;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,QAA2B,EAAE,IAAe;QAC/C,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACtD,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1E,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACrC,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;wBACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;wBAClC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAChD;IACE,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,qCAAqC;IAClD,QAAQ,EAAE,gBAAgB,CAAC,OAAO;IAClC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;IAC5B,SAAS,EAAE;QACT;YACE,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,wBAAwB;SAClC;KACF;CACF,EACD,wSAAwS,CACzS,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAuB,CAAC,cAAc,CAAC,CAAC"}