experimental-agent 0.2.3 → 0.4.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 (69) hide show
  1. package/README.md +103 -241
  2. package/dist/adapter-zgOel4wW.d.mts +256 -0
  3. package/dist/adapter-zgOel4wW.d.ts +256 -0
  4. package/dist/chunk-BFFNCESS.mjs +302 -0
  5. package/dist/chunk-C4VSUEY2.mjs +72 -0
  6. package/dist/chunk-GKASMIBR.mjs +50 -0
  7. package/dist/chunk-IV75IMEW.mjs +328 -0
  8. package/dist/chunk-JO3JDCH5.mjs +107 -0
  9. package/dist/chunk-MSTM6W3Y.mjs +99 -0
  10. package/dist/chunk-MSWINCCM.mjs +128 -0
  11. package/dist/chunk-RT72C52I.mjs +324 -0
  12. package/dist/chunk-ZUFJJYC4.mjs +150 -0
  13. package/dist/{handler-FRUPZ4LX.mjs → docker-QPCLWLYR.mjs} +3 -4
  14. package/dist/entry-6HYg5qqg.d.mts +36 -0
  15. package/dist/entry-BrWOmEK2.d.ts +36 -0
  16. package/dist/index.d.mts +401 -18
  17. package/dist/index.d.ts +401 -18
  18. package/dist/index.js +3396 -5500
  19. package/dist/index.mjs +3511 -1166
  20. package/dist/lifecycle-workflow-steps.d.mts +5 -0
  21. package/dist/lifecycle-workflow-steps.d.ts +5 -0
  22. package/dist/lifecycle-workflow-steps.js +263 -0
  23. package/dist/lifecycle-workflow-steps.mjs +9 -0
  24. package/dist/lifecycle-workflow.d.mts +6 -6
  25. package/dist/lifecycle-workflow.d.ts +6 -6
  26. package/dist/lifecycle-workflow.js +192 -905
  27. package/dist/lifecycle-workflow.mjs +3 -1
  28. package/dist/local-KJ3BSIFJ.mjs +8 -0
  29. package/dist/next/loader.js +31 -7
  30. package/dist/next/loader.mjs +1 -1
  31. package/dist/next.js +35 -8
  32. package/dist/next.mjs +6 -3
  33. package/dist/{process-manager-JDUJDYGU.mjs → process-manager-WQHAIVRB.mjs} +1 -1
  34. package/dist/sandbox.d.mts +6 -0
  35. package/dist/sandbox.d.ts +6 -0
  36. package/dist/sandbox.js +1070 -0
  37. package/dist/sandbox.mjs +19 -0
  38. package/dist/steps-BIsP57pm.d.mts +173 -0
  39. package/dist/steps-DShnXBLf.d.ts +173 -0
  40. package/dist/storage.d.mts +17 -0
  41. package/dist/storage.d.ts +17 -0
  42. package/dist/storage.js +368 -0
  43. package/dist/storage.mjs +16 -0
  44. package/dist/vercel-QZ6INPMV.mjs +11 -0
  45. package/package.json +29 -5
  46. package/dist/agent-workflow.d.mts +0 -30
  47. package/dist/agent-workflow.d.ts +0 -30
  48. package/dist/agent-workflow.js +0 -5433
  49. package/dist/agent-workflow.mjs +0 -14
  50. package/dist/chunk-7M6UPURS.mjs +0 -75
  51. package/dist/chunk-AML2VCQS.mjs +0 -1287
  52. package/dist/chunk-FQ67QZOI.mjs +0 -75
  53. package/dist/chunk-NO7RHGTH.mjs +0 -2367
  54. package/dist/chunk-NXDVNJRS.mjs +0 -106
  55. package/dist/chunk-OZZVS6L5.mjs +0 -139
  56. package/dist/chunk-SJVFFE5D.mjs +0 -402
  57. package/dist/chunk-TAXLUVIC.mjs +0 -1
  58. package/dist/chunk-TGNVXSMX.mjs +0 -399
  59. package/dist/chunk-YRYXN7W4.mjs +0 -48
  60. package/dist/chunk-ZIAHPXOJ.mjs +0 -595
  61. package/dist/client-BKA7XBGW.mjs +0 -15
  62. package/dist/client-CEeSFGva.d.mts +0 -2376
  63. package/dist/client-CEeSFGva.d.ts +0 -2376
  64. package/dist/docker-FB2MJTHJ.mjs +0 -12
  65. package/dist/local-fs-handlers-SYOCKTPN.mjs +0 -447
  66. package/dist/sandbox-UENKQV3T.mjs +0 -21
  67. package/dist/storage-LSDMRW73.mjs +0 -20
  68. package/dist/vercel-SD3JTECG.mjs +0 -20
  69. package/dist/vercel-sdk-I6A4MVAN.mjs +0 -8
