@aexhq/sdk 0.38.1 → 0.40.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 (100) hide show
  1. package/README.md +23 -17
  2. package/dist/_contracts/api-key.d.ts +49 -0
  3. package/dist/_contracts/api-key.js +87 -0
  4. package/dist/_contracts/bundle-manifest.d.ts +86 -0
  5. package/dist/_contracts/bundle-manifest.js +157 -0
  6. package/dist/_contracts/error-codes.d.ts +26 -0
  7. package/dist/_contracts/error-codes.js +79 -0
  8. package/dist/_contracts/error-factory.d.ts +32 -0
  9. package/dist/_contracts/error-factory.js +142 -0
  10. package/dist/_contracts/event-envelope.d.ts +33 -10
  11. package/dist/_contracts/event-envelope.js +46 -10
  12. package/dist/_contracts/event-view.d.ts +123 -0
  13. package/dist/_contracts/event-view.js +120 -0
  14. package/dist/_contracts/http.js +12 -3
  15. package/dist/_contracts/index.d.ts +8 -4
  16. package/dist/_contracts/index.js +11 -7
  17. package/dist/_contracts/models.d.ts +15 -0
  18. package/dist/_contracts/models.js +33 -0
  19. package/dist/_contracts/operations.d.ts +70 -2
  20. package/dist/_contracts/operations.js +143 -7
  21. package/dist/_contracts/run-config.d.ts +35 -10
  22. package/dist/_contracts/run-config.js +17 -5
  23. package/dist/_contracts/run-record.d.ts +3 -2
  24. package/dist/_contracts/runtime-types.d.ts +148 -36
  25. package/dist/_contracts/runtime-types.js +33 -1
  26. package/dist/_contracts/sdk-errors.d.ts +61 -2
  27. package/dist/_contracts/sdk-errors.js +83 -3
  28. package/dist/_contracts/sdk-secrets.js +31 -6
  29. package/dist/_contracts/stable.d.ts +14 -0
  30. package/dist/_contracts/stable.js +14 -0
  31. package/dist/_contracts/status.d.ts +28 -1
  32. package/dist/_contracts/status.js +48 -3
  33. package/dist/_contracts/submission.d.ts +157 -14
  34. package/dist/_contracts/submission.js +319 -55
  35. package/dist/_contracts/suggest.d.ts +15 -0
  36. package/dist/_contracts/suggest.js +54 -0
  37. package/dist/asset-upload.d.ts +27 -1
  38. package/dist/asset-upload.js +219 -4
  39. package/dist/asset-upload.js.map +1 -1
  40. package/dist/bundle.d.ts +23 -14
  41. package/dist/bundle.js +39 -20
  42. package/dist/bundle.js.map +1 -1
  43. package/dist/canonical-zip.d.ts +68 -0
  44. package/dist/canonical-zip.js +307 -0
  45. package/dist/canonical-zip.js.map +1 -0
  46. package/dist/cli.mjs +1927 -326
  47. package/dist/cli.mjs.sha256 +1 -1
  48. package/dist/client.d.ts +273 -70
  49. package/dist/client.js +885 -335
  50. package/dist/client.js.map +1 -1
  51. package/dist/fetch-archive.js +14 -14
  52. package/dist/fetch-archive.js.map +1 -1
  53. package/dist/file.d.ts +33 -6
  54. package/dist/file.js +120 -54
  55. package/dist/file.js.map +1 -1
  56. package/dist/index.d.ts +23 -14
  57. package/dist/index.js +31 -14
  58. package/dist/index.js.map +1 -1
  59. package/dist/node-fs.d.ts +26 -9
  60. package/dist/node-fs.js +13 -38
  61. package/dist/node-fs.js.map +1 -1
  62. package/dist/node-walk.d.ts +69 -0
  63. package/dist/node-walk.js +146 -0
  64. package/dist/node-walk.js.map +1 -0
  65. package/dist/retry.d.ts +9 -13
  66. package/dist/retry.js +18 -17
  67. package/dist/retry.js.map +1 -1
  68. package/dist/skill.d.ts +151 -0
  69. package/dist/skill.js +298 -0
  70. package/dist/skill.js.map +1 -0
  71. package/dist/tool.d.ts +14 -2
  72. package/dist/tool.js +33 -7
  73. package/dist/tool.js.map +1 -1
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.js +1 -1
  76. package/docs/authentication.md +29 -5
  77. package/docs/billing.md +6 -0
  78. package/docs/concepts/agent-tools.md +11 -0
  79. package/docs/concepts/composition.md +3 -3
  80. package/docs/defaults.md +1 -0
  81. package/docs/errors.md +64 -4
  82. package/docs/events.md +84 -49
  83. package/docs/limits-and-quotas.md +24 -0
  84. package/docs/mcp.md +3 -2
  85. package/docs/networking.md +7 -1
  86. package/docs/outputs.md +36 -7
  87. package/docs/provider-runtime-capabilities.md +1 -1
  88. package/docs/quickstart.md +17 -7
  89. package/docs/run-config.md +3 -3
  90. package/docs/secrets.md +14 -0
  91. package/docs/skills.md +74 -44
  92. package/docs/vision-skills.md +3 -3
  93. package/examples/feature-tour.ts +4 -6
  94. package/examples/spike-settle-latency.ts +125 -0
  95. package/package.json +4 -3
  96. package/dist/_contracts/event-guards.d.ts +0 -67
  97. package/dist/_contracts/event-guards.js +0 -36
  98. package/dist/skill-tool.d.ts +0 -102
  99. package/dist/skill-tool.js +0 -190
  100. package/dist/skill-tool.js.map +0 -1
