@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.
- package/README.md +29 -0
- package/dist/api/errors.d.ts +2 -1
- package/dist/api/errors.d.ts.map +1 -1
- package/dist/api/errors.js +3 -2
- package/dist/api/errors.js.map +1 -1
- package/dist/lib/llm/judge.d.ts +1 -1
- package/dist/lib/llm/judge.js +1 -1
- package/dist/recon/capture-filters.d.ts +40 -0
- package/dist/recon/capture-filters.d.ts.map +1 -0
- package/dist/recon/capture-filters.js +106 -0
- package/dist/recon/capture-filters.js.map +1 -0
- package/dist/recon/form-schema.d.ts +51 -0
- package/dist/recon/form-schema.d.ts.map +1 -0
- package/dist/recon/form-schema.js +20 -0
- package/dist/recon/form-schema.js.map +1 -0
- package/dist/recon/load-form-schema.d.ts +24 -0
- package/dist/recon/load-form-schema.d.ts.map +1 -0
- package/dist/recon/load-form-schema.js +66 -0
- package/dist/recon/load-form-schema.js.map +1 -0
- package/dist/scraper/errors.d.ts +14 -14
- package/dist/scraper/errors.d.ts.map +1 -1
- package/dist/scraper/errors.js +15 -15
- package/dist/scraper/errors.js.map +1 -1
- package/dist/scraper/flow-runner.d.ts.map +1 -1
- package/dist/scraper/flow-runner.js +9 -8
- package/dist/scraper/flow-runner.js.map +1 -1
- package/dist/scraper/http-client.d.ts +12 -0
- package/dist/scraper/http-client.d.ts.map +1 -1
- package/dist/scraper/http-client.js +11 -15
- package/dist/scraper/http-client.js.map +1 -1
- package/dist/scraper/parse-json-response.d.ts +7 -5
- package/dist/scraper/parse-json-response.d.ts.map +1 -1
- package/dist/scraper/parse-json-response.js +9 -8
- package/dist/scraper/parse-json-response.js.map +1 -1
- package/dist/scraper/rate-limited-json-client.d.ts +8 -1
- package/dist/scraper/rate-limited-json-client.d.ts.map +1 -1
- package/dist/scraper/rate-limited-json-client.js +6 -1
- package/dist/scraper/rate-limited-json-client.js.map +1 -1
- package/dist/scraper/session-browserbase.d.ts +6 -0
- package/dist/scraper/session-browserbase.d.ts.map +1 -1
- package/dist/scraper/session-browserbase.js +6 -0
- package/dist/scraper/session-browserbase.js.map +1 -1
- package/dist/scripts/recon-browser.d.ts.map +1 -1
- package/dist/scripts/recon-browser.js +3 -4
- package/dist/scripts/recon-browser.js.map +1 -1
- package/dist/scripts/recon-generate.d.ts +50 -21
- package/dist/scripts/recon-generate.d.ts.map +1 -1
- package/dist/scripts/recon-generate.js +190 -182
- package/dist/scripts/recon-generate.js.map +1 -1
- package/dist/scripts/recon-http.d.ts +5 -2
- package/dist/scripts/recon-http.d.ts.map +1 -1
- package/dist/scripts/recon-http.js +16 -4
- package/dist/scripts/recon-http.js.map +1 -1
- package/dist/testing/persona-fixture.d.ts +2 -2
- package/dist/testing/persona-fixture.d.ts.map +1 -1
- package/dist/testing/persona-fixture.js +2 -2
- package/dist/testing/persona-fixture.js.map +1 -1
- package/package.json +5 -1
- package/dist/scraper/oracle-sentinels.d.ts +0 -22
- package/dist/scraper/oracle-sentinels.d.ts.map +0 -1
- package/dist/scraper/oracle-sentinels.js +0 -40
- 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:
|
package/dist/api/errors.d.ts
CHANGED
|
@@ -54,7 +54,8 @@ export declare class ThrottledRequestError extends ApiError {
|
|
|
54
54
|
constructor(message?: string);
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* The upstream
|
|
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 {
|
package/dist/api/errors.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/api/errors.js
CHANGED
|
@@ -100,11 +100,12 @@ class ThrottledRequestError extends ApiError {
|
|
|
100
100
|
}
|
|
101
101
|
exports.ThrottledRequestError = ThrottledRequestError;
|
|
102
102
|
/**
|
|
103
|
-
* The upstream
|
|
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
|
|
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
|
}
|
package/dist/api/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAqC;AACrC,yDAAiE;AAEjE,iDAA4F;AAsB5F;;;;;;;;GAQG;AACH,2BAAkC,IAAe;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,oBAAW,CAAC,uBAAuB;YACtC,OAAO,+BAAW,CAAC,eAAe,CAAC;QACrC,KAAK,oBAAW,CAAC,mBAAmB;YAClC,OAAO,+BAAW,CAAC,YAAY,CAAC;QAClC,KAAK,oBAAW,CAAC,cAAc,CAAC;QAChC,KAAK,oBAAW,CAAC,eAAe,CAAC;QACjC,KAAK,oBAAW,CAAC,aAAa;YAC5B,OAAO,+BAAW,CAAC,WAAW,CAAC;QACjC,KAAK,oBAAW,CAAC,kBAAkB,CAAC;QACpC,KAAK,oBAAW,CAAC,eAAe;YAC9B,OAAO,+BAAW,CAAC,SAAS,CAAC;QAC/B,KAAK,oBAAW,CAAC,iBAAiB,CAAC;QACnC,KAAK,oBAAW,CAAC,UAAU;YACzB,OAAO,+BAAW,CAAC,iBAAiB,CAAC;QACvC,KAAK,oBAAW,CAAC,QAAQ;YACvB,OAAO,+BAAW,CAAC,eAAe,CAAC;QACrC,KAAK,oBAAW,CAAC,aAAa;YAC5B,OAAO,+BAAW,CAAC,SAAS,CAAC;QAC/B,KAAK,oBAAW,CAAC,iBAAiB,CAAC;QACnC,KAAK,oBAAW,CAAC,aAAa,CAAC;QAC/B,KAAK,oBAAW,CAAC,YAAY,CAAC;QAC9B,KAAK,oBAAW,CAAC,cAAc,CAAC;QAChC,KAAK,oBAAW,CAAC,mBAAmB,CAAC;QACrC,KAAK,oBAAW,CAAC,2BAA2B;YAC1C,OAAO,+BAAW,CAAC,qBAAqB,CAAC;QAC3C,KAAK,oBAAW,CAAC,kBAAkB;YACjC,OAAO,+BAAW,CAAC,WAAW,CAAC;QACjC;YACE,OAAO,+BAAW,CAAC,qBAAqB,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,0BAAiC,MAAc;IAC7C,IAAI,CAAC;QACH,OAAO,IAAA,mCAAe,EAAC,MAAM,CAAC;aAC3B,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,MAAM,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,cAAsB,SAAQ,KAAK;IACjB,IAAI,CAAY;IAChB,UAAU,CAAS;IAEnC,YAAY,IAAe,EAAE,OAAe,EAAE,UAAU,GAAG,OAAO;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;;AAED,uBAA+B,SAAQ,QAAQ;IAC7C,YAAY,OAAO,GAAG,yCAAyC;QAC7D,KAAK,CAAC,oBAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;CACF;;AAED,yBAAiC,SAAQ,QAAQ;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACF;;AAED,2BAAmC,SAAQ,QAAQ;IACjD,YAAY,OAAO,GAAG,qBAAqB;QACzC,KAAK,CAAC,oBAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF;;AAED
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":";;;;;;AAAA,uCAAqC;AACrC,yDAAiE;AAEjE,iDAA4F;AAsB5F;;;;;;;;GAQG;AACH,2BAAkC,IAAe;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,oBAAW,CAAC,uBAAuB;YACtC,OAAO,+BAAW,CAAC,eAAe,CAAC;QACrC,KAAK,oBAAW,CAAC,mBAAmB;YAClC,OAAO,+BAAW,CAAC,YAAY,CAAC;QAClC,KAAK,oBAAW,CAAC,cAAc,CAAC;QAChC,KAAK,oBAAW,CAAC,eAAe,CAAC;QACjC,KAAK,oBAAW,CAAC,aAAa;YAC5B,OAAO,+BAAW,CAAC,WAAW,CAAC;QACjC,KAAK,oBAAW,CAAC,kBAAkB,CAAC;QACpC,KAAK,oBAAW,CAAC,eAAe;YAC9B,OAAO,+BAAW,CAAC,SAAS,CAAC;QAC/B,KAAK,oBAAW,CAAC,iBAAiB,CAAC;QACnC,KAAK,oBAAW,CAAC,UAAU;YACzB,OAAO,+BAAW,CAAC,iBAAiB,CAAC;QACvC,KAAK,oBAAW,CAAC,QAAQ;YACvB,OAAO,+BAAW,CAAC,eAAe,CAAC;QACrC,KAAK,oBAAW,CAAC,aAAa;YAC5B,OAAO,+BAAW,CAAC,SAAS,CAAC;QAC/B,KAAK,oBAAW,CAAC,iBAAiB,CAAC;QACnC,KAAK,oBAAW,CAAC,aAAa,CAAC;QAC/B,KAAK,oBAAW,CAAC,YAAY,CAAC;QAC9B,KAAK,oBAAW,CAAC,cAAc,CAAC;QAChC,KAAK,oBAAW,CAAC,mBAAmB,CAAC;QACrC,KAAK,oBAAW,CAAC,2BAA2B;YAC1C,OAAO,+BAAW,CAAC,qBAAqB,CAAC;QAC3C,KAAK,oBAAW,CAAC,kBAAkB;YACjC,OAAO,+BAAW,CAAC,WAAW,CAAC;QACjC;YACE,OAAO,+BAAW,CAAC,qBAAqB,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,0BAAiC,MAAc;IAC7C,IAAI,CAAC;QACH,OAAO,IAAA,mCAAe,EAAC,MAAM,CAAC;aAC3B,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,MAAM,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,cAAsB,SAAQ,KAAK;IACjB,IAAI,CAAY;IAChB,UAAU,CAAS;IAEnC,YAAY,IAAe,EAAE,OAAe,EAAE,UAAU,GAAG,OAAO;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;;AAED,uBAA+B,SAAQ,QAAQ;IAC7C,YAAY,OAAO,GAAG,yCAAyC;QAC7D,KAAK,CAAC,oBAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;CACF;;AAED,yBAAiC,SAAQ,QAAQ;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACF;;AAED,2BAAmC,SAAQ,QAAQ;IACjD,YAAY,OAAO,GAAG,qBAAqB;QACzC,KAAK,CAAC,oBAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF;;AAED;;;;GAIG;AACH,oBAA4B,SAAQ,QAAQ;IAC1C,YAAY,OAAO,GAAG,wDAAwD;QAC5E,KAAK,CAAC,oBAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;CACF;;AAED,wBAAgC,SAAQ,QAAQ;IAC9C,YAAY,OAAO,GAAG,uCAAuC;QAC3D,KAAK,CAAC,oBAAW,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;;AAED,6BAAqC,SAAQ,QAAQ;IACnD,YAAY,OAAO,GAAG,wCAAwC;QAC5D,KAAK,CAAC,oBAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;CACF;;AAED,0BAAkC,SAAQ,QAAQ;IAChD,YAAY,OAAO,GAAG,0CAA0C;QAC9D,KAAK,CAAC,oBAAW,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF;;AAED;;;;;GAKG;AACH,qBAA6B,SAAQ,QAAQ;IAC3C,YAAY,OAAO,GAAG,yCAAyC;QAC7D,KAAK,CAAC,oBAAW,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;CACF;;AAED;;;;GAIG;AACH,4BACE,IAAe,EACf,OAAe,EACf,UAAU,GAAG,OAAO;IAEpB,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO;QACL,MAAM,EAAE;YACN,UAAU,EAAE,gBAAgB,CAAC,UAAU,CAAC;YACxC,QAAQ,EAAE,IAAA,oBAAS,EAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,OAAO,EAAE;gBACP;oBACE,IAAI;oBACJ,eAAe,EAAE,gCAAuB,CAAC,IAAI,CAAC;oBAC9C,UAAU;oBACV,OAAO;iBACR;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/dist/lib/llm/judge.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
package/dist/lib/llm/judge.js
CHANGED
|
@@ -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
|
-
*
|
|
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"}
|
package/dist/scraper/errors.d.ts
CHANGED
|
@@ -133,25 +133,25 @@ export declare class HttpRateLimitError extends ScraperError {
|
|
|
133
133
|
constructor(message?: string);
|
|
134
134
|
}
|
|
135
135
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* and NOT a browser-fallback
|
|
139
|
-
*
|
|
140
|
-
* session can succeed. The caller must
|
|
141
|
-
* state rather than burning a Steel session.
|
|
142
|
-
* so metrics/logs (classifyDispatchError)
|
|
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
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
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,
|
|
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"}
|
package/dist/scraper/errors.js
CHANGED
|
@@ -170,28 +170,28 @@ class HttpRateLimitError extends ScraperError {
|
|
|
170
170
|
}
|
|
171
171
|
exports.HttpRateLimitError = HttpRateLimitError;
|
|
172
172
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* and NOT a browser-fallback
|
|
176
|
-
*
|
|
177
|
-
* session can succeed. The caller must
|
|
178
|
-
* state rather than burning a Steel session.
|
|
179
|
-
* so metrics/logs (classifyDispatchError)
|
|
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 = "
|
|
183
|
+
constructor(message = "requisition url locked") {
|
|
184
184
|
super(message, false);
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
exports.HttpUrlLockedError = HttpUrlLockedError;
|
|
188
188
|
/**
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
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":";AAAA;;;;;;;;;;;;GAYG;;;AAEH;;;;GAIG;AACH,kBAAmC,SAAQ,KAAK;IAC9B,SAAS,CAAU;IAEnC,YAAY,OAAe,EAAE,SAAkB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;;AAED;;;GAGG;AACH,kBAA0B,SAAQ,YAAY;IAC5C,YAAY,OAAO,GAAG,+BAA+B;QACnD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;;AAED;;;;GAIG;AACH,uBAA+B,SAAQ,YAAY;IACjD,YAAY,OAAO,GAAG,4BAA4B;QAChD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;;AAED;;;;GAIG;AACH,0BAAkC,SAAQ,YAAY;IACpD,YAAY,OAAO,GAAG,0BAA0B;QAC9C,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;CACF;;AAED;;;;GAIG;AACH,yBAAiC,SAAQ,YAAY;IACnD,YAAY,OAAO,GAAG,2BAA2B;QAC/C,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;CACF;;AAED;;;GAGG;AACH,yBAAiC,SAAQ,YAAY;IACnD,YAAY,OAAO,GAAG,yBAAyB;QAC7C,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;CACF;;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,2BAAmC,SAAQ,YAAY;IAC5C,IAAI,CAA4B;IACzC,YACE,OAAO,GAAG,wDAAwD,EAClE,IAAI,GAA8B,mBAAmB;QAErD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;;AAED;;;;GAIG;AACH,qBAA6B,SAAQ,YAAY;IAC/C,YAAY,OAAO,GAAG,+BAA+B;QACnD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;;AAED;;;GAGG;AACH,2BAAmC,SAAQ,YAAY;IACrD,YAAY,OAAO,GAAG,qCAAqC;QACzD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;;AAED;;;;;GAKG;AACH,qBAA6B,SAAQ,YAAY;IAC/C,YAAY,OAAO,GAAG,uBAAuB;QAC3C,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;;AAED;;;;;GAKG;AACH,wBAAgC,SAAQ,YAAY;IAClD,YAAY,OAAO,GAAG,8BAA8B;QAClD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;;AAED;;;;;;;;;GASG;AACH,wBAAgC,SAAQ,YAAY;IAClD,YAAY,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/scraper/errors.ts"],"names":[],"mappings":"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"}
|