@enricai/barnacle 1.12.19 → 1.12.21

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.
@@ -16,12 +16,18 @@ export declare function buildCapture(overrides: {
16
16
  requestPostData: string | null;
17
17
  responseBody: unknown;
18
18
  timestamp: string;
19
+ requestHeaders?: Record<string, string>;
20
+ responseHeaders?: Record<string, string>;
21
+ method?: string;
19
22
  }): Capture;
20
23
  export declare function buildStep(varName: string, overrides: {
21
24
  url: string;
22
25
  requestPostData: string | null;
23
26
  responseBody: unknown;
24
27
  timestamp: string;
28
+ requestHeaders?: Record<string, string>;
29
+ responseHeaders?: Record<string, string>;
30
+ method?: string;
25
31
  }): MulticallFixtureStep;
26
32
  /**
27
33
  * Reproduces a listings-fixture G1/G2 recon capture set: a
@@ -45,6 +51,21 @@ export declare function buildMulticallHeterogeneousActionSteps(): MulticallFixtu
45
51
  * fired after the user picks one building from the products list).
46
52
  */
47
53
  export declare function buildMulticallHeterogeneousActionStepsWithDrillDown(): MulticallFixtureStep[];
54
+ /**
55
+ * Reproduces a search-then-per-item-drill-down flow whose primary page
56
+ * carries multiple results, each followed by its own drill-down call — the
57
+ * shape {@link detectDrillDownFoldPlan} must resolve by join key rather than
58
+ * by position. `search`/`page 2` is re-queried (distinct body from `page 1`)
59
+ * so it satisfies {@link findRequeriedActions}'s relevance signal, and its
60
+ * response holds two items (`i-b` then `i-a`, deliberately not alphabetical)
61
+ * so a later merge can't assume primary-array order. The two drill-down
62
+ * calls are fired in the OPPOSITE order of the primary array (`i-a`'s
63
+ * drill-down first, `i-b`'s second) — a positional/index-based fold would
64
+ * pair the wrong item with the wrong drill-down response, while a join-key
65
+ * fold (matching each drill request's `itemId` back to the primary item that
66
+ * produced it) pairs them correctly regardless of call order.
67
+ */
68
+ export declare function buildMulticallDependentDrillDownActionSteps(): MulticallFixtureStep[];
48
69
  /**
49
70
  * Reproduces a wizard-style checkout submission on one host: a create-order
50
71
  * call followed by a per-section save POST for each wizard step
@@ -59,4 +80,617 @@ export declare function buildMulticallHeterogeneousActionStepsWithDrillDown(): M
59
80
  * capture set).
60
81
  */
61
82
  export declare function buildWizardCheckoutCaptures(): Capture[];
