experimental-agent 0.8.0-alpha.1 → 0.8.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 (50) hide show
  1. package/dist/{adapter-txsF6hou.d.mts → adapter-CFq5IeYI.d.mts} +2 -1
  2. package/dist/{adapter-txsF6hou.d.ts → adapter-CFq5IeYI.d.ts} +2 -1
  3. package/dist/chunk-5N2UOGXY.mjs +123 -0
  4. package/dist/chunk-HPBAZJLN.mjs +242 -0
  5. package/dist/chunk-HVZTAMAX.mjs +3771 -0
  6. package/dist/{client-BbQZtxca.d.ts → client-BY6gceox.d.ts} +5 -56
  7. package/dist/{client-B2ohNvwc.d.mts → client-BaItaOx5.d.mts} +5 -56
  8. package/dist/{entry-ok9EBUS3.d.ts → entry-BUYBv4Cu.d.ts} +1 -1
  9. package/dist/{entry-BUiucCNp.d.mts → entry-CRBUC5DB.d.mts} +1 -1
  10. package/dist/framework-DSe3sdP_.d.ts +66 -0
  11. package/dist/framework-VPUsYNMf.d.mts +66 -0
  12. package/dist/framework-runtime.d.mts +37 -0
  13. package/dist/framework-runtime.d.ts +37 -0
  14. package/dist/framework-runtime.js +5449 -0
  15. package/dist/framework-runtime.mjs +133 -0
  16. package/dist/framework.d.mts +11 -0
  17. package/dist/framework.d.ts +11 -0
  18. package/dist/framework.js +278 -0
  19. package/dist/framework.mjs +8 -0
  20. package/dist/index.d.mts +33 -10
  21. package/dist/index.d.ts +33 -10
  22. package/dist/index.js +45 -4
  23. package/dist/index.mjs +159 -3860
  24. package/dist/lifecycle-workflow-steps.d.mts +2 -2
  25. package/dist/lifecycle-workflow-steps.d.ts +2 -2
  26. package/dist/lifecycle-workflow.d.mts +2 -2
  27. package/dist/lifecycle-workflow.d.ts +2 -2
  28. package/dist/next/agents.d.mts +43 -0
  29. package/dist/next/agents.d.ts +43 -0
  30. package/dist/next/agents.js +407 -0
  31. package/dist/next/agents.mjs +137 -0
  32. package/dist/next/loader.js +19 -3
  33. package/dist/next/loader.mjs +1 -1
  34. package/dist/next.js +22 -4
  35. package/dist/next.mjs +5 -3
  36. package/dist/react.d.mts +5 -4
  37. package/dist/react.d.ts +5 -4
  38. package/dist/resolve-DCys_2es.d.ts +47 -0
  39. package/dist/resolve-YlI7Dugf.d.mts +47 -0
  40. package/dist/sandbox.d.mts +3 -3
  41. package/dist/sandbox.d.ts +3 -3
  42. package/dist/sandbox.mjs +2 -2
  43. package/dist/{steps-Mi3sjYbD.d.mts → steps-ChOeFWAq.d.mts} +1 -1
  44. package/dist/{steps-BOKeU8X3.d.ts → steps-DWTQiAPt.d.ts} +1 -1
  45. package/dist/storage.d.mts +2 -2
  46. package/dist/storage.d.ts +2 -2
  47. package/dist/types-B3lbsOa7.d.mts +53 -0
  48. package/dist/types-B3lbsOa7.d.ts +53 -0
  49. package/package.json +13 -13
  50. package/dist/chunk-CCWLV27N.mjs +0 -107
@@ -1,6 +1,6 @@
1
1
  import { WORKFLOW_SERIALIZE, WORKFLOW_DESERIALIZE } from '@workflow/serde';
2
2
  import { NetworkPolicy } from '@vercel/sandbox';
3
- import { UIMessage } from 'ai';
3
+ import { UIMessage, JSONValue } from 'ai';
4
4
 
