neuron-inspector 0.8.0 → 0.8.1
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.
- package/dist/__tests__/monitor.test.d.ts +1 -0
- package/dist/__tests__/monitor.test.js +286 -0
- package/dist/__tests__/monitor.test.js.map +1 -0
- package/dist/__tests__/recipes.test.d.ts +1 -0
- package/dist/__tests__/recipes.test.js +415 -0
- package/dist/__tests__/recipes.test.js.map +1 -0
- package/dist/__tests__/scheduler.test.d.ts +1 -0
- package/dist/__tests__/scheduler.test.js +316 -0
- package/dist/__tests__/scheduler.test.js.map +1 -0
- package/dist/__tests__/session-state.test.d.ts +1 -0
- package/dist/__tests__/session-state.test.js +335 -0
- package/dist/__tests__/session-state.test.js.map +1 -0
- package/dist/collections/__tests__/assertions.test.d.ts +1 -0
- package/dist/collections/__tests__/assertions.test.js +203 -0
- package/dist/collections/__tests__/assertions.test.js.map +1 -0
- package/dist/collections/__tests__/dynamic-vars.test.d.ts +1 -0
- package/dist/collections/__tests__/dynamic-vars.test.js +169 -0
- package/dist/collections/__tests__/dynamic-vars.test.js.map +1 -0
- package/dist/collections/__tests__/execution.test.d.ts +1 -0
- package/dist/collections/__tests__/execution.test.js +271 -0
- package/dist/collections/__tests__/execution.test.js.map +1 -0
- package/dist/collections/__tests__/integration.test.d.ts +1 -0
- package/dist/collections/__tests__/integration.test.js +478 -0
- package/dist/collections/__tests__/integration.test.js.map +1 -0
- package/dist/collections/__tests__/resolver.test.d.ts +1 -0
- package/dist/collections/__tests__/resolver.test.js +282 -0
- package/dist/collections/__tests__/resolver.test.js.map +1 -0
- package/dist/collections/__tests__/scenario.test.d.ts +1 -0
- package/dist/collections/__tests__/scenario.test.js +367 -0
- package/dist/collections/__tests__/scenario.test.js.map +1 -0
- package/dist/collections/__tests__/scripts.test.d.ts +1 -0
- package/dist/collections/__tests__/scripts.test.js +245 -0
- package/dist/collections/__tests__/scripts.test.js.map +1 -0
- package/dist/collections/__tests__/store.test.d.ts +1 -0
- package/dist/collections/__tests__/store.test.js +313 -0
- package/dist/collections/__tests__/store.test.js.map +1 -0
- package/dist/collections/assertions.d.ts +16 -0
- package/dist/collections/assertions.js +107 -0
- package/dist/collections/assertions.js.map +1 -0
- package/dist/collections/dynamic-vars.d.ts +75 -0
- package/dist/collections/dynamic-vars.js +187 -0
- package/dist/collections/dynamic-vars.js.map +1 -0
- package/dist/collections/executor.d.ts +100 -0
- package/dist/collections/executor.js +301 -0
- package/dist/collections/executor.js.map +1 -0
- package/dist/collections/http.d.ts +9 -0
- package/dist/collections/http.js +194 -0
- package/dist/collections/http.js.map +1 -0
- package/dist/collections/index.d.ts +12 -0
- package/dist/collections/index.js +27 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/postman.d.ts +10 -0
- package/dist/collections/postman.js +288 -0
- package/dist/collections/postman.js.map +1 -0
- package/dist/collections/resolver.d.ts +74 -0
- package/dist/collections/resolver.js +330 -0
- package/dist/collections/resolver.js.map +1 -0
- package/dist/collections/scripts.d.ts +20 -0
- package/dist/collections/scripts.js +225 -0
- package/dist/collections/scripts.js.map +1 -0
- package/dist/collections/store.d.ts +68 -0
- package/dist/collections/store.js +507 -0
- package/dist/collections/store.js.map +1 -0
- package/dist/collections/tools.d.ts +8 -0
- package/dist/collections/tools.js +1276 -0
- package/dist/collections/tools.js.map +1 -0
- package/dist/collections/types.d.ts +226 -0
- package/dist/collections/types.js +3 -0
- package/dist/collections/types.js.map +1 -0
- package/dist/compound-tools.js +136 -2
- package/dist/compound-tools.js.map +1 -1
- package/dist/killswitch.d.ts +8 -0
- package/dist/killswitch.js +304 -0
- package/dist/killswitch.js.map +1 -0
- package/dist/recipe-tools.js +39 -6
- package/dist/recipe-tools.js.map +1 -1
- package/dist/recipes.d.ts +4 -0
- package/dist/recipes.js +49 -3
- package/dist/recipes.js.map +1 -1
- package/dist/resilience.d.ts +112 -0
- package/dist/resilience.js +319 -0
- package/dist/resilience.js.map +1 -0
- package/dist/server.js +176 -53
- package/dist/server.js.map +1 -1
- package/dist/tools.js +26 -0
- package/dist/tools.js.map +1 -1
- package/package.json +4 -3
- package/recipes/autopilot/agent.md +316 -0
- package/recipes/autopilot/learnings.md +33 -0
- package/recipes/autopilot/recipe.yaml +96 -0
- package/recipes/inbox-responder/agent.md +268 -0
- package/recipes/inbox-responder/learnings.md +25 -0
- package/recipes/inbox-responder/recipe.yaml +82 -0
- package/recipes/linkedin-outreach/learnings.md +17 -1
- package/recipes/planner/agent.md +66 -1
- package/recipes/planner/learnings.md +49 -1
- package/recipes/social-ops/learnings.md +33 -13
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
|
+
import * as YAML from "yaml";
|
|
5
|
+
// ── Template engine ─────────────────────────────────────────────
|
|
6
|
+
const VAR_PATTERN = /\{\{([^}]+)\}\}/g;
|
|
7
|
+
/** Replace all {{var}} references in a string using the resolver pipeline. */
|
|
8
|
+
export function resolveTemplate(template, steps, context) {
|
|
9
|
+
return template.replace(VAR_PATTERN, (_match, key) => {
|
|
10
|
+
const trimmed = key.trim();
|
|
11
|
+
for (const step of steps) {
|
|
12
|
+
const value = step.resolve(trimmed, context);
|
|
13
|
+
if (value !== undefined)
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
// Leave unresolved for detection
|
|
17
|
+
return `{{${trimmed}}}`;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** Recursively resolve all string values in an object/array. */
|
|
21
|
+
export function resolveDeep(value, steps, context) {
|
|
22
|
+
if (typeof value === "string")
|
|
23
|
+
return resolveTemplate(value, steps, context);
|
|
24
|
+
if (Array.isArray(value))
|
|
25
|
+
return value.map((v) => resolveDeep(v, steps, context));
|
|
26
|
+
if (typeof value === "object" && value !== null) {
|
|
27
|
+
const result = {};
|
|
28
|
+
for (const [k, v] of Object.entries(value)) {
|
|
29
|
+
result[k] = resolveDeep(v, steps, context);
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
/** Find all unresolved {{var}} references in a string. */
|
|
36
|
+
export function findUnresolved(text) {
|
|
37
|
+
const matches = [];
|
|
38
|
+
let m;
|
|
39
|
+
const re = /\{\{([^}]+)\}\}/g;
|
|
40
|
+
while ((m = re.exec(text)) !== null) {
|
|
41
|
+
matches.push(m[1].trim());
|
|
42
|
+
}
|
|
43
|
+
return matches;
|
|
44
|
+
}
|
|
45
|
+
/** Scan all strings in a resolved request for unresolved variables. */
|
|
46
|
+
export function checkUnresolved(request) {
|
|
47
|
+
const unresolved = new Set();
|
|
48
|
+
for (const v of findUnresolved(request.url))
|
|
49
|
+
unresolved.add(v);
|
|
50
|
+
for (const val of Object.values(request.headers)) {
|
|
51
|
+
for (const v of findUnresolved(val))
|
|
52
|
+
unresolved.add(v);
|
|
53
|
+
}
|
|
54
|
+
if (request.body) {
|
|
55
|
+
for (const v of findUnresolved(request.body))
|
|
56
|
+
unresolved.add(v);
|
|
57
|
+
}
|
|
58
|
+
return [...unresolved];
|
|
59
|
+
}
|
|
60
|
+
// ── Built-in resolver steps ─────────────────────────────────────
|
|
61
|
+
/** Level 1: Global variables from ~/.neuron/profile.yaml */
|
|
62
|
+
export class ProfileResolver {
|
|
63
|
+
name = "profile";
|
|
64
|
+
cache = null;
|
|
65
|
+
resolve(key, _context) {
|
|
66
|
+
if (this.cache === null) {
|
|
67
|
+
const profilePath = join(homedir(), ".neuron", "profile.yaml");
|
|
68
|
+
if (existsSync(profilePath)) {
|
|
69
|
+
try {
|
|
70
|
+
const content = readFileSync(profilePath, "utf-8");
|
|
71
|
+
const parsed = YAML.parse(content);
|
|
72
|
+
this.cache = typeof parsed === "object" && parsed !== null
|
|
73
|
+
? Object.fromEntries(Object.entries(parsed).map(([k, v]) => [k, String(v)]))
|
|
74
|
+
: {};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
this.cache = {};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.cache = {};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return this.cache[key];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Level 2: Process environment variables */
|
|
88
|
+
export class ProcessEnvResolver {
|
|
89
|
+
name = "process.env";
|
|
90
|
+
resolve(key, _context) {
|
|
91
|
+
return process.env[key];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Level 3: Active environment variables */
|
|
95
|
+
export class EnvironmentResolver {
|
|
96
|
+
name = "environment";
|
|
97
|
+
resolve(key, context) {
|
|
98
|
+
return context.environment?.variables?.[key];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Level 4: Collection-level defaults.variables */
|
|
102
|
+
export class CollectionDefaultsResolver {
|
|
103
|
+
name = "collection.defaults";
|
|
104
|
+
resolve(key, context) {
|
|
105
|
+
return context.collection?.defaults?.variables?.[key];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Level 5: Folder-level variables */
|
|
109
|
+
export class FolderResolver {
|
|
110
|
+
name = "folder";
|
|
111
|
+
resolve(key, context) {
|
|
112
|
+
return context.folder?.variables?.[key];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Level 6: Request-level variables */
|
|
116
|
+
export class RequestResolver {
|
|
117
|
+
name = "request";
|
|
118
|
+
resolve(key, context) {
|
|
119
|
+
return context.endpoint?.variables?.[key];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Level 7: Extracted variables from previous requests */
|
|
123
|
+
export class ExtractedResolver {
|
|
124
|
+
name = "extracted";
|
|
125
|
+
resolve(key, context) {
|
|
126
|
+
return context.extracted?.[key];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Level 8: Script-set variables */
|
|
130
|
+
export class ScriptVarResolver {
|
|
131
|
+
name = "script";
|
|
132
|
+
resolve(key, context) {
|
|
133
|
+
return context.scriptVars?.[key];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Dynamic variable resolver: intercepts $-prefixed references and delegates to the registry. */
|
|
137
|
+
export class DynamicVarResolverStep {
|
|
138
|
+
registry;
|
|
139
|
+
name = "dynamic";
|
|
140
|
+
constructor(registry) {
|
|
141
|
+
this.registry = registry;
|
|
142
|
+
}
|
|
143
|
+
resolve(key, context) {
|
|
144
|
+
if (!key.startsWith("$"))
|
|
145
|
+
return undefined;
|
|
146
|
+
return this.registry.resolve(key, context);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ── Pipeline ────────────────────────────────────────────────────
|
|
150
|
+
/** Build the default resolver pipeline (levels 1-8 + dynamic vars). */
|
|
151
|
+
export function buildDefaultPipeline(dynamicVarRegistry) {
|
|
152
|
+
const steps = [
|
|
153
|
+
new ProfileResolver(),
|
|
154
|
+
new ProcessEnvResolver(),
|
|
155
|
+
new EnvironmentResolver(),
|
|
156
|
+
new CollectionDefaultsResolver(),
|
|
157
|
+
new FolderResolver(),
|
|
158
|
+
new RequestResolver(),
|
|
159
|
+
new ExtractedResolver(),
|
|
160
|
+
new ScriptVarResolver(),
|
|
161
|
+
];
|
|
162
|
+
// Dynamic vars are checked last — they only match $-prefixed refs
|
|
163
|
+
// that no other step resolved, so ordering is safe
|
|
164
|
+
if (dynamicVarRegistry) {
|
|
165
|
+
steps.push(new DynamicVarResolverStep(dynamicVarRegistry));
|
|
166
|
+
}
|
|
167
|
+
return steps;
|
|
168
|
+
}
|
|
169
|
+
// ── Request builder ─────────────────────────────────────────────
|
|
170
|
+
/** Merge headers with precedence: request > folder > environment > collection defaults. */
|
|
171
|
+
function mergeHeaders(...layers) {
|
|
172
|
+
const merged = {};
|
|
173
|
+
for (const layer of layers) {
|
|
174
|
+
if (layer)
|
|
175
|
+
Object.assign(merged, layer);
|
|
176
|
+
}
|
|
177
|
+
return merged;
|
|
178
|
+
}
|
|
179
|
+
/** Resolve auth config into an Authorization header value. */
|
|
180
|
+
function resolveAuth(auth, steps, context) {
|
|
181
|
+
if (!auth || auth.type === "none")
|
|
182
|
+
return null;
|
|
183
|
+
switch (auth.type) {
|
|
184
|
+
case "bearer": {
|
|
185
|
+
const token = auth.token
|
|
186
|
+
? resolveTemplate(auth.token, steps, context)
|
|
187
|
+
: "";
|
|
188
|
+
return { header: "Authorization", value: `Bearer ${token}` };
|
|
189
|
+
}
|
|
190
|
+
case "basic": {
|
|
191
|
+
const user = auth.username
|
|
192
|
+
? resolveTemplate(auth.username, steps, context)
|
|
193
|
+
: "";
|
|
194
|
+
const pass = auth.password
|
|
195
|
+
? resolveTemplate(auth.password, steps, context)
|
|
196
|
+
: "";
|
|
197
|
+
const encoded = Buffer.from(`${user}:${pass}`).toString("base64");
|
|
198
|
+
return { header: "Authorization", value: `Basic ${encoded}` };
|
|
199
|
+
}
|
|
200
|
+
case "api-key": {
|
|
201
|
+
const header = auth.header
|
|
202
|
+
? resolveTemplate(auth.header, steps, context)
|
|
203
|
+
: "X-API-Key";
|
|
204
|
+
const value = auth.value
|
|
205
|
+
? resolveTemplate(auth.value, steps, context)
|
|
206
|
+
: "";
|
|
207
|
+
return { header, value };
|
|
208
|
+
}
|
|
209
|
+
default:
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/** Build a fully resolved request from collection context. */
|
|
214
|
+
export function buildResolvedRequest(opts) {
|
|
215
|
+
const { collection, environment, folder, endpoint, pipeline, extracted, scriptVars } = opts;
|
|
216
|
+
const context = {
|
|
217
|
+
environment,
|
|
218
|
+
collection,
|
|
219
|
+
folder,
|
|
220
|
+
endpoint,
|
|
221
|
+
extracted: extracted ?? {},
|
|
222
|
+
scriptVars: scriptVars ?? {},
|
|
223
|
+
};
|
|
224
|
+
// Merge headers: collection defaults < environment < folder < endpoint
|
|
225
|
+
const rawHeaders = mergeHeaders(collection.defaults?.headers, environment.headers, folder.headers, endpoint.headers);
|
|
226
|
+
// Resolve auth (endpoint > folder > collection defaults)
|
|
227
|
+
const auth = endpoint.auth ?? folder.auth ?? collection.defaults?.auth;
|
|
228
|
+
const authHeader = resolveAuth(auth, pipeline, context);
|
|
229
|
+
if (authHeader && !rawHeaders[authHeader.header]) {
|
|
230
|
+
rawHeaders[authHeader.header] = authHeader.value;
|
|
231
|
+
}
|
|
232
|
+
// Resolve all header values
|
|
233
|
+
const headers = {};
|
|
234
|
+
for (const [k, v] of Object.entries(rawHeaders)) {
|
|
235
|
+
headers[k] = resolveTemplate(v, pipeline, context);
|
|
236
|
+
}
|
|
237
|
+
// Merge cookies into Cookie header
|
|
238
|
+
if (endpoint.cookies && Object.keys(endpoint.cookies).length > 0) {
|
|
239
|
+
const cookiePairs = Object.entries(endpoint.cookies)
|
|
240
|
+
.map(([k, v]) => `${resolveTemplate(k, pipeline, context)}=${resolveTemplate(v, pipeline, context)}`)
|
|
241
|
+
.join("; ");
|
|
242
|
+
const existing = headers["Cookie"] || headers["cookie"] || "";
|
|
243
|
+
headers["Cookie"] = existing ? `${existing}; ${cookiePairs}` : cookiePairs;
|
|
244
|
+
}
|
|
245
|
+
// Resolve URL — full URLs bypass base_url
|
|
246
|
+
const path = resolveTemplate(endpoint.path, pipeline, context);
|
|
247
|
+
let url;
|
|
248
|
+
if (path.startsWith("http://") || path.startsWith("https://")) {
|
|
249
|
+
url = path;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
url = environment.base_url.replace(/\/+$/, "") + (path.startsWith("/") ? path : `/${path}`);
|
|
253
|
+
}
|
|
254
|
+
// Resolve body based on body_mode
|
|
255
|
+
let body;
|
|
256
|
+
if (endpoint.body !== undefined) {
|
|
257
|
+
const resolved = resolveDeep(endpoint.body, pipeline, context);
|
|
258
|
+
const mode = endpoint.body_mode || "json";
|
|
259
|
+
switch (mode) {
|
|
260
|
+
case "urlencoded": {
|
|
261
|
+
if (typeof resolved === "object" && resolved !== null && !Array.isArray(resolved)) {
|
|
262
|
+
body = new URLSearchParams(resolved).toString();
|
|
263
|
+
if (!headers["Content-Type"])
|
|
264
|
+
headers["Content-Type"] = "application/x-www-form-urlencoded";
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
case "form-data": {
|
|
272
|
+
if (typeof resolved === "object" && resolved !== null && !Array.isArray(resolved)) {
|
|
273
|
+
const boundary = `----NeuronFormBoundary${Date.now().toString(36)}`;
|
|
274
|
+
const parts = [];
|
|
275
|
+
for (const [k, v] of Object.entries(resolved)) {
|
|
276
|
+
parts.push(`--${boundary}\r\nContent-Disposition: form-data; name="${k}"\r\n\r\n${v}`);
|
|
277
|
+
}
|
|
278
|
+
parts.push(`--${boundary}--`);
|
|
279
|
+
body = parts.join("\r\n");
|
|
280
|
+
if (!headers["Content-Type"])
|
|
281
|
+
headers["Content-Type"] = `multipart/form-data; boundary=${boundary}`;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
|
|
285
|
+
}
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
case "text": {
|
|
289
|
+
body = String(resolved);
|
|
290
|
+
if (!headers["Content-Type"])
|
|
291
|
+
headers["Content-Type"] = "text/plain";
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
default: {
|
|
295
|
+
// json (default)
|
|
296
|
+
body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Timeout: endpoint > environment > collection defaults > 30s
|
|
302
|
+
const timeout_ms = endpoint.timeout_ms ??
|
|
303
|
+
environment.timeout_ms ??
|
|
304
|
+
collection.defaults?.timeout_ms ??
|
|
305
|
+
30000;
|
|
306
|
+
// Settings passthrough
|
|
307
|
+
const settings = endpoint.settings;
|
|
308
|
+
const follow_redirects = settings?.follow_redirects;
|
|
309
|
+
const max_redirects = settings?.max_redirects;
|
|
310
|
+
const verify_ssl = settings?.verify_ssl;
|
|
311
|
+
const follow_original_method = settings?.follow_original_method;
|
|
312
|
+
const follow_authorization = settings?.follow_authorization;
|
|
313
|
+
const remove_referer = settings?.remove_referer;
|
|
314
|
+
const encode_url = settings?.encode_url;
|
|
315
|
+
return {
|
|
316
|
+
url,
|
|
317
|
+
method: endpoint.method.toUpperCase(),
|
|
318
|
+
headers,
|
|
319
|
+
body,
|
|
320
|
+
timeout_ms,
|
|
321
|
+
...(follow_redirects !== undefined && { follow_redirects }),
|
|
322
|
+
...(max_redirects !== undefined && { max_redirects }),
|
|
323
|
+
...(verify_ssl !== undefined && { verify_ssl }),
|
|
324
|
+
...(follow_original_method !== undefined && { follow_original_method }),
|
|
325
|
+
...(follow_authorization !== undefined && { follow_authorization }),
|
|
326
|
+
...(remove_referer !== undefined && { remove_referer }),
|
|
327
|
+
...(encode_url !== undefined && { encode_url }),
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/collections/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ScriptRunner, Script, ScriptContext, ScriptResult, AssertionTarget } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Declarative script runner.
|
|
4
|
+
* Handles pre_request.set and post_response.extract/set without executing arbitrary code.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DeclarativeScriptRunner implements ScriptRunner {
|
|
7
|
+
runPreRequest(script: Script, context: ScriptContext): ScriptResult;
|
|
8
|
+
runPostResponse(script: Script, response: AssertionTarget, context: ScriptContext): ScriptResult;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* JavaScript script runner.
|
|
12
|
+
* If a script has `code`, runs it in a sandboxed node:vm context
|
|
13
|
+
* with the `nr` API exposed. Falls back to DeclarativeScriptRunner
|
|
14
|
+
* for scripts with only set/extract.
|
|
15
|
+
*/
|
|
16
|
+
export declare class JsScriptRunner implements ScriptRunner {
|
|
17
|
+
runPreRequest(script: Script, context: ScriptContext): ScriptResult;
|
|
18
|
+
runPostResponse(script: Script, response: AssertionTarget, context: ScriptContext): ScriptResult;
|
|
19
|
+
private executeCode;
|
|
20
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { createContext, runInContext } from "node:vm";
|
|
2
|
+
import { dotGet } from "./assertions.js";
|
|
3
|
+
/**
|
|
4
|
+
* Declarative script runner.
|
|
5
|
+
* Handles pre_request.set and post_response.extract/set without executing arbitrary code.
|
|
6
|
+
*/
|
|
7
|
+
export class DeclarativeScriptRunner {
|
|
8
|
+
runPreRequest(script, context) {
|
|
9
|
+
const variables = { ...context.variables };
|
|
10
|
+
if (script.set) {
|
|
11
|
+
for (const [key, value] of Object.entries(script.set)) {
|
|
12
|
+
variables[key] = value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return { variables };
|
|
16
|
+
}
|
|
17
|
+
runPostResponse(script, response, context) {
|
|
18
|
+
const variables = { ...context.variables };
|
|
19
|
+
if (script.extract) {
|
|
20
|
+
for (const [varName, path] of Object.entries(script.extract)) {
|
|
21
|
+
const value = extractFromResponse(response, path);
|
|
22
|
+
if (value !== undefined && value !== null) {
|
|
23
|
+
variables[varName] = String(value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (script.set) {
|
|
28
|
+
for (const [key, value] of Object.entries(script.set)) {
|
|
29
|
+
variables[key] = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { variables };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Extract a value from a response using dot notation with body.* prefix handling. */
|
|
36
|
+
function extractFromResponse(response, path) {
|
|
37
|
+
if (path === "status")
|
|
38
|
+
return response.status;
|
|
39
|
+
if (path === "body")
|
|
40
|
+
return response.body;
|
|
41
|
+
if (path.startsWith("body."))
|
|
42
|
+
return dotGet(response.body, path.slice(5));
|
|
43
|
+
if (path.startsWith("header."))
|
|
44
|
+
return response.headers[path.slice(7).toLowerCase()];
|
|
45
|
+
if (path === "timing.total")
|
|
46
|
+
return response.timing.total_ms;
|
|
47
|
+
if (path === "timing.ttfb")
|
|
48
|
+
return response.timing.ttfb_ms;
|
|
49
|
+
return dotGet(response.body, path);
|
|
50
|
+
}
|
|
51
|
+
// ── JS script runner ────────────────────────────────────────────
|
|
52
|
+
const declarativeFallback = new DeclarativeScriptRunner();
|
|
53
|
+
/**
|
|
54
|
+
* JavaScript script runner.
|
|
55
|
+
* If a script has `code`, runs it in a sandboxed node:vm context
|
|
56
|
+
* with the `nr` API exposed. Falls back to DeclarativeScriptRunner
|
|
57
|
+
* for scripts with only set/extract.
|
|
58
|
+
*/
|
|
59
|
+
export class JsScriptRunner {
|
|
60
|
+
runPreRequest(script, context) {
|
|
61
|
+
if (script.code)
|
|
62
|
+
return this.executeCode(script.code, context, "pre");
|
|
63
|
+
return declarativeFallback.runPreRequest(script, context);
|
|
64
|
+
}
|
|
65
|
+
runPostResponse(script, response, context) {
|
|
66
|
+
if (script.code)
|
|
67
|
+
return this.executeCode(script.code, context, "post", response);
|
|
68
|
+
return declarativeFallback.runPostResponse(script, response, context);
|
|
69
|
+
}
|
|
70
|
+
executeCode(code, context, phase, response) {
|
|
71
|
+
const variables = { ...context.variables };
|
|
72
|
+
const mutations = {};
|
|
73
|
+
const tests = [];
|
|
74
|
+
const logs = [];
|
|
75
|
+
// Build mutable request state from context
|
|
76
|
+
const reqState = {
|
|
77
|
+
method: context.request?.method ?? "GET",
|
|
78
|
+
url: context.request?.path ?? "/",
|
|
79
|
+
headers: { ...(context.request?.headers ?? {}) },
|
|
80
|
+
body: context.request?.body,
|
|
81
|
+
cookies: { ...(context.request?.cookies ?? {}) },
|
|
82
|
+
};
|
|
83
|
+
// ── nr.variables ──
|
|
84
|
+
const nrVariables = {
|
|
85
|
+
get(key) { return variables[key]; },
|
|
86
|
+
set(key, value) { variables[key] = String(value); },
|
|
87
|
+
};
|
|
88
|
+
// ── nr.request ──
|
|
89
|
+
const nrRequestHeaders = {
|
|
90
|
+
get(key) { return reqState.headers[key] ?? reqState.headers[key.toLowerCase()]; },
|
|
91
|
+
set(key, value) {
|
|
92
|
+
reqState.headers[key] = value;
|
|
93
|
+
if (!mutations.headers)
|
|
94
|
+
mutations.headers = {};
|
|
95
|
+
mutations.headers[key] = value;
|
|
96
|
+
},
|
|
97
|
+
remove(key) {
|
|
98
|
+
delete reqState.headers[key];
|
|
99
|
+
if (!mutations.headers)
|
|
100
|
+
mutations.headers = {};
|
|
101
|
+
mutations.headers[key] = "";
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
const nrRequest = {
|
|
105
|
+
get method() { return reqState.method; },
|
|
106
|
+
set method(v) { reqState.method = v; mutations.method = v; },
|
|
107
|
+
get url() { return reqState.url; },
|
|
108
|
+
set url(v) { reqState.url = v; mutations.path = v; },
|
|
109
|
+
headers: nrRequestHeaders,
|
|
110
|
+
get body() { return reqState.body; },
|
|
111
|
+
set body(v) { reqState.body = v; mutations.body = v; },
|
|
112
|
+
};
|
|
113
|
+
// ── nr.cookies ──
|
|
114
|
+
const nrCookies = {
|
|
115
|
+
set(name, value) {
|
|
116
|
+
reqState.cookies[name] = value;
|
|
117
|
+
if (!mutations.cookies)
|
|
118
|
+
mutations.cookies = {};
|
|
119
|
+
mutations.cookies[name] = value;
|
|
120
|
+
},
|
|
121
|
+
get(name) { return reqState.cookies[name]; },
|
|
122
|
+
};
|
|
123
|
+
// ── nr.environment (read-only) ──
|
|
124
|
+
const nrEnvironment = {
|
|
125
|
+
get(key) { return context.environment?.variables?.[key]; },
|
|
126
|
+
get name() { return context.environment?.name ?? ""; },
|
|
127
|
+
get base_url() { return context.environment?.base_url ?? ""; },
|
|
128
|
+
};
|
|
129
|
+
// ── nr.response (post-response only) ──
|
|
130
|
+
let nrResponse;
|
|
131
|
+
if (phase === "post" && response) {
|
|
132
|
+
const rawBody = response.body;
|
|
133
|
+
const textBody = typeof rawBody === "string" ? rawBody : JSON.stringify(rawBody);
|
|
134
|
+
nrResponse = {
|
|
135
|
+
status: response.status,
|
|
136
|
+
headers: {
|
|
137
|
+
get(key) {
|
|
138
|
+
return response.headers[key] ?? response.headers[key.toLowerCase()];
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
body: rawBody,
|
|
142
|
+
json() { return rawBody; },
|
|
143
|
+
text() { return textBody; },
|
|
144
|
+
time: response.timing.total_ms,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// ── nr.test ──
|
|
148
|
+
function nrTest(name, fn) {
|
|
149
|
+
try {
|
|
150
|
+
fn();
|
|
151
|
+
tests.push({ name, passed: true });
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
tests.push({
|
|
155
|
+
name,
|
|
156
|
+
passed: false,
|
|
157
|
+
error: err instanceof Error ? err.message : String(err),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// ── nr.log ──
|
|
162
|
+
function nrLog(...args) {
|
|
163
|
+
logs.push(args.map(String).join(" "));
|
|
164
|
+
}
|
|
165
|
+
// Assemble the nr object
|
|
166
|
+
const nr = {
|
|
167
|
+
variables: nrVariables,
|
|
168
|
+
request: nrRequest,
|
|
169
|
+
cookies: nrCookies,
|
|
170
|
+
environment: nrEnvironment,
|
|
171
|
+
test: nrTest,
|
|
172
|
+
log: nrLog,
|
|
173
|
+
};
|
|
174
|
+
if (nrResponse)
|
|
175
|
+
nr.response = nrResponse;
|
|
176
|
+
// ── Sandbox ──
|
|
177
|
+
const sandbox = createContext({
|
|
178
|
+
nr,
|
|
179
|
+
console: { log: nrLog, warn: nrLog, error: nrLog },
|
|
180
|
+
JSON,
|
|
181
|
+
parseInt,
|
|
182
|
+
parseFloat,
|
|
183
|
+
Math,
|
|
184
|
+
Date,
|
|
185
|
+
Array,
|
|
186
|
+
Object,
|
|
187
|
+
String,
|
|
188
|
+
Number,
|
|
189
|
+
Boolean,
|
|
190
|
+
RegExp,
|
|
191
|
+
Map,
|
|
192
|
+
Set,
|
|
193
|
+
encodeURIComponent,
|
|
194
|
+
decodeURIComponent,
|
|
195
|
+
encodeURI,
|
|
196
|
+
decodeURI,
|
|
197
|
+
btoa: (s) => Buffer.from(s).toString("base64"),
|
|
198
|
+
atob: (s) => Buffer.from(s, "base64").toString("utf-8"),
|
|
199
|
+
isNaN,
|
|
200
|
+
isFinite,
|
|
201
|
+
undefined,
|
|
202
|
+
NaN,
|
|
203
|
+
Infinity,
|
|
204
|
+
});
|
|
205
|
+
try {
|
|
206
|
+
runInContext(code, sandbox, { timeout: 5000, filename: `script-${phase}.js` });
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
210
|
+
logs.push(`[script error] ${msg}`);
|
|
211
|
+
}
|
|
212
|
+
// Build result
|
|
213
|
+
const result = { variables };
|
|
214
|
+
const hasMutations = mutations.headers || mutations.body !== undefined ||
|
|
215
|
+
mutations.cookies || mutations.path || mutations.method;
|
|
216
|
+
if (hasMutations)
|
|
217
|
+
result.mutations = mutations;
|
|
218
|
+
if (tests.length)
|
|
219
|
+
result.tests = tests;
|
|
220
|
+
if (logs.length)
|
|
221
|
+
result.logs = logs;
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../../src/collections/scripts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC,aAAa,CAAC,MAAc,EAAE,OAAsB;QAClD,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,QAAyB,EAAE,OAAsB;QAC/E,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAE3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC1C,SAAS,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;CACF;AAED,sFAAsF;AACtF,SAAS,mBAAmB,CAAC,QAAyB,EAAE,IAAY;IAClE,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAC9C,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC7D,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,mEAAmE;AAEnE,MAAM,mBAAmB,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACzB,aAAa,CAAC,MAAc,EAAE,OAAsB;QAClD,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,mBAAmB,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,QAAyB,EAAE,OAAsB;QAC/E,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjF,OAAO,mBAAmB,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAEO,WAAW,CACjB,IAAY,EACZ,OAAsB,EACtB,KAAqB,EACrB,QAA0B;QAE1B,MAAM,SAAS,GAA2B,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QACnE,MAAM,SAAS,GAA8B,EAAE,CAAC;QAChD,MAAM,KAAK,GAAwD,EAAE,CAAC;QACtE,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,2CAA2C;QAC3C,MAAM,QAAQ,GAAG;YACf,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK;YACxC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,GAAG;YACjC,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE;YAChD,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI;YAC3B,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE;SACjD,CAAC;QAEF,qBAAqB;QACrB,MAAM,WAAW,GAAG;YAClB,GAAG,CAAC,GAAW,IAAwB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/D,GAAG,CAAC,GAAW,EAAE,KAAa,IAAU,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC1E,CAAC;QAEF,mBAAmB;QACnB,MAAM,gBAAgB,GAAG;YACvB,GAAG,CAAC,GAAW,IAAwB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7G,GAAG,CAAC,GAAW,EAAE,KAAa;gBAC5B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,OAAO;oBAAE,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC/C,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACjC,CAAC;YACD,MAAM,CAAC,GAAW;gBAChB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,OAAO;oBAAE,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC/C,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAC9B,CAAC;SACF,CAAC;QAEF,MAAM,SAAS,GAAG;YAChB,IAAI,MAAM,KAAK,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,CAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACpE,IAAI,GAAG,KAAK,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,CAAC,CAAS,IAAI,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,OAAO,EAAE,gBAAgB;YACzB,IAAI,IAAI,KAAK,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,CAAU,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;SAChE,CAAC;QAEF,mBAAmB;QACnB,MAAM,SAAS,GAAG;YAChB,GAAG,CAAC,IAAY,EAAE,KAAa;gBAC7B,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,SAAS,CAAC,OAAO;oBAAE,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC/C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAClC,CAAC;YACD,GAAG,CAAC,IAAY,IAAwB,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACzE,CAAC;QAEF,mCAAmC;QACnC,MAAM,aAAa,GAAG;YACpB,GAAG,CAAC,GAAW,IAAwB,OAAO,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtF,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,QAAQ,KAAK,OAAO,OAAO,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;SAC/D,CAAC;QAEF,yCAAyC;QACzC,IAAI,UAA+C,CAAC;QACpD,IAAI,KAAK,KAAK,MAAM,IAAI,QAAQ,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACjF,UAAU,GAAG;gBACX,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE;oBACP,GAAG,CAAC,GAAW;wBACb,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;oBACtE,CAAC;iBACF;gBACD,IAAI,EAAE,OAAO;gBACb,IAAI,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC;gBAC1B,IAAI,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC;gBAC3B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ;aAC/B,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,SAAS,MAAM,CAAC,IAAY,EAAE,EAAc;YAC1C,IAAI,CAAC;gBACH,EAAE,EAAE,CAAC;gBACL,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI;oBACJ,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,eAAe;QACf,SAAS,KAAK,CAAC,GAAG,IAAe;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,yBAAyB;QACzB,MAAM,EAAE,GAA4B;YAClC,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,KAAK;SACX,CAAC;QACF,IAAI,UAAU;YAAE,EAAE,CAAC,QAAQ,GAAG,UAAU,CAAC;QAEzC,gBAAgB;QAChB,MAAM,OAAO,GAAG,aAAa,CAAC;YAC5B,EAAE;YACF,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;YAClD,IAAI;YACJ,QAAQ;YACR,UAAU;YACV,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,OAAO;YACP,MAAM;YACN,GAAG;YACH,GAAG;YACH,kBAAkB;YAClB,kBAAkB;YAClB,SAAS;YACT,SAAS;YACT,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtD,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC/D,KAAK;YACL,QAAQ;YACR,SAAS;YACT,GAAG;YACH,QAAQ;SACT,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,eAAe;QACf,MAAM,MAAM,GAAiB,EAAE,SAAS,EAAE,CAAC;QAE3C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;YACpE,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC;QAC1D,IAAI,YAAY;YAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QAEpC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|