@tagma/sdk 0.4.1 → 0.4.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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/stdin-approval.d.ts +6 -0
  3. package/dist/adapters/stdin-approval.d.ts.map +1 -0
  4. package/dist/adapters/stdin-approval.js +90 -0
  5. package/dist/adapters/stdin-approval.js.map +1 -0
  6. package/dist/adapters/websocket-approval.d.ts +28 -0
  7. package/dist/adapters/websocket-approval.d.ts.map +1 -0
  8. package/dist/adapters/websocket-approval.js +145 -0
  9. package/dist/adapters/websocket-approval.js.map +1 -0
  10. package/dist/approval.d.ts +13 -0
  11. package/dist/approval.d.ts.map +1 -0
  12. package/dist/approval.js +91 -0
  13. package/dist/approval.js.map +1 -0
  14. package/dist/bootstrap.d.ts +2 -0
  15. package/dist/bootstrap.d.ts.map +1 -0
  16. package/dist/bootstrap.js +30 -0
  17. package/dist/bootstrap.js.map +1 -0
  18. package/dist/completions/exit-code.d.ts +3 -0
  19. package/dist/completions/exit-code.d.ts.map +1 -0
  20. package/dist/completions/exit-code.js +25 -0
  21. package/dist/completions/exit-code.js.map +1 -0
  22. package/dist/completions/file-exists.d.ts +3 -0
  23. package/dist/completions/file-exists.d.ts.map +1 -0
  24. package/dist/completions/file-exists.js +58 -0
  25. package/dist/completions/file-exists.js.map +1 -0
  26. package/dist/completions/output-check.d.ts +3 -0
  27. package/dist/completions/output-check.d.ts.map +1 -0
  28. package/dist/completions/output-check.js +81 -0
  29. package/dist/completions/output-check.js.map +1 -0
  30. package/dist/config-ops.d.ts +55 -0
  31. package/dist/config-ops.d.ts.map +1 -0
  32. package/dist/config-ops.js +258 -0
  33. package/dist/config-ops.js.map +1 -0
  34. package/dist/dag.d.ts +46 -0
  35. package/dist/dag.d.ts.map +1 -0
  36. package/dist/dag.js +193 -0
  37. package/dist/dag.js.map +1 -0
  38. package/dist/drivers/claude-code.d.ts +3 -0
  39. package/dist/drivers/claude-code.d.ts.map +1 -0
  40. package/dist/drivers/claude-code.js +210 -0
  41. package/dist/drivers/claude-code.js.map +1 -0
  42. package/dist/engine.d.ts +89 -0
  43. package/dist/engine.d.ts.map +1 -0
  44. package/dist/engine.js +815 -0
  45. package/dist/engine.js.map +1 -0
  46. package/dist/hooks.d.ts +73 -0
  47. package/dist/hooks.d.ts.map +1 -0
  48. package/dist/hooks.js +103 -0
  49. package/dist/hooks.js.map +1 -0
  50. package/dist/logger.d.ts +61 -0
  51. package/dist/logger.d.ts.map +1 -0
  52. package/dist/logger.js +151 -0
  53. package/dist/logger.js.map +1 -0
  54. package/dist/middlewares/static-context.d.ts +3 -0
  55. package/dist/middlewares/static-context.d.ts.map +1 -0
  56. package/dist/middlewares/static-context.js +36 -0
  57. package/dist/middlewares/static-context.js.map +1 -0
  58. package/dist/pipeline-runner.d.ts +50 -0
  59. package/dist/pipeline-runner.d.ts.map +1 -0
  60. package/dist/pipeline-runner.js +139 -0
  61. package/dist/pipeline-runner.js.map +1 -0
  62. package/dist/registry.d.ts +43 -0
  63. package/dist/registry.d.ts.map +1 -0
  64. package/dist/registry.js +182 -0
  65. package/dist/registry.js.map +1 -0
  66. package/dist/runner.d.ts +19 -0
  67. package/dist/runner.d.ts.map +1 -0
  68. package/dist/runner.js +364 -0
  69. package/dist/runner.js.map +1 -0
  70. package/dist/schema.d.ts +27 -0
  71. package/dist/schema.d.ts.map +1 -0
  72. package/dist/schema.js +373 -0
  73. package/dist/schema.js.map +1 -0
  74. package/dist/sdk.d.ts +27 -0
  75. package/dist/sdk.d.ts.map +1 -0
  76. package/dist/sdk.js +33 -0
  77. package/dist/sdk.js.map +1 -0
  78. package/dist/templates.d.ts +20 -0
  79. package/dist/templates.d.ts.map +1 -0
  80. package/dist/templates.js +93 -0
  81. package/dist/templates.js.map +1 -0
  82. package/dist/triggers/file.d.ts +3 -0
  83. package/dist/triggers/file.d.ts.map +1 -0
  84. package/dist/triggers/file.js +123 -0
  85. package/dist/triggers/file.js.map +1 -0
  86. package/dist/triggers/manual.d.ts +3 -0
  87. package/dist/triggers/manual.d.ts.map +1 -0
  88. package/dist/triggers/manual.js +73 -0
  89. package/dist/triggers/manual.js.map +1 -0
  90. package/dist/types.d.ts +4 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +14 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/utils.d.ts +14 -0
  95. package/dist/utils.d.ts.map +1 -0
  96. package/dist/utils.js +138 -0
  97. package/dist/utils.js.map +1 -0
  98. package/dist/validate-raw.d.ts +26 -0
  99. package/dist/validate-raw.d.ts.map +1 -0
  100. package/dist/validate-raw.js +260 -0
  101. package/dist/validate-raw.js.map +1 -0
  102. package/package.json +26 -17
  103. package/src/adapters/websocket-approval.ts +20 -4
  104. package/src/approval.ts +5 -3
  105. package/src/registry.ts +214 -214
  106. package/scripts/preinstall.js +0 -38
