experimental-agent 0.0.5 → 0.1.2

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 (40) hide show
  1. package/dist/agent-workflow.d.mts +1 -1
  2. package/dist/agent-workflow.d.ts +1 -1
  3. package/dist/agent-workflow.js +230 -139
  4. package/dist/agent-workflow.mjs +2 -2
  5. package/dist/{chunk-GJETDXOU.mjs → chunk-2SPAJ777.mjs} +5 -1
  6. package/dist/chunk-6J462JGP.mjs +1267 -0
  7. package/dist/{chunk-3ODWQVIA.mjs → chunk-BJTO5JO5.mjs} +1 -2
  8. package/dist/{chunk-CRDAPJEY.mjs → chunk-E7TOPGHY.mjs} +3 -3
  9. package/dist/chunk-ILPVXRI5.mjs +2026 -0
  10. package/dist/chunk-ORE6LK2L.mjs +344 -0
  11. package/dist/chunk-W4SSZPDX.mjs +106 -0
  12. package/dist/{client-9A8NO6x9.d.mts → client-CKLwB-ES.d.mts} +118 -15
  13. package/dist/{client-9A8NO6x9.d.ts → client-CKLwB-ES.d.ts} +118 -15
  14. package/dist/{client-5C4CNU6H.mjs → client-YUU54ZZH.mjs} +2 -2
  15. package/dist/client.mjs +1 -1
  16. package/dist/{handler-SZDTM3MC.mjs → handler-LDFBSCRA.mjs} +2 -2
  17. package/dist/index.d.mts +2 -2
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +333 -171
  20. package/dist/index.mjs +68 -32
  21. package/dist/lifecycle-workflow.d.mts +1 -1
  22. package/dist/lifecycle-workflow.d.ts +1 -1
  23. package/dist/lifecycle-workflow.js +18 -1
  24. package/dist/lifecycle-workflow.mjs +2 -2
  25. package/dist/local-fs-handlers-SY2RDXZE.mjs +314 -0
  26. package/dist/next/loader.js +6 -6
  27. package/dist/next/loader.mjs +3 -3
  28. package/dist/next.js +3 -3
  29. package/dist/next.mjs +5 -5
  30. package/dist/{process-manager-JAKAXROL.mjs → process-manager-ZCET3VD2.mjs} +1 -1
  31. package/dist/{sandbox-M24R3JLM.mjs → sandbox-GPCA35PJ.mjs} +3 -3
  32. package/dist/{storage-TMZQJ2OQ.mjs → storage-LL6IA24R.mjs} +3 -3
  33. package/dist/{vercel-WGN2NY3D.mjs → vercel-SD3JTECG.mjs} +1 -1
  34. package/dist/{vercel-sdk-UKBD5JDI.mjs → vercel-sdk-I6A4MVAN.mjs} +1 -1
  35. package/package.json +2 -2
  36. package/dist/chunk-2IIWVPZB.mjs +0 -334
  37. package/dist/chunk-CQB6AOJ7.mjs +0 -103
  38. package/dist/chunk-M2XPBOZD.mjs +0 -1980
  39. package/dist/chunk-ZWP7RQZT.mjs +0 -1239
  40. package/dist/local-fs-handlers-BZVA3XAU.mjs +0 -277