5
5
  type GenerationOptions = {
6
6
  maxSteps?: number;
@@ -11,6 +11,7 @@ type GenerationOptions = {
11
11
  presencePenalty?: number;
12
12
  maxOutputTokens?: number;
13
13
  headers?: Record<string, string>;
14
+ providerOptions?: Record<string, Record<string, JSONValue>>;
14
15
  };
15
16
  type Session = {
16
17
  id: string;
@@ -1,6 +1,6 @@
1
1
  import { WORKFLOW_SERIALIZE, WORKFLOW_DESERIALIZE } from '@workflow/serde';
2
2
  import { NetworkPolicy } from '@vercel/sandbox';
3
- import { UIMessage } from 'ai';
3
+ import { UIMessage, JSONValue } from 'ai';
4
4
 
5
5
  type GenerationOptions = {
6
6
  maxSteps?: number;
@@ -11,6 +11,7 @@ type GenerationOptions = {
11
11
  presencePenalty?: number;
12
12
  maxOutputTokens?: number;
13
13
  headers?: Record<string, string>;
14
+ providerOptions?: Record<string, Record<string, JSONValue>>;
14
15
  };
15
16
  type Session = {
16
17
  id: string;
@@ -0,0 +1,123 @@
1
+ // package.json
2
+ var package_default = {
3
+ name: "experimental-agent",
4
+ version: "0.8.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
+ "./next/agents": {
40
+ types: "./dist/next/agents.d.ts",
41
+ import: "./dist/next/agents.mjs",
42
+ require: "./dist/next/agents.js"
43
+ },
44
+ "./framework": {
45
+ types: "./dist/framework.d.ts",
46
+ import: "./dist/framework.mjs",
47
+ require: "./dist/framework.js"
48
+ },
49
+ "./framework-runtime": {
50
+ types: "./dist/framework-runtime.d.ts",
51
+ import: "./dist/framework-runtime.mjs",
52
+ require: "./dist/framework-runtime.js"
53
+ },
54
+ "./client": {
55
+ types: "./dist/client.d.ts",
56
+ import: "./dist/client.mjs",
57
+ require: "./dist/client.js"
58
+ },
59
+ "./lifecycle-workflow": {
60
+ types: "./dist/lifecycle-workflow.d.ts",
61
+ import: "./dist/lifecycle-workflow.mjs",
62
+ require: "./dist/lifecycle-workflow.js"
63
+ },
64
+ "./lifecycle-workflow-steps": {
65
+ types: "./dist/lifecycle-workflow-steps.d.ts",
66
+ import: "./dist/lifecycle-workflow-steps.mjs",
67
+ require: "./dist/lifecycle-workflow-steps.js"
68
+ },
69
+ "./react": {
70
+ types: "./dist/react.d.ts",
71
+ import: "./dist/react.mjs",
72
+ require: "./dist/react.js"
73
+ }
74
+ },
75
+ scripts: {
76
+ build: "tsup",
77
+ dev: "tsup --watch",
78
+ clean: "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
79
+ release: "pnpm build && npm publish",
80
+ typecheck: "tsc --noEmit",
81
+ test: "vitest run",
82
+ "test:watch": "vitest"
83
+ },
84
+ dependencies: {
85
+ "@elysiajs/openapi": "^1.4.14",
86
+ "@swc/core": "^1.10.0",
87
+ "@tanstack/react-query": "^5.90.21",
88
+ "@vercel/kv2": "^0.0.18",
89
+ "@vercel/oidc": "^3.1.0",
90
+ "@vercel/sandbox": "1.7.1",
91
+ "@workflow/serde": "4.1.0-beta.2",
92
+ "better-all": "^0.0.5",
93
+ elysia: "^1.4.25",
94
+ errore: "^0.14.0",
95
+ "fast-deep-equal": "^3.1.3",
96
+ ulid: "^3.0.2",
97
+ zod: "^4.3.6"
98
+ },
99
+ devDependencies: {
100
+ "@agent/tsconfig": "workspace:*",
101
+ "@ai-sdk/react": "^3.0.88",
102
+ "@types/node": "^20.11.24",
103
+ "@types/react": "^19.2.14",
104
+ dotenv: "^17.2.3",
105
+ next: "^16.0.0",
106
+ react: "^19.2.4",
107
+ tsup: "^8.0.2",
108
+ typescript: "5.5.4",
109
+ vitest: "^3.0.0",
110
+ workflow: "4.2.0-beta.70"
111
+ },
112
+ peerDependencies: {
113
+ ai: "^6.0.0"
114
+ },
115
+ publishConfig: {
116
+ access: "public"
117
+ }
118
+ };
119
+
120
+ export {
121
+ package_default
122
+ };
123
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjguMFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9zdG9yYWdlXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3Qvc3RvcmFnZS5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9zdG9yYWdlLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L3N0b3JhZ2UuanNcIlxuICAgIH0sXG4gICAgXCIuL3NhbmRib3hcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9zYW5kYm94LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L3NhbmRib3gubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3Qvc2FuZGJveC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbmV4dFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9uZXh0LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0L2xvYWRlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0L2FnZW50c1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQvYWdlbnRzLmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L25leHQvYWdlbnRzLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQvYWdlbnRzLmpzXCJcbiAgICB9LFxuICAgIFwiLi9mcmFtZXdvcmtcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9mcmFtZXdvcmsuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvZnJhbWV3b3JrLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2ZyYW1ld29yay5qc1wiXG4gICAgfSxcbiAgICBcIi4vZnJhbWV3b3JrLXJ1bnRpbWVcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9mcmFtZXdvcmstcnVudGltZS5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9mcmFtZXdvcmstcnVudGltZS5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9mcmFtZXdvcmstcnVudGltZS5qc1wiXG4gICAgfSxcbiAgICBcIi4vY2xpZW50XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvY2xpZW50LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2NsaWVudC5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9jbGllbnQuanNcIlxuICAgIH0sXG4gICAgXCIuL2xpZmVjeWNsZS13b3JrZmxvd1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3cubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LmpzXCJcbiAgICB9LFxuICAgIFwiLi9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHNcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHMuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy5qc1wiXG4gICAgfSxcbiAgICBcIi4vcmVhY3RcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9yZWFjdC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9yZWFjdC5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9yZWFjdC5qc1wiXG4gICAgfVxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiYnVpbGRcIjogXCJ0c3VwXCIsXG4gICAgXCJkZXZcIjogXCJ0c3VwIC0td2F0Y2hcIixcbiAgICBcImNsZWFuXCI6IFwicm0gLXJmIC50dXJibyAmJiBybSAtcmYgbm9kZV9tb2R1bGVzICYmIHJtIC1yZiBkaXN0XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwicG5wbSBidWlsZCAmJiBucG0gcHVibGlzaFwiLFxuICAgIFwidHlwZWNoZWNrXCI6IFwidHNjIC0tbm9FbWl0XCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0IHJ1blwiLFxuICAgIFwidGVzdDp3YXRjaFwiOiBcInZpdGVzdFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBlbHlzaWFqcy9vcGVuYXBpXCI6IFwiXjEuNC4xNFwiLFxuICAgIFwiQHN3Yy9jb3JlXCI6IFwiXjEuMTAuMFwiLFxuICAgIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCI6IFwiXjUuOTAuMjFcIixcbiAgICBcIkB2ZXJjZWwva3YyXCI6IFwiXjAuMC4xOFwiLFxuICAgIFwiQHZlcmNlbC9vaWRjXCI6IFwiXjMuMS4wXCIsXG4gICAgXCJAdmVyY2VsL3NhbmRib3hcIjogXCIxLjcuMVwiLFxuICAgIFwiQHdvcmtmbG93L3NlcmRlXCI6IFwiNC4xLjAtYmV0YS4yXCIsXG4gICAgXCJiZXR0ZXItYWxsXCI6IFwiXjAuMC41XCIsXG4gICAgXCJlbHlzaWFcIjogXCJeMS40LjI1XCIsXG4gICAgXCJlcnJvcmVcIjogXCJeMC4xNC4wXCIsXG4gICAgXCJmYXN0LWRlZXAtZXF1YWxcIjogXCJeMy4xLjNcIixcbiAgICBcInVsaWRcIjogXCJeMy4wLjJcIixcbiAgICBcInpvZFwiOiBcIl40LjMuNlwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBhZ2VudC90c2NvbmZpZ1wiOiBcIndvcmtzcGFjZToqXCIsXG4gICAgXCJAYWktc2RrL3JlYWN0XCI6IFwiXjMuMC44OFwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMTEuMjRcIixcbiAgICBcIkB0eXBlcy9yZWFjdFwiOiBcIl4xOS4yLjE0XCIsXG4gICAgXCJkb3RlbnZcIjogXCJeMTcuMi4zXCIsXG4gICAgXCJuZXh0XCI6IFwiXjE2LjAuMFwiLFxuICAgIFwicmVhY3RcIjogXCJeMTkuMi40XCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMC4yXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiNS41LjRcIixcbiAgICBcInZpdGVzdFwiOiBcIl4zLjAuMFwiLFxuICAgIFwid29ya2Zsb3dcIjogXCI0LjIuMC1iZXRhLjcwXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImFpXCI6IFwiXjYuMC4wXCJcbiAgfSxcbiAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICBcImFjY2Vzc1wiOiBcInB1YmxpY1wiXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQTtBQUFBLEVBQ0UsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLEVBQ1gsTUFBUTtBQUFBLEVBQ1IsUUFBVTtBQUFBLEVBQ1YsT0FBUztBQUFBLEVBQ1QsYUFBZTtBQUFBLEVBQ2YsU0FBVztBQUFBLEVBQ1gsT0FBUztBQUFBLElBQ1A7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxLQUFLO0FBQUEsTUFDSCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsYUFBYTtBQUFBLE1BQ1gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsaUJBQWlCO0FBQUEsTUFDZixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsaUJBQWlCO0FBQUEsTUFDZixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2IsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLHVCQUF1QjtBQUFBLE1BQ3JCLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0Esd0JBQXdCO0FBQUEsTUFDdEIsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLDhCQUE4QjtBQUFBLE1BQzVCLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxXQUFXO0FBQUEsTUFDVCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVc7QUFBQSxJQUNULE9BQVM7QUFBQSxJQUNULEtBQU87QUFBQSxJQUNQLE9BQVM7QUFBQSxJQUNULFNBQVc7QUFBQSxJQUNYLFdBQWE7QUFBQSxJQUNiLE1BQVE7QUFBQSxJQUNSLGNBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsY0FBZ0I7QUFBQSxJQUNkLHFCQUFxQjtBQUFBLElBQ3JCLGFBQWE7QUFBQSxJQUNiLHlCQUF5QjtBQUFBLElBQ3pCLGVBQWU7QUFBQSxJQUNmLGdCQUFnQjtBQUFBLElBQ2hCLG1CQUFtQjtBQUFBLElBQ25CLG1CQUFtQjtBQUFBLElBQ25CLGNBQWM7QUFBQSxJQUNkLFFBQVU7QUFBQSxJQUNWLFFBQVU7QUFBQSxJQUNWLG1CQUFtQjtBQUFBLElBQ25CLE1BQVE7QUFBQSxJQUNSLEtBQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxpQkFBbUI7QUFBQSxJQUNqQixtQkFBbUI7QUFBQSxJQUNuQixpQkFBaUI7QUFBQSxJQUNqQixlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixRQUFVO0FBQUEsSUFDVixNQUFRO0FBQUEsSUFDUixPQUFTO0FBQUEsSUFDVCxNQUFRO0FBQUEsSUFDUixZQUFjO0FBQUEsSUFDZCxRQUFVO0FBQUEsSUFDVixVQUFZO0FBQUEsRUFDZDtBQUFBLEVBQ0Esa0JBQW9CO0FBQUEsSUFDbEIsSUFBTTtBQUFBLEVBQ1I7QUFBQSxFQUNBLGVBQWlCO0FBQUEsSUFDZixRQUFVO0FBQUEsRUFDWjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,242 @@
1
+ // src/framework/generate.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ var TS_IMPORT_EXT = /\.(ts|mts)$/;
5
+ function generateRegistry(opts) {
6
+ const entries = opts.agents.map(
7
+ (agent) => inlineEntry({ agent, outputDir: opts.outputDir })
8
+ );
9
+ return [
10
+ "// Auto-generated by withAgents - do not edit",
11
+ 'import type { AgentRegistry } from "experimental-agent/framework";',
12
+ "",
13
+ "export const agents = {",
14
+ ...entries,
15
+ "} satisfies AgentRegistry;",
16
+ ""
17
+ ].join("\n");
18
+ }
19
+ function inlineEntry(opts) {
20
+ const config = buildConfig(opts.agent);
21
+ const configStr = JSON.stringify(config, null, 2).split("\n").map((line, i) => i === 0 ? line : ` ${line}`).join("\n");
22
+ const parts = [` config: ${configStr}`];
23
+ if (opts.agent.hasAgentConfig) {
24
+ const configPath = findAgentConfigPath(opts.agent.absolutePath);
25
+ const relativePath = relativeImportPath({
26
+ from: opts.outputDir,
27
+ to: configPath
28
+ });
29
+ parts.push(` import: () => import(${JSON.stringify(relativePath)})`);
30
+ }
31
+ if (opts.agent.tools.length > 0) {
32
+ const toolLines = opts.agent.tools.map((tool) => {
33
+ const rel = relativeImportPath({
34
+ from: opts.outputDir,
35
+ to: tool.importPath
36
+ });
37
+ return ` ${JSON.stringify(tool.name)}: () => import(${JSON.stringify(rel)})`;
38
+ });
39
+ parts.push(` imports: {
40
+ tools: {
41
+ ${toolLines.join(",\n")}
42
+ }
43
+ }`);
44
+ }
45
+ return ` ${JSON.stringify(opts.agent.name)}: {
46
+ ${parts.join(",\n")}
47
+ },`;
48
+ }
49
+ function buildConfig(agent) {
50
+ const config = {};
51
+ if (agent.systemPrompt) {
52
+ config.system = agent.systemPrompt;
53
+ }
54
+ if (agent.skills.length > 0) {
55
+ config.skills = agent.skills;
56
+ }
57
+ return config;
58
+ }
59
+ function findAgentConfigPath(agentDir) {
60
+ const extensions = [".ts", ".js", ".mts", ".mjs"];
61
+ for (const ext of extensions) {
62
+ const candidate = path.join(agentDir, `agent${ext}`);
63
+ if (fs.existsSync(candidate)) {
64
+ return candidate;
65
+ }
66
+ }
67
+ return path.join(agentDir, "agent");
68
+ }
69
+ function relativeImportPath(opts) {
70
+ let rel = path.relative(opts.from, opts.to).replace(/\\/g, "/");
71
+ rel = rel.replace(TS_IMPORT_EXT, "");
72
+ if (!rel.startsWith(".")) {
73
+ rel = `./${rel}`;
74
+ }
75
+ return rel;
76
+ }
77
+
78
+ // src/framework/scan.ts
79
+ import * as fs2 from "fs";
80
+ import * as path2 from "path";
81
+ var AGENT_CONFIG_FILES = ["agent.ts", "agent.js", "agent.mts", "agent.mjs"];
82
+ var MD_EXT = /\.md$/;
83
+ var TS_EXT = /\.(ts|js|mts|mjs)$/;
84
+ function listDir(dir) {
85
+ if (!fs2.existsSync(dir)) {
86
+ return [];
87
+ }
88
+ return fs2.readdirSync(dir);
89
+ }
90
+ function readFile(filePath) {
91
+ return fs2.readFileSync(filePath, "utf-8");
92
+ }
93
+ function fileExists(filePath) {
94
+ return fs2.existsSync(filePath);
95
+ }
96
+ function isDirectory(filePath) {
97
+ return fs2.existsSync(filePath) && fs2.statSync(filePath).isDirectory();
98
+ }
99
+ function discoverAgentDirs(agentsRoot) {
100
+ const entries = listDir(agentsRoot);
101
+ const dirs = [];
102
+ for (const entry of entries) {
103
+ const absolutePath = path2.join(agentsRoot, entry);
104
+ if (!isDirectory(absolutePath)) {
105
+ continue;
106
+ }
107
+ if (entry.startsWith(".")) {
108
+ continue;
109
+ }
110
+ dirs.push({
111
+ name: entry,
112
+ absolutePath,
113
+ hasAgentConfig: hasAgentConfig(absolutePath)
114
+ });
115
+ }
116
+ return dirs;
117
+ }
118
+ function hasAgentConfig(agentDir) {
119
+ return AGENT_CONFIG_FILES.some((f) => fileExists(path2.join(agentDir, f)));
120
+ }
121
+ function getSkills(agentDir) {
122
+ const skillsDir = path2.join(agentDir, "skills");
123
+ const entries = listDir(skillsDir);
124
+ const skills = [];
125
+ const tsSkillImportPaths = [];
126
+ for (const entry of entries.sort()) {
127
+ const absolutePath = path2.join(skillsDir, entry);
128
+ if (MD_EXT.test(entry)) {
129
+ skills.push({
130
+ type: "host",
131
+ path: absolutePath
132
+ });
133
+ } else if (TS_EXT.test(entry)) {
134
+ tsSkillImportPaths.push(absolutePath);
135
+ }
136
+ }
137
+ return { skills, tsSkillImportPaths };
138
+ }
139
+ function getSystemPrompt(agentDir) {
140
+ const systemDir = path2.join(agentDir, "system");
141
+ const entries = listDir(systemDir);
142
+ const mdFiles = entries.filter((e) => MD_EXT.test(e)).sort();
143
+ if (mdFiles.length === 0) {
144
+ return void 0;
145
+ }
146
+ const parts = [];
147
+ for (const file of mdFiles) {
148
+ const content = readFile(path2.join(systemDir, file)).trim();
149
+ if (content) {
150
+ parts.push(content);
151
+ }
152
+ }
153
+ return parts.length > 0 ? parts.join("\n\n") : void 0;
154
+ }
155
+ function getTools(agentDir) {
156
+ const toolsDir = path2.join(agentDir, "tools");
157
+ const entries = listDir(toolsDir);
158
+ const tools = [];
159
+ for (const entry of entries.sort()) {
160
+ const absolutePath = path2.join(toolsDir, entry);
161
+ if (isDirectory(absolutePath)) {
162
+ const indexFile = findIndexFile(absolutePath);
163
+ if (indexFile) {
164
+ tools.push({ name: entry, importPath: indexFile });
165
+ }
166
+ } else if (TS_EXT.test(entry)) {
167
+ const name = entry.replace(TS_EXT, "");
168
+ tools.push({ name, importPath: absolutePath });
169
+ }
170
+ }
171
+ return tools;
172
+ }
173
+ function findIndexFile(dir) {
174
+ const extensions = [".ts", ".js", ".mts", ".mjs"];
175
+ for (const ext of extensions) {
176
+ const candidate = path2.join(dir, `index${ext}`);
177
+ if (fileExists(candidate)) {
178
+ return candidate;
179
+ }
180
+ }
181
+ return null;
182
+ }
183
+ function scanAgent(agentDir) {
184
+ const { skills, tsSkillImportPaths } = getSkills(agentDir.absolutePath);
185
+ const systemPrompt = getSystemPrompt(agentDir.absolutePath);
186
+ const tools = getTools(agentDir.absolutePath);
187
+ return { ...agentDir, skills, systemPrompt, tsSkillImportPaths, tools };
188
+ }
189
+ function findAgentsRoot(cwd, userDefinedAgentsDir) {
190
+ if (userDefinedAgentsDir) {
191
+ return path2.resolve(cwd, userDefinedAgentsDir);
192
+ }
193
+ const candidates = [
194
+ path2.join(cwd, "src", "agents"),
195
+ path2.join(cwd, "agents")
196
+ ];
197
+ for (const candidate of candidates) {
198
+ if (isDirectory(candidate)) {
199
+ return candidate;
200
+ }
201
+ }
202
+ return null;
203
+ }
204
+
205
+ // src/framework/framework.ts
206
+ var Framework = class {
207
+ cwd;
208
+ agentsDir;
209
+ log;
210
+ constructor(opts) {
211
+ this.cwd = opts.cwd ?? process.cwd();
212
+ this.agentsDir = opts.agentsDir;
213
+ this.log = opts.debug ? console.log.bind(console, "[Framework]") : () => void 0;
214
+ }
215
+ /**
216
+ * Scan the agents directory and return metadata for every agent found.
217
+ * Each subfolder inside the agents directory becomes one agent.
218
+ * Returns an empty array when no agents directory exists.
219
+ */
220
+ discoverAgents() {
221
+ const root = findAgentsRoot(this.cwd, this.agentsDir);
222
+ if (!root) {
223
+ return [];
224
+ }
225
+ const dirs = discoverAgentDirs(root);
226
+ return dirs.map(scanAgent);
227
+ }
228
+ /**
229
+ * Generate the TypeScript source for an agent registry module.
230
+ *
231
+ * @param opts.agents - Scanned agents to include in the registry.
232
+ * @param opts.outputDir - Directory where the registry file will be written
233
+ * (used to compute relative import paths to each agent's config module).
234
+ * @returns The full source text of the generated `_registry.ts` file.
235
+ */
236
+ generateRegistrySource = generateRegistry;
237
+ };
238
+
239
+ export {
240
+ Framework
241
+ };
242
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZyYW1ld29yay9nZW5lcmF0ZS50cyIsICIuLi9zcmMvZnJhbWV3b3JrL3NjYW4udHMiLCAiLi4vc3JjL2ZyYW1ld29yay9mcmFtZXdvcmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgU2Nhbm5lZEFnZW50IH0gZnJvbSBcIi4vc2NhblwiO1xuXG5jb25zdCBUU19JTVBPUlRfRVhUID0gL1xcLih0c3xtdHMpJC87XG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSZWdpc3RyeShvcHRzOiB7XG4gIGFnZW50czogU2Nhbm5lZEFnZW50W107XG4gIG91dHB1dERpcjogc3RyaW5nO1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IGVudHJpZXMgPSBvcHRzLmFnZW50cy5tYXAoKGFnZW50KSA9PlxuICAgIGlubGluZUVudHJ5KHsgYWdlbnQsIG91dHB1dERpcjogb3B0cy5vdXRwdXREaXIgfSlcbiAgKTtcblxuICByZXR1cm4gW1xuICAgIFwiLy8gQXV0by1nZW5lcmF0ZWQgYnkgd2l0aEFnZW50cyAtIGRvIG5vdCBlZGl0XCIsXG4gICAgJ2ltcG9ydCB0eXBlIHsgQWdlbnRSZWdpc3RyeSB9IGZyb20gXCJleHBlcmltZW50YWwtYWdlbnQvZnJhbWV3b3JrXCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGNvbnN0IGFnZW50cyA9IHtcIixcbiAgICAuLi5lbnRyaWVzLFxuICAgIFwifSBzYXRpc2ZpZXMgQWdlbnRSZWdpc3RyeTtcIixcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIGlubGluZUVudHJ5KG9wdHM6IHtcbiAgYWdlbnQ6IFNjYW5uZWRBZ2VudDtcbiAgb3V0cHV0RGlyOiBzdHJpbmc7XG59KTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gYnVpbGRDb25maWcob3B0cy5hZ2VudCk7XG4gIGNvbnN0IGNvbmZpZ1N0ciA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMilcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKChsaW5lLCBpKSA9PiAoaSA9PT0gMCA/IGxpbmUgOiBgICAgICAgJHtsaW5lfWApKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IHBhcnRzID0gW2AgICAgY29uZmlnOiAke2NvbmZpZ1N0cn1gXTtcblxuICBpZiAob3B0cy5hZ2VudC5oYXNBZ2VudENvbmZpZykge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kQWdlbnRDb25maWdQYXRoKG9wdHMuYWdlbnQuYWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZUltcG9ydFBhdGgoe1xuICAgICAgZnJvbTogb3B0cy5vdXRwdXREaXIsXG4gICAgICB0bzogY29uZmlnUGF0aCxcbiAgICB9KTtcbiAgICBwYXJ0cy5wdXNoKGAgICAgaW1wb3J0OiAoKSA9PiBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShyZWxhdGl2ZVBhdGgpfSlgKTtcbiAgfVxuXG4gIGlmIChvcHRzLmFnZW50LnRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB0b29sTGluZXMgPSBvcHRzLmFnZW50LnRvb2xzLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3QgcmVsID0gcmVsYXRpdmVJbXBvcnRQYXRoKHtcbiAgICAgICAgZnJvbTogb3B0cy5vdXRwdXREaXIsXG4gICAgICAgIHRvOiB0b29sLmltcG9ydFBhdGgsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBgICAgICAgICAke0pTT04uc3RyaW5naWZ5KHRvb2wubmFtZSl9OiAoKSA9PiBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShyZWwpfSlgO1xuICAgIH0pO1xuICAgIHBhcnRzLnB1c2goYCAgICBpbXBvcnRzOiB7XFxuICAgICAgdG9vbHM6IHtcXG4ke3Rvb2xMaW5lcy5qb2luKFwiLFxcblwiKX1cXG4gICAgICB9XFxuICAgIH1gKTtcbiAgfVxuXG4gIHJldHVybiBgICAke0pTT04uc3RyaW5naWZ5KG9wdHMuYWdlbnQubmFtZSl9OiB7XFxuJHtwYXJ0cy5qb2luKFwiLFxcblwiKX1cXG4gIH0sYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb25maWcoYWdlbnQ6IFNjYW5uZWRBZ2VudCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGlmIChhZ2VudC5zeXN0ZW1Qcm9tcHQpIHtcbiAgICBjb25maWcuc3lzdGVtID0gYWdlbnQuc3lzdGVtUHJvbXB0O1xuICB9XG5cbiAgaWYgKGFnZW50LnNraWxscy5sZW5ndGggPiAwKSB7XG4gICAgY29uZmlnLnNraWxscyA9IGFnZW50LnNraWxscztcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIGZpbmRBZ2VudENvbmZpZ1BhdGgoYWdlbnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dGVuc2lvbnMgPSBbXCIudHNcIiwgXCIuanNcIiwgXCIubXRzXCIsIFwiLm1qc1wiXTtcbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihhZ2VudERpciwgYGFnZW50JHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbihhZ2VudERpciwgXCJhZ2VudFwiKTtcbn1cblxuZnVuY3Rpb24gcmVsYXRpdmVJbXBvcnRQYXRoKG9wdHM6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBsZXQgcmVsID0gcGF0aC5yZWxhdGl2ZShvcHRzLmZyb20sIG9wdHMudG8pLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICByZWwgPSByZWwucmVwbGFjZShUU19JTVBPUlRfRVhULCBcIlwiKTtcbiAgaWYgKCFyZWwuc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICByZWwgPSBgLi8ke3JlbH1gO1xuICB9XG4gIHJldHVybiByZWw7XG59XG5cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEhvc3RTa2lsbElucHV0LCBTa2lsbElucHV0IH0gZnJvbSBcIi4uL3NraWxscy90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBBZ2VudERpciA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbiAgaGFzQWdlbnRDb25maWc6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBTY2FubmVkVG9vbCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBpbXBvcnRQYXRoOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTY2FubmVkQWdlbnQgPSBBZ2VudERpciAmIHtcbiAgc2tpbGxzOiBTa2lsbElucHV0W107XG4gIHN5c3RlbVByb21wdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0c1NraWxsSW1wb3J0UGF0aHM6IHN0cmluZ1tdO1xuICB0b29sczogU2Nhbm5lZFRvb2xbXTtcbn07XG5cbmNvbnN0IEFHRU5UX0NPTkZJR19GSUxFUyA9IFtcImFnZW50LnRzXCIsIFwiYWdlbnQuanNcIiwgXCJhZ2VudC5tdHNcIiwgXCJhZ2VudC5tanNcIl07XG5jb25zdCBNRF9FWFQgPSAvXFwubWQkLztcbmNvbnN0IFRTX0VYVCA9IC9cXC4odHN8anN8bXRzfG1qcykkLztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3REaXIoZGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBmcy5yZWFkZGlyU3luYyhkaXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEaXJlY3RvcnkoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRGlyZWN0b3J5KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb3ZlckFnZW50RGlycyhhZ2VudHNSb290OiBzdHJpbmcpOiBBZ2VudERpcltdIHtcbiAgY29uc3QgZW50cmllcyA9IGxpc3REaXIoYWdlbnRzUm9vdCk7XG4gIGNvbnN0IGRpcnM6IEFnZW50RGlyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmpvaW4oYWdlbnRzUm9vdCwgZW50cnkpO1xuICAgIGlmICghaXNEaXJlY3RvcnkoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChlbnRyeS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZGlycy5wdXNoKHtcbiAgICAgIG5hbWU6IGVudHJ5LFxuICAgICAgYWJzb2x1dGVQYXRoLFxuICAgICAgaGFzQWdlbnRDb25maWc6IGhhc0FnZW50Q29uZmlnKGFic29sdXRlUGF0aCksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGlycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0FnZW50Q29uZmlnKGFnZW50RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFHRU5UX0NPTkZJR19GSUxFUy5zb21lKChmKSA9PiBmaWxlRXhpc3RzKHBhdGguam9pbihhZ2VudERpciwgZikpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNraWxscyhhZ2VudERpcjogc3RyaW5nKToge1xuICBza2lsbHM6IFNraWxsSW5wdXRbXTtcbiAgdHNTa2lsbEltcG9ydFBhdGhzOiBzdHJpbmdbXTtcbn0ge1xuICBjb25zdCBza2lsbHNEaXIgPSBwYXRoLmpvaW4oYWdlbnREaXIsIFwic2tpbGxzXCIpO1xuICBjb25zdCBlbnRyaWVzID0gbGlzdERpcihza2lsbHNEaXIpO1xuICBjb25zdCBza2lsbHM6IFNraWxsSW5wdXRbXSA9IFtdO1xuICBjb25zdCB0c1NraWxsSW1wb3J0UGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzLnNvcnQoKSkge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguam9pbihza2lsbHNEaXIsIGVudHJ5KTtcblxuICAgIGlmIChNRF9FWFQudGVzdChlbnRyeSkpIHtcbiAgICAgIHNraWxscy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJob3N0XCIsXG4gICAgICAgIHBhdGg6IGFic29sdXRlUGF0aCxcbiAgICAgIH0gc2F0aXNmaWVzIEhvc3RTa2lsbElucHV0KTtcbiAgICB9IGVsc2UgaWYgKFRTX0VYVC50ZXN0KGVudHJ5KSkge1xuICAgICAgdHNTa2lsbEltcG9ydFBhdGhzLnB1c2goYWJzb2x1dGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBza2lsbHMsIHRzU2tpbGxJbXBvcnRQYXRocyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3lzdGVtUHJvbXB0KGFnZW50RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzeXN0ZW1EaXIgPSBwYXRoLmpvaW4oYWdlbnREaXIsIFwic3lzdGVtXCIpO1xuICBjb25zdCBlbnRyaWVzID0gbGlzdERpcihzeXN0ZW1EaXIpO1xuICBjb25zdCBtZEZpbGVzID0gZW50cmllcy5maWx0ZXIoKGUpID0+IE1EX0VYVC50ZXN0KGUpKS5zb3J0KCk7XG5cbiAgaWYgKG1kRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgbWRGaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZShwYXRoLmpvaW4oc3lzdGVtRGlyLCBmaWxlKSkudHJpbSgpO1xuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBwYXJ0cy5wdXNoKGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHMuam9pbihcIlxcblxcblwiKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xzKGFnZW50RGlyOiBzdHJpbmcpOiBTY2FubmVkVG9vbFtdIHtcbiAgY29uc3QgdG9vbHNEaXIgPSBwYXRoLmpvaW4oYWdlbnREaXIsIFwidG9vbHNcIik7XG4gIGNvbnN0IGVudHJpZXMgPSBsaXN0RGlyKHRvb2xzRGlyKTtcbiAgY29uc3QgdG9vbHM6IFNjYW5uZWRUb29sW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMuc29ydCgpKSB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKHRvb2xzRGlyLCBlbnRyeSk7XG5cbiAgICBpZiAoaXNEaXJlY3RvcnkoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgY29uc3QgaW5kZXhGaWxlID0gZmluZEluZGV4RmlsZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKGluZGV4RmlsZSkge1xuICAgICAgICB0b29scy5wdXNoKHsgbmFtZTogZW50cnksIGltcG9ydFBhdGg6IGluZGV4RmlsZSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFRTX0VYVC50ZXN0KGVudHJ5KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGVudHJ5LnJlcGxhY2UoVFNfRVhULCBcIlwiKTtcbiAgICAgIHRvb2xzLnB1c2goeyBuYW1lLCBpbXBvcnRQYXRoOiBhYnNvbHV0ZVBhdGggfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXhGaWxlKGRpcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGV4dGVuc2lvbnMgPSBbXCIudHNcIiwgXCIuanNcIiwgXCIubXRzXCIsIFwiLm1qc1wiXTtcbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGguam9pbihkaXIsIGBpbmRleCR7ZXh0fWApO1xuICAgIGlmIChmaWxlRXhpc3RzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbkFnZW50KGFnZW50RGlyOiBBZ2VudERpcik6IFNjYW5uZWRBZ2VudCB7XG4gIGNvbnN0IHsgc2tpbGxzLCB0c1NraWxsSW1wb3J0UGF0aHMgfSA9IGdldFNraWxscyhhZ2VudERpci5hYnNvbHV0ZVBhdGgpO1xuICBjb25zdCBzeXN0ZW1Qcm9tcHQgPSBnZXRTeXN0ZW1Qcm9tcHQoYWdlbnREaXIuYWJzb2x1dGVQYXRoKTtcbiAgY29uc3QgdG9vbHMgPSBnZXRUb29scyhhZ2VudERpci5hYnNvbHV0ZVBhdGgpO1xuXG4gIHJldHVybiB7IC4uLmFnZW50RGlyLCBza2lsbHMsIHN5c3RlbVByb21wdCwgdHNTa2lsbEltcG9ydFBhdGhzLCB0b29scyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEFnZW50c1Jvb3QoXG4gIGN3ZDogc3RyaW5nLFxuICB1c2VyRGVmaW5lZEFnZW50c0Rpcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHVzZXJEZWZpbmVkQWdlbnRzRGlyKSB7XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShjd2QsIHVzZXJEZWZpbmVkQWdlbnRzRGlyKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIHBhdGguam9pbihjd2QsIFwic3JjXCIsIFwiYWdlbnRzXCIpLFxuICAgIHBhdGguam9pbihjd2QsIFwiYWdlbnRzXCIpLFxuICBdO1xuXG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoaXNEaXJlY3RvcnkoY2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyBnZW5lcmF0ZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vZ2VuZXJhdGVcIjtcbmltcG9ydCB0eXBlIHsgU2Nhbm5lZEFnZW50IH0gZnJvbSBcIi4vc2NhblwiO1xuaW1wb3J0IHsgZGlzY292ZXJBZ2VudERpcnMsIGZpbmRBZ2VudHNSb290LCBzY2FuQWdlbnQgfSBmcm9tIFwiLi9zY2FuXCI7XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgZm9yIGZpbGVzeXN0ZW0tYmFzZWQgYWdlbnQgZGlzY292ZXJ5IGFuZFxuICogcmVnaXN0cnkgY29kZSBnZW5lcmF0aW9uLiBBZGFwdGVycyBsaWtlIHtAbGluayBOZXh0fSByZWNlaXZlIGFcbiAqIGBGcmFtZXdvcmtgIGluc3RhbmNlIGFuZCB1c2UgaXQgdG8gc2NhbiBhZ2VudHMgYW5kIHByb2R1Y2UgcmVnaXN0cnlcbiAqIHNvdXJjZSBjb2RlLlxuICovXG5leHBvcnQgY2xhc3MgRnJhbWV3b3JrIHtcbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFnZW50c0Rpcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBsb2c6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0czoge1xuICAgIC8qKlxuICAgICAqIFByb2plY3Qgcm9vdCBkaXJlY3RvcnkuXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgcHJvY2Vzcy5jd2QoKWBcbiAgICAgKi9cbiAgICBjd2Q/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGF0aCB0byB0aGUgYWdlbnRzIGRpcmVjdG9yeSwgcmVsYXRpdmUgdG8gYGN3ZGAuXG4gICAgICogV2hlbiBvbWl0dGVkLCBhdXRvLWRldGVjdGVkIGFzIHRoZSBmaXJzdCBleGlzdGluZyBkaXJlY3RvcnlcbiAgICAgKiBhbW9uZyBgc3JjL2FnZW50c2AgYW5kIGBhZ2VudHNgLlxuICAgICAqL1xuICAgIGFnZW50c0Rpcj86IHN0cmluZztcbiAgICAvKiogRW5hYmxlIHZlcmJvc2UgbG9nZ2luZyB0byBzdGRvdXQuICovXG4gICAgZGVidWc/OiBib29sZWFuO1xuICB9KSB7XG4gICAgdGhpcy5jd2QgPSBvcHRzLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpO1xuICAgIHRoaXMuYWdlbnRzRGlyID0gb3B0cy5hZ2VudHNEaXI7XG4gICAgdGhpcy5sb2cgPSBvcHRzLmRlYnVnXG4gICAgICA/IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSwgXCJbRnJhbWV3b3JrXVwiKVxuICAgICAgOiAoKSA9PiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2NhbiB0aGUgYWdlbnRzIGRpcmVjdG9yeSBhbmQgcmV0dXJuIG1ldGFkYXRhIGZvciBldmVyeSBhZ2VudCBmb3VuZC5cbiAgICogRWFjaCBzdWJmb2xkZXIgaW5zaWRlIHRoZSBhZ2VudHMgZGlyZWN0b3J5IGJlY29tZXMgb25lIGFnZW50LlxuICAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IHdoZW4gbm8gYWdlbnRzIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXNjb3ZlckFnZW50cygpOiBTY2FubmVkQWdlbnRbXSB7XG4gICAgY29uc3Qgcm9vdCA9IGZpbmRBZ2VudHNSb290KHRoaXMuY3dkLCB0aGlzLmFnZW50c0Rpcik7XG4gICAgaWYgKCFyb290KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGRpcnMgPSBkaXNjb3ZlckFnZW50RGlycyhyb290KTtcbiAgICByZXR1cm4gZGlycy5tYXAoc2NhbkFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgVHlwZVNjcmlwdCBzb3VyY2UgZm9yIGFuIGFnZW50IHJlZ2lzdHJ5IG1vZHVsZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdHMuYWdlbnRzIC0gU2Nhbm5lZCBhZ2VudHMgdG8gaW5jbHVkZSBpbiB0aGUgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSBvcHRzLm91dHB1dERpciAtIERpcmVjdG9yeSB3aGVyZSB0aGUgcmVnaXN0cnkgZmlsZSB3aWxsIGJlIHdyaXR0ZW5cbiAgICogICAodXNlZCB0byBjb21wdXRlIHJlbGF0aXZlIGltcG9ydCBwYXRocyB0byBlYWNoIGFnZW50J3MgY29uZmlnIG1vZHVsZSkuXG4gICAqIEByZXR1cm5zIFRoZSBmdWxsIHNvdXJjZSB0ZXh0IG9mIHRoZSBnZW5lcmF0ZWQgYF9yZWdpc3RyeS50c2AgZmlsZS5cbiAgICovXG4gIGdlbmVyYXRlUmVnaXN0cnlTb3VyY2UgPSBnZW5lcmF0ZVJlZ2lzdHJ5O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFHdEIsSUFBTSxnQkFBZ0I7QUFDZixTQUFTLGlCQUFpQixNQUd0QjtBQUNULFFBQU0sVUFBVSxLQUFLLE9BQU87QUFBQSxJQUFJLENBQUMsVUFDL0IsWUFBWSxFQUFFLE9BQU8sV0FBVyxLQUFLLFVBQVUsQ0FBQztBQUFBLEVBQ2xEO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUc7QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLEVBQ0YsRUFB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