@bowmark/web 1.9.0 → 1.10.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: be4cdedcfa4c990cc2208fd7e5f33c2dd386c9c210168b9f2c02f259fbe8fbba
9
- // 9 capabilities, 141 providers, 422 typed functions, 20 refused.
8
+ // Manifest version: cad629ad449ffa7b6e12b0299082209643912c130193213d154764eeb434951f
9
+ // 10 capabilities, 155 providers, 457 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
@@ -102,7 +102,10 @@ type CallOptions = {
102
102
  * IATA codes and a city name would come back as an empty list an agent would misread as "no
103
103
  * cars available". `warnings` is always present and names anything dropped or clamped —
104
104
  * INCLUDING a site that timed out or failed, which quoted nothing and is not the same as an
105
- * airport with no availability. `options.timeoutMs` sets the per-site budget (default 30000).
105
+ * airport with no availability. And when NO site answered at all this THROWS rather than
106
+ * returning `cars: []`, because those two are the same value and only one of them means there
107
+ * are no cars: a list you receive is always a list a site actually gave. `options.timeoutMs`
108
+ * sets the per-site budget (default 30000).
106
109
  */
107
110
  search(query: CarQuery, limit?: number, options?: CallOptions): Promise<CarSearchResult>;
108
111
  }
@@ -315,9 +318,11 @@ type FlightStatusResult = {
315
318
  * completely different fact from a site that was never reached, so coverage is NOT inferable
316
319
  * from the rows. Read `warnings` before treating them as the whole market: a dropped site
317
320
  * means the real cheapest fare may not be here at all. Three of the four sites run one shared
318
- * engine, so they tend to fail together. `options.timeoutMs` sets the per-site budget (default
319
- * 30000) a site slower than that is dropped and named, so the answer arrives inside the
320
- * calling client's own tool-call limit rather than not at all.
321
+ * engine, so they tend to fail together and when ALL FOUR are gone this THROWS instead of
322
+ * returning `flights: []`, since an empty list would otherwise be indistinguishable from a
323
+ * route nobody flies. `options.timeoutMs` sets the per-site budget (default 30000) a site
324
+ * slower than that is dropped and named, so the answer arrives inside the calling client's own
325
+ * tool-call limit rather than not at all.
321
326
  */
322
327
  search(query: FlightQuery, options?: CallOptions): Promise<FlightSearchResult>;
323
328
 
@@ -424,8 +429,10 @@ type CallOptions = {
424
429
  * multiplying `nightPrice` by the night count on a multi-room search is out by a factor of
425
430
  * `rooms`; compare on `price`. `warnings` is always present and names anything dropped or
426
431
  * clamped — INCLUDING a site that timed out or failed, which returned nothing and is not the
427
- * same as a sold-out destination. This route drives a real browser and is the slowest thing in
428
- * the library: 21-26s measured, against `options.timeoutMs`'s 30000 default. RAISE that budget
432
+ * same as a sold-out destination. And when NO site answered at all this THROWS rather than
433
+ * returning `hotels: []`, because those two are the same value and only one of them means
434
+ * there is nowhere to stay. This route drives a real browser and is the slowest thing in the
435
+ * library: 21-26s measured, against `options.timeoutMs`'s 30000 default. RAISE that budget
429
436
  * rather than lowering it if you batch several searches into one call.
430
437
  */
431
438
  search(query: HotelQuery, limit?: number, options?: CallOptions): Promise<HotelSearchResult>;
@@ -577,8 +584,9 @@ type CallOptions = {
577
584
  * would otherwise return a list an agent would misread. `reportCategories` says which
578
585
  * regulator reports exist for a carrier, NOT which lines it writes. `warnings` is always
579
586
  * present, and a source that timed out or failed is NAMED there — read it before treating an
580
- * empty list as "no carrier is licensed there". `options.timeoutMs` sets the per-source budget
581
- * (default 30000).
587
+ * empty list as "no carrier is licensed there". When NO source answered at all this THROWS
588
+ * instead of returning an empty list, so that misreading is not available. `options.timeoutMs`
589
+ * sets the per-source budget (default 30000).
582
590
  */
583
591
  searchCarriers(query: CarrierQuery, limit?: number, options?: CallOptions): Promise<CarrierSearchResult>;
584
592
 
@@ -595,7 +603,9 @@ type CallOptions = {
595
603
  * only when the query carries neither a zip nor a city+state — one carrier alone is a complete
596
604
  * query, not a partial one. `warnings` is always present: a carrier the query lacked input
597
605
  * for, or one that timed out or failed, is NAMED there — read it before treating a short list
598
- * as the whole answer. `options.timeoutMs` sets the per-carrier budget (default 30000).
606
+ * as the whole answer. When every carrier the query DID reach for failed, this THROWS rather
607
+ * than returning an empty list, which would otherwise read as "no agent near you".
608
+ * `options.timeoutMs` sets the per-carrier budget (default 30000).
599
609
  */
600
610
  findAgent(query: AgentLocatorQuery, limit?: number, options?: CallOptions): Promise<AgentSearchResult>;
601
611
 
@@ -637,8 +647,9 @@ type CallOptions = {
637
647
  * answered: this is a published directory with no legitimate empty case, so a missing section
638
648
  * or a changed page throws at the provider rather than under-reporting who underwrites the
639
649
  * 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).
650
+ * source today, read it before trusting a short list is the whole directory. When no source
651
+ * answered at all this THROWS, so an outage is never handed back as a directory with nothing
652
+ * in it. `options.timeoutMs` sets the per-source budget (default 30000).
642
653
  */
643
654
  listReferralCarriers(query?: ReferralCarrierQuery, options?: CallOptions): Promise<ReferralCarrierListResult>;
644
655
  }
@@ -697,8 +708,10 @@ type MusicTrackResult = {
697
708
  * synthwave") and returns up to `limit` normalized tracks (default 20, max 200), most-played
698
709
  * first. Tracks with no reported play count sort last rather than as zero. `warnings` is
699
710
  * always present and names anything dropped — INCLUDING a catalogue that timed out or failed,
700
- * which returned nothing and is not the same as a query with no matches. `options.timeoutMs`
701
- * sets the per-catalogue budget (default 30000).
711
+ * which returned nothing and is not the same as a query with no matches. And when NO catalogue
712
+ * answered at all this THROWS rather than returning `tracks: []`, because those two are the
713
+ * same value and only one of them means nothing matched. `options.timeoutMs` sets the
714
+ * per-catalogue budget (default 30000).
702
715
  */
703
716
  search(query: string, limit?: number, options?: CallOptions): Promise<MusicSearchResult>;
704
717
 
@@ -783,8 +796,9 @@ type ProductResult = {
783
796
  * price-sorted (cheapest first), each tagged with its `store`. A store that is genuinely empty
784
797
  * contributes nothing and says nothing; a store that TIMED OUT or FAILED is named in
785
798
  * `warnings`, and the two are not the same fact — "the cheapest of three stores" is a wrong
786
- * claim when one of them never answered. `options.timeoutMs` sets the per-store budget
787
- * (default 30000).
799
+ * claim when one of them never answered. When ALL THREE never answered this THROWS rather than
800
+ * returning `offers: []`, because that empty list is the same value as a part nobody stocks.
801
+ * `options.timeoutMs` sets the per-store budget (default 30000).
788
802
  */
789
803
  search(query: string, options?: CallOptions): Promise<OfferSearchResult>;
790
804
 
@@ -861,6 +875,80 @@ type ReadResult = {
861
875
  }
862
876
  }
863
877
 
878
+ declare namespace BowmarkCapability_search {
879
+ // ── Web search — the unit's own declarations, verbatim ──
880
+ type SearchResult = {
881
+ source: string // which ENGINE produced this row ("bing")
882
+ rank: number // 1-based, in that engine's own ranking
883
+ title: string
884
+ url: string // the destination page, already unwrapped from any
885
+ // click-tracker — pass it straight to read.page
886
+ snippet: string | null // the engine's blurb; null when it published none
887
+ published: string | null // ISO. On `web` this is often the engine's CRAWL
888
+ // date, not the page's — do not report it as one
889
+ }
890
+ type SearchWebResult = {
891
+ query: string
892
+ engine: string // who actually answered. With a fallback chain this
893
+ // is the difference between the primary engine's
894
+ // ranking and the standby's
895
+ results: SearchResult[]
896
+ warnings: string[] // always present. Names every engine tried and
897
+ // FAILED before the one that answered
898
+ }
899
+
900
+ // news adds the two things a news index has and a web index does not
901
+ type NewsResult = SearchResult & {
902
+ publisher: string | null // the outlet
903
+ imageUrl: string | null // usually the engine's cached thumbnail
904
+ }
905
+ type SearchNewsResult = {
906
+ query: string
907
+ engine: string
908
+ results: NewsResult[]
909
+ warnings: string[]
910
+ }
911
+
912
+ type CallOptions = {
913
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
914
+ // A provider slower than this is DROPPED from the results and
915
+ // NAMED in warnings — never silently absent
916
+ }
917
+
918
+ /**
919
+ * Find pages on the web when you do not already know the URL — the step before read.page.
920
+ * Returns ranked results with title, destination URL and snippet. `news` is the same read over
921
+ * news coverage, with real publication dates and the outlet's name. ONE ENGINE TODAY (Bing),
922
+ * so if it is down this fails rather than degrading — it throws, and never reports an outage
923
+ * as zero results. Two things that engine cannot do, measured on `web`: it never returns an
924
+ * empty list even when nothing matches, and it ignores search operators like site:.
925
+ */
926
+ interface Unit {
927
+ /**
928
+ * Searches the web and returns ranked results — title, destination URL, snippet — from the
929
+ * first engine in the chain that answers. `engine` names which one that was, and `warnings`
930
+ * names any that were tried and failed first. Feed a result's `url` straight to
931
+ * bowmark.read.page to actually read it. TWO THINGS TO KNOW BEFORE YOU TRUST THE ROWS: the
932
+ * engine NEVER returns an empty list, so results are its best offer rather than proof anything
933
+ * matched, and it IGNORES operators — a `site:example.com` query is not scoped to that site.
934
+ * When every engine fails this THROWS rather than returning zero rows, because no engine
935
+ * reached is not the same as nothing found.
936
+ */
937
+ web(query: string | { query: string, limit?: number }, limit?: number, options?: CallOptions): Promise<SearchWebResult>;
938
+
939
+ /**
940
+ * Searches news coverage and returns stories with the headline, the outlet's own article URL,
941
+ * a summary, the publisher's name and a real publication timestamp. Use this rather than `web`
942
+ * whenever the question is about what happened or when — `web`'s dates are commonly the
943
+ * engine's crawl stamp, and these are the story's own. NOT MEASURED on the two limits `web`
944
+ * declares: nobody has checked whether this feed returns an empty list for a query with no
945
+ * coverage, or whether it honours operators. Treat both as unknown rather than as working —
946
+ * `web`'s answers are the ones with fixtures behind them.
947
+ */
948
+ news(query: string | { query: string, limit?: number }, limit?: number, options?: CallOptions): Promise<SearchNewsResult>;
949
+ }
950
+ }
951
+
864
952
  declare namespace BowmarkCapability_sheds {
865
953
  // ── Sheds and portable buildings (configure and price) — the unit's own declarations, verbatim ──
866
954
  type ShedSize = {
@@ -958,7 +1046,9 @@ type CallOptions = {
958
1046
  * as well as costing it — a real product image, the roof line and roofing material, the
959
1047
  * maker's own wall-height spec — and carries `orderUrl`, their own page to go order that
960
1048
  * build. `warnings` is always present and names a maker that failed, styles that do not build
961
- * the size, and a capped fan. `options.timeoutMs` sets the per-maker budget (default 30000).
1049
+ * the size, and a capped fan. When NO maker answered at all this THROWS rather than returning
1050
+ * an empty list — "nobody builds a 12x20" and "nobody could be reached" are otherwise the same
1051
+ * result. `options.timeoutMs` sets the per-maker budget (default 30000).
962
1052
  */
963
1053
  quote(request: ShedQuoteRequest, options?: CallOptions): Promise<ShedQuoteResult>;
964
1054
 
@@ -967,7 +1057,9 @@ type CallOptions = {
967
1057
  * it can be built in, every real buildable size in FEET, and what the building IS (a real
968
1058
  * product image, the roof line and roofing material, the maker's own wall-height spec). Use it
969
1059
  * to see what exists before pricing, or to answer "what sizes do they even make". `warnings`
970
- * names any maker that returned nothing, which is not the same as a maker with no styles.
1060
+ * names any maker that returned nothing, which is not the same as a maker with no styles. When
1061
+ * NO maker answered at all this THROWS rather than returning an empty list, because an empty
1062
+ * catalogue and an unreachable one are otherwise the same value.
971
1063
  */
972
1064
  listStyles(options?: CallOptions): Promise<ShedStylesResult>;
973
1065
 
@@ -975,7 +1067,9 @@ type CallOptions = {
975
1067
  * Looks up the real places that sell a maker's buildings in one US state or Canadian province
976
1068
  * — full name ("Tennessee") or abbreviation ("TN") — with name, city, phone and the dealer's
977
1069
  * own page, for handing a priced configuration to somebody who can actually build it. `phone`
978
- * is null when the directory lists none, never an empty string.
1070
+ * is null when the directory lists none, never an empty string. `warnings` names any maker
1071
+ * whose directory could not be read, and when NO directory could be read at all this THROWS
1072
+ * rather than returning an empty list, which would read as "no dealers in that state".
979
1073
  */
980
1074
  findDealers(state: string, options?: CallOptions): Promise<ShedDealerResult>;
981
1075
  }
@@ -1646,6 +1740,49 @@ interface AshleyFurnitureStore {
1646
1740
  }
1647
1741
  }
1648
1742
 
1743
+ declare namespace BowmarkProvider_asppoolco {
1744
+ // ── ASP - America's Swimming Pool Company — the unit's own declarations, verbatim ──
1745
+ // ASP's OWN shapes — not a capability contract.
1746
+
1747
+ interface AspLocation {
1748
+ name: string; // e.g. "ASP - America's Swimming Pool Company of Baldwin County"
1749
+ state: string; // two-letter state code
1750
+ url: string; // the location's own site
1751
+ requestServiceUrl: string; // handoff URL — ASP's own per-location request form
1752
+ phone: string;
1753
+ coverageZips: string[]; // every zip this location's page declares covering
1754
+ }
1755
+
1756
+ interface AspZipMatch {
1757
+ zip: string;
1758
+ covered: boolean; // false = no published ASP location covers this zip yet
1759
+ location: AspLocation | null;
1760
+ }
1761
+
1762
+ /**
1763
+ * ASP - America's Swimming Pool Company's own 257-location franchise directory — match a zip
1764
+ * code to the exact local ASP franchise that services it (name, phone, coverage) and hand back
1765
+ * that location's own Request Service form URL, the same match/route step ASP's site itself
1766
+ * performs before a homeowner can request service.
1767
+ */
1768
+ interface Unit {
1769
+ /**
1770
+ * Matches a 5-digit US zip code against ASP's 257-location franchise network and returns the
1771
+ * ONE local franchise that services it — name, phone, coverage zips, and its own Request
1772
+ * Service form URL to hand the shopper to. `covered: false` means no published ASP location
1773
+ * covers that zip yet, a real answer, not a failure.
1774
+ */
1775
+ findLocationByZip(zip: string): Promise<AspZipMatch>;
1776
+
1777
+ /**
1778
+ * Lists every ASP franchise location on the public directory — name, state, phone, coverage
1779
+ * zips, site URL and Request Service URL. `state` (optional, two-letter code, e.g. "GA")
1780
+ * narrows to that state.
1781
+ */
1782
+ listLocations(state?: string): Promise<AspLocation[]>;
1783
+ }
1784
+ }
1785
+
1649
1786
  declare namespace BowmarkProvider_atlasoceanvoyages {
1650
1787
  // ── Atlas Ocean Voyages — the unit's own declarations, verbatim ──
1651
1788
  // Atlas Ocean Voyages' OWN shapes — not a capability contract.
@@ -2155,6 +2292,66 @@ interface BigrentzCategoryRow {
2155
2292
  }
2156
2293
  }
2157
2294
 
2295
+ declare namespace BowmarkProvider_bing {
2296
+ // ── Bing — the unit's own declarations, verbatim ──
2297
+ interface BingWebResult {
2298
+ source: "bing";
2299
+ rank: number;
2300
+ title: string;
2301
+ url: string;
2302
+ snippet: string | null;
2303
+ published: string | null;
2304
+ }
2305
+
2306
+ interface BingNewsResult {
2307
+ source: "bing";
2308
+ rank: number;
2309
+ title: string;
2310
+ url: string;
2311
+ snippet: string | null;
2312
+ published: string | null;
2313
+ publisher: string | null;
2314
+ imageUrl: string | null;
2315
+ }
2316
+
2317
+ interface BingSearchResult {
2318
+ query: string;
2319
+ results: BingWebResult[];
2320
+ warnings: string[];
2321
+ }
2322
+
2323
+ interface BingNewsSearchResult {
2324
+ query: string;
2325
+ results: BingNewsResult[];
2326
+ warnings: string[];
2327
+ }
2328
+
2329
+ /**
2330
+ * General web and news search over Bing's index, read off Bing's own RSS output — ten ranked
2331
+ * results per query with title, destination URL, snippet and date. Keyless, browserless, ~5 KB
2332
+ * a call. It never reports 'no matches' and it ignores search operators like site: — both
2333
+ * measured, both declared.
2334
+ */
2335
+ interface Unit {
2336
+ /**
2337
+ * Searches the web and returns the ten results Bing ranked first, with title, destination URL,
2338
+ * snippet and date. TWO LIMITS, neither visible in the response: it NEVER returns an empty
2339
+ * list — a query of three invented words came back with ten confident, unrelated rows — and it
2340
+ * IGNORES search operators, so `site:reddit.com …` is not scoped to reddit. Treat the rows as
2341
+ * Bing's best offer rather than as proof anything matched.
2342
+ */
2343
+ searchWeb(args: { query: string, limit?: number }): Promise<BingSearchResult>;
2344
+
2345
+ /**
2346
+ * Searches news coverage and returns stories with the headline, the outlet's own article URL,
2347
+ * a summary, a real publication timestamp, the publisher name and a thumbnail. Use this rather
2348
+ * than searchWeb when the question is 'what happened' — the web feed's dates are Bing's crawl
2349
+ * stamps, this feed's are the story's.
2350
+ */
2351
+ searchNews(args: { query: string, limit?: number }): Promise<BingNewsSearchResult>;
2352
+ }
2353
+ }
2354
+
2158
2355
  declare namespace BowmarkProvider_blenderseyewear {
2159
2356
  // ── Blenders Eyewear — the unit's own declarations, verbatim ──
2160
2357
  // Blenders Eyewear's OWN shapes — not a capability contract.
@@ -4940,6 +5137,58 @@ interface FirstdibsListing {
4940
5137
  }
4941
5138
  }
4942
5139
 
5140
+ declare namespace BowmarkProvider_fivestarbathsolutions {
5141
+ // ── Five Star Bath Solutions — the unit's own declarations, verbatim ──
5142
+ interface FivestarLocation {
5143
+ id: string;
5144
+ title: string;
5145
+ ownerName: string;
5146
+ phone: string;
5147
+ address: string;
5148
+ state: string;
5149
+ latitude: number;
5150
+ longitude: number;
5151
+ url: string;
5152
+ }
5153
+
5154
+ interface FivestarDaySlots {
5155
+ date: string;
5156
+ dayOfWeek: string;
5157
+ times: string[];
5158
+ }
5159
+
5160
+ interface GetAvailableSlotsResult {
5161
+ region: string;
5162
+ usingRegionSlots: boolean;
5163
+ days: FivestarDaySlots[];
5164
+ }
5165
+
5166
+ /**
5167
+ * National bath/kitchen remodeling franchise (walk-in tubs, shower/tub conversions).
5168
+ * listLocations and getAvailableSlots are live — listLocations reads the site's own
5169
+ * 176-territory location directory, getAvailableSlots checks a region's real free
5170
+ * design-consultation scheduler and returns the actual open days/times. bookAppointment (the
5171
+ * final booking submit) is a stub — see its notImplemented reason.
5172
+ */
5173
+ interface Unit {
5174
+ /**
5175
+ * Returns every Five Star Bath Solutions franchise territory from the site's own
5176
+ * location-finder directory — geo slug (`id`, what `getAvailableSlots`' `region` argument
5177
+ * takes), title, owner, phone, mailing address, state and lat/long. No arguments.
5178
+ */
5179
+ listLocations(): Promise<FivestarLocation[]>;
5180
+
5181
+ /**
5182
+ * Checks one franchise region's real free design-consultation scheduler and returns the actual
5183
+ * open appointment days and times over the site's own 3-week booking window. Pass `region`
5184
+ * (the geo slug from `listLocations`' `id` field, e.g. "livonia-mi"). Returns whether the
5185
+ * region has its own configured slot table (`usingRegionSlots`) or fell back to the site's
5186
+ * Mon-Sat default, plus the day-by-day list of open times.
5187
+ */
5188
+ getAvailableSlots(args: object): Promise<GetAvailableSlotsResult>;
5189
+ }
5190
+ }
5191
+
4943
5192
  declare namespace BowmarkProvider_flightradar24 {
4944
5193
  // ── Flightradar24 — the unit's own declarations, verbatim ──
4945
5194
  interface flightradar24Airline {
@@ -7537,6 +7786,71 @@ interface HobieLocalAvailability {
7537
7786
  }
7538
7787
  }
7539
7788
 
7789
+ declare namespace BowmarkProvider_holidaybuilders {
7790
+ // ── Holiday Builders — the unit's own declarations, verbatim ──
7791
+ // Holiday Builders' OWN shapes — not a capability contract.
7792
+
7793
+ interface HolidaybuildersHome {
7794
+ planName: string;
7795
+ location: string; // the community/city, e.g. "Palm Bay"
7796
+ collection: string; // e.g. "inspire", "value", "cornerstone"
7797
+ address: string;
7798
+ price: number;
7799
+ priceFormatted: string;
7800
+ sqft: number;
7801
+ beds: number;
7802
+ baths: number;
7803
+ plan: string;
7804
+ status: string; // "Move-in Ready" | "Coming Soon", the site's own label
7805
+ imageUrl: string | null;
7806
+ url: string; // the listing page — Request a Tour / Contact Us Today live here
7807
+ }
7808
+
7809
+ interface HolidaybuildersHomeDetail extends Omit<HolidaybuildersHome, "url"> {
7810
+ url: string;
7811
+ description: string;
7812
+ garage: number | null;
7813
+ coordinates: { lat: number; lng: number } | null;
7814
+ contactUsUrl: string | null;
7815
+ requestTourUrl: string | null; // the WRITE handoff this provider never performs
7816
+ }
7817
+
7818
+ interface HolidaybuildersSearchFilters {
7819
+ location?: string; // fuzzy substring match
7820
+ collection?: string; // exact, case-insensitive
7821
+ minBeds?: number;
7822
+ minBaths?: number;
7823
+ minSqft?: number;
7824
+ minPrice?: number;
7825
+ maxPrice?: number;
7826
+ moveInReadyOnly?: boolean; // default true
7827
+ }
7828
+
7829
+ /**
7830
+ * Holiday Builders' live Available Homes inventory across every Florida community — filterable
7831
+ * by location, collection, beds/baths/sqft and price, off the search page's own
7832
+ * server-rendered listing rather than a third-party aggregator's stale mirror — plus one
7833
+ * listing's own full detail and Request-a-Tour handoff.
7834
+ */
7835
+ interface Unit {
7836
+ /**
7837
+ * Runs Holiday Builders' site-wide Available Homes search — every home currently listed across
7838
+ * all Florida communities, with real address, price, beds/baths/sqft, collection and status,
7839
+ * and a listing URL to view details or request a tour. `filters` (all optional): `location`,
7840
+ * `collection`, `minBeds`, `minBaths`, `minSqft`, `minPrice`, `maxPrice`, `moveInReadyOnly`
7841
+ * (default true — excludes homes marked "Coming Soon").
7842
+ */
7843
+ searchAvailableHomes(filters?: HolidaybuildersSearchFilters): Promise<HolidaybuildersHome[]>;
7844
+
7845
+ /**
7846
+ * Reads one home's own listing page — full specs, description, and whether the site's Contact
7847
+ * Us Today / Request a Tour forms are present. `url` is a listing URL from a
7848
+ * `searchAvailableHomes` result.
7849
+ */
7850
+ getHomeDetail(url: string): Promise<HolidaybuildersHomeDetail>;
7851
+ }
7852
+ }
7853
+
7540
7854
  declare namespace BowmarkProvider_hunter {
7541
7855
  // ── Hunter — the unit's own declarations, verbatim ──
7542
7856
  interface hunterDomainCandidate {
@@ -9290,6 +9604,98 @@ interface KompanSparePartsDocuments {
9290
9604
  }
9291
9605
  }
9292
9606
 
9607
+ declare namespace BowmarkProvider_kuiu {
9608
+ // ── KUIU — the unit's own declarations, verbatim ──
9609
+ interface KuiuVariant {
9610
+ /** Shopify's numeric variant id as a string. */
9611
+ id: string;
9612
+ /** The variant's own label, e.g. "Vias / M". */
9613
+ title: string;
9614
+ /** String verbatim from the storefront — "129.00" (dollars) on /products.json, "12900" (cents) on /products/<handle>.js. */
9615
+ price: string;
9616
+ /** Same scale as price. Null when the variant is not on sale. */
9617
+ compareAtPrice: string | null;
9618
+ sku: string | null;
9619
+ /** Whether the variant is purchasable right now. */
9620
+ available: boolean;
9621
+ /** e.g. ["Vias", "M"] — camo pattern/color + size. */
9622
+ options: string[];
9623
+ }
9624
+ interface KuiuProduct {
9625
+ /** The handle is the only stable identifier across the catalogue. */
9626
+ handle: string;
9627
+ title: string;
9628
+ vendor: string;
9629
+ productType: string;
9630
+ url: string;
9631
+ descriptionHtml: string | null;
9632
+ optionNames: string[];
9633
+ variants: KuiuVariant[];
9634
+ priceRange: { min: string; max: string } | null;
9635
+ /** True if ANY variant is purchasable. */
9636
+ inStock: boolean;
9637
+ tags: string[];
9638
+ images: string[];
9639
+ }
9640
+ interface KuiuSizeMatch {
9641
+ /** The chart size that matched both chest and waist, e.g. "M". Null on no match. */
9642
+ size: string | null;
9643
+ chestRange: string | null;
9644
+ waistRange: string | null;
9645
+ armLengthRange: string | null;
9646
+ /** The size the CHEST measurement alone points to. */
9647
+ chestMatch: string | null;
9648
+ /** The size the WAIST measurement alone points to. */
9649
+ waistMatch: string | null;
9650
+ /** Populated when chest and waist disagree, or neither matched. */
9651
+ warnings: string[];
9652
+ }
9653
+ interface KuiuCheckoutLink {
9654
+ /** Shopify's own cart-permalink URL — a GET that adds the line item and redirects into the cart. */
9655
+ url: string;
9656
+ variant: KuiuVariant;
9657
+ product: KuiuProduct;
9658
+ }
9659
+
9660
+ /**
9661
+ * KUIU's live hunting-apparel catalogue — every product, its camo-pattern/color and size
9662
+ * variants, real prices and stock — plus the storefront's own Find Your Fit men's size chart
9663
+ * and a live-validated checkout handoff link.
9664
+ */
9665
+ interface Unit {
9666
+ /**
9667
+ * Reads the live KUIU catalogue as the storefront publishes it — every product, its handle,
9668
+ * title, vendor, description, tags, images and the per-variant price/stock the storefront is
9669
+ * quoting right now.
9670
+ */
9671
+ listKuiuProducts(opts?: { limit?: number }): Promise<KuiuProduct[]>;
9672
+
9673
+ /**
9674
+ * Reads one product by its handle — every camo-pattern/color and size variant, its exact price
9675
+ * and whether that specific variant is purchasable right now. Takes the handle
9676
+ * listKuiuProducts returns. THROWS on an unknown handle (the store answers a real 404).
9677
+ */
9678
+ getKuiuProduct(handle: string): Promise<KuiuProduct>;
9679
+
9680
+ /**
9681
+ * Maps chest and waist measurements (inches) to KUIU's own published men's apparel size,
9682
+ * reading the storefront's live Find Your Fit chart. Returns the matched size plus each
9683
+ * measurement's OWN match, so a caller can see when chest and waist point at different rows —
9684
+ * a real case on a chart sized primarily by chest.
9685
+ */
9686
+ findKuiuSize(measurements: { chest: number; waist: number }): Promise<KuiuSizeMatch>;
9687
+
9688
+ /**
9689
+ * Resolves a product handle + a variant match (either the exact variant title like "Vias / M",
9690
+ * or a substring of it) to a real Shopify cart-permalink URL, validated live against the
9691
+ * storefront. THROWS if the handle is unknown, if no variant matches, if the match is
9692
+ * ambiguous, or if the matched variant is out of stock — the error names the candidates or
9693
+ * in-stock options so the caller can retry.
9694
+ */
9695
+ getKuiuCheckoutLink(handle: string, variantTitleOrOptions: string, opts?: { quantity?: number }): Promise<KuiuCheckoutLink>;
9696
+ }
9697
+ }
9698
+
9293
9699
  declare namespace BowmarkProvider_labcorp {
9294
9700
  // ── Labcorp — the unit's own declarations, verbatim ──
9295
9701
  interface LabcorpTestSummary {
@@ -10525,6 +10931,60 @@ interface mcdonaldsFindStoresResult {
10525
10931
  }
10526
10932
  }
10527
10933
 
10934
+ declare namespace BowmarkProvider_medicalguardian {
10935
+ // ── Medical Guardian — the unit's own declarations, verbatim ──
10936
+ // Medical Guardian's OWN shapes — not a capability contract.
10937
+
10938
+ type MedicalguardianActivityLevel = "Low" | "Medium" | "High";
10939
+ type MedicalguardianRiskLevel = "low" | "medium" | "high";
10940
+
10941
+ interface MedicalguardianRiskQuestion {
10942
+ id: string;
10943
+ prompt: string;
10944
+ options: Array<{ value: string; score: number }>;
10945
+ }
10946
+
10947
+ interface MedicalguardianFallRiskAnswers {
10948
+ hearingImpaired: boolean;
10949
+ chronicHealthCondition: boolean;
10950
+ limitedMobility: boolean;
10951
+ activityLevel: MedicalguardianActivityLevel;
10952
+ takesDailyMedications: boolean;
10953
+ travelsAnnually: boolean;
10954
+ homeHasStairs: boolean;
10955
+ drivesDaily: boolean;
10956
+ previouslyFallen: boolean;
10957
+ }
10958
+
10959
+ interface MedicalguardianFallRiskResult {
10960
+ score: number; // 0-9
10961
+ riskLevel: MedicalguardianRiskLevel;
10962
+ assessmentUrl: string;
10963
+ deviceSelectionUrl: string; // the site's own next step — device selection, not built here
10964
+ }
10965
+
10966
+ /**
10967
+ * Medical Guardian's own fall-risk assessment (medicalguardian.com/risk-assessment) — a real
10968
+ * 0-9 score and low/medium/high risk level computed exactly as the site computes it, plus the
10969
+ * site's own 'Choose a Device' handoff URL as the real next step.
10970
+ */
10971
+ interface Unit {
10972
+ /**
10973
+ * Returns Medical Guardian's own 9 fall-risk assessment questions, in order, exactly as
10974
+ * medicalguardian.com/risk-assessment asks them — ask them one at a time, then call
10975
+ * assessFallRisk with the answers.
10976
+ */
10977
+ getRiskAssessmentQuestions(): Promise<{ questions: MedicalguardianRiskQuestion[] }>;
10978
+
10979
+ /**
10980
+ * Runs Medical Guardian's own fall-risk scoring — a real, personalized 0-9 score and risk
10981
+ * level, computed exactly as the site's own calculator computes it, no estimate.
10982
+ * `deviceSelectionUrl` is the real next step the site itself sends the user to.
10983
+ */
10984
+ assessFallRisk(answers: MedicalguardianFallRiskAnswers): Promise<MedicalguardianFallRiskResult>;
10985
+ }
10986
+ }
10987
+
10528
10988
  declare namespace BowmarkProvider_medicare {
10529
10989
  // ── Medicare.gov — the unit's own declarations, verbatim ──
10530
10990
  interface medicareCounty {
@@ -13777,6 +14237,115 @@ interface RedditThread {
13777
14237
  }
13778
14238
  }
13779
14239
 
14240
+ declare namespace BowmarkProvider_reliancepartners {
14241
+ // ── Reliance Partners — the unit's own declarations, verbatim ──
14242
+ interface ReliancePartnersApplicationSchema {
14243
+ entryUrl: string;
14244
+ steps: Array<{
14245
+ title: string; // "Basic Info" | "Coverage" | "Equipment"
14246
+ fields: Array<{ gfName: string; label: string; type: string; required: boolean; options?: Array<{ value: string; label: string }> }>;
14247
+ repeaters: Array<{ title: string; gfRepeaterId: string; maxItems: number; columns: Array<{ gfName: string; label: string; type: string; required: boolean; options?: Array<{ value: string; label: string }> }> }>;
14248
+ }>;
14249
+ }
14250
+
14251
+ interface AssembledApplication {
14252
+ valid: boolean;
14253
+ errors: string[];
14254
+ entryUrl: string;
14255
+ formFields: Record<string, string>; // the site's own GF field names
14256
+ summary: string;
14257
+ }
14258
+
14259
+ /**
14260
+ * Reliance Partners' own 3-step commercial-trucking insurance application (FMCSA/EIN, per-line
14261
+ * coverage limits, equipment) — reads the live field structure and enumerated catalogs, and
14262
+ * validates + assembles a caller's application against it, ready to submit.
14263
+ */
14264
+ interface Unit {
14265
+ /**
14266
+ * Reads reliancepartners.com/quote/'s live 3-step trucking-insurance application — every
14267
+ * field, and every real enumerated catalog (15 coverage lines, 30 commodities, FMCSA type, all
14268
+ * US states).
14269
+ */
14270
+ getApplicationSchema(): Promise<ReliancePartnersApplicationSchema>;
14271
+
14272
+ /**
14273
+ * Validates a caller's trucking-insurance application against the live schema's own field
14274
+ * requirements and enumerated catalogs, then maps it onto the site's own Gravity Forms field
14275
+ * names — exact, ready to submit. Never submits it; the site's own flow ends in a human
14276
+ * underwriting follow-up, not an instant quote.
14277
+ */
14278
+ assembleApplication(args: object): Promise<AssembledApplication>;
14279
+ }
14280
+ }
14281
+
14282
+ declare namespace BowmarkProvider_revisionskincare {
14283
+ // ── Revision Skincare — the unit's own declarations, verbatim ──
14284
+ type RevisionQuestionType = "single-select" | "multi-select";
14285
+
14286
+ interface RevisionQuizOption {
14287
+ title: string;
14288
+ }
14289
+
14290
+ interface RevisionQuizQuestion {
14291
+ questionId: string;
14292
+ text: string;
14293
+ type: RevisionQuestionType;
14294
+ options: RevisionQuizOption[];
14295
+ }
14296
+
14297
+ interface RevisionQuizQuestions {
14298
+ quizId: string;
14299
+ channelQuizId: string;
14300
+ subscriberId: string;
14301
+ questions: RevisionQuizQuestion[];
14302
+ }
14303
+
14304
+ interface RevisionQuizAnswer {
14305
+ questionId: string;
14306
+ type: RevisionQuestionType;
14307
+ answer: string | string[];
14308
+ }
14309
+
14310
+ interface RevisionRecommendedProduct {
14311
+ productId: string;
14312
+ name: string;
14313
+ description: string;
14314
+ url: string;
14315
+ imageUrl: string;
14316
+ price: number | null;
14317
+ currencyCode: string | null;
14318
+ averageRating: number | null;
14319
+ approvedReviewsCount: number | null;
14320
+ }
14321
+
14322
+ interface RevisionQuizResult {
14323
+ quizResponseId: string;
14324
+ title: string;
14325
+ subtitle: string;
14326
+ products: RevisionRecommendedProduct[];
14327
+ }
14328
+
14329
+ /**
14330
+ * Reads and answers Revision Skincare's own Product Finder Quiz
14331
+ * (revisionskincare.com/pages/skincare-quiz), returning the site's real computed product
14332
+ * recommendations.
14333
+ */
14334
+ interface Unit {
14335
+ /**
14336
+ * Reads the live Product Finder Quiz's real questions, in order, each with its options and
14337
+ * answer type.
14338
+ */
14339
+ getSkincareQuizQuestions(): Promise<RevisionQuizQuestions>;
14340
+
14341
+ /**
14342
+ * Submits a shopper's answers to the Product Finder Quiz and returns the site's real computed
14343
+ * product recommendations.
14344
+ */
14345
+ takeSkincareQuiz(arg: { answers: RevisionQuizAnswer[] }): Promise<RevisionQuizResult>;
14346
+ }
14347
+ }
14348
+
13780
14349
  declare namespace BowmarkProvider_rishitea {
13781
14350
  // ── Rishi Tea & Botanicals — the unit's own declarations, verbatim ──
13782
14351
  interface TeaFinderQuestion {
@@ -13948,6 +14517,75 @@ interface RoofmaxxCostEstimate {
13948
14517
  }
13949
14518
  }
13950
14519
 
14520
+ declare namespace BowmarkProvider_saatva {
14521
+ // ── Saatva — the unit's own declarations, verbatim ──
14522
+ // Saatva's OWN shapes — not a capability contract.
14523
+
14524
+ interface MattressQuizAnswers {
14525
+ sleepPosition: "side" | "back" | "stomach";
14526
+ feel: "soft" | "medium" | "firm";
14527
+ sharesBed?: boolean; // optional — narrows scoring further when given
14528
+ }
14529
+
14530
+ interface SaatvaVariant {
14531
+ sku: string;
14532
+ name: string;
14533
+ size: string | null;
14534
+ comfortLevel: string | null; // Saatva's own label, e.g. "Medium Firm"
14535
+ mattressType: string | null; // "Standard" | "Split" | "Upper-Flex"
14536
+ price: number | null;
14537
+ inStock: boolean;
14538
+ sleepPositions: string[]; // e.g. ["Side Sleeper", "Back Sleeper"]
14539
+ url: string; // pre-selected-SKU product page, one click from cart
14540
+ }
14541
+
14542
+ interface SaatvaMattress {
14543
+ productCode: string;
14544
+ name: string;
14545
+ url: string;
14546
+ variants: SaatvaVariant[];
14547
+ }
14548
+
14549
+ interface SaatvaRecommendation {
14550
+ productCode: string;
14551
+ name: string;
14552
+ score: number; // higher is a better match; ties break on lower price
14553
+ matchedOn: string[]; // plain-language reasons this variant scored
14554
+ bestVariant: SaatvaVariant | null;
14555
+ }
14556
+
14557
+ /**
14558
+ * Saatva's mattress catalogue and its own mattress-quiz recommendation logic — every mattress
14559
+ * line Saatva currently sells with every buyable variant's size, comfort level, sleep-position
14560
+ * fit, stock and price, plus a real computed recommendation from stated sleep position,
14561
+ * weight, and firmness preference, each with the exact pre-selected-SKU product link to buy
14562
+ * it.
14563
+ */
14564
+ interface Unit {
14565
+ /**
14566
+ * Lists every mattress product line Saatva currently sells with every buyable variant — size,
14567
+ * comfort level, sleep-position fit, stock and price — read out of the same catalogue the
14568
+ * site's own mattress quiz scores against. Takes nothing. THROWS rather than returning [] when
14569
+ * the page answers without its payload or names no mattress lines, because Saatva always sells
14570
+ * these and an empty array would read as a catalogue that had emptied.
14571
+ */
14572
+ listMattresses(): Promise<SaatvaMattress[]>;
14573
+
14574
+ /**
14575
+ * Runs Saatva's mattress-quiz goal-flow (saatva.com/mattress-quiz) for a stated sleep position
14576
+ * and firmness preference, ranking every mattress line against the SAME live catalogue the
14577
+ * site's own quiz reads and returning the best-matching in-stock variant for each, with its
14578
+ * exact pre-selected-SKU buy link. Ranked highest score first, ties broken by lower price.
14579
+ * `matchedOn` names which stated preferences the top variant actually satisfies. Does NOT
14580
+ * replicate Saatva's internal weighted scoring formula byte-for-byte — that logic is
14581
+ * proprietary client-side JS — it scores each variant's own declared attributes against what
14582
+ * was asked, which is a genuine computation over real data rather than a guess from marketing
14583
+ * copy.
14584
+ */
14585
+ recommendMattress(answers: MattressQuizAnswers): Promise<SaatvaRecommendation[]>;
14586
+ }
14587
+ }
14588
+
13951
14589
  declare namespace BowmarkProvider_saltandstone {
13952
14590
  // ── Salt & Stone — the unit's own declarations, verbatim ──
13953
14591
  // Salt & Stone's OWN shapes — not a capability contract.
@@ -14578,6 +15216,52 @@ interface SemihandmadePriceResult {
14578
15216
  }
14579
15217
  }
14580
15218
 
15219
+ declare namespace BowmarkProvider_smartsign {
15220
+ // ── SmartSign — the unit's own declarations, verbatim ──
15221
+ interface SmartsignSearchResult {
15222
+ sku: string;
15223
+ name: string;
15224
+ url: string; // absolute product page URL — what getTemplate takes
15225
+ imageUrl: string;
15226
+ }
15227
+ interface SmartsignMaterialPricing {
15228
+ name: string; // e.g. "Aluminum"
15229
+ sizeCode: string; // SmartSign's own per-material+size code
15230
+ unitPrice: number; // single-unit price, e.g. 37.94
15231
+ pricingTiers: { qty: number; price: number }[]; // volume-discount ladder, includes qty:1
15232
+ }
15233
+ interface SmartsignTemplate {
15234
+ sku: string;
15235
+ title: string;
15236
+ url: string;
15237
+ materials: SmartsignMaterialPricing[];
15238
+ }
15239
+
15240
+ /**
15241
+ * Reads SmartSign's custom-sign template configurator — search for a template, then read its
15242
+ * real per-material live pricing and volume-discount ladder — straight from smartsign.com's
15243
+ * own pages, no key, no browser.
15244
+ */
15245
+ interface Unit {
15246
+ /**
15247
+ * Runs SmartSign's own site-search suggest endpoint for a free-text query (e.g. "parking
15248
+ * sign", "custom aluminum sign") and returns the matching product/template rows — sku, name,
15249
+ * product URL, thumbnail — deduplicated by URL. The `sku` it returns is what getTemplate
15250
+ * takes. May legitimately return [] for a query that matches nothing.
15251
+ */
15252
+ search(query: string): Promise<SmartsignSearchResult[]>;
15253
+
15254
+ /**
15255
+ * Reads one custom-sign template's product page and returns its title plus every material
15256
+ * option offered — display name, the site's own size+material code, single-unit price, and the
15257
+ * FULL volume-discount ladder (qty tier -> price). THROWS rather than returning an empty
15258
+ * materials list on a retired/mistyped SKU — every real template offers at least one material,
15259
+ * so zero is never an honest answer.
15260
+ */
15261
+ getTemplate(sku: string): Promise<SmartsignTemplate>;
15262
+ }
15263
+ }
15264
+
14581
15265
  declare namespace BowmarkProvider_soundcloud {
14582
15266
  // ── SoundCloud — the unit's own declarations, verbatim ──
14583
15267
  // SoundCloud's OWN row shape — not the `music` capability contract.
@@ -15344,6 +16028,69 @@ interface teladocInsuranceCoverage {
15344
16028
  }
15345
16029
  }
15346
16030
 
16031
+ declare namespace BowmarkProvider_teneohg {
16032
+ // ── Teneo Hospitality Group — the unit's own declarations, verbatim ──
16033
+ // Teneo's OWN shapes — not a capability contract.
16034
+
16035
+ interface TeneohgHotelSummary {
16036
+ slug: string;
16037
+ name: string;
16038
+ city: string | null;
16039
+ region: string | null; // US state code, e.g. "AZ", or a country name
16040
+ profileUrl: string;
16041
+ totalMeetingSpaceSqFt: number | null;
16042
+ largestMeetingSpaceSqFt: number | null;
16043
+ sleepingRooms: number | null;
16044
+ collections: string[]; // e.g. ["Luxury", "Resorts"]
16045
+ }
16046
+
16047
+ interface TeneohgSearchResult { hotels: TeneohgHotelSummary[]; totalMatched: number; totalScanned: number; pagesScanned: number }
16048
+
16049
+ type TeneohgHotelStats = Record<string, string>; // e.g. { "Meeting Room Space": "156,000 Sq. Ft.", "Number of Sleeping Rooms": "517" }
16050
+
16051
+ interface TeneohgRfpHandoff { url: string; hotelsOfInterestValue: string }
16052
+
16053
+ interface TeneohgHotelDetail {
16054
+ slug: string;
16055
+ name: string;
16056
+ city: string | null;
16057
+ region: string | null;
16058
+ profileUrl: string;
16059
+ stats: TeneohgHotelStats;
16060
+ rfpHandoff: TeneohgRfpHandoff; // the public RFP form + what to type into its "Hotels of Interest" field
16061
+ }
16062
+
16063
+ /**
16064
+ * Teneo Hospitality Group's own member-hotel directory — search 350+ independent and
16065
+ * small-branded meeting hotels by destination, collection and meeting-space/room-block size
16066
+ * with real specs, then read one hotel's full meeting-space stat block and the RFP hand-off to
16067
+ * actually request a proposal.
16068
+ */
16069
+ interface Unit {
16070
+ /**
16071
+ * Searches Teneo's own member-hotel directory (350+ hotels) by US state (2-letter code, e.g.
16072
+ * "AZ"), country, collection tag substring (e.g. "luxury", "resorts"), minimum total
16073
+ * meeting-space square footage, minimum sleeping-room count and a name/city substring. Uses
16074
+ * one of the site's own curated per-state directory pages when the requested state has one
16075
+ * (faster, pre-filtered), otherwise scans the base listing's pages (bounded by
16076
+ * `maxPagesToScan`, default 8) and filters client-side. `totalMatched` is the count before
16077
+ * `limit` (default 20, max 50) cuts the list; `totalScanned`/`pagesScanned` say how much of
16078
+ * the directory the call actually covered.
16079
+ */
16080
+ searchMemberHotels(args?: { state?: string; country?: string; collection?: string; minMeetingSpaceSqFt?: number; minSleepingRooms?: number; query?: string; limit?: number; maxPagesToScan?: number }): Promise<TeneohgSearchResult>;
16081
+
16082
+ /**
16083
+ * Reads one member hotel's own profile page: every stat its meeting-space and sleeping-room
16084
+ * widgets carry (total/largest/second-largest meeting room space, outdoor space, meeting-room
16085
+ * count, suites, doubles), keyed on the site's own label text, plus `rfpHandoff` — the public
16086
+ * RFP form URL and the exact value to put in its "Hotels of Interest" field to route a request
16087
+ * at this hotel. `slug` comes from searchMemberHotels(). THROWS on an unknown slug, naming
16088
+ * searchMemberHotels() as the way to find current ones.
16089
+ */
16090
+ getMemberHotel(slug: string): Promise<TeneohgHotelDetail>;
16091
+ }
16092
+ }
16093
+
15347
16094
  declare namespace BowmarkProvider_therabody {
15348
16095
  // ── Therabody — the unit's own declarations, verbatim ──
15349
16096
  interface TherabodyVariant {
@@ -16712,6 +17459,74 @@ interface VoluspaQuizIntro {
16712
17459
  }
16713
17460
  }
16714
17461
 
17462
+ declare namespace BowmarkProvider_walkerhughes {
17463
+ // ── WalkerHughes Insurance — the unit's own declarations, verbatim ──
17464
+ // WalkerHughes' OWN shapes — not a capability contract.
17465
+
17466
+ interface WalkerhughesProduct {
17467
+ id: string; // the exact `product` value /start-quote expects
17468
+ name: string;
17469
+ personal: boolean; // Personal vs Business, from the site's own toggle
17470
+ }
17471
+
17472
+ interface WalkerhughesQuoteCatalog {
17473
+ products: WalkerhughesProduct[];
17474
+ applyUrl: string; // the real /start-quote URL — no query prefill exists
17475
+ sourceUrl: string;
17476
+ }
17477
+
17478
+ interface WalkerhughesOffice {
17479
+ label: string; // exact `preferredOffice` value /start-quote expects
17480
+ city: string;
17481
+ state: string;
17482
+ address: string | null;
17483
+ phone: string | null;
17484
+ url: string; // this office's own detail page
17485
+ }
17486
+
17487
+ interface WalkerhughesOfficeDirectory {
17488
+ offices: WalkerhughesOffice[];
17489
+ sourceUrl: string;
17490
+ }
17491
+
17492
+ interface WalkerhughesOfficeMatch extends WalkerhughesOffice {
17493
+ matchedOn: "label" | "city" | "state";
17494
+ }
17495
+
17496
+ interface WalkerhughesOfficeSearch {
17497
+ query: string;
17498
+ matches: WalkerhughesOfficeMatch[];
17499
+ sourceUrl: string;
17500
+ }
17501
+
17502
+ /**
17503
+ * WalkerHughes' real 16-product Personal/Business insurance-quote application catalog and its
17504
+ * real 25-office directory, straight off /start-quote and /locations — list and filter the
17505
+ * product catalog, list and filter offices, and match a caller's free-text location against
17506
+ * the real office directory.
17507
+ */
17508
+ interface Unit {
17509
+ /**
17510
+ * Lists WalkerHughes' real 16-product insurance catalog straight off the /start-quote form's
17511
+ * own <select>, optionally filtered to just Personal or just Business — the same toggle the
17512
+ * live form applies. Includes the real applyUrl handoff.
17513
+ */
17514
+ listQuoteProducts(department?: "Personal" | "Business"): Promise<WalkerhughesQuoteCatalog>;
17515
+
17516
+ /**
17517
+ * Lists WalkerHughes' real 25-office directory straight off /locations' own server-rendered
17518
+ * cards, optionally filtered to one two-letter state.
17519
+ */
17520
+ listOffices(state?: string): Promise<WalkerhughesOfficeDirectory>;
17521
+
17522
+ /**
17523
+ * Matches a free-text location (a city, a two-letter state, or "City, ST") against the real
17524
+ * office directory and returns every match, ranked exact-label > city > state.
17525
+ */
17526
+ findNearestOffice(query: string): Promise<WalkerhughesOfficeSearch>;
17527
+ }
17528
+ }
17529
+
16715
17530
  declare namespace BowmarkProvider_walmart {
16716
17531
  // ── Walmart — the unit's own declarations, verbatim ──
16717
17532
  interface walmartStore {
@@ -16995,6 +17810,62 @@ interface XpressWaitTime {
16995
17810
  }
16996
17811
  }
16997
17812
 
17813
+ declare namespace BowmarkProvider_yorkwallcoverings {
17814
+ // ── York Wallcoverings — the unit's own declarations, verbatim ──
17815
+ interface YorkWallcoveringsSearchResult {
17816
+ sku: string;
17817
+ name: string;
17818
+ url: string;
17819
+ price: number;
17820
+ }
17821
+
17822
+ interface YorkWallcoveringsProduct {
17823
+ sku: string;
17824
+ name: string;
17825
+ url: string;
17826
+ price: number;
17827
+ inStock: boolean;
17828
+ description: string;
17829
+ images: string[];
17830
+ }
17831
+
17832
+ interface YorkWallcoveringsAddToCartHandoff {
17833
+ sku: string;
17834
+ name: string;
17835
+ url: string;
17836
+ price: number;
17837
+ inStock: boolean;
17838
+ note: string;
17839
+ }
17840
+
17841
+ /**
17842
+ * Reads York Wallcoverings' public wallpaper/mural storefront (yorkwallcoverings.com) — search
17843
+ * the catalog by keyword, read a product's live price and stock, and get the handoff to add it
17844
+ * to cart on the real site.
17845
+ */
17846
+ interface Unit {
17847
+ /**
17848
+ * Searches York's live public catalog (wallpaper, wall murals, grasscloth) by keyword — theme,
17849
+ * style, color or brand words all match, since the site's own search covers name and
17850
+ * description — and returns each match's SKU, name, product URL and price.
17851
+ */
17852
+ search(query: string): Promise<YorkWallcoveringsSearchResult[]>;
17853
+
17854
+ /**
17855
+ * Reads one York product page in full — SKU, live price, in-stock/out-of-stock status,
17856
+ * description and images — for a product URL `search` already returned.
17857
+ */
17858
+ getProduct(url: string): Promise<YorkWallcoveringsProduct>;
17859
+
17860
+ /**
17861
+ * Hands back the shopper's own York product page — the exact Add to cart button for this SKU —
17862
+ * since the site's cart requires a per-session ASP.NET token nobody but the shopper can
17863
+ * supply. Writes nothing.
17864
+ */
17865
+ addToCart(url: string): Promise<YorkWallcoveringsAddToCartHandoff>;
17866
+ }
17867
+ }
17868
+
16998
17869
  declare namespace BowmarkProvider_yourarborhome {
16999
17870
  // ── Arbor Homes — the unit's own declarations, verbatim ──
17000
17871
  interface ArborHome {
@@ -17046,6 +17917,57 @@ interface SearchHomesFilters {
17046
17917
  }
17047
17918
  }
17048
17919
 
17920
+ declare namespace BowmarkProvider_zennioptical {
17921
+ // ── Zenni Optical — the unit's own declarations, verbatim ──
17922
+ interface ZenniFrame {
17923
+ sku: string;
17924
+ name: string;
17925
+ price: number;
17926
+ colors: Array<{ sku: string; price: number }>;
17927
+ }
17928
+ interface ZenniStock {
17929
+ skuId: string;
17930
+ inStock: boolean;
17931
+ quantity: number;
17932
+ backOrderable: boolean;
17933
+ preOrderable: boolean;
17934
+ }
17935
+ interface ZenniRx {
17936
+ odSph: number;
17937
+ osSph: number;
17938
+ pd: number;
17939
+ birthYear: number;
17940
+ }
17941
+ interface ZenniLensPriceRow {
17942
+ type: string;
17943
+ minPrice: number;
17944
+ maxPrice: number;
17945
+ subTypes: Array<{ type: string; usage: string; minPrice: number; maxPrice: number; tints: boolean }>;
17946
+ }
17947
+
17948
+ /**
17949
+ * Online prescription eyewear. Prices a real frame + Rx + lens-type configuration off the
17950
+ * site's own configurator, and checks live per-SKU stock.
17951
+ */
17952
+ interface Unit {
17953
+ /**
17954
+ * Reads one frame's name, base price and per-color-variant price straight off the product
17955
+ * page's own embedded data. No rendering.
17956
+ */
17957
+ getFrame(skuId: string): Promise<ZenniFrame>;
17958
+
17959
+ /** Checks live per-SKU inventory off Zenni's own inventory endpoint. */
17960
+ checkStock(skuId: string): Promise<ZenniStock>;
17961
+
17962
+ /**
17963
+ * Runs a real prescription through Zenni's own order-configurator wizard (usage type -> manual
17964
+ * Rx entry -> confirm) and returns the priced lens-type matrix the site computes for that
17965
+ * exact Rx — a completed, priced configuration rather than a base frame price.
17966
+ */
17967
+ priceLensConfig(skuId: string, rx: ZenniRx): Promise<ZenniLensPriceRow[]>;
17968
+ }
17969
+ }
17970
+
17049
17971
  declare namespace BowmarkFamily_shopify_store {
17050
17972
  // ── Shopify storefronts — the unit's own declarations, verbatim ──
17051
17973
  interface ShopifyVariant {
@@ -17868,6 +18790,7 @@ interface BowmarkProviders {
17868
18790
  aiper: BowmarkProvider_aiper.Unit;
17869
18791
  ajmadison: BowmarkProvider_ajmadison.Unit;
17870
18792
  ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
18793
+ asppoolco: BowmarkProvider_asppoolco.Unit;
17871
18794
  atlasoceanvoyages: BowmarkProvider_atlasoceanvoyages.Unit;
17872
18795
  atlasseniorliving: BowmarkProvider_atlasseniorliving.Unit;
17873
18796
  avis: BowmarkProvider_avis.Unit;
@@ -17875,6 +18798,7 @@ interface BowmarkProviders {
17875
18798
  barletta: BowmarkProvider_barletta.Unit;
17876
18799
  bhphoto: BowmarkProvider_bhphoto.Unit;
17877
18800
  bigrentz: BowmarkProvider_bigrentz.Unit;
18801
+ bing: BowmarkProvider_bing.Unit;
17878
18802
  blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
17879
18803
  bluehaven: BowmarkProvider_bluehaven.Unit;
17880
18804
  bmwusa: BowmarkProvider_bmwusa.Unit;
@@ -17903,6 +18827,7 @@ interface BowmarkProviders {
17903
18827
  evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
17904
18828
  extraspace: BowmarkProvider_extraspace.Unit;
17905
18829
  firstdibs: BowmarkProvider_firstdibs.Unit;
18830
+ fivestarbathsolutions: BowmarkProvider_fivestarbathsolutions.Unit;
17906
18831
  flightradar24: BowmarkProvider_flightradar24.Unit;
17907
18832
  ford: BowmarkProvider_ford.Unit;
17908
18833
  fourseasonsyachts: BowmarkProvider_fourseasonsyachts.Unit;
@@ -17923,6 +18848,7 @@ interface BowmarkProviders {
17923
18848
  hellotend: BowmarkProvider_hellotend.Unit;
17924
18849
  hilton: BowmarkProvider_hilton.Unit;
17925
18850
  hobie: BowmarkProvider_hobie.Unit;
18851
+ holidaybuilders: BowmarkProvider_holidaybuilders.Unit;
17926
18852
  hunter: BowmarkProvider_hunter.Unit;
17927
18853
  ibuypower: BowmarkProvider_ibuypower.Unit;
17928
18854
  insurify: BowmarkProvider_insurify.Unit;
@@ -17936,6 +18862,7 @@ interface BowmarkProviders {
17936
18862
  kingsdown: BowmarkProvider_kingsdown.Unit;
17937
18863
  kitchentuneup: BowmarkProvider_kitchentuneup.Unit;
17938
18864
  kompan: BowmarkProvider_kompan.Unit;
18865
+ kuiu: BowmarkProvider_kuiu.Unit;
17939
18866
  labcorp: BowmarkProvider_labcorp.Unit;
17940
18867
  linkedin: BowmarkProvider_linkedin.Unit;
17941
18868
  liquiddeath: BowmarkProvider_liquiddeath.Unit;
@@ -17948,6 +18875,7 @@ interface BowmarkProviders {
17948
18875
  mailchimp: BowmarkProvider_mailchimp.Unit;
17949
18876
  marriott: BowmarkProvider_marriott.Unit;
17950
18877
  mcdonalds: BowmarkProvider_mcdonalds.Unit;
18878
+ medicalguardian: BowmarkProvider_medicalguardian.Unit;
17951
18879
  medicare: BowmarkProvider_medicare.Unit;
17952
18880
  microcenter: BowmarkProvider_microcenter.Unit;
17953
18881
  minted: BowmarkProvider_minted.Unit;
@@ -17968,9 +18896,12 @@ interface BowmarkProviders {
17968
18896
  progressive: BowmarkProvider_progressive.Unit;
17969
18897
  prose: BowmarkProvider_prose.Unit;
17970
18898
  reddit: BowmarkProvider_reddit.Unit;
18899
+ reliancepartners: BowmarkProvider_reliancepartners.Unit;
18900
+ revisionskincare: BowmarkProvider_revisionskincare.Unit;
17971
18901
  rishitea: BowmarkProvider_rishitea.Unit;
17972
18902
  ritani: BowmarkProvider_ritani.Unit;
17973
18903
  roofmaxx: BowmarkProvider_roofmaxx.Unit;
18904
+ saatva: BowmarkProvider_saatva.Unit;
17974
18905
  saltandstone: BowmarkProvider_saltandstone.Unit;
17975
18906
  samsclub: BowmarkProvider_samsclub.Unit;
17976
18907
  seakeeper: BowmarkProvider_seakeeper.Unit;
@@ -17978,6 +18909,7 @@ interface BowmarkProviders {
17978
18909
  seegarsfence: BowmarkProvider_seegarsfence.Unit;
17979
18910
  selectblinds: BowmarkProvider_selectblinds.Unit;
17980
18911
  semihandmade: BowmarkProvider_semihandmade.Unit;
18912
+ smartsign: BowmarkProvider_smartsign.Unit;
17981
18913
  soundcloud: BowmarkProvider_soundcloud.Unit;
17982
18914
  statefarm: BowmarkProvider_statefarm.Unit;
17983
18915
  stickergiant: BowmarkProvider_stickergiant.Unit;
@@ -17986,6 +18918,7 @@ interface BowmarkProviders {
17986
18918
  target: BowmarkProvider_target.Unit;
17987
18919
  tatcha: BowmarkProvider_tatcha.Unit;
17988
18920
  teladoc: BowmarkProvider_teladoc.Unit;
18921
+ teneohg: BowmarkProvider_teneohg.Unit;
17989
18922
  therabody: BowmarkProvider_therabody.Unit;
17990
18923
  thezebra: BowmarkProvider_thezebra.Unit;
17991
18924
  tilsonhomes: BowmarkProvider_tilsonhomes.Unit;
@@ -17999,11 +18932,14 @@ interface BowmarkProviders {
17999
18932
  villagerealtyobx: BowmarkProvider_villagerealtyobx.Unit;
18000
18933
  visible: BowmarkProvider_visible.Unit;
18001
18934
  voluspa: BowmarkProvider_voluspa.Unit;
18935
+ walkerhughes: BowmarkProvider_walkerhughes.Unit;
18002
18936
  walmart: BowmarkProvider_walmart.Unit;
18003
18937
  waterfurnace: BowmarkProvider_waterfurnace.Unit;
18004
18938
  wellfound: BowmarkProvider_wellfound.Unit;
18005
18939
  xpresswellnessurgentcare: BowmarkProvider_xpresswellnessurgentcare.Unit;
18940
+ yorkwallcoverings: BowmarkProvider_yorkwallcoverings.Unit;
18006
18941
  yourarborhome: BowmarkProvider_yourarborhome.Unit;
18942
+ zennioptical: BowmarkProvider_zennioptical.Unit;
18007
18943
  "000de82": BowmarkFamily_shopify_store.Unit;
18008
18944
  "001r3iv0": BowmarkFamily_shopify_store.Unit;
18009
18945
  "00246d8e": BowmarkFamily_shopify_store.Unit;
@@ -69735,6 +70671,7 @@ interface BowmarkLibrary {
69735
70671
  music: BowmarkCapability_music.Unit;
69736
70672
  pcparts: BowmarkCapability_pcparts.Unit;
69737
70673
  read: BowmarkCapability_read.Unit;
70674
+ search: BowmarkCapability_search.Unit;
69738
70675
  sheds: BowmarkCapability_sheds.Unit;
69739
70676
  providers: BowmarkProviders;
69740
70677
  }