@@ -0,0 +1,50 @@
1
+ import {
2
+ checkAndSnapshotStep
3
+ } from "./chunk-JO3JDCH5.mjs";
4
+ import {
5
+ createLogger
6
+ } from "./chunk-MSWINCCM.mjs";
7
+
8
+ // src/sandbox/bindings/vercel-lifecycle/workflow.ts
9
+ import { sleep } from "workflow";
10
+ var DEFAULT_POLL_MS = 2 * 60 * 1e3;
11
+ async function sandboxLifecycleWorkflow({
12
+ input
13
+ }) {
14
+ "use workflow";
15
+ let nextPollMs = input.config?.pollIntervalMs ?? DEFAULT_POLL_MS;
16
+ const log = createLogger({
17
+ config: { ...input.agent.options.logging, name: input.agent.name },
18
+ subsystem: "sandbox:lifecycle",
19
+ context: { sandboxId: input.sandboxId }
20
+ });
21
+ log.info("lifecycle workflow started", {
22
+ sandboxId: input.sandboxId,
23
+ vercelSandboxId: input.vercelSandboxId,
24
+ pollMs: nextPollMs
25
+ });
26
+ while (true) {
27
+ await sleep(nextPollMs);
28
+ const result = await checkAndSnapshotStep(input);
29
+ if (result instanceof Error) {
30
+ log.error("lifecycle step failed", {
31
+ sandboxId: input.sandboxId,
32
+ error: result.message
33
+ });
34
+ break;
35
+ }
36
+ if (result.action === "exit") {
37
+ log.info("lifecycle workflow exiting", {
38
+ sandboxId: input.sandboxId,
39
+ reason: result.reason
40
+ });
41
+ break;
42
+ }
43
+ nextPollMs = result.nextPollMs;
44
+ }
45
+ }
46
+
47
+ export {
48
+ sandboxLifecycleWorkflow
49
+ };
50
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLWxpZmVjeWNsZS93b3JrZmxvdy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9sb2dnZXJcIjtcbmltcG9ydCB7IGNoZWNrQW5kU25hcHNob3RTdGVwLCB0eXBlIExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4vc3RlcHNcIjtcblxuZXhwb3J0IHR5cGUgeyBMaWZlY3ljbGVJbnB1dCB9O1xuXG5jb25zdCBERUZBVUxUX1BPTExfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FuZGJveExpZmVjeWNsZVdvcmtmbG93KHtcbiAgaW5wdXQsXG59OiB7XG4gIGlucHV0OiBMaWZlY3ljbGVJbnB1dDtcbn0pIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICBsZXQgbmV4dFBvbGxNcyA9IGlucHV0LmNvbmZpZz8ucG9sbEludGVydmFsTXMgPz8gREVGQVVMVF9QT0xMX01TO1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5pbnB1dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGlucHV0LmFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpsaWZlY3ljbGVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGxvZy5pbmZvKFwibGlmZWN5Y2xlIHdvcmtmbG93IHN0YXJ0ZWRcIiwge1xuICAgIHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkLFxuICAgIHZlcmNlbFNhbmRib3hJZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICAgIHBvbGxNczogbmV4dFBvbGxNcyxcbiAgfSk7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBhd2FpdCBzbGVlcChuZXh0UG9sbE1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrQW5kU25hcHNob3RTdGVwKGlucHV0KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgbG9nLmVycm9yKFwibGlmZWN5Y2xlIHN0ZXAgZmFpbGVkXCIsIHtcbiAgICAgICAgc2FuZGJveElkOiBpbnB1dC5zYW5kYm94SWQsXG4gICAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5hY3Rpb24gPT09IFwiZXhpdFwiKSB7XG4gICAgICBsb2cuaW5mbyhcImxpZmVjeWNsZSB3b3JrZmxvdyBleGl0aW5nXCIsIHtcbiAgICAgICAgc2FuZGJveElkOiBpbnB1dC5zYW5kYm94SWQsXG4gICAgICAgIHJlYXNvbjogcmVzdWx0LnJlYXNvbixcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV4dFBvbGxNcyA9IHJlc3VsdC5uZXh0UG9sbE1zO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztBQUFBLFNBQVMsYUFBYTtBQU10QixJQUFNLGtCQUFrQixJQUFJLEtBQUs7QUFFakMsZUFBc0IseUJBQXlCO0FBQUEsRUFDN0M7QUFDRixHQUVHO0FBQ0Q7QUFFQSxNQUFJLGFBQWEsTUFBTSxRQUFRLGtCQUFrQjtBQUNqRCxRQUFNLE1BQU0sYUFBYTtBQUFBLElBQ3ZCLFFBQVEsRUFBRSxHQUFHLE1BQU0sTUFBTSxRQUFRLFNBQVMsTUFBTSxNQUFNLE1BQU0sS0FBSztBQUFBLElBQ2pFLFdBQVc7QUFBQSxJQUNYLFNBQVMsRUFBRSxXQUFXLE1BQU0sVUFBVTtBQUFBLEVBQ3hDLENBQUM7QUFFRCxNQUFJLEtBQUssOEJBQThCO0FBQUEsSUFDckMsV0FBVyxNQUFNO0FBQUEsSUFDakIsaUJBQWlCLE1BQU07QUFBQSxJQUN2QixRQUFRO0FBQUEsRUFDVixDQUFDO0FBRUQsU0FBTyxNQUFNO0FBQ1gsVUFBTSxNQUFNLFVBQVU7QUFFdEIsVUFBTSxTQUFTLE1BQU0scUJBQXFCLEtBQUs7QUFFL0MsUUFBSSxrQkFBa0IsT0FBTztBQUMzQixVQUFJLE1BQU0seUJBQXlCO0FBQUEsUUFDakMsV0FBVyxNQUFNO0FBQUEsUUFDakIsT0FBTyxPQUFPO0FBQUEsTUFDaEIsQ0FBQztBQUNEO0FBQUEsSUFDRjtBQUVBLFFBQUksT0FBTyxXQUFXLFFBQVE7QUFDNUIsVUFBSSxLQUFLLDhCQUE4QjtBQUFBLFFBQ3JDLFdBQVcsTUFBTTtBQUFBLFFBQ2pCLFFBQVEsT0FBTztBQUFBLE1BQ2pCLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFFQSxpQkFBYSxPQUFPO0FBQUEsRUFDdEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,328 @@
1
+ // src/storage/adapter.ts
2
+ import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@workflow/serde";
3
+ var StorageStep = class _StorageStep {
4
+ event;
5
+ constructor(event) {
6
+ this.event = event;
7
+ }
8
+ static [WORKFLOW_SERIALIZE](instance) {
9
+ return { event: instance.event };
10
+ }
11
+ static [WORKFLOW_DESERIALIZE](data) {
12
+ return new _StorageStep(data.event);
13
+ }
14
+ // biome-ignore lint/suspicious/noExplicitAny: safe dispatch — event.method selects the matching handler
15
+ on(handlers) {
16
+ return handlers[this.event.method](this.event);
17
+ }
18
+ };
19
+ function isStepFunction(h) {
20
+ return typeof h === "function";
21
+ }
22
+ function fromStepFunction(fn) {
23
+ return {
24
+ session: {
25
+ get: (id) => fn(new StorageStep({ method: "session.get", id })),
26
+ set: (id, value) => fn(new StorageStep({ method: "session.set", id, value })),
27
+ update: (id, updates) => fn(new StorageStep({ method: "session.update", id, updates }))
28
+ },
29
+ message: {
30
+ get: (id) => fn(new StorageStep({ method: "message.get", id })),
31
+ set: (id, value) => fn(new StorageStep({ method: "message.set", id, value })),
32
+ update: (id, updates) => fn(new StorageStep({ method: "message.update", id, updates })),
33
+ listBySession: (sessionId) => fn(new StorageStep({ method: "message.listBySession", sessionId }))
34
+ },
35
+ part: {
36
+ get: (id) => fn(new StorageStep({ method: "part.get", id })),
37
+ set: (id, value) => fn(new StorageStep({ method: "part.set", id, value })),
38
+ listBySession: (sessionId) => fn(new StorageStep({ method: "part.listBySession", sessionId }))
39
+ },
40
+ sandbox: {
41
+ get: (id) => fn(new StorageStep({ method: "sandbox.get", id })),
42
+ set: (id, value) => fn(new StorageStep({ method: "sandbox.set", id, value })),
43
+ update: (id, updates) => fn(new StorageStep({ method: "sandbox.update", id, updates }))
44
+ },
45
+ setup: {
46
+ get: (id) => fn(new StorageStep({ method: "setup.get", id })),
47
+ set: (id, value) => fn(new StorageStep({ method: "setup.set", id, value }))
48
+ }
49
+ };
50
+ }
51
+ function fromHandlers(h) {
52
+ return {
53
+ session: {
54
+ get: (id) => h["session.get"]({ id }),
55
+ set: (id, value) => h["session.set"]({ id, value }),
56
+ update: (id, updates) => h["session.update"]({ id, updates })
57
+ },
58
+ message: {
59
+ get: (id) => h["message.get"]({ id }),
60
+ set: (id, value) => h["message.set"]({ id, value }),
61
+ update: (id, updates) => h["message.update"]({ id, updates }),
62
+ listBySession: (sessionId) => h["message.listBySession"]({ sessionId })
63
+ },
64
+ part: {
65
+ get: (id) => h["part.get"]({ id }),
66
+ set: (id, value) => h["part.set"]({ id, value }),
67
+ listBySession: (sessionId) => h["part.listBySession"]({ sessionId })
68
+ },
69
+ sandbox: {
70
+ get: (id) => h["sandbox.get"]({ id }),
71
+ set: (id, value) => h["sandbox.set"]({ id, value }),
72
+ update: (id, updates) => h["sandbox.update"]({ id, updates })
73
+ },
74
+ setup: {
75
+ get: (id) => h["setup.get"]({ id }),
76
+ set: (id, value) => h["setup.set"]({ id, value })
77
+ }
78
+ };
79
+ }
80
+ function toStorage(h) {
81
+ return isStepFunction(h) ? fromStepFunction(h) : fromHandlers(h);
82
+ }
83
+
84
+ // src/storage/bindings/kv.ts
85
+ async function initKvStores(prefix) {
86
+ const { createKV } = await import("@vercel/kv2");
87
+ const kv = createKV({ prefix }).getStore("agent/");
88
+ return {
89
+ sessions: kv.getStore("session/"),
90
+ messages: kv.getStore("message/").withIndexes({
91
+ bySessionId: { key: (m) => m.sessionId }
92
+ }),
93
+ parts: kv.getStore("part/").withIndexes({
94
+ bySessionId: { key: (p) => p.sessionId }
95
+ }),
96
+ sandboxes: kv.getStore("sandbox/"),
97
+ setups: kv.getStore("setup/")
98
+ };
99
+ }
100
+ function kvStorageFallback(opts) {
101
+ let storesPromise;
102
+ function getStores() {
103
+ if (!storesPromise) {
104
+ storesPromise = initKvStores(opts.prefix);
105
+ }
106
+ return storesPromise;
107
+ }
108
+ const tag = `[agent.${opts.prefix}][kv2]`;
109
+ return {
110
+ "session.get": async ({ id }) => {
111
+ const { sessions } = await getStores();
112
+ return await sessions.getValue(id) ?? null;
113
+ },
114
+ "session.set": async ({ id, value }) => {
115
+ const { sessions } = await getStores();
116
+ await sessions.set(id, value);
117
+ },
118
+ "session.update": async ({ id, updates }) => {
119
+ const { sessions } = await getStores();
120
+ const existing = await sessions.getValue(id);
121
+ if (!existing) {
122
+ throw new Error(
123
+ `${tag}[session.update] no session found with id "${id}"`
124
+ );
125
+ }
126
+ const updated = { ...existing, ...updates };
127
+ await sessions.set(id, updated);
128
+ return updated;
129
+ },
130
+ "message.get": async ({ id }) => {
131
+ const { messages } = await getStores();
132
+ return await messages.getValue(id) ?? null;
133
+ },
134
+ "message.set": async ({ id, value }) => {
135
+ const { messages } = await getStores();
136
+ await messages.set(id, value);
137
+ },
138
+ "message.update": async ({ id, updates }) => {
139
+ const { messages } = await getStores();
140
+ const existing = await messages.getValue(id);
141
+ if (!existing) {
142
+ throw new Error(
143
+ `${tag}[message.update] no message found with id "${id}"`
144
+ );
145
+ }
146
+ const updated = { ...existing, ...updates };
147
+ await messages.set(id, updated);
148
+ return updated;
149
+ },
150
+ "message.listBySession": async ({ sessionId }) => {
151
+ const { messages } = await getStores();
152
+ const result = [];
153
+ for await (const [, entry] of messages.entries({
154
+ bySessionId: sessionId
155
+ })) {
156
+ result.push(await entry.value);
157
+ }
158
+ return result;
159
+ },
160
+ "part.get": async ({ id }) => {
161
+ const { parts } = await getStores();
162
+ return await parts.getValue(id) ?? null;
163
+ },
164
+ "part.set": async ({ id, value }) => {
165
+ const { parts } = await getStores();
166
+ await parts.set(id, value);
167
+ },
168
+ "part.listBySession": async ({ sessionId }) => {
169
+ const { parts } = await getStores();
170
+ const result = [];
171
+ for await (const [, entry] of parts.entries({
172
+ bySessionId: sessionId
173
+ })) {
174
+ result.push(await entry.value);
175
+ }
176
+ return result;
177
+ },
178
+ "sandbox.get": async ({ id }) => {
179
+ const { sandboxes } = await getStores();
180
+ return await sandboxes.getValue(id) ?? null;
181
+ },
182
+ "sandbox.set": async ({ id, value }) => {
183
+ const { sandboxes } = await getStores();
184
+ await sandboxes.set(id, value);
185
+ },
186
+ "sandbox.update": async ({ id, updates }) => {
187
+ const { sandboxes } = await getStores();
188
+ const existing = await sandboxes.getValue(id);
189
+ if (!existing) {
190
+ throw new Error(
191
+ `${tag}[sandbox.update] no sandbox found with id "${id}"`
192
+ );
193
+ }
194
+ const updated = { ...existing, ...updates };
195
+ await sandboxes.set(id, updated);
196
+ return updated;
197
+ },
198
+ "setup.get": async ({ id }) => {
199
+ const { setups } = await getStores();
200
+ return await setups.getValue(id) ?? null;
201
+ },
202
+ "setup.set": async ({ id, value }) => {
203
+ const { setups } = await getStores();
204
+ await setups.set(id, value);
205
+ }
206
+ };
207
+ }
208
+
209
+ // src/storage/bindings/local.ts
210
+ var _fs;
211
+ var _path;
212
+ async function fs() {
213
+ if (!_fs) {
214
+ _fs = await import("fs/promises");
215
+ }
216
+ return _fs;
217
+ }
218
+ async function path() {
219
+ if (!_path) {
220
+ _path = await import("path");
221
+ }
222
+ return _path;
223
+ }
224
+ function createStore(dir) {
225
+ const filePath = async (key) => (await path()).join(dir, `${key}.json`);
226
+ return {
227
+ async get(key) {
228
+ try {
229
+ const data = await (await fs()).readFile(await filePath(key), "utf-8");
230
+ return JSON.parse(data);
231
+ } catch {
232
+ return null;
233
+ }
234
+ },
235
+ async set(key, value) {
236
+ const p = await filePath(key);
237
+ const { mkdir, writeFile } = await fs();
238
+ const { dirname } = await path();
239
+ await mkdir(dirname(p), { recursive: true });
240
+ await writeFile(p, JSON.stringify(value, null, 2));
241
+ },
242
+ async update(key, updates) {
243
+ const p = await filePath(key);
244
+ const { readFile, mkdir, writeFile } = await fs();
245
+ const { dirname } = await path();
246
+ let existing;
247
+ try {
248
+ const data = await readFile(p, "utf-8");
249
+ existing = JSON.parse(data);
250
+ } catch {
251
+ throw new Error(`Not found: ${key}`);
252
+ }
253
+ const updated = { ...existing, ...updates };
254
+ await mkdir(dirname(p), { recursive: true });
255
+ await writeFile(p, JSON.stringify(updated, null, 2));
256
+ return updated;
257
+ }
258
+ };
259
+ }
260
+ async function readAllFromDir(dir) {
261
+ const { readdir, readFile } = await fs();
262
+ const { join } = await path();
263
+ let files;
264
+ try {
265
+ files = await readdir(dir);
266
+ } catch {
267
+ return [];
268
+ }
269
+ const result = [];
270
+ for (const file of files) {
271
+ if (!file.endsWith(".json")) {
272
+ continue;
273
+ }
274
+ try {
275
+ const data = await readFile(join(dir, file), "utf-8");
276
+ result.push(JSON.parse(data));
277
+ } catch {
278
+ }
279
+ }
280
+ return result;
281
+ }
282
+ function localStorage(opts) {
283
+ const dir = opts?.dir ?? ".agent";
284
+ const sessionStore = createStore(`${dir}/session`);
285
+ const messageStore = createStore(`${dir}/message`);
286
+ const partStore = createStore(`${dir}/part`);
287
+ const sandboxStore = createStore(`${dir}/sandbox`);
288
+ const setupStore = createStore(`${dir}/setup`);
289
+ const messageDir = `${dir}/message`;
290
+ const partDir = `${dir}/part`;
291
+ return {
292
+ "session.get": ({ id }) => sessionStore.get(id),
293
+ "session.set": ({ id, value }) => sessionStore.set(id, value),
294
+ "session.update": ({ id, updates }) => sessionStore.update(id, updates),
295
+ "message.get": ({ id }) => messageStore.get(id),
296
+ "message.set": ({ id, value }) => messageStore.set(id, value),
297
+ "message.update": ({ id, updates }) => messageStore.update(id, updates),
298
+ "message.listBySession": async ({ sessionId }) => {
299
+ const all = await readAllFromDir(messageDir);
300
+ return all.filter((m) => m.sessionId === sessionId);
301
+ },
302
+ "part.get": ({ id }) => partStore.get(id),
303
+ "part.set": ({ id, value }) => partStore.set(id, value),
304
+ "part.listBySession": async ({ sessionId }) => {
305
+ const all = await readAllFromDir(partDir);
306
+ return all.filter((p) => p.sessionId === sessionId);
307
+ },
308
+ "sandbox.get": ({ id }) => sandboxStore.get(id),
309
+ "sandbox.set": ({ id, value }) => sandboxStore.set(id, value),
310
+ "sandbox.update": ({ id, updates }) => sandboxStore.update(id, updates),
311
+ "setup.get": ({ id }) => setupStore.get(id),
312
+ "setup.set": ({ id, value }) => setupStore.set(id, value)
313
+ };
314
+ }
315
+
316
+ // src/storage/should-fallback-kv2.ts
317
+ function shouldFallbackToKV2() {
318
+ return !!process.env.BLOB_READ_WRITE_TOKEN;
319
+ }
320
+
321
+ export {
322
+ StorageStep,
323
+ toStorage,
324
+ kvStorageFallback,
325
+ localStorage,
326
+ shouldFallbackToKV2
327
+ };
328
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvYWRhcHRlci50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy9rdi50cyIsICIuLi9zcmMvc3RvcmFnZS9iaW5kaW5ncy9sb2NhbC50cyIsICIuLi9zcmMvc3RvcmFnZS9zaG91bGQtZmFsbGJhY2sta3YyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBXT1JLRkxPV19ERVNFUklBTElaRSwgV09SS0ZMT1dfU0VSSUFMSVpFIH0gZnJvbSBcIkB3b3JrZmxvdy9zZXJkZVwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0LCBTYW5kYm94LCBTZXNzaW9uLCBTZXR1cCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlSGFuZGxlcnMgKHB1YmxpYywgZmxhdCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VIYW5kbGVycyA9IHtcbiAgXCJzZXNzaW9uLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTZXNzaW9uIHwgbnVsbD47XG4gIFwic2Vzc2lvbi5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTZXNzaW9uIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInNlc3Npb24udXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxTZXNzaW9uPjtcbiAgfSk6IFByb21pc2U8U2Vzc2lvbj47XG5cbiAgXCJtZXNzYWdlLmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNZXNzYWdlIHwgbnVsbD47XG4gIFwibWVzc2FnZS5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBNZXNzYWdlIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcIm1lc3NhZ2UudXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxNZXNzYWdlPjtcbiAgfSk6IFByb21pc2U8TWVzc2FnZT47XG4gIFwibWVzc2FnZS5saXN0QnlTZXNzaW9uXCIocDogeyBzZXNzaW9uSWQ6IHN0cmluZyB9KTogUHJvbWlzZTxNZXNzYWdlW10+O1xuXG4gIFwicGFydC5nZXRcIihwOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8UGFydCB8IG51bGw+O1xuICBcInBhcnQuc2V0XCIocDogeyBpZDogc3RyaW5nOyB2YWx1ZTogUGFydCB9KTogUHJvbWlzZTx2b2lkPjtcbiAgXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIihwOiB7IHNlc3Npb25JZDogc3RyaW5nIH0pOiBQcm9taXNlPFBhcnRbXT47XG5cbiAgXCJzYW5kYm94LmdldFwiKHA6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTxTYW5kYm94IHwgbnVsbD47XG4gIFwic2FuZGJveC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTYW5kYm94IH0pOiBQcm9taXNlPHZvaWQ+O1xuICBcInNhbmRib3gudXBkYXRlXCIocDoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXBkYXRlczogUGFydGlhbDxTYW5kYm94PjtcbiAgfSk6IFByb21pc2U8U2FuZGJveD47XG5cbiAgXCJzZXR1cC5nZXRcIihwOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8U2V0dXAgfCBudWxsPjtcbiAgXCJzZXR1cC5zZXRcIihwOiB7IGlkOiBzdHJpbmc7IHZhbHVlOiBTZXR1cCB9KTogUHJvbWlzZTx2b2lkPjtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTdG9yYWdlQ2FsbCAoZGVyaXZlZCBmcm9tIFN0b3JhZ2VIYW5kbGVycykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VDYWxsID0ge1xuICBbSyBpbiBrZXlvZiBTdG9yYWdlSGFuZGxlcnNdOiB7IG1ldGhvZDogSyB9ICYgUGFyYW1ldGVyczxcbiAgICBTdG9yYWdlSGFuZGxlcnNbS11cbiAgPlswXTtcbn1ba2V5b2YgU3RvcmFnZUhhbmRsZXJzXTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2VTdGVwIChzZXJpYWxpemFibGUgYWNyb3NzIHdvcmtmbG93IGJvdW5kYXJ5KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTdGVwIHtcbiAgZXZlbnQ6IFN0b3JhZ2VDYWxsO1xuXG4gIGNvbnN0cnVjdG9yKGV2ZW50OiBTdG9yYWdlQ2FsbCkge1xuICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfU0VSSUFMSVpFXShpbnN0YW5jZTogU3RvcmFnZVN0ZXApIHtcbiAgICByZXR1cm4geyBldmVudDogaW5zdGFuY2UuZXZlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBbV09SS0ZMT1dfREVTRVJJQUxJWkVdKGRhdGE6IHsgZXZlbnQ6IFN0b3JhZ2VDYWxsIH0pIHtcbiAgICByZXR1cm4gbmV3IFN0b3JhZ2VTdGVwKGRhdGEuZXZlbnQpO1xuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBzYWZlIGRpc3BhdGNoIFx1MjAxNCBldmVudC5tZXRob2Qgc2VsZWN0cyB0aGUgbWF0Y2hpbmcgaGFuZGxlclxuICBvbihoYW5kbGVyczogU3RvcmFnZUhhbmRsZXJzKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHNlZSBhYm92ZVxuICAgIHJldHVybiAoaGFuZGxlcnNbdGhpcy5ldmVudC5tZXRob2RdIGFzIGFueSkodGhpcy5ldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYWxsIHN0b3JhZ2Ugb3BlcmF0aW9ucy4gSW50ZW5kZWQgdG8gYmVcbiAqIG1hcmtlZCB3aXRoIGBcInVzZSBzdGVwXCJgIHNvIHRoYXQgaXRzIGJvZHkgKGFuZCBOb2RlLmpzLWRlcGVuZGVudFxuICogaW1wb3J0cyBsaWtlIGRhdGFiYXNlIGNsaWVudHMpIGlzIGV4dHJhY3RlZCBieSB0aGUgd29ya2Zsb3cgYnVuZGxlclxuICogYW5kIHJ1bnMgc2VydmVyLXNpZGUuXG4gKlxuICogVGhlIHN0ZXAgcmVjZWl2ZXMgYSBgU3RvcmFnZVN0ZXBgIGluc3RhbmNlIChzZXJpYWxpemFibGUgdmlhXG4gKiBgQHdvcmtmbG93L3NlcmRlYCkgYW5kIHNob3VsZCBjYWxsIGBzdGVwLmhhbmRsZSh7IC4uLiB9KWAgd2l0aCBhXG4gKiBgU3RvcmFnZUhhbmRsZXJzYCBtYXAuXG4gKi9cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogc3RlcCBmdW5jdGlvbiBpcyBhIGRpc3BhdGNoZXI7IHR5cGUgc2FmZXR5IGlzIGF0IHRoZSBoYW5kbGVycyBsZXZlbFxuZXhwb3J0IHR5cGUgU3RvcmFnZVN0ZXBGdW5jdGlvbiA9IChzdG9yZTogU3RvcmFnZVN0ZXApID0+IFByb21pc2U8YW55PjtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0b3JhZ2UgKGludGVybmFsLCBuZXN0ZWQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2Uge1xuICBzZXNzaW9uOiB7XG4gICAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uIHwgbnVsbD47XG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogU2Vzc2lvbik6IFByb21pc2U8dm9pZD47XG4gICAgdXBkYXRlKGtleTogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPFNlc3Npb24+KTogUHJvbWlzZTxTZXNzaW9uPjtcbiAgfTtcbiAgbWVzc2FnZToge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZSB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVwZGF0ZShrZXk6IHN0cmluZywgdXBkYXRlczogUGFydGlhbDxNZXNzYWdlPik6IFByb21pc2U8TWVzc2FnZT47XG4gICAgbGlzdEJ5U2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8TWVzc2FnZVtdPjtcbiAgfTtcbiAgcGFydDoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8UGFydCB8IG51bGw+O1xuICAgIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFBhcnQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGxpc3RCeVNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPFBhcnRbXT47XG4gIH07XG4gIHNhbmRib3g6IHtcbiAgICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFNhbmRib3ggfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTYW5kYm94KTogUHJvbWlzZTx2b2lkPjtcbiAgICB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8U2FuZGJveD4pOiBQcm9taXNlPFNhbmRib3g+O1xuICB9O1xuICBzZXR1cDoge1xuICAgIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8U2V0dXAgfCBudWxsPjtcbiAgICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTZXR1cCk6IFByb21pc2U8dm9pZD47XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VJbnB1dCA9IFN0b3JhZ2VIYW5kbGVycyB8IFN0b3JhZ2VTdGVwRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzU3RlcEZ1bmN0aW9uKGg6IFN0b3JhZ2VJbnB1dCk6IGggaXMgU3RvcmFnZVN0ZXBGdW5jdGlvbiB7XG4gIHJldHVybiB0eXBlb2YgaCA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiBmcm9tU3RlcEZ1bmN0aW9uKGZuOiBTdG9yYWdlU3RlcEZ1bmN0aW9uKTogU3RvcmFnZSB7XG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbjoge1xuICAgICAgZ2V0OiAoaWQpID0+IGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLmdldFwiLCBpZCB9KSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJzZXNzaW9uLnVwZGF0ZVwiLCBpZCwgdXBkYXRlcyB9KSksXG4gICAgfSxcbiAgICBtZXNzYWdlOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2UuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2Uuc2V0XCIsIGlkLCB2YWx1ZSB9KSksXG4gICAgICB1cGRhdGU6IChpZCwgdXBkYXRlcykgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcIm1lc3NhZ2UudXBkYXRlXCIsIGlkLCB1cGRhdGVzIH0pKSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIiwgc2Vzc2lvbklkIH0pKSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwicGFydC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIGxpc3RCeVNlc3Npb246IChzZXNzaW9uSWQpID0+XG4gICAgICAgIGZuKG5ldyBTdG9yYWdlU3RlcCh7IG1ldGhvZDogXCJwYXJ0Lmxpc3RCeVNlc3Npb25cIiwgc2Vzc2lvbklkIH0pKSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC5nZXRcIiwgaWQgfSkpLFxuICAgICAgc2V0OiAoaWQsIHZhbHVlKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC5zZXRcIiwgaWQsIHZhbHVlIH0pKSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PlxuICAgICAgICBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2FuZGJveC51cGRhdGVcIiwgaWQsIHVwZGF0ZXMgfSkpLFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogKGlkKSA9PiBmbihuZXcgU3RvcmFnZVN0ZXAoeyBtZXRob2Q6IFwic2V0dXAuZ2V0XCIsIGlkIH0pKSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT5cbiAgICAgICAgZm4obmV3IFN0b3JhZ2VTdGVwKHsgbWV0aG9kOiBcInNldHVwLnNldFwiLCBpZCwgdmFsdWUgfSkpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZyb21IYW5kbGVycyhoOiBTdG9yYWdlSGFuZGxlcnMpOiBTdG9yYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uOiB7XG4gICAgICBnZXQ6IChpZCkgPT4gaFtcInNlc3Npb24uZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzZXNzaW9uLnNldFwiXSh7IGlkLCB2YWx1ZSB9KSxcbiAgICAgIHVwZGF0ZTogKGlkLCB1cGRhdGVzKSA9PiBoW1wic2Vzc2lvbi51cGRhdGVcIl0oeyBpZCwgdXBkYXRlcyB9KSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wibWVzc2FnZS5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcIm1lc3NhZ2Uuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+IGhbXCJtZXNzYWdlLnVwZGF0ZVwiXSh7IGlkLCB1cGRhdGVzIH0pLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogKHNlc3Npb25JZCkgPT4gaFtcIm1lc3NhZ2UubGlzdEJ5U2Vzc2lvblwiXSh7IHNlc3Npb25JZCB9KSxcbiAgICB9LFxuICAgIHBhcnQ6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wicGFydC5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcInBhcnQuc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgbGlzdEJ5U2Vzc2lvbjogKHNlc3Npb25JZCkgPT4gaFtcInBhcnQubGlzdEJ5U2Vzc2lvblwiXSh7IHNlc3Npb25JZCB9KSxcbiAgICB9LFxuICAgIHNhbmRib3g6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wic2FuZGJveC5nZXRcIl0oeyBpZCB9KSxcbiAgICAgIHNldDogKGlkLCB2YWx1ZSkgPT4gaFtcInNhbmRib3guc2V0XCJdKHsgaWQsIHZhbHVlIH0pLFxuICAgICAgdXBkYXRlOiAoaWQsIHVwZGF0ZXMpID0+IGhbXCJzYW5kYm94LnVwZGF0ZVwiXSh7IGlkLCB1cGRhdGVzIH0pLFxuICAgIH0sXG4gICAgc2V0dXA6IHtcbiAgICAgIGdldDogKGlkKSA9PiBoW1wic2V0dXAuZ2V0XCJdKHsgaWQgfSksXG4gICAgICBzZXQ6IChpZCwgdmFsdWUpID0+IGhbXCJzZXR1cC5zZXRcIl0oeyBpZCwgdmFsdWUgfSksXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RvcmFnZShoOiBTdG9yYWdlSW5wdXQpOiBTdG9yYWdlIHtcbiAgcmV0dXJuIGlzU3RlcEZ1bmN0aW9uKGgpID8gZnJvbVN0ZXBGdW5jdGlvbihoKSA6IGZyb21IYW5kbGVycyhoKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFN0b3JhZ2VIYW5kbGVycyB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFBhcnQsIFNhbmRib3gsIFNlc3Npb24sIFNldHVwIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbnR5cGUgS3ZTdG9yZXMgPSBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGluaXRLdlN0b3Jlcz4+O1xuXG5hc3luYyBmdW5jdGlvbiBpbml0S3ZTdG9yZXMocHJlZml4OiBzdHJpbmcpIHtcbiAgY29uc3QgeyBjcmVhdGVLViB9ID0gYXdhaXQgaW1wb3J0KFwiQHZlcmNlbC9rdjJcIik7XG4gIGNvbnN0IGt2ID0gY3JlYXRlS1YoeyBwcmVmaXggfSkuZ2V0U3RvcmUoXCJhZ2VudC9cIik7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uczoga3YuZ2V0U3RvcmU8U2Vzc2lvbj4oXCJzZXNzaW9uL1wiKSxcbiAgICBtZXNzYWdlczoga3YuZ2V0U3RvcmU8TWVzc2FnZT4oXCJtZXNzYWdlL1wiKS53aXRoSW5kZXhlcyh7XG4gICAgICBieVNlc3Npb25JZDogeyBrZXk6IChtOiBNZXNzYWdlKSA9PiBtLnNlc3Npb25JZCB9LFxuICAgIH0pLFxuICAgIHBhcnRzOiBrdi5nZXRTdG9yZTxQYXJ0PihcInBhcnQvXCIpLndpdGhJbmRleGVzKHtcbiAgICAgIGJ5U2Vzc2lvbklkOiB7IGtleTogKHA6IFBhcnQpID0+IHAuc2Vzc2lvbklkIH0sXG4gICAgfSksXG4gICAgc2FuZGJveGVzOiBrdi5nZXRTdG9yZTxTYW5kYm94PihcInNhbmRib3gvXCIpLFxuICAgIHNldHVwczoga3YuZ2V0U3RvcmU8U2V0dXA+KFwic2V0dXAvXCIpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga3ZTdG9yYWdlRmFsbGJhY2sob3B0czogeyBwcmVmaXg6IHN0cmluZyB9KTogU3RvcmFnZUhhbmRsZXJzIHtcbiAgbGV0IHN0b3Jlc1Byb21pc2U6IFByb21pc2U8S3ZTdG9yZXM+IHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGdldFN0b3JlcygpIHtcbiAgICBpZiAoIXN0b3Jlc1Byb21pc2UpIHtcbiAgICAgIHN0b3Jlc1Byb21pc2UgPSBpbml0S3ZTdG9yZXMob3B0cy5wcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmVzUHJvbWlzZTtcbiAgfVxuXG4gIGNvbnN0IHRhZyA9IGBbYWdlbnQuJHtvcHRzLnByZWZpeH1dW2t2Ml1gO1xuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25zIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgc2Vzc2lvbnMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25zIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IHNlc3Npb25zLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24udXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbnMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXNzaW9ucy5nZXRWYWx1ZShpZCk7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHt0YWd9W3Nlc3Npb24udXBkYXRlXSBubyBzZXNzaW9uIGZvdW5kIHdpdGggaWQgXCIke2lkfVwiYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIGF3YWl0IHNlc3Npb25zLnNldChpZCwgdXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgbWVzc2FnZXMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2Uuc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IG1lc3NhZ2VzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IG1lc3NhZ2VzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcIm1lc3NhZ2UudXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBtZXNzYWdlcy5nZXRWYWx1ZShpZCk7XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHt0YWd9W21lc3NhZ2UudXBkYXRlXSBubyBtZXNzYWdlIGZvdW5kIHdpdGggaWQgXCIke2lkfVwiYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIGF3YWl0IG1lc3NhZ2VzLnNldChpZCwgdXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIjogYXN5bmMgKHsgc2Vzc2lvbklkIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgY29uc3QgcmVzdWx0OiBNZXNzYWdlW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgWywgZW50cnldIG9mIG1lc3NhZ2VzLmVudHJpZXMoe1xuICAgICAgICBieVNlc3Npb25JZDogc2Vzc2lvbklkLFxuICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXdhaXQgZW50cnkudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgXCJwYXJ0LmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCB7IHBhcnRzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgcGFydHMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInBhcnQuc2V0XCI6IGFzeW5jICh7IGlkLCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCB7IHBhcnRzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGF3YWl0IHBhcnRzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBwYXJ0cyB9ID0gYXdhaXQgZ2V0U3RvcmVzKCk7XG4gICAgICBjb25zdCByZXN1bHQ6IFBhcnRbXSA9IFtdO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBbLCBlbnRyeV0gb2YgcGFydHMuZW50cmllcyh7XG4gICAgICAgIGJ5U2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICB9KSkge1xuICAgICAgICByZXN1bHQucHVzaChhd2FpdCBlbnRyeS52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2FuZGJveGVzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIHJldHVybiAoYXdhaXQgc2FuZGJveGVzLmdldFZhbHVlKGlkKSkgPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LnNldFwiOiBhc3luYyAoeyBpZCwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzYW5kYm94ZXMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgYXdhaXQgc2FuZGJveGVzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gudXBkYXRlXCI6IGFzeW5jICh7IGlkLCB1cGRhdGVzIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgc2FuZGJveGVzIH0gPSBhd2FpdCBnZXRTdG9yZXMoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2FuZGJveGVzLmdldFZhbHVlKGlkKTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke3RhZ31bc2FuZGJveC51cGRhdGVdIG5vIHNhbmRib3ggZm91bmQgd2l0aCBpZCBcIiR7aWR9XCJgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkID0geyAuLi5leGlzdGluZywgLi4udXBkYXRlcyB9O1xuICAgICAgYXdhaXQgc2FuZGJveGVzLnNldChpZCwgdXBkYXRlZCk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuXG4gICAgXCJzZXR1cC5nZXRcIjogYXN5bmMgKHsgaWQgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzZXR1cHMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgcmV0dXJuIChhd2FpdCBzZXR1cHMuZ2V0VmFsdWUoaWQpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNldHVwLnNldFwiOiBhc3luYyAoeyBpZCwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgeyBzZXR1cHMgfSA9IGF3YWl0IGdldFN0b3JlcygpO1xuICAgICAgYXdhaXQgc2V0dXBzLnNldChpZCwgdmFsdWUpO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTdG9yYWdlSGFuZGxlcnMgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0LCBTYW5kYm94LCBTZXNzaW9uLCBTZXR1cCB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5sZXQgX2ZzOiB0eXBlb2YgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKSB8IHVuZGVmaW5lZDtcbmxldCBfcGF0aDogdHlwZW9mIGltcG9ydChcIm5vZGU6cGF0aFwiKSB8IHVuZGVmaW5lZDtcblxuYXN5bmMgZnVuY3Rpb24gZnMoKSB7XG4gIGlmICghX2ZzKSB7XG4gICAgX2ZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgfVxuICByZXR1cm4gX2ZzO1xufVxuYXN5bmMgZnVuY3Rpb24gcGF0aCgpIHtcbiAgaWYgKCFfcGF0aCkge1xuICAgIF9wYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICB9XG4gIHJldHVybiBfcGF0aDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RvcmU8VD4oZGlyOiBzdHJpbmcpIHtcbiAgY29uc3QgZmlsZVBhdGggPSBhc3luYyAoa2V5OiBzdHJpbmcpID0+XG4gICAgKGF3YWl0IHBhdGgoKSkuam9pbihkaXIsIGAke2tleX0uanNvbmApO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IChhd2FpdCBmcygpKS5yZWFkRmlsZShhd2FpdCBmaWxlUGF0aChrZXkpLCBcInV0Zi04XCIpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKSBhcyBUO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcCA9IGF3YWl0IGZpbGVQYXRoKGtleSk7XG4gICAgICBjb25zdCB7IG1rZGlyLCB3cml0ZUZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gICAgICBjb25zdCB7IGRpcm5hbWUgfSA9IGF3YWl0IHBhdGgoKTtcbiAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHAsIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSk7XG4gICAgfSxcbiAgICBhc3luYyB1cGRhdGUoa2V5OiBzdHJpbmcsIHVwZGF0ZXM6IFBhcnRpYWw8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgIGNvbnN0IHAgPSBhd2FpdCBmaWxlUGF0aChrZXkpO1xuICAgICAgY29uc3QgeyByZWFkRmlsZSwgbWtkaXIsIHdyaXRlRmlsZSB9ID0gYXdhaXQgZnMoKTtcbiAgICAgIGNvbnN0IHsgZGlybmFtZSB9ID0gYXdhaXQgcGF0aCgpO1xuICAgICAgbGV0IGV4aXN0aW5nOiBUO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKHAsIFwidXRmLThcIik7XG4gICAgICAgIGV4aXN0aW5nID0gSlNPTi5wYXJzZShkYXRhKSBhcyBUO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGZvdW5kOiAke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7IC4uLmV4aXN0aW5nLCAuLi51cGRhdGVzIH07XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKHApLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShwLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkLCBudWxsLCAyKSk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQWxsRnJvbURpcjxUPihkaXI6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHsgcmVhZGRpciwgcmVhZEZpbGUgfSA9IGF3YWl0IGZzKCk7XG4gIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgcGF0aCgpO1xuICBsZXQgZmlsZXM6IHN0cmluZ1tdO1xuICB0cnkge1xuICAgIGZpbGVzID0gYXdhaXQgcmVhZGRpcihkaXIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcmVzdWx0OiBUW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLCBmaWxlKSwgXCJ1dGYtOFwiKTtcbiAgICAgIHJlc3VsdC5wdXNoKEpTT04ucGFyc2UoZGF0YSkgYXMgVCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBza2lwIGNvcnJ1cHQgZmlsZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsU3RvcmFnZShvcHRzPzogeyBkaXI/OiBzdHJpbmcgfSk6IFN0b3JhZ2VIYW5kbGVycyB7XG4gIGNvbnN0IGRpciA9IG9wdHM/LmRpciA/PyBcIi5hZ2VudFwiO1xuXG4gIGNvbnN0IHNlc3Npb25TdG9yZSA9IGNyZWF0ZVN0b3JlPFNlc3Npb24+KGAke2Rpcn0vc2Vzc2lvbmApO1xuICBjb25zdCBtZXNzYWdlU3RvcmUgPSBjcmVhdGVTdG9yZTxNZXNzYWdlPihgJHtkaXJ9L21lc3NhZ2VgKTtcbiAgY29uc3QgcGFydFN0b3JlID0gY3JlYXRlU3RvcmU8UGFydD4oYCR7ZGlyfS9wYXJ0YCk7XG4gIGNvbnN0IHNhbmRib3hTdG9yZSA9IGNyZWF0ZVN0b3JlPFNhbmRib3g+KGAke2Rpcn0vc2FuZGJveGApO1xuICBjb25zdCBzZXR1cFN0b3JlID0gY3JlYXRlU3RvcmU8U2V0dXA+KGAke2Rpcn0vc2V0dXBgKTtcbiAgY29uc3QgbWVzc2FnZURpciA9IGAke2Rpcn0vbWVzc2FnZWA7XG4gIGNvbnN0IHBhcnREaXIgPSBgJHtkaXJ9L3BhcnRgO1xuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiAoeyBpZCB9KSA9PiBzZXNzaW9uU3RvcmUuZ2V0KGlkKSxcbiAgICBcInNlc3Npb24uc2V0XCI6ICh7IGlkLCB2YWx1ZSB9KSA9PiBzZXNzaW9uU3RvcmUuc2V0KGlkLCB2YWx1ZSksXG4gICAgXCJzZXNzaW9uLnVwZGF0ZVwiOiAoeyBpZCwgdXBkYXRlcyB9KSA9PiBzZXNzaW9uU3RvcmUudXBkYXRlKGlkLCB1cGRhdGVzKSxcblxuICAgIFwibWVzc2FnZS5nZXRcIjogKHsgaWQgfSkgPT4gbWVzc2FnZVN0b3JlLmdldChpZCksXG4gICAgXCJtZXNzYWdlLnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT4gbWVzc2FnZVN0b3JlLnNldChpZCwgdmFsdWUpLFxuICAgIFwibWVzc2FnZS51cGRhdGVcIjogKHsgaWQsIHVwZGF0ZXMgfSkgPT4gbWVzc2FnZVN0b3JlLnVwZGF0ZShpZCwgdXBkYXRlcyksXG4gICAgXCJtZXNzYWdlLmxpc3RCeVNlc3Npb25cIjogYXN5bmMgKHsgc2Vzc2lvbklkIH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbCA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPE1lc3NhZ2U+KG1lc3NhZ2VEaXIpO1xuICAgICAgcmV0dXJuIGFsbC5maWx0ZXIoKG0pID0+IG0uc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgIH0sXG5cbiAgICBcInBhcnQuZ2V0XCI6ICh7IGlkIH0pID0+IHBhcnRTdG9yZS5nZXQoaWQpLFxuICAgIFwicGFydC5zZXRcIjogKHsgaWQsIHZhbHVlIH0pID0+IHBhcnRTdG9yZS5zZXQoaWQsIHZhbHVlKSxcbiAgICBcInBhcnQubGlzdEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8UGFydD4ocGFydERpcik7XG4gICAgICByZXR1cm4gYWxsLmZpbHRlcigocCkgPT4gcC5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5nZXRcIjogKHsgaWQgfSkgPT4gc2FuZGJveFN0b3JlLmdldChpZCksXG4gICAgXCJzYW5kYm94LnNldFwiOiAoeyBpZCwgdmFsdWUgfSkgPT4gc2FuZGJveFN0b3JlLnNldChpZCwgdmFsdWUpLFxuICAgIFwic2FuZGJveC51cGRhdGVcIjogKHsgaWQsIHVwZGF0ZXMgfSkgPT4gc2FuZGJveFN0b3JlLnVwZGF0ZShpZCwgdXBkYXRlcyksXG5cbiAgICBcInNldHVwLmdldFwiOiAoeyBpZCB9KSA9PiBzZXR1cFN0b3JlLmdldChpZCksXG4gICAgXCJzZXR1cC5zZXRcIjogKHsgaWQsIHZhbHVlIH0pID0+IHNldHVwU3RvcmUuc2V0KGlkLCB2YWx1ZSksXG4gIH07XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZhbGxiYWNrVG9LVjIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXByb2Nlc3MuZW52LkJMT0JfUkVBRF9XUklURV9UT0tFTjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLHNCQUFzQiwwQkFBMEI7QUE4Q2xELElBQU0sY0FBTixNQUFNLGFBQVk7QUFBQSxFQUN2QjtBQUFBLEVBRUEsWUFBWSxPQUFvQjtBQUM5QixTQUFLLFFBQVE7QUFBQSxFQUNmO0FBQUEsRUFFQSxRQUFRLGtCQUFrQixFQUFFLFVBQXVCO0FBQ2pELFdBQU8sRUFBRSxPQUFPLFNBQVMsTUFBTTtBQUFBLEVBQ2pDO0FBQUEsRUFFQSxRQUFRLG9CQUFvQixFQUFFLE1BQThCO0FBQzFELFdBQU8sSUFBSSxhQUFZLEtBQUssS0FBSztBQUFBLEVBQ25DO0FBQUE7QUFBQSxFQUdBLEdBQUcsVUFBeUM7QUFFMUMsV0FBUSxTQUFTLEtBQUssTUFBTSxNQUFNLEVBQVUsS0FBSyxLQUFLO0FBQUEsRUFDeEQ7QUFDRjtBQStDQSxTQUFTLGVBQWUsR0FBMkM7QUFDakUsU0FBTyxPQUFPLE1BQU07QUFDdEI7QUFFQSxTQUFTLGlCQUFpQixJQUFrQztBQUMxRCxTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsTUFDUCxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLFFBQVEsZUFBZSxHQUFHLENBQUMsQ0FBQztBQUFBLE1BQzlELEtBQUssQ0FBQyxJQUFJLFVBQ1IsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGVBQWUsSUFBSSxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQzFELFFBQVEsQ0FBQyxJQUFJLFlBQ1gsR0FBRyxJQUFJLFlBQVksRUFBRSxRQUFRLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxDQUFDO0FBQUEsSUFDakU7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsUUFBUSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FB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QU87QUFBQSxJQUNMLGVBQWUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxhQUFhLElBQUksRUFBRTtBQUFBLElBQzlDLGVBQWUsQ0FBQyxFQUFFLElBQUksTUFBTSxNQUFNLGFBQWEsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUM1RCxrQkFBa0IsQ0FBQyxFQUFFLElBQUksUUFBUSxNQUFNLGFBQWEsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUV0RSxlQUFlLENBQUMsRUFBRSxHQUFHLE1BQU0sYUFBYSxJQUFJLEVBQUU7QUFBQSxJQUM5QyxlQUFlLENBQUMsRUFBRSxJQUFJLE1BQU0sTUFBTSxhQUFhLElBQUksSUFBSSxLQUFLO0FBQUEsSUFDNUQsa0JBQWtCLENBQUMsRUFBRSxJQUFJLFFBQVEsTUFBTSxhQUFhLE9BQU8sSUFBSSxPQUFPO0FBQUEsSUFDdEUseUJBQXlCLE9BQU8sRUFBRSxVQUFVLE1BQU07QUFDaEQsWUFBTSxNQUFNLE1BQU0sZUFBd0IsVUFBVTtBQUNwRCxhQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxjQUFjLFNBQVM7QUFBQSxJQUNwRDtBQUFBLElBRUEsWUFBWSxDQUFDLEVBQUUsR0FBRyxNQUFNLFVBQVUsSUFBSSxFQUFFO0FBQUEsSUFDeEMsWUFBWSxDQUFDLEVBQUUsSUFBSSxNQUFNLE1BQU0sVUFBVSxJQUFJLElBQUksS0FBSztBQUFBLElBQ3RELHNCQUFzQixPQUFPLEVBQUUsVUFBVSxNQUFNO0FBQzdDLFlBQU0sTUFBTSxNQUFNLGVBQXFCLE9BQU87QUFDOUMsYUFBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxTQUFTO0FBQUEsSUFDcEQ7QUFBQSxJQUVBLGVBQWUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxhQUFhLElBQUksRUFBRTtBQUFBLElBQzlDLGVBQWUsQ0FBQyxFQUFFLElBQUksTUFBTSxNQUFNLGFBQWEsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUM1RCxrQkFBa0IsQ0FBQyxFQUFFLElBQUksUUFBUSxNQUFNLGFBQWEsT0FBTyxJQUFJLE9BQU87QUFBQSxJQUV0RSxhQUFhLENBQUMsRUFBRSxHQUFHLE1BQU0sV0FBVyxJQUFJLEVBQUU7QUFBQSxJQUMxQyxhQUFhLENBQUMsRUFBRSxJQUFJLE1BQU0sTUFBTSxXQUFXLElBQUksSUFBSSxLQUFLO0FBQUEsRUFDMUQ7QUFDRjs7O0FDeEhPLFNBQVMsc0JBQStCO0FBQzdDLFNBQU8sQ0FBQyxDQUFDLFFBQVEsSUFBSTtBQUN2QjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,107 @@
1
+ import {
2
+ createLogger
3
+ } from "./chunk-MSWINCCM.mjs";
4
+
5
+ // src/sandbox/bindings/vercel-lifecycle/steps.ts
6
+ async function loadSandboxSDK() {
7
+ return (await import("@vercel/sandbox")).Sandbox;
8
+ }
9
+ var DEFAULT_POLL_INTERVAL_MS = 2 * 60 * 1e3;
10
+ var DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
11
+ var SNAPSHOT_BEFORE_TIMEOUT_MS = 10 * 60 * 1e3;
12
+ var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
13
+ token: process.env.TEST_VERCEL_TOKEN,
14
+ teamId: process.env.TEST_VERCEL_TEAM_ID,
15
+ projectId: process.env.TEST_VERCEL_PROJECT_ID
16
+ } : {};
17
+ async function checkAndSnapshotStep(input) {
18
+ "use step";
19
+ const storage = input.agent.storage;
20
+ const log = createLogger({
21
+ config: { ...input.agent.options.logging, name: input.agent.name },
22
+ subsystem: "sandbox:lifecycle",
23
+ context: { sandboxId: input.sandboxId }
24
+ });
25
+ log.info("lifecycle check started", {
26
+ vercelSandboxId: input.vercelSandboxId
27
+ });
28
+ const record = await storage.sandbox.get(input.sandboxId);
29
+ if (!record) {
30
+ log.warn("sandbox record not found, exiting lifecycle");
31
+ return { action: "exit", reason: "not_found" };
32
+ }
33
+ const metadata = record.setup?.metadata;
34
+ const currentSandboxId = metadata?.sandboxId ?? null;
35
+ if (currentSandboxId !== input.vercelSandboxId) {
36
+ log.info("sandbox ID changed, exiting lifecycle", {
37
+ expected: input.vercelSandboxId,
38
+ actual: currentSandboxId
39
+ });
40
+ return { action: "exit", reason: "sandboxId_changed" };
41
+ }
42
+ if (!currentSandboxId) {
43
+ log.warn("no current sandbox ID in metadata, exiting lifecycle");
44
+ return { action: "exit", reason: "not_found" };
45
+ }
46
+ const pollIntervalMs = input.config?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
47
+ const idleTimeoutMs = input.config?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
48
+ const snapshotBeforeTimeoutMs = input.config?.snapshotBeforeTimeoutMs ?? SNAPSHOT_BEFORE_TIMEOUT_MS;
49
+ const now = Date.now();
50
+ const lastActivity = record.lastActiveAt ?? record.createdAt ?? now;
51
+ const idleDuration = now - lastActivity;
52
+ const shouldSnapshotDueToIdle = idleDuration > idleTimeoutMs;
53
+ let shouldSnapshotDueToTimeout = false;
54
+ try {
55
+ const SandboxSDK = await loadSandboxSDK();
56
+ const sandbox = await SandboxSDK.get({
57
+ sandboxId: currentSandboxId,
58
+ ...getTestCredentials()
59
+ });
60
+ if (sandbox.timeout < snapshotBeforeTimeoutMs) {
61
+ shouldSnapshotDueToTimeout = true;
62
+ }
63
+ } catch {
64
+ log.warn("failed to get sandbox from SDK, exiting lifecycle", {
65
+ vercelSandboxId: currentSandboxId
66
+ });
67
+ return { action: "exit", reason: "not_found" };
68
+ }
69
+ if (shouldSnapshotDueToIdle || shouldSnapshotDueToTimeout) {
70
+ const reason = shouldSnapshotDueToIdle ? "idle" : "timeout";
71
+ log.info("snapshotting sandbox before exit", {
72
+ reason,
73
+ idleDurationMs: idleDuration,
74
+ vercelSandboxId: currentSandboxId
75
+ });
76
+ try {
77
+ const SandboxSDK = await loadSandboxSDK();
78
+ const sandbox = await SandboxSDK.get({
79
+ sandboxId: currentSandboxId,
80
+ ...getTestCredentials()
81
+ });
82
+ const snapshot = await sandbox.snapshot();
83
+ log.info("snapshot created", { snapshotId: snapshot.snapshotId });
84
+ await storage.sandbox.update(input.sandboxId, {
85
+ setup: {
86
+ ...record.setup,
87
+ metadata: { sandboxId: null, snapshotId: snapshot.snapshotId }
88
+ }
89
+ });
90
+ log.info("sandbox record updated with snapshot");
91
+ } catch (e) {
92
+ log.error("failed to snapshot sandbox", { cause: e });
93
+ return e instanceof Error ? e : new Error(String(e));
94
+ }
95
+ return { action: "exit", reason };
96
+ }
97
+ log.info("sandbox still active, continuing lifecycle", {
98
+ idleDurationMs: idleDuration,
99
+ nextPollMs: pollIntervalMs
100
+ });
101
+ return { action: "continue", nextPollMs: pollIntervalMs };
102
+ }
103
+
104
+ export {
105
+ checkAndSnapshotStep
106
+ };
107
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLWxpZmVjeWNsZS9zdGVwcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTYW5kYm94IGFzIFZlcmNlbFNhbmRib3hTREsgfSBmcm9tIFwiQHZlcmNlbC9zYW5kYm94XCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbG9nZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hBZ2VudFJlZiB9IGZyb20gXCIuLi8uLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFZlcmNlbEJpbmRpbmdNZXRhZGF0YSB9IGZyb20gXCIuLi92ZXJjZWxcIjtcblxuYXN5bmMgZnVuY3Rpb24gbG9hZFNhbmRib3hTREsoKTogUHJvbWlzZTx0eXBlb2YgVmVyY2VsU2FuZGJveFNESz4ge1xuICByZXR1cm4gKGF3YWl0IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKSkuU2FuZGJveDtcbn1cblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlQ29uZmlnID0ge1xuICBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc3RvcEFmdGVySW5hY3RpdmVNcz86IG51bWJlcjtcbiAgc25hcHNob3RCZWZvcmVUaW1lb3V0TXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVJbnB1dCA9IHtcbiAgYWdlbnQ6IFNhbmRib3hBZ2VudFJlZjtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIHZlcmNlbFNhbmRib3hJZDogc3RyaW5nO1xuICBjb25maWc/OiBMaWZlY3ljbGVDb25maWc7XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRTbmFwc2hvdFN0ZXAoXG4gIGlucHV0OiBMaWZlY3ljbGVJbnB1dFxuKTogUHJvbWlzZTxFcnJvciB8IExpZmVjeWNsZVN0ZXBSZXN1bHQ+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuXG4gIGNvbnN0IHN0b3JhZ2UgPSBpbnB1dC5hZ2VudC5zdG9yYWdlO1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoe1xuICAgIGNvbmZpZzogeyAuLi5pbnB1dC5hZ2VudC5vcHRpb25zLmxvZ2dpbmcsIG5hbWU6IGlucHV0LmFnZW50Lm5hbWUgfSxcbiAgICBzdWJzeXN0ZW06IFwic2FuZGJveDpsaWZlY3ljbGVcIixcbiAgICBjb250ZXh0OiB7IHNhbmRib3hJZDogaW5wdXQuc2FuZGJveElkIH0sXG4gIH0pO1xuXG4gIGxvZy5pbmZvKFwibGlmZWN5Y2xlIGNoZWNrIHN0YXJ0ZWRcIiwge1xuICAgIHZlcmNlbFNhbmRib3hJZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICB9KTtcblxuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LnNhbmRib3hJZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgbG9nLndhcm4oXCJzYW5kYm94IHJlY29yZCBub3QgZm91bmQsIGV4aXRpbmcgbGlmZWN5Y2xlXCIpO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGEgPSByZWNvcmQuc2V0dXA/Lm1ldGFkYXRhIGFzIFZlcmNlbEJpbmRpbmdNZXRhZGF0YSB8IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRTYW5kYm94SWQgPSBtZXRhZGF0YT8uc2FuZGJveElkID8/IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIGxvZy5pbmZvKFwic2FuZGJveCBJRCBjaGFuZ2VkLCBleGl0aW5nIGxpZmVjeWNsZVwiLCB7XG4gICAgICBleHBlY3RlZDogaW5wdXQudmVyY2VsU2FuZGJveElkLFxuICAgICAgYWN0dWFsOiBjdXJyZW50U2FuZGJveElkLFxuICAgIH0pO1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICBsb2cud2FybihcIm5vIGN1cnJlbnQgc2FuZGJveCBJRCBpbiBtZXRhZGF0YSwgZXhpdGluZyBsaWZlY3ljbGVcIik7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBwb2xsSW50ZXJ2YWxNcyA9XG4gICAgaW5wdXQuY29uZmlnPy5wb2xsSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1BPTExfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIGlucHV0LmNvbmZpZz8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGlucHV0LmNvbmZpZz8uc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPz8gU05BUFNIT1RfQkVGT1JFX1RJTUVPVVRfTVM7XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgbGFzdEFjdGl2aXR5ID0gcmVjb3JkLmxhc3RBY3RpdmVBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgbG9nLndhcm4oXCJmYWlsZWQgdG8gZ2V0IHNhbmRib3ggZnJvbSBTREssIGV4aXRpbmcgbGlmZWN5Y2xlXCIsIHtcbiAgICAgIHZlcmNlbFNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGlmIChzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSB8fCBzaG91bGRTbmFwc2hvdER1ZVRvVGltZW91dCkge1xuICAgIGNvbnN0IHJlYXNvbiA9IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID8gXCJpZGxlXCIgOiBcInRpbWVvdXRcIjtcbiAgICBsb2cuaW5mbyhcInNuYXBzaG90dGluZyBzYW5kYm94IGJlZm9yZSBleGl0XCIsIHtcbiAgICAgIHJlYXNvbixcbiAgICAgIGlkbGVEdXJhdGlvbk1zOiBpZGxlRHVyYXRpb24sXG4gICAgICB2ZXJjZWxTYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgU2FuZGJveFNESy5nZXQoe1xuICAgICAgICBzYW5kYm94SWQ6IGN1cnJlbnRTYW5kYm94SWQsXG4gICAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHNhbmRib3guc25hcHNob3QoKTtcbiAgICAgIGxvZy5pbmZvKFwic25hcHNob3QgY3JlYXRlZFwiLCB7IHNuYXBzaG90SWQ6IHNuYXBzaG90LnNuYXBzaG90SWQgfSk7XG5cbiAgICAgIGF3YWl0IHN0b3JhZ2Uuc2FuZGJveC51cGRhdGUoaW5wdXQuc2FuZGJveElkLCB7XG4gICAgICAgIHNldHVwOiB7XG4gICAgICAgICAgLi4ucmVjb3JkLnNldHVwLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogbnVsbCwgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBsb2cuaW5mbyhcInNhbmRib3ggcmVjb3JkIHVwZGF0ZWQgd2l0aCBzbmFwc2hvdFwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gc25hcHNob3Qgc2FuZGJveFwiLCB7IGNhdXNlOiBlIH0pO1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uIH07XG4gIH1cblxuICBsb2cuaW5mbyhcInNhbmRib3ggc3RpbGwgYWN0aXZlLCBjb250aW51aW5nIGxpZmVjeWNsZVwiLCB7XG4gICAgaWRsZUR1cmF0aW9uTXM6IGlkbGVEdXJhdGlvbixcbiAgICBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyxcbiAgfSk7XG4gIHJldHVybiB7IGFjdGlvbjogXCJjb250aW51ZVwiLCBuZXh0UG9sbE1zOiBwb2xsSW50ZXJ2YWxNcyB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFLQSxlQUFlLGlCQUFtRDtBQUNoRSxVQUFRLE1BQU0sT0FBTyxpQkFBaUIsR0FBRztBQUMzQztBQUVBLElBQU0sMkJBQTJCLElBQUksS0FBSztBQUMxQyxJQUFNLDBCQUEwQixJQUFJLEtBQUs7QUFDekMsSUFBTSw2QkFBNkIsS0FBSyxLQUFLO0FBRTdDLElBQU0scUJBQXFCLE1BQ3pCLFFBQVEsSUFBSSxhQUFhLFNBQ3JCO0FBQUEsRUFDRSxPQUFPLFFBQVEsSUFBSTtBQUFBLEVBQ25CLFFBQVEsUUFBUSxJQUFJO0FBQUEsRUFDcEIsV0FBVyxRQUFRLElBQUk7QUFDekIsSUFDQSxDQUFDO0FBc0JQLGVBQXNCLHFCQUNwQixPQUNzQztBQUN0QztBQUVBLFFBQU0sVUFBVSxNQUFNLE1BQU07QUFDNUIsUUFBTSxNQUFNLGFBQWE7QUFBQSxJQUN2QixRQUFRLEVBQUUsR0FBRyxNQUFNLE1BQU0sUUFBUSxTQUFTLE1BQU0sTUFBTSxNQUFNLEtBQUs7QUFBQSxJQUNqRSxXQUFXO0FBQUEsSUFDWCxTQUFTLEVBQUUsV0FBVyxN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