Skip to main content

Challenger Contract

Defined in packages/core/src/extension/challenger-contract.ts. For the concepts behind these fields, read Extending Tentacrawl first; this page is the exhaustive field list.

ChallengerExtension

FieldTypeNotes
moduleIdstringOwning module
extensionIdstringUnique within the module
versionstring
priority?numberDefault 100; lower runs earlier
capabilitiesChallengerCapability[]Declared and, for interception, enforced
targets?ChallengerTarget[]Extension-level run filter
configSchema?ZodSchemaValidated per run; injected as ctx.config
selection?ChallengerSelectionDescriptorPoints the admin UI at an endpoint listing selectable options (e.g. proxy servers)
register?(registrar)Attach granular handlers
beforeRun?/afterRun?(ctx)Promise<void>Coarse whole-run hooks
onError?(ctx, error)Promise<void>Covers runs that crash before run-outcome fires

Capabilities

proxy, session, fingerprint, navigation, signal-analysis, artifact-analysis, user-behavior, dsl-action, request-intercept, response-intercept.

ChallengerRegistrar methods

MethodContext typeStage
onBootstrapContextChallengerBootstrapContextBefore the browser context is built
onCreatePageChallengerPageContextAfter context.newPage()
beforeNavigation / afterNavigationChallengerNavigationContextAround each navigation
beforeStep / afterStepChallengerStepContextAround each DSL step
onRequest / onResponse / onRedirectChallengerRequestContext / ChallengerResponseContext / ChallengerRedirectContextObserve-only network events
interceptRequestChallengerRouteContextMutating only; requires request-intercept
interceptResponseChallengerResponseInterceptContextMutating only; requires response-intercept
onSessionSnapshotChallengerSessionContextCookies, storage, headers
onSignalChallengerSignalContextFan-out from any emitSignal call
onArtefactCollected / onDiscoveredLinkChallengerArtifactContextCan drop a discovered link
onRunOutcomeChallengerRunOutcomeContextFinal outcome, before afterRun
registerActionChallengerActionDefinition; see Add a Custom DSL Action

Every method takes an optional ChallengerHandlerOptions: mode ('mutating' | 'observer', default 'mutating'), priority, timeoutMs, errorPolicy ('warn-and-continue' | 'fail-run' | 'disable-extension-for-run', default 'warn-and-continue'), targets. interceptRequest/interceptResponse additionally accept routePatterns and resourceTypes.

ChallengerHelperApi

MethodEffect
emitSignal(signal)See Signals and Diagnostics
appendArtifact(key, value)Namespaced under challenger.<extensionId>.<key>
dropDiscoveredLink(reason?)Artifact/link stage only
setProxyCandidate(candidate)
patchContextOptions(patch)Only honored from onBootstrapContext / beforeRun
setSessionState(patch)Cookies, local/session storage, extra headers
requestNavigationOverride(override)'continue' | 'retry' | 'abort' | 'delay'
setOutcomeOverride(override)Sets the final RunOutcome and a reason

Built-in signal types

network.blocked, network.redirect-loop, network.challenge-header, session.cookies-changed, session.storage-changed, page.captcha-suspected, page.interstitial-detected, page.login-required, page.unusual-fingerprint-feedback, run.outcome-overridden, route.decided, route.response-modified. The type is open (string & {}) — an extension can emit its own.