@tagma/sdk 0.7.1 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -48
- package/dist/adapters/stdin-approval.d.ts +1 -5
- package/dist/adapters/stdin-approval.d.ts.map +1 -1
- package/dist/adapters/stdin-approval.js +1 -89
- package/dist/adapters/stdin-approval.js.map +1 -1
- package/dist/adapters/websocket-approval.d.ts +1 -27
- package/dist/adapters/websocket-approval.d.ts.map +1 -1
- package/dist/adapters/websocket-approval.js +1 -146
- package/dist/adapters/websocket-approval.js.map +1 -1
- package/dist/approval.d.ts +2 -12
- package/dist/approval.d.ts.map +1 -1
- package/dist/approval.js +1 -90
- package/dist/approval.js.map +1 -1
- package/dist/bootstrap.d.ts +21 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +21 -11
- package/dist/bootstrap.js.map +1 -1
- package/dist/core/run-context.d.ts +3 -0
- package/dist/core/run-context.d.ts.map +1 -1
- package/dist/core/run-context.js +2 -0
- package/dist/core/run-context.js.map +1 -1
- package/dist/core/task-executor.d.ts.map +1 -1
- package/dist/core/task-executor.js +24 -37
- package/dist/core/task-executor.js.map +1 -1
- package/dist/engine.d.ts +8 -53
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +7 -294
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +2 -60
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -153
- package/dist/logger.js.map +1 -1
- package/dist/plugins.d.ts +3 -3
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/registry.d.ts +2 -60
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +1 -253
- package/dist/registry.js.map +1 -1
- package/dist/runner.d.ts +1 -35
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +1 -610
- package/dist/runner.js.map +1 -1
- package/dist/runtime/adapters/stdin-approval.d.ts +2 -0
- package/dist/runtime/adapters/stdin-approval.d.ts.map +1 -0
- package/dist/runtime/adapters/stdin-approval.js +2 -0
- package/dist/runtime/adapters/stdin-approval.js.map +1 -0
- package/dist/runtime/adapters/websocket-approval.d.ts +2 -0
- package/dist/runtime/adapters/websocket-approval.d.ts.map +1 -0
- package/dist/runtime/adapters/websocket-approval.js +2 -0
- package/dist/runtime/adapters/websocket-approval.js.map +1 -0
- package/dist/runtime/bun-process-runner.d.ts +2 -0
- package/dist/runtime/bun-process-runner.d.ts.map +1 -0
- package/dist/runtime/bun-process-runner.js +2 -0
- package/dist/runtime/bun-process-runner.js.map +1 -0
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1 -7
- package/dist/schema.js.map +1 -1
- package/dist/tagma.d.ts +13 -4
- package/dist/tagma.d.ts.map +1 -1
- package/dist/tagma.js +7 -2
- package/dist/tagma.js.map +1 -1
- package/dist/triggers/file.d.ts.map +1 -1
- package/dist/triggers/file.js +74 -107
- package/dist/triggers/file.js.map +1 -1
- package/dist/validate-raw.d.ts.map +1 -1
- package/dist/validate-raw.js +1 -101
- package/dist/validate-raw.js.map +1 -1
- package/package.json +15 -4
- package/src/adapters/stdin-approval.ts +1 -106
- package/src/adapters/websocket-approval.ts +1 -224
- package/src/approval.ts +5 -127
- package/src/bootstrap.ts +24 -15
- package/src/core/run-context.test.ts +47 -0
- package/src/core/run-context.ts +4 -0
- package/src/core/task-executor.ts +28 -45
- package/src/engine-ports-mixed.test.ts +70 -44
- package/src/engine-ports.test.ts +77 -33
- package/src/engine.ts +21 -439
- package/src/index.ts +7 -4
- package/src/logger.ts +2 -182
- package/src/package-split.test.ts +15 -0
- package/src/pipeline-runner.test.ts +65 -12
- package/src/plugin-registry.test.ts +207 -4
- package/src/plugins.ts +6 -3
- package/src/registry.ts +7 -298
- package/src/runner.ts +1 -666
- package/src/runtime/adapters/stdin-approval.ts +1 -0
- package/src/runtime/adapters/websocket-approval.ts +1 -0
- package/src/runtime/bun-process-runner.ts +1 -0
- package/src/runtime-adapters.test.ts +10 -0
- package/src/runtime.ts +12 -0
- package/src/schema-ports.test.ts +23 -0
- package/src/schema.ts +1 -7
- package/src/tagma.test.ts +234 -1
- package/src/tagma.ts +24 -4
- package/src/triggers/file.test.ts +79 -0
- package/src/triggers/file.ts +85 -118
- package/src/validate-raw.ts +1 -117
package/dist/runner.js
CHANGED
|
@@ -1,611 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { mkdir, open } from 'node:fs/promises';
|
|
3
|
-
import { dirname, isAbsolute, join, resolve as pathResolve } from 'node:path';
|
|
4
|
-
import { shellArgs } from './utils';
|
|
5
|
-
// Delay before escalating SIGTERM to SIGKILL when killing a timed-out process.
|
|
6
|
-
const SIGKILL_DELAY_MS = 3_000;
|
|
7
|
-
/**
|
|
8
|
-
* Default cap for the in-memory tail retained for each stream. Picked so that
|
|
9
|
-
* a task producing runaway output (AI agent bug, adversarial input) cannot
|
|
10
|
-
* balloon the sidecar's RSS, while still being large enough that typical AI
|
|
11
|
-
* responses (which top out around low-MB of text) are returned whole. Callers
|
|
12
|
-
* that need different limits supply `RunOptions.maxStdoutTailBytes` /
|
|
13
|
-
* `.maxStderrTailBytes`.
|
|
14
|
-
*/
|
|
15
|
-
const DEFAULT_STDOUT_TAIL_BYTES = 8 * 1024 * 1024; // 8 MB
|
|
16
|
-
const DEFAULT_STDERR_TAIL_BYTES = 4 * 1024 * 1024; // 4 MB
|
|
17
|
-
/**
|
|
18
|
-
* On Windows, proc.kill('SIGTERM') / proc.kill('SIGKILL') only terminate the
|
|
19
|
-
* direct child process. When the child is a .cmd/.bat wrapper (e.g. claude.cmd),
|
|
20
|
-
* cmd.exe spawns the real process as a grandchild — proc.kill misses it entirely.
|
|
21
|
-
* `taskkill /F /T /PID` kills the entire process tree rooted at the given PID.
|
|
22
|
-
*/
|
|
23
|
-
function killProcessTree(pid) {
|
|
24
|
-
if (process.platform !== 'win32')
|
|
25
|
-
return;
|
|
26
|
-
try {
|
|
27
|
-
const result = Bun.spawnSync(['taskkill', '/F', '/T', '/PID', String(pid)], {
|
|
28
|
-
stdout: 'pipe',
|
|
29
|
-
stderr: 'pipe',
|
|
30
|
-
});
|
|
31
|
-
if (result.exitCode !== 0) {
|
|
32
|
-
const stderr = new TextDecoder().decode(result.stderr);
|
|
33
|
-
// Exit code 128 = process not found (already exited) — not worth warning about
|
|
34
|
-
if (result.exitCode !== 128) {
|
|
35
|
-
console.error(`[killProcessTree] taskkill exited ${result.exitCode} for PID ${pid}: ${stderr.trim()}`);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
/* best-effort — process may have already exited */
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Read a stream to completion, persisting every chunk to `filePath` (when
|
|
45
|
-
* provided) while keeping only the last `maxTailBytes` bytes in memory.
|
|
46
|
-
*
|
|
47
|
-
* Why the split: large child outputs (multi-MB AI responses, verbose debug
|
|
48
|
-
* dumps) used to accumulate entirely in memory via `new Response(s).text()`,
|
|
49
|
-
* which let a runaway task balloon the sidecar's RSS. Streaming to disk +
|
|
50
|
-
* bounded tail gives callers: (a) unbounded data fidelity on disk, (b) fixed
|
|
51
|
-
* memory footprint, (c) the tail — which is almost always what callers
|
|
52
|
-
* actually consume (final AI answer, error summary, last N lines).
|
|
53
|
-
*
|
|
54
|
-
* Backpressure: we `await fh.write(chunk)` per chunk, so if disk is slow we
|
|
55
|
-
* naturally slow the reader — but we do NOT stop reading the pipe, so the
|
|
56
|
-
* child never blocks on a full stdout pipe. Disk errors don't abort the
|
|
57
|
-
* stream; we close the handle, null it, and keep consuming into the tail
|
|
58
|
-
* buffer only (with a breadcrumb in the returned text).
|
|
59
|
-
*
|
|
60
|
-
* Tail eviction: drops whole chunks from the front until total retained is
|
|
61
|
-
* at or below the cap. If a single chunk alone exceeds the cap (rare — would
|
|
62
|
-
* require a >cap-bytes chunkless burst from the child), we slice its tail.
|
|
63
|
-
* UTF-8 boundaries at the slice point may emit replacement characters when
|
|
64
|
-
* decoded — acceptable (the trailing/leading codepoint is a cosmetic loss).
|
|
65
|
-
*/
|
|
66
|
-
async function collectStream(stream, filePath, maxTailBytes) {
|
|
67
|
-
if (!stream)
|
|
68
|
-
return { text: '', totalBytes: 0, path: null };
|
|
69
|
-
let fh = null;
|
|
70
|
-
let diskWriteFailed = false;
|
|
71
|
-
if (filePath) {
|
|
72
|
-
try {
|
|
73
|
-
await mkdir(dirname(filePath), { recursive: true });
|
|
74
|
-
fh = await open(filePath, 'w');
|
|
75
|
-
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
console.error(`[runner] failed to open ${filePath} for output streaming: ${err instanceof Error ? err.message : String(err)}`);
|
|
78
|
-
diskWriteFailed = true;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const chunks = [];
|
|
82
|
-
let tailBytes = 0;
|
|
83
|
-
let totalBytes = 0;
|
|
84
|
-
let streamError = null;
|
|
85
|
-
try {
|
|
86
|
-
// Use for await...of to avoid Bun bug where getReader() returns an
|
|
87
|
-
// incomplete reader missing releaseLock() under concurrent spawn.
|
|
88
|
-
// https://github.com/oven-sh/bun/issues/28952
|
|
89
|
-
//
|
|
90
|
-
// Bun 1.3.x also has sporadic failures iterating a spawned process's
|
|
91
|
-
// stream under concurrent Bun.spawn — the iterator throws mid-drain even
|
|
92
|
-
// when the child exited 0. We record the error as a breadcrumb instead
|
|
93
|
-
// of propagating, so the caller still sees the real exitCode from
|
|
94
|
-
// proc.exited and a task that the OS considered successful doesn't get
|
|
95
|
-
// marked failed over a runtime stream glitch.
|
|
96
|
-
for await (const value of stream) {
|
|
97
|
-
totalBytes += value.length;
|
|
98
|
-
// Disk: persist every byte. Failure here degrades to tail-only mode
|
|
99
|
-
// without interrupting the stream (child must not block on pipe fill).
|
|
100
|
-
if (fh) {
|
|
101
|
-
try {
|
|
102
|
-
await fh.write(value);
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
console.error(`[runner] disk write failed for ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
106
|
-
try {
|
|
107
|
-
await fh.close();
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
/* ignore */
|
|
111
|
-
}
|
|
112
|
-
fh = null;
|
|
113
|
-
diskWriteFailed = true;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Tail: append then evict whole chunks from the head while the total
|
|
117
|
-
// retained exceeds the cap. Keep at least one chunk so short outputs
|
|
118
|
-
// aren't lost entirely. Post-condition: tailBytes <= maxTailBytes OR
|
|
119
|
-
// only one chunk remains (handled by the next block).
|
|
120
|
-
chunks.push(value);
|
|
121
|
-
tailBytes += value.length;
|
|
122
|
-
while (chunks.length > 1 && tailBytes > maxTailBytes) {
|
|
123
|
-
tailBytes -= chunks.shift().length;
|
|
124
|
-
}
|
|
125
|
-
// Pathological: a single chunk larger than the cap. Slice its tail.
|
|
126
|
-
if (chunks.length === 1 && chunks[0].length > maxTailBytes) {
|
|
127
|
-
const only = chunks[0];
|
|
128
|
-
chunks[0] = only.slice(only.length - maxTailBytes);
|
|
129
|
-
tailBytes = chunks[0].length;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
catch (err) {
|
|
134
|
-
streamError = err instanceof Error ? err : new Error(String(err));
|
|
135
|
-
console.error(`[runner] stream read failed: ${streamError.message} — returning partial output`);
|
|
136
|
-
}
|
|
137
|
-
finally {
|
|
138
|
-
if (fh) {
|
|
139
|
-
try {
|
|
140
|
-
await fh.close();
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
/* ignore */
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Decode retained chunks. `stream: true` lets the decoder buffer partial
|
|
148
|
-
// code points across chunks, handling all boundaries except the very first
|
|
149
|
-
// chunk (which may itself start mid-codepoint after eviction) — that
|
|
150
|
-
// boundary gets a U+FFFD replacement, which is preferable to throwing.
|
|
151
|
-
const decoder = new TextDecoder();
|
|
152
|
-
let text = '';
|
|
153
|
-
for (const c of chunks)
|
|
154
|
-
text += decoder.decode(c, { stream: true });
|
|
155
|
-
text += decoder.decode();
|
|
156
|
-
if (totalBytes > tailBytes) {
|
|
157
|
-
const dropped = totalBytes - tailBytes;
|
|
158
|
-
const pathHint = filePath
|
|
159
|
-
? diskWriteFailed
|
|
160
|
-
? `${filePath} (partial — disk write failed mid-stream)`
|
|
161
|
-
: filePath
|
|
162
|
-
: 'not persisted (no path configured)';
|
|
163
|
-
text = `[…${dropped} bytes truncated from head — full output at: ${pathHint}]\n${text}`;
|
|
164
|
-
}
|
|
165
|
-
if (streamError) {
|
|
166
|
-
text = text + `\n[runner] stream read aborted: ${streamError.message}`;
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
text,
|
|
170
|
-
totalBytes,
|
|
171
|
-
// Return the path even on partial-write failure so operators can still
|
|
172
|
-
// inspect the head bytes we managed to persist.
|
|
173
|
-
path: filePath ?? null,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* On Windows, Bun.spawn does NOT auto-append PATHEXT extensions like
|
|
178
|
-
* CreateProcess does. A bare command like `claude` fails with ENOENT if the
|
|
179
|
-
* actual file on disk is `claude.cmd` / `claude.bat` / `claude.ps1`. We
|
|
180
|
-
* manually resolve the command against PATH + PATHEXT here so Drivers can
|
|
181
|
-
* keep using short names (`claude`, `npx`, etc.) cross-platform.
|
|
182
|
-
*
|
|
183
|
-
* We also auto-unwrap npm-generated .cmd shims into direct `node <js>`
|
|
184
|
-
* invocations. Spawning the .cmd routes argv through cmd.exe, which silently
|
|
185
|
-
* truncates any argv element at the first newline — a multi-line prompt
|
|
186
|
-
* reaches the child as just its first line. By targeting the underlying JS
|
|
187
|
-
* entry point directly we bypass cmd.exe entirely and newlines survive.
|
|
188
|
-
*
|
|
189
|
-
* Results are cached by (cmd, envPath) key so repeated spawns of the same
|
|
190
|
-
* command don't block the event loop with synchronous PATH/shim scans.
|
|
191
|
-
*
|
|
192
|
-
* Returns the original name if resolution fails; Bun will raise the same
|
|
193
|
-
* ENOENT it would have otherwise.
|
|
194
|
-
*/
|
|
195
|
-
const RESOLVED_EXE_CACHE_MAX = 128;
|
|
196
|
-
// A cache entry is the replacement argv head for the command:
|
|
197
|
-
// - [path] — a single resolved executable (e.g. `foo.exe`)
|
|
198
|
-
// - [node, jsEntry] — an npm-shim unwrapped into `node <js>`
|
|
199
|
-
// - null — resolution failed, leave the original name
|
|
200
|
-
const resolvedExeCache = new Map();
|
|
201
|
-
/** Evict the oldest entry when the cache is at capacity. */
|
|
202
|
-
function evictIfFull() {
|
|
203
|
-
if (resolvedExeCache.size >= RESOLVED_EXE_CACHE_MAX) {
|
|
204
|
-
// Map iteration order is insertion order — delete the first (oldest) key.
|
|
205
|
-
const oldest = resolvedExeCache.keys().next().value;
|
|
206
|
-
if (oldest !== undefined)
|
|
207
|
-
resolvedExeCache.delete(oldest);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Parse an npm-generated .cmd shim and return the underlying JS entry path.
|
|
212
|
-
*
|
|
213
|
-
* npm's shim has the shape:
|
|
214
|
-
* "%_prog%" "%dp0%\node_modules\<pkg>\bin\<script>" %*
|
|
215
|
-
*
|
|
216
|
-
* We extract the second double-quoted path, substitute `%dp0%` with the
|
|
217
|
-
* wrapper's own directory, and return the absolute JS path. Returns null for
|
|
218
|
-
* anything that doesn't match the npm-shim pattern (user-written .cmd
|
|
219
|
-
* scripts, non-node tools, etc.), which keeps the caller on the .cmd path.
|
|
220
|
-
*/
|
|
221
|
-
function parseNpmCmdShim(wrapperPath) {
|
|
222
|
-
let contents;
|
|
223
|
-
try {
|
|
224
|
-
contents = readFileSync(wrapperPath, 'utf8');
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
const execLine = contents
|
|
230
|
-
.split(/\r?\n/)
|
|
231
|
-
.find((l) => l.includes('%*') && l.includes('%dp0%'));
|
|
232
|
-
if (!execLine)
|
|
233
|
-
return null;
|
|
234
|
-
const quoted = execLine.match(/"([^"]+)"/g);
|
|
235
|
-
if (!quoted || quoted.length < 2)
|
|
236
|
-
return null;
|
|
237
|
-
const rawTarget = quoted[1].slice(1, -1); // strip surrounding quotes
|
|
238
|
-
const wrapperDir = dirname(wrapperPath);
|
|
239
|
-
// %dp0% expands to wrapper dir with a trailing backslash; strip either form.
|
|
240
|
-
const expanded = rawTarget.replace(/%dp0%\\?/i, '').replace(/\//g, '\\');
|
|
241
|
-
const abs = isAbsolute(expanded) ? expanded : pathResolve(wrapperDir, expanded);
|
|
242
|
-
return existsSync(abs) ? abs : null;
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Given a resolved .cmd/.bat path, return the argv prefix that should be
|
|
246
|
-
* spawned instead. For npm shims this is `[node, js-entry]`; for everything
|
|
247
|
-
* else it's `[wrapperPath]` (unchanged, caller keeps using the wrapper).
|
|
248
|
-
*/
|
|
249
|
-
function unwrapCmdShim(wrapperPath) {
|
|
250
|
-
if (!/\.(cmd|bat)$/i.test(wrapperPath))
|
|
251
|
-
return [wrapperPath];
|
|
252
|
-
const jsEntry = parseNpmCmdShim(wrapperPath);
|
|
253
|
-
if (!jsEntry)
|
|
254
|
-
return [wrapperPath];
|
|
255
|
-
// Prefer node colocated with the wrapper (npm global bin often ships one).
|
|
256
|
-
const colocated = join(dirname(wrapperPath), 'node.exe');
|
|
257
|
-
const nodeExe = existsSync(colocated) ? colocated : 'node';
|
|
258
|
-
return [nodeExe, jsEntry];
|
|
259
|
-
}
|
|
260
|
-
function resolveWindowsExe(args, envPath) {
|
|
261
|
-
if (process.platform !== 'win32' || args.length === 0)
|
|
262
|
-
return args;
|
|
263
|
-
const cmd = args[0];
|
|
264
|
-
// Already a full path or has an extension → trust caller. We still attempt
|
|
265
|
-
// shim unwrapping when the caller handed us a bare .cmd/.bat so drivers
|
|
266
|
-
// that resolve the shim themselves still benefit from the cmd.exe bypass.
|
|
267
|
-
if (isAbsolute(cmd) || /\.[a-z0-9]+$/i.test(cmd)) {
|
|
268
|
-
if (/\.(cmd|bat)$/i.test(cmd) && existsSync(cmd)) {
|
|
269
|
-
const unwrapped = unwrapCmdShim(cmd);
|
|
270
|
-
if (unwrapped.length === 2)
|
|
271
|
-
return [...unwrapped, ...args.slice(1)];
|
|
272
|
-
}
|
|
273
|
-
return args;
|
|
274
|
-
}
|
|
275
|
-
const cacheKey = `${cmd}\x00${envPath}`;
|
|
276
|
-
if (resolvedExeCache.has(cacheKey)) {
|
|
277
|
-
// ?? null coerces undefined→null so the subsequent guard narrows cleanly.
|
|
278
|
-
const cached = resolvedExeCache.get(cacheKey) ?? null;
|
|
279
|
-
return cached !== null ? [...cached, ...args.slice(1)] : args;
|
|
280
|
-
}
|
|
281
|
-
const exts = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC')
|
|
282
|
-
.split(';')
|
|
283
|
-
.filter(Boolean);
|
|
284
|
-
const dirs = envPath.split(';').filter(Boolean);
|
|
285
|
-
for (const dir of dirs) {
|
|
286
|
-
for (const ext of exts) {
|
|
287
|
-
const candidate = join(dir, cmd + ext);
|
|
288
|
-
try {
|
|
289
|
-
if (existsSync(candidate) && statSync(candidate).isFile()) {
|
|
290
|
-
const head = unwrapCmdShim(candidate);
|
|
291
|
-
evictIfFull();
|
|
292
|
-
resolvedExeCache.set(cacheKey, head);
|
|
293
|
-
return [...head, ...args.slice(1)];
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
catch {
|
|
297
|
-
/* stat race — skip */
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
evictIfFull();
|
|
302
|
-
resolvedExeCache.set(cacheKey, null);
|
|
303
|
-
return args;
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* H2: Build a "failed before spawn" result. Tagged as 'spawn_error' so the
|
|
307
|
-
* engine can show a useful classification ("driver tried to launch X but
|
|
308
|
-
* the binary wasn't found") rather than the misleading "timeout".
|
|
309
|
-
*
|
|
310
|
-
* Pre-spawn failures never opened the output files, so stdoutPath /
|
|
311
|
-
* stderrPath are null regardless of what the caller passed in opts — there
|
|
312
|
-
* is nothing on disk to point at.
|
|
313
|
-
*/
|
|
314
|
-
function failResult(stderr, durationMs) {
|
|
315
|
-
return {
|
|
316
|
-
exitCode: -1,
|
|
317
|
-
stdout: '',
|
|
318
|
-
stderr,
|
|
319
|
-
stdoutPath: null,
|
|
320
|
-
stderrPath: null,
|
|
321
|
-
stdoutBytes: 0,
|
|
322
|
-
stderrBytes: stderr.length,
|
|
323
|
-
durationMs,
|
|
324
|
-
sessionId: null,
|
|
325
|
-
normalizedOutput: null,
|
|
326
|
-
failureKind: 'spawn_error',
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* R2: Validate a SpawnSpec returned by a third-party driver. Returns null on
|
|
331
|
-
* success or a human-readable error message describing the first violation.
|
|
332
|
-
*
|
|
333
|
-
* Catching this here is critical: an undetected bad spec ends up calling
|
|
334
|
-
* Bun.spawn with garbage and the resulting TypeError leaks into engine
|
|
335
|
-
* processTask's catch block as "Cannot read properties of undefined". By
|
|
336
|
-
* validating here we surface a clear "Driver X returned invalid args" message
|
|
337
|
-
* instead, and short-circuit before holding any process resources.
|
|
338
|
-
*/
|
|
339
|
-
export function validateSpawnSpec(spec, driverName) {
|
|
340
|
-
if (!spec || typeof spec !== 'object') {
|
|
341
|
-
return `Driver "${driverName}".buildCommand returned ${spec === null ? 'null' : typeof spec}, expected SpawnSpec object`;
|
|
342
|
-
}
|
|
343
|
-
const s = spec;
|
|
344
|
-
if (!Array.isArray(s.args)) {
|
|
345
|
-
return `Driver "${driverName}".buildCommand returned spec.args of type ${typeof s.args}, expected string[]`;
|
|
346
|
-
}
|
|
347
|
-
if (s.args.length === 0) {
|
|
348
|
-
return `Driver "${driverName}".buildCommand returned an empty spec.args array`;
|
|
349
|
-
}
|
|
350
|
-
for (let i = 0; i < s.args.length; i++) {
|
|
351
|
-
if (typeof s.args[i] !== 'string') {
|
|
352
|
-
return `Driver "${driverName}".buildCommand returned spec.args[${i}] of type ${typeof s.args[i]}, expected string`;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
if (typeof s.args[0] !== 'string' || s.args[0].length === 0) {
|
|
356
|
-
return `Driver "${driverName}".buildCommand returned an empty executable name in spec.args[0]`;
|
|
357
|
-
}
|
|
358
|
-
if (s.cwd !== undefined && typeof s.cwd !== 'string') {
|
|
359
|
-
return `Driver "${driverName}".buildCommand returned spec.cwd of type ${typeof s.cwd}, expected string or undefined`;
|
|
360
|
-
}
|
|
361
|
-
if (s.stdin !== undefined && typeof s.stdin !== 'string') {
|
|
362
|
-
return `Driver "${driverName}".buildCommand returned spec.stdin of type ${typeof s.stdin}, expected string or undefined`;
|
|
363
|
-
}
|
|
364
|
-
if (s.env !== undefined) {
|
|
365
|
-
if (!s.env || typeof s.env !== 'object' || Array.isArray(s.env)) {
|
|
366
|
-
return `Driver "${driverName}".buildCommand returned spec.env that is not a plain object`;
|
|
367
|
-
}
|
|
368
|
-
for (const [k, v] of Object.entries(s.env)) {
|
|
369
|
-
if (typeof v !== 'string') {
|
|
370
|
-
return `Driver "${driverName}".buildCommand returned spec.env.${k} of type ${typeof v}, expected string`;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
return null;
|
|
375
|
-
}
|
|
376
|
-
export async function runSpawn(spec, driver, opts = {}) {
|
|
377
|
-
const { timeoutMs, signal } = opts;
|
|
378
|
-
const start = performance.now();
|
|
379
|
-
const elapsed = () => Math.round(performance.now() - start);
|
|
380
|
-
if (signal?.aborted) {
|
|
381
|
-
return failResult('Pipeline aborted before spawn', 0);
|
|
382
|
-
}
|
|
383
|
-
// R2: validate the spec before touching it. A third-party driver that
|
|
384
|
-
// returns a malformed SpawnSpec used to crash deep inside Bun.spawn with
|
|
385
|
-
// an opaque TypeError; now we report a clear "Driver X returned …" message.
|
|
386
|
-
const validationError = validateSpawnSpec(spec, driver?.name ?? '<unknown>');
|
|
387
|
-
if (validationError !== null) {
|
|
388
|
-
return failResult(validationError, elapsed());
|
|
389
|
-
}
|
|
390
|
-
const mergedEnv = { ...process.env, ...(spec.env ?? {}) };
|
|
391
|
-
const resolvedArgs = resolveWindowsExe(spec.args, mergedEnv.PATH ?? process.env.PATH ?? '');
|
|
392
|
-
// ── 1. Spawn (catch ENOENT / bad-cwd up front) ────────────────────────
|
|
393
|
-
let proc;
|
|
394
|
-
try {
|
|
395
|
-
proc = Bun.spawn(resolvedArgs, {
|
|
396
|
-
cwd: spec.cwd,
|
|
397
|
-
env: mergedEnv,
|
|
398
|
-
stdout: 'pipe',
|
|
399
|
-
stderr: 'pipe',
|
|
400
|
-
stdin: spec.stdin ? 'pipe' : undefined,
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
catch (err) {
|
|
404
|
-
return failResult(String(err), elapsed());
|
|
405
|
-
}
|
|
406
|
-
// ── 2. Write stdin ─────────────────────────────────────────────────────
|
|
407
|
-
// Child may exit before reading (e.g. quick-fail commands that don't
|
|
408
|
-
// touch stdin) → swallow EPIPE rather than surfacing it as an
|
|
409
|
-
// engine-level error.
|
|
410
|
-
if (spec.stdin && proc.stdin && typeof proc.stdin !== 'number') {
|
|
411
|
-
try {
|
|
412
|
-
await proc.stdin.write(spec.stdin);
|
|
413
|
-
await proc.stdin.end();
|
|
414
|
-
}
|
|
415
|
-
catch {
|
|
416
|
-
/* ignore EPIPE / closed-pipe errors */
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
// ── 3. Timeout & abort handling ────────────────────────────────────────
|
|
420
|
-
let killedByUs = false;
|
|
421
|
-
let timedOut = false;
|
|
422
|
-
let timer = null;
|
|
423
|
-
let forceTimer = null;
|
|
424
|
-
const killGracefully = () => {
|
|
425
|
-
if (killedByUs)
|
|
426
|
-
return;
|
|
427
|
-
killedByUs = true;
|
|
428
|
-
if (process.platform === 'win32') {
|
|
429
|
-
// On Windows, kill the entire process tree via taskkill. This handles
|
|
430
|
-
// .cmd wrappers and nested child processes that proc.kill() misses.
|
|
431
|
-
killProcessTree(proc.pid);
|
|
432
|
-
}
|
|
433
|
-
else {
|
|
434
|
-
proc.kill('SIGTERM');
|
|
435
|
-
// If the child ignores SIGTERM, escalate to SIGKILL after 3 s.
|
|
436
|
-
forceTimer = setTimeout(() => {
|
|
437
|
-
try {
|
|
438
|
-
proc.kill('SIGKILL');
|
|
439
|
-
}
|
|
440
|
-
catch {
|
|
441
|
-
/* already exited */
|
|
442
|
-
}
|
|
443
|
-
}, SIGKILL_DELAY_MS);
|
|
444
|
-
}
|
|
445
|
-
};
|
|
446
|
-
if (timeoutMs && timeoutMs > 0) {
|
|
447
|
-
timer = setTimeout(() => {
|
|
448
|
-
timedOut = true;
|
|
449
|
-
killGracefully();
|
|
450
|
-
}, timeoutMs);
|
|
451
|
-
}
|
|
452
|
-
const onAbort = () => killGracefully();
|
|
453
|
-
if (signal) {
|
|
454
|
-
if (signal.aborted) {
|
|
455
|
-
killGracefully();
|
|
456
|
-
}
|
|
457
|
-
else {
|
|
458
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
// ── 4. Collect output & wait ──────────────────────────────────────────
|
|
462
|
-
// Both streams are drained concurrently with `proc.exited` to avoid the
|
|
463
|
-
// classic pipe-buffer deadlock (child blocks on a full stdout pipe, parent
|
|
464
|
-
// is blocked waiting on exit which the child can't reach). Each stream is
|
|
465
|
-
// persisted to disk via `collectStream` as it arrives so we never hold the
|
|
466
|
-
// full output in memory — only the bounded tail.
|
|
467
|
-
const stdoutStream = typeof proc.stdout === 'object' ? proc.stdout : undefined;
|
|
468
|
-
const stderrStream = typeof proc.stderr === 'object' ? proc.stderr : undefined;
|
|
469
|
-
const stdoutCap = opts.maxStdoutTailBytes ?? DEFAULT_STDOUT_TAIL_BYTES;
|
|
470
|
-
const stderrCap = opts.maxStderrTailBytes ?? DEFAULT_STDERR_TAIL_BYTES;
|
|
471
|
-
const [exitCode, stdoutResult, stderrResult] = await Promise.all([
|
|
472
|
-
proc.exited,
|
|
473
|
-
collectStream(stdoutStream, opts.stdoutPath, stdoutCap),
|
|
474
|
-
collectStream(stderrStream, opts.stderrPath, stderrCap),
|
|
475
|
-
]);
|
|
476
|
-
const stdout = stdoutResult.text;
|
|
477
|
-
const stderr = stderrResult.text;
|
|
478
|
-
const stdoutPath = stdoutResult.path;
|
|
479
|
-
const stderrPath = stderrResult.path;
|
|
480
|
-
const stdoutBytes = stdoutResult.totalBytes;
|
|
481
|
-
const stderrBytes = stderrResult.totalBytes;
|
|
482
|
-
// ── 5. Cleanup timers & listeners ──────────────────────────────────────
|
|
483
|
-
if (timer)
|
|
484
|
-
clearTimeout(timer);
|
|
485
|
-
if (forceTimer)
|
|
486
|
-
clearTimeout(forceTimer);
|
|
487
|
-
if (signal)
|
|
488
|
-
signal.removeEventListener('abort', onAbort);
|
|
489
|
-
const durationMs = elapsed();
|
|
490
|
-
// We initiated the kill (timeout or abort) — always treat as non-success
|
|
491
|
-
// regardless of exit code. A process that catches SIGTERM and exits 0 still
|
|
492
|
-
// hit the timeout; letting it pass as success would unblock downstream tasks
|
|
493
|
-
// incorrectly. The `timedOut` flag guards against the narrow race where the
|
|
494
|
-
// process exits naturally at the exact moment the timeout fires — even if
|
|
495
|
-
// killedByUs wasn't set in time, the timeout intention still applies.
|
|
496
|
-
if (killedByUs || timedOut) {
|
|
497
|
-
return {
|
|
498
|
-
exitCode: -1,
|
|
499
|
-
stdout,
|
|
500
|
-
stderr,
|
|
501
|
-
stdoutPath,
|
|
502
|
-
stderrPath,
|
|
503
|
-
stdoutBytes,
|
|
504
|
-
stderrBytes,
|
|
505
|
-
durationMs,
|
|
506
|
-
sessionId: null,
|
|
507
|
-
normalizedOutput: null,
|
|
508
|
-
// H2: explicit kind so engine.ts no longer has to guess "is exitCode -1
|
|
509
|
-
// a timeout or a spawn-failure?" Both used to share the same code.
|
|
510
|
-
failureKind: 'timeout',
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
// ── 6. Let driver extract metadata ─────────────────────────────────────
|
|
514
|
-
// R1: parseResult is third-party code — wrap it in try/catch so a buggy
|
|
515
|
-
// extractor doesn't discard a perfectly good spawn result. R5: even on
|
|
516
|
-
// success, type-guard sessionId/normalizedOutput so a mistyped return
|
|
517
|
-
// value doesn't poison sessionMap/normalizedMap downstream.
|
|
518
|
-
let sessionId = null;
|
|
519
|
-
let normalizedOutput = null;
|
|
520
|
-
// M12: drivers can flip a task's terminal status to failed even when the
|
|
521
|
-
// process exited 0 (e.g. opencode returning `{type:"error"}` JSON). When
|
|
522
|
-
// the flag is set, we synthesize a non-zero exit code and append a reason
|
|
523
|
-
// line to stderr so engine.ts marks the task as failed with a useful
|
|
524
|
-
// explanation instead of letting the error JSON pass through as success.
|
|
525
|
-
let forcedFailureMessage = null;
|
|
526
|
-
if (driver?.parseResult) {
|
|
527
|
-
try {
|
|
528
|
-
const meta = driver.parseResult(stdout, stderr);
|
|
529
|
-
if (meta && typeof meta === 'object') {
|
|
530
|
-
if (typeof meta.sessionId === 'string' && /^[\w.-]{1,256}$/.test(meta.sessionId)) {
|
|
531
|
-
sessionId = meta.sessionId;
|
|
532
|
-
}
|
|
533
|
-
if (typeof meta.normalizedOutput === 'string') {
|
|
534
|
-
normalizedOutput = meta.normalizedOutput;
|
|
535
|
-
}
|
|
536
|
-
if (meta.forceFailure === true) {
|
|
537
|
-
forcedFailureMessage =
|
|
538
|
-
typeof meta.forceFailureReason === 'string'
|
|
539
|
-
? meta.forceFailureReason
|
|
540
|
-
: 'Driver flagged task as failed (forceFailure)';
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
catch (err) {
|
|
545
|
-
// The spawn itself succeeded; only metadata extraction failed.
|
|
546
|
-
// Fall through with sessionId/normalizedOutput = null and append a
|
|
547
|
-
// breadcrumb to stderr so the user can see WHY continue_from broke.
|
|
548
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
549
|
-
const note = `\n[runner] driver "${driver.name}".parseResult threw: ${msg}`;
|
|
550
|
-
return {
|
|
551
|
-
exitCode,
|
|
552
|
-
stdout,
|
|
553
|
-
stderr: stderr + note,
|
|
554
|
-
stdoutPath,
|
|
555
|
-
stderrPath,
|
|
556
|
-
stdoutBytes,
|
|
557
|
-
stderrBytes,
|
|
558
|
-
durationMs,
|
|
559
|
-
sessionId: null,
|
|
560
|
-
normalizedOutput: null,
|
|
561
|
-
// H2: parseResult threw — the spawn itself succeeded, so the failure
|
|
562
|
-
// is "the process exited but the driver couldn't parse it". Surface
|
|
563
|
-
// that as exit_nonzero (when the actual exit was non-zero) or null
|
|
564
|
-
// (when the underlying exit was 0 — UI will still mark it failed via
|
|
565
|
-
// engine.ts because the result is incomplete).
|
|
566
|
-
failureKind: exitCode === 0 ? null : 'exit_nonzero',
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
// M12: when the driver forced a failure, treat as exit_nonzero with the
|
|
571
|
-
// reason appended to stderr so users see WHY the task failed without
|
|
572
|
-
// having to dig through driver-specific JSON.
|
|
573
|
-
if (forcedFailureMessage !== null) {
|
|
574
|
-
return {
|
|
575
|
-
exitCode: exitCode === 0 ? 1 : exitCode,
|
|
576
|
-
stdout,
|
|
577
|
-
stderr: stderr + (stderr.endsWith('\n') ? '' : '\n') + `[driver] ${forcedFailureMessage}`,
|
|
578
|
-
stdoutPath,
|
|
579
|
-
stderrPath,
|
|
580
|
-
stdoutBytes,
|
|
581
|
-
stderrBytes,
|
|
582
|
-
durationMs,
|
|
583
|
-
sessionId,
|
|
584
|
-
normalizedOutput,
|
|
585
|
-
failureKind: 'exit_nonzero',
|
|
586
|
-
};
|
|
587
|
-
}
|
|
588
|
-
return {
|
|
589
|
-
exitCode,
|
|
590
|
-
stdout,
|
|
591
|
-
stderr,
|
|
592
|
-
stdoutPath,
|
|
593
|
-
stderrPath,
|
|
594
|
-
stdoutBytes,
|
|
595
|
-
stderrBytes,
|
|
596
|
-
durationMs,
|
|
597
|
-
sessionId,
|
|
598
|
-
normalizedOutput,
|
|
599
|
-
// H2: success vs nonzero exit. Engine uses this to short-circuit the
|
|
600
|
-
// timeout branch even if a third-party driver returns -1 by mistake.
|
|
601
|
-
failureKind: exitCode === 0 ? null : 'exit_nonzero',
|
|
602
|
-
};
|
|
603
|
-
}
|
|
604
|
-
export async function runCommand(command, cwd, opts = {}) {
|
|
605
|
-
const spec = {
|
|
606
|
-
args: shellArgs(command),
|
|
607
|
-
cwd,
|
|
608
|
-
};
|
|
609
|
-
return runSpawn(spec, null, opts);
|
|
610
|
-
}
|
|
1
|
+
export { runCommand, runSpawn } from '@tagma/runtime-bun';
|
|
611
2
|
//# sourceMappingURL=runner.js.map
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,+EAA+E;AAC/E,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC1D,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAE1D;;;;;GAKG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;YAC1E,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvD,+EAA+E;YAC/E,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,qCAAqC,MAAM,CAAC,QAAQ,YAAY,GAAG,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CACxF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC;AAwBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,KAAK,UAAU,aAAa,CAC1B,MAA8C,EAC9C,QAA4B,EAC5B,YAAoB;IAEpB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE5D,IAAI,EAAE,GAAsB,IAAI,CAAC;IACjC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,2BAA2B,QAAQ,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAChH,CAAC;YACF,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAiB,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,mEAAmE;QACnE,kEAAkE;QAClE,8CAA8C;QAC9C,EAAE;QACF,qEAAqE;QACrE,yEAAyE;QACzE,uEAAuE;QACvE,kEAAkE;QAClE,uEAAuE;QACvE,8CAA8C;QAC9C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAmC,EAAE,CAAC;YAC9D,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;YAE3B,oEAAoE;YACpE,uEAAuE;YACvE,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CACX,kCAAkC,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClG,CAAC;oBACF,IAAI,CAAC;wBACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;oBACnB,CAAC;oBAAC,MAAM,CAAC;wBACP,YAAY;oBACd,CAAC;oBACD,EAAE,GAAG,IAAI,CAAC;oBACV,eAAe,GAAG,IAAI,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,qEAAqE;YACrE,qEAAqE;YACrE,qEAAqE;YACrE,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,YAAY,EAAE,CAAC;gBACrD,SAAS,IAAI,MAAM,CAAC,KAAK,EAAG,CAAC,MAAM,CAAC;YACtC,CAAC;YACD,oEAAoE;YACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBACxB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;gBACnD,SAAS,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,WAAW,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,CACX,gCAAgC,WAAW,CAAC,OAAO,6BAA6B,CACjF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,2EAA2E;IAC3E,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAEzB,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,eAAe;gBACf,CAAC,CAAC,GAAG,QAAQ,2CAA2C;gBACxD,CAAC,CAAC,QAAQ;YACZ,CAAC,CAAC,oCAAoC,CAAC;QACzC,IAAI,GAAG,KAAK,OAAO,gDAAgD,QAAQ,MAAM,IAAI,EAAE,CAAC;IAC1F,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,GAAG,IAAI,GAAG,mCAAmC,WAAW,CAAC,OAAO,EAAE,CAAC;IACzE,CAAC;IAED,OAAO;QACL,IAAI;QACJ,UAAU;QACV,uEAAuE;QACvE,gDAAgD;QAChD,IAAI,EAAE,QAAQ,IAAI,IAAI;KACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,8DAA8D;AAC9D,wEAAwE;AACxE,iEAAiE;AACjE,qEAAqE;AACrE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoC,CAAC;AAErE,4DAA4D;AAC5D,SAAS,WAAW;IAClB,IAAI,gBAAgB,CAAC,IAAI,IAAI,sBAAsB,EAAE,CAAC;QACpD,0EAA0E;QAC1E,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QACpD,IAAI,MAAM,KAAK,SAAS;YAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ;SACtB,KAAK,CAAC,OAAO,CAAC;SACd,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAChF,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,WAAmB;IACxC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;QAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,2EAA2E;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3D,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAuB,EAAE,OAAe;IACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;IACrB,2EAA2E;IAC3E,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,GAAG,OAAO,OAAO,EAAE,CAAC;IACxC,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,0EAA0E;QAC1E,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;QACtD,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uDAAuD,CAAC;SAC1F,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1D,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;oBACtC,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBACrC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC;IACd,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,UAAU,CAAC,MAAc,EAAE,UAAkB;IACpD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC;QACZ,MAAM,EAAE,EAAE;QACV,MAAM;QACN,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,UAAU;QACV,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,aAAa;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa,EAAE,UAAkB;IACjE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,WAAW,UAAU,2BAA2B,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,6BAA6B,CAAC;IAC3H,CAAC;IACD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,WAAW,UAAU,6CAA6C,OAAO,CAAC,CAAC,IAAI,qBAAqB,CAAC;IAC9G,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,WAAW,UAAU,kDAAkD,CAAC;IACjF,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,WAAW,UAAU,qCAAqC,CAAC,aAAa,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACrH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,WAAW,UAAU,kEAAkE,CAAC;IACjG,CAAC;IACD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,WAAW,UAAU,4CAA4C,OAAO,CAAC,CAAC,GAAG,gCAAgC,CAAC;IACvH,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,WAAW,UAAU,8CAA8C,OAAO,CAAC,CAAC,KAAK,gCAAgC,CAAC;IAC3H,CAAC;IACD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,OAAO,WAAW,UAAU,6DAA6D,CAAC;QAC5F,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAA8B,CAAC,EAAE,CAAC;YACtE,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,WAAW,UAAU,oCAAoC,CAAC,YAAY,OAAO,CAAC,mBAAmB,CAAC;YAC3G,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAe,EACf,MAA2B,EAC3B,OAAmB,EAAE;IAErB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAE5D,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,UAAU,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,sEAAsE;IACtE,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,WAAW,CAAC,CAAC;IAC7E,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;IAC1D,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAE5F,yEAAyE;IACzE,IAAI,IAAkC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAwB,EAAE;YACzC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,0EAA0E;IAC1E,qEAAqE;IACrE,8DAA8D;IAC9D,sBAAsB;IACtB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,UAAU,GAAyC,IAAI,CAAC;IAE5D,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,UAAU;YAAE,OAAO;QACvB,UAAU,GAAG,IAAI,CAAC;QAElB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,sEAAsE;YACtE,oEAAoE;YACpE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,+DAA+D;YAC/D,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,IAAI,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,oBAAoB;gBACtB,CAAC;YACH,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC;YAChB,cAAc,EAAE,CAAC;QACnB,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IACvC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,cAAc,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,wEAAwE;IACxE,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,iDAAiD;IACjD,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,yBAAyB,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,IAAI,yBAAyB,CAAC;IAEvE,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/D,IAAI,CAAC,MAAM;QACX,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;QACvD,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;KACxD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;IACjC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;IACrC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,CAAC;IAC5C,MAAM,WAAW,GAAG,YAAY,CAAC,UAAU,CAAC;IAE5C,0EAA0E;IAC1E,IAAI,KAAK;QAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,UAAU;QAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,OAAO,EAAE,CAAC;IAE7B,yEAAyE;IACzE,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,sEAAsE;IACtE,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,CAAC,CAAC;YACZ,MAAM;YACN,MAAM;YACN,UAAU;YACV,UAAU;YACV,WAAW;YACX,WAAW;YACX,UAAU;YACV,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE,IAAI;YACtB,wEAAwE;YACxE,mEAAmE;YACnE,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,uEAAuE;IACvE,sEAAsE;IACtE,4DAA4D;IAC5D,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,yEAAyE;IACzE,yEAAyE;IACzE,0EAA0E;IAC1E,qEAAqE;IACrE,yEAAyE;IACzE,IAAI,oBAAoB,GAAkB,IAAI,CAAC;IAC/C,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjF,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC7B,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;oBAC9C,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAC3C,CAAC;gBACD,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;oBAC/B,oBAAoB;wBAClB,OAAO,IAAI,CAAC,kBAAkB,KAAK,QAAQ;4BACzC,CAAC,CAAC,IAAI,CAAC,kBAAkB;4BACzB,CAAC,CAAC,8CAA8C,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+DAA+D;YAC/D,mEAAmE;YACnE,oEAAoE;YACpE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,GAAG,sBAAsB,MAAM,CAAC,IAAI,wBAAwB,GAAG,EAAE,CAAC;YAC5E,OAAO;gBACL,QAAQ;gBACR,MAAM;gBACN,MAAM,EAAE,MAAM,GAAG,IAAI;gBACrB,UAAU;gBACV,UAAU;gBACV,WAAW;gBACX,WAAW;gBACX,UAAU;gBACV,SAAS,EAAE,IAAI;gBACf,gBAAgB,EAAE,IAAI;gBACtB,qEAAqE;gBACrE,oEAAoE;gBACpE,mEAAmE;gBACnE,qEAAqE;gBACrE,+CAA+C;gBAC/C,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;aACpD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,qEAAqE;IACrE,8CAA8C;IAC9C,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;QAClC,OAAO;YACL,QAAQ,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;YACvC,MAAM;YACN,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,YAAY,oBAAoB,EAAE;YACzF,UAAU;YACV,UAAU;YACV,WAAW;YACX,WAAW;YACX,UAAU;YACV,SAAS;YACT,gBAAgB;YAChB,WAAW,EAAE,cAAc;SAC5B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ;QACR,MAAM;QACN,MAAM;QACN,UAAU;QACV,UAAU;QACV,WAAW;QACX,WAAW;QACX,UAAU;QACV,SAAS;QACT,gBAAgB;QAChB,qEAAqE;QACrE,qEAAqE;QACrE,WAAW,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,GAAW,EACX,OAAmB,EAAE;IAErB,MAAM,IAAI,GAAc;QACtB,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC;QACxB,GAAG;KACJ,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin-approval.d.ts","sourceRoot":"","sources":["../../../src/runtime/adapters/stdin-approval.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin-approval.js","sourceRoot":"","sources":["../../../src/runtime/adapters/stdin-approval.ts"],"names":[],"mappings":"AAAA,cAAc,4CAA4C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-approval.d.ts","sourceRoot":"","sources":["../../../src/runtime/adapters/websocket-approval.ts"],"names":[],"mappings":"AAAA,cAAc,gDAAgD,CAAC"}
|