@enricai/barnacle 1.5.0 → 1.6.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 (62) hide show
  1. package/README.md +29 -0
  2. package/dist/api/errors.d.ts +2 -1
  3. package/dist/api/errors.d.ts.map +1 -1
  4. package/dist/api/errors.js +3 -2
  5. package/dist/api/errors.js.map +1 -1
  6. package/dist/lib/llm/judge.d.ts +1 -1
  7. package/dist/lib/llm/judge.js +1 -1
  8. package/dist/recon/capture-filters.d.ts +40 -0
  9. package/dist/recon/capture-filters.d.ts.map +1 -0
  10. package/dist/recon/capture-filters.js +106 -0
  11. package/dist/recon/capture-filters.js.map +1 -0
  12. package/dist/recon/form-schema.d.ts +51 -0
  13. package/dist/recon/form-schema.d.ts.map +1 -0
  14. package/dist/recon/form-schema.js +20 -0
  15. package/dist/recon/form-schema.js.map +1 -0
  16. package/dist/recon/load-form-schema.d.ts +24 -0
  17. package/dist/recon/load-form-schema.d.ts.map +1 -0
  18. package/dist/recon/load-form-schema.js +66 -0
  19. package/dist/recon/load-form-schema.js.map +1 -0
  20. package/dist/scraper/errors.d.ts +14 -14
  21. package/dist/scraper/errors.d.ts.map +1 -1
  22. package/dist/scraper/errors.js +15 -15
  23. package/dist/scraper/errors.js.map +1 -1
  24. package/dist/scraper/flow-runner.d.ts.map +1 -1
  25. package/dist/scraper/flow-runner.js +9 -8
  26. package/dist/scraper/flow-runner.js.map +1 -1
  27. package/dist/scraper/http-client.d.ts +12 -0
  28. package/dist/scraper/http-client.d.ts.map +1 -1
  29. package/dist/scraper/http-client.js +11 -15
  30. package/dist/scraper/http-client.js.map +1 -1
  31. package/dist/scraper/parse-json-response.d.ts +7 -5
  32. package/dist/scraper/parse-json-response.d.ts.map +1 -1
  33. package/dist/scraper/parse-json-response.js +9 -8
  34. package/dist/scraper/parse-json-response.js.map +1 -1
  35. package/dist/scraper/rate-limited-json-client.d.ts +8 -1
  36. package/dist/scraper/rate-limited-json-client.d.ts.map +1 -1
  37. package/dist/scraper/rate-limited-json-client.js +6 -1
  38. package/dist/scraper/rate-limited-json-client.js.map +1 -1
  39. package/dist/scraper/session-browserbase.d.ts +6 -0
  40. package/dist/scraper/session-browserbase.d.ts.map +1 -1
  41. package/dist/scraper/session-browserbase.js +6 -0
  42. package/dist/scraper/session-browserbase.js.map +1 -1
  43. package/dist/scripts/recon-browser.d.ts.map +1 -1
  44. package/dist/scripts/recon-browser.js +3 -4
  45. package/dist/scripts/recon-browser.js.map +1 -1
  46. package/dist/scripts/recon-generate.d.ts +50 -21
  47. package/dist/scripts/recon-generate.d.ts.map +1 -1
  48. package/dist/scripts/recon-generate.js +190 -182
  49. package/dist/scripts/recon-generate.js.map +1 -1
  50. package/dist/scripts/recon-http.d.ts +5 -2
  51. package/dist/scripts/recon-http.d.ts.map +1 -1
  52. package/dist/scripts/recon-http.js +16 -4
  53. package/dist/scripts/recon-http.js.map +1 -1
  54. package/dist/testing/persona-fixture.d.ts +2 -2
  55. package/dist/testing/persona-fixture.d.ts.map +1 -1
  56. package/dist/testing/persona-fixture.js +2 -2
  57. package/dist/testing/persona-fixture.js.map +1 -1
  58. package/package.json +5 -1
  59. package/dist/scraper/oracle-sentinels.d.ts +0 -22
  60. package/dist/scraper/oracle-sentinels.d.ts.map +0 -1
  61. package/dist/scraper/oracle-sentinels.js +0 -40
  62. package/dist/scraper/oracle-sentinels.js.map +0 -1
package/README.md CHANGED
@@ -165,6 +165,35 @@ pnpm run recon:generate -- --site-id my-site --vocabulary ./src/recon/my-vocabul
165
165
 
166
166
  > **Deprecated fallback:** omit `--vocabulary` and the generator falls back to a built-in recruiting table (first/last name, email, phone, address), warning as it does. That table is **removed in 2.0.0**, after which an absent vocabulary on a spliceable flow is an error. Supply one now.
167
167
 
