@bowmark/web 1.2.0 → 1.4.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,9 +5,9 @@
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: 11b1a109d7e69ffbbcccb30182dd5333770aeb23ab75946f15d55d7f7d84a7bf
9
- // 8 capabilities, 68 providers, 208 typed functions, 20 refused.
10
- // 51,711 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
8
+ // Manifest version: 6368edcbec9d9ee7ceb3fd590c7054ade0542a93e43a39f4f88dc6167c0e36da
9
+ // 8 capabilities, 74 providers, 233 typed functions, 20 refused.
10
+ // 51,712 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
13
13
  // carry no types, so no honest signature exists. Each one is commented in place
@@ -232,6 +232,71 @@ type BookingOptionsResult = {
232
232
  // sellers are not in here. Empty means nothing dropped.
233
233
  }
234
234
 
235
+ // Give EITHER flightNumber OR both origin and destination, plus date and airline.
236
+ type FlightStatusQuery = {
237
+ airline: string // IATA carrier code, e.g. "AA" — routes to the airline
238
+ // that flies it; there is no default to guess
239
+ date: string // the flight's ORIGIN date, ISO "2026-08-04"
240
+ flightNumber?: string // "100", "2005", or "AA2005"
241
+ origin?: string // IATA code — with destination, returns every NONSTOP
242
+ destination?: string // that airline flies on the route that day
243
+ }
244
+
245
+ // One leg's status, at one end of the flight.
246
+ type FlightStatusAirport = {
247
+ airportCode: string
248
+ cityName: string | null
249
+ gate: string | null // null is UNKNOWN, not "no gate" — normal for a flight
250
+ // weeks out
251
+ terminal: string | null
252
+ state: string | null
253
+ country: string | null
254
+ baggageClaim: string | null // arrival end only
255
+ scheduledTime: string | null // ISO 8601 WITH the airport's own UTC offset
256
+ estimatedTime: string | null
257
+ actualTime: string | null // what happened, once it has; null before the event
258
+ scheduledBoardingTime: string | null // departure end only
259
+ estimatedBoardingTime: string | null
260
+ }
261
+
262
+ type FlightStatusLeg = {
263
+ flightNumber: string
264
+ airlineCode: string
265
+ flightStatus: string | null // the airline's own wording, verbatim
266
+ flightStatusKey: string | null // a stable key behind the wording — branch on
267
+ // this, not the display string
268
+ flightStatusColor: string | null // the airline's own severity colour, where
269
+ // it publishes one (GREEN, ORANGE, RED, ...)
270
+ canceled: boolean
271
+ diverted: boolean
272
+ inFlight: boolean
273
+ landed: boolean
274
+ departure: FlightStatusAirport
275
+ arrival: FlightStatusAirport
276
+ equipment: {
277
+ tailNumber: string | null
278
+ equipmentCode: string | null
279
+ iataName: string | null
280
+ displayName: string | null // e.g. "Airbus A321neo"
281
+ }
282
+ disruptionMessage: string | null // the airline's own passenger-facing prose
283
+ codeShare: boolean
284
+ operatedBy: string | null
285
+ marketingCarrier: string | null
286
+ wifiAvailable: boolean | null
287
+ powerPortAvailable: boolean | null
288
+ }
289
+
290
+ type FlightStatusResult = {
291
+ date: string // echoed back, "YYYY-MM-DD"
292
+ flightNumber: string | null // null in route mode
293
+ origin: string | null
294
+ destination: string | null
295
+ flights: FlightStatusLeg[] // EMPTY IS AN ANSWER: no such flight that day
296
+ warnings: string[] // always present, same contract as every other
297
+ // function on this capability
298
+ }
299
+
235
300
  /**
236
301
  * Search flights with one call and get back normalized, price-sorted results (the same
237
302
  * physical flight appears once). Each result carries the site it came from (`site`) and every
@@ -270,6 +335,24 @@ type BookingOptionsResult = {
270
335
  * on, whose sellers are not included.
271
336
  */
272
337
  getBookingOptions(flight: FlightResult, options?: CallOptions): Promise<BookingOptionsResult>;
338
+
339
+ /**
340
+ * A flight's live status, checked directly with the airline that flies it. Pass `airline` (an
341
+ * IATA carrier code, e.g. "AA") plus `date` (the flight's ORIGIN date, ISO "2026-08-04") and
342
+ * EITHER `flightNumber` OR both `origin` and `destination` (IATA airport codes) to get every
343
+ * nonstop that airline flies on that route that day. Each returned leg carries the airline's
344
+ * own status wording and a stable status key to branch on, the
345
+ * canceled/diverted/inFlight/landed booleans, scheduled/estimated/actual times at both ends as
346
+ * ISO strings with each airport's own UTC offset, gate, terminal and baggage claim, the
347
+ * aircraft, codeshare and operating carrier, and the airline's passenger-facing disruption
348
+ * message. THROWS for an `airline` no provider behind this capability implements, naming which
349
+ * ones can answer — there is no default carrier to guess, unlike `search`, which has no
350
+ * caller-supplied identity to route on in the first place. An empty `flights` array is a real
351
+ * answer: that airline flies no such flight that day, not a failure. `warnings` is always
352
+ * present, same contract as every other function here, though today it can only ever report a
353
+ * clamped `timeoutMs` — a single-carrier route has no fan-out to go thin.
354
+ */
355
+ getFlightStatus(query: FlightStatusQuery, options?: CallOptions): Promise<FlightStatusResult>;
273
356
  }
274
357
  }
275
358
 
@@ -446,6 +529,29 @@ type CarrierLicensing = {
446
529
  warnings: string[] // always present; a timeoutMs clamp notice today
447
530
  }
448
531
 
532
+ // listReferralCarriers: whose paper a referral/marketplace program's quote
533
+ // actually places — a fact the quote row itself never states.
534
+ type ReferralCarrierQuery = {
535
+ line?: string // narrow to one property line, e.g. "homeowners" — NOT a closed
536
+ // enum; an unmatched value throws, naming the lines the
537
+ // directory actually publishes. Omit for the whole directory.
538
+ }
539
+ type ReferralCarrier = {
540
+ source: string // which referral program this came from
541
+ name: string // as the directory writes it
542
+ lines: string[] // every property line this carrier is listed under
543
+ url: string | null // the directory's own link for this carrier
544
+ ownedBySource: boolean | null // true only for the referral program's OWN
545
+ // paper; null when the directory linked
546
+ // nothing for this row, so it said nothing
547
+ // to derive an answer from
548
+ }
549
+ type ReferralCarrierListResult = {
550
+ carriers: ReferralCarrier[] // alphabetical by name
551
+ warnings: string[] // always present; names a source that timed
552
+ // out or failed
553
+ }
554
+
449
555
  type CallOptions = {
450
556
  timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
451
557
  // A provider slower than this is DROPPED from the results and
@@ -516,6 +622,25 @@ type CallOptions = {
516
622
  * result to hand back. `options.timeoutMs` sets the budget (default 30000).
517
623
  */
518
624
  getLicensing(naicCode: string, options?: CallOptions): Promise<CarrierLicensing>;
625
+
626
+ /**
627
+ * Lists the carriers a referral/marketplace program actually places business with — the fact a
628
+ * quote row never states on its face. Reads Progressive's own published directory of outside
629
+ * property carriers (homeowners, renters, condo, dwelling-fire, manufactured-home) today. Call
630
+ * with no argument for the whole directory (16 carriers currently) or `{ line: "homeowners" }`
631
+ * to narrow to one line — `line` is NOT a closed enum; an unrecognized value THROWS naming the
632
+ * lines the directory actually publishes, because inventing a fixed list here would silently
633
+ * drop a line the site adds later. Each row carries every line that carrier is listed under
634
+ * (`lines`) and `ownedBySource` — true ONLY when the row is the referral program's own paper,
635
+ * derived from the directory's own linking rather than from name matching, and null when the
636
+ * directory linked nothing for that row. NEVER returns an empty list from a source that
637
+ * answered: this is a published directory with no legitimate empty case, so a missing section
638
+ * or a changed page throws at the provider rather than under-reporting who underwrites the
639
+ * policy. `warnings` is always present and names a source that timed out or failed — with one
640
+ * source today, read it before trusting a short list is the whole directory.
641
+ * `options.timeoutMs` sets the per-source budget (default 30000).
642
+ */
643
+ listReferralCarriers(query?: ReferralCarrierQuery, options?: CallOptions): Promise<ReferralCarrierListResult>;
519
644
  }
520
645
  }
521
646
 
@@ -789,18 +914,78 @@ interface aaFlightStatusResult {
789
914
  flights: aaFlight[];
790
915
  }
791
916
 
917
+ interface aaReservation {
918
+ recordLocator: string;
919
+ status: string | null;
920
+ bookingTime: string | null;
921
+ passengers: aaReservationPassenger[];
922
+ itinerary: aaReservationSlice[];
923
+ }
924
+
925
+ interface aaReservationPassenger {
926
+ firstName: string | null;
927
+ lastName: string | null;
928
+ passengerID: string | null;
929
+ paxType: string | null;
930
+ loyaltyNumber: string | null;
931
+ ticketNumbers: string[];
932
+ }
933
+
934
+ interface aaReservationSlice {
935
+ segments: aaReservationSegment[];
936
+ }
937
+
938
+ interface aaReservationSegment {
939
+ flightNumber: string | null;
940
+ marketingCarrierCode: string | null;
941
+ operatingCarrierCode: string | null;
942
+ cabinType: string | null;
943
+ bookingCode: string | null;
944
+ departureDateTime: string | null;
945
+ legs: aaReservationLeg[];
946
+ }
947
+
948
+ interface aaReservationLeg {
949
+ originAirportCode: string | null;
950
+ originCity: string | null;
951
+ destinationAirportCode: string | null;
952
+ destinationCity: string | null;
953
+ }
954
+
955
+ interface aaRetrieveBookingArgs {
956
+ /** Exactly six letters — American's own record-locator format. */
957
+ recordLocator: string;
958
+ /** The passenger's last name, exactly as it appears on the reservation. */
959
+ lastName: string;
960
+ }
961
+
792
962
  /**
793
963
  * American Airlines' own site — its published fares and award availability, flight status,
794
- * reservation lookup, seat maps, baggage allowance and fee schedules. Flight status is live
795
- * and browserless; the rest are declared stubs.
964
+ * reservation lookup, seat maps, baggage allowance and fee schedules. Flight status and
965
+ * reservation lookup are live and browserless; the rest are declared stubs.
796
966
  */
