@bowmark/web 1.12.2 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: 4367aae3846695ff98e8537819e01ea3e2b841043d73690123b839fb07c2a19a
9
- // 38 capabilities, 266 providers, 693 typed functions, 20 refused.
8
+ // Manifest version: faf4c09938555367990a9c8f7a153fdf8acc74126cd25dc3d424ccd9eb0d1077
9
+ // 42 capabilities, 326 providers, 823 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
@@ -197,6 +197,53 @@ type CallOptions = {
197
197
  }
198
198
  }
199
199
 
200
+ declare namespace BowmarkCapability_costume_size_check {
201
+ // ── Check one costume character's stock at one size, across Target, Walmart, and Spirit Halloween — the unit's own declarations, verbatim ──
202
+ interface RetailerSizeMatch {
203
+ title: string
204
+ url: string
205
+ price: { amount: number; currency: string } | null
206
+ inStock: boolean
207
+ }
208
+ interface RetailerSizeResult {
209
+ matched: RetailerSizeMatch | null // null + incomplete=false means this retailer
210
+ // answered and has no listing in this size
211
+ incomplete: boolean // true means this retailer's call never
212
+ // answered — matched is NOT a stockout then
213
+ }
214
+ interface CostumeSizeCheck {
215
+ character: string
216
+ size: string
217
+ retailers: { target: RetailerSizeResult; walmart: RetailerSizeResult; spirithalloween: RetailerSizeResult }
218
+ warnings: string[]
219
+ }
220
+ type CallOptions = {
221
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
222
+ // A provider slower than this is DROPPED from the results and
223
+ // NAMED in warnings — never silently absent
224
+ }
225
+
226
+ /**
227
+ * Given a costume character and a size, fans out to Target, Walmart, and Spirit Halloween and
228
+ * reports whether each retailer has that exact character-and-size combination in stock right
229
+ * now — the per-size question a plain product search can't answer, because Target and Walmart
230
+ * bake size into a free-text title and Spirit Halloween only exposes its full size matrix on
231
+ * the product page.
232
+ */
233
+ interface Unit {
234
+ /**
235
+ * Checks whether one costume character exists in one size, right now, at Target, Walmart, and
236
+ * Spirit Halloween. `retailers.<name>.matched` is the listing that named both the character
237
+ * and the size, or null when that retailer answered and has none. `incomplete: true` means
238
+ * that retailer's own call never answered — a missed deadline or an error — so `matched: null`
239
+ * there is NOT a stockout; nothing was learned. Never throws on one or two retailers being
240
+ * unreachable — the surviving legs still answer and the dropped ones are named in `warnings`;
241
+ * throws only when all three failed.
242
+ */
243
+ checkSize(args: { character: string; size: string }): Promise<CostumeSizeCheck>;
244
+ }
245
+ }
246
+
200
247
  declare namespace BowmarkCapability_coworking {
201
248
  // ── Coworking space day passes — the unit's own declarations, verbatim ──
202
249
  type CoworkingDayPass = {
@@ -504,6 +551,45 @@ type CallOptions = {
504
551
  }
505
552
  }
506
553
 
554
+ declare namespace BowmarkCapability_entertainment_merch {
555
+ // ── Entertainment merch (licensed, multi-store) — the unit's own declarations, verbatim ──
556
+ type EntertainmentMerchOffer = {
557
+ store: "hottopic" | "boxlunch" // which retailer this offer is from
558
+ title: string // the product as the store lists it
559
+ price: number | null // USD; null if unpriced
560
+ url: string | null // product page for this SKU
561
+ image: string | null
562
+ color: string | null
563
+ size: string | null
564
+ availability: string | null // the store's own schema.org availability wording
565
+ }
566
+ type EntertainmentMerchSearchResult = {
567
+ results: EntertainmentMerchOffer[] // one row per SKU, across all stores
568
+ warnings: string[] // always present; names any store that did not answer
569
+ }
570
+
571
+ type CallOptions = {
572
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
573
+ // A provider slower than this is DROPPED from the results and
574
+ // NAMED in warnings — never silently absent
575
+ }
576
+
577
+ /**
578
+ * Licensed pop-culture and entertainment merch — a franchise, character or show, searched
579
+ * across Hot Topic and BoxLunch in parallel and returned as one list of priced SKUs, so an
580
+ * agent can answer 'where can I buy merch for X' without knowing which licensed-merch retailer
581
+ * carries it.
582
+ */
583
+ interface Unit {
584
+ /**
585
+ * Searches Hot Topic and BoxLunch in parallel for a franchise/character/show and returns every
586
+ * matching SKU across both stores, each tagged with which store it's from. `warnings` names
587
+ * any store that did not answer.
588
+ */
589
+ search(args: { query: string }): Promise<EntertainmentMerchSearchResult>;
590
+ }
591
+ }
592
+
507
593
  declare namespace BowmarkCapability_flights {
508
594
  // ── Flights — the unit's own declarations, verbatim ──
509
595
  type FlightQuery = {
@@ -1584,6 +1670,52 @@ type ProductResult = {
1584
1670
  }
1585
1671
  }
1586
1672
 
1673
+ declare namespace BowmarkCapability_phone_price {
1674
+ // ── Phone price comparison (carriers) — the unit's own declarations, verbatim ──
1675
+ type PhonePriceOffer = {
1676
+ carrier: string // which carrier this offer is from
1677
+ listPriceUsd: number | null // full price of the device / matched storage variant
1678
+ monthlyPriceUsd: number | null // financed monthly payment
1679
+ financingTermMonths: number | null // months monthlyPriceUsd is amortised over
1680
+ tradeInCreditUsd: number | null // best credit for tradeInModel; always null on
1681
+ // a visible row (no per-device figure published)
1682
+ sourceUrl: string // the page this price was read from
1683
+ }
1684
+ type PhonePriceCompareResult = {
1685
+ offers: PhonePriceOffer[] // one row per carrier that answered, unsorted — read
1686
+ // listPriceUsd to rank
1687
+ warnings: string[] // always present; names a carrier that did not answer.
1688
+ // A carrier named here priced NOTHING — read this before
1689
+ // concluding it doesn't sell the phone
1690
+ }
1691
+
1692
+ type CallOptions = {
1693
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
1694
+ // A provider slower than this is DROPPED from the results and
1695
+ // NAMED in warnings — never silently absent
1696
+ }
1697
+
1698
+ /**
1699
+ * What a phone actually costs right now, across carriers — T-Mobile's live device-page pricing
1700
+ * and financing plus every promotion's per-trade-in-device credit, and Visible's catalogue
1701
+ * price and Affirm financing for a matched storage variant, merged into one price-sorted list.
1702
+ * Built for a chip-cost price hike that repriced Android flagships across carriers at once, so
1703
+ * a shopper can compare instead of reading one carrier's page.
1704
+ */
1705
+ interface Unit {
1706
+ /**
1707
+ * Prices one phone across T-Mobile and Visible in parallel and returns a price-sorted list.
1708
+ * `model` is matched against Visible's catalogue and used to reconstruct T-Mobile's device
1709
+ * path (there is no cross-carrier search endpoint) — a model neither matcher can place drops
1710
+ * that carrier with a `warnings` entry naming why, never a silent wrong phone. `tradeInModel`
1711
+ * resolves T-Mobile's best matching promotion credit; Visible never returns a per-device
1712
+ * credit figure. `storageGb` picks Visible's matching variant (T-Mobile's pricing call carries
1713
+ * no storage variants).
1714
+ */
1715
+ compare(args: { model: string; storageGb?: number; tradeInModel?: string; tmobileDevicePath?: string }): Promise<PhonePriceCompareResult>;
1716
+ }
1717
+ }
1718
+
1587
1719
  declare namespace BowmarkCapability_phone_trade_in {
1588
1720
  // ── Phone trade-in value — the unit's own declarations, verbatim ──
1589
1721
  // The capability's own condition vocabulary — four tiers every buyback
@@ -1865,7 +1997,7 @@ type CallOptions = {
1865
1997
  declare namespace BowmarkCapability_retail {
1866
1998
  // ── Retail (general merchandise, multi-store) — the unit's own declarations, verbatim ──
1867
1999
  type RetailOffer = {
1868
- store: "walmart" | "target" // where this offer is from
2000
+ store: "walmart" | "target" | "bestbuy" // where this offer is from
1869
2001
  title: string // the product as the store lists it
1870
2002
  price: number | null // USD; null if unpriced
1871
2003
  wasPrice: number | null // the pre-markdown price, when the store publishes one
@@ -1887,16 +2019,19 @@ type CallOptions = {
1887
2019
  }
1888
2020
 
1889
2021
  /**
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.
2022
+ * General-merchandise retail across Walmart, Target and Best Buy — one keyword search, fanned
2023
+ * out in parallel and returned price-sorted, so an agent can answer 'where can I actually buy
2024
+ * this and what does it cost' without querying each store by hand. Best Buy's leg needs the
2025
+ * caller's own Best Buy developer key; without one the search still returns Walmart + Target
2026
+ * with a `warnings` entry naming the drop.
1893
2027
  */
1894
2028
  interface Unit {
1895
2029
  /**
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.
2030
+ * Searches Walmart, Target and Best Buy in parallel for a keyword and returns one price-sorted
2031
+ * list of offers across all stores, each tagged with which store it's from. `warnings` names
2032
+ * any store that did not answer including Best Buy when the caller holds no Best Buy
2033
+ * developer key — so a caller can tell a genuinely cheaper/only offer from one where a store
2034
+ * simply didn't answer.
1900
2035
  */
1901
2036
  search(args: { query: string }): Promise<RetailSearchResult>;
1902
2037
  }
@@ -1912,10 +2047,16 @@ interface BasketItemMatch {
1912
2047
  }
1913
2048
  interface RetailerBasket {
1914
2049
  total: { amount: number; currency: string } | null // sums matched only — a partial
1915
- // sum whenever incomplete is
1916
- // non-empty
2050
+ // sum whenever unpriced, unmatched
2051
+ // or incomplete is non-empty
1917
2052
  matched: BasketItemMatch[]
1918
- unavailable: string[] // this retailer ANSWERED and has no in-stock priced match
2053
+ unavailable: string[] // this retailer ANSWERED with no in-stock row at all —
2054
+ // a real stockout
2055
+ unmatched: string[] // this retailer answered with in-stock rows, none identifiable
2056
+ // as the thing asked for — NOT out of stock; ask more
2057
+ // specifically, or read their search page. Not in total
2058
+ unpriced: string[] // this retailer HAS it in stock and rendered no price — NOT
2059
+ // out of stock; go read the price on the page. Not in total
1919
2060
  incomplete: string[] // this retailer's search never answered — NOT out of stock,
1920
2061
  // nothing was learned; retry with fewer items or more time
1921
2062
  }
@@ -1932,19 +2073,24 @@ type CallOptions = {
1932
2073
  /**
1933
2074
  * Given a list of item queries (a school supply list), fans out to Target and Walmart search,
1934
2075
  * 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.
2076
+ * total plus which items neither retailer has in stock right now — kept apart from the items a
2077
+ * retailer stocks but would not price, and from the searches that never answered.
1936
2078
  */
1937
2079
  interface Unit {
1938
2080
  /**
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 stockoutnothing 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`.
2081
+ * Prices a multi-item shopping list at Target and Walmart, one basket total per retailer. ONLY
2082
+ * `unavailable` is a stockout: the retailer answered and had nothing in stock at all. The
2083
+ * other three are not, and must never be reported as onean item the retailer HAS in stock
2084
+ * but rendered no price for is in `unpriced` (the price is on its product page, not the search
2085
+ * tile); an item it answered about with in-stock rows none of which could be identified as the
2086
+ * thing asked for is in `unmatched` (a limit of the matching, not of the shop — ask again in
2087
+ * the wording a listing would use); an item whose search never answered at all is in
2088
+ * `incomplete` (nothing was learned). Each of those three makes the retailer's total a partial
2089
+ * sum, and every one of those items is also named in `warnings`. Never throws on one retailer
2090
+ * being unreachable — that retailer's basket is dropped and named in `warnings` instead;
2091
+ * throws only when BOTH retailers failed on every item. Walmart drives a real browser per item
2092
+ * and every item is searched at once, so a long list is what costs time: price fewer items per
2093
+ * call before reaching for a larger `timeoutMs`.
1948
2094
  */
1949
2095
  priceList(args: { items: string[] }): Promise<SchoolShoppingBasket>;
1950
2096
  }
@@ -2374,6 +2520,35 @@ interface ForecastResult {
2374
2520
  }
2375
2521
  }
2376
2522
 
2523
+ declare namespace BowmarkCapability_wireless {
2524
+ // ── wireless plan all-in price — the unit's own declarations, verbatim ──
2525
+ interface CarrierAllInPrice {
2526
+ carrier: string;
2527
+ advertisedPricePerLineUsd: number;
2528
+ allInMonthlyTotalUsd: number;
2529
+ }
2530
+ interface WirelessAllInPriceResult {
2531
+ carriers: CarrierAllInPrice[];
2532
+ warnings: string[];
2533
+ }
2534
+
2535
+ /**
2536
+ * Fans a plan/line configuration out across carrier plan-builder flows and returns each
2537
+ * carrier's advertised price next to its real all-in monthly total (activation fee, per-line
2538
+ * surcharges). Not yet implemented — verizon.getPlanTotal and att.getPlanTotal are both
2539
+ * provider-side stubs; see packages/providers/{verizon,att}/manifest.json.
2540
+ */
2541
+ interface Unit {
2542
+ /**
2543
+ * For a given line count, fans out across every carrier this capability declares and returns
2544
+ * each one's advertised per-line price next to its real all-in monthly total. Not yet
2545
+ * implemented — blocked on verizon.getPlanTotal and att.getPlanTotal, both provider-side stubs
2546
+ * today.
2547
+ */
2548
+ compareAllInPrice(arg: { lineCount: number; addOns?: string[] }): Promise<WirelessAllInPriceResult>;
2549
+ }
2550
+ }
2551
+
2377
2552
  declare namespace BowmarkCapability_yoga_outfit_shopping {
2378
2553
  // ── Coordinated yoga outfit shopping — the unit's own declarations, verbatim ──
2379
2554
  interface YogaOutfitItem {
@@ -2929,6 +3104,89 @@ interface abercrombieStockQuery {
2929
3104
  }
2930
3105
  }
2931
3106
 
3107
+ declare namespace BowmarkProvider_achosahw {
3108
+ // ── Achosa Home Warranty — the unit's own declarations, verbatim ──
3109
+ // Achosa's OWN shapes — not a capability contract.
3110
+
3111
+ interface AchosahwStateEntry { name: string; categoryId: number }
3112
+ interface AchosahwStateList { states: AchosahwStateEntry[] }
3113
+
3114
+ interface AchosahwQuote {
3115
+ state: string;
3116
+ coverageLevel: string; // "Core" | "Prime" | "Prime Plus" | "Pro"
3117
+ term: string; // "Monthly" | "Yearly"
3118
+ propertyType: string; // "Single Family Home" | "Townhome/Condo" | "Duplex" | "Triplex" | "Fourplex"
3119
+ planName: string | null; // the site's own SKU display name for this combination
3120
+ price: number; // 0 when isAvailable is false
3121
+ isAvailable: boolean; // false = this state does not sell this exact combination
3122
+ configureUrl: string; // the live configurator page, pre-scoped to this state
3123
+ }
3124
+
3125
+ interface AchosahwQuoteArgs {
3126
+ state: string; // required, e.g. "Texas" — see listStates()
3127
+ coverageLevel?: string; // default "Core"
3128
+ term?: string; // default "Monthly"
3129
+ propertyType?: string; // default "Single Family Home"
3130
+ }
3131
+
3132
+ /**
3133
+ * Achosa Home Warranty plan configurator — real per-state home-warranty pricing across
3134
+ * coverage tier, billing term and property type, read from the site's own live pricing
3135
+ * endpoint rather than a rate card.
3136
+ */
3137
+ interface Unit {
3138
+ /**
3139
+ * Reads Achosa's own /shop state selector and returns every US state Achosa currently sells a
3140
+ * home-warranty plan in, each with the site's own numeric category id used to scope getQuote's
3141
+ * configurator URL.
3142
+ */
3143
+ listStates(): Promise<AchosahwStateList>;
3144
+
3145
+ /**
3146
+ * Prices one real, purchasable Homeowner's plan combination by calling the exact pricing
3147
+ * endpoint the site's own configurator calls. `state` is required (call listStates() for the
3148
+ * current list); `coverageLevel`, `term` and `propertyType` default to Core / Monthly / Single
3149
+ * Family Home. A combination the state does not sell (e.g. a coverage tier not offered in that
3150
+ * state's price region) returns `isAvailable: false` and `price: 0` rather than throwing,
3151
+ * matching the site's own "Not Available For Sale" state. THROWS on an unknown state or an
3152
+ * unrecognized coverageLevel/term/propertyType value, naming the accepted set.
3153
+ */
3154
+ getQuote(args: AchosahwQuoteArgs): Promise<AchosahwQuote>;
3155
+ }
3156
+ }
3157
+
3158
+ declare namespace BowmarkProvider_acqualinaresort {
3159
+ // ── Acqualina Resort & Residences — the unit's own declarations, verbatim ──
3160
+ interface AcqualinaRate {
3161
+ planName: string;
3162
+ rateCode: string | null;
3163
+ planDescription: string | null;
3164
+ pricePerNight: number | null;
3165
+ originalPricePerNight: number | null;
3166
+ currency: "USD";
3167
+ }
3168
+
3169
+ interface AcqualinaRoomAvailability {
3170
+ roomName: string;
3171
+ bedInfo: string | null;
3172
+ sleeps: string | null;
3173
+ rates: AcqualinaRate[];
3174
+ }
3175
+
3176
+ /**
3177
+ * Acqualina Resort & Residences' own SynXis GEM reservation engine — real-time room-type
3178
+ * availability and per-night pricing for its Sunny Isles Beach property, for given dates and
3179
+ * party size.
3180
+ */
3181
+ interface Unit {
3182
+ /**
3183
+ * Runs Acqualina's own reservation engine for one stay and returns real room-type availability
3184
+ * with per-night pricing for every rate plan on offer.
3185
+ */
3186
+ searchAvailability(arrive: string, depart: string, adults: number, children?: number): Promise<AcqualinaRoomAvailability[]>;
3187
+ }
3188
+ }
3189
+
2932
3190
  declare namespace BowmarkProvider_aiper {
2933
3191
  // ── Aiper — the unit's own declarations, verbatim ──
2934
3192
  interface AiperPoolOption {
@@ -3090,6 +3348,48 @@ interface AlphavantageSignUpResult {
3090
3348
  }
3091
3349
  }
3092
3350
 
3351
+ declare namespace BowmarkProvider_americandreamvacations {
3352
+ // ── American Dream Vacations — the unit's own declarations, verbatim ──
3353
+ interface AdvLocation {
3354
+ storeId: string;
3355
+ name: string;
3356
+ }
3357
+
3358
+ interface AdvVehicle {
3359
+ id: string;
3360
+ unitId: string;
3361
+ model: string;
3362
+ make: string;
3363
+ vehicleClass: "a" | "b" | "c" | "t";
3364
+ vehicleClassLabel: string;
3365
+ sleeps: number | null;
3366
+ lengthFt: number | null;
3367
+ dailyRate: number | null;
3368
+ weeklyRate: number | null;
3369
+ currency: "USD";
3370
+ electricalConnection: string | null;
3371
+ storeId: string;
3372
+ storeName: string;
3373
+ }
3374
+
3375
+ /**
3376
+ * American Dream Vacations' own RV rental inventory search (americandreamvacations.net) —
3377
+ * given one of their 10 store locations and an RV class (Class A/B/C or Trailer), returns the
3378
+ * real, priced units the site itself lists: unit number, model, make, sleeps, length,
3379
+ * daily/weekly rate and electrical connection. No login, no dates required.
3380
+ */
3381
+ interface Unit {
3382
+ /** Returns American Dream Vacations' own list of rental store locations and their store ids. */
3383
+ listLocations(): Promise<AdvLocation[]>;
3384
+
3385
+ /**
3386
+ * Runs American Dream Vacations' own availability search for one store location and vehicle
3387
+ * class and returns the real, priced inventory the site lists.
3388
+ */
3389
+ searchInventory(location: string, vehicleClass: "a" | "b" | "c" | "t"): Promise<AdvVehicle[]>;
3390
+ }
3391
+ }
3392
+
3093
3393
  declare namespace BowmarkProvider_americanstandard {
3094
3394
  // ── American Standard Heating & Air Conditioning — the unit's own declarations, verbatim ──
3095
3395
  type AmericanStandardTierName = "Platinum" | "Gold" | "Silver";
@@ -3129,6 +3429,38 @@ interface AmericanStandardSystemCostEstimate {
3129
3429
  }
3130
3430
  }
3131
3431
 
3432
+ declare namespace BowmarkProvider_americanvisionwindows {
3433
+ // ── American Vision Windows — the unit's own declarations, verbatim ──
3434
+ interface AmericanVisionWindowsSlotDay {
3435
+ date: string;
3436
+ windows: string[];
3437
+ }
3438
+ interface AmericanVisionWindowsAvailability {
3439
+ zip: string;
3440
+ service: "Windows" | "Bath";
3441
+ inTerritory: boolean;
3442
+ territory: string;
3443
+ serviceTerritoryId: string;
3444
+ slots: AmericanVisionWindowsSlotDay[];
3445
+ }
3446
+
3447
+ /**
3448
+ * American Vision Windows' free in-home consultation booking flow — real open appointment
3449
+ * slots for a ZIP and service (window or bath replacement), straight from the site's own
3450
+ * booking app.
3451
+ */
3452
+ interface Unit {
3453
+ /**
3454
+ * Checks real, currently-open in-home consultation appointment slots for a US ZIP code and
3455
+ * service (window or bath replacement) — the computed step of American Vision Windows'
3456
+ * free-consultation booking flow, reachable before any name/email/phone is collected. Returns
3457
+ * the matched service territory and a real per-day list of open date/time windows, or
3458
+ * `inTerritory: false` for a ZIP outside AVW's California territories.
3459
+ */
3460
+ checkAvailability(args: { zip: string; service: "Windows" | "Bath" }): Promise<AmericanVisionWindowsAvailability>;
3461
+ }
3462
+ }
3463
+
3132
3464
  declare namespace BowmarkProvider_amramp {
3133
3465
  // ── Amramp — the unit's own declarations, verbatim ──
3134
3466
  interface AmrampLocation {
@@ -3255,6 +3587,229 @@ interface AndersenDealer {
3255
3587
  }
3256
3588
  }
3257
3589
 
3590
+ declare namespace BowmarkProvider_andstr {
3591
+ // ── Andes (stayAndes) — the unit's own declarations, verbatim ──
3592
+ interface AndstrSearchArgs {
3593
+ market?: string;
3594
+ city?: string;
3595
+ checkIn?: string;
3596
+ checkOut?: string;
3597
+ guests?: number;
3598
+ bedrooms?: number;
3599
+ priceMin?: number;
3600
+ priceMax?: number;
3601
+ propertyType?: string;
3602
+ instantBook?: boolean;
3603
+ page?: number;
3604
+ }
3605
+ interface AndstrListingSummary {
3606
+ id: string;
3607
+ title: string;
3608
+ city: string;
3609
+ region: string;
3610
+ bedrooms: number;
3611
+ bathrooms: number;
3612
+ maxGuests: number;
3613
+ pricePerNight: number;
3614
+ currency: string;
3615
+ priceBasis: "dates" | "startingFrom";
3616
+ verified: boolean;
3617
+ instantBook: boolean;
3618
+ cancellationPolicy: string | null;
3619
+ imageUrl: string | null;
3620
+ url: string;
3621
+ }
3622
+ interface AndstrListingDetail {
3623
+ id: string;
3624
+ title: string;
3625
+ city: string;
3626
+ region: string;
3627
+ bedrooms: number;
3628
+ bathrooms: number;
3629
+ maxGuests: number;
3630
+ listedFromPerNight: number;
3631
+ currency: string;
3632
+ amenities: string[];
3633
+ cancellationPolicy: string | null;
3634
+ latitude: number | null;
3635
+ longitude: number | null;
3636
+ url: string;
3637
+ }
3638
+ interface AndstrQuote {
3639
+ listingId: string;
3640
+ checkIn: string;
3641
+ checkOut: string;
3642
+ guests: number;
3643
+ available: boolean;
3644
+ unavailableReason: string | null;
3645
+ nights: number | null;
3646
+ nightlyTotal: number | null;
3647
+ fees: Array<{ name: string; amount: number }>;
3648
+ total: number | null;
3649
+ averagePerNight: number | null;
3650
+ currency: string;
3651
+ bookingUrl: string;
3652
+ }
3653
+
3654
+ /**
3655
+ * stayAndes's own flexible-stay search-and-book portal — search by
3656
+ * market/dates/guests/price/amenities with real per-night pricing, read a listing's full
3657
+ * detail, and get the real date-priced quote (fees + total + booking handoff) for a stay.
3658
+ */
3659
+ interface Unit {
3660
+ /**
3661
+ * Searches stayAndes's listing portfolio by market, dates, guests, bedrooms, price range and
3662
+ * instant-book. When check-in/check-out are given, pricePerNight is the real demand-priced
3663
+ * average for that stay; otherwise it's the site's undated starting-from rate (priceBasis says
3664
+ * which).
3665
+ */
3666
+ search(args?: AndstrSearchArgs): Promise<AndstrListingSummary[]>;
3667
+
3668
+ /**
3669
+ * One listing's full detail — bedrooms/bathrooms/guests, amenities, cancellation policy,
3670
+ * coordinates. Its own price is a static rack rate, not a real quote — call getQuote for that.
3671
+ */
3672
+ getListing(listingId: string): Promise<AndstrListingDetail>;
3673
+
3674
+ /**
3675
+ * The real date-priced quote for one listing — nightly total, service + cleaning fees, total
3676
+ * before taxes, average per night, and a direct checkout handoff URL — or the site's own
3677
+ * reason a stay isn't bookable.
3678
+ */
3679
+ getQuote(listingId: string, checkIn: string, checkOut: string, guests: number): Promise<AndstrQuote>;
3680
+ }
3681
+ }
3682
+
3683
+ declare namespace BowmarkProvider_anthropic_com {
3684
+ // ── Anthropic Engineering & Legal — the unit's own declarations, verbatim ──
3685
+ interface AnthropicComDoc {
3686
+ url: string;
3687
+ title: string | null;
3688
+ body: string;
3689
+ }
3690
+ interface AnthropicComDocLink {
3691
+ url: string;
3692
+ slug: string;
3693
+ section: "engineering" | "legal";
3694
+ lastUpdated: string;
3695
+ }
3696
+
3697
+ /**
3698
+ * Reads one page of anthropic.com's engineering blog or legal terms by URL and returns its
3699
+ * title and body as plain text — parsed from the page's own server-rendered markup, not a
3700
+ * whole-page scrape.
3701
+ */
3702
+ interface Unit {
3703
+ /**
3704
+ * Reads one page of anthropic.com's engineering blog (/engineering/...) or legal terms
3705
+ * (/legal/...) by URL or path (e.g. "/legal/commercial-terms" or the full https:// url) and
3706
+ * returns its title and body as plain text. THROWS if the page does not exist (404) or names a
3707
+ * host other than anthropic.com.
3708
+ */
3709
+ getDoc(url: string): Promise<AnthropicComDoc>;
3710
+
3711
+ /**
3712
+ * Lists every engineering-blog and legal-terms page anthropic.com publishes — url, section
3713
+ * ("engineering" | "legal") and the page's own URL slug — parsed from the site's own
3714
+ * /sitemap.xml (anthropic.com has no llms.txt). The slug is the closest thing to a title the
3715
+ * sitemap carries; call getDoc(url) for the page's real headline.
3716
+ */
3717
+ listDocs(): Promise<AnthropicComDocLink[]>;
3718
+ }
3719
+ }
3720
+
3721
+ declare namespace BowmarkProvider_antunes {
3722
+ // ── A.J. Antunes & Co. — the unit's own declarations, verbatim ──
3723
+ interface AntunesServiceAgency {
3724
+ id: string;
3725
+ name: string;
3726
+ address: string;
3727
+ city: string;
3728
+ state: string;
3729
+ zip: string;
3730
+ country: string;
3731
+ phone: string;
3732
+ fax: string;
3733
+ email: string;
3734
+ url: string;
3735
+ latitude: number;
3736
+ longitude: number;
3737
+ distanceMiles: number;
3738
+ }
3739
+ interface AntunesServiceAgencySearch {
3740
+ radiusMiles: number;
3741
+ agencies: AntunesServiceAgency[];
3742
+ }
3743
+
3744
+ /**
3745
+ * Reads Antunes' own real-time authorized service-agency/distributor locator directly — real
3746
+ * nearby agencies, reps and distributors Antunes itself vets, distance-ranked from a US ZIP,
3747
+ * never a guess at unverified third-party repair shops.
3748
+ */
3749
+ interface Unit {
3750
+ /**
3751
+ * Runs Antunes' own real-time authorized service-agency/distributor locator for a US ZIP and
3752
+ * returns real nearby agencies, sales reps and distributors Antunes itself authorizes and
3753
+ * lists — not a guess at which local repair shops might service Antunes equipment.
3754
+ * `radiusMiles` defaults to 100 and is capped at 500; an honestly empty list means Antunes has
3755
+ * nothing authorized that close.
3756
+ */
3757
+ findServiceAgencies(zip: string, radiusMiles?: number): Promise<AntunesServiceAgencySearch>;
3758
+ }
3759
+ }
3760
+
3761
+ declare namespace BowmarkProvider_aosom {
3762
+ // ── Aosom — the unit's own declarations, verbatim ──
3763
+ interface AosomSearchResult {
3764
+ sin: string;
3765
+ sku: string;
3766
+ name: string;
3767
+ brand: string | null;
3768
+ price: number; // dollars, e.g. 354.99
3769
+ originalPrice: number | null;
3770
+ stockQty: number;
3771
+ urlkey: string;
3772
+ url: string; // pass to getProduct
3773
+ categoryName: string | null;
3774
+ imageUrl: string | null;
3775
+ }
3776
+ interface AosomProduct {
3777
+ sin: string;
3778
+ sku: string;
3779
+ name: string;
3780
+ brand: string | null;
3781
+ category: string | null;
3782
+ subCategory: string | null;
3783
+ price: number; // dollars
3784
+ originalPrice: number | null;
3785
+ inStock: boolean; // the site's own buyability flag for this variant
3786
+ url: string; // the handoff — open this to add to cart / check out
3787
+ }
3788
+
3789
+ /**
3790
+ * Reads Aosom's live catalog — search results and one product's real price/stock — straight
3791
+ * off aosom.com's own search API and product page, no key, no browser.
3792
+ */
3793
+ interface Unit {
3794
+ /**
3795
+ * Searches Aosom's live catalog (Outsunny/HOMCOM/PawHut/Soozier) for a free-text query and
3796
+ * returns real, currently-listed rows with price, stock count, brand and a ready-to-use
3797
+ * product page URL. Returns [] for a query that matches nothing — a real, honest answer, since
3798
+ * the endpoint returns 200 with an empty list rather than 404ing.
3799
+ */
3800
+ searchProducts(query: string): Promise<AosomSearchResult[]>;
3801
+
3802
+ /**
3803
+ * Reads one product's live price and the site's own buyability flag straight off its product
3804
+ * page — the SAME page a shopper lands on, so a variant (color/size baked into a distinct
3805
+ * SKU/URL on this site) is read exactly as chosen. Takes the full product page URL
3806
+ * (searchProducts' `url` field). THROWS rather than guessing when the page's own product-data
3807
+ * block is missing or unparseable — never silently returns a stale or wrong variant.
3808
+ */
3809
+ getProduct(url: string): Promise<AosomProduct>;
3810
+ }
3811
+ }
3812
+
3258
3813
  declare namespace BowmarkProvider_apple {
3259
3814
  // ── Apple — the unit's own declarations, verbatim ──
3260
3815
  interface AppleSearchResult {
@@ -3356,6 +3911,72 @@ interface AquaphoenixsciProduct {
3356
3911
  }
3357
3912
  }
3358
3913
 
3914
+ declare namespace BowmarkProvider_arajet {
3915
+ // ── Arajet — the unit's own declarations, verbatim ──
3916
+ interface ArajetSearchArgs {
3917
+ origin: string;
3918
+ destination: string;
3919
+ departureDate: string;
3920
+ passengers?: number;
3921
+ }
3922
+
3923
+ interface ArajetAirport {
3924
+ code: string;
3925
+ name: string;
3926
+ }
3927
+
3928
+ interface ArajetFlightLeg {
3929
+ flightNumber: string;
3930
+ carrierCode: string;
3931
+ from: ArajetAirport;
3932
+ to: ArajetAirport;
3933
+ departureDate: string;
3934
+ arrivalDate: string;
3935
+ flightTimeMinutes: number;
3936
+ equipmentType: string | null;
3937
+ }
3938
+
3939
+ interface ArajetFlightOption {
3940
+ key: string;
3941
+ from: ArajetAirport;
3942
+ to: ArajetAirport;
3943
+ departureDate: string;
3944
+ arrivalDate: string;
3945
+ flightTimeMinutes: number;
3946
+ stops: number;
3947
+ legs: ArajetFlightLeg[];
3948
+ soldOut: boolean;
3949
+ }
3950
+
3951
+ interface ArajetSearchResult {
3952
+ origin: string;
3953
+ destination: string;
3954
+ departureDate: string;
3955
+ currency: string;
3956
+ pricesAvailable: false;
3957
+ flights: ArajetFlightOption[];
3958
+ }
3959
+
3960
+ /**
3961
+ * Arajet's own flight-schedule search (Santo Domingo-based low-cost carrier) — real routes,
3962
+ * times, connections and flight numbers straight off its booking engine's shop endpoint. No
3963
+ * live pricing at this rung.
3964
+ */
3965
+ interface Unit {
3966
+ /**
3967
+ * Runs Arajet's own flight-schedule search for one origin/destination/date and returns the
3968
+ * flight OPTIONS it schedules — carrier and flight number, departure/arrival times, duration,
3969
+ * stop count and each connecting leg. `origin`/`destination` are 3-letter IATA codes ("SDQ",
3970
+ * "MIA"); `departureDate` is "YYYY-MM-DD" or "MM/DD/YYYY"; `passengers` (adults) defaults to
3971
+ * 1. HONEST LIMIT: this reads Arajet's calendar/shop endpoint, which carries the SCHEDULE but
3972
+ * not a live fare — every option's `soldOut` came back `true` at every route and date
3973
+ * measured, and `pricesAvailable` is always `false`. It answers "what does Arajet fly, and
3974
+ * when" rather than "what would this cost".
3975
+ */
3976
+ search(arg0: ArajetSearchArgs): Promise<ArajetSearchResult>;
3977
+ }
3978
+ }
3979
+
3359
3980
  declare namespace BowmarkProvider_archipelago {
3360
3981
  // ── Archipelago — the unit's own declarations, verbatim ──
3361
3982
  interface ArchipelagoAsset {
@@ -3402,6 +4023,51 @@ interface ArchipelagoGameOptions {
3402
4023
  }
3403
4024
  }
3404
4025
 
4026
+ declare namespace BowmarkProvider_artpix3d {
4027
+ // ── ArtPix 3D — the unit's own declarations, verbatim ──
4028
+ // ArtPix 3D's OWN shapes — not a capability contract.
4029
+
4030
+ interface Artpix3dShape { slug: string; name: string; url: string }
4031
+
4032
+ interface Artpix3dSizePrice {
4033
+ size: string; // e.g. "Large"
4034
+ sellPrice: number | null;
4035
+ retailPrice: number | null;
4036
+ discountPercent: number | null;
4037
+ inStock: boolean;
4038
+ bestSeller: boolean;
4039
+ lowStockLabel: string | null;
4040
+ }
4041
+
4042
+ interface Artpix3dProductPricing {
4043
+ shape: string;
4044
+ productName: string;
4045
+ sizes: Artpix3dSizePrice[];
4046
+ configureUrl: string; // where a buyer picks a photo and checks out
4047
+ }
4048
+
4049
+ /**
4050
+ * Reads ArtPix 3D's own live product configurator — every crystal shape, and for a chosen
4051
+ * shape, every size's real current price (with active sale discounts) and stock/best-seller
4052
+ * labels — the way the site's own size-picker computes it, real-time.
4053
+ */
4054
+ interface Unit {
4055
+ /**
4056
+ * Lists every crystal shape ArtPix 3D currently sells (rectangle, heart, square, …), each with
4057
+ * its own product page URL.
4058
+ */
4059
+ listShapes(): Promise<Artpix3dShape[]>;
4060
+
4061
+ /**
4062
+ * Runs the site's own size/price computation for one shape: every size's real current sell
4063
+ * price, list price, active discount, stock and best-seller status. `shape` is a slug from
4064
+ * `listShapes()`. THROWS on an unknown shape, naming `listShapes()` as the way to find current
4065
+ * ones.
4066
+ */
4067
+ getSizePricing(shape: string): Promise<Artpix3dProductPricing>;
4068
+ }
4069
+ }
4070
+
3405
4071
  declare namespace BowmarkProvider_ashleyfurniture {
3406
4072
  // ── Ashley Furniture — the unit's own declarations, verbatim ──
3407
4073
  interface AshleyFurnitureSearchArgs {
@@ -3680,6 +4346,41 @@ interface AtlasSearchCommunitiesResult {
3680
4346
  }
3681
4347
  }
3682
4348
 
4349
+ declare namespace BowmarkProvider_audibel {
4350
+ // ── Audibel — the unit's own declarations, verbatim ──
4351
+ interface AudibelClinic {
4352
+ name: string;
4353
+ address: string;
4354
+ city: string;
4355
+ state: string;
4356
+ zip: string;
4357
+ phone: string | null;
4358
+ distanceMiles: number | null; // miles from the searched point, nearest-first
4359
+ url: string; // the clinic's own page on audibel.com
4360
+ hours: Record<string, { open: string; close: string }>;
4361
+ }
4362
+
4363
+ interface AudibelClinicSearch {
4364
+ search: string;
4365
+ lat: number;
4366
+ lng: number;
4367
+ clinics: AudibelClinic[]; // sorted nearest-first
4368
+ }
4369
+
4370
+ /**
4371
+ * Audibel's own find-a-clinic locator — a ZIP/city/address search returning the real network
4372
+ * hearing clinics nearest that point, sorted by distance, each with its full address, phone
4373
+ * and hours.
4374
+ */
4375
+ interface Unit {
4376
+ /**
4377
+ * Runs the real find-a-clinic search for a ZIP code, city or address and returns Audibel's
4378
+ * network clinics nearest that point, distance-sorted, with address/phone/hours.
4379
+ */
4380
+ findClinics(query: string): Promise<AudibelClinicSearch>;
4381
+ }
4382
+ }
4383
+
3683
4384
  declare namespace BowmarkProvider_autocamp {
3684
4385
  // ── AutoCamp — the unit's own declarations, verbatim ──
3685
4386
  interface AutocampRate {
@@ -3700,6 +4401,11 @@ interface AutocampRoomAvailability {
3700
4401
  rates: AutocampRate[];
3701
4402
  }
3702
4403
 
4404
+ interface AutocampProperty {
4405
+ hotelId: string;
4406
+ location: string;
4407
+ }
4408
+
3703
4409
  /**
3704
4410
  * AutoCamp's own SynXis reservation engine — real-time room-type availability and
3705
4411
  * per-night/stay-total pricing for any of its Airstream/cabin/tent properties, for a given
@@ -3711,6 +4417,13 @@ interface AutocampRoomAvailability {
3711
4417
  * availability with per-night and stay-total pricing for every rate plan on offer.
3712
4418
  */
3713
4419
  searchAvailability(hotelId: string, arrive: string, depart: string, adults: number, children?: number): Promise<AutocampRoomAvailability[]>;
4420
+
4421
+ /**
4422
+ * Lists AutoCamp's active properties (name, location, the reservations-engine hotel id) off
4423
+ * the site's own booking-widget furniture, so a caller can resolve a place name to the id
4424
+ * searchAvailability needs.
4425
+ */
4426
+ listProperties(): Promise<AutocampProperty[]>;
3714
4427
  }
3715
4428
  }
3716
4429
 
@@ -3844,8 +4557,56 @@ interface AvisLocationDetail extends AvisLocationRow {
3844
4557
  }
3845
4558
  }
3846
4559
 
4560
+ declare namespace BowmarkProvider_ayreshotels {
4561
+ // ── Ayres Hotels — the unit's own declarations, verbatim ──
4562
+ interface AyreshotelsRateDay {
4563
+ date: string;
4564
+ isAvailable: boolean;
4565
+ minRate: number | null;
4566
+ currency: string | null;
4567
+ availStatus: string | null;
4568
+ }
4569
+
4570
+ interface CheckRatesResult {
4571
+ property: string;
4572
+ hotelCode: number | null;
4573
+ checkIn: string;
4574
+ checkOut: string;
4575
+ currency: string | null;
4576
+ days: AyreshotelsRateDay[];
4577
+ }
4578
+
4579
+ /**
4580
+ * Boutique Southern California hotel group. checkRates is live — it reads the site's own IBE
4581
+ * (Internet Booking Engine, an Amadeus Hospitality / TravelClick widget on
4582
+ * reservations.ayreshotels.com) and returns the REAL per-night minimum rate + availability
4583
+ * status for a property and date range, the same live pricing the site's own date-picker
4584
+ * renders before any guest information is entered.
4585
+ */
4586
+ interface Unit {
4587
+ /**
4588
+ * Checks a property's real live rate/availability for a date range. Pass `property` (the
4589
+ * reservations subdomain slug from that hotel's own "Book Now" link, e.g. "costa-mesa"),
4590
+ * `checkIn`/`checkOut` (ISO dates), and optionally `adults` (default 2). Returns the per-night
4591
+ * minimum rate and availability status for every night in range — the site's own IBE data, not
4592
+ * a third-party OTA estimate.
4593
+ */
4594
+ checkRates(args: object): Promise<CheckRatesResult>;
4595
+ }
4596
+ }
4597
+
3847
4598
  declare namespace BowmarkProvider_azazie {
3848
4599
  // ── Azazie — the unit's own declarations, verbatim ──
4600
+ interface AzazieSearchResult {
4601
+ id: string;
4602
+ name: string;
4603
+ url: string;
4604
+ }
4605
+
4606
+ interface AzazieSearchResults {
4607
+ results: AzazieSearchResult[];
4608
+ }
4609
+
3849
4610
  interface AzazieColorOption {
3850
4611
  key: string;
3851
4612
  name: string;
@@ -3894,6 +4655,12 @@ interface AzazieBuildYourOwnConfig {
3894
4655
  * product-data host.
3895
4656
  */
3896
4657
  interface Unit {
4658
+ /**
4659
+ * Searches Azazie's catalog by free text (style, color, fabric, occasion) and returns matching
4660
+ * dress styles with URLs.
4661
+ */
4662
+ search(query: string): Promise<AzazieSearchResults>;
4663
+
3897
4664
  /**
3898
4665
  * Reads one bridesmaid-dress style's full Build Your Own configuration off Azazie's own
3899
4666
  * product-data host — the real live price, every solid + floral color option (each with its
@@ -4014,6 +4781,60 @@ interface AzureListServicesResult {
4014
4781
  }
4015
4782
  }
4016
4783
 
4784
+ declare namespace BowmarkProvider_bankmycell {
4785
+ // ── BankMyCell — the unit's own declarations, verbatim ──
4786
+ interface BankmycellSearchResult {
4787
+ brand: string;
4788
+ model: string;
4789
+ name: string;
4790
+ deviceUrl: string;
4791
+ minPrice: number | null;
4792
+ maxPrice: number | null;
4793
+ }
4794
+ interface BankmycellOffer {
4795
+ merchant: string;
4796
+ price: number;
4797
+ paymentOptions: string;
4798
+ shippingOptions: { id: string; name: string }[];
4799
+ pricelockTimescale: string | null;
4800
+ paymentTimescale: string | null;
4801
+ checkoutLink: string;
4802
+ reviewsRating: number | null;
4803
+ reviewsCount: number | null;
4804
+ }
4805
+ interface BankmycellQuoteResult {
4806
+ deviceUrl: string;
4807
+ selections: { capacity: string | null; condition: string | null; carrier: string | null; lockedStatus: string | null };
4808
+ offers: BankmycellOffer[];
4809
+ unavailableMerchants: string[];
4810
+ summary: { minPrice: number | null; maxPrice: number | null; avgPrice: number | null; count: number };
4811
+ }
4812
+
4813
+ /**
4814
+ * Live trade-in offers for a phone/device from every merchant BankMyCell compares, for a
4815
+ * chosen capacity/condition/carrier — read off the same pricing endpoint the site's own sell
4816
+ * page polls, instead of parsing prose off the rendered page. searchDevices resolves a
4817
+ * shopper's own words ("iPhone 14") to the deviceUrl getTradeInQuote needs.
4818
+ */
4819
+ interface Unit {
4820
+ /**
4821
+ * Searches BankMyCell's own device index by free text (e.g. "iPhone 14", "Galaxy S23") and
4822
+ * returns the matching devices with their deviceUrl — the entry point: it turns a shopper's
4823
+ * own words into the deviceUrl getTradeInQuote needs.
4824
+ */
4825
+ searchDevices(term: string): Promise<BankmycellSearchResult[]>;
4826
+
4827
+ /**
4828
+ * Reads live trade-in offers for the device at a bankmycell.com sell page (e.g.
4829
+ * .../sell/iphone-14-pro), from every merchant the site compares, for the given
4830
+ * capacity/condition/carrier/lockedStatus (each matched against that device's own option
4831
+ * labels, e.g. condition: "Flawless"). Any selection left out uses the page's own default
4832
+ * option for that attribute. THROWS if a selection names an option this device does not offer.
4833
+ */
4834
+ getTradeInQuote(deviceUrl: string, selections?: { capacity?: string; condition?: string; carrier?: string; lockedStatus?: string }): Promise<BankmycellQuoteResult>;
4835
+ }
4836
+ }
4837
+
4017
4838
  declare namespace BowmarkProvider_barletta {
4018
4839
  // ── Barletta Boats — the unit's own declarations, verbatim ──
4019
4840
  // Barletta's OWN shapes — not a capability contract.
@@ -4094,6 +4915,59 @@ interface BarlettaPriceResult {
4094
4915
  }
4095
4916
  }
4096
4917
 
4918
+ declare namespace BowmarkProvider_barnesfoundation {
4919
+ // ── Barnes Foundation — the unit's own declarations, verbatim ──
4920
+ type BarnesAdmissionType = "barnes" | "calderCombo";
4921
+ interface BarnesAdmissionDay {
4922
+ date: string;
4923
+ active: boolean;
4924
+ }
4925
+ interface BarnesAdmissionCalendar {
4926
+ admissionType: BarnesAdmissionType;
4927
+ name: string;
4928
+ days: BarnesAdmissionDay[];
4929
+ }
4930
+ interface BarnesAdmissionQuoteInput {
4931
+ personType: string;
4932
+ quantity: number;
4933
+ }
4934
+ interface BarnesAdmissionQuoteLine {
4935
+ personType: string;
4936
+ quantity: number;
4937
+ unitPrice: number;
4938
+ subtotal: number;
4939
+ }
4940
+ interface BarnesAdmissionQuote {
4941
+ admissionType: BarnesAdmissionType;
4942
+ currency: "USD";
4943
+ lines: BarnesAdmissionQuoteLine[];
4944
+ total: number;
4945
+ }
4946
+
4947
+ /**
4948
+ * The Barnes Foundation's own live ticket-admission data, read directly — real day-by-day
4949
+ * open/closed availability and real per-category pricing arithmetic for Barnes Foundation
4950
+ * admission and the Barnes + Calder Gardens combo, off the site's own undocumented API.
4951
+ */
4952
+ interface Unit {
4953
+ /**
4954
+ * Reads the live day-by-day open/closed calendar (a rolling ~6-month window) for either
4955
+ * "barnes" (Barnes Foundation admission only) or "calderCombo" (Barnes + Calder Gardens combo
4956
+ * admission) — the same day-availability the ticket widget's own calendar picker renders.
4957
+ * Day-level only: the site's API carries no per-timeslot remaining-capacity count.
4958
+ */
4959
+ getAdmissionCalendar(admissionType: "barnes" | "calderCombo"): Promise<BarnesAdmissionCalendar>;
4960
+
4961
+ /**
4962
+ * Computes a real ticket total for the given admission type and category quantities
4963
+ * (personType matched case-insensitively against the live list — "Adult", "Senior", "Youth",
4964
+ * "Child", etc.) using the site's own current per-category prices. THROWS if a category name
4965
+ * does not match one the site currently sells, or if tickets is empty.
4966
+ */
4967
+ priceAdmission(admissionType: "barnes" | "calderCombo", tickets: BarnesAdmissionQuoteInput[]): Promise<BarnesAdmissionQuote>;
4968
+ }
4969
+ }
4970
+
4097
4971
  declare namespace BowmarkProvider_baublebar {
4098
4972
  // ── BaubleBar — the unit's own declarations, verbatim ──
4099
4973
  interface BaublebarPersonalizationField {
@@ -4141,6 +5015,11 @@ interface BaublebarCatalogueRow {
4141
5015
  inStock: boolean;
4142
5016
  images: string[];
4143
5017
  }
5018
+ interface BaublebarCollectionRow {
5019
+ handle: string;
5020
+ title: string;
5021
+ productsCount: number;
5022
+ }
4144
5023
  interface BaublebarCheckoutLink {
4145
5024
  url: string;
4146
5025
  variant: BaublebarVariant;
@@ -4155,6 +5034,13 @@ interface BaublebarCheckoutLink {
4155
5034
  * carrying the personalization.
4156
5035
  */
4157
5036
  interface Unit {
5037
+ /**
5038
+ * The entry door: reads BaubleBar's own published list of collections — e.g. "Tennis
5039
+ * Bracelets", "Personalized Jewelry" — with each one's handle and product count, so a caller
5040
+ * holding only what a shopper would say can find the handle listBaublebarProducts takes.
5041
+ */
5042
+ listBaublebarCollections(opts?: { limit?: number }): Promise<BaublebarCollectionRow[]>;
5043
+
4158
5044
  /**
4159
5045
  * Reads a BaubleBar collection's live products — e.g. "tennis-bracelets",
4160
5046
  * "personalized-jewelry", "name-initial-jewelry" — with handle, title, price range and stock.
@@ -4288,6 +5174,169 @@ interface BeatthebombPriceQuote {
4288
5174
  }
4289
5175
  }
4290
5176
 
5177
+ declare namespace BowmarkProvider_bellwethercoffee {
5178
+ // ── Bellwether Coffee — the unit's own declarations, verbatim ──
5179
+ // Bellwether Coffee's OWN shapes — not a capability contract.
5180
+
5181
+ type BellwethercoffeeCurrency = "USD" | "CAD" | "GBP" | "EUR";
5182
+ type BellwethercoffeeRoasterType = "ShopRoaster" | "ContinuousRoasting";
5183
+
5184
+ interface BellwethercoffeeSliderBounds { min: number; max: number; step: number }
5185
+
5186
+ interface BellwethercoffeeCalculatorDefaults {
5187
+ currencies: BellwethercoffeeCurrency[];
5188
+ roasterTypes: BellwethercoffeeRoasterType[];
5189
+ defaultInputsByCurrency: Record<BellwethercoffeeCurrency, { poundsWeekly: number; coffeeCost: number; retailBags: number }>;
5190
+ sliderBounds: { poundsWeekly: BellwethercoffeeSliderBounds; coffeeCost: BellwethercoffeeSliderBounds; retailBags: BellwethercoffeeSliderBounds };
5191
+ roasterPricesByCurrency: Record<BellwethercoffeeCurrency, Record<BellwethercoffeeRoasterType, number>>;
5192
+ disclaimer: string;
5193
+ roiCalculatorUrl: string;
5194
+ requestDemoUrl: string;
5195
+ }
5196
+
5197
+ interface BellwethercoffeeRoiInput {
5198
+ currency: BellwethercoffeeCurrency;
5199
+ roasterType: BellwethercoffeeRoasterType;
5200
+ poundsWeekly: number; // weekly roasted-coffee usage (lb, or kg for non-USD)
5201
+ coffeeCost: number; // what the caller currently pays per lb/kg, in currency
5202
+ retailBags: number; // retail bags of roasted coffee sellable per week
5203
+ }
5204
+
5205
+ interface BellwethercoffeeRoiEstimate {
5206
+ currency: BellwethercoffeeCurrency;
5207
+ roasterType: BellwethercoffeeRoasterType;
5208
+ investmentAmount: number; investmentAmountFormatted: string;
5209
+ savingsPerUnit: number;
5210
+ monthlySavings: number; monthlySavingsFormatted: string;
5211
+ annualSavings: number; annualSavingsFormatted: string;
5212
+ monthlySalesRevenue: number; monthlySalesRevenueFormatted: string;
5213
+ annualSalesRevenue: number; annualSalesRevenueFormatted: string;
5214
+ annualRetailProfit: number; annualRetailProfitFormatted: string;
5215
+ totalROI: number; totalROIFormatted: string; // first-year ROI: annualSavings + annualRetailProfit
5216
+ paybackMonths: number; // 999 sentinel when there is no payback at these inputs
5217
+ savingsPerCup: number;
5218
+ co2SavingsPerYear: number;
5219
+ roiCalculatorUrl: string;
5220
+ requestDemoUrl: string; // the site's own next step — a separate lead form, not computed here
5221
+ }
5222
+
5223
+ /**
5224
+ * Bellwether Coffee's own ROI calculator (bellwethercoffee.com/roi-calculator) — real
5225
+ * monthly/annual savings, retail-bag revenue and profit, payback period, and first-year ROI
5226
+ * for the Shop Roaster, computed exactly as the site's own client-side formula computes it, no
5227
+ * estimate.
5228
+ */
5229
+ interface Unit {
5230
+ /**
5231
+ * Returns the ROI calculator's own currencies, roaster types, per-currency default input
5232
+ * values, slider bounds (min/max/step), per-currency roaster list prices, and the site's own
5233
+ * cost-basis disclaimer text — call this before computeRoiEstimate to know the valid ranges
5234
+ * and defaults.
5235
+ */
5236
+ getCalculatorDefaults(): Promise<BellwethercoffeeCalculatorDefaults>;
5237
+
5238
+ /**
5239
+ * Runs Bellwether's own ROI calculator formula — currency, roaster type, weekly roasted-coffee
5240
+ * usage, price paid per lb, and weekly retail-bag sales in; real monthly/annual savings,
5241
+ * retail-bag revenue and profit, payback period (months), and first-year total ROI out,
5242
+ * computed exactly as bellwethercoffee.com/roi-calculator's own client-side computeROI()
5243
+ * computes it, no estimate. `requestDemoUrl` is the site's own next step, not a checkout.
5244
+ */
5245
+ computeRoiEstimate(input: BellwethercoffeeRoiInput): Promise<BellwethercoffeeRoiEstimate>;
5246
+ }
5247
+ }
5248
+
5249
+ declare namespace BowmarkProvider_beltservice {
5250
+ // ── Beltservice Corporation — the unit's own declarations, verbatim ──
5251
+ interface BeltserviceCatalogItem {
5252
+ catalogNumber: string;
5253
+ partNumber: string;
5254
+ name: string;
5255
+ grade: string | null;
5256
+ specSheetUrl: string | null;
5257
+ detailUrl: string;
5258
+ quoteUrl: string;
5259
+ }
5260
+ interface BeltserviceCatalogPage {
5261
+ items: BeltserviceCatalogItem[];
5262
+ page: number;
5263
+ totalPages: number;
5264
+ hasMore: boolean;
5265
+ }
5266
+ interface BeltserviceBrowseParams {
5267
+ group?: string;
5268
+ category?: string;
5269
+ industry?: string;
5270
+ page?: number;
5271
+ }
5272
+ interface BeltserviceBeltDetail {
5273
+ catalogNumber: string;
5274
+ partNumber: string;
5275
+ name: string;
5276
+ description: string | null;
5277
+ specSheetUrl: string | null;
5278
+ quoteUrl: string;
5279
+ }
5280
+
5281
+ /**
5282
+ * Beltservice Corporation's own conveyor-belt catalog: browse or filter by product
5283
+ * group/category/industry and get back real, paginated, spec-matched belts (catalog number,
5284
+ * part number, spec-sheet PDF), or look up one belt directly by catalog number — plus the
5285
+ * ready quote-handoff link for each.
5286
+ */
5287
+ interface Unit {
5288
+ /**
5289
+ * Browses Beltservice's live belt catalog, matching its own site filters: pass at most one of
5290
+ * group/category/industry (the site's own facet slugs, e.g. group: "heavy-duty") plus an
5291
+ * optional page number, or call with no argument for the unfiltered catalog. Returns real
5292
+ * paginated results — catalog number, part number, spec-sheet PDF, quote-handoff link —
5293
+ * exactly as the live site renders them.
5294
+ */
5295
+ browseCatalog(params?: BeltserviceBrowseParams): Promise<BeltserviceCatalogPage>;
5296
+
5297
+ /**
5298
+ * Looks up one belt directly by its Beltservice catalog number (found via browseCatalog) and
5299
+ * returns its full description, spec-sheet PDF, and quote-handoff link.
5300
+ */
5301
+ getBelt(catalogNumber: string): Promise<BeltserviceBeltDetail>;
5302
+ }
5303
+ }
5304
+
5305
+ declare namespace BowmarkProvider_benelliusa {
5306
+ // ── Benelli USA — the unit's own declarations, verbatim ──
5307
+ interface benelliusaDealer {
5308
+ name: string;
5309
+ address: string;
5310
+ city: string;
5311
+ state: string;
5312
+ postalCode: string;
5313
+ phone: string | null;
5314
+ distanceMiles: number;
5315
+ mapUrl: string;
5316
+ premierDealer: boolean;
5317
+ latitude: number | null;
5318
+ longitude: number | null;
5319
+ }
5320
+
5321
+ /**
5322
+ * Runs Benelli USA's own dealer locator by ZIP code and returns real Premier Dealer records —
5323
+ * name, address, phone, distance, map link.
5324
+ */
5325
+ interface Unit {
5326
+ /**
5327
+ * Runs Benelli USA's own "Find A Benelli Dealer" locator for a 5-digit US ZIP and returns
5328
+ * every dealer it lists, nearest first: name, street address, city/state/zip, phone (`null` on
5329
+ * the handful of rows with none), distance in miles, a Google Maps directions link, whether
5330
+ * the site marks it a `premierDealer` ("Benelli Premier Dealer"), and coordinates when the
5331
+ * page's own map data carries them. A ZIP with no dealers nearby returns `[]` — the site's own
5332
+ * honest "No dealers found" answer, not an error. **Does not report which sister brands
5333
+ * (Franchi, Stoeger, Uberti USA) a dealer also carries** — the results page names no brand at
5334
+ * all, whatever an earlier read of the site suggested.
5335
+ */
5336
+ findDealers(zip: string): Promise<benelliusaDealer[]>;
5337
+ }
5338
+ }
5339
+
4291
5340
  declare namespace BowmarkProvider_bennington {
4292
5341
  // ── Bennington Marine — the unit's own declarations, verbatim ──
4293
5342
  interface BenningtonModel {
@@ -4437,6 +5486,54 @@ interface StoreStock {
4437
5486
  }
4438
5487
  }
4439
5488
 
5489
+ declare namespace BowmarkProvider_bigairusa {
5490
+ // ── Big Air Trampoline Park — the unit's own declarations, verbatim ──
5491
+ interface BigAirLocation {
5492
+ slug: string;
5493
+ name: string;
5494
+ comingSoon: boolean;
5495
+ webstoreSubdomain: string | null;
5496
+ }
5497
+
5498
+ interface BigAirPass {
5499
+ id: string;
5500
+ name: string;
5501
+ price: number | null;
5502
+ description: string | null;
5503
+ group: string;
5504
+ checkoutUrl: string;
5505
+ }
5506
+
5507
+ interface BigAirLocationCatalog {
5508
+ location: BigAirLocation;
5509
+ waiverUrl: string;
5510
+ passes: BigAirPass[];
5511
+ }
5512
+
5513
+ /**
5514
+ * Big Air Trampoline Park's own location directory and per-location CenterEdge ticket/pass
5515
+ * catalog — real prices, no login, no browser — plus the checkout and waiver handoff URLs a
5516
+ * purchase needs.
5517
+ */
5518
+ interface Unit {
5519
+ /**
5520
+ * Lists every Big Air location off the site's own location-picker CMS collection — name, slug,
5521
+ * coming-soon flag, and (when it's on the classic CenterEdge webstore) the webstoreSubdomain
5522
+ * listPasses needs. Only comingSoon: false locations with a non-null webstoreSubdomain are
5523
+ * servable by listPasses today.
5524
+ */
5525
+ listLocations(): Promise<BigAirLocation[]>;
5526
+
5527
+ /**
5528
+ * Lists every ticket/pass group and item at one open location's CenterEdge webstore — real
5529
+ * prices, descriptions — plus that location's checkout URL (per item, to add to cart) and
5530
+ * hosted-waiver URL. location is the slug listLocations() returns, e.g. "corona". Throws when
5531
+ * the location is coming-soon or is not on the classic webstore.
5532
+ */
5533
+ listPasses(location: string): Promise<BigAirLocationCatalog>;
5534
+ }
5535
+ }
5536
+
4440
5537
  declare namespace BowmarkProvider_bigjoeforklifts {
4441
5538
  // ── Big Joe Forklifts — the unit's own declarations, verbatim ──
4442
5539
  interface BigJoeRoiQuestion {
@@ -4599,6 +5696,77 @@ interface BingNewsSearchResult {
4599
5696
  }
4600
5697
  }
4601
5698
 
5699
+ declare namespace BowmarkProvider_bishops {
5700
+ // ── Bishops Cuts/Color — the unit's own declarations, verbatim ──
5701
+ interface BishopsLocationLink {
5702
+ slug: string;
5703
+ url: string;
5704
+ }
5705
+
5706
+ interface BishopsLocation {
5707
+ slug: string;
5708
+ name: string;
5709
+ url: string;
5710
+ centerId: string; // the id listServices and checkAvailability take
5711
+ phone: string | null;
5712
+ address: string | null;
5713
+ hours: string | null;
5714
+ }
5715
+
5716
+ interface BishopsService {
5717
+ id: string; // the id checkAvailability takes
5718
+ name: string;
5719
+ description: string | null;
5720
+ durationMinutes: number | null;
5721
+ price: number | null;
5722
+ }
5723
+
5724
+ interface BishopsSlot {
5725
+ time: string; // the site's own display time, e.g. "10:55 AM"
5726
+ }
5727
+
5728
+ interface BishopsAvailability {
5729
+ centerId: string;
5730
+ serviceId: string;
5731
+ date: string;
5732
+ slots: BishopsSlot[]; // verbatim — empty is a real answer (fully booked / closed)
5733
+ }
5734
+
5735
+ /**
5736
+ * Bishops Cuts/Color's real location directory, live per-location service catalog, and real
5737
+ * open-slot appointment availability — the same Zenoti booking backend the site's own widget
5738
+ * calls. Rung 9/11, no browser.
5739
+ */
5740
+ interface Unit {
5741
+ /**
5742
+ * Reads the live list of every Bishops Cuts/Color location (slug + page URL) off the site's
5743
+ * own sitemap.
5744
+ */
5745
+ listLocations(): Promise<BishopsLocationLink[]>;
5746
+
5747
+ /**
5748
+ * Resolves a slug/neighborhood query (e.g. "lowry") to the matching real Bishops location(s) —
5749
+ * name, address, phone, hours, and the Zenoti centerId listServices and checkAvailability
5750
+ * need. Call listLocations() first for the real slugs.
5751
+ */
5752
+ findLocation(query: string): Promise<BishopsLocation[]>;
5753
+
5754
+ /**
5755
+ * Reads one location's real, live service catalog — pass a `centerId` from findLocation(), and
5756
+ * an optional search string (e.g. "cut", "color") to narrow it; omit it for the full catalog.
5757
+ */
5758
+ listServices(centerId: string, query?: string): Promise<BishopsService[]>;
5759
+
5760
+ /**
5761
+ * Checks real, live open time slots for one service at one location on one "YYYY-MM-DD" date —
5762
+ * the same live check Bishops' own Zenoti booking widget makes before showing bookable times.
5763
+ * An empty `slots` array is the site's real answer (fully booked or closed that day), not an
5764
+ * error.
5765
+ */
5766
+ checkAvailability(centerId: string, serviceId: string, date: string): Promise<BishopsAvailability>;
5767
+ }
5768
+ }
5769
+
4602
5770
  declare namespace BowmarkProvider_blackstoneproducts {
4603
5771
  // ── Blackstone Products — the unit's own declarations, verbatim ──
4604
5772
  interface BlackstoneDealer {
@@ -5003,6 +6171,51 @@ interface BmwusaModelListing {
5003
6171
  }
5004
6172
  }
5005
6173
 
6174
+ declare namespace BowmarkProvider_boglewinery {
6175
+ // ── Bogle Family Vineyards — the unit's own declarations, verbatim ──
6176
+ interface BoglewineryPrice {
6177
+ priceDescription: string; // e.g. "Starting at $20 per person"
6178
+ pricePerPersonCents: { min: number; max: number } | null;
6179
+ }
6180
+
6181
+ interface BoglewineryExperience {
6182
+ id: number; // the id checkAvailability takes
6183
+ slug: string; // the slug checkAvailability takes
6184
+ name: string;
6185
+ description: string;
6186
+ price: BoglewineryPrice;
6187
+ partySizes: number[]; // bookable party sizes Tock currently offers
6188
+ state: string; // e.g. "AVAILABLE", "SOLD"
6189
+ }
6190
+
6191
+ interface BoglewineryAvailability {
6192
+ experienceId: number;
6193
+ slug: string;
6194
+ openDate: string[]; // "YYYY-MM-DD" — empty is a real answer (nothing currently open)
6195
+ openTime: string[]; // "HH:MM"
6196
+ }
6197
+
6198
+ /**
6199
+ * Bogle Family Vineyards' real Tock tasting-experience catalog and the computed open
6200
+ * dates/times for one — the same booking calendar Tock's own widget reads before showing
6201
+ * bookable slots. Rung 17, headed browser only (Cloudflare).
6202
+ */
6203
+ interface Unit {
6204
+ /**
6205
+ * Reads Bogle's real, live Tock experience catalog — name, description, price and bookable
6206
+ * party-size range for every experience, including the Home Ranch Tasting Experience.
6207
+ */
6208
+ listExperiences(): Promise<BoglewineryExperience[]>;
6209
+
6210
+ /**
6211
+ * Checks which upcoming dates and times Tock currently shows as open for one experience — pass
6212
+ * `experienceId` and `slug` from listExperiences(). An empty result is the site's real answer
6213
+ * (nothing currently open), not an error.
6214
+ */
6215
+ checkAvailability(experienceId: number, slug: string): Promise<BoglewineryAvailability>;
6216
+ }
6217
+ }
6218
+
5006
6219
  declare namespace BowmarkProvider_bollandbranch {
5007
6220
  // ── Boll & Branch — the unit's own declarations, verbatim ──
5008
6221
  interface BedDesignerStep {
@@ -5061,6 +6274,100 @@ interface BollAndBranchSwatch {
5061
6274
  }
5062
6275
  }
5063
6276
 
6277
+ declare namespace BowmarkProvider_borsheims {
6278
+ // ── Borsheims — the unit's own declarations, verbatim ──
6279
+ interface BorsheimsSearchResult {
6280
+ name: string; // derived from the URL slug, title-cased
6281
+ url: string; // pass to getProduct / configureRing
6282
+ lastmod: string | null;
6283
+ }
6284
+ interface BorsheimsProduct {
6285
+ code: string;
6286
+ name: string;
6287
+ basePrice: number; // dollars, before any discount
6288
+ price: number; // dollars, the real selling price
6289
+ discount: number | null;
6290
+ inventoryAvailable: number;
6291
+ imageUrl: string | null;
6292
+ url: string; // pass to getProduct / configureRing
6293
+ }
6294
+ interface BorsheimsRingConfiguration {
6295
+ setting: BorsheimsProduct;
6296
+ diamond: BorsheimsProduct;
6297
+ totalPrice: number; // dollars, setting.price + diamond.price
6298
+ builderUrl: string; // the handoff — open this to configure/buy
6299
+ }
6300
+ interface ConfigureRingArgs {
6301
+ settingUrl: string;
6302
+ diamondUrl: string;
6303
+ }
6304
+
6305
+ /**
6306
+ * Reads Borsheims' live product catalog and composes a setting + diamond into a priced ring,
6307
+ * straight off borsheims.com's own embedded product data — no key, no browser.
6308
+ */
6309
+ interface Unit {
6310
+ /**
6311
+ * Turns a free-text query into real borsheims.com product page URLs — the LOCATOR getProduct
6312
+ * and configureRing need — by matching every query token against the site's own sitemap.xml
6313
+ * (~16,000 URLs, no login, no browser). Returns [] for a query nothing matches, an honest
6314
+ * empty result.
6315
+ */
6316
+ searchProducts(query: string): Promise<BorsheimsSearchResult[]>;
6317
+
6318
+ /**
6319
+ * Reads one product's real, live price straight off its product page's own embedded data
6320
+ * (mivaJS.product) — the same JSON the page's own components render from, including any active
6321
+ * discount. Takes the full borsheims.com product page URL. THROWS rather than guessing when
6322
+ * the page's own product-data block is missing or unparseable.
6323
+ */
6324
+ getProduct(url: string): Promise<BorsheimsProduct>;
6325
+
6326
+ /**
6327
+ * Composes a setting product page and a diamond/center-stone product page into a priced ring —
6328
+ * setting.price + diamond.price — the same arithmetic the site's own ring builder performs,
6329
+ * plus the ring-builder URL as the handoff to actually configure and buy.
6330
+ */
6331
+ configureRing(args: ConfigureRingArgs): Promise<BorsheimsRingConfiguration>;
6332
+ }
6333
+ }
6334
+
6335
+ declare namespace BowmarkProvider_boxlunch {
6336
+ // ── BoxLunch — the unit's own declarations, verbatim ──
6337
+ interface BoxlunchOffer {
6338
+ sku: string
6339
+ color: string | null
6340
+ size: string | null
6341
+ price: number | null
6342
+ currency: string | null
6343
+ availability: string | null // the site's own schema.org availability URL
6344
+ url: string
6345
+ }
6346
+ interface BoxlunchProduct {
6347
+ name: string
6348
+ url: string
6349
+ image: string | null
6350
+ offers: BoxlunchOffer[]
6351
+ }
6352
+ interface BoxlunchSearchResult {
6353
+ products: BoxlunchProduct[]
6354
+ }
6355
+
6356
+ /**
6357
+ * BoxLunch's own storefront search (boxlunch.com) — licensed pop-culture and entertainment
6358
+ * merch (apparel, figures, accessories, home goods) across every property the store carries,
6359
+ * read straight off the site's own structured search-result data.
6360
+ */
6361
+ interface Unit {
6362
+ /**
6363
+ * Searches boxlunch.com's own storefront for a keyword and returns the real, priced product
6364
+ * results (name, image, per-SKU price/color/size/availability) exactly as the site's own
6365
+ * search page carries them.
6366
+ */
6367
+ search(arg: { query: string }): Promise<BoxlunchSearchResult>;
6368
+ }
6369
+ }
6370
+
5064
6371
  declare namespace BowmarkProvider_boydsleep {
5065
6372
  // ── Boyd Sleep — the unit's own declarations, verbatim ──
5066
6373
  // Boyd Sleep's OWN shapes — not a capability contract.
@@ -5117,6 +6424,43 @@ interface Boydsleep6ZoneResult {
5117
6424
  }
5118
6425
  }
5119
6426
 
6427
+ declare namespace BowmarkProvider_brius {
6428
+ // ── Brava by BRIUS — the unit's own declarations, verbatim ──
6429
+ // Brava's OWN shapes — not a capability contract.
6430
+
6431
+ interface BriusProviderListing {
6432
+ name: string; // e.g. "Embrace Orthodontics"
6433
+ url: string; // the practice's own listing page on bravabraces.com
6434
+ doctorName: string | null;
6435
+ streetAddress: string | null;
6436
+ city: string | null;
6437
+ region: string | null;
6438
+ postalCode: string | null;
6439
+ country: string | null;
6440
+ phone: string | null;
6441
+ website: string | null; // the practice's own external site, when listed
6442
+ }
6443
+
6444
+ interface BriusProviderSearch {
6445
+ query: string;
6446
+ providers: BriusProviderListing[];
6447
+ }
6448
+
6449
+ /**
6450
+ * Brava (by Brius Technologies) hidden lingual braces are sold only through certified
6451
+ * orthodontists — search the site's own find-a-provider locator by zip code or location and
6452
+ * get back real, currently-listed certified practices with address, phone and doctor name.
6453
+ */
6454
+ interface Unit {
6455
+ /**
6456
+ * Runs Brava's own find-a-provider locator search for a zip code or location string and
6457
+ * returns the certified orthodontist practices it lists — name, doctor, address, phone and
6458
+ * website, straight from the site's own current data.
6459
+ */
6460
+ findProviders(query: string): Promise<BriusProviderSearch>;
6461
+ }
6462
+ }
6463
+
5120
6464
  declare namespace BowmarkProvider_brixton {
5121
6465
  // ── Brixton — the unit's own declarations, verbatim ──
5122
6466
  interface BrixtonVariant {
@@ -5239,6 +6583,91 @@ interface BulletproofNearbyStores {
5239
6583
  }
5240
6584
  }
5241
6585
 
6586
+ declare namespace BowmarkProvider_bungalow {
6587
+ // ── Bungalow — the unit's own declarations, verbatim ──
6588
+ interface BungalowMarket {
6589
+ slug: string;
6590
+ displayName: string;
6591
+ region: string;
6592
+ regionCode: string;
6593
+ country: string;
6594
+ countryCode: string;
6595
+ }
6596
+
6597
+ interface BungalowListingSummary {
6598
+ id: string;
6599
+ slug: string;
6600
+ headline: string | null;
6601
+ marketingType: "co_living" | "group_living" | string;
6602
+ numBathrooms: string;
6603
+ sqft: number | null;
6604
+ city: string;
6605
+ neighborhood: string | null;
6606
+ marketSlug: string;
6607
+ marketDisplayName: string;
6608
+ isComingSoon: boolean;
6609
+ }
6610
+
6611
+ interface BungalowSearchResult {
6612
+ listings: BungalowListingSummary[];
6613
+ count: number;
6614
+ totalMatching: number;
6615
+ }
6616
+
6617
+ interface BungalowSearchFilters {
6618
+ marketSlug: string;
6619
+ marketingType?: "co_living" | "group_living";
6620
+ neighborhoodSlug?: string;
6621
+ minPrice?: number;
6622
+ maxPrice?: number;
6623
+ petFriendly?: boolean;
6624
+ limit?: number;
6625
+ }
6626
+
6627
+ interface BungalowListingDetail {
6628
+ id: string;
6629
+ slug: string;
6630
+ headline: string | null;
6631
+ marketingType: "co_living" | "group_living" | string;
6632
+ totalRoomCount: number;
6633
+ availableRoomCount: number;
6634
+ earliestAvailableDate: string | null;
6635
+ roomPrices: number[];
6636
+ fullPropertyPrice: number | null;
6637
+ sqft: number | null;
6638
+ numBathrooms: string;
6639
+ amenities: unknown;
6640
+ matterportUrl: string | null;
6641
+ activePromotions: string[];
6642
+ isMeetAndGreetAvailable: boolean;
6643
+ showingsAvailable: { virtual: string | null; inPerson: string | null };
6644
+ }
6645
+
6646
+ /**
6647
+ * Bungalow's live, priced room and whole-home rental inventory and tour-booking availability,
6648
+ * read straight off their own documented API — no key, no browser.
6649
+ */
6650
+ interface Unit {
6651
+ /**
6652
+ * Lists every market Bungalow currently operates in, with the slug every other function's
6653
+ * marketSlug argument takes.
6654
+ */
6655
+ listMarkets(): Promise<{ markets: BungalowMarket[] }>;
6656
+
6657
+ /**
6658
+ * Searches live, priced room and whole-home rental listings in one market, filterable by
6659
+ * price, neighborhood and marketing type.
6660
+ */
6661
+ searchListings(filters: BungalowSearchFilters): Promise<BungalowSearchResult>;
6662
+
6663
+ /**
6664
+ * Returns one listing's full detail — room-level rent and availability, amenities, promotions
6665
+ * and tour-booking availability.
6666
+ */
6667
+ getListing(slug: string): Promise<BungalowListingDetail>;
6668
+ }
6669
+ }
6670
+
5242
6671
  declare namespace BowmarkProvider_bykoket {
5243
6672
  // ── KOKET — the unit's own declarations, verbatim ──
5244
6673
  interface KoketProductSummary {
@@ -5371,6 +6800,141 @@ interface byltbasicsPackHandoff {
5371
6800
  }
5372
6801
  }
5373
6802
 
6803
+ declare namespace BowmarkProvider_cabinsforyou {
6804
+ // ── Cabins For You — the unit's own declarations, verbatim ──
6805
+ // Cabins For You's OWN shapes — not a capability contract.
6806
+
6807
+ interface CabinsforyouListing {
6808
+ name: string;
6809
+ url: string;
6810
+ nightlyRate: number | null;
6811
+ originalNightlyRate: number | null;
6812
+ bedrooms: number;
6813
+ bathrooms: number;
6814
+ sleeps: number;
6815
+ sqft: number | null;
6816
+ petsAllowed: boolean;
6817
+ rating: number | null;
6818
+ reviewCount: number | null;
6819
+ imageUrl: string | null;
6820
+ bookCabinUrl: string;
6821
+ }
6822
+
6823
+ interface CabinsforyouSearchResult {
6824
+ resultCount: number;
6825
+ cabins: CabinsforyouListing[];
6826
+ }
6827
+
6828
+ interface CabinsforyouCabinDetail {
6829
+ name: string;
6830
+ url: string;
6831
+ city: string;
6832
+ bedrooms: number | null;
6833
+ bathrooms: number | null;
6834
+ sleeps: number | null;
6835
+ parking: string | null;
6836
+ petsAllowed: boolean | null;
6837
+ amenities: string[];
6838
+ rating: number | null;
6839
+ reviewCount: number | null;
6840
+ description: string;
6841
+ unitId: string | null;
6842
+ bookingQuoteUrl: string; // the WRITE handoff this provider never performs
6843
+ }
6844
+
6845
+ interface CabinsforyouSearchArgs {
6846
+ checkIn: string; // MM/DD/YYYY
6847
+ checkOut: string; // MM/DD/YYYY
6848
+ guests?: number;
6849
+ bedrooms?: number;
6850
+ }
6851
+
6852
+ /**
6853
+ * Cabins For You's live Smoky Mountain cabin-availability search (Check In / Check Out /
6854
+ * Guests / Bedrooms) off the site's own search page — real priced results, not a stale
6855
+ * aggregator mirror — plus one cabin's own amenities, room counts and booking-quote handoff.
6856
+ */
6857
+ interface Unit {
6858
+ /**
6859
+ * Runs Cabins For You's own homepage cabin-availability search and returns the real matching
6860
+ * cabins, priced. `args.checkIn` / `args.checkOut` are MM/DD/YYYY (the site's own date
6861
+ * format); `guests` and `bedrooms` are optional minimums.
6862
+ */
6863
+ search(args: CabinsforyouSearchArgs): Promise<CabinsforyouSearchResult>;
6864
+
6865
+ /**
6866
+ * Reads one cabin's own listing page — room counts, pet policy, amenities, description and
6867
+ * rating, plus the booking-quote handoff. `url` is a listing URL from a `search` result.
6868
+ */
6869
+ getCabinDetail(url: string): Promise<CabinsforyouCabinDetail>;
6870
+ }
6871
+ }
6872
+
6873
+ declare namespace BowmarkProvider_caliberhealth {
6874
+ // ── Caliber Healthcare Solutions — the unit's own declarations, verbatim ──
6875
+ // Caliber Healthcare Solutions' OWN shapes — not a capability contract.
6876
+
6877
+ interface CaliberhealthJobListing {
6878
+ title: string;
6879
+ jobId: string;
6880
+ postedDate: string;
6881
+ specialty: string;
6882
+ credentialType: string | null;
6883
+ state: string | null;
6884
+ zip: string | null;
6885
+ url: string;
6886
+ }
6887
+
6888
+ interface CaliberhealthSearchResult {
6889
+ jobs: CaliberhealthJobListing[];
6890
+ jobsOnPage: number;
6891
+ page: number;
6892
+ hasMorePages: boolean;
6893
+ }
6894
+
6895
+ interface CaliberhealthSearchArgs {
6896
+ specialty?: string;
6897
+ location?: string;
6898
+ keywords?: string;
6899
+ page?: number;
6900
+ }
6901
+
6902
+ interface CaliberhealthJobDetail {
6903
+ title: string;
6904
+ jobId: string;
6905
+ postedDate: string;
6906
+ specialty: string;
6907
+ location: string;
6908
+ facilityType: string | null;
6909
+ schedule: string | null;
6910
+ assignmentDetails: string | null;
6911
+ assignmentLength: string | null;
6912
+ aboutBlurb: string;
6913
+ url: string;
6914
+ applyUrl: string; // the WRITE handoff this provider never performs
6915
+ }
6916
+
6917
+ /**
6918
+ * Caliber Healthcare Solutions' live locum-tenens job board (/healthcare-jobs) off the site's
6919
+ * own server-rendered listings — real open jobs filterable by specialty/location/keywords, not
6920
+ * a stale mirror — plus one job's own full detail and apply handoff.
6921
+ */
6922
+ interface Unit {
6923
+ /**
6924
+ * Runs Caliber Healthcare Solutions' own live job-board search and returns the real open
6925
+ * locum-tenens jobs on the requested page, filtered by specialty/location/keywords. Call again
6926
+ * with an incremented `page` while `hasMorePages` is true.
6927
+ */
6928
+ search(args?: CaliberhealthSearchArgs): Promise<CaliberhealthSearchResult>;
6929
+
6930
+ /**
6931
+ * Reads one job's own detail page — specialty, location, facility type, schedule, assignment
6932
+ * length, and the apply handoff. `url` is a job URL from a `search` result.
6933
+ */
6934
+ getJob(url: string): Promise<CaliberhealthJobDetail>;
6935
+ }
6936
+ }
6937
+
5374
6938
  declare namespace BowmarkProvider_califloors {
5375
6939
  // ── CALI — the unit's own declarations, verbatim ──
5376
6940
  // CALI's OWN shapes — not a capability contract.
@@ -5418,6 +6982,13 @@ interface CaliProductDetail extends CaliProduct {
5418
6982
 
5419
6983
  declare namespace BowmarkProvider_camelcamelcamel {
5420
6984
  // ── camelcamelcamel — the unit's own declarations, verbatim ──
6985
+ interface CamelSearchResult {
6986
+ asin: string;
6987
+ title: string;
6988
+ currentPrice: number | null;
6989
+ url: string;
6990
+ }
6991
+
5421
6992
  interface CamelPriceStat {
5422
6993
  price: number | null;
5423
6994
  date: string | null;
@@ -5445,6 +7016,13 @@ interface CamelPriceHistory {
5445
7016
  * for.
5446
7017
  */
5447
7018
  interface Unit {
7019
+ /**
7020
+ * Runs camelcamelcamel's own Amazon-product search and returns each hit's ASIN, title and
7021
+ * current price — the locator this provider was missing: `getPriceHistory` takes an ASIN, and
7022
+ * this is how a caller holding only a shopper's words finds one.
7023
+ */
7024
+ search(query: string): Promise<CamelSearchResult[]>;
7025
+
5448
7026
  /**
5449
7027
  * Reads camelcamelcamel's independently-tracked Amazon price history for one ASIN — the site's
5450
7028
  * own lowest-ever/highest-ever/current/average figures, each dated, for the Amazon,
@@ -5728,6 +7306,139 @@ interface CarePatrolFindLocalAdvisorResult {
5728
7306
  }
5729
7307
  }
5730
7308
 
7309
+ declare namespace BowmarkProvider_carmelrealtycompany {
7310
+ // ── Carmel Realty Company — the unit's own declarations, verbatim ──
7311
+ interface carmelrealtycompanyListingSummary {
7312
+ url: string;
7313
+ slug: string | null;
7314
+ city: string;
7315
+ price: string;
7316
+ priceValue: number | null;
7317
+ latitude: number;
7318
+ longitude: number;
7319
+ }
7320
+ interface carmelrealtycompanyListing {
7321
+ slug: string;
7322
+ url: string;
7323
+ address: string;
7324
+ sold: boolean;
7325
+ price: string;
7326
+ priceValue: number | null;
7327
+ mlsNumber: string | null;
7328
+ bedrooms: string | null;
7329
+ bathrooms: string | null;
7330
+ lotSize: string | null;
7331
+ squareFootage: string | null;
7332
+ }
7333
+
7334
+ /**
7335
+ * Runs Carmel Realty Company's own regional listing search and listing-detail pages and
7336
+ * returns real, live MLS-backed rows — address, price, MLS number, beds/baths, coordinates —
7337
+ * for Carmel-by-the-Sea, Carmel Valley, Monterey and Pacific Grove.
7338
+ */
7339
+ interface Unit {
7340
+ /**
7341
+ * Runs one of Carmel Realty Company's own regional listing-search pages and returns every
7342
+ * active listing it maps: the listing's own detail-page URL (and a slug you can pass to
7343
+ * `getListing`, `null` for the rare listing that points at a dedicated marketing microsite
7344
+ * instead), city, the site's own formatted price plus a parsed `priceValue`, and coordinates.
7345
+ * Rows come straight off the page's live Mapbox data, price-descending as the site itself
7346
+ * orders them.
7347
+ */
7348
+ searchListings(region: "carmel" | "carmel-valley" | "monterey" | "pacific-grove" | "global"): Promise<carmelrealtycompanyListingSummary[]>;
7349
+
7350
+ /**
7351
+ * Fetches one Carmel Realty Company listing detail page by its slug (the `slug` a
7352
+ * `searchListings` row returns, e.g. "5466-quail-way-carmel") and returns its address,
7353
+ * sold/active status, price, MLS number, bedrooms, bathrooms, lot size and square footage —
7354
+ * the site's own live data, not a cached copy.
7355
+ */
7356
+ getListing(slug: string): Promise<carmelrealtycompanyListing>;
7357
+ }
7358
+ }
7359
+
7360
+ declare namespace BowmarkProvider_carolefabrics {
7361
+ // ── Carole Fabrics — the unit's own declarations, verbatim ──
7362
+ interface CarolefabricsSearchArgs {
7363
+ category: "fabric" | "trim";
7364
+ keyword: string;
7365
+ }
7366
+ interface CarolefabricsItem {
7367
+ patternName: string;
7368
+ colorName: string | null;
7369
+ sku: string;
7370
+ book: string;
7371
+ imageUrl: string;
7372
+ promoCode: string | null;
7373
+ promoLabel: string | null;
7374
+ }
7375
+ interface CarolefabricsSearchResult {
7376
+ category: "fabric" | "trim";
7377
+ keyword: string;
7378
+ items: CarolefabricsItem[];
7379
+ totalMatches: number;
7380
+ }
7381
+
7382
+ /**
7383
+ * Carole Fabrics' own CaroleNet trade-catalog search (carolenet.com) — a live keyword search
7384
+ * over their real fabric or trim catalog, returning actual matching patterns/colorways with
7385
+ * SKU, book and any active promotion. Public, no login required.
7386
+ */
7387
+ interface Unit {
7388
+ /**
7389
+ * Runs a keyword search against CaroleNet's live fabric or trim catalog and returns the real
7390
+ * matching patterns/colorways — pattern name, colorway, SKU, book, image and any active
7391
+ * promotion — plus the total match count.
7392
+ */
7393
+ search(args: CarolefabricsSearchArgs): Promise<CarolefabricsSearchResult>;
7394
+ }
7395
+ }
7396
+
7397
+ declare namespace BowmarkProvider_carpetlandusa {
7398
+ // ── Carpetland USA — the unit's own declarations, verbatim ──
7399
+ // Carpetland USA's OWN shapes — not a capability contract.
7400
+
7401
+ interface CarpetlandCategory { id: number; name: string; slug: string; count: number }
7402
+
7403
+ interface CarpetlandProductSummary { slug: string; title: string; url: string }
7404
+
7405
+ interface CarpetlandProductDetail extends CarpetlandProductSummary {
7406
+ style: string | null;
7407
+ color: string | null;
7408
+ material: string | null; // e.g. "Rigid – Plank"
7409
+ sqFtPerCarton: number | null;
7410
+ roomDescription: string | null; // e.g. "12'x9' Room / 108 sq ft"
7411
+ installedPrice: string | null; // e.g. "$722"
7412
+ installedPriceValue: number | null;
7413
+ callForPricing: boolean; // true when the site has no posted price for this SKU
7414
+ }
7415
+
7416
+ /**
7417
+ * Carpetland USA's own flooring catalog — the category taxonomy, a keyword search over any
7418
+ * category's live listing, and one SKU's real style/color/material and its computed installed
7419
+ * price for a standard 12'x9' room, straight off the site's own WordPress REST API.
7420
+ */
7421
+ interface Unit {
7422
+ /**
7423
+ * Carpetland USA's own product-catalog taxonomy — every category, its slug and its live
7424
+ * product count.
7425
+ */
7426
+ listCategories(): Promise<CarpetlandCategory[]>;
7427
+
7428
+ /**
7429
+ * The first page (up to 100) of the catalog, or one category's listing (e.g. "waterproof-lvp"
7430
+ * from listCategories), optionally filtered by a keyword against the product title.
7431
+ */
7432
+ searchProducts(categorySlug?: string, keyword?: string): Promise<{ products: CarpetlandProductSummary[]; category: CarpetlandCategory | null }>;
7433
+
7434
+ /**
7435
+ * One product's own catalog page — its real style, color, material, coverage per carton and,
7436
+ * when the SKU has one, the computed installed price for a standard 12'x9' room.
7437
+ */
7438
+ getProduct(slugOrUrl: string): Promise<CarpetlandProductDetail>;
7439
+ }
7440
+ }
7441
+
5731
7442
  declare namespace BowmarkProvider_cars {
5732
7443
  // ── Cars.com — the unit's own declarations, verbatim ──
5733
7444
  interface carsListing {
@@ -5835,6 +7546,348 @@ interface carsVehicleValue {
5835
7546
  }
5836
7547
  }
5837
7548
 
7549
+ declare namespace BowmarkProvider_carusohomes {
7550
+ // ── Caruso Homes — the unit's own declarations, verbatim ──
7551
+ interface CarusoCommunity {
7552
+ name: string;
7553
+ url: string;
7554
+ listingId: string | null;
7555
+ streetAddress: string | null;
7556
+ city: string | null;
7557
+ state: string | null;
7558
+ postalCode: string | null;
7559
+ latitude: number | null;
7560
+ longitude: number | null;
7561
+ description: string;
7562
+ images: string[];
7563
+ startingPriceLabel: string | null;
7564
+ }
7565
+
7566
+ interface CarusoFloorPlan {
7567
+ name: string;
7568
+ url: string;
7569
+ listingId: string | null;
7570
+ collection: string | null;
7571
+ priceLabel: string | null;
7572
+ priceValue: number | null;
7573
+ beds: number | null;
7574
+ baths: number | null;
7575
+ sqft: number | null;
7576
+ buildOnYourLot: boolean;
7577
+ }
7578
+
7579
+ interface CarusoFormFieldOption {
7580
+ value: string;
7581
+ label: string;
7582
+ }
7583
+
7584
+ interface CarusoFormField {
7585
+ name: string;
7586
+ label: string;
7587
+ type: "text" | "email" | "tel" | "date" | "checkbox" | "select";
7588
+ required: boolean;
7589
+ options?: CarusoFormFieldOption[];
7590
+ }
7591
+
7592
+ interface CarusoTourAppointmentSchema {
7593
+ entryUrl: string;
7594
+ communityName: string;
7595
+ itemOfInterestId: string;
7596
+ fields: CarusoFormField[];
7597
+ }
7598
+
7599
+ interface SearchCommunitiesArgs {
7600
+ market: string; // e.g. "md/maryland", "nc/charlotte" — the path segment carusohomes.com uses under /new-homes/<market>/
7601
+ }
7602
+
7603
+ interface SearchFloorPlansArgs {
7604
+ market: string;
7605
+ buildOnYourLot?: boolean; // true -> the market's Build-on-Your-Lot listing; false/omitted -> community-attached plans
7606
+ }
7607
+
7608
+ interface GetTourAppointmentSchemaArgs {
7609
+ communityUrl: string; // a community URL from searchCommunities, e.g. "https://www.carusohomes.com/new-homes/md/ellicott-city/mill-creek/18641/"
7610
+ }
7611
+
7612
+ interface AssembleTourRequestArgs {
7613
+ communityUrl: string;
7614
+ firstName: string;
7615
+ lastName: string;
7616
+ email: string;
7617
+ phone?: string;
7618
+ desiredPriceRangeMinimum?: string;
7619
+ desiredPriceRangeMaximum?: string;
7620
+ whenToMove?: string;
7621
+ preferredAppointmentDate?: string; // "YYYY-MM-DD"
7622
+ message?: string;
7623
+ textOptIn?: boolean;
7624
+ }
7625
+
7626
+ interface AssembledTourRequest {
7627
+ valid: boolean;
7628
+ errors: string[];
7629
+ entryUrl: string;
7630
+ formFields: Record<string, string>;
7631
+ summary: string;
7632
+ }
7633
+
7634
+ /**
7635
+ * Caruso Homes' own live community and Build-on-Your-Lot floor-plan listings, plus each
7636
+ * community's own 'Schedule a Tour' form — reads the real field schema and assembles a
7637
+ * validated, ready-to-submit tour request. Never submits it.
7638
+ */
7639
+ interface Unit {
7640
+ /**
7641
+ * Every live community on one of Caruso Homes' market listing pages — name, address, geo,
7642
+ * image, description and the site's own best-effort starting-price band.
7643
+ */
7644
+ searchCommunities(args: SearchCommunitiesArgs): Promise<CarusoCommunity[]>;
7645
+
7646
+ /**
7647
+ * Every floor-plan card on a market's listing — community-attached by default, or
7648
+ * Build-on-Your-Lot when buildOnYourLot is true — with price, beds, baths and square footage.
7649
+ */
7650
+ searchFloorPlans(args: SearchFloorPlansArgs): Promise<CarusoFloorPlan[]>;
7651
+
7652
+ /**
7653
+ * One community's own live 'Schedule a Tour' form: every visible field (type, required-ness,
7654
+ * real enumerated options) plus that community's item_of_interest_id.
7655
+ */
7656
+ getTourAppointmentSchema(args: GetTourAppointmentSchemaArgs): Promise<CarusoTourAppointmentSchema>;
7657
+
7658
+ /**
7659
+ * Validates a caller's tour request against a community's live form schema and maps it onto
7660
+ * the site's own field names, ready to submit to /xhr/schedule-appointment/. Never submits it.
7661
+ */
7662
+ assembleTourRequest(args: AssembleTourRequestArgs): Promise<AssembledTourRequest>;
7663
+ }
7664
+ }
7665
+
7666
+ declare namespace BowmarkProvider_casadragones {
7667
+ // ── Casa Dragones — the unit's own declarations, verbatim ──
7668
+ // Casa Dragones' OWN shapes — not a capability contract.
7669
+
7670
+ interface CasaDragonesProductSummary {
7671
+ handle: string; // the key getProduct takes
7672
+ title: string;
7673
+ url: string;
7674
+ }
7675
+
7676
+ interface CasaDragonesProduct {
7677
+ handle: string;
7678
+ title: string;
7679
+ url: string; // the real product page — the honest handoff to buy/checkout
7680
+ price: number; // dollars, the site's own real price
7681
+ description: string;
7682
+ }
7683
+
7684
+ interface CasaDragonesRetailer {
7685
+ id: string;
7686
+ name: string;
7687
+ address: string;
7688
+ city: string;
7689
+ state: string;
7690
+ latitude: number;
7691
+ longitude: number;
7692
+ distanceMiles: number;
7693
+ categories: string[]; // e.g. "RETAILER", "BAR/RESTAURANT"
7694
+ }
7695
+
7696
+ interface CasaDragonesNearbyRetailers {
7697
+ zip: string;
7698
+ radiusMiles: number;
7699
+ retailers: CasaDragonesRetailer[];
7700
+ }
7701
+
7702
+ /**
7703
+ * Casa Dragones' real sipping-tequila catalog and real product pricing straight off the site,
7704
+ * plus its real store locator (StoreRocket) for nearby retailers/bars/restaurants that
7705
+ * actually carry it — the two things ChatGPT cannot do today (it guesses at prices and asks
7706
+ * the user to run the locator manually).
7707
+ */
7708
+ interface Unit {
7709
+ /**
7710
+ * Lists Casa Dragones' real sipping-tequila catalog off their own product listing page,
7711
+ * optionally filtered by a free-text query matched against the title.
7712
+ */
7713
+ listProducts(query?: string): Promise<CasaDragonesProductSummary[]>;
7714
+
7715
+ /**
7716
+ * Reads one product's real title, real price and real description straight off its live page.
7717
+ * THROWS on an unknown handle, naming listProducts() as the way to find real ones. `url` is
7718
+ * the honest checkout handoff — casadragones.com's own add-to-cart button lives on that exact
7719
+ * page.
7720
+ */
7721
+ getProduct(handle: string): Promise<CasaDragonesProduct>;
7722
+
7723
+ /**
7724
+ * Runs Casa Dragones' own real-time store locator (StoreRocket) for a US ZIP and returns real
7725
+ * nearby retailers/bars/restaurants that carry Casa Dragones, distance-ranked in miles — never
7726
+ * a guess at which stores might stock it. `radiusMiles` defaults to 50 and is capped at 500;
7727
+ * an honestly empty list means nothing in Casa Dragones' own tracked network is that close.
7728
+ */
7729
+ findNearbyRetailers(zip: string, radiusMiles?: number): Promise<CasaDragonesNearbyRetailers>;
7730
+ }
7731
+ }
7732
+
7733
+ declare namespace BowmarkProvider_cbhhomes {
7734
+ // ── CBH Homes — the unit's own declarations, verbatim ──
7735
+ interface CbhListing {
7736
+ id: number;
7737
+ mls: number;
7738
+ url: string;
7739
+ image: string | null;
7740
+ status: string;
7741
+ isSold: boolean;
7742
+ isReserved: boolean;
7743
+ address: string;
7744
+ city: string;
7745
+ filterCity: string;
7746
+ county: string | null;
7747
+ state: string;
7748
+ postalCode: string;
7749
+ latitude: number | null;
7750
+ longitude: number | null;
7751
+ floorPlanId: string | null;
7752
+ floorPlanName: string | null;
7753
+ communityId: string | null;
7754
+ communityName: string | null;
7755
+ beds: number | null;
7756
+ baths: number | null;
7757
+ garageCapacity: number | null;
7758
+ sqft: number | null;
7759
+ price: number;
7760
+ priceMonthly: number | null;
7761
+ amenities: string[];
7762
+ salesCenter: string | null;
7763
+ schoolDistrict: string | null;
7764
+ daysOnMarket: number | null;
7765
+ }
7766
+
7767
+ interface SearchListingsArgs {
7768
+ city?: string; // the site's own filter-city band, e.g. "Meridian (North)"
7769
+ bedrooms?: number;
7770
+ bathrooms?: number;
7771
+ priceMin?: number;
7772
+ priceMax?: number;
7773
+ sqftMin?: number;
7774
+ sqftMax?: number;
7775
+ moveInReady?: boolean;
7776
+ count?: number; // default 50
7777
+ page?: number;
7778
+ }
7779
+
7780
+ interface CbhFormFieldOption {
7781
+ value: string;
7782
+ label: string;
7783
+ }
7784
+
7785
+ interface CbhFormField {
7786
+ name: string;
7787
+ label: string;
7788
+ type: "text" | "email" | "tel" | "checkbox" | "select" | "textarea";
7789
+ required: boolean;
7790
+ options?: CbhFormFieldOption[];
7791
+ }
7792
+
7793
+ interface CbhInquiryFormSchema {
7794
+ entryUrl: string;
7795
+ fields: CbhFormField[];
7796
+ }
7797
+
7798
+ interface GetInquiryFormSchemaArgs {
7799
+ pageUrl?: string; // a listing's own url from searchListings, or omit for the homepage form
7800
+ }
7801
+
7802
+ interface AssembleInquiryArgs {
7803
+ pageUrl?: string; // a listing's own url from searchListings pre-fills the form's hidden bookkeeping for that home; omit for a general inquiry
7804
+ firstName: string;
7805
+ lastName: string;
7806
+ email: string;
7807
+ phone: string;
7808
+ cityOfInterest: string; // must be one of getInquiryFormSchema's own options
7809
+ priceRange: string; // must be one of getInquiryFormSchema's own options
7810
+ message?: string;
7811
+ street?: string;
7812
+ city?: string;
7813
+ state?: string;
7814
+ zip?: string;
7815
+ howClose?: string;
7816
+ textOptIn?: boolean;
7817
+ }
7818
+
7819
+ interface AssembledInquiry {
7820
+ valid: boolean;
7821
+ errors: string[];
7822
+ entryUrl: string;
7823
+ formFields: Record<string, string>;
7824
+ summary: string;
7825
+ }
7826
+
7827
+ /**
7828
+ * CBH Homes' own live home-search endpoint (city, price, beds, baths) plus the site's own 'get
7829
+ * in touch about a home' inquiry form — reads the real field schema and assembles a validated,
7830
+ * ready-to-submit inquiry for one listing. Never submits it.
7831
+ */
7832
+ interface Unit {
7833
+ /**
7834
+ * Every home matching a city/price/beds/baths filter, straight off CBH Homes' own home-search
7835
+ * endpoint — address, price, floor plan, community, amenities and days on market.
7836
+ */
7837
+ searchListings(args: SearchListingsArgs): Promise<CbhListing[]>;
7838
+
7839
+ /**
7840
+ * The site's own live 'get in touch about a home' form: every visible field (type,
7841
+ * required-ness, real enumerated City of Interest / Price Range options).
7842
+ */
7843
+ getInquiryFormSchema(args: GetInquiryFormSchemaArgs): Promise<CbhInquiryFormSchema>;
7844
+
7845
+ /**
7846
+ * Validates a caller's inquiry against the form's live schema and maps it onto the site's own
7847
+ * field names, pre-filling a supplied listing's own hidden bookkeeping — ready to submit.
7848
+ * Never submits it.
7849
+ */
7850
+ assembleInquiry(args: AssembleInquiryArgs): Promise<AssembledInquiry>;
7851
+ }
7852
+ }
7853
+
7854
+ declare namespace BowmarkProvider_champxpress {
7855
+ // ── Champion Xpress Carwash — the unit's own declarations, verbatim ──
7856
+ // Champion Xpress's OWN shapes — not a capability contract.
7857
+
7858
+ interface ChampxpressLocation { slug: string; displayName: string; state: string }
7859
+
7860
+ interface ChampxpressPlanQuote {
7861
+ location: ChampxpressLocation;
7862
+ planName: string;
7863
+ price: number;
7864
+ currency: "USD";
7865
+ checkoutUrl: string; // preseeded add-to-cart link; not visited by this provider
7866
+ }
7867
+
7868
+ /**
7869
+ * Reads Champion Xpress Carwash's own live "25 for Life" MVP Unlimited membership picker —
7870
+ * every currently enrolled wash location, and for a chosen one, the real current monthly price
7871
+ * plus a preseeded add-to-cart link — the way the site's own state/location select computes
7872
+ * it, real-time.
7873
+ */
7874
+ interface Unit {
7875
+ /**
7876
+ * Lists every wash location currently enrolled in Champion Xpress's "25 for Life" MVP
7877
+ * Unlimited membership plan, read live off the plan page's own state/location select.
7878
+ */
7879
+ listLocations(): Promise<ChampxpressLocation[]>;
7880
+
7881
+ /**
7882
+ * Runs the site's own price computation for one location — `location` is a free-text name or
7883
+ * slug from `listLocations()`, e.g. "El Paso" or "el-paso-tx-alameda" — and returns the real
7884
+ * current monthly price plus a preseeded add-to-cart URL. THROWS when the location matches
7885
+ * zero or more than one enrolled location, naming the current candidates either way.
7886
+ */
7887
+ getPlanQuote(location: string): Promise<ChampxpressPlanQuote>;
7888
+ }
7889
+ }
7890
+
5838
7891
  declare namespace BowmarkProvider_chantecaille {
5839
7892
  // ── Chantecaille — the unit's own declarations, verbatim ──
5840
7893
  // Chantecaille's OWN shapes — not a capability contract.
@@ -6081,6 +8134,48 @@ interface ChesmarSearchFilters {
6081
8134
  }
6082
8135
  }
6083
8136
 
8137
+ declare namespace BowmarkProvider_chipotle {
8138
+ // ── Chipotle — the unit's own declarations, verbatim ──
8139
+ interface ChipotleCustomization {
8140
+ id: number;
8141
+ name: string;
8142
+ }
8143
+
8144
+ interface ChipotleContentItem {
8145
+ itemId: string;
8146
+ itemName: string;
8147
+ itemType: string;
8148
+ defaultContent: boolean;
8149
+ customizations: ChipotleCustomization[];
8150
+ }
8151
+
8152
+ interface ChipotleBowlOption {
8153
+ itemId: string;
8154
+ itemName: string;
8155
+ primaryFillingName: string | null;
8156
+ contents: ChipotleContentItem[];
8157
+ }
8158
+
8159
+ interface ChipotleBowlBuilderResult {
8160
+ source: string;
8161
+ pricesAvailable: false;
8162
+ proteins: ChipotleBowlOption[];
8163
+ }
8164
+
8165
+ /**
8166
+ * Chipotle's own burrito-bowl builder — every protein with its full rice/beans/salsa/topping
8167
+ * list, straight off the site's ordering API.
8168
+ */
8169
+ interface Unit {
8170
+ /**
8171
+ * Every burrito-bowl protein option and its full rice/beans/salsa/topping build, straight off
8172
+ * chipotle.com's own ordering API. Prices are not in this document (Chipotle prices per
8173
+ * restaurant) — pricesAvailable is always false.
8174
+ */
8175
+ getBowlBuilder(options?: { protein?: string }): Promise<ChipotleBowlBuilderResult>;
8176
+ }
8177
+ }
8178
+
6084
8179
  declare namespace BowmarkProvider_chriscraft {
6085
8180
  // ── Chris-Craft — the unit's own declarations, verbatim ──
6086
8181
  // Chris-Craft's OWN shapes — not a capability contract.
@@ -6356,24 +8451,43 @@ interface ClasspassSearchQuery {
6356
8451
  /** Centre of the search, decimal degrees. */
6357
8452
  lat: number;
6358
8453
  lon: number;
6359
- /** Search radius (default 1, clamped to 1-50). */
8454
+ /** Search radius (default 1, clamped to 1-50); turned into a bounding box —
8455
+ * the origin takes no radius field of its own on this route. */
6360
8456
  radius: number;
6361
8457
  /** "mi" (default) or "km". */
6362
8458
  radiusUnits?: "mi" | "km";
6363
8459
  /** First day, YYYY-MM-DD. Defaults to TODAY (UTC date). */
6364
8460
  date?: string;
6365
- /** Opaque page token from a previous result's `cursor`. */
6366
- cursor?: string;
8461
+ }
8462
+
8463
+ /** One row of a location search — NOT a ClasspassVenue. This endpoint publishes
8464
+ * a smaller, differently-shaped record (no address, no time zone, no
8465
+ * amenities); follow up with getStudio(alias) for the full profile. */
8466
+ interface ClasspassSearchVenue {
8467
+ id: number;
8468
+ alias: string;
8469
+ name: string;
8470
+ /** The qualifier for a chain branch ("South Charlotte"). Absent on most
8471
+ * independent studios in this response — a gap in what the endpoint
8472
+ * publishes, not a parsing miss. */
8473
+ locationName: string | null;
8474
+ description: string | null;
8475
+ activities: string[];
8476
+ /** Null when the site has nothing to show yet. */
8477
+ ratingAverage: number | null;
8478
+ /** The site's OWN display string ("30000+", "3", "0") — never coerced to a
8479
+ * number, since past a threshold the site itself only publishes a floor. */
8480
+ ratingCountDisplay: string | null;
8481
+ latitude: number;
8482
+ longitude: number;
8483
+ /** Largest real photo; ClassPass's shared placeholder is dropped. */
8484
+ photo: string | null;
6367
8485
  }
6368
8486
 
6369
8487
  interface ClasspassSearchResult {
6370
- results: ClasspassVenue[];
6371
- /** Opaque page token. Pass back as `query.cursor`; null when the last page is reached. */
6372
- cursor: string | null;
6373
- /** The origin's own session id — stable across pages of one search. */
8488
+ results: ClasspassSearchVenue[];
8489
+ /** The origin's own session id for this search. */
6374
8490
  searchId: string;
6375
- /** Always null: the origin does not publish a total. */
6376
- totalHits: number | null;
6377
8491
  /** What this function did to the caller's query (defaults applied). */
6378
8492
  warnings: string[];
6379
8493
  }
@@ -6388,24 +8502,21 @@ interface ClasspassSearchResult {
6388
8502
  */
6389
8503
  interface Unit {
6390
8504
  /**
6391
- * ClassPass's own location search — POST lat/lon/radius and read back the venues in range,
6392
- * with their identity, address, coordinates, IANA time zone, the activities the venue teaches,
6393
- * amenities, ratings, distance and the practical details a person needs to decide which to
6394
- * open. `query.lat` and `query.lon` are required (decimal degrees, finite, in range);
6395
- * `query.radius` defaults to 1 and is clamped to 1-50; `query.radiusUnits` is `mi` (default)
6396
- * or `km`; `query.date` is `YYYY-MM-DD` and defaults to TODAY (UTC). Pagination: the response
6397
- * carries `cursor` (the base64 page token) and `searchId`; pass `cursor` back verbatim as
6398
- * `query.cursor` on the next call the body's shape is identical. One call returns up to 50
6399
- * venues; the origin does not publish a total count, so `totalHits` is always `null` and the
6400
- * caller pages until `cursor` is also null. Returns `warnings` whenever the function did
6401
- * anything to the caller's query (radius defaulted, date defaulted) so a caller rendering the
6402
- * result knows exactly what shape their input landed in. Each venue block carries `activities`
6403
- * populated (the search response's `schedules[].venue.activities` is a comma-joined string the
6404
- * parser splits), which `getSchedule`'s venue block does NOT have on a day the studio
6405
- * publishes nothing a real difference, not an inconsistency. **`query` shape today:** only
6406
- * lat/lon/radius/radiusUnits/date/cursor are honored. The help center's rich facets (text
6407
- * search, activity filter, time-of-day, credit-price band, neighbourhood) are DECLARED on
6408
- * `search` but NOT WIRED — see manifest `notImplemented`.
8505
+ * ClassPass's own location search — read back the fitness, wellness AND beauty venues within
8506
+ * `query.radius` of `query.lat`/`query.lon`, with their identity, coordinates, the activities
8507
+ * each teaches, rating, a description and a photo. `query.lat` and `query.lon` are required
8508
+ * (decimal degrees, finite, in range); `query.radius` defaults to 1 and is clamped to 1-50;
8509
+ * `query.radiusUnits` is `mi` (default) or `km`; `query.date` is `YYYY-MM-DD` and defaults to
8510
+ * TODAY (UTC) this function turns lat/lon/radius into a bounding box itself, since the
8511
+ * origin takes no radius field of its own on this route. One call returns EVERY venue inside
8512
+ * that box (226 measured on a 5 mi Charlotte box) there is no pagination and no `cursor`;
8513
+ * ask for a wider radius for more. Returns `warnings` whenever the function did anything to
8514
+ * the caller's query (radius defaulted, date defaulted) so a caller rendering the result knows
8515
+ * exactly what shape their input landed in. Each result is NOT a full profile — no address, no
8516
+ * time zone, no amenities, `ratingCountDisplay` is the site's own capped string ('30000+')
8517
+ * rather than a real count — follow up with `getStudio(alias)` for that. This is the entry
8518
+ * point to essentially everything else in this provider a studio id or class id is not
8519
+ * knowable ahead of a search.
6409
8520
  */
6410
8521
  search(query: ClasspassSearchQuery): Promise<ClasspassSearchResult>;
6411
8522
 
@@ -6451,6 +8562,142 @@ interface ClasspassSearchResult {
6451
8562
  }
6452
8563
  }
6453
8564
 
8565
+ declare namespace BowmarkProvider_claude_com {
8566
+ // ── Claude.ai Docs — the unit's own declarations, verbatim ──
8567
+ interface claude_comDoc {
8568
+ url: string;
8569
+ title: string | null;
8570
+ description: string | null;
8571
+ body: string;
8572
+ }
8573
+ interface claude_comDocLink {
8574
+ title: string;
8575
+ url: string;
8576
+ description: string | null;
8577
+ }
8578
+
8579
+ /**
8580
+ * Reads one page of claude.com's own documentation (claude.com/docs/...) by URL and returns
8581
+ * its title, description and body as clean markdown — the site's own machine-readable .md
8582
+ * source, not a scrape.
8583
+ */
8584
+ interface Unit {
8585
+ /**
8586
+ * Reads one page of claude.com's own documentation by URL or path (e.g.
8587
+ * "/docs/connectors/building/review-criteria" or the full https:// url) and returns its title,
8588
+ * description and body as clean markdown — the site's own .md source with its per-page
8589
+ * navigation boilerplate stripped, not a whole-page scrape. Only /docs pages are covered
8590
+ * (claude.com/pricing is not under /docs and has no .md source). THROWS if the page does not
8591
+ * exist (404) or names a host other than claude.com.
8592
+ */
8593
+ getDoc(url: string): Promise<claude_comDoc>;
8594
+
8595
+ /**
8596
+ * Lists every /docs page claude.com publishes — title, its own .md source url, and a one-line
8597
+ * description — parsed from the site's own /docs/llms.txt index. Scoped to /docs, same as
8598
+ * getDoc; claude.com's root /llms.txt indexes marketing pages with no .md source and is out of
8599
+ * scope for this provider.
8600
+ */
8601
+ listDocPages(): Promise<claude_comDocLink[]>;
8602
+ }
8603
+ }
8604
+
8605
+ declare namespace BowmarkProvider_claude_support {
8606
+ // ── Claude Help Center — the unit's own declarations, verbatim ──
8607
+ interface ClaudeSupportArticle {
8608
+ articleId: string;
8609
+ url: string;
8610
+ title: string;
8611
+ description: string;
8612
+ lastUpdated: string | null;
8613
+ text: string;
8614
+ warnings: string[];
8615
+ }
8616
+ interface ClaudeSupportArticleLink {
8617
+ url: string;
8618
+ articleId: string;
8619
+ slug: string;
8620
+ lastUpdated: string;
8621
+ }
8622
+
8623
+ /**
8624
+ * Claude's own help center (support.claude.com) — reads one article's structured content
8625
+ * (title, description, last-updated date, flattened body text) directly from the page's own
8626
+ * __NEXT_DATA__ payload, given its URL.
8627
+ */
8628
+ interface Unit {
8629
+ /**
8630
+ * Returns one Claude help-center article by its URL — title, description, last-updated date,
8631
+ * and the flattened body text in document order. Covers articles on the Claude Pro or Max
8632
+ * plan, usage and length limits, the connectors directory, and Claude Code seat policy on a
8633
+ * Team or Enterprise plan. THROWS on a missing/invalid/off-site url, on a dead or renamed
8634
+ * article link, and on a transport failure, so a caller can distinguish "no such article" from
8635
+ * "empty".
8636
+ */
8637
+ getArticle(url: string): Promise<ClaudeSupportArticle>;
8638
+
8639
+ /**
8640
+ * Lists every English-language help-center article — its url, numeric articleId and URL slug —
8641
+ * parsed from the site's own /sitemap.xml (no public search endpoint exists, see getArticle's
8642
+ * doc comment). The slug is Intercom's own SEO rendering of the article title, e.g.
8643
+ * "what-is-the-max-plan"; call getArticle(url) for the article's real title field.
8644
+ */
8645
+ listArticles(): Promise<ClaudeSupportArticleLink[]>;
8646
+ }
8647
+ }
8648
+
8649
+ declare namespace BowmarkProvider_claudemarketplaces_com {
8650
+ // ── Claude Marketplaces — the unit's own declarations, verbatim ──
8651
+ interface claudeMarketplacesListing {
8652
+ url: string;
8653
+ kind: string;
8654
+ publisher: string;
8655
+ slug: string;
8656
+ name: string;
8657
+ description: string;
8658
+ applicationCategory: string | null;
8659
+ operatingSystem: string | null;
8660
+ codeRepository: string | null;
8661
+ featureList: string[];
8662
+ price: string | null;
8663
+ priceCurrency: string | null;
8664
+ }
8665
+ interface claudeMarketplacesListingLink {
8666
+ url: string;
8667
+ kind: string;
8668
+ publisher: string;
8669
+ slug: string;
8670
+ lastUpdated: string;
8671
+ }
8672
+
8673
+ /**
8674
+ * A directory of Claude plugin/MCP/skill marketplace listings — fetch one listing's structured
8675
+ * fields (name, description, category, repo, declared tools, price) instead of parsing its
8676
+ * page by hand.
8677
+ */
8678
+ interface Unit {
8679
+ /**
8680
+ * Fetches one MCP server listing page from claudemarketplaces.com — `url` is the listing's
8681
+ * full URL or path, e.g. "https://claudemarketplaces.com/mcp/metroxe/bowmark" or
8682
+ * "/mcp/github/github-mcp-server". Returns the listing's structured fields straight off the
8683
+ * page's own schema.org `SoftwareApplication` record: `name`, `description`,
8684
+ * `applicationCategory`, `operatingSystem`, `codeRepository`, `featureList` (the tool/feature
8685
+ * names the listing declares), and `price`/`priceCurrency`. `publisher`, `kind` and `slug` are
8686
+ * read off the URL path. Only `mcp`-kind listings (`/mcp/<publisher>/<slug>`) are implemented
8687
+ * — `getListing` throws `ClaudeMarketplacesInputError` for any other path shape.
8688
+ */
8689
+ getListing(url: string): Promise<claudeMarketplacesListing>;
8690
+
8691
+ /**
8692
+ * Finds MCP server listings whose publisher or slug matches every word in `query`
8693
+ * (case-insensitive), e.g. "slack" or "github mcp" — parsed from the site's own sitemap index
8694
+ * (no title in the sitemap; call getListing(url) for the listing's real name/description).
8695
+ * Returns at most 50 matches. THROWS ClaudeMarketplacesInputError on an empty query.
8696
+ */
8697
+ searchListings(query: string): Promise<claudeMarketplacesListingLink[]>;
8698
+ }
8699
+ }
8700
+
6454
8701
  declare namespace BowmarkProvider_cleanairlawncare {
6455
8702
  // ── Clean Air Lawn Care — the unit's own declarations, verbatim ──
6456
8703
  interface CleanAirEstimateAvailability {
@@ -6705,6 +8952,43 @@ interface ClubchampionAvailability {
6705
8952
  }
6706
8953
  }
6707
8954
 
8955
+ declare namespace BowmarkProvider_code_claude_com {
8956
+ // ── Claude Code Docs — the unit's own declarations, verbatim ──
8957
+ interface code_claude_comDoc {
8958
+ url: string;
8959
+ title: string | null;
8960
+ description: string | null;
8961
+ body: string;
8962
+ }
8963
+ interface code_claude_comDocLink {
8964
+ title: string;
8965
+ url: string;
8966
+ description: string | null;
8967
+ }
8968
+
8969
+ /**
8970
+ * Reads one page of Claude Code's own documentation site (code.claude.com/docs/...) by URL and
8971
+ * returns its title, description and body as clean markdown — the site's own machine-readable
8972
+ * .md source, not a scrape.
8973
+ */
8974
+ interface Unit {
8975
+ /**
8976
+ * Reads one page of code.claude.com's own documentation by URL or path (e.g.
8977
+ * "/docs/en/amazon-bedrock" or the full https:// url) and returns its title, description and
8978
+ * body as clean markdown — the site's own .md source with its per-page navigation boilerplate
8979
+ * and inline component code stripped, not a whole-page scrape. THROWS if the page does not
8980
+ * exist (404) or names a host other than code.claude.com.
8981
+ */
8982
+ getDoc(url: string): Promise<code_claude_comDoc>;
8983
+
8984
+ /**
8985
+ * Lists every doc page code.claude.com publishes — title, its own .md source url, and a
8986
+ * one-line description — parsed from the site's own /docs/llms.txt index.
8987
+ */
8988
+ listDocPages(): Promise<code_claude_comDocLink[]>;
8989
+ }
8990
+ }
8991
+
6708
8992
  declare namespace BowmarkProvider_consultnet {
6709
8993
  // ── ConsultNet — the unit's own declarations, verbatim ──
6710
8994
  // ConsultNet's OWN shapes — not a capability contract.
@@ -6901,6 +9185,41 @@ interface CultureFlyCheckoutLink {
6901
9185
  }
6902
9186
  }
6903
9187
 
9188
+ declare namespace BowmarkProvider_curiocity {
9189
+ // ── Curiocity — the unit's own declarations, verbatim ──
9190
+ interface CuriocityEvent {
9191
+ title: string; // "Slayyyter – WOR$T GIRL IN THE WORLD TOUR"
9192
+ url: string; // click-through — the event's own link, or the article's
9193
+ when: string | null; // "Thursday, Sept. 3, 2026" — free text, as curiocity writes it
9194
+ time: string | null; // "7 p.m."
9195
+ where: string | null; // "868 Granville St."
9196
+ cost: string | null; // "$650+"
9197
+ articleTitle: string; // the roundup (or single-event) post this came from
9198
+ articleUrl: string;
9199
+ publishedAt: string | null; // the article's own pubDate
9200
+ }
9201
+
9202
+ interface CuriocityListEventsQuery {
9203
+ city: string; // curiocity's own city slug, e.g. "vancouver", "toronto"
9204
+ }
9205
+
9206
+ /**
9207
+ * Curiocity's own city 'things to do' feeds, parsed into individual events — title, when,
9208
+ * time, where, cost and a click-through link — instead of the raw RSS/HTML a caller would
9209
+ * otherwise have to regex apart.
9210
+ */
9211
+ interface Unit {
9212
+ /**
9213
+ * Reads curiocity.com's own 'things to do' feed for one city and returns individual events —
9214
+ * title, when, time, where, cost and a click-through link — parsed out of the site's roundup
9215
+ * posts instead of the raw RSS. `city` is curiocity's own slug (e.g. "vancouver", "toronto").
9216
+ * An empty array is the feed's own answer for a city curiocity does not cover, never invented
9217
+ * here — a block page or a moved endpoint THROWS instead.
9218
+ */
9219
+ listEvents(query: CuriocityListEventsQuery): Promise<CuriocityEvent[]>;
9220
+ }
9221
+ }
9222
+
6904
9223
  declare namespace BowmarkProvider_cyberpowerpc {
6905
9224
  // ── CyberPowerPC — the unit's own declarations, verbatim ──
6906
9225
  interface CyberpowerpcConfigurator {
@@ -7247,6 +9566,119 @@ interface DeckedCabSideOptionResult {
7247
9566
  }
7248
9567
  }
7249
9568
 
9569
+ declare namespace BowmarkProvider_decksdirect {
9570
+ // ── DecksDirect — the unit's own declarations, verbatim ──
9571
+ // DecksDirect's OWN shapes — not a capability contract.
9572
+
9573
+ interface DdProductSummary {
9574
+ urlKey: string; // the key getProduct takes
9575
+ sku: string;
9576
+ name: string;
9577
+ url: string;
9578
+ stockStatus: string; // "IN_STOCK" | "OUT_OF_STOCK"
9579
+ basePrice: number;
9580
+ basePriceFormatted: string; // "$9.96"
9581
+ }
9582
+
9583
+ interface DdOptionChoice { label: string; valueIndex: number }
9584
+
9585
+ interface DdOption {
9586
+ groupLabel: string; // "Pack Size", "Color" — the real group name
9587
+ attributeCode: string;
9588
+ choices: DdOptionChoice[];
9589
+ }
9590
+
9591
+ interface DdVariant {
9592
+ sku: string;
9593
+ stockStatus: string;
9594
+ price: number;
9595
+ priceFormatted: string;
9596
+ selections: Record<string, number>; // attributeCode -> valueIndex
9597
+ }
9598
+
9599
+ interface DdProduct {
9600
+ urlKey: string;
9601
+ sku: string;
9602
+ name: string;
9603
+ url: string;
9604
+ stockStatus: string;
9605
+ basePrice: number;
9606
+ basePriceFormatted: string;
9607
+ options: DdOption[];
9608
+ variants: DdVariant[];
9609
+ }
9610
+
9611
+ interface DdPriceResult {
9612
+ urlKey: string;
9613
+ sku: string;
9614
+ variantSku: string | null; // null until every multi-choice group is picked
9615
+ stockStatus: string | null;
9616
+ price: number | null;
9617
+ priceFormatted: string | null;
9618
+ applied: { group: string; choice: string }[];
9619
+ missingGroups: string[]; // groups with >1 choice and no selection applied
9620
+ unmatched: string[]; // selections that didn't match a real group/choice
9621
+ handoffUrl: string; // the product's entry page
9622
+ }
9623
+
9624
+ interface DdCartHandoff {
9625
+ urlKey: string;
9626
+ sku: string;
9627
+ name: string;
9628
+ url: string; // the product page — DecksDirect publishes no query-param deep link
9629
+ applied: { group: string; choice: string }[];
9630
+ price: number | null;
9631
+ priceFormatted: string | null;
9632
+ stockStatus: string | null;
9633
+ missingGroups: string[];
9634
+ unmatched: string[];
9635
+ }
9636
+
9637
+ /**
9638
+ * DecksDirect's decking/railing catalog — search live inventory, read one product's real
9639
+ * configurable options (pack size, color, size) with each combination's exact price and stock
9640
+ * status, and resolve a specific configuration to its real variant rather than a researched
9641
+ * estimate.
9642
+ */
9643
+ interface Unit {
9644
+ /**
9645
+ * Searches DecksDirect's decking/railing/hardware catalog by free text (e.g. "composite
9646
+ * decking", "deck screws") and returns every match's urlKey, SKU, name, entry URL, stock
9647
+ * status and starting price. The `urlKey` on each row is what getProduct takes.
9648
+ */
9649
+ searchProducts(query: string): Promise<DdProductSummary[]>;
9650
+
9651
+ /**
9652
+ * Reads one product's full configurable-option set (e.g. Pack Size, Color) with each choice's
9653
+ * real label, plus every real buildable variant's exact price and stock status. THROWS on an
9654
+ * unknown urlKey, naming searchProducts() as the way to find current ones.
9655
+ */
9656
+ getProduct(urlKey: string): Promise<DdProduct>;
9657
+
9658
+ /**
9659
+ * Resolves ONE specific configuration — selections keyed by option group (case-insensitive),
9660
+ * e.g. { "Pack Size": "350 pack", "Color": "Havana Gold" } — against the product's live
9661
+ * options and returns the matching variant's real price and stock status, the applied choices,
9662
+ * and the site URL to re-pick the same choices (DecksDirect publishes no shareable URL for a
9663
+ * configured state). `missingGroups` names any option group with more than one choice left
9664
+ * unpicked — price is null until every such group is chosen. `unmatched` names any selection
9665
+ * that did not match a real group or choice, rather than silently mispricing.
9666
+ */
9667
+ priceConfiguration(urlKey: string, selections: Record<string, string>): Promise<DdPriceResult>;
9668
+
9669
+ /**
9670
+ * Turns a configuration into the handoff you give the shopper: DecksDirect's own product page
9671
+ * URL plus the exact choices to click there, since this storefront does not honour a
9672
+ * query-param deep link for a configured state (measured — see the provider's reach note).
9673
+ * Same selections shape as priceConfiguration, and returns the same price, stock status and
9674
+ * applied choices alongside the URL. NOTHING IS CREATED SERVER-SIDE and nothing is bought —
9675
+ * this provider never posts to the site's own add-to-cart endpoint, which requires a
9676
+ * session-bound form key this stateless call does not hold.
9677
+ */
9678
+ addToCart(urlKey: string, selections: Record<string, string>): Promise<DdCartHandoff>;
9679
+ }
9680
+ }
9681
+
7250
9682
  declare namespace BowmarkProvider_developersopenai {
7251
9683
  // ── OpenAI Developer Docs — the unit's own declarations, verbatim ──
7252
9684
  interface DevelopersOpenaiDocPage {
@@ -7275,6 +9707,26 @@ interface DevelopersOpenaiDocPage {
7275
9707
 
7276
9708
  declare namespace BowmarkProvider_dice {
7277
9709
  // ── Dice — the unit's own declarations, verbatim ──
9710
+ interface DiceSearchResult {
9711
+ id: string;
9712
+ title: string;
9713
+ companyName: string;
9714
+ location: string;
9715
+ salary?: string;
9716
+ employmentType: string;
9717
+ workplaceType: string;
9718
+ postedDate: string;
9719
+ isRemote: boolean;
9720
+ willingSponsor: boolean;
9721
+ easyApply: boolean;
9722
+ }
9723
+ interface DiceSearchResponse {
9724
+ jobs: DiceSearchResult[];
9725
+ totalResults: number;
9726
+ currentPage: number;
9727
+ pageCount: number;
9728
+ warnings: string[];
9729
+ }
7278
9730
  interface DiceJobDetails {
7279
9731
  jobId: string;
7280
9732
  description: string;
@@ -7291,6 +9743,14 @@ interface diceRow {
7291
9743
  * posting-detail reads, employer profiles and a company's open roles.
7292
9744
  */
7293
9745
  interface Unit {
9746
+ /**
9747
+ * Searches Dice tech-job database for postings matching the query keyword. Returns job title,
9748
+ * company, location, salary range when published, employment type, workplace type, posting
9749
+ * date, and the job id `getJob` takes for full details. THROWS on a transport failure; an
9750
+ * empty query returns 0 results.
9751
+ */
9752
+ searchJobs(query: string): Promise<DiceSearchResponse>;
9753
+
7294
9754
  /**
7295
9755
  * Returns one Dice posting in full — the HTML description (the same document the consumer page
7296
9756
  * renders) and the normalized skills array — by the job id `searchJobs` returns. THROWS on a
@@ -7837,6 +10297,51 @@ interface DoordashSearchResult {
7837
10297
  }
7838
10298
  }
7839
10299
 
10300
+ declare namespace BowmarkProvider_dumpsters {
10301
+ // ── Dumpsters.com — the unit's own declarations, verbatim ──
10302
+ interface DumpstersGetQuoteArgs {
10303
+ address: string;
10304
+ projectType?: "homeCleanout" | "homeRemodel" | "yardCleanupOrLandscaping" | "bathroomOrKitchenDemo" | "roofingOrSidingTearDown" | "other";
10305
+ debrisType?: Array<"mixedHouseholdTrash" | "constructionDebris" | "yardOrOrganicMaterial" | "heavy">;
10306
+ }
10307
+
10308
+ interface DumpstersSizeQuote {
10309
+ size: string;
10310
+ sellAsSize: string | null;
10311
+ price: string;
10312
+ rentalPeriod: string;
10313
+ rentalPeriodOverageRate: string;
10314
+ tonnageIncluded: string;
10315
+ tonnageOverageRate: string;
10316
+ nextAvailableDate: string;
10317
+ mustCall: boolean;
10318
+ prohibitedItems: string[];
10319
+ }
10320
+
10321
+ interface DumpstersQuoteResult {
10322
+ serviced: boolean;
10323
+ address: { line1: string; city: string; state: string; zip: string; latitude: number; longitude: number };
10324
+ sizes: DumpstersSizeQuote[];
10325
+ checkoutUrl: string;
10326
+ }
10327
+
10328
+ /**
10329
+ * Real per-size roll-off dumpster pricing + next available delivery date for a US address,
10330
+ * straight from Dumpsters.com's own /cart ordering tool — prefer this over general knowledge
10331
+ * when a current, location-specific price is needed.
10332
+ */
10333
+ interface Unit {
10334
+ /**
10335
+ * Real per-size roll-off dumpster prices + next available delivery date for a US address
10336
+ * (`address`, e.g. "25000 Center Ridge Rd, Westlake, OH 44145"), from Dumpsters.com's own
10337
+ * /cart ordering tool. Prefer this over general knowledge when a current, location-specific
10338
+ * price is needed — a model's own training data cannot know today's price or delivery
10339
+ * availability at a given address.
10340
+ */
10341
+ getQuote(args: DumpstersGetQuoteArgs): Promise<DumpstersQuoteResult>;
10342
+ }
10343
+ }
10344
+
7840
10345
  declare namespace BowmarkProvider_ebay {
7841
10346
  // ── eBay — the unit's own declarations, verbatim ──
7842
10347
  interface ebayItem {
@@ -8087,6 +10592,34 @@ interface ErieAgent {
8087
10592
  }
8088
10593
  }
8089
10594
 
10595
+ declare namespace BowmarkProvider_etsy {
10596
+ // ── Etsy — the unit's own declarations, verbatim ──
10597
+ interface etsyListing {
10598
+ listingId: number;
10599
+ title: string;
10600
+ price: number | null;
10601
+ currencyCode: string | null;
10602
+ quantity: number | null;
10603
+ tags: string[];
10604
+ url: string;
10605
+ }
10606
+
10607
+ /**
10608
+ * Etsy's own documented Open API v3 (openapi.etsy.com) — searches active listings on etsy.com
10609
+ * by keyword and returns id, title, price, currency, quantity, tags and the listing's own
10610
+ * etsy.com URL, without scraping etsy.com's search page (which sits behind DataDome).
10611
+ */
10612
+ interface Unit {
10613
+ /**
10614
+ * Searches Etsy's live catalog of active listings by keyword, via Etsy's documented Open API
10615
+ * v3, and returns the matching listings — id, title, price, currency, quantity available, tags
10616
+ * and the listing's own etsy.com URL. `limit` caps the row count (default 10, Etsy's own
10617
+ * ceiling 100). Requires an Etsy developer API key — see this provider's `auth`.
10618
+ */
10619
+ search(args: string | { query: string; limit?: number }): Promise<etsyListing[]>;
10620
+ }
10621
+ }
10622
+
8090
10623
  declare namespace BowmarkProvider_eventsource {
8091
10624
  // ── Event Source — the unit's own declarations, verbatim ──
8092
10625
  interface EventSourceDesign {
@@ -8549,6 +11082,52 @@ interface FirstdibsListing {
8549
11082
  }
8550
11083
  }
8551
11084
 
11085
+ declare namespace BowmarkProvider_fivebelow {
11086
+ // ── Five Below — the unit's own declarations, verbatim ──
11087
+ interface FiveBelowVariant {
11088
+ sku: string | null;
11089
+ style: string | null;
11090
+ price: number | null;
11091
+ inventory: number | null;
11092
+ available: boolean;
11093
+ }
11094
+ interface FiveBelowSearchResult {
11095
+ objectID: string;
11096
+ name: string;
11097
+ url: string;
11098
+ image: string | null;
11099
+ priceMin: number | null;
11100
+ priceMax: number | null;
11101
+ variants: FiveBelowVariant[];
11102
+ inStock: boolean;
11103
+ }
11104
+ interface FiveBelowSearchResults {
11105
+ query: string;
11106
+ page: number;
11107
+ totalMatches: number | null;
11108
+ totalPages: number | null;
11109
+ results: FiveBelowSearchResult[];
11110
+ warnings: string[];
11111
+ }
11112
+
11113
+ /**
11114
+ * Five Below's own product search — title, price(s), image and per-variant DC stock, the way
11115
+ * the site's own search bar answers it.
11116
+ */
11117
+ interface Unit {
11118
+ /**
11119
+ * Searches fivebelow.com's catalog for a keyword and returns matching products — name, URL,
11120
+ * image, price range across variants, per-variant SKU/style/price/DC-2022 stock, and whether
11121
+ * any variant is available — in the site's own relevance order. An empty `results` array is a
11122
+ * real answer meaning the site found nothing for this query. `query` is REQUIRED and REFUSES
11123
+ * an empty string — it is not a store-wide browse. If the caller only named the store and gave
11124
+ * no product, category or keyword, ask them what to search for; do not call this with an empty
11125
+ * or guessed query to see what comes back.
11126
+ */
11127
+ search(args: { query: string, limit?: number, page?: number }): Promise<FiveBelowSearchResults>;
11128
+ }
11129
+ }
11130
+
8552
11131
  declare namespace BowmarkProvider_fivestarbathsolutions {
8553
11132
  // ── Five Star Bath Solutions — the unit's own declarations, verbatim ──
8554
11133
  interface FivestarLocation {
@@ -9323,11 +11902,17 @@ interface fredObservations {
9323
11902
  /**
9324
11903
  * Browses FRED's category tree the way fred.stlouisfed.org/categories does — the category
9325
11904
  * itself (id/name/parent), its immediate child categories, and the series filed directly under
9326
- * it (the same shape getSeriesInfo returns per series, so a caller can read
9327
- * units/frequency/lastUpdated off a browsed result with no second call). Called bare it starts
9328
- * at the root (id 0). FRED organizes its ~800,000 series into a real hierarchy, so this is how
9329
- * a caller explores 'what's available in this area' before knowing a series id to look up
9330
- * directly. An unknown category id comes back as a caller-fixable error.
11905
+ * it, each carrying the same full metadata getSeriesInfo returns (units, frequency, seasonal
11906
+ * adjustment, observation range, last updated) so a caller can read them straight off a
11907
+ * browsed result with no second call. Series come back MOST POPULAR FIRST, which is FRED's own
11908
+ * ordering for a category. Called bare it starts at the root (id 0). FRED organizes its
11909
+ * ~800,000 series into a real hierarchy (e.g. Money, Banking & Finance > Interest Rates >
11910
+ * Treasury Constant Maturity), so this is how a caller explores 'what's available in this
11911
+ * area' before knowing a series id to look up directly. `seriesTotal` is FRED's own count for
11912
+ * the category and `seriesTruncated` says whether you got all of it: FRED's listing serves at
11913
+ * most 1,500 series per category, so the handful of enormous ones (Housing is 54,800) come
11914
+ * back as the most popular 1,500 and say so. An unknown category id comes back as a
11915
+ * caller-fixable error.
9331
11916
  */
9332
11917
  browseCategory(categoryId?: number): Promise<fredCategory>;
9333
11918
  }
@@ -9441,6 +12026,78 @@ interface G2Product {
9441
12026
  }
9442
12027
  }
9443
12028
 
12029
+ declare namespace BowmarkProvider_gasbuddy {
12030
+ // ── GasBuddy — the unit's own declarations, verbatim ──
12031
+ interface GasbuddyFindCheapestNearbyArgs {
12032
+ zip: string; // a 5-digit US ZIP code, e.g. "78701"
12033
+ limit?: number; // default 10, clamped to [1, 30]
12034
+ }
12035
+
12036
+ interface GasbuddyStation {
12037
+ brand: string;
12038
+ address: string; // "<street>, <city>, <state>"
12039
+ price: number | null; // real, current regular-gas price; null if no recent report
12040
+ reportedAgo: string | null; // e.g. "2 Hours Ago", or null alongside a null price
12041
+ url: string; // this exact station's own GasBuddy URL
12042
+ }
12043
+
12044
+ /**
12045
+ * GasBuddy's real, crowdsourced per-station gas prices — runs the site's own ZIP-radius search
12046
+ * and returns currently-reported stations (brand, address, regular-gas price, how long ago it
12047
+ * was reported) sorted cheapest first.
12048
+ */
12049
+ interface Unit {
12050
+ /**
12051
+ * Runs GasBuddy's own ZIP-radius station search and returns real, currently-reported stations
12052
+ * (brand, address, regular-gas price, when it was reported), sorted cheapest first. Read-only.
12053
+ */
12054
+ findCheapestNearby(args: GasbuddyFindCheapestNearbyArgs): Promise<GasbuddyStation[]>;
12055
+ }
12056
+ }
12057
+
12058
+ declare namespace BowmarkProvider_gazelle {
12059
+ // ── Gazelle — the unit's own declarations, verbatim ──
12060
+ interface GazelleDevice {
12061
+ name: string; // "iPhone 14 Pro" — what a person would say
12062
+ brand: string; // gazelle's own brand segment, e.g. "iphone"
12063
+ model: string; // gazelle's own model slug, e.g. "iphone-14-pro"
12064
+ url: string; // the device's trade-in page
12065
+ }
12066
+ interface GazelleQuoteResult {
12067
+ deviceUrl: string;
12068
+ product: { id: string; name: string };
12069
+ selections: { capacity: string | null; carrier: string | null; condition: string | null };
12070
+ estimatedValue: number;
12071
+ expirationDate: string | null;
12072
+ }
12073
+
12074
+ /**
12075
+ * gazelle.com's own current trade-in offer for a device, for a chosen
12076
+ * capacity/carrier/condition — read off the same bootstrap JSON and pricing endpoint the
12077
+ * site's own offer page uses, instead of parsing prose off the rendered page.
12078
+ */
12079
+ interface Unit {
12080
+ /**
12081
+ * Every device gazelle.com takes in trade, off gazelle's own sitemap — name, brand, model slug
12082
+ * and the device's trade-in page URL. A query narrows it by words ("iphone 14", "ipad pro"),
12083
+ * shortest name first; no query at all returns the whole catalog. This is how a caller who
12084
+ * only knows what the device is CALLED gets the URL getTradeInQuote takes.
12085
+ */
12086
+ findDevices(query?: string): Promise<GazelleDevice[]>;
12087
+
12088
+ /**
12089
+ * Reads gazelle.com's own current trade-in offer for a device, for the given
12090
+ * capacity/carrier/condition (each matched against that device's own option labels, e.g.
12091
+ * condition: "Good"). `device` is either the device's NAME ("iPhone 14 Pro", resolved against
12092
+ * gazelle's own catalog) or its gazelle.com page URL. Capacity/carrier left out uses the
12093
+ * catalog's own default listing (carrier prefers "Unlocked"); condition left out uses the
12094
+ * offer page's own default answer. THROWS if a selection names an option this device does not
12095
+ * offer, or if no device matches the name.
12096
+ */
12097
+ getTradeInQuote(device: string, selections?: { capacity?: string; carrier?: string; condition?: string }): Promise<GazelleQuoteResult>;
12098
+ }
12099
+ }
12100
+
9444
12101
  declare namespace BowmarkProvider_geico {
9445
12102
  // ── GEICO — the unit's own declarations, verbatim ──
9446
12103
  interface geicoRow {
@@ -9859,6 +12516,57 @@ interface GithubListReleasesResult {
9859
12516
  }
9860
12517
  }
9861
12518
 
12519
+ declare namespace BowmarkProvider_glama {
12520
+ // ── Glama — the unit's own declarations, verbatim ──
12521
+ interface GlamaListedServer {
12522
+ namespace: string;
12523
+ slug: string;
12524
+ name: string;
12525
+ title: string;
12526
+ description: string | null;
12527
+ githubRepositoryFullName: string | null;
12528
+ githubStargazersCount: number | null;
12529
+ npmPackageName: string | null;
12530
+ toolCount: number;
12531
+ url: string;
12532
+ }
12533
+ interface GlamaRemoteServer {
12534
+ name: string;
12535
+ namespace: string;
12536
+ slug: string;
12537
+ title: string;
12538
+ description: string | null;
12539
+ githubRepositoryFullName: string | null;
12540
+ githubStargazersCount: number | null;
12541
+ healthy: boolean | null;
12542
+ url: string;
12543
+ }
12544
+ interface GlamaSearchResult {
12545
+ servers: GlamaListedServer[];
12546
+ remoteServers: GlamaRemoteServer[];
12547
+ hasMoreServers: boolean;
12548
+ warnings: string[];
12549
+ }
12550
+
12551
+ /**
12552
+ * Glama's own MCP server directory search, keyless — reads its React Router loader route
12553
+ * directly. Built: search returns matching rows from both Glama's indexed catalogue and its
12554
+ * live federated registry query, each with namespace, slug, description, GitHub repo/stars and
12555
+ * a health signal where reported.
12556
+ */
12557
+ interface Unit {
12558
+ /**
12559
+ * Searches Glama's MCP server directory. `servers` is Glama's own indexed catalogue (a query
12560
+ * that matches nothing there returns an empty array — a legitimate answer, not a throw);
12561
+ * `remoteServers` is a live federated query against known MCP registries and is where a server
12562
+ * not yet indexed by Glama itself, like a fresh entry in the official MCP registry, shows up
12563
+ * first. `hasMoreServers` is true when `servers` has a further page beyond the ~20 rows
12564
+ * returned. THROWS on a non-2xx response (e.g. rate limiting).
12565
+ */
12566
+ search(query: string): Promise<GlamaSearchResult>;
12567
+ }
12568
+ }
12569
+
9862
12570
  declare namespace BowmarkProvider_glassesusa {
9863
12571
  // ── GlassesUSA — the unit's own declarations, verbatim ──
9864
12572
  interface GlassesusaProduct {
@@ -9873,11 +12581,23 @@ interface GlassesusaProduct {
9873
12581
  prescriptionEligible: boolean; // orderable with prescription lenses
9874
12582
  }
9875
12583
 
12584
+ interface GlassesusaSearchResult {
12585
+ url: string;
12586
+ title: string;
12587
+ price: number;
12588
+ }
12589
+
9876
12590
  /**
9877
12591
  * GlassesUSA's own Virtual Try-On + prescription-checkout flow — getProduct reads one frame's
9878
12592
  * real live price, star rating, VTO availability and Rx eligibility off its own product page.
9879
12593
  */
9880
12594
  interface Unit {
12595
+ /**
12596
+ * Runs GlassesUSA's own search/brand-filter and returns matching frames with their live
12597
+ * selling prices. Returns up to 100 results (one grid page).
12598
+ */
12599
+ search(query: string): Promise<GlassesusaSearchResult[]>;
12600
+
9881
12601
  /**
9882
12602
  * Reads one GlassesUSA product page — real live price (plus the crossed-out 'was' price when
9883
12603
  * on sale), star rating and review count, whether Virtual Try-On is offered, and whether the
@@ -10232,6 +12952,11 @@ interface graingerStockRow {
10232
12952
 
10233
12953
  declare namespace BowmarkProvider_grandwelcome {
10234
12954
  // ── Grand Welcome — the unit's own declarations, verbatim ──
12955
+ interface GrandwelcomeDestination {
12956
+ slug: string;
12957
+ label: string;
12958
+ url: string;
12959
+ }
10235
12960
  interface GrandwelcomeRentalRow {
10236
12961
  rentalId: string;
10237
12962
  name: string;
@@ -10271,6 +12996,14 @@ type GrandwelcomeQuote =
10271
12996
  * price, not a stale catalog.
10272
12997
  */
10273
12998
  interface Unit {
12999
+ /**
13000
+ * The entry door: reads the site's own /sitemap.xml for every published destination page and
13001
+ * returns each one's slug (the exact vocabulary searchRentals takes) with a human-readable
13002
+ * label derived from it — e.g. { slug: "california-sea-ranch", label: "California Sea Ranch"
13003
+ * }.
13004
+ */
13005
+ listGrandwelcomeDestinations(): Promise<GrandwelcomeDestination[]>;
13006
+
10274
13007
  /**
10275
13008
  * Runs Grand Welcome's own destination search (a market slug like "california-sea-ranch", from
10276
13009
  * a rental's own page or the destination directory), optionally filtered to a bedroom count,
@@ -11713,6 +14446,69 @@ interface HobieLocalAvailability {
11713
14446
  }
11714
14447
  }
11715
14448
 
14449
+ declare namespace BowmarkProvider_hodjapasha {
14450
+ // ── Hodjapasha Culture Center — Istanbul whirling-dervish and dance show ticketing — the unit's own declarations, verbatim ──
14451
+ interface HodjapashaListingEntry {
14452
+ productId: string;
14453
+ title: string;
14454
+ summary: string | null;
14455
+ duration: string | null;
14456
+ priceFrom: string | null; // the site's own "from" price, e.g. "$42.22"
14457
+ currency: string | null;
14458
+ url: string;
14459
+ }
14460
+ interface HodjapashaShowDetail {
14461
+ productId: string;
14462
+ title: string;
14463
+ description: string | null; // the site's own description paragraphs, joined
14464
+ duration: string | null;
14465
+ location: string | null;
14466
+ productCode: string | null;
14467
+ priceFrom: string | null;
14468
+ currency: string | null;
14469
+ url: string;
14470
+ }
14471
+ interface HodjapashaSession {
14472
+ sessionId: string;
14473
+ label: string; // e.g. "20:30 - Available"
14474
+ }
14475
+ interface HodjapashaAvailability {
14476
+ productId: string;
14477
+ date: string; // YYYY-MM-DD, as queried
14478
+ available: boolean;
14479
+ sessions: HodjapashaSession[];
14480
+ totalPrice: string | null; // e.g. "1900"
14481
+ currency: string | null;
14482
+ }
14483
+
14484
+ /**
14485
+ * The Hodjapasha Culture Center's own Rezdy booking widget for its whirling-dervish (Sema) and
14486
+ * Ottoman/folk dance shows in Istanbul — show list, per-show pricing and description, and
14487
+ * date/party-size availability with session times and total price, read straight off the
14488
+ * widget's own pages.
14489
+ */
14490
+ interface Unit {
14491
+ /**
14492
+ * Reads every show hodjapasha.com's own booking widget lists off /widget/index.php — title,
14493
+ * productId, from-price, duration.
14494
+ */
14495
+ listShows(): Promise<HodjapashaListingEntry[]>;
14496
+
14497
+ /**
14498
+ * Reads one show's full description, adult/child pricing, location and duration off its own
14499
+ * /widget/product-detail.php page.
14500
+ */
14501
+ getShow(productId: string): Promise<HodjapashaShowDetail>;
14502
+
14503
+ /**
14504
+ * Checks the widget's own availability endpoint for a show, YYYY-MM-DD date and party size
14505
+ * (defaults: 1 adult, 0 children), returning the session time(s) offered and the total price,
14506
+ * or `available: false` for a date the show does not run.
14507
+ */
14508
+ getAvailability(productId: string, date: string, opts?: { adults?: number; children?: number }): Promise<HodjapashaAvailability>;
14509
+ }
14510
+ }
14511
+
11716
14512
  declare namespace BowmarkProvider_holidaybuilders {
11717
14513
  // ── Holiday Builders — the unit's own declarations, verbatim ──
11718
14514
  // Holiday Builders' OWN shapes — not a capability contract.
@@ -11778,6 +14574,42 @@ interface HolidaybuildersSearchFilters {
11778
14574
  }
11779
14575
  }
11780
14576
 
14577
+ declare namespace BowmarkProvider_hottopic {
14578
+ // ── Hot Topic — the unit's own declarations, verbatim ──
14579
+ interface HottopicOffer {
14580
+ sku: string
14581
+ color: string | null
14582
+ size: string | null
14583
+ price: number | null
14584
+ currency: string | null
14585
+ availability: string | null // the site's own schema.org availability URL
14586
+ url: string
14587
+ }
14588
+ interface HottopicProduct {
14589
+ name: string
14590
+ url: string
14591
+ image: string | null
14592
+ offers: HottopicOffer[]
14593
+ }
14594
+ interface HottopicSearchResult {
14595
+ products: HottopicProduct[]
14596
+ }
14597
+
14598
+ /**
14599
+ * Hot Topic's own storefront search (hottopic.com) — licensed pop-culture and entertainment
14600
+ * merch (apparel, figures, accessories) across every property the store carries, read straight
14601
+ * off the site's own structured search-result data.
14602
+ */
14603
+ interface Unit {
14604
+ /**
14605
+ * Searches hottopic.com's own storefront for a keyword and returns the real, priced product
14606
+ * results (name, image, per-SKU price/color/size/availability) exactly as the site's own
14607
+ * search page carries them.
14608
+ */
14609
+ search(arg: { query: string }): Promise<HottopicSearchResult>;
14610
+ }
14611
+ }
14612
+
11781
14613
  declare namespace BowmarkProvider_hunter {
11782
14614
  // ── Hunter — the unit's own declarations, verbatim ──
11783
14615
  interface hunterDomainCandidate {
@@ -14160,6 +16992,14 @@ interface LegacyHomesalAvailability {
14160
16992
  slots: LegacyHomesalTimeSlot[];
14161
16993
  bookingUrl: string;
14162
16994
  }
16995
+ interface LegacyHomesalCommunity {
16996
+ name: string;
16997
+ aliases: string[];
16998
+ area: string | null;
16999
+ status: string | null;
17000
+ repSlug: string;
17001
+ bookingUrl: string;
17002
+ }
14163
17003
 
14164
17004
  /**
14165
17005
  * Reads a Legacy Homes AL community sales rep's real open tour-appointment slots off HubSpot
@@ -14172,6 +17012,13 @@ interface LegacyHomesalAvailability {
14172
17012
  * widget reads, not a form that goes into a queue.
14173
17013
  */
14174
17014
  getAvailability(repSlug: string): Promise<LegacyHomesalAvailability>;
17015
+
17016
+ /**
17017
+ * Lists every Legacy Homes AL community (name, area, sales status) paired with the rep slug
17018
+ * getAvailability needs — the entry door for a caller who only knows a community's name, not a
17019
+ * HubSpot booking link.
17020
+ */
17021
+ listCommunities(): Promise<LegacyHomesalCommunity[]>;
14175
17022
  }
14176
17023
  }
14177
17024
 
@@ -14616,6 +17463,11 @@ interface LittleWordsProjectCatalogueRow {
14616
17463
  inStock: boolean;
14617
17464
  images: string[];
14618
17465
  }
17466
+ interface LittleWordsProjectCollectionRow {
17467
+ handle: string;
17468
+ title: string;
17469
+ productsCount: number;
17470
+ }
14619
17471
  interface LittleWordsProjectCheckoutLink {
14620
17472
  url: string;
14621
17473
  variant: LittleWordsProjectVariant;
@@ -14629,6 +17481,13 @@ interface LittleWordsProjectCheckoutLink {
14629
17481
  * handoff link carrying the word.
14630
17482
  */
14631
17483
  interface Unit {
17484
+ /**
17485
+ * The entry door: reads the storefront's own published collection index — e.g. "Custom", "Best
17486
+ * Sellers" — with each one's handle and product count, so a caller holding only what a shopper
17487
+ * would say can find the handle listLittleWordsProjectProducts takes.
17488
+ */
17489
+ listLittleWordsProjectCollections(opts?: { limit?: number }): Promise<LittleWordsProjectCollectionRow[]>;
17490
+
14632
17491
  /**
14633
17492
  * Reads a Little Words Project collection's live products — e.g. "custom", "best-sellers" —
14634
17493
  * with handle, title, price range and stock.
@@ -14654,6 +17513,42 @@ interface LittleWordsProjectCheckoutLink {
14654
17513
  }
14655
17514
  }
14656
17515
 
17516
+ declare namespace BowmarkProvider_lmstudio {
17517
+ // ── LM Studio — the unit's own declarations, verbatim ──
17518
+ interface lmstudioDoc {
17519
+ url: string;
17520
+ title: string;
17521
+ body: string;
17522
+ }
17523
+ interface lmstudioDocPage {
17524
+ url: string;
17525
+ slug: string;
17526
+ }
17527
+
17528
+ /**
17529
+ * LM Studio's own documentation site (lmstudio.ai/docs) — fetch one page's title and body
17530
+ * straight off its machine-readable `.md` export, instead of parsing the rendered page by
17531
+ * hand.
17532
+ */
17533
+ interface Unit {
17534
+ /**
17535
+ * Fetches one lmstudio.ai documentation page — `url` is the page's full URL or path, e.g.
17536
+ * "https://lmstudio.ai/docs/app/mcp/deeplink" or "/docs/app/plugins/mcp". Returns its
17537
+ * canonical `url`, its `title` (the page's own `<title>` tag), and its `body` as Markdown —
17538
+ * the site's own machine-readable `.md` export of that page, not raw HTML. Only `/docs/...`
17539
+ * pages are implemented — `getDoc` throws `LmstudioInputError` for any other path.
17540
+ */
17541
+ getDoc(url: string): Promise<lmstudioDoc>;
17542
+
17543
+ /**
17544
+ * Lists every documentation page lmstudio.ai publishes under /docs — url and the page's own
17545
+ * URL slug — parsed from the site's own /docs/sitemap.xml. The sitemap carries no title; call
17546
+ * getDoc(url) for the page's real <title>.
17547
+ */
17548
+ listDocPages(): Promise<lmstudioDocPage[]>;
17549
+ }
17550
+ }
17551
+
14657
17552
  declare namespace BowmarkProvider_lonelyplanet {
14658
17553
  // ── Lonely Planet — the unit's own declarations, verbatim ──
14659
17554
  interface LonelyPlanetSearchResult {
@@ -15347,6 +18242,15 @@ interface marketplaceExtensionStats {
15347
18242
  averageRating: number | null;
15348
18243
  ratingCount: number;
15349
18244
  }
18245
+ interface marketplaceSearchResult {
18246
+ extensionId: string;
18247
+ displayName: string;
18248
+ publisherDisplayName: string;
18249
+ shortDescription: string;
18250
+ installCount: number;
18251
+ averageRating: number | null;
18252
+ ratingCount: number;
18253
+ }
15350
18254
 
15351
18255
  /**
15352
18256
  * The VS Code Marketplace — look up one extension by its publisher.name id and get its install
@@ -15362,6 +18266,15 @@ interface marketplaceExtensionStats {
15362
18266
  * published extension.
15363
18267
  */
15364
18268
  getExtensionStats(extensionId: string): Promise<marketplaceExtensionStats>;
18269
+
18270
+ /**
18271
+ * Full-text searches the VS Code Marketplace for extensions matching `query` (e.g. "python
18272
+ * linting" or "vim keybindings") — the same search the Marketplace's own search box runs — and
18273
+ * returns up to 20 results ordered by install count, most popular first. Each result carries
18274
+ * the "publisher.name" id to pass to getExtensionStats() for the latest version and
18275
+ * last-updated date.
18276
+ */
18277
+ searchExtensions(query: string): Promise<marketplaceSearchResult[]>;
15365
18278
  }
15366
18279
  }
15367
18280
 
@@ -15550,6 +18463,41 @@ interface mcpRegistryEntry {
15550
18463
  }
15551
18464
  }
15552
18465
 
18466
+ declare namespace BowmarkProvider_mcp_so {
18467
+ // ── MCP.so — the unit's own declarations, verbatim ──
18468
+ interface McpSoListing {
18469
+ slug: string;
18470
+ name: string;
18471
+ description: string;
18472
+ category: string | null;
18473
+ author: string | null;
18474
+ url: string;
18475
+ imageUrl: string | null;
18476
+ }
18477
+ interface McpSoSearchResult {
18478
+ results: McpSoListing[];
18479
+ warnings: string[];
18480
+ }
18481
+
18482
+ /**
18483
+ * The mcp.so directory of published MCP servers — substring-search listings by slug/name and
18484
+ * get each match's title, description, category, publisher and page url.
18485
+ */
18486
+ interface Unit {
18487
+ /**
18488
+ * Searches the mcp.so directory of published MCP servers. `query` is matched as a
18489
+ * case-insensitive substring against each listing's mcp.so SLUG (e.g. "firecrawl" matches
18490
+ * `mcp.so/servers/firecrawl-firecrawl` and `mcp.so/servers/firecrawl`) — not a full-text
18491
+ * search of descriptions. `limit` caps how many matches are fetched and returned (default 10,
18492
+ * max 25 — each one costs a separate request to that listing's own page). Returns `{ results,
18493
+ * warnings }`: each result carries mcp.so's own name, description, category, publisher and
18494
+ * page url for that listing, read from the page's own structured data; `warnings` names any
18495
+ * sitemap or detail page this call could not reach, and is empty on a fully healthy call.
18496
+ */
18497
+ search(query: string, limit?: number): Promise<McpSoSearchResult>;
18498
+ }
18499
+ }
18500
+
15553
18501
  declare namespace BowmarkProvider_medicalguardian {
15554
18502
  // ── Medical Guardian — the unit's own declarations, verbatim ──
15555
18503
  // Medical Guardian's OWN shapes — not a capability contract.
@@ -16492,6 +19440,58 @@ interface StoreShelfRoster {
16492
19440
  }
16493
19441
  }
16494
19442
 
19443
+ declare namespace BowmarkProvider_millisaraylar {
19444
+ // ── millisaraylar.gov.tr — Türkiye Presidential Administration of National Palaces — the unit's own declarations, verbatim ──
19445
+ interface MillisaraylarPalace {
19446
+ id: string;
19447
+ name: string;
19448
+ url: string;
19449
+ }
19450
+ interface MillisaraylarVisitingHours {
19451
+ name: string;
19452
+ closedDays: string | null; // the site's own text, e.g. "Tuesday"
19453
+ ticketOfficeOpeningTime: string | null; // "HH:MM"
19454
+ ticketOfficeClosingTime: string | null; // "HH:MM"
19455
+ url: string;
19456
+ }
19457
+ interface MillisaraylarTicketPrices {
19458
+ name: string;
19459
+ currency: "TRY";
19460
+ domestic: number | null;
19461
+ domesticStudent: number | null;
19462
+ foreign: number | null;
19463
+ url: string;
19464
+ }
19465
+
19466
+ /**
19467
+ * Türkiye's Presidential Administration of National Palaces — the palace/kiosk/pavilion list,
19468
+ * closed days and ticket-office hours, and domestic/domestic-student/foreign ticket prices for
19469
+ * Topkapi Palace, Dolmabahçe Palace, Yıldız Palace, Beylerbeyi Palace and the other sites it
19470
+ * administers, read straight off the site's own ticket-purchase and detail pages.
19471
+ */
19472
+ interface Unit {
19473
+ /**
19474
+ * Reads the full palace/kiosk/pavilion/museum/factory list off millisaraylar.gov.tr's own site
19475
+ * navigation.
19476
+ */
19477
+ getPalaces(): Promise<MillisaraylarPalace[]>;
19478
+
19479
+ /**
19480
+ * Matches `query` against `getPalaces()`'s own listing (a substring match on the site's own
19481
+ * display name, e.g. "Topkapi" or "Dolmabahce") and reads that site's closed day(s) and
19482
+ * ticket-office opening/closing hours off its detail page.
19483
+ */
19484
+ getVisitingHours(query: string): Promise<MillisaraylarVisitingHours>;
19485
+
19486
+ /**
19487
+ * Matches `query` against millisaraylar.gov.tr's own ticket-purchase location list (a narrower
19488
+ * set than `getPalaces` — only what is sold as a standalone ticket) and reads the domestic,
19489
+ * domestic-student and foreign prices (TRY) the site itself quotes.
19490
+ */
19491
+ getTicketPrices(query: string): Promise<MillisaraylarTicketPrices>;
19492
+ }
19493
+ }
19494
+
16495
19495
  declare namespace BowmarkProvider_minimax {
16496
19496
  // ── MiniMax — the unit's own declarations, verbatim ──
16497
19497
  interface MinimaxDocIndexEntry {
@@ -17394,6 +20394,14 @@ interface NbfCartHandoff {
17394
20394
 
17395
20395
  declare namespace BowmarkProvider_newageproducts {
17396
20396
  // ── NewAge Products — the unit's own declarations, verbatim ──
20397
+ interface NewageproductsSearchResult {
20398
+ handle: string;
20399
+ name: string;
20400
+ price: string;
20401
+ priceCa: string | null;
20402
+ active: boolean;
20403
+ imageUrl: string | null;
20404
+ }
17397
20405
  interface NewageproductsVariant {
17398
20406
  /** The store's own SKU — the only stable per-variant identifier this site publishes. */
17399
20407
  sku: string;
@@ -17434,6 +20442,14 @@ interface NewageproductsProduct {
17434
20442
  * site's own reliable soft-404 shape).
17435
20443
  */
17436
20444
  getNewageproductsProduct(handle: string): Promise<NewageproductsProduct>;
20445
+
20446
+ /**
20447
+ * Runs NewAge Products' own header-search box for a keyword (e.g. "garage cabinet", "outdoor
20448
+ * kitchen") and returns up to 5 ranked matches — each row's `handle` feeds
20449
+ * getNewageproductsProduct directly. Returns an empty array for no match, which is a real
20450
+ * result, not a failure.
20451
+ */
20452
+ searchNewageproductsCatalog(query: string): Promise<NewageproductsSearchResult[]>;
17437
20453
  }
17438
20454
  }
17439
20455
 
@@ -18182,6 +21198,62 @@ interface TearsheetUrl {
18182
21198
  }
18183
21199
  }
18184
21200
 
21201
+ declare namespace BowmarkProvider_pilotprotocol {
21202
+ // ── Pilot Protocol App Store — the unit's own declarations, verbatim ──
21203
+ interface PilotprotocolAppSummary {
21204
+ id: string;
21205
+ name: string;
21206
+ vendor: string;
21207
+ category: string;
21208
+ tagline: string;
21209
+ platforms: string;
21210
+ }
21211
+
21212
+ interface PilotprotocolMethod {
21213
+ name: string;
21214
+ summary: string;
21215
+ }
21216
+
21217
+ interface PilotprotocolAppDetail {
21218
+ id: string;
21219
+ name: string;
21220
+ vendor: string;
21221
+ vendorUrl: string | null;
21222
+ tagline: string;
21223
+ description: string;
21224
+ category: string;
21225
+ version: string;
21226
+ license: string | null;
21227
+ runtime: string | null;
21228
+ minPilotVersion: string | null;
21229
+ sourceUrl: string | null;
21230
+ installCommand: string | null;
21231
+ permissions: string[];
21232
+ methods: PilotprotocolMethod[];
21233
+ }
21234
+
21235
+ /**
21236
+ * Pilot Protocol's own app store — a directory of installable agent capabilities (30+ apps:
21237
+ * databases, comms, browser automation, payments, …). listApps returns the whole catalog (id,
21238
+ * name, vendor, category, tagline); getApp reads one app's detail page (version, license,
21239
+ * runtime, permissions, methods) by id.
21240
+ */
21241
+ interface Unit {
21242
+ /**
21243
+ * Lists every app in Pilot Protocol's app store — id, name, vendor, category, one-line tagline
21244
+ * and supported platforms for each.
21245
+ */
21246
+ listApps(): Promise<PilotprotocolAppSummary[]>;
21247
+
21248
+ /**
21249
+ * Reads one app's detail page by id (e.g. "io.pilot.bowmark", from listApps) — vendor,
21250
+ * tagline, full description, category, version, license, runtime, minimum Pilot version,
21251
+ * source link, install command, granted permissions and its method list.
21252
+ */
21253
+ getApp(id: string): Promise<PilotprotocolAppDetail>;
21254
+ }
21255
+ }
21256
+
18185
21257
  declare namespace BowmarkProvider_pirateship {
18186
21258
  // ── Pirate Ship — the unit's own declarations, verbatim ──
18187
21259
  interface PirateshipDimensions {
@@ -18546,6 +21618,42 @@ interface PizzahutDealsForRender {
18546
21618
  }
18547
21619
  }
18548
21620
 
21621
+ declare namespace BowmarkProvider_platform_claude_com {
21622
+ // ── Claude Developer Platform Docs — the unit's own declarations, verbatim ──
21623
+ interface platform_claude_comDoc {
21624
+ url: string;
21625
+ title: string | null;
21626
+ description: string | null;
21627
+ body: string;
21628
+ }
21629
+ interface platform_claude_comDocLink {
21630
+ title: string;
21631
+ url: string;
21632
+ description: string | null;
21633
+ }
21634
+
21635
+ /**
21636
+ * Reads platform.claude.com's own developer documentation — one /docs page by URL, or the full
21637
+ * page index — as clean markdown, the site's own machine-readable source rather than a scrape.
21638
+ */
21639
+ interface Unit {
21640
+ /**
21641
+ * Reads one /docs page of platform.claude.com's own documentation by URL or path (e.g.
21642
+ * "/docs/en/about-claude/pricing" or the full https:// url) and returns its title, description
21643
+ * and body as clean markdown — the site's own .md source, not a whole-page scrape. THROWS if
21644
+ * the page does not exist (404) or names a host other than platform.claude.com.
21645
+ */
21646
+ getDocPage(url: string): Promise<platform_claude_comDoc>;
21647
+
21648
+ /**
21649
+ * Lists every English /docs page platform.claude.com publishes — title, its own .md source
21650
+ * url, and a one-line description where the site gives one — parsed from the site's own
21651
+ * /llms.txt index.
21652
+ */
21653
+ listDocPages(): Promise<platform_claude_comDocLink[]>;
21654
+ }
21655
+ }
21656
+
18549
21657
  declare namespace BowmarkProvider_poshmark {
18550
21658
  // ── Poshmark — the unit's own declarations, verbatim ──
18551
21659
  interface PoshmarkSupportArticle {
@@ -20073,6 +23181,21 @@ interface RoofmaxxCostEstimate {
20073
23181
  }
20074
23182
  }
20075
23183
 
23184
+ declare namespace BowmarkProvider_rover {
23185
+ // ── Rover.com — the unit's own declarations, verbatim ──
23186
+ interface RoverBoardingRow { name: string; profileUrl: string; ratingValue: number | null; reviewCount: number | null; repeatClientCount: number | null; startingNightlyRate: { amount: number; currency: string }; location: string | null; distanceMi: number | null; }
23187
+
23188
+ /** Rover's live overnight-boarding sitter search for a city and specific dates. */
23189
+ interface Unit {
23190
+ /**
23191
+ * Searches Rover's live overnight-boarding results for a city and increasing ISO start/end
23192
+ * dates. Returns each sitter's starting per-night rate for that stay (before Rover's ~10-11%
23193
+ * service fee and before per-pet pricing), rating, review count and distance.
23194
+ */
23195
+ searchBoarding(args: { location: string; startDate: string; endDate: string }): Promise<RoverBoardingRow[]>;
23196
+ }
23197
+ }
23198
+
20076
23199
  declare namespace BowmarkProvider_rvshare {
20077
23200
  // ── RVshare — the unit's own declarations, verbatim ──
20078
23201
  interface RvshareListing {
@@ -20173,6 +23296,45 @@ interface SaatvaRecommendation {
20173
23296
  }
20174
23297
  }
20175
23298
 
23299
+ declare namespace BowmarkProvider_safetywing {
23300
+ // ── SafetyWing — the unit's own declarations, verbatim ──
23301
+ type Plan = "essential" | "complete";
23302
+ type Addon = "sportsCoverage" | "usaCoverage" | "itemInsurance";
23303
+ interface GetSafetywingQuoteArgs {
23304
+ plan: Plan;
23305
+ age: number;
23306
+ startDate: string;
23307
+ durationWeeks: 4 | 52;
23308
+ addons?: Addon[];
23309
+ }
23310
+ interface safetywingQuote {
23311
+ plan: Plan;
23312
+ age: number;
23313
+ startDate: string;
23314
+ durationWeeks: 4 | 52;
23315
+ priceDaily: { amount: number; currency: string };
23316
+ priceTotal: { amount: number; currency: string };
23317
+ priceMonthly: { amount: number; currency: string } | null;
23318
+ priceYearly: { amount: number; currency: string } | null;
23319
+ addonPrices: Array<{ addon: Addon; priceDaily: { amount: number; currency: string }; priceTotal: { amount: number; currency: string } }>;
23320
+ purchaseUrl: string;
23321
+ }
23322
+
23323
+ /**
23324
+ * Runs SafetyWing's own Nomad Insurance quote calculator for a real plan/age/date/addon
23325
+ * combination and returns the live price.
23326
+ */
23327
+ interface Unit {
23328
+ /**
23329
+ * Runs SafetyWing's own Nomad Insurance quote calculator (safetywing.com/nomad-insurance) for
23330
+ * a real plan, age, coverage start date, duration and add-on selection, and returns the live
23331
+ * computed price with a per-addon breakdown, plus SafetyWing's own signup/purchase handoff URL
23332
+ * for the priced product.
23333
+ */
23334
+ getQuote(args: GetSafetywingQuoteArgs): Promise<safetywingQuote>;
23335
+ }
23336
+ }
23337
+
20176
23338
  declare namespace BowmarkProvider_saltandstone {
20177
23339
  // ── Salt & Stone — the unit's own declarations, verbatim ──
20178
23340
  // Salt & Stone's OWN shapes — not a capability contract.
@@ -21144,6 +24306,18 @@ interface SmitherySearchResult {
21144
24306
 
21145
24307
  declare namespace BowmarkProvider_solostove {
21146
24308
  // ── Solo Stove — the unit's own declarations, verbatim ──
24309
+ interface SolostoveBundleSummary {
24310
+ bundleId: string;
24311
+ name: string;
24312
+ price: number;
24313
+ currency: string;
24314
+ orderable: boolean;
24315
+ }
24316
+ interface SolostoveBundleSearch {
24317
+ query: string;
24318
+ bundles: SolostoveBundleSummary[];
24319
+ total: number;
24320
+ }
21147
24321
  interface SolostoveBundleComponent {
21148
24322
  sku: string;
21149
24323
  name: string;
@@ -21162,21 +24336,32 @@ interface SolostoveBundleCheck {
21162
24336
  }
21163
24337
 
21164
24338
  /**
21165
- * Solo Stove's bundle-builder check flow — given a bundle's own product id (fire pit +
21166
- * accessories, e.g. the Dream Backyard Bundle), returns the combined price and whether the
21167
- * exact combination is orderable right now, broken down per component so a caller can see
21168
- * WHICH piece is out of stock when it is not.
24339
+ * Solo Stove's bundle-builder check flow — search bundles by what a shopper would type (e.g.
24340
+ * "pizza bundle"), then check one bundle's own product id (fire pit + accessories, e.g. the
24341
+ * Dream Backyard Bundle) for its combined price and whether the exact combination is orderable
24342
+ * right now, broken down per component so a caller can see WHICH piece is out of stock when it
24343
+ * is not.
21169
24344
  */
21170
24345
  interface Unit {
24346
+ /**
24347
+ * Searches Solo Stove's own storefront search for BUNDLE products (fire pit + accessories sold
24348
+ * as one combination) by what a shopper would type, e.g. "pizza bundle" or "Dream Backyard".
24349
+ * Returns each match's own bundleId — feed it straight into checkBundle. Filters out
24350
+ * non-bundle products the same search also matches (a single-SKU product that happens to be
24351
+ * named "…Bundle" is not this site's bundle TYPE). An unmatched query returns an empty list,
24352
+ * not an error.
24353
+ */
24354
+ listBundles(query: string): Promise<SolostoveBundleSearch>;
24355
+
21171
24356
  /**
21172
24357
  * Checks one Solo Stove bundle (fire pit + accessories, e.g. the Dream Backyard Bundle) by its
21173
- * own product id — the `+`-joined component SKUs from the bundle's product page URL. Returns
21174
- * the combined price and whether the site will sell the EXACT combination right now, plus a
21175
- * per-component breakdown (each component's own price and stock) so a caller can see which
21176
- * single component made the bundle unorderable. THROWS when the bundle id does not exist. If
21177
- * you don't already have a bundle id, use the Dream Backyard Bundle's —
21178
- * "SS27+SS22+WINDCHILL30-CHARCOAL-17AH" — to check the flow rather than asking the caller for
21179
- * one first.
24358
+ * own product id — the `+`-joined component SKUs from the bundle's product page URL, or a
24359
+ * bundleId from listBundles. Returns the combined price and whether the site will sell the
24360
+ * EXACT combination right now, plus a per-component breakdown (each component's own price and
24361
+ * stock) so a caller can see which single component made the bundle unorderable. THROWS when
24362
+ * the bundle id does not exist. If you don't already have a bundle id, use listBundles to find
24363
+ * one, or the Dream Backyard Bundle's — "SS27+SS22+WINDCHILL30-CHARCOAL-17AH" — to check the
24364
+ * flow rather than asking the caller for one first.
21180
24365
  */
21181
24366
  checkBundle(args: { bundleId: string }): Promise<SolostoveBundleCheck>;
21182
24367
  }
@@ -21263,6 +24448,62 @@ interface ScPlaylist {
21263
24448
  }
21264
24449
  }
21265
24450
 
24451
+ declare namespace BowmarkProvider_spirithalloween {
24452
+ // ── Spirit Halloween — the unit's own declarations, verbatim ──
24453
+ interface SpiritHalloweenSearchResult {
24454
+ productId: string
24455
+ sku: string
24456
+ name: string
24457
+ url: string
24458
+ image: string | null
24459
+ price: number | null
24460
+ currency: "USD"
24461
+ listedSize: string | null // the ONE size this listing row is indexed under
24462
+ listedSizeStock: number | null // that size's stock only — not the full range
24463
+ }
24464
+ interface SpiritHalloweenSearchResults {
24465
+ query: string
24466
+ category: string
24467
+ results: SpiritHalloweenSearchResult[]
24468
+ totalMatches: number | null
24469
+ }
24470
+ interface SpiritHalloweenSizeVariant {
24471
+ color: string
24472
+ size: string // the site's own size label, e.g. "CHILD MEDIUM"
24473
+ price: number
24474
+ inStock: boolean
24475
+ shipStockQuantity: number
24476
+ variantId: string
24477
+ }
24478
+ interface SpiritHalloweenProduct {
24479
+ productId: string
24480
+ name: string
24481
+ url: string
24482
+ sizes: SpiritHalloweenSizeVariant[] // every real color/size combination, each with its own live stock
24483
+ }
24484
+
24485
+ /**
24486
+ * The licensed Halloween costume specialist — category browse and per-size, per-color live
24487
+ * stock for the lines it carries (today: KPop Demon Hunters).
24488
+ */
24489
+ interface Unit {
24490
+ /**
24491
+ * Browses Spirit Halloween's category listing for a query resolved against a small internal
24492
+ * directory of mapped categories (today: "KPop Demon Hunters" and its characters — rumi, mira,
24493
+ * zoey, saja) — NOT a general free-text site search, which was probed 2026-09-01 and does not
24494
+ * render results server-side. Each result row carries only its OWN listed size's stock; call
24495
+ * getProduct for the full per-size breakdown.
24496
+ */
24497
+ search(args: { query: string; limit?: number }): Promise<SpiritHalloweenSearchResults>;
24498
+
24499
+ /**
24500
+ * Reads one product page's full live size/color matrix — every real variant this product sells
24501
+ * in, each with its own price and in-stock signal — for a product URL returned by search.
24502
+ */
24503
+ getProduct(args: { url: string }): Promise<SpiritHalloweenProduct>;
24504
+ }
24505
+ }
24506
+
21266
24507
  declare namespace BowmarkProvider_starlighthomes {
21267
24508
  // ── Starlight Homes — the unit's own declarations, verbatim ──
21268
24509
  // Starlight Homes' OWN shapes — not a capability contract.
@@ -22296,7 +25537,7 @@ interface TherabodyRecommendation {
22296
25537
 
22297
25538
  /**
22298
25539
  * Filters the live catalogue by what a shopper actually needs — device family, audience, and
22299
- * the features named (percussion, recovery, hot/cold, breath). Returns the matching products
25540
+ * the features named (percussive, recovery, massage, vibration). Returns the matching products
22300
25541
  * with their real prices, ranked by in-stock first. The storefront does not publish a query or
22301
25542
  * filter endpoint, so the function is local filtering on the catalogue listTheragunProducts
22302
25543
  * already returns — the divide is what the function does with the data, not how it gets there.
@@ -22662,6 +25903,7 @@ interface thezebraAutoDriver {
22662
25903
  ageFirstLicensed?: number // default 16 when omitted
22663
25904
  violations?: { accidents: number, claims: number, tickets: number } // default a clean record
22664
25905
  occupation?: string // default "OTHER" — the only two confirmed-valid values are "OTHER" and "ENGINEER"
25906
+ residenceOwnership?: 0 | 1 | 2 | 3 // own home/condo/rent/other; default 3 ("Other")
22665
25907
  }
22666
25908
 
22667
25909
  interface thezebraAutoVehicle {
@@ -22676,6 +25918,8 @@ interface thezebraAutoQuotesQuery {
22676
25918
  state: string // 2-letter postal code
22677
25919
  zip: string // 5 digits
22678
25920
  county: string // the county the ZIP sits in — the gateway validates server-side
25921
+ currentlyInsured?: boolean // default true
25922
+ userPurchaseTimeframe?: "TODAY" | "FUTURE" // default "TODAY"
22679
25923
  }
22680
25924
 
22681
25925
  interface thezebraAutoQuote {
@@ -22877,23 +26121,43 @@ interface thezebraAutoQuotes {
22877
26121
  * carrier's own monthly and six-month premium, deductible, and the coverage it priced, as The
22878
26122
  * Zebra's auto quote funnel prices them. This is a priced offer for the person asking, NOT the
22879
26123
  * published averages `getStateRates` and its siblings return. Pass `driver` (`firstName`,
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
26124
+ * `lastName`, `dob` ISO YYYY-MM-DD, `email`, a real `employment` and `currentCarrier` —
26125
+ * REQUIRED, see their own doc comments, never invented, same rule as a quote identity — and
26126
+ * optionally
26127
+ * `ageFirstLicensed`/`violations`/`occupation`/`residenceOwnership`/`creditScore`/`education`/`hasMilitaryAffiliation`/`insuredLength`,
26128
+ * each defaulting to a clean-record, non-committal placeholder when omitted), one `vehicle`
26129
+ * (`year`, `make`, `model`, and a real `garagingAddress` REQUIRED, never invented, same rule
26130
+ * as a quote identity a model The Zebra does not rate THROWS naming the URL it tried), the
26131
+ * 2-letter `state`, a 5-digit `zip`, `county` (the county the ZIP sits in — The Zebra
26132
+ * validates it server-side and a missing or wrong county is bounced), and optionally
26133
+ * `userPurchaseTimeframe`/`currentBodilyInjuryPerPerson`/`currentBodilyInjuryPerAccident`
26134
+ * (`currentlyInsured` defaults `true` and `false` is refused — see its own doc comment).
26135
+ * **Measured 2026-09-05: `driver.employment` and `driver.currentCarrier` are REQUIRED because
26136
+ * the funnel's own `/car/manual/drivers/details/` page will not complete without a real answer
26137
+ * to both, and neither has an honest default** a call omitting either now throws immediately
26138
+ * rather than discovering the same dead end after a full, ~60-90s funnel walk. **The write
26139
+ * always binds** the GraphQL gateway at `graphql-gateway.production.thezebra.com` accepts
26140
+ * the seed and returns 200. **AS OF 2026-09-05 all six of the funnel's pages are answered and
26141
+ * the results route is REACHED** — the last gate was never a missing mutation field:
26142
+ * `/car/manual/coverage-selection/` computes personalized coverage packages on a THIRD backend
26143
+ * (`coverage-service.production.thezebra.com`) and only unlocks the redirect once its own
26144
+ * "Show quotes at this coverage" button PATCHes a chosen package, which this function now
26145
+ * drives (the "Best" tier — the site's own recommended default). See the write site's own
26146
+ * comment for the measured chain. **A separate, unresolved question**: with the funnel fully
26147
+ * answered, the results page itself sometimes renders a legitimate-looking "we checked with
26148
+ * over 30 insurers and were unable to get any quotes for you … most insurance companies aren't
26149
+ * selling new policies in your area due to temporary restrictions" state instead of quote
26150
+ * cards — reproduced on two (address, zip, county) pairs 200 miles apart with the same
26151
+ * placeholder identity, so it does not look address-specific. Whether that is genuine carrier
26152
+ * unavailability or a soft decline on this function's synthetic/proxied traffic is not yet
26153
+ * determined; `agents/richard/problems/thezebra-getautoquotes-broken.md` carries the evidence.
26154
+ * This function does NOT throw on that state — an empty `quotes` array is what it looks like,
26155
+ * and `parseAutoResults` already treats a page with no `results-card_q2b_*` elements as a
26156
+ * legitimate empty answer rather than an error, which is the correct call for a genuine
26157
+ * carrier-side "nothing to quote" as well as this one. The function throws only when the
26158
+ * funnel itself refuses to reach the coverage-selection or results routes, with a message
26159
+ * naming the redirect target and, where readable, the funnel's own list of which pages are
26160
+ * still unanswered. **`advertisedCarriers` is not a quote list and must never be read as
22897
26161
  * one**: the results page would carry paid carrier placements alongside real offers, separated
22898
26162
  * by `data-cy="results-card_ad_<carrier>"` (ad) versus `data-cy="results-card_q2b_<carrier>"`
22899
26163
  * (real offer), and the advertised names are returned in their own field with no price
@@ -23112,12 +26376,30 @@ interface topviewtixPackageDetails {
23112
26376
  availableUntil: string | null;
23113
26377
  }
23114
26378
 
26379
+ interface topviewtixPackageSummary {
26380
+ id: number;
26381
+ slug: string;
26382
+ name: string;
26383
+ adultsPrice: number | null;
26384
+ kidsPrice: number | null;
26385
+ url: string;
26386
+ }
26387
+
23115
26388
  /**
23116
26389
  * TopView's NYC hop-on-hop-off bus, Statue of Liberty cruise and bike/walking tour packages —
23117
26390
  * getPackageDetails reads one package's live price and its own real-time booking calendar
23118
26391
  * (available/blocked/sold-out dates) off topviewtix.com/new-york/<slug>.
23119
26392
  */
23120
26393
  interface Unit {
26394
+ /**
26395
+ * Lists every TopView tour package currently sold in New York — id, name, slug, adult/kid
26396
+ * price and url — straight off the same package-card grid the site's own home page renders.
26397
+ * The natural entry point before getPackageDetails: a caller who only knows what a person
26398
+ * would SAY ("the hop on hop off bus", "a downtown tour") reads this first and picks the
26399
+ * `slug` to look one up in full.
26400
+ */
26401
+ listPackages(): Promise<topviewtixPackageSummary[]>;
26402
+
23121
26403
  /**
23122
26404
  * Reads one TopView tour package in full — name, description, adult/kid price, and the site's
23123
26405
  * OWN live booking calendar (which dates are open, blocked, or sold out, and how far out the
@@ -23442,6 +26724,63 @@ type TwiddyQuote =
23442
26724
  }
23443
26725
  }
23444
26726
 
26727
+ declare namespace BowmarkProvider_uhc_smallbusiness {
26728
+ // ── UnitedHealthcare Small Business — the unit's own declarations, verbatim ──
26729
+ interface UhcSmallbusinessPlan {
26730
+ planCode: string;
26731
+ planName: string;
26732
+ fullName: string;
26733
+ planMarketType: "LEVEL_FUNDED" | "FULLY_INSURED";
26734
+ metalLevel: string | null;
26735
+ planType: string | null;
26736
+ legalEntity: string | null;
26737
+ perEmployeeMonthlyPremium: number;
26738
+ totalMonthlyPremium: number;
26739
+ deductibleIndividual: string | null;
26740
+ deductibleFamily: string | null;
26741
+ outOfPocketIndividual: string | null;
26742
+ outOfPocketFamily: string | null;
26743
+ primaryCareVisit: string | null;
26744
+ findYourDoctorUrl: string | null;
26745
+ }
26746
+
26747
+ interface UhcSmallbusinessQuote {
26748
+ zip: string;
26749
+ state: string;
26750
+ county: string;
26751
+ effectiveDate: string;
26752
+ employerContributionShare: number;
26753
+ plans: UhcSmallbusinessPlan[];
26754
+ warnings: string[];
26755
+ }
26756
+
26757
+ /**
26758
+ * UnitedHealthcare's small-business store — real level-funded and fully-insured group health
26759
+ * plan premiums for a ZIP and employee count, no sign-in required.
26760
+ */
26761
+ interface Unit {
26762
+ /**
26763
+ * Real level-funded and fully-insured small-group health plan premiums for a ZIP code and
26764
+ * employee count — the same 'Explore Top Selling <State> Plans' list smallbusiness.uhc.com
26765
+ * shows after its anonymous 'Shop Plans' form, no sign-in, no agent contact and no
26766
+ * email-verification round-trip required. Each of the ~20 returned plans carries UHC's own
26767
+ * plan code, market type (level-funded vs. fully-insured), metal tier where ACA-rated,
26768
+ * deductible, out-of-pocket max, primary-care copay and a per-employee AND a total-group
26769
+ * monthly premium. **The premium is UHC's own estimate for a 40-year-old male** — its page
26770
+ * says so in as many words ('The prices provided are estimates based on all employees being
26771
+ * 40-year-old males') — because pricing a real census (each employee's actual age and sex)
26772
+ * requires the multi-step 'Get Plan Recommendations' questionnaire this function does not
26773
+ * walk; a caller wanting THAT number has to go further than an anonymous ZIP-in quote-out read
26774
+ * allows. This is still the number a business owner sees as their first real quote, and it is
26775
+ * the number the small-group renewal story (14% median 2027 hike) is about. Takes a 5-digit
26776
+ * ZIP and a positive employee count; the site rejects neither with an error page, but a ZIP
26777
+ * with no small-group market (rural, out of UHC's book) can come back with an empty `plans`
26778
+ * array, and that is a real answer, not a failure.
26779
+ */
26780
+ getGroupHealthQuote(zip: string, employeeCount: number): Promise<UhcSmallbusinessQuote>;
26781
+ }
26782
+ }
26783
+
23445
26784
  declare namespace BowmarkProvider_ulrichlifestyle {
23446
26785
  // ── Ulrich Lifestyle Structures — the unit's own declarations, verbatim ──
23447
26786
  // Ulrich Lifestyle Structures' OWN shapes — not a capability contract.
@@ -24089,6 +27428,43 @@ interface VoluspaQuizIntro {
24089
27428
  }
24090
27429
  }
24091
27430
 
27431
+ declare namespace BowmarkProvider_vscode {
27432
+ // ── VS Code Documentation — the unit's own declarations, verbatim ──
27433
+ interface VscodeDoc {
27434
+ url: string;
27435
+ title: string;
27436
+ description: string;
27437
+ text: string;
27438
+ warnings: string[];
27439
+ }
27440
+ interface VscodeDocLink {
27441
+ title: string;
27442
+ url: string;
27443
+ description: string | null;
27444
+ }
27445
+
27446
+ /**
27447
+ * VS Code's own documentation site (code.visualstudio.com) — reads one doc page's structured
27448
+ * content (title, description, flattened body text) directly from its server-rendered HTML,
27449
+ * given its URL, or lists every doc page it publishes.
27450
+ */
27451
+ interface Unit {
27452
+ /**
27453
+ * Returns one code.visualstudio.com doc page by its URL — title, description, and the
27454
+ * flattened body text in document order. THROWS on a missing/invalid/off-site url and on a
27455
+ * transport failure, so a caller can distinguish "unreachable" from "empty".
27456
+ */
27457
+ getDoc(url: string): Promise<VscodeDoc>;
27458
+
27459
+ /**
27460
+ * Lists every doc page code.visualstudio.com publishes — title, its own page url, and a
27461
+ * one-line description where the site gives one — parsed from the site's own /llms.txt index.
27462
+ * Every url returned is one getDoc() can read.
27463
+ */
27464
+ listDocPages(): Promise<VscodeDocLink[]>;
27465
+ }
27466
+ }
27467
+
24092
27468
  declare namespace BowmarkProvider_walkerhughes {
24093
27469
  // ── WalkerHughes Insurance — the unit's own declarations, verbatim ──
24094
27470
  // WalkerHughes' OWN shapes — not a capability contract.
@@ -24486,6 +27862,98 @@ interface XpressWaitTime {
24486
27862
  }
24487
27863
  }
24488
27864
 
27865
+ declare namespace BowmarkProvider_ycombinator {
27866
+ // ── Y Combinator — the unit's own declarations, verbatim ──
27867
+ interface YCombinatorArticle {
27868
+ id: number | null;
27869
+ slug: string;
27870
+ title: string;
27871
+ author: string | null;
27872
+ description: string;
27873
+ content: string;
27874
+ categories: string[];
27875
+ youtubeId: string | null;
27876
+ transcript: string | null;
27877
+ url: string;
27878
+ warnings: string[];
27879
+ }
27880
+ interface YCombinatorBlogPost {
27881
+ title: string;
27882
+ author: string | null;
27883
+ publishedAt: string | null;
27884
+ text: string;
27885
+ url: string;
27886
+ warnings: string[];
27887
+ }
27888
+ interface YCombinatorSearchHit {
27889
+ title: string;
27890
+ url: string;
27891
+ category: string | null;
27892
+ excerpt: string;
27893
+ }
27894
+
27895
+ /**
27896
+ * Y Combinator's own site (ycombinator.com) — reads one Startup Library article or blog post
27897
+ * by its URL/slug (application and interview guidance, fundraising, pitching, growth), and
27898
+ * full-text searches the library with the site's own public search key.
27899
+ */
27900
+ interface Unit {
27901
+ /**
27902
+ * Returns one YC Startup Library article by its /library/<slug> URL or bare slug — title,
27903
+ * author, description, markdown content, categories, and (for a video talk) the YouTube id and
27904
+ * transcript. Covers application and interview guidance, pitching, fundraising and growth.
27905
+ * THROWS on a missing/invalid/off-site url and on a dead or renamed slug, so a caller can
27906
+ * distinguish "no such article" from "empty". Example: getArticle("6h-startup-pricing-101").
27907
+ */
27908
+ getArticle(url: string): Promise<YCombinatorArticle>;
27909
+
27910
+ /**
27911
+ * Returns one YC blog post by its /blog/<slug>/ URL or bare slug — title, author, publish
27912
+ * date, and the flattened body text in document order. THROWS on a missing/invalid/off-site
27913
+ * url and on a dead or renamed slug. Example: getBlogPost("tips-for-yc-interviews").
27914
+ */
27915
+ getBlogPost(url: string): Promise<YCombinatorBlogPost>;
27916
+
27917
+ /**
27918
+ * Full-text searches the YC Startup Library using the site's own public search key — title,
27919
+ * url, category breadcrumb and a body excerpt per hit, up to 10. Returns an empty array on
27920
+ * zero matches; THROWS on an empty query or a transport failure. Example: search("how to pitch
27921
+ * your startup").
27922
+ */
27923
+ search(query: string): Promise<YCombinatorSearchHit[]>;
27924
+ }
27925
+ }
27926
+
27927
+ declare namespace BowmarkProvider_yelp {
27928
+ // ── Yelp — the unit's own declarations, verbatim ──
27929
+ interface YelpSearchArgs {
27930
+ term: string; // e.g. "ramen" — Yelp's own find_desc
27931
+ location: string; // e.g. "Philadelphia, PA" — Yelp's own find_loc
27932
+ limit?: number; // default 10, clamped to [1, 30]
27933
+ }
27934
+
27935
+ interface YelpSearchResult {
27936
+ name: string;
27937
+ url: string;
27938
+ rating: number | null;
27939
+ reviewCount: number | null;
27940
+ priceRange: string | null; // "$".."$$$$", or null
27941
+ neighborhood: string | null;
27942
+ }
27943
+
27944
+ /**
27945
+ * Yelp's own business search — returns real, currently-listed businesses for a search term and
27946
+ * location with Yelp's own star rating, review count, price tier and neighborhood.
27947
+ */
27948
+ interface Unit {
27949
+ /**
27950
+ * Runs Yelp's own business search for a term and location and returns real, currently-listed
27951
+ * businesses with Yelp's own rating, review count, price tier and neighborhood. Read-only.
27952
+ */
27953
+ search(args: YelpSearchArgs): Promise<YelpSearchResult[]>;
27954
+ }
27955
+ }
27956
+
24489
27957
  declare namespace BowmarkProvider_yorkwallcoverings {
24490
27958
  // ── York Wallcoverings — the unit's own declarations, verbatim ──
24491
27959
  interface YorkWallcoveringsSearchResult {
@@ -24624,6 +28092,21 @@ interface YoutubeTranscript {
24624
28092
 
24625
28093
  declare namespace BowmarkProvider_zennioptical {
24626
28094
  // ── Zenni Optical — the unit's own declarations, verbatim ──
28095
+ interface ZenniFrameSummary {
28096
+ sku: string;
28097
+ name: string;
28098
+ color: string;
28099
+ price: number;
28100
+ salePrice: number;
28101
+ inStock: boolean;
28102
+ shape: string | null;
28103
+ material: string | null;
28104
+ url: string;
28105
+ }
28106
+ interface ZenniFrameSearch {
28107
+ frames: ZenniFrameSummary[];
28108
+ total: number;
28109
+ }
24627
28110
  interface ZenniFrame {
24628
28111
  sku: string;
24629
28112
  name: string;
@@ -24655,6 +28138,13 @@ interface ZenniLensPriceRow {
24655
28138
  * site's own configurator, and checks live per-SKU stock.
24656
28139
  */
24657
28140
  interface Unit {
28141
+ /**
28142
+ * Searches Zenni's own storefront catalog for what a shopper would type ("round tortoise",
28143
+ * "titanium rimless") and returns matching frames with the sku every other function here
28144
+ * takes. The way in when you don't already hold a sku.
28145
+ */
28146
+ searchFrames(query: string, limit?: number): Promise<ZenniFrameSearch>;
28147
+
24658
28148
  /**
24659
28149
  * Reads one frame's name, base price and per-color-variant price straight off the product
24660
28150
  * page's own embedded data. No rendering.
@@ -25493,71 +28983,111 @@ interface BowmarkProviders {
25493
28983
  aa: BowmarkProvider_aa.Unit;
25494
28984
  aauto: BowmarkProvider_aauto.Unit;
25495
28985
  abercrombie: BowmarkProvider_abercrombie.Unit;
28986
+ achosahw: BowmarkProvider_achosahw.Unit;
28987
+ acqualinaresort: BowmarkProvider_acqualinaresort.Unit;
25496
28988
  aiper: BowmarkProvider_aiper.Unit;
25497
28989
  ajmadison: BowmarkProvider_ajmadison.Unit;
25498
28990
  allied: BowmarkProvider_allied.Unit;
25499
28991
  alphavantage: BowmarkProvider_alphavantage.Unit;
28992
+ americandreamvacations: BowmarkProvider_americandreamvacations.Unit;
25500
28993
  americanstandard: BowmarkProvider_americanstandard.Unit;
28994
+ americanvisionwindows: BowmarkProvider_americanvisionwindows.Unit;
25501
28995
  amramp: BowmarkProvider_amramp.Unit;
25502
28996
  ancientnutrition: BowmarkProvider_ancientnutrition.Unit;
25503
28997
  andersenwindows: BowmarkProvider_andersenwindows.Unit;
28998
+ andstr: BowmarkProvider_andstr.Unit;
28999
+ anthropic_com: BowmarkProvider_anthropic_com.Unit;
29000
+ antunes: BowmarkProvider_antunes.Unit;
29001
+ aosom: BowmarkProvider_aosom.Unit;
25504
29002
  apple: BowmarkProvider_apple.Unit;
25505
29003
  aquaphoenixsci: BowmarkProvider_aquaphoenixsci.Unit;
29004
+ arajet: BowmarkProvider_arajet.Unit;
25506
29005
  archipelago: BowmarkProvider_archipelago.Unit;
29006
+ artpix3d: BowmarkProvider_artpix3d.Unit;
25507
29007
  ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
25508
29008
  asppoolco: BowmarkProvider_asppoolco.Unit;
25509
29009
  atlasoceanvoyages: BowmarkProvider_atlasoceanvoyages.Unit;
25510
29010
  atlasseniorliving: BowmarkProvider_atlasseniorliving.Unit;
29011
+ audibel: BowmarkProvider_audibel.Unit;
25511
29012
  autocamp: BowmarkProvider_autocamp.Unit;
25512
29013
  avantstay: BowmarkProvider_avantstay.Unit;
25513
29014
  avis: BowmarkProvider_avis.Unit;
29015
+ ayreshotels: BowmarkProvider_ayreshotels.Unit;
25514
29016
  azazie: BowmarkProvider_azazie.Unit;
25515
29017
  azure: BowmarkProvider_azure.Unit;
29018
+ bankmycell: BowmarkProvider_bankmycell.Unit;
25516
29019
  barletta: BowmarkProvider_barletta.Unit;
29020
+ barnesfoundation: BowmarkProvider_barnesfoundation.Unit;
25517
29021
  baublebar: BowmarkProvider_baublebar.Unit;
25518
29022
  bcparkscamping: BowmarkProvider_bcparkscamping.Unit;
25519
29023
  beatthebomb: BowmarkProvider_beatthebomb.Unit;
29024
+ bellwethercoffee: BowmarkProvider_bellwethercoffee.Unit;
29025
+ beltservice: BowmarkProvider_beltservice.Unit;
29026
+ benelliusa: BowmarkProvider_benelliusa.Unit;
25520
29027
  bennington: BowmarkProvider_bennington.Unit;
25521
29028
  bestbuy: BowmarkProvider_bestbuy.Unit;
25522
29029
  bhphoto: BowmarkProvider_bhphoto.Unit;
29030
+ bigairusa: BowmarkProvider_bigairusa.Unit;
25523
29031
  bigjoeforklifts: BowmarkProvider_bigjoeforklifts.Unit;
25524
29032
  bigrentz: BowmarkProvider_bigrentz.Unit;
25525
29033
  bing: BowmarkProvider_bing.Unit;
29034
+ bishops: BowmarkProvider_bishops.Unit;
25526
29035
  blackstoneproducts: BowmarkProvider_blackstoneproducts.Unit;
25527
29036
  blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
25528
29037
  bluehaven: BowmarkProvider_bluehaven.Unit;
25529
29038
  bluesignal: BowmarkProvider_bluesignal.Unit;
25530
29039
  bmwusa: BowmarkProvider_bmwusa.Unit;
29040
+ boglewinery: BowmarkProvider_boglewinery.Unit;
25531
29041
  bollandbranch: BowmarkProvider_bollandbranch.Unit;
29042
+ borsheims: BowmarkProvider_borsheims.Unit;
29043
+ boxlunch: BowmarkProvider_boxlunch.Unit;
25532
29044
  boydsleep: BowmarkProvider_boydsleep.Unit;
29045
+ brius: BowmarkProvider_brius.Unit;
25533
29046
  brixton: BowmarkProvider_brixton.Unit;
25534
29047
  bulletproof: BowmarkProvider_bulletproof.Unit;
29048
+ bungalow: BowmarkProvider_bungalow.Unit;
25535
29049
  bykoket: BowmarkProvider_bykoket.Unit;
25536
29050
  byltbasics: BowmarkProvider_byltbasics.Unit;
29051
+ cabinsforyou: BowmarkProvider_cabinsforyou.Unit;
29052
+ caliberhealth: BowmarkProvider_caliberhealth.Unit;
25537
29053
  califloors: BowmarkProvider_califloors.Unit;
25538
29054
  camelcamelcamel: BowmarkProvider_camelcamelcamel.Unit;
25539
29055
  cancer: BowmarkProvider_cancer.Unit;
25540
29056
  capitalbrands: BowmarkProvider_capitalbrands.Unit;
25541
29057
  caraway: BowmarkProvider_caraway.Unit;
25542
29058
  carepatrol: BowmarkProvider_carepatrol.Unit;
29059
+ carmelrealtycompany: BowmarkProvider_carmelrealtycompany.Unit;
29060
+ carolefabrics: BowmarkProvider_carolefabrics.Unit;
29061
+ carpetlandusa: BowmarkProvider_carpetlandusa.Unit;
25543
29062
  cars: BowmarkProvider_cars.Unit;
29063
+ carusohomes: BowmarkProvider_carusohomes.Unit;
29064
+ casadragones: BowmarkProvider_casadragones.Unit;
29065
+ cbhhomes: BowmarkProvider_cbhhomes.Unit;
29066
+ champxpress: BowmarkProvider_champxpress.Unit;
25544
29067
  chantecaille: BowmarkProvider_chantecaille.Unit;
25545
29068
  cheapflights: BowmarkProvider_cheapflights.Unit;
25546
29069
  chesmar: BowmarkProvider_chesmar.Unit;
29070
+ chipotle: BowmarkProvider_chipotle.Unit;
25547
29071
  chriscraft: BowmarkProvider_chriscraft.Unit;
25548
29072
  classichome: BowmarkProvider_classichome.Unit;
25549
29073
  classpass: BowmarkProvider_classpass.Unit;
29074
+ claude_com: BowmarkProvider_claude_com.Unit;
29075
+ claude_support: BowmarkProvider_claude_support.Unit;
29076
+ claudemarketplaces_com: BowmarkProvider_claudemarketplaces_com.Unit;
25550
29077
  cleanairlawncare: BowmarkProvider_cleanairlawncare.Unit;
25551
29078
  cloudflare: BowmarkProvider_cloudflare.Unit;
25552
29079
  clubchampion: BowmarkProvider_clubchampion.Unit;
29080
+ code_claude_com: BowmarkProvider_code_claude_com.Unit;
25553
29081
  consultnet: BowmarkProvider_consultnet.Unit;
25554
29082
  couponfollow: BowmarkProvider_couponfollow.Unit;
25555
29083
  cruiselakegeneva: BowmarkProvider_cruiselakegeneva.Unit;
25556
29084
  culturefly: BowmarkProvider_culturefly.Unit;
29085
+ curiocity: BowmarkProvider_curiocity.Unit;
25557
29086
  cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
25558
29087
  davidsonhomes: BowmarkProvider_davidsonhomes.Unit;
25559
29088
  deangroup: BowmarkProvider_deangroup.Unit;
25560
29089
  decked: BowmarkProvider_decked.Unit;
29090
+ decksdirect: BowmarkProvider_decksdirect.Unit;
25561
29091
  developersopenai: BowmarkProvider_developersopenai.Unit;
25562
29092
  dice: BowmarkProvider_dice.Unit;
25563
29093
  dickssportinggoods: BowmarkProvider_dickssportinggoods.Unit;
@@ -25565,17 +29095,20 @@ interface BowmarkProviders {
25565
29095
  discounttire: BowmarkProvider_discounttire.Unit;
25566
29096
  disney: BowmarkProvider_disney.Unit;
25567
29097
  doordash: BowmarkProvider_doordash.Unit;
29098
+ dumpsters: BowmarkProvider_dumpsters.Unit;
25568
29099
  ebay: BowmarkProvider_ebay.Unit;
25569
29100
  elevenlabs: BowmarkProvider_elevenlabs.Unit;
25570
29101
  embroker: BowmarkProvider_embroker.Unit;
25571
29102
  eq3: BowmarkProvider_eq3.Unit;
25572
29103
  erieinsurance: BowmarkProvider_erieinsurance.Unit;
29104
+ etsy: BowmarkProvider_etsy.Unit;
25573
29105
  eventsource: BowmarkProvider_eventsource.Unit;
25574
29106
  evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
25575
29107
  executivehomecare: BowmarkProvider_executivehomecare.Unit;
25576
29108
  extraspace: BowmarkProvider_extraspace.Unit;
25577
29109
  facerealityskincare: BowmarkProvider_facerealityskincare.Unit;
25578
29110
  firstdibs: BowmarkProvider_firstdibs.Unit;
29111
+ fivebelow: BowmarkProvider_fivebelow.Unit;
25579
29112
  fivestarbathsolutions: BowmarkProvider_fivestarbathsolutions.Unit;
25580
29113
  flightradar24: BowmarkProvider_flightradar24.Unit;
25581
29114
  ford: BowmarkProvider_ford.Unit;
@@ -25585,8 +29118,11 @@ interface BowmarkProviders {
25585
29118
  fred: BowmarkProvider_fred.Unit;
25586
29119
  furniture: BowmarkProvider_furniture.Unit;
25587
29120
  g2: BowmarkProvider_g2.Unit;
29121
+ gasbuddy: BowmarkProvider_gasbuddy.Unit;
29122
+ gazelle: BowmarkProvider_gazelle.Unit;
25588
29123
  geico: BowmarkProvider_geico.Unit;
25589
29124
  github: BowmarkProvider_github.Unit;
29125
+ glama: BowmarkProvider_glama.Unit;
25590
29126
  glassesusa: BowmarkProvider_glassesusa.Unit;
25591
29127
  goloadup: BowmarkProvider_goloadup.Unit;
25592
29128
  goodway: BowmarkProvider_goodway.Unit;
@@ -25607,7 +29143,9 @@ interface BowmarkProviders {
25607
29143
  hilton: BowmarkProvider_hilton.Unit;
25608
29144
  historymaker: BowmarkProvider_historymaker.Unit;
25609
29145
  hobie: BowmarkProvider_hobie.Unit;
29146
+ hodjapasha: BowmarkProvider_hodjapasha.Unit;
25610
29147
  holidaybuilders: BowmarkProvider_holidaybuilders.Unit;
29148
+ hottopic: BowmarkProvider_hottopic.Unit;
25611
29149
  hunter: BowmarkProvider_hunter.Unit;
25612
29150
  ibuypower: BowmarkProvider_ibuypower.Unit;
25613
29151
  identitygroup: BowmarkProvider_identitygroup.Unit;
@@ -25638,6 +29176,7 @@ interface BowmarkProviders {
25638
29176
  liquiddeath: BowmarkProvider_liquiddeath.Unit;
25639
29177
  liquidspace: BowmarkProvider_liquidspace.Unit;
25640
29178
  littlewordsproject: BowmarkProvider_littlewordsproject.Unit;
29179
+ lmstudio: BowmarkProvider_lmstudio.Unit;
25641
29180
  lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
25642
29181
  louvershop: BowmarkProvider_louvershop.Unit;
25643
29182
  lovelybride: BowmarkProvider_lovelybride.Unit;
@@ -25649,10 +29188,12 @@ interface BowmarkProviders {
25649
29188
  marriott: BowmarkProvider_marriott.Unit;
25650
29189
  mcdonalds: BowmarkProvider_mcdonalds.Unit;
25651
29190
  mcp_registry: BowmarkProvider_mcp_registry.Unit;
29191
+ mcp_so: BowmarkProvider_mcp_so.Unit;
25652
29192
  medicalguardian: BowmarkProvider_medicalguardian.Unit;
25653
29193
  medicare: BowmarkProvider_medicare.Unit;
25654
29194
  mergify: BowmarkProvider_mergify.Unit;
25655
29195
  microcenter: BowmarkProvider_microcenter.Unit;
29196
+ millisaraylar: BowmarkProvider_millisaraylar.Unit;
25656
29197
  minimax: BowmarkProvider_minimax.Unit;
25657
29198
  minted: BowmarkProvider_minted.Unit;
25658
29199
  mixbook: BowmarkProvider_mixbook.Unit;
@@ -25677,8 +29218,10 @@ interface BowmarkProviders {
25677
29218
  pacificcompanies: BowmarkProvider_pacificcompanies.Unit;
25678
29219
  paypal: BowmarkProvider_paypal.Unit;
25679
29220
  perennialsandsutherland: BowmarkProvider_perennialsandsutherland.Unit;
29221
+ pilotprotocol: BowmarkProvider_pilotprotocol.Unit;
25680
29222
  pirateship: BowmarkProvider_pirateship.Unit;
25681
29223
  pizzahut: BowmarkProvider_pizzahut.Unit;
29224
+ platform_claude_com: BowmarkProvider_platform_claude_com.Unit;
25682
29225
  poshmark: BowmarkProvider_poshmark.Unit;
25683
29226
  positivegrid: BowmarkProvider_positivegrid.Unit;
25684
29227
  premierbuildings: BowmarkProvider_premierbuildings.Unit;
@@ -25693,8 +29236,10 @@ interface BowmarkProviders {
25693
29236
  rishitea: BowmarkProvider_rishitea.Unit;
25694
29237
  ritani: BowmarkProvider_ritani.Unit;
25695
29238
  roofmaxx: BowmarkProvider_roofmaxx.Unit;
29239
+ rover: BowmarkProvider_rover.Unit;
25696
29240
  rvshare: BowmarkProvider_rvshare.Unit;
25697
29241
  saatva: BowmarkProvider_saatva.Unit;
29242
+ safetywing: BowmarkProvider_safetywing.Unit;
25698
29243
  saltandstone: BowmarkProvider_saltandstone.Unit;
25699
29244
  samsclub: BowmarkProvider_samsclub.Unit;
25700
29245
  scentbird: BowmarkProvider_scentbird.Unit;
@@ -25712,6 +29257,7 @@ interface BowmarkProviders {
25712
29257
  smithery: BowmarkProvider_smithery.Unit;
25713
29258
  solostove: BowmarkProvider_solostove.Unit;
25714
29259
  soundcloud: BowmarkProvider_soundcloud.Unit;
29260
+ spirithalloween: BowmarkProvider_spirithalloween.Unit;
25715
29261
  starlighthomes: BowmarkProvider_starlighthomes.Unit;
25716
29262
  statefarm: BowmarkProvider_statefarm.Unit;
25717
29263
  stickergiant: BowmarkProvider_stickergiant.Unit;
@@ -25737,6 +29283,7 @@ interface BowmarkProviders {
25737
29283
  trektravel: BowmarkProvider_trektravel.Unit;
25738
29284
  trophysignaturehomes: BowmarkProvider_trophysignaturehomes.Unit;
25739
29285
  twiddy: BowmarkProvider_twiddy.Unit;
29286
+ uhc_smallbusiness: BowmarkProvider_uhc_smallbusiness.Unit;
25740
29287
  ulrichlifestyle: BowmarkProvider_ulrichlifestyle.Unit;
25741
29288
  ups: BowmarkProvider_ups.Unit;
25742
29289
  usps: BowmarkProvider_usps.Unit;
@@ -25746,12 +29293,15 @@ interface BowmarkProviders {
25746
29293
  villagerealtyobx: BowmarkProvider_villagerealtyobx.Unit;
25747
29294
  visible: BowmarkProvider_visible.Unit;
25748
29295
  voluspa: BowmarkProvider_voluspa.Unit;
29296
+ vscode: BowmarkProvider_vscode.Unit;
25749
29297
  walkerhughes: BowmarkProvider_walkerhughes.Unit;
25750
29298
  walmart: BowmarkProvider_walmart.Unit;
25751
29299
  waterfurnace: BowmarkProvider_waterfurnace.Unit;
25752
29300
  wellfound: BowmarkProvider_wellfound.Unit;
25753
29301
  winestyles: BowmarkProvider_winestyles.Unit;
25754
29302
  xpresswellnessurgentcare: BowmarkProvider_xpresswellnessurgentcare.Unit;
29303
+ ycombinator: BowmarkProvider_ycombinator.Unit;
29304
+ yelp: BowmarkProvider_yelp.Unit;
25755
29305
  yorkwallcoverings: BowmarkProvider_yorkwallcoverings.Unit;
25756
29306
  yourarborhome: BowmarkProvider_yourarborhome.Unit;
25757
29307
  youtube: BowmarkProvider_youtube.Unit;
@@ -77482,12 +81032,14 @@ interface BowmarkLibrary {
77482
81032
  bundles: BowmarkCapability_bundles.Unit;
77483
81033
  cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
77484
81034
  cars: BowmarkCapability_cars.Unit;
81035
+ costume_size_check: BowmarkCapability_costume_size_check.Unit;
77485
81036
  coworking: BowmarkCapability_coworking.Unit;
77486
81037
  custom_sofa_configurator: BowmarkCapability_custom_sofa_configurator.Unit;
77487
81038
  delivery: BowmarkCapability_delivery.Unit;
77488
81039
  developer_api_key_signup: BowmarkCapability_developer_api_key_signup.Unit;
77489
81040
  domain: BowmarkCapability_domain.Unit;
77490
81041
  email: BowmarkCapability_email.Unit;
81042
+ entertainment_merch: BowmarkCapability_entertainment_merch.Unit;
77491
81043
  flights: BowmarkCapability_flights.Unit;
77492
81044
  game_soundtrack_composer_credits: BowmarkCapability_game_soundtrack_composer_credits.Unit;
77493
81045
  git_commit_history: BowmarkCapability_git_commit_history.Unit;
@@ -77501,6 +81053,7 @@ interface BowmarkLibrary {
77501
81053
  mcp_registry: BowmarkCapability_mcp_registry.Unit;
77502
81054
  music: BowmarkCapability_music.Unit;
77503
81055
  pcparts: BowmarkCapability_pcparts.Unit;
81056
+ phone_price: BowmarkCapability_phone_price.Unit;
77504
81057
  phone_trade_in: BowmarkCapability_phone_trade_in.Unit;
77505
81058
  pricing: BowmarkCapability_pricing.Unit;
77506
81059
  products: BowmarkCapability_products.Unit;
@@ -77516,6 +81069,7 @@ interface BowmarkLibrary {
77516
81069
  text_to_speech: BowmarkCapability_text_to_speech.Unit;
77517
81070
  theme_park_tickets: BowmarkCapability_theme_park_tickets.Unit;
77518
81071
  weather: BowmarkCapability_weather.Unit;
81072
+ wireless: BowmarkCapability_wireless.Unit;
77519
81073
  yoga_outfit_shopping: BowmarkCapability_yoga_outfit_shopping.Unit;
77520
81074
  providers: BowmarkProviders;
77521
81075
  }