@marktoflow/core 2.0.0-alpha.7 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +24 -220
  2. package/dist/built-in-operations.d.ts +150 -0
  3. package/dist/built-in-operations.d.ts.map +1 -0
  4. package/dist/built-in-operations.js +799 -0
  5. package/dist/built-in-operations.js.map +1 -0
  6. package/dist/core-tools.d.ts +39 -0
  7. package/dist/core-tools.d.ts.map +1 -0
  8. package/dist/core-tools.js +58 -0
  9. package/dist/core-tools.js.map +1 -0
  10. package/dist/credentials.d.ts +60 -1
  11. package/dist/credentials.d.ts.map +1 -1
  12. package/dist/credentials.js +229 -4
  13. package/dist/credentials.js.map +1 -1
  14. package/dist/engine.d.ts +144 -3
  15. package/dist/engine.d.ts.map +1 -1
  16. package/dist/engine.js +1385 -49
  17. package/dist/engine.js.map +1 -1
  18. package/dist/file-operations.d.ts +86 -0
  19. package/dist/file-operations.d.ts.map +1 -0
  20. package/dist/file-operations.js +363 -0
  21. package/dist/file-operations.js.map +1 -0
  22. package/dist/index.d.ts +16 -5
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +46 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/logging.d.ts +40 -2
  27. package/dist/logging.d.ts.map +1 -1
  28. package/dist/logging.js +166 -13
  29. package/dist/logging.js.map +1 -1
  30. package/dist/models.d.ts +1931 -203
  31. package/dist/models.d.ts.map +1 -1
  32. package/dist/models.js +303 -13
  33. package/dist/models.js.map +1 -1
  34. package/dist/nunjucks-filters.d.ts +271 -0
  35. package/dist/nunjucks-filters.d.ts.map +1 -0
  36. package/dist/nunjucks-filters.js +648 -0
  37. package/dist/nunjucks-filters.js.map +1 -0
  38. package/dist/oauth-manager.d.ts +128 -0
  39. package/dist/oauth-manager.d.ts.map +1 -0
  40. package/dist/oauth-manager.js +291 -0
  41. package/dist/oauth-manager.js.map +1 -0
  42. package/dist/oauth-refresh.d.ts +37 -0
  43. package/dist/oauth-refresh.d.ts.map +1 -0
  44. package/dist/oauth-refresh.js +76 -0
  45. package/dist/oauth-refresh.js.map +1 -0
  46. package/dist/parser.d.ts.map +1 -1
  47. package/dist/parser.js +291 -10
  48. package/dist/parser.js.map +1 -1
  49. package/dist/permissions.d.ts +49 -0
  50. package/dist/permissions.d.ts.map +1 -0
  51. package/dist/permissions.js +286 -0
  52. package/dist/permissions.js.map +1 -0
  53. package/dist/prompt-loader.d.ts +53 -0
  54. package/dist/prompt-loader.d.ts.map +1 -0
  55. package/dist/prompt-loader.js +205 -0
  56. package/dist/prompt-loader.js.map +1 -0
  57. package/dist/scheduler.d.ts +22 -3
  58. package/dist/scheduler.d.ts.map +1 -1
  59. package/dist/scheduler.js +72 -73
  60. package/dist/scheduler.js.map +1 -1
  61. package/dist/script-executor.d.ts +65 -0
  62. package/dist/script-executor.d.ts.map +1 -0
  63. package/dist/script-executor.js +261 -0
  64. package/dist/script-executor.js.map +1 -0
  65. package/dist/sdk-registry.d.ts +20 -2
  66. package/dist/sdk-registry.d.ts.map +1 -1
  67. package/dist/sdk-registry.js +100 -15
  68. package/dist/sdk-registry.js.map +1 -1
  69. package/dist/secret-providers/index.d.ts +12 -0
  70. package/dist/secret-providers/index.d.ts.map +1 -0
  71. package/dist/secret-providers/index.js +11 -0
  72. package/dist/secret-providers/index.js.map +1 -0
  73. package/dist/secret-providers/providers/aws.d.ts +32 -0
  74. package/dist/secret-providers/providers/aws.d.ts.map +1 -0
  75. package/dist/secret-providers/providers/aws.js +118 -0
  76. package/dist/secret-providers/providers/aws.js.map +1 -0
  77. package/dist/secret-providers/providers/azure.d.ts +40 -0
  78. package/dist/secret-providers/providers/azure.d.ts.map +1 -0
  79. package/dist/secret-providers/providers/azure.js +170 -0
  80. package/dist/secret-providers/providers/azure.js.map +1 -0
  81. package/dist/secret-providers/providers/env.d.ts +26 -0
  82. package/dist/secret-providers/providers/env.d.ts.map +1 -0
  83. package/dist/secret-providers/providers/env.js +59 -0
  84. package/dist/secret-providers/providers/env.js.map +1 -0
  85. package/dist/secret-providers/providers/vault.d.ts +39 -0
  86. package/dist/secret-providers/providers/vault.d.ts.map +1 -0
  87. package/dist/secret-providers/providers/vault.js +180 -0
  88. package/dist/secret-providers/providers/vault.js.map +1 -0
  89. package/dist/secret-providers/secret-manager.d.ts +72 -0
  90. package/dist/secret-providers/secret-manager.d.ts.map +1 -0
  91. package/dist/secret-providers/secret-manager.js +226 -0
  92. package/dist/secret-providers/secret-manager.js.map +1 -0
  93. package/dist/secret-providers/types.d.ts +105 -0
  94. package/dist/secret-providers/types.d.ts.map +1 -0
  95. package/dist/secret-providers/types.js +8 -0
  96. package/dist/secret-providers/types.js.map +1 -0
  97. package/dist/security.d.ts +1 -0
  98. package/dist/security.d.ts.map +1 -1
  99. package/dist/security.js +4 -0
  100. package/dist/security.js.map +1 -1
  101. package/dist/state.d.ts.map +1 -1
  102. package/dist/state.js +16 -9
  103. package/dist/state.js.map +1 -1
  104. package/dist/template-engine.d.ts +51 -0
  105. package/dist/template-engine.d.ts.map +1 -0
  106. package/dist/template-engine.js +227 -0
  107. package/dist/template-engine.js.map +1 -0
  108. package/dist/templates.d.ts +10 -0
  109. package/dist/templates.d.ts.map +1 -1
  110. package/dist/templates.js +21 -17
  111. package/dist/templates.js.map +1 -1
  112. package/dist/tools/mcp-tool.js +9 -9
  113. package/dist/tools/mcp-tool.js.map +1 -1
  114. package/dist/trigger-manager.js +1 -1
  115. package/dist/trigger-manager.js.map +1 -1
  116. package/dist/workflow-tools.d.ts +102 -0
  117. package/dist/workflow-tools.d.ts.map +1 -0
  118. package/dist/workflow-tools.js +130 -0
  119. package/dist/workflow-tools.js.map +1 -0
  120. package/package.json +24 -6
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Permissions module for marktoflow v2.0
3
+ *
4
+ * Provides permission merging and enforcement utilities for step-level
5
+ * and workflow-level permission restrictions.
6
+ */
7
+ import { minimatch } from 'minimatch';
8
+ // ============================================================================
9
+ // Permission Merging
10
+ // ============================================================================
11
+ /**
12
+ * Merge workflow-level and step-level permissions.
13
+ * Step permissions override workflow permissions, with most restrictive winning.
14
+ */
15
+ export function mergePermissions(workflow, step) {
16
+ // Start with defaults (most permissive)
17
+ const effective = {
18
+ read: true,
19
+ write: true,
20
+ execute: true,
21
+ allowedCommands: [],
22
+ blockedCommands: [],
23
+ allowedDirectories: [],
24
+ blockedPaths: [],
25
+ network: true,
26
+ allowedHosts: [],
27
+ maxFileSize: undefined,
28
+ };
29
+ // Apply workflow-level permissions first
30
+ if (workflow) {
31
+ applyPermissions(effective, workflow);
32
+ }
33
+ // Apply step-level permissions (overrides workflow)
34
+ if (step) {
35
+ applyPermissions(effective, step);
36
+ }
37
+ return effective;
38
+ }
39
+ /**
40
+ * Apply a permission configuration to effective permissions.
41
+ */
42
+ function applyPermissions(effective, perms) {
43
+ if (!perms)
44
+ return;
45
+ // File operations
46
+ if (perms.read !== undefined) {
47
+ effective.read = perms.read;
48
+ }
49
+ if (perms.write !== undefined) {
50
+ effective.write = perms.write;
51
+ }
52
+ // Command execution
53
+ if (perms.execute !== undefined) {
54
+ effective.execute = perms.execute;
55
+ }
56
+ if (perms.allowedCommands) {
57
+ // Merge allowed commands (union)
58
+ effective.allowedCommands = [
59
+ ...new Set([...effective.allowedCommands, ...perms.allowedCommands]),
60
+ ];
61
+ }
62
+ if (perms.blockedCommands) {
63
+ // Merge blocked commands (union)
64
+ effective.blockedCommands = [
65
+ ...new Set([...effective.blockedCommands, ...perms.blockedCommands]),
66
+ ];
67
+ }
68
+ // Directory restrictions
69
+ if (perms.allowedDirectories) {
70
+ effective.allowedDirectories = [
71
+ ...new Set([...effective.allowedDirectories, ...perms.allowedDirectories]),
72
+ ];
73
+ }
74
+ if (perms.blockedPaths) {
75
+ effective.blockedPaths = [
76
+ ...new Set([...effective.blockedPaths, ...perms.blockedPaths]),
77
+ ];
78
+ }
79
+ // Network
80
+ if (perms.network !== undefined) {
81
+ effective.network = perms.network;
82
+ }
83
+ if (perms.allowedHosts) {
84
+ effective.allowedHosts = [
85
+ ...new Set([...effective.allowedHosts, ...perms.allowedHosts]),
86
+ ];
87
+ }
88
+ // Limits (most restrictive wins)
89
+ if (perms.maxFileSize !== undefined) {
90
+ if (effective.maxFileSize === undefined) {
91
+ effective.maxFileSize = perms.maxFileSize;
92
+ }
93
+ else {
94
+ effective.maxFileSize = Math.min(effective.maxFileSize, perms.maxFileSize);
95
+ }
96
+ }
97
+ }
98
+ // ============================================================================
99
+ // Permission Checking
100
+ // ============================================================================
101
+ /**
102
+ * Check if an operation is permitted.
103
+ */
104
+ export function checkPermission(perms, operation, target) {
105
+ switch (operation) {
106
+ case 'read':
107
+ return checkFilePermission(perms.read, target, 'read', perms);
108
+ case 'write':
109
+ return checkFilePermission(perms.write, target, 'write', perms);
110
+ case 'execute':
111
+ return checkExecutePermission(perms, target);
112
+ case 'network':
113
+ return checkNetworkPermission(perms, target);
114
+ default:
115
+ return { allowed: false, reason: `Unknown operation: ${operation}` };
116
+ }
117
+ }
118
+ /**
119
+ * Check file operation permission (read/write).
120
+ */
121
+ function checkFilePermission(permission, target, operation, perms) {
122
+ // If permission is false, deny all
123
+ if (!permission) {
124
+ return { allowed: false, reason: `${operation} operations are disabled` };
125
+ }
126
+ // If permission is true and no target, allow
127
+ if (permission === true && !target) {
128
+ return { allowed: true };
129
+ }
130
+ // Check blocked paths first
131
+ if (target && perms.blockedPaths.length > 0) {
132
+ for (const blocked of perms.blockedPaths) {
133
+ if (matchPath(target, blocked)) {
134
+ return { allowed: false, reason: `Path is blocked: ${blocked}` };
135
+ }
136
+ }
137
+ }
138
+ // Check allowed directories if specified
139
+ if (target && perms.allowedDirectories.length > 0) {
140
+ const inAllowedDir = perms.allowedDirectories.some((dir) => target.startsWith(dir) || matchPath(target, dir + '/**'));
141
+ if (!inAllowedDir) {
142
+ return { allowed: false, reason: `Path not in allowed directories` };
143
+ }
144
+ }
145
+ // If permission is an array, check if target matches any pattern
146
+ if (Array.isArray(permission)) {
147
+ if (!target) {
148
+ return { allowed: true }; // No specific target, allow
149
+ }
150
+ const matches = permission.some((pattern) => matchPath(target, pattern));
151
+ if (!matches) {
152
+ return { allowed: false, reason: `Path does not match allowed patterns for ${operation}` };
153
+ }
154
+ }
155
+ return { allowed: true };
156
+ }
157
+ /**
158
+ * Check execute permission for a command.
159
+ */
160
+ function checkExecutePermission(perms, command) {
161
+ // If execute is false, deny all
162
+ if (perms.execute === false) {
163
+ return { allowed: false, reason: 'Command execution is disabled' };
164
+ }
165
+ if (!command) {
166
+ return { allowed: true };
167
+ }
168
+ // Check blocked commands first
169
+ if (perms.blockedCommands.length > 0) {
170
+ for (const blocked of perms.blockedCommands) {
171
+ if (commandMatches(command, blocked)) {
172
+ return { allowed: false, reason: `Command is blocked: ${blocked}` };
173
+ }
174
+ }
175
+ }
176
+ // If execute is an array of allowed commands
177
+ if (Array.isArray(perms.execute)) {
178
+ const matches = perms.execute.some((allowed) => commandMatches(command, allowed));
179
+ if (!matches) {
180
+ return { allowed: false, reason: 'Command not in allowed list' };
181
+ }
182
+ }
183
+ // Check allowed commands if specified
184
+ if (perms.allowedCommands.length > 0) {
185
+ const matches = perms.allowedCommands.some((allowed) => commandMatches(command, allowed));
186
+ if (!matches) {
187
+ return { allowed: false, reason: 'Command not in allowed list' };
188
+ }
189
+ }
190
+ return { allowed: true };
191
+ }
192
+ /**
193
+ * Check network permission for a host.
194
+ */
195
+ function checkNetworkPermission(perms, host) {
196
+ // If network is false, deny all
197
+ if (!perms.network) {
198
+ return { allowed: false, reason: 'Network access is disabled' };
199
+ }
200
+ if (!host) {
201
+ return { allowed: true };
202
+ }
203
+ // Check allowed hosts if specified
204
+ if (perms.allowedHosts.length > 0) {
205
+ const matches = perms.allowedHosts.some((allowed) => hostMatches(host, allowed));
206
+ if (!matches) {
207
+ return { allowed: false, reason: `Host not in allowed list: ${host}` };
208
+ }
209
+ }
210
+ return { allowed: true };
211
+ }
212
+ // ============================================================================
213
+ // Pattern Matching Helpers
214
+ // ============================================================================
215
+ /**
216
+ * Match a path against a glob pattern.
217
+ */
218
+ function matchPath(path, pattern) {
219
+ return minimatch(path, pattern, { dot: true });
220
+ }
221
+ /**
222
+ * Check if a command matches a pattern.
223
+ * Patterns can be exact matches or wildcards.
224
+ */
225
+ function commandMatches(command, pattern) {
226
+ // Exact match
227
+ if (command === pattern) {
228
+ return true;
229
+ }
230
+ // Check if command starts with pattern (for matching command prefixes like "rm -rf")
231
+ if (command.startsWith(pattern + ' ') || command.startsWith(pattern)) {
232
+ return true;
233
+ }
234
+ // Wildcard pattern matching
235
+ if (pattern.includes('*')) {
236
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
237
+ return regex.test(command);
238
+ }
239
+ return false;
240
+ }
241
+ /**
242
+ * Check if a host matches a pattern.
243
+ * Supports wildcard domains like *.example.com
244
+ */
245
+ function hostMatches(host, pattern) {
246
+ // Exact match
247
+ if (host === pattern) {
248
+ return true;
249
+ }
250
+ // Wildcard domain matching (e.g., *.example.com)
251
+ if (pattern.startsWith('*.')) {
252
+ const suffix = pattern.slice(1); // .example.com
253
+ return host.endsWith(suffix);
254
+ }
255
+ return false;
256
+ }
257
+ /**
258
+ * Convert EffectivePermissions to a SecurityPolicy for use with hooks.
259
+ */
260
+ export function toSecurityPolicy(perms) {
261
+ return {
262
+ allowFileRead: (path) => checkPermission(perms, 'read', path),
263
+ allowFileWrite: (path) => checkPermission(perms, 'write', path),
264
+ allowCommand: (command) => checkPermission(perms, 'execute', command),
265
+ allowNetwork: (host) => checkPermission(perms, 'network', host),
266
+ maxFileSize: perms.maxFileSize,
267
+ };
268
+ }
269
+ /**
270
+ * Create default (permissive) permissions.
271
+ */
272
+ export function createDefaultPermissions() {
273
+ return {
274
+ read: true,
275
+ write: true,
276
+ execute: true,
277
+ allowedCommands: [],
278
+ blockedCommands: [],
279
+ allowedDirectories: [],
280
+ blockedPaths: [],
281
+ network: true,
282
+ allowedHosts: [],
283
+ maxFileSize: undefined,
284
+ };
285
+ }
286
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Prompt Loader for marktoflow v2.0
3
+ *
4
+ * Loads external prompt files with optional YAML frontmatter for variable definitions.
5
+ * Supports template variable resolution using Nunjucks ({{ prompt.variable }} syntax).
6
+ */
7
+ import { ExecutionContext } from './models.js';
8
+ export interface PromptVariable {
9
+ type: 'string' | 'number' | 'boolean' | 'array' | 'object';
10
+ required: boolean | undefined;
11
+ default: unknown;
12
+ description: string | undefined;
13
+ }
14
+ export interface LoadedPrompt {
15
+ name: string | undefined;
16
+ description: string | undefined;
17
+ variables: Record<string, PromptVariable>;
18
+ content: string;
19
+ rawContent: string;
20
+ filePath: string;
21
+ }
22
+ export interface ValidationResult {
23
+ valid: boolean;
24
+ errors: string[];
25
+ warnings: string[];
26
+ }
27
+ export interface ResolvedPrompt {
28
+ content: string;
29
+ variables: Record<string, unknown>;
30
+ }
31
+ /**
32
+ * Load a prompt file with optional YAML frontmatter.
33
+ */
34
+ export declare function loadPromptFile(promptPath: string, basePath?: string): Promise<LoadedPrompt>;
35
+ /**
36
+ * Resolve {{ prompt.variable }} templates in a prompt using Nunjucks.
37
+ *
38
+ * Features enabled by using Nunjucks:
39
+ * - Filters: {{ prompt.name | upper }}, {{ value | split('/') | first }}
40
+ * - Conditionals: {% if prompt.enabled %}...{% endif %}
41
+ * - Loops: {% for item in items %}...{% endfor %}
42
+ * - All custom filters from nunjucks-filters.ts
43
+ */
44
+ export declare function resolvePromptTemplate(prompt: LoadedPrompt, inputs: Record<string, unknown>, context?: ExecutionContext): ResolvedPrompt;
45
+ /**
46
+ * Validate that all required prompt inputs are provided.
47
+ */
48
+ export declare function validatePromptInputs(prompt: LoadedPrompt, inputs: Record<string, unknown>): ValidationResult;
49
+ /**
50
+ * Extract all variable references from a prompt template.
51
+ */
52
+ export declare function extractPromptVariables(content: string): string[];
53
+ //# sourceMappingURL=prompt-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-loader.d.ts","sourceRoot":"","sources":["../src/prompt-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAO/C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAQD;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,gBAAgB,GACzB,cAAc,CAwChB;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,gBAAgB,CAmClB;AAyCD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhE"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Prompt Loader for marktoflow v2.0
3
+ *
4
+ * Loads external prompt files with optional YAML frontmatter for variable definitions.
5
+ * Supports template variable resolution using Nunjucks ({{ prompt.variable }} syntax).
6
+ */
7
+ import { readFile } from 'node:fs/promises';
8
+ import { resolve, dirname } from 'node:path';
9
+ import { parse as parseYaml } from 'yaml';
10
+ import { renderTemplate } from './template-engine.js';
11
+ // ============================================================================
12
+ // Prompt Loading
13
+ // ============================================================================
14
+ const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---\n?/;
15
+ /**
16
+ * Load a prompt file with optional YAML frontmatter.
17
+ */
18
+ export async function loadPromptFile(promptPath, basePath) {
19
+ // Resolve path relative to base path if provided
20
+ const resolvedPath = basePath ? resolve(dirname(basePath), promptPath) : resolve(promptPath);
21
+ let content;
22
+ try {
23
+ content = await readFile(resolvedPath, 'utf-8');
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Failed to load prompt file: ${resolvedPath}. ${error}`);
27
+ }
28
+ // Parse frontmatter if present
29
+ const frontmatterMatch = content.match(FRONTMATTER_REGEX);
30
+ let frontmatter = {};
31
+ let promptContent = content;
32
+ if (frontmatterMatch) {
33
+ try {
34
+ frontmatter = parseYaml(frontmatterMatch[1]);
35
+ promptContent = content.slice(frontmatterMatch[0].length).trim();
36
+ }
37
+ catch (error) {
38
+ throw new Error(`Invalid YAML frontmatter in prompt file: ${resolvedPath}. ${error}`);
39
+ }
40
+ }
41
+ // Extract variables
42
+ const variables = {};
43
+ const variablesRaw = frontmatter.variables;
44
+ if (variablesRaw) {
45
+ for (const [name, config] of Object.entries(variablesRaw)) {
46
+ if (typeof config === 'object' && config !== null) {
47
+ const varConfig = config;
48
+ variables[name] = {
49
+ type: varConfig.type || 'string',
50
+ required: varConfig.required,
51
+ default: varConfig.default,
52
+ description: varConfig.description,
53
+ };
54
+ }
55
+ else {
56
+ // Simple type definition
57
+ variables[name] = {
58
+ type: config || 'string',
59
+ required: undefined,
60
+ default: undefined,
61
+ description: undefined,
62
+ };
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ name: frontmatter.name,
68
+ description: frontmatter.description,
69
+ variables,
70
+ content: promptContent,
71
+ rawContent: content,
72
+ filePath: resolvedPath,
73
+ };
74
+ }
75
+ // ============================================================================
76
+ // Template Resolution
77
+ // ============================================================================
78
+ /**
79
+ * Resolve {{ prompt.variable }} templates in a prompt using Nunjucks.
80
+ *
81
+ * Features enabled by using Nunjucks:
82
+ * - Filters: {{ prompt.name | upper }}, {{ value | split('/') | first }}
83
+ * - Conditionals: {% if prompt.enabled %}...{% endif %}
84
+ * - Loops: {% for item in items %}...{% endfor %}
85
+ * - All custom filters from nunjucks-filters.ts
86
+ */
87
+ export function resolvePromptTemplate(prompt, inputs, context) {
88
+ // Build resolved variables with defaults
89
+ const resolvedVars = {};
90
+ // Apply defaults first
91
+ for (const [name, config] of Object.entries(prompt.variables)) {
92
+ if (config.default !== undefined) {
93
+ resolvedVars[name] = config.default;
94
+ }
95
+ }
96
+ // Override with provided inputs
97
+ for (const [name, value] of Object.entries(inputs)) {
98
+ resolvedVars[name] = value;
99
+ }
100
+ // Build the template context
101
+ // 'prompt' namespace contains the resolved prompt variables
102
+ // Also include context variables if available
103
+ const templateContext = {
104
+ prompt: resolvedVars,
105
+ ...resolvedVars, // Also expose at top level for backward compatibility
106
+ };
107
+ // Add context variables if available
108
+ if (context) {
109
+ templateContext.inputs = context.inputs;
110
+ templateContext.variables = context.variables;
111
+ // Merge context variables at top level for convenience
112
+ Object.assign(templateContext, context.variables);
113
+ }
114
+ // Render template using Nunjucks
115
+ const rendered = renderTemplate(prompt.content, templateContext);
116
+ const content = typeof rendered === 'string' ? rendered : String(rendered);
117
+ return {
118
+ content,
119
+ variables: resolvedVars,
120
+ };
121
+ }
122
+ // ============================================================================
123
+ // Validation
124
+ // ============================================================================
125
+ /**
126
+ * Validate that all required prompt inputs are provided.
127
+ */
128
+ export function validatePromptInputs(prompt, inputs) {
129
+ const errors = [];
130
+ const warnings = [];
131
+ for (const [name, config] of Object.entries(prompt.variables)) {
132
+ const value = inputs[name];
133
+ const hasValue = value !== undefined && value !== null;
134
+ // Check required
135
+ if (config.required && !hasValue && config.default === undefined) {
136
+ errors.push(`Missing required prompt variable: ${name}`);
137
+ continue;
138
+ }
139
+ // Type validation (if value is provided)
140
+ if (hasValue) {
141
+ const typeError = validateType(value, config.type, name);
142
+ if (typeError) {
143
+ errors.push(typeError);
144
+ }
145
+ }
146
+ }
147
+ // Warn about unused inputs
148
+ for (const name of Object.keys(inputs)) {
149
+ if (!prompt.variables[name]) {
150
+ warnings.push(`Unused prompt input: ${name}`);
151
+ }
152
+ }
153
+ return {
154
+ valid: errors.length === 0,
155
+ errors,
156
+ warnings,
157
+ };
158
+ }
159
+ /**
160
+ * Validate a value against an expected type.
161
+ */
162
+ function validateType(value, type, name) {
163
+ switch (type) {
164
+ case 'string':
165
+ if (typeof value !== 'string') {
166
+ return `Expected string for ${name}, got ${typeof value}`;
167
+ }
168
+ break;
169
+ case 'number':
170
+ if (typeof value !== 'number') {
171
+ return `Expected number for ${name}, got ${typeof value}`;
172
+ }
173
+ break;
174
+ case 'boolean':
175
+ if (typeof value !== 'boolean') {
176
+ return `Expected boolean for ${name}, got ${typeof value}`;
177
+ }
178
+ break;
179
+ case 'array':
180
+ if (!Array.isArray(value)) {
181
+ return `Expected array for ${name}, got ${typeof value}`;
182
+ }
183
+ break;
184
+ case 'object':
185
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
186
+ return `Expected object for ${name}, got ${Array.isArray(value) ? 'array' : typeof value}`;
187
+ }
188
+ break;
189
+ }
190
+ return null;
191
+ }
192
+ /**
193
+ * Extract all variable references from a prompt template.
194
+ */
195
+ export function extractPromptVariables(content) {
196
+ const variables = new Set();
197
+ // Extract {{ prompt.variable }} patterns
198
+ const promptVarRegex = /\{\{\s*prompt\.([^}]+)\s*\}\}/g;
199
+ let match;
200
+ while ((match = promptVarRegex.exec(content)) !== null) {
201
+ variables.add(match[1].trim());
202
+ }
203
+ return Array.from(variables);
204
+ }
205
+ //# sourceMappingURL=prompt-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-loader.js","sourceRoot":"","sources":["../src/prompt-loader.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,10 @@
2
2
  * Scheduler for marktoflow v2.0
3
3
  *
4
4
  * Handles cron-based scheduling of workflow execution.
5
+ * Uses cron-parser for robust cron expression handling with proper
6
+ * DST handling, leap year support, and timezone awareness.
5
7
  */
8
+ import { type CronExpression } from 'cron-parser';
6
9
  export interface ScheduledJob {
7
10
  id: string;
8
11
  workflowPath: string;
@@ -29,15 +32,31 @@ export declare class CronParser {
29
32
  * Special values: * (any), * /N (every N), N-M (range), N,M (list)
30
33
  */
31
34
  static parse(expression: string): CronFields;
32
- private static parseField;
33
35
  /**
34
36
  * Check if a date matches a cron expression.
35
37
  */
36
38
  static matches(expression: string, date: Date): boolean;
37
39
  /**
38
40
  * Calculate the next run time for a cron expression.
41
+ * Supports timezone-aware scheduling.
39
42
  */
40
- static nextRun(expression: string, after?: Date): Date | null;
43
+ static nextRun(expression: string, after?: Date, timezone?: string): Date | null;
44
+ /**
45
+ * Calculate the previous run time for a cron expression.
46
+ */
47
+ static prevRun(expression: string, before?: Date, timezone?: string): Date | null;
48
+ /**
49
+ * Validate a cron expression without throwing.
50
+ * Only accepts standard 5-field cron expressions.
51
+ */
52
+ static isValid(expression: string): boolean;
53
+ /**
54
+ * Get the underlying cron-parser CronExpression for advanced usage.
55
+ */
56
+ static getInterval(expression: string, options?: {
57
+ currentDate?: Date;
58
+ tz?: string;
59
+ }): CronExpression;
41
60
  }
42
61
  export declare class Scheduler {
43
62
  private checkIntervalMs;
@@ -87,5 +106,5 @@ export declare class Scheduler {
87
106
  */
88
107
  isRunning(): boolean;
89
108
  }
90
- export declare function createJob(id: string, workflowPath: string, schedule: string, inputs?: Record<string, unknown>): ScheduledJob;
109
+ export declare function createJob(id: string, workflowPath: string, schedule: string, inputs?: Record<string, unknown>, timezone?: string): ScheduledJob;
91
110
  //# sourceMappingURL=scheduler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAM/D,qBAAa,UAAU;IACrB;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAiC5C,OAAO,CAAC,MAAM,CAAC,UAAU;IAgCzB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO;IAgBvD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;CA0B9D;AAMD,qBAAa,SAAS;IAMR,OAAO,CAAC,eAAe;IALnC,OAAO,CAAC,IAAI,CAAwC;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAqB;gBAElB,eAAe,GAAE,MAAc;IAEnD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAM/B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI/C;;OAEG;IACH,QAAQ,IAAI,YAAY,EAAE;IAI1B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAgBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;YACW,SAAS;IAuBvB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IA0B3C;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAMD,wBAAgB,SAAS,CACvB,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,YAAY,CAYd"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}