neuron-inspector 1.2.1 → 1.3.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 (85) hide show
  1. package/dist/collections/assertions.js +11 -0
  2. package/dist/collections/assertions.js.map +1 -1
  3. package/dist/collections/dynamic-vars-core.d.ts +79 -0
  4. package/dist/collections/dynamic-vars-core.js +214 -0
  5. package/dist/collections/dynamic-vars-core.js.map +1 -0
  6. package/dist/collections/dynamic-vars.d.ts +2 -61
  7. package/dist/collections/dynamic-vars.js +6 -146
  8. package/dist/collections/dynamic-vars.js.map +1 -1
  9. package/dist/collections/encoding.d.ts +3 -0
  10. package/dist/collections/encoding.js +20 -0
  11. package/dist/collections/encoding.js.map +1 -0
  12. package/dist/collections/executor.d.ts +114 -5
  13. package/dist/collections/executor.js +315 -91
  14. package/dist/collections/executor.js.map +1 -1
  15. package/dist/collections/index.d.ts +11 -3
  16. package/dist/collections/index.js +7 -1
  17. package/dist/collections/index.js.map +1 -1
  18. package/dist/collections/masking.d.ts +42 -0
  19. package/dist/collections/masking.js +188 -0
  20. package/dist/collections/masking.js.map +1 -0
  21. package/dist/collections/resolver-core.d.ts +74 -0
  22. package/dist/collections/resolver-core.js +309 -0
  23. package/dist/collections/resolver-core.js.map +1 -0
  24. package/dist/collections/resolver.d.ts +9 -62
  25. package/dist/collections/resolver.js +21 -281
  26. package/dist/collections/resolver.js.map +1 -1
  27. package/dist/collections/scenario-run.d.ts +33 -0
  28. package/dist/collections/scenario-run.js +68 -0
  29. package/dist/collections/scenario-run.js.map +1 -0
  30. package/dist/collections/script-api.d.ts +18 -0
  31. package/dist/collections/script-api.js +208 -0
  32. package/dist/collections/script-api.js.map +1 -0
  33. package/dist/collections/scripts.d.ts +1 -8
  34. package/dist/collections/scripts.js +6 -196
  35. package/dist/collections/scripts.js.map +1 -1
  36. package/dist/collections/slug.d.ts +2 -0
  37. package/dist/collections/slug.js +8 -0
  38. package/dist/collections/slug.js.map +1 -0
  39. package/dist/collections/store.d.ts +5 -2
  40. package/dist/collections/store.js +6 -6
  41. package/dist/collections/store.js.map +1 -1
  42. package/dist/collections/tools.d.ts +8 -1
  43. package/dist/collections/tools.js +253 -90
  44. package/dist/collections/tools.js.map +1 -1
  45. package/dist/collections/types.d.ts +42 -3
  46. package/dist/correlation.js +10 -0
  47. package/dist/correlation.js.map +1 -1
  48. package/dist/extension-slot.d.ts +45 -0
  49. package/dist/extension-slot.js +81 -0
  50. package/dist/extension-slot.js.map +1 -0
  51. package/dist/monitor.d.ts +5 -0
  52. package/dist/monitor.js +7 -2
  53. package/dist/monitor.js.map +1 -1
  54. package/dist/server.js +113 -25
  55. package/dist/server.js.map +1 -1
  56. package/dist/tools.js +1 -1
  57. package/dist/tools.js.map +1 -1
  58. package/package.json +3 -2
  59. package/dist/collections/__tests__/assertions.test.d.ts +0 -1
  60. package/dist/collections/__tests__/assertions.test.js +0 -203
  61. package/dist/collections/__tests__/assertions.test.js.map +0 -1
  62. package/dist/collections/__tests__/dynamic-vars.test.d.ts +0 -1
  63. package/dist/collections/__tests__/dynamic-vars.test.js +0 -169
  64. package/dist/collections/__tests__/dynamic-vars.test.js.map +0 -1
  65. package/dist/collections/__tests__/execution.test.d.ts +0 -1
  66. package/dist/collections/__tests__/execution.test.js +0 -271
  67. package/dist/collections/__tests__/execution.test.js.map +0 -1
  68. package/dist/collections/__tests__/integration.test.d.ts +0 -1
  69. package/dist/collections/__tests__/integration.test.js +0 -478
  70. package/dist/collections/__tests__/integration.test.js.map +0 -1
  71. package/dist/collections/__tests__/merge.test.d.ts +0 -1
  72. package/dist/collections/__tests__/merge.test.js +0 -411
  73. package/dist/collections/__tests__/merge.test.js.map +0 -1
  74. package/dist/collections/__tests__/resolver.test.d.ts +0 -1
  75. package/dist/collections/__tests__/resolver.test.js +0 -282
  76. package/dist/collections/__tests__/resolver.test.js.map +0 -1
  77. package/dist/collections/__tests__/scenario.test.d.ts +0 -1
  78. package/dist/collections/__tests__/scenario.test.js +0 -367
  79. package/dist/collections/__tests__/scenario.test.js.map +0 -1
  80. package/dist/collections/__tests__/scripts.test.d.ts +0 -1
  81. package/dist/collections/__tests__/scripts.test.js +0 -245
  82. package/dist/collections/__tests__/scripts.test.js.map +0 -1
  83. package/dist/collections/__tests__/store.test.d.ts +0 -1
  84. package/dist/collections/__tests__/store.test.js +0 -313
  85. package/dist/collections/__tests__/store.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI1E,mEAAmE;AACnE,+CAA+C;AAC/C,+DAA+D;AAE/D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACxC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC7C,MAAM,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;AAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAuB5H,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAI1E,mEAAmE;AACnE,+CAA+C;AAC/C,+DAA+D;AAE/D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;AACxC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC7C,MAAM,kBAAkB,GAAG,oBAAoB,EAAE,CAAC;AAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;AAC1D,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,CAAC,CAAC;AA0B5H,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnH,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE5F,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { RunInput } from "./types.js";