797
967
  interface Unit {
798
- // NO TYPED SURFACE — every function this unit declares is refused above.
799
- // The unit is real and callable at runtime; nothing here can say so in types.
800
968
  // UNTYPED, DELIBERATELY OMITTED — `getFlightStatus({ date, flightNumber, origin, destination })` declares no types for
801
969
  // its argument, so there is no honest signature to emit.
802
970
  // It is CALLABLE at runtime; `bowmark.providers.aa.getFlightStatus` is a compile error here on purpose.
803
971
  // A `(...args: unknown[])` stand-in would compile and tell you nothing.
972
+
973
+ /**
974
+ * Reads an existing American Airlines reservation by its six-letter record locator (PNR) and
975
+ * the passenger's last name — nothing is signed into, and both are the caller's own details,
976
+ * passed at call time. Returns the record locator, American's own status string, when the
977
+ * booking was made, every passenger (name, passenger id, fare type, loyalty number, ticket
978
+ * numbers), and the itinerary as slices of flown segments (flight number, marketing and
979
+ * operating carrier codes, cabin, booking class, departure time, and each leg's
980
+ * origin/destination airport and city). Throws when the locator and last name do not both
981
+ * match a real reservation — American validates the pair together, so a real locator paired
982
+ * with the wrong last name answers exactly like one that does not exist at all; there is no
983
+ * way to tell those two cases apart from the outside. HONEST LIMIT: the not-found path is
984
+ * live-verified; the success shape above is reconstructed from American's own client code and
985
+ * has not been observed on the wire, since no consenting real booking was available to test it
986
+ * — see `retrieve-booking.ts` for what that means for field accuracy.
987
+ */
988
+ retrieveBooking(arg0: aaRetrieveBookingArgs): Promise<aaReservation>;
804
989
  }
805
990
  }
806
991
 
@@ -902,6 +1087,54 @@ interface abercrombieSearchQuery {
902
1087
  maxItems?: number;
903
1088
  }
904
1089
 
1090
+ interface abercrombieStoreStock {
1091
+ store: abercrombieStore;
1092
+ inventoryStatus: string;
1093
+ availableQuantity: number;
1094
+ inStock: boolean;
1095
+ availableFrom: string | null;
1096
+ availableFromLabel: string | null;
1097
+ }
1098
+
1099
+ interface abercrombieStock {
1100
+ productId: string;
1101
+ sku: string;
1102
+ productName: string | null;
1103
+ color: string | null;
1104
+ url: string;
1105
+ sizeLabel: string;
1106
+ sizePrimary: string | null;
1107
+ sizeSecondary: string | null;
1108
+ primaryDimension: string | null;
1109
+ secondaryDimension: string | null;
1110
+ inStockOnline: boolean;
1111
+ onlineQuantity: number;
1112
+ onlineStatus: string;
1113
+ preorderEligible: boolean;
1114
+ price: number | null;
1115
+ listPrice: number | null;
1116
+ onSale: boolean;
1117
+ currency: string;
1118
+ findInStoreEligible: boolean;
1119
+ pickupEligible: boolean;
1120
+ stores: abercrombieStoreStock[] | null;
1121
+ }
1122
+
1123
+ interface abercrombieStockQuery {
1124
+ url?: string;
1125
+ id?: string;
1126
+ size?: string;
1127
+ sizePrimary?: string;
1128
+ sizeSecondary?: string;
1129
+ sku?: string;
1130
+ zip?: string;
1131
+ city?: string;
1132
+ state?: string;
1133
+ radiusMiles?: number;
1134
+ maxStores?: number;
1135
+ brand?: "adult" | "kids" | "both";
1136
+ }
1137
+
905
1138
  /**
906
1139
  * Abercrombie & Fitch's own storefront — product search, product detail, size/store stock,
907
1140
  * store locator, current deals and gift card balance.
@@ -943,6 +1176,29 @@ interface abercrombieSearchQuery {
943
1176
  */
944
1177
  findStores(query: abercrombieStoreQuery): Promise<abercrombieStore[]>;
945
1178
 
