@bowmark/web 1.12.0 → 1.12.2

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.
@@ -5,8 +5,8 @@
5
5
  // rather than imported. An `import` or `export` at the top level of this file would
6
6
  // turn it into a module and every declaration below would stop being global.
7
7
  //
8
- // Manifest version: 30acf97e882124423eecad144b20c278a6e81b46e839c2063822661efc063ea6
9
- // 32 capabilities, 253 providers, 665 typed functions, 20 refused.
8
+ // Manifest version: 4367aae3846695ff98e8537819e01ea3e2b841043d73690123b839fb07c2a19a
9
+ // 38 capabilities, 266 providers, 693 typed functions, 20 refused.
10
10
  // 51,715 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
11
11
  //
12
12
  // REFUSED — these functions are real and callable, and their declared arguments
@@ -36,6 +36,40 @@
36
36
 
37
37
 
38
38
 
39
+ declare namespace BowmarkCapability_bundles {
40
+ // ── Check whether a set of products can be built and bought right now — the unit's own declarations, verbatim ──
41
+ interface BundleItemAvailability {
42
+ url: string
43
+ ok: boolean
44
+ buildable: boolean
45
+ price: { amount: number; currency: string } | null // integer minor units
46
+ availability: string | null
47
+ reason: string | null
48
+ }
49
+ interface BundleAvailability {
50
+ buildable: boolean
51
+ items: BundleItemAvailability[]
52
+ blocking: string[] // urls of the items stopping the bundle
53
+ totalPrice: { amount: number; currency: string } | null
54
+ warnings: string[]
55
+ }
56
+
57
+ /**
58
+ * Given a list of product page urls, reads each one's price and stock the way
59
+ * `products.getAvailability` does, then reduces the set to one buildable/not-buildable verdict
60
+ * naming whatever is blocking it.
61
+ */
62
+ interface Unit {
63
+ /**
64
+ * Reads every item's product page and returns whether the WHOLE bundle can be built and bought
65
+ * right now — false the moment any one item is out of stock, pre-order, or unreadable, naming
66
+ * which url(s) are blocking it in `blocking`. Never throws on a bad or dead item url; that
67
+ * item is reported as not buildable instead, with its reason.
68
+ */
69
+ checkAvailability(items: { url: string }[]): Promise<BundleAvailability>;
70
+ }
71
+ }
72
+
39
73
  declare namespace BowmarkCapability_cable_railing_quote {
40
74
  // ── Cable railing design quote (materials & mounting options) — the unit's own declarations, verbatim ──
41
75
  type CableRailingMaterial = {
@@ -291,6 +325,46 @@ type CallOptions = {
291
325
  }
292
326
  }
293
327
 
328
+ declare namespace BowmarkCapability_delivery {
329
+ // ── Food-delivery fee comparison — the unit's own declarations, verbatim ──
330
+ type DeliveryFeeQuote = {
331
+ app: string // which app quoted this, e.g. "doordash"
332
+ name: string
333
+ deliveryFee: number | null // the app's own advertised delivery fee, before a cart is built
334
+ url: string
335
+ rating: number | null
336
+ }
337
+ type CompareDeliveryFeesResult = {
338
+ query: string
339
+ quotes: DeliveryFeeQuote[] // every store any queried app returned
340
+ warnings: string[] // always present; empty when nothing was dropped
341
+ }
342
+
343
+ type CallOptions = {
344
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
345
+ // A provider slower than this is DROPPED from the results and
346
+ // NAMED in warnings — never silently absent
347
+ }
348
+
349
+ /**
350
+ * Runs a free-text restaurant search on DoorDash and returns each store's own advertised
351
+ * delivery fee, rating and ETA — the fee shown before a cart is built. Uber Eats is declared
352
+ * but not yet wired (its search stub isn't built); a full delivery+service+tax+tip checkout
353
+ * TOTAL needs a real cart and address and is separately not-yet-built on both apps.
354
+ */
355
+ interface Unit {
356
+ /**
357
+ * Runs a free-text search — `bowmark.delivery.compareDeliveryFees("pad thai austin tx")` —
358
+ * across the delivery apps this library covers (DoorDash today) and returns every matching
359
+ * store tagged with which app quoted it, that app's own advertised delivery fee, rating and
360
+ * listing URL. This is the fee shown on the app's OWN results card before a cart is built, not
361
+ * a full checkout total (delivery + service fee + tax + tip after a real cart and address) —
362
+ * see the capability blurb for what that needs.
363
+ */
364
+ compareDeliveryFees(query: string | { query: string; limit?: number }, options?: CallOptions): Promise<CompareDeliveryFeesResult>;
365
+ }
366
+ }
367
+
294
368
  declare namespace BowmarkCapability_developer_api_key_signup {
295
369
  // ── Developer API key signup — the unit's own declarations, verbatim ──
296
370
  interface DeveloperApiKeySignupDetails {
@@ -1224,6 +1298,87 @@ type CallOptions = {
1224
1298
  }
1225
1299
  }
1226
1300
 
1301
+ declare namespace BowmarkCapability_local_database_gui {
1302
+ // ── Browse a local database GUI's tables — the unit's own declarations, verbatim ──
1303
+ interface DbGuiTable {
1304
+ name: string | null // a <caption>, the nearest preceding heading, or an
1305
+ // aria-label/data-testid naming it — null if nothing does
1306
+ columns: string[] // "col_1", "col_2", … when the table has no header row
1307
+ rows: Record<string, string>[]
1308
+ rowCount: number // the real count, even when rows[] was cut
1309
+ truncated: boolean
1310
+ }
1311
+ interface DbGuiBrowseOptions {
1312
+ maxTables?: number // default 25
1313
+ maxRowsPerTable?: number // default 200
1314
+ }
1315
+ interface DbGuiBrowseResult {
1316
+ tables: DbGuiTable[]
1317
+ navLinks: string[] // candidate table/collection names from a sidebar-shaped nav
1318
+ warnings: string[]
1319
+ }
1320
+
1321
+ /**
1322
+ * Turns the HTML of a local database GUI (Adminer, phpMyAdmin, pgAdmin, Drizzle Studio,
1323
+ * mongo-express, or anything similar running on the caller's own localhost) into typed tables
1324
+ * and a candidate table list — Bowmark cannot navigate a caller-private address itself, so
1325
+ * this takes the page the caller's own agent already has and structures it. Read-only; nothing
1326
+ * here can submit or modify a row.
1327
+ */
1328
+ interface Unit {
1329
+ /**
1330
+ * Parses the HTML of a local database GUI page (e.g. the caller's own agent read it off
1331
+ * http://localhost:<port> — Bowmark cannot reach that address itself) and returns every
1332
+ * <table> on the page as structured rows keyed by column name, plus a `navLinks` list of
1333
+ * candidate table/collection names pulled from a sidebar-shaped nav. `options.maxTables`
1334
+ * (default 25) and `options.maxRowsPerTable` (default 200) cap how much is kept; a cut table
1335
+ * reports its real `rowCount` and `truncated: true`. Never throws on odd markup — an empty or
1336
+ * table-less page comes back with `tables: []` and a warning rather than an error.
1337
+ */
1338
+ browse(html: string, options?: DbGuiBrowseOptions): Promise<DbGuiBrowseResult>;
1339
+ }
1340
+ }
1341
+
1342
+ declare namespace BowmarkCapability_local_html_preview {
1343
+ // ── Preview local HTML (structure, text, links, forms — read-only) — the unit's own declarations, verbatim ──
1344
+
1345
+ interface PreviewHeading { level: number; text: string }
1346
+ interface PreviewLink { text: string; href: string | null }
1347
+ interface PreviewImage { src: string | null; alt: string | null }
1348
+ interface PreviewForm { action: string | null; method: string; fieldCount: number }
1349
+
1350
+ interface PreviewOptions {
1351
+ maxChars?: number // default 20000; over it, text is cut + truncated:true
1352
+ }
1353
+
1354
+ interface HtmlPreviewResult {
1355
+ title: string | null
1356
+ text: string // visible text, block structure kept as blank lines
1357
+ chars: number
1358
+ truncated: boolean
1359
+ headings: PreviewHeading[]
1360
+ links: PreviewLink[]
1361
+ images: PreviewImage[]
1362
+ forms: PreviewForm[] // inventory only — nothing here submits a form
1363
+ wordCount: number
1364
+ warnings: string[]
1365
+ }
1366
+
1367
+ /**
1368
+ * Render an HTML file or fragment the caller already has and get back its title, text,
1369
+ * headings, links, images and forms — no network, no browser, nothing executed or submitted.
1370
+ */
1371
+ interface Unit {
1372
+ /**
1373
+ * Parses supplied HTML (a local file's contents, or a fragment) and returns a structured
1374
+ * preview: title, readable text, headings, links, images and a read-only form inventory. Never
1375
+ * executes scripts, never fetches anything, never submits a form — it only reads the markup
1376
+ * you already have.
1377
+ */
1378
+ render(html: string, options?: PreviewOptions): Promise<HtmlPreviewResult>;
1379
+ }
1380
+ }
1381
+
1227
1382
  declare namespace BowmarkCapability_mcp_registry {
1228
1383
  // ── MCP Registry — the unit's own declarations, verbatim ──
1229
1384
  interface McpRegistryEntry {
@@ -1707,6 +1862,94 @@ type CallOptions = {
1707
1862
  }
1708
1863
  }
1709
1864
 
1865
+ declare namespace BowmarkCapability_retail {
1866
+ // ── Retail (general merchandise, multi-store) — the unit's own declarations, verbatim ──
1867
+ type RetailOffer = {
1868
+ store: "walmart" | "target" // where this offer is from
1869
+ title: string // the product as the store lists it
1870
+ price: number | null // USD; null if unpriced
1871
+ wasPrice: number | null // the pre-markdown price, when the store publishes one
1872
+ url: string | null // product page
1873
+ inStock: boolean // this store's OWN in-stock signal — not comparable
1874
+ // across stores as one normalized fact
1875
+ }
1876
+ type RetailSearchResult = {
1877
+ results: RetailOffer[] // ONE query across ALL stores, price-sorted (cheapest first)
1878
+ warnings: string[] // always present; names any store that did not answer. A
1879
+ // store named here priced NOTHING, so read this before
1880
+ // concluding a store has no stock or a worse price
1881
+ }
1882
+
1883
+ type CallOptions = {
1884
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
1885
+ // A provider slower than this is DROPPED from the results and
1886
+ // NAMED in warnings — never silently absent
1887
+ }
1888
+
1889
+ /**
1890
+ * General-merchandise retail across Walmart and Target — one keyword search, fanned out in
1891
+ * parallel and returned price-sorted, so an agent can answer 'where can I actually buy this
1892
+ * and what does it cost' without querying each store by hand.
1893
+ */
1894
+ interface Unit {
1895
+ /**
1896
+ * Searches Walmart and Target in parallel for a keyword and returns one price-sorted list of
1897
+ * offers across both stores, each tagged with which store it's from. `warnings` names any
1898
+ * store that did not answer, so a caller can tell a genuinely cheaper/only offer from one
1899
+ * where a store simply timed out.
1900
+ */
1901
+ search(args: { query: string }): Promise<RetailSearchResult>;
1902
+ }
1903
+ }
1904
+
1905
+ declare namespace BowmarkCapability_school_shopping_basket {
1906
+ // ── Price a school-supply list across Target and Walmart — the unit's own declarations, verbatim ──
1907
+ interface BasketItemMatch {
1908
+ query: string
1909
+ title: string
1910
+ url: string
1911
+ price: { amount: number; currency: string } // integer minor units
1912
+ }
1913
+ interface RetailerBasket {
1914
+ total: { amount: number; currency: string } | null // sums matched only — a partial
1915
+ // sum whenever incomplete is
1916
+ // non-empty
1917
+ matched: BasketItemMatch[]
1918
+ unavailable: string[] // this retailer ANSWERED and has no in-stock priced match
1919
+ incomplete: string[] // this retailer's search never answered — NOT out of stock,
1920
+ // nothing was learned; retry with fewer items or more time
1921
+ }
1922
+ interface SchoolShoppingBasket {
1923
+ retailers: { target: RetailerBasket; walmart: RetailerBasket }
1924
+ warnings: string[]
1925
+ }
1926
+ type CallOptions = {
1927
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
1928
+ // A provider slower than this is DROPPED from the results and
1929
+ // NAMED in warnings — never silently absent
1930
+ }
1931
+
1932
+ /**
1933
+ * Given a list of item queries (a school supply list), fans out to Target and Walmart search,
1934
+ * picks the cheapest in-stock match per item per retailer, and returns each retailer's basket
1935
+ * total plus which items neither retailer has in stock right now.
1936
+ */
1937
+ interface Unit {
1938
+ /**
1939
+ * Prices a multi-item shopping list at Target and Walmart, one basket total per retailer. An
1940
+ * item the retailer answered about and does not stock is in `unavailable`; an item whose
1941
+ * search never answered is in `incomplete` and is NOT a stockout — nothing was learned about
1942
+ * it, and the retailer's total is then a partial sum. Every incomplete item is also named in
1943
+ * `warnings`. Never throws on one retailer being unreachable — that retailer's basket is
1944
+ * dropped and named in `warnings` instead; throws only when BOTH retailers failed on every
1945
+ * item. Walmart drives a real browser per item and every item is searched at once, so a long
1946
+ * list is what costs time: price fewer items per call before reaching for a larger
1947
+ * `timeoutMs`.
1948
+ */
1949
+ priceList(args: { items: string[] }): Promise<SchoolShoppingBasket>;
1950
+ }
1951
+ }
1952
+
1710
1953
  declare namespace BowmarkCapability_search {
1711
1954
  // ── Web search — the unit's own declarations, verbatim ──
1712
1955
  type SearchResult = {
@@ -2407,6 +2650,57 @@ interface aaMaxCheckedBagsRule {
2407
2650
  }
2408
2651
  }
2409
2652
 
2653
+ declare namespace BowmarkProvider_aauto {
2654
+ // ── 1A Auto — the unit's own declarations, verbatim ──
2655
+ interface AautoSearchProduct {
2656
+ id: string;
2657
+ title: string;
2658
+ brand: string;
2659
+ category: string;
2660
+ price: number;
2661
+ url: string;
2662
+ image: string | null;
2663
+ }
2664
+ interface AautoSearchResult {
2665
+ query: string;
2666
+ /** The site's own reported match count — can exceed products.length. */
2667
+ totalResults: number;
2668
+ products: AautoSearchProduct[];
2669
+ }
2670
+ interface AautoProduct {
2671
+ id: string;
2672
+ title: string;
2673
+ brand: string;
2674
+ category: string;
2675
+ price: number;
2676
+ sku: string | null;
2677
+ inStock: boolean;
2678
+ description: string;
2679
+ image: string | null;
2680
+ url: string;
2681
+ }
2682
+
2683
+ /**
2684
+ * 1A Auto's DIY replacement-parts catalog — search results and one product's real price, stock
2685
+ * and description — read off the live storefront.
2686
+ */
2687
+ interface Unit {
2688
+ /**
2689
+ * Reads 1A Auto's own search-results page for `query` — real price, brand, category and
2690
+ * product URL per row, plus the site's own total-match count. `limit` truncates the first
2691
+ * results page (the site itself paginates; this reads only the first page).
2692
+ */
2693
+ search(query: string, opts?: { limit?: number }): Promise<AautoSearchResult>;
2694
+
2695
+ /**
2696
+ * Reads one product page by the URL search() returns (absolute or a site-relative path) —
2697
+ * title, brand, SKU, price, live stock status and description text. THROWS if the page does
2698
+ * not carry the site's own product data block.
2699
+ */
2700
+ getProduct(url: string): Promise<AautoProduct>;
2701
+ }
2702
+ }
2703
+
2410
2704
  declare namespace BowmarkProvider_abercrombie {
2411
2705
  // ── Abercrombie & Fitch — the unit's own declarations, verbatim ──
2412
2706
  interface abercrombieSizeOption {
@@ -2723,6 +3017,54 @@ interface AjmadisonSearchResult {
2723
3017
  }
2724
3018
  }
2725
3019
 
3020
+ declare namespace BowmarkProvider_allied {
3021
+ // ── Allied Van Lines — the unit's own declarations, verbatim ──
3022
+ interface AlliedSupplyLine {
3023
+ item: string;
3024
+ quantity: number | null;
3025
+ }
3026
+ interface AlliedRoomSupplies {
3027
+ room: string;
3028
+ supplies: AlliedSupplyLine[];
3029
+ }
3030
+ interface AlliedPackingEstimate {
3031
+ totalSupplies: AlliedSupplyLine[];
3032
+ byRoom: AlliedRoomSupplies[];
3033
+ }
3034
+ interface AlliedPackingCalculatorInput {
3035
+ yearsInHome?: "lessThan5" | "5to10" | "over10";
3036
+ cabinetsClosets?: "clutterFree" | "packRat";
3037
+ kitchen?: boolean;
3038
+ pantry?: boolean;
3039
+ diningRoom?: boolean;
3040
+ livingRoom?: boolean;
3041
+ familyRoom?: boolean;
3042
+ homeOffice?: boolean;
3043
+ bedrooms?: number;
3044
+ garageBays?: number;
3045
+ storedAttic?: boolean;
3046
+ storageFacility?: boolean;
3047
+ otherRooms?: number;
3048
+ }
3049
+
3050
+ /**
3051
+ * Runs Allied Van Lines' own Packing Calculator — takes which rooms are moving (no name, email
3052
+ * or phone) and returns a real, server-computed whole-house and per-room packing-supply
3053
+ * estimate (cartons, tape, paper). Allied's separate 'quote' flow is a sales-lead form with no
3054
+ * computed price and is out of scope; this is the one part of allied.com that answers a
3055
+ * question with a number.
3056
+ */
3057
+ interface Unit {
3058
+ /**
3059
+ * Allied Van Lines' own Packing Calculator: pass which rooms are moving (kitchen, bedrooms
3060
+ * count, garage bays, etc — no identity required) and get back a real per-room and whole-house
3061
+ * estimate of boxes, tape and paper. At least one room must be set, matching the site's own
3062
+ * validation.
3063
+ */
3064
+ estimatePackingSupplies(input: AlliedPackingCalculatorInput): Promise<AlliedPackingEstimate>;
3065
+ }
3066
+ }
3067
+
2726
3068
  declare namespace BowmarkProvider_alphavantage {
2727
3069
  // ── Alpha Vantage — the unit's own declarations, verbatim ──
2728
3070
  interface AlphavantageSignUpDetails {
@@ -2969,6 +3311,51 @@ interface AppleTradeInEstimate {
2969
3311
  }
2970
3312
  }
2971
3313
 
3314
+ declare namespace BowmarkProvider_aquaphoenixsci {
3315
+ // ── AquaPhoenix Scientific — the unit's own declarations, verbatim ──
3316
+ // aquaphoenixsci's OWN shapes — not a capability contract.
3317
+
3318
+ interface AquaphoenixsciListing {
3319
+ sku: string;
3320
+ name: string;
3321
+ path: string; // pass to getProduct()
3322
+ price: number | null; // dollars, or null when gated behind a business account
3323
+ requiresBusinessAccount: boolean;
3324
+ }
3325
+
3326
+ interface AquaphoenixsciProduct {
3327
+ sku: string;
3328
+ name: string;
3329
+ path: string;
3330
+ price: number | null; // dollars, or null when gated behind a business account
3331
+ requiresBusinessAccount: boolean;
3332
+ inStock: boolean;
3333
+ checkoutUrl: string; // the real product page — add-to-cart / checkout entry point
3334
+ }
3335
+
3336
+ /**
3337
+ * AquaPhoenix Scientific's real catalog storefront (water/chemical testing and feed-control
3338
+ * equipment) — browse a category for real SKUs and prices, and read one product's real price,
3339
+ * stock status and add-to-cart/checkout URL.
3340
+ */
3341
+ interface Unit {
3342
+ /**
3343
+ * Lists real products in one of AquaPhoenix's catalog categories, e.g.
3344
+ * "testing-supplies/test-kits" or "feed-and-control-equipment/pumps-accessories" — real SKU,
3345
+ * name, product path, and either a real anonymous price or a note that the SKU requires a
3346
+ * business account. THROWS naming the closed set of real category paths on an unknown one.
3347
+ */
3348
+ browseCategory(category: string): Promise<AquaphoenixsciListing[]>;
3349
+
3350
+ /**
3351
+ * Reads one product's real detail page — SKU, name, price (when anonymously priced), stock
3352
+ * status, and the real product URL to hand to the shopper as the add-to-cart / checkout entry
3353
+ * point. THROWS naming browseCategory() as the way to find a real path on an unknown one.
3354
+ */
3355
+ getProduct(path: string): Promise<AquaphoenixsciProduct>;
3356
+ }
3357
+ }
3358
+
2972
3359
  declare namespace BowmarkProvider_archipelago {
2973
3360
  // ── Archipelago — the unit's own declarations, verbatim ──
2974
3361
  interface ArchipelagoAsset {
@@ -5029,6 +5416,44 @@ interface CaliProductDetail extends CaliProduct {
5029
5416
  }
5030
5417
  }
5031
5418
 
5419
+ declare namespace BowmarkProvider_camelcamelcamel {
5420
+ // ── camelcamelcamel — the unit's own declarations, verbatim ──
5421
+ interface CamelPriceStat {
5422
+ price: number | null;
5423
+ date: string | null;
5424
+ }
5425
+
5426
+ interface CamelPriceTypeStats {
5427
+ lowestEver: CamelPriceStat;
5428
+ highestEver: CamelPriceStat;
5429
+ current: CamelPriceStat;
5430
+ average: number | null;
5431
+ }
5432
+
5433
+ interface CamelPriceHistory {
5434
+ asin: string;
5435
+ productTitle: string;
5436
+ amazon: CamelPriceTypeStats;
5437
+ thirdPartyNew: CamelPriceTypeStats;
5438
+ thirdPartyUsed: CamelPriceTypeStats;
5439
+ chartUrl: string;
5440
+ }
5441
+
5442
+ /**
5443
+ * Independent Amazon price-history tracker — real lowest/highest/current/average price per
5444
+ * item, each dated, so a claimed 'sale' can be checked against what the item actually sold
5445
+ * for.
5446
+ */
5447
+ interface Unit {
5448
+ /**
5449
+ * Reads camelcamelcamel's independently-tracked Amazon price history for one ASIN — the site's
5450
+ * own lowest-ever/highest-ever/current/average figures, each dated, for the Amazon,
5451
+ * 3rd-party-new and 3rd-party-used price types, plus the full-history chart image URL.
5452
+ */
5453
+ getPriceHistory(asinOrUrl: string): Promise<CamelPriceHistory>;
5454
+ }
5455
+ }
5456
+
5032
5457
  declare namespace BowmarkProvider_cancer {
5033
5458
  // ── National Cancer Institute (cancer.gov) — the unit's own declarations, verbatim ──
5034
5459
  type cancerCenterDesignation =
@@ -6216,17 +6641,35 @@ interface ClubchampionFittingsMenu {
6216
6641
  activePromoTerms: string | null;
6217
6642
  }
6218
6643
 
6219
- interface ClubchampionAvailability {
6644
+ interface ClubchampionFitter {
6645
+ id: string; // the id checkAvailability takes
6646
+ name: string;
6647
+ locationId: string;
6648
+ locationName: string; // the studio name listStudios() and getFittings() use
6649
+ timezone: string;
6650
+ handedness: string[];
6651
+ specialties: string[];
6652
+ locationBayCount: number;
6653
+ }
6654
+
6655
+ interface ClubchampionSlot {
6656
+ start: string; // ISO instant, e.g. "2026-09-08T10:00:00.000Z"
6657
+ end: string;
6658
+ status: string; // the site's own word, e.g. "available"
6220
6659
  resourceId: string;
6660
+ }
6661
+
6662
+ interface ClubchampionAvailability {
6663
+ resourceId: string; // the fitter id, echoed back
6221
6664
  range: { start: string; end: string };
6222
- mode: string; // the site's own live/cached indicator
6223
- slots: unknown[]; // the site's own slot list, verbatim — empty is a real answer
6665
+ mode: string; // the site's own live/cached indicator
6666
+ slots: ClubchampionSlot[]; // verbatim — empty is a real answer
6224
6667
  }
6225
6668
 
6226
6669
  /**
6227
- * Club Champion's live studio directory, real per-store fitting pricing, and real open-slot
6228
- * availability checks — the same booking widget backend the site itself calls. Rung 10, no
6229
- * browser.
6670
+ * Club Champion's live studio directory, its fitters, real per-store fitting pricing, and real
6671
+ * open-slot availability on a named fitter's calendar — the same booking widget backend the
6672
+ * site itself calls. Rung 10, no browser.
6230
6673
  */
6231
6674
  interface Unit {
6232
6675
  /**
@@ -6243,12 +6686,22 @@ interface ClubchampionAvailability {
6243
6686
  getFittings(storeName: string): Promise<ClubchampionFittingsMenu>;
6244
6687
 
6245
6688
  /**
6246
- * Checks real, live open-slot availability for one fitting product (a `productId` from
6247
- * getFittings()) over a "YYYY-MM-DD"..."YYYY-MM-DD" date range the same live check the
6248
- * site's own booking widget makes. An empty `slots` array is the site's real answer, not an
6689
+ * Reads the live list of every Club Champion fitter (~396 across the chain) — the person a
6690
+ * fitting is booked with, and the only id checkAvailability accepts. Pass a studio name from
6691
+ * listStudios(), e.g. "Bellevue", to get just that studio's fitters.
6692
+ */
6693
+ listFitters(storeName?: string): Promise<ClubchampionFitter[]>;
6694
+
6695
+ /**
6696
+ * Checks real, live open-slot availability on one FITTER's calendar (an `id` from
6697
+ * listFitters()) over a "YYYY-MM-DD"..."YYYY-MM-DD" range — the same live check the site's own
6698
+ * booking widget makes. A fitting `productId` from getFittings() is a DIFFERENT id space and
6699
+ * the site answers it with an empty list, so pass a fitter id. Optional `durationMinutes` and
6700
+ * `fittingType` mirror what the widget sends. An empty `slots` array is the site's real answer
6701
+ * — a closed day, a booked-out fitter, or a date past the ~60-day booking horizon — not an
6249
6702
  * error.
6250
6703
  */
6251
- checkAvailability(resourceId: string, start: string, end: string): Promise<ClubchampionAvailability>;
6704
+ checkAvailability(fitterId: string, start: string, end: string, durationMinutes?: number, fittingType?: string): Promise<ClubchampionAvailability>;
6252
6705
  }
6253
6706
  }
6254
6707
 
@@ -7356,6 +7809,34 @@ interface DisneyTicketPrice {
7356
7809
  }
7357
7810
  }
7358
7811
 
7812
+ declare namespace BowmarkProvider_doordash {
7813
+ // ── DoorDash — the unit's own declarations, verbatim ──
7814
+ interface DoordashSearchArgs {
7815
+ query: string; // free text, e.g. "pad thai austin tx" — DoorDash resolves location itself
7816
+ limit?: number; // default 10, clamped to [1, 30]
7817
+ }
7818
+
7819
+ interface DoordashSearchResult {
7820
+ name: string;
7821
+ url: string;
7822
+ deliveryFee: number | null; // DoorDash's own advertised delivery fee, in dollars
7823
+ rating: number | null;
7824
+ etaMinutes: number | null;
7825
+ }
7826
+
7827
+ /**
7828
+ * DoorDash's own store search — returns real, currently-listed stores for a free-text query
7829
+ * with the delivery fee, rating and ETA DoorDash itself advertises on the results card.
7830
+ */
7831
+ interface Unit {
7832
+ /**
7833
+ * Runs DoorDash's own store search for a free-text query and returns real, currently-listed
7834
+ * stores with DoorDash's own advertised delivery fee, rating and ETA. Read-only.
7835
+ */
7836
+ search(args: DoordashSearchArgs): Promise<DoordashSearchResult[]>;
7837
+ }
7838
+ }
7839
+
7359
7840
  declare namespace BowmarkProvider_ebay {
7360
7841
  // ── eBay — the unit's own declarations, verbatim ──
7361
7842
  interface ebayItem {
@@ -8776,10 +9257,11 @@ interface fredObservations {
8776
9257
  seriesId: string;
8777
9258
  /** The transform FRED reports having applied: "lin" (none), "pc1", "pch", … */
8778
9259
  units: string;
8779
- observationStart: string;
8780
- observationEnd: string;
8781
- realtimeStart: string;
8782
- realtimeEnd: string;
9260
+ observationStart: string | null;
9261
+ observationEnd: string | null;
9262
+ /** null: the public CSV has no vintage envelope. */
9263
+ realtimeStart: string | null;
9264
+ realtimeEnd: string | null;
8783
9265
  count: number;
8784
9266
  observations: fredObservation[];
8785
9267
  }
@@ -8831,10 +9313,10 @@ interface fredObservations {
8831
9313
  * `pch`, `chg`, `log` and the rest of FRED's ten codes), and `frequency` with
8832
9314
  * `aggregationMethod` collapses a series to a coarser period (`{ frequency: "a",
8833
9315
  * aggregationMethod: "avg" }` turns the monthly unemployment rate into annual averages). The
8834
- * result carries the transform FRED reports having applied and the vintage it served, so a
8835
- * caller can tell what they actually got. This is the function to call once
8836
- * `searchSeries`/`getSeriesInfo` has identified the right series id — e.g. A191RL1Q225SBEA for
8837
- * the US real GDP growth rate.
9316
+ * result carries the applied transform and the served row bounds; its realtime fields are
9317
+ * `null` because the keyless CSV publishes no vintage envelope. This is the function to call
9318
+ * once `searchSeries`/`getSeriesInfo` has identified the right series id — e.g.
9319
+ * A191RL1Q225SBEA for the US real GDP growth rate.
8838
9320
  */
8839
9321
  getSeriesObservations(args: string | { seriesId: string; from?: string; to?: string; units?: string; frequency?: string; aggregationMethod?: string }): Promise<fredObservations>;
8840
9322
 
@@ -9405,6 +9887,109 @@ interface GlassesusaProduct {
9405
9887
  }
9406
9888
  }
9407
9889
 
9890
+ declare namespace BowmarkProvider_goloadup {
9891
+ // ── LoadUp — the unit's own declarations, verbatim ──
9892
+ // LoadUp's OWN shapes — not a capability contract.
9893
+
9894
+ interface GoloadupItemType {
9895
+ id: string; // the key getQuote's items take
9896
+ name: string;
9897
+ category: string | null; // e.g. "COUCH", "MATTRESS"
9898
+ aliases: string[]; // alternate names the site matches this item on
9899
+ pickupAllowed: boolean;
9900
+ pickupPrice: number | null; // national base price — getQuote is the real, ZIP-priced number
9901
+ assemblyAllowed: boolean;
9902
+ assemblyPrice: number | null;
9903
+ disassemblyAllowed: boolean;
9904
+ disassemblyPrice: number | null;
9905
+ }
9906
+
9907
+ interface GoloadupQuoteItem { itemId: string; quantity: number }
9908
+
9909
+ interface GoloadupQuote {
9910
+ validServiceArea: boolean; // false = ZIP is outside LoadUp's service area, other fields are placeholders
9911
+ validZip: boolean; // false = ZIP itself is not recognized
9912
+ basePrice: number; // the area/trip fee added on top of the items
9913
+ total: number; // the guaranteed total for exactly these items at this ZIP
9914
+ totalFormatted: string; // "$124.00"
9915
+ taxAmount: number;
9916
+ minimumPrice: number; // the floor LoadUp charges regardless of what's selected
9917
+ minimumPriceApplied: boolean;
9918
+ sameDayAllowed: boolean;
9919
+ bookingUrl: string; // hand the shopper here to finish scheduling
9920
+ }
9921
+
9922
+ interface GoloadupServiceAvailability {
9923
+ validZip: boolean;
9924
+ inService: boolean;
9925
+ sameDayAllowed: boolean;
9926
+ estimationAllowed: boolean;
9927
+ retailAssembliesAllowed: boolean;
9928
+ }
9929
+
9930
+ /**
9931
+ * LoadUp's own item-selector and live pricing engine for junk removal, donation and furniture
9932
+ * pickup — the current catalog of items with base prices, a real ZIP-specific guaranteed quote
9933
+ * for an exact set of items, and whether/how a ZIP is served, all off the same GraphQL API the
9934
+ * site's own booking widget calls.
9935
+ */
9936
+ interface Unit {
9937
+ /**
9938
+ * Returns LoadUp's full current catalog of pickupable items (couches, mattresses, appliances,
9939
+ * and 400+ more), each with its category, alternate names, and national base
9940
+ * pickup/assembly/disassembly prices. The `id` on each row is what getQuote's items take —
9941
+ * this is the entry point every quote starts from.
9942
+ */
9943
+ getPricingCatalog(): Promise<GoloadupItemType[]>;
9944
+
9945
+ /**
9946
+ * Prices an EXACT set of items (e.g. [{ itemId: "7412", quantity: 1 }] for one Couch/Loveseat)
9947
+ * at a real ZIP code against LoadUp's live pricing engine — the same call its own booking
9948
+ * widget makes. Returns the guaranteed total, whether the ZIP falls under the site's
9949
+ * minimum-price floor, and same-day availability. `validServiceArea: false` means the ZIP is
9950
+ * real but outside LoadUp's coverage, not an error — check it before reading `total`.
9951
+ */
9952
+ getQuote(zip: string, items: GoloadupQuoteItem[]): Promise<GoloadupQuote>;
9953
+
9954
+ /**
9955
+ * Checks whether and how LoadUp serves one ZIP code, independent of any specific items — in
9956
+ * service, same-day pickup allowed, and whether retail assembly is offered there.
9957
+ */
9958
+ checkServiceAvailability(zip: string): Promise<GoloadupServiceAvailability>;
9959
+ }
9960
+ }
9961
+
9962
+ declare namespace BowmarkProvider_goodway {
9963
+ // ── Goodway Technologies — the unit's own declarations, verbatim ──
9964
+ interface GoodwayProductSummary {
9965
+ sku: string;
9966
+ title: string;
9967
+ url: string;
9968
+ price: string | null; // null = call for price / quote required
9969
+ }
9970
+ interface GoodwayProduct extends GoodwayProductSummary {
9971
+ purchaseType: "buy" | "quote";
9972
+ }
9973
+
9974
+ /**
9975
+ * Goodway's own pressure-washer catalog — real listed prices, or a quote-required flag for
9976
+ * call-for-price units, and the site's own product page as the buy/quote handoff.
9977
+ */
9978
+ interface Unit {
9979
+ /**
9980
+ * Reads Goodway's pressure-washer catalog grid — every listed model, its SKU, its live price
9981
+ * (or null if quote-required) and its product page.
9982
+ */
9983
+ searchProducts(): Promise<GoodwayProductSummary[]>;
9984
+
9985
+ /**
9986
+ * Reads one product's detail page for its real current price and whether it buys online or
9987
+ * needs a written quote.
9988
+ */
9989
+ getProduct(arg0: { slug: string }): Promise<GoodwayProduct>;
9990
+ }
9991
+ }
9992
+
9408
9993
  declare namespace BowmarkProvider_google_flights {
9409
9994
  // ── Google Flights — the unit's own declarations, verbatim ──
9410
9995
  interface GoogleFlightQuery {
@@ -11053,6 +11638,10 @@ interface HobieModelSummary {
11053
11638
  name: string;
11054
11639
  url: string;
11055
11640
  }
11641
+ interface HobieKayakModelList {
11642
+ total_models: number;
11643
+ models: HobieModelSummary[];
11644
+ }
11056
11645
  interface HobieModelColor {
11057
11646
  color: string;
11058
11647
  upc: string;
@@ -11103,6 +11692,12 @@ interface HobieLocalAvailability {
11103
11692
  */
11104
11693
  listModels(): Promise<HobieModelSummary[]>;
11105
11694
 
11695
+ /**
11696
+ * Returns Hobie's live kayak-model list plus total_models. To answer a count request, call it
11697
+ * with run; do not infer or paraphrase the count from this description.
11698
+ */
11699
+ listKayakModels(): Promise<HobieKayakModelList>;
11700
+
11106
11701
  /**
11107
11702
  * Reads one model's real buildable colors, each paired with the exact UPC the local-inventory
11108
11703
  * widget is keyed on, plus the site's own default color.
@@ -11493,6 +12088,22 @@ interface IdentitygroupMountOptionResult {
11493
12088
  }
11494
12089
  }
11495
12090
 
12091
+ declare namespace BowmarkProvider_ihg {
12092
+ // ── IHG Hotels & Resorts — the unit's own declarations, verbatim ──
12093
+ interface ihgRow { id: string; brandCode: string; availabilityStatus: string; lowestCashOnlyCost: { baseAmount: string; ratePlanType: string | null } | null; highestCashOnlyCost: { baseAmount: string; ratePlanType: string | null } | null; propertyCurrency: string | null; distance: number | null; distanceKm: number | null; }
12094
+
12095
+ /** IHG live hotel availability search across its brand portfolio. */
12096
+ interface Unit {
12097
+ /**
12098
+ * Searches IHG's live cash availability for a destination and increasing ISO
12099
+ * check-in/check-out dates. Returns IHG's hotel mnemonic, brand code, availability status,
12100
+ * cash-price range, currency and distance; IHG's availability endpoint does not include
12101
+ * display names.
12102
+ */
12103
+ search(args: { destination: string; checkIn: string; checkOut: string; adults?: number; rooms?: number; radius?: number }): Promise<ihgRow[]>;
12104
+ }
12105
+ }
12106
+
11496
12107
  declare namespace BowmarkProvider_instagram {
11497
12108
  // ── Instagram — the unit's own declarations, verbatim ──
11498
12109
  interface InstagramProfile {
@@ -13181,6 +13792,24 @@ interface KayakCar {
13181
13792
  }
13182
13793
  }
13183
13794
 
13795
+ declare namespace BowmarkProvider_keepa {
13796
+ // ── Keepa — the unit's own declarations, verbatim ──
13797
+ interface KeepaProductResult { product: KeepaProduct; tokensLeft: number | null; tokensConsumed: number | null; refillRate: number | null; }
13798
+ interface KeepaProduct { asin: string; domainId: number; title: string; csv?: unknown[]; stats?: Record<string, unknown>; }
13799
+
13800
+ /**
13801
+ * Keepa's documented Amazon product API — reads a product's native price history and metadata
13802
+ * by ASIN. Requires a caller-provided Keepa API key.
13803
+ */
13804
+ interface Unit {
13805
+ /**
13806
+ * Reads Keepa's native Amazon product record and compact price-history series for one ASIN.
13807
+ * Requires a caller-provided Keepa API key.
13808
+ */
13809
+ getProduct(args: { asin: string; domain?: number; stats?: number }): Promise<KeepaProductResult>;
13810
+ }
13811
+ }
13812
+
13184
13813
  declare namespace BowmarkProvider_kingsdown {
13185
13814
  // ── Kingsdown — the unit's own declarations, verbatim ──
13186
13815
  interface kingsdownBedmatchResult {
@@ -16354,6 +16983,43 @@ interface MuzeVisitingHours {
16354
16983
  }
16355
16984
  }
16356
16985
 
16986
+ declare namespace BowmarkProvider_myollie {
16987
+ // ── Ollie — the unit's own declarations, verbatim ──
16988
+ interface OllieMealPlanOption {
16989
+ planType: string;
16990
+ planTypeName: string;
16991
+ startingPricePerWeek: number;
16992
+ availableCadences: number[];
16993
+ defaultCadence: number;
16994
+ }
16995
+
16996
+ interface GetMealPlanResult {
16997
+ weightLbs: number;
16998
+ activityLevel: "Low" | "Moderate" | "High";
16999
+ plans: OllieMealPlanOption[];
17000
+ checkoutUrl: string;
17001
+ }
17002
+
17003
+ /**
17004
+ * Fresh dog food subscription. getMealPlan is live — the same
17005
+ * weight/activity/neuter-status-driven meal plan and REAL per-plan weekly price the site's own
17006
+ * onboarding quiz computes, given a dog's weight, activity level and neuter status. Returns
17007
+ * all four plan tiers (Fresh, Baked, Mixed, Half Fresh) with this dog's own computed starting
17008
+ * price, plus a checkout link that carries the answers forward.
17009
+ */
17010
+ interface Unit {
17011
+ /**
17012
+ * Computes Ollie's personalized fresh-food meal plan and REAL weekly price for a dog, given
17013
+ * `weightLbs` (number, e.g. 45), `activityLevel` ("Low"|"Moderate"|"High"), `isNeutered`
17014
+ * (boolean) and optional `gender` ("Male"|"Female"). Returns all four plan tiers (Fresh,
17015
+ * Baked, Mixed, Half Fresh) each with this dog's own computed `startingPricePerWeek` — not a
17016
+ * marketing-page range — plus a `checkoutUrl` that carries the answers into the site's own
17017
+ * checkout. Recovered from the onboarding quiz's own API, not guessed at.
17018
+ */
17019
+ getMealPlan(args: object): Promise<GetMealPlanResult>;
17020
+ }
17021
+ }
17022
+
16357
17023
  declare namespace BowmarkProvider_naic {
16358
17024
  // ── NAIC — the unit's own declarations, verbatim ──
16359
17025
  interface naicCompanyQuery {
@@ -16853,6 +17519,43 @@ interface StoreStock {
16853
17519
  }
16854
17520
  }
16855
17521
 
17522
+ declare namespace BowmarkProvider_nutrafol {
17523
+ // ── Nutrafol — the unit's own declarations, verbatim ──
17524
+ interface RootCause {
17525
+ category: "Stress" | "Metabolism" | "Nutrition" | "Lifestyle" | "Hormone" | "Aging";
17526
+ severity: string; // the site's own label, e.g. "NEEDS SUPPORT", "MODERATE", "NORMAL"
17527
+ description: string | null;
17528
+ signs: string[];
17529
+ }
17530
+ interface HairWellnessAssessment {
17531
+ rootCauses: RootCause[];
17532
+ }
17533
+ interface QuizOverview {
17534
+ description: string;
17535
+ rootCauseCategories: string[];
17536
+ }
17537
+
17538
+ /**
17539
+ * Nutrafol's own Hair Wellness Quiz — assessHairWellness runs the real root-cause assessment
17540
+ * and returns its own computed per-category severities (Stress, Metabolism, Nutrition,
17541
+ * Lifestyle, Hormone, Aging), the personalized output the site's marketing pages only
17542
+ * describe.
17543
+ */
17544
+ interface Unit {
17545
+ /**
17546
+ * Runs Nutrafol's own Hair Wellness Quiz along its default answer path and returns the site's
17547
+ * real computed root-cause severities. Read-only — never adds to cart or checks out.
17548
+ */
17549
+ assessHairWellness(): Promise<HairWellnessAssessment>;
17550
+
17551
+ /**
17552
+ * Reads the Hair Wellness Quiz's own static intro page — its real description and the six
17553
+ * root-cause categories it screens for — with a plain browserless fetch.
17554
+ */
17555
+ getQuizOverview(): Promise<QuizOverview>;
17556
+ }
17557
+ }
17558
+
16856
17559
  declare namespace BowmarkProvider_nvisioncenters {
16857
17560
  // ── NVISION Eye Centers — the unit's own declarations, verbatim ──
16858
17561
  // NVISION's OWN shapes — not a capability contract.
@@ -17005,6 +17708,69 @@ interface OliverwineryShippingAvailability {
17005
17708
  }
17006
17709
  }
17007
17710
 
17711
+ declare namespace BowmarkProvider_othership {
17712
+ // ── Othership — the unit's own declarations, verbatim ──
17713
+ // Othership's OWN shapes — not a capability contract.
17714
+
17715
+ interface OthershipLocation {
17716
+ id: string; // the key getClassSchedule's locationId takes
17717
+ name: string; // e.g. "Adelaide", "Flatiron", "Williamsburg"
17718
+ city: string;
17719
+ stateProvince: string;
17720
+ formattedAddress: string;
17721
+ timezone: string;
17722
+ currencyCode: string;
17723
+ regionName: string | null; // e.g. "Toronto", "NYC"
17724
+ }
17725
+
17726
+ interface OthershipClass {
17727
+ id: string;
17728
+ name: string; // e.g. "Guided Up: Arctic Tundra - 60 min"
17729
+ description: string;
17730
+ durationMinutes: number;
17731
+ classroomName: string;
17732
+ instructorNames: string[];
17733
+ tags: string[]; // e.g. ["Guided", "Sun Pass"]
17734
+ startDateTime: string; // ISO 8601 with the location's own UTC offset
17735
+ bookingStartDateTime: string;
17736
+ availableSpotCount: number; // real, live — 0 means fully booked, not "not offered"
17737
+ capacity: number;
17738
+ spotCountIsPublic: boolean;
17739
+ isCancelled: boolean;
17740
+ }
17741
+
17742
+ interface OthershipClassSchedule {
17743
+ classes: OthershipClass[];
17744
+ totalCount: number; // may exceed classes.length if the range was too broad — see warnings
17745
+ scheduleUrl: string; // hand the visitor here to finish booking
17746
+ warnings: string[];
17747
+ }
17748
+
17749
+ /**
17750
+ * Othership's real, live class schedule and seat availability across its Toronto and NYC
17751
+ * sauna/ice-bath/breathwork studios — the same data its Mariana Tek booking widget shows, read
17752
+ * directly rather than through a JS embed nothing outside a real browser can render.
17753
+ */
17754
+ interface Unit {
17755
+ /**
17756
+ * Returns every Othership studio location (Toronto's Adelaide and Yorkville, NYC's Flatiron
17757
+ * and Williamsburg) with its site id, city, address and timezone. The `id` on each row is what
17758
+ * getClassSchedule's locationId takes — this is the entry point every schedule search starts
17759
+ * from.
17760
+ */
17761
+ getLocations(): Promise<OthershipLocation[]>;
17762
+
17763
+ /**
17764
+ * Searches one Othership location's real, live class schedule between two YYYY-MM-DD dates —
17765
+ * sauna, ice bath and breathwork sessions with instructor names, duration, tags and the actual
17766
+ * seats left right now, off the same Mariana Tek API the site's own booking widget calls.
17767
+ * `availableSpotCount: 0` means fully booked, not unavailable; `scheduleUrl` is where to send
17768
+ * someone to finish booking.
17769
+ */
17770
+ getClassSchedule(locationId: string, startDate: string, endDate: string): Promise<OthershipClassSchedule>;
17771
+ }
17772
+ }
17773
+
17008
17774
  declare namespace BowmarkProvider_otto {
17009
17775
  // ── OTTO — the unit's own declarations, verbatim ──
17010
17776
  interface ottoProduct {
@@ -21055,7 +21821,7 @@ interface SunHomeSaunasQuizOption {
21055
21821
  interface SunHomeSaunasQuizQuestion {
21056
21822
  id: string; // pass back as answers[].questionId
21057
21823
  title: string;
21058
- type: string; // the site's own node type, e.g. "SIMPLE_MULTI"
21824
+ type: string; // the site's own Digioh question type, e.g. "DIGIOH_PRQ"
21059
21825
  options: SunHomeSaunasQuizOption[]; // option.id -> answers[].optionIds
21060
21826
  }
21061
21827
 
@@ -21063,8 +21829,8 @@ interface SunHomeSaunasMatch {
21063
21829
  handle: string; // the key addSaunaToCart takes
21064
21830
  title: string;
21065
21831
  price: number; // dollars — real live Shopify price
21066
- matchScore: number; // e.g. 5
21067
- matchOutOf: number; // e.g. 5 -> the site's own "5/5 match"
21832
+ matchScore: number; // selected answers that positively weighted this product
21833
+ matchOutOf: number; // submitted answer selections
21068
21834
  }
21069
21835
 
21070
21836
  interface SunHomeSaunasCartResult {
@@ -21078,30 +21844,29 @@ interface SunHomeSaunasCartResult {
21078
21844
  }
21079
21845
 
21080
21846
  /**
21081
- * Sun Home Saunas' real Perfect Product Finder quiz — the site's own 5-question buyer quiz,
21082
- * its real server-computed ranked product matches with live prices, and a real Shopify cart
21083
- * write for the winning match — no login, no dealer routing.
21847
+ * Sun Home Saunas' live Digioh buyer quiz — its current questions, published product-ranking
21848
+ * rules, real Shopify prices, and a real cart write for a recommended product — no login or
21849
+ * dealer routing.
21084
21850
  */
21085
21851
  interface Unit {
21086
21852
  /**
21087
- * Reads Sun Home Saunas' real, live Perfect Product Finder quiz straight off its quiz vendor's
21088
- * own API the current 5 questions and every real option, with the real ids
21853
+ * Reads Sun Home Saunas' real, live Digioh buyer quiz from its published breakpoint
21854
+ * configurationevery current question and answer button, with the ids
21089
21855
  * getPersonalizedSaunaMatches() needs to answer them.
21090
21856
  */
21091
21857
  getSaunaFinderQuestions(): Promise<SunHomeSaunasQuizQuestion[]>;
21092
21858
 
21093
21859
  /**
21094
- * Submits real answers (from getSaunaFinderQuestions()) through the same quiz session flow the
21095
- * site's own UI uses, and returns the site's own SERVER-COMPUTED ranked product matches with
21096
- * real live prices and a real match score the exact personalized result a real buyer would
21097
- * see, never a guess from general knowledge.
21860
+ * Applies real answers (from getSaunaFinderQuestions()) to the live Digioh `prq_keywords`
21861
+ * rules the site's quiz publishes, then returns the site's own weighted ranking with real
21862
+ * current Shopify prices — never a general-knowledge guess.
21098
21863
  */
21099
21864
  getPersonalizedSaunaMatches(answers: {questionId: string, optionIds: string[]}[]): Promise<SunHomeSaunasMatch[]>;
21100
21865
 
21101
21866
  /**
21102
- * Adds one real matched sauna (a handle from getPersonalizedSaunaMatches()) to a real Shopify
21103
- * cart at Sun Home Saunas' own real live price, and reads the cart back to confirm the write
21104
- * landed. THROWS if the product is currently out of stock.
21867
+ * Adds one real matched product (a handle from getPersonalizedSaunaMatches()) to a real
21868
+ * Shopify cart at Sun Home Saunas' own real live price, and reads the cart back to confirm the
21869
+ * write landed. THROWS if the product is currently out of stock.
21105
21870
  */
21106
21871
  addSaunaToCart(handle: string, quantity?: number): Promise<SunHomeSaunasCartResult>;
21107
21872
  }
@@ -21894,6 +22659,9 @@ interface thezebraAutoDriver {
21894
22659
  lastName: string
21895
22660
  dob: string // ISO YYYY-MM-DD — carriers rate on the DATE, not on an age
21896
22661
  email: string
22662
+ ageFirstLicensed?: number // default 16 when omitted
22663
+ violations?: { accidents: number, claims: number, tickets: number } // default a clean record
22664
+ occupation?: string // default "OTHER" — the only two confirmed-valid values are "OTHER" and "ENGINEER"
21897
22665
  }
21898
22666
 
21899
22667
  interface thezebraAutoVehicle {
@@ -22109,26 +22877,30 @@ interface thezebraAutoQuotes {
22109
22877
  * carrier's own monthly and six-month premium, deductible, and the coverage it priced, as The
22110
22878
  * Zebra's auto quote funnel prices them. This is a priced offer for the person asking, NOT the
22111
22879
  * published averages `getStateRates` and its siblings return. Pass `driver` (`firstName`,
22112
- * `lastName`, `dob` ISO YYYY-MM-DD, `email`), one `vehicle` (`year`, `make`, `model` — a model
22113
- * The Zebra does not rate THROWS naming the URL it tried), the 2-letter `state`, a 5-digit
22114
- * `zip`, and `county` (the county the ZIP sits in The Zebra validates it server-side and a
22115
- * missing or wrong county is bounced). **The write binds, the read does not yet**: the
22116
- * GraphQL gateway at `graphql-gateway.production.thezebra.com` accepts the auto seed
22117
- * (`LegacyStartInput.start.currentlyInsured` is the only field Apollo currently exposes on
22118
- * that input), but the results route STILL bounces the session to the homepage with the four
22119
- * fields this function sends. The function throws on the bounce with a message naming the gap;
22120
- * the second required field on `LegacyStartInput` is the next attempt's work, and the rejected
22121
- * probes `helpToday`, `userPurchaseTimeframe`, `hadActiveInsurance`, `residenceOwnership`,
22122
- * `presumedAnswers`, `policyLinkInfo`, `startDate`, `desiredCoverage` are documented in
22123
- * `agents/capability-engineer/instances/vertical-insurance/tools/zebra-auto-quotes/shape-summary.json`
22124
- * (and the e5 clone) so they don't have to be re-derived. **`advertisedCarriers` is not a
22125
- * quote list and must never be read as one**: the results page would carry paid carrier
22126
- * placements alongside real offers, separated by `data-cy="results-card_ad_<carrier>"` (ad)
22127
- * versus `data-cy="results-card_q2b_<carrier>"` (real offer), and the advertised names are
22128
- * returned in their own field with no price attached. Every premium is USD and
22129
- * `monthlyPremium` is per MONTH the card's own period is checked rather than assumed, and a
22130
- * card printing any other term THROWS instead of relabelling a figure. `totalPremium` is the
22131
- * site's own whole-term number and is never divided out of the monthly one.
22880
+ * `lastName`, `dob` ISO YYYY-MM-DD, `email`, and optionally
22881
+ * `ageFirstLicensed`/`violations`/`occupation` each defaults to a clean-record placeholder
22882
+ * when omitted), one `vehicle` (`year`, `make`, `model` a model The Zebra does not rate
22883
+ * THROWS naming the URL it tried), the 2-letter `state`, a 5-digit `zip`, and `county` (the
22884
+ * county the ZIP sits in — The Zebra validates it server-side and a missing or wrong county is
22885
+ * bounced). **The write always binds** the GraphQL gateway at
22886
+ * `graphql-gateway.production.thezebra.com` accepts the seed and returns 200 but AS OF
22887
+ * 2026-08-27 the results route was bouncing the session to the homepage because
22888
+ * `LegacyDriverInput` and `LegacyVehicleInput` accept more fields than an earlier version of
22889
+ * this function sent; the measured field map (every field on both inputs, which are confirmed
22890
+ * valid, which are still unmeasured) lives in
22891
+ * `agents/richard/problems/thezebra-getautoquotes-broken.md` and is not re-derived here. The
22892
+ * function throws on a bounce with a message naming the redirect target; `vehicle.submodel`,
22893
+ * `driver.education` and `driver.creditScore` remain unsent because no valid value for any of
22894
+ * them is confirmed yet sending a guess cannot break the write (all three are nullable) but
22895
+ * a wrong guess would look like a fix without being one, so they stay out until a live probe
22896
+ * confirms a value. **`advertisedCarriers` is not a quote list and must never be read as
22897
+ * one**: the results page would carry paid carrier placements alongside real offers, separated
22898
+ * by `data-cy="results-card_ad_<carrier>"` (ad) versus `data-cy="results-card_q2b_<carrier>"`
22899
+ * (real offer), and the advertised names are returned in their own field with no price
22900
+ * attached. Every premium is USD and `monthlyPremium` is per MONTH — the card's own period is
22901
+ * checked rather than assumed, and a card printing any other term THROWS instead of
22902
+ * relabelling a figure. `totalPremium` is the site's own whole-term number and is never
22903
+ * divided out of the monthly one.
22132
22904
  */
22133
22905
  getAutoQuotes(query: thezebraAutoQuotesQuery): Promise<thezebraAutoQuotes>;
22134
22906
  }
@@ -22275,6 +23047,54 @@ interface TitlenineBraSizeResult {
22275
23047
  }
22276
23048
  }
22277
23049
 
23050
+ declare namespace BowmarkProvider_tmobile {
23051
+ // ── T-Mobile — the unit's own declarations, verbatim ──
23052
+ interface TmobileSku {
23053
+ id: string;
23054
+ listPriceUsd: number;
23055
+ monthlyPaymentUsd: number | null;
23056
+ contractTermMonths: number | null;
23057
+ }
23058
+ interface TmobileTradeInCredit {
23059
+ deviceLabel: string;
23060
+ creditUsd: number;
23061
+ }
23062
+ interface TmobilePromotion {
23063
+ promoId: string;
23064
+ displayName: string;
23065
+ headlineCreditUsd: number;
23066
+ tradeInCredits: TmobileTradeInCredit[];
23067
+ }
23068
+ interface TmobileTradeInMatch {
23069
+ model: string;
23070
+ promoId: string;
23071
+ promoDisplayName: string;
23072
+ creditUsd: number;
23073
+ }
23074
+ interface TmobileUpgradeOffer {
23075
+ devicePath: string;
23076
+ sourceUrl: string;
23077
+ sku: TmobileSku;
23078
+ promotions: TmobilePromotion[];
23079
+ tradeInMatch: TmobileTradeInMatch | null;
23080
+ }
23081
+
23082
+ /**
23083
+ * t-mobile.com's own device-page pricing call — real list price, real monthly financing, and
23084
+ * the site's own per-trade-in-device credit tiers, read through a real browser session (the
23085
+ * site signs every pricing request).
23086
+ */
23087
+ interface Unit {
23088
+ /**
23089
+ * Reads one t-mobile.com device page's own pricing call (list price, monthly financing, and
23090
+ * every applicable promotion's per-trade-in-device credit tier) and, when `tradeInModel` is
23091
+ * given, resolves the BEST matching credit across all of them — e.g. "iPhone 13" against a
23092
+ * page carrying tiers like "Save $830: iPhone 13".
23093
+ */
23094
+ getUpgradeOffer(arg: { devicePath: string; tradeInModel?: string }): Promise<TmobileUpgradeOffer>;
23095
+ }
23096
+ }
23097
+
22278
23098
  declare namespace BowmarkProvider_topviewtix {
22279
23099
  // ── TopView Sightseeing — the unit's own declarations, verbatim ──
22280
23100
  interface topviewtixPackageDetails {
@@ -23370,6 +24190,7 @@ interface walmartSearchResult {
23370
24190
  price: number | null;
23371
24191
  wasPrice: number | null;
23372
24192
  priceRangeMin: number | null;
24193
+ conditionCode: number | null;
23373
24194
  inStock: boolean;
23374
24195
  rating: number | null;
23375
24196
  reviewCount: number;
@@ -24670,15 +25491,18 @@ interface ShopifyCart {
24670
25491
  * string, so there is no camelCase alias to be uncertain about. */
24671
25492
  interface BowmarkProviders {
24672
25493
  aa: BowmarkProvider_aa.Unit;
25494
+ aauto: BowmarkProvider_aauto.Unit;
24673
25495
  abercrombie: BowmarkProvider_abercrombie.Unit;
24674
25496
  aiper: BowmarkProvider_aiper.Unit;
24675
25497
  ajmadison: BowmarkProvider_ajmadison.Unit;
25498
+ allied: BowmarkProvider_allied.Unit;
24676
25499
  alphavantage: BowmarkProvider_alphavantage.Unit;
24677
25500
  americanstandard: BowmarkProvider_americanstandard.Unit;
24678
25501
  amramp: BowmarkProvider_amramp.Unit;
24679
25502
  ancientnutrition: BowmarkProvider_ancientnutrition.Unit;
24680
25503
  andersenwindows: BowmarkProvider_andersenwindows.Unit;
24681
25504
  apple: BowmarkProvider_apple.Unit;
25505
+ aquaphoenixsci: BowmarkProvider_aquaphoenixsci.Unit;
24682
25506
  archipelago: BowmarkProvider_archipelago.Unit;
24683
25507
  ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
24684
25508
  asppoolco: BowmarkProvider_asppoolco.Unit;
@@ -24711,6 +25535,7 @@ interface BowmarkProviders {
24711
25535
  bykoket: BowmarkProvider_bykoket.Unit;
24712
25536
  byltbasics: BowmarkProvider_byltbasics.Unit;
24713
25537
  califloors: BowmarkProvider_califloors.Unit;
25538
+ camelcamelcamel: BowmarkProvider_camelcamelcamel.Unit;
24714
25539
  cancer: BowmarkProvider_cancer.Unit;
24715
25540
  capitalbrands: BowmarkProvider_capitalbrands.Unit;
24716
25541
  caraway: BowmarkProvider_caraway.Unit;
@@ -24739,6 +25564,7 @@ interface BowmarkProviders {
24739
25564
  dillards: BowmarkProvider_dillards.Unit;
24740
25565
  discounttire: BowmarkProvider_discounttire.Unit;
24741
25566
  disney: BowmarkProvider_disney.Unit;
25567
+ doordash: BowmarkProvider_doordash.Unit;
24742
25568
  ebay: BowmarkProvider_ebay.Unit;
24743
25569
  elevenlabs: BowmarkProvider_elevenlabs.Unit;
24744
25570
  embroker: BowmarkProvider_embroker.Unit;
@@ -24762,6 +25588,8 @@ interface BowmarkProviders {
24762
25588
  geico: BowmarkProvider_geico.Unit;
24763
25589
  github: BowmarkProvider_github.Unit;
24764
25590
  glassesusa: BowmarkProvider_glassesusa.Unit;
25591
+ goloadup: BowmarkProvider_goloadup.Unit;
25592
+ goodway: BowmarkProvider_goodway.Unit;
24765
25593
  google_flights: BowmarkProvider_google_flights.Unit;
24766
25594
  gotchacovered: BowmarkProvider_gotchacovered.Unit;
24767
25595
  grainger: BowmarkProvider_grainger.Unit;
@@ -24783,6 +25611,7 @@ interface BowmarkProviders {
24783
25611
  hunter: BowmarkProvider_hunter.Unit;
24784
25612
  ibuypower: BowmarkProvider_ibuypower.Unit;
24785
25613
  identitygroup: BowmarkProvider_identitygroup.Unit;
25614
+ ihg: BowmarkProvider_ihg.Unit;
24786
25615
  instagram: BowmarkProvider_instagram.Unit;
24787
25616
  insurify: BowmarkProvider_insurify.Unit;
24788
25617
  interiordefine: BowmarkProvider_interiordefine.Unit;
@@ -24797,6 +25626,7 @@ interface BowmarkProviders {
24797
25626
  justinwine: BowmarkProvider_justinwine.Unit;
24798
25627
  kaleidescape: BowmarkProvider_kaleidescape.Unit;
24799
25628
  kayak: BowmarkProvider_kayak.Unit;
25629
+ keepa: BowmarkProvider_keepa.Unit;
24800
25630
  kingsdown: BowmarkProvider_kingsdown.Unit;
24801
25631
  kitchentuneup: BowmarkProvider_kitchentuneup.Unit;
24802
25632
  kompan: BowmarkProvider_kompan.Unit;
@@ -24830,14 +25660,17 @@ interface BowmarkProviders {
24830
25660
  momondo: BowmarkProvider_momondo.Unit;
24831
25661
  mossyoak: BowmarkProvider_mossyoak.Unit;
24832
25662
  muze_gov_tr: BowmarkProvider_muze_gov_tr.Unit;
25663
+ myollie: BowmarkProvider_myollie.Unit;
24833
25664
  naic: BowmarkProvider_naic.Unit;
24834
25665
  namecheap: BowmarkProvider_namecheap.Unit;
24835
25666
  nationalbusinessfurniture: BowmarkProvider_nationalbusinessfurniture.Unit;
24836
25667
  newageproducts: BowmarkProvider_newageproducts.Unit;
24837
25668
  newegg: BowmarkProvider_newegg.Unit;
25669
+ nutrafol: BowmarkProvider_nutrafol.Unit;
24838
25670
  nvisioncenters: BowmarkProvider_nvisioncenters.Unit;
24839
25671
  oanda: BowmarkProvider_oanda.Unit;
24840
25672
  oliverwinery: BowmarkProvider_oliverwinery.Unit;
25673
+ othership: BowmarkProvider_othership.Unit;
24841
25674
  otto: BowmarkProvider_otto.Unit;
24842
25675
  outdoorresearch: BowmarkProvider_outdoorresearch.Unit;
24843
25676
  pacificabeauty: BowmarkProvider_pacificabeauty.Unit;
@@ -24897,6 +25730,7 @@ interface BowmarkProviders {
24897
25730
  thibautdesign: BowmarkProvider_thibautdesign.Unit;
24898
25731
  tilsonhomes: BowmarkProvider_tilsonhomes.Unit;
24899
25732
  titlenine: BowmarkProvider_titlenine.Unit;
25733
+ tmobile: BowmarkProvider_tmobile.Unit;
24900
25734
  topviewtix: BowmarkProvider_topviewtix.Unit;
24901
25735
  travelinsured: BowmarkProvider_travelinsured.Unit;
24902
25736
  trawickinternational: BowmarkProvider_trawickinternational.Unit;
@@ -76645,10 +77479,12 @@ interface BowmarkProviders {
76645
77479
  * `run()` script, and the Proxy over HTTP in a caller's own process. They are
76646
77480
  * generated once precisely so those two cannot drift. */
76647
77481
  interface BowmarkLibrary {
77482
+ bundles: BowmarkCapability_bundles.Unit;
76648
77483
  cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
76649
77484
  cars: BowmarkCapability_cars.Unit;
76650
77485
  coworking: BowmarkCapability_coworking.Unit;
76651
77486
  custom_sofa_configurator: BowmarkCapability_custom_sofa_configurator.Unit;
77487
+ delivery: BowmarkCapability_delivery.Unit;
76652
77488
  developer_api_key_signup: BowmarkCapability_developer_api_key_signup.Unit;
76653
77489
  domain: BowmarkCapability_domain.Unit;
76654
77490
  email: BowmarkCapability_email.Unit;
@@ -76660,6 +77496,8 @@ interface BowmarkLibrary {
76660
77496
  hvac: BowmarkCapability_hvac.Unit;
76661
77497
  insurance: BowmarkCapability_insurance.Unit;
76662
77498
  istanbul_schedules: BowmarkCapability_istanbul_schedules.Unit;
77499
+ local_database_gui: BowmarkCapability_local_database_gui.Unit;
77500
+ local_html_preview: BowmarkCapability_local_html_preview.Unit;
76663
77501
  mcp_registry: BowmarkCapability_mcp_registry.Unit;
76664
77502
  music: BowmarkCapability_music.Unit;
76665
77503
  pcparts: BowmarkCapability_pcparts.Unit;
@@ -76669,6 +77507,8 @@ interface BowmarkLibrary {
76669
77507
  promocodes: BowmarkCapability_promocodes.Unit;
76670
77508
  read: BowmarkCapability_read.Unit;
76671
77509
  restaurant_booking: BowmarkCapability_restaurant_booking.Unit;
77510
+ retail: BowmarkCapability_retail.Unit;
77511
+ school_shopping_basket: BowmarkCapability_school_shopping_basket.Unit;
76672
77512
  search: BowmarkCapability_search.Unit;
76673
77513
  sheds: BowmarkCapability_sheds.Unit;
76674
77514
  shipping: BowmarkCapability_shipping.Unit;