2
+ export declare const MASK = "\u2022\u2022\u2022";
3
+ /**
4
+ * Validate and normalise input declarations before they are stored.
5
+ * Throws on anything that would put a value on disk for a secret.
6
+ */
7
+ export declare function sanitizeInputDeclarations(raw: unknown): RunInput[] | undefined;
8
+ /** Environment declarations first, scenario declarations override by name. */
9
+ export declare function mergeInputDeclarations(...layers: (RunInput[] | undefined)[]): RunInput[];
10
+ export interface PreparedInputs {
11
+ /** name → value, for the resolver. */
12
+ values: Record<string, string>;
13
+ /** Values to mask in every output. */
14
+ secrets: string[];
15
+ /** Required inputs with no value. */
16
+ missing: string[];
17
+ }
18
+ /**
19
+ * Match supplied values to declarations. Undeclared values are still usable
20
+ * (handy for ad-hoc MCP runs) but only declared `secret` ones are masked, so
21
+ * callers should declare anything sensitive.
22
+ */
23
+ export declare function prepareInputs(declared: RunInput[], supplied: unknown): PreparedInputs;
24
+ /** Public view of declarations for UIs and MCP callers. Never includes values. */
25
+ export declare function describeInputs(declared: RunInput[]): RunInput[];
26
+ export declare class SecretMasker {
27
+ private needles;
28
+ private secrets;
29
+ constructor(secrets: string[]);
30
+ /** Mask another value from here on (e.g. a token extracted with `mask: true`). */
31
+ add(secret: string): void;
32
+ get active(): boolean;
33
+ maskString(text: string): string;
34
+ /** Deep copy with every string (and object key) masked. */
35
+ mask<T>(value: T): T;
36
+ private walk;
37
+ }
38
+ /** Normalise an extract rule. */
39
+ export declare function extractRule(rule: unknown): {
40
+ path: string;
41
+ mask: boolean;
42
+ } | null;
@@ -0,0 +1,188 @@
1
+ import { toBase64, fromBase64 } from "./encoding.js";
2
+ // ── Run inputs + secret masking ─────────────────────────────────
3
+ //
4
+ // Secret input values exist only in memory for one run. Everything a run
5
+ // returns, streams or stores goes through a SecretMasker first, so a secret
6
+ // that a server echoes back, a script logs, or an auth header encodes never
7
+ // leaves the runner in clear text.
8
+ export const MASK = "•••";
9
+ const ALLOWED_INPUT_FIELDS = new Set(["name", "label", "description", "secret", "required", "default"]);
10
+ const INPUT_NAME = /^[A-Za-z_][A-Za-z0-9_.-]*$/;
11
+ /**
12
+ * Validate and normalise input declarations before they are stored.
13
+ * Throws on anything that would put a value on disk for a secret.
14
+ */
15
+ export function sanitizeInputDeclarations(raw) {
16
+ if (raw === undefined || raw === null)
17
+ return undefined;
18
+ if (!Array.isArray(raw))
19
+ throw new Error("inputs must be an array of { name, secret?, required?, label?, description?, default? }");
20
+ const seen = new Set();
21
+ const out = [];
22
+ for (const item of raw) {
23
+ const decl = typeof item === "string" ? { name: item } : item;
24
+ if (!decl || typeof decl !== "object")
25
+ throw new Error("Each input must be an object with a name");
26
+ const d = decl;
27
+ if (typeof d.name !== "string" || !INPUT_NAME.test(d.name)) {
28
+ throw new Error(`Invalid input name '${String(d.name)}' (letters, digits, _ . - only)`);
29
+ }
30
+ if (seen.has(d.name))
31
+ throw new Error(`Input '${d.name}' is declared twice`);
32
+ seen.add(d.name);
33
+ if ("value" in d) {
34
+ throw new Error(`Input '${d.name}' has a 'value'. Inputs are declarations only; pass values when you run.`);
35
+ }
36
+ if (d.secret === true && d.default !== undefined) {
37
+ throw new Error(`Secret input '${d.name}' can't have a default. Secret values are never stored.`);
38
+ }
39
+ const unknown = Object.keys(d).filter((k) => !ALLOWED_INPUT_FIELDS.has(k));
40
+ if (unknown.length)
41
+ throw new Error(`Input '${d.name}' has unknown field(s): ${unknown.join(", ")}`);
42
+ const clean = { name: d.name };
43
+ if (typeof d.label === "string")
44
+ clean.label = d.label;
45
+ if (typeof d.description === "string")
46
+ clean.description = d.description;
47
+ if (d.secret === true)
48
+ clean.secret = true;
49
+ if (d.required === false)
50
+ clean.required = false;
51
+ if (d.default !== undefined)
52
+ clean.default = String(d.default);
53
+ out.push(clean);
54
+ }
55
+ return out.length ? out : undefined;
56
+ }
57
+ /** Environment declarations first, scenario declarations override by name. */
58
+ export function mergeInputDeclarations(...layers) {
59
+ const byName = new Map();
60
+ for (const layer of layers) {
61
+ for (const decl of layer ?? [])
62
+ byName.set(decl.name, { ...byName.get(decl.name), ...decl });
63
+ }
64
+ return [...byName.values()];
65
+ }
66
+ /**
67
+ * Match supplied values to declarations. Undeclared values are still usable
68
+ * (handy for ad-hoc MCP runs) but only declared `secret` ones are masked, so
69
+ * callers should declare anything sensitive.
70
+ */
71
+ export function prepareInputs(declared, supplied) {
72
+ const given = {};
73
+ if (supplied && typeof supplied === "object" && !Array.isArray(supplied)) {
74
+ for (const [k, v] of Object.entries(supplied)) {
75
+ if (v === undefined || v === null)
76
+ continue;
77
+ given[k] = typeof v === "string" ? v : JSON.stringify(v);
78
+ }
79
+ }
80
+ const values = { ...given };
81
+ const secrets = [];
82
+ const missing = [];
83
+ for (const decl of declared) {
84
+ let value = given[decl.name];
85
+ if ((value === undefined || value === "") && !decl.secret && decl.default !== undefined)
86
+ value = decl.default;
87
+ if (value === undefined || value === "") {
88
+ if (decl.required !== false)
89
+ missing.push(decl.name);
90
+ delete values[decl.name];
91
+ continue;
92
+ }
93
+ values[decl.name] = value;
94
+ if (decl.secret)
95
+ secrets.push(value);
96
+ }
97
+ return { values, secrets, missing };
98
+ }
99
+ /** Public view of declarations for UIs and MCP callers. Never includes values. */
100
+ export function describeInputs(declared) {
101
+ return declared.map((d) => ({ ...d, required: d.required !== false }));
102
+ }
103
+ // ── Masker ──────────────────────────────────────────────────────
104
+ function base64(s) {
105
+ return toBase64(s);
106
+ }
107
+ export class SecretMasker {
108
+ needles = [];
109
+ secrets = [];
110
+ constructor(secrets) {
111
+ for (const s of secrets)
112
+ this.add(s);
113
+ }
114
+ /** Mask another value from here on (e.g. a token extracted with `mask: true`). */
115
+ add(secret) {
116
+ if (!secret || this.secrets.includes(secret))
117
+ return;
118
+ this.secrets.push(secret);
119
+ const forms = new Set(this.needles);
120
+ forms.add(secret);
121
+ forms.add(encodeURIComponent(secret));
122
+ forms.add(new URLSearchParams({ x: secret }).toString().slice(2));
123
+ forms.add(JSON.stringify(secret).slice(1, -1));
124
+ // A secret encoded inside a base64 value (e.g. a bearer token built from it)
125
+ const b = base64(secret);
126
+ if (b.length >= 8)
127
+ forms.add(b.replace(/=+$/, ""));
128
+ // Longest first so a longer form isn't half-replaced by a shorter one.
129
+ this.needles = [...forms].filter((f) => f.length > 0).sort((a, b) => b.length - a.length);
130
+ }
131
+ get active() {
132
+ return this.secrets.length > 0;
133
+ }
134
+ maskString(text) {
135
+ if (!this.active || !text)
136
+ return text;
137
+ // Basic auth first: base64("user:secret") contains base64(secret) only when the
138
+ // offsets happen to line up, and a partial replace would leave a half-masked
139
+ // value that can no longer be decoded and checked. Mask the whole credential.
140
+ let out = text.replace(/\b(Basic\s+)([A-Za-z0-9+/=]{4,})/gi, (whole, prefix, encoded) => {
141
+ let decoded = "";
142
+ try {
143
+ decoded = fromBase64(encoded);
144
+ }
145
+ catch {
146
+ return whole;
147
+ }
148
+ return this.secrets.some((s) => decoded.includes(s)) ? `${prefix}${MASK}` : whole;
149
+ });
150
+ for (const n of this.needles) {
151
+ if (out.includes(n))
152
+ out = out.split(n).join(MASK);
153
+ }
154
+ return out;
155
+ }
156
+ /** Deep copy with every string (and object key) masked. */
157
+ mask(value) {
158
+ if (!this.active)
159
+ return value;
160
+ return this.walk(value);
161
+ }
162
+ walk(value) {
163
+ if (typeof value === "string")
164
+ return this.maskString(value);
165
+ if (typeof value === "number" && this.secrets.includes(String(value)))
166
+ return MASK;
167
+ if (Array.isArray(value))
168
+ return value.map((v) => this.walk(v));
169
+ if (value && typeof value === "object") {
170
+ const out = {};
171
+ for (const [k, v] of Object.entries(value)) {
172
+ out[this.maskString(k)] = this.walk(v);
173
+ }
174
+ return out;
175
+ }
176
+ return value;
177
+ }
178
+ }
179
+ /** Normalise an extract rule. */
180
+ export function extractRule(rule) {
181
+ if (typeof rule === "string")
182
+ return { path: rule, mask: false };
183
+ if (rule && typeof rule === "object" && typeof rule.path === "string") {
184
+ return { path: rule.path, mask: rule.mask === true };
185
+ }
186
+ return null;
187
+ }
188
+ //# sourceMappingURL=masking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masking.js","sourceRoot":"","sources":["../../src/collections/masking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { ResolverStep, ResolverContext, ResolvedRequest, Collection, Environment, Folder, Endpoint } from "./types.js";
2
+ import type { DynamicVarRegistry } from "./dynamic-vars-core.js";
3
+ /** Replace all {{var}} references in a string using the resolver pipeline. */
4
+ export declare function resolveTemplate(template: string, steps: ResolverStep[], context: ResolverContext): string;
5
+ /** Recursively resolve all string values in an object/array. */
6
+ export declare function resolveDeep(value: unknown, steps: ResolverStep[], context: ResolverContext): unknown;
7
+ /** Find all unresolved {{var}} references in a string. */
8
+ export declare function findUnresolved(text: string): string[];
9
+ /** Scan all strings in a resolved request for unresolved variables. */
10
+ export declare function checkUnresolved(request: {
11
+ url: string;
12
+ headers: Record<string, string>;
13
+ body?: string;
14
+ }): string[];
15
+ /** Level 0: Values supplied for this run (declared `inputs`). An explicit run value beats every stored one. */
16
+ export declare class InputResolver implements ResolverStep {
17
+ name: string;
18
+ resolve(key: string, context: ResolverContext): string | undefined;
19
+ }
20
+ /** Level 3: Active environment variables */
21
+ export declare class EnvironmentResolver implements ResolverStep {
22
+ name: string;
23
+ resolve(key: string, context: ResolverContext): string | undefined;
24
+ }
25
+ /** Level 4: Collection-level defaults.variables */
26
+ export declare class CollectionDefaultsResolver implements ResolverStep {
27
+ name: string;
28
+ resolve(key: string, context: ResolverContext): string | undefined;
29
+ }
30
+ /** Level 5: Folder-level variables */
31
+ export declare class FolderResolver implements ResolverStep {
32
+ name: string;
33
+ resolve(key: string, context: ResolverContext): string | undefined;
34
+ }
35
+ /** Level 6: Request-level variables */
36
+ export declare class RequestResolver implements ResolverStep {
37
+ name: string;
38
+ resolve(key: string, context: ResolverContext): string | undefined;
39
+ }
40
+ /** Level 7: Extracted variables from previous requests */
41
+ export declare class ExtractedResolver implements ResolverStep {
42
+ name: string;
43
+ resolve(key: string, context: ResolverContext): string | undefined;
44
+ }
45
+ /** Level 8: Script-set variables */
46
+ export declare class ScriptVarResolver implements ResolverStep {
47
+ name: string;
48
+ resolve(key: string, context: ResolverContext): string | undefined;
49
+ }
50
+ /** Dynamic variable resolver: intercepts $-prefixed references and delegates to the registry. */
51
+ export declare class DynamicVarResolverStep implements ResolverStep {
52
+ private registry;
53
+ name: string;
54
+ constructor(registry: DynamicVarRegistry);
55
+ resolve(key: string, context: ResolverContext): string | undefined;
56
+ }
57
+ /**
58
+ * Every Node-free step in bridge order, highest priority first (no
59
+ * profile.yaml / process.env). Used by the browser engine.
60
+ */
61
+ export declare function buildCorePipeline(dynamicVarRegistry?: DynamicVarRegistry): ResolverStep[];
62
+ /** Inputs resolve even through a custom pipeline that predates them. */
63
+ export declare function withInputResolver(pipeline: ResolverStep[]): ResolverStep[];
64
+ /** Build a fully resolved request from collection context. */
65
+ export declare function buildResolvedRequest(opts: {
66
+ collection: Collection;
67
+ environment: Environment;
68
+ folder: Folder;
69
+ endpoint: Endpoint;
70
+ pipeline: ResolverStep[];
71
+ extracted?: Record<string, string>;
72
+ scriptVars?: Record<string, string>;
73
+ inputs?: Record<string, string>;
74
+ }): ResolvedRequest;
@@ -0,0 +1,309 @@
1
+ // Node-free half of the resolver: shared by the bridge and the extension's browser engine.
2
+ import { toBase64 } from "./encoding.js";
3
+ // ── Template engine ─────────────────────────────────────────────
4
+ const VAR_PATTERN = /\{\{([^}]+)\}\}/g;
5
+ /** Replace all {{var}} references in a string using the resolver pipeline. */
6
+ export function resolveTemplate(template, steps, context) {
7
+ return template.replace(VAR_PATTERN, (_match, key) => {
8
+ const trimmed = key.trim();
9
+ for (const step of steps) {
10
+ const value = step.resolve(trimmed, context);
11
+ if (value !== undefined)
12
+ return value;
13
+ }
14
+ // Leave unresolved for detection
15
+ return `{{${trimmed}}}`;
16
+ });
17
+ }
18
+ /** Recursively resolve all string values in an object/array. */
19
+ export function resolveDeep(value, steps, context) {
20
+ if (typeof value === "string")
21
+ return resolveTemplate(value, steps, context);
22
+ if (Array.isArray(value))
23
+ return value.map((v) => resolveDeep(v, steps, context));
24
+ if (typeof value === "object" && value !== null) {
25
+ const result = {};
26
+ for (const [k, v] of Object.entries(value)) {
27
+ result[k] = resolveDeep(v, steps, context);
28
+ }
29
+ return result;
30
+ }
31
+ return value;
32
+ }
33
+ /** Find all unresolved {{var}} references in a string. */
34
+ export function findUnresolved(text) {
35
+ const matches = [];
36
+ let m;
37
+ const re = /\{\{([^}]+)\}\}/g;
38
+ while ((m = re.exec(text)) !== null) {
39
+ matches.push(m[1].trim());
40
+ }
41
+ return matches;
42
+ }
43
+ /** Scan all strings in a resolved request for unresolved variables. */
44
+ export function checkUnresolved(request) {
45
+ const unresolved = new Set();
46
+ for (const v of findUnresolved(request.url))
47
+ unresolved.add(v);
48
+ for (const val of Object.values(request.headers)) {
49
+ for (const v of findUnresolved(val))
50
+ unresolved.add(v);
51
+ }
52
+ if (request.body) {
53
+ for (const v of findUnresolved(request.body))
54
+ unresolved.add(v);
55
+ }
56
+ return [...unresolved];
57
+ }
58
+ // ── Built-in resolver steps ─────────────────────────────────────
59
+ /** Level 0: Values supplied for this run (declared `inputs`). An explicit run value beats every stored one. */
60
+ export class InputResolver {
61
+ name = "input";
62
+ resolve(key, context) {
63
+ return context.inputs?.[key];
64
+ }
65
+ }
66
+ /** Level 3: Active environment variables */
67
+ export class EnvironmentResolver {
68
+ name = "environment";
69
+ resolve(key, context) {
70
+ return context.environment?.variables?.[key];
71
+ }
72
+ }
73
+ /** Level 4: Collection-level defaults.variables */
74
+ export class CollectionDefaultsResolver {
75
+ name = "collection.defaults";
76
+ resolve(key, context) {
77
+ return context.collection?.defaults?.variables?.[key];
78
+ }
79
+ }
80
+ /** Level 5: Folder-level variables */
81
+ export class FolderResolver {
82
+ name = "folder";
83
+ resolve(key, context) {
84
+ return context.folder?.variables?.[key];
85
+ }
86
+ }
87
+ /** Level 6: Request-level variables */
88
+ export class RequestResolver {
89
+ name = "request";
90
+ resolve(key, context) {
91
+ return context.endpoint?.variables?.[key];
92
+ }
93
+ }
94
+ /** Level 7: Extracted variables from previous requests */
95
+ export class ExtractedResolver {
96
+ name = "extracted";
97
+ resolve(key, context) {
98
+ return context.extracted?.[key];
99
+ }
100
+ }
101
+ /** Level 8: Script-set variables */
102
+ export class ScriptVarResolver {
103
+ name = "script";
104
+ resolve(key, context) {
105
+ return context.scriptVars?.[key];
106
+ }
107
+ }
108
+ /** Dynamic variable resolver: intercepts $-prefixed references and delegates to the registry. */
109
+ export class DynamicVarResolverStep {
110
+ registry;
111
+ name = "dynamic";
112
+ constructor(registry) {
113
+ this.registry = registry;
114
+ }
115
+ resolve(key, context) {
116
+ if (!key.startsWith("$"))
117
+ return undefined;
118
+ return this.registry.resolve(key, context);
119
+ }
120
+ }
121
+ // ── Pipeline ────────────────────────────────────────────────────
122
+ /**
123
+ * Every Node-free step in bridge order, highest priority first (no
124
+ * profile.yaml / process.env). Used by the browser engine.
125
+ */
126
+ export function buildCorePipeline(dynamicVarRegistry) {
127
+ const steps = [
128
+ new InputResolver(),
129
+ // This step's script vars before carried-over extracted ones: scripts start
130
+ // from a copy of the extracted values, so only what a script changed differs.
131
+ new ScriptVarResolver(),
132
+ new ExtractedResolver(),
133
+ new RequestResolver(),
134
+ new FolderResolver(),
135
+ new CollectionDefaultsResolver(),
136
+ new EnvironmentResolver(),
137
+ ];
138
+ if (dynamicVarRegistry)
139
+ steps.push(new DynamicVarResolverStep(dynamicVarRegistry));
140
+ return steps;
141
+ }
142
+ // ── Request builder ─────────────────────────────────────────────
143
+ /** Merge headers with precedence: request > folder > environment > collection defaults. */
144
+ function mergeHeaders(...layers) {
145
+ const merged = {};
146
+ for (const layer of layers) {
147
+ if (layer)
148
+ Object.assign(merged, layer);
149
+ }
150
+ return merged;
151
+ }
152
+ /** Resolve auth config into an Authorization header value. */
153
+ function resolveAuth(auth, steps, context) {
154
+ if (!auth || auth.type === "none")
155
+ return null;
156
+ switch (auth.type) {
157
+ case "bearer": {
158
+ const token = auth.token
159
+ ? resolveTemplate(auth.token, steps, context)
160
+ : "";
161
+ return { header: "Authorization", value: `Bearer ${token}` };
162
+ }
163
+ case "basic": {
164
+ const user = auth.username
165
+ ? resolveTemplate(auth.username, steps, context)
166
+ : "";
167
+ const pass = auth.password
168
+ ? resolveTemplate(auth.password, steps, context)
169
+ : "";
170
+ const encoded = toBase64(`${user}:${pass}`);
171
+ return { header: "Authorization", value: `Basic ${encoded}` };
172
+ }
173
+ case "api-key": {
174
+ const header = auth.header
175
+ ? resolveTemplate(auth.header, steps, context)
176
+ : "X-API-Key";
177
+ const value = auth.value
178
+ ? resolveTemplate(auth.value, steps, context)
179
+ : "";
180
+ return { header, value };
181
+ }
182
+ default:
183
+ return null;
184
+ }
185
+ }
186
+ /** Inputs resolve even through a custom pipeline that predates them. */
187
+ export function withInputResolver(pipeline) {
188
+ return pipeline.some((s) => s.name === "input") ? pipeline : [new InputResolver(), ...pipeline];
189
+ }
190
+ /** Build a fully resolved request from collection context. */
191
+ export function buildResolvedRequest(opts) {
192
+ const { collection, environment, folder, endpoint, extracted, scriptVars, inputs } = opts;
193
+ const pipeline = withInputResolver(opts.pipeline);
194
+ const context = {
195
+ environment,
196
+ collection,
197
+ folder,
198
+ endpoint,
199
+ extracted: extracted ?? {},
200
+ scriptVars: scriptVars ?? {},
201
+ inputs: inputs ?? {},
202
+ };
203
+ // Merge headers: collection defaults < environment < folder < endpoint
204
+ const rawHeaders = mergeHeaders(collection.defaults?.headers, environment.headers, folder.headers, endpoint.headers);
205
+ // Resolve auth (endpoint > folder > collection defaults)
206
+ const auth = endpoint.auth ?? folder.auth ?? collection.defaults?.auth;
207
+ const authHeader = resolveAuth(auth, pipeline, context);
208
+ if (authHeader && !rawHeaders[authHeader.header]) {
209
+ rawHeaders[authHeader.header] = authHeader.value;
210
+ }
211
+ // Resolve all header values
212
+ const headers = {};
213
+ for (const [k, v] of Object.entries(rawHeaders)) {
214
+ headers[k] = resolveTemplate(v, pipeline, context);
215
+ }
216
+ // Merge cookies into Cookie header
217
+ if (endpoint.cookies && Object.keys(endpoint.cookies).length > 0) {
218
+ const cookiePairs = Object.entries(endpoint.cookies)
219
+ .map(([k, v]) => `${resolveTemplate(k, pipeline, context)}=${resolveTemplate(v, pipeline, context)}`)
220
+ .join("; ");
221
+ const existing = headers["Cookie"] || headers["cookie"] || "";
222
+ headers["Cookie"] = existing ? `${existing}; ${cookiePairs}` : cookiePairs;
223
+ }
224
+ // Resolve URL — full URLs bypass base_url
225
+ const path = resolveTemplate(endpoint.path, pipeline, context);
226
+ let url;
227
+ if (path.startsWith("http://") || path.startsWith("https://")) {
228
+ url = path;
229
+ }
230
+ else {
231
+ url = environment.base_url.replace(/\/+$/, "") + (path.startsWith("/") ? path : `/${path}`);
232
+ }
233
+ // Resolve body based on body_mode
234
+ let body;
235
+ if (endpoint.body !== undefined) {
236
+ const resolved = resolveDeep(endpoint.body, pipeline, context);
237
+ const mode = endpoint.body_mode || "json";
238
+ switch (mode) {
239
+ case "urlencoded": {
240
+ if (typeof resolved === "object" && resolved !== null && !Array.isArray(resolved)) {
241
+ body = new URLSearchParams(resolved).toString();
242
+ if (!headers["Content-Type"])
243
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
244
+ }
245
+ else {
246
+ body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
247
+ }
248
+ break;
249
+ }
250
+ case "form-data": {
251
+ if (typeof resolved === "object" && resolved !== null && !Array.isArray(resolved)) {
252
+ const boundary = `----NeuronFormBoundary${Date.now().toString(36)}`;
253
+ const parts = [];
254
+ for (const [k, v] of Object.entries(resolved)) {
255
+ parts.push(`--${boundary}\r\nContent-Disposition: form-data; name="${k}"\r\n\r\n${v}`);
256
+ }
257
+ parts.push(`--${boundary}--`);
258
+ body = parts.join("\r\n");
259
+ if (!headers["Content-Type"])
260
+ headers["Content-Type"] = `multipart/form-data; boundary=${boundary}`;
261
+ }
262
+ else {
263
+ body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
264
+ }
265
+ break;
266
+ }
267
+ case "text": {
268
+ body = String(resolved);
269
+ if (!headers["Content-Type"])
270
+ headers["Content-Type"] = "text/plain";
271
+ break;
272
+ }
273
+ default: {
274
+ // json (default)
275
+ body = typeof resolved === "string" ? resolved : JSON.stringify(resolved);
276
+ break;
277
+ }
278
+ }
279
+ }
280
+ // Timeout: endpoint > environment > collection defaults > 30s
281
+ const timeout_ms = endpoint.timeout_ms ??
282
+ environment.timeout_ms ??
283
+ collection.defaults?.timeout_ms ??
284
+ 30000;
285
+ // Settings passthrough
286
+ const settings = endpoint.settings;
287
+ const follow_redirects = settings?.follow_redirects;
288
+ const max_redirects = settings?.max_redirects;
289
+ const verify_ssl = settings?.verify_ssl;
290
+ const follow_original_method = settings?.follow_original_method;
291
+ const follow_authorization = settings?.follow_authorization;
292
+ const remove_referer = settings?.remove_referer;
293
+ const encode_url = settings?.encode_url;
294
+ return {
295
+ url,
296
+ method: endpoint.method.toUpperCase(),
297
+ headers,
298
+ body,
299
+ timeout_ms,
300
+ ...(follow_redirects !== undefined && { follow_redirects }),
301
+ ...(max_redirects !== undefined && { max_redirects }),
302
+ ...(verify_ssl !== undefined && { verify_ssl }),
303
+ ...(follow_original_method !== undefined && { follow_original_method }),
304
+ ...(follow_authorization !== undefined && { follow_authorization }),
305
+ ...(remove_referer !== undefined && { remove_referer }),
306
+ ...(encode_url !== undefined && { encode_url }),
307
+ };
308
+ }
309
+ //# sourceMappingURL=resolver-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver-core.js","sourceRoot":"","sources":["../../src/collections/resolver-core.ts"],"names":[],"mappings":"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"}