@enricai/barnacle 1.6.2 → 1.6.3
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/README.md +23 -18
- package/dist/api/errors.d.ts +3 -3
- package/dist/api/errors.d.ts.map +1 -1
- package/dist/api/errors.js +4 -4
- package/dist/api/errors.js.map +1 -1
- package/dist/api/helpers/reply.d.ts +1 -1
- package/dist/api/helpers/reply.js +1 -1
- package/dist/cache/keyed-ttl-cache.d.ts +4 -4
- package/dist/cache/keyed-ttl-cache.js +2 -2
- package/dist/lib/applicant-payload.d.ts +4 -4
- package/dist/lib/applicant-payload.js +4 -4
- package/dist/lib/application-address.d.ts +3 -3
- package/dist/lib/application-address.js +5 -5
- package/dist/lib/application-address.js.map +1 -1
- package/dist/lib/application-resume.d.ts +4 -4
- package/dist/lib/application-resume.js +4 -4
- package/dist/lib/dispatch-metrics.js +1 -1
- package/dist/lib/llm/judges/verify-submit.d.ts +1 -1
- package/dist/lib/llm/judges/verify-submit.js +1 -1
- package/dist/lib/llm/schemas.js +3 -3
- package/dist/lib/phone.d.ts +1 -1
- package/dist/lib/phone.js +1 -1
- package/dist/lib/telemetry/call-types.d.ts +1 -1
- package/dist/lib/telemetry/call-types.js +1 -1
- package/dist/lib/tracking-click.d.ts +5 -3
- package/dist/lib/tracking-click.d.ts.map +1 -1
- package/dist/lib/tracking-click.js +5 -3
- package/dist/lib/tracking-click.js.map +1 -1
- package/dist/lib/us-states.d.ts +1 -1
- package/dist/lib/us-states.js +1 -1
- package/dist/plugins/loader.js +2 -2
- package/dist/scraper/cookie-jar.d.ts +2 -2
- package/dist/scraper/cookie-jar.js +2 -2
- package/dist/scraper/errors.d.ts +1 -12
- package/dist/scraper/errors.d.ts.map +1 -1
- package/dist/scraper/errors.js +2 -16
- package/dist/scraper/errors.js.map +1 -1
- package/dist/scraper/flow-runner.d.ts +43 -27
- package/dist/scraper/flow-runner.d.ts.map +1 -1
- package/dist/scraper/flow-runner.js +70 -60
- package/dist/scraper/flow-runner.js.map +1 -1
- package/dist/scraper/http-client.d.ts +11 -1
- package/dist/scraper/http-client.d.ts.map +1 -1
- package/dist/scraper/http-client.js +90 -3
- package/dist/scraper/http-client.js.map +1 -1
- package/dist/scraper/raw-fetch.d.ts +2 -2
- package/dist/scraper/raw-fetch.js +1 -1
- package/dist/scraper/require-response-field.d.ts +1 -1
- package/dist/scraper/require-response-field.js +1 -1
- package/dist/scraper/session-warmup.d.ts +1 -1
- package/dist/scraper/session-warmup.js +1 -1
- package/dist/scripts/migrate-telemetry-dir-names.d.ts +2 -2
- package/dist/scripts/migrate-telemetry-dir-names.d.ts.map +1 -1
- package/dist/scripts/migrate-telemetry-dir-names.js +1 -1
- package/dist/scripts/recon-browser.d.ts +2 -2
- package/dist/scripts/recon-browser.js +14 -14
- package/dist/scripts/recon-browser.js.map +1 -1
- package/dist/scripts/recon-generate.d.ts +24 -0
- package/dist/scripts/recon-generate.d.ts.map +1 -1
- package/dist/scripts/recon-generate.js +23 -7
- package/dist/scripts/recon-generate.js.map +1 -1
- package/dist/scripts/recon-replay-jobs.d.ts +9 -4
- package/dist/scripts/recon-replay-jobs.d.ts.map +1 -1
- package/dist/scripts/recon-replay-jobs.js +15 -8
- package/dist/scripts/recon-replay-jobs.js.map +1 -1
- package/dist/scripts/recon-shared.d.ts +10 -0
- package/dist/scripts/recon-shared.d.ts.map +1 -1
- package/dist/scripts/recon-shared.js +25 -0
- package/dist/scripts/recon-shared.js.map +1 -1
- package/dist/site-plugin.d.ts +4 -4
- package/dist/testing/persona-fixture.d.ts +4 -4
- package/dist/testing/persona-fixture.d.ts.map +1 -1
- package/dist/testing/persona-fixture.js +4 -4
- package/dist/testing/persona-fixture.js.map +1 -1
- package/dist/types/dispatch-metrics.d.ts +1 -1
- package/dist/types/dispatch-metrics.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/scraper/http-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAc1B;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/scraper/http-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAc1B;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB,CAAC,SAAS;IAC1C,+DAA+D;IAC/D,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3B,yEAAyE;IACzE,UAAU,EAAE,UAAU,CAAC;IACvB,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,YAAY,GAAG,SAAS,CAAC;CAC5F;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA+GD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EACxC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,GACpC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,KAAK,OAAO,CAAC,SAAS,CAAC,CAwL7D"}
|
|
@@ -83,6 +83,58 @@ function extractCookieValue(setCookieHeaders, cookieName) {
|
|
|
83
83
|
}
|
|
84
84
|
return undefined;
|
|
85
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Finds a header's value by case-insensitive key lookup — `baseHeaders` and
|
|
88
|
+
* `init.headers` are operator-supplied with arbitrary casing (unlike
|
|
89
|
+
* `boundHeaders`, which is normalized via `targetHeaderCasing`), so a plain
|
|
90
|
+
* `headers["Cookie"]` lookup would miss a `"cookie"` or `"COOKIE"` key.
|
|
91
|
+
*/
|
|
92
|
+
function findHeaderCaseInsensitive(headers, name) {
|
|
93
|
+
const lower = name.toLowerCase();
|
|
94
|
+
const key = Object.keys(headers).find((k) => k.toLowerCase() === lower);
|
|
95
|
+
return key === undefined ? undefined : headers[key];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parses a `name=value; name=value` Cookie header string into per-cookie
|
|
99
|
+
* entries, mirroring the pair-splitting `extractCookieValue` already does
|
|
100
|
+
* for `Set-Cookie`. Skips malformed segments (no `=`) rather than throwing —
|
|
101
|
+
* an operator-authored `baseHeaders` or per-call `init.headers` Cookie value
|
|
102
|
+
* is untrusted input, not a value this module produced.
|
|
103
|
+
*/
|
|
104
|
+
function parseCookiePairs(cookieHeader) {
|
|
105
|
+
return cookieHeader
|
|
106
|
+
.split(";")
|
|
107
|
+
.map((pair) => pair.trim())
|
|
108
|
+
.filter(Boolean)
|
|
109
|
+
.flatMap((pair) => {
|
|
110
|
+
const eq = pair.indexOf("=");
|
|
111
|
+
return eq === -1 ? [] : [[pair.slice(0, eq).trim(), pair.slice(eq + 1).trim()]];
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Merges the Cookie header across `baseHeaders`, the live `boundHeaders`
|
|
116
|
+
* accumulator, and per-call `init.headers` by individual cookie name instead
|
|
117
|
+
* of the last-wins overwrite plain object spread gives every other header —
|
|
118
|
+
* see the http-client.ts module docblock and CLAUDE.md "battle-tested
|
|
119
|
+
* libraries only" for why the Cookie header specifically needs pair-level
|
|
120
|
+
* merging. Precedence on a name collision: a freshly bound value (the live
|
|
121
|
+
* session state a response just handed back) wins over a per-call override,
|
|
122
|
+
* which wins over the plugin's static default — bound values are the most
|
|
123
|
+
* current source of truth for a cookie in active rotation.
|
|
124
|
+
*/
|
|
125
|
+
function mergeCookieHeader(baseHeaders, boundHeaders, initHeaders) {
|
|
126
|
+
const merged = new Map();
|
|
127
|
+
for (const source of [baseHeaders, initHeaders, boundHeaders]) {
|
|
128
|
+
const cookieHeader = findHeaderCaseInsensitive(source, "Cookie");
|
|
129
|
+
if (cookieHeader === undefined)
|
|
130
|
+
continue;
|
|
131
|
+
for (const [name, value] of parseCookiePairs(cookieHeader))
|
|
132
|
+
merged.set(name, value);
|
|
133
|
+
}
|
|
134
|
+
if (merged.size === 0)
|
|
135
|
+
return undefined;
|
|
136
|
+
return [...merged.entries()].map(([name, value]) => `${name}=${value}`).join("; ");
|
|
137
|
+
}
|
|
86
138
|
/**
|
|
87
139
|
* Resolves one {@link HttpResponseBinding} against a response's headers.
|
|
88
140
|
* Returns `undefined` on a miss (source header/cookie absent) so the caller
|
|
@@ -125,10 +177,33 @@ function createHttpClient(options) {
|
|
|
125
177
|
// targetHeader. Lives for the lifetime of this client instance so a later
|
|
126
178
|
// call can pick up what an earlier call captured — see HttpResponseBinding.
|
|
127
179
|
const boundHeaders = {};
|
|
180
|
+
// Per-cookie values for targetHeaders that carry multiple cookies (e.g.
|
|
181
|
+
// "Cookie"), keyed by targetHeader.toLowerCase() then cookieName so
|
|
182
|
+
// several bindings sharing one targetHeader — even across differing
|
|
183
|
+
// casing, since HTTP header names are case-insensitive — accumulate
|
|
184
|
+
// instead of overwriting or splitting into two outbound headers — see
|
|
185
|
+
// HttpResponseBinding.targetHeader. Materialized into boundHeaders
|
|
186
|
+
// (joined by "; ") whenever an entry changes.
|
|
187
|
+
const boundCookiesByTarget = new Map();
|
|
188
|
+
// Canonical (first-seen) casing of each targetHeader, keyed by
|
|
189
|
+
// targetHeader.toLowerCase() — lets both branches below write
|
|
190
|
+
// boundHeaders under one stable key regardless of which casing a later
|
|
191
|
+
// binding declares.
|
|
192
|
+
const targetHeaderCasing = new Map();
|
|
128
193
|
return async (url, init = {}) => {
|
|
129
194
|
return bottleneck.schedule(() => (0, p_retry_1.default)(async () => {
|
|
130
195
|
const method = init.method ?? "GET";
|
|
131
|
-
const
|
|
196
|
+
const initHeaders = init.headers ?? {};
|
|
197
|
+
const mergedCookie = mergeCookieHeader(baseHeaders, boundHeaders, initHeaders);
|
|
198
|
+
const headers = {
|
|
199
|
+
...baseHeaders,
|
|
200
|
+
...boundHeaders,
|
|
201
|
+
...initHeaders,
|
|
202
|
+
};
|
|
203
|
+
if (mergedCookie !== undefined) {
|
|
204
|
+
const cookieKey = Object.keys(headers).find((k) => k.toLowerCase() === "cookie") ?? "Cookie";
|
|
205
|
+
headers[cookieKey] = mergedCookie;
|
|
206
|
+
}
|
|
132
207
|
let response;
|
|
133
208
|
try {
|
|
134
209
|
response = await fetch(url, {
|
|
@@ -157,9 +232,21 @@ function createHttpClient(options) {
|
|
|
157
232
|
// clearing it — and if nothing has ever been bound, the target
|
|
158
233
|
// header stays absent from `boundHeaders` entirely, so later
|
|
159
234
|
// requests never send it as an empty string.
|
|
160
|
-
if (value
|
|
161
|
-
|
|
235
|
+
if (value === undefined)
|
|
236
|
+
continue;
|
|
237
|
+
const targetKey = binding.targetHeader.toLowerCase();
|
|
238
|
+
const canonicalTarget = targetHeaderCasing.get(targetKey) ?? binding.targetHeader;
|
|
239
|
+
targetHeaderCasing.set(targetKey, canonicalTarget);
|
|
240
|
+
if (binding.cookieName === undefined) {
|
|
241
|
+
boundHeaders[canonicalTarget] = value;
|
|
242
|
+
continue;
|
|
162
243
|
}
|
|
244
|
+
const cookies = boundCookiesByTarget.get(targetKey) ?? new Map();
|
|
245
|
+
cookies.set(binding.cookieName, value);
|
|
246
|
+
boundCookiesByTarget.set(targetKey, cookies);
|
|
247
|
+
boundHeaders[canonicalTarget] = [...cookies.entries()]
|
|
248
|
+
.map(([name, cookieValue]) => `${name}=${cookieValue}`)
|
|
249
|
+
.join("; ");
|
|
163
250
|
}
|
|
164
251
|
if (response.status === 401 || response.status === 403) {
|
|
165
252
|
// Bot challenge / auth wall — not a transient failure, abort retry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/scraper/http-client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAmD;AACnD,yCAAiC;AAGjC,mDAA6C;AAG7C,2CAA0C;AAC1C,6CAO0B;AAE1B,MAAM,MAAM,GAAG,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;AAE1D;;;;;;;GAOG;AACH,IAAI,mBAAmB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/scraper/http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Site-agnostic fetch scaffold shared by plugins that cannot use
|
|
3
3
|
* `createHttpClient` — typically because they need multipart Buffer bodies
|
|
4
|
-
* or per-response header rotation (
|
|
4
|
+
* or per-response header rotation (per-site token churn). Owns the
|
|
5
5
|
* try/catch network-error conversion, the onResponse hook, and the
|
|
6
6
|
* classifyHttpStatus call so callers only supply the what (URL, headers,
|
|
7
7
|
* body) and the where (their token-rotation / audit hook and context label).
|
|
@@ -47,7 +47,7 @@ export interface RawFetchOptions {
|
|
|
47
47
|
onResponse: (headers: Headers) => void;
|
|
48
48
|
/**
|
|
49
49
|
* Short label used in error messages from `classifyHttpStatus`, e.g.
|
|
50
|
-
* `"
|
|
50
|
+
* `"<site> /integrated_questions"`. Should identify the endpoint so
|
|
51
51
|
* logs and error surfaces are actionable.
|
|
52
52
|
*/
|
|
53
53
|
contextLabel: string;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Site-agnostic fetch scaffold shared by plugins that cannot use
|
|
4
4
|
* `createHttpClient` — typically because they need multipart Buffer bodies
|
|
5
|
-
* or per-response header rotation (
|
|
5
|
+
* or per-response header rotation (per-site token churn). Owns the
|
|
6
6
|
* try/catch network-error conversion, the onResponse hook, and the
|
|
7
7
|
* classifyHttpStatus call so callers only supply the what (URL, headers,
|
|
8
8
|
* body) and the where (their token-rotation / audit hook and context label).
|
|
@@ -14,7 +14,7 @@ export declare function requireResponseField<T>(obj: Record<string, unknown>, ke
|
|
|
14
14
|
/**
|
|
15
15
|
* Returns `resp.items[0][key]` cast to `T`. Throws {@link HttpSchemaError}
|
|
16
16
|
* when `items` is absent or empty, or when the field itself is nullish.
|
|
17
|
-
* Covers the
|
|
17
|
+
* Covers the `?finder=...` pattern used by some ATS APIs where results arrive as
|
|
18
18
|
* `{ items: [...] }` and the first element carries the required field.
|
|
19
19
|
*/
|
|
20
20
|
export declare function requireFirstItemField<T>(resp: {
|
|
@@ -25,7 +25,7 @@ function requireResponseField(obj, key, contextLabel) {
|
|
|
25
25
|
/**
|
|
26
26
|
* Returns `resp.items[0][key]` cast to `T`. Throws {@link HttpSchemaError}
|
|
27
27
|
* when `items` is absent or empty, or when the field itself is nullish.
|
|
28
|
-
* Covers the
|
|
28
|
+
* Covers the `?finder=...` pattern used by some ATS APIs where results arrive as
|
|
29
29
|
* `{ items: [...] }` and the first element carries the required field.
|
|
30
30
|
*/
|
|
31
31
|
function requireFirstItemField(resp, key, contextLabel) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* the caller-supplied pRetry options. On exhaustion, wraps the last error in
|
|
6
6
|
* the caller-supplied `exhaustionError`.
|
|
7
7
|
*
|
|
8
|
-
* Extracted from
|
|
8
|
+
* Extracted from a plugin's token warmup so any future recon→generate warmup
|
|
9
9
|
* flow can reuse the session-lifecycle shell without re-hand-rolling pRetry +
|
|
10
10
|
* finally-close + error-mapping each time.
|
|
11
11
|
*/
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* the caller-supplied pRetry options. On exhaustion, wraps the last error in
|
|
7
7
|
* the caller-supplied `exhaustionError`.
|
|
8
8
|
*
|
|
9
|
-
* Extracted from
|
|
9
|
+
* Extracted from a plugin's token warmup so any future recon→generate warmup
|
|
10
10
|
* flow can reuse the session-lifecycle shell without re-hand-rolling pRetry +
|
|
11
11
|
* finally-close + error-mapping each time.
|
|
12
12
|
*/
|
|
@@ -23,12 +23,12 @@
|
|
|
23
23
|
* Usage:
|
|
24
24
|
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts
|
|
25
25
|
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts --apply
|
|
26
|
-
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts --site
|
|
26
|
+
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts --site <siteId> --apply
|
|
27
27
|
*/
|
|
28
28
|
interface MigrateOptions {
|
|
29
29
|
/** Path to the project root containing `src/sites/`. */
|
|
30
30
|
sitesRoot: string;
|
|
31
|
-
/** Optional: restrict to one site directory by name (e.g. "
|
|
31
|
+
/** Optional: restrict to one site directory by name (e.g. "acme-jobs"). */
|
|
32
32
|
siteFilter: string | null;
|
|
33
33
|
/** If false, log planned renames but do not execute them. */
|
|
34
34
|
apply: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-telemetry-dir-names.d.ts","sourceRoot":"","sources":["../../src/scripts/migrate-telemetry-dir-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAYH,UAAU,cAAc;IACtB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"migrate-telemetry-dir-names.d.ts","sourceRoot":"","sources":["../../src/scripts/migrate-telemetry-dir-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAYH,UAAU,cAAc;IACtB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,CAiB3E;AAqED,UAAU,UAAU;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAapD"}
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* Usage:
|
|
25
25
|
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts
|
|
26
26
|
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts --apply
|
|
27
|
-
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts --site
|
|
27
|
+
* pnpm tsx src/scripts/migrate-telemetry-dir-names.ts --site <siteId> --apply
|
|
28
28
|
*/
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
30
|
exports.migrateTelemetryDirs = migrateTelemetryDirs;
|
|
@@ -120,8 +120,8 @@ export declare function isReplanCycle(priorReplans: readonly ReplanEvent[], newS
|
|
|
120
120
|
* false. `origin` distinguishes hand-authored steps from steps the LLM
|
|
121
121
|
* replanner appended at cascade-exhausted recovery points — persistReplannedFlow
|
|
122
122
|
* uses it to force replan-origin steps to optional on write-back, preventing
|
|
123
|
-
* cross-employer regressions when
|
|
124
|
-
* gets persisted and the next run is on
|
|
123
|
+
* cross-employer regressions when an employer-specific replanned question
|
|
124
|
+
* gets persisted and the next run is on a different tenant.
|
|
125
125
|
*/
|
|
126
126
|
interface NormalizedStep {
|
|
127
127
|
instruction: string;
|
|
@@ -238,7 +238,7 @@ function detectRejectionInResponseBody(body) {
|
|
|
238
238
|
*
|
|
239
239
|
* Previous version of this helper assumed string-only and returned null for
|
|
240
240
|
* the object case — causing Q1's audit to miss 100% of rejection envelopes
|
|
241
|
-
* because
|
|
241
|
+
* because JSON-serving ATSs land in the object case.
|
|
242
242
|
* Verified 2026-06-15 against capture 122-...-a4ab5256.json:
|
|
243
243
|
* `jq '.responseBody | type'` returned `"object"`, the broken helper
|
|
244
244
|
* returned null, the audit declared "PASSED" while the body contained
|
|
@@ -273,14 +273,14 @@ function normalizeResponseBodyForAudit(data) {
|
|
|
273
273
|
* The audit is independent of the per-step verifier — the verifier may
|
|
274
274
|
* have accepted a DOM-fallback or URL-change signal as proof, but if
|
|
275
275
|
* the configured submit endpoint never returned 2xx, OR returned 2xx
|
|
276
|
-
* with a rejection envelope (e.g.
|
|
276
|
+
* with a rejection envelope (e.g. `not_qualified: true`), the
|
|
277
277
|
* application data didn't actually reach the employer's ATS.
|
|
278
278
|
*
|
|
279
279
|
* Site-agnostic: rejection detection is via `detectRejectionInResponseBody`
|
|
280
280
|
* which knows the union of common ATS rejection-envelope shapes
|
|
281
|
-
* (
|
|
281
|
+
* (Greenhouse/Lever/Workday and JSON-envelope ATSs). New ATSs extend the union.
|
|
282
282
|
*
|
|
283
|
-
* Pre-existing
|
|
283
|
+
* Pre-existing site-specific equivalent: readJobOutcome in
|
|
284
284
|
* recon-replay-jobs.ts. This is the agnostic engine-side version using
|
|
285
285
|
* the flow file's declared pattern.
|
|
286
286
|
*/
|
|
@@ -423,7 +423,7 @@ const RECON_FLOW_SCHEMA = v4_1.z.array(schemas_1.RECON_FLOW_STEP_SCHEMA).min(1);
|
|
|
423
423
|
* the self-healing cascade can detect "the click fired tracking but
|
|
424
424
|
* not the real submit XHR."
|
|
425
425
|
* - `submittedStateSelectors`: DOM-level fallback when the submit POST
|
|
426
|
-
* lands outside the per-attempt capture window. SPAs
|
|
426
|
+
* lands outside the per-attempt capture window. Some SPAs
|
|
427
427
|
* can swap the form for a thank-you component (`<uapp-universal-
|
|
428
428
|
* submitted-page>`) faster than the network capture pipeline records
|
|
429
429
|
* the POST. If any selector in this list matches via
|
|
@@ -454,7 +454,7 @@ const RECON_FLOW_FILE_SCHEMA = v4_1.z.union([
|
|
|
454
454
|
* Surfaced to the Haiku verifySubmit judge as evidence — when the page
|
|
455
455
|
* URL after the click contains any of these, that's one of the strong
|
|
456
456
|
* signals required for verified=true. Examples: ["/applied",
|
|
457
|
-
* "/
|
|
457
|
+
* "/apply-portal/applied", "/confirmation", "/thank-you"]. Site-specific
|
|
458
458
|
* since URL conventions vary across ATS tenants.
|
|
459
459
|
*/
|
|
460
460
|
successUrlFragments: v4_1.z.array(v4_1.z.string().min(1)).optional(),
|
|
@@ -472,7 +472,7 @@ const RECON_FLOW_FILE_SCHEMA = v4_1.z.union([
|
|
|
472
472
|
* hostnames as a corroborating network signal — anything else (e.g.
|
|
473
473
|
* analytics, third-party trackers, CDNs) is ignored. Without this
|
|
474
474
|
* list the judge falls back to the URL alone, which is weaker.
|
|
475
|
-
* Examples: ["apply
|
|
475
|
+
* Examples: ["apply.<ats>.com"], ["careers.<ats>.com",
|
|
476
476
|
* "<tenant>.<ats>.com"].
|
|
477
477
|
*/
|
|
478
478
|
ownBackendHostnames: v4_1.z.array(v4_1.z.string().min(1)).optional(),
|
|
@@ -480,8 +480,8 @@ const RECON_FLOW_FILE_SCHEMA = v4_1.z.union([
|
|
|
480
480
|
* Optional site-specific class-name prefixes that wrap form/error
|
|
481
481
|
* state. The Haiku invalid-fields judge uses these as additional
|
|
482
482
|
* structural evidence beyond framework-conventional patterns
|
|
483
|
-
* (ng-invalid, aria-invalid, data-invalid). Examples for
|
|
484
|
-
* ["uapp-", "app-"]. When omitted, the judge falls back to framework
|
|
483
|
+
* (ng-invalid, aria-invalid, data-invalid). Examples for an Angular
|
|
484
|
+
* apply SPA: ["uapp-", "app-"]. When omitted, the judge falls back to framework
|
|
485
485
|
* conventions alone.
|
|
486
486
|
*/
|
|
487
487
|
knownErrorClassPrefixes: v4_1.z.array(v4_1.z.string().min(1)).optional(),
|
|
@@ -506,7 +506,7 @@ const RECON_FLOW_FILE_SCHEMA = v4_1.z.union([
|
|
|
506
506
|
* captures to prove an interior (non-submit) "advance"/"Next" step actually
|
|
507
507
|
* moved the wizard forward — not merely fired some other same-origin POST.
|
|
508
508
|
* Needed for SPAs where advance and non-advance mutations share one endpoint
|
|
509
|
-
* URL (e.g.
|
|
509
|
+
* URL (e.g. a wizard ATS's `/gq`: a real page advance is a `TransitionWorklet`
|
|
510
510
|
* mutation, while `EditQuestionItem` is just a field edit — byte-identical
|
|
511
511
|
* URLs, only the body differs). When set, an advance step's `networkFired`
|
|
512
512
|
* signal is trusted ONLY if a capture body in the step's window matches this
|
|
@@ -1471,7 +1471,7 @@ async function main() {
|
|
|
1471
1471
|
let lastSuccessNetworkCount = signalCounter.n;
|
|
1472
1472
|
let lastSuccessUrl = page.url();
|
|
1473
1473
|
// Track the page origin so a cross-origin navigation mid-flow (e.g. the
|
|
1474
|
-
// Apply click taking careers
|
|
1474
|
+
// Apply click taking careers.<employer>.com → apply.<ats>.com) can
|
|
1475
1475
|
// re-gate on SPA hydration. The initial goto's readiness gate only covers
|
|
1476
1476
|
// the landing page; the wizard app boots on a DIFFERENT origin with no gate,
|
|
1477
1477
|
// so its first steps would otherwise probe an un-hydrated shell and skip.
|
|
@@ -1495,7 +1495,7 @@ async function main() {
|
|
|
1495
1495
|
logger.info(`${(0, flow_runner_1.formatStepPrefix)(i, () => plan.length)} [${currentPhase}]${step.optional ? " (optional)" : ""}: ${step.instruction}`);
|
|
1496
1496
|
await snapshotAndPersistCookieJar(page, jarCounter, "pre-step", currentPhase, i);
|
|
1497
1497
|
// Re-gate on SPA hydration when the origin changed since the last step —
|
|
1498
|
-
// the wizard SPA (e.g. apply
|
|
1498
|
+
// the wizard SPA (e.g. apply.<ats>.com after the Apply click) boots on
|
|
1499
1499
|
// a new origin the initial-goto readiness gate never covered, so wait for
|
|
1500
1500
|
// its body to render before probing rather than skipping a shell page.
|
|
1501
1501
|
const currentOrigin = originOf(page.url());
|
|
@@ -1561,7 +1561,7 @@ async function main() {
|
|
|
1561
1561
|
});
|
|
1562
1562
|
await snapshotAndPersistCookieJar(page, jarCounter, "post-step", currentPhase, i);
|
|
1563
1563
|
// Wizard-restart detection: if a configured restart-signal URL (e.g.
|
|
1564
|
-
//
|
|
1564
|
+
// a wizard ATS's `init-apply?...&application_canceled=true`) landed during
|
|
1565
1565
|
// this step, the multi-page wizard reset to page 1. Remaining steps now
|
|
1566
1566
|
// target a reset page and replanning against the restarted wizard is
|
|
1567
1567
|
// futile — abort with a diagnostic instead of silently cycling.
|
|
@@ -1627,7 +1627,7 @@ async function main() {
|
|
|
1627
1627
|
// googletagmanager) that fire on form interaction events. Those look
|
|
1628
1628
|
// exactly like real submissions by HTTP signal but don't represent the
|
|
1629
1629
|
// actual application landing. Verified by reading captures from
|
|
1630
|
-
// /tmp/recon/graphql/ during a sweep:
|
|
1630
|
+
// /tmp/recon/graphql/ during a sweep: some tenants hit this exact
|
|
1631
1631
|
// failure — only interruption_check + GA tracking POSTs fired, no
|
|
1632
1632
|
// integrated_apply, yet trailing-grace declared success.
|
|
1633
1633
|
if (step.optional && i >= plan.length - flow_runner_1.TRAILING_GRACE_WINDOW) {
|