@enricai/barnacle 1.0.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/LICENSE +21 -0
- package/README.md +958 -0
- package/dist/api/errors.d.ts +88 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +164 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/helpers/envelope.d.ts +13 -0
- package/dist/api/helpers/envelope.d.ts.map +1 -0
- package/dist/api/helpers/envelope.js +20 -0
- package/dist/api/helpers/envelope.js.map +1 -0
- package/dist/api/helpers/reply.d.ts +9 -0
- package/dist/api/helpers/reply.d.ts.map +1 -0
- package/dist/api/helpers/reply.js +14 -0
- package/dist/api/helpers/reply.js.map +1 -0
- package/dist/api/plugins/auth.d.ts +27 -0
- package/dist/api/plugins/auth.d.ts.map +1 -0
- package/dist/api/plugins/auth.js +111 -0
- package/dist/api/plugins/auth.js.map +1 -0
- package/dist/api/plugins/error-handler.d.ts +12 -0
- package/dist/api/plugins/error-handler.d.ts.map +1 -0
- package/dist/api/plugins/error-handler.js +72 -0
- package/dist/api/plugins/error-handler.js.map +1 -0
- package/dist/api/plugins/request-context.d.ts +17 -0
- package/dist/api/plugins/request-context.d.ts.map +1 -0
- package/dist/api/plugins/request-context.js +61 -0
- package/dist/api/plugins/request-context.js.map +1 -0
- package/dist/api/routes/health.d.ts +55 -0
- package/dist/api/routes/health.d.ts.map +1 -0
- package/dist/api/routes/health.js +137 -0
- package/dist/api/routes/health.js.map +1 -0
- package/dist/api/routes/plugins-introspection.d.ts +17 -0
- package/dist/api/routes/plugins-introspection.d.ts.map +1 -0
- package/dist/api/routes/plugins-introspection.js +13 -0
- package/dist/api/routes/plugins-introspection.js.map +1 -0
- package/dist/api/schemas/common.d.ts +114 -0
- package/dist/api/schemas/common.d.ts.map +1 -0
- package/dist/api/schemas/common.js +109 -0
- package/dist/api/schemas/common.js.map +1 -0
- package/dist/api/schemas/telemetry.d.ts +66 -0
- package/dist/api/schemas/telemetry.d.ts.map +1 -0
- package/dist/api/schemas/telemetry.js +52 -0
- package/dist/api/schemas/telemetry.js.map +1 -0
- package/dist/cache/keyed-ttl-cache.d.ts +45 -0
- package/dist/cache/keyed-ttl-cache.d.ts.map +1 -0
- package/dist/cache/keyed-ttl-cache.js +69 -0
- package/dist/cache/keyed-ttl-cache.js.map +1 -0
- package/dist/cache/response-cache.d.ts +37 -0
- package/dist/cache/response-cache.d.ts.map +1 -0
- package/dist/cache/response-cache.js +114 -0
- package/dist/cache/response-cache.js.map +1 -0
- package/dist/config.d.ts +258 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/lib/applicant-payload.d.ts +28 -0
- package/dist/lib/applicant-payload.d.ts.map +1 -0
- package/dist/lib/applicant-payload.js +20 -0
- package/dist/lib/applicant-payload.js.map +1 -0
- package/dist/lib/application-address.d.ts +16 -0
- package/dist/lib/application-address.d.ts.map +1 -0
- package/dist/lib/application-address.js +20 -0
- package/dist/lib/application-address.js.map +1 -0
- package/dist/lib/application-answers.d.ts +151 -0
- package/dist/lib/application-answers.d.ts.map +1 -0
- package/dist/lib/application-answers.js +95 -0
- package/dist/lib/application-answers.js.map +1 -0
- package/dist/lib/application-identity.d.ts +18 -0
- package/dist/lib/application-identity.d.ts.map +1 -0
- package/dist/lib/application-identity.js +20 -0
- package/dist/lib/application-identity.js.map +1 -0
- package/dist/lib/application-resume.d.ts +21 -0
- package/dist/lib/application-resume.d.ts.map +1 -0
- package/dist/lib/application-resume.js +23 -0
- package/dist/lib/application-resume.js.map +1 -0
- package/dist/lib/bedrock.d.ts +22 -0
- package/dist/lib/bedrock.d.ts.map +1 -0
- package/dist/lib/bedrock.js +35 -0
- package/dist/lib/bedrock.js.map +1 -0
- package/dist/lib/case-insensitive-headers.d.ts +15 -0
- package/dist/lib/case-insensitive-headers.d.ts.map +1 -0
- package/dist/lib/case-insensitive-headers.js +29 -0
- package/dist/lib/case-insensitive-headers.js.map +1 -0
- package/dist/lib/chromium-client-hints.d.ts +11 -0
- package/dist/lib/chromium-client-hints.d.ts.map +1 -0
- package/dist/lib/chromium-client-hints.js +17 -0
- package/dist/lib/chromium-client-hints.js.map +1 -0
- package/dist/lib/cookie-value.d.ts +8 -0
- package/dist/lib/cookie-value.d.ts.map +1 -0
- package/dist/lib/cookie-value.js +14 -0
- package/dist/lib/cookie-value.js.map +1 -0
- package/dist/lib/datadog.d.ts +8 -0
- package/dist/lib/datadog.d.ts.map +1 -0
- package/dist/lib/datadog.js +27 -0
- package/dist/lib/datadog.js.map +1 -0
- package/dist/lib/dd-metrics.d.ts +28 -0
- package/dist/lib/dd-metrics.d.ts.map +1 -0
- package/dist/lib/dd-metrics.js +62 -0
- package/dist/lib/dd-metrics.js.map +1 -0
- package/dist/lib/dispatch-metrics.d.ts +19 -0
- package/dist/lib/dispatch-metrics.d.ts.map +1 -0
- package/dist/lib/dispatch-metrics.js +65 -0
- package/dist/lib/dispatch-metrics.js.map +1 -0
- package/dist/lib/env.d.ts +37 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +70 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +20 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +7 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +14 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/job-tracking.d.ts +17 -0
- package/dist/lib/job-tracking.d.ts.map +1 -0
- package/dist/lib/job-tracking.js +19 -0
- package/dist/lib/job-tracking.js.map +1 -0
- package/dist/lib/llm/anthropic-client.d.ts +12 -0
- package/dist/lib/llm/anthropic-client.d.ts.map +1 -0
- package/dist/lib/llm/anthropic-client.js +23 -0
- package/dist/lib/llm/anthropic-client.js.map +1 -0
- package/dist/lib/llm/judge.d.ts +57 -0
- package/dist/lib/llm/judge.d.ts.map +1 -0
- package/dist/lib/llm/judge.js +123 -0
- package/dist/lib/llm/judge.js.map +1 -0
- package/dist/lib/llm/judges/error-messages.d.ts +38 -0
- package/dist/lib/llm/judges/error-messages.d.ts.map +1 -0
- package/dist/lib/llm/judges/error-messages.js +72 -0
- package/dist/lib/llm/judges/error-messages.js.map +1 -0
- package/dist/lib/llm/judges/invalid-fields.d.ts +43 -0
- package/dist/lib/llm/judges/invalid-fields.d.ts.map +1 -0
- package/dist/lib/llm/judges/invalid-fields.js +80 -0
- package/dist/lib/llm/judges/invalid-fields.js.map +1 -0
- package/dist/lib/llm/judges/modal-priority.d.ts +41 -0
- package/dist/lib/llm/judges/modal-priority.d.ts.map +1 -0
- package/dist/lib/llm/judges/modal-priority.js +74 -0
- package/dist/lib/llm/judges/modal-priority.js.map +1 -0
- package/dist/lib/llm/judges/select-option.d.ts +49 -0
- package/dist/lib/llm/judges/select-option.d.ts.map +1 -0
- package/dist/lib/llm/judges/select-option.js +90 -0
- package/dist/lib/llm/judges/select-option.js.map +1 -0
- package/dist/lib/llm/judges/verify-submit.d.ts +68 -0
- package/dist/lib/llm/judges/verify-submit.d.ts.map +1 -0
- package/dist/lib/llm/judges/verify-submit.js +89 -0
- package/dist/lib/llm/judges/verify-submit.js.map +1 -0
- package/dist/lib/llm/schemas.d.ts +220 -0
- package/dist/lib/llm/schemas.d.ts.map +1 -0
- package/dist/lib/llm/schemas.js +239 -0
- package/dist/lib/llm/schemas.js.map +1 -0
- package/dist/lib/logging.d.ts +39 -0
- package/dist/lib/logging.d.ts.map +1 -0
- package/dist/lib/logging.js +219 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/multipart.d.ts +34 -0
- package/dist/lib/multipart.d.ts.map +1 -0
- package/dist/lib/multipart.js +55 -0
- package/dist/lib/multipart.js.map +1 -0
- package/dist/lib/option-matcher.d.ts +15 -0
- package/dist/lib/option-matcher.d.ts.map +1 -0
- package/dist/lib/option-matcher.js +69 -0
- package/dist/lib/option-matcher.js.map +1 -0
- package/dist/lib/phone.d.ts +11 -0
- package/dist/lib/phone.d.ts.map +1 -0
- package/dist/lib/phone.js +17 -0
- package/dist/lib/phone.js.map +1 -0
- package/dist/lib/random.d.ts +22 -0
- package/dist/lib/random.d.ts.map +1 -0
- package/dist/lib/random.js +33 -0
- package/dist/lib/random.js.map +1 -0
- package/dist/lib/statsd.d.ts +11 -0
- package/dist/lib/statsd.d.ts.map +1 -0
- package/dist/lib/statsd.js +68 -0
- package/dist/lib/statsd.js.map +1 -0
- package/dist/lib/telemetry/call-capture.d.ts +89 -0
- package/dist/lib/telemetry/call-capture.d.ts.map +1 -0
- package/dist/lib/telemetry/call-capture.js +190 -0
- package/dist/lib/telemetry/call-capture.js.map +1 -0
- package/dist/lib/telemetry/call-types.d.ts +65 -0
- package/dist/lib/telemetry/call-types.d.ts.map +1 -0
- package/dist/lib/telemetry/call-types.js +68 -0
- package/dist/lib/telemetry/call-types.js.map +1 -0
- package/dist/lib/telemetry/run-state.d.ts +15 -0
- package/dist/lib/telemetry/run-state.d.ts.map +1 -0
- package/dist/lib/telemetry/run-state.js +23 -0
- package/dist/lib/telemetry/run-state.js.map +1 -0
- package/dist/lib/telemetry/s3-sink.d.ts +48 -0
- package/dist/lib/telemetry/s3-sink.d.ts.map +1 -0
- package/dist/lib/telemetry/s3-sink.js +229 -0
- package/dist/lib/telemetry/s3-sink.js.map +1 -0
- package/dist/lib/telemetry/submission-capture.d.ts +45 -0
- package/dist/lib/telemetry/submission-capture.d.ts.map +1 -0
- package/dist/lib/telemetry/submission-capture.js +57 -0
- package/dist/lib/telemetry/submission-capture.js.map +1 -0
- package/dist/lib/telemetry/telemetry-paths.d.ts +59 -0
- package/dist/lib/telemetry/telemetry-paths.d.ts.map +1 -0
- package/dist/lib/telemetry/telemetry-paths.js +103 -0
- package/dist/lib/telemetry/telemetry-paths.js.map +1 -0
- package/dist/lib/tracking-click.d.ts +20 -0
- package/dist/lib/tracking-click.d.ts.map +1 -0
- package/dist/lib/tracking-click.js +75 -0
- package/dist/lib/tracking-click.js.map +1 -0
- package/dist/lib/url-capture.d.ts +8 -0
- package/dist/lib/url-capture.d.ts.map +1 -0
- package/dist/lib/url-capture.js +17 -0
- package/dist/lib/url-capture.js.map +1 -0
- package/dist/lib/us-states.d.ts +20 -0
- package/dist/lib/us-states.d.ts.map +1 -0
- package/dist/lib/us-states.js +86 -0
- package/dist/lib/us-states.js.map +1 -0
- package/dist/lib/zod-multipart.d.ts +18 -0
- package/dist/lib/zod-multipart.d.ts.map +1 -0
- package/dist/lib/zod-multipart.js +35 -0
- package/dist/lib/zod-multipart.js.map +1 -0
- package/dist/plugins/config-plugin.d.ts +77 -0
- package/dist/plugins/config-plugin.d.ts.map +1 -0
- package/dist/plugins/config-plugin.js +216 -0
- package/dist/plugins/config-plugin.js.map +1 -0
- package/dist/plugins/discover.d.ts +72 -0
- package/dist/plugins/discover.d.ts.map +1 -0
- package/dist/plugins/discover.js +265 -0
- package/dist/plugins/discover.js.map +1 -0
- package/dist/plugins/json-schema-to-zod.d.ts +47 -0
- package/dist/plugins/json-schema-to-zod.d.ts.map +1 -0
- package/dist/plugins/json-schema-to-zod.js +85 -0
- package/dist/plugins/json-schema-to-zod.js.map +1 -0
- package/dist/plugins/loader.d.ts +34 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +348 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/plugin-api-version.d.ts +8 -0
- package/dist/plugins/plugin-api-version.d.ts.map +1 -0
- package/dist/plugins/plugin-api-version.js +11 -0
- package/dist/plugins/plugin-api-version.js.map +1 -0
- package/dist/plugins/plugin-manifest-envelope.d.ts +16 -0
- package/dist/plugins/plugin-manifest-envelope.d.ts.map +1 -0
- package/dist/plugins/plugin-manifest-envelope.js +19 -0
- package/dist/plugins/plugin-manifest-envelope.js.map +1 -0
- package/dist/scraper/behavioral-signals.d.ts +16 -0
- package/dist/scraper/behavioral-signals.d.ts.map +1 -0
- package/dist/scraper/behavioral-signals.js +30 -0
- package/dist/scraper/behavioral-signals.js.map +1 -0
- package/dist/scraper/errors.d.ts +193 -0
- package/dist/scraper/errors.d.ts.map +1 -0
- package/dist/scraper/errors.js +226 -0
- package/dist/scraper/errors.js.map +1 -0
- package/dist/scraper/fixtures.d.ts +23 -0
- package/dist/scraper/fixtures.d.ts.map +1 -0
- package/dist/scraper/fixtures.js +48 -0
- package/dist/scraper/fixtures.js.map +1 -0
- package/dist/scraper/flow-runner.d.ts +1319 -0
- package/dist/scraper/flow-runner.d.ts.map +1 -0
- package/dist/scraper/flow-runner.js +5637 -0
- package/dist/scraper/flow-runner.js.map +1 -0
- package/dist/scraper/graphql-client.d.ts +30 -0
- package/dist/scraper/graphql-client.d.ts.map +1 -0
- package/dist/scraper/graphql-client.js +14 -0
- package/dist/scraper/graphql-client.js.map +1 -0
- package/dist/scraper/http-client.d.ts +75 -0
- package/dist/scraper/http-client.d.ts.map +1 -0
- package/dist/scraper/http-client.js +189 -0
- package/dist/scraper/http-client.js.map +1 -0
- package/dist/scraper/http-status-classifier.d.ts +12 -0
- package/dist/scraper/http-status-classifier.d.ts.map +1 -0
- package/dist/scraper/http-status-classifier.js +29 -0
- package/dist/scraper/http-status-classifier.js.map +1 -0
- package/dist/scraper/metrics.d.ts +50 -0
- package/dist/scraper/metrics.d.ts.map +1 -0
- package/dist/scraper/metrics.js +85 -0
- package/dist/scraper/metrics.js.map +1 -0
- package/dist/scraper/navigate.d.ts +20 -0
- package/dist/scraper/navigate.d.ts.map +1 -0
- package/dist/scraper/navigate.js +30 -0
- package/dist/scraper/navigate.js.map +1 -0
- package/dist/scraper/oracle-sentinels.d.ts +22 -0
- package/dist/scraper/oracle-sentinels.d.ts.map +1 -0
- package/dist/scraper/oracle-sentinels.js +40 -0
- package/dist/scraper/oracle-sentinels.js.map +1 -0
- package/dist/scraper/parse-json-response.d.ts +16 -0
- package/dist/scraper/parse-json-response.d.ts.map +1 -0
- package/dist/scraper/parse-json-response.js +37 -0
- package/dist/scraper/parse-json-response.js.map +1 -0
- package/dist/scraper/pool.d.ts +37 -0
- package/dist/scraper/pool.d.ts.map +1 -0
- package/dist/scraper/pool.js +105 -0
- package/dist/scraper/pool.js.map +1 -0
- package/dist/scraper/rate-limited-json-client.d.ts +35 -0
- package/dist/scraper/rate-limited-json-client.d.ts.map +1 -0
- package/dist/scraper/rate-limited-json-client.js +29 -0
- package/dist/scraper/rate-limited-json-client.js.map +1 -0
- package/dist/scraper/raw-fetch.d.ts +49 -0
- package/dist/scraper/raw-fetch.d.ts.map +1 -0
- package/dist/scraper/raw-fetch.js +40 -0
- package/dist/scraper/raw-fetch.js.map +1 -0
- package/dist/scraper/require-response-field.d.ts +23 -0
- package/dist/scraper/require-response-field.d.ts.map +1 -0
- package/dist/scraper/require-response-field.js +42 -0
- package/dist/scraper/require-response-field.js.map +1 -0
- package/dist/scraper/retry.d.ts +33 -0
- package/dist/scraper/retry.d.ts.map +1 -0
- package/dist/scraper/retry.js +122 -0
- package/dist/scraper/retry.js.map +1 -0
- package/dist/scraper/session-browserbase.d.ts +35 -0
- package/dist/scraper/session-browserbase.d.ts.map +1 -0
- package/dist/scraper/session-browserbase.js +198 -0
- package/dist/scraper/session-browserbase.js.map +1 -0
- package/dist/scraper/session-shared.d.ts +29 -0
- package/dist/scraper/session-shared.d.ts.map +1 -0
- package/dist/scraper/session-shared.js +35 -0
- package/dist/scraper/session-shared.js.map +1 -0
- package/dist/scraper/session-steel.d.ts +31 -0
- package/dist/scraper/session-steel.d.ts.map +1 -0
- package/dist/scraper/session-steel.js +140 -0
- package/dist/scraper/session-steel.js.map +1 -0
- package/dist/scraper/session-warmup.d.ts +31 -0
- package/dist/scraper/session-warmup.d.ts.map +1 -0
- package/dist/scraper/session-warmup.js +46 -0
- package/dist/scraper/session-warmup.js.map +1 -0
- package/dist/scraper/session.d.ts +21 -0
- package/dist/scraper/session.d.ts.map +1 -0
- package/dist/scraper/session.js +28 -0
- package/dist/scraper/session.js.map +1 -0
- package/dist/scraper/stagehand-guard.d.ts +128 -0
- package/dist/scraper/stagehand-guard.d.ts.map +1 -0
- package/dist/scraper/stagehand-guard.js +337 -0
- package/dist/scraper/stagehand-guard.js.map +1 -0
- package/dist/scraper/throttle.d.ts +21 -0
- package/dist/scraper/throttle.d.ts.map +1 -0
- package/dist/scraper/throttle.js +45 -0
- package/dist/scraper/throttle.js.map +1 -0
- package/dist/scripts/hca-inbox-poll.d.ts +19 -0
- package/dist/scripts/hca-inbox-poll.d.ts.map +1 -0
- package/dist/scripts/hca-inbox-poll.js +151 -0
- package/dist/scripts/hca-inbox-poll.js.map +1 -0
- package/dist/scripts/judge-llm-batch.d.ts +98 -0
- package/dist/scripts/judge-llm-batch.d.ts.map +1 -0
- package/dist/scripts/judge-llm-batch.js +350 -0
- package/dist/scripts/judge-llm-batch.js.map +1 -0
- package/dist/scripts/llm-heal.d.ts +165 -0
- package/dist/scripts/llm-heal.d.ts.map +1 -0
- package/dist/scripts/llm-heal.js +595 -0
- package/dist/scripts/llm-heal.js.map +1 -0
- package/dist/scripts/migrate-telemetry-dir-names.d.ts +57 -0
- package/dist/scripts/migrate-telemetry-dir-names.d.ts.map +1 -0
- package/dist/scripts/migrate-telemetry-dir-names.js +156 -0
- package/dist/scripts/migrate-telemetry-dir-names.js.map +1 -0
- package/dist/scripts/probe-setinputfiles.d.ts +28 -0
- package/dist/scripts/probe-setinputfiles.d.ts.map +1 -0
- package/dist/scripts/probe-setinputfiles.js +95 -0
- package/dist/scripts/probe-setinputfiles.js.map +1 -0
- package/dist/scripts/recon-browser.d.ts +304 -0
- package/dist/scripts/recon-browser.d.ts.map +1 -0
- package/dist/scripts/recon-browser.js +1833 -0
- package/dist/scripts/recon-browser.js.map +1 -0
- package/dist/scripts/recon-generate.d.ts +182 -0
- package/dist/scripts/recon-generate.d.ts.map +1 -0
- package/dist/scripts/recon-generate.js +2572 -0
- package/dist/scripts/recon-generate.js.map +1 -0
- package/dist/scripts/recon-heal.d.ts +176 -0
- package/dist/scripts/recon-heal.d.ts.map +1 -0
- package/dist/scripts/recon-heal.js +584 -0
- package/dist/scripts/recon-heal.js.map +1 -0
- package/dist/scripts/recon-http.d.ts +19 -0
- package/dist/scripts/recon-http.d.ts.map +1 -0
- package/dist/scripts/recon-http.js +377 -0
- package/dist/scripts/recon-http.js.map +1 -0
- package/dist/scripts/recon-replay-jobs.d.ts +21 -0
- package/dist/scripts/recon-replay-jobs.d.ts.map +1 -0
- package/dist/scripts/recon-replay-jobs.js +221 -0
- package/dist/scripts/recon-replay-jobs.js.map +1 -0
- package/dist/scripts/recon-shared.d.ts +52 -0
- package/dist/scripts/recon-shared.d.ts.map +1 -0
- package/dist/scripts/recon-shared.js +68 -0
- package/dist/scripts/recon-shared.js.map +1 -0
- package/dist/scripts/recon-summarize.d.ts +15 -0
- package/dist/scripts/recon-summarize.d.ts.map +1 -0
- package/dist/scripts/recon-summarize.js +233 -0
- package/dist/scripts/recon-summarize.js.map +1 -0
- package/dist/scripts/smoke-test.d.ts +22 -0
- package/dist/scripts/smoke-test.d.ts.map +1 -0
- package/dist/scripts/smoke-test.js +236 -0
- package/dist/scripts/smoke-test.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +189 -0
- package/dist/server.js.map +1 -0
- package/dist/site-plugin.d.ts +226 -0
- package/dist/site-plugin.d.ts.map +1 -0
- package/dist/site-plugin.js +13 -0
- package/dist/site-plugin.js.map +1 -0
- package/dist/testing/answers-fixture.d.ts +13 -0
- package/dist/testing/answers-fixture.d.ts.map +1 -0
- package/dist/testing/answers-fixture.js +37 -0
- package/dist/testing/answers-fixture.js.map +1 -0
- package/dist/testing/batch-email-confirmation.d.ts +58 -0
- package/dist/testing/batch-email-confirmation.d.ts.map +1 -0
- package/dist/testing/batch-email-confirmation.js +62 -0
- package/dist/testing/batch-email-confirmation.js.map +1 -0
- package/dist/testing/batch-report.d.ts +33 -0
- package/dist/testing/batch-report.d.ts.map +1 -0
- package/dist/testing/batch-report.js +30 -0
- package/dist/testing/batch-report.js.map +1 -0
- package/dist/testing/contract-parity-suite.d.ts +55 -0
- package/dist/testing/contract-parity-suite.d.ts.map +1 -0
- package/dist/testing/contract-parity-suite.js +39 -0
- package/dist/testing/contract-parity-suite.js.map +1 -0
- package/dist/testing/coverage-guard-suite.d.ts +46 -0
- package/dist/testing/coverage-guard-suite.d.ts.map +1 -0
- package/dist/testing/coverage-guard-suite.js +39 -0
- package/dist/testing/coverage-guard-suite.js.map +1 -0
- package/dist/testing/fixtures/resume.pdf +54 -0
- package/dist/testing/integration-runner.d.ts +62 -0
- package/dist/testing/integration-runner.d.ts.map +1 -0
- package/dist/testing/integration-runner.js +46 -0
- package/dist/testing/integration-runner.js.map +1 -0
- package/dist/testing/mock-fetch-response.d.ts +7 -0
- package/dist/testing/mock-fetch-response.d.ts.map +1 -0
- package/dist/testing/mock-fetch-response.js +16 -0
- package/dist/testing/mock-fetch-response.js.map +1 -0
- package/dist/testing/persona-fixture.d.ts +77 -0
- package/dist/testing/persona-fixture.d.ts.map +1 -0
- package/dist/testing/persona-fixture.js +83 -0
- package/dist/testing/persona-fixture.js.map +1 -0
- package/dist/testing/replay-integration-suite.d.ts +50 -0
- package/dist/testing/replay-integration-suite.d.ts.map +1 -0
- package/dist/testing/replay-integration-suite.js +45 -0
- package/dist/testing/replay-integration-suite.js.map +1 -0
- package/dist/testing/resume-fixture.d.ts +39 -0
- package/dist/testing/resume-fixture.d.ts.map +1 -0
- package/dist/testing/resume-fixture.js +38 -0
- package/dist/testing/resume-fixture.js.map +1 -0
- package/dist/testmail/client.d.ts +61 -0
- package/dist/testmail/client.d.ts.map +1 -0
- package/dist/testmail/client.js +190 -0
- package/dist/testmail/client.js.map +1 -0
- package/dist/testmail/errors.d.ts +18 -0
- package/dist/testmail/errors.d.ts.map +1 -0
- package/dist/testmail/errors.js +29 -0
- package/dist/testmail/errors.js.map +1 -0
- package/dist/types/dispatch-metrics.d.ts +46 -0
- package/dist/types/dispatch-metrics.d.ts.map +1 -0
- package/dist/types/dispatch-metrics.js +25 -0
- package/dist/types/dispatch-metrics.js.map +1 -0
- package/dist/types/logging.d.ts +11 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/logging.js +3 -0
- package/dist/types/logging.js.map +1 -0
- package/package.json +283 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error hierarchy produced by the scraper. These are internal — they stay
|
|
3
|
+
* inside the scraper + service layer and are translated into API envelope
|
|
4
|
+
* errors (via src/api/errors.ts) before they reach the client.
|
|
5
|
+
*
|
|
6
|
+
* Why: each class encodes a distinct recovery policy that p-retry and the
|
|
7
|
+
* session pool key off of. Some failures abort the whole call (no retry
|
|
8
|
+
* can resolve them); others are retryable in place because a fresh AI
|
|
9
|
+
* resolution or DOM re-settle usually fixes them; some need a brand-new
|
|
10
|
+
* Steel session before retrying, in which case retry.ts invokes its
|
|
11
|
+
* onRestart callback. See each class's TSDoc for its specific policy
|
|
12
|
+
* and the diagnostic it represents.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Base class for all scraper-internal errors. Each subclass encodes a
|
|
16
|
+
* distinct recovery policy (retryable or not) that retry.ts and loader.ts
|
|
17
|
+
* key off of to decide whether to retry, restart the session, or abort.
|
|
18
|
+
*/
|
|
19
|
+
export declare abstract class ScraperError extends Error {
|
|
20
|
+
readonly retryable: boolean;
|
|
21
|
+
constructor(message: string, retryable: boolean);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The scraper encountered a CAPTCHA challenge Steel couldn't solve on our
|
|
25
|
+
* behalf. Propagate upstream as error code 2004.
|
|
26
|
+
*/
|
|
27
|
+
export declare class CaptchaError extends ScraperError {
|
|
28
|
+
constructor(message?: string);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The scrape completed but returned no data. This is not a failure — it's
|
|
32
|
+
* a legitimate empty result (e.g. a search returned zero matches). The
|
|
33
|
+
* service layer handles this without throwing.
|
|
34
|
+
*/
|
|
35
|
+
export declare class EmptyResultsError extends ScraperError {
|
|
36
|
+
constructor(message?: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stagehand failed to resolve a selector or an `act()` call. The most
|
|
40
|
+
* likely cause is that the cached action hash is stale because the target
|
|
41
|
+
* page's UI changed. Retries bust the cache and fall back to fresh AI inference.
|
|
42
|
+
*/
|
|
43
|
+
export declare class SelectorFailureError extends ScraperError {
|
|
44
|
+
constructor(message?: string);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The upstream Steel browser session timed out or closed unexpectedly.
|
|
48
|
+
* Needs a fresh session to retry — the session pool wrapper in retry.ts
|
|
49
|
+
* honors this by invoking its `onRestart` hook before re-running.
|
|
50
|
+
*/
|
|
51
|
+
export declare class SessionTimeoutError extends ScraperError {
|
|
52
|
+
constructor(message?: string);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Catch-all for unclassified scraper failures. Retryable by default so
|
|
56
|
+
* transient issues (DOM not settled, network blips) get a second chance.
|
|
57
|
+
*/
|
|
58
|
+
export declare class UnknownScraperError extends ScraperError {
|
|
59
|
+
constructor(message?: string);
|
|
60
|
+
}
|
|
61
|
+
/** Discriminator for {@link StepVerificationError}. See the class TSDoc for the per-variant semantics. */
|
|
62
|
+
export type StepVerificationErrorKind = "cascade-exhausted" | "probe-absent" | "backend-error-unrecoverable" | "replan-cycle-detected" | "wizard-regression";
|
|
63
|
+
/**
|
|
64
|
+
* Recon-only: a flow step in recon-browser.ts could not be acted on. Four
|
|
65
|
+
* variants per `kind`:
|
|
66
|
+
*
|
|
67
|
+
* - "cascade-exhausted": the full 4-attempt self-healing cascade ran and
|
|
68
|
+
* none of the attempts produced an observable effect. Expensive (the
|
|
69
|
+
* cascade burned its full LLM/observe budget) — counted against the
|
|
70
|
+
* cascade replan budget.
|
|
71
|
+
* - "probe-absent": the cheap page-state probe ran BEFORE the cascade
|
|
72
|
+
* and observed zero candidates for the step's instruction. We skip the
|
|
73
|
+
* cascade and ask for a replan immediately because the page state is
|
|
74
|
+
* clearly off (e.g. flow expected the form-fill page but the SPA is
|
|
75
|
+
* still on the resume-upload screen). Cheap (~1 observe + 1 LLM call)
|
|
76
|
+
* — counted against the probe replan budget.
|
|
77
|
+
* - "backend-error-unrecoverable": the cascade detected a same-window
|
|
78
|
+
* 5xx response from the configured submit endpoint. No amount of
|
|
79
|
+
* retry or replan can heal a server crash — the main flow loop
|
|
80
|
+
* special-cases this kind to bypass the replan dispatcher and
|
|
81
|
+
* propagate the error out, terminating the run with the diagnostic.
|
|
82
|
+
* - "replan-cycle-detected": the engine observed the replanner proposing
|
|
83
|
+
* the same multi-step instruction sequence under unchanged page state
|
|
84
|
+
* N times in a row (default 3). Further replans on this trajectory
|
|
85
|
+
* cannot converge — the main loop short-circuits to terminate the run
|
|
86
|
+
* instead of burning the remaining replan budget on a known fixed point.
|
|
87
|
+
* - "wizard-regression": a multi-page wizard navigated BACKWARD / restarted
|
|
88
|
+
* mid-flow (e.g. a mis-clicked control fired a save-and-restart, resetting
|
|
89
|
+
* the app to page 1). Detected via a configured restart-signal URL pattern
|
|
90
|
+
* in the recent captures (e.g. `init-apply` with `application_canceled`).
|
|
91
|
+
* The remaining flow steps now target a reset page, so continuing — or
|
|
92
|
+
* replanning against the restarted wizard — is futile. The main loop
|
|
93
|
+
* bypasses the replan dispatcher and propagates out, like
|
|
94
|
+
* backend-error-unrecoverable.
|
|
95
|
+
*
|
|
96
|
+
* Non-retryable — the runtime path never sees this.
|
|
97
|
+
*/
|
|
98
|
+
export declare class StepVerificationError extends ScraperError {
|
|
99
|
+
readonly kind: StepVerificationErrorKind;
|
|
100
|
+
constructor(message?: string, kind?: StepVerificationErrorKind);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The direct-HTTP hot path received a response that did not match the plugin's
|
|
104
|
+
* Zod response schema. Non-retryable on the hot path — the dispatch layer uses
|
|
105
|
+
* this as the trigger to fall back to the Stagehand browser path instead.
|
|
106
|
+
*/
|
|
107
|
+
export declare class HttpSchemaError extends ScraperError {
|
|
108
|
+
constructor(message?: string);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The direct-HTTP hot path received a non-2xx response that signals a bot
|
|
112
|
+
* challenge or auth wall (403, 401). Non-retryable — fall back to Stagehand.
|
|
113
|
+
*/
|
|
114
|
+
export declare class HttpBotChallengeError extends ScraperError {
|
|
115
|
+
constructor(message?: string);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The direct-HTTP hot path received a 5xx server error. Non-retryable on the
|
|
119
|
+
* hot path — dispatch uses this as a fallback trigger just like HttpSchemaError.
|
|
120
|
+
* Kept distinct from HttpBotChallengeError so metrics and logs can tell apart
|
|
121
|
+
* a target server outage from a bot-detection block.
|
|
122
|
+
*/
|
|
123
|
+
export declare class HttpServerError extends ScraperError {
|
|
124
|
+
constructor(message?: string);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The direct-HTTP hot path received a 429 rate-limit response. Non-retryable
|
|
128
|
+
* and NOT a fallback trigger — a 429 means the configured rps ceiling is too
|
|
129
|
+
* high; the right response is to back off and surface the metric, not burn a
|
|
130
|
+
* Steel browser session.
|
|
131
|
+
*/
|
|
132
|
+
export declare class HttpRateLimitError extends ScraperError {
|
|
133
|
+
constructor(message?: string);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Oracle HCM returned a plain-text `ORA_URL_LOCKED` sentinel body, meaning the
|
|
137
|
+
* requisition URL has been locked by Oracle after repeated requests. Non-retryable
|
|
138
|
+
* and NOT a browser-fallback trigger — the URL is locked at Oracle's end, so
|
|
139
|
+
* neither a retry of the identical HTTP request nor a fresh Stagehand browser
|
|
140
|
+
* session can succeed. The caller must back off and surface a "retry later"
|
|
141
|
+
* state rather than burning a Steel session. Kept distinct from HttpRateLimitError
|
|
142
|
+
* so metrics/logs (classifyDispatchError) can tell an Oracle requisition lock
|
|
143
|
+
* apart from a self-inflicted 429 rate limit.
|
|
144
|
+
*/
|
|
145
|
+
export declare class HttpUrlLockedError extends ScraperError {
|
|
146
|
+
constructor(message?: string);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Oracle HCM returned a plain-text `ORA_IRC_TOKEN_EXPIRED` sentinel body during
|
|
150
|
+
* a burst / rate-limit / token-expiry window. Retryable so pRetry keeps retrying,
|
|
151
|
+
* but kept distinct from the generic {@link UnknownScraperError} so the encompass
|
|
152
|
+
* http-flow can catch exactly this class and re-mint the AccessCode before
|
|
153
|
+
* retrying — replaying the same stale token would produce the same sentinel
|
|
154
|
+
* indefinitely. Distinct from {@link HttpUrlLockedError} which is terminal.
|
|
155
|
+
*/
|
|
156
|
+
export declare class OracleTokenExpiredError extends ScraperError {
|
|
157
|
+
constructor(message?: string);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Structured result returned (not thrown) by the hot path when it cannot
|
|
161
|
+
* complete the application because the user must supply additional data.
|
|
162
|
+
* Assignable as the `data` payload of a `SitePluginResult` so dispatch can
|
|
163
|
+
* detect it without instanceof checks on thrown errors.
|
|
164
|
+
*/
|
|
165
|
+
export type NeedsUserInfoResult = {
|
|
166
|
+
verified: false;
|
|
167
|
+
needsUserInfo: true;
|
|
168
|
+
missingFields: {
|
|
169
|
+
field: string;
|
|
170
|
+
question: string;
|
|
171
|
+
}[];
|
|
172
|
+
requiresOtp: boolean;
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* Thrown when code that translates stable semantic field keys (`address.city`,
|
|
176
|
+
* `firstName`, `applicantGender`) into tenant-specific GUIDs via a runtime
|
|
177
|
+
* form-map lookup cannot resolve one or more required keys.
|
|
178
|
+
*
|
|
179
|
+
* Use this in any future form-map / response-builder code so a missing field
|
|
180
|
+
* surfaces LOUDLY with an actionable error in the server log — instead of
|
|
181
|
+
* silently emitting an empty GUID and producing an HTTP 200 with missing data
|
|
182
|
+
* (which is how the StatusCode="unlocked" bug on 2026-06-04 hid for hours).
|
|
183
|
+
*
|
|
184
|
+
* Non-retryable — a missing key in the form definition is a configuration /
|
|
185
|
+
* tenant mismatch that retries won't fix; the dispatch layer should treat
|
|
186
|
+
* this as a hot-path failure and engage the browser fallback.
|
|
187
|
+
*/
|
|
188
|
+
export declare class MissingFormMapKeyError extends ScraperError {
|
|
189
|
+
readonly missingKeys: readonly string[];
|
|
190
|
+
readonly context: string;
|
|
191
|
+
constructor(missingKeys: readonly string[], context: string);
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +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;gBAEvB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;CAKhD;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,YAAY;gBAChC,OAAO,SAAkC;CAGtD;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,SAA+B;CAGnD;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,OAAO,SAA6B;CAGjD;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAA8B;CAGlD;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAA4B;CAGhD;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;gBAEvC,OAAO,SAA2D,EAClE,IAAI,GAAE,yBAA+C;CAKxD;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,SAAkC;CAGtD;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;gBACzC,OAAO,SAAwC;CAG5D;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,SAA0B;CAG9C;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,SAAiC;CAGrD;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,SAAmD;CAGvE;AAED;;;;;;;GAOG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;gBAC3C,OAAO,SAAiD;CAGrE;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;gBACb,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM;CAK5D"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error hierarchy produced by the scraper. These are internal — they stay
|
|
4
|
+
* inside the scraper + service layer and are translated into API envelope
|
|
5
|
+
* errors (via src/api/errors.ts) before they reach the client.
|
|
6
|
+
*
|
|
7
|
+
* Why: each class encodes a distinct recovery policy that p-retry and the
|
|
8
|
+
* session pool key off of. Some failures abort the whole call (no retry
|
|
9
|
+
* can resolve them); others are retryable in place because a fresh AI
|
|
10
|
+
* resolution or DOM re-settle usually fixes them; some need a brand-new
|
|
11
|
+
* Steel session before retrying, in which case retry.ts invokes its
|
|
12
|
+
* onRestart callback. See each class's TSDoc for its specific policy
|
|
13
|
+
* and the diagnostic it represents.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.MissingFormMapKeyError = exports.OracleTokenExpiredError = exports.HttpUrlLockedError = exports.HttpRateLimitError = exports.HttpServerError = exports.HttpBotChallengeError = exports.HttpSchemaError = exports.StepVerificationError = exports.UnknownScraperError = exports.SessionTimeoutError = exports.SelectorFailureError = exports.EmptyResultsError = exports.CaptchaError = exports.ScraperError = void 0;
|
|
17
|
+
/**
|
|
18
|
+
* Base class for all scraper-internal errors. Each subclass encodes a
|
|
19
|
+
* distinct recovery policy (retryable or not) that retry.ts and loader.ts
|
|
20
|
+
* key off of to decide whether to retry, restart the session, or abort.
|
|
21
|
+
*/
|
|
22
|
+
class ScraperError extends Error {
|
|
23
|
+
retryable;
|
|
24
|
+
constructor(message, retryable) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = new.target.name;
|
|
27
|
+
this.retryable = retryable;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.ScraperError = ScraperError;
|
|
31
|
+
/**
|
|
32
|
+
* The scraper encountered a CAPTCHA challenge Steel couldn't solve on our
|
|
33
|
+
* behalf. Propagate upstream as error code 2004.
|
|
34
|
+
*/
|
|
35
|
+
class CaptchaError extends ScraperError {
|
|
36
|
+
constructor(message = "captcha challenge encountered") {
|
|
37
|
+
super(message, false);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.CaptchaError = CaptchaError;
|
|
41
|
+
/**
|
|
42
|
+
* The scrape completed but returned no data. This is not a failure — it's
|
|
43
|
+
* a legitimate empty result (e.g. a search returned zero matches). The
|
|
44
|
+
* service layer handles this without throwing.
|
|
45
|
+
*/
|
|
46
|
+
class EmptyResultsError extends ScraperError {
|
|
47
|
+
constructor(message = "scrape returned no results") {
|
|
48
|
+
super(message, false);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.EmptyResultsError = EmptyResultsError;
|
|
52
|
+
/**
|
|
53
|
+
* Stagehand failed to resolve a selector or an `act()` call. The most
|
|
54
|
+
* likely cause is that the cached action hash is stale because the target
|
|
55
|
+
* page's UI changed. Retries bust the cache and fall back to fresh AI inference.
|
|
56
|
+
*/
|
|
57
|
+
class SelectorFailureError extends ScraperError {
|
|
58
|
+
constructor(message = "scraper selector failure") {
|
|
59
|
+
super(message, true);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.SelectorFailureError = SelectorFailureError;
|
|
63
|
+
/**
|
|
64
|
+
* The upstream Steel browser session timed out or closed unexpectedly.
|
|
65
|
+
* Needs a fresh session to retry — the session pool wrapper in retry.ts
|
|
66
|
+
* honors this by invoking its `onRestart` hook before re-running.
|
|
67
|
+
*/
|
|
68
|
+
class SessionTimeoutError extends ScraperError {
|
|
69
|
+
constructor(message = "scraper session timed out") {
|
|
70
|
+
super(message, true);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.SessionTimeoutError = SessionTimeoutError;
|
|
74
|
+
/**
|
|
75
|
+
* Catch-all for unclassified scraper failures. Retryable by default so
|
|
76
|
+
* transient issues (DOM not settled, network blips) get a second chance.
|
|
77
|
+
*/
|
|
78
|
+
class UnknownScraperError extends ScraperError {
|
|
79
|
+
constructor(message = "unknown scraper failure") {
|
|
80
|
+
super(message, true);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.UnknownScraperError = UnknownScraperError;
|
|
84
|
+
/**
|
|
85
|
+
* Recon-only: a flow step in recon-browser.ts could not be acted on. Four
|
|
86
|
+
* variants per `kind`:
|
|
87
|
+
*
|
|
88
|
+
* - "cascade-exhausted": the full 4-attempt self-healing cascade ran and
|
|
89
|
+
* none of the attempts produced an observable effect. Expensive (the
|
|
90
|
+
* cascade burned its full LLM/observe budget) — counted against the
|
|
91
|
+
* cascade replan budget.
|
|
92
|
+
* - "probe-absent": the cheap page-state probe ran BEFORE the cascade
|
|
93
|
+
* and observed zero candidates for the step's instruction. We skip the
|
|
94
|
+
* cascade and ask for a replan immediately because the page state is
|
|
95
|
+
* clearly off (e.g. flow expected the form-fill page but the SPA is
|
|
96
|
+
* still on the resume-upload screen). Cheap (~1 observe + 1 LLM call)
|
|
97
|
+
* — counted against the probe replan budget.
|
|
98
|
+
* - "backend-error-unrecoverable": the cascade detected a same-window
|
|
99
|
+
* 5xx response from the configured submit endpoint. No amount of
|
|
100
|
+
* retry or replan can heal a server crash — the main flow loop
|
|
101
|
+
* special-cases this kind to bypass the replan dispatcher and
|
|
102
|
+
* propagate the error out, terminating the run with the diagnostic.
|
|
103
|
+
* - "replan-cycle-detected": the engine observed the replanner proposing
|
|
104
|
+
* the same multi-step instruction sequence under unchanged page state
|
|
105
|
+
* N times in a row (default 3). Further replans on this trajectory
|
|
106
|
+
* cannot converge — the main loop short-circuits to terminate the run
|
|
107
|
+
* instead of burning the remaining replan budget on a known fixed point.
|
|
108
|
+
* - "wizard-regression": a multi-page wizard navigated BACKWARD / restarted
|
|
109
|
+
* mid-flow (e.g. a mis-clicked control fired a save-and-restart, resetting
|
|
110
|
+
* the app to page 1). Detected via a configured restart-signal URL pattern
|
|
111
|
+
* in the recent captures (e.g. `init-apply` with `application_canceled`).
|
|
112
|
+
* The remaining flow steps now target a reset page, so continuing — or
|
|
113
|
+
* replanning against the restarted wizard — is futile. The main loop
|
|
114
|
+
* bypasses the replan dispatcher and propagates out, like
|
|
115
|
+
* backend-error-unrecoverable.
|
|
116
|
+
*
|
|
117
|
+
* Non-retryable — the runtime path never sees this.
|
|
118
|
+
*/
|
|
119
|
+
class StepVerificationError extends ScraperError {
|
|
120
|
+
kind;
|
|
121
|
+
constructor(message = "recon step failed verification after all heal attempts", kind = "cascade-exhausted") {
|
|
122
|
+
super(message, false);
|
|
123
|
+
this.kind = kind;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.StepVerificationError = StepVerificationError;
|
|
127
|
+
/**
|
|
128
|
+
* The direct-HTTP hot path received a response that did not match the plugin's
|
|
129
|
+
* Zod response schema. Non-retryable on the hot path — the dispatch layer uses
|
|
130
|
+
* this as the trigger to fall back to the Stagehand browser path instead.
|
|
131
|
+
*/
|
|
132
|
+
class HttpSchemaError extends ScraperError {
|
|
133
|
+
constructor(message = "http response schema mismatch") {
|
|
134
|
+
super(message, false);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.HttpSchemaError = HttpSchemaError;
|
|
138
|
+
/**
|
|
139
|
+
* The direct-HTTP hot path received a non-2xx response that signals a bot
|
|
140
|
+
* challenge or auth wall (403, 401). Non-retryable — fall back to Stagehand.
|
|
141
|
+
*/
|
|
142
|
+
class HttpBotChallengeError extends ScraperError {
|
|
143
|
+
constructor(message = "http bot challenge or auth required") {
|
|
144
|
+
super(message, false);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.HttpBotChallengeError = HttpBotChallengeError;
|
|
148
|
+
/**
|
|
149
|
+
* The direct-HTTP hot path received a 5xx server error. Non-retryable on the
|
|
150
|
+
* hot path — dispatch uses this as a fallback trigger just like HttpSchemaError.
|
|
151
|
+
* Kept distinct from HttpBotChallengeError so metrics and logs can tell apart
|
|
152
|
+
* a target server outage from a bot-detection block.
|
|
153
|
+
*/
|
|
154
|
+
class HttpServerError extends ScraperError {
|
|
155
|
+
constructor(message = "http 5xx server error") {
|
|
156
|
+
super(message, false);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.HttpServerError = HttpServerError;
|
|
160
|
+
/**
|
|
161
|
+
* The direct-HTTP hot path received a 429 rate-limit response. Non-retryable
|
|
162
|
+
* and NOT a fallback trigger — a 429 means the configured rps ceiling is too
|
|
163
|
+
* high; the right response is to back off and surface the metric, not burn a
|
|
164
|
+
* Steel browser session.
|
|
165
|
+
*/
|
|
166
|
+
class HttpRateLimitError extends ScraperError {
|
|
167
|
+
constructor(message = "http 429 rate limit exceeded") {
|
|
168
|
+
super(message, false);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.HttpRateLimitError = HttpRateLimitError;
|
|
172
|
+
/**
|
|
173
|
+
* Oracle HCM returned a plain-text `ORA_URL_LOCKED` sentinel body, meaning the
|
|
174
|
+
* requisition URL has been locked by Oracle after repeated requests. Non-retryable
|
|
175
|
+
* and NOT a browser-fallback trigger — the URL is locked at Oracle's end, so
|
|
176
|
+
* neither a retry of the identical HTTP request nor a fresh Stagehand browser
|
|
177
|
+
* session can succeed. The caller must back off and surface a "retry later"
|
|
178
|
+
* state rather than burning a Steel session. Kept distinct from HttpRateLimitError
|
|
179
|
+
* so metrics/logs (classifyDispatchError) can tell an Oracle requisition lock
|
|
180
|
+
* apart from a self-inflicted 429 rate limit.
|
|
181
|
+
*/
|
|
182
|
+
class HttpUrlLockedError extends ScraperError {
|
|
183
|
+
constructor(message = "oracle requisition url locked (ORA_URL_LOCKED)") {
|
|
184
|
+
super(message, false);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.HttpUrlLockedError = HttpUrlLockedError;
|
|
188
|
+
/**
|
|
189
|
+
* Oracle HCM returned a plain-text `ORA_IRC_TOKEN_EXPIRED` sentinel body during
|
|
190
|
+
* a burst / rate-limit / token-expiry window. Retryable so pRetry keeps retrying,
|
|
191
|
+
* but kept distinct from the generic {@link UnknownScraperError} so the encompass
|
|
192
|
+
* http-flow can catch exactly this class and re-mint the AccessCode before
|
|
193
|
+
* retrying — replaying the same stale token would produce the same sentinel
|
|
194
|
+
* indefinitely. Distinct from {@link HttpUrlLockedError} which is terminal.
|
|
195
|
+
*/
|
|
196
|
+
class OracleTokenExpiredError extends ScraperError {
|
|
197
|
+
constructor(message = "oracle token expired (ORA_IRC_TOKEN_EXPIRED)") {
|
|
198
|
+
super(message, true);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.OracleTokenExpiredError = OracleTokenExpiredError;
|
|
202
|
+
/**
|
|
203
|
+
* Thrown when code that translates stable semantic field keys (`address.city`,
|
|
204
|
+
* `firstName`, `applicantGender`) into tenant-specific GUIDs via a runtime
|
|
205
|
+
* form-map lookup cannot resolve one or more required keys.
|
|
206
|
+
*
|
|
207
|
+
* Use this in any future form-map / response-builder code so a missing field
|
|
208
|
+
* surfaces LOUDLY with an actionable error in the server log — instead of
|
|
209
|
+
* silently emitting an empty GUID and producing an HTTP 200 with missing data
|
|
210
|
+
* (which is how the StatusCode="unlocked" bug on 2026-06-04 hid for hours).
|
|
211
|
+
*
|
|
212
|
+
* Non-retryable — a missing key in the form definition is a configuration /
|
|
213
|
+
* tenant mismatch that retries won't fix; the dispatch layer should treat
|
|
214
|
+
* this as a hot-path failure and engage the browser fallback.
|
|
215
|
+
*/
|
|
216
|
+
class MissingFormMapKeyError extends ScraperError {
|
|
217
|
+
missingKeys;
|
|
218
|
+
context;
|
|
219
|
+
constructor(missingKeys, context) {
|
|
220
|
+
super(`form-map missing required keys [${missingKeys.join(", ")}] in ${context}`, false);
|
|
221
|
+
this.missingKeys = missingKeys;
|
|
222
|
+
this.context = context;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.MissingFormMapKeyError = MissingFormMapKeyError;
|
|
226
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/scraper/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime helper for loading committed static JSON fixtures captured during
|
|
3
|
+
* the recon playbook (Step 3B — auxiliary endpoints). Use this instead of
|
|
4
|
+
* re-fetching static reference data (markets, currencies, labels, etc.) on
|
|
5
|
+
* every production call — these fixtures are cheap memory reads and should
|
|
6
|
+
* be re-generated by re-running recon when drift is detected.
|
|
7
|
+
*/
|
|
8
|
+
import type { z } from "zod/v4";
|
|
9
|
+
/**
|
|
10
|
+
* Loads a committed JSON fixture from the `sites/<siteId>/fixtures/<filename>`
|
|
11
|
+
* directory alongside the running module and validates it with the provided Zod
|
|
12
|
+
* schema. Throws on missing file or schema mismatch — both indicate the fixture
|
|
13
|
+
* is stale and recon needs re-running.
|
|
14
|
+
*
|
|
15
|
+
* Path is resolved relative to `__dirname` so it works in both environments:
|
|
16
|
+
* - Dev (`tsx src/scraper/fixtures.ts`): `__dirname` = `src/scraper/`,
|
|
17
|
+
* resolves to `src/sites/<id>/fixtures/<filename>`.
|
|
18
|
+
* - Prod (`node dist/scraper/fixtures.js`): `__dirname` = `dist/scraper/`,
|
|
19
|
+
* resolves to `dist/sites/<id>/fixtures/<filename>` — which `pnpm run build`
|
|
20
|
+
* populates by copying `src/sites/` to `dist/sites/`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadFixture<T>(siteId: string, filename: string, schema: z.ZodType<T>): T;
|
|
23
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/scraper/fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CA0BxF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Runtime helper for loading committed static JSON fixtures captured during
|
|
4
|
+
* the recon playbook (Step 3B — auxiliary endpoints). Use this instead of
|
|
5
|
+
* re-fetching static reference data (markets, currencies, labels, etc.) on
|
|
6
|
+
* every production call — these fixtures are cheap memory reads and should
|
|
7
|
+
* be re-generated by re-running recon when drift is detected.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.loadFixture = loadFixture;
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
/**
|
|
14
|
+
* Loads a committed JSON fixture from the `sites/<siteId>/fixtures/<filename>`
|
|
15
|
+
* directory alongside the running module and validates it with the provided Zod
|
|
16
|
+
* schema. Throws on missing file or schema mismatch — both indicate the fixture
|
|
17
|
+
* is stale and recon needs re-running.
|
|
18
|
+
*
|
|
19
|
+
* Path is resolved relative to `__dirname` so it works in both environments:
|
|
20
|
+
* - Dev (`tsx src/scraper/fixtures.ts`): `__dirname` = `src/scraper/`,
|
|
21
|
+
* resolves to `src/sites/<id>/fixtures/<filename>`.
|
|
22
|
+
* - Prod (`node dist/scraper/fixtures.js`): `__dirname` = `dist/scraper/`,
|
|
23
|
+
* resolves to `dist/sites/<id>/fixtures/<filename>` — which `pnpm run build`
|
|
24
|
+
* populates by copying `src/sites/` to `dist/sites/`.
|
|
25
|
+
*/
|
|
26
|
+
function loadFixture(siteId, filename, schema) {
|
|
27
|
+
const fixturePath = (0, node_path_1.resolve)(__dirname, "..", "sites", siteId, "fixtures", filename);
|
|
28
|
+
let raw;
|
|
29
|
+
try {
|
|
30
|
+
raw = (0, node_fs_1.readFileSync)(fixturePath, "utf8");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw new Error(`fixture not found: ${fixturePath} — run recon-http.ts and commit the output to src/sites/${siteId}/fixtures/${filename}`);
|
|
34
|
+
}
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
throw new Error(`fixture is not valid JSON: ${fixturePath}`);
|
|
41
|
+
}
|
|
42
|
+
const result = schema.safeParse(parsed);
|
|
43
|
+
if (!result.success) {
|
|
44
|
+
throw new Error(`fixture schema mismatch: ${fixturePath} — re-run recon-http.ts to refresh. Issues: ${JSON.stringify(result.error.issues)}`);
|
|
45
|
+
}
|
|
46
|
+
return result.data;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../src/scraper/fixtures.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAoBH,kCA0BC;AA5CD,qCAAuC;AACvC,yCAAoC;AAIpC;;;;;;;;;;;;GAYG;AACH,SAAgB,WAAW,CAAI,MAAc,EAAE,QAAgB,EAAE,MAAoB;IACnF,MAAM,WAAW,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAA,sBAAY,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sBAAsB,WAAW,2DAA2D,MAAM,aAAa,QAAQ,EAAE,CAC1H,CAAC;IACJ,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,4BAA4B,WAAW,+CAA+C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAC5H,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|