1179
+ /**
1180
+ * Answers whether ONE size of ONE colourway is buyable RIGHT NOW — online, and at the stores
1181
+ * near a place you name. Identify the product with `url` or `id`, then the size with either
1182
+ * `size` (the site's own label, e.g. "32 X Regular" or "M"), or `sizePrimary`+`sizeSecondary`,
1183
+ * or a `sku` you already hold. Add `zip` OR `city`+`state` to also get per-store stock; omit
1184
+ * all three and `stores` comes back `null` — "you did not ask", which is deliberately distinct
1185
+ * from `[]`, "asked, and no store nearby carries it". Returns the resolved `sku`, the size and
1186
+ * its dimension names, the online answer (`inStockOnline`, a real `onlineQuantity` — the site
1187
+ * publishes counts like 305, not a flag — the site's own `onlineStatus` word,
1188
+ * `preorderEligible`, price/listPrice/onSale), whether the colourway is eligible for the
1189
+ * site's find-in-store and pick-up-in-store journeys at all, and one row per nearby store
1190
+ * carrying that store's full record plus its `inventoryStatus`, `availableQuantity`, `inStock`
1191
+ * and the date it expects the item. **`inStock` is the strict question and is NOT `status !==
1192
+ * "Unavailable"`**: the site's commonest store answer is `Backorderable` with quantity 0,
1193
+ * which means "we will order it for you", not "it is on the shelf" — so `inStock` is true only
1194
+ * for `Available` WITH a quantity above zero. **An ambiguous size THROWS rather than
1195
+ * guessing**: "26" names three lengths on a jean, and answering for one of them would be a
1196
+ * wrong answer on a 200. A `sku` is looked up across the whole style and answers for the
1197
+ * colourway it really belongs to, not the one in the url. This is the per-SIZE, per-STORE
1198
+ * question; `getProduct` answers the different one of what sizes and colours a style comes in.
1199
+ */
1200
+ checkStock(query: abercrombieStockQuery): Promise<abercrombieStock>;
1201
+
946
1202
  /**
947
1203
  * Searches or browses Abercrombie's live catalog the way the site's own search bar and
948
1204
  * category navigation do. Pass EITHER `query` (free text, e.g. "wide leg jeans") OR `category`
@@ -1513,6 +1769,64 @@ interface BmwusaCpoSearchOptions {
1513
1769
  }
1514
1770
  }
1515
1771
 
1772
+ declare namespace BowmarkProvider_cancer {
1773
+ // ── National Cancer Institute (cancer.gov) — the unit's own declarations, verbatim ──
1774
+ type cancerCenterDesignation =
1775
+ | "Comprehensive Cancer Center"
1776
+ | "Clinical Cancer Center"
1777
+ | "Basic Laboratory Cancer Center";
1778
+
1779
+ interface cancerCenterRow {
1780
+ name: string;
1781
+ /** The center's own detail page on cancer.gov. */
1782
+ url: string;
1783
+ /** NCI's own state grouping — the authoritative field to filter on. */
1784
+ state: string;
1785
+ /** The "City, State" line the page publishes, verbatim. */
1786
+ location: string;
1787
+ /** A second location aside the page publishes for a few centers, e.g.
1788
+ * "(in addition to facilities in Florida and Minnesota)" — present on a
1789
+ * center that operates comprehensive facilities in more than one state and
1790
+ * is cross-listed under each. */
1791
+ locationNote?: string;
1792
+ /** The parent university or health system, when distinct from the center's
1793
+ * own name. Absent for freestanding centers (their own name IS the
1794
+ * institution). */
1795
+ hostInstitution?: string;
1796
+ designation: cancerCenterDesignation;
1797
+ }
1798
+
1799
+ interface cancerCentersResult {
1800
+ /** Every center when no `state` filter is given; only the matching ones
1801
+ * otherwise. */
1802
+ total: number;
1803
+ centers: cancerCenterRow[];
1804
+ }
1805
+
1806
+ /**
1807
+ * The US National Cancer Institute: PDQ cancer information, the clinical-trial register,
1808
+ * cancer drugs, NCI-designated cancer centers and the cancer dictionaries. The NCI-Designated
1809
+ * Cancer Center directory (`findCancerCenters`) is callable now — every center's name,
1810
+ * designation type, location and host institution, optionally filtered by state; the other
1811
+ * twelve declared functions are still stubs.
1812
+ */
1813
+ interface Unit {
1814
+ /**
1815
+ * The NCI-Designated Cancer Centers — the institutions NCI itself certifies as meeting its
1816
+ * standards for cancer research and care — each with its name, its designation type
1817
+ * (Comprehensive, Clinical, or Basic Laboratory), its city and state, its parent university or
1818
+ * health system when it has one, and the link to its own cancer.gov detail page. `state`
1819
+ * (NCI's own state name, e.g. "California", "Hawai'i", "District of Columbia", matched
1820
+ * case-insensitively but exactly — no fuzzy matching) filters to that state; omitted, every
1821
+ * center is returned. A center that operates comprehensive facilities in more than one state
1822
+ * (Mayo Clinic Cancer Center) is cross-listed under each, with `locationNote` naming its other
1823
+ * locations. This is the whole directory in one document — NCI does not filter it server-side
1824
+ * — so `total` and `centers.length` are always equal.
1825
+ */
1826
+ findCancerCenters(args?: { state?: string }): Promise<cancerCentersResult>;
1827
+ }
1828
+ }
1829
+
1516
1830
  declare namespace BowmarkProvider_cars {
1517
1831
  // ── Cars.com — the unit's own declarations, verbatim ──
1518
1832
  interface carsListing {
@@ -1616,6 +1930,34 @@ interface KayakBookingOption {
1616
1930
  seatsRemaining: number | null;
1617
1931
  }
1618
1932
 
1933
+ interface KayakHotelQuery {
1934
+ location: string; // IATA airport code, e.g. "SFO", or a resolvable city
1935
+ checkIn: string; // YYYY-MM-DD
1936
+ checkOut: string; // YYYY-MM-DD
1937
+ adults?: number; // default 2
1938
+ rooms?: number; // default 1
1939
+ }
1940
+
1941
+ // Cheapflights's OWN row shape for stays.
1942
+ interface KayakHotel {
1943
+ id: string;
1944
+ name: string;
1945
+ price: number | null; // per NIGHT, cheapest seller (normalized, see below)
1946
+ totalPrice: number | null; // the WHOLE stay — what rows are sorted on
1947
+ currency: string;
1948
+ seller: string; // who sells that rate ("Priceline")
1949
+ sellerCount: number | null; // how many sellers quoted this property
1950
+ stars: number | null; // property stars, 1-5
1951
+ score: number | null; // guest score out of 10
1952
+ reviewCount: number | null;
1953
+ propertyType: string; // "Hotel", "Motel", "Apartment"
1954
+ neighborhood: string | null;
1955
+ city: string | null;
1956
+ distance: string | null; // "11.7 mi", as the site renders it
1957
+ distanceFrom: string | null; // what that distance is measured from
1958
+ url: string; // deep link to the property
1959
+ }
1960
+
1619
1961
  interface KayakCarQuery {
1620
1962
  pickup: string; // IATA airport code, e.g. "SFO"
1621
1963
  dropoff?: string; // defaults to pickup
@@ -1672,6 +2014,13 @@ interface KayakCar {
1672
2014
  */
1673
2015
  getBookingOptions(flight: KayakFlight): Promise<KayakBookingOption[]>;
1674
2016
 
2017
+ /**
2018
+ * Runs the stays search on cheapflights.com and returns priced properties for a destination
2019
+ * and date range, cheapest TOTAL first. Interaction-gated: the prices only exist after the
2020
+ * site's own multi-phase supplier poll completes.
2021
+ */
2022
+ searchHotels(query: KayakHotelQuery): Promise<KayakHotel[]>;
2023
+
1675
2024
  /**
1676
2025
  * Runs the car-hire search on cheapflights.com and returns priced vehicles for a pickup
1677
2026
  * location and date range, cheapest-first. Interaction-gated: the prices only exist after the
@@ -1777,6 +2126,49 @@ interface ChriscraftPriceResult {
1777
2126
 
1778
2127
  declare namespace BowmarkProvider_classpass {
1779
2128
  // ── ClassPass — the unit's own declarations, verbatim ──
2129
+ /** Everything /v2/venues publishes about one studio — a superset of
2130
+ * ClasspassVenue, so anything holding one can hold the other. */
2131
+ interface ClasspassStudio extends ClasspassVenue {
2132
+ /** What the studio does. On THIS function it comes from the venue record's own
2133
+ * tag block, so it is correct even on a day the studio publishes no classes. */
2134
+ activities: string[];
2135
+ /** ISO-3166 alpha-2, e.g. "US", "GB". */
2136
+ country: string | null;
2137
+ /** The site's neighbourhood label ("South Charlotte"). Null where it publishes none. */
2138
+ neighborhood: string | null;
2139
+ /** The metro area the studio is sold in ("Charlotte Metro", "London Metro"). */
2140
+ metroArea: string | null;
2141
+ description: string | null;
2142
+ /** The studio's OWN site, not its ClassPass page. Null where it publishes none. */
2143
+ website: string | null;
2144
+ phone: string | null;
2145
+ instagram: string | null;
2146
+ facebook: string | null;
2147
+ twitter: string | null;
2148
+ /** Real photographs, largest first. ClassPass's generic fallback placeholders are
2149
+ * dropped — a placeholder passed off as the studio is worse than nothing. */
2150
+ photos: string[];
2151
+ logo: string | null;
2152
+ /** Only the attributes the studio asserts, e.g. ["lgbtq_friendly",
2153
+ * "wheelchair_accessible"]. A false flag means "not claimed" and is dropped. */
2154
+ inclusivity: string[];
2155
+ bookingWindow: string | null;
2156
+ whenToArrive: string | null;
2157
+ whatToBring: string | null;
2158
+ howToGetThere: string | null;
2159
+ proTip: string | null;
2160
+ cancellationPolicy: string | null;
2161
+ /** null where the site holds no policy (it sends the sentinel "UNKNOWN"). */
2162
+ lateCancellation: string | null;
2163
+ demandSignals: string[];
2164
+ /** ClassPass's own published fraction (0-1). Returned under the site's own name
2165
+ * and NOT relabelled a saving — the site does not document its basis. There is
2166
+ * no credit price on this record; per-class cost is getSchedule's `credits`. */
2167
+ averageDiscount: number | null;
2168
+ outOfNetwork: boolean;
2169
+ spots: number | null;
2170
+ }
2171
+
1780
2172
  interface ClasspassSchedule {
1781
2173
  venue: ClasspassVenue;
1782
2174
  /** Dates covered, YYYY-MM-DD in the venue's zone, ascending. A day with no
@@ -1842,12 +2234,33 @@ interface ClasspassScheduleOptions {
1842
2234
 
1843
2235
  /**
1844
2236
  * ClassPass — fitness, wellness and beauty classes across gyms, studios, spas and salons.
1845
- * `getSchedule` reads one studio's bookable timetable for a day or a week: every session with
1846
- * its start time, instructor, duration, credit price and whether it is still open. Studio and
1847
- * class search, the studio profile, per-slot availability and membership pricing are declared
1848
- * but not built yet.
2237
+ * `getStudio` reads one studio's whole profile in a single request: what it does, where it is,
2238
+ * its rating, amenities, photos, contact routes and the practical booking prose. `getSchedule`
2239
+ * reads that studio's bookable timetable for a day or a week: every session with its start
2240
+ * time, instructor, duration, credit price and whether it is still open. Studio and class
2241
+ * search, per-slot availability and membership pricing are declared but not built yet.
1849
2242
  */
1850
2243
  interface Unit {
2244
+ /**
2245
+ * Reads ONE ClassPass studio's whole profile in a single request — the page a person reads to
2246
+ * decide whether a result is worth booking. `studio` is a ClassPass venue id (74359), the
2247
+ * alias in its public URL ("barrys-charlotte"), or the studio URL itself; all three are
2248
+ * accepted. Returns identity and branch (a chain's locations differ only by `subtitle`), the
2249
+ * full address with coordinates, IANA time zone, neighbourhood and metro area, the studio's
2250
+ * own description, what it actually does (`activities`), amenities and the inclusivity
2251
+ * attributes it asserts, its rating and how many reviews back it, real photographs
2252
+ * (ClassPass's generic `fallback.jpg` placeholders are dropped rather than passed off as the
2253
+ * studio), its own website, phone and socials, and the practical prose a booker needs —
2254
+ * booking window, when to arrive, what to bring, how to get there, and the cancellation
2255
+ * policies. NOTE ON PRICE: this record carries NO credit figure, measured across four venues —
2256
+ * the only price-ish field ClassPass publishes here is `averageDiscount`, its own undocumented
2257
+ * fraction, returned under its own name rather than relabelled as a saving. What a class COSTS
2258
+ * is per-session and comes from `getSchedule`'s `credits`, which is both exact and free of a
2259
+ * second request. A studio that has left ClassPass throws a caller-fixable error quoting the
2260
+ * site's own reason ("Venue disabled") rather than returning a hollow profile.
2261
+ */
2262
+ getStudio(studio: number | string): Promise<ClasspassStudio>;
2263
+
1851
2264
  /**
1852
2265
  * Reads ONE ClassPass studio's bookable timetable — what a person can actually book there, and
1853
2266
  * when. `studio` is a ClassPass venue id (74359), the alias in its public URL
@@ -1965,6 +2378,102 @@ interface CloudflareSearchDomainAvailabilityResult {
1965
2378
  }
1966
2379
  }
1967
2380
 
2381
+ declare namespace BowmarkProvider_decked {
2382
+ // ── DECKED — the unit's own declarations, verbatim ──
2383
+ // DECKED's OWN shapes — not a capability contract.
2384
+
2385
+ type DeckedCabSideOption = "Cab-side Gap" | "Load Floor";
2386
+
2387
+ interface DeckedFit {
2388
+ vehicleClass: string; // the site's own product handle, e.g. "drawers-fullsize"
2389
+ vehicleClassTitle: string;
2390
+ model: string; // e.g. "Ford F150 (2004-2014)"
2391
+ fitOption: string | null; // a bed length or wheel base — null for a class with only "Model" (SUV, Service Body)
2392
+ sku: string;
2393
+ price: number;
2394
+ priceFormatted: string;
2395
+ available: boolean;
2396
+ url: string; // the class's product page, preselecting this exact variant
2397
+ }
2398
+
2399
+ interface DeckedVehicleClass {
2400
+ handle: string;
2401
+ title: string;
2402
+ url: string;
2403
+ secondOption: string | null; // "Bed Length" | "Wheel Base" | null
2404
+ fits: DeckedFit[];
2405
+ }
2406
+
2407
+ interface DeckedFitmentResult {
2408
+ query: string;
2409
+ bedLength: string | null;
2410
+ matched: boolean;
2411
+ fit: DeckedFit | null;
2412
+ candidates: DeckedFit[]; // populated when not narrowed to exactly one real fit
2413
+ message: string;
2414
+ }
2415
+
2416
+ interface DeckedCabSideOptionResult {
2417
+ query: string;
2418
+ bedLength: string;
2419
+ option: DeckedCabSideOption;
2420
+ compatible: boolean; // false is a real, expected "does not fit" answer — not an error
2421
+ fit: DeckedFit | null;
2422
+ reason: string | null;
2423
+ baseFit: DeckedFit | null; // the "Cab-side Gap" fit at the same vehicle + bed length (DECKED's standard option), for the price delta
2424
+ }
2425
+
2426
+ /**
2427
+ * DECKED's truck-bed/SUV/cargo-van Drawer System vehicle-fitment catalog — list every vehicle
2428
+ * class and model DECKED fits, read one class's full fit list (model, bed length/wheel base,
2429
+ * exact SKU and live price), resolve a free-text vehicle to its real fitted SKU and price, and
2430
+ * price the Load Floor vs Cab-side Gap 8'-bed accessory-pack option (including a real fitment
2431
+ * rejection when a vehicle has no matching SKU), all off the storefront's own live catalog
2432
+ * rather than a researched estimate.
2433
+ */
2434
+ interface Unit {
2435
+ /**
2436
+ * Lists every real DECKED vehicle fit across all six vehicle classes (SUV, Full-Size, Midsize,
2437
+ * Cargo Van, Service Body, RamBox) from the storefront's own live catalog — model, bed
2438
+ * length/wheel base (where the class has one), exact SKU, live price and availability. `query`
2439
+ * (optional) narrows the list by a fuzzy match on the vehicle make/model text, e.g. "4runner"
2440
+ * or "f150". Excludes the generic /products/drawers "Style: Trucks" decoy, which carries no
2441
+ * real per-vehicle fitment.
2442
+ */
2443
+ searchFits(query?: string): Promise<DeckedFit[]>;
2444
+
2445
+ /**
2446
+ * Reads one vehicle class's complete fit list — a handle (e.g. "drawers-fullsize") or a
2447
+ * shopper-shaped name (e.g. "Full-Size", "SUV", "Cargo Van") — every model it fits, each with
2448
+ * its own bed lengths / wheel bases, SKUs, live prices and availability. THROWS on an
2449
+ * unrecognized class, naming searchFits() as the way to find current ones.
2450
+ */
2451
+ getVehicleClass(vehicleClass: string): Promise<DeckedVehicleClass>;
2452
+
2453
+ /**
2454
+ * Resolves a free-text vehicle (e.g. "Toyota 4Runner 2023", "Ford F-150 2015") to its real
2455
+ * fitted SKU and live price, mirroring the on-page widget's own Make/Model/Year -> Bed Length
2456
+ * narrowing flow. `matched: true` with a populated `fit` means exactly one real fit narrowed
2457
+ * to; otherwise `candidates` lists every real fit that DID match the vehicle (pass `bedLength`
2458
+ * to narrow a class that needs one, or read `fitOption` off a candidate). Never throws for an
2459
+ * ambiguous or zero-bed-length match — an unmatched vehicle name is the one case this DOES
2460
+ * treat as a caller error (throws, naming searchFits()).
2461
+ */
2462
+ resolveFitment(vehicleQuery: string, bedLength?: string): Promise<DeckedFitmentResult>;
2463
+
2464
+ /**
2465
+ * Prices DECKED's 8'-bed cab-side accessory-pack option — "Cab-side Gap" or "Load Floor" — for
2466
+ * one vehicle + bed length, against the two real accessory-pack product handles the site
2467
+ * publishes. `compatible: false` + a `reason` is a REAL, expected answer (not an error) for a
2468
+ * vehicle whose class has no 8'-bed SKU in that product line — e.g. an SUV, which has no Bed
2469
+ * Length option at all. `baseFit` (when resolvable) is the "Cab-side Gap" fit at the same
2470
+ * vehicle + bed length — DECKED's standard 8' option — so a caller can read the real dollar
2471
+ * delta the Load Floor upgrade costs.
2472
+ */
2473
+ priceCabSideOption(vehicleQuery: string, bedLength: string, option: DeckedCabSideOption): Promise<DeckedCabSideOptionResult>;
2474
+ }
2475
+ }
2476
+
1968
2477
  declare namespace BowmarkProvider_dickssportinggoods {
1969
2478
  // ── DICK'S Sporting Goods — the unit's own declarations, verbatim ──
1970
2479
  interface dickssportinggoodsDayHours {
@@ -2116,6 +2625,36 @@ interface dillardsRegistry {
2116
2625
  items: dillardsRegistryItem[];
2117
2626
  }
2118
2627
 
2628
+ interface dillardsGetProductQuery {
2629
+ url: string;
2630
+ }
2631
+
2632
+ interface dillardsProductVariant {
2633
+ sku: string;
2634
+ color: string;
2635
+ size: string | null;
2636
+ shipsOnline: boolean;
2637
+ }
2638
+
2639
+ interface dillardsProduct {
2640
+ id: string;
2641
+ catentryId: string;
2642
+ name: string;
2643
+ brand: string | null;
2644
+ url: string;
2645
+ description: string | null;
2646
+ image: string | null;
2647
+ images: string[];
2648
+ priceLow: number | null;
2649
+ priceHigh: number | null;
2650
+ listPrice: number | null;
2651
+ onSale: boolean;
2652
+ rating: number | null;
2653
+ reviewCount: number;
2654
+ colorCount: number;
2655
+ variants: dillardsProductVariant[];
2656
+ }
2657
+
2119
2658
  /**
2120
2659
  * Dillard's department store catalog, store-level stock, store locator and wedding/gift
2121
2660
  * registry search.
@@ -2161,6 +2700,19 @@ interface dillardsRegistry {
2161
2700
  */
2162
2701
  checkStock(query: dillardsCheckStockQuery): Promise<dillardsStockResult>;
2163
2702
 
2703
+ /**
2704
+ * Reads one product's own page — full name, brand, description, primary image plus every
2705
+ * gallery shot, current price range, pre-markdown `listPrice` and the site's own `onSale`
2706
+ * flag, star rating and review count (both null/0 when the product has no reviews yet — the
2707
+ * site omits the field entirely rather than publishing a zero), `colorCount` (distinct
2708
+ * colourways), and `variants[]`, every size/color combination the page lists with its own sku
2709
+ * and `shipsOnline` flag. Pass `url` exactly as `search` returns it in a row's own `url`.
2710
+ * **This is a summary, not a store check** — `variants[].shipsOnline` is the product's own
2711
+ * online-availability flag, independent of any physical store; whether ONE exact size/color is
2712
+ * in stock at a named store is `checkStock`'s job, not this one's.
2713
+ */
2714
+ getProduct(query: dillardsGetProductQuery): Promise<dillardsProduct>;
2715
+
2164
2716
  /**
2165
2717
  * Searches Dillard's wedding/gift registry (dillards.com/registry) — a distinctive Dillard's
2166
2718
  * feature, not a generic department-store search — and returns the matching registry's own
@@ -5952,6 +6504,31 @@ interface LiquiddeathLiveCart {
5952
6504
  }
5953
6505
  }
5954
6506
 
6507
+ declare namespace BowmarkProvider_lonelyplanet {
6508
+ // ── Lonely Planet — the unit's own declarations, verbatim ──
6509
+ interface LonelyPlanetSearchResult {
6510
+ title: string;
6511
+ subtitle: string | null;
6512
+ collection: string; // e.g. "destinationAssemblies", "products", "journeysItineraries"
6513
+ url: string;
6514
+ }
6515
+
6516
+ /**
6517
+ * Travel guides: destination guides, site search, Best in Travel picks, curated trips and
6518
+ * guidebooks.
6519
+ */
6520
+ interface Unit {
6521
+ /**
6522
+ * Searches lonelyplanet.com's site-wide index — destinations, articles, curated trip
6523
+ * itineraries, guidebooks and points of interest — for a free-text query, the way the site's
6524
+ * own search bar does. Returns each match's title, subtitle, its `collection` (the site's own
6525
+ * result-type tag, e.g. "destinationAssemblies", "products") and a resolvable url. This is the
6526
+ * entry point for a caller who does not yet know which destination page or guide they want.
6527
+ */
6528
+ search(query: string): Promise<LonelyPlanetSearchResult[]>;
6529
+ }
6530
+ }
6531
+
5955
6532
  declare namespace BowmarkProvider_lufthansa {
5956
6533
  // ── Lufthansa — the unit's own declarations, verbatim ──
5957
6534
  interface LufthansaFlightLeg {
@@ -6040,6 +6617,132 @@ interface LufthansaBaggageAllowance {
6040
6617
  }
6041
6618
  }
6042
6619
 
6620
+ declare namespace BowmarkProvider_lululemon {
6621
+ // ── lululemon — the unit's own declarations, verbatim ──
6622
+ interface LululemonVariant {
6623
+ /** The identifier lululemon's own checkout uses, e.g. "us_117376359". */
6624
+ sku: string;
6625
+ /** Which option each dimension is set to, e.g. { size: "4" }. */
6626
+ options: Record<string, string>;
6627
+ /** The store's own availability flag for this exact SKU. */
6628
+ available: boolean;
6629
+ price: number | null;
6630
+ salePrice: number | null;
6631
+ }
6632
+ interface LululemonOptionGroup {
6633
+ /** The machine name. "size" on every lululemon product measured. */
6634
+ type: string;
6635
+ /** The site's own label for the picker, e.g. "Size". */
6636
+ label: string;
6637
+ options: { value: string; label: string }[];
6638
+ }
6639
+ interface LululemonColorway {
6640
+ /** lululemon's own colour code, e.g. "TRUE-NAVY". */
6641
+ colorId: string;
6642
+ color: string;
6643
+ colorFamily: string | null;
6644
+ price: number | null;
6645
+ /** Set only when this colourway is marked down. */
6646
+ salePrice: number | null;
6647
+ promoMessage: string | null;
6648
+ /** The product URL pinned to this colour, as the store publishes it. */
6649
+ url: string;
6650
+ swatchImage: string | null;
6651
+ images: string[];
6652
+ inStock: boolean;
6653
+ optionGroups: LululemonOptionGroup[];
6654
+ /** What can be BOUGHT in this colour right now — not the full size run. */
6655
+ variants: LululemonVariant[];
6656
+ }
6657
+ interface LululemonSizeType {
6658
+ /** A sibling product that is the same style in another length. */
6659
+ productId: string;
6660
+ size: string;
6661
+ selected: boolean;
6662
+ }
6663
+ interface LululemonProduct {
6664
+ id: string;
6665
+ title: string;
6666
+ brand: string;
6667
+ url: string;
6668
+ /** The store's own audience attribute, e.g. "women". */
6669
+ gender: string | null;
6670
+ rating: number | null;
6671
+ reviewCount: number | null;
6672
+ inStock: boolean;
6673
+ priceLow: number | null;
6674
+ priceHigh: number | null;
6675
+ colorways: LululemonColorway[];
6676
+ /** Other lengths of the same style. Empty on every product measured — on this
6677
+ * site an inseam is its OWN product, not an option. */
6678
+ sizeTypes: LululemonSizeType[];
6679
+ }
6680
+ interface LululemonRow {
6681
+ id: string;
6682
+ title: string;
6683
+ url: string;
6684
+ priceLow: number | null;
6685
+ priceHigh: number | null;
6686
+ colorCount: number | null;
6687
+ inStock: boolean | null;
6688
+ /** False when the row came from the site's product index and the catalogue
6689
+ * behind the prices does not carry it. id and url still work. */
6690
+ priced: boolean;
6691
+ }
6692
+ interface LululemonSearch {
6693
+ query: string;
6694
+ products: LululemonRow[];
6695
+ /** How many entries matched before the row cap. */
6696
+ matched: number;
6697
+ warnings: string[];
6698
+ }
6699
+ interface LululemonSimilarProducts {
6700
+ seedProductId: string;
6701
+ products: LululemonRow[];
6702
+ totalRanked: number | null;
6703
+ warnings: string[];
6704
+ }
6705
+
6706
+ /**
6707
+ * lululemon's athletic apparel catalogue — search it, and read one product's full
6708
+ * configurator: every colourway with its own price and images, the size options, and which
6709
+ * exact SKUs are buyable right now.
6710
+ */
6711
+ interface Unit {
6712
+ /**
6713
+ * Searches lululemon's catalogue by free text and returns matching product rows, closest match
6714
+ * first — id, title, URL, price range, how many colours the style comes in, and whether it is
6715
+ * in stock. Ranks over the site's own published product index, then reads the price and colour
6716
+ * count per row. A match the pricing catalogue does not carry still comes back, with `priced:
6717
+ * false` and null prices; `matched` says how many matched before the row cap so a caller can
6718
+ * raise `limit` (default 8, max 24).
6719
+ */
6720
+ search(query: { query: string; limit?: number }): Promise<LululemonSearch>;
6721
+
6722
+ /**
6723
+ * Reads one product's full configurator the way its product page presents it — every colourway
6724
+ * with its own price, sale price, promo message, swatch, image set and URL; the size picker
6725
+ * listing the sizes that colourway can CURRENTLY SELL; and one entry per sellable SKU with the
6726
+ * store's own id, so a caller can answer 'which colours can I get in a 6 right now'. This feed
6727
+ * expresses sold-out by OMISSION rather than by a flag — measured across all three captured
6728
+ * fixtures, the picker and the SKU list are the same set in all 61 colourways and `available`
6729
+ * is true on 363 of 363 SKUs — so presence is the stock signal and `available` is passed
6730
+ * through rather than relied on.
6731
+ */
6732
+ getProduct(query: { productId: string }): Promise<LululemonProduct>;
6733
+
6734
+ /**
6735
+ * Returns the products lululemon's own product pages recommend alongside one product — the
6736
+ * 'You may also like' rail — as priced rows in the store's own ranked order, de-duplicated to
6737
+ * one row per style. It is the store's ranking, not ours, and it does NOT reliably surface the
6738
+ * same garment in another length: measured on the Align 25" pant, none of the six recommended
6739
+ * rows was a sibling inseam even though the sitemap carries them, so reaching another length
6740
+ * is a `search`.
6741
+ */
6742
+ getSimilarProducts(query: { productId: string; limit?: number }): Promise<LululemonSimilarProducts>;
6743
+ }
6744
+ }
6745
+
6043
6746
  declare namespace BowmarkProvider_mailchimp {
6044
6747
  // ── Mailchimp — the unit's own declarations, verbatim ──
6045
6748
  interface mailchimpPlanTier {
@@ -6085,6 +6788,29 @@ interface mailchimpPlanPricing {
6085
6788
  }
6086
6789
  }
6087
6790
 
6791
+ declare namespace BowmarkProvider_marriott {
6792
+ // ── Marriott — the unit's own declarations, verbatim ──
6793
+ interface MarriottHotelListing {
6794
+ id: string; // marsha code
6795
+ name: string;
6796
+ brand: string;
6797
+ url: string;
6798
+ place: string; // the resolved place slug, e.g. "usa-maryland"
6799
+ }
6800
+
6801
+ /** Marriott Bonvoy hotel search, award availability, reservations and property details. */
6802
+ interface Unit {
6803
+ /**
6804
+ * Lists Marriott-family properties published on the site's own hotel-sitemap directory for one
6805
+ * US state or country (`place`, e.g. "Maryland", "France" — never a bare city or landmark,
6806
+ * which this directory does not index per property). `query` (optional) narrows the list by a
6807
+ * case-insensitive substring match against each property's own display name, which often but
6808
+ * not always carries a city. Returns each property's marsha id, name, brand and overview URL.
6809
+ */
6810
+ findHotels(args: { place: string; query?: string }): Promise<MarriottHotelListing[]>;
6811
+ }
6812
+ }
6813
+
6088
6814
  declare namespace BowmarkProvider_mcdonalds {
6089
6815
  // ── McDonald's — the unit's own declarations, verbatim ──
6090
6816
  interface mcdonaldsMenuItem {
@@ -6417,6 +7143,101 @@ interface medicareNursingHomeSearch {
6417
7143
  homes: medicareNursingHome[];
6418
7144
  }
6419
7145
 
7146
+ interface medicareHospitalMeasureGroup {
7147
+ /** How many measures CMS defines for this group nationally. */
7148
+ measuresInGroup: number | null;
7149
+ /** How many of them THIS hospital actually reported — can be fewer than
7150
+ * `measuresInGroup`; the gap is itself informative. */
7151
+ measuresReported: number | null;
7152
+ /** Null for `patientExperience`/`timelyAndEffectiveCare` — CMS publishes no
7153
+ * national-average comparison for those two groups, only a rate. */
7154
+ better: number | null;
7155
+ noDifferent: number | null;
7156
+ worse: number | null;
7157
+ /** CMS's own footnote code(s), verbatim — occasionally more than one,
7158
+ * comma-separated. */
7159
+ footnote: string | null;
7160
+ }
7161
+
7162
+ interface medicareHospital {
7163
+ /** CMS Certification Number — the same id `findNursingHomes` and
7164
+ * `findDoctors`'s hospital affiliations key on. */
7165
+ ccn: string;
7166
+ name: string;
7167
+ address: string;
7168
+ city: string;
7169
+ state: string;
7170
+ zip: string;
7171
+ phone: string | null;
7172
+ county: string | null;
7173
+ /** Straight-line miles to the CENTROID OF THIS HOSPITAL'S OWN ZIP, not its
7174
+ * street address — this dataset carries no coordinates at all, the same gap
7175
+ * `findDoctors`'s clinician file has. Everyone sharing a ZIP shares a
7176
+ * distance, and a large rural ZIP carries real slack. */
7177
+ distanceMiles: number;
7178
+ /** e.g. "Acute Care Hospitals", "Critical Access Hospitals", "Psychiatric",
7179
+ * "Childrens", "Rural Emergency Hospital". Never "Long-term" — that type
7180
+ * belongs to `findRehabAndLongTermCareFacilities`. */
7181
+ hospitalType: string;
7182
+ ownershipType: string | null;
7183
+ emergencyServices: boolean;
7184
+ birthingFriendly: boolean;
7185
+ /** 1-5, or null when CMS publishes none — about 40% of hospitals nationally
7186
+ * carry no overall rating, mostly because they don't participate in the
7187
+ * reporting programs this rating requires, not because they scored poorly.
7188
+ * A null is NOT a bad rating; read it with `overallRatingFootnote`. */
7189
+ overallRating: number | null;
7190
+ /** Can be present even alongside a real star rating — always surface it. */
7191
+ overallRatingFootnote: string | null;
7192
+ /** The measure GROUPS behind the star, not just the rollup. */
7193
+ measureGroups: {
7194
+ mortality: medicareHospitalMeasureGroup;
7195
+ safety: medicareHospitalMeasureGroup;
7196
+ readmission: medicareHospitalMeasureGroup;
7197
+ patientExperience: medicareHospitalMeasureGroup;
7198
+ timelyAndEffectiveCare: medicareHospitalMeasureGroup;
7199
+ };
7200
+ }
7201
+
7202
+ interface medicareHospitalQuery {
7203
+ /** 5-digit US ZIP, placed via the Census Bureau's ZCTA centroid. Either this
7204
+ * or a `latitude`/`longitude` pair is required. */
7205
+ zip?: string;
7206
+ latitude?: number;
7207
+ longitude?: number;
7208
+ /** Straight-line miles, default 25, max 100. */
7209
+ radiusMiles?: number;
7210
+ /** Max hospitals returned, default 20. `matchesInSearchedZips` reports the
7211
+ * unlimited-by-`limit` count for the ZIPs actually searched. */
7212
+ limit?: number;
7213
+ }
7214
+
7215
+ interface medicareHospitalSearch {
7216
+ origin: {
7217
+ zip: string | null;
7218
+ latitude: number;
7219
+ longitude: number;
7220
+ source: "zcta-centroid" | "caller";
7221
+ };
7222
+ radiusMiles: number;
7223
+ /** ZIP Code Tabulation Areas the Census Bureau places inside the radius. */
7224
+ zipsInRadius: number;
7225
+ /** How many of them this call actually queried, nearest-batch-first. */
7226
+ zipsSearched: number;
7227
+ /** FALSE when the walk stopped before every ranked ZIP was queried —
7228
+ * normally because `limit` was already satisfied. Read it before describing
7229
+ * the result as "every hospital in the radius". */
7230
+ radiusFullyScanned: boolean;
7231
+ /** Hospitals found in the ZIPs actually searched, before `limit` — NOT a
7232
+ * radius-wide total when `radiusFullyScanned` is false. */
7233
+ matchesInSearchedZips: number;
7234
+ /** CMS's own publication date for this extract. Not "today" — CMS refreshes
7235
+ * quarterly. */
7236
+ dataAsOf: string | null;
7237
+ /** Nearest first. */
7238
+ hospitals: medicareHospital[];
7239
+ }
7240
+
6420
7241
  /** Whether a clinician takes Medicare's approved amount as payment in full.
6421
7242
  * NOT a boolean, and that is load-bearing: CMS's `ind_assgn` is only ever "Y"
6422
7243
  * or "M" — never "N" — so "does not take Medicare" is not a state this data can
@@ -6542,17 +7363,98 @@ interface medicareClinicianSearch {
6542
7363
  clinicians: medicareClinician[];
6543
7364
  }
6544
7365
 
7366
+ interface medicareMedigapDiscountRange {
7367
+ min: number;
7368
+ max: number;
7369
+ }
7370
+
7371
+ /** How the premium changes with the buyer's age. Attained-age premiums RISE with
7372
+ * age; issue-age and community-rated do not (community additionally moves with
7373
+ * inflation for everyone at once, regardless of age). "unknown" is a real,
7374
+ * intended value — see `ratingMethodRaw` on the policy it appears on — never a
7375
+ * parse failure. */
7376
+ type medicareMedigapRatingMethod = "attainedAge" | "issueAge" | "communityRated" | "unknown";
7377
+
7378
+ interface medicareMedigapPolicy {
7379
+ /** The insurer, exactly as CMS lists it. A parenthetical suffix like
7380
+ * "(Standard I)" is the SAME company selling this plan type under more than one
7381
+ * underwriting tier, each priced separately — do not dedupe by a company name
7382
+ * with the parenthetical stripped. */
7383
+ company: string;
7384
+ ratingMethod: medicareMedigapRatingMethod;
7385
+ /** CMS's raw rate-type string, kept ONLY when `ratingMethod` is "unknown" — a
7386
+ * value CMS started publishing after this mapping was written. Null whenever
7387
+ * `ratingMethod` is one of the three known values. */
7388
+ ratingMethodRaw: string | null;
7389
+ monthlyRateMin: number;
7390
+ monthlyRateMax: number;
7391
+ address: string;
7392
+ phoneNumber: string;
7393
+ website: string | null;
7394
+ /** A married/related-household discount, when this insurer offers one. Priced
7395
+ * SEPARATELY from `householdDiscountRoommate` — one existing does not imply
7396
+ * the other does. */
7397
+ householdDiscountStandard: medicareMedigapDiscountRange | null;
7398
+ /** An unrelated-adults-sharing-a-residence discount, priced separately from
7399
+ * `householdDiscountStandard` and frequently absent when that one is present. */
7400
+ householdDiscountRoommate: medicareMedigapDiscountRange | null;
7401
+ }
7402
+
7403
+ interface medicareMedigapPlanType {
7404
+ /** CMS's discriminator minus its "MEDIGAP_PLAN_TYPE_" prefix — "A", "HIGH_F", or
7405
+ * a Minnesota/Wisconsin waiver type ("MN_BASIC", "WI_HIGH_DEDUCTIBLE", …). Pass
7406
+ * this back as `searchMedigapPlans`'s `planType` argument to re-fetch just
7407
+ * this one type. */
7408
+ planType: string;
7409
+ /** The range Medicare.gov reports ACROSS every insurer selling this plan type
7410
+ * here, before picking one. Null means the `planType` filter named a type the
7411
+ * overview did not list as offered here — `policies` is then reliably empty
7412
+ * too, and null is the honest value rather than a fabricated 0. */
7413
+ monthlyRateMin: number | null;
7414
+ monthlyRateMax: number | null;
7415
+ householdDiscountStandard: medicareMedigapDiscountRange | null;
7416
+ householdDiscountRoommate: medicareMedigapDiscountRange | null;
7417
+ /** Every insurer selling this plan type here. */
7418
+ policies: medicareMedigapPolicy[];
7419
+ }
7420
+
7421
+ interface medicareMedigapQuery {
7422
+ /** 5-digit US ZIP. */
7423
+ zip: string;
7424
+ /** Omit to fetch every plan type the state offers. A result's own `planType`
7425
+ * (`'G'`, `'HIGH_F'`, or a waiver state's `'MN_BASIC'`) fetches just that one. */
7426
+ planType?: string;
7427
+ /** Only needed for the rare ZIP that crosses a STATE line — Medigap is priced
7428
+ * by state, so the wrong side returns a different market, not an error. */
7429
+ county?: string;
7430
+ }
7431
+
7432
+ interface medicareMedigapSearch {
7433
+ zip: string;
7434
+ /** Resolved from the ZIP, never taken from the caller — Medigap is priced by
7435
+ * state and a wrong one silently returns an empty result rather than an error. */
7436
+ state: string;
7437
+ county: medicareCounty;
7438
+ countiesConsidered: medicareCounty[];
7439
+ /** Empty is a real, honest answer for a state/ZIP CMS reports no Medigap market
7440
+ * data for — never a sign this call failed. */
7441
+ planTypes: medicareMedigapPlanType[];
7442
+ }
7443
+
6545
7444
  /**
6546
7445
  * The US government's own Medicare site — Medicare Advantage, Part D and Medigap plan search
6547
7446
  * with real drug-cost estimates, the Care Compare directory of doctors, hospitals, nursing
6548
7447
  * homes, home health, hospice and dialysis providers with CMS quality ratings, the A-to-Z
6549
- * coverage database, and what Medicare itself costs this year. Part D drug-plan search, the
6550
- * doctor-and-clinician directory (specialties, group practice, hospital affiliations by name,
6551
- * and whether they accept Medicare assignment), the nursing-home directory with CMS's full
6552
- * Five-Star record (component ratings, staffing hours, fines, payment denials and Special
6553
- * Focus status), and the Medicare cost reference (premiums, deductibles, coinsurance tiers and
6554
- * the Part B/Part D income brackets) are callable now; the other fifteen declared functions
6555
- * are still stubs.
7448
+ * coverage database, and what Medicare itself costs this year. Part D drug-plan search,
7449
+ * Medigap plan search (every insurer selling each plan type, with its rating method and any
7450
+ * household discount), the doctor-and-clinician directory (specialties, group practice,
7451
+ * hospital affiliations by name, and whether they accept Medicare assignment), the
7452
+ * nursing-home directory with CMS's full Five-Star record (component ratings, staffing hours,
7453
+ * fines, payment denials and Special Focus status), the hospital directory with CMS's overall
7454
+ * rating AND the five measure groups behind it (mortality, safety, readmission, patient
7455
+ * experience, timely and effective care), and the Medicare cost reference (premiums,
7456
+ * deductibles, coinsurance tiers and the Part B/Part D income brackets) are callable now; the
7457
+ * other thirteen declared functions are still stubs.
6556
7458
  */
6557
7459
  interface Unit {
6558
7460
  // UNTYPED, DELIBERATELY OMITTED — `searchDrugPlans({ zip, year, county, limit })` declares no types for
@@ -6609,6 +7511,43 @@ interface medicareClinicianSearch {
6609
7511
  * `dataAsOf` carries CMS's own publication date — this is a periodic extract, not a live read.
6610
7512
  */
6611
7513
  findDoctors(query: medicareClinicianQuery): Promise<medicareClinicianSearch>;
7514
+
7515
+ /**
7516
+ * The Medigap (Medicare Supplement) plan types sold in a ZIP's state, each with the insurers
7517
+ * selling it, their premium range, their RATING METHOD (attained-age — rises with age;
7518
+ * issue-age or community-rated — does not) and any household discount. `zip` is a 5-digit US
7519
+ * ZIP; `county` disambiguates the rare ZIP that crosses a STATE line (Medigap is priced by
7520
+ * state, not region), the same shape as `searchDrugPlans`'s own `county`. Omit `planType` to
7521
+ * fetch every plan type the state offers (Minnesota and Wisconsin price under their own
7522
+ * federal waiver — `MN_BASIC`, `WI_HIGH_DEDUCTIBLE`, etc. — rather than the national letters,
7523
+ * and this function returns exactly what the state offers); pass a result's own `planType`
7524
+ * (e.g. `'G'`, `'HIGH_F'`) to fetch just that one, one call instead of every letter's. NOTE
7525
+ * the field the manifest exists for: two policies can share the same letter (which by law
7526
+ * means identical coverage) and today's premium, and still diverge by hundreds of dollars a
7527
+ * year within a decade purely because one is `attainedAge` and the other is not — never rank
7528
+ * or recommend a Medigap policy on premium alone without surfacing `ratingMethod`.
7529
+ */
7530
+ searchMedigapPlans(arg0: medicareMedigapQuery): Promise<medicareMedigapSearch>;
7531
+
7532
+ /**
7533
+ * The Medicare-registered hospitals near a place, nearest first, each with CMS's overall star
7534
+ * rating AND the five measure groups behind it (mortality, safety, readmission, patient
7535
+ * experience, timely and effective care — each with how many measures the hospital reported
7536
+ * and, for the first three, how many beat/matched/trailed the national average), the hospital
7537
+ * type (acute care, critical access, psychiatric, children's, rural emergency, VA, DoD — never
7538
+ * the long-term/rehab types `findRehabAndLongTermCareFacilities` covers), ownership, whether
7539
+ * it offers emergency services, and CMS's birthing-friendly designation. Pass a 5-digit `zip`
7540
+ * (placed via the Census Bureau's ZCTA centroid) or a `latitude`/`longitude` pair;
7541
+ * `radiusMiles` defaults to 25 (max 100) and `limit` to 20. NOTE the two things that make this
7542
+ * answer honest. (1) `overallRating` is null for roughly 40% of hospitals nationally — mostly
7543
+ * small or non-reporting facilities, not poor performers — and is never the whole story: read
7544
+ * it alongside `measureGroups`, since a hospital can report zero of a group's measures and
7545
+ * still carry an overall star from the groups it does report. (2) `distanceMiles` is to the
7546
+ * centroid of the hospital's own ZIP, not its street address — this dataset carries no
7547
+ * coordinates — so `radiusFullyScanned` and `matchesInSearchedZips` carry the same
7548
+ * walked-radius honesty split `findDoctors` uses, for the identical reason.
7549
+ */
7550
+ findHospitals(query: medicareHospitalQuery): Promise<medicareHospitalSearch>;
6612
7551
  }
6613
7552
  }
6614
7553
 
@@ -7477,6 +8416,34 @@ interface ottoProduct {
7477
8416
  sizes: { label: string; selected: boolean; available: boolean }[];
7478
8417
  colors: { label: string; selected: boolean; available: boolean; image: string | null }[];
7479
8418
  }
8419
+ interface ottoSearchPrice {
8420
+ currentAmount: number;
8421
+ currentDisplay: string;
8422
+ suggestedRetailAmount: number | null;
8423
+ suggestedRetailDisplay: string | null;
8424
+ comparativeAmount: number | null;
8425
+ comparativeDisplay: string | null;
8426
+ onSale: boolean;
8427
+ isStartingPrice: boolean;
8428
+ }
8429
+ interface ottoSearchResult {
8430
+ productId: string;
8431
+ variationId: string;
8432
+ articleNumber: string;
8433
+ url: string;
8434
+ name: string;
8435
+ brand: string;
8436
+ price: ottoSearchPrice;
8437
+ availability: { state: string; detail: string };
8438
+ thumbnail: string | null;
8439
+ rating: { value: number; count: number } | null;
8440
+ matchType: string;
8441
+ totalCount: number;
8442
+ }
8443
+ interface ottoSearchQuery {
8444
+ query: string;
8445
+ limit?: number;
8446
+ }
7480
8447
 
7481
8448
  /** German online marketplace — fashion, furniture, electronics and more. */
7482
8449
  interface Unit {
@@ -7488,6 +8455,20 @@ interface ottoProduct {
7488
8455
  * retired listing).
7489
8456
  */
7490
8457
  getProduct(url: string): Promise<ottoProduct>;
8458
+
8459
+ /**
8460
+ * Searches OTTO's catalog for a free-text keyword the way the site's own search bar does,
8461
+ * across its whole marketplace (OTTO's own catalog and third-party sellers) and returns
8462
+ * matching rows: price (current + UVP + the site's own comparison price when it publishes
8463
+ * one), availability, brand, rating and a thumbnail. `matchType` on each row is the site's own
8464
+ * retrieval-type token ("hybrid" for a real keyword match, "semantic" when nothing matched
8465
+ * literally and the site is showing similar items instead — OTTO's engine almost never returns
8466
+ * a hard empty result). Returns one page (up to ~150 rows); `totalCount` on each row is the
8467
+ * site's own total match count across every page. `url` feeds `getProduct` directly for OTTO's
8468
+ * own catalog rows; a third-party marketplace row's URL does not match `getProduct`'s current
8469
+ * `-C<id>/` pattern.
8470
+ */
8471
+ search(query: ottoSearchQuery): Promise<ottoSearchResult[]>;
7491
8472
  }
7492
8473
  }
7493
8474
 
@@ -7630,13 +8611,56 @@ interface PizzahutPricedLineItem {
7630
8611
  specialInstructions: string | null;
7631
8612
  }
7632
8613
 
8614
+ // ── getMenuItem ───────────────────────────────────────────────────────────
8615
+ interface PizzahutMenuItem {
8616
+ storeNumber: string;
8617
+ productCode: string; // pass this + a variantCode below to priceOrder
8618
+ name: string | null;
8619
+ description: string | null;
8620
+ category: string | null;
8621
+ currency: string;
8622
+ variants: PizzahutMenuItemVariant[];
8623
+ }
8624
+
8625
+ interface PizzahutMenuItemVariant {
8626
+ variantCode: string; // the priced configuration — size and crust are IN this code
8627
+ name: string | null;
8628
+ priceCents: number; // this variant's OWN starting price
8629
+ attributes: string[]; // e.g. ["Original Pan® Pizza", "Personal Pan"]
8630
+ slots: PizzahutMenuItemSlot[];
8631
+ servingSize: { quantity: number; unit: string } | null;
8632
+ allergens: { allergen: string; presence: string }[];
8633
+ }
8634
+
8635
+ interface PizzahutMenuItemSlot {
8636
+ slotCode: string; // e.g. "slot_pizza_cheese", "slot_toppings"
8637
+ name: string | null;
8638
+ minAllowedSelections: number;
8639
+ maxAllowedSelections: number | null; // null = no cap the site publishes
8640
+ modifiers: PizzahutMenuItemModifier[];
8641
+ }
8642
+
8643
+ interface PizzahutMenuItemModifier {
8644
+ modifierCode: string;
8645
+ name: string | null;
8646
+ weights: PizzahutMenuItemWeight[]; // portion/intensity choices for this modifier
8647
+ }
8648
+
8649
+ interface PizzahutMenuItemWeight {
8650
+ modifierWeightCode: string; // pass slotCode + modifierCode + this to priceOrder's modifiers
8651
+ name: string | null; // e.g. "Light", "Regular", "Extra"
8652
+ priceCents: number; // what THIS option costs on THIS variant — varies by size
8653
+ }
8654
+
7633
8655
  /**
7634
8656
  * Pizza Hut's US ordering site. `findStores` returns the stores serving any US address or ZIP,
7635
8657
  * nearest first, with each one's number, hours, distance, phone and the terms of the carryout
7636
- * and delivery it offers. `priceOrder` then prices a basket at one of those stores WITHOUT
8658
+ * and delivery it offers. `getMenuItem` reads one item's full store-level configuration by
8659
+ * name — every size/crust, and every optional topping/sauce/cheese slot with what each choice
8660
+ * costs on THAT variant. `priceOrder` then prices a basket at one of those stores WITHOUT
7637
8661
  * placing it — line items, subtotal, sales tax, delivery fee and the real total Pizza Hut
7638
- * would charge, for carryout or to a delivery address, anonymously. Reading the store menu and
7639
- * the current deals are declared and still stubs.
8662
+ * would charge, for carryout or to a delivery address, anonymously. Browsing the full menu
8663
+ * list and reading the current deals are still stubs.
7640
8664
  */
7641
8665
  interface Unit {
7642
8666
  /**
@@ -7685,6 +8709,27 @@ interface PizzahutPricedLineItem {
7685
8709
  * cart so totals never accumulate across calls.
7686
8710
  */
7687
8711
  priceOrder(order: { storeNumber: string; items: { productCode: string; variantCode: string; quantity?: number; modifiers?: { slotCode: string; modifierCode: string; modifierWeightCode: string }[]; specialInstructions?: string }[]; fulfillment?: "carryout" | "delivery"; deliveryAddress?: { address: string; address2?: string; city: string; state: string; zip: string; deliveryInstructions?: string; phone?: string }; requestedTime?: string; promoCode?: string }): Promise<PizzahutPricedOrder>;
8712
+
8713
+ /**
8714
+ * Reads one menu item in full for a store — every size/crust it comes in, each one's own
8715
+ * starting price, and every optional slot (sauce, cheese, toppings, seasoning, cut) with what
8716
+ * each choice costs ON THAT VARIANT, plus nutrition serving size and allergens where the site
8717
+ * publishes them. `storeNumber` comes from `findStores`. `getMenu` (the sibling function that
8718
+ * would normally hand out a `productCode` to browse by) is still a stub, so `item` is a NAME
8719
+ * instead — "Pepperoni Pizza" — matched first as an exact `productCode` if you already have
8720
+ * one, then an exact case-insensitive name, then a substring; `category` (a code like "pizza"
8721
+ * or a display name like "Pizza") narrows the search when a name alone is ambiguous. Zero
8722
+ * matches or more than one both throw as caller-fixable, the second one listing every
8723
+ * candidate's name, category and `productCode` so a retry can pick one exactly.
8724
+ * **Configuration prices are per VARIANT, not per product** — measured 2026-08-06 on the same
8725
+ * Pepperoni Pizza, Extra Cheese is +$0.50 on a Personal Pan, +$2.89 on a Medium, +$3.39 on a
8726
+ * Large, so this returns each variant's own priced slot tree rather than one flat add-on price
8727
+ * for the whole item. A `variantCode` plus a `slotCode`/`modifierCode`/`modifierWeightCode`
8728
+ * triple read here is exactly what `priceOrder` takes to price a configured basket. Wholly
8729
+ * anonymous, same guest-token read `priceOrder` uses — no account, no session, nothing
8730
+ * identifying.
8731
+ */
8732
+ getMenuItem(args: { storeNumber: string; item: string; category?: string }): Promise<PizzahutMenuItem>;
7688
8733
  }
7689
8734
  }
7690
8735
 
@@ -8883,6 +9928,79 @@ interface SamsclubMembershipPlan {
8883
9928
  }
8884
9929
  }
8885
9930
 
9931
+ declare namespace BowmarkProvider_sears {
9932
+ // ── Sears — the unit's own declarations, verbatim ──
9933
+ interface SearsSearchPrice {
9934
+ currentAmount: number;
9935
+ currentDisplay: string;
9936
+ regularAmount: number | null;
9937
+ regularDisplay: string | null;
9938
+ onSale: boolean;
9939
+ }
9940
+ interface SearsSearchResult {
9941
+ productId: string;
9942
+ url: string;
9943
+ name: string;
9944
+ brand: string | null;
9945
+ price: SearsSearchPrice;
9946
+ thumbnail: string | null;
9947
+ rating: number | null;
9948
+ reviewCount: number | null;
9949
+ totalCount: number;
9950
+ }
9951
+ interface SearsSearchQuery {
9952
+ query: string;
9953
+ zipCode?: string;
9954
+ limit?: number;
9955
+ }
9956
+ interface SearsProductPrice {
9957
+ currentAmount: number;
9958
+ currentDisplay: string;
9959
+ regularAmount: number | null;
9960
+ regularDisplay: string | null;
9961
+ onSale: boolean;
9962
+ }
9963
+ interface SearsProductSpecification {
9964
+ label: string;
9965
+ attributes: string[];
9966
+ }
9967
+ interface SearsProduct {
9968
+ productId: string;
9969
+ url: string;
9970
+ name: string;
9971
+ brand: string | null;
9972
+ price: SearsProductPrice;
9973
+ inStock: boolean;
9974
+ images: string[];
9975
+ description: string | null;
9976
+ specifications: SearsProductSpecification[];
9977
+ }
9978
+
9979
+ /** Sears' own storefront — product search, product detail, fulfillment/stock and store locator. */
9980
+ interface Unit {
9981
+ /**
9982
+ * Searches Sears' live catalog by free-text keyword the way the site's own search bar does,
9983
+ * returning matching product rows: id, name, brand, current and regular price, a thumbnail,
9984
+ * rating/review count and the site's own total match count. A query with no matches returns an
9985
+ * empty array — Sears not carrying something is a real, common answer, not an error. `zipCode`
9986
+ * narrows price/availability the way the site's own zip cookie does; omit it for the site's
9987
+ * own default (New York, 10101). Returns one page (up to 48 rows); the site publishes no
9988
+ * further paging parameter this function reaches.
9989
+ */
9990
+ search(query: SearsSearchQuery): Promise<SearsSearchResult[]>;
9991
+
9992
+ /**
9993
+ * Reads one Sears product in full: name, brand, current and regular price, whether it's in
9994
+ * stock, every image and the site's own full labelled spec sheet (dimensions, features,
9995
+ * overview). Takes the product id or full URL from Sears's own "/p-<id>" pattern — `search`
9996
+ * returns both, so the ordinary path is a `search` row's `id` or `url`. `zipCode` narrows
9997
+ * price/availability the way the site's own zip cookie does; omit it for the site's own
9998
+ * default (New York, 10101). THROWS on an id the site does not recognise.
9999
+ */
10000
+ getProduct(idOrUrl: string, opts?: { zipCode?: string }): Promise<SearsProduct>;
10001
+ }
10002
+ }
10003
+
8886
10004
  declare namespace BowmarkProvider_selectblinds {
8887
10005
  // ── SelectBlinds — the unit's own declarations, verbatim ──
8888
10006
  // SelectBlinds' OWN shapes — not a capability contract.
@@ -10318,12 +11436,38 @@ interface walmartStore {
10318
11436
  services: Array<{ name: string; displayName: string; phone: string | null }>;
10319
11437
  }
10320
11438
 
11439
+ interface walmartSearchResult {
11440
+ itemId: string;
11441
+ name: string;
11442
+ brand: string | null;
11443
+ url: string;
11444
+ image: string | null;
11445
+ price: number | null;
11446
+ wasPrice: number | null;
11447
+ priceRangeMin: number | null;
11448
+ inStock: boolean;
11449
+ rating: number | null;
11450
+ reviewCount: number;
11451
+ sponsored: boolean;
11452
+ totalMatches: number;
11453
+ }
11454
+
10321
11455
  /**
10322
- * Walmart.com — product search, product detail, store-level stock, store locator and more. One
10323
- * function built: finding nearby stores by ZIP, with address, hours, phone and department
10324
- * availability.
11456
+ * Walmart.com — product search, product detail, store-level stock, store locator and more. Two
11457
+ * functions built: keyword search across the catalog, and finding nearby stores by ZIP with
11458
+ * address, hours, phone and department availability.
10325
11459
  */
10326
11460
  interface Unit {
11461
+ /**
11462
+ * Searches walmart.com's catalog for a keyword and returns matching products — item id, name,
11463
+ * brand, price (plus the pre-markdown price and the cheapest OTHER purchase option's price
11464
+ * when the site names a range), image, in-stock flag, rating, review count and whether the row
11465
+ * is a sponsored placement — the way the site's own search bar does. Returns the site's own
11466
+ * first results page (organic rows only, its own trending/related carousels excluded) in the
11467
+ * site's own default relevance order.
11468
+ */
11469
+ search(args: { query: string; limit?: number }): Promise<walmartSearchResult[]>;
11470
+
10327
11471
  /**
10328
11472
  * Finds nearby Walmart stores for a 5-digit US ZIP code — address, phone, hours,
10329
11473
  * geo-coordinates, distance, which fulfilment methods each store supports (curbside pickup,
@@ -10354,6 +11498,26 @@ interface wellfoundRow {
10354
11498
  equityMax: number | null;
10355
11499
  }
10356
11500
 
11501
+ interface wellfoundJobDetail {
11502
+ id: string;
11503
+ title: string;
11504
+ url: string;
11505
+ descriptionHtml: string;
11506
+ employmentType: string | null;
11507
+ experienceLevel: string | null;
11508
+ remote: boolean;
11509
+ locations: string[];
11510
+ remoteLocations: string[];
11511
+ compensationRaw: string | null;
11512
+ salaryMin: number | null;
11513
+ salaryMax: number | null;
11514
+ salaryCurrency: "USD" | null;
11515
+ equityMin: number | null;
11516
+ equityMax: number | null;
11517
+ datePosted: string | null;
11518
+ company: { name: string; slug: string | null; url: string | null; website: string | null; logoUrl: string | null };
11519
+ }
11520
+
10357
11521
  interface wellfoundCompanyRow {
10358
11522
  id: string;
10359
11523
  name: string;
@@ -10394,6 +11558,15 @@ interface wellfoundCompanyRow {
10394
11558
  * filters over the fields the search itself returns.
10395
11559
  */
10396
11560
  searchCompanies(args: object): Promise<wellfoundCompanyRow[]>;
11561
+
11562
+ /**
11563
+ * Reads one job posting in full the way its own detail page does — takes the `url` a
11564
+ * `searchJobs`/`searchCompanies` row already carries (a bare id 404s, measured 2026-08-06) —
11565
+ * returning the full description, salary band, equity range (both parsed off the header chip;
11566
+ * equity has no structured-data field on this site), location, remote policy, the site's own
11567
+ * experience-requirement text and the hiring startup.
11568
+ */
11569
+ getJob(args: { url: string }): Promise<wellfoundJobDetail>;
10397
11570
  }
10398
11571
  }
10399
11572
 
@@ -10572,11 +11745,13 @@ interface BowmarkProviders {
10572
11745
  bhphoto: BowmarkProvider_bhphoto.Unit;
10573
11746
  blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
10574
11747
  bmwusa: BowmarkProvider_bmwusa.Unit;
11748
+ cancer: BowmarkProvider_cancer.Unit;
10575
11749
  cars: BowmarkProvider_cars.Unit;
10576
11750
  cheapflights: BowmarkProvider_cheapflights.Unit;
10577
11751
  chriscraft: BowmarkProvider_chriscraft.Unit;
10578
11752
  classpass: BowmarkProvider_classpass.Unit;
10579
11753
  cloudflare: BowmarkProvider_cloudflare.Unit;
11754
+ decked: BowmarkProvider_decked.Unit;
10580
11755
  dickssportinggoods: BowmarkProvider_dickssportinggoods.Unit;
10581
11756
  dillards: BowmarkProvider_dillards.Unit;
10582
11757
  discounttire: BowmarkProvider_discounttire.Unit;
@@ -10600,8 +11775,11 @@ interface BowmarkProviders {
10600
11775
  labcorp: BowmarkProvider_labcorp.Unit;
10601
11776
  linkedin: BowmarkProvider_linkedin.Unit;
10602
11777
  liquiddeath: BowmarkProvider_liquiddeath.Unit;
11778
+ lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
10603
11779
  lufthansa: BowmarkProvider_lufthansa.Unit;
11780
+ lululemon: BowmarkProvider_lululemon.Unit;
10604
11781
  mailchimp: BowmarkProvider_mailchimp.Unit;
11782
+ marriott: BowmarkProvider_marriott.Unit;
10605
11783
  mcdonalds: BowmarkProvider_mcdonalds.Unit;
10606
11784
  medicare: BowmarkProvider_medicare.Unit;
10607
11785
  microcenter: BowmarkProvider_microcenter.Unit;
@@ -10621,6 +11799,7 @@ interface BowmarkProviders {
10621
11799
  reddit: BowmarkProvider_reddit.Unit;
10622
11800
  ritani: BowmarkProvider_ritani.Unit;
10623
11801
  samsclub: BowmarkProvider_samsclub.Unit;
11802
+ sears: BowmarkProvider_sears.Unit;
10624
11803
  selectblinds: BowmarkProvider_selectblinds.Unit;
10625
11804
  semihandmade: BowmarkProvider_semihandmade.Unit;
10626
11805
  soundcloud: BowmarkProvider_soundcloud.Unit;
@@ -17433,6 +18612,7 @@ interface BowmarkProviders {
17433
18612
  beyondthemeatsuit: BowmarkFamily_shopify_store.Unit;
17434
18613
  beyondthenotes: BowmarkFamily_shopify_store.Unit;
17435
18614
  beyondtheshimmer: BowmarkFamily_shopify_store.Unit;
18615
+ beyondyoga: BowmarkFamily_shopify_store.Unit;
17436
18616
  beyourstheme: BowmarkFamily_shopify_store.Unit;
17437
18617
  beyoursthemeclothing: BowmarkFamily_shopify_store.Unit;
17438
18618
  beyoursthemefashion: BowmarkFamily_shopify_store.Unit;