package/dist/runner.js ADDED
@@ -0,0 +1,364 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { isAbsolute, join } from 'node:path';
3
+ import { shellArgs } from './utils';
4
+ // Delay before escalating SIGTERM to SIGKILL when killing a timed-out process.
5
+ const SIGKILL_DELAY_MS = 3_000;
6
+ /**
7
+ * On Windows, proc.kill('SIGTERM') / proc.kill('SIGKILL') only terminate the
8
+ * direct child process. When the child is a .cmd/.bat wrapper (e.g. claude.cmd),
9
+ * cmd.exe spawns the real process as a grandchild — proc.kill misses it entirely.
10
+ * `taskkill /F /T /PID` kills the entire process tree rooted at the given PID.
11
+ */
12
+ function killProcessTree(pid) {
13
+ if (process.platform !== 'win32')
14
+ return;
15
+ try {
16
+ const result = Bun.spawnSync(['taskkill', '/F', '/T', '/PID', String(pid)], {
17
+ stdout: 'pipe',
18
+ stderr: 'pipe',
19
+ });
20
+ if (result.exitCode !== 0) {
21
+ const stderr = new TextDecoder().decode(result.stderr);
22
+ // Exit code 128 = process not found (already exited) — not worth warning about
23
+ if (result.exitCode !== 128) {
24
+ console.error(`[killProcessTree] taskkill exited ${result.exitCode} for PID ${pid}: ${stderr.trim()}`);
25
+ }
26
+ }
27
+ }
28
+ catch {
29
+ /* best-effort — process may have already exited */
30
+ }
31
+ }
32
+ /**
33
+ * On Windows, Bun.spawn does NOT auto-append PATHEXT extensions like
34
+ * CreateProcess does. A bare command like `claude` fails with ENOENT if the
35
+ * actual file on disk is `claude.cmd` / `claude.bat` / `claude.ps1`. We
36
+ * manually resolve the command against PATH + PATHEXT here so Drivers can
37
+ * keep using short names (`claude`, `npx`, etc.) cross-platform.
38
+ *
39
+ * Results are cached by (cmd, envPath) key so repeated spawns of the same
40
+ * command don't block the event loop with synchronous PATH scans.
41
+ *
42
+ * Returns the original name if resolution fails; Bun will raise the same
43
+ * ENOENT it would have otherwise.
44
+ */
45
+ const RESOLVED_EXE_CACHE_MAX = 128;
46
+ const resolvedExeCache = new Map();
47
+ /** Evict the oldest entry when the cache is at capacity. */
48
+ function evictIfFull() {
49
+ if (resolvedExeCache.size >= RESOLVED_EXE_CACHE_MAX) {
50
+ // Map iteration order is insertion order — delete the first (oldest) key.
51
+ const oldest = resolvedExeCache.keys().next().value;
52
+ if (oldest !== undefined)
53
+ resolvedExeCache.delete(oldest);
54
+ }
55
+ }
56
+ function resolveWindowsExe(args, envPath) {
57
+ if (process.platform !== 'win32' || args.length === 0)
58
+ return args;
59
+ const cmd = args[0];
60
+ // Already a full path or has an extension → trust caller.
61
+ if (isAbsolute(cmd) || /\.[a-z0-9]+$/i.test(cmd))
62
+ return args;
63
+ const cacheKey = `${cmd}\x00${envPath}`;
64
+ if (resolvedExeCache.has(cacheKey)) {
65
+ // ?? null coerces undefined→null so cached is string|null and the !== null
66
+ // check narrows it to string without a spurious 'undefined' arm.
67
+ const cached = resolvedExeCache.get(cacheKey) ?? null;
68
+ return cached !== null ? [cached, ...args.slice(1)] : args;
69
+ }
70
+ const exts = (process.env.PATHEXT ??
71
+ '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC')
72
+ .split(';')
73
+ .filter(Boolean);
74
+ const dirs = envPath.split(';').filter(Boolean);
75
+ for (const dir of dirs) {
76
+ for (const ext of exts) {
77
+ const candidate = join(dir, cmd + ext);
78
+ if (existsSync(candidate)) {
79
+ evictIfFull();
80
+ resolvedExeCache.set(cacheKey, candidate);
81
+ return [candidate, ...args.slice(1)];
82
+ }
83
+ }
84
+ }
85
+ evictIfFull();
86
+ resolvedExeCache.set(cacheKey, null);
87
+ return args;
88
+ }
89
+ /**
90
+ * H2: Build a "failed before spawn" result. Tagged as 'spawn_error' so the
91
+ * engine can show a useful classification ("driver tried to launch X but
92
+ * the binary wasn't found") rather than the misleading "timeout".
93
+ */
94
+ function failResult(stderr, durationMs) {
95
+ return {
96
+ exitCode: -1,
97
+ stdout: '',
98
+ stderr,
99
+ outputPath: null,
100
+ stderrPath: null,
101
+ durationMs,
102
+ sessionId: null,
103
+ normalizedOutput: null,
104
+ failureKind: 'spawn_error',
105
+ };
106
+ }
107
+ /**
108
+ * R2: Validate a SpawnSpec returned by a third-party driver. Returns null on
109
+ * success or a human-readable error message describing the first violation.
110
+ *
111
+ * Catching this here is critical: an undetected bad spec ends up calling
112
+ * Bun.spawn with garbage and the resulting TypeError leaks into engine
113
+ * processTask's catch block as "Cannot read properties of undefined". By
114
+ * validating here we surface a clear "Driver X returned invalid args" message
115
+ * instead, and short-circuit before holding any process resources.
116
+ */
117
+ export function validateSpawnSpec(spec, driverName) {
118
+ if (!spec || typeof spec !== 'object') {
119
+ return `Driver "${driverName}".buildCommand returned ${spec === null ? 'null' : typeof spec}, expected SpawnSpec object`;
120
+ }
121
+ const s = spec;
122
+ if (!Array.isArray(s.args)) {
123
+ return `Driver "${driverName}".buildCommand returned spec.args of type ${typeof s.args}, expected string[]`;
124
+ }
125
+ if (s.args.length === 0) {
126
+ return `Driver "${driverName}".buildCommand returned an empty spec.args array`;
127
+ }
128
+ for (let i = 0; i < s.args.length; i++) {
129
+ if (typeof s.args[i] !== 'string') {
130
+ return `Driver "${driverName}".buildCommand returned spec.args[${i}] of type ${typeof s.args[i]}, expected string`;
131
+ }
132
+ }
133
+ if (typeof s.args[0] !== 'string' || s.args[0].length === 0) {
134
+ return `Driver "${driverName}".buildCommand returned an empty executable name in spec.args[0]`;
135
+ }
136
+ if (s.cwd !== undefined && typeof s.cwd !== 'string') {
137
+ return `Driver "${driverName}".buildCommand returned spec.cwd of type ${typeof s.cwd}, expected string or undefined`;
138
+ }
139
+ if (s.stdin !== undefined && typeof s.stdin !== 'string') {
140
+ return `Driver "${driverName}".buildCommand returned spec.stdin of type ${typeof s.stdin}, expected string or undefined`;
141
+ }
142
+ if (s.env !== undefined) {
143
+ if (!s.env || typeof s.env !== 'object' || Array.isArray(s.env)) {
144
+ return `Driver "${driverName}".buildCommand returned spec.env that is not a plain object`;
145
+ }
146
+ for (const [k, v] of Object.entries(s.env)) {
147
+ if (typeof v !== 'string') {
148
+ return `Driver "${driverName}".buildCommand returned spec.env.${k} of type ${typeof v}, expected string`;
149
+ }
150
+ }
151
+ }
152
+ return null;
153
+ }
154
+ export async function runSpawn(spec, driver, opts = {}) {
155
+ const { timeoutMs, signal } = opts;
156
+ const start = performance.now();
157
+ const elapsed = () => Math.round(performance.now() - start);
158
+ // R2: validate the spec before touching it. A third-party driver that
159
+ // returns a malformed SpawnSpec used to crash deep inside Bun.spawn with
160
+ // an opaque TypeError; now we report a clear "Driver X returned …" message.
161
+ const validationError = validateSpawnSpec(spec, driver?.name ?? '<unknown>');
162
+ if (validationError !== null) {
163
+ return failResult(validationError, elapsed());
164
+ }
165
+ const mergedEnv = { ...process.env, ...(spec.env ?? {}) };
166
+ const resolvedArgs = resolveWindowsExe(spec.args, mergedEnv.PATH ?? process.env.PATH ?? '');
167
+ // ── 1. Spawn (catch ENOENT / bad-cwd up front) ────────────────────────
168
+ let proc;
169
+ try {
170
+ proc = Bun.spawn(resolvedArgs, {
171
+ cwd: spec.cwd,
172
+ env: mergedEnv,
173
+ stdout: 'pipe',
174
+ stderr: 'pipe',
175
+ stdin: spec.stdin ? 'pipe' : undefined,
176
+ });
177
+ }
178
+ catch (err) {
179
+ return failResult(String(err), elapsed());
180
+ }
181
+ // ── 2. Write stdin ─────────────────────────────────────────────────────
182
+ // Child may exit before reading (e.g. quick-fail commands that don't
183
+ // touch stdin) → swallow EPIPE rather than surfacing it as an
184
+ // engine-level error.
185
+ if (spec.stdin && proc.stdin && typeof proc.stdin !== 'number') {
186
+ try {
187
+ proc.stdin.write(spec.stdin);
188
+ proc.stdin.end();
189
+ }
190
+ catch {
191
+ /* ignore EPIPE / closed-pipe errors */
192
+ }
193
+ }
194
+ // ── 3. Timeout & abort handling ────────────────────────────────────────
195
+ let killedByUs = false;
196
+ let timedOut = false;
197
+ let timer = null;
198
+ let forceTimer = null;
199
+ const killGracefully = () => {
200
+ if (killedByUs)
201
+ return;
202
+ killedByUs = true;
203
+ if (process.platform === 'win32') {
204
+ // On Windows, kill the entire process tree via taskkill. This handles
205
+ // .cmd wrappers and nested child processes that proc.kill() misses.
206
+ killProcessTree(proc.pid);
207
+ }
208
+ else {
209
+ proc.kill('SIGTERM');
210
+ // If the child ignores SIGTERM, escalate to SIGKILL after 3 s.
211
+ forceTimer = setTimeout(() => {
212
+ try {
213
+ proc.kill('SIGKILL');
214
+ }
215
+ catch {
216
+ /* already exited */
217
+ }
218
+ }, SIGKILL_DELAY_MS);
219
+ }
220
+ };
221
+ if (timeoutMs && timeoutMs > 0) {
222
+ timer = setTimeout(() => {
223
+ timedOut = true;
224
+ killGracefully();
225
+ }, timeoutMs);
226
+ }
227
+ const onAbort = () => killGracefully();
228
+ if (signal) {
229
+ if (signal.aborted) {
230
+ killGracefully();
231
+ }
232
+ else {
233
+ signal.addEventListener('abort', onAbort, { once: true });
234
+ }
235
+ }
236
+ // ── 4. Collect output & wait (parallel to avoid pipe-buffer deadlock) ─
237
+ const stdoutStream = typeof proc.stdout === 'object' ? proc.stdout : undefined;
238
+ const stderrStream = typeof proc.stderr === 'object' ? proc.stderr : undefined;
239
+ const [exitCode, stdout, stderr] = await Promise.all([
240
+ proc.exited,
241
+ stdoutStream ? new Response(stdoutStream).text() : Promise.resolve(''),
242
+ stderrStream ? new Response(stderrStream).text() : Promise.resolve(''),
243
+ ]);
244
+ // ── 5. Cleanup timers & listeners ──────────────────────────────────────
245
+ if (timer)
246
+ clearTimeout(timer);
247
+ if (forceTimer)
248
+ clearTimeout(forceTimer);
249
+ if (signal)
250
+ signal.removeEventListener('abort', onAbort);
251
+ const durationMs = elapsed();
252
+ // We initiated the kill (timeout or abort) — always treat as non-success
253
+ // regardless of exit code. A process that catches SIGTERM and exits 0 still
254
+ // hit the timeout; letting it pass as success would unblock downstream tasks
255
+ // incorrectly. The `timedOut` flag guards against the narrow race where the
256
+ // process exits naturally at the exact moment the timeout fires — even if
257
+ // killedByUs wasn't set in time, the timeout intention still applies.
258
+ if (killedByUs || timedOut) {
259
+ return {
260
+ exitCode: -1,
261
+ stdout,
262
+ stderr,
263
+ outputPath: null,
264
+ stderrPath: null,
265
+ durationMs,
266
+ sessionId: null,
267
+ normalizedOutput: null,
268
+ // H2: explicit kind so engine.ts no longer has to guess "is exitCode -1
269
+ // a timeout or a spawn-failure?" Both used to share the same code.
270
+ failureKind: 'timeout',
271
+ };
272
+ }
273
+ // ── 6. Let driver extract metadata ─────────────────────────────────────
274
+ // R1: parseResult is third-party code — wrap it in try/catch so a buggy
275
+ // extractor doesn't discard a perfectly good spawn result. R5: even on
276
+ // success, type-guard sessionId/normalizedOutput so a mistyped return
277
+ // value doesn't poison sessionMap/normalizedMap downstream.
278
+ let sessionId = null;
279
+ let normalizedOutput = null;
280
+ // M12: drivers can flip a task's terminal status to failed even when the
281
+ // process exited 0 (e.g. opencode returning `{type:"error"}` JSON). When
282
+ // the flag is set, we synthesize a non-zero exit code and append a reason
283
+ // line to stderr so engine.ts marks the task as failed with a useful
284
+ // explanation instead of letting the error JSON pass through as success.
285
+ let forcedFailureMessage = null;
286
+ if (driver?.parseResult) {
287
+ try {
288
+ const meta = driver.parseResult(stdout, stderr);
289
+ if (meta && typeof meta === 'object') {
290
+ if (typeof meta.sessionId === 'string' && meta.sessionId.length > 0) {
291
+ sessionId = meta.sessionId;
292
+ }
293
+ if (typeof meta.normalizedOutput === 'string') {
294
+ normalizedOutput = meta.normalizedOutput;
295
+ }
296
+ if (meta.forceFailure === true) {
297
+ forcedFailureMessage = typeof meta.forceFailureReason === 'string'
298
+ ? meta.forceFailureReason
299
+ : 'Driver flagged task as failed (forceFailure)';
300
+ }
301
+ }
302
+ }
303
+ catch (err) {
304
+ // The spawn itself succeeded; only metadata extraction failed.
305
+ // Fall through with sessionId/normalizedOutput = null and append a
306
+ // breadcrumb to stderr so the user can see WHY continue_from broke.
307
+ const msg = err instanceof Error ? err.message : String(err);
308
+ const note = `\n[runner] driver "${driver.name}".parseResult threw: ${msg}`;
309
+ return {
310
+ exitCode,
311
+ stdout,
312
+ stderr: stderr + note,
313
+ outputPath: null,
314
+ stderrPath: null,
315
+ durationMs,
316
+ sessionId: null,
317
+ normalizedOutput: null,
318
+ // H2: parseResult threw — the spawn itself succeeded, so the failure
319
+ // is "the process exited but the driver couldn't parse it". Surface
320
+ // that as exit_nonzero (when the actual exit was non-zero) or null
321
+ // (when the underlying exit was 0 — UI will still mark it failed via
322
+ // engine.ts because the result is incomplete).
323
+ failureKind: exitCode === 0 ? null : 'exit_nonzero',
324
+ };
325
+ }
326
+ }
327
+ // M12: when the driver forced a failure, treat as exit_nonzero with the
328
+ // reason appended to stderr so users see WHY the task failed without
329
+ // having to dig through driver-specific JSON.
330
+ if (forcedFailureMessage !== null) {
331
+ return {
332
+ exitCode: exitCode === 0 ? 1 : exitCode,
333
+ stdout,
334
+ stderr: stderr + (stderr.endsWith('\n') ? '' : '\n') + `[driver] ${forcedFailureMessage}`,
335
+ outputPath: null,
336
+ stderrPath: null,
337
+ durationMs,
338
+ sessionId,
339
+ normalizedOutput,
340
+ failureKind: 'exit_nonzero',
341
+ };
342
+ }
343
+ return {
344
+ exitCode,
345
+ stdout,
346
+ stderr,
347
+ outputPath: null,
348
+ stderrPath: null,
349
+ durationMs,
350
+ sessionId,
351
+ normalizedOutput,
352
+ // H2: success vs nonzero exit. Engine uses this to short-circuit the
353
+ // timeout branch even if a third-party driver returns -1 by mistake.
354
+ failureKind: exitCode === 0 ? null : 'exit_nonzero',
355
+ };
356
+ }
357
+ export async function runCommand(command, cwd, opts = {}) {
358
+ const spec = {
359
+ args: shellArgs(command),
360
+ cwd,
361
+ };
362
+ return runSpawn(spec, null, opts);
363
+ }
364
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { PipelineConfig, RawPipelineConfig, RawTaskConfig } from './types';
2
+ export declare function parseYaml(content: string): RawPipelineConfig;
3
+ export declare function expandTemplates(tasks: readonly RawTaskConfig[], instancePrefix: string): Promise<RawTaskConfig[]>;
4
+ export declare function resolveConfig(raw: RawPipelineConfig, workDir: string): PipelineConfig;
5
+ /**
6
+ * Serialize a pipeline config back to YAML string.
7
+ * Wraps the config under the top-level `pipeline` key as expected by parseYaml.
8
+ */
9
+ export declare function serializePipeline(config: PipelineConfig | RawPipelineConfig): string;
10
+ /**
11
+ * Convert a resolved PipelineConfig back to a RawPipelineConfig for serialization.
12
+ * Strips injected defaults and converts absolute cwd paths back to relative so the
13
+ * resulting YAML is portable across machines.
14
+ *
15
+ * Use this when you need to save a config that was previously loaded via
16
+ * loadPipeline(). For a pure load→edit→save cycle on raw YAML, prefer
17
+ * parseYaml() → edit RawPipelineConfig → serializePipeline().
18
+ */
19
+ export declare function deresolvePipeline(config: PipelineConfig, workDir: string): RawPipelineConfig;
20
+ /**
21
+ * Validate a pipeline config without executing it.
22
+ * Only checks structural/DAG correctness — does not check plugin registration.
23
+ * Returns an array of error messages (empty = valid).
24
+ */
25
+ export declare function validateConfig(config: PipelineConfig): string[];
26
+ export declare function loadPipeline(yamlContent: string, workDir: string): Promise<PipelineConfig>;
27
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EAAE,iBAAiB,EAAkB,aAAa,EAGjE,MAAM,SAAS,CAAC;AAOjB,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAa5D;AA+BD,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAgB1B;AA+ID,wBAAgB,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAmFrF;AAWD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,GAAG,MAAM,CAEpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA2D5F;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAQ/D;AAID,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAYhG"}