@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,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTimeoutFetch = createTimeoutFetch;
|
|
4
|
+
exports.pickRandomViewport = pickRandomViewport;
|
|
5
|
+
const random_1 = require("../lib/random");
|
|
6
|
+
/**
|
|
7
|
+
* Returns a fetch wrapper that aborts after `timeoutMs` milliseconds.
|
|
8
|
+
* Handles the total request timeout for Anthropic API calls; the TCP connect
|
|
9
|
+
* timeout is handled separately via setGlobalDispatcher in server.ts.
|
|
10
|
+
*/
|
|
11
|
+
function createTimeoutFetch(timeoutMs) {
|
|
12
|
+
return (url, init) => {
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
15
|
+
// Merge with any existing signal from the caller (e.g. AI SDK's own abort signal)
|
|
16
|
+
// so both can independently cancel the request.
|
|
17
|
+
const signals = [controller.signal, init?.signal].filter((s) => s instanceof AbortSignal);
|
|
18
|
+
const signal = signals.length > 1 ? AbortSignal.any(signals) : signals[0];
|
|
19
|
+
return fetch(url, { ...init, signal }).finally(() => clearTimeout(timer));
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Common desktop viewports rotated per session to reduce bot-detection
|
|
24
|
+
* fingerprinting — a fixed pixel size is an easy signal to filter on.
|
|
25
|
+
*/
|
|
26
|
+
const VIEWPORTS = [
|
|
27
|
+
{ width: 1280, height: 720 },
|
|
28
|
+
{ width: 1366, height: 768 },
|
|
29
|
+
{ width: 1440, height: 900 },
|
|
30
|
+
{ width: 1920, height: 1080 },
|
|
31
|
+
];
|
|
32
|
+
function pickRandomViewport() {
|
|
33
|
+
return (0, random_1.pickRandom)(VIEWPORTS);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=session-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-shared.js","sourceRoot":"","sources":["../../src/scraper/session-shared.ts"],"names":[],"mappings":";;AA4BA,gDAYC;AAaD,gDAEC;AApDD,yCAA0C;AAoB1C;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,SAAiB;IAClD,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAC9D,kFAAkF;QAClF,gDAAgD;QAChD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CACtD,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,YAAY,WAAW,CAClD,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,SAAS,GAAG;IAChB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACrB,CAAC;AAEX,SAAgB,kBAAkB;IAChC,OAAO,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type BrowserSession } from "../scraper/session-shared";
|
|
2
|
+
/**
|
|
3
|
+
* Spins up one Steel cloud browser session with residential proxies +
|
|
4
|
+
* the configured Stagehand LLM, connected via Steel's CDP endpoint.
|
|
5
|
+
*
|
|
6
|
+
* Why residential proxies: many target sites are more reliably reachable
|
|
7
|
+
* from residential IPs; datacenter ranges are commonly flagged.
|
|
8
|
+
*
|
|
9
|
+
* Why serverCache=true: Stagehand's server-side cache skips LLM inference on
|
|
10
|
+
* replay. After the first run against a page structure, subsequent `act()`
|
|
11
|
+
* calls complete in milliseconds. When the target page UI changes and a cached
|
|
12
|
+
* action fails, retry.ts wraps the next attempt — that's our recovery layer.
|
|
13
|
+
*
|
|
14
|
+
* Why selfHeal=false: Stagehand's built-in self-heal only fires on Playwright
|
|
15
|
+
* throws (element-not-found / intercepted / timeout). It does NOT catch the
|
|
16
|
+
* silent-semantic-miss case ("clicked the wrong thing, returned success"), it
|
|
17
|
+
* has open variable-loss / cache-write bugs on `main`, and the docs themselves
|
|
18
|
+
* default it off and steer production users toward observe → act. Recon-browser
|
|
19
|
+
* owns its own verify-and-retry cascade; the runtime path uses retry.ts. Keeping
|
|
20
|
+
* this off makes failure semantics clean — `act()` throws or succeeds, and our
|
|
21
|
+
* code decides what to do next.
|
|
22
|
+
*
|
|
23
|
+
* Why `env: "LOCAL"`: Steel sessions connect via a CDP URL, not Stagehand's
|
|
24
|
+
* first-party Browserbase integration. This means several Stagehand code paths
|
|
25
|
+
* gated on `env === "BROWSERBASE"` (file upload payload injection, tuned CDP
|
|
26
|
+
* timeouts, session recovery, event-window timing) stay inactive — accept this
|
|
27
|
+
* trade-off as the cost of Steel support. Switch to the Browserbase provider
|
|
28
|
+
* to activate those paths.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSteelBrowserSession(): Promise<BrowserSession>;
|
|
31
|
+
//# sourceMappingURL=session-steel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-steel.d.ts","sourceRoot":"","sources":["../../src/scraper/session-steel.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,0BAA0B,CAAC;AAKlC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,cAAc,CAAC,CAsGzE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createSteelBrowserSession = createSteelBrowserSession;
|
|
7
|
+
const stagehand_1 = require("@browserbasehq/stagehand");
|
|
8
|
+
const steel_sdk_1 = __importDefault(require("steel-sdk"));
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const bedrock_1 = require("../lib/bedrock");
|
|
11
|
+
const errors_1 = require("../lib/errors");
|
|
12
|
+
const logging_1 = require("../lib/logging");
|
|
13
|
+
const session_shared_1 = require("../scraper/session-shared");
|
|
14
|
+
const throttle_1 = require("../scraper/throttle");
|
|
15
|
+
const logger = (0, logging_1.getLogger)({ name: "scraper/session-steel" });
|
|
16
|
+
/**
|
|
17
|
+
* Spins up one Steel cloud browser session with residential proxies +
|
|
18
|
+
* the configured Stagehand LLM, connected via Steel's CDP endpoint.
|
|
19
|
+
*
|
|
20
|
+
* Why residential proxies: many target sites are more reliably reachable
|
|
21
|
+
* from residential IPs; datacenter ranges are commonly flagged.
|
|
22
|
+
*
|
|
23
|
+
* Why serverCache=true: Stagehand's server-side cache skips LLM inference on
|
|
24
|
+
* replay. After the first run against a page structure, subsequent `act()`
|
|
25
|
+
* calls complete in milliseconds. When the target page UI changes and a cached
|
|
26
|
+
* action fails, retry.ts wraps the next attempt — that's our recovery layer.
|
|
27
|
+
*
|
|
28
|
+
* Why selfHeal=false: Stagehand's built-in self-heal only fires on Playwright
|
|
29
|
+
* throws (element-not-found / intercepted / timeout). It does NOT catch the
|
|
30
|
+
* silent-semantic-miss case ("clicked the wrong thing, returned success"), it
|
|
31
|
+
* has open variable-loss / cache-write bugs on `main`, and the docs themselves
|
|
32
|
+
* default it off and steer production users toward observe → act. Recon-browser
|
|
33
|
+
* owns its own verify-and-retry cascade; the runtime path uses retry.ts. Keeping
|
|
34
|
+
* this off makes failure semantics clean — `act()` throws or succeeds, and our
|
|
35
|
+
* code decides what to do next.
|
|
36
|
+
*
|
|
37
|
+
* Why `env: "LOCAL"`: Steel sessions connect via a CDP URL, not Stagehand's
|
|
38
|
+
* first-party Browserbase integration. This means several Stagehand code paths
|
|
39
|
+
* gated on `env === "BROWSERBASE"` (file upload payload injection, tuned CDP
|
|
40
|
+
* timeouts, session recovery, event-window timing) stay inactive — accept this
|
|
41
|
+
* trade-off as the cost of Steel support. Switch to the Browserbase provider
|
|
42
|
+
* to activate those paths.
|
|
43
|
+
*/
|
|
44
|
+
async function createSteelBrowserSession() {
|
|
45
|
+
if (!config_1.config.scraper.steelApiKey) {
|
|
46
|
+
throw new Error("STEEL_API_KEY is required for the steel provider");
|
|
47
|
+
}
|
|
48
|
+
if (!config_1.config.scraper.useBedrock && !config_1.config.scraper.anthropicApiKey) {
|
|
49
|
+
throw new Error("ANTHROPIC_API_KEY is required for the Stagehand LLM client");
|
|
50
|
+
}
|
|
51
|
+
const steel = new steel_sdk_1.default({ steelAPIKey: config_1.config.scraper.steelApiKey });
|
|
52
|
+
const viewport = (0, session_shared_1.pickRandomViewport)();
|
|
53
|
+
const session = await steel.sessions.create({
|
|
54
|
+
timeout: config_1.config.scraper.steelSessionTimeoutMs,
|
|
55
|
+
// Lowercase the env value so SCRAPER_PROXY_TYPE="Residential" /
|
|
56
|
+
// "RESIDENTIAL" don't silently turn the proxy off.
|
|
57
|
+
useProxy: config_1.config.scraper.proxyType.toLowerCase() === "residential",
|
|
58
|
+
solveCaptcha: config_1.config.scraper.solveCaptcha,
|
|
59
|
+
dimensions: viewport,
|
|
60
|
+
});
|
|
61
|
+
// Once `sessions.create` resolves, Steel is billing for the remote session.
|
|
62
|
+
// Any failure between here and a successful return must release the session
|
|
63
|
+
// explicitly — otherwise a Stagehand init crash or Stagehand CDP connection
|
|
64
|
+
// failure leaves a live session burning minutes until Steel's own timeout.
|
|
65
|
+
let stagehand;
|
|
66
|
+
try {
|
|
67
|
+
// Steel's websocketUrl is `wss://connect.steel.dev?sessionId=…`. Stagehand's
|
|
68
|
+
// V3 CDP connector requires the apiKey as a query parameter too — without it
|
|
69
|
+
// the connection returns a 502 before the CDP handshake completes.
|
|
70
|
+
const cdpUrl = session.websocketUrl.includes("apiKey=")
|
|
71
|
+
? session.websocketUrl
|
|
72
|
+
: `${session.websocketUrl}&apiKey=${encodeURIComponent(config_1.config.scraper.steelApiKey)}`;
|
|
73
|
+
logger.info(`created steel session ${session.id} viewport=${viewport.width}x${viewport.height}`);
|
|
74
|
+
if (config_1.config.scraper.useBedrock) {
|
|
75
|
+
logger.info(`using bedrock model ${config_1.config.bedrock.model} in region ${config_1.config.bedrock.region}`);
|
|
76
|
+
}
|
|
77
|
+
const llmClient = config_1.config.scraper.useBedrock
|
|
78
|
+
? new stagehand_1.AISdkClient({ model: (0, bedrock_1.createBedrockModel)(config_1.config.bedrock) })
|
|
79
|
+
: undefined;
|
|
80
|
+
stagehand = new stagehand_1.Stagehand({
|
|
81
|
+
env: "LOCAL",
|
|
82
|
+
model: config_1.config.scraper.useBedrock
|
|
83
|
+
? undefined
|
|
84
|
+
: {
|
|
85
|
+
modelName: config_1.config.scraper.model,
|
|
86
|
+
apiKey: config_1.config.scraper.anthropicApiKey,
|
|
87
|
+
// @ai-sdk/anthropic has no `timeout` option; inject timeout at the fetch layer.
|
|
88
|
+
fetch: (0, session_shared_1.createTimeoutFetch)(config_1.config.scraper.anthropicTimeoutMs),
|
|
89
|
+
},
|
|
90
|
+
llmClient,
|
|
91
|
+
serverCache: true,
|
|
92
|
+
selfHeal: false,
|
|
93
|
+
localBrowserLaunchOptions: { cdpUrl },
|
|
94
|
+
verbose: 0,
|
|
95
|
+
});
|
|
96
|
+
await stagehand.init();
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
// Best-effort cleanup; swallow secondary failures so the original
|
|
100
|
+
// error surfaces to the caller.
|
|
101
|
+
try {
|
|
102
|
+
if (stagehand)
|
|
103
|
+
await stagehand.close();
|
|
104
|
+
}
|
|
105
|
+
catch (closeErr) {
|
|
106
|
+
logger.warn(`stagehand close during failed init: ${(0, errors_1.toErrorMessage)(closeErr)}`);
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
await steel.sessions.release(session.id);
|
|
110
|
+
}
|
|
111
|
+
catch (releaseErr) {
|
|
112
|
+
logger.warn(`steel release during failed init for ${session.id}: ${(0, errors_1.toErrorMessage)(releaseErr)}`);
|
|
113
|
+
}
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
const limiter = (0, throttle_1.createSessionLimiter)();
|
|
117
|
+
const close = async () => {
|
|
118
|
+
try {
|
|
119
|
+
await stagehand.close();
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
logger.warn(`stagehand close failed for session ${session.id}: ${(0, errors_1.toErrorMessage)(err)}`);
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
await steel.sessions.release(session.id);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
logger.warn(`steel release failed for session ${session.id}: ${(0, errors_1.toErrorMessage)(err)}`);
|
|
129
|
+
}
|
|
130
|
+
await limiter.stop({ dropWaitingJobs: true });
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
stagehand,
|
|
134
|
+
limiter,
|
|
135
|
+
sessionId: session.id,
|
|
136
|
+
provider: "steel",
|
|
137
|
+
close,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=session-steel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-steel.js","sourceRoot":"","sources":["../../src/scraper/session-steel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic retrying browser-session runner. Acquires a fresh session from
|
|
3
|
+
* `sessionFactory`, runs `callback(session)`, guarantees `session.close()` in
|
|
4
|
+
* every code path, and retries up to `retryOptions.retries + 1` attempts with
|
|
5
|
+
* the caller-supplied pRetry options. On exhaustion, wraps the last error in
|
|
6
|
+
* the caller-supplied `exhaustionError`.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from appcast/tokens/warmup.ts so any future recon→generate warmup
|
|
9
|
+
* flow can reuse the session-lifecycle shell without re-hand-rolling pRetry +
|
|
10
|
+
* finally-close + error-mapping each time.
|
|
11
|
+
*/
|
|
12
|
+
import { type Options as PRetryOptions } from "p-retry";
|
|
13
|
+
import type { BrowserSession } from "../scraper/session-shared";
|
|
14
|
+
export interface SessionWarmupOptions {
|
|
15
|
+
/** pRetry options forwarded verbatim. The caller controls retries, timeouts, and onFailedAttempt. */
|
|
16
|
+
retryOptions: PRetryOptions;
|
|
17
|
+
/**
|
|
18
|
+
* Invoked with the last-thrown error when all attempts are exhausted. Return
|
|
19
|
+
* the error that `withBrowserSession` should throw (typically a domain-specific
|
|
20
|
+
* error type the caller's dispatch layer understands).
|
|
21
|
+
*/
|
|
22
|
+
mapExhaustionError: (err: unknown) => Error;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Runs `callback` inside a fresh browser session on every attempt. Guarantees
|
|
26
|
+
* that `session.close()` is called regardless of whether the callback succeeds
|
|
27
|
+
* or throws. On exhaustion, calls `opts.mapExhaustionError` with the last pRetry
|
|
28
|
+
* error and throws whatever it returns.
|
|
29
|
+
*/
|
|
30
|
+
export declare function withBrowserSession<T>(sessionFactory: () => Promise<BrowserSession>, callback: (session: BrowserSession, attemptNumber: number) => Promise<T>, opts: SessionWarmupOptions): Promise<T>;
|
|
31
|
+
//# sourceMappingURL=session-warmup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-warmup.d.ts","sourceRoot":"","sources":["../../src/scraper/session-warmup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAe,EAAE,KAAK,OAAO,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAIhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI/D,MAAM,WAAW,oBAAoB;IACnC,qGAAqG;IACrG,YAAY,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,KAAK,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,cAAc,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,EAC7C,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACxE,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Generic retrying browser-session runner. Acquires a fresh session from
|
|
4
|
+
* `sessionFactory`, runs `callback(session)`, guarantees `session.close()` in
|
|
5
|
+
* every code path, and retries up to `retryOptions.retries + 1` attempts with
|
|
6
|
+
* the caller-supplied pRetry options. On exhaustion, wraps the last error in
|
|
7
|
+
* the caller-supplied `exhaustionError`.
|
|
8
|
+
*
|
|
9
|
+
* Extracted from appcast/tokens/warmup.ts so any future recon→generate warmup
|
|
10
|
+
* flow can reuse the session-lifecycle shell without re-hand-rolling pRetry +
|
|
11
|
+
* finally-close + error-mapping each time.
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.withBrowserSession = withBrowserSession;
|
|
18
|
+
const p_retry_1 = __importDefault(require("p-retry"));
|
|
19
|
+
const errors_1 = require("../lib/errors");
|
|
20
|
+
const logging_1 = require("../lib/logging");
|
|
21
|
+
const logger = (0, logging_1.getLogger)({ name: "scraper/session-warmup" });
|
|
22
|
+
/**
|
|
23
|
+
* Runs `callback` inside a fresh browser session on every attempt. Guarantees
|
|
24
|
+
* that `session.close()` is called regardless of whether the callback succeeds
|
|
25
|
+
* or throws. On exhaustion, calls `opts.mapExhaustionError` with the last pRetry
|
|
26
|
+
* error and throws whatever it returns.
|
|
27
|
+
*/
|
|
28
|
+
async function withBrowserSession(sessionFactory, callback, opts) {
|
|
29
|
+
try {
|
|
30
|
+
return await (0, p_retry_1.default)(async (attemptNumber) => {
|
|
31
|
+
const session = await sessionFactory();
|
|
32
|
+
try {
|
|
33
|
+
return await callback(session, attemptNumber);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await session.close().catch((closeErr) => {
|
|
37
|
+
logger.warn(`session-warmup: close failed for ${session.sessionId}: ${(0, errors_1.toErrorMessage)(closeErr)}`);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}, opts.retryOptions);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw opts.mapExhaustionError(err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=session-warmup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-warmup.js","sourceRoot":"","sources":["../../src/scraper/session-warmup.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AA2BH,gDAqBC;AA9CD,sDAAgE;AAEhE,yCAA8C;AAC9C,2CAA0C;AAG1C,MAAM,MAAM,GAAG,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC;AAa7D;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CACtC,cAA6C,EAC7C,QAAwE,EACxE,IAA0B;IAE1B,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,iBAAM,EAAC,KAAK,EAAE,aAAa,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAChD,CAAC;oBAAS,CAAC;gBACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvC,MAAM,CAAC,IAAI,CACT,oCAAoC,OAAO,CAAC,SAAS,KAAK,IAAA,uBAAc,EAAC,QAAQ,CAAC,EAAE,CACrF,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BrowserSession, ProviderName } from "../scraper/session-shared";
|
|
2
|
+
export type { BrowserSession, ProviderName } from "../scraper/session-shared";
|
|
3
|
+
/**
|
|
4
|
+
* Spins up one browser session via the configured provider. Browserbase is the
|
|
5
|
+
* default; Steel is an opt-in fallback.
|
|
6
|
+
*
|
|
7
|
+
* Provider selection (in order of precedence):
|
|
8
|
+
* 1. Explicit `opts.provider` (per-call override; CLI flags forward here)
|
|
9
|
+
* 2. `SCRAPER_PROVIDER` env var resolved at module load into `config.scraper.provider`
|
|
10
|
+
* 3. Hardcoded default ("browserbase")
|
|
11
|
+
*
|
|
12
|
+
* `advancedStealth` opts into Browserbase's Scale Plan stealth profile (uses a
|
|
13
|
+
* stronger fingerprint mitigation pipeline + forces a Windows desktop
|
|
14
|
+
* fingerprint per Browserbase's DataDome guidance). No-op when the provider
|
|
15
|
+
* is Steel — that path uses its own stealth defaults.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createBrowserSession(opts?: {
|
|
18
|
+
provider?: ProviderName;
|
|
19
|
+
advancedStealth?: boolean;
|
|
20
|
+
}): Promise<BrowserSession>;
|
|
21
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/scraper/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7E,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7E;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAChD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAM1B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBrowserSession = createBrowserSession;
|
|
4
|
+
const config_1 = require("../config");
|
|
5
|
+
const session_browserbase_1 = require("../scraper/session-browserbase");
|
|
6
|
+
const session_steel_1 = require("../scraper/session-steel");
|
|
7
|
+
/**
|
|
8
|
+
* Spins up one browser session via the configured provider. Browserbase is the
|
|
9
|
+
* default; Steel is an opt-in fallback.
|
|
10
|
+
*
|
|
11
|
+
* Provider selection (in order of precedence):
|
|
12
|
+
* 1. Explicit `opts.provider` (per-call override; CLI flags forward here)
|
|
13
|
+
* 2. `SCRAPER_PROVIDER` env var resolved at module load into `config.scraper.provider`
|
|
14
|
+
* 3. Hardcoded default ("browserbase")
|
|
15
|
+
*
|
|
16
|
+
* `advancedStealth` opts into Browserbase's Scale Plan stealth profile (uses a
|
|
17
|
+
* stronger fingerprint mitigation pipeline + forces a Windows desktop
|
|
18
|
+
* fingerprint per Browserbase's DataDome guidance). No-op when the provider
|
|
19
|
+
* is Steel — that path uses its own stealth defaults.
|
|
20
|
+
*/
|
|
21
|
+
async function createBrowserSession(opts) {
|
|
22
|
+
const provider = opts?.provider ?? config_1.config.scraper.provider;
|
|
23
|
+
if (provider === "browserbase") {
|
|
24
|
+
return (0, session_browserbase_1.createBrowserbaseBrowserSession)({ advancedStealth: opts?.advancedStealth });
|
|
25
|
+
}
|
|
26
|
+
return (0, session_steel_1.createSteelBrowserSession)();
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/scraper/session.ts"],"names":[],"mappings":";;AAqBA,oDASC;AA9BD,qCAAkC;AAClC,uEAAgF;AAEhF,2DAAoE;AAIpE;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,oBAAoB,CAAC,IAG1C;IACC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,eAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC3D,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,IAAA,qDAA+B,EAAC,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,IAAA,yCAAyB,GAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-enforcing wrappers around Stagehand's `act`, `observe`, and
|
|
3
|
+
* `extract`. Every Stagehand SDK call in the codebase routes through these
|
|
4
|
+
* so the engine has a single chokepoint for return-envelope validation +
|
|
5
|
+
* telemetry capture.
|
|
6
|
+
*
|
|
7
|
+
* Two enforcement modes by primitive:
|
|
8
|
+
*
|
|
9
|
+
* - `act` and `observe`: Stagehand owns the underlying LLM call and does
|
|
10
|
+
* not expose a caller-provided schema field on `ActOptions` /
|
|
11
|
+
* `ObserveOptions`. The strictest enforcement Stagehand's API allows is
|
|
12
|
+
* caller-side `safeParse` of the RETURN ENVELOPE against Zod mirrors of
|
|
13
|
+
* Stagehand's public types (`ActResult`, `Action`). On envelope drift
|
|
14
|
+
* (a Stagehand SDK upgrade that widens the shape, or a Stagehand bug
|
|
15
|
+
* that emits malformed JSON), the wrapper throws
|
|
16
|
+
* `StagehandSchemaError` and records a `failureKind:
|
|
17
|
+
* "schema-validation-failed"` entry to the NDJSON sink, matching the
|
|
18
|
+
* failure taxonomy of our direct Anthropic SDK callers.
|
|
19
|
+
*
|
|
20
|
+
* - `extract`: Stagehand's 3-arg overload accepts a caller-provided Zod
|
|
21
|
+
* schema and routes structured output through the LLM the same way our
|
|
22
|
+
* `messages.parse + zodOutputFormat` calls do. Stagehand `safeParse`s
|
|
23
|
+
* server-side; we `safeParse` again caller-side as defense in depth
|
|
24
|
+
* against SDK contract drift (and to log identical telemetry).
|
|
25
|
+
*
|
|
26
|
+
* Telemetry: every wrapper call lands in `calls.ndjson` regardless of
|
|
27
|
+
* outcome (per user directive — full parity with our Anthropic SDK call
|
|
28
|
+
* telemetry). Volume is dominated by `act`: hundreds of calls per job
|
|
29
|
+
* across the cascade attempts ≈ thousands of entries per sweep. The
|
|
30
|
+
* NDJSON sink is append-only and per-URL partitioned (see
|
|
31
|
+
* `src/lib/telemetry/telemetry-paths.ts`) so this scale is intentional.
|
|
32
|
+
*
|
|
33
|
+
* Stagehand Zod compat: as of `@browserbasehq/stagehand@3.4.0`,
|
|
34
|
+
* `StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny` — both Zod v3 and v4
|
|
35
|
+
* schemas pass through cleanly (confirmed in
|
|
36
|
+
* `node_modules/@browserbasehq/stagehand/dist/esm/lib/v3/zodCompat.d.ts`).
|
|
37
|
+
* Barnacle uses Zod v4 via the `zod/v4` subpath export; that's compatible.
|
|
38
|
+
*/
|
|
39
|
+
import type { Action, ActOptions, ActResult, ExtractOptions, ObserveOptions, Stagehand } from "@browserbasehq/stagehand";
|
|
40
|
+
import { z } from "zod/v4";
|
|
41
|
+
import { type LlmCallInput } from "../lib/telemetry/call-capture";
|
|
42
|
+
/**
|
|
43
|
+
* Injectable capture function — matches `captureLlmCall`'s signature. Same
|
|
44
|
+
* shape as `JudgeCaptureFn` in `@/lib/llm/judge`. Lets each guard call route
|
|
45
|
+
* its telemetry into the caller's per-run NDJSON sink instead of the global
|
|
46
|
+
* default in `captureLlmCall`. Without this, every Stagehand guard entry
|
|
47
|
+
* lands in `.barnacle/calls.ndjson` instead of the per-URL run partition.
|
|
48
|
+
*/
|
|
49
|
+
export type StagehandCaptureFn = (input: LlmCallInput) => Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Zod mirror of Stagehand's public `Action` shape (from
|
|
52
|
+
* `@browserbasehq/stagehand/.../public/methods.d.ts`):
|
|
53
|
+
*
|
|
54
|
+
* interface Action {
|
|
55
|
+
* selector: string;
|
|
56
|
+
* description: string;
|
|
57
|
+
* method?: string;
|
|
58
|
+
* arguments?: string[];
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* If Stagehand widens this shape in a future minor version, our `safeParse`
|
|
62
|
+
* fails closed — we'd rather see a `schema-validation-failed` entry in
|
|
63
|
+
* telemetry than have downstream code silently consume drift.
|
|
64
|
+
*/
|
|
65
|
+
export declare const ACTION_SCHEMA: z.ZodObject<{
|
|
66
|
+
selector: z.ZodString;
|
|
67
|
+
description: z.ZodString;
|
|
68
|
+
method: z.ZodOptional<z.ZodString>;
|
|
69
|
+
arguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
/**
|
|
72
|
+
* Zod mirror of Stagehand's public `ActResult` shape. The `actions` array
|
|
73
|
+
* is sometimes empty when Stagehand acted via a path that doesn't echo the
|
|
74
|
+
* action back; the cascade's resolvedAction fallback already handles that
|
|
75
|
+
* case. We accept empty arrays here as valid per the SDK contract.
|
|
76
|
+
*/
|
|
77
|
+
export declare const ACT_RESULT_SCHEMA: z.ZodObject<{
|
|
78
|
+
success: z.ZodBoolean;
|
|
79
|
+
message: z.ZodString;
|
|
80
|
+
actionDescription: z.ZodString;
|
|
81
|
+
actions: z.ZodArray<z.ZodObject<{
|
|
82
|
+
selector: z.ZodString;
|
|
83
|
+
description: z.ZodString;
|
|
84
|
+
method: z.ZodOptional<z.ZodString>;
|
|
85
|
+
arguments: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
86
|
+
}, z.core.$strip>>;
|
|
87
|
+
cacheStatus: z.ZodOptional<z.ZodEnum<{
|
|
88
|
+
HIT: "HIT";
|
|
89
|
+
MISS: "MISS";
|
|
90
|
+
}>>;
|
|
91
|
+
}, z.core.$strip>;
|
|
92
|
+
/**
|
|
93
|
+
* Thrown by any guarded* wrapper when Stagehand's return value doesn't
|
|
94
|
+
* `safeParse` against the schema. The `kind` is always
|
|
95
|
+
* `"schema-validation-failed"` — same string the Anthropic SDK callers use
|
|
96
|
+
* — so `classifyLlmCallFailure` routes it to the same NDJSON failureKind
|
|
97
|
+
* bucket without any string-matching changes.
|
|
98
|
+
*/
|
|
99
|
+
export declare class StagehandSchemaError extends Error {
|
|
100
|
+
readonly kind: "schema-validation-failed";
|
|
101
|
+
readonly primitive: "act" | "observe" | "extract";
|
|
102
|
+
readonly zodError: z.ZodError;
|
|
103
|
+
readonly rawResponse: unknown;
|
|
104
|
+
constructor(primitive: "act" | "observe" | "extract", zodError: z.ZodError, rawResponse: unknown);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Schema-guarded wrapper around Stagehand's `act`. Same signature as the
|
|
108
|
+
* underlying call: accepts either an instruction string or a structured
|
|
109
|
+
* `Action` (from a prior `observe`). On the happy path, returns Stagehand's
|
|
110
|
+
* `ActResult` verbatim. On envelope drift, throws `StagehandSchemaError`
|
|
111
|
+
* and logs `failureKind: "schema-validation-failed"`.
|
|
112
|
+
*/
|
|
113
|
+
export declare function guardedAct(stagehand: Stagehand, input: string | Action, options?: ActOptions, captureFn?: StagehandCaptureFn): Promise<ActResult>;
|
|
114
|
+
/**
|
|
115
|
+
* Schema-guarded wrapper around Stagehand's `observe`. Mirrors the
|
|
116
|
+
* Stagehand overloads: no args, options-only, instruction-only,
|
|
117
|
+
* instruction + options. On envelope drift (the `Action[]` shape changes),
|
|
118
|
+
* throws `StagehandSchemaError`.
|
|
119
|
+
*/
|
|
120
|
+
export declare function guardedObserve(stagehand: Stagehand, instruction?: string, options?: ObserveOptions, captureFn?: StagehandCaptureFn): Promise<Action[]>;
|
|
121
|
+
/**
|
|
122
|
+
* Schema-guarded wrapper around Stagehand's `extract` 3-arg overload. The
|
|
123
|
+
* caller's Zod schema is what Stagehand asks the LLM to satisfy AND what we
|
|
124
|
+
* `safeParse` against caller-side. Refuse the 1-arg / 2-arg defaults; every
|
|
125
|
+
* extract call in the codebase must enforce a schema.
|
|
126
|
+
*/
|
|
127
|
+
export declare function guardedExtract<T extends z.ZodTypeAny>(stagehand: Stagehand, instruction: string, schema: T, options?: ExtractOptions, captureFn?: StagehandCaptureFn): Promise<z.infer<T>>;
|
|
128
|
+
//# sourceMappingURL=stagehand-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand-guard.d.ts","sourceRoot":"","sources":["../../src/scraper/stagehand-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,EACd,SAAS,EACV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,8BAA8B,CAAC;AAOtC;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAExE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa;;;;;iBAKxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAM5B,CAAC;AAEH;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAG,0BAA0B,CAAU;IACpD,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAG5B,SAAS,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,EACxC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EACpB,WAAW,EAAE,OAAO;CAQvB;AAoBD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,OAAO,CAAC,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,SAAS,CAAC,CAqEpB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkEnB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACzD,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAsErB"}
|