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,99 @@
1
+ // package.json
2
+ var package_default = {
3
+ name: "experimental-agent",
4
+ version: "0.4.0",
5
+ main: "./dist/index.js",
6
+ module: "./dist/index.mjs",
7
+ types: "./dist/index.d.ts",
8
+ sideEffects: true,
9
+ license: "MIT",
10
+ files: [
11
+ "dist/**"
12
+ ],
13
+ exports: {
14
+ ".": {
15
+ types: "./dist/index.d.ts",
16
+ import: "./dist/index.mjs",
17
+ require: "./dist/index.js"
18
+ },
19
+ "./storage": {
20
+ types: "./dist/storage.d.ts",
21
+ import: "./dist/storage.mjs",
22
+ require: "./dist/storage.js"
23
+ },
24
+ "./sandbox": {
25
+ types: "./dist/sandbox.d.ts",
26
+ import: "./dist/sandbox.mjs",
27
+ require: "./dist/sandbox.js"
28
+ },
29
+ "./next": {
30
+ types: "./dist/next.d.ts",
31
+ import: "./dist/next.mjs",
32
+ require: "./dist/next.js"
33
+ },
34
+ "./next/loader": {
35
+ types: "./dist/next/loader.d.ts",
36
+ import: "./dist/next/loader.mjs",
37
+ require: "./dist/next/loader.js"
38
+ },
39
+ "./client": {
40
+ types: "./dist/client.d.ts",
41
+ import: "./dist/client.mjs",
42
+ require: "./dist/client.js"
43
+ },
44
+ "./lifecycle-workflow": {
45
+ types: "./dist/lifecycle-workflow.d.ts",
46
+ import: "./dist/lifecycle-workflow.mjs",
47
+ require: "./dist/lifecycle-workflow.js"
48
+ },
49
+ "./lifecycle-workflow-steps": {
50
+ types: "./dist/lifecycle-workflow-steps.d.ts",
51
+ import: "./dist/lifecycle-workflow-steps.mjs",
52
+ require: "./dist/lifecycle-workflow-steps.js"
53
+ }
54
+ },
55
+ scripts: {
56
+ build: "tsup",
57
+ dev: "tsup --watch",
58
+ clean: "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
59
+ release: "pnpm build && npm publish",
60
+ typecheck: "tsc --noEmit",
61
+ test: "vitest run",
62
+ "test:watch": "vitest"
63
+ },
64
+ dependencies: {
65
+ "@swc/core": "^1.10.0",
66
+ "@vercel/kv2": "^0.0.18",
67
+ "@vercel/oidc": "^3.1.0",
68
+ "@vercel/sandbox": "1.7.1",
69
+ "@workflow/serde": "4.1.0-beta.2",
70
+ "better-all": "^0.0.5",
71
+ errore: "^0.14.0",
72
+ "fast-deep-equal": "^3.1.3",
73
+ ulid: "^3.0.2",
74
+ zod: "^4.3.6"
75
+ },
76
+ devDependencies: {
77
+ "@agent/tsconfig": "workspace:*",
78
+ "@ai-sdk/react": "^3.0.88",
79
+ "@types/node": "^20.11.24",
80
+ dotenv: "^17.2.3",
81
+ next: "^16.0.0",
82
+ react: "^19.2.4",
83
+ tsup: "^8.0.2",
84
+ typescript: "5.5.4",
85
+ vitest: "^3.0.0",
86
+ workflow: "4.1.0-beta.60"
87
+ },
88
+ peerDependencies: {
89
+ ai: "^6.0.0"
90
+ },
91
+ publishConfig: {
92
+ access: "public"
93
+ }
94
+ };
95
+
96
+ export {
97
+ package_default
98
+ };
99
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjQuMFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9zdG9yYWdlXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3Qvc3RvcmFnZS5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9zdG9yYWdlLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L3N0b3JhZ2UuanNcIlxuICAgIH0sXG4gICAgXCIuL3NhbmRib3hcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9zYW5kYm94LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L3NhbmRib3gubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3Qvc2FuZGJveC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbmV4dFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9uZXh0LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0L2xvYWRlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmpzXCJcbiAgICB9LFxuICAgIFwiLi9jbGllbnRcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9jbGllbnQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvY2xpZW50Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2NsaWVudC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbGlmZWN5Y2xlLXdvcmtmbG93XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3cuanNcIlxuICAgIH0sXG4gICAgXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHMubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLmpzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImRldlwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwiY2xlYW5cIjogXCJybSAtcmYgLnR1cmJvICYmIHJtIC1yZiBub2RlX21vZHVsZXMgJiYgcm0gLXJmIGRpc3RcIixcbiAgICBcInJlbGVhc2VcIjogXCJwbnBtIGJ1aWxkICYmIG5wbSBwdWJsaXNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHN3Yy9jb3JlXCI6IFwiXjEuMTAuMFwiLFxuICAgIFwiQHZlcmNlbC9rdjJcIjogXCJeMC4wLjE4XCIsXG4gICAgXCJAdmVyY2VsL29pZGNcIjogXCJeMy4xLjBcIixcbiAgICBcIkB2ZXJjZWwvc2FuZGJveFwiOiBcIjEuNy4xXCIsXG4gICAgXCJAd29ya2Zsb3cvc2VyZGVcIjogXCI0LjEuMC1iZXRhLjJcIixcbiAgICBcImJldHRlci1hbGxcIjogXCJeMC4wLjVcIixcbiAgICBcImVycm9yZVwiOiBcIl4wLjE0LjBcIixcbiAgICBcImZhc3QtZGVlcC1lcXVhbFwiOiBcIl4zLjEuM1wiLFxuICAgIFwidWxpZFwiOiBcIl4zLjAuMlwiLFxuICAgIFwiem9kXCI6IFwiXjQuMy42XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGFnZW50L3RzY29uZmlnXCI6IFwid29ya3NwYWNlOipcIixcbiAgICBcIkBhaS1zZGsvcmVhY3RcIjogXCJeMy4wLjg4XCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIl4yMC4xMS4yNFwiLFxuICAgIFwiZG90ZW52XCI6IFwiXjE3LjIuM1wiLFxuICAgIFwibmV4dFwiOiBcIl4xNi4wLjBcIixcbiAgICBcInJlYWN0XCI6IFwiXjE5LjIuNFwiLFxuICAgIFwidHN1cFwiOiBcIl44LjAuMlwiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIjUuNS40XCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4wLjBcIixcbiAgICBcIndvcmtmbG93XCI6IFwiNC4xLjAtYmV0YS42MFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhaVwiOiBcIl42LjAuMFwiXG4gIH0sXG4gIFwicHVibGlzaENvbmZpZ1wiOiB7XG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUE7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLE1BQVE7QUFBQSxFQUNSLFFBQVU7QUFBQSxFQUNWLE9BQVM7QUFBQSxFQUNULGFBQWU7QUFBQSxFQUNmLFNBQVc7QUFBQSxFQUNYLE9BQVM7QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBVztBQUFBLElBQ1QsS0FBSztBQUFBLE1BQ0gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxhQUFhO0FBQUEsTUFDWCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLE1BQ2YsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLFlBQVk7QUFBQSxNQUNWLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSx3QkFBd0I7QUFBQSxNQUN0QixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsOEJBQThCO0FBQUEsTUFDNUIsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxPQUFTO0FBQUEsSUFDVCxLQUFPO0FBQUEsSUFDUCxPQUFTO0FBQUEsSUFDVCxTQUFXO0FBQUEsSUFDWCxXQUFhO0FBQUEsSUFDYixNQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEI7QUFBQSxFQUNBLGNBQWdCO0FBQUEsSUFDZCxhQUFhO0FBQUEsSUFDYixlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixtQkFBbUI7QUFBQSxJQUNuQixtQkFBbUI7QUFBQSxJQUNuQixjQUFjO0FBQUEsSUFDZCxRQUFVO0FBQUEsSUFDVixtQkFBbUI7QUFBQSxJQUNuQixNQUFRO0FBQUEsSUFDUixLQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsaUJBQW1CO0FBQUEsSUFDakIsbUJBQW1CO0FBQUEsSUFDbkIsaUJBQWlCO0FBQUEsSUFDakIsZUFBZTtBQUFBLElBQ2YsUUFBVTtBQUFBLElBQ1YsTUFBUTtBQUFBLElBQ1IsT0FBUztBQUFBLElBQ1QsTUFBUTtBQUFBLElBQ1IsWUFBYztBQUFBLElBQ2QsUUFBVTtBQUFBLElBQ1YsVUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBLGtCQUFvQjtBQUFBLElBQ2xCLElBQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxlQUFpQjtBQUFBLElBQ2YsUUFBVTtBQUFBLEVBQ1o7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,128 @@
1
+ // src/utils/logger.ts
2
+ var LOG_LEVEL_PRIORITY = {
3
+ info: 0,
4
+ warn: 1,
5
+ error: 2,
6
+ silent: 3
7
+ };
8
+ function getLevel(config) {
9
+ return config.level ?? "warn";
10
+ }
11
+ function getPrefix(config) {
12
+ return config.prefix ?? "agent";
13
+ }
14
+ function shouldLog(config, level) {
15
+ return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[getLevel(config)];
16
+ }
17
+ function formatTag(config, subsystem) {
18
+ return `[${getPrefix(config)}:${config.name}:${subsystem}]`;
19
+ }
20
+ function formatData(context, extra) {
21
+ const merged = { ...context, ...extra };
22
+ const entries = Object.entries(merged).filter(
23
+ ([, v]) => v !== void 0 && v !== null
24
+ );
25
+ if (entries.length === 0) {
26
+ return void 0;
27
+ }
28
+ return Object.fromEntries(entries);
29
+ }
30
+ var Logger = class _Logger {
31
+ subsystem;
32
+ config;
33
+ context;
34
+ constructor({
35
+ subsystem,
36
+ config,
37
+ context
38
+ }) {
39
+ this.subsystem = subsystem;
40
+ this.config = config;
41
+ this.context = context ?? {};
42
+ }
43
+ child({
44
+ subsystem,
45
+ context
46
+ }) {
47
+ return new _Logger({
48
+ config: this.config,
49
+ subsystem: subsystem ? `${this.subsystem}:${subsystem}` : this.subsystem,
50
+ context: { ...this.context, ...context }
51
+ });
52
+ }
53
+ withContext(context) {
54
+ return new _Logger({
55
+ config: this.config,
56
+ subsystem: this.subsystem,
57
+ context: { ...this.context, ...context }
58
+ });
59
+ }
60
+ info(message, data) {
61
+ if (!shouldLog(this.config, "info")) {
62
+ return;
63
+ }
64
+ const d = formatData(this.context, data);
65
+ if (d) {
66
+ console.info(formatTag(this.config, this.subsystem), message, d);
67
+ } else {
68
+ console.info(formatTag(this.config, this.subsystem), message);
69
+ }
70
+ }
71
+ warn(message, data) {
72
+ if (!shouldLog(this.config, "warn")) {
73
+ return;
74
+ }
75
+ const d = formatData(this.context, data);
76
+ if (d) {
77
+ console.warn(formatTag(this.config, this.subsystem), message, d);
78
+ } else {
79
+ console.warn(formatTag(this.config, this.subsystem), message);
80
+ }
81
+ }
82
+ error(message, data) {
83
+ if (!shouldLog(this.config, "error")) {
84
+ return;
85
+ }
86
+ const d = formatData(this.context, data);
87
+ if (d) {
88
+ console.error(formatTag(this.config, this.subsystem), message, d);
89
+ } else {
90
+ console.error(formatTag(this.config, this.subsystem), message);
91
+ }
92
+ }
93
+ /**
94
+ * Returns a function that, when called, logs the elapsed time at info level.
95
+ * Pass `logOnStart: true` to also log when the timer begins.
96
+ *
97
+ * @example
98
+ * const done = log.time("sandbox setup", { sandboxId }, { logOnStart: true });
99
+ * await setup();
100
+ * done(); // start: [agent:default:sandbox] sandbox setup { sandboxId: '...' }
101
+ * // end: [agent:default:sandbox] sandbox setup { sandboxId: '...', durationMs: 123 }
102
+ */
103
+ time(message, data, opts) {
104
+ if (opts?.logOnStart) {
105
+ this.info(`[start] ${message}`, data);
106
+ }
107
+ const t0 = Date.now();
108
+ return (endData) => {
109
+ this.info(opts?.logOnStart ? `[end] ${message}` : message, {
110
+ ...data,
111
+ ...endData,
112
+ durationMs: Date.now() - t0
113
+ });
114
+ };
115
+ }
116
+ };
117
+ function createLogger({
118
+ config,
119
+ subsystem,
120
+ context
121
+ }) {
122
+ return new Logger({ config, subsystem, context });
123
+ }
124
+
125
+ export {
126
+ createLogger
127
+ };
128
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiIHwgXCJzaWxlbnRcIjtcblxuY29uc3QgTE9HX0xFVkVMX1BSSU9SSVRZOiBSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4gPSB7XG4gIGluZm86IDAsXG4gIHdhcm46IDEsXG4gIGVycm9yOiAyLFxuICBzaWxlbnQ6IDMsXG59O1xuXG5leHBvcnQgdHlwZSBMb2dDb250ZXh0ID0ge1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgc2FuZGJveElkPzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgTG9nZ2luZ0NvbmZpZyA9IHtcbiAgbGV2ZWw/OiBMb2dMZXZlbDtcbiAgLyoqXG4gICAqIFRvcC1sZXZlbCBsYWJlbCBmb3IgYWxsIGxvZyBsaW5lcy5cbiAgICogQGRlZmF1bHQgXCJhZ2VudFwiXG4gICAqIEBleGFtcGxlIFwibXktYXBwXCIgXHUyMTkyIFtteS1hcHA6ZGVmYXVsdDp3b3JrZmxvd11cbiAgICovXG4gIHByZWZpeD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGdldExldmVsKGNvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IExvZ0xldmVsIHtcbiAgcmV0dXJuIGNvbmZpZy5sZXZlbCA/PyBcIndhcm5cIjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlZml4KGNvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcucHJlZml4ID8/IFwiYWdlbnRcIjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTG9nKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgbGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBMT0dfTEVWRUxfUFJJT1JJVFlbbGV2ZWxdID49IExPR19MRVZFTF9QUklPUklUWVtnZXRMZXZlbChjb25maWcpXTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGFnKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgc3Vic3lzdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFske2dldFByZWZpeChjb25maWcpfToke2NvbmZpZy5uYW1lfToke3N1YnN5c3RlbX1dYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0YShcbiAgY29udGV4dDogTG9nQ29udGV4dCxcbiAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmNvbnRleHQsIC4uLmV4dHJhIH07XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhtZXJnZWQpLmZpbHRlcihcbiAgICAoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsXG4gICk7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHJlYWRvbmx5IHN1YnN5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTG9nZ2luZ0NvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBMb2dDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBzdWJzeXN0ZW0sXG4gICAgY29uZmlnLFxuICAgIGNvbnRleHQsXG4gIH06IHtcbiAgICBzdWJzeXN0ZW06IHN0cmluZztcbiAgICBjb25maWc6IExvZ2dpbmdDb25maWc7XG4gICAgY29udGV4dD86IExvZ0NvbnRleHQ7XG4gIH0pIHtcbiAgICB0aGlzLnN1YnN5c3RlbSA9IHN1YnN5c3RlbTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0ID8/IHt9O1xuICB9XG5cbiAgY2hpbGQoe1xuICAgIHN1YnN5c3RlbSxcbiAgICBjb250ZXh0LFxuICB9OiB7XG4gICAgc3Vic3lzdGVtPzogc3RyaW5nO1xuICAgIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xuICB9KTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3Vic3lzdGVtOiBzdWJzeXN0ZW0gPyBgJHt0aGlzLnN1YnN5c3RlbX06JHtzdWJzeXN0ZW19YCA6IHRoaXMuc3Vic3lzdGVtLFxuICAgICAgY29udGV4dDogeyAuLi50aGlzLmNvbnRleHQsIC4uLmNvbnRleHQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHdpdGhDb250ZXh0KGNvbnRleHQ6IExvZ0NvbnRleHQpOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBzdWJzeXN0ZW06IHRoaXMuc3Vic3lzdGVtLFxuICAgICAgY29udGV4dDogeyAuLi50aGlzLmNvbnRleHQsIC4uLmNvbnRleHQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJpbmZvXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSwgZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghc2hvdWxkTG9nKHRoaXMuY29uZmlnLCBcIndhcm5cIikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IGZvcm1hdERhdGEodGhpcy5jb250ZXh0LCBkYXRhKTtcbiAgICBpZiAoZCkge1xuICAgICAgY29uc29sZS53YXJuKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlLCBkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghc2hvdWxkTG9nKHRoaXMuY29uZmlnLCBcImVycm9yXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UsIGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBsb2dzIHRoZSBlbGFwc2VkIHRpbWUgYXQgaW5mbyBsZXZlbC5cbiAgICogUGFzcyBgbG9nT25TdGFydDogdHJ1ZWAgdG8gYWxzbyBsb2cgd2hlbiB0aGUgdGltZXIgYmVnaW5zLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBkb25lID0gbG9nLnRpbWUoXCJzYW5kYm94IHNldHVwXCIsIHsgc2FuZGJveElkIH0sIHsgbG9nT25TdGFydDogdHJ1ZSB9KTtcbiAgICogYXdhaXQgc2V0dXAoKTtcbiAgICogZG9uZSgpOyAvLyBzdGFydDogW2FnZW50OmRlZmF1bHQ6c2FuZGJveF0gc2FuZGJveCBzZXR1cCB7IHNhbmRib3hJZDogJy4uLicgfVxuICAgKiAgICAgICAgIC8vIGVuZDogICBbYWdlbnQ6ZGVmYXVsdDpzYW5kYm94XSBzYW5kYm94IHNldHVwIHsgc2FuZGJveElkOiAnLi4uJywgZHVyYXRpb25NczogMTIzIH1cbiAgICovXG4gIHRpbWUoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBvcHRzPzogeyBsb2dPblN0YXJ0PzogYm9vbGVhbiB9XG4gICk6IChlbmREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQge1xuICAgIGlmIChvcHRzPy5sb2dPblN0YXJ0KSB7XG4gICAgICB0aGlzLmluZm8oYFtzdGFydF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB0MCA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIChlbmREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIHRoaXMuaW5mbyhvcHRzPy5sb2dPblN0YXJ0ID8gYFtlbmRdICR7bWVzc2FnZX1gIDogbWVzc2FnZSwge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICAuLi5lbmREYXRhLFxuICAgICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gdDAsXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIoe1xuICBjb25maWcsXG4gIHN1YnN5c3RlbSxcbiAgY29udGV4dCxcbn06IHtcbiAgY29uZmlnOiBMb2dnaW5nQ29uZmlnO1xuICBzdWJzeXN0ZW06IHN0cmluZztcbiAgY29udGV4dD86IExvZ0NvbnRleHQ7XG59KTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIoeyBjb25maWcsIHN1YnN5c3RlbSwgY29udGV4dCB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFQSxJQUFNLHFCQUErQztBQUFBLEVBQ25ELE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLFFBQVE7QUFDVjtBQW9CQSxTQUFTLFNBQVMsUUFBaUM7QUFDakQsU0FBTyxPQUFPLFNBQVM7QUFDekI7QUFFQSxTQUFTLFVBQVUsUUFBK0I7QUFDaEQsU0FBTyxPQUFPLFVBQVU7QUFDMUI7QUFFQSxTQUFTLFVBQVUsUUFBdUIsT0FBMEI7QUFDbEUsU0FBTyxtQkFBbUIsS0FBSyxLQUFLLG1CQUFtQixTQUFTLE1BQU0sQ0FBQztBQUN6RTtBQUVBLFNBQVMsVUFBVSxRQUF1QixXQUEyQjtBQUNuRSxTQUFPLElBQUksVUFBVSxNQUFNLENBQUMsSUFBSSxPQUFPLElBQUksSUFBSSxTQUFTO0FBQzFEO0FBRUEsU0FBUyxXQUNQLFNBQ0EsT0FDcUM7QUFDckMsUUFBTSxTQUFTLEVBQUUsR0FBRyxTQUFTLEdBQUcsTUFBTTtBQUN0QyxRQUFNLFVBQVUsT0FBTyxRQUFRLE1BQU0sRUFBRTtBQUFBLElBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLFVBQWEsTUFBTTtBQUFBLEVBQ3RDO0FBQ0EsTUFBSSxRQUFRLFdBQVcsR0FBRztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sT0FBTyxZQUFZLE9BQU87QUFDbkM7QUFFTyxJQUFNLFNBQU4sTUFBTSxRQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ1E7QUFBQSxFQUNBO0FBQUEsRUFFakIsWUFBWTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFB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
@@ -0,0 +1,324 @@
1
+ import {
2
+ sandboxLifecycleWorkflow
3
+ } from "./chunk-GKASMIBR.mjs";
4
+
5
+ // src/sandbox/bindings/vercel.ts
6
+ import { start as startWorkflow } from "workflow/api";
7
+ async function loadSandboxSDK() {
8
+ return (await import("@vercel/sandbox")).Sandbox;
9
+ }
10
+ var MAX_TIMEOUT_MS = 5 * 60 * 60 * 1e3;
11
+ var HOME_DIR = "/home/vercel-sandbox";
12
+ var DEFAULT_VCPUS = 2;
13
+ function isSandboxGoneError(e) {
14
+ if (!(e instanceof Error)) {
15
+ return false;
16
+ }
17
+ const status = e.response?.status ?? e.cause?.response?.status;
18
+ if (status === 410 || status === 422) {
19
+ return true;
20
+ }
21
+ const msg = e.message || String(e);
22
+ return msg.includes("Expected a stream of command data") || msg.includes("Expected a stream of logs");
23
+ }
24
+ var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
25
+ token: process.env.TEST_VERCEL_TOKEN,
26
+ teamId: process.env.TEST_VERCEL_TEAM_ID,
27
+ projectId: process.env.TEST_VERCEL_PROJECT_ID
28
+ } : {};
29
+ async function createSdk({
30
+ resources,
31
+ ports,
32
+ networkPolicy,
33
+ snapshotId
34
+ }) {
35
+ const SandboxSDK = await loadSandboxSDK();
36
+ const base = {
37
+ resources,
38
+ timeout: MAX_TIMEOUT_MS,
39
+ ...ports ? { ports } : {},
40
+ ...networkPolicy ? { networkPolicy } : {},
41
+ ...getTestCredentials()
42
+ };
43
+ if (snapshotId) {
44
+ return SandboxSDK.create({
45
+ ...base,
46
+ source: { type: "snapshot", snapshotId }
47
+ });
48
+ }
49
+ return SandboxSDK.create(base);
50
+ }
51
+ async function createSetupSnapshot({
52
+ sandboxOpts,
53
+ run,
54
+ storage,
55
+ snapshotVersion,
56
+ log
57
+ }) {
58
+ let tempSdk = null;
59
+ try {
60
+ tempSdk = await createSdk(sandboxOpts);
61
+ const tempInstance = new VercelSandboxInstance(tempSdk);
62
+ await run(tempInstance);
63
+ const snapshot = await tempSdk.snapshot();
64
+ await storage.setup.set(snapshotVersion, {
65
+ version: snapshotVersion,
66
+ snapshotId: snapshot.snapshotId,
67
+ createdAt: Date.now(),
68
+ lastUsedAt: null
69
+ });
70
+ await tempSdk.stop().catch(() => void 0);
71
+ } catch (error) {
72
+ log.error("failed to create setup snapshot", {
73
+ snapshotVersion,
74
+ cause: error
75
+ });
76
+ if (tempSdk) {
77
+ await tempSdk.stop().catch(() => void 0);
78
+ }
79
+ }
80
+ }
81
+ var VercelSandboxInstance = class {
82
+ sdk;
83
+ cwd;
84
+ constructor(sdk, cwd) {
85
+ this.sdk = sdk;
86
+ this.cwd = cwd ?? HOME_DIR;
87
+ }
88
+ async exec({
89
+ command,
90
+ args,
91
+ cwd,
92
+ env,
93
+ sudo,
94
+ signal
95
+ }) {
96
+ const output = await this.sdk.runCommand({
97
+ cmd: command,
98
+ args,
99
+ cwd: cwd ?? this.cwd,
100
+ env,
101
+ sudo,
102
+ signal,
103
+ detached: true
104
+ });
105
+ let stdout = "";
106
+ let stderr = "";
107
+ const logBuffer = [];
108
+ const state = {
109
+ resolve: null,
110
+ consumed: false
111
+ };
112
+ const consumeLogs = (async () => {
113
+ try {
114
+ for await (const entry of output.logs()) {
115
+ if (entry.stream === "stdout") {
116
+ stdout += entry.data;
117
+ } else {
118
+ stderr += entry.data;
119
+ }
120
+ logBuffer.push(entry);
121
+ state.resolve?.();
122
+ }
123
+ } catch {
124
+ }
125
+ state.consumed = true;
126
+ state.resolve?.();
127
+ })();
128
+ async function* logs() {
129
+ let index = 0;
130
+ while (!state.consumed || index < logBuffer.length) {
131
+ if (index < logBuffer.length) {
132
+ yield logBuffer[index++];
133
+ } else {
134
+ await new Promise((r) => {
135
+ state.resolve = r;
136
+ });
137
+ state.resolve = null;
138
+ }
139
+ }
140
+ }
141
+ const result = consumeLogs.then(async () => {
142
+ try {
143
+ const finished = await output.wait();
144
+ return { stdout, stderr, exitCode: finished.exitCode };
145
+ } catch (e) {
146
+ if (isSandboxGoneError(e)) {
147
+ return { stdout, stderr, exitCode: 1 };
148
+ }
149
+ throw e;
150
+ }
151
+ });
152
+ return { commandId: output.cmdId, logs, result };
153
+ }
154
+ async readFile({
155
+ path: filePath
156
+ }) {
157
+ try {
158
+ return await this.sdk.readFileToBuffer({ path: filePath, cwd: this.cwd });
159
+ } catch {
160
+ return null;
161
+ }
162
+ }
163
+ async writeFiles({
164
+ files,
165
+ destPath
166
+ }) {
167
+ if (files.length === 0) {
168
+ return;
169
+ }
170
+ const path = await import("path");
171
+ const nativeFiles = files.map((file) => {
172
+ const filePath = path.posix.join(destPath, file.path);
173
+ const absolutePath = path.posix.isAbsolute(filePath) ? filePath : path.posix.join(this.cwd, filePath);
174
+ return {
175
+ path: absolutePath,
176
+ content: typeof file.content === "string" ? Buffer.from(file.content) : file.content
177
+ };
178
+ });
179
+ await this.sdk.writeFiles(nativeFiles);
180
+ const shellScripts = nativeFiles.filter((f) => f.path.endsWith(".sh"));
181
+ if (shellScripts.length > 0) {
182
+ const result = await this.exec({
183
+ command: "chmod",
184
+ args: ["+x", ...shellScripts.map((f) => f.path)]
185
+ });
186
+ await result.result;
187
+ }
188
+ }
189
+ // biome-ignore lint/suspicious/useAwait: synchronous SDK call
190
+ async getDomain({
191
+ port
192
+ }) {
193
+ return this.sdk.domain(port);
194
+ }
195
+ async kill({
196
+ commandId
197
+ }) {
198
+ const cmd = await this.sdk.getCommand(commandId);
199
+ await cmd.kill();
200
+ }
201
+ // biome-ignore lint/suspicious/useAwait: synchronous SDK getter
202
+ async getStatus() {
203
+ const status = this.sdk.status;
204
+ if (status === "snapshotting") {
205
+ return "stopping";
206
+ }
207
+ if (status === "aborted") {
208
+ return "failed";
209
+ }
210
+ return status;
211
+ }
212
+ async start() {
213
+ const result = await this.exec({ command: "true" });
214
+ await result.result;
215
+ }
216
+ async stop() {
217
+ await this.sdk.stop();
218
+ }
219
+ async snapshot() {
220
+ const snap = await this.sdk.snapshot();
221
+ return { snapshotId: snap.snapshotId };
222
+ }
223
+ async updateNetworkPolicy({
224
+ policy
225
+ }) {
226
+ return await this.sdk.updateNetworkPolicy(policy);
227
+ }
228
+ };
229
+ function vercelSandbox() {
230
+ return {
231
+ type: "vercel",
232
+ async create({ agent, setup, record, signal: _signal, log }) {
233
+ const storage = agent.storage;
234
+ const config = setup.config ?? {};
235
+ const cwd = config.cwd;
236
+ const resources = config.resources ?? { vcpus: DEFAULT_VCPUS };
237
+ const ports = config.ports;
238
+ const networkPolicy = config.networkPolicy ?? setup.networkPolicy ?? void 0;
239
+ const sandboxOpts = {
240
+ resources,
241
+ ports,
242
+ networkPolicy,
243
+ snapshotId: config.snapshotId
244
+ };
245
+ const _startLifecycle = (vercelSandboxId) => {
246
+ if (!record) {
247
+ return;
248
+ }
249
+ startWorkflow(sandboxLifecycleWorkflow, [
250
+ {
251
+ input: {
252
+ agent,
253
+ sandboxId: record.id,
254
+ vercelSandboxId,
255
+ config: config.lifecycle
256
+ }
257
+ }
258
+ ]).catch((e) => {
259
+ log.error("failed to start lifecycle workflow", { cause: e });
260
+ });
261
+ };
262
+ if (setup.version) {
263
+ const existing = await storage.setup.get(setup.version);
264
+ if (existing?.snapshotId) {
265
+ const sdk2 = await createSdk({
266
+ ...sandboxOpts,
267
+ snapshotId: existing.snapshotId
268
+ });
269
+ const instance2 = new VercelSandboxInstance(sdk2, cwd);
270
+ storage.setup.set(setup.version, {
271
+ ...existing,
272
+ version: setup.version,
273
+ lastUsedAt: Date.now()
274
+ }).catch(() => void 0);
275
+ return {
276
+ instance: instance2,
277
+ metadata: { sandboxId: sdk2.sandboxId }
278
+ };
279
+ }
280
+ }
281
+ if (setup.run) {
282
+ if (!setup.version) {
283
+ log.error("setup.run provided without setup.version", { setup });
284
+ throw new Error("setup.run provided without setup.version");
285
+ }
286
+ createSetupSnapshot({
287
+ sandboxOpts,
288
+ run: setup.run,
289
+ storage,
290
+ snapshotVersion: setup.version,
291
+ log
292
+ }).catch((error) => {
293
+ log.error("background setup snapshot failed", { cause: error });
294
+ });
295
+ const sdk2 = await createSdk(sandboxOpts);
296
+ const instance2 = new VercelSandboxInstance(sdk2, cwd);
297
+ await setup.run(instance2);
298
+ return {
299
+ instance: instance2,
300
+ metadata: { sandboxId: sdk2.sandboxId }
301
+ };
302
+ }
303
+ const sdk = await createSdk(sandboxOpts);
304
+ const instance = new VercelSandboxInstance(sdk, cwd);
305
+ return {
306
+ instance,
307
+ metadata: { sandboxId: sdk.sandboxId }
308
+ };
309
+ },
310
+ async connect({ metadata }) {
311
+ const SandboxSDK = await loadSandboxSDK();
312
+ const sdk = await SandboxSDK.get({
313
+ sandboxId: metadata.sandboxId,
314
+ ...getTestCredentials()
315
+ });
316
+ return new VercelSandboxInstance(sdk);
317
+ }
318
+ };
319
+ }
320
+
321
+ export {
322
+ vercelSandbox
323
+ };
324
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBzdGFydCBhcyBzdGFydFdvcmtmbG93IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0LCBTYW5kYm94QmluZGluZywgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgTGlmZWN5Y2xlQ29uZmlnIH0gZnJvbSBcIi4vdmVyY2VsLWxpZmVjeWNsZS9zdGVwc1wiO1xuaW1wb3J0IHsgc2FuZGJveExpZmVjeWNsZVdvcmtmbG93IH0gZnJvbSBcIi4vdmVyY2VsLWxpZmVjeWNsZS93b3JrZmxvd1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkU2FuZGJveFNESygpIHtcbiAgcmV0dXJuIChhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikpLlNhbmRib3g7XG59XG5cbmNvbnN0IE1BWF9USU1FT1VUX01TID0gNSAqIDYwICogNjAgKiAxMDAwOyAvLyA1IGhvdXJzXG5jb25zdCBIT01FX0RJUiA9IFwiL2hvbWUvdmVyY2VsLXNhbmRib3hcIjtcbmNvbnN0IERFRkFVTFRfVkNQVVMgPSAyO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxCaW5kaW5nQ29uZmlnID0ge1xuICBjd2Q/OiBzdHJpbmc7XG4gIHJlc291cmNlcz86IHsgdmNwdXM6IG51bWJlciB9O1xuICBwb3J0cz86IG51bWJlcltdO1xuICBuZXR3b3JrUG9saWN5PzogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k7XG4gIHNuYXBzaG90SWQ/OiBzdHJpbmc7XG4gIGxpZmVjeWNsZT86IExpZmVjeWNsZUNvbmZpZztcbn07XG5cbmV4cG9ydCB0eXBlIFZlcmNlbEJpbmRpbmdNZXRhZGF0YSA9IHtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG59O1xuXG50eXBlIENyZWF0ZVNhbmRib3hPcHRzID0ge1xuICByZXNvdXJjZXM6IHsgdmNwdXM6IG51bWJlciB9O1xuICBwb3J0cz86IG51bWJlcltdO1xuICBuZXR3b3JrUG9saWN5PzogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k7XG4gIHNuYXBzaG90SWQ/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBpc1NhbmRib3hHb25lRXJyb3IoZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzID1cbiAgICAoZSBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9KS5yZXNwb25zZT8uc3RhdHVzID8/XG4gICAgKGUgYXMgeyBjYXVzZT86IHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0gfSkuY2F1c2U/LnJlc3BvbnNlXG4gICAgICA/LnN0YXR1cztcblxuICBpZiAoc3RhdHVzID09PSA0MTAgfHwgc3RhdHVzID09PSA0MjIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IG1zZyA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gIHJldHVybiAoXG4gICAgbXNnLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgY29tbWFuZCBkYXRhXCIpIHx8XG4gICAgbXNnLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgbG9nc1wiKVxuICApO1xufVxuXG5jb25zdCBnZXRUZXN0Q3JlZGVudGlhbHMgPSAoKSA9PlxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCJcbiAgICA/IHtcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RPS0VOLFxuICAgICAgICB0ZWFtSWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RFQU1fSUQsXG4gICAgICAgIHByb2plY3RJZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfUFJPSkVDVF9JRCxcbiAgICAgIH1cbiAgICA6IHt9O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVTZGsoe1xuICByZXNvdXJjZXMsXG4gIHBvcnRzLFxuICBuZXR3b3JrUG9saWN5LFxuICBzbmFwc2hvdElkLFxufTogQ3JlYXRlU2FuZGJveE9wdHMpIHtcbiAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgcmVzb3VyY2VzLFxuICAgIHRpbWVvdXQ6IE1BWF9USU1FT1VUX01TLFxuICAgIC4uLihwb3J0cyA/IHsgcG9ydHMgfSA6IHt9KSxcbiAgICAuLi4obmV0d29ya1BvbGljeSA/IHsgbmV0d29ya1BvbGljeSB9IDoge30pLFxuICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICB9O1xuXG4gIGlmIChzbmFwc2hvdElkKSB7XG4gICAgcmV0dXJuIFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBzb3VyY2U6IHsgdHlwZTogXCJzbmFwc2hvdFwiIGFzIGNvbnN0LCBzbmFwc2hvdElkIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gU2FuZGJveFNESy5jcmVhdGUoYmFzZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNldHVwU25hcHNob3Qoe1xuICBzYW5kYm94T3B0cyxcbiAgcnVuLFxuICBzdG9yYWdlLFxuICBzbmFwc2hvdFZlcnNpb24sXG4gIGxvZyxcbn06IHtcbiAgc2FuZGJveE9wdHM6IENyZWF0ZVNhbmRib3hPcHRzO1xuICBydW46IChzYW5kYm94OiBTYW5kYm94SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD47XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNuYXBzaG90VmVyc2lvbjogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHRlbXBTZGs6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU2RrPj4gfCBudWxsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZW1wU2RrID0gYXdhaXQgY3JlYXRlU2RrKHNhbmRib3hPcHRzKTtcbiAgICBjb25zdCB0ZW1wSW5zdGFuY2UgPSBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHRlbXBTZGspO1xuICAgIGF3YWl0IHJ1bih0ZW1wSW5zdGFuY2UpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGVtcFNkay5zbmFwc2hvdCgpO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0dXAuc2V0KHNuYXBzaG90VmVyc2lvbiwge1xuICAgICAgdmVyc2lvbjogc25hcHNob3RWZXJzaW9uLFxuICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgIGxhc3RVc2VkQXQ6IG51bGwsXG4gICAgfSk7XG4gICAgYXdhaXQgdGVtcFNkay5zdG9wKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIHNldHVwIHNuYXBzaG90XCIsIHtcbiAgICAgIHNuYXBzaG90VmVyc2lvbixcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgICBpZiAodGVtcFNkaykge1xuICAgICAgYXdhaXQgdGVtcFNkay5zdG9wKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVyY2VsU2FuZGJveEluc3RhbmNlIGltcGxlbWVudHMgU2FuZGJveEluc3RhbmNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzZGs6IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5TYW5kYm94O1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzZGs6IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5TYW5kYm94LCBjd2Q/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNkayA9IHNkaztcbiAgICB0aGlzLmN3ZCA9IGN3ZCA/PyBIT01FX0RJUjtcbiAgfVxuXG4gIGFzeW5jIGV4ZWMoe1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIHN1ZG8sXG4gICAgc2lnbmFsLFxuICB9OiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBzdHJpbmdbXTtcbiAgICBjd2Q/OiBzdHJpbmc7XG4gICAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdWRvPzogYm9vbGVhbjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8RXhlY1Jlc3VsdD4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2RrLnJ1bkNvbW1hbmQoe1xuICAgICAgY21kOiBjb21tYW5kLFxuICAgICAgYXJncyxcbiAgICAgIGN3ZDogY3dkID8/IHRoaXMuY3dkLFxuICAgICAgZW52LFxuICAgICAgc3VkbyxcbiAgICAgIHNpZ25hbCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgY29uc3QgbG9nQnVmZmVyOiB7IHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7IGRhdGE6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgIHJlc29sdmU6IG51bGwgYXMgKCgpID0+IHZvaWQpIHwgbnVsbCxcbiAgICAgIGNvbnN1bWVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uc3VtZUxvZ3MgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBvdXRwdXQubG9ncygpKSB7XG4gICAgICAgICAgaWYgKGVudHJ5LnN0cmVhbSA9PT0gXCJzdGRvdXRcIikge1xuICAgICAgICAgICAgc3Rkb3V0ICs9IGVudHJ5LmRhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ZGVyciArPSBlbnRyeS5kYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvZ0J1ZmZlci5wdXNoKGVudHJ5KTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNhbmRib3ggbWF5IGhhdmUgYmVlbiBzdG9wcGVkIFx1MjAxNCBsb2dzIGVuZHBvaW50IHJldHVybnMgNDIyXG4gICAgICB9XG4gICAgICBzdGF0ZS5jb25zdW1lZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICB9KSgpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTx7XG4gICAgICBzdHJlYW06IFwic3Rkb3V0XCIgfCBcInN0ZGVyclwiO1xuICAgICAgZGF0YTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoIXN0YXRlLmNvbnN1bWVkIHx8IGluZGV4IDwgbG9nQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBpZiAoaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgeWllbGQgbG9nQnVmZmVyW2luZGV4KytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN1bWVMb2dzLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSBhd2FpdCBvdXRwdXQud2FpdCgpO1xuICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IGZpbmlzaGVkLmV4aXRDb2RlIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChpc1NhbmRib3hHb25lRXJyb3IoZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IDEgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29tbWFuZElkOiBvdXRwdXQuY21kSWQsIGxvZ3MsIHJlc3VsdCB9O1xuICB9XG5cbiAgYXN5bmMgcmVhZEZpbGUoe1xuICAgIHBhdGg6IGZpbGVQYXRoLFxuICB9OiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNkay5yZWFkRmlsZVRvQnVmZmVyKHsgcGF0aDogZmlsZVBhdGgsIGN3ZDogdGhpcy5jd2QgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyB3cml0ZUZpbGVzKHtcbiAgICBmaWxlcyxcbiAgICBkZXN0UGF0aCxcbiAgfToge1xuICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIHwgQnVmZmVyIH1bXTtcbiAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgY29uc3QgbmF0aXZlRmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5wb3NpeC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgICA/IGZpbGVQYXRoXG4gICAgICAgIDogcGF0aC5wb3NpeC5qb2luKHRoaXMuY3dkLCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIGNvbnRlbnQ6XG4gICAgICAgICAgdHlwZW9mIGZpbGUuY29udGVudCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBCdWZmZXIuZnJvbShmaWxlLmNvbnRlbnQpXG4gICAgICAgICAgICA6IGZpbGUuY29udGVudCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnNkay53cml0ZUZpbGVzKG5hdGl2ZUZpbGVzKTtcblxuICAgIGNvbnN0IHNoZWxsU2NyaXB0cyA9IG5hdGl2ZUZpbGVzLmZpbHRlcigoZikgPT4gZi5wYXRoLmVuZHNXaXRoKFwiLnNoXCIpKTtcbiAgICBpZiAoc2hlbGxTY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlYyh7XG4gICAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzLm1hcCgoZikgPT4gZi5wYXRoKV0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogc3luY2hyb25vdXMgU0RLIGNhbGxcbiAgYXN5bmMgZ2V0RG9tYWluKHtcbiAgICBwb3J0LFxuICB9OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zZGsuZG9tYWluKHBvcnQpO1xuICB9XG5cbiAgYXN5bmMga2lsbCh7XG4gICAgY29tbWFuZElkLFxuICB9OiB7XG4gICAgY29tbWFuZElkOiBzdHJpbmc7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbWQgPSBhd2FpdCB0aGlzLnNkay5nZXRDb21tYW5kKGNvbW1hbmRJZCk7XG4gICAgYXdhaXQgY21kLmtpbGwoKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IHN5bmNocm9ub3VzIFNESyBnZXR0ZXJcbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8XG4gICAgXCJwZW5kaW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwic3RvcHBpbmdcIiB8IFwic3RvcHBlZFwiIHwgXCJmYWlsZWRcIlxuICA+IHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnNkay5zdGF0dXM7XG4gICAgLy8gTWFwIFNESy1vbmx5IHN0YXR1c2VzIHRvIG91ciBpbnRlcmZhY2UncyB1bmlvblxuICAgIGlmIChzdGF0dXMgPT09IFwic25hcHNob3R0aW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0b3BwaW5nXCI7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cztcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBWZXJjZWwgU0RLIGRvZXNuJ3QgaGF2ZSBhIHJlc3VtZSBtZXRob2QuXG4gICAgLy8gUnVuIGEgbm8tb3AgY29tbWFuZCB0byB2ZXJpZnkgdGhlIHNhbmRib3ggaXMgcmVhY2hhYmxlLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlYyh7IGNvbW1hbmQ6IFwidHJ1ZVwiIH0pO1xuICAgIGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2RrLnN0b3AoKTtcbiAgfVxuXG4gIGFzeW5jIHNuYXBzaG90KCk6IFByb21pc2U8eyBzbmFwc2hvdElkOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHNuYXAgPSBhd2FpdCB0aGlzLnNkay5zbmFwc2hvdCgpO1xuICAgIHJldHVybiB7IHNuYXBzaG90SWQ6IHNuYXAuc25hcHNob3RJZCB9O1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlTmV0d29ya1BvbGljeSh7XG4gICAgcG9saWN5LFxuICB9OiB7XG4gICAgcG9saWN5OiBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuTmV0d29ya1BvbGljeTtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8aW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZGsudXBkYXRlTmV0d29ya1BvbGljeShwb2xpY3kpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJjZWxTYW5kYm94KCk6IFNhbmRib3hCaW5kaW5nPFxuICBcInZlcmNlbFwiLFxuICBWZXJjZWxCaW5kaW5nQ29uZmlnLFxuICBWZXJjZWxCaW5kaW5nTWV0YWRhdGFcbj4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwidmVyY2VsXCIsXG4gICAgYXN5bmMgY3JlYXRlKHsgYWdlbnQsIHNldHVwLCByZWNvcmQsIHNpZ25hbDogX3NpZ25hbCwgbG9nIH0pIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhZ2VudC5zdG9yYWdlO1xuICAgICAgY29uc3QgY29uZmlnID0gc2V0dXAuY29uZmlnID8/IHt9O1xuICAgICAgY29uc3QgY3dkID0gY29uZmlnLmN3ZDtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IGNvbmZpZy5yZXNvdXJjZXMgPz8geyB2Y3B1czogREVGQVVMVF9WQ1BVUyB9O1xuICAgICAgY29uc3QgcG9ydHMgPSBjb25maWcucG9ydHM7XG4gICAgICBjb25zdCBuZXR3b3JrUG9saWN5ID1cbiAgICAgICAgY29uZmlnLm5ldHdvcmtQb2xpY3kgPz8gc2V0dXAubmV0d29ya1BvbGljeSA/PyB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNhbmRib3hPcHRzOiBDcmVhdGVTYW5kYm94T3B0cyA9IHtcbiAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICBwb3J0cyxcbiAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgc25hcHNob3RJZDogY29uZmlnLnNuYXBzaG90SWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBfc3RhcnRMaWZlY3ljbGUgPSAodmVyY2VsU2FuZGJveElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFyZWNvcmQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRXb3JrZmxvdyhzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3csIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgICAgc2FuZGJveElkOiByZWNvcmQuaWQsXG4gICAgICAgICAgICAgIHZlcmNlbFNhbmRib3hJZCxcbiAgICAgICAgICAgICAgY29uZmlnOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcihcImZhaWxlZCB0byBzdGFydCBsaWZlY3ljbGUgd29ya2Zsb3dcIiwgeyBjYXVzZTogZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoc2V0dXAudmVyc2lvbikge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwLnZlcnNpb24pO1xuICAgICAgICBpZiAoZXhpc3Rpbmc/LnNuYXBzaG90SWQpIHtcbiAgICAgICAgICBjb25zdCBzZGsgPSBhd2FpdCBjcmVhdGVTZGsoe1xuICAgICAgICAgICAgLi4uc2FuZGJveE9wdHMsXG4gICAgICAgICAgICBzbmFwc2hvdElkOiBleGlzdGluZy5zbmFwc2hvdElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGssIGN3ZCk7XG5cbiAgICAgICAgICBzdG9yYWdlLnNldHVwXG4gICAgICAgICAgICAuc2V0KHNldHVwLnZlcnNpb24sIHtcbiAgICAgICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgICAgIHZlcnNpb246IHNldHVwLnZlcnNpb24sXG4gICAgICAgICAgICAgIGxhc3RVc2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94SWQ6IHNkay5zYW5kYm94SWQgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXR1cC5ydW4pIHtcbiAgICAgICAgaWYgKCFzZXR1cC52ZXJzaW9uKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFwic2V0dXAucnVuIHByb3ZpZGVkIHdpdGhvdXQgc2V0dXAudmVyc2lvblwiLCB7IHNldHVwIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHVwLnJ1biBwcm92aWRlZCB3aXRob3V0IHNldHVwLnZlcnNpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlU2V0dXBTbmFwc2hvdCh7XG4gICAgICAgICAgc2FuZGJveE9wdHMsXG4gICAgICAgICAgcnVuOiBzZXR1cC5ydW4sXG4gICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICBzbmFwc2hvdFZlcnNpb246IHNldHVwLnZlcnNpb24sXG4gICAgICAgICAgbG9nLFxuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJiYWNrZ3JvdW5kIHNldHVwIHNuYXBzaG90IGZhaWxlZFwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2RrID0gYXdhaXQgY3JlYXRlU2RrKHNhbmRib3hPcHRzKTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHNkaywgY3dkKTtcbiAgICAgICAgYXdhaXQgc2V0dXAucnVuKGluc3RhbmNlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogc2RrLnNhbmRib3hJZCB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZGsgPSBhd2FpdCBjcmVhdGVTZGsoc2FuZGJveE9wdHMpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHNkaywgY3dkKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogc2RrLnNhbmRib3hJZCB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY29ubmVjdCh7IG1ldGFkYXRhIH0pIHtcbiAgICAgIGNvbnN0IFNhbmRib3hTREsgPSBhd2FpdCBsb2FkU2FuZGJveFNESygpO1xuICAgICAgY29uc3Qgc2RrID0gYXdhaXQgU2FuZGJveFNESy5nZXQoe1xuICAgICAgICBzYW5kYm94SWQ6IG1ldGFkYXRhLnNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHNkayk7XG4gICAgfSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBQUEsU0FBUyxTQUFTLHFCQUFxQjtBQU92QyxlQUFlLGlCQUFpQjtBQUM5QixVQUFRLE1BQU0sT0FBTyxpQkFBaUIsR0FBRztBQUMzQztBQUVBLElBQU0saUJBQWlCLElBQUksS0FBSyxLQUFLO0FBQ3JDLElBQU0sV0FBVztBQUNqQixJQUFNLGdCQUFnQjtBQXNCdEIsU0FBUyxtQkFBbUIsR0FBcUI7QUFDL0MsTUFBSSxFQUFFLGFBQWEsUUFBUTtBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FDSCxFQUF5QyxVQUFVLFVBQ25ELEVBQXFELE9BQU8sVUFDekQ7QUFFTixNQUFJLFdBQVcsT0FBTyxXQUFXLEtBQUs7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLE1BQU0sRUFBRSxXQUFXLE9BQU8sQ0FBQztBQUNqQyxTQUNFLElBQUksU0FBUyxtQ0FBbUMsS0FDaEQsSUFBSSxTQUFTLDJCQUEyQjtBQUU1QztBQUVBLElBQU0scUJBQXFCLE1BQ3pCLFFBQVEsSUFBSSxhQUFhLFNBQ3JCO0FBQUEsRUFDRSxPQUFPLFFBQVEsSUFBSTtBQUFBLEVBQ25CLFFBQVEsUUFBUSxJQUFJO0FBQUEsRUFDcEIsV0FBVyxRQUFRLElBQUk7QUFDekIsSUFDQSxDQUFDO0FBRVAsZUFBZSxVQUFVO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUFzQjtBQUNwQixRQUFNLGFBQWEsTUFBTSxlQUFlO0FBQ3hDLFFBQU0sT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULEdBQUksUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEsSUFD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QUksTUFBTSxTQUFTO0FBQUEsWUFDbEIsR0FBRztBQUFBLFlBQ0gsU0FBUyxNQUFNO0FBQUEsWUFDZixZQUFZLEtBQUssSUFBSTtBQUFBLFVBQ3ZCLENBQUMsRUFDQSxNQUFNLE1BQU0sTUFBUztBQUV4QixpQkFBTztBQUFBLFlBQ0wsVUFBQUM7QUFBQSxZQUNBLFVBQVUsRUFBRSxXQUFXRCxLQUFJLFVBQVU7QUFBQSxVQUN2QztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxNQUFNLEtBQUs7QUFDYixZQUFJLENBQUMsTUFBTSxTQUFTO0FBQ2xCLGNBQUksTUFBTSw0Q0FBNEMsRUFBRSxNQUFNLENBQUM7QUFDL0QsZ0JBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLFFBQzVEO0FBQ0EsNEJBQW9CO0FBQUEsVUFDbEI7QUFBQSxVQUNBLEtBQUssTUFBTTtBQUFBLFVBQ1g7QUFBQSxVQUNBLGlCQUFpQixNQUFNO0FBQUEsVUFDdkI7QUFBQSxRQUNGLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVTtBQUNsQixjQUFJLE1BQU0sb0NBQW9DLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxRQUNoRSxDQUFDO0FBRUQsY0FBTUEsT0FBTSxNQUFNLFVBQVUsV0FBVztBQUN2QyxjQUFNQyxZQUFXLElBQUksc0JBQXNCRCxNQUFLLEdBQUc7QUFDbkQsY0FBTSxNQUFNLElBQUlDLFNBQVE7QUFFeEIsZUFBTztBQUFBLFVBQ0wsVUFBQUE7QUFBQSxVQUNBLFVBQVUsRUFBRSxXQUFXRCxLQUFJLFVBQVU7QUFBQSxRQUN2QztBQUFBLE1BQ0Y7QUFFQSxZQUFNLE1BQU0sTUFBTSxVQUFVLFdBQVc7QUFDdkMsWUFBTSxXQUFXLElBQUksc0JBQXNCLEtBQUssR0FBRztBQUVuRCxhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsVUFBVSxFQUFFLFdBQVcsSUFBSSxVQUFVO0FBQUEsTUFDdkM7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLFFBQVEsRUFBRSxTQUFTLEdBQUc7QUFDMUIsWUFBTSxhQUFhLE1BQU0sZUFBZTtBQUN4QyxZQUFNLE1BQU0sTUFBTSxXQUFXLElBQUk7QUFBQSxRQUMvQixXQUFXLFNBQVM7QUFBQSxRQUNwQixHQUFHLG1CQUFtQjtBQUFBLE1BQ3hCLENBQUM7QUFDRCxhQUFPLElBQUksc0JBQXNCLEdBQUc7QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsic2RrIiwgImluc3RhbmNlIl0KfQo=