experimental-agent 0.4.0 → 0.6.0

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 (52) hide show
  1. package/dist/{adapter-zgOel4wW.d.mts → adapter-DmlMKodR.d.mts} +4 -60
  2. package/dist/{adapter-zgOel4wW.d.ts → adapter-DmlMKodR.d.ts} +4 -60
  3. package/dist/{chunk-ZUFJJYC4.mjs → chunk-2Y7EZPIP.mjs} +3 -2
  4. package/dist/{chunk-MSTM6W3Y.mjs → chunk-355UN6NT.mjs} +11 -3
  5. package/dist/{chunk-RT72C52I.mjs → chunk-6MS4CGEZ.mjs} +3 -2
  6. package/dist/chunk-CS2SEUAA.mjs +405 -0
  7. package/dist/chunk-LZOMFHX3.mjs +38 -0
  8. package/dist/chunk-NOW6XL5E.mjs +310 -0
  9. package/dist/chunk-PH2FXKOU.mjs +9 -0
  10. package/dist/client-Cd-79N5B.d.ts +494 -0
  11. package/dist/client-panIugEx.d.mts +494 -0
  12. package/dist/client.mjs +1 -1
  13. package/dist/{docker-QPCLWLYR.mjs → docker-FCSNVBEQ.mjs} +2 -2
  14. package/dist/entry-CciSxlDK.d.mts +45 -0
  15. package/dist/entry-MCzvxs7U.d.ts +45 -0
  16. package/dist/index.d.mts +475 -384
  17. package/dist/index.d.ts +475 -384
  18. package/dist/index.js +16693 -219
  19. package/dist/index.mjs +16545 -160
  20. package/dist/lifecycle-workflow-steps.d.mts +2 -2
  21. package/dist/lifecycle-workflow-steps.d.ts +2 -2
  22. package/dist/lifecycle-workflow-steps.mjs +1 -1
  23. package/dist/lifecycle-workflow.d.mts +2 -2
  24. package/dist/lifecycle-workflow.d.ts +2 -2
  25. package/dist/lifecycle-workflow.mjs +1 -1
  26. package/dist/{local-KJ3BSIFJ.mjs → local-NXHIUJTO.mjs} +2 -2
  27. package/dist/next/loader.js +11 -3
  28. package/dist/next/loader.mjs +2 -2
  29. package/dist/next.js +11 -3
  30. package/dist/next.mjs +2 -2
  31. package/dist/{process-manager-WQHAIVRB.mjs → process-manager-26NELLRU.mjs} +1 -1
  32. package/dist/react.d.mts +56 -0
  33. package/dist/react.d.ts +56 -0
  34. package/dist/react.js +144 -0
  35. package/dist/react.mjs +117 -0
  36. package/dist/sandbox.d.mts +3 -3
  37. package/dist/sandbox.d.ts +3 -3
  38. package/dist/sandbox.js +15 -5
  39. package/dist/sandbox.mjs +4 -4
  40. package/dist/{steps-BIsP57pm.d.mts → steps-DWQYXexO.d.mts} +5 -2
  41. package/dist/{steps-DShnXBLf.d.ts → steps-DnvPkAtl.d.ts} +5 -2
  42. package/dist/storage.d.mts +2 -2
  43. package/dist/storage.d.ts +2 -2
  44. package/dist/storage.js +133 -56
  45. package/dist/storage.mjs +2 -2
  46. package/dist/{vercel-QZ6INPMV.mjs → vercel-LJEWLD4T.mjs} +2 -2
  47. package/package.json +10 -2
  48. package/dist/chunk-BFFNCESS.mjs +0 -302
  49. package/dist/chunk-BJTO5JO5.mjs +0 -11
  50. package/dist/chunk-IV75IMEW.mjs +0 -328
  51. package/dist/entry-6HYg5qqg.d.mts +0 -36
  52. package/dist/entry-BrWOmEK2.d.ts +0 -36