83
+ /**
84
+ * A search → per-item drill-down flow whose search endpoint fires exactly
85
+ * ONCE. {@link detectDrillDownFoldPlan} now scans every prior action as a
86
+ * fold-primary candidate, so a single-shot search is just as eligible as a
87
+ * re-queried one — but the primary response here also carries a decoy
88
+ * `facets[]` array ahead of the real `results[]`, so `findObjectArrayField`'s
89
+ * DFS first-match deliberately disagrees with the array a caller would fold
90
+ * onto. `resolveFoldPlan(steps)` on this fixture still returns `null`, but
91
+ * only because of that decoy, not because the search fires once. That
92
+ * decoy-vs-declared-path gap is the shape the flow-declared `foldReturn`
93
+ * (`FoldReturnSpec`/`resolveFoldPlan`) exists to reach.
94
+ *
95
+ * The decoy is load-bearing for a `resolveFoldPlan`/`foldReturn` test
96
+ * elsewhere; {@link buildMulticallSingleShotSearchDrillDownNoDecoyActionSteps}
97
+ * is the decoy-free sibling used to prove `detectDrillDownFoldPlan` alone
98
+ * detects a single-shot primary.
99
+ */
100
+ export declare function buildMulticallSingleShotSearchDrillDownActionSteps(): MulticallFixtureStep[];
101
+ /**
102
+ * A search → per-item drill-down flow whose search response is unambiguous
103
+ * (a single `results[]` array, no decoy), but whose DRILL step's response
104
+ * carries a decoy `errors[]` array ahead of the real per-item `details[]`
105
+ * array. `findObjectArrayField`'s DFS first-match lands on `errors[]`
106
+ * instead of `details[]` when resolving the drill side of the fold, so a
107
+ * `foldReturn` declaration that only names the primary's `resultsPath`
108
+ * (see {@link FoldReturnSpec}) cannot fix this — the gap is on the drill
109
+ * side, not the primary side. Proves a drill-side results-path declaration
110
+ * (as opposed to {@link buildMulticallSingleShotSearchDrillDownActionSteps}'s
111
+ * primary-side decoy) is what a `drillResultsPath`-style flow declaration
112
+ * exists to reach.
113
+ */
114
+ export declare function buildMulticallSingleShotSearchDrillDownDrillDecoyActionSteps(): MulticallFixtureStep[];
115
+ /**
116
+ * A decoy-free sibling of {@link buildMulticallSingleShotSearchDrillDownActionSteps}:
117
+ * the search endpoint still fires exactly once, but `results[]` is the sole
118
+ * object-array field in its response, so `findObjectArrayField`'s DFS
119
+ * first-match lands on the real results array with no declared `foldReturn`
120
+ * needed. Proves the single-shot primary is detected on structure alone.
121
+ */
122
+ export declare function buildMulticallSingleShotSearchDrillDownNoDecoyActionSteps(): MulticallFixtureStep[];
123
+ /**
124
+ * A nested-join-key sibling of {@link buildMulticallSingleShotSearchDrillDownNoDecoyActionSteps}
125
+ * with a SECOND primary item, so a per-item fold loop is actually exercised
126
+ * (not just a single-item detection check): each primary `results[]` item
127
+ * carries its join key under a nested `identifiers` object
128
+ * (`{ identifiers: { sku } }`) instead of as a top-level field, while the
129
+ * drill-down request is still keyed by the plain `sku` value pulled out of
130
+ * that nested field. Proves the fold loop threads a join key found by
131
+ * walking INTO an item's nested objects, not only its own top-level
132
+ * `Object.entries`, across every primary item.
133
+ */
134
+ export declare function buildMulticallSingleShotSearchDrillDownNestedJoinFieldMultiItemActionSteps(): MulticallFixtureStep[];
135
+ /**
136
+ * A search → per-item drill-down flow whose DRILL step's response carries
137
+ * BOTH a small real nested object-array field (`tags[]`, one primitive
138
+ * field per item, no join echo) AND richer flat top-level per-item fields
139
+ * (`name`/`price`/`brand`, none of them echoing the join either) — the
140
+ * shape {@link findAllObjectArrayFieldsOrWholeObject}'s old docstring
141
+ * ("a response that already has one [a real object-array field] is never
142
+ * second-guessed") resolved to the tiny `tags[]` array instead of the
143
+ * richer flat object. Neither candidate threads the join value in its
144
+ * response body (only the drill REQUEST carries `sku-a`), so selection must
145
+ * fall through to comparing per-item primitive-field richness, which the
146
+ * flat object wins 3 (`name`/`price`/`brand`) to 1 (`tags[0].id`).
147
+ */
148
+ export declare function buildMulticallSingleShotSearchDrillDownRicherFlatOutranksNestedArrayActionSteps(): MulticallFixtureStep[];
149
+ /**
150
+ * A decoy-free sibling of {@link buildMulticallSingleShotSearchDrillDownNoDecoyActionSteps}
151
+ * with a SECOND, independently-threaded per-item drill-down appended: the
152
+ * primary `results[]` items carry both a `sku` (joined to the pricing drill)
153
+ * and an `itemId` (joined to this inventory drill), and neither drill
154
+ * step's response overlaps the other's fields. Proves the fold loop merges
155
+ * fields from every independent target onto each item, not just the first.
156
+ */
157
+ export declare function buildMulticallSingleShotSearchTwoIndependentDrillDownsActionSteps(): MulticallFixtureStep[];
158
+ /**
159
+ * A sibling of {@link buildMulticallSingleShotSearchTwoIndependentDrillDownsActionSteps}
160
+ * where BOTH per-item drills are threaded off the SAME primary join field
161
+ * (`sku`), rather than disjoint fields (`sku`/`itemId`). Each drill's
162
+ * response echoes that shared `sku` value back alongside its own field —
163
+ * an echo of the primary's own join value, not evidence the second drill
164
+ * depends on the first drill's response. Proves the fold loop still emits
165
+ * and merges BOTH independent drills onto every primary item even when
166
+ * their echoed join values collide, rather than collapsing the second
167
+ * drill into a chain under the first.
168
+ */
169
+ export declare function buildMulticallSingleShotSearchTwoIndependentDrillDownsSharedJoinFieldActionSteps(): MulticallFixtureStep[];
170
+ /**
171
+ * TWO independent primary/drill-down pairs, fully disjoint in both endpoint
172
+ * and step range: a products search folded by a per-product reviews drill
173
+ * (r0/r1), and an UNRELATED vendors search folded by a per-vendor contracts
174
+ * drill (r2/r3). Neither primary's items reference the other pair's join key
175
+ * (`productId` vs `vendorId`), so this proves the fold emitter resolves and
176
+ * loops over every independent plan, not only the first one it finds.
177
+ */
178
+ export declare function buildMulticallTwoIndependentPrimariesActionSteps(): MulticallFixtureStep[];
179
+ /**
180
+ * Same disjoint two-pair shape as
181
+ * {@link buildMulticallTwoIndependentPrimariesActionSteps}, except the SECOND
182
+ * pair's join value threads only through a request HEADER
183
+ * (`collectRequestStringValues` never scans headers), so
184
+ * `detectDrillDownFoldPlan`'s structural heuristic resolves only the FIRST
185
+ * pair (r0/r1) on its own; the second pair (r2/r3) is only reachable via a
186
+ * flow-declared `foldReturn` spec naming `vendors` as its `resultsPath`.
187
+ * Since the second pair's primary/drill steps (2, 3) are entirely outside the
188
+ * first pair's own consumed indices ({@link buildMulticallTwoIndependentPrimariesActionSteps}'s
189
+ * r0/r1), a correctly-behaving `resolveFoldPlan` must APPEND the spec's plan
190
+ * as a second, independent entry rather than discarding it just because its
191
+ * primary differs from the one the heuristic already resolved.
192
+ */
193
+ export declare function buildMulticallTwoIndependentPrimariesSecondHeaderThreadedActionSteps(): MulticallFixtureStep[];
194
+ /** A single-shot search drilled by two INDEPENDENT later calls whose join
195
+ * values thread through different surfaces: the pricing step's `sku` lands
196
+ * in its JSON body (heuristically detectable by `collectRequestStringValues`),
197
+ * while the stock step's `itemId` is carried ONLY in a request header —
198
+ * `collectRequestStringValues` never scans headers, so that fold can only be
199
+ * resolved via a flow-declared `foldReturn` spec. Every downstream unit and
200
+ * runtime test that needs one mixed-source, two-target fold scenario should
201
+ * share this fixture rather than inventing its own. */
202
+ export declare function buildMulticallSingleShotSearchHeuristicAndSpecTwoTargetActionSteps(): MulticallFixtureStep[];
203
+ /**
204
+ * TWO occurrences of the SAME primary endpoint (same origin+pathname,
205
+ * differing only by query string), each independently drilling a
206
+ * DIFFERENT item into a DIFFERENT dependent call — unlike
207
+ * {@link buildMulticallSingleShotSearchDrillDownRequeriedPrimaryOverlapActionSteps}
208
+ * (whose two occurrences thread the SAME drill), these thread two distinct
209
+ * drills, so {@link detectDrillDownFoldPlan}'s freshest-wins collapse never
210
+ * applies and both occurrences resolve as their own independent
211
+ * {@link FoldPlan}. Both plans' primary responses share the SAME top-level
212
+ * array key (`results`) — the exact shape a plain `{ ...a, ...b }`
213
+ * object-spread silently collapses to the later plan's array alone, since
214
+ * the emitted return statement folds every resolved plan's own primary var
215
+ * together into the runtime response.
216
+ */
217
+ export declare function buildMulticallTwoOccurrencesSamePrimaryDistinctDrillsActionSteps(): MulticallFixtureStep[];
218
+ /**
219
+ * A grouped, nested-primary drill-down whose primary response carries TWO
220
+ * outer `sections[]` groups rather than the single group every other nested
221
+ * fixture in this file uses, with the drilled entry living in the SECOND
222
+ * group's `entries[]`, not the first. A fold that assumes the matched item
223
+ * always lives in group 0 (as a single-group fixture can never disprove)
224
+ * would resolve the fold onto `sections[0]` and silently attach the drill
225
+ * response's `description` to the wrong entry.
226
+ */
227
+ export declare function buildMulticallNestedGroupedDrillDownMultiGroupActionSteps(): MulticallFixtureStep[];
228
+ /**
229
+ * A single-shot search whose primary item join field (`accountId`) is a
230
+ * NUMBER rather than a string, threaded into the drill-down call via a URL
231
+ * query parameter (`?accountId=42`). `URLSearchParams` always stringifies its
232
+ * values, so the request-collection side already captures `"42"` as a
233
+ * string; the item side of the join is what must widen to accept a numeric
234
+ * leaf for {@link detectDrillDownFoldPlan} to resolve `accountId` as a join
235
+ * field at all.
236
+ */
237
+ export declare function buildMulticallSingleShotSearchDrillDownNumericJoinActionSteps(): MulticallFixtureStep[];
238
+ /**
239
+ * A single-shot search whose primary item join field (`accountId`) is
240
+ * threaded into the drill-down call ONLY as a URL path segment
241
+ * (`/accounts/42/transactions`) — never as a query param or a JSON body
242
+ * value. REST-style APIs commonly shape drill-down calls this way, but
243
+ * `collectRequestStringValues` only harvested query params and JSON body
244
+ * leaves, so this join field was invisible to `findThreadedJoinFields` and
245
+ * {@link detectDrillDownFoldPlan} returned null for this shape.
246
+ */
247
+ export declare function buildMulticallSingleShotSearchDrillDownPathThreadedJoinActionSteps(): MulticallFixtureStep[];
248
+ /**
249
+ * A single-shot search whose primary item join field (`sku`) sits inside a
250
+ * NESTED object (`{ identifiers: { sku } }`) rather than as a top-level
251
+ * property. `findThreadedJoinFields` must walk into nested plain objects to
252
+ * find it, and the resulting joinFields entry is the dot-separated path
253
+ * `"identifiers.sku"`, not the bare leaf name `"sku"`.
254
+ */
255
+ export declare function buildMulticallSingleShotSearchDrillDownNestedJoinFieldActionSteps(): MulticallFixtureStep[];
256
+ /**
257
+ * A single-shot search whose primary items carry a COMPOSITE join key mixing
258
+ * a string field (`region`) and a numeric field (`accountId`), both threaded
259
+ * into the drill-down request. `findThreadedJoinFields` filters candidate
260
+ * fields independently per entry, so a numeric field dropped alongside a
261
+ * present string field would silently degrade the fold to a partial
262
+ * (string-only) join key rather than failing outright — this fixture proves
263
+ * both survive together, in the item's own key order.
264
+ */
265
+ export declare function buildMulticallSingleShotSearchDrillDownCompositeNumericJoinActionSteps(): MulticallFixtureStep[];
266
+ /**
267
+ * A decoy-free single-shot search sibling of
268
+ * {@link buildMulticallSingleShotSearchDrillDownNoDecoyActionSteps} whose
269
+ * `results[]` has TWO items, but whose only captured drill-down call was
270
+ * made for the SECOND item (`sku-b`), not the first. A heuristic that always
271
+ * pairs the primary's `results[0]` with the sole drill step would thread
272
+ * `sku-a` into the fold even though the captured request body only ever
273
+ * mentions `sku-b` — proving the fold must select the drill call's item by
274
+ * matching the join field's actual value, not by array position.
275
+ */
276
+ export declare function buildMulticallSingleShotSearchDrillDownNonFirstItemSkuActionSteps(): MulticallFixtureStep[];
277
+ /**
278
+ * A composite-join sibling of
279
+ * {@link buildMulticallSingleShotSearchDrillDownCompositeNumericJoinActionSteps}
280
+ * whose `accounts[]` has TWO items, but whose only captured drill-down call
281
+ * threads the SECOND item's composite join key (`region: "eu"`,
282
+ * `accountId: 9`), never the first item's (`region: "us"`, `accountId: 7`).
283
+ * Proves the same non-first-item selection requirement holds when the join
284
+ * key is composite, not just when it's a single field.
285
+ */
286
+ export declare function buildMulticallSingleShotSearchDrillDownCompositeNumericJoinNonFirstItemActionSteps(): MulticallFixtureStep[];
287
+ /**
288
+ * A single-shot search whose primary item join field (`accountId`) is
289
+ * threaded into the drill-down call ONLY via a custom request header
290
+ * (`X-Account-Id`) — never a query param, JSON body value, or URL path
291
+ * segment. `collectRequestStringValues` deliberately never scans
292
+ * `requestHeaders` (recon-generate.ts:4787-4815), so this join is invisible
293
+ * to `findThreadedJoinFields` and {@link detectDrillDownFoldPlan} must return
294
+ * `null` here regardless of how many other threading channels it learns to
295
+ * scan — only a flow-declared `foldReturn` naming `accountId` can resolve
296
+ * this fold.
297
+ */
298
+ export declare function buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinActionSteps(): MulticallFixtureStep[];
299
+ /**
300
+ * A sibling of {@link buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinActionSteps}
301
+ * whose primary endpoint is hit TWICE (`r0`, `r1`), each occurrence's single
302
+ * `accounts[]` item independently satisfying the drill-down's `X-Account-Id`
303
+ * join on its own — mirroring
304
+ * {@link buildMulticallSingleShotSearchDrillDownRequeriedPrimaryOverlapActionSteps}'s
305
+ * requeried-primary-overlap shape, but with the join threaded ONLY through a
306
+ * request header rather than a URL query param, so `detectDrillDownFoldPlan`'s
307
+ * structural heuristic can never see it (same blind spot documented on
308
+ * {@link buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinActionSteps}).
309
+ * Only a flow-declared `foldReturn` naming `accountId` can resolve this fold,
310
+ * isolating `buildFoldPlanFromSpec`'s own freshest-wins primary lookahead:
311
+ * the resolved plan must anchor on `r1` (the LATER occurrence) and its
312
+ * differing `name` value ("Acme Corp"), not `r0`'s stale "Acme".
313
+ */
314
+ export declare function buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinRequeriedPrimaryOverlapActionSteps(): MulticallFixtureStep[];
315
+ /**
316
+ * Sibling of {@link buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinActionSteps}
317
+ * whose primary `accounts[]` array holds TWO items rather than one, so a
318
+ * runtime fold loop built from this capture must re-key the drill-down's
319
+ * request header per iteration rather than replaying the single captured
320
+ * header value.
321
+ *
322
+ * Threaded on `API-Token` rather than the sibling fixture's `X-Account-Id`:
323
+ * `emitMultiStepExecuteHttp`'s per-call header emission only ever renders a
324
+ * captured header back into the generated request when it recognizes the
325
+ * header name (`API-Token`/`Authorization`, or a base-URL-/tenant-derived
326
+ * header passed in separately — recon-generate.ts:4273-4279) — an arbitrary
327
+ * custom header like `X-Account-Id` is captured but never re-emitted, so a
328
+ * fold loop built from it would have nothing to re-key at runtime. `API-Token`
329
+ * is still a request header the join value reaches through NO OTHER channel
330
+ * (not the URL, which is identical on every call, and not the body, which is
331
+ * empty), so it still exercises the same header-threaded-join runtime path
332
+ * {@link buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinActionSteps}
333
+ * demonstrates is invisible to the structural heuristic.
334
+ *
335
+ * The captured drill call was made for `accountId: 43` (the SECOND item),
336
+ * pinning `primaryMatchedItemIndex` away from the index-0 default.
337
+ */
338
+ export declare function buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinMultiItemActionSteps(): MulticallFixtureStep[];
339
+ /**
340
+ * A single-shot search whose primary results array is NOT drilled into at
341
+ * item 0 — only a single later drill call exists, and it threads the second
342
+ * item's (`itemId: "i-a"`) join value, never the first's (`itemId: "i-b"`).
343
+ * With no coincidental extra call re-drilling item 0 (unlike
344
+ * {@link buildMulticallDependentDrillDownActionSteps}, whose items are also
345
+ * out of order but which happens to pass a items[0]-only match because a
346
+ * third step re-drills item 0), this pins {@link detectDrillDownFoldPlan}'s
347
+ * item search to the actually-drilled item rather than an index-0 default —
348
+ * the search must find the match at `primaryMatchedItemIndex` 1.
349
+ * Named "OutOfOrder" (rather than "NonFirstItem") to avoid colliding with
350
+ * {@link buildMulticallSingleShotSearchDrillDownNonFirstItemSkuActionSteps}.
351
+ */
352
+ export declare function buildMulticallSingleShotSearchDrillDownOutOfOrderItemActionSteps(): MulticallFixtureStep[];
353
+ /**
354
+ * A single-shot search sibling of
355
+ * {@link buildMulticallSingleShotSearchDrillDownNonFirstItemSkuActionSteps}
356
+ * whose axis is on the DRILL side rather than the primary side: the primary
357
+ * `results[]` has a single item (`sku-a`), but the drill-down's own
358
+ * `prices[]` array comes back holding TWO entries — a decoy for an unrelated
359
+ * sku (`sku-z`, listed first) alongside the real match (`sku-a`, listed
360
+ * second). A fold that merges `foldMatches[0]`/`drillItems?.[0]` would
361
+ * silently splice the decoy's `amount` onto the primary item; only matching
362
+ * the drill array's own entries against the threaded join field (`sku`)
363
+ * picks the correct one, at a non-zero index within that array.
364
+ */
365
+ export declare function buildMulticallSingleShotSearchDrillDownMultiMatchActionSteps(): MulticallFixtureStep[];
366
+ /**
367
+ * A multi-match sibling of
368
+ * {@link buildMulticallSingleShotSearchDrillDownMultiMatchActionSteps} whose
369
+ * join field's type DIFFERS across the two sides: the primary item's
370
+ * `accountId` is a NUMBER, while every item in the drill-down response's
371
+ * array carries `accountId` as a STRING (as request-threaded values always
372
+ * are). A decoy entry is listed first with a string that never equals the
373
+ * primary's numeric value even after coercion; only the second entry's
374
+ * string stringifies to the primary's value. A fold that matches via strict
375
+ * equality (`m["accountId"] === item.accountId`, i.e. `"42" === 42`) fails
376
+ * for every candidate here, proving the fold must compare join values by
377
+ * their string representation, not by strict identity.
378
+ */
379
+ export declare function buildMulticallSingleShotSearchDrillDownTypeMismatchJoinActionSteps(): MulticallFixtureStep[];
380
+ /**
381
+ * Same shape as {@link buildMulticallSingleShotSearchDrillDownChainedDependentActionSteps},
382
+ * but the CHAIN's second step (the price-history call `r2`, not the drill
383
+ * step `r1` itself) is a multipart upload rather than a JSON POST.
384
+ * `emitMultiStepExecuteHttp`'s fold loop re-issues EVERY chain step's
385
+ * request per item by re-keying its rendered JSON body template — a
386
+ * multipart step anywhere in `chain`, not just at `drillStepIndex`, has no
387
+ * such template to re-key, so `resolveFoldPlan` must disqualify the whole
388
+ * plan here exactly as it already does when the drill step itself is
389
+ * multipart.
390
+ */
391
+ export declare function buildMulticallSingleShotSearchDrillDownChainedDependentMultipartChainStepActionSteps(): MulticallFixtureStep[];
392
+ /**
393
+ * A single-shot search → per-item drill-down flow whose drill step's OWN
394
+ * response is foldable on its own terms — it carries `prices[]`, the same
395
+ * per-item results shape {@link buildMulticallSingleShotSearchDrillDownNoDecoyActionSteps}
396
+ * would fold directly — but is ALSO depended on by a THIRD step: the drill
397
+ * response's `priceToken` threads into a price-history call whose response
398
+ * carries the real per-item array this flow means to fold. `computeFoldChain`
399
+ * must extend the plan's chain to `[drillStepIndex, historyStepIndex]`
400
+ * instead of stopping at the drill step's own array, so
401
+ * `emitMultiStepExecuteHttp`'s fold loop renders BOTH calls per item and
402
+ * shape inference ({@link foldResponseBodyForShapeInference}) folds the
403
+ * chain's TERMINAL (history) response, not the drill step's own `prices[]`.
404
+ */
405
+ export declare function buildMulticallSingleShotSearchDrillDownChainedDependentActionSteps(): MulticallFixtureStep[];
406
+ /**
407
+ * A response-header sibling of {@link buildMulticallSingleShotSearchDrillDownChainedDependentActionSteps}:
408
+ * the drill step's (`r1`) response mints its join token (`tok-a1`) ONLY in a
409
+ * custom response HEADER (`X-Price-Token`) — its body is empty, unlike the
410
+ * sibling's `priceToken` body field. A third step (`r2`) threads that header
411
+ * value into its own request body and carries the real per-item `history[]`
412
+ * array. `computeFoldChain`'s `dependsOnChain` check must walk `r1`'s
413
+ * response headers (not just its body) to see the shared value, extending
414
+ * the chain to `[drillStepIndex, historyStepIndex]` rather than stopping at
415
+ * `r1`.
416
+ */
417
+ export declare function buildMulticallSingleShotSearchDrillDownHeaderMintedChainedResponseValueActionSteps(): MulticallFixtureStep[];
418
+ /**
419
+ * A boolean-threading sibling of {@link buildMulticallSingleShotSearchDrillDownChainedDependentActionSteps}:
420
+ * the drill step's (`r1`) response mints ONLY a boolean value
421
+ * (`{ verified: true }`) and carries no array of its own — unlike the
422
+ * `priceToken`/`prices[]` sibling, this drill step is NOT foldable in
423
+ * isolation. A third step (`r2`) threads that boolean (rendered as the
424
+ * string `"true"`) into its request and carries the real per-item
425
+ * `history[]` array in its response. `computeFoldChain` must recognize the
426
+ * boolean leaf as a genuine chain-dependency source and extend the chain to
427
+ * `[drillStepIndex, historyStepIndex]` rather than stopping at `r1`.
428
+ */
429
+ export declare function buildMulticallSingleShotSearchDrillDownBooleanChainedResponseValueActionSteps(): MulticallFixtureStep[];
430
+ /**
431
+ * A nested-join-key sibling of {@link buildMulticallSingleShotSearchDrillDownChainedDependentActionSteps}:
432
+ * each primary `results[]` item carries its join key under a nested
433
+ * `identifiers` object (`{ identifiers: { sku } }`, matching
434
+ * {@link buildMulticallSingleShotSearchDrillDownNestedJoinFieldMultiItemActionSteps})
435
+ * rather than as a top-level field, AND (as in the chained-dependent fixture)
436
+ * the drill step's own response is foldable on its own terms but is ALSO
437
+ * depended on by a further step whose response carries the real per-item
438
+ * data. The primary item that threads the nested join is the SECOND item
439
+ * (`sku-b`), not the first, so `primaryMatchedItemIndex` must resolve by
440
+ * walking into each item's nested fields rather than assuming index 0, while
441
+ * `computeFoldChain` must still extend the chain past the drill step to its
442
+ * dependent follow-up rather than stopping at the drill step's own array.
443
+ */
444
+ export declare function buildMulticallSingleShotSearchDrillDownNestedJoinFieldChainedDependentActionSteps(): MulticallFixtureStep[];
445
+ /**
446
+ * A search endpoint re-queried with two distinct bodies (`page 1`/`page 2`,
447
+ * satisfying {@link findRequeriedActions}'s re-query signature) whose
448
+ * responses BOTH independently contain a `results[]` item sharing the same
449
+ * `sku` — but at a different `price` (10 vs 12) — followed by a pricing
450
+ * drill-down call threading that `sku` via its URL query param. Every prior
451
+ * action is a fold-primary candidate for {@link detectDrillDownFoldPlan}, so
452
+ * both step 0 and step 1 satisfy the drill's join; the primary-candidate
453
+ * scan currently commits to the FIRST match (step 0, `price: 10`) and
454
+ * globally consumes the drill step, so step 1 — the fresher, `price: 12`
455
+ * re-queried occurrence — is never considered. `amount` in the drill
456
+ * response is the object-array field distinct from `price` that a fold
457
+ * assertion reads to observe which occurrence was actually folded onto.
458
+ */
459
+ export declare function buildMulticallSingleShotSearchDrillDownRequeriedPrimaryOverlapActionSteps(): MulticallFixtureStep[];
460
+ /**
461
+ * A single primary search response carrying TWO genuinely independent
462
+ * object-array fields — `products[]` and `vendors[]` — each drilled by its
463
+ * own, unrelated later step (`sku` into a pricing lookup, `vendorId` into a
464
+ * vendor-detail lookup). `scanPrimaryCandidate`'s old candidatePool lock
465
+ * (recon-generate.ts:5411-5413) resolved only whichever array its FIRST
466
+ * qualifying drill-down threaded from (`products[]`, via r1) and then
467
+ * restricted every later candidate scan to that SAME array, so r2's
468
+ * `vendorId` thread into `vendors[]` was silently discarded — this fixture
469
+ * proves BOTH arrays fold independently, one FoldPlan per distinct
470
+ * `primaryArrayPath`.
471
+ */
472
+ export declare function buildMulticallSingleShotSearchTwoIndependentArraysActionSteps(): MulticallFixtureStep[];
473
+ /**
474
+ * A single primary search response carrying TWO independent object-array
475
+ * fields — `products[]`, whose `sku` join threads through the pricing call's
476
+ * own JSON body and so is structurally detectable, and `vendors[]`, whose
477
+ * `vendorId` join threads ONLY through the vendor-detail call's
478
+ * `X-Vendor-Id` request header, invisible to `collectRequestStringValues`
479
+ * and resolvable only via a flow-declared `foldReturn` spec naming `vendors`
480
+ * as its `resultsPath`. `mergeSpecPlanOntoSamePrimary` used to key its
481
+ * consumed-index check off `primaryStepIndex` alone, so the spec's plan —
482
+ * anchored on the SAME step 0 the structural heuristic had already resolved,
483
+ * but naming a DIFFERENT array — was wrongly treated as already consumed and
484
+ * silently dropped instead of appended.
485
+ */
486
+ export declare function buildMulticallStructuralPlusSpecOnlySameStepActionSteps(): MulticallFixtureStep[];
487
+ /**
488
+ * A 3-step chain where the drill step (`r1`) is a bare threading step — its
489
+ * response carries the join value (`statusToken`) but no object-array field
490
+ * at all, so it can't itself be the decoy. The decoy instead sits on the
491
+ * chain's terminal step (`r2`): a `warnings[]` array positioned BEFORE the
492
+ * real per-item `entries[]` array in key order, where `entries[]`'s items
493
+ * thread `r2`'s own `statusToken` request value and `warnings[]`'s items do
494
+ * not. {@link computeFoldChain}'s `selectDisambiguatedCandidate` call on
495
+ * this (non-immediate) chain hop must resolve `chainArrayPath` to `entries`
496
+ * on the threaded-join-fields match, not `warnings` for being found first.
497
+ */
498
+ export declare function buildMulticallSingleShotSearchDrillDownChainedDecoyOnChainTerminalActionSteps(): MulticallFixtureStep[];
499
+ /**
500
+ * A single-shot search → per-item drill-down flow where the drill step's
501
+ * OWN response (`r1`) is entirely OPAQUE — a bare array holding a single
502
+ * token, satisfying neither `isObjectArrayItem` nor
503
+ * `findAllObjectArrayFields`, so `selectDisambiguatedCandidate` finds no
504
+ * candidate there at all — and is depended on by a THIRD step (`r2`) whose
505
+ * response carries the real per-item array this flow means to fold. Unlike
506
+ * {@link buildMulticallSingleShotSearchDrillDownChainedDependentActionSteps},
507
+ * whose `r1` is ALSO independently foldable, this fixture isolates the case
508
+ * where `computeFoldChain` has nothing to fall back on at the immediate hop
509
+ * and must extend the chain past it to `r2` to find any candidate at all.
510
+ */
511
+ export declare function buildMulticallSingleShotSearchDrillDownOpaqueIntermediateChainedDependentActionSteps(): MulticallFixtureStep[];
512
+ /**
513
+ * A 4-step sibling of
514
+ * {@link buildMulticallSingleShotSearchDrillDownOpaqueIntermediateChainedDependentActionSteps}
515
+ * that inserts one more chain hop between the opaque token step and the real
516
+ * per-item terminal: a flat confirmation object (`r2`) that echoes back the
517
+ * token it was called with (excluded from its richness by
518
+ * `directPrimitiveChildCountExcludingEchoed`) alongside a boolean status flag
519
+ * AND a second, non-echoed token that threads onward into the real terminal
520
+ * step (`r3`). Both `r2` and `r3` land on the SAME richness — two non-echoed
521
+ * primitive fields apiece (`held`/`receiptToken` on `r2`, `event`/`ts` on
522
+ * `r3`) — so `computeFoldChain`'s strict `candidateRichness > chainTerminalRichness`
523
+ * comparison never lets `r3` displace `r2` as the chain terminal: a tie is
524
+ * exactly as "not richer" as a loss. This isolates the case where a
525
+ * side-effect confirmation hop that merely happens to match the real
526
+ * terminal's field count silently masks it, as opposed to
527
+ * {@link buildMulticallSingleShotSearchDrillDownOpaqueIntermediateChainedDependentActionSteps}'s
528
+ * opaque hop, which offers no candidate at all.
529
+ */
530
+ export declare function buildMulticallSingleShotSearchDrillDownRichnessTiedConfirmationHopChainedDependentActionSteps(): MulticallFixtureStep[];
531
+ /**
532
+ * An array-wrapped sibling of
533
+ * {@link buildMulticallSingleShotSearchDrillDownOpaqueIntermediateChainedDependentActionSteps}:
534
+ * the opaque intermediate hop (`r1`) is identical, but the chain's TERMINAL
535
+ * hop (`r2`) threads `r1`'s produced `statusToken` wrapped inside a
536
+ * single-element request-body ARRAY (`{"tokens":["status-token-order-a"]}`,
537
+ * a bulk/batch-lookup request shape) instead of as a flat top-level scalar
538
+ * field. `computeFoldChain`'s structural `dependsOnChain` detection (which
539
+ * walks every request-body leaf regardless of nesting) resolves the chain
540
+ * correctly either way, so this isolates a DIFFERENT failure: the
541
+ * request-body render must still be able to thread `statusToken` into that
542
+ * array slot instead of freezing the whole array as an opaque caller-payload
543
+ * blob (`applyStructuredValuePayloadSubstitutions`'s "swallow whole
544
+ * caller-supplied array/object" mechanism, which runs BEFORE state
545
+ * threading and has no concept of "this array actually wraps a threaded
546
+ * dependent-drill-down join value").
547
+ */
548
+ export declare function buildMulticallSingleShotSearchDrillDownArrayWrappedChainedDependentActionSteps(): MulticallFixtureStep[];
549
+ /**
550
+ * Same array-wrapped-chained shape as
551
+ * {@link buildMulticallSingleShotSearchDrillDownArrayWrappedChainedDependentActionSteps},
552
+ * but the chain-produced value threaded from `r1` into `r2` is a bare JSON
553
+ * NUMBER (`12345678`) rather than a string. Unlike the primary-item join
554
+ * field covered by
555
+ * {@link buildMulticallSingleShotSearchDrillDownArrayWrappedNumericImmediateJoinFieldActionSteps},
556
+ * a chain-produced value must first be indexed as a threadable STATE value by
557
+ * `indexStateValues` before any array-wrap rendering question can even arise
558
+ * — and `indexStateValues` walks response bodies via `walkStringLeaves`,
559
+ * which yields string leaves only. A bare-number response leaf is therefore
560
+ * never indexed and never appears in `compileActionSteps`' `produces[]` at
561
+ * all, so `r2`'s templated body has no accessor to substitute and renders
562
+ * `{"tokens":[undefined]}` — invalid JSON, thrown as a fetch failure. This is
563
+ * a distinct, more fundamental gap than the array-wrap fix
564
+ * (`applyStructuredValuePayloadSubstitutions`, bugfix-001) addresses: it sits
565
+ * upstream, in state INDEXING, not in payload-substitution SPARING, and
566
+ * reproduces identically whether or not the terminal body is array-wrapped.
567
+ */
568
+ export declare function buildMulticallSingleShotSearchDrillDownArrayWrappedNumericChainedJoinFieldActionSteps(): MulticallFixtureStep[];
569
+ /**
570
+ * A sibling of
571
+ * {@link buildMulticallSingleShotSearchDrillDownArrayWrappedNumericChainedJoinFieldActionSteps}
572
+ * isolating a DIFFERENT gap in the numeric chain-produced join field family:
573
+ * `r1`'s produced token is a bare (non-array-wrapped) JSON number, and — the
574
+ * shape that matters here — it is SHORT (`42`/`43`, two digits) rather than
575
+ * an 8-digit token. `indexStateValues` gates every candidate state value on
576
+ * `MIN_STATE_VALUE_LENGTH` (8 chars), a threshold sized to keep an unrelated
577
+ * short STRING (an enum code, a page number) from colliding with arbitrary
578
+ * substrings elsewhere; applied uniformly to a bare NUMBER's stringified
579
+ * length, it also silently excludes a short numeric id/token — exactly the
580
+ * common shape for an order/account/status id — from ever being indexed as
581
+ * producible state. Without that index entry, `compileActionSteps` never
582
+ * emits a `produces[]` accessor for `r1`'s response, so `r2`'s templated
583
+ * body has nothing to substitute and falls back to treating `{"token":...}`
584
+ * as an opaque caller-supplied payload field (`payload.token`) instead of
585
+ * the per-item threaded value — every iteration would send whatever (or
586
+ * nothing) the caller passed, not each primary item's own token.
587
+ */
588
+ export declare function buildMulticallSingleShotSearchDrillDownShortNumericChainedJoinFieldActionSteps(): MulticallFixtureStep[];
589
+ /**
590
+ * Cookie-origin sibling of
591
+ * {@link buildMulticallSingleShotSearchDrillDownShortNumericChainedJoinFieldActionSteps}:
592
+ * here `r1` mints the short chain-produced token (`tok1`, under
593
+ * `MIN_STATE_VALUE_LENGTH`) via `Set-Cookie` rather than the response body,
594
+ * AND echoes the same value in its response body (the "body-level echo" that
595
+ * lets {@link collectDependentDrillDownChainValues} confirm the cookie value
596
+ * is chain-produced, exactly as a body-sourced token would be). `r2` threads
597
+ * `tok1` back via its request body. Exercises `indexStateValues`' Set-Cookie
598
+ * branch's `chainForceIncludeValues`/`forceIncludeValues` exemption, mirroring
599
+ * the body-value floor exemption.
600
+ */
601
+ export declare function buildMulticallSingleShotSearchDrillDownShortCookieChainedJoinFieldActionSteps(): MulticallFixtureStep[];
602
+ /**
603
+ * A different sibling of the same array-wrapped-join-field failure family:
604
+ * here it's the IMMEDIATE drill step (`r1`), not a later chain hop, whose
605
+ * request body wraps the value it threads — but that value is the PRIMARY
606
+ * ITEM's own join field (`orderId`), not a prior step's produced response
607
+ * value. `applyStructuredValuePayloadSubstitutions`'s "spare a candidate
608
+ * already threaded" exception only recognized prior-step state values, so it
609
+ * still froze `r1`'s `{"orderIds":["order-a"]}` into an opaque
610
+ * `${JSON.stringify(payload.orderIds)}` blob, destroying the literal
611
+ * `"order-a"` text the fold-loop's own per-item `parameterize` pass (which
612
+ * runs even later, once rendering enters the loop) needs to find and swap
613
+ * for `${item.orderId}` — every iteration replayed the SAME captured order
614
+ * instead of each primary item's own.
615
+ */
616
+ export declare function buildMulticallSingleShotSearchDrillDownArrayWrappedImmediateJoinFieldActionSteps(): MulticallFixtureStep[];
617
+ /**
618
+ * Same array-wrapped-immediate-join-field shape as
619
+ * {@link buildMulticallSingleShotSearchDrillDownArrayWrappedImmediateJoinFieldActionSteps},
620
+ * but the primary item's join field is a bare JSON NUMBER (`orderId: 101`)
621
+ * rather than a string. `walkStringLeaves` (used by the spare check in
622
+ * `applyStructuredValuePayloadSubstitutions`) silently skips number leaves,
623
+ * so a numeric join value wrapped in `{"orderIds":[101]}` was frozen into an
624
+ * opaque `${JSON.stringify(payload.orderIds)}` blob instead of being spared
625
+ * for the fold-loop's later per-item `parameterize` pass.
626
+ */
627
+ export declare function buildMulticallSingleShotSearchDrillDownArrayWrappedNumericImmediateJoinFieldActionSteps(): MulticallFixtureStep[];
628
+ /**
629
+ * Same array-wrapped-immediate-join-field shape as
630
+ * {@link buildMulticallSingleShotSearchDrillDownArrayWrappedNumericImmediateJoinFieldActionSteps},
631
+ * but the primary item's join field is a bare JSON BOOLEAN (`flag: true`)
632
+ * rather than a number or string. `walkStringLeaves` (used by the spare
633
+ * check in `applyStructuredValuePayloadSubstitutions`) silently skips
634
+ * boolean leaves the same way it skips number leaves, so a boolean join
635
+ * value wrapped in `{"flags":[true]}` was frozen into an opaque
636
+ * `${JSON.stringify(payload.flags)}` blob instead of being spared for the
637
+ * fold-loop's later per-item `parameterize` pass.
638
+ */
639
+ export declare function buildMulticallSingleShotSearchDrillDownArrayWrappedBooleanImmediateJoinFieldActionSteps(): MulticallFixtureStep[];
640
+ /**
641
+ * A dependent (chained) drill-down whose join key is threaded ONLY through a
642
+ * request HEADER (`API-Token`) on the chain's ENTRY hop (`r1`) — invisible to
643
+ * `detectDrillDownFoldPlan`'s structural heuristic exactly like
644
+ * {@link buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinActionSteps}
645
+ * — so only a flow-declared `foldReturn` can resolve this fold at all. Unlike
646
+ * every existing header-threaded-join fixture, though, a site author writing
647
+ * that `foldReturn` naturally points `endpointPattern` at `r2`
648
+ * (`/accounts/transactions`) — the call whose OWN response actually carries
649
+ * the per-item data (`transactions[]`) they want folded — not at `r1`
650
+ * (`/accounts/status`), the opaque intermediate hop that merely carries the
651
+ * `accountId`→`API-Token` header thread onward as a `statusToken`. `r2`'s own
652
+ * request only ever carries that threaded `statusToken`, never `accountId`
653
+ * in any form (body, URL, or header) — the join key is resolvable only by
654
+ * walking back to `r1`, exactly the way `computeFoldChain` already walks
655
+ * FORWARD from a resolved entry hop to a richer terminal. `resultsPath`
656
+ * anchors on `accounts`, `joinFields` on `accountId`.
657
+ */
658
+ export declare function buildMulticallSingleShotSearchDrillDownHeaderThreadedJoinChainedDependentActionSteps(): MulticallFixtureStep[];
659
+ /**
660
+ * A dependent (chained) drill-down whose ENTRY hop (`r1`) is a `GET`
661
+ * request — not the `POST` every other chained-dependent fixture in this
662
+ * file uses — and whose response produces the chain's join value
663
+ * (`statusToken`) as a non-UUID string. `indexStateValues` indexes a `GET`
664
+ * capture's response leaves ONLY when they are UUID-shaped
665
+ * (`isGet && !UUID_REGEX.test(value)` skips everything else, a filter aimed
666
+ * at excluding noisy short non-UUID strings a GET-only telemetry/schema
667
+ * fetch surfaces); that filter runs unconditionally, with no exemption for a
668
+ * value `collectDependentDrillDownChainValues` has already confirmed is
669
+ * threaded from this exact hop into a later chain hop's own request — unlike
670
+ * the `MIN_STATE_VALUE_LENGTH` floor a few lines above it, which DOES carry
671
+ * that exemption. So a chain-produced token minted by a GET response is
672
+ * never indexed as producible state at all, `compileActionSteps` never
673
+ * emits a `produces[]` accessor for it, and `r2`'s templated body has
674
+ * nothing to substitute — every iteration renders the literal string
675
+ * `"undefined"` instead of threading each primary item's own token.
676
+ */
677
+ export declare function buildMulticallSingleShotSearchDrillDownGetEntryHopChainedDependentActionSteps(): MulticallFixtureStep[];
678
+ /**
679
+ * A response-header sibling of {@link buildMulticallSingleShotSearchDrillDownGetEntryHopChainedDependentActionSteps}:
680
+ * the chain's drill hop (`r1`) mints its join token (`tok-a1`) ONLY in a
681
+ * custom response HEADER (`X-Price-Token`) — its body is empty ({}), unlike
682
+ * {@link buildMulticallSingleShotSearchDrillDownHeaderMintedChainedResponseValueActionSteps}'s
683
+ * body-echo-free sibling, which threads the header value forward via the
684
+ * request BODY. Here the terminal hop (`r2`) instead threads that value back
685
+ * as a REQUEST HEADER of its own (also named `X-Price-Token`) — the only
686
+ * shape `createHttpClient`'s `bind` option can actually thread a
687
+ * header-origin value into, since the emitted response variable never
688
+ * exposes response headers to the rest of the generated code. Exercises
689
+ * `compileActionSteps`' non-cookie response-header produce block: without it,
690
+ * `tok-a1` is never captured into a `produces[]`/`bind` entry at all, and
691
+ * `r2`'s per-item call goes out with no `X-Price-Token` header, so the
692
+ * terminal `history[]` fold silently collapses to whichever primary item the
693
+ * stub happens to answer first instead of each item's own token.
694
+ */
695
+ export declare function buildMulticallSingleShotSearchDrillDownResponseHeaderThreadedJoinChainedDependentActionSteps(): MulticallFixtureStep[];
62
696
  //# sourceMappingURL=recon-generate-multicall-fixture.d.ts.map