@@ -0,0 +1,344 @@
1
+ import {
2
+ MessageNotFoundError,
3
+ SandboxNotFoundError,
4
+ SessionNotFoundError,
5
+ StorageError
6
+ } from "./chunk-HJGPUEFC.mjs";
7
+
8
+ // src/storage/client.ts
9
+ function getStorageClient(rpcFn, name) {
10
+ async function rpc(method, params) {
11
+ const result = await rpcFn({ name, method, params });
12
+ if ("error" in result) {
13
+ throw new StorageError({ reason: result.error.message });
14
+ }
15
+ return result.result;
16
+ }
17
+ return {
18
+ session: {
19
+ get: async (id) => {
20
+ try {
21
+ const result = await rpc("session.get", { id });
22
+ if (result === null) {
23
+ return new SessionNotFoundError({ id });
24
+ }
25
+ return result;
26
+ } catch (e) {
27
+ if (e instanceof StorageError) {
28
+ return e;
29
+ }
30
+ return new StorageError({ reason: String(e), cause: e });
31
+ }
32
+ },
33
+ set: async (session) => {
34
+ try {
35
+ return await rpc("session.set", session);
36
+ } catch (e) {
37
+ if (e instanceof StorageError) {
38
+ return e;
39
+ }
40
+ return new StorageError({ reason: String(e), cause: e });
41
+ }
42
+ },
43
+ delete: async (id) => {
44
+ try {
45
+ await rpc("session.delete", { id });
46
+ } catch (e) {
47
+ if (e instanceof StorageError) {
48
+ return e;
49
+ }
50
+ return new StorageError({ reason: String(e), cause: e });
51
+ }
52
+ },
53
+ list: async (opts) => {
54
+ try {
55
+ return await rpc("session.list", {
56
+ tags: opts?.tags,
57
+ order: opts?.order,
58
+ cursor: opts?.cursor,
59
+ limit: opts?.limit
60
+ });
61
+ } catch (e) {
62
+ if (e instanceof StorageError) {
63
+ return e;
64
+ }
65
+ return new StorageError({ reason: String(e), cause: e });
66
+ }
67
+ },
68
+ tag: {
69
+ set: async ({ sessionId, tags }) => {
70
+ try {
71
+ return await rpc("session.tag.set", { sessionId, tags });
72
+ } catch (e) {
73
+ if (e instanceof StorageError) {
74
+ return e;
75
+ }
76
+ return new StorageError({ reason: String(e), cause: e });
77
+ }
78
+ }
79
+ }
80
+ },
81
+ message: {
82
+ list: async (sessionId, opts) => {
83
+ try {
84
+ return await rpc("message.list", {
85
+ sessionId,
86
+ cursor: opts?.cursor,
87
+ limit: opts?.limit
88
+ });
89
+ } catch (e) {
90
+ if (e instanceof StorageError) {
91
+ return e;
92
+ }
93
+ return new StorageError({ reason: String(e), cause: e });
94
+ }
95
+ },
96
+ get: async (id) => {
97
+ try {
98
+ const result = await rpc("message.get", { id });
99
+ if (result === null) {
100
+ return new MessageNotFoundError({ id });
101
+ }
102
+ return result;
103
+ } catch (e) {
104
+ if (e instanceof StorageError) {
105
+ return e;
106
+ }
107
+ return new StorageError({ reason: String(e), cause: e });
108
+ }
109
+ },
110
+ set: async (message) => {
111
+ try {
112
+ return await rpc("message.set", message);
113
+ } catch (e) {
114
+ if (e instanceof StorageError) {
115
+ return e;
116
+ }
117
+ return new StorageError({ reason: String(e), cause: e });
118
+ }
119
+ }
120
+ },
121
+ part: {
122
+ listByMessage: async (messageId, opts) => {
123
+ try {
124
+ const result = await rpc("part.listByMessage", {
125
+ messageId,
126
+ cursor: opts?.cursor,
127
+ limit: opts?.limit
128
+ });
129
+ return result;
130
+ } catch (e) {
131
+ if (e instanceof StorageError) {
132
+ return e;
133
+ }
134
+ return new StorageError({ reason: String(e), cause: e });
135
+ }
136
+ },
137
+ listBySession: async (sessionId, opts) => {
138
+ try {
139
+ const result = await rpc("part.listBySession", {
140
+ sessionId,
141
+ cursor: opts?.cursor,
142
+ limit: opts?.limit
143
+ });
144
+ return result;
145
+ } catch (e) {
146
+ if (e instanceof StorageError) {
147
+ return e;
148
+ }
149
+ return new StorageError({ reason: String(e), cause: e });
150
+ }
151
+ },
152
+ set: async (part) => {
153
+ try {
154
+ return await rpc("part.set", part);
155
+ } catch (e) {
156
+ if (e instanceof StorageError) {
157
+ return e;
158
+ }
159
+ return new StorageError({ reason: String(e), cause: e });
160
+ }
161
+ },
162
+ delete: async (id) => {
163
+ try {
164
+ await rpc("part.delete", { id });
165
+ } catch (e) {
166
+ if (e instanceof StorageError) {
167
+ return e;
168
+ }
169
+ return new StorageError({ reason: String(e), cause: e });
170
+ }
171
+ }
172
+ },
173
+ sandbox: {
174
+ get: async (key) => {
175
+ try {
176
+ const result = await rpc("sandbox.get", { key });
177
+ if (result === null) {
178
+ return new SandboxNotFoundError({ id: key });
179
+ }
180
+ return result;
181
+ } catch (e) {
182
+ if (e instanceof StorageError) {
183
+ return e;
184
+ }
185
+ return new StorageError({ reason: String(e), cause: e });
186
+ }
187
+ },
188
+ getBySession: async (sessionId) => {
189
+ try {
190
+ const result = await rpc("sandbox.getBySession", { sessionId });
191
+ if (result === null) {
192
+ return new SandboxNotFoundError({ id: sessionId });
193
+ }
194
+ return result;
195
+ } catch (e) {
196
+ if (e instanceof StorageError) {
197
+ return e;
198
+ }
199
+ return new StorageError({ reason: String(e), cause: e });
200
+ }
201
+ },
202
+ set: async (record) => {
203
+ try {
204
+ await rpc("sandbox.set", record);
205
+ return record;
206
+ } catch (e) {
207
+ if (e instanceof StorageError) {
208
+ return e;
209
+ }
210
+ return new StorageError({ reason: String(e), cause: e });
211
+ }
212
+ },
213
+ list: async (opts) => {
214
+ try {
215
+ return await rpc("sandbox.list", {
216
+ tags: opts?.tags,
217
+ order: opts?.order,
218
+ cursor: opts?.cursor,
219
+ limit: opts?.limit
220
+ });
221
+ } catch (e) {
222
+ if (e instanceof StorageError) {
223
+ return e;
224
+ }
225
+ return new StorageError({ reason: String(e), cause: e });
226
+ }
227
+ },
228
+ tag: {
229
+ set: async ({ sandboxId, tags }) => {
230
+ try {
231
+ return await rpc("sandbox.tag.set", { sandboxId, tags });
232
+ } catch (e) {
233
+ if (e instanceof StorageError) {
234
+ return e;
235
+ }
236
+ return new StorageError({ reason: String(e), cause: e });
237
+ }
238
+ }
239
+ },
240
+ acquireLock: async (record, lockTimeoutMs) => {
241
+ try {
242
+ return await rpc("sandbox.acquireLock", {
243
+ record,
244
+ lockTimeoutMs
245
+ });
246
+ } catch (e) {
247
+ if (e instanceof StorageError) {
248
+ return e;
249
+ }
250
+ return new StorageError({ reason: String(e), cause: e });
251
+ }
252
+ }
253
+ },
254
+ setup: {
255
+ get: async (key) => {
256
+ try {
257
+ return await rpc("setup.get", { key });
258
+ } catch (e) {
259
+ if (e instanceof StorageError) {
260
+ return e;
261
+ }
262
+ return new StorageError({ reason: String(e), cause: e });
263
+ }
264
+ },
265
+ set: async (snapshot) => {
266
+ try {
267
+ await rpc("setup.set", snapshot);
268
+ return snapshot;
269
+ } catch (e) {
270
+ if (e instanceof StorageError) {
271
+ return e;
272
+ }
273
+ return new StorageError({ reason: String(e), cause: e });
274
+ }
275
+ },
276
+ acquireLock: async (key, lockId, lockTimeoutMs) => {
277
+ try {
278
+ return await rpc("setup.acquireLock", {
279
+ key,
280
+ lockId,
281
+ lockTimeoutMs
282
+ });
283
+ } catch (e) {
284
+ if (e instanceof StorageError) {
285
+ return e;
286
+ }
287
+ return new StorageError({ reason: String(e), cause: e });
288
+ }
289
+ }
290
+ },
291
+ command: {
292
+ get: async (id) => {
293
+ try {
294
+ return await rpc("command.get", { id });
295
+ } catch (e) {
296
+ if (e instanceof StorageError) {
297
+ return e;
298
+ }
299
+ return new StorageError({ reason: String(e), cause: e });
300
+ }
301
+ },
302
+ set: async (command) => {
303
+ try {
304
+ return await rpc("command.set", command);
305
+ } catch (e) {
306
+ if (e instanceof StorageError) {
307
+ return e;
308
+ }
309
+ return new StorageError({ reason: String(e), cause: e });
310
+ }
311
+ },
312
+ list: async (sessionId, opts) => {
313
+ try {
314
+ const result = await rpc("command.list", {
315
+ sessionId,
316
+ includeFinished: opts?.includeFinished,
317
+ cursor: opts?.cursor,
318
+ limit: opts?.limit
319
+ });
320
+ return result;
321
+ } catch (e) {
322
+ if (e instanceof StorageError) {
323
+ return e;
324
+ }
325
+ return new StorageError({ reason: String(e), cause: e });
326
+ }
327
+ }
328
+ }
329
+ };
330
+ }
331
+ var DEFAULT_NAMESPACE = "default";
332
+ var LOCAL_STORAGE_VERSION = "v1";
333
+ function getStorage(opts) {
334
+ const name = opts.config.name ?? DEFAULT_NAMESPACE;
335
+ return getStorageClient(opts.rpc, name);
336
+ }
337
+
338
+ export {
339
+ getStorageClient,
340
+ DEFAULT_NAMESPACE,
341
+ LOCAL_STORAGE_VERSION,
342
+ getStorage
343
+ };
344
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvY2xpZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBNZXNzYWdlTm90Rm91bmRFcnJvcixcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxuICBTdG9yYWdlRXJyb3IsXG59IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmFnZU1ldGhvZHMgfSBmcm9tIFwiLi9ycGNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWFuZCxcbiAgTGlzdFJlc3VsdCxcbiAgUGFydCxcbiAgU2V0dXBTbmFwc2hvdCxcbiAgU3RvcmFnZSxcbiAgU3RvcmFnZUNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxudHlwZSBScGNSZXNwb25zZTxUPiA9XG4gIHwgeyByZXN1bHQ6IFQgfVxuICB8IHsgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB9O1xuXG5leHBvcnQgdHlwZSBScGNGbiA9IChwYXJhbXM6IHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn0pID0+IFByb21pc2U8UnBjUmVzcG9uc2U8dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZUNsaWVudChycGNGbjogUnBjRm4sIG5hbWU/OiBzdHJpbmcpOiBTdG9yYWdlIHtcbiAgYXN5bmMgZnVuY3Rpb24gcnBjPE0gZXh0ZW5kcyBrZXlvZiBTdG9yYWdlTWV0aG9kcz4oXG4gICAgbWV0aG9kOiBNLFxuICAgIHBhcmFtczogei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInBhcmFtc1wiXT5cbiAgKTogUHJvbWlzZTx6LmluZmVyPFN0b3JhZ2VNZXRob2RzW01dW1wicmVzdWx0XCJdPj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwY0ZuKHsgbmFtZSwgbWV0aG9kLCBwYXJhbXMgfSk7XG5cbiAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogcmVzdWx0LmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQgYXMgei5pbmZlcjxTdG9yYWdlTWV0aG9kc1tNXVtcInJlc3VsdFwiXT47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlc3Npb246IHtcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2Vzc2lvbi5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ob3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJzZXNzaW9uLnNldFwiLCBzZXNzaW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInNlc3Npb24uZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi5saXN0XCIsIHtcbiAgICAgICAgICAgIHRhZ3M6IG9wdHM/LnRhZ3MsXG4gICAgICAgICAgICBvcmRlcjogb3B0cz8ub3JkZXIsXG4gICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvcixcbiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0YWc6IHtcbiAgICAgICAgc2V0OiBhc3luYyAoeyBzZXNzaW9uSWQsIHRhZ3MgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwic2Vzc2lvbi50YWcuc2V0XCIsIHsgc2Vzc2lvbklkLCB0YWdzIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG1lc3NhZ2U6IHtcbiAgICAgIGxpc3Q6IGFzeW5jIChzZXNzaW9uSWQsIG9wdHMpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcnBjKFwibWVzc2FnZS5saXN0XCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldDogYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwibWVzc2FnZS5nZXRcIiwgeyBpZCB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VOb3RGb3VuZEVycm9yKHsgaWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBycGMoXCJtZXNzYWdlLnNldFwiLCBtZXNzYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBwYXJ0OiB7XG4gICAgICBsaXN0QnlNZXNzYWdlOiBhc3luYyAobWVzc2FnZUlkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlNZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBsaXN0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkLCBvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwicGFydC5saXN0QnlTZXNzaW9uXCIsIHtcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxQYXJ0PjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGFzeW5jIChwYXJ0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJwYXJ0LnNldFwiLCBwYXJ0KSkgYXMgUGFydDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkZWxldGU6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHJwYyhcInBhcnQuZGVsZXRlXCIsIHsgaWQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FuZGJveDoge1xuICAgICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRcIiwgeyBrZXkgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBrZXkgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0QnlTZXNzaW9uOiBhc3luYyAoc2Vzc2lvbklkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnBjKFwic2FuZGJveC5nZXRCeVNlc3Npb25cIiwgeyBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYW5kYm94Tm90Rm91bmRFcnJvcih7IGlkOiBzZXNzaW9uSWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAocmVjb3JkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnBjKFwic2FuZGJveC5zZXRcIiwgcmVjb3JkKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxpc3Q6IGFzeW5jIChvcHRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gubGlzdFwiLCB7XG4gICAgICAgICAgICB0YWdzOiBvcHRzPy50YWdzLFxuICAgICAgICAgICAgb3JkZXI6IG9wdHM/Lm9yZGVyLFxuICAgICAgICAgICAgY3Vyc29yOiBvcHRzPy5jdXJzb3IsXG4gICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGFnOiB7XG4gICAgICAgIHNldDogYXN5bmMgKHsgc2FuZGJveElkLCB0YWdzIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJwYyhcInNhbmRib3gudGFnLnNldFwiLCB7IHNhbmRib3hJZCwgdGFncyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY3F1aXJlTG9jazogYXN5bmMgKHJlY29yZCwgbG9ja1RpbWVvdXRNcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwic2FuZGJveC5hY3F1aXJlTG9ja1wiLCB7XG4gICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICBsb2NrVGltZW91dE1zLFxuICAgICAgICAgIH0pKSBhcyBpbXBvcnQoXCIuL3R5cGVzXCIpLlNhbmRib3hSZWNvcmQgfCBudWxsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VFcnJvcih7IHJlYXNvbjogU3RyaW5nKGUpLCBjYXVzZTogZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHNldHVwOiB7XG4gICAgICBnZXQ6IGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gKGF3YWl0IHJwYyhcInNldHVwLmdldFwiLCB7IGtleSB9KSkgYXMgU2V0dXBTbmFwc2hvdCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoc25hcHNob3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBycGMoXCJzZXR1cC5zZXRcIiwgc25hcHNob3QpO1xuICAgICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhY3F1aXJlTG9jazogYXN5bmMgKGtleSwgbG9ja0lkLCBsb2NrVGltZW91dE1zKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIChhd2FpdCBycGMoXCJzZXR1cC5hY3F1aXJlTG9ja1wiLCB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICBsb2NrVGltZW91dE1zLFxuICAgICAgICAgIH0pKSBhcyBTZXR1cFNuYXBzaG90IHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21tYW5kOiB7XG4gICAgICBnZXQ6IGFzeW5jIChpZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5nZXRcIiwgeyBpZCB9KSkgYXMgQ29tbWFuZCB8IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBhc3luYyAoY29tbWFuZCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgcnBjKFwiY29tbWFuZC5zZXRcIiwgY29tbWFuZCkpIGFzIENvbW1hbmQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUVycm9yKHsgcmVhc29uOiBTdHJpbmcoZSksIGNhdXNlOiBlIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbGlzdDogYXN5bmMgKHNlc3Npb25JZCwgb3B0cykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJwYyhcImNvbW1hbmQubGlzdFwiLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICBpbmNsdWRlRmluaXNoZWQ6IG9wdHM/LmluY2x1ZGVGaW5pc2hlZCxcbiAgICAgICAgICAgIGN1cnNvcjogb3B0cz8uY3Vyc29yLFxuICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgTGlzdFJlc3VsdDxDb21tYW5kPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3RvcmFnZUVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlRXJyb3IoeyByZWFzb246IFN0cmluZyhlKSwgY2F1c2U6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gXCJkZWZhdWx0XCI7XG5leHBvcnQgY29uc3QgTE9DQUxfU1RPUkFHRV9WRVJTSU9OID0gXCJ2MVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZShvcHRzOiB7XG4gIGNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcnBjOiBScGNGbjtcbn0pOiBTdG9yYWdlIHtcbiAgY29uc3QgbmFtZSA9IG9wdHMuY29uZmlnLm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gIHJldHVybiBnZXRTdG9yYWdlQ2xpZW50KG9wdHMucnBjLCBuYW1lKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O0FBMkJPLFNBQVMsaUJBQWlCLE9BQWMsTUFBd0I7QUFDckUsaUJBQWUsSUFDYixRQUNBLFFBQytDO0FBQy9DLFVBQU0sU0FBUyxNQUFNLE1BQU0s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
@@ -0,0 +1,106 @@
1
+ // src/sandbox/bindings/lifecycle-workflow.ts
2
+ import { sleep } from "workflow";
3
+
4
+ // src/sandbox/bindings/lifecycle-workflow-steps.ts
5
+ var DEFAULT_POLL_INTERVAL_MS = 2 * 60 * 1e3;
6
+ var DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
7
+ var SNAPSHOT_BEFORE_TIMEOUT_MS = 10 * 60 * 1e3;
8
+ var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
9
+ token: process.env.TEST_VERCEL_TOKEN,
10
+ teamId: process.env.TEST_VERCEL_TEAM_ID,
11
+ projectId: process.env.TEST_VERCEL_PROJECT_ID
12
+ } : {};
13
+ async function checkAndSnapshotStep(input) {
14
+ "use step";
15
+ const { Sandbox: VercelSandboxSDK } = await import("./vercel-sdk-I6A4MVAN.mjs");
16
+ const { getStorage } = await import("./storage-LL6IA24R.mjs");
17
+ if (!input.rpc) {
18
+ throw new Error("RPC not found");
19
+ }
20
+ const storage = getStorage({
21
+ config: input.storageConfig,
22
+ rpc: input.rpc
23
+ });
24
+ const record = await storage.sandbox.get(input.id);
25
+ if (record instanceof Error) {
26
+ return { action: "exit", reason: "not_found" };
27
+ }
28
+ const currentSandboxId = record.providerMetadata?.provider === "vercel" ? record.providerMetadata.sandboxId : null;
29
+ if (currentSandboxId !== input.vercelSandboxId) {
30
+ return { action: "exit", reason: "sandboxId_changed" };
31
+ }
32
+ if (!currentSandboxId) {
33
+ return { action: "exit", reason: "not_found" };
34
+ }
35
+ const config = record.config;
36
+ if (config.type !== "vercel") {
37
+ return { action: "exit", reason: "not_found" };
38
+ }
39
+ const pollIntervalMs = config.lifecycle?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
40
+ const idleTimeoutMs = config.lifecycle?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
41
+ const snapshotBeforeTimeoutMs = config.lifecycle?.snapshotBeforeTimeoutMs ?? SNAPSHOT_BEFORE_TIMEOUT_MS;
42
+ const now = Date.now();
43
+ const lastActivity = record.lastActivityAt ?? record.createdAt ?? now;
44
+ const idleDuration = now - lastActivity;
45
+ const shouldSnapshotDueToIdle = idleDuration > idleTimeoutMs;
46
+ let shouldSnapshotDueToTimeout = false;
47
+ try {
48
+ const sandbox = await VercelSandboxSDK.get({
49
+ sandboxId: currentSandboxId,
50
+ ...getTestCredentials()
51
+ });
52
+ if (sandbox.timeout < snapshotBeforeTimeoutMs) {
53
+ shouldSnapshotDueToTimeout = true;
54
+ }
55
+ } catch {
56
+ return { action: "exit", reason: "not_found" };
57
+ }
58
+ if (shouldSnapshotDueToIdle || shouldSnapshotDueToTimeout) {
59
+ try {
60
+ const sandbox = await VercelSandboxSDK.get({
61
+ sandboxId: currentSandboxId,
62
+ ...getTestCredentials()
63
+ });
64
+ const snapshot = await sandbox.snapshot();
65
+ await storage.sandbox.set({
66
+ ...record,
67
+ acquiringLockId: null,
68
+ acquiringLockAt: null,
69
+ providerMetadata: {
70
+ provider: "vercel",
71
+ sandboxId: null,
72
+ snapshotId: snapshot.snapshotId
73
+ }
74
+ });
75
+ } catch (e) {
76
+ return e instanceof Error ? e : new Error(String(e));
77
+ }
78
+ return {
79
+ action: "exit",
80
+ reason: shouldSnapshotDueToIdle ? "idle" : "timeout"
81
+ };
82
+ }
83
+ return { action: "continue", nextPollMs: pollIntervalMs };
84
+ }
85
+
86
+ // src/sandbox/bindings/lifecycle-workflow.ts
87
+ var DEFAULT_POLL_MS = 2 * 60 * 1e3;
88
+ async function sandboxLifecycleWorkflow({
89
+ input
90
+ }) {
91
+ "use workflow";
92
+ let nextPollMs = DEFAULT_POLL_MS;
93
+ while (true) {
94
+ await sleep(nextPollMs);
95
+ const result = await checkAndSnapshotStep(input);
96
+ if (result instanceof Error || result.action === "exit") {
97
+ break;
98
+ }
99
+ nextPollMs = result.nextPollMs;
100
+ }
101
+ }
102
+
103
+ export {
104
+ sandboxLifecycleWorkflow
105
+ };
106
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvbGlmZWN5Y2xlLXdvcmtmbG93LnRzIiwgIi4uL3NyYy9zYW5kYm94L2JpbmRpbmdzL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwid29ya2Zsb3dcIjtcbmltcG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjaGVja0FuZFNuYXBzaG90U3RlcCB9IGZyb20gXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiO1xuXG5leHBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9O1xuXG5jb25zdCBERUZBVUxUX1BPTExfTVMgPSAyICogNjAgKiAxMDAwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FuZGJveExpZmVjeWNsZVdvcmtmbG93KHtcbiAgaW5wdXQsXG59OiB7XG4gIGlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgbGV0IG5leHRQb2xsTXMgPSBERUZBVUxUX1BPTExfTVM7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBhd2FpdCBzbGVlcChuZXh0UG9sbE1zKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrQW5kU25hcHNob3RTdGVwKGlucHV0KTtcblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvciB8fCByZXN1bHQuYWN0aW9uID09PSBcImV4aXRcIikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV4dFBvbGxNcyA9IHJlc3VsdC5uZXh0UG9sbE1zO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTYW5kYm94TGlmZWN5Y2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgREVGQVVMVF9QT0xMX0lOVEVSVkFMX01TID0gMiAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGdldFRlc3RDcmVkZW50aWFscyA9ICgpID0+XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIlxuICAgID8ge1xuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVE9LRU4sXG4gICAgICAgIHRlYW1JZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfVEVBTV9JRCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9jZXNzLmVudi5URVNUX1ZFUkNFTF9QUk9KRUNUX0lELFxuICAgICAgfVxuICAgIDoge307XG5cbmV4cG9ydCB0eXBlIExpZmVjeWNsZVN0ZXBSZXN1bHQgPVxuICB8IHsgYWN0aW9uOiBcImNvbnRpbnVlXCI7IG5leHRQb2xsTXM6IG51bWJlciB9XG4gIHwge1xuICAgICAgYWN0aW9uOiBcImV4aXRcIjtcbiAgICAgIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIHwgXCJpZGxlXCIgfCBcInRpbWVvdXRcIiB8IFwibm90X2ZvdW5kXCI7XG4gICAgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQW5kU25hcHNob3RTdGVwKFxuICBpbnB1dDogU2FuZGJveExpZmVjeWNsZUlucHV0XG4pOiBQcm9taXNlPEVycm9yIHwgTGlmZWN5Y2xlU3RlcFJlc3VsdD4ge1xuICBcInVzZSBzdGVwXCI7XG5cbiAgY29uc3QgeyBTYW5kYm94OiBWZXJjZWxTYW5kYm94U0RLIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3ZlcmNlbC1zZGtcIik7XG4gIGNvbnN0IHsgZ2V0U3RvcmFnZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vc3RvcmFnZVwiKTtcbiAgaWYgKCFpbnB1dC5ycGMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSUEMgbm90IGZvdW5kXCIpO1xuICB9XG4gIGNvbnN0IHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICBjb25maWc6IGlucHV0LnN0b3JhZ2VDb25maWcsXG4gICAgcnBjOiBpbnB1dC5ycGMsXG4gIH0pO1xuICBjb25zdCByZWNvcmQgPSBhd2FpdCBzdG9yYWdlLnNhbmRib3guZ2V0KGlucHV0LmlkKTtcbiAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2FuZGJveElkID1cbiAgICByZWNvcmQucHJvdmlkZXJNZXRhZGF0YT8ucHJvdmlkZXIgPT09IFwidmVyY2VsXCJcbiAgICAgID8gcmVjb3JkLnByb3ZpZGVyTWV0YWRhdGEuc2FuZGJveElkXG4gICAgICA6IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRTYW5kYm94SWQgIT09IGlucHV0LnZlcmNlbFNhbmRib3hJZCkge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJzYW5kYm94SWRfY2hhbmdlZFwiIH07XG4gIH1cblxuICBpZiAoIWN1cnJlbnRTYW5kYm94SWQpIHtcbiAgICByZXR1cm4geyBhY3Rpb246IFwiZXhpdFwiLCByZWFzb246IFwibm90X2ZvdW5kXCIgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHJlY29yZC5jb25maWc7XG4gIGlmIChjb25maWcudHlwZSAhPT0gXCJ2ZXJjZWxcIikge1xuICAgIHJldHVybiB7IGFjdGlvbjogXCJleGl0XCIsIHJlYXNvbjogXCJub3RfZm91bmRcIiB9O1xuICB9XG5cbiAgY29uc3QgcG9sbEludGVydmFsTXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnBvbGxJbnRlcnZhbE1zID8/IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9NUztcbiAgY29uc3QgaWRsZVRpbWVvdXRNcyA9XG4gICAgY29uZmlnLmxpZmVjeWNsZT8uc3RvcEFmdGVySW5hY3RpdmVNcyA/PyBERUZBVUxUX0lETEVfVElNRU9VVF9NUztcbiAgY29uc3Qgc25hcHNob3RCZWZvcmVUaW1lb3V0TXMgPVxuICAgIGNvbmZpZy5saWZlY3ljbGU/LnNuYXBzaG90QmVmb3JlVGltZW91dE1zID8/IFNOQVBTSE9UX0JFRk9SRV9USU1FT1VUX01TO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGxhc3RBY3Rpdml0eSA9IHJlY29yZC5sYXN0QWN0aXZpdHlBdCA/PyByZWNvcmQuY3JlYXRlZEF0ID8/IG5vdztcbiAgY29uc3QgaWRsZUR1cmF0aW9uID0gbm93IC0gbGFzdEFjdGl2aXR5O1xuICBjb25zdCBzaG91bGRTbmFwc2hvdER1ZVRvSWRsZSA9IGlkbGVEdXJhdGlvbiA+IGlkbGVUaW1lb3V0TXM7XG5cbiAgbGV0IHNob3VsZFNuYXBzaG90RHVlVG9UaW1lb3V0ID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgIHNhbmRib3hJZDogY3VycmVudFNhbmRib3hJZCxcbiAgICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICAgIH0pO1xuICAgIGlmIChzYW5kYm94LnRpbWVvdXQgPCBzbmFwc2hvdEJlZm9yZVRpbWVvdXRNcykge1xuICAgICAgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQgPSB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgYWN0aW9uOiBcImV4aXRcIiwgcmVhc29uOiBcIm5vdF9mb3VuZFwiIH07XG4gIH1cblxuICBpZiAoc2hvdWxkU25hcHNob3REdWVUb0lkbGUgfHwgc2hvdWxkU25hcHNob3REdWVUb1RpbWVvdXQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IFZlcmNlbFNhbmRib3hTREsuZ2V0KHtcbiAgICAgICAgc2FuZGJveElkOiBjdXJyZW50U2FuZGJveElkLFxuICAgICAgICAuLi5nZXRUZXN0Q3JlZGVudGlhbHMoKSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBzYW5kYm94LnNuYXBzaG90KCk7XG4gICAgICBhd2FpdCBzdG9yYWdlLnNhbmRib3guc2V0KHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBhY3F1aXJpbmdMb2NrSWQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXJNZXRhZGF0YToge1xuICAgICAgICAgIHByb3ZpZGVyOiBcInZlcmNlbFwiLFxuICAgICAgICAgIHNhbmRib3hJZDogbnVsbCxcbiAgICAgICAgICBzbmFwc2hvdElkOiBzbmFwc2hvdC5zbmFwc2hvdElkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IGUgOiBuZXcgRXJyb3IoU3RyaW5nKGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJleGl0XCIsXG4gICAgICByZWFzb246IHNob3VsZFNuYXBzaG90RHVlVG9JZGxlID8gXCJpZGxlXCIgOiBcInRpbWVvdXRcIixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgYWN0aW9uOiBcImNvbnRpbnVlXCIsIG5leHRQb2xsTXM6IHBvbGxJbnRlcnZhbE1zIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxhQUFhOzs7QUNFdEIsSUFBTSwyQkFBMkIsSUFBSSxLQUFLO0FBQzFDLElBQU0sMEJBQTBCLElBQUksS0FBSztBQUN6QyxJQUFNLDZCQUE2QixLQUFLLEtBQUs7QUFFN0MsSUFBTSxxQkFBcUIsTUFDekIsUUFBUSxJQUFJLGFBQWEsU0FDckI7QUFBQSxFQUNFLE9BQU8sUUFBUSxJQUFJO0FBQUEsRUFDbkIsUUFBUSxRQUFRLElBQUk7QUFBQSxFQUNwQixXQUFXLFFBQVEsSUFBSTtB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