@@ -0,0 +1,310 @@
1
+ // src/sandbox/bindings/docker.ts
2
+ import { ulid } from "ulid";
3
+ async function execDocker(args, opts) {
4
+ const { spawn } = await import("child_process");
5
+ return new Promise((resolve, reject) => {
6
+ const child = spawn("docker", ["sandbox", ...args], {
7
+ signal: opts?.signal
8
+ });
9
+ let stdout = "";
10
+ let stderr = "";
11
+ child.stdout.on("data", (data) => {
12
+ stdout += data.toString();
13
+ });
14
+ child.stderr.on("data", (data) => {
15
+ stderr += data.toString();
16
+ });
17
+ const timeoutId = opts?.timeoutMs ? setTimeout(() => {
18
+ child.kill("SIGTERM");
19
+ reject(new Error(`docker sandbox ${args[0]} timed out`));
20
+ }, opts.timeoutMs) : void 0;
21
+ child.on("error", (err) => {
22
+ if (timeoutId) {
23
+ clearTimeout(timeoutId);
24
+ }
25
+ reject(err);
26
+ });
27
+ child.on("close", (code) => {
28
+ if (timeoutId) {
29
+ clearTimeout(timeoutId);
30
+ }
31
+ resolve({ stdout, stderr, exitCode: code ?? 0 });
32
+ });
33
+ });
34
+ }
35
+ var ensurePromises = /* @__PURE__ */ new Map();
36
+ var activeSandboxes = /* @__PURE__ */ new Set();
37
+ var cleanupRegistered = false;
38
+ var _execSync = null;
39
+ async function registerCleanup() {
40
+ if (cleanupRegistered) {
41
+ return;
42
+ }
43
+ cleanupRegistered = true;
44
+ const cp = await import("child_process");
45
+ _execSync = cp.execSync;
46
+ const cleanup = () => {
47
+ if (!_execSync) {
48
+ return;
49
+ }
50
+ for (const name of Array.from(activeSandboxes)) {
51
+ try {
52
+ _execSync(`docker sandbox stop ${name}`, {
53
+ timeout: 1e4,
54
+ stdio: "pipe"
55
+ });
56
+ } catch {
57
+ }
58
+ }
59
+ };
60
+ process.on("exit", cleanup);
61
+ process.on("SIGINT", () => {
62
+ cleanup();
63
+ process.exit(130);
64
+ });
65
+ process.on("SIGTERM", () => {
66
+ cleanup();
67
+ process.exit(143);
68
+ });
69
+ }
70
+ async function ensureSandbox(sandboxName) {
71
+ const existing = ensurePromises.get(sandboxName);
72
+ if (existing) {
73
+ return existing;
74
+ }
75
+ const promise = (async () => {
76
+ const ls = await execDocker(["ls", "-q"], { timeoutMs: 1e4 });
77
+ const existingNames = ls.exitCode === 0 ? ls.stdout.split("\n").map((s) => s.trim()).filter(Boolean) : [];
78
+ if (existingNames.includes(sandboxName)) {
79
+ activeSandboxes.add(sandboxName);
80
+ registerCleanup();
81
+ return;
82
+ }
83
+ const path = await import("path");
84
+ const os = await import("os");
85
+ const fs = await import("fs/promises");
86
+ const workspaceDir = path.join(
87
+ os.tmpdir(),
88
+ "agent-docker-sandbox",
89
+ sandboxName
90
+ );
91
+ await fs.mkdir(workspaceDir, { recursive: true });
92
+ const create = await execDocker(
93
+ ["create", "--name", sandboxName, "shell", workspaceDir],
94
+ { timeoutMs: 6e4 }
95
+ );
96
+ if (create.exitCode !== 0) {
97
+ if (create.stderr.includes("already exists")) {
98
+ activeSandboxes.add(sandboxName);
99
+ registerCleanup();
100
+ return;
101
+ }
102
+ throw new Error(
103
+ `Failed to create docker sandbox "${sandboxName}": ${create.stderr}`
104
+ );
105
+ }
106
+ activeSandboxes.add(sandboxName);
107
+ registerCleanup();
108
+ })();
109
+ ensurePromises.set(sandboxName, promise);
110
+ try {
111
+ await promise;
112
+ } catch (e) {
113
+ ensurePromises.delete(sandboxName);
114
+ throw e;
115
+ }
116
+ }
117
+ var DEFAULT_DOCKER_CWD = "/home/agent/workspace";
118
+ var DockerSandboxInstance = class {
119
+ cwd;
120
+ sandboxName;
121
+ processes = /* @__PURE__ */ new Map();
122
+ constructor(sandboxName, cwd) {
123
+ this.sandboxName = sandboxName;
124
+ this.cwd = cwd ?? DEFAULT_DOCKER_CWD;
125
+ }
126
+ async exec(opts) {
127
+ await ensureSandbox(this.sandboxName);
128
+ const { spawn } = await import("child_process");
129
+ const commandId = `command_${ulid()}`;
130
+ const envFlags = opts.env ? Object.entries(opts.env).flatMap(([k, v]) => ["-e", `${k}=${v}`]) : [];
131
+ const cwdFlags = opts.cwd ? ["-w", opts.cwd] : [];
132
+ let baseCmd;
133
+ if (opts.sudo) {
134
+ baseCmd = ["sudo", opts.command, ...opts.args ?? []];
135
+ } else if (opts.args) {
136
+ baseCmd = [opts.command, ...opts.args];
137
+ } else {
138
+ baseCmd = [opts.command];
139
+ }
140
+ const fullCmd = baseCmd;
141
+ const child = spawn(
142
+ "docker",
143
+ [
144
+ "sandbox",
145
+ "exec",
146
+ ...envFlags,
147
+ ...cwdFlags,
148
+ this.sandboxName,
149
+ ...fullCmd
150
+ ],
151
+ { signal: opts.signal }
152
+ );
153
+ this.processes.set(commandId, child);
154
+ let stdout = "";
155
+ let stderr = "";
156
+ const logQueue = [];
157
+ let logResolve = null;
158
+ let closed = false;
159
+ child.stdout.on("data", (data) => {
160
+ const str = String(data);
161
+ stdout += str;
162
+ logQueue.push({ stream: "stdout", data: str });
163
+ logResolve?.();
164
+ });
165
+ child.stderr.on("data", (data) => {
166
+ const str = String(data);
167
+ stderr += str;
168
+ logQueue.push({ stream: "stderr", data: str });
169
+ logResolve?.();
170
+ });
171
+ const result = new Promise((resolve, reject) => {
172
+ child.on("error", (err) => {
173
+ this.processes.delete(commandId);
174
+ closed = true;
175
+ logResolve?.();
176
+ reject(err);
177
+ });
178
+ child.on("close", (code) => {
179
+ this.processes.delete(commandId);
180
+ closed = true;
181
+ logResolve?.();
182
+ resolve({ stdout, stderr, exitCode: code ?? 0 });
183
+ });
184
+ });
185
+ async function* logs() {
186
+ while (!closed || logQueue.length > 0) {
187
+ const entry = logQueue.shift();
188
+ if (entry) {
189
+ yield entry;
190
+ } else if (!closed) {
191
+ await new Promise((r) => {
192
+ logResolve = r;
193
+ });
194
+ logResolve = null;
195
+ }
196
+ }
197
+ }
198
+ return { commandId, logs, result };
199
+ }
200
+ async readFile(opts) {
201
+ await ensureSandbox(this.sandboxName);
202
+ const result = await execDocker(
203
+ [
204
+ "exec",
205
+ this.sandboxName,
206
+ "bash",
207
+ "-c",
208
+ `base64 '${opts.path.replace(/'/g, "'\\''")}'`
209
+ ],
210
+ { timeoutMs: 3e4, signal: opts.signal }
211
+ );
212
+ if (result.exitCode !== 0) {
213
+ if (result.stderr.includes("No such file") || result.stderr.includes("ENOENT")) {
214
+ return null;
215
+ }
216
+ throw new Error(`readFile failed: ${result.stderr}`);
217
+ }
218
+ return Buffer.from(result.stdout.trim(), "base64");
219
+ }
220
+ async writeFiles(opts) {
221
+ await ensureSandbox(this.sandboxName);
222
+ for (const file of opts.files) {
223
+ const fullPath = opts.destPath ? `${opts.destPath}/${file.path}` : file.path;
224
+ const parentDir = fullPath.substring(0, fullPath.lastIndexOf("/"));
225
+ if (parentDir) {
226
+ await execDocker(["exec", this.sandboxName, "mkdir", "-p", parentDir], {
227
+ signal: opts.signal
228
+ });
229
+ }
230
+ const b64 = typeof file.content === "string" ? Buffer.from(file.content).toString("base64") : file.content.toString("base64");
231
+ await execDocker(
232
+ [
233
+ "exec",
234
+ this.sandboxName,
235
+ "bash",
236
+ "-c",
237
+ `echo '${b64}' | base64 -d > '${fullPath.replace(/'/g, "'\\''")}'`
238
+ ],
239
+ { signal: opts.signal }
240
+ );
241
+ if (file.path.endsWith(".sh")) {
242
+ await execDocker(["exec", this.sandboxName, "chmod", "+x", fullPath], {
243
+ signal: opts.signal
244
+ });
245
+ }
246
+ }
247
+ }
248
+ // biome-ignore lint/suspicious/useAwait: .
249
+ async getDomain(opts) {
250
+ return `http://localhost:${opts.port}`;
251
+ }
252
+ // biome-ignore lint/suspicious/useAwait: .
253
+ async kill(opts) {
254
+ const child = this.processes.get(opts.commandId);
255
+ if (child) {
256
+ child.kill("SIGTERM");
257
+ this.processes.delete(opts.commandId);
258
+ }
259
+ }
260
+ // biome-ignore lint/suspicious/useAwait: .
261
+ async getStatus() {
262
+ return "running";
263
+ }
264
+ async start() {
265
+ await ensureSandbox(this.sandboxName);
266
+ }
267
+ async stop() {
268
+ await execDocker(["stop", this.sandboxName], { timeoutMs: 3e4 });
269
+ activeSandboxes.delete(this.sandboxName);
270
+ ensurePromises.delete(this.sandboxName);
271
+ }
272
+ // biome-ignore lint/suspicious/useAwait: .
273
+ async snapshot() {
274
+ throw new Error("snapshot is not supported for docker sandboxes");
275
+ }
276
+ // biome-ignore lint/suspicious/useAwait: .
277
+ async updateNetworkPolicy() {
278
+ throw new Error(
279
+ "updateNetworkPolicy is not supported for docker sandboxes"
280
+ );
281
+ }
282
+ };
283
+ function dockerSandbox(defaults) {
284
+ return {
285
+ type: "docker",
286
+ defaults,
287
+ async create(opts) {
288
+ const sandboxName = `agent-${ulid()}`;
289
+ const cwd = opts.setup?.config?.cwd;
290
+ await ensureSandbox(sandboxName);
291
+ const instance = new DockerSandboxInstance(sandboxName, cwd);
292
+ if (opts.setup?.run) {
293
+ await opts.setup.run(instance);
294
+ }
295
+ return {
296
+ instance,
297
+ metadata: { sandboxName }
298
+ };
299
+ },
300
+ // biome-ignore lint/suspicious/useAwait: .
301
+ async connect(opts) {
302
+ return new DockerSandboxInstance(opts.metadata.sandboxName);
303
+ }
304
+ };
305
+ }
306
+
307
+ export {
308
+ dockerSandbox
309
+ };
310
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvZG9ja2VyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB0eXBlIHsgRXhlY1Jlc3VsdCwgU2FuZGJveEJpbmRpbmcsIFNhbmRib3hJbnN0YW5jZSB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5cbmV4cG9ydCB0eXBlIERvY2tlckJpbmRpbmdDb25maWcgPSB7XG4gIGN3ZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERvY2tlckJpbmRpbmdNZXRhZGF0YSA9IHtcbiAgc2FuZGJveE5hbWU6IHN0cmluZztcbn07XG5cbi8qKlxuICogUnVuIGEgYGRvY2tlciBzYW5kYm94YCBDTEkgY29tbWFuZCBhbmQgcmV0dXJuIGl0cyBvdXRwdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNEb2NrZXIoXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXI7IHNpZ25hbD86IEFib3J0U2lnbmFsIH1cbik6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXIgfT4ge1xuICBjb25zdCB7IHNwYXduIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImRvY2tlclwiLCBbXCJzYW5kYm94XCIsIC4uLmFyZ3NdLCB7XG4gICAgICBzaWduYWw6IG9wdHM/LnNpZ25hbCxcbiAgICB9KTtcblxuICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBzdGRvdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgIH0pO1xuICAgIGNoaWxkLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IG9wdHM/LnRpbWVvdXRNc1xuICAgICAgPyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBkb2NrZXIgc2FuZGJveCAke2FyZ3NbMF19IHRpbWVkIG91dGApKTtcbiAgICAgICAgfSwgb3B0cy50aW1lb3V0TXMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xuICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoeyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IGNvZGUgPz8gMCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogVHJhY2sgd2hpY2ggc2FuZGJveGVzIGhhdmUgYmVlbiB2ZXJpZmllZCB0byBleGlzdCBpbiB0aGlzIHByb2Nlc3MuXG4gKiBNYXBzIHNhbmRib3ggbmFtZSAtPiBQcm9taXNlIHNvIGNvbmN1cnJlbnQgY2FsbGVycyB3YWl0IG9uIHRoZSBzYW1lIGNoZWNrLlxuICovXG5jb25zdCBlbnN1cmVQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4vKipcbiAqIFNhbmRib3hlcyB0aGF0IHRoaXMgcHJvY2VzcyBoYXMgdXNlZC4gU3RvcHBlZCBvbiBwcm9jZXNzIGV4aXQuXG4gKi9cbmNvbnN0IGFjdGl2ZVNhbmRib3hlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5sZXQgY2xlYW51cFJlZ2lzdGVyZWQgPSBmYWxzZTtcbmxldCBfZXhlY1N5bmM6IHR5cGVvZiBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIikuZXhlY1N5bmMgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJDbGVhbnVwKCkge1xuICBpZiAoY2xlYW51cFJlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY2xlYW51cFJlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gIC8vIFByZS1sb2FkIGV4ZWNTeW5jIHNvIHRoZSBzeW5jaHJvbm91cyBleGl0IGhhbmRsZXIgY2FuIHVzZSBpdC5cbiAgY29uc3QgY3AgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7XG4gIF9leGVjU3luYyA9IGNwLmV4ZWNTeW5jO1xuXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKCFfZXhlY1N5bmMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIEFycmF5LmZyb20oYWN0aXZlU2FuZGJveGVzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX2V4ZWNTeW5jKGBkb2NrZXIgc2FuZGJveCBzdG9wICR7bmFtZX1gLCB7XG4gICAgICAgICAgdGltZW91dDogMTBfMDAwLFxuICAgICAgICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQmVzdC1lZmZvcnQgXHUyMDE0IHNhbmRib3ggbWF5IGFscmVhZHkgYmUgc3RvcHBlZFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiZXhpdFwiLCBjbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgY2xlYW51cCgpO1xuICAgIHByb2Nlc3MuZXhpdCgxMzApO1xuICB9KTtcbiAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBwcm9jZXNzLmV4aXQoMTQzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRW5zdXJlIGEgRG9ja2VyIHNhbmRib3ggZXhpc3RzIGZvciB0aGUgZ2l2ZW4gbmFtZS5cbiAqIElmIGl0IGFscmVhZHkgZXhpc3RzIChmcm9tIGEgcHJldmlvdXMgcHJvY2VzcyksIHJldXNlcyBpdC5cbiAqIElmIGl0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZXMgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVNhbmRib3goc2FuZGJveE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZyA9IGVuc3VyZVByb21pc2VzLmdldChzYW5kYm94TmFtZSk7XG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGNvbnN0IHByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxzID0gYXdhaXQgZXhlY0RvY2tlcihbXCJsc1wiLCBcIi1xXCJdLCB7IHRpbWVvdXRNczogMTBfMDAwIH0pO1xuICAgIGNvbnN0IGV4aXN0aW5nTmFtZXMgPVxuICAgICAgbHMuZXhpdENvZGUgPT09IDBcbiAgICAgICAgPyBscy5zdGRvdXRcbiAgICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIDogW107XG5cbiAgICBpZiAoZXhpc3RpbmdOYW1lcy5pbmNsdWRlcyhzYW5kYm94TmFtZSkpIHtcbiAgICAgIGFjdGl2ZVNhbmRib3hlcy5hZGQoc2FuZGJveE5hbWUpO1xuICAgICAgcmVnaXN0ZXJDbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcbiAgICBjb25zdCBvcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6b3NcIik7XG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyID0gcGF0aC5qb2luKFxuICAgICAgb3MudG1wZGlyKCksXG4gICAgICBcImFnZW50LWRvY2tlci1zYW5kYm94XCIsXG4gICAgICBzYW5kYm94TmFtZVxuICAgICk7XG4gICAgYXdhaXQgZnMubWtkaXIod29ya3NwYWNlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGNyZWF0ZSA9IGF3YWl0IGV4ZWNEb2NrZXIoXG4gICAgICBbXCJjcmVhdGVcIiwgXCItLW5hbWVcIiwgc2FuZGJveE5hbWUsIFwic2hlbGxcIiwgd29ya3NwYWNlRGlyXSxcbiAgICAgIHsgdGltZW91dE1zOiA2MF8wMDAgfVxuICAgICk7XG5cbiAgICBpZiAoY3JlYXRlLmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICBpZiAoY3JlYXRlLnN0ZGVyci5pbmNsdWRlcyhcImFscmVhZHkgZXhpc3RzXCIpKSB7XG4gICAgICAgIGFjdGl2ZVNhbmRib3hlcy5hZGQoc2FuZGJveE5hbWUpO1xuICAgICAgICByZWdpc3RlckNsZWFudXAoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBkb2NrZXIgc2FuZGJveCBcIiR7c2FuZGJveE5hbWV9XCI6ICR7Y3JlYXRlLnN0ZGVycn1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGFjdGl2ZVNhbmRib3hlcy5hZGQoc2FuZGJveE5hbWUpO1xuICAgIHJlZ2lzdGVyQ2xlYW51cCgpO1xuICB9KSgpO1xuXG4gIGVuc3VyZVByb21pc2VzLnNldChzYW5kYm94TmFtZSwgcHJvbWlzZSk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBwcm9taXNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZW5zdXJlUHJvbWlzZXMuZGVsZXRlKHNhbmRib3hOYW1lKTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmNvbnN0IERFRkFVTFRfRE9DS0VSX0NXRCA9IFwiL2hvbWUvYWdlbnQvd29ya3NwYWNlXCI7XG5cbmNsYXNzIERvY2tlclNhbmRib3hJbnN0YW5jZSBpbXBsZW1lbnRzIFNhbmRib3hJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNhbmRib3hOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc2VzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc1xuICA+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2FuZGJveE5hbWU6IHN0cmluZywgY3dkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zYW5kYm94TmFtZSA9IHNhbmRib3hOYW1lO1xuICAgIHRoaXMuY3dkID0gY3dkID8/IERFRkFVTFRfRE9DS0VSX0NXRDtcbiAgfVxuXG4gIGFzeW5jIGV4ZWMob3B0czoge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBhcmdzPzogc3RyaW5nW107XG4gICAgY3dkPzogc3RyaW5nO1xuICAgIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgc3Vkbz86IGJvb2xlYW47XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPEV4ZWNSZXN1bHQ+IHtcbiAgICBhd2FpdCBlbnN1cmVTYW5kYm94KHRoaXMuc2FuZGJveE5hbWUpO1xuXG4gICAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpO1xuICAgIGNvbnN0IGNvbW1hbmRJZCA9IGBjb21tYW5kXyR7dWxpZCgpfWA7XG4gICAgY29uc3QgZW52RmxhZ3MgPSBvcHRzLmVudlxuICAgICAgPyBPYmplY3QuZW50cmllcyhvcHRzLmVudikuZmxhdE1hcCgoW2ssIHZdKSA9PiBbXCItZVwiLCBgJHtrfT0ke3Z9YF0pXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IGN3ZEZsYWdzID0gb3B0cy5jd2QgPyBbXCItd1wiLCBvcHRzLmN3ZF0gOiBbXTtcbiAgICBsZXQgYmFzZUNtZDogc3RyaW5nW107XG4gICAgaWYgKG9wdHMuc3Vkbykge1xuICAgICAgYmFzZUNtZCA9IFtcInN1ZG9cIiwgb3B0cy5jb21tYW5kLCAuLi4ob3B0cy5hcmdzID8/IFtdKV07XG4gICAgfSBlbHNlIGlmIChvcHRzLmFyZ3MpIHtcbiAgICAgIGJhc2VDbWQgPSBbb3B0cy5jb21tYW5kLCAuLi5vcHRzLmFyZ3NdO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlQ21kID0gW29wdHMuY29tbWFuZF07XG4gICAgfVxuICAgIGNvbnN0IGZ1bGxDbWQgPSBiYXNlQ21kO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcbiAgICAgIFwiZG9ja2VyXCIsXG4gICAgICBbXG4gICAgICAgIFwic2FuZGJveFwiLFxuICAgICAgICBcImV4ZWNcIixcbiAgICAgICAgLi4uZW52RmxhZ3MsXG4gICAgICAgIC4uLmN3ZEZsYWdzLFxuICAgICAgICB0aGlzLnNhbmRib3hOYW1lLFxuICAgICAgICAuLi5mdWxsQ21kLFxuICAgICAgXSxcbiAgICAgIHsgc2lnbmFsOiBvcHRzLnNpZ25hbCB9XG4gICAgKTtcblxuICAgIHRoaXMucHJvY2Vzc2VzLnNldChjb21tYW5kSWQsIGNoaWxkKTtcblxuICAgIGxldCBzdGRvdXQgPSBcIlwiO1xuICAgIGxldCBzdGRlcnIgPSBcIlwiO1xuICAgIGNvbnN0IGxvZ1F1ZXVlOiB7IHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7IGRhdGE6IHN0cmluZyB9W10gPSBbXTtcbiAgICBsZXQgbG9nUmVzb2x2ZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nIHwgQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBzdHIgPSBTdHJpbmcoZGF0YSk7XG4gICAgICBzdGRvdXQgKz0gc3RyO1xuICAgICAgbG9nUXVldWUucHVzaCh7IHN0cmVhbTogXCJzdGRvdXRcIiwgZGF0YTogc3RyIH0pO1xuICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcgfCBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhkYXRhKTtcbiAgICAgIHN0ZGVyciArPSBzdHI7XG4gICAgICBsb2dRdWV1ZS5wdXNoKHsgc3RyZWFtOiBcInN0ZGVyclwiLCBkYXRhOiBzdHIgfSk7XG4gICAgICBsb2dSZXNvbHZlPy4oKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPHtcbiAgICAgIHN0ZG91dDogc3RyaW5nO1xuICAgICAgc3RkZXJyOiBzdHJpbmc7XG4gICAgICBleGl0Q29kZTogbnVtYmVyO1xuICAgIH0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3Nlcy5kZWxldGUoY29tbWFuZElkKTtcbiAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgbG9nUmVzb2x2ZT8uKCk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZXMuZGVsZXRlKGNvbW1hbmRJZCk7XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIGxvZ1Jlc29sdmU/LigpO1xuICAgICAgICByZXNvbHZlKHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBjb2RlID8/IDAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBsb2dzKCk6IEFzeW5jSXRlcmFibGU8e1xuICAgICAgc3RyZWFtOiBcInN0ZG91dFwiIHwgXCJzdGRlcnJcIjtcbiAgICAgIGRhdGE6IHN0cmluZztcbiAgICB9PiB7XG4gICAgICB3aGlsZSAoIWNsb3NlZCB8fCBsb2dRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbG9nUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNsb3NlZCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgICAgICAgICBsb2dSZXNvbHZlID0gcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsb2dSZXNvbHZlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNvbW1hbmRJZCwgbG9ncywgcmVzdWx0IH07XG4gIH1cblxuICBhc3luYyByZWFkRmlsZShvcHRzOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgYXdhaXQgZW5zdXJlU2FuZGJveCh0aGlzLnNhbmRib3hOYW1lKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNEb2NrZXIoXG4gICAgICBbXG4gICAgICAgIFwiZXhlY1wiLFxuICAgICAgICB0aGlzLnNhbmRib3hOYW1lLFxuICAgICAgICBcImJhc2hcIixcbiAgICAgICAgXCItY1wiLFxuICAgICAgICBgYmFzZTY0ICcke29wdHMucGF0aC5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYCxcbiAgICAgIF0sXG4gICAgICB7IHRpbWVvdXRNczogMzBfMDAwLCBzaWduYWw6IG9wdHMuc2lnbmFsIH1cbiAgICApO1xuXG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKFwiTm8gc3VjaCBmaWxlXCIpIHx8XG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoXCJFTk9FTlRcIilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZEZpbGUgZmFpbGVkOiAke3Jlc3VsdC5zdGRlcnJ9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGRvdXQudHJpbSgpLCBcImJhc2U2NFwiKTtcbiAgfVxuXG4gIGFzeW5jIHdyaXRlRmlsZXMob3B0czoge1xuICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIHwgQnVmZmVyIH1bXTtcbiAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlU2FuZGJveCh0aGlzLnNhbmRib3hOYW1lKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBvcHRzLmZpbGVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IG9wdHMuZGVzdFBhdGhcbiAgICAgICAgPyBgJHtvcHRzLmRlc3RQYXRofS8ke2ZpbGUucGF0aH1gXG4gICAgICAgIDogZmlsZS5wYXRoO1xuXG4gICAgICAvLyBFbnN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHBhcmVudERpciA9IGZ1bGxQYXRoLnN1YnN0cmluZygwLCBmdWxsUGF0aC5sYXN0SW5kZXhPZihcIi9cIikpO1xuICAgICAgaWYgKHBhcmVudERpcikge1xuICAgICAgICBhd2FpdCBleGVjRG9ja2VyKFtcImV4ZWNcIiwgdGhpcy5zYW5kYm94TmFtZSwgXCJta2RpclwiLCBcIi1wXCIsIHBhcmVudERpcl0sIHtcbiAgICAgICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gV3JpdGUgdmlhIGJhc2U2NCB0byBoYW5kbGUgYm90aCB0ZXh0IGFuZCBiaW5hcnkgY29udGVudFxuICAgICAgY29uc3QgYjY0ID1cbiAgICAgICAgdHlwZW9mIGZpbGUuY29udGVudCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8gQnVmZmVyLmZyb20oZmlsZS5jb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgICAgICAgIDogZmlsZS5jb250ZW50LnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuXG4gICAgICBhd2FpdCBleGVjRG9ja2VyKFxuICAgICAgICBbXG4gICAgICAgICAgXCJleGVjXCIsXG4gICAgICAgICAgdGhpcy5zYW5kYm94TmFtZSxcbiAgICAgICAgICBcImJhc2hcIixcbiAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgYGVjaG8gJyR7YjY0fScgfCBiYXNlNjQgLWQgPiAnJHtmdWxsUGF0aC5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYCxcbiAgICAgICAgXSxcbiAgICAgICAgeyBzaWduYWw6IG9wdHMuc2lnbmFsIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChmaWxlLnBhdGguZW5kc1dpdGgoXCIuc2hcIikpIHtcbiAgICAgICAgYXdhaXQgZXhlY0RvY2tlcihbXCJleGVjXCIsIHRoaXMuc2FuZGJveE5hbWUsIFwiY2htb2RcIiwgXCIreFwiLCBmdWxsUGF0aF0sIHtcbiAgICAgICAgICBzaWduYWw6IG9wdHMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL3VzZUF3YWl0OiAuXG4gIGFzeW5jIGdldERvbWFpbihvcHRzOiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtvcHRzLnBvcnR9YDtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMga2lsbChvcHRzOiB7IGNvbW1hbmRJZDogc3RyaW5nOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLnByb2Nlc3Nlcy5nZXQob3B0cy5jb21tYW5kSWQpO1xuICAgIGlmIChjaGlsZCkge1xuICAgICAgY2hpbGQua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICB0aGlzLnByb2Nlc3Nlcy5kZWxldGUob3B0cy5jb21tYW5kSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IC5cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8XG4gICAgXCJwZW5kaW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwic3RvcHBpbmdcIiB8IFwic3RvcHBlZFwiIHwgXCJmYWlsZWRcIlxuICA+IHtcbiAgICAvLyBkb2NrZXIgc2FuZGJveCBDTEkgZG9lc24ndCBleHBvc2Ugc3RhdHVzIFx1MjAxNCBhc3N1bWUgcnVubmluZyBpZiBlbnN1cmVkXG4gICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlU2FuZGJveCh0aGlzLnNhbmRib3hOYW1lKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZXhlY0RvY2tlcihbXCJzdG9wXCIsIHRoaXMuc2FuZGJveE5hbWVdLCB7IHRpbWVvdXRNczogMzBfMDAwIH0pO1xuICAgIGFjdGl2ZVNhbmRib3hlcy5kZWxldGUodGhpcy5zYW5kYm94TmFtZSk7XG4gICAgZW5zdXJlUHJvbWlzZXMuZGVsZXRlKHRoaXMuc2FuZGJveE5hbWUpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyBzbmFwc2hvdCgpOiBQcm9taXNlPHsgc25hcHNob3RJZDogc3RyaW5nIH0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzbmFwc2hvdCBpcyBub3Qgc3VwcG9ydGVkIGZvciBkb2NrZXIgc2FuZGJveGVzXCIpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICBhc3luYyB1cGRhdGVOZXR3b3JrUG9saWN5KCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcInVwZGF0ZU5ldHdvcmtQb2xpY3kgaXMgbm90IHN1cHBvcnRlZCBmb3IgZG9ja2VyIHNhbmRib3hlc1wiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9ja2VyU2FuZGJveChcbiAgZGVmYXVsdHM/OiBQYXJ0aWFsPGltcG9ydChcIi4uL2FkYXB0ZXJcIikuU2FuZGJveFNldHVwRmllbGRzPiAmIHtcbiAgICBydW4/OiAoc2FuZGJveDogU2FuZGJveEluc3RhbmNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGNvbmZpZz86IERvY2tlckJpbmRpbmdDb25maWc7XG4gIH1cbik6IFNhbmRib3hCaW5kaW5nPFwiZG9ja2VyXCIsIERvY2tlckJpbmRpbmdDb25maWcsIERvY2tlckJpbmRpbmdNZXRhZGF0YT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiZG9ja2VyXCIsXG4gICAgZGVmYXVsdHMsXG4gICAgYXN5bmMgY3JlYXRlKG9wdHMpIHtcbiAgICAgIGNvbnN0IHNhbmRib3hOYW1lID0gYGFnZW50LSR7dWxpZCgpfWA7XG4gICAgICBjb25zdCBjd2QgPSBvcHRzLnNldHVwPy5jb25maWc/LmN3ZDtcblxuICAgICAgYXdhaXQgZW5zdXJlU2FuZGJveChzYW5kYm94TmFtZSk7XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERvY2tlclNhbmRib3hJbnN0YW5jZShzYW5kYm94TmFtZSwgY3dkKTtcblxuICAgICAgaWYgKG9wdHMuc2V0dXA/LnJ1bikge1xuICAgICAgICBhd2FpdCBvcHRzLnNldHVwLnJ1bihpbnN0YW5jZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94TmFtZSB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogLlxuICAgIGFzeW5jIGNvbm5lY3Qob3B0cykge1xuICAgICAgcmV0dXJuIG5ldyBEb2NrZXJTYW5kYm94SW5zdGFuY2Uob3B0cy5tZXRhZGF0YS5zYW5kYm94TmFtZSk7XG4gICAgfSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLFlBQVk7QUFjckIsZUFBZSxXQUNiLE1BQ0EsTUFDK0Q7QUFDL0QsUUFBTSxFQUFFLE1BQU0sSUFBSSxNQUFNLE9BQU8sZUFBb0I7QUFDbkQsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsVUFBTSxRQUFRLE1BQU0sVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUc7QUFBQSxNQUNsRCxRQUFRLE1BQU07QUFBQSxJQUNoQixDQUFDO0FBRUQsUUFBSSxTQUFTO0FBQ2IsUUFBSSxTQUFTO0FBRWIsVUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFNBQWlCO0FBQ3hDLGdCQUFVLEtBQUssU0FBUztBQUFBLElBQzFCLENBQUM7QUFDRCxVQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsU0FBaUI7QUFDeEMsZ0JBQVUsS0FBSyxTQUFTO0FBQUEsSUFDMUIsQ0FBQztBQUVELFVBQU0sWUFBWSxNQUFNLFlBQ3BCLFdB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
@@ -0,0 +1,9 @@
1
+ // src/rpc/base-path.ts
2
+ function basePathForAgent(agent) {
3
+ return `/api/agents/${agent}`;
4
+ }
5
+
6
+ export {
7
+ basePathForAgent
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JwYy9iYXNlLXBhdGgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB0eXBlIEJhc2VQYXRoID0gYC9hcGkvYWdlbnRzL1thZ2VudF1gO1xuZXhwb3J0IHR5cGUgU2Vzc2lvblBhdGggPSBgJHtCYXNlUGF0aCB8IChzdHJpbmcgJiB7fSl9L1tzZXNzaW9uSWRdYDtcbmV4cG9ydCB0eXBlIFJlY29ubmVjdFBhdGggPSBgJHtTZXNzaW9uUGF0aCB8IChzdHJpbmcgJiB7fSl9L3JlY29ubmVjdGA7XG5leHBvcnQgdHlwZSBJbnRlcnJ1cHRQYXRoID0gYCR7U2Vzc2lvblBhdGggfCAoc3RyaW5nICYge30pfS9pbnRlcnJ1cHRgO1xuXG5leHBvcnQgdHlwZSBQYXRoID0gU2Vzc2lvblBhdGggfCBSZWNvbm5lY3RQYXRoIHwgSW50ZXJydXB0UGF0aDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VQYXRoRm9yQWdlbnQoYWdlbnQ6IHN0cmluZykge1xuICByZXR1cm4gYC9hcGkvYWdlbnRzLyR7YWdlbnR9YCBhcyBjb25zdDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFPTyxTQUFTLGlCQUFpQixPQUFlO0FBQzlDLFNBQU8sZUFBZSxLQUFLO0FBQzdCOyIsCiAgIm5hbWVzIjogW10KfQo=