@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,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Schema-enforcing wrappers around Stagehand's `act`, `observe`, and
|
|
4
|
+
* `extract`. Every Stagehand SDK call in the codebase routes through these
|
|
5
|
+
* so the engine has a single chokepoint for return-envelope validation +
|
|
6
|
+
* telemetry capture.
|
|
7
|
+
*
|
|
8
|
+
* Two enforcement modes by primitive:
|
|
9
|
+
*
|
|
10
|
+
* - `act` and `observe`: Stagehand owns the underlying LLM call and does
|
|
11
|
+
* not expose a caller-provided schema field on `ActOptions` /
|
|
12
|
+
* `ObserveOptions`. The strictest enforcement Stagehand's API allows is
|
|
13
|
+
* caller-side `safeParse` of the RETURN ENVELOPE against Zod mirrors of
|
|
14
|
+
* Stagehand's public types (`ActResult`, `Action`). On envelope drift
|
|
15
|
+
* (a Stagehand SDK upgrade that widens the shape, or a Stagehand bug
|
|
16
|
+
* that emits malformed JSON), the wrapper throws
|
|
17
|
+
* `StagehandSchemaError` and records a `failureKind:
|
|
18
|
+
* "schema-validation-failed"` entry to the NDJSON sink, matching the
|
|
19
|
+
* failure taxonomy of our direct Anthropic SDK callers.
|
|
20
|
+
*
|
|
21
|
+
* - `extract`: Stagehand's 3-arg overload accepts a caller-provided Zod
|
|
22
|
+
* schema and routes structured output through the LLM the same way our
|
|
23
|
+
* `messages.parse + zodOutputFormat` calls do. Stagehand `safeParse`s
|
|
24
|
+
* server-side; we `safeParse` again caller-side as defense in depth
|
|
25
|
+
* against SDK contract drift (and to log identical telemetry).
|
|
26
|
+
*
|
|
27
|
+
* Telemetry: every wrapper call lands in `calls.ndjson` regardless of
|
|
28
|
+
* outcome (per user directive — full parity with our Anthropic SDK call
|
|
29
|
+
* telemetry). Volume is dominated by `act`: hundreds of calls per job
|
|
30
|
+
* across the cascade attempts ≈ thousands of entries per sweep. The
|
|
31
|
+
* NDJSON sink is append-only and per-URL partitioned (see
|
|
32
|
+
* `src/lib/telemetry/telemetry-paths.ts`) so this scale is intentional.
|
|
33
|
+
*
|
|
34
|
+
* Stagehand Zod compat: as of `@browserbasehq/stagehand@3.4.0`,
|
|
35
|
+
* `StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny` — both Zod v3 and v4
|
|
36
|
+
* schemas pass through cleanly (confirmed in
|
|
37
|
+
* `node_modules/@browserbasehq/stagehand/dist/esm/lib/v3/zodCompat.d.ts`).
|
|
38
|
+
* Barnacle uses Zod v4 via the `zod/v4` subpath export; that's compatible.
|
|
39
|
+
*/
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.StagehandSchemaError = exports.ACT_RESULT_SCHEMA = exports.ACTION_SCHEMA = void 0;
|
|
42
|
+
exports.guardedAct = guardedAct;
|
|
43
|
+
exports.guardedObserve = guardedObserve;
|
|
44
|
+
exports.guardedExtract = guardedExtract;
|
|
45
|
+
const node_crypto_1 = require("node:crypto");
|
|
46
|
+
const v4_1 = require("zod/v4");
|
|
47
|
+
const call_capture_1 = require("../lib/telemetry/call-capture");
|
|
48
|
+
const call_types_1 = require("../lib/telemetry/call-types");
|
|
49
|
+
/**
|
|
50
|
+
* Zod mirror of Stagehand's public `Action` shape (from
|
|
51
|
+
* `@browserbasehq/stagehand/.../public/methods.d.ts`):
|
|
52
|
+
*
|
|
53
|
+
* interface Action {
|
|
54
|
+
* selector: string;
|
|
55
|
+
* description: string;
|
|
56
|
+
* method?: string;
|
|
57
|
+
* arguments?: string[];
|
|
58
|
+
* }
|
|
59
|
+
*
|
|
60
|
+
* If Stagehand widens this shape in a future minor version, our `safeParse`
|
|
61
|
+
* fails closed — we'd rather see a `schema-validation-failed` entry in
|
|
62
|
+
* telemetry than have downstream code silently consume drift.
|
|
63
|
+
*/
|
|
64
|
+
exports.ACTION_SCHEMA = v4_1.z.object({
|
|
65
|
+
selector: v4_1.z.string(),
|
|
66
|
+
description: v4_1.z.string(),
|
|
67
|
+
method: v4_1.z.string().optional(),
|
|
68
|
+
arguments: v4_1.z.array(v4_1.z.string()).optional(),
|
|
69
|
+
});
|
|
70
|
+
/**
|
|
71
|
+
* Zod mirror of Stagehand's public `ActResult` shape. The `actions` array
|
|
72
|
+
* is sometimes empty when Stagehand acted via a path that doesn't echo the
|
|
73
|
+
* action back; the cascade's resolvedAction fallback already handles that
|
|
74
|
+
* case. We accept empty arrays here as valid per the SDK contract.
|
|
75
|
+
*/
|
|
76
|
+
exports.ACT_RESULT_SCHEMA = v4_1.z.object({
|
|
77
|
+
success: v4_1.z.boolean(),
|
|
78
|
+
message: v4_1.z.string(),
|
|
79
|
+
actionDescription: v4_1.z.string(),
|
|
80
|
+
actions: v4_1.z.array(exports.ACTION_SCHEMA),
|
|
81
|
+
cacheStatus: v4_1.z.enum(["HIT", "MISS"]).optional(),
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* Thrown by any guarded* wrapper when Stagehand's return value doesn't
|
|
85
|
+
* `safeParse` against the schema. The `kind` is always
|
|
86
|
+
* `"schema-validation-failed"` — same string the Anthropic SDK callers use
|
|
87
|
+
* — so `classifyLlmCallFailure` routes it to the same NDJSON failureKind
|
|
88
|
+
* bucket without any string-matching changes.
|
|
89
|
+
*/
|
|
90
|
+
class StagehandSchemaError extends Error {
|
|
91
|
+
kind = "schema-validation-failed";
|
|
92
|
+
primitive;
|
|
93
|
+
zodError;
|
|
94
|
+
rawResponse;
|
|
95
|
+
constructor(primitive, zodError, rawResponse) {
|
|
96
|
+
super(`stagehand ${primitive} envelope failed schema validation: ${zodError.message}`);
|
|
97
|
+
this.name = "StagehandSchemaError";
|
|
98
|
+
this.primitive = primitive;
|
|
99
|
+
this.zodError = zodError;
|
|
100
|
+
this.rawResponse = rawResponse;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.StagehandSchemaError = StagehandSchemaError;
|
|
104
|
+
/**
|
|
105
|
+
* Stringify a possibly-circular value safely; used to populate
|
|
106
|
+
* `responseContent` in telemetry without risking a `TypeError` on circular
|
|
107
|
+
* Stagehand internals.
|
|
108
|
+
*/
|
|
109
|
+
function safeStringify(value, cap = 4000) {
|
|
110
|
+
try {
|
|
111
|
+
return JSON.stringify(value).slice(0, cap);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return String(value).slice(0, cap);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Pluck the bare instruction string from either form of `act` input. */
|
|
118
|
+
function actInstructionOf(input) {
|
|
119
|
+
return typeof input === "string" ? input : input.description;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Schema-guarded wrapper around Stagehand's `act`. Same signature as the
|
|
123
|
+
* underlying call: accepts either an instruction string or a structured
|
|
124
|
+
* `Action` (from a prior `observe`). On the happy path, returns Stagehand's
|
|
125
|
+
* `ActResult` verbatim. On envelope drift, throws `StagehandSchemaError`
|
|
126
|
+
* and logs `failureKind: "schema-validation-failed"`.
|
|
127
|
+
*/
|
|
128
|
+
async function guardedAct(stagehand, input, options, captureFn) {
|
|
129
|
+
const callId = (0, node_crypto_1.randomUUID)();
|
|
130
|
+
const userContent = actInstructionOf(input);
|
|
131
|
+
const t0 = performance.now();
|
|
132
|
+
try {
|
|
133
|
+
// Stagehand's `act` has two overloads (string and Action) that share the
|
|
134
|
+
// same runtime implementation (dispatch is via `isObserveResult` inside
|
|
135
|
+
// Stagehand). The two branches LOOK identical but TS can't resolve the
|
|
136
|
+
// union against the overload set without splitting them — and assigning
|
|
137
|
+
// `stagehand.act` to a variable then calling it as a standalone function
|
|
138
|
+
// loses `this` in strict mode, which crashes inside Stagehand's
|
|
139
|
+
// `withInstanceLogContext(this.instanceId, ...)` wrapper on entry.
|
|
140
|
+
const raw = typeof input === "string"
|
|
141
|
+
? await stagehand.act(input, options)
|
|
142
|
+
: await stagehand.act(input, options);
|
|
143
|
+
const latencyMs = performance.now() - t0;
|
|
144
|
+
const parsed = exports.ACT_RESULT_SCHEMA.safeParse(raw);
|
|
145
|
+
if (!parsed.success) {
|
|
146
|
+
await captureCall({
|
|
147
|
+
callId,
|
|
148
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_ACT,
|
|
149
|
+
userContent,
|
|
150
|
+
responseContent: safeStringify(raw),
|
|
151
|
+
latencyMs,
|
|
152
|
+
success: false,
|
|
153
|
+
parsedOk: false,
|
|
154
|
+
errorMessage: `act envelope failed schema validation: ${parsed.error.message}`,
|
|
155
|
+
failureKind: "schema-validation-failed",
|
|
156
|
+
}, captureFn);
|
|
157
|
+
throw new StagehandSchemaError("act", parsed.error, raw);
|
|
158
|
+
}
|
|
159
|
+
await captureCall({
|
|
160
|
+
callId,
|
|
161
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_ACT,
|
|
162
|
+
userContent,
|
|
163
|
+
responseContent: safeStringify(parsed.data),
|
|
164
|
+
latencyMs,
|
|
165
|
+
success: parsed.data.success,
|
|
166
|
+
parsedOk: true,
|
|
167
|
+
errorMessage: null,
|
|
168
|
+
failureKind: null,
|
|
169
|
+
}, captureFn);
|
|
170
|
+
return parsed.data;
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
if (err instanceof StagehandSchemaError)
|
|
174
|
+
throw err;
|
|
175
|
+
const latencyMs = performance.now() - t0;
|
|
176
|
+
await captureCall({
|
|
177
|
+
callId,
|
|
178
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_ACT,
|
|
179
|
+
userContent,
|
|
180
|
+
responseContent: null,
|
|
181
|
+
latencyMs,
|
|
182
|
+
success: false,
|
|
183
|
+
parsedOk: false,
|
|
184
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
185
|
+
failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
|
|
186
|
+
}, captureFn);
|
|
187
|
+
throw err;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Schema-guarded wrapper around Stagehand's `observe`. Mirrors the
|
|
192
|
+
* Stagehand overloads: no args, options-only, instruction-only,
|
|
193
|
+
* instruction + options. On envelope drift (the `Action[]` shape changes),
|
|
194
|
+
* throws `StagehandSchemaError`.
|
|
195
|
+
*/
|
|
196
|
+
async function guardedObserve(stagehand, instruction, options, captureFn) {
|
|
197
|
+
const callId = (0, node_crypto_1.randomUUID)();
|
|
198
|
+
const userContent = instruction ?? "";
|
|
199
|
+
const t0 = performance.now();
|
|
200
|
+
try {
|
|
201
|
+
// Match Stagehand's overloads: pass instruction only when defined, so
|
|
202
|
+
// the SDK falls through to its no-arg/options-only path otherwise.
|
|
203
|
+
const raw = instruction === undefined
|
|
204
|
+
? options === undefined
|
|
205
|
+
? await stagehand.observe()
|
|
206
|
+
: await stagehand.observe(options)
|
|
207
|
+
: await stagehand.observe(instruction, options);
|
|
208
|
+
const latencyMs = performance.now() - t0;
|
|
209
|
+
const parsed = v4_1.z.array(exports.ACTION_SCHEMA).safeParse(raw);
|
|
210
|
+
if (!parsed.success) {
|
|
211
|
+
await captureCall({
|
|
212
|
+
callId,
|
|
213
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_OBSERVE,
|
|
214
|
+
userContent,
|
|
215
|
+
responseContent: safeStringify(raw),
|
|
216
|
+
latencyMs,
|
|
217
|
+
success: false,
|
|
218
|
+
parsedOk: false,
|
|
219
|
+
errorMessage: `observe envelope failed schema validation: ${parsed.error.message}`,
|
|
220
|
+
failureKind: "schema-validation-failed",
|
|
221
|
+
}, captureFn);
|
|
222
|
+
throw new StagehandSchemaError("observe", parsed.error, raw);
|
|
223
|
+
}
|
|
224
|
+
await captureCall({
|
|
225
|
+
callId,
|
|
226
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_OBSERVE,
|
|
227
|
+
userContent,
|
|
228
|
+
responseContent: safeStringify(parsed.data),
|
|
229
|
+
latencyMs,
|
|
230
|
+
success: true,
|
|
231
|
+
parsedOk: true,
|
|
232
|
+
errorMessage: null,
|
|
233
|
+
failureKind: null,
|
|
234
|
+
}, captureFn);
|
|
235
|
+
return parsed.data;
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
if (err instanceof StagehandSchemaError)
|
|
239
|
+
throw err;
|
|
240
|
+
const latencyMs = performance.now() - t0;
|
|
241
|
+
await captureCall({
|
|
242
|
+
callId,
|
|
243
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_OBSERVE,
|
|
244
|
+
userContent,
|
|
245
|
+
responseContent: null,
|
|
246
|
+
latencyMs,
|
|
247
|
+
success: false,
|
|
248
|
+
parsedOk: false,
|
|
249
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
250
|
+
failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
|
|
251
|
+
}, captureFn);
|
|
252
|
+
throw err;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Schema-guarded wrapper around Stagehand's `extract` 3-arg overload. The
|
|
257
|
+
* caller's Zod schema is what Stagehand asks the LLM to satisfy AND what we
|
|
258
|
+
* `safeParse` against caller-side. Refuse the 1-arg / 2-arg defaults; every
|
|
259
|
+
* extract call in the codebase must enforce a schema.
|
|
260
|
+
*/
|
|
261
|
+
async function guardedExtract(stagehand, instruction, schema, options, captureFn) {
|
|
262
|
+
const callId = (0, node_crypto_1.randomUUID)();
|
|
263
|
+
const t0 = performance.now();
|
|
264
|
+
try {
|
|
265
|
+
// Widening cast: caller's `z.ZodTypeAny` (Zod v4) is one branch of
|
|
266
|
+
// Stagehand's `StagehandZodSchema = Zod4TypeAny | z3.ZodTypeAny` union,
|
|
267
|
+
// which Stagehand's extract overload-2 expects. We can't reference
|
|
268
|
+
// `StagehandZodSchema` directly because it's a deep import not exported
|
|
269
|
+
// from the package root; `Parameters<typeof stagehand.extract>[1]` is
|
|
270
|
+
// the cleanest public-API way to express "whatever overload-2 expects."
|
|
271
|
+
// The `as unknown` step is needed because TS won't accept a single
|
|
272
|
+
// direct cast across the entire overload set.
|
|
273
|
+
const raw = await stagehand.extract(instruction, schema, options);
|
|
274
|
+
const latencyMs = performance.now() - t0;
|
|
275
|
+
const parsed = schema.safeParse(raw);
|
|
276
|
+
if (!parsed.success) {
|
|
277
|
+
await captureCall({
|
|
278
|
+
callId,
|
|
279
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_EXTRACT,
|
|
280
|
+
userContent: instruction,
|
|
281
|
+
responseContent: safeStringify(raw),
|
|
282
|
+
latencyMs,
|
|
283
|
+
success: false,
|
|
284
|
+
parsedOk: false,
|
|
285
|
+
errorMessage: `extract envelope failed schema validation: ${parsed.error.message}`,
|
|
286
|
+
failureKind: "schema-validation-failed",
|
|
287
|
+
}, captureFn);
|
|
288
|
+
throw new StagehandSchemaError("extract", parsed.error, raw);
|
|
289
|
+
}
|
|
290
|
+
await captureCall({
|
|
291
|
+
callId,
|
|
292
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_EXTRACT,
|
|
293
|
+
userContent: instruction,
|
|
294
|
+
responseContent: safeStringify(parsed.data),
|
|
295
|
+
latencyMs,
|
|
296
|
+
success: true,
|
|
297
|
+
parsedOk: true,
|
|
298
|
+
errorMessage: null,
|
|
299
|
+
failureKind: null,
|
|
300
|
+
}, captureFn);
|
|
301
|
+
return parsed.data;
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
if (err instanceof StagehandSchemaError)
|
|
305
|
+
throw err;
|
|
306
|
+
const latencyMs = performance.now() - t0;
|
|
307
|
+
await captureCall({
|
|
308
|
+
callId,
|
|
309
|
+
callType: call_types_1.CALL_TYPE_STAGEHAND_EXTRACT,
|
|
310
|
+
userContent: instruction,
|
|
311
|
+
responseContent: null,
|
|
312
|
+
latencyMs,
|
|
313
|
+
success: false,
|
|
314
|
+
parsedOk: false,
|
|
315
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
316
|
+
failureKind: (0, call_capture_1.classifyLlmCallFailure)(err),
|
|
317
|
+
}, captureFn);
|
|
318
|
+
throw err;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Internal helper: fills the constant `model` / `systemPrompt` /
|
|
323
|
+
* `inputTokens` / `outputTokens` fields Stagehand doesn't expose. The
|
|
324
|
+
* underlying LLM call inside `act`/`observe` uses Stagehand-owned tokens
|
|
325
|
+
* we don't have visibility into; we record `null` per the existing
|
|
326
|
+
* `LlmCallInput` contract (which already supports null for those fields).
|
|
327
|
+
*/
|
|
328
|
+
async function captureCall(partial, captureFn = call_capture_1.captureLlmCall) {
|
|
329
|
+
await captureFn({
|
|
330
|
+
...partial,
|
|
331
|
+
model: "stagehand-internal",
|
|
332
|
+
systemPrompt: null,
|
|
333
|
+
inputTokens: null,
|
|
334
|
+
outputTokens: null,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=stagehand-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stagehand-guard.js","sourceRoot":"","sources":["../../src/scraper/stagehand-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Bottleneck from "bottleneck";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a Bottleneck limiter scoped to a single scraper session.
|
|
4
|
+
*
|
|
5
|
+
* Why Bottleneck: battle-tested (used by GitHub's Octokit), handles min-
|
|
6
|
+
* time-between-jobs, max-concurrent, and graceful drain. We don't invent
|
|
7
|
+
* any delay logic on top — every `stagehand.act()` or `stagehand.extract()` goes
|
|
8
|
+
* through `limiter.schedule(() => stagehand.act(...))` and Bottleneck enforces
|
|
9
|
+
* the cadence.
|
|
10
|
+
*
|
|
11
|
+
* How to apply: the pool grabs one limiter per session; concurrency
|
|
12
|
+
* across sessions is managed by the outer p-queue in pool.ts.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createSessionLimiter(): Bottleneck;
|
|
15
|
+
/**
|
|
16
|
+
* Schedules a scraper action through the limiter with an additional jitter
|
|
17
|
+
* window so consecutive calls don't look metronomic. Returns the awaited
|
|
18
|
+
* result of `fn`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function scheduleAction<T>(limiter: Bottleneck, fn: () => Promise<T>): Promise<T>;
|
|
21
|
+
//# sourceMappingURL=throttle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../src/scraper/throttle.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAKpC;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,CAKjD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAS7F"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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.createSessionLimiter = createSessionLimiter;
|
|
7
|
+
exports.scheduleAction = scheduleAction;
|
|
8
|
+
const bottleneck_1 = __importDefault(require("bottleneck"));
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const random_1 = require("../lib/random");
|
|
11
|
+
/**
|
|
12
|
+
* Creates a Bottleneck limiter scoped to a single scraper session.
|
|
13
|
+
*
|
|
14
|
+
* Why Bottleneck: battle-tested (used by GitHub's Octokit), handles min-
|
|
15
|
+
* time-between-jobs, max-concurrent, and graceful drain. We don't invent
|
|
16
|
+
* any delay logic on top — every `stagehand.act()` or `stagehand.extract()` goes
|
|
17
|
+
* through `limiter.schedule(() => stagehand.act(...))` and Bottleneck enforces
|
|
18
|
+
* the cadence.
|
|
19
|
+
*
|
|
20
|
+
* How to apply: the pool grabs one limiter per session; concurrency
|
|
21
|
+
* across sessions is managed by the outer p-queue in pool.ts.
|
|
22
|
+
*/
|
|
23
|
+
function createSessionLimiter() {
|
|
24
|
+
return new bottleneck_1.default({
|
|
25
|
+
maxConcurrent: 1,
|
|
26
|
+
minTime: config_1.config.scraper.minActionDelayMs,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Schedules a scraper action through the limiter with an additional jitter
|
|
31
|
+
* window so consecutive calls don't look metronomic. Returns the awaited
|
|
32
|
+
* result of `fn`.
|
|
33
|
+
*/
|
|
34
|
+
async function scheduleAction(limiter, fn) {
|
|
35
|
+
const jitter = (0, random_1.randomIntInclusive)(0, config_1.config.scraper.maxActionDelayMs - config_1.config.scraper.minActionDelayMs - 1);
|
|
36
|
+
return limiter.schedule({ weight: 1, priority: 5 }, async () => {
|
|
37
|
+
if (jitter > 0)
|
|
38
|
+
await sleep(jitter);
|
|
39
|
+
return fn();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function sleep(ms) {
|
|
43
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../src/scraper/throttle.ts"],"names":[],"mappings":";;;;;AAiBA,oDAKC;AAOD,wCASC;AAtCD,4DAAoC;AAEpC,qCAAkC;AAClC,yCAAkD;AAElD;;;;;;;;;;;GAWG;AACH,SAAgB,oBAAoB;IAClC,OAAO,IAAI,oBAAU,CAAC;QACpB,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,eAAM,CAAC,OAAO,CAAC,gBAAgB;KACzC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAAI,OAAmB,EAAE,EAAoB;IAC/E,MAAM,MAAM,GAAG,IAAA,2BAAkB,EAC/B,CAAC,EACD,eAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,eAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,CACtE,CAAC;IACF,OAAO,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAI,MAAM,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,EAAE,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone confirmation-email poller for the HCA batch — DECOUPLED from the
|
|
3
|
+
* live-verify run so it never slows a submission. Reads the batch log, extracts
|
|
4
|
+
* every SUBMITTED job's testmail inbox (`{jobId, address, tag, timestampFrom}`),
|
|
5
|
+
* and polls each inbox for a confirmation email. Idempotent + re-runnable: pass
|
|
6
|
+
* the same `--out` file across runs and it only polls inboxes not yet confirmed,
|
|
7
|
+
* so it can be run repeatedly as emails trickle in (HCA/Talemetry may email
|
|
8
|
+
* minutes-to-hours after submit, or not at all — this measures which).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm tsx --env-file=.env src/scripts/hca-inbox-poll.ts \
|
|
12
|
+
* [--log <batch.log>] [--out <results.json>] [--timeout-ms <per-inbox budget>]
|
|
13
|
+
*
|
|
14
|
+
* "SUBMITTED" is already the authoritative in-band success signal (Talemetry
|
|
15
|
+
* completed=true + thank-you URL); this is an ADDITIONAL out-of-band check to
|
|
16
|
+
* learn whether HCA actually delivers a confirmation email.
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=hca-inbox-poll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hca-inbox-poll.d.ts","sourceRoot":"","sources":["../../src/scripts/hca-inbox-poll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Standalone confirmation-email poller for the HCA batch — DECOUPLED from the
|
|
4
|
+
* live-verify run so it never slows a submission. Reads the batch log, extracts
|
|
5
|
+
* every SUBMITTED job's testmail inbox (`{jobId, address, tag, timestampFrom}`),
|
|
6
|
+
* and polls each inbox for a confirmation email. Idempotent + re-runnable: pass
|
|
7
|
+
* the same `--out` file across runs and it only polls inboxes not yet confirmed,
|
|
8
|
+
* so it can be run repeatedly as emails trickle in (HCA/Talemetry may email
|
|
9
|
+
* minutes-to-hours after submit, or not at all — this measures which).
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* pnpm tsx --env-file=.env src/scripts/hca-inbox-poll.ts \
|
|
13
|
+
* [--log <batch.log>] [--out <results.json>] [--timeout-ms <per-inbox budget>]
|
|
14
|
+
*
|
|
15
|
+
* "SUBMITTED" is already the authoritative in-band success signal (Talemetry
|
|
16
|
+
* completed=true + thank-you URL); this is an ADDITIONAL out-of-band check to
|
|
17
|
+
* learn whether HCA actually delivers a confirmation email.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
const node_fs_1 = require("node:fs");
|
|
21
|
+
const config_1 = require("../config");
|
|
22
|
+
const logging_1 = require("../lib/logging");
|
|
23
|
+
const client_1 = require("../testmail/client");
|
|
24
|
+
const logger = (0, logging_1.getLogger)({ name: "hca-inbox-poll" });
|
|
25
|
+
const DEFAULT_LOG = "/private/tmp/claude-501/-Users-andres-src-vivian-barnacle/2c51c4a7-1a01-4e80-a3ad-8c8d02045529/scratchpad/hca-allvalid.log";
|
|
26
|
+
const DEFAULT_OUT = "/private/tmp/claude-501/-Users-andres-src-vivian-barnacle/2c51c4a7-1a01-4e80-a3ad-8c8d02045529/scratchpad/hca-inbox-results.json";
|
|
27
|
+
function parseArgs() {
|
|
28
|
+
const args = process.argv.slice(2);
|
|
29
|
+
const logPaths = [];
|
|
30
|
+
let outPath = DEFAULT_OUT;
|
|
31
|
+
let timeoutMs = 15_000;
|
|
32
|
+
for (let i = 0; i < args.length; i++) {
|
|
33
|
+
if (args[i] === "--log" && args[i + 1])
|
|
34
|
+
logPaths.push(args[++i]);
|
|
35
|
+
else if (args[i] === "--out" && args[i + 1])
|
|
36
|
+
outPath = args[++i];
|
|
37
|
+
else if (args[i] === "--timeout-ms" && args[i + 1])
|
|
38
|
+
timeoutMs = Number(args[++i]);
|
|
39
|
+
}
|
|
40
|
+
return { logPaths: logPaths.length > 0 ? logPaths : [DEFAULT_LOG], outPath, timeoutMs };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reconstruct each SUBMITTED job's inbox from the batch log. A "starting" line
|
|
44
|
+
* carries `job=<id> email=<namespace>.<tag>@inbox.testmail.app` + a timestamp;
|
|
45
|
+
* a later `job=<id> SUBMITTED` line confirms it applied. The address yields the
|
|
46
|
+
* tag; the starting line's clock is a safe `timestampFrom` lower bound.
|
|
47
|
+
*/
|
|
48
|
+
function parseSubmittedInboxes(log) {
|
|
49
|
+
const byJob = new Map();
|
|
50
|
+
const lines = log.split("\n");
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const m = /\[(\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)[^\]]*\].*job=(\d+) email=([^ ]+@inbox\.testmail\.app)/.exec(line);
|
|
53
|
+
if (!m)
|
|
54
|
+
continue;
|
|
55
|
+
const [, clock, jobId, address] = m;
|
|
56
|
+
const tag = address.split("@")[0].split(".").slice(1).join(".");
|
|
57
|
+
// The starting clock (local time) → Unix ms lower bound for received-after.
|
|
58
|
+
const timestampFrom = new Date(clock.replace(" ", "T")).getTime();
|
|
59
|
+
byJob.set(jobId, { address: address, tag, timestampFrom });
|
|
60
|
+
}
|
|
61
|
+
const submitted = new Set();
|
|
62
|
+
for (const m of log.matchAll(/job=(\d+) SUBMITTED/g)) {
|
|
63
|
+
submitted.add(m[1]);
|
|
64
|
+
}
|
|
65
|
+
const out = [];
|
|
66
|
+
for (const jobId of submitted) {
|
|
67
|
+
const info = byJob.get(jobId);
|
|
68
|
+
if (info)
|
|
69
|
+
out.push({ jobId, ...info });
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function loadPriorResults(outPath) {
|
|
74
|
+
try {
|
|
75
|
+
const arr = JSON.parse((0, node_fs_1.readFileSync)(outPath, "utf8"));
|
|
76
|
+
return new Map(arr.map((r) => [r.jobId, r]));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return new Map();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Poll every not-yet-confirmed submitted inbox once and persist results. Exists
|
|
84
|
+
* as a discrete script so it can run on its own cadence beside the live batch.
|
|
85
|
+
*/
|
|
86
|
+
async function main() {
|
|
87
|
+
const { logPaths, outPath, timeoutMs } = parseArgs();
|
|
88
|
+
if (!config_1.config.testmail.namespace) {
|
|
89
|
+
throw new Error("TESTMAIL_NAMESPACE not set — cannot poll inboxes");
|
|
90
|
+
}
|
|
91
|
+
// Merge submitted inboxes from every log (original batch + any resume runs),
|
|
92
|
+
// deduped by jobId so re-run jobs don't double-poll.
|
|
93
|
+
const byJob = new Map();
|
|
94
|
+
for (const p of logPaths) {
|
|
95
|
+
let text;
|
|
96
|
+
try {
|
|
97
|
+
text = (0, node_fs_1.readFileSync)(p, "utf8");
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
for (const inb of parseSubmittedInboxes(text))
|
|
103
|
+
byJob.set(inb.jobId, inb);
|
|
104
|
+
}
|
|
105
|
+
const inboxes = [...byJob.values()];
|
|
106
|
+
const prior = loadPriorResults(outPath);
|
|
107
|
+
const pending = inboxes.filter((x) => prior.get(x.jobId)?.confirmed !== true);
|
|
108
|
+
logger.info(`hca-inbox-poll: ${inboxes.length} submitted inbox(es); ${prior.size} prior result(s); polling ${pending.length} not-yet-confirmed`);
|
|
109
|
+
const results = new Map(prior);
|
|
110
|
+
let newlyConfirmed = 0;
|
|
111
|
+
for (const inb of pending) {
|
|
112
|
+
try {
|
|
113
|
+
const msg = await (0, client_1.pollTestmailInbox)({
|
|
114
|
+
inbox: { address: inb.address, tag: inb.tag, timestampFrom: inb.timestampFrom },
|
|
115
|
+
timeoutMs,
|
|
116
|
+
});
|
|
117
|
+
results.set(inb.jobId, {
|
|
118
|
+
jobId: inb.jobId,
|
|
119
|
+
address: inb.address,
|
|
120
|
+
confirmed: true,
|
|
121
|
+
subject: msg.subject,
|
|
122
|
+
from: msg.from,
|
|
123
|
+
checkedAt: new Date().toISOString(),
|
|
124
|
+
});
|
|
125
|
+
newlyConfirmed++;
|
|
126
|
+
logger.info(`hca-inbox-poll: job ${inb.jobId} CONFIRMED — from="${msg.from}" subject="${msg.subject}"`);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
// Any throw (timeout = no email within budget, or a transient API error)
|
|
130
|
+
// → not confirmed THIS pass; a later re-run retries it.
|
|
131
|
+
results.set(inb.jobId, {
|
|
132
|
+
jobId: inb.jobId,
|
|
133
|
+
address: inb.address,
|
|
134
|
+
confirmed: false,
|
|
135
|
+
subject: null,
|
|
136
|
+
from: null,
|
|
137
|
+
checkedAt: new Date().toISOString(),
|
|
138
|
+
});
|
|
139
|
+
logger.info(`hca-inbox-poll: job ${inb.jobId} no confirmation (${err instanceof Error ? err.constructor.name : "error"})`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const all = [...results.values()];
|
|
143
|
+
(0, node_fs_1.writeFileSync)(outPath, JSON.stringify(all, null, 2));
|
|
144
|
+
const confirmed = all.filter((r) => r.confirmed).length;
|
|
145
|
+
logger.info(`hca-inbox-poll: DONE — ${confirmed}/${all.length} confirmed (${newlyConfirmed} new this run). Results: ${outPath}`);
|
|
146
|
+
}
|
|
147
|
+
main().catch((err) => {
|
|
148
|
+
logger.error(`hca-inbox-poll: fatal — ${err instanceof Error ? err.message : String(err)}`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=hca-inbox-poll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hca-inbox-poll.js","sourceRoot":"","sources":["../../src/scripts/hca-inbox-poll.ts"],"names":[],"mappings":"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"}
|