@@ -1,190 +0,0 @@
1
- import { TOOL_NAME_PATTERN } from "./_contracts/index.js";
2
- import { bundleSkillFiles, hashSkillBundle } from "./bundle.js";
3
- import { fetchSkillArchive } from "./fetch-archive.js";
4
- import { readDirectoryAsFiles } from "./node-fs.js";
5
- /**
6
- * A skill re-expressed as a TOOL. `Tools.fromSkillDir` / `Tools.fromSkillUrl`
7
- * read a skill folder/zip, lift the tool `name` + `description` from the
8
- * `SKILL.md` YAML frontmatter, and canonically bundle+hash the bytes. The
9
- * result rides in the session's `tools` array (next to builtin names and custom
10
- * {@link Tool} bundles); `client.run` / `openSession` uploads the bundle as an
11
- * asset before the run lands, and the wire ref becomes a
12
- * `{ kind:"skill", assetId, name, description }` {@link SkillToolRef}.
13
- *
14
- * At run time the model calls the no-arg load-tool to pull the skill's
15
- * `SKILL.md` body into context; the bundle's files are eagerly staged to
16
- * `/workspace/skills/<name>/`.
17
- *
18
- * Asset deduplication makes the same bytes a no-op upload on subsequent runs.
19
- * A URL is an ingestion source, not a persistent reference.
20
- */
21
- export class SkillTool {
22
- #ref;
23
- #inlineBytes;
24
- /** Asset id cached after the first use, so reuse skips a re-upload. */
25
- #assetId;
26
- /** Internal constructor. Use the `Tools.fromSkill*` factories. */
27
- constructor(ref, inlineBytes) {
28
- this.#ref = ref;
29
- this.#inlineBytes = inlineBytes;
30
- }
31
- /**
32
- * The wire-level reference. Returns the SDK-private draft shape for
33
- * un-uploaded skill-tools (kind:"draft", with name + description +
34
- * contentHash). `client.run` / `openSession` walks these and uploads them
35
- * before the run lands.
36
- */
37
- get ref() {
38
- return this.#ref;
39
- }
40
- /** True for local-bytes skill-tools that haven't been uploaded yet. */
41
- get isDraft() {
42
- return this.#ref.kind === "draft";
43
- }
44
- /** Internal: the asset id resolved on a prior use, or undefined. */
45
- get _cachedAssetId() {
46
- return this.#assetId;
47
- }
48
- /** Internal: remember the asset id resolved for this draft's bytes. */
49
- _rememberAsset(assetId) {
50
- this.#assetId = assetId;
51
- }
52
- /** Internal: build a draft from an already-loaded skill files map. */
53
- static async _fromFiles(source, files, nameOverride) {
54
- const front = extractSkillFrontmatter(source, files);
55
- const name = nameOverride ?? front.name;
56
- if (typeof name !== "string" || name.length === 0) {
57
- throw new Error(`${source}: a skill name is required — pass { name } or add a \`name:\` field to the SKILL.md YAML frontmatter`);
58
- }
59
- if (!TOOL_NAME_PATTERN.test(name)) {
60
- throw new Error(`${source}: name must match ${TOOL_NAME_PATTERN.source}`);
61
- }
62
- if (name.includes("__")) {
63
- throw new Error(`${source}: name must not contain "__"; that separator is reserved for MCP tools`);
64
- }
65
- const description = front.description;
66
- if (typeof description !== "string" || description.trim().length === 0) {
67
- throw new Error(`${source}: a skill description is required — add a \`description:\` field to the SKILL.md YAML frontmatter`);
68
- }
69
- if (description.length > 2048) {
70
- throw new Error(`${source}: description must be <= 2048 chars`);
71
- }
72
- const bundled = bundleSkillFiles(files);
73
- const contentHash = await hashSkillBundle(bundled.zip);
74
- const ref = { kind: "draft", name, description, contentHash };
75
- return new SkillTool(ref, bundled.zip);
76
- }
77
- /**
78
- * Internal: yield the draft's bytes + metadata so `client.run` / `openSession`
79
- * can upload the asset. Idempotent (non-consuming): a SkillTool is reusable
80
- * across sessions — the first use caches the resolved asset id (see
81
- * `_rememberAsset`) so later uses reuse it instead of re-uploading.
82
- *
83
- * Returns undefined for already-uploaded skill-tools.
84
- */
85
- _takeDraftBundle() {
86
- if (this.#ref.kind !== "draft" || !this.#inlineBytes) {
87
- return undefined;
88
- }
89
- return {
90
- name: this.#ref.name,
91
- description: this.#ref.description,
92
- contentHash: this.#ref.contentHash,
93
- bytes: this.#inlineBytes
94
- };
95
- }
96
- toJSON() {
97
- if (this.#ref.kind === "draft") {
98
- throw new Error("SkillTool: draft skill-tools cannot be JSON-serialised — they only become wire refs when " +
99
- "aex.run / openSession uploads the bytes as an asset.");
100
- }
101
- return this.#ref;
102
- }
103
- }
104
- /**
105
- * Factory namespace for skill-tools. Each factory reads a skill bundle, lifts
106
- * `name` + `description` from the `SKILL.md` frontmatter (an explicit `name`
107
- * argument overrides the frontmatter), and produces a {@link SkillTool} to pass
108
- * in the session's `tools` array.
109
- */
110
- export const Tools = {
111
- /**
112
- * Read a local skill directory and build a skill-tool. The directory must
113
- * contain `SKILL.md` at its root, whose YAML frontmatter provides the tool
114
- * `name` (unless overridden via `args.name`) and `description`. Symlinks and
115
- * non-regular files are skipped. Bun/Node filesystem runtimes only.
116
- */
117
- async fromSkillDir(rootDir, args = {}) {
118
- const files = await readDirectoryAsFiles(rootDir);
119
- return SkillTool._fromFiles("Tools.fromSkillDir", files, args.name);
120
- },
121
- /**
122
- * Fetch a zip-archived skill from a URL and build a skill-tool. The archive is
123
- * downloaded in the SDK process, so the URL is caller-controlled — host the
124
- * skill yourself and pass a temporary signed URL (e.g. an S3 presigned URL).
125
- * Its bytes are optionally integrity-checked against `sha256`, unzipped, and
126
- * reduced to the same files map as `Tools.fromSkillDir`, so a URL-sourced
127
- * skill and the identical local skill produce the same canonical asset and
128
- * dedup against each other.
129
- *
130
- * The archive must contain `SKILL.md` at its root, or inside a single
131
- * top-level folder (which is stripped). The signed URL only needs to be valid
132
- * for this call; `client.run` / `openSession` snapshots the bytes into the run.
133
- *
134
- * Universal (Bun / Node 18+ / browser): requires a global `fetch`, or pass one.
135
- */
136
- async fromSkillUrl(url, args = {}) {
137
- const files = await fetchSkillArchive(url, {
138
- ...(args.sha256 !== undefined ? { sha256: args.sha256 } : {}),
139
- ...(args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}),
140
- ...(args.fetch !== undefined ? { fetch: args.fetch } : {})
141
- });
142
- return SkillTool._fromFiles("Tools.fromSkillUrl", files, args.name);
143
- }
144
- };
145
- /**
146
- * Read `SKILL.md` from a bundle files map and parse its YAML frontmatter for
147
- * the `name` + `description` fields. Throws when the bundle has no root
148
- * `SKILL.md` (that is what makes a bundle a skill).
149
- */
150
- function extractSkillFrontmatter(source, files) {
151
- const raw = files["SKILL.md"];
152
- if (raw === undefined) {
153
- throw new Error(`${source}: the skill bundle must contain a SKILL.md at its root`);
154
- }
155
- const text = typeof raw === "string" ? raw : new TextDecoder().decode(raw);
156
- return parseSkillFrontmatter(text);
157
- }
158
- /**
159
- * Minimal YAML-frontmatter reader: pulls the `name` and `description` scalar
160
- * values out of the leading `--- … ---` block. Only simple single-line
161
- * `key: value` entries are supported (surrounding single/double quotes are
162
- * stripped); anything else is ignored. A skill with no frontmatter yields an
163
- * empty result and the caller reports the missing field.
164
- */
165
- function parseSkillFrontmatter(text) {
166
- const src = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
167
- const match = /^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*(?:\r?\n|$)/.exec(src);
168
- if (!match) {
169
- return {};
170
- }
171
- const out = {};
172
- for (const line of match[1].split(/\r?\n/)) {
173
- const kv = /^([A-Za-z0-9_-]+)[ \t]*:[ \t]*(.*)$/.exec(line);
174
- if (!kv)
175
- continue;
176
- const key = kv[1].toLowerCase();
177
- if (key !== "name" && key !== "description")
178
- continue;
179
- let value = kv[2].trim();
180
- if (value.length >= 2 &&
181
- ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'")))) {
182
- value = value.slice(1, -1);
183
- }
184
- if (value.length > 0) {
185
- out[key] = value;
186
- }
187
- }
188
- return out;
189
- }
190
- //# sourceMappingURL=skill-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-tool.js","sourceRoot":"","sources":["../src/skill-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAmB,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,SAAS;IACX,IAAI,CAAmC;IACvC,YAAY,CAAyB;IAC9C,uEAAuE;IACvE,QAAQ,CAAqB;IAE7B,kEAAkE;IAClE,YAAoB,GAAqC,EAAE,WAAwB;QACjF,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,uEAAuE;IACvE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;IACpC,CAAC;IAED,oEAAoE;IACpE,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,uEAAuE;IACvE,cAAc,CAAC,OAAe;QAC5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,MAAM,CAAC,KAAK,CAAC,UAAU,CACrB,MAAc,EACd,KAAiB,EACjB,YAAgC;QAEhC,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC;QACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,sGAAsG,CAChH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qBAAqB,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,wEAAwE,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,mGAAmG,CAC7G,CAAC;QACJ,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qCAAqC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,GAAG,GAAsB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QACjF,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;OAOG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;YAClC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;YAClC,KAAK,EAAE,IAAI,CAAC,YAAY;SACzB,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,2FAA2F;gBACzF,sDAAsD,CACzD,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAcD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,OAAmC,EAAE;QACvE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC,UAAU,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,YAAY,CAChB,GAAW,EACX,OAKI,EAAE;QAEN,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE;YACzC,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,UAAU,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;CACO,CAAC;AAEX;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,MAAc,EACd,KAAiB;IAEjB,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,wDAAwD,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,KAAK,GAAG,oDAAoD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAA4C,EAAE,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,GAAG,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,aAAa;YAAE,SAAS;QACtD,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC1B,IACE,KAAK,CAAC,MAAM,IAAI,CAAC;YACjB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAClG,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}