168
+ #### Telling the generator your ATS's form-schema wire keys
169
+
170
+ Where `--vocabulary` matches instruction *prose*, `--form-schema` names the JSON *keys* the generator reads out of an ATS's form-definition responses when recovering field ids, option ids, and submitted values. The engine ships no vendor's format; a site whose ATS exposes a form definition declares its keys with `--form-schema`:
171
+
172
+ ```ts
173
+ // src/recon/my-form-schema.ts
174
+ import type { ReconFormSchema } from "@enricai/barnacle/recon/form-schema";
175
+
176
+ export const formSchema: ReconFormSchema = {
177
+ fieldIdKey: "fieldId", // UUID-valued field identity
178
+ fieldNameKeys: ["code", "label"], // code, then human label — code preferred
179
+ fieldOptionsKey: "options",
180
+ optionIdKey: "optionId", // option id, inside the options array
181
+ optionValueKey: "optionLabel", // option label, inside the options array
182
+ responseValueKey: "submittedValue", // submitted free value
183
+ responseOptionIdKey: "submittedOptionId", // submitted option reference
184
+ };
185
+ ```
186
+
187
+ ```bash
188
+ pnpm run recon:generate -- --site-id my-site --form-schema ./src/recon/my-form-schema.ts
189
+ ```
190
+
191
+ - The specifier follows the same rule as `--vocabulary`: a leading `.` or `/` is a filesystem path; anything else resolves from your `node_modules`. The module may export `formSchema` or a default.
192
+ - **`--form-schema none`** for a site with no ATS form definition (a search API, a cruise site) — same as omitting it. "none" is the explicit form.
193
+ - Wire keys anchor `"key":"uuid"` markers, so they may be any non-empty string without a quote or backslash — the JS-identifier rule that governs vocabulary field names does **not** apply here.
194
+ - `fieldNameKeys` models two roles: the first key is a machine code (PascalCased directly), the second is a human label (run through the section-heading heuristic). Supply one key for a label-only ATS, or two for one that exposes both. Additional keys are unused.
195
+ - Omit `--form-schema` (or pass `none`) and ATS form-key recovery does not run — the engine hardcodes no vendor's wire format. A site whose ATS exposes a form definition must supply one to recover its option fields. See issue #57.
196
+
168
197
  #### Mapping the site's screening questions
169
198
 
170
199
  If the site asks screening questions, tell the generator which payload field answers each one — the same reasoning applies, it cannot know what your site asks:
@@ -54,7 +54,8 @@ export declare class ThrottledRequestError extends ApiError {
54
54
  constructor(message?: string);
55
55
  }
56
56
  /**
57
- * The upstream vendor has locked the target URL (e.g. Oracle ORA_URL_LOCKED).
57
+ * The upstream site has locked the target URL (a plugin raises the underlying
58
+ * `HttpUrlLockedError`, e.g. from a `classifyResponseBody` sentinel).
58
59
  * Signals "back off and retry later" — not a browser-fallback trigger.
59
60
  */
60
61
  export declare class UrlLockedError extends ApiError {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5F;;;;GAIG;AACH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAgCzD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,YAAY,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,SAAU,EAKjE;CACF;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,OAAO,SAA4C,EAE9D;CACF;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;IACjD,YAAY,OAAO,SAAwB,EAE1C;CACF;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YAAY,OAAO,SAA6D,EAE/E;CACF;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAO,SAA0C,EAE5D;CACF;AAED,qBAAa,uBAAwB,SAAQ,QAAQ;IACnD,YAAY,OAAO,SAA2C,EAE7D;CACF;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,OAAO,SAA6C,EAE/D;CACF;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAO,SAA4C,EAE9D;CACF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,UAAU,SAAU,GACnB,gBAAgB,CAgBlB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE5F;;;;GAIG;AACH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,eAAe,EAAE,CAAC;KAC5B,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAgCzD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;;;GAIG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,YAAY,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,SAAU,EAKjE;CACF;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,OAAO,SAA4C,EAE9D;CACF;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;IAC/C,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAED,qBAAa,qBAAsB,SAAQ,QAAQ;IACjD,YAAY,OAAO,SAAwB,EAE1C;CACF;AAED;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YAAY,OAAO,SAA2D,EAE7E;CACF;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAO,SAA0C,EAE5D;CACF;AAED,qBAAa,uBAAwB,SAAQ,QAAQ;IACnD,YAAY,OAAO,SAA2C,EAE7D;CACF;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,OAAO,SAA6C,EAE/D;CACF;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAO,SAA4C,EAE9D;CACF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,MAAM,EACf,UAAU,SAAU,GACnB,gBAAgB,CAgBlB"}
@@ -100,11 +100,12 @@ class ThrottledRequestError extends ApiError {
100
100
  }
101
101
  exports.ThrottledRequestError = ThrottledRequestError;
102
102
  /**
103
- * The upstream vendor has locked the target URL (e.g. Oracle ORA_URL_LOCKED).
103
+ * The upstream site has locked the target URL (a plugin raises the underlying
104
+ * `HttpUrlLockedError`, e.g. from a `classifyResponseBody` sentinel).
104
105
  * Signals "back off and retry later" — not a browser-fallback trigger.
105
106
  */
106
107
  class UrlLockedError extends ApiError {
107
- constructor(message = "target URL is locked by the upstream vendor; retry later") {
108
+ constructor(message = "target URL is locked by the upstream site; retry later") {
108
109
  super(common_1.ERROR_CODES.URL_LOCKED, message);
109
110
  }
110
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * routes through this — submit-verification, invalid-field detection, modal-
4
4
  * priority ranking, error-message extraction. Replaces deterministic regexes
5
5
  * that silently miss patterns outside what we've happened to observe across
6
- * AppCast + ClearCompany (both Angular).
6
+ * the Angular-based ATS sites.
7
7
  *
8
8
  * Why a separate primitive instead of inlining into each call site:
9
9
  * - Single chokepoint for telemetry, error classification, and latency
@@ -4,7 +4,7 @@
4
4
  * routes through this — submit-verification, invalid-field detection, modal-
5
5
  * priority ranking, error-message extraction. Replaces deterministic regexes
6
6
  * that silently miss patterns outside what we've happened to observe across
7
- * AppCast + ClearCompany (both Angular).
7
+ * the Angular-based ATS sites.
8
8
  *
9
9
  * Why a separate primitive instead of inlining into each call site:
10
10
  * - Single chokepoint for telemetry, error classification, and latency
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Shared predicates for deciding which captured requests are the site's real
3
+ * flow versus incidental browser noise (analytics beacons, ad-tech, a page's own
4
+ * error-reporting sink, static assets).
5
+ *
6
+ * Lives outside `src/scripts/` so both the emitter (`recon-generate.ts`, which
7
+ * must not emit noise into a generated plugin) and the HTTP probe
8
+ * (`recon-http.ts`, which must not burn hours replaying third-party hosts) apply
9
+ * ONE definition of "noise." Previously only the emitter filtered; the probe
10
+ * replayed and rate-limited everything, including `clicktale`/`adsrvr`/`tiktok`.
11
+ */
12
+ /**
13
+ * Path/URL substrings we always treat as analytics or logging noise. Site-specific
14
+ * trackers belong in the `RECON_TELEMETRY_URL_PATTERNS` env var (comma-separated),
15
+ * not here — the engine must not carry any one site's ad-tech domains.
16
+ *
17
+ * Read at call time, not frozen at import: a module-level const would ignore an
18
+ * env var set after load, the exact foot-gun `RECON_QUESTION_KEYWORDS` documents.
19
+ */
20
+ export declare function telemetryUrlPatterns(): string[];
21
+ /**
22
+ * A path whose own segment is `error`/`errors` is a client-side reporting sink,
23
+ * never a call a caller wants replayed or emitted.
24
+ *
25
+ * Matched on a whole path segment rather than by substring so `/error-codes` and
26
+ * `/terrorism-screening` stay data endpoints, and kept out of the telemetry list
27
+ * because that list is literal substrings — a site's own sink is structural, not
28
+ * an ad-tech domain the operator must enumerate.
29
+ */
30
+ export declare const ERROR_SINK_PATH_SEGMENT: RegExp;
31
+ /**
32
+ * True when a captured URL is noise the recon pipeline should skip: a telemetry
33
+ * pattern (including any `RECON_TELEMETRY_URL_PATTERNS` addition), a third-party
34
+ * asset/tracking host, a same-host error-reporting sink, or a static asset.
35
+ *
36
+ * The one gate both the emitter and the probe consult so "what counts as the
37
+ * site's real flow" cannot drift between them.
38
+ */
39
+ export declare function isNoiseUrl(url: string): boolean;
40
+ //# sourceMappingURL=capture-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-filters.d.ts","sourceRoot":"","sources":["../../src/recon/capture-filters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAW/C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,QAAyB,CAAC;AAmC9D;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAc/C"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * Shared predicates for deciding which captured requests are the site's real
4
+ * flow versus incidental browser noise (analytics beacons, ad-tech, a page's own
5
+ * error-reporting sink, static assets).
6
+ *
7
+ * Lives outside `src/scripts/` so both the emitter (`recon-generate.ts`, which
8
+ * must not emit noise into a generated plugin) and the HTTP probe
9
+ * (`recon-http.ts`, which must not burn hours replaying third-party hosts) apply
10
+ * ONE definition of "noise." Previously only the emitter filtered; the probe
11
+ * replayed and rate-limited everything, including `clicktale`/`adsrvr`/`tiktok`.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.ERROR_SINK_PATH_SEGMENT = void 0;
15
+ exports.telemetryUrlPatterns = telemetryUrlPatterns;
16
+ exports.isNoiseUrl = isNoiseUrl;
17
+ /**
18
+ * Path/URL substrings we always treat as analytics or logging noise. Site-specific
19
+ * trackers belong in the `RECON_TELEMETRY_URL_PATTERNS` env var (comma-separated),
20
+ * not here — the engine must not carry any one site's ad-tech domains.
21
+ *
22
+ * Read at call time, not frozen at import: a module-level const would ignore an
23
+ * env var set after load, the exact foot-gun `RECON_QUESTION_KEYWORDS` documents.
24
+ */
25
+ function telemetryUrlPatterns() {
26
+ return [
27
+ "/util/logging/vweb/message",
28
+ "/blank/page",
29
+ "stats.g.doubleclick.net",
30
+ "google-analytics.com",
31
+ ...(process.env.RECON_TELEMETRY_URL_PATTERNS ?? "")
32
+ .split(",")
33
+ .map((p) => p.trim())
34
+ .filter(Boolean),
35
+ ];
36
+ }
37
+ /**
38
+ * A path whose own segment is `error`/`errors` is a client-side reporting sink,
39
+ * never a call a caller wants replayed or emitted.
40
+ *
41
+ * Matched on a whole path segment rather than by substring so `/error-codes` and
42
+ * `/terrorism-screening` stay data endpoints, and kept out of the telemetry list
43
+ * because that list is literal substrings — a site's own sink is structural, not
44
+ * an ad-tech domain the operator must enumerate.
45
+ */
46
+ exports.ERROR_SINK_PATH_SEGMENT = /(^|\/)errors?(\/|$)/i;
47
+ /**
48
+ * Third-party hosts recon repeatedly wastes time on: ad-tech, session replay,
49
+ * social pixels, tag managers. A capture whose host matches is not the site's
50
+ * own endpoint and never worth replaying or rate-limiting.
51
+ *
52
+ * A suffix match on the registrable-ish host substring, so `x.clicktale.net`
53
+ * and `sync.adsrvr.org` both match. Extendable per-site via
54
+ * `RECON_TELEMETRY_URL_PATTERNS`, which {@link isNoiseUrl} also honors.
55
+ */
56
+ const THIRD_PARTY_ASSET_HOSTS = [
57
+ "clicktale.net",
58
+ "adsrvr.org",
59
+ "tiktok.com",
60
+ "doubleclick.net",
61
+ "google-analytics.com",
62
+ "googletagmanager.com",
63
+ "facebook.net",
64
+ "facebook.com",
65
+ "hotjar.com",
66
+ "segment.io",
67
+ "segment.com",
68
+ "fullstory.com",
69
+ "cdn.cookielaw.org",
70
+ "onetrust.com",
71
+ "demdex.net",
72
+ "omtrdc.net",
73
+ "quantserve.com",
74
+ "scorecardresearch.com",
75
+ ];
76
+ /** Static-asset extensions a probe should never replay as an API endpoint. */
77
+ const ASSET_EXTENSION = /\.(js|mjs|css|png|jpe?g|gif|svg|webp|ico|woff2?|ttf|eot|map)$/i;
78
+ /**
79
+ * True when a captured URL is noise the recon pipeline should skip: a telemetry
80
+ * pattern (including any `RECON_TELEMETRY_URL_PATTERNS` addition), a third-party
81
+ * asset/tracking host, a same-host error-reporting sink, or a static asset.
82
+ *
83
+ * The one gate both the emitter and the probe consult so "what counts as the
84
+ * site's real flow" cannot drift between them.
85
+ */
86
+ function isNoiseUrl(url) {
87
+ const patterns = telemetryUrlPatterns();
88
+ if (patterns.some((p) => url.includes(p)))
89
+ return true;
90
+ let parsed;
91
+ try {
92
+ parsed = new URL(url);
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ const host = parsed.host.toLowerCase();
98
+ if (THIRD_PARTY_ASSET_HOSTS.some((h) => host === h || host.endsWith(`.${h}`)))
99
+ return true;
100
+ if (exports.ERROR_SINK_PATH_SEGMENT.test(parsed.pathname))
101
+ return true;
102
+ if (ASSET_EXTENSION.test(parsed.pathname))
103
+ return true;
104
+ return false;
105
+ }
106
+ //# sourceMappingURL=capture-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-filters.js","sourceRoot":"","sources":["../../src/recon/capture-filters.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAEH;;;;;;;GAOG;AACH;IACE,OAAO;QACL,4BAA4B;QAC5B,aAAa;QACb,yBAAyB;QACzB,sBAAsB;QACtB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC;aAChD,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACU,QAAA,uBAAuB,GAAG,sBAAsB,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,uBAAuB,GAAG;IAC9B,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,iBAAiB;IACjB,sBAAsB;IACtB,sBAAsB;IACtB,cAAc;IACd,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;CACxB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,eAAe,GAAG,gEAAgE,CAAC;AAEzF;;;;;;;GAOG;AACH,oBAA2B,GAAW;IACpC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3F,IAAI,QAAA,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Consumer-supplied form-schema that names the wire keys the generator reads out
3
+ * of an ATS's form-definition responses (field ids, option ids, submitted values).
4
+ *
5
+ * A sibling to {@link @/recon/vocabulary}, not a field on it: a vocabulary matches
6
+ * English instruction prose, this matches JSON response keys. Different inputs,
7
+ * different validation, independent applicability — a cruise site needs a
8
+ * vocabulary and no form-schema. Published at `@enricai/barnacle/recon/form-schema`;
9
+ * all imports are type-only so there are zero runtime side effects.
10
+ *
11
+ * Why this exists (issue #57): the generator hardcoded one ATS vendor's wire
12
+ * format in ~8 private functions. That is a claim about a *vendor's schema*, not
13
+ * about HTTP — so the engine no longer carries any vendor's keys. A consumer
14
+ * whose ATS exposes a form definition declares its keys with `--form-schema`;
15
+ * absent one, form-key recovery does not run. This is the same inversion
16
+ * `--vocabulary` already made for instruction prose.
17
+ */
18
+ /**
19
+ * The response-key names the generator threads into raw-body string anchors when
20
+ * recovering an ATS form definition.
21
+ *
22
+ * These are *key names, not values*: each is interpolated into a
23
+ * `"${key}":"${uuid}"` marker used to locate and substitute UUIDs in a captured
24
+ * request body. A legal wire key like `field-id` is therefore fine — the loader
25
+ * rejects only quotes and backslashes, which would break the marker, NOT the
26
+ * JS-identifier rule the vocabulary uses (those keys splice into `payload.<name>`
27
+ * code; these do not).
28
+ */
29
+ export interface ReconFormSchema {
30
+ /** The UUID-valued field-identity key. Anchors the substitution passes. */
31
+ fieldIdKey: string;
32
+ /**
33
+ * The name key(s), by role: the first is a machine code (PascalCased
34
+ * directly), the second is a human label (run through the section-heading
35
+ * heuristic). Supply one key for a label-only ATS, two for one exposing both
36
+ * (the code is preferred when present). Must be non-empty; a third+ key is
37
+ * unused — the model has exactly the two roles.
38
+ */
39
+ fieldNameKeys: string[];
40
+ /** The options-array key on a field. */
41
+ fieldOptionsKey: string;
42
+ /** The option-id key, INSIDE a `fieldOptionsKey` entry. */
43
+ optionIdKey: string;
44
+ /** The option-label key, inside a `fieldOptionsKey` entry. */
45
+ optionValueKey: string;
46
+ /** The submitted free-value key (a distinct role from {@link optionValueKey}). */
47
+ responseValueKey: string;
48
+ /** The submitted option-reference key (distinct from the schema-side {@link optionIdKey}). */
49
+ responseOptionIdKey: string;
50
+ }
51
+ //# sourceMappingURL=form-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-schema.d.ts","sourceRoot":"","sources":["../../src/recon/form-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;IACzB,8FAA8F;IAC9F,mBAAmB,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Consumer-supplied form-schema that names the wire keys the generator reads out
4
+ * of an ATS's form-definition responses (field ids, option ids, submitted values).
5
+ *
6
+ * A sibling to {@link @/recon/vocabulary}, not a field on it: a vocabulary matches
7
+ * English instruction prose, this matches JSON response keys. Different inputs,
8
+ * different validation, independent applicability — a cruise site needs a
9
+ * vocabulary and no form-schema. Published at `@enricai/barnacle/recon/form-schema`;
10
+ * all imports are type-only so there are zero runtime side effects.
11
+ *
12
+ * Why this exists (issue #57): the generator hardcoded one ATS vendor's wire
13
+ * format in ~8 private functions. That is a claim about a *vendor's schema*, not
14
+ * about HTTP — so the engine no longer carries any vendor's keys. A consumer
15
+ * whose ATS exposes a form definition declares its keys with `--form-schema`;
16
+ * absent one, form-key recovery does not run. This is the same inversion
17
+ * `--vocabulary` already made for instruction prose.
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ //# sourceMappingURL=form-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-schema.js","sourceRoot":"","sources":["../../src/recon/form-schema.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Engine-internal loader for `--form-schema`. Like {@link @/recon/load-vocabulary},
3
+ * deliberately NOT in the package's `exports` map: consumers author a form-schema
4
+ * against the `./recon/form-schema` type contract, and only `recon-generate` ever
5
+ * loads one. Exporting this would publish an import-time side effect (dynamic
6
+ * `import()` of arbitrary consumer code) as public API for no caller.
7
+ */
8
+ import type { ReconFormSchema } from "../recon/form-schema";
9
+ /** The `--form-schema` value that opts a site out of form-key recovery entirely. */
10
+ export declare const FORM_SCHEMA_NONE = "none";
11
+ /**
12
+ * Loads a consumer's form-schema module.
13
+ *
14
+ * Resolution reuses {@link resolvePluginSpecifier}, so `--form-schema` accepts the
15
+ * same specifier forms as `BARNACLE_PLUGINS` and `--vocabulary`. Export resolution
16
+ * mirrors the plugin loader's `m.formSchema ?? m.default ?? m`. The
17
+ * {@link FORM_SCHEMA_NONE} sentinel returns `null` (not an empty struct — see the
18
+ * form-schema module for why), the shape for "this site has no ATS form data."
19
+ *
20
+ * Throws rather than falling back: a form-schema that was asked for and is broken
21
+ * is an error, while asking for nothing is the caller's explicit `none`.
22
+ */
23
+ export declare function loadReconFormSchema(specifier: string, baseDir: string): Promise<ReconFormSchema | null>;
24
+ //# sourceMappingURL=load-form-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-form-schema.d.ts","sourceRoot":"","sources":["../../src/recon/load-form-schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,SAAS,CAAC;AA4BvC;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAejC"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Engine-internal loader for `--form-schema`. Like {@link @/recon/load-vocabulary},
4
+ * deliberately NOT in the package's `exports` map: consumers author a form-schema
5
+ * against the `./recon/form-schema` type contract, and only `recon-generate` ever
6
+ * loads one. Exporting this would publish an import-time side effect (dynamic
7
+ * `import()` of arbitrary consumer code) as public API for no caller.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.FORM_SCHEMA_NONE = void 0;
11
+ exports.loadReconFormSchema = loadReconFormSchema;
12
+ const v4_1 = require("zod/v4");
13
+ const errors_1 = require("../lib/errors");
14
+ const discover_1 = require("../plugins/discover");
15
+ /** The `--form-schema` value that opts a site out of form-key recovery entirely. */
16
+ exports.FORM_SCHEMA_NONE = "none";
17
+ /**
18
+ * Wire keys interpolate into `"${key}":"${uuid}"` markers, not into code, so the
19
+ * rule is NOT the vocabulary's JS-identifier rule: a legal response key like
20
+ * `field-id` must be accepted. Reject only what would break the marker — an empty
21
+ * key (matches every field), or a quote/backslash (escapes the JSON string anchor).
22
+ */
23
+ const wireKeySchema = v4_1.z
24
+ .string()
25
+ .min(1, "wire key must be non-empty")
26
+ .regex(/^[^"\\]+$/, "wire key must not contain a quote or backslash (it anchors a JSON string)");
27
+ /**
28
+ * Validates the shape at the boundary so a malformed preset fails at generate
29
+ * time with a field path, rather than silently recovering no form fields and
30
+ * emitting a plugin that ignores the site's option data.
31
+ */
32
+ const formSchemaSchema = v4_1.z.object({
33
+ fieldIdKey: wireKeySchema,
34
+ fieldNameKeys: v4_1.z.array(wireKeySchema).min(1, "fieldNameKeys must list at least one key"),
35
+ fieldOptionsKey: wireKeySchema,
36
+ optionIdKey: wireKeySchema,
37
+ optionValueKey: wireKeySchema,
38
+ responseValueKey: wireKeySchema,
39
+ responseOptionIdKey: wireKeySchema,
40
+ });
41
+ /**
42
+ * Loads a consumer's form-schema module.
43
+ *
44
+ * Resolution reuses {@link resolvePluginSpecifier}, so `--form-schema` accepts the
45
+ * same specifier forms as `BARNACLE_PLUGINS` and `--vocabulary`. Export resolution
46
+ * mirrors the plugin loader's `m.formSchema ?? m.default ?? m`. The
47
+ * {@link FORM_SCHEMA_NONE} sentinel returns `null` (not an empty struct — see the
48
+ * form-schema module for why), the shape for "this site has no ATS form data."
49
+ *
50
+ * Throws rather than falling back: a form-schema that was asked for and is broken
51
+ * is an error, while asking for nothing is the caller's explicit `none`.
52
+ */
53
+ async function loadReconFormSchema(specifier, baseDir) {
54
+ if (specifier === exports.FORM_SCHEMA_NONE)
55
+ return null;
56
+ const href = (0, discover_1.resolvePluginSpecifier)(specifier, baseDir);
57
+ const mod = await import(href);
58
+ const record = mod;
59
+ const raw = record.formSchema ?? record.default ?? mod;
60
+ const parsed = formSchemaSchema.safeParse(raw);
61
+ if (!parsed.success) {
62
+ throw new Error(`form-schema module ${JSON.stringify(specifier)} does not export a valid ReconFormSchema: ${(0, errors_1.toErrorMessage)(parsed.error)}`);
63
+ }
64
+ return parsed.data;
65
+ }
66
+ //# sourceMappingURL=load-form-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-form-schema.js","sourceRoot":"","sources":["../../src/recon/load-form-schema.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;AAEH,+BAA2B;AAE3B,yCAA8C;AAC9C,iDAA4D;AAG5D,oFAAoF;AACvE,QAAA,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,aAAa,GAAG,MAAC;KACpB,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;KACpC,KAAK,CAAC,WAAW,EAAE,2EAA2E,CAAC,CAAC;AAEnG;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,MAAC,CAAC,MAAM,CAAC;IAChC,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,MAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;IACxF,eAAe,EAAE,aAAa;IAC9B,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,aAAa;IAC7B,gBAAgB,EAAE,aAAa;IAC/B,mBAAmB,EAAE,aAAa;CACnC,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACI,KAAK,8BACV,SAAiB,EACjB,OAAe;IAEf,IAAI,SAAS,KAAK,QAAA,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,IAAI,GAAG,IAAA,iCAAsB,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,GAAG,GAAY,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;IAEvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,6CAA6C,IAAA,uBAAc,EAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3H,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -133,25 +133,25 @@ export declare class HttpRateLimitError extends ScraperError {
133
133
  constructor(message?: string);
134
134
  }
135
135
  /**
136
- * Oracle HCM returned a plain-text `ORA_URL_LOCKED` sentinel body, meaning the
137
- * requisition URL has been locked by Oracle after repeated requests. Non-retryable
138
- * and NOT a browser-fallback trigger — the URL is locked at Oracle's end, so
139
- * neither a retry of the identical HTTP request nor a fresh Stagehand browser
140
- * session can succeed. The caller must back off and surface a "retry later"
141
- * state rather than burning a Steel session. Kept distinct from HttpRateLimitError
142
- * so metrics/logs (classifyDispatchError) can tell an Oracle requisition lock
143
- * apart from a self-inflicted 429 rate limit.
136
+ * A backend has locked the requested URL — a terminal "come back later" signal a
137
+ * plugin raises (e.g. via `classifyResponseBody`) when the target refuses the
138
+ * resource after repeated requests. Non-retryable and NOT a browser-fallback
139
+ * trigger the lock is at the target's end, so neither a retry of the identical
140
+ * HTTP request nor a fresh Stagehand browser session can succeed. The caller must
141
+ * back off and surface a "retry later" state rather than burning a Steel session.
142
+ * Kept distinct from HttpRateLimitError so metrics/logs (classifyDispatchError)
143
+ * can tell a requisition lock apart from a self-inflicted 429 rate limit.
144
144
  */
145
145
  export declare class HttpUrlLockedError extends ScraperError {
146
146
  constructor(message?: string);
147
147
  }
148
148
  /**
149
- * Oracle HCM returned a plain-text `ORA_IRC_TOKEN_EXPIRED` sentinel body during
150
- * a burst / rate-limit / token-expiry window. Retryable so pRetry keeps retrying,
151
- * but kept distinct from the generic {@link UnknownScraperError} so the encompass
152
- * http-flow can catch exactly this class and re-mint the AccessCode before
153
- * retrying replaying the same stale token would produce the same sentinel
154
- * indefinitely. Distinct from {@link HttpUrlLockedError} which is terminal.
149
+ * @deprecated Removed in 2.0.0. Oracle-specific and no longer thrown by the
150
+ * engine response-body sentinel detection now lives in the plugin via
151
+ * `HttpClientOptions.classifyResponseBody`. A plugin that needs a retryable
152
+ * token-expiry signal should define its own `ScraperError` subclass (see the
153
+ * encompasshealth plugin). Retained only so existing importers of
154
+ * `@enricai/barnacle/scraper/errors` keep resolving under a minor release.
155
155
  */
156
156
  export declare class OracleTokenExpiredError extends ScraperError {
157
157
  constructor(message?: string);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/scraper/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,8BAAsB,YAAa,SAAQ,KAAK;IAC9C,SAAgB,SAAS,EAAE,OAAO,CAAC;IAEnC,YAAY,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAI9C;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,YAAY,OAAO,SAAkC,EAEpD;CACF;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,YAAY,OAAO,SAA+B,EAEjD;CACF;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,YAAY,OAAO,SAA6B,EAE/C;CACF;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,SAA8B,EAEhD;CACF;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,SAA4B,EAE9C;CACF;AAED,0GAA0G;AAC1G,MAAM,MAAM,yBAAyB,GACjC,mBAAmB,GACnB,cAAc,GACd,6BAA6B,GAC7B,uBAAuB,GACvB,mBAAmB,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,YACE,OAAO,SAA2D,EAClE,IAAI,GAAE,yBAA+C,EAItD;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAO,SAAkC,EAEpD;CACF;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,YAAY,OAAO,SAAwC,EAE1D;CACF;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAO,SAA0B,EAE5C;CACF;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAO,SAAiC,EAEnD;CACF;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAO,SAAmD,EAErE;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,YAAY,OAAO,SAAiD,EAEnE;CACF;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,KAAK,CAAC;IAChB,aAAa,EAAE,IAAI,CAAC;IACpB,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,YAAY,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAI1D;CACF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/scraper/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,8BAAsB,YAAa,SAAQ,KAAK;IAC9C,SAAgB,SAAS,EAAE,OAAO,CAAC;IAEnC,YAAY,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAI9C;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,YAAY,OAAO,SAAkC,EAEpD;CACF;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,YAAY,OAAO,SAA+B,EAEjD;CACF;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,YAAY,OAAO,SAA6B,EAE/C;CACF;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,SAA8B,EAEhD;CACF;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,SAA4B,EAE9C;CACF;AAED,0GAA0G;AAC1G,MAAM,MAAM,yBAAyB,GACjC,mBAAmB,GACnB,cAAc,GACd,6BAA6B,GAC7B,uBAAuB,GACvB,mBAAmB,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,YACE,OAAO,SAA2D,EAClE,IAAI,GAAE,yBAA+C,EAItD;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAO,SAAkC,EAEpD;CACF;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,YAAY,OAAO,SAAwC,EAE1D;CACF;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAO,SAA0B,EAE5C;CACF;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAO,SAAiC,EAEnD;CACF;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAO,SAA2B,EAE7C;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,YAAY,OAAO,SAAiD,EAEnE;CACF;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,KAAK,CAAC;IAChB,aAAa,EAAE,IAAI,CAAC;IACpB,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,YAAY,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAI1D;CACF"}
@@ -170,28 +170,28 @@ class HttpRateLimitError extends ScraperError {
170
170
  }
171
171
  exports.HttpRateLimitError = HttpRateLimitError;
172
172
  /**
173
- * Oracle HCM returned a plain-text `ORA_URL_LOCKED` sentinel body, meaning the
174
- * requisition URL has been locked by Oracle after repeated requests. Non-retryable
175
- * and NOT a browser-fallback trigger — the URL is locked at Oracle's end, so
176
- * neither a retry of the identical HTTP request nor a fresh Stagehand browser
177
- * session can succeed. The caller must back off and surface a "retry later"
178
- * state rather than burning a Steel session. Kept distinct from HttpRateLimitError
179
- * so metrics/logs (classifyDispatchError) can tell an Oracle requisition lock
180
- * apart from a self-inflicted 429 rate limit.
173
+ * A backend has locked the requested URL — a terminal "come back later" signal a
174
+ * plugin raises (e.g. via `classifyResponseBody`) when the target refuses the
175
+ * resource after repeated requests. Non-retryable and NOT a browser-fallback
176
+ * trigger the lock is at the target's end, so neither a retry of the identical
177
+ * HTTP request nor a fresh Stagehand browser session can succeed. The caller must
178
+ * back off and surface a "retry later" state rather than burning a Steel session.
179
+ * Kept distinct from HttpRateLimitError so metrics/logs (classifyDispatchError)
180
+ * can tell a requisition lock apart from a self-inflicted 429 rate limit.
181
181
  */
182
182
  class HttpUrlLockedError extends ScraperError {
183
- constructor(message = "oracle requisition url locked (ORA_URL_LOCKED)") {
183
+ constructor(message = "requisition url locked") {
184
184
  super(message, false);
185
185
  }
186
186
  }
187
187
  exports.HttpUrlLockedError = HttpUrlLockedError;
188
188
  /**
189
- * Oracle HCM returned a plain-text `ORA_IRC_TOKEN_EXPIRED` sentinel body during
190
- * a burst / rate-limit / token-expiry window. Retryable so pRetry keeps retrying,
191
- * but kept distinct from the generic {@link UnknownScraperError} so the encompass
192
- * http-flow can catch exactly this class and re-mint the AccessCode before
193
- * retrying replaying the same stale token would produce the same sentinel
194
- * indefinitely. Distinct from {@link HttpUrlLockedError} which is terminal.
189
+ * @deprecated Removed in 2.0.0. Oracle-specific and no longer thrown by the
190
+ * engine response-body sentinel detection now lives in the plugin via
191
+ * `HttpClientOptions.classifyResponseBody`. A plugin that needs a retryable
192
+ * token-expiry signal should define its own `ScraperError` subclass (see the
193
+ * encompasshealth plugin). Retained only so existing importers of
194
+ * `@enricai/barnacle/scraper/errors` keep resolving under a minor release.
195
195
  */
196
196
  class OracleTokenExpiredError extends ScraperError {
197
197
  constructor(message = "oracle token expired (ORA_IRC_TOKEN_EXPIRED)") {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/scraper/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/scraper/errors.ts"],"names":[],"mappings":"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"}