@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,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Turns a declarative plugin manifest (JSON on disk, no per-site TypeScript)
|
|
4
|
+
* into a live {@link SitePlugin} at load time. This is what makes a Barnacle
|
|
5
|
+
* site loadable from configuration alone: the manifest carries the request /
|
|
6
|
+
* response / extract schemas as JSON Schema and the browser flow as data, and
|
|
7
|
+
* `buildConfigPlugin` synthesizes the Zod instances + `execute` function the
|
|
8
|
+
* loader's `validatePluginShape` requires.
|
|
9
|
+
*
|
|
10
|
+
* The manifest wears the Kubernetes-style `apiVersion` / `kind` / `metadata` /
|
|
11
|
+
* `spec` envelope so it reads like every other declarative object operators
|
|
12
|
+
* already know, and the browser flow reuses the same `RECON_FLOW_STEP_SCHEMA` +
|
|
13
|
+
* `runHealingFlow` interpreter the recon toolchain and generated plugins use —
|
|
14
|
+
* this factory is the recon-generate `emitBrowserFlowTs` template made
|
|
15
|
+
* data-driven instead of frozen into source.
|
|
16
|
+
*/
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.CONFIG_PLUGIN_MANIFEST = void 0;
|
|
22
|
+
exports.buildConfigPlugin = buildConfigPlugin;
|
|
23
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
24
|
+
const node_url_1 = require("node:url");
|
|
25
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
26
|
+
const v4_1 = require("zod/v4");
|
|
27
|
+
const schemas_1 = require("../lib/llm/schemas");
|
|
28
|
+
const logging_1 = require("../lib/logging");
|
|
29
|
+
const json_schema_to_zod_1 = require("../plugins/json-schema-to-zod");
|
|
30
|
+
const plugin_api_version_1 = require("../plugins/plugin-api-version");
|
|
31
|
+
const plugin_manifest_envelope_1 = require("../plugins/plugin-manifest-envelope");
|
|
32
|
+
const flow_runner_1 = require("../scraper/flow-runner");
|
|
33
|
+
const navigate_1 = require("../scraper/navigate");
|
|
34
|
+
const stagehand_guard_1 = require("../scraper/stagehand-guard");
|
|
35
|
+
/** JSON-Schema fragment as it appears verbatim in a manifest; converted to Zod at build time. */
|
|
36
|
+
const jsonSchemaFragment = v4_1.z.record(v4_1.z.string(), v4_1.z.unknown());
|
|
37
|
+
const flowSchema = v4_1.z.object({
|
|
38
|
+
steps: v4_1.z.array(schemas_1.RECON_FLOW_STEP_SCHEMA).min(1),
|
|
39
|
+
submitEndpointPattern: v4_1.z.string().nullish(),
|
|
40
|
+
submittedStateSelectors: v4_1.z.array(v4_1.z.string()).optional(),
|
|
41
|
+
requireSubmitEndpointMatch: v4_1.z.boolean().optional(),
|
|
42
|
+
advanceTransitionBodyPattern: v4_1.z.string().nullish(),
|
|
43
|
+
successUrlFragments: v4_1.z.array(v4_1.z.string()).optional(),
|
|
44
|
+
successPageTitleHints: v4_1.z.array(v4_1.z.string()).optional(),
|
|
45
|
+
ownBackendHostnames: v4_1.z.array(v4_1.z.string()).optional(),
|
|
46
|
+
knownErrorClassPrefixes: v4_1.z.array(v4_1.z.string()).optional(),
|
|
47
|
+
wizardExitButtonLabels: v4_1.z.array(v4_1.z.string()).optional(),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Structural schema for a config-plugin manifest. Validated before conversion
|
|
51
|
+
* so a malformed manifest fails at load with a descriptive Zod error rather
|
|
52
|
+
* than a runtime crash while the plugin is servicing a request.
|
|
53
|
+
*/
|
|
54
|
+
exports.CONFIG_PLUGIN_MANIFEST = v4_1.z.object({
|
|
55
|
+
apiVersion: v4_1.z.literal(plugin_manifest_envelope_1.CONFIG_PLUGIN_API_VERSION),
|
|
56
|
+
kind: v4_1.z.literal(plugin_manifest_envelope_1.CONFIG_PLUGIN_KIND),
|
|
57
|
+
metadata: v4_1.z.object({
|
|
58
|
+
siteId: v4_1.z.string().min(1),
|
|
59
|
+
displayName: v4_1.z.string().min(1),
|
|
60
|
+
}),
|
|
61
|
+
spec: v4_1.z.object({
|
|
62
|
+
defaultBaseUrl: v4_1.z.string().optional(),
|
|
63
|
+
routeOverride: v4_1.z.string().optional(),
|
|
64
|
+
multipart: v4_1.z.boolean().optional(),
|
|
65
|
+
advancedStealth: v4_1.z.boolean().optional(),
|
|
66
|
+
taskTimeoutMs: v4_1.z.number().optional(),
|
|
67
|
+
request: jsonSchemaFragment,
|
|
68
|
+
response: jsonSchemaFragment,
|
|
69
|
+
flow: flowSchema,
|
|
70
|
+
extract: v4_1.z.object({
|
|
71
|
+
instruction: v4_1.z.string().min(1),
|
|
72
|
+
schema: jsonSchemaFragment,
|
|
73
|
+
}),
|
|
74
|
+
httpModule: v4_1.z.string().optional(),
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
/** Matches `{{ .request.FieldName }}` — the only interpolation form a manifest step may use. */
|
|
78
|
+
const TEMPLATE_PATTERN = /\{\{\s*\.request\.([A-Za-z0-9_]+)\s*\}\}/g;
|
|
79
|
+
/**
|
|
80
|
+
* Resolves `{{ .request.X }}` references in a step instruction against the
|
|
81
|
+
* validated request payload. Distinguishes two cases via `declaredFields` (the
|
|
82
|
+
* request schema's property names) so an omitted *optional* field is not
|
|
83
|
+
* conflated with a typo: a reference to an **undeclared** field throws (the
|
|
84
|
+
* manifest is wrong), while a **declared** field the caller omitted resolves to
|
|
85
|
+
* an empty string (a legitimately optional value). Values splice as inert text
|
|
86
|
+
* (no expression evaluation), so there is no injection surface.
|
|
87
|
+
*/
|
|
88
|
+
function resolveTemplate(instruction, payload, declaredFields) {
|
|
89
|
+
return instruction.replace(TEMPLATE_PATTERN, (_match, field) => {
|
|
90
|
+
if (!declaredFields.has(field)) {
|
|
91
|
+
throw new Error(`flow step references unknown request field "${field}"`);
|
|
92
|
+
}
|
|
93
|
+
return field in payload ? String(payload[field]) : "";
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Normalizes one manifest flow step (bare string or object form) into a {@link HealingFlowStep}. */
|
|
97
|
+
function toHealingStep(step, payload, declaredFields) {
|
|
98
|
+
if (typeof step === "string") {
|
|
99
|
+
return {
|
|
100
|
+
instruction: resolveTemplate(step, payload, declaredFields),
|
|
101
|
+
optional: false,
|
|
102
|
+
upload: false,
|
|
103
|
+
submitStep: false,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
instruction: resolveTemplate(step.step, payload, declaredFields),
|
|
108
|
+
optional: step.optional,
|
|
109
|
+
upload: step.upload,
|
|
110
|
+
submitStep: step.submitStep,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Builds the resume fixture the browser flow uploads, mirroring the rule the
|
|
115
|
+
* generator's `emitBrowserFlowTs` applies: only when a step uploads AND the
|
|
116
|
+
* manifest declares itself multipart do the `Resume*` payload fields exist.
|
|
117
|
+
*/
|
|
118
|
+
function buildResumeFixture(payload, hasUploadStep, multipart) {
|
|
119
|
+
if (!hasUploadStep || !multipart)
|
|
120
|
+
return null;
|
|
121
|
+
return {
|
|
122
|
+
buffer: Buffer.from(payload.Resume ?? "", "base64"),
|
|
123
|
+
name: payload.ResumeFilename ?? "resume.pdf",
|
|
124
|
+
mimeType: payload.ResumeContentType ?? "application/pdf",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Dynamically loads the optional `executeHttp` escape-hatch module a manifest
|
|
129
|
+
* may reference. Kept async and separate so a browser-only manifest never pays
|
|
130
|
+
* for an import it does not use, and a broken `httpModule` disables the plugin
|
|
131
|
+
* via the loader's normal failure path rather than crashing the factory.
|
|
132
|
+
*
|
|
133
|
+
* Resolution mirrors the loader's `resolvePluginSpecifier`: a `.`/`/` specifier
|
|
134
|
+
* is a filesystem path resolved against `baseDir` (so a relative `httpModule`
|
|
135
|
+
* resolves against the operator's `BARNACLE_PLUGINS_DIR`, not this module's
|
|
136
|
+
* location under `dist/`); anything else is a bare package name left for Node's
|
|
137
|
+
* resolver.
|
|
138
|
+
*/
|
|
139
|
+
async function loadHttpModule(specifier, baseDir) {
|
|
140
|
+
const resolved = specifier.startsWith(".") || specifier.startsWith("/")
|
|
141
|
+
? (0, node_url_1.pathToFileURL)(node_path_1.default.resolve(baseDir, specifier)).href
|
|
142
|
+
: specifier;
|
|
143
|
+
const mod = (await import(resolved));
|
|
144
|
+
const candidate = mod.executeHttp ?? mod.default;
|
|
145
|
+
if (typeof candidate !== "function") {
|
|
146
|
+
throw new Error(`httpModule ${specifier} must export an executeHttp function`);
|
|
147
|
+
}
|
|
148
|
+
return candidate;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Synthesizes a {@link SitePlugin} from a validated manifest. The returned
|
|
152
|
+
* object satisfies the loader's `validatePluginShape` by construction: real Zod
|
|
153
|
+
* schemas for `bodySchema`/`responseSchema` and a data-driven `execute` that
|
|
154
|
+
* drives the manifest's flow through the shared self-healing interpreter.
|
|
155
|
+
*
|
|
156
|
+
* `baseDir` resolves a relative `spec.httpModule` escape-hatch path against the
|
|
157
|
+
* operator's plugin directory, matching the loader's specifier resolution; it
|
|
158
|
+
* defaults to `process.cwd()` for callers (e.g. tests) that build a manifest
|
|
159
|
+
* without a manifest-file location.
|
|
160
|
+
*/
|
|
161
|
+
async function buildConfigPlugin(raw, baseDir = process.cwd()) {
|
|
162
|
+
const manifest = exports.CONFIG_PLUGIN_MANIFEST.parse(raw);
|
|
163
|
+
const { metadata, spec } = manifest;
|
|
164
|
+
const logger = (0, logging_1.getLogger)({ name: `${metadata.siteId}-config-plugin` });
|
|
165
|
+
const bodySchema = (0, json_schema_to_zod_1.jsonSchemaToZod)(spec.request);
|
|
166
|
+
const responseSchema = (0, json_schema_to_zod_1.jsonSchemaToZod)(spec.response);
|
|
167
|
+
const extractSchema = (0, json_schema_to_zod_1.jsonSchemaToZod)(spec.extract.schema);
|
|
168
|
+
const executeHttp = spec.httpModule ? await loadHttpModule(spec.httpModule, baseDir) : undefined;
|
|
169
|
+
const hasUploadStep = spec.flow.steps.some((s) => typeof s !== "string" && s.upload === true);
|
|
170
|
+
const declaredFields = new Set(Object.keys(spec.request.properties ?? {}));
|
|
171
|
+
const plugin = {
|
|
172
|
+
meta: {
|
|
173
|
+
siteId: metadata.siteId,
|
|
174
|
+
displayName: metadata.displayName,
|
|
175
|
+
bodySchema,
|
|
176
|
+
responseSchema,
|
|
177
|
+
apiVersion: plugin_api_version_1.PLUGIN_API_VERSION,
|
|
178
|
+
...(spec.routeOverride !== undefined && { routeOverride: spec.routeOverride }),
|
|
179
|
+
...(spec.defaultBaseUrl !== undefined && { defaultBaseUrl: spec.defaultBaseUrl }),
|
|
180
|
+
...(spec.taskTimeoutMs !== undefined && { taskTimeoutMs: spec.taskTimeoutMs }),
|
|
181
|
+
...(spec.multipart !== undefined && { multipart: spec.multipart }),
|
|
182
|
+
...(spec.advancedStealth !== undefined && { advancedStealth: spec.advancedStealth }),
|
|
183
|
+
},
|
|
184
|
+
...(executeHttp && { executeHttp }),
|
|
185
|
+
async execute(rawPayload, session, context) {
|
|
186
|
+
const payload = rawPayload;
|
|
187
|
+
const { stagehand } = session;
|
|
188
|
+
const page = await (0, navigate_1.navigateActivePage)(stagehand, context.baseUrl, context.metricsCollector);
|
|
189
|
+
const steps = spec.flow.steps.map((s) => toHealingStep(s, payload, declaredFields));
|
|
190
|
+
const anthropic = context.config.scraper.anthropicApiKey
|
|
191
|
+
? new sdk_1.default({ apiKey: context.config.scraper.anthropicApiKey })
|
|
192
|
+
: null;
|
|
193
|
+
await (0, flow_runner_1.runHealingFlow)({
|
|
194
|
+
stagehand,
|
|
195
|
+
page,
|
|
196
|
+
steps,
|
|
197
|
+
logger,
|
|
198
|
+
anthropic,
|
|
199
|
+
resumeFixture: buildResumeFixture(payload, hasUploadStep, spec.multipart ?? false),
|
|
200
|
+
submitEndpointPattern: spec.flow.submitEndpointPattern ?? null,
|
|
201
|
+
submittedStateSelectors: spec.flow.submittedStateSelectors ?? [],
|
|
202
|
+
requireSubmitEndpointMatch: spec.flow.requireSubmitEndpointMatch ?? false,
|
|
203
|
+
advanceTransitionBodyPattern: spec.flow.advanceTransitionBodyPattern ?? null,
|
|
204
|
+
successUrlFragments: spec.flow.successUrlFragments ?? [],
|
|
205
|
+
successPageTitleHints: spec.flow.successPageTitleHints ?? [],
|
|
206
|
+
ownBackendHostnames: spec.flow.ownBackendHostnames ?? [],
|
|
207
|
+
knownErrorClassPrefixes: spec.flow.knownErrorClassPrefixes ?? [],
|
|
208
|
+
wizardExitButtonLabels: spec.flow.wizardExitButtonLabels ?? [],
|
|
209
|
+
});
|
|
210
|
+
const data = await (0, stagehand_guard_1.guardedExtract)(stagehand, spec.extract.instruction, extractSchema);
|
|
211
|
+
return { data };
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
return plugin;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=config-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-plugin.js","sourceRoot":"","sources":["../../src/plugins/config-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { AppConfig } from "../config";
|
|
2
|
+
import type { SitePlugin } from "../site-plugin";
|
|
3
|
+
/**
|
|
4
|
+
* Describes the outcome of attempting to load a single plugin specifier.
|
|
5
|
+
* Surfaced by `GET /v1/plugins` and emitted to startup logs.
|
|
6
|
+
*/
|
|
7
|
+
export interface PluginLoadRecord {
|
|
8
|
+
/** `null` when the module failed before `meta.siteId` was readable. */
|
|
9
|
+
siteId: string | null;
|
|
10
|
+
displayName: string | null;
|
|
11
|
+
/** Raw specifier from `BARNACLE_PLUGINS` or `"(builtin)"` for in-tree plugins. */
|
|
12
|
+
specifier: string;
|
|
13
|
+
/** Resolved absolute path or package entry point. `null` when resolution failed. */
|
|
14
|
+
resolvedPath: string | null;
|
|
15
|
+
route: string | null;
|
|
16
|
+
apiVersion: string | null;
|
|
17
|
+
status: "loaded" | "disabled";
|
|
18
|
+
/** Present only when `status === "disabled"`. */
|
|
19
|
+
reason?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Aggregated result of loading a set of plugin specifiers, returned by
|
|
23
|
+
* `loadPlugins` and `loadAllPlugins`.
|
|
24
|
+
*/
|
|
25
|
+
export interface LoadPluginsResult {
|
|
26
|
+
plugins: SitePlugin<unknown, unknown>[];
|
|
27
|
+
report: PluginLoadRecord[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Statically-registered in-tree plugins. Empty by default: this engine branch
|
|
31
|
+
* ships no site plugins, so operators register every plugin at runtime via
|
|
32
|
+
* `BARNACLE_PLUGINS` (compiled module specifiers) or `*.plugin.json` config
|
|
33
|
+
* manifests. Kept as a mutable array so tests can push a fixture builtin and so
|
|
34
|
+
* a downstream branch that vendors sites in-tree can repopulate it.
|
|
35
|
+
*
|
|
36
|
+
* @see loadAllPlugins for how built-ins and out-of-tree plugins are composed.
|
|
37
|
+
*/
|
|
38
|
+
export declare const BUILTIN_SITE_PLUGINS: SitePlugin<unknown, unknown>[];
|
|
39
|
+
/**
|
|
40
|
+
* Resolves a plugin specifier to a `file://` URL string that `import()` can
|
|
41
|
+
* consume. Follows the Babel plugin-resolution model:
|
|
42
|
+
*
|
|
43
|
+
* - Leading `.` or `/` → filesystem path resolved relative to `baseDir`.
|
|
44
|
+
* - Anything else → npm package resolved via `createRequire` against
|
|
45
|
+
* `baseDir/package.json`, so the operator's local `node_modules` wins.
|
|
46
|
+
*
|
|
47
|
+
* Throws with the specifier and baseDir in the message when resolution fails,
|
|
48
|
+
* so callers can build a descriptive disabled record without catching broadly.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolvePluginSpecifier(spec: string, baseDir: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Loads and validates a list of plugin specifiers. Each specifier is resolved,
|
|
53
|
+
* imported, shape-validated, version-checked, and deduplication-checked before
|
|
54
|
+
* being added to the result. Failures produce disabled records; under `strict`
|
|
55
|
+
* mode the first failure re-throws immediately.
|
|
56
|
+
*
|
|
57
|
+
* `seenSiteIds` is mutated in place so the caller can pre-seed it with built-in
|
|
58
|
+
* ids before calling this function (built-ins always win collisions).
|
|
59
|
+
*/
|
|
60
|
+
export declare function loadPlugins(specifiers: readonly string[], opts: {
|
|
61
|
+
baseDir: string;
|
|
62
|
+
strict: boolean;
|
|
63
|
+
seenSiteIds: Set<string>;
|
|
64
|
+
}): Promise<LoadPluginsResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Composes built-in and out-of-tree plugins into a single result. Built-ins
|
|
67
|
+
* are always listed first and their `siteId`s seed the deduplication set, so
|
|
68
|
+
* an out-of-tree plugin that collides with a built-in is disabled rather than
|
|
69
|
+
* replacing it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function loadAllPlugins(cfg: AppConfig): Promise<LoadPluginsResult>;
|
|
72
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IACxC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,EAAO,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc5E;AA2HD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,IAAI,EAAE;IACJ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B,GACA,OAAO,CAAC,iBAAiB,CAAC,CAyD5B;AAuBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6B/E"}
|
|
@@ -0,0 +1,265 @@
|
|
|
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.BUILTIN_SITE_PLUGINS = void 0;
|
|
7
|
+
exports.resolvePluginSpecifier = resolvePluginSpecifier;
|
|
8
|
+
exports.loadPlugins = loadPlugins;
|
|
9
|
+
exports.loadAllPlugins = loadAllPlugins;
|
|
10
|
+
const promises_1 = require("node:fs/promises");
|
|
11
|
+
const node_module_1 = require("node:module");
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const node_url_1 = require("node:url");
|
|
14
|
+
const v4_1 = require("zod/v4");
|
|
15
|
+
const logging_1 = require("../lib/logging");
|
|
16
|
+
const config_plugin_1 = require("../plugins/config-plugin");
|
|
17
|
+
const plugin_api_version_1 = require("../plugins/plugin-api-version");
|
|
18
|
+
const logger = (0, logging_1.getLogger)({ name: "plugins/discover" });
|
|
19
|
+
/**
|
|
20
|
+
* Statically-registered in-tree plugins. Empty by default: this engine branch
|
|
21
|
+
* ships no site plugins, so operators register every plugin at runtime via
|
|
22
|
+
* `BARNACLE_PLUGINS` (compiled module specifiers) or `*.plugin.json` config
|
|
23
|
+
* manifests. Kept as a mutable array so tests can push a fixture builtin and so
|
|
24
|
+
* a downstream branch that vendors sites in-tree can repopulate it.
|
|
25
|
+
*
|
|
26
|
+
* @see loadAllPlugins for how built-ins and out-of-tree plugins are composed.
|
|
27
|
+
*/
|
|
28
|
+
exports.BUILTIN_SITE_PLUGINS = [];
|
|
29
|
+
/**
|
|
30
|
+
* Resolves a plugin specifier to a `file://` URL string that `import()` can
|
|
31
|
+
* consume. Follows the Babel plugin-resolution model:
|
|
32
|
+
*
|
|
33
|
+
* - Leading `.` or `/` → filesystem path resolved relative to `baseDir`.
|
|
34
|
+
* - Anything else → npm package resolved via `createRequire` against
|
|
35
|
+
* `baseDir/package.json`, so the operator's local `node_modules` wins.
|
|
36
|
+
*
|
|
37
|
+
* Throws with the specifier and baseDir in the message when resolution fails,
|
|
38
|
+
* so callers can build a descriptive disabled record without catching broadly.
|
|
39
|
+
*/
|
|
40
|
+
function resolvePluginSpecifier(spec, baseDir) {
|
|
41
|
+
if (spec.startsWith(".") || spec.startsWith("/")) {
|
|
42
|
+
return (0, node_url_1.pathToFileURL)(node_path_1.default.resolve(baseDir, spec)).href;
|
|
43
|
+
}
|
|
44
|
+
const req = (0, node_module_1.createRequire)((0, node_url_1.pathToFileURL)(node_path_1.default.join(baseDir, "package.json")).href);
|
|
45
|
+
try {
|
|
46
|
+
const resolved = req.resolve(spec);
|
|
47
|
+
return (0, node_url_1.pathToFileURL)(resolved).href;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new Error(`cannot resolve plugin specifier ${JSON.stringify(spec)} from baseDir ${JSON.stringify(baseDir)}: ${err instanceof Error ? err.message : String(err)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Returns true when `s` looks like a Zod schema without relying on `instanceof`. */
|
|
54
|
+
function looksLikeZodSchema(s) {
|
|
55
|
+
return (typeof s?.safeParse === "function" &&
|
|
56
|
+
typeof s?.parse === "function");
|
|
57
|
+
}
|
|
58
|
+
const metaSchema = v4_1.z
|
|
59
|
+
.object({
|
|
60
|
+
siteId: v4_1.z.string().min(1),
|
|
61
|
+
displayName: v4_1.z.string().min(1),
|
|
62
|
+
routeOverride: v4_1.z.string().optional(),
|
|
63
|
+
defaultBaseUrl: v4_1.z.string().optional(),
|
|
64
|
+
taskTimeoutMs: v4_1.z.number().optional(),
|
|
65
|
+
multipart: v4_1.z.boolean().optional(),
|
|
66
|
+
advancedStealth: v4_1.z.boolean().optional(),
|
|
67
|
+
apiVersion: v4_1.z.string().optional(),
|
|
68
|
+
extraRoutes: v4_1.z.array(v4_1.z.unknown()).optional(),
|
|
69
|
+
})
|
|
70
|
+
.passthrough();
|
|
71
|
+
/**
|
|
72
|
+
* Duck-typed shape validation for an untrusted module export. Uses Zod for
|
|
73
|
+
* `meta` field presence/types, but checks `bodySchema`/`responseSchema` via
|
|
74
|
+
* duck-typing so plugins that bundle their own zod copy are not falsely
|
|
75
|
+
* rejected.
|
|
76
|
+
*/
|
|
77
|
+
function validatePluginShape(raw) {
|
|
78
|
+
const obj = raw;
|
|
79
|
+
metaSchema.parse(obj.meta);
|
|
80
|
+
if (!looksLikeZodSchema(obj.meta?.bodySchema)) {
|
|
81
|
+
throw new Error("meta.bodySchema must be a Zod schema");
|
|
82
|
+
}
|
|
83
|
+
if (!looksLikeZodSchema(obj.meta?.responseSchema)) {
|
|
84
|
+
throw new Error("meta.responseSchema must be a Zod schema");
|
|
85
|
+
}
|
|
86
|
+
if (typeof obj.execute !== "function") {
|
|
87
|
+
throw new Error("plugin.execute must be a function");
|
|
88
|
+
}
|
|
89
|
+
return raw;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Parses the leading integer from a semver string, e.g. `"1.2.3"` → `1`.
|
|
93
|
+
* Returns `null` when the string cannot be parsed as a major version.
|
|
94
|
+
*/
|
|
95
|
+
function parseMajorVersion(version) {
|
|
96
|
+
const match = /^(\d+)/.exec(version.trim());
|
|
97
|
+
return match ? parseInt(match[1] ?? "0", 10) : null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Creates a disabled `PluginLoadRecord` from minimal information. Used when
|
|
101
|
+
* a plugin fails at any stage of loading.
|
|
102
|
+
*/
|
|
103
|
+
function disabledRecord(opts) {
|
|
104
|
+
const meta = opts.plugin?.meta;
|
|
105
|
+
return {
|
|
106
|
+
siteId: meta?.siteId ?? null,
|
|
107
|
+
displayName: meta?.displayName ?? null,
|
|
108
|
+
specifier: opts.specifier,
|
|
109
|
+
resolvedPath: opts.resolvedPath,
|
|
110
|
+
route: meta ? (meta.routeOverride ?? `/v1/${meta.siteId}/run`) : null,
|
|
111
|
+
apiVersion: meta?.apiVersion ?? null,
|
|
112
|
+
status: "disabled",
|
|
113
|
+
reason: opts.reason,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Normalizes the three supported module export shapes into a single object.
|
|
118
|
+
*
|
|
119
|
+
* When CJS `module.exports = { plugin }` is loaded via dynamic `import()`,
|
|
120
|
+
* Node exposes the entire exports object as `m.default` AND hoists named
|
|
121
|
+
* exports so `m.plugin` is the actual plugin. We must resolve the `plugin`
|
|
122
|
+
* named export before falling back to `default`, otherwise we'd return the
|
|
123
|
+
* wrapper `{ plugin }` object which fails shape validation.
|
|
124
|
+
*
|
|
125
|
+
* Resolution order:
|
|
126
|
+
* 1. `m.plugin` — named `{ plugin }` export (CJS or ESM)
|
|
127
|
+
* 2. `m.default` — ESM default export
|
|
128
|
+
* 3. `m` itself — CJS `module.exports = plugin` (no default wrapping)
|
|
129
|
+
*/
|
|
130
|
+
function normalizeExport(mod) {
|
|
131
|
+
const m = mod;
|
|
132
|
+
return m.plugin ?? m.default ?? mod;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Produces a raw plugin object from a resolved `file://` specifier. A `.json`
|
|
136
|
+
* specifier is a declarative manifest — read, parse, and run through
|
|
137
|
+
* `buildConfigPlugin` to synthesize a `SitePlugin` (no per-site TypeScript, no
|
|
138
|
+
* compile step). Anything else is a compiled module `import()`ed as before. The
|
|
139
|
+
* synthesized object still flows through the same `validatePluginShape` gate as
|
|
140
|
+
* a module plugin, so the two sources share one validation path.
|
|
141
|
+
*
|
|
142
|
+
* `baseDir` is threaded into `buildConfigPlugin` so a manifest's relative
|
|
143
|
+
* `spec.httpModule` escape-hatch path resolves against the operator's plugin
|
|
144
|
+
* directory, consistent with how module specifiers themselves are resolved.
|
|
145
|
+
*/
|
|
146
|
+
async function loadRawPlugin(resolvedPath, baseDir) {
|
|
147
|
+
if (resolvedPath.endsWith(".json")) {
|
|
148
|
+
const manifest = JSON.parse(await (0, promises_1.readFile)((0, node_url_1.fileURLToPath)(resolvedPath), "utf8"));
|
|
149
|
+
return await (0, config_plugin_1.buildConfigPlugin)(manifest, baseDir);
|
|
150
|
+
}
|
|
151
|
+
const mod = await import(resolvedPath);
|
|
152
|
+
return normalizeExport(mod);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Loads and validates a list of plugin specifiers. Each specifier is resolved,
|
|
156
|
+
* imported, shape-validated, version-checked, and deduplication-checked before
|
|
157
|
+
* being added to the result. Failures produce disabled records; under `strict`
|
|
158
|
+
* mode the first failure re-throws immediately.
|
|
159
|
+
*
|
|
160
|
+
* `seenSiteIds` is mutated in place so the caller can pre-seed it with built-in
|
|
161
|
+
* ids before calling this function (built-ins always win collisions).
|
|
162
|
+
*/
|
|
163
|
+
async function loadPlugins(specifiers, opts) {
|
|
164
|
+
const { baseDir, strict, seenSiteIds } = opts;
|
|
165
|
+
const plugins = [];
|
|
166
|
+
const report = [];
|
|
167
|
+
for (const spec of specifiers) {
|
|
168
|
+
let resolvedPath = null;
|
|
169
|
+
let plugin;
|
|
170
|
+
try {
|
|
171
|
+
resolvedPath = resolvePluginSpecifier(spec, baseDir);
|
|
172
|
+
const raw = await loadRawPlugin(resolvedPath, baseDir);
|
|
173
|
+
plugin = validatePluginShape(raw);
|
|
174
|
+
const meta = plugin.meta;
|
|
175
|
+
if (meta.apiVersion !== undefined) {
|
|
176
|
+
const pluginMajor = parseMajorVersion(meta.apiVersion);
|
|
177
|
+
const coreMajor = parseMajorVersion(plugin_api_version_1.PLUGIN_API_VERSION);
|
|
178
|
+
if (pluginMajor === null || coreMajor === null || pluginMajor !== coreMajor) {
|
|
179
|
+
const reason = `apiVersion ${meta.apiVersion} incompatible with core ${plugin_api_version_1.PLUGIN_API_VERSION}`;
|
|
180
|
+
logger.warn(`${spec}: ${reason}`);
|
|
181
|
+
report.push(disabledRecord({ specifier: spec, resolvedPath, plugin, reason }));
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (seenSiteIds.has(meta.siteId)) {
|
|
186
|
+
const reason = `duplicate siteId "${meta.siteId}" — already registered`;
|
|
187
|
+
logger.warn(`${spec}: ${reason}`);
|
|
188
|
+
report.push(disabledRecord({ specifier: spec, resolvedPath, plugin, reason }));
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
seenSiteIds.add(meta.siteId);
|
|
192
|
+
plugins.push(plugin);
|
|
193
|
+
logger.info(`${spec}: loaded siteId "${meta.siteId}" (${plugin_api_version_1.PLUGIN_API_VERSION})`);
|
|
194
|
+
report.push({
|
|
195
|
+
siteId: meta.siteId,
|
|
196
|
+
displayName: meta.displayName,
|
|
197
|
+
specifier: spec,
|
|
198
|
+
resolvedPath,
|
|
199
|
+
route: meta.routeOverride ?? `/v1/${meta.siteId}/run`,
|
|
200
|
+
apiVersion: meta.apiVersion ?? null,
|
|
201
|
+
status: "loaded",
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
206
|
+
logger.warn(`${spec}: failed to load — ${reason}`);
|
|
207
|
+
report.push(disabledRecord({ specifier: spec, resolvedPath, plugin, reason }));
|
|
208
|
+
if (strict)
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return { plugins, report };
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Scans `configDir` for `*.plugin.json` manifests and returns their absolute
|
|
216
|
+
* paths as loader specifiers. Best-effort: an unreadable directory yields an
|
|
217
|
+
* empty list with a warn log so a misconfigured `BARNACLE_PLUGINS_CONFIG_DIR`
|
|
218
|
+
* never crashes boot — the same failure-isolation posture as a bad plugin.
|
|
219
|
+
*/
|
|
220
|
+
async function discoverConfigManifests(configDir) {
|
|
221
|
+
try {
|
|
222
|
+
const entries = await (0, promises_1.readdir)(configDir);
|
|
223
|
+
return entries
|
|
224
|
+
.filter((name) => name.endsWith(".plugin.json"))
|
|
225
|
+
.sort()
|
|
226
|
+
.map((name) => node_path_1.default.resolve(configDir, name));
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
logger.warn(`plugin config dir ${JSON.stringify(configDir)} not scannable — ${err instanceof Error ? err.message : String(err)}`);
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Composes built-in and out-of-tree plugins into a single result. Built-ins
|
|
235
|
+
* are always listed first and their `siteId`s seed the deduplication set, so
|
|
236
|
+
* an out-of-tree plugin that collides with a built-in is disabled rather than
|
|
237
|
+
* replacing it.
|
|
238
|
+
*/
|
|
239
|
+
async function loadAllPlugins(cfg) {
|
|
240
|
+
const builtins = exports.BUILTIN_SITE_PLUGINS;
|
|
241
|
+
const seenSiteIds = new Set(builtins.map((p) => p.meta.siteId));
|
|
242
|
+
const builtinReport = builtins.map((p) => ({
|
|
243
|
+
siteId: p.meta.siteId,
|
|
244
|
+
displayName: p.meta.displayName,
|
|
245
|
+
specifier: "(builtin)",
|
|
246
|
+
resolvedPath: null,
|
|
247
|
+
route: p.meta.routeOverride ?? `/v1/${p.meta.siteId}/run`,
|
|
248
|
+
apiVersion: p.meta.apiVersion ?? null,
|
|
249
|
+
status: "loaded",
|
|
250
|
+
}));
|
|
251
|
+
const configManifests = cfg.plugins.configDir
|
|
252
|
+
? await discoverConfigManifests(cfg.plugins.configDir)
|
|
253
|
+
: [];
|
|
254
|
+
const specifiers = [...cfg.plugins.specifiers, ...configManifests];
|
|
255
|
+
const { plugins, report } = await loadPlugins(specifiers, {
|
|
256
|
+
baseDir: cfg.plugins.baseDir,
|
|
257
|
+
strict: cfg.plugins.strict,
|
|
258
|
+
seenSiteIds,
|
|
259
|
+
});
|
|
260
|
+
return {
|
|
261
|
+
plugins: [...builtins, ...plugins],
|
|
262
|
+
report: [...builtinReport, ...report],
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a JSON-Schema fragment into a live Zod schema instance built from
|
|
3
|
+
* the project's own `zod/v4` import. Config plugins declare their request,
|
|
4
|
+
* response, and extract shapes as inert JSON Schema in the manifest; the loader
|
|
5
|
+
* needs real Zod instances because `validatePluginShape`
|
|
6
|
+
* (`src/plugins/discover.ts`) duck-types `meta.bodySchema`/`meta.responseSchema`
|
|
7
|
+
* for `safeParse`/`parse`, and `guardedExtract` constrains its schema argument
|
|
8
|
+
* to `z.ZodTypeAny`.
|
|
9
|
+
*
|
|
10
|
+
* Why in-house and not a library: `z.fromJSONSchema` does not exist on the
|
|
11
|
+
* pinned `zod@3.25.76` (only the reverse `z.toJSONSchema`), and any third-party
|
|
12
|
+
* converter would emit an instance from a *different* Zod copy — failing both
|
|
13
|
+
* the loader duck-type and Stagehand's `StagehandZodSchema` union. Building from
|
|
14
|
+
* this module's own `z` is the only instance-safe route.
|
|
15
|
+
*
|
|
16
|
+
* Scope is deliberately the flat form real form-field payloads need
|
|
17
|
+
* (object/string/number/integer/boolean/array/enum + `required`). Anything
|
|
18
|
+
* outside that surface throws at load time rather than silently degrading, so a
|
|
19
|
+
* manifest that leans on unsupported JSON-Schema features fails loudly.
|
|
20
|
+
*/
|
|
21
|
+
import { z } from "zod/v4";
|
|
22
|
+
/** Thrown when a manifest schema uses a JSON-Schema construct this converter does not support. */
|
|
23
|
+
export declare class UnsupportedJsonSchemaError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Recursive shape of the JSON-Schema subset this converter accepts. Validated
|
|
28
|
+
* structurally by {@link JSON_SCHEMA_NODE} before conversion so a malformed
|
|
29
|
+
* manifest schema is rejected with a Zod error rather than a runtime crash
|
|
30
|
+
* mid-conversion.
|
|
31
|
+
*/
|
|
32
|
+
export interface JsonSchemaNode {
|
|
33
|
+
type?: "object" | "string" | "number" | "integer" | "boolean" | "array";
|
|
34
|
+
properties?: Record<string, JsonSchemaNode>;
|
|
35
|
+
required?: string[];
|
|
36
|
+
items?: JsonSchemaNode;
|
|
37
|
+
enum?: string[];
|
|
38
|
+
format?: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Converts a manifest's JSON-Schema fragment into a Zod schema instance.
|
|
43
|
+
* Validates the fragment's structure first so unsupported constructs surface as
|
|
44
|
+
* a descriptive error at plugin-load time instead of a downstream parse crash.
|
|
45
|
+
*/
|
|
46
|
+
export declare function jsonSchemaToZod(schema: unknown): z.ZodTypeAny;
|
|
47
|
+
//# sourceMappingURL=json-schema-to-zod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-to-zod.d.ts","sourceRoot":"","sources":["../../src/plugins/json-schema-to-zod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,kGAAkG;AAClG,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgDD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,UAAU,CAQ7D"}
|