@enricai/barnacle 1.9.8 → 1.9.9
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 +6 -6
- package/dist/api/errors.d.ts +1 -1
- package/dist/api/errors.d.ts.map +1 -1
- package/dist/api/errors.js +3 -3
- package/dist/api/errors.js.map +1 -1
- package/dist/api/plugins/error-handler.js +1 -1
- package/dist/api/plugins/error-handler.js.map +1 -1
- package/dist/api/routes/submissions.d.ts +1 -1
- package/dist/api/schemas/telemetry.d.ts +1 -1
- package/dist/api/schemas/telemetry.js +1 -1
- package/dist/cache/response-cache.d.ts +1 -1
- package/dist/cache/response-cache.js +2 -2
- package/dist/config.d.ts +4 -4
- package/dist/lib/llm/judges/invalid-fields.d.ts +1 -1
- package/dist/lib/llm/judges/invalid-fields.d.ts.map +1 -1
- package/dist/lib/llm/judges/invalid-fields.js +1 -1
- package/dist/lib/llm/judges/verify-submit.js +1 -1
- package/dist/lib/logging.d.ts +1 -1
- package/dist/lib/logging.js +1 -1
- package/dist/lib/telemetry/beacon-capture.d.ts +1 -1
- package/dist/lib/telemetry/beacon-capture.js +1 -1
- package/dist/lib/telemetry/call-capture.d.ts +1 -1
- package/dist/lib/telemetry/call-capture.js +1 -1
- package/dist/lib/telemetry/reconciliation-source.d.ts +4 -4
- package/dist/lib/telemetry/reconciliation-source.js +5 -5
- package/dist/lib/telemetry/run-telemetry.d.ts +1 -1
- package/dist/lib/telemetry/run-telemetry.js +1 -1
- package/dist/lib/telemetry/s3-sink.d.ts +1 -1
- package/dist/lib/telemetry/s3-sink.js +1 -1
- package/dist/lib/telemetry/submissions-s3-objects.d.ts +1 -1
- package/dist/lib/telemetry/submissions-s3-objects.js +1 -1
- package/dist/lib/telemetry/submissions-s3-reader.d.ts +1 -1
- package/dist/lib/telemetry/submissions-s3-reader.js +1 -1
- package/dist/plugins/config-plugin.js +2 -2
- package/dist/recon/load-form-schema.d.ts +1 -1
- package/dist/recon/load-form-schema.js +1 -1
- package/dist/recon/load-vocabulary.d.ts +1 -1
- package/dist/recon/load-vocabulary.js +2 -2
- package/dist/scraper/deep-locator-actuate.d.ts +1 -1
- package/dist/scraper/deep-locator-actuate.js +3 -3
- package/dist/scraper/deep-locator-candidates.d.ts +2 -2
- package/dist/scraper/deep-locator-candidates.js +3 -3
- package/dist/scraper/deep-locator-fake.d.ts +8 -8
- package/dist/scraper/deep-locator-fake.d.ts.map +1 -1
- package/dist/scraper/deep-locator-fake.js +5 -5
- package/dist/scraper/deep-locator-fake.js.map +1 -1
- package/dist/scraper/deep-locator-scan.d.ts +5 -5
- package/dist/scraper/deep-locator-scan.js +7 -7
- package/dist/scraper/deep-query.js +1 -1
- package/dist/scraper/errors.d.ts +2 -2
- package/dist/scraper/errors.js +2 -2
- package/dist/scraper/flow-runner.d.ts +6 -6
- package/dist/scraper/flow-runner.js +18 -18
- package/dist/scraper/flow-runner.js.map +1 -1
- package/dist/scraper/frame-target.js +1 -1
- package/dist/scraper/http-client.js +1 -1
- package/dist/scraper/metrics.d.ts +1 -1
- package/dist/scraper/metrics.js +1 -1
- package/dist/scraper/phantom-click.d.ts +1 -1
- package/dist/scraper/phantom-click.d.ts.map +1 -1
- package/dist/scraper/retry.js +1 -1
- package/dist/scraper/retry.js.map +1 -1
- package/dist/scraper/session-browserbase.d.ts +3 -3
- package/dist/scraper/session-browserbase.js +4 -4
- package/dist/scraper/session-browserbase.js.map +1 -1
- package/dist/scraper/session-shared.d.ts +2 -2
- package/dist/scraper/stagehand-guard.d.ts +4 -4
- package/dist/scraper/stagehand-guard.js +5 -5
- package/dist/scraper/submit-control.js +1 -1
- package/dist/scripts/judge-llm-batch.d.ts +1 -1
- package/dist/scripts/llm-heal.d.ts +1 -1
- package/dist/scripts/recon-browser.d.ts +1 -1
- package/dist/scripts/recon-browser.js +2 -2
- package/dist/scripts/recon-generate-multicall-fixture.d.ts +1 -1
- package/dist/scripts/recon-generate.d.ts +11 -1
- package/dist/scripts/recon-generate.d.ts.map +1 -1
- package/dist/scripts/recon-generate.js +28 -4
- package/dist/scripts/recon-generate.js.map +1 -1
- package/dist/scripts/recon-heal.js +1 -1
- package/dist/scripts/recon-heal.js.map +1 -1
- package/dist/scripts/recon-http.d.ts +1 -1
- package/dist/scripts/recon-http.js +1 -1
- package/dist/scripts/recon-shared.d.ts +1 -1
- package/dist/server.js +1 -1
- package/dist/site-plugin.d.ts +1 -1
- package/dist/testing/contract-parity-suite.d.mts +1 -1
- package/dist/testing/contract-parity-suite.mjs +1 -1
- package/dist/testing/coverage-guard-suite.d.mts +1 -1
- package/dist/testing/coverage-guard-suite.mjs +1 -1
- package/dist/testing/replay-integration-suite.d.mts +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -139,7 +139,7 @@ Each file is a JSON object:
|
|
|
139
139
|
}
|
|
140
140
|
```
|
|
141
141
|
|
|
142
|
-
Field reference (
|
|
142
|
+
Field reference (matches CDP's `Network.Cookie` type verbatim — no remapping between capture and disk):
|
|
143
143
|
|
|
144
144
|
| Field | Meaning |
|
|
145
145
|
| --- | --- |
|
|
@@ -328,7 +328,7 @@ interface SitePlugin<TPayload, TResult> {
|
|
|
328
328
|
| `maxAttempts?` | `number` | Override the retry policy's default of 3 attempts (including the first try). Without this, the per-run ceiling is `3 × taskTimeoutMs`; set to `1` so `taskTimeoutMs` is the real per-run cap |
|
|
329
329
|
| `apiVersion?` | `string` | Semver range targeting a plugin API version (e.g. `"^1.0.0"`); core disables the plugin on a major-version mismatch. Absent means "accept any version." |
|
|
330
330
|
| `extraRoutes?` | `readonly SitePluginExtraRoute[]` | Extra non-run routes (OTP trigger, resume, etc.) that core registers as authenticated Fastify routes at startup. See `SitePluginExtraRoute` in `src/site-plugin.ts`. |
|
|
331
|
-
| `onShutdown?` | `() => Promise<void>` | Optional cleanup for background work the plugin launched fire-and-forget, awaited during graceful shutdown so in-flight work is not abandoned and sessions are not leaked.
|
|
331
|
+
| `onShutdown?` | `() => Promise<void>` | Optional cleanup for background work the plugin launched fire-and-forget, awaited during graceful shutdown so in-flight work is not abandoned and sessions are not leaked. Parallels the engine's own drain functions. Bounded by a per-plugin timeout, so a hanging drain cannot stall shutdown. Module plugins only — config-only `*.plugin.json` manifests are pure JSON and cannot declare a function. |
|
|
332
332
|
|
|
333
333
|
### Full plugin skeleton (hot path + browser fallback)
|
|
334
334
|
|
|
@@ -623,7 +623,7 @@ When the smoke test fails: re-run `pnpm run recon:browser` → diff `<run-dir>/g
|
|
|
623
623
|
|
|
624
624
|
### Cache deduplication
|
|
625
625
|
|
|
626
|
-
`getCachedResponse()` checks the LRU cache first. On a miss, `getOrCreateInFlight()` registers a promise in an `inFlight` map before awaiting it — meaning concurrent identical requests all await the same
|
|
626
|
+
`getCachedResponse()` checks the LRU cache first. On a miss, `getOrCreateInFlight()` registers a promise in an `inFlight` map before awaiting it — meaning concurrent identical requests all await the same origin call rather than fanning out. First caller wins; all others coalesce onto its promise.
|
|
627
627
|
|
|
628
628
|
Cache key: `<endpoint>:<sha256(canonical payload)[:32]>` — the endpoint is a literal prefix; the hash covers only the canonical payload. Object key order and primitive array element order are normalized so `{a:1,b:2}` and `{b:2,a:1}` hit the same entry. Default TTL: 15 minutes (`CACHE_TTL_MS`). Max entries: 1000 (`CACHE_MAX_ENTRIES`). Only successful responses are cached; errors propagate and never poison the cache.
|
|
629
629
|
|
|
@@ -694,7 +694,7 @@ When using Anthropic directly (not Bedrock), the model is controlled by `STAGEHA
|
|
|
694
694
|
|
|
695
695
|
**What rising `fallbackActivations` means:** the hot path is failing and the browser fallback is absorbing traffic. Cost and latency rise while error rate stays flat — users don't notice yet, but you will on your bill. This is your signal to re-run recon.
|
|
696
696
|
|
|
697
|
-
**`p95LatencyMs`** is reservoir-sampled (Vitter's Algorithm R, capped at 1000 samples) over actual
|
|
697
|
+
**`p95LatencyMs`** is reservoir-sampled (Vitter's Algorithm R, capped at 1000 samples) over actual origin round-trips. Cache hits are excluded — they're memory reads and must not bias the origin latency signal.
|
|
698
698
|
|
|
699
699
|
See [docs/playbook.md](./docs/playbook.md#6b--metrics-signals-the-detection-ladder) for the full detection ladder.
|
|
700
700
|
|
|
@@ -916,7 +916,7 @@ http/net/dns. Metrics have no such constraint.
|
|
|
916
916
|
| `SUBMISSIONS_NDJSON_PATH` | `.barnacle/submissions.ndjson` | Append-only NDJSON sink for dispatch submission envelopes and beacon-fire outcomes. `kind:"submit"` lines (null/`"submit"`-defaulted on legacy lines) capture siteId, requestId, inbound payload, status, audit payload, and duration, plus the opaque `joinKeys` bag a plugin's `extractJoinKeys` hook resolved, merged with anything attached mid-run via `context.telemetry.addJoinKeys()` — the durable source-of-truth for "what did we submit for jobId X and did it succeed." `kind:"beacon"` lines record a later (or, for `beaconStatus: "skipped"`, immediate) independent beacon-fire outcome (`beaconStatus`: `fired`/`failed`/`skipped`, truncated `trackingUrl`) for the same `requestId`, so "submitted but the beacon did not fire" is measurable — the `skipped` line is always written by `dispatch()` itself, but a plugin managing its own tracking nav can call `context.recordBeaconOutcome` to append a real `fired`/`failed` line for the same `requestId`, which outranks `skipped` when the two are folded (see [Reconciliation join keys](#reconciliation-join-keys-extractjoinkeys)). A reader folds both kinds together by `requestId`, so a plugin can join runs to its own attribution provider's report without re-parsing `inboundPayload`. |
|
|
917
917
|
| `TELEMETRY_MAX_FILE_SIZE_BYTES` | `104857600` (100 MB) | Rotate/drop the calls NDJSON once it exceeds this byte count. |
|
|
918
918
|
| `TELEMETRY_MAX_RETENTION_MS` | `2592000000` (30 days) | Drop event-stream files older than this many milliseconds. |
|
|
919
|
-
| `TELEMETRY_S3_BUCKET` | — | Optional — destination bucket for the buffered S3 telemetry
|
|
919
|
+
| `TELEMETRY_S3_BUCKET` | — | Optional — destination bucket for the buffered S3 telemetry replica. Sink is entirely inert (no client, no network calls) when unset. Credentials/region resolve the same way as Bedrock (`AWS_REGION`, standard SDK credential order). |
|
|
920
920
|
| `TELEMETRY_S3_PREFIX` | `telemetry` | Key prefix for uploaded NDJSON objects (`<prefix>/<calls\|submissions>/<date>/...`). |
|
|
921
921
|
| `TELEMETRY_S3_FLUSH_INTERVAL_MS` | `60000` | How often buffered lines are flushed to S3. |
|
|
922
922
|
| `TELEMETRY_S3_MAX_BUFFER_LINES` | `500` | Threshold-flush trigger — flush early if either buffer exceeds this many lines, ahead of the next scheduled interval. |
|
|
@@ -1065,7 +1065,7 @@ Every response — success or error — uses the same envelope shape so clients
|
|
|
1065
1065
|
| 2005 | `EMPTY_RESULTS` | Scrape succeeded but returned no data |
|
|
1066
1066
|
| 2006 | `VERIFICATION_TRIGGER_FAILED` | OTP trigger to the target site failed |
|
|
1067
1067
|
| 2007 | `RESUME_INVALID_OTP` | Provided OTP was rejected by the target site |
|
|
1068
|
-
| 2008 | `URL_LOCKED` |
|
|
1068
|
+
| 2008 | `URL_LOCKED` | Target site locked the target URL; back off and retry later |
|
|
1069
1069
|
|
|
1070
1070
|
Full definitions: `src/api/schemas/common.ts`.
|
|
1071
1071
|
|
package/dist/api/errors.d.ts
CHANGED
|
@@ -54,7 +54,7 @@ export declare class ThrottledRequestError extends ApiError {
|
|
|
54
54
|
constructor(message?: string);
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* The
|
|
57
|
+
* The target site has locked the target URL (a plugin raises the underlying
|
|
58
58
|
* `HttpUrlLockedError`, e.g. from a `classifyResponseBody` sentinel).
|
|
59
59
|
* Signals "back off and retry later" — not a browser-fallback trigger.
|
|
60
60
|
*/
|
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;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,YAAY,OAAO,
|
|
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,SAAyD,EAE3E;CACF;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAO,SAA0C,EAE5D;CACF;AAED,qBAAa,uBAAwB,SAAQ,QAAQ;IACnD,YAAY,OAAO,SAAqD,EAEvE;CACF;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,OAAO,SAA6C,EAE/D;CACF;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAO,SAAiD,EAEnE;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,12 +100,12 @@ class ThrottledRequestError extends ApiError {
|
|
|
100
100
|
}
|
|
101
101
|
exports.ThrottledRequestError = ThrottledRequestError;
|
|
102
102
|
/**
|
|
103
|
-
* The
|
|
103
|
+
* The target site has locked the target URL (a plugin raises the underlying
|
|
104
104
|
* `HttpUrlLockedError`, e.g. from a `classifyResponseBody` sentinel).
|
|
105
105
|
* Signals "back off and retry later" — not a browser-fallback trigger.
|
|
106
106
|
*/
|
|
107
107
|
class UrlLockedError extends ApiError {
|
|
108
|
-
constructor(message = "target URL is locked by the
|
|
108
|
+
constructor(message = "target URL is locked by the target site; retry later") {
|
|
109
109
|
super(common_1.ERROR_CODES.URL_LOCKED, message);
|
|
110
110
|
}
|
|
111
111
|
}
|
|
@@ -117,7 +117,7 @@ class ScrapeFailureError extends ApiError {
|
|
|
117
117
|
}
|
|
118
118
|
exports.ScrapeFailureError = ScrapeFailureError;
|
|
119
119
|
class CaptchaEncounteredError extends ApiError {
|
|
120
|
-
constructor(message = "captcha challenge encountered
|
|
120
|
+
constructor(message = "captcha challenge encountered on the target site") {
|
|
121
121
|
super(common_1.ERROR_CODES.CAPTCHA_ENCOUNTERED, message);
|
|
122
122
|
}
|
|
123
123
|
}
|
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;;;;GAIG;AACH,oBAA4B,SAAQ,QAAQ;IAC1C,YAAY,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ async function errorHandlerPlugin(app) {
|
|
|
45
45
|
// exhausted selector retries, session timeouts) surface to clients as
|
|
46
46
|
// the dedicated codes 2004 / 2003 rather than a generic 1008 — the
|
|
47
47
|
// whole reason those codes exist is for clients to distinguish scrape
|
|
48
|
-
// failures from
|
|
48
|
+
// failures from target-site failures.
|
|
49
49
|
if ((0, errors_2.isScraperError)(error)) {
|
|
50
50
|
const code = (0, errors_2.isCaptchaError)(error)
|
|
51
51
|
? common_1.ERROR_CODES.CAPTCHA_ENCOUNTERED
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/api/plugins/error-handler.ts"],"names":[],"mappings":";;;;;AACA,oEAAgC;AAChC,yEAAgF;AAChF,+BAAkC;AAElC,yCAAwC;AACxC,+CAAqD;AACrD,iDAAmD;AACnD,6CAAkE;AAGlE;;;;;;GAMG;AACH,KAAK,UAAU,kBAAkB,CAAC,GAAoB;IACpD,GAAG,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QACzC,IAAA,sBAAc,EACZ,KAAK,EACL,oBAAW,CAAC,kBAAkB,EAC9B,SAAS,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,YAAY,CACrD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAI,KAAkD,CAAC,OAAO,CAAC;QAE5E,IAAI,IAAA,+DAAmC,EAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU;iBAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;iBACnE,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,IAAA,sBAAc,EAAC,KAAK,EAAE,oBAAW,CAAC,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,IAAI,KAAK,YAAY,aAAQ,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM;iBACzB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;iBACrE,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,IAAA,sBAAc,EAAC,KAAK,EAAE,oBAAW,CAAC,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,IAAI,KAAK,YAAY,iBAAQ,EAAE,CAAC;YAC9B,IAAA,sBAAc,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,sEAAsE;QACtE,mEAAmE;QACnE,sEAAsE;QACtE
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/api/plugins/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { FastifyInstance } from "fastify";
|
|
2
2
|
/**
|
|
3
3
|
* Injectable options for `submissionsRoutes`. The sink path is passed in at
|
|
4
|
-
* registration time (
|
|
4
|
+
* registration time (parallels `pluginsIntrospectionRoutes`'s `report`
|
|
5
5
|
* injection) so the route can be tested against a temp NDJSON file instead
|
|
6
6
|
* of the real `.barnacle/submissions.ndjson`.
|
|
7
7
|
*/
|
|
@@ -35,7 +35,7 @@ declare const judgeAggregateSchema: z.ZodObject<{
|
|
|
35
35
|
}, z.core.$strip>;
|
|
36
36
|
export type JudgeAggregate = z.infer<typeof judgeAggregateSchema>;
|
|
37
37
|
/**
|
|
38
|
-
* Top-level verdict file produced by the judge skill for one batch.
|
|
38
|
+
* Top-level verdict file produced by the judge skill for one batch. Parallels
|
|
39
39
|
* beacon/pila's verdict-JSON shape but in Barnacle's camelCase convention.
|
|
40
40
|
*/
|
|
41
41
|
export declare const judgeVerdictSchema: z.ZodObject<{
|
|
@@ -38,7 +38,7 @@ const judgeAggregateSchema = v4_1.z.object({
|
|
|
38
38
|
overallPass: v4_1.z.number().int(),
|
|
39
39
|
});
|
|
40
40
|
/**
|
|
41
|
-
* Top-level verdict file produced by the judge skill for one batch.
|
|
41
|
+
* Top-level verdict file produced by the judge skill for one batch. Parallels
|
|
42
42
|
* beacon/pila's verdict-JSON shape but in Barnacle's camelCase convention.
|
|
43
43
|
*/
|
|
44
44
|
exports.judgeVerdictSchema = v4_1.z.object({
|
|
@@ -24,7 +24,7 @@ export declare function cacheStats(): {
|
|
|
24
24
|
};
|
|
25
25
|
/**
|
|
26
26
|
* Runs `producer` once per key even when multiple callers race on a
|
|
27
|
-
* cache miss. The first caller kicks off the
|
|
27
|
+
* cache miss. The first caller kicks off the origin call and all
|
|
28
28
|
* concurrent callers await the same promise. On resolve, the value is
|
|
29
29
|
* written to the LRU cache so subsequent (non-racing) reads hit
|
|
30
30
|
* normally.
|
|
@@ -21,7 +21,7 @@ const cache = new lru_cache_1.LRUCache({
|
|
|
21
21
|
ttl: config_1.config.cache.ttlMs,
|
|
22
22
|
});
|
|
23
23
|
/**
|
|
24
|
-
* Tracks
|
|
24
|
+
* Tracks origin calls that are currently resolving for a given key so
|
|
25
25
|
* concurrent cache misses don't all fan out to the scraper. First miss
|
|
26
26
|
* kicks off the work; subsequent misses await the same promise. Each
|
|
27
27
|
* entry is removed after the promise settles (resolve or reject).
|
|
@@ -83,7 +83,7 @@ function cacheStats() {
|
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
85
85
|
* Runs `producer` once per key even when multiple callers race on a
|
|
86
|
-
* cache miss. The first caller kicks off the
|
|
86
|
+
* cache miss. The first caller kicks off the origin call and all
|
|
87
87
|
* concurrent callers await the same promise. On resolve, the value is
|
|
88
88
|
* written to the LRU cache so subsequent (non-racing) reads hit
|
|
89
89
|
* normally.
|
package/dist/config.d.ts
CHANGED
|
@@ -229,7 +229,7 @@ export interface AppConfig {
|
|
|
229
229
|
*/
|
|
230
230
|
maxRetentionMs: number;
|
|
231
231
|
/**
|
|
232
|
-
* Opt-in buffered S3 sink that
|
|
232
|
+
* Opt-in buffered S3 sink that replicates local NDJSON telemetry so it
|
|
233
233
|
* survives ECS container restarts. Entirely inert when `bucket` is
|
|
234
234
|
* undefined — the sink checks this before buffering or flushing.
|
|
235
235
|
*/
|
|
@@ -294,7 +294,7 @@ export interface AppConfig {
|
|
|
294
294
|
selfheal: {
|
|
295
295
|
/**
|
|
296
296
|
* Maximum patch→replay→score iterations before giving up with
|
|
297
|
-
* BUDGET_EXHAUSTED.
|
|
297
|
+
* BUDGET_EXHAUSTED. Matches the recon-heal default of 5.
|
|
298
298
|
*/
|
|
299
299
|
maxIterations: number;
|
|
300
300
|
/**
|
|
@@ -304,12 +304,12 @@ export interface AppConfig {
|
|
|
304
304
|
nReplays: number;
|
|
305
305
|
/**
|
|
306
306
|
* Minimum pass rate (0..1) to declare SUCCESS and stop iterating.
|
|
307
|
-
*
|
|
307
|
+
* Matches the pila llm-self-heal SKILL default of 0.9.
|
|
308
308
|
*/
|
|
309
309
|
successThreshold: number;
|
|
310
310
|
/**
|
|
311
311
|
* Consecutive iterations whose pass-rate improvement is below
|
|
312
|
-
* `plateauDelta` that triggers a PLATEAUED verdict.
|
|
312
|
+
* `plateauDelta` that triggers a PLATEAUED verdict. Matches recon-heal.
|
|
313
313
|
*/
|
|
314
314
|
plateauWindow: number;
|
|
315
315
|
/**
|
|
@@ -21,7 +21,7 @@ import type Anthropic from "@anthropic-ai/sdk";
|
|
|
21
21
|
import type { z } from "zod/v4";
|
|
22
22
|
import { type JudgeCaptureFn } from "../../../lib/llm/judge";
|
|
23
23
|
import { INVALID_FIELDS_SCHEMA } from "../../../lib/llm/schemas";
|
|
24
|
-
declare const INVALID_FIELDS_SYSTEM_PROMPT = "You are a strict invalid-field detector for browser forms. Given a body-HTML excerpt and (optionally) site-specific class-name prefixes, identify form fields that are structurally in an invalid/error state.\n\nStrict criteria for present=true (mark a field):\n- The container has a class containing \"invalid\" (e.g. ng-invalid, mat-form-field-invalid, is-invalid, field-invalid, app-input-invalid, etc.), OR\n- The element has aria-invalid=\"true\", OR\n- The element has data-invalid (truthy), OR\n- The container is structurally adjacent to an error-message container (class containing \"error\", \"validation\", \"feedback\", \"required\", \"help-block-error\", etc.), OR\n- The element is structurally adjacent to a visible error-text span/div that explains why it's invalid.\n\nDo NOT mark a field when:\n- Only visual styling indicates error (red border via CSS, no semantic marker).\n- The container is in a pristine/untouched state (e.g. ng-pristine ng-untouched alongside ng-invalid means the user hasn't interacted yet \u2014 that's a \"may become invalid\" state, not currently invalid).\n- The element is a hidden input or non-interactive ancestor.\n- The container is invalid ONLY because a descendant is invalid (parent-bubbled invalidity). Angular bubbles ng-invalid up to wrapping forms / lists / question containers; Bootstrap
|
|
24
|
+
declare const INVALID_FIELDS_SYSTEM_PROMPT = "You are a strict invalid-field detector for browser forms. Given a body-HTML excerpt and (optionally) site-specific class-name prefixes, identify form fields that are structurally in an invalid/error state.\n\nStrict criteria for present=true (mark a field):\n- The container has a class containing \"invalid\" (e.g. ng-invalid, mat-form-field-invalid, is-invalid, field-invalid, app-input-invalid, etc.), OR\n- The element has aria-invalid=\"true\", OR\n- The element has data-invalid (truthy), OR\n- The container is structurally adjacent to an error-message container (class containing \"error\", \"validation\", \"feedback\", \"required\", \"help-block-error\", etc.), OR\n- The element is structurally adjacent to a visible error-text span/div that explains why it's invalid.\n\nDo NOT mark a field when:\n- Only visual styling indicates error (red border via CSS, no semantic marker).\n- The container is in a pristine/untouched state (e.g. ng-pristine ng-untouched alongside ng-invalid means the user hasn't interacted yet \u2014 that's a \"may become invalid\" state, not currently invalid).\n- The element is a hidden input or non-interactive ancestor.\n- The container is invalid ONLY because a descendant is invalid (parent-bubbled invalidity). Angular bubbles ng-invalid up to wrapping forms / lists / question containers; Bootstrap parallels this on form-group; React Hook Form propagates aria-invalid through fieldsets. When you see <ol class=\"ng-invalid\"> with <li class=\"ng-valid\"> children where ONE deeper descendant is actually invalid, report ONLY the deepest leaf that carries the failure. The leaf is the smallest container with the invalid marker AND no further invalid descendants. Reporting bubbled parents alongside the real leaf creates false positives (the parent's children look like they're invalid when they are not).\n\nWhen the supplied knownErrorClassPrefixes list is non-empty, also treat class names starting with any of those prefixes followed by \"-invalid\" or \"-error\" as structural markers (site-specific convention).\n\nReturn up to 50 fields. Top-level present=true means at least one field is currently invalid. present=false means no structural invalid markers found anywhere in the excerpt.\n\nEach field entry:\n- containerXpath: a best-effort xpath identifying the container (tag + nth-of-type)\n- label: the visible label text near the field, or null if not discoverable\n- markerKind: which marker type triggered (\"class\", \"aria\", \"data\", \"error-container\", \"other\")\n- framework: which UI library this looks like (\"angular\", \"react\", \"vue\", \"mantine\", \"chakra\", \"bootstrap\", \"other\"). Look at framework-conventional class signatures to decide.";
|
|
25
25
|
export interface JudgeInvalidFieldsInput {
|
|
26
26
|
/** Body HTML excerpt to scan (typically the page DOM, truncated to ~8KB). */
|
|
27
27
|
bodyHtmlExcerpt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invalid-fields.d.ts","sourceRoot":"","sources":["../../../../src/lib/llm/judges/invalid-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,QAAA,MAAM,4BAA4B,
|
|
1
|
+
{"version":3,"file":"invalid-fields.d.ts","sourceRoot":"","sources":["../../../../src/lib/llm/judges/invalid-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,QAAA,MAAM,4BAA4B,yqFAuB+I,CAAC;AAElL,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC;IACxB,gGAAgG;IAChG,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAWD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,uBAAuB,CAAC;IAC/B,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAAG,IAAI,CAAC,CAYxD;AAED,OAAO,EAAE,4BAA4B,EAAE,CAAC"}
|
|
@@ -37,7 +37,7 @@ Do NOT mark a field when:
|
|
|
37
37
|
- Only visual styling indicates error (red border via CSS, no semantic marker).
|
|
38
38
|
- The container is in a pristine/untouched state (e.g. ng-pristine ng-untouched alongside ng-invalid means the user hasn't interacted yet — that's a "may become invalid" state, not currently invalid).
|
|
39
39
|
- The element is a hidden input or non-interactive ancestor.
|
|
40
|
-
- The container is invalid ONLY because a descendant is invalid (parent-bubbled invalidity). Angular bubbles ng-invalid up to wrapping forms / lists / question containers; Bootstrap
|
|
40
|
+
- The container is invalid ONLY because a descendant is invalid (parent-bubbled invalidity). Angular bubbles ng-invalid up to wrapping forms / lists / question containers; Bootstrap parallels this on form-group; React Hook Form propagates aria-invalid through fieldsets. When you see <ol class="ng-invalid"> with <li class="ng-valid"> children where ONE deeper descendant is actually invalid, report ONLY the deepest leaf that carries the failure. The leaf is the smallest container with the invalid marker AND no further invalid descendants. Reporting bubbled parents alongside the real leaf creates false positives (the parent's children look like they're invalid when they are not).
|
|
41
41
|
|
|
42
42
|
When the supplied knownErrorClassPrefixes list is non-empty, also treat class names starting with any of those prefixes followed by "-invalid" or "-error" as structural markers (site-specific convention).
|
|
43
43
|
|
|
@@ -41,7 +41,7 @@ When verified=true, populate the three signal fields with what you found (any ca
|
|
|
41
41
|
When verified=false, write a one-sentence reason citing what you'd need to see to be convinced.`;
|
|
42
42
|
exports.SUBMIT_VERIFY_SYSTEM_PROMPT = SUBMIT_VERIFY_SYSTEM_PROMPT;
|
|
43
43
|
/**
|
|
44
|
-
* Render the evidence into a user prompt for Haiku. The structure
|
|
44
|
+
* Render the evidence into a user prompt for Haiku. The structure parallels
|
|
45
45
|
* the empirical-replay prototype that proved this works on production cases.
|
|
46
46
|
*/
|
|
47
47
|
function buildVerifySubmitPrompt(input) {
|
package/dist/lib/logging.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export declare function extendLogger(logger: pino.Logger): Logger;
|
|
|
21
21
|
/**
|
|
22
22
|
* Returns a pino logger for one-shot CLI scripts. Uses pino-pretty in
|
|
23
23
|
* development (where the devDependency is installed) and falls back to raw
|
|
24
|
-
* JSON elsewhere,
|
|
24
|
+
* JSON elsewhere, paralleling `getLogger`'s gating — `pino-pretty` is pruned
|
|
25
25
|
* from production images, so an unconditional transport crashes on module
|
|
26
26
|
* load in prod (see the pino-pretty prod-crash incident).
|
|
27
27
|
*/
|
package/dist/lib/logging.js
CHANGED
|
@@ -166,7 +166,7 @@ function extendLogger(logger) {
|
|
|
166
166
|
/**
|
|
167
167
|
* Returns a pino logger for one-shot CLI scripts. Uses pino-pretty in
|
|
168
168
|
* development (where the devDependency is installed) and falls back to raw
|
|
169
|
-
* JSON elsewhere,
|
|
169
|
+
* JSON elsewhere, paralleling `getLogger`'s gating — `pino-pretty` is pruned
|
|
170
170
|
* from production images, so an unconditional transport crashes on module
|
|
171
171
|
* load in prod (see the pino-pretty prod-crash incident).
|
|
172
172
|
*/
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* `requestId` (see `reconciliation-record.ts`, `submission-reader.ts`).
|
|
10
10
|
*
|
|
11
11
|
* Writes to the SAME sink as submit lines (`appendSubmissionSinkLine`,
|
|
12
|
-
* feat-003), which is what lets the S3
|
|
12
|
+
* feat-003), which is what lets the S3 replica carry beacon lines for free
|
|
13
13
|
* with zero `s3-sink.ts` changes.
|
|
14
14
|
*
|
|
15
15
|
* `createBeaconOutcomeRecorder` builds on top of `captureBeaconEvent` to
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* `requestId` (see `reconciliation-record.ts`, `submission-reader.ts`).
|
|
11
11
|
*
|
|
12
12
|
* Writes to the SAME sink as submit lines (`appendSubmissionSinkLine`,
|
|
13
|
-
* feat-003), which is what lets the S3
|
|
13
|
+
* feat-003), which is what lets the S3 replica carry beacon lines for free
|
|
14
14
|
* with zero `s3-sink.ts` changes.
|
|
15
15
|
*
|
|
16
16
|
* `createBeaconOutcomeRecorder` builds on top of `captureBeaconEvent` to
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { z } from "zod/v4";
|
|
7
7
|
/**
|
|
8
8
|
* Categorical failure reason for an LLM call. Surfaces post-mortem without
|
|
9
|
-
* regex-scanning `errorMessage`. Discriminated
|
|
9
|
+
* regex-scanning `errorMessage`. Discriminated earlier by the caller.
|
|
10
10
|
*/
|
|
11
11
|
export declare const llmCallFailureKindSchema: z.ZodEnum<{
|
|
12
12
|
"anthropic-billing": "anthropic-billing";
|
|
@@ -18,7 +18,7 @@ const s3_sink_1 = require("../../lib/telemetry/s3-sink");
|
|
|
18
18
|
const logger = (0, logging_1.getLogger)({ name: "telemetry/call-capture" });
|
|
19
19
|
/**
|
|
20
20
|
* Categorical failure reason for an LLM call. Surfaces post-mortem without
|
|
21
|
-
* regex-scanning `errorMessage`. Discriminated
|
|
21
|
+
* regex-scanning `errorMessage`. Discriminated earlier by the caller.
|
|
22
22
|
*/
|
|
23
23
|
exports.llmCallFailureKindSchema = v4_1.z.enum([
|
|
24
24
|
"anthropic-billing",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Durable read path for reconciliation rows: unions the container-local
|
|
3
|
-
* submissions sink with the S3-
|
|
3
|
+
* submissions sink with the S3-replicated objects (feat-003's
|
|
4
4
|
* `listSubmissionsS3Objects` + `fetchSubmissionsS3Records`) before folding,
|
|
5
5
|
* so a submit line written by one ECS task and its beacon line written by
|
|
6
6
|
* another both land in the same row instead of two ephemeral, incomplete
|
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
* beacon detail a cross-store fold still needs (see
|
|
10
10
|
* `submission-reader.ts`'s `foldReconciliationRecords`).
|
|
11
11
|
*
|
|
12
|
-
* The local sink and its S3
|
|
12
|
+
* The local sink and its S3 replica both receive the exact same line for
|
|
13
13
|
* every event (`appendSubmissionSinkLine` writes to disk and buffers to S3
|
|
14
14
|
* in the same call), so an overlap between the two stores is an exact JSON
|
|
15
15
|
* duplicate, never a conflicting value — deduping on `kind:requestId:ts` is
|
|
16
|
-
* lossless for that
|
|
16
|
+
* lossless for that replica case. But `ts` is formatISO second-precision, so
|
|
17
17
|
* two *distinct* beacon lines for the same `requestId` (e.g. dispatch's
|
|
18
18
|
* automatic `skipped` line and a plugin's later self-recorded `fired` line)
|
|
19
19
|
* can land in the same wall-clock second — the dedupe key for beacon
|
|
@@ -30,7 +30,7 @@ export interface ReadDurableReconciliationRowsOptions extends ListSubmissionsS3O
|
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Reads and folds the complete cross-container reconciliation history: the
|
|
33
|
-
* local sink plus its S3
|
|
33
|
+
* local sink plus its S3 replica, unioned and deduped before folding, so
|
|
34
34
|
* `GET /v1/submissions` answers from durable storage instead of one ECS
|
|
35
35
|
* task's ephemeral file. Falls back to local-only rows when no bucket is
|
|
36
36
|
* configured or the S3 read fails.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Durable read path for reconciliation rows: unions the container-local
|
|
4
|
-
* submissions sink with the S3-
|
|
4
|
+
* submissions sink with the S3-replicated objects (feat-003's
|
|
5
5
|
* `listSubmissionsS3Objects` + `fetchSubmissionsS3Records`) before folding,
|
|
6
6
|
* so a submit line written by one ECS task and its beacon line written by
|
|
7
7
|
* another both land in the same row instead of two ephemeral, incomplete
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
* beacon detail a cross-store fold still needs (see
|
|
11
11
|
* `submission-reader.ts`'s `foldReconciliationRecords`).
|
|
12
12
|
*
|
|
13
|
-
* The local sink and its S3
|
|
13
|
+
* The local sink and its S3 replica both receive the exact same line for
|
|
14
14
|
* every event (`appendSubmissionSinkLine` writes to disk and buffers to S3
|
|
15
15
|
* in the same call), so an overlap between the two stores is an exact JSON
|
|
16
16
|
* duplicate, never a conflicting value — deduping on `kind:requestId:ts` is
|
|
17
|
-
* lossless for that
|
|
17
|
+
* lossless for that replica case. But `ts` is formatISO second-precision, so
|
|
18
18
|
* two *distinct* beacon lines for the same `requestId` (e.g. dispatch's
|
|
19
19
|
* automatic `skipped` line and a plugin's later self-recorded `fired` line)
|
|
20
20
|
* can land in the same wall-clock second — the dedupe key for beacon
|
|
@@ -46,7 +46,7 @@ async function readLocalRecords(sinkPath) {
|
|
|
46
46
|
return (0, submission_reader_1.parseReconciliationLines)(content);
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
* Lists and fetches the S3-
|
|
49
|
+
* Lists and fetches the S3-replicated records for the window. A rejection
|
|
50
50
|
* anywhere in the S3 path (listing or fetch) is logged and swallowed rather
|
|
51
51
|
* than propagated, so an S3 outage degrades the answer to local-only instead
|
|
52
52
|
* of failing the whole read.
|
|
@@ -91,7 +91,7 @@ function mergeRecords(localRecords, s3Records) {
|
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
93
93
|
* Reads and folds the complete cross-container reconciliation history: the
|
|
94
|
-
* local sink plus its S3
|
|
94
|
+
* local sink plus its S3 replica, unioned and deduped before folding, so
|
|
95
95
|
* `GET /v1/submissions` answers from durable storage instead of one ECS
|
|
96
96
|
* task's ephemeral file. Falls back to local-only rows when no bucket is
|
|
97
97
|
* configured or the S3 read fails.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Run-scoped, mutable telemetry accumulator that a plugin can write
|
|
3
3
|
* discovered fields into at any point during execute()/executeHttp() —
|
|
4
|
-
*
|
|
4
|
+
* parallels `MetricsCollector` (src/lib/dispatch-metrics.ts) as a per-request
|
|
5
5
|
* instance meant to be threaded through the plugin context, but for
|
|
6
6
|
* run-discovered data (join keys, session info) rather than step timings.
|
|
7
7
|
* Funnels everything a plugin discovers mid-run into the same opaque
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Run-scoped, mutable telemetry accumulator that a plugin can write
|
|
4
4
|
* discovered fields into at any point during execute()/executeHttp() —
|
|
5
|
-
*
|
|
5
|
+
* parallels `MetricsCollector` (src/lib/dispatch-metrics.ts) as a per-request
|
|
6
6
|
* instance meant to be threaded through the plugin context, but for
|
|
7
7
|
* run-discovered data (join keys, session info) rather than step timings.
|
|
8
8
|
* Funnels everything a plugin discovers mid-run into the same opaque
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Buffered S3 sink that
|
|
2
|
+
* Buffered S3 sink that replicates local NDJSON telemetry so it survives ECS
|
|
3
3
|
* container restarts. Opt-in: entirely inert (no S3Client construction, no
|
|
4
4
|
* network calls) when `config.telemetry.s3.bucket` is unset. Buffers lines
|
|
5
5
|
* in module-level arrays and flushes each non-empty buffer to a single S3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Buffered S3 sink that
|
|
3
|
+
* Buffered S3 sink that replicates local NDJSON telemetry so it survives ECS
|
|
4
4
|
* container restarts. Opt-in: entirely inert (no S3Client construction, no
|
|
5
5
|
* network calls) when `config.telemetry.s3.bucket` is unset. Buffers lines
|
|
6
6
|
* in module-level arrays and flushes each non-empty buffer to a single S3
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* requested `from`/`to` window, so the fetch stage (feat-003) never has to
|
|
5
5
|
* scan the whole telemetry bucket. Entirely inert (no `S3Client`
|
|
6
6
|
* construction, no network calls) when `config.telemetry.s3.bucket` is
|
|
7
|
-
* unset —
|
|
7
|
+
* unset — parallels `s3-sink.ts`'s inertness contract.
|
|
8
8
|
*/
|
|
9
9
|
/** Filter window for `listSubmissionsS3Objects`. Both bounds are ISO datetime strings. */
|
|
10
10
|
export interface ListSubmissionsS3ObjectsOptions {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* requested `from`/`to` window, so the fetch stage (feat-003) never has to
|
|
6
6
|
* scan the whole telemetry bucket. Entirely inert (no `S3Client`
|
|
7
7
|
* construction, no network calls) when `config.telemetry.s3.bucket` is
|
|
8
|
-
* unset —
|
|
8
|
+
* unset — parallels `s3-sink.ts`'s inertness contract.
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.listSubmissionsS3Objects = listSubmissionsS3Objects;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* containers are ephemeral and per-task) becomes readable. Folding beacon
|
|
8
8
|
* lines onto submit records and merging with the local sink live elsewhere.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* Parallels `s3-sink.ts`'s inertness contract: no `S3Client` construction, no
|
|
11
11
|
* network calls, when `config.telemetry.s3.bucket` is unset.
|
|
12
12
|
*/
|
|
13
13
|
import type { ReconciliationRecord } from "../../lib/telemetry/reconciliation-record";
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* containers are ephemeral and per-task) becomes readable. Folding beacon
|
|
9
9
|
* lines onto submit records and merging with the local sink live elsewhere.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Parallels `s3-sink.ts`'s inertness contract: no `S3Client` construction, no
|
|
12
12
|
* network calls, when `config.telemetry.s3.bucket` is unset.
|
|
13
13
|
*/
|
|
14
14
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
@@ -135,7 +135,7 @@ function buildRephraseModelForContext(appConfig) {
|
|
|
135
135
|
return provider.languageModel(modelId);
|
|
136
136
|
}
|
|
137
137
|
/**
|
|
138
|
-
* Builds the upload fixture the browser flow uploads,
|
|
138
|
+
* Builds the upload fixture the browser flow uploads, matching the rule the
|
|
139
139
|
* generator's `emitBrowserFlowTs` applies: only when a step uploads AND the
|
|
140
140
|
* manifest declares itself multipart do the `Resume*` payload fields exist.
|
|
141
141
|
*/
|
|
@@ -154,7 +154,7 @@ function buildUploadFixture(payload, hasUploadStep, multipart) {
|
|
|
154
154
|
* for an import it does not use, and a broken `httpModule` disables the plugin
|
|
155
155
|
* via the loader's normal failure path rather than crashing the factory.
|
|
156
156
|
*
|
|
157
|
-
* Resolution
|
|
157
|
+
* Resolution parallels the loader's `resolvePluginSpecifier`: a `.`/`/` specifier
|
|
158
158
|
* is a filesystem path resolved against `baseDir` (so a relative `httpModule`
|
|
159
159
|
* resolves against the operator's `BARNACLE_PLUGINS_DIR`, not this module's
|
|
160
160
|
* location under `dist/`); anything else is a bare package name left for Node's
|
|
@@ -13,7 +13,7 @@ export declare const FORM_SCHEMA_NONE = "none";
|
|
|
13
13
|
*
|
|
14
14
|
* Resolution reuses {@link resolvePluginSpecifier}, so `--form-schema` accepts the
|
|
15
15
|
* same specifier forms as `BARNACLE_PLUGINS` and `--vocabulary`. Export resolution
|
|
16
|
-
*
|
|
16
|
+
* matches the plugin loader's `m.formSchema ?? m.default ?? m`. The
|
|
17
17
|
* {@link FORM_SCHEMA_NONE} sentinel returns `null` (not an empty struct — see the
|
|
18
18
|
* form-schema module for why), the shape for "this site has no ATS form data."
|
|
19
19
|
*
|
|
@@ -43,7 +43,7 @@ const formSchemaSchema = v4_1.z.object({
|
|
|
43
43
|
*
|
|
44
44
|
* Resolution reuses {@link resolvePluginSpecifier}, so `--form-schema` accepts the
|
|
45
45
|
* same specifier forms as `BARNACLE_PLUGINS` and `--vocabulary`. Export resolution
|
|
46
|
-
*
|
|
46
|
+
* matches the plugin loader's `m.formSchema ?? m.default ?? m`. The
|
|
47
47
|
* {@link FORM_SCHEMA_NONE} sentinel returns `null` (not an empty struct — see the
|
|
48
48
|
* form-schema module for why), the shape for "this site has no ATS form data."
|
|
49
49
|
*
|
|
@@ -13,7 +13,7 @@ export declare const VOCABULARY_NONE = "none";
|
|
|
13
13
|
*
|
|
14
14
|
* Resolution reuses {@link resolvePluginSpecifier}, so `--vocabulary` accepts the
|
|
15
15
|
* same specifier forms as `BARNACLE_PLUGINS` (relative path or package name) and
|
|
16
|
-
* consumers learn one rule instead of two. Export resolution
|
|
16
|
+
* consumers learn one rule instead of two. Export resolution matches the plugin
|
|
17
17
|
* loader's `m.vocabulary ?? m.default ?? m`, since a named-only export failing
|
|
18
18
|
* silently is a known foot-gun in this codebase.
|
|
19
19
|
*
|
|
@@ -27,7 +27,7 @@ exports.VOCABULARY_NONE = "none";
|
|
|
27
27
|
const regexSchema = v4_1.z.custom((v) => v instanceof RegExp && !v.global && !v.sticky, {
|
|
28
28
|
message: "expected a RegExp literal without the g or y flag (they make .test() stateful)",
|
|
29
29
|
});
|
|
30
|
-
/**
|
|
30
|
+
/** Matches the emitter's identifier rule: a field name is spliced into source as
|
|
31
31
|
* `payload.<name>` / `{{ .request.<name> }}`, so anything else emits a broken
|
|
32
32
|
* plugin that still generates and still typechecks. */
|
|
33
33
|
const payloadFieldNameSchema = v4_1.z
|
|
@@ -48,7 +48,7 @@ const vocabularySchema = v4_1.z.object({
|
|
|
48
48
|
*
|
|
49
49
|
* Resolution reuses {@link resolvePluginSpecifier}, so `--vocabulary` accepts the
|
|
50
50
|
* same specifier forms as `BARNACLE_PLUGINS` (relative path or package name) and
|
|
51
|
-
* consumers learn one rule instead of two. Export resolution
|
|
51
|
+
* consumers learn one rule instead of two. Export resolution matches the plugin
|
|
52
52
|
* loader's `m.vocabulary ?? m.default ?? m`, since a named-only export failing
|
|
53
53
|
* silently is a known foot-gun in this codebase.
|
|
54
54
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Fill/select actuation seam over `deepLocator`,
|
|
2
|
+
* Fill/select actuation seam over `deepLocator`, paralleling
|
|
3
3
|
* `clickDeepLocatorCandidate`'s contract (`deep-locator-candidates.ts`) for
|
|
4
4
|
* the two other primitives a cross-origin OOPIF form's text/select steps
|
|
5
5
|
* need. Stagehand `act`/`observe` are measured blind inside that OOPIF, and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Fill/select actuation seam over `deepLocator`,
|
|
3
|
+
* Fill/select actuation seam over `deepLocator`, paralleling
|
|
4
4
|
* `clickDeepLocatorCandidate`'s contract (`deep-locator-candidates.ts`) for
|
|
5
5
|
* the two other primitives a cross-origin OOPIF form's text/select steps
|
|
6
6
|
* need. Stagehand `act`/`observe` are measured blind inside that OOPIF, and
|
|
@@ -80,7 +80,7 @@ async function writeAndVerify(write, readBack, expected) {
|
|
|
80
80
|
* throws) when `frameSelector` is unset, the probe rejects (e.g. a fake
|
|
81
81
|
* `Page` in a legacy-path test lacking `evaluate`/`frames`), or nothing
|
|
82
82
|
* attaches within the probe's budget — each of those means "no frame seam
|
|
83
|
-
* available", and the caller degrades to the legacy delegate path.
|
|
83
|
+
* available", and the caller degrades to the legacy delegate path. Parallels
|
|
84
84
|
* `deep-locator-candidates.ts`'s `resolveScanFrameTarget` exactly; duplicated
|
|
85
85
|
* (not imported) so this module stays a leaf that never depends on
|
|
86
86
|
* `deep-locator-candidates.ts`.
|
|
@@ -142,7 +142,7 @@ async function confirmBatchedWriteStuck(frameTarget, expression, expected) {
|
|
|
142
142
|
* available, the evaluate call rejects, or the resolved payload doesn't
|
|
143
143
|
* conform to {@link FrameCandidateWriteResult} — every one of those degrades
|
|
144
144
|
* the caller to the legacy delegate path instead of losing the write,
|
|
145
|
-
*
|
|
145
|
+
* paralleling `clickCandidateBatched`'s degrade contract
|
|
146
146
|
* (`deep-locator-candidates.ts`).
|
|
147
147
|
*/
|
|
148
148
|
async function actuateCandidateBatched(page, frameSelector, hopSelector, index, timeoutOptions, expression, actionLabel) {
|