@librechat/agents 3.1.90 → 3.1.91

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 (80) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +9 -5
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +46 -14
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/langfuse.cjs +234 -0
  6. package/dist/cjs/langfuse.cjs.map +1 -0
  7. package/dist/cjs/main.cjs +25 -0
  8. package/dist/cjs/main.cjs.map +1 -1
  9. package/dist/cjs/run.cjs +44 -27
  10. package/dist/cjs/run.cjs.map +1 -1
  11. package/dist/cjs/stream.cjs +10 -3
  12. package/dist/cjs/stream.cjs.map +1 -1
  13. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +380 -0
  14. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -0
  15. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +997 -0
  16. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -0
  17. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +575 -0
  18. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -0
  19. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +165 -0
  20. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -0
  21. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +17 -5
  22. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  23. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +110 -6
  24. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  25. package/dist/esm/agents/AgentContext.mjs +9 -5
  26. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  27. package/dist/esm/graphs/Graph.mjs +46 -14
  28. package/dist/esm/graphs/Graph.mjs.map +1 -1
  29. package/dist/esm/langfuse.mjs +226 -0
  30. package/dist/esm/langfuse.mjs.map +1 -0
  31. package/dist/esm/main.mjs +5 -1
  32. package/dist/esm/main.mjs.map +1 -1
  33. package/dist/esm/run.mjs +44 -27
  34. package/dist/esm/run.mjs.map +1 -1
  35. package/dist/esm/stream.mjs +10 -3
  36. package/dist/esm/stream.mjs.map +1 -1
  37. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +378 -0
  38. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -0
  39. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +994 -0
  40. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -0
  41. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +566 -0
  42. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -0
  43. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +155 -0
  44. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -0
  45. package/dist/esm/tools/local/LocalExecutionEngine.mjs +17 -6
  46. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  47. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +111 -7
  48. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  49. package/dist/types/agents/AgentContext.d.ts +4 -1
  50. package/dist/types/graphs/Graph.d.ts +6 -5
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/langfuse.d.ts +48 -0
  53. package/dist/types/tools/cloudflare/CloudflareBridgeRuntime.d.ts +23 -0
  54. package/dist/types/tools/cloudflare/CloudflareProgrammaticToolCalling.d.ts +4 -0
  55. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +21 -0
  56. package/dist/types/tools/cloudflare/CloudflareSandboxTools.d.ts +22 -0
  57. package/dist/types/tools/cloudflare/index.d.ts +4 -0
  58. package/dist/types/tools/local/LocalExecutionEngine.d.ts +1 -0
  59. package/dist/types/types/graph.d.ts +8 -0
  60. package/dist/types/types/tools.d.ts +118 -2
  61. package/package.json +4 -4
  62. package/src/__tests__/stream.eagerEventExecution.test.ts +66 -0
  63. package/src/agents/AgentContext.ts +13 -3
  64. package/src/graphs/Graph.ts +53 -16
  65. package/src/index.ts +1 -0
  66. package/src/langfuse.ts +358 -0
  67. package/src/run.ts +60 -38
  68. package/src/specs/langfuse-config.test.ts +57 -0
  69. package/src/specs/langfuse-metadata.test.ts +19 -1
  70. package/src/stream.ts +13 -3
  71. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +537 -0
  72. package/src/tools/cloudflare/CloudflareBridgeRuntime.ts +480 -0
  73. package/src/tools/cloudflare/CloudflareProgrammaticToolCalling.ts +1162 -0
  74. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +744 -0
  75. package/src/tools/cloudflare/CloudflareSandboxTools.ts +225 -0
  76. package/src/tools/cloudflare/index.ts +4 -0
  77. package/src/tools/local/LocalExecutionEngine.ts +20 -4
  78. package/src/tools/local/resolveLocalExecutionTools.ts +169 -7
  79. package/src/types/graph.ts +9 -0
  80. package/src/types/tools.ts +141 -2
@@ -0,0 +1,380 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+
5
+ const DEFAULT_API_PREFIX = '/v1';
6
+ const DEFAULT_WORKSPACE_ROOT = '/workspace';
7
+ const DEFAULT_SHELL = 'bash';
8
+ function normalizeBaseURL(baseURL) {
9
+ return baseURL.replace(/\/+$/, '');
10
+ }
11
+ function normalizePrefix(prefix) {
12
+ const raw = prefix ?? DEFAULT_API_PREFIX;
13
+ const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;
14
+ return withLeadingSlash.replace(/\/+$/, '');
15
+ }
16
+ function normalizeWorkspaceRoot(workspaceRoot) {
17
+ const normalized = path.posix.normalize(workspaceRoot);
18
+ return normalized === '/' ? normalized : normalized.replace(/\/+$/, '');
19
+ }
20
+ function getFetch(config) {
21
+ const fetchImpl = config.fetch ?? globalThis.fetch;
22
+ return fetchImpl.bind(globalThis);
23
+ }
24
+ function quote(value) {
25
+ if (value === '') {
26
+ return '\'\'';
27
+ }
28
+ if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {
29
+ return value;
30
+ }
31
+ return `'${value.replace(/'/g, '\'\\\'\'')}'`;
32
+ }
33
+ function encodeBridgePath(filePath) {
34
+ return filePath
35
+ .replace(/^\/+/, '')
36
+ .split('/')
37
+ .map((part) => encodeURIComponent(part))
38
+ .join('/');
39
+ }
40
+ function toSandboxPath(filePath, workspaceRoot) {
41
+ const raw = filePath === '' ? '.' : filePath;
42
+ const root = normalizeWorkspaceRoot(workspaceRoot);
43
+ const resolved = raw.startsWith('/')
44
+ ? path.posix.normalize(raw)
45
+ : path.posix.resolve(root, raw);
46
+ if (root === '/') {
47
+ return resolved;
48
+ }
49
+ if (resolved === root || resolved.startsWith(`${root}/`)) {
50
+ return resolved;
51
+ }
52
+ throw new Error(`Path is outside the Cloudflare sandbox workspace: ${filePath}`);
53
+ }
54
+ function typeFromFind(value) {
55
+ switch (value) {
56
+ case 'd':
57
+ return 'directory';
58
+ case 'l':
59
+ return 'symlink';
60
+ case 'f':
61
+ return 'file';
62
+ default:
63
+ return 'other';
64
+ }
65
+ }
66
+ function decodeBase64(value) {
67
+ return Buffer.from(value, 'base64').toString('utf8');
68
+ }
69
+ async function readResponseText(response) {
70
+ try {
71
+ return await response.text();
72
+ }
73
+ catch {
74
+ return '';
75
+ }
76
+ }
77
+ async function assertOk(response, operation) {
78
+ if (response.ok) {
79
+ return;
80
+ }
81
+ const text = await readResponseText(response);
82
+ throw new Error(`Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`);
83
+ }
84
+ function createHeaders(config, extra) {
85
+ const headers = new Headers(extra);
86
+ if (config.apiKey != null && config.apiKey !== '') {
87
+ headers.set('Authorization', `Bearer ${config.apiKey}`);
88
+ }
89
+ if (config.sessionId != null && config.sessionId !== '') {
90
+ headers.set('Session-Id', config.sessionId);
91
+ }
92
+ return headers;
93
+ }
94
+ function envScript(env) {
95
+ if (env == null) {
96
+ return '';
97
+ }
98
+ return Object.entries(env)
99
+ .filter((entry) => entry[1] != null)
100
+ .map(([key, value]) => `export ${key}=${quote(value)}`)
101
+ .join('\n');
102
+ }
103
+ function commandWithEnv(command, env) {
104
+ const exports$1 = envScript(env);
105
+ return exports$1 === '' ? command : `${exports$1}\n${command}`;
106
+ }
107
+ async function collectReadableStream(stream) {
108
+ const reader = stream.getReader();
109
+ const chunks = [];
110
+ let total = 0;
111
+ try {
112
+ for (;;) {
113
+ const { done, value } = await reader.read();
114
+ if (done)
115
+ break;
116
+ chunks.push(value);
117
+ total += value.byteLength;
118
+ }
119
+ }
120
+ finally {
121
+ reader.releaseLock();
122
+ }
123
+ const bytes = new Uint8Array(total);
124
+ let offset = 0;
125
+ for (const chunk of chunks) {
126
+ bytes.set(chunk, offset);
127
+ offset += chunk.byteLength;
128
+ }
129
+ return bytes;
130
+ }
131
+ async function normalizeWriteBody(content, options) {
132
+ if (typeof content !== 'string') {
133
+ return collectReadableStream(content);
134
+ }
135
+ if (options?.encoding === 'base64') {
136
+ return Buffer.from(content, 'base64');
137
+ }
138
+ return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');
139
+ }
140
+ function parseSSEChunk(buffer) {
141
+ const normalized = buffer.replace(/\r\n/g, '\n');
142
+ const parts = normalized.split('\n\n');
143
+ const remainder = parts.pop() ?? '';
144
+ const events = parts
145
+ .map((part) => {
146
+ let event = 'message';
147
+ const dataLines = [];
148
+ for (const line of part.split('\n')) {
149
+ if (line.startsWith('event:')) {
150
+ event = line.slice('event:'.length).trim();
151
+ }
152
+ else if (line.startsWith('data:')) {
153
+ dataLines.push(line.slice('data:'.length).trimStart());
154
+ }
155
+ }
156
+ return { event, data: dataLines.join('\n') };
157
+ })
158
+ .filter((event) => event.data !== '' || event.event !== 'message');
159
+ return { events, remainder };
160
+ }
161
+ function parseExitCode(data) {
162
+ try {
163
+ const parsed = JSON.parse(data);
164
+ return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;
165
+ }
166
+ catch {
167
+ return 1;
168
+ }
169
+ }
170
+ function parseBridgeError(data) {
171
+ try {
172
+ const parsed = JSON.parse(data);
173
+ return parsed.error ?? data;
174
+ }
175
+ catch {
176
+ return data;
177
+ }
178
+ }
179
+ function createCloudflareBridgeRuntime(config) {
180
+ const baseURL = normalizeBaseURL(config.baseURL);
181
+ const apiPrefix = normalizePrefix(config.apiRoutePrefix);
182
+ const workspaceRoot = normalizeWorkspaceRoot(config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT);
183
+ const shell = config.shell ?? DEFAULT_SHELL;
184
+ const fetchImpl = getFetch(config);
185
+ let sandboxIdPromise = config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;
186
+ function bridgeURL(suffix) {
187
+ return `${baseURL}${apiPrefix}${suffix}`;
188
+ }
189
+ async function getSandboxId() {
190
+ if (sandboxIdPromise == null) {
191
+ sandboxIdPromise = (async () => {
192
+ const response = await fetchImpl(bridgeURL('/sandbox'), {
193
+ method: 'POST',
194
+ headers: createHeaders(config),
195
+ });
196
+ await assertOk(response, 'sandbox create');
197
+ const payload = (await response.json());
198
+ if (typeof payload.id !== 'string' || payload.id === '') {
199
+ throw new Error('Cloudflare sandbox bridge create did not return an id.');
200
+ }
201
+ return payload.id;
202
+ })().catch((error) => {
203
+ sandboxIdPromise = undefined;
204
+ throw error;
205
+ });
206
+ }
207
+ return sandboxIdPromise;
208
+ }
209
+ async function exec(command, options = {}) {
210
+ const sandboxId = await getSandboxId();
211
+ const sandboxPathId = encodeURIComponent(sandboxId);
212
+ const response = await fetchImpl(bridgeURL(`/sandbox/${sandboxPathId}/exec`), {
213
+ method: 'POST',
214
+ headers: createHeaders(config, {
215
+ 'Content-Type': 'application/json',
216
+ }),
217
+ body: JSON.stringify({
218
+ argv: [shell, '-lc', commandWithEnv(command, options.env)],
219
+ cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),
220
+ timeout_ms: options.timeout,
221
+ }),
222
+ signal: options.signal,
223
+ });
224
+ await assertOk(response, 'exec');
225
+ if (response.body == null) {
226
+ throw new Error('Cloudflare sandbox bridge exec response did not include a body.');
227
+ }
228
+ const decoder = new TextDecoder();
229
+ const reader = response.body.getReader();
230
+ let buffer = '';
231
+ let stdout = '';
232
+ let stderr = '';
233
+ let exitCode;
234
+ try {
235
+ for (;;) {
236
+ const { done, value } = await reader.read();
237
+ if (done)
238
+ break;
239
+ buffer += decoder.decode(value, { stream: true });
240
+ const parsed = parseSSEChunk(buffer);
241
+ buffer = parsed.remainder;
242
+ for (const event of parsed.events) {
243
+ if (event.event === 'stdout') {
244
+ const decoded = decodeBase64(event.data);
245
+ stdout += decoded;
246
+ options.onOutput?.('stdout', decoded);
247
+ }
248
+ else if (event.event === 'stderr') {
249
+ const decoded = decodeBase64(event.data);
250
+ stderr += decoded;
251
+ options.onOutput?.('stderr', decoded);
252
+ }
253
+ else if (event.event === 'exit') {
254
+ exitCode = parseExitCode(event.data);
255
+ }
256
+ else if (event.event === 'error') {
257
+ throw new Error(parseBridgeError(event.data));
258
+ }
259
+ }
260
+ }
261
+ buffer += decoder.decode();
262
+ const parsed = parseSSEChunk(buffer);
263
+ buffer = parsed.remainder;
264
+ for (const event of parsed.events) {
265
+ if (event.event === 'stdout') {
266
+ const decoded = decodeBase64(event.data);
267
+ stdout += decoded;
268
+ options.onOutput?.('stdout', decoded);
269
+ }
270
+ else if (event.event === 'stderr') {
271
+ const decoded = decodeBase64(event.data);
272
+ stderr += decoded;
273
+ options.onOutput?.('stderr', decoded);
274
+ }
275
+ else if (event.event === 'exit') {
276
+ exitCode = parseExitCode(event.data);
277
+ }
278
+ else if (event.event === 'error') {
279
+ throw new Error(parseBridgeError(event.data));
280
+ }
281
+ }
282
+ }
283
+ finally {
284
+ reader.releaseLock();
285
+ }
286
+ if (exitCode == null) {
287
+ throw new Error('Cloudflare sandbox bridge exec stream closed before an exit event.');
288
+ }
289
+ return {
290
+ success: exitCode === 0,
291
+ exitCode,
292
+ stdout,
293
+ stderr,
294
+ command,
295
+ };
296
+ }
297
+ async function readFile(filePath) {
298
+ const sandboxId = await getSandboxId();
299
+ const sandboxPathId = encodeURIComponent(sandboxId);
300
+ const resolvedPath = toSandboxPath(filePath, workspaceRoot);
301
+ const response = await fetchImpl(bridgeURL(`/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`), {
302
+ headers: createHeaders(config),
303
+ });
304
+ await assertOk(response, 'readFile');
305
+ return Buffer.from(await response.arrayBuffer());
306
+ }
307
+ async function writeFile(filePath, content, options) {
308
+ const sandboxId = await getSandboxId();
309
+ const sandboxPathId = encodeURIComponent(sandboxId);
310
+ const resolvedPath = toSandboxPath(filePath, workspaceRoot);
311
+ const body = await normalizeWriteBody(content, options);
312
+ const response = await fetchImpl(bridgeURL(`/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`), {
313
+ method: 'PUT',
314
+ headers: createHeaders(config, {
315
+ 'Content-Type': 'application/octet-stream',
316
+ }),
317
+ body,
318
+ });
319
+ await assertOk(response, 'writeFile');
320
+ return response.json().catch(() => ({ ok: true }));
321
+ }
322
+ async function mkdir(filePath, options) {
323
+ const resolvedPath = toSandboxPath(filePath, workspaceRoot);
324
+ const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;
325
+ const result = await exec(command, { cwd: workspaceRoot });
326
+ if (result.exitCode !== 0) {
327
+ throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);
328
+ }
329
+ return { ok: true };
330
+ }
331
+ async function listFiles(filePath, options) {
332
+ const resolvedPath = toSandboxPath(filePath, workspaceRoot);
333
+ const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';
334
+ const hiddenFilter = options?.includeHidden === true ? '' : ' \\( -name \'.*\' -prune \\) -o';
335
+ const quotedPath = quote(resolvedPath);
336
+ const command = `[ -d ${quotedPath} ] || { printf '%s is not a directory\\n' ${quotedPath} >&2; exit 20; }; ` +
337
+ `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +
338
+ '-printf \'%y\\t%s\\t%p\\n\'';
339
+ const result = await exec(command, { cwd: workspaceRoot });
340
+ if (result.exitCode !== 0) {
341
+ throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);
342
+ }
343
+ return result.stdout
344
+ .split('\n')
345
+ .filter(Boolean)
346
+ .map((line) => {
347
+ const [rawType, rawSize, ...pathParts] = line.split('\t');
348
+ const absolutePath = pathParts.join('\t');
349
+ return {
350
+ name: path.posix.basename(absolutePath),
351
+ absolutePath,
352
+ relativePath: path.posix.relative(resolvedPath, absolutePath),
353
+ type: typeFromFind(rawType),
354
+ size: Number.parseInt(rawSize, 10) || 0,
355
+ };
356
+ });
357
+ }
358
+ async function deleteFile(filePath) {
359
+ const resolvedPath = toSandboxPath(filePath, workspaceRoot);
360
+ const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {
361
+ cwd: workspaceRoot,
362
+ });
363
+ if (result.exitCode !== 0) {
364
+ throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);
365
+ }
366
+ return { ok: true };
367
+ }
368
+ return {
369
+ getSandboxId,
370
+ exec,
371
+ readFile,
372
+ writeFile,
373
+ mkdir,
374
+ listFiles,
375
+ deleteFile,
376
+ };
377
+ }
378
+
379
+ exports.createCloudflareBridgeRuntime = createCloudflareBridgeRuntime;
380
+ //# sourceMappingURL=CloudflareBridgeRuntime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareBridgeRuntime.cjs","sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"names":["path","exports"],"mappings":";;;;AAGA,MAAM,kBAAkB,GAAG,KAAK;AAChC,MAAM,sBAAsB,GAAG,YAAY;AAC3C,MAAM,aAAa,GAAG,MAAM;AA8B5B,SAAS,gBAAgB,CAAC,OAAe,EAAA;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACpC;AAEA,SAAS,eAAe,CAAC,MAA0B,EAAA;AACjD,IAAA,MAAM,GAAG,GAAG,MAAM,IAAI,kBAAkB;AACxC,IAAA,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE;IAC9D,OAAO,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAC7C;AAEA,SAAS,sBAAsB,CAAC,aAAqB,EAAA;IACnD,MAAM,UAAU,GAAGA,UAAI,CAAC,SAAS,CAAC,aAAa,CAAC;AAChD,IAAA,OAAO,UAAU,KAAK,GAAG,GAAG,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACzE;AAEA,SAAS,QAAQ,CAAC,MAAqC,EAAA;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;AAClD,IAAA,OAAO,SAAS,CAAC,IAAI,CAAC,UAAU,CAAiB;AACnD;AAEA,SAAS,KAAK,CAAC,KAAa,EAAA;AAC1B,IAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC1C,QAAA,OAAO,KAAK;IACd;IACA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA,CAAA,CAAG;AAC/C;AAEA,SAAS,gBAAgB,CAAC,QAAgB,EAAA;AACxC,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,MAAM,EAAE,EAAE;SAClB,KAAK,CAAC,GAAG;SACT,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,CAAC;SACtC,IAAI,CAAC,GAAG,CAAC;AACd;AAEA,SAAS,aAAa,CAAC,QAAgB,EAAE,aAAqB,EAAA;AAC5D,IAAA,MAAM,GAAG,GAAG,QAAQ,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ;AAC5C,IAAA,MAAM,IAAI,GAAG,sBAAsB,CAAC,aAAa,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG;AACjC,UAAEA,UAAI,CAAC,SAAS,CAAC,GAAG;UAClBA,UAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC3B,IAAA,IAAI,IAAI,KAAK,GAAG,EAAE;AAChB,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,CAAC,EAAE;AACxD,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,MAAM,IAAI,KAAK,CACb,qDAAqD,QAAQ,CAAA,CAAE,CAChE;AACH;AAEA,SAAS,YAAY,CAAC,KAAa,EAAA;IACjC,QAAQ,KAAK;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,WAAW;AACpB,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,SAAS;AAClB,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,MAAM;AACf,QAAA;AACE,YAAA,OAAO,OAAO;;AAElB;AAEA,SAAS,YAAY,CAAC,KAAa,EAAA;AACjC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtD;AAEA,eAAe,gBAAgB,CAAC,QAAkB,EAAA;AAChD,IAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;IAC9B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF;AAEA,eAAe,QAAQ,CAAC,QAAkB,EAAE,SAAiB,EAAA;AAC3D,IAAA,IAAI,QAAQ,CAAC,EAAE,EAAE;QACf;IACF;AACA,IAAA,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC;AAC7C,IAAA,MAAM,IAAI,KAAK,CACb,CAAA,0BAAA,EAA6B,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAC,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAC9E;AACH;AAEA,SAAS,aAAa,CACpB,MAAqC,EACrC,KAAmB,EAAA;AAEnB,IAAA,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;AAClC,IAAA,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,MAAM,CAAA,CAAE,CAAC;IACzD;AACA,IAAA,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;IAC7C;AACA,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,SAAS,CAAC,GAAwC,EAAA;AACzD,IAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG;AACtB,SAAA,MAAM,CAAC,CAAC,KAAK,KAAgC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;AAC7D,SAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,KAAK,CAAC,EAAE;SACrD,IAAI,CAAC,IAAI,CAAC;AACf;AAEA,SAAS,cAAc,CACrB,OAAe,EACf,GAAwC,EAAA;AAExC,IAAA,MAAMC,SAAO,GAAG,SAAS,CAAC,GAAG,CAAC;AAC9B,IAAA,OAAOA,SAAO,KAAK,EAAE,GAAG,OAAO,GAAG,CAAA,EAAGA,SAAO,CAAA,EAAA,EAAK,OAAO,EAAE;AAC5D;AAEA,eAAe,qBAAqB,CAClC,MAAkC,EAAA;AAElC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE;IACjC,MAAM,MAAM,GAAiB,EAAE;IAC/B,IAAI,KAAK,GAAG,CAAC;AACb,IAAA,IAAI;AACF,QAAA,SAAS;YACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,YAAA,IAAI,IAAI;gBAAE;AACV,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,YAAA,KAAK,IAAI,KAAK,CAAC,UAAU;QAC3B;IACF;YAAU;QACR,MAAM,CAAC,WAAW,EAAE;IACtB;AACA,IAAA,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC;AACd,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACxB,QAAA,MAAM,IAAI,KAAK,CAAC,UAAU;IAC5B;AACA,IAAA,OAAO,KAAK;AACd;AAEA,eAAe,kBAAkB,CAC/B,OAA4C,EAC5C,OAA+B,EAAA;AAE/B,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO,qBAAqB,CAAC,OAAO,CAAC;IACvC;AACA,IAAA,IAAI,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE;QAClC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;IACvC;IACA,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7E;AAEA,SAAS,aAAa,CAAC,MAAc,EAAA;IAInC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;IACnC,MAAM,MAAM,GAAG;AACZ,SAAA,GAAG,CAAC,CAAC,IAAI,KAAI;QACZ,IAAI,KAAK,GAAG,SAAS;QACrB,MAAM,SAAS,GAAa,EAAE;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACnC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAC7B,gBAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;YAC5C;AAAO,iBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACnC,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YACxD;QACF;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC9C,IAAA,CAAC;AACA,SAAA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;AACpE,IAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AAC9B;AAEA,SAAS,aAAa,CAAC,IAAY,EAAA;AACjC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B;AACzD,QAAA,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC;IACpE;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,CAAC;IACV;AACF;AAEA,SAAS,gBAAgB,CAAC,IAAY,EAAA;AACpC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB;AACrD,QAAA,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI;IAC7B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEM,SAAU,6BAA6B,CAC3C,MAAqC,EAAA;IAErC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;IAChD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC;IACxD,MAAM,aAAa,GAAG,sBAAsB,CAC1C,MAAM,CAAC,aAAa,IAAI,sBAAsB,CAC/C;AACD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa;AAC3C,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAClC,IAAI,gBAAgB,GAClB,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS;IAE1E,SAAS,SAAS,CAAC,MAAc,EAAA;AAC/B,QAAA,OAAO,GAAG,OAAO,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,EAAE;IAC1C;AAEA,IAAA,eAAe,YAAY,GAAA;AACzB,QAAA,IAAI,gBAAgB,IAAI,IAAI,EAAE;AAC5B,YAAA,gBAAgB,GAAG,CAAC,YAA4B;gBAC9C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;AACtD,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;AAC/B,iBAAA,CAAC;AACF,gBAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;gBAC1C,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB;AAC1D,gBAAA,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;AACvD,oBAAA,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD;gBACH;gBACA,OAAO,OAAO,CAAC,EAAE;YACnB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAc,KAAI;gBAC5B,gBAAgB,GAAG,SAAS;AAC5B,gBAAA,MAAM,KAAK;AACb,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,gBAAgB;IACzB;AAEA,IAAA,eAAe,IAAI,CACjB,OAAe,EACf,UAA0C,EAAE,EAAA;AAE5C,QAAA,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,SAAS,CAAC,CAAA,SAAA,EAAY,aAAa,CAAA,KAAA,CAAO,CAAC,EAC3C;AACE,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE;AAC7B,gBAAA,cAAc,EAAE,kBAAkB;aACnC,CAAC;AACF,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AACnB,gBAAA,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1D,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,aAAa,EAAE,aAAa,CAAC;gBAC/D,UAAU,EAAE,OAAO,CAAC,OAAO;aAC5B,CAAC;YACF,MAAM,EAAE,OAAO,CAAC,MAAM;AACvB,SAAA,CACF;AACD,QAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;AAChC,QAAA,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE;AACzB,YAAA,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE;QACH;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;QACxC,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,MAAM,GAAG,EAAE;AACf,QAAA,IAAI,QAA4B;AAEhC,QAAA,IAAI;AACF,YAAA,SAAS;gBACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,gBAAA,IAAI,IAAI;oBAAE;AACV,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjD,gBAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;AACpC,gBAAA,MAAM,GAAG,MAAM,CAAC,SAAS;AACzB,gBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;AACjC,oBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;wBAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBACxC,MAAM,IAAI,OAAO;wBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;oBACvC;AAAO,yBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;wBACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBACxC,MAAM,IAAI,OAAO;wBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;oBACvC;AAAO,yBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE;AACjC,wBAAA,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;oBACtC;AAAO,yBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;wBAClC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/C;gBACF;YACF;AACA,YAAA,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;AACpC,YAAA,MAAM,GAAG,MAAM,CAAC,SAAS;AACzB,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;AACjC,gBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;oBAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxC,MAAM,IAAI,OAAO;oBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;gBACvC;AAAO,qBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxC,MAAM,IAAI,OAAO;oBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;gBACvC;AAAO,qBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE;AACjC,oBAAA,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtC;AAAO,qBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;oBAClC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/C;YACF;QACF;gBAAU;YACR,MAAM,CAAC,WAAW,EAAE;QACtB;AAEA,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE;QACH;QAEA,OAAO;YACL,OAAO,EAAE,QAAQ,KAAK,CAAC;YACvB,QAAQ;YACR,MAAM;YACN,MAAM;YACN,OAAO;SACR;IACH;IAEA,eAAe,QAAQ,CAAC,QAAgB,EAAA;AACtC,QAAA,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC;QACnD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,SAAS,CACP,CAAA,SAAA,EAAY,aAAa,CAAA,MAAA,EAAS,gBAAgB,CAAC,YAAY,CAAC,CAAA,CAAE,CACnE,EACD;AACE,YAAA,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;AAC/B,SAAA,CACF;AACD,QAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClD;AAEA,IAAA,eAAe,SAAS,CACtB,QAAgB,EAChB,OAA4C,EAC5C,OAA+B,EAAA;AAE/B,QAAA,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC;QACnD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;AACvD,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,SAAS,CACP,CAAA,SAAA,EAAY,aAAa,CAAA,MAAA,EAAS,gBAAgB,CAAC,YAAY,CAAC,CAAA,CAAE,CACnE,EACD;AACE,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE;AAC7B,gBAAA,cAAc,EAAE,0BAA0B;aAC3C,CAAC;YACF,IAAI;AACL,SAAA,CACF;AACD,QAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD;AAEA,IAAA,eAAe,KAAK,CAClB,QAAgB,EAChB,OAAiC,EAAA;QAEjC,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC3D,MAAM,OAAO,GAAG,CAAA,EAAG,OAAO,EAAE,SAAS,KAAK,IAAI,GAAG,UAAU,GAAG,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,YAAY,CAAC,CAAA,CAAE;AACjG,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;AAC1D,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAC;QACtE;AACA,QAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE;IACrB;AAEA,IAAA,eAAe,SAAS,CACtB,QAAgB,EAChB,OAA6C,EAAA;QAE7C,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,OAAO,EAAE,SAAS,KAAK,IAAI,GAAG,EAAE,GAAG,aAAa;AACjE,QAAA,MAAM,YAAY,GAChB,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,EAAE,GAAG,iCAAiC;AAC1E,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC;AACtC,QAAA,MAAM,OAAO,GACX,CAAA,KAAA,EAAQ,UAAU,CAAA,0CAAA,EAA6C,UAAU,CAAA,kBAAA,CAAoB;AAC7F,YAAA,CAAA,KAAA,EAAQ,UAAU,CAAA,aAAA,EAAgB,QAAQ,CAAA,EAAG,YAAY,CAAA,CAAA,CAAG;AAC5D,YAAA,6BAA6B;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;AAC1D,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAA,qBAAA,EAAwB,YAAY,CAAA,CAAE,CAAC;QAC1E;QACA,OAAO,MAAM,CAAC;aACX,KAAK,CAAC,IAAI;aACV,MAAM,CAAC,OAAO;AACd,aAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,YAAA,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACzD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,OAAO;AACL,gBAAA,IAAI,EAAED,UAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACjC,YAAY;gBACZ,YAAY,EAAEA,UAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;AACvD,gBAAA,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC;gBAC3B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC;aACxC;AACH,QAAA,CAAC,CAAC;IACN;IAEA,eAAe,UAAU,CAAC,QAAgB,EAAA;QACxC,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAA,UAAA,EAAa,KAAK,CAAC,YAAY,CAAC,CAAA,CAAE,EAAE;AAC5D,YAAA,GAAG,EAAE,aAAa;AACnB,SAAA,CAAC;AACF,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAA,sBAAA,EAAyB,YAAY,CAAA,CAAE,CAAC;QAC3E;AACA,QAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE;IACrB;IAEA,OAAO;QACL,YAAY;QACZ,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,KAAK;QACL,SAAS;QACT,UAAU;KACX;AACH;;;;"}