@bowmark/web 1.17.0 → 1.19.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: c3b10cd54e186870ffdcb91995b4222605550dc2a437407330e776b47faaaf31
9
- // 45 capabilities, 363 providers, 902 typed functions, 20 refused.
8
+ // Manifest version: 91a69720e3caaa44f20031f9902b213daadc2093c895452fe8b71d88e0c2380c
9
+ // 45 capabilities, 379 providers, 936 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
@@ -2228,18 +2228,48 @@ type CallOptions = {
2228
2228
  * news coverage, with real publication dates and the outlet's name. ONE ENGINE TODAY (Bing),
2229
2229
  * so if it is down this fails rather than degrading — it throws, and never reports an outage
2230
2230
  * as zero results. Two things that engine cannot do, measured on `web`: it never returns an
2231
- * empty list even when nothing matches, and it ignores search operators like site:.
2231
+ * empty list even when nothing matches including for a long-tail query it has nothing
2232
+ * confident to say about, e.g. an obscure company name plus "pricing" — and it ignores search
2233
+ * operators like site:. `warnings` now flags the extreme case of the first — every returned
2234
+ * row sharing not one word with the query, or every row matching only a generic word like
2235
+ * "pricing" while the name you searched for is absent from all of them — but a
2236
+ * partially-relevant substitution is not caught. A THIRD limit, measured 2026-09-11 and the
2237
+ * one that hits ordinary research: it answers a MULTI-WORD query by reducing it to the single
2238
+ * most popular word in it and returning that word's results — "React useEffect dependency
2239
+ * array" comes back as React's homepage — and quoting, shortening or site-scoping the query
2240
+ * does not change it. `warnings` now flags four shapes. Three read the words: no returned row
2241
+ * sharing a word with the query, every row matching only a generic word like "pricing", or
2242
+ * fewer than half the query's subject words appearing anywhere in the results. The fourth asks
2243
+ * the engine the SAME query twice down the same exit — an answer that differs the second time
2244
+ * is a random decoy, because an answerable query is stable across repeats (measured
2245
+ * 2026-09-12). A merely partial substitution is still not caught.
2232
2246
  */
2233
2247
  interface Unit {
2234
2248
  /**
2235
2249
  * Searches the web and returns ranked results — title, destination URL, snippet — from the
2236
2250
  * first engine in the chain that answers. `engine` names which one that was, and `warnings`
2237
2251
  * names any that were tried and failed first. Feed a result's `url` straight to
2238
- * bowmark.read.page to actually read it. TWO THINGS TO KNOW BEFORE YOU TRUST THE ROWS: the
2239
- * engine NEVER returns an empty list, so results are its best offer rather than proof anything
2240
- * matched, and it IGNORES operators a `site:example.com` query is not scoped to that site.
2241
- * When every engine fails this THROWS rather than returning zero rows, because no engine
2242
- * reached is not the same as nothing found.
2252
+ * bowmark.read.page to actually read it. THREE THINGS TO KNOW BEFORE YOU TRUST THE ROWS. (1)
2253
+ * The engine NEVER returns an empty list, so results are its best offer rather than proof
2254
+ * anything matched a long-tail query (an obscure company name plus "pricing", say) can come
2255
+ * back with ten confident rows about something else entirely. (2) It IGNORES operators — a
2256
+ * `site:example.com` query is not scoped to that site. (3) MEASURED 2026-09-11, AND THE ONE
2257
+ * THAT HITS ORDINARY RESEARCH: it answers a MULTI-WORD query by reducing it to the single most
2258
+ * popular word in it and returning that word's results. "React useEffect dependency array"
2259
+ * comes back as React's own homepage, and a nine-word query naming a company, a job and a
2260
+ * protocol came back as the results for the one two-letter acronym in it. Quoting the proper
2261
+ * noun, shortening the query and site-scoping it were all tried on the same queries and all
2262
+ * returned the identical substituted set, so rewriting the query does not help — search the
2263
+ * ONE thing you most need, or read a URL you already know. `warnings` flags four shapes. Three
2264
+ * read the words: no row sharing a single word with the query, every row matching only a
2265
+ * generic word like "pricing" while the subject you named is absent, or fewer than half the
2266
+ * query's subject words appearing anywhere in the results. The fourth reads the engine's own
2267
+ * behaviour and is the reliable one: the query is asked TWICE down the same exit, and an
2268
+ * answer that comes back different the second time is a random decoy rather than a bad ranking
2269
+ * — measured 2026-09-12, an answerable query repeats identically while an unanswerable one
2270
+ * returns a fresh unrelated set every time. A partially-relevant substitution is still not
2271
+ * caught. When every engine fails this THROWS rather than returning zero rows, because no
2272
+ * engine reached is not the same as nothing found.
2243
2273
  */
2244
2274
  web(query: string | { query: string, limit?: number }, limit?: number, options?: CallOptions): Promise<SearchWebResult>;
2245
2275
 
@@ -2611,23 +2641,80 @@ interface ForecastResult {
2611
2641
  }
2612
2642
 
2613
2643
  declare namespace BowmarkCapability_web_form_fields {
2614
- // ── Inspect a web form and count its fields — the unit's own declarations, verbatim ──
2644
+ // ── Inspect, fill and drive a multi-step web form — the unit's own declarations, verbatim ──
2615
2645
 
2616
- interface FormField { name: string | null; label: string | null; type: string; required: boolean }
2617
- interface InspectedForm { action: string | null; method: string; fields: FormField[] }
2618
- interface FormInspectionResult { url: string; title: string | null; forms: InspectedForm[]; fieldCount: number; warnings: string[] }
2646
+ interface FormField { name: string | null; label: string | null; type: string; required: boolean; options?: string[] }
2647
+ interface InspectedForm { action: string | null; method: string; fields: FormField[]; frameUrl?: string | null }
2648
+
2649
+ type FormOptions = {
2650
+ strategy?: "auto" | "fetch" | "browser" // default "auto" — plain GET, browser only if it found nothing
2651
+ open?: string // the control that opens the form: a CSS selector or its visible text
2652
+ timeoutMs?: number // default 30000
2653
+ }
2654
+
2655
+ type FormInspectionResult = {
2656
+ url: string
2657
+ title: string | null
2658
+ forms: InspectedForm[]
2659
+ fieldCount: number
2660
+ servedBy: "fetch" | "browser" // which rung paid for this
2661
+ escalated: boolean // the GET was tried and found nothing
2662
+ escalationReason: string | null // set even under strategy:"fetch", so under-reading is visible
2663
+ openedWith: string | null // the control that was clicked to reveal the form
2664
+ multiStep: boolean // more steps follow; the count is the visible step only
2665
+ stepLabel: string | null // the form's own "Step 2 of 4", when it prints one
2666
+ warnings: string[]
2667
+ }
2668
+
2669
+ type FormFillOptions = {
2670
+ open?: string // the control that opens the form, if you already know it
2671
+ timeoutMs?: number // default 30000
2672
+ advance?: boolean // click "Next"/"Continue" once values are written. default false
2673
+ submit?: boolean // click the control that COMMITS the form. default false. wins over advance
2674
+ }
2675
+
2676
+ type FormFillResult = {
2677
+ url: string
2678
+ filled: string[] // the values keys that matched a field and were written
2679
+ notFound: string[] // the values keys nothing on the page matched
2680
+ advanced: boolean // a Next/Continue control was found and clicked
2681
+ submitted: boolean // a submit/book/place-order control was found and clicked
2682
+ openedWith: string | null
2683
+ multiStep: boolean // the step now on screen continues past this one
2684
+ stepLabel: string | null
2685
+ warnings: string[]
2686
+ }
2619
2687
 
2620
2688
  /**
2621
- * Fetches a public web page and inventories every visible form field: its label, name, type
2622
- * and required-ness. Read-only: it never fills or submits a form.
2689
+ * Inventories every field a web form asks for label, name, type, choices and required-ness —
2690
+ * including a booking or quote widget that only appears after a click and mounts in its own
2691
+ * iframe. `getFields` is read-only. `fillForm` writes answers into those same fields and can
2692
+ * click 'Next'/'Continue' to advance a multi-step flow, or the control that finally commits it
2693
+ * — one call, one step; call it again for the next step.
2623
2694
  */
2624
2695
  interface Unit {
2625
2696
  /**
2626
- * Reads a public page and returns its forms plus a total field count. Each field includes its
2627
- * label when the markup supplies one, name, type and required-ness. It never fills, clicks or
2628
- * submits anything; a page with client-rendered forms or no HTML form gets an honest warning.
2697
+ * Reads a page and returns its forms plus a total field count, each field with its label,
2698
+ * name, type, choices and required-ness. Takes a plain GET first and opens a browser only when
2699
+ * that finds no fields then it clicks the control that reveals the form (a `Book Online`
2700
+ * button, say) and reads the widget's own cross-origin iframe. It clicks exactly that one
2701
+ * control: it never types, never picks an option and never submits, so a multi-step flow comes
2702
+ * back as the visible step plus `multiStep: true`.
2703
+ */
2704
+ getFields(url: string, options?: FormOptions): Promise<FormInspectionResult>;
2705
+
2706
+ /**
2707
+ * Opens the page (and the booking/quote widget behind a button, exactly as `getFields` does),
2708
+ * then writes `values` into whatever fields match — keyed by a field's `name` or a word or two
2709
+ * of its label, matched fuzzily so the site's own wording doesn't have to be exact. Always
2710
+ * opens a browser: filling is an interaction, not a read. Pass `advance: true` to click
2711
+ * 'Next'/'Continue' once everything is written, or `submit: true` to click the control that
2712
+ * actually commits the form (submit wins if both are set). One call is one step — call it
2713
+ * again with the next step's `values` to walk a wizard forward. `notFound` names any `values`
2714
+ * key nothing on the page matched, so a caller who guessed a label wrong sees that rather than
2715
+ * silence.
2629
2716
  */
2630
- getFields(url: string): Promise<FormInspectionResult>;
2717
+ fillForm(url: string, values: Record<string, string>, options?: FormFillOptions): Promise<FormFillResult>;
2631
2718
  }
2632
2719
  }
2633
2720
 
@@ -3279,6 +3366,32 @@ interface abercrombieStockQuery {
3279
3366
  }
3280
3367
  }
3281
3368
 
3369
+ declare namespace BowmarkProvider_abqplumb {
3370
+ // ── Albuquerque Plumbing, Heating & Cooling — the unit's own declarations, verbatim ──
3371
+ interface AbqPlumbIssueType { id: number; name: string; division: string | null; }
3372
+ interface AbqPlumbServiceType { id: number; name: string; issueTypes: AbqPlumbIssueType[]; }
3373
+ interface AbqPlumbAppointmentRequest { serviceTypeId: number; issueTypeId: number; }
3374
+ interface AbqPlumbAppointmentSlot { startTime: string; endTime: string; }
3375
+
3376
+ /**
3377
+ * Albuquerque Plumbing, Heating & Cooling's public booking-widget services and live
3378
+ * appointment slots, with no customer details needed.
3379
+ */
3380
+ interface Unit {
3381
+ /**
3382
+ * Lists the services and issue types in ABQ Plumb's own booking widget. The entry point:
3383
+ * getAvailability takes a serviceTypeId and issueTypeId this returns.
3384
+ */
3385
+ listServices(): Promise<AbqPlumbServiceType[]>;
3386
+
3387
+ /**
3388
+ * Returns ABQ Plumb's currently-open appointment slots for one service and issue type from
3389
+ * listServices. This reads availability only; it never submits a booking.
3390
+ */
3391
+ getAvailability(input: AbqPlumbAppointmentRequest): Promise<AbqPlumbAppointmentSlot[]>;
3392
+ }
3393
+ }
3394
+
3282
3395
  declare namespace BowmarkProvider_acerentacar {
3283
3396
  // ── ACE Rent A Car — the unit's own declarations, verbatim ──
3284
3397
  interface AcerentacarSearchArgs { pickupLocationCode: string; pickupDate: string; dropoffDate: string; pickupTime?: string; dropoffTime?: string; }
@@ -5938,6 +6051,9 @@ interface BingSearchResult {
5938
6051
  query: string;
5939
6052
  results: BingWebResult[];
5940
6053
  warnings: string[];
6054
+ substituted: boolean // true when any of the four checks below judged these
6055
+ // rows to answer a DIFFERENT query. The machine-readable
6056
+ // form of the verdict warnings states in prose
5941
6057
  }
5942
6058
 
5943
6059
  interface BingNewsSearchResult {
@@ -5955,13 +6071,40 @@ interface BingNewsSearchResult {
5955
6071
  interface Unit {
5956
6072
  /**
5957
6073
  * Searches the web and returns the ten results Bing ranked first, with title, destination URL,
5958
- * snippet and date. TWO LIMITS, neither visible in the response: it NEVER returns an empty
5959
- * list — a query of three invented words came back with ten confident, unrelated rows and it
5960
- * IGNORES search operators, so `site:reddit.com …` is not scoped to reddit. Treat the rows as
5961
- * Bing's best offer rather than as proof anything matched.
6074
+ * snippet and date. THREE LIMITS. (1) It NEVER returns an empty list a query of three
6075
+ * invented words came back with ten confident, unrelated rows, and a long-tail query (an
6076
+ * obscure company name plus "pricing", say) can get the same substituted treatment. (2) It
6077
+ * IGNORES search operators, so `site:reddit.com …` is not scoped to reddit. (3) MEASURED
6078
+ * 2026-09-11, and the one that hits ordinary research: it answers a MULTI-WORD query by
6079
+ * reducing it to the single most popular word in it and returning that word's results — "React
6080
+ * useEffect dependency array" comes back as React's own homepage, and a nine-word query naming
6081
+ * a company, a job and a protocol came back as the results for the one two-letter acronym in
6082
+ * it. Quoting the proper noun, shortening the query and site-scoping it were all tried and all
6083
+ * returned the identical substituted set, so rewriting the query does not help. `warnings`
6084
+ * flags four shapes. Three read the words: no row sharing a single word with the query, every
6085
+ * row matching only a generic word like "pricing" while the thing you named is absent, or
6086
+ * fewer than half the query's subject words appearing anywhere in the results. The fourth
6087
+ * reads Bing's own behaviour and is the reliable one — the query is asked TWICE down the same
6088
+ * exit, and an answer that differs the second time is a random decoy, because a query Bing can
6089
+ * actually answer is stable across repeats (measured 2026-09-12: 1.00 repeat overlap on every
6090
+ * answerable query, 0.00 on every unanswerable one, nothing in between). A partially-relevant
6091
+ * result set is still not caught, so treat the rows as Bing's best offer rather than as proof
6092
+ * anything matched.
5962
6093
  */
5963
6094
  searchWeb(args: { query: string, limit?: number }): Promise<BingSearchResult>;
5964
6095
 
6096
+ /**
6097
+ * Searches the web through a browser to bing.com instead of reading the RSS feed — same
6098
+ * results shape. It does NOT fix relevance: measured 2026-09-12 from the fleet's own egress,
6099
+ * it substitutes on exactly the queries the RSS feed substitutes on, on a residential exit and
6100
+ * a datacenter one alike (the earlier claim that a browser answers multi-word queries
6101
+ * correctly was measured from a laptop and confounded the client with the network). Kept as a
6102
+ * standby that can rescue a query the primary drops. Expensive: holds a browser pool slot for
6103
+ * ~4s per call. Use searchWeb instead, and let the search capability choose when to fall back
6104
+ * to this version.
6105
+ */
6106
+ searchWebBrowser(args: { query: string, limit?: number }): Promise<BingSearchResult>;
6107
+
5965
6108
  /**
5966
6109
  * Searches news coverage and returns stories with the headline, the outlet's own article URL,
5967
6110
  * a summary, a real publication timestamp, the publisher name and a thumbnail. Use this rather
@@ -7187,6 +7330,133 @@ interface CabinsforyouSearchArgs {
7187
7330
  }
7188
7331
  }
7189
7332
 
7333
+ declare namespace BowmarkProvider_cal_com {
7334
+ // ── Cal.com — the unit's own declarations, verbatim ──
7335
+ interface CalComEventType {
7336
+ slug: string;
7337
+ title: string;
7338
+ id: number;
7339
+ lengthInMinutes: number | null;
7340
+ description: string | null;
7341
+ url: string;
7342
+ }
7343
+
7344
+ interface CalComEventTypesResult {
7345
+ username: string;
7346
+ eventTypes: CalComEventType[];
7347
+ }
7348
+
7349
+ interface CalComSlot {
7350
+ start: string;
7351
+ }
7352
+
7353
+ interface CalComDay {
7354
+ date: string;
7355
+ slots: CalComSlot[];
7356
+ }
7357
+
7358
+ interface CalComAvailabilityOptions {
7359
+ daysAhead?: number;
7360
+ }
7361
+
7362
+ interface CalComAvailabilityResult {
7363
+ username: string;
7364
+ eventType: CalComEventType;
7365
+ days: CalComDay[];
7366
+ otherEventTypes: CalComEventType[];
7367
+ }
7368
+
7369
+ /**
7370
+ * Cal.com's own documented, keyless public API — the event types a booking page offers and the
7371
+ * real, currently-open time slots for one of them — no browser, no key.
7372
+ */
7373
+ interface Unit {
7374
+ /**
7375
+ * Lists every event type a Cal.com username currently publishes — the entry point. Takes the
7376
+ * bare username (e.g. "humanlayer") or the full url a caller was given (e.g.
7377
+ * "https://cal.com/humanlayer"), and returns each event's title, slug, id and length.
7378
+ */
7379
+ getEventTypes(username: string): Promise<CalComEventTypesResult>;
7380
+
7381
+ /**
7382
+ * Returns the real, currently-open time slots for one Cal.com event type — accepts a bare
7383
+ * username ("humanlayer"), a username url, or a specific event url
7384
+ * ("https://cal.com/humanlayer/code"). Given a bare username, it picks that username's first
7385
+ * event type and reports the rest in `otherEventTypes`.
7386
+ */
7387
+ getAvailability(username: string, opts?: CalComAvailabilityOptions): Promise<CalComAvailabilityResult>;
7388
+ }
7389
+ }
7390
+
7391
+ declare namespace BowmarkProvider_calendly {
7392
+ // ── Calendly — the unit's own declarations, verbatim ──
7393
+ interface CalendlyEventType {
7394
+ slug: string;
7395
+ name: string;
7396
+ uuid: string;
7397
+ url: string;
7398
+ description: string | null;
7399
+ }
7400
+
7401
+ interface CalendlyProfile {
7402
+ slug: string;
7403
+ name: string;
7404
+ timezone: string;
7405
+ }
7406
+
7407
+ interface CalendlyEventTypesResult {
7408
+ profile: CalendlyProfile;
7409
+ eventTypes: CalendlyEventType[];
7410
+ }
7411
+
7412
+ interface CalendlySlot {
7413
+ startTime: string;
7414
+ inviteesRemaining: number;
7415
+ }
7416
+
7417
+ interface CalendlyDay {
7418
+ date: string;
7419
+ status: string; // the site's own labels — read the values off a result, never guess one from prose
7420
+ slots: CalendlySlot[];
7421
+ }
7422
+
7423
+ interface CalendlyAvailabilityOptions {
7424
+ timezone?: string;
7425
+ daysAhead?: number;
7426
+ }
7427
+
7428
+ interface CalendlyAvailabilityResult {
7429
+ profileSlug: string;
7430
+ eventType: CalendlyEventType;
7431
+ timezone: string;
7432
+ days: CalendlyDay[];
7433
+ otherEventTypes: CalendlyEventType[];
7434
+ }
7435
+
7436
+ /**
7437
+ * Calendly's own public booking-widget data — the event types a scheduling page offers and the
7438
+ * real, currently-open time slots for one of them — read straight off the widget's
7439
+ * undocumented JSON endpoints, no browser, no key.
7440
+ */
7441
+ interface Unit {
7442
+ /**
7443
+ * Lists every event type a Calendly profile currently offers — the entry point. Takes the bare
7444
+ * profile slug a person books under (e.g. "jason-frazier") or the full url a caller was given
7445
+ * (e.g. "https://calendly.com/jason-frazier"), and returns each event's name, slug, uuid and
7446
+ * its own bookable url.
7447
+ */
7448
+ getEventTypes(profile: string): Promise<CalendlyEventTypesResult>;
7449
+
7450
+ /**
7451
+ * Returns the real, currently-open time slots for one Calendly event type — accepts a bare
7452
+ * profile slug ("jason-frazier"), a profile url, or a specific event url
7453
+ * ("https://calendly.com/jason-frazier/15min"). Given a bare profile, it picks that profile's
7454
+ * first event type and reports the rest in `otherEventTypes`.
7455
+ */
7456
+ getAvailability(profile: string, opts?: CalendlyAvailabilityOptions): Promise<CalendlyAvailabilityResult>;
7457
+ }
7458
+ }
7459
+
7190
7460
  declare namespace BowmarkProvider_caliberhealth {
7191
7461
  // ── Caliber Healthcare Solutions — the unit's own declarations, verbatim ──
7192
7462
  // Caliber Healthcare Solutions' OWN shapes — not a capability contract.
@@ -10551,6 +10821,7 @@ interface DentalplansPlanListing {
10551
10821
  monthlyPrice: number;
10552
10822
  dentistsNearYou: number | null;
10553
10823
  detailUrl: string;
10824
+ checkoutUrl: string | null;
10554
10825
  }
10555
10826
 
10556
10827
  interface DentalplansSearchResult {
@@ -11400,6 +11671,78 @@ interface ebayItem {
11400
11671
  }
11401
11672
  }
11402
11673
 
11674
+ declare namespace BowmarkProvider_elase {
11675
+ // ── Elase Med Spa — the unit's own declarations, verbatim ──
11676
+ interface ElaseLocationLink {
11677
+ slug: string;
11678
+ url: string;
11679
+ }
11680
+
11681
+ interface ElaseLocation {
11682
+ slug: string;
11683
+ name: string;
11684
+ url: string;
11685
+ centerId: string; // the id listServices and checkAvailability take
11686
+ phone: string | null;
11687
+ address: string | null;
11688
+ hours: string | null;
11689
+ }
11690
+
11691
+ interface ElaseService {
11692
+ id: string; // the id checkAvailability takes
11693
+ name: string;
11694
+ description: string | null;
11695
+ durationMinutes: number | null;
11696
+ price: number | null;
11697
+ }
11698
+
11699
+ interface ElaseSlot {
11700
+ time: string; // an ISO-ish "YYYY-MM-DDTHH:mm:ss" local time
11701
+ }
11702
+
11703
+ interface ElaseAvailability {
11704
+ centerId: string;
11705
+ serviceId: string;
11706
+ date: string;
11707
+ slots: ElaseSlot[]; // verbatim — empty is a real answer (fully booked / closed)
11708
+ }
11709
+
11710
+ /**
11711
+ * Elase Med Spa's real location directory, live per-location service catalog, and real
11712
+ * open-slot appointment availability — the same Zenoti booking backend the site's own widget
11713
+ * calls. Rung 9/11, no browser.
11714
+ */
11715
+ interface Unit {
11716
+ /**
11717
+ * Reads the live list of every Elase Med Spa location (slug + page URL) off the site's own
11718
+ * /locations/ directory.
11719
+ */
11720
+ listLocations(): Promise<ElaseLocationLink[]>;
11721
+
11722
+ /**
11723
+ * Resolves a slug/neighborhood query (e.g. "sugar-house") to the matching real Elase
11724
+ * location(s) — name, address, phone, hours, and the Zenoti centerId listServices and
11725
+ * checkAvailability need. Call listLocations() first for the real slugs.
11726
+ */
11727
+ findLocation(query: string): Promise<ElaseLocation[]>;
11728
+
11729
+ /**
11730
+ * Reads one location's real, live service catalog — pass a `centerId` from findLocation(), and
11731
+ * an optional search string (e.g. "botox", "consultation") to narrow it; omit it for the full
11732
+ * catalog.
11733
+ */
11734
+ listServices(centerId: string, query?: string): Promise<ElaseService[]>;
11735
+
11736
+ /**
11737
+ * Checks real, live open time slots for one service at one location on one "YYYY-MM-DD" date —
11738
+ * the same live check Elase's own Zenoti booking widget makes before showing bookable times.
11739
+ * An empty `slots` array is the site's real answer (fully booked or closed that day), not an
11740
+ * error.
11741
+ */
11742
+ checkAvailability(centerId: string, serviceId: string, date: string): Promise<ElaseAvailability>;
11743
+ }
11744
+ }
11745
+
11403
11746
  declare namespace BowmarkProvider_elevenlabs {
11404
11747
  // ── ElevenLabs — the unit's own declarations, verbatim ──
11405
11748
  interface elevenlabsSynthesisResult {
@@ -11607,6 +11950,34 @@ interface Eq3SofaConfiguration {
11607
11950
  }
11608
11951
  }
11609
11952
 
11953
+ declare namespace BowmarkProvider_equinox_hotels {
11954
+ // ── Equinox Hotels — the unit's own declarations, verbatim ──
11955
+ interface EquinoxRoom { code: string; name: string; description: string | null; maxOccupants: number | null; bookingUrl: string; }
11956
+
11957
+ interface SearchEquinoxRatesArgs { checkIn: string; checkOut: string; adults?: number; }
11958
+
11959
+ interface EquinoxRate { roomCode: string; rateCode: string; description: string | null; currency: string; nightlyBeforeTax: number; nightlyAfterTax: number; stayBeforeTax: number | null; stayAfterTax: number | null; cancellationText: string | null; bookingUrl: string; }
11960
+
11961
+ /**
11962
+ * Equinox Hotel New York's own live room inventory and direct booking rates, including nightly
11963
+ * and stay-total tax-inclusive prices before any guest details are required.
11964
+ */
11965
+ interface Unit {
11966
+ /**
11967
+ * Lists Equinox Hotel New York's live room inventory, including the booking engine's room
11968
+ * code, description, and occupancy limit.
11969
+ */
11970
+ listRooms(): Promise<EquinoxRoom[]>;
11971
+
11972
+ /**
11973
+ * Searches Equinox Hotel New York's own live booking engine for direct rates on
11974
+ * check-in/check-out dates and an adult count. Returns every room/rate plan with nightly and
11975
+ * stay-total prices, not an OTA estimate.
11976
+ */
11977
+ searchRates(args: SearchEquinoxRatesArgs): Promise<EquinoxRate[]>;
11978
+ }
11979
+ }
11980
+
11610
11981
  declare namespace BowmarkProvider_erieinsurance {
11611
11982
  // ── ERIE Insurance — the unit's own declarations, verbatim ──
11612
11983
  interface ErieAgentQuery {
@@ -11817,6 +12188,31 @@ type ShadeQuizAnswerResult =
11817
12188
  }
11818
12189
  }
11819
12190
 
12191
+ declare namespace BowmarkProvider_evolvemedspa {
12192
+ // ── Evolve Med Spa — the unit's own declarations, verbatim ──
12193
+ interface EvolveMedSpaLocation { id: string; name: string; address: string | null; phone: string | null; }
12194
+ interface EvolveMedSpaService { id: string; name: string; description: string | null; durationMinutes: number | null; price: number | null; }
12195
+ interface EvolveMedSpaAvailability { centerId: string; serviceId: string; date: string; slots: { time: string }[]; }
12196
+
12197
+ /**
12198
+ * Evolve Med Spa's live Zenoti locations, service catalog, and bookable appointment slots — no
12199
+ * login, no PII, and no browser.
12200
+ */
12201
+ interface Unit {
12202
+ /** Lists Evolve Med Spa's real bookable Zenoti locations. */
12203
+ listLocations(): Promise<EvolveMedSpaLocation[]>;
12204
+
12205
+ /** Lists a location's live Zenoti services, prices, and durations. */
12206
+ listServices(centerId: string, query?: string): Promise<EvolveMedSpaService[]>;
12207
+
12208
+ /**
12209
+ * Reads real open appointment slots for a service and date; an empty list is a real
12210
+ * fully-booked answer.
12211
+ */
12212
+ checkAvailability(centerId: string, serviceId: string, date: string): Promise<EvolveMedSpaAvailability>;
12213
+ }
12214
+ }
12215
+
11820
12216
  declare namespace BowmarkProvider_executivehomecare {
11821
12217
  // ── Executive Home Care — the unit's own declarations, verbatim ──
11822
12218
  interface ExecutivehomecareOffice {
@@ -12101,6 +12497,31 @@ interface ExtraspaceUnitAvailability {
12101
12497
  }
12102
12498
  }
12103
12499
 
12500
+ declare namespace BowmarkProvider_faceforwardaesthetics {
12501
+ // ── Face Forward Aesthetics — the unit's own declarations, verbatim ──
12502
+ interface FaceForwardAestheticsLocation { id: string; name: string; address: string | null; phone: string | null; }
12503
+ interface FaceForwardAestheticsService { id: string; name: string; description: string | null; durationMinutes: number | null; price: number | null; }
12504
+ interface FaceForwardAestheticsAvailability { centerId: string; serviceId: string; date: string; slots: { time: string }[]; }
12505
+
12506
+ /**
12507
+ * Face Forward Aesthetics' live Zenoti locations, service catalog, and bookable appointment
12508
+ * slots — no login, no PII, and no browser.
12509
+ */
12510
+ interface Unit {
12511
+ /** Lists Face Forward Aesthetics' real bookable Zenoti locations (9 centers, OH/IN/NV/PA). */
12512
+ listLocations(): Promise<FaceForwardAestheticsLocation[]>;
12513
+
12514
+ /** Lists a location's live Zenoti services, prices, and durations. */
12515
+ listServices(centerId: string, query?: string): Promise<FaceForwardAestheticsService[]>;
12516
+
12517
+ /**
12518
+ * Reads real open appointment slots for a service and date; an empty list is a real
12519
+ * fully-booked answer.
12520
+ */
12521
+ checkAvailability(centerId: string, serviceId: string, date: string): Promise<FaceForwardAestheticsAvailability>;
12522
+ }
12523
+ }
12524
+
12104
12525
  declare namespace BowmarkProvider_facerealityskincare {
12105
12526
  // ── Face Reality Skincare — the unit's own declarations, verbatim ──
12106
12527
  interface FaceRealitySkincareEstheticianRow {
@@ -12141,6 +12562,38 @@ interface FaceRealitySkincareEstheticianRow {
12141
12562
  }
12142
12563
  }
12143
12564
 
12565
+ declare namespace BowmarkProvider_fbsappliance {
12566
+ // ── Factory Builder Stores (FBS Appliance) — the unit's own declarations, verbatim ──
12567
+ interface FbsapplianceSearchArgs {
12568
+ category: string; // the site's own catalog slug, e.g. "built-in-refrigerators"
12569
+ limit?: number; // default 24, clamped to [1, 60]
12570
+ }
12571
+
12572
+ interface FbsapplianceSearchResult {
12573
+ name: string;
12574
+ modelNumber: string; // may end in a literal "..." when the grid clips it
12575
+ price: number; // real, current selling price
12576
+ wasPrice: number | null; // the crossed-out "was" price, when shown
12577
+ availableAt: string | null; // the city the grid names, when it names one
12578
+ url: string; // this product's own FBS Appliance URL
12579
+ }
12580
+
12581
+ /**
12582
+ * FBS Appliance's real catalog across 8 Texas showrooms — searchAppliances runs the site's own
12583
+ * category grid and returns real, currently-listed appliances with live selling price, any
12584
+ * sale/was price, model number, and which store the grid shows it in stock at.
12585
+ */
12586
+ interface Unit {
12587
+ /**
12588
+ * Runs FBS Appliance's own category grid and returns real, currently-listed appliances (name,
12589
+ * model number, real current price, the crossed-out 'was' price when shown, the store the grid
12590
+ * names as having it, and the product's own FBS Appliance URL). Read-only — never adds to cart
12591
+ * or checks out.
12592
+ */
12593
+ searchAppliances(args: FbsapplianceSearchArgs): Promise<FbsapplianceSearchResult[]>;
12594
+ }
12595
+ }
12596
+
12144
12597
  declare namespace BowmarkProvider_fieldstonehomes {
12145
12598
  // ── Fieldstone Homes — the unit's own declarations, verbatim ──
12146
12599
  interface FieldstonehomesSearchArgs { city?: string; homeType?: string; minPrice?: number; maxPrice?: number; minBeds?: number; minSqft?: number; }
@@ -12284,6 +12737,56 @@ interface FirstdibsListing {
12284
12737
  }
12285
12738
  }
12286
12739
 
12740
+ declare namespace BowmarkProvider_fitness1440 {
12741
+ // ── FITNESS:1440 — the unit's own declarations, verbatim ──
12742
+ // FITNESS:1440's OWN shapes — not a capability contract.
12743
+
12744
+ interface Fitness1440Location {
12745
+ state: string;
12746
+ city: string;
12747
+ }
12748
+
12749
+ interface Fitness1440ListLocationsArgs {
12750
+ state?: string;
12751
+ }
12752
+
12753
+ interface Fitness1440ListLocationsResult {
12754
+ locations: Fitness1440Location[];
12755
+ states: string[];
12756
+ }
12757
+
12758
+ interface Fitness1440DayPassRequestArgs {
12759
+ state: string;
12760
+ city: string;
12761
+ }
12762
+
12763
+ interface Fitness1440DayPassRequestInfo {
12764
+ state: string;
12765
+ city: string;
12766
+ requestUrl: string; // the WRITE handoff this provider never submits
12767
+ requiredFields: string[];
12768
+ }
12769
+
12770
+ /**
12771
+ * FITNESS:1440's own live day-pass request form (/request-day-pass/) — the real state → city
12772
+ * cascade of clubs currently taking free day-pass requests, off the site's own server-rendered
12773
+ * form, plus the form's own handoff for one confirmed location.
12774
+ */
12775
+ interface Unit {
12776
+ /**
12777
+ * Reads FITNESS:1440's own live day-pass form and returns the state → city cascade it
12778
+ * currently renders, optionally filtered to one state.
12779
+ */
12780
+ listLocations(args?: Fitness1440ListLocationsArgs): Promise<Fitness1440ListLocationsResult>;
12781
+
12782
+ /**
12783
+ * Validates one state/city pair against the live cascade and returns the day-pass form's own
12784
+ * URL and required fields — the handoff a caller completes the request at.
12785
+ */
12786
+ getDayPassRequestInfo(args: Fitness1440DayPassRequestArgs): Promise<Fitness1440DayPassRequestInfo>;
12787
+ }
12788
+ }
12789
+
12287
12790
  declare namespace BowmarkProvider_fivebelow {
12288
12791
  // ── Five Below — the unit's own declarations, verbatim ──
12289
12792
  interface FiveBelowVariant {
@@ -12444,6 +12947,71 @@ interface flightradar24ArrivalsBoard {
12444
12947
  }
12445
12948
  }
12446
12949
 
12950
+ declare namespace BowmarkProvider_fluencecorp {
12951
+ // ── Fluence Corporation — the unit's own declarations, verbatim ──
12952
+ interface ConcentrationSet {
12953
+ COD: number;
12954
+ TKN: number;
12955
+ NO3N: number;
12956
+ DisolvedOxygen?: number;
12957
+ }
12958
+
12959
+ interface SludgeConcentrationSet {
12960
+ TSSConcentration: number;
12961
+ COD?: number;
12962
+ TKN?: number;
12963
+ NO3N?: number;
12964
+ DisolvedOxygen?: number;
12965
+ VSS_TSS_Ratio?: number;
12966
+ }
12967
+
12968
+ interface PowerConsumer {
12969
+ name: string;
12970
+ consumption: number;
12971
+ count: number;
12972
+ operation: number;
12973
+ }
12974
+
12975
+ interface EnergyConsumptionInput {
12976
+ influentFlow: number;
12977
+ sludgeFlow?: number;
12978
+ influent: ConcentrationSet;
12979
+ effluent: ConcentrationSet;
12980
+ sludge: SludgeConcentrationSet;
12981
+ elevation: number;
12982
+ temperature: number;
12983
+ power: Record<string, PowerConsumer>;
12984
+ }
12985
+
12986
+ interface EnergyConsumptionResult {
12987
+ NEC: number;
12988
+ NEC_T_P: number;
12989
+ NOR: number;
12990
+ LR_COD: number;
12991
+ LR_TKN: number;
12992
+ LR_NO3N: number;
12993
+ LR_DisolvedOxygen: number;
12994
+ totalPower: number;
12995
+ barometricPressure: number;
12996
+ effluentFlow: number;
12997
+ level: 0 | 1 | 2 | 3;
12998
+ }
12999
+
13000
+ /**
13001
+ * Computes Normalized Energy Consumption (NEC, kWh/kg) for a wastewater-treatment plant design
13002
+ * per ISO 21939 — the exact calculation Fluence's own Energy Consumption Calculator performs,
13003
+ * reimplemented locally with no network call.
13004
+ */
13005
+ interface Unit {
13006
+ /**
13007
+ * Computes Normalized Energy Consumption (NEC, kWh/kg) for a wastewater treatment plant design
13008
+ * per ISO 21939, from design flows, influent/sludge/effluent concentrations, environmental
13009
+ * conditions and a power-consumer list.
13010
+ */
13011
+ calculateEnergyConsumption(args: EnergyConsumptionInput): Promise<EnergyConsumptionResult>;
13012
+ }
13013
+ }
13014
+
12447
13015
  declare namespace BowmarkProvider_ford {
12448
13016
  // ── Ford — the unit's own declarations, verbatim ──
12449
13017
  interface fordDayHours {
@@ -12870,6 +13438,46 @@ interface HubspotPageForms {
12870
13438
  }
12871
13439
  }
12872
13440
 
13441
+ declare namespace BowmarkProvider_fortressbp {
13442
+ // ── Fortress Building Products — the unit's own declarations, verbatim ──
13443
+ interface fortressbpRecommendation {
13444
+ productName: string | null;
13445
+ imageUrl: string;
13446
+ path: string[];
13447
+ }
13448
+ interface fortressbpNextQuestion {
13449
+ prompt: string;
13450
+ options: string[];
13451
+ }
13452
+ type fortressbpRow =
13453
+ | ({ complete: true } & fortressbpRecommendation)
13454
+ | ({ complete: false } & fortressbpNextQuestion);
13455
+ interface ListProductTypesResult {
13456
+ productTypes: string[];
13457
+ }
13458
+ interface RecommendProductArgs {
13459
+ selections: string[];
13460
+ }
13461
+
13462
+ /**
13463
+ * Fortress Building Products' own Simplifinder product-recommendation tool (fencing, framing,
13464
+ * pergolas), reimplemented from the site's own decision tree.
13465
+ */
13466
+ interface Unit {
13467
+ /**
13468
+ * Reads Simplifinder's own top-level product-type choices (Fencing / Framing / Pergolas) off
13469
+ * the live page.
13470
+ */
13471
+ listProductTypes(): Promise<ListProductTypesResult>;
13472
+
13473
+ /**
13474
+ * Walks Simplifinder's own decision tree with the labels chosen so far and returns either the
13475
+ * recommended product or the next question to ask.
13476
+ */
13477
+ recommendProduct(args: RecommendProductArgs): Promise<fortressbpRow>;
13478
+ }
13479
+ }
13480
+
12873
13481
  declare namespace BowmarkProvider_fourseasonsyachts {
12874
13482
  // ── Four Seasons Yachts — the unit's own declarations, verbatim ──
12875
13483
  interface FourseasonsyachtsVoyage {
@@ -17457,6 +18065,35 @@ interface IvoryHomesSearchFilters {
17457
18065
  }
17458
18066
  }
17459
18067
 
18068
+ declare namespace BowmarkProvider_jasmine_dilucci {
18069
+ // ── Jasmine DiLucci Life Coaching — the unit's own declarations, verbatim ──
18070
+ interface FormField {
18071
+ name?: string;
18072
+ type?: string;
18073
+ label?: string;
18074
+ step?: string;
18075
+ options?: string[];
18076
+ }
18077
+
18078
+ interface ApplicationFormSchema {
18079
+ step?: string;
18080
+ fields: FormField[];
18081
+ }
18082
+
18083
+ interface GetApplicationFormSchemaArgs {
18084
+ includeOptions?: boolean;
18085
+ }
18086
+
18087
+ /** Extracts application form structure from Jasmine DiLucci's coaching application funnel. */
18088
+ interface Unit {
18089
+ /**
18090
+ * Returns the structure of the application funnel's DQ step: field names, labels, and step
18091
+ * markers.
18092
+ */
18093
+ getApplicationFormSchema(args?: { includeOptions?: boolean }): Promise<ApplicationFormSchema>;
18094
+ }
18095
+ }
18096
+
17460
18097
  declare namespace BowmarkProvider_jennikayne {
17461
18098
  // ── Jenni Kayne — the unit's own declarations, verbatim ──
17462
18099
  interface GiftCardDenomination {
@@ -18338,6 +18975,42 @@ interface LabcorpTestDetail extends LabcorpTestSummary {
18338
18975
  }
18339
18976
  }
18340
18977
 
18978
+ declare namespace BowmarkProvider_landmarkhw_com {
18979
+ // ── Landmark Home Warranty — the unit's own declarations, verbatim ──
18980
+ interface LandmarkhwComOrderState {
18981
+ code: string;
18982
+ name: string;
18983
+ }
18984
+ interface LandmarkhwComPropertyType {
18985
+ id: string;
18986
+ name: string;
18987
+ units: number;
18988
+ }
18989
+ interface LandmarkhwComOrderOptionsArgs {
18990
+ stateCode: string;
18991
+ }
18992
+ interface LandmarkhwComOrderOptions {
18993
+ state: LandmarkhwComOrderState;
18994
+ propertyTypes: LandmarkhwComPropertyType[];
18995
+ orderUrl: string;
18996
+ }
18997
+
18998
+ /**
18999
+ * Landmark Home Warranty's public order-form choices: market states and property types, read
19000
+ * from server-rendered bootstrap data.
19001
+ */
19002
+ interface Unit {
19003
+ /** Lists the states where Landmark Home Warranty's public order form currently offers coverage. */
19004
+ listOrderStates(): Promise<LandmarkhwComOrderState[]>;
19005
+
19006
+ /**
19007
+ * Returns the property-type choices for a Landmark Home Warranty order in one supported state,
19008
+ * before any quote or order is submitted.
19009
+ */
19010
+ getOrderFormOptions(args: LandmarkhwComOrderOptionsArgs): Promise<LandmarkhwComOrderOptions>;
19011
+ }
19012
+ }
19013
+
18341
19014
  declare namespace BowmarkProvider_lasikplus {
18342
19015
  // ── LasikPlus — the unit's own declarations, verbatim ──
18343
19016
  interface LasikPlusCenter {
@@ -24950,6 +25623,52 @@ interface RitaniPriceResult {
24950
25623
  }
24951
25624
  }
24952
25625
 
25626
+ declare namespace BowmarkProvider_rivian {
25627
+ // ── Rivian — the unit's own declarations, verbatim ──
25628
+ type RivianLeaseTrim = "premium";
25629
+ type RivianLeaseTermMonths = 24 | 36;
25630
+ type RivianLeaseAnnualMileage = 10000 | 12000 | 15000;
25631
+ type RivianLeaseCreditTier = "excellent" | "veryGood" | "good";
25632
+
25633
+ interface RivianLeaseEstimateArgs {
25634
+ trim: RivianLeaseTrim;
25635
+ termMonths: RivianLeaseTermMonths;
25636
+ annualMileage: RivianLeaseAnnualMileage;
25637
+ creditTier: RivianLeaseCreditTier;
25638
+ downPayment: number;
25639
+ }
25640
+
25641
+ interface RivianLeaseEstimate {
25642
+ model: "R1T";
25643
+ trim: RivianLeaseTrim;
25644
+ vehiclePrice: number;
25645
+ destinationFee: number;
25646
+ acquisitionFee: number;
25647
+ monthlyPayment: number;
25648
+ downPayment: number;
25649
+ amountDueAtSigning: number;
25650
+ residualValue: number;
25651
+ termMonths: number;
25652
+ annualMileage: number;
25653
+ isLeaseEligible: boolean;
25654
+ }
25655
+
25656
+ /**
25657
+ * Prices a real Rivian R1T lease through rivian.com's own R1 Shop payment-estimate calculator
25658
+ * — monthly payment, amount due at signing, acquisition fee and residual value for a chosen
25659
+ * term, mileage allowance, credit tier and down payment.
25660
+ */
25661
+ interface Unit {
25662
+ /**
25663
+ * Prices a real Rivian R1T Premium lease — monthly payment, amount due at signing, acquisition
25664
+ * fee and residual value — for a chosen term (24 or 36 months), annual mileage allowance
25665
+ * (10,000/12,000/15,000), credit tier and cash down payment, through rivian.com's own R1 Shop
25666
+ * payment-estimate calculator. Only the Premium trim has a verified option combo today.
25667
+ */
25668
+ estimateLeasePayment(args: RivianLeaseEstimateArgs): Promise<RivianLeaseEstimate>;
25669
+ }
25670
+ }
25671
+
24953
25672
  declare namespace BowmarkProvider_roofmaxx {
24954
25673
  // ── Roof Maxx — the unit's own declarations, verbatim ──
24955
25674
  interface RoofmaxxCalculatorSettings {
@@ -28227,6 +28946,41 @@ interface topviewtixPackageSummary {
28227
28946
  }
28228
28947
  }
28229
28948
 
28949
+ declare namespace BowmarkProvider_totalplastics {
28950
+ // ── Total Plastics — the unit's own declarations, verbatim ──
28951
+ interface TotalplasticsQuoteFormField {
28952
+ id: string;
28953
+ type: string;
28954
+ label: string;
28955
+ required: boolean;
28956
+ options: string[];
28957
+ }
28958
+ interface TotalplasticsQuoteFormFields {
28959
+ title: string;
28960
+ formUrl: string;
28961
+ fields: TotalplasticsQuoteFormField[];
28962
+ }
28963
+
28964
+ /**
28965
+ * Total Plastics' own "Request a Quote" form — a POWR widget embedded on /contact-us/, not on
28966
+ * /quote/ — read directly off POWR's server-rendered config.
28967
+ */
28968
+ interface Unit {
28969
+ /**
28970
+ * Reads Total Plastics' live "Request a Quote" form and returns its field schema — label,
28971
+ * type, required, and options per field.
28972
+ */
28973
+ getQuoteFormFields(): Promise<TotalplasticsQuoteFormFields>;
28974
+
28975
+ /**
28976
+ * Reads one named field off the live "Request a Quote" form — e.g. "Material Type" or "Annual
28977
+ * Plastics Spend" — and returns its option list, so a caller can pick a valid value before
28978
+ * submitting.
28979
+ */
28980
+ getQuoteFormFieldOptions(label: string): Promise<TotalplasticsQuoteFormField>;
28981
+ }
28982
+ }
28983
+
28230
28984
  declare namespace BowmarkProvider_travelinsured {
28231
28985
  // ── Travel Insured International — the unit's own declarations, verbatim ──
28232
28986
  interface TravelinsuredDestination {
@@ -28774,6 +29528,62 @@ interface uspsRateOption {
28774
29528
  }
28775
29529
  }
28776
29530
 
29531
+ declare namespace BowmarkProvider_vbt {
29532
+ // ── VBT Vacations — the unit's own declarations, verbatim ──
29533
+ interface VbtTourListing {
29534
+ slug: string; // e.g. "dolomites-self-guided-bike-tour"
29535
+ url: string; // full https://www.vbt.com/... tour page URL
29536
+ region: string; // e.g. "europe"
29537
+ country: string; // e.g. "italy"
29538
+ lastmod: string | null;
29539
+ }
29540
+ interface VbtPackageOption {
29541
+ durationDays: number;
29542
+ fromPrice: number; // per-person starting price, USD
29543
+ }
29544
+ interface VbtDeparture {
29545
+ id: string;
29546
+ departureDate: string; // ISO date
29547
+ returnDate: string | null; // ISO date
29548
+ stopSellFlag: boolean; // VBT's own "sales closed" signal, not live seat count
29549
+ status: string | null; // the site's own labels — read the values off a result, never guess one from prose
29550
+ deposit: string | null;
29551
+ finalPaymentDate: string | null;
29552
+ }
29553
+ interface VbtTourDepartures {
29554
+ tourId: string;
29555
+ tourName: string;
29556
+ tourUrl: string;
29557
+ packageOptions: { tour: VbtPackageOption; tourPlusTravelPackage: VbtPackageOption };
29558
+ departures: VbtDeparture[];
29559
+ bookingUrl: string; // the same page — VBT's own "View Dates & Book" is client-rendered here
29560
+ }
29561
+
29562
+ /**
29563
+ * Reads VBT's own tour pages — every self-guided/guided bike and walking tour it sells — and
29564
+ * returns its current departure dates, stop-sell flags and Tour-Only / Tour+Travel-Package
29565
+ * starting prices straight out of the page's own server-rendered data, no browser.
29566
+ */
29567
+ interface Unit {
29568
+ /**
29569
+ * Lists every tour VBT publishes today, straight off vbt.com's own sitemap.xml — slug, full
29570
+ * tour URL and region/country for every /destinations/<region>/<country>/<slug> entry (108
29571
+ * tours measured 2026-09-11). The entry point: pass any returned `url` or `slug` into
29572
+ * `getTourDepartures`.
29573
+ */
29574
+ listTours(): Promise<{ tours: VbtTourListing[] }>;
29575
+
29576
+ /**
29577
+ * Reads one VBT tour's own page (full URL from `listTours`, or just its slug, e.g.
29578
+ * `"dolomites-self-guided-bike-tour"`) and returns its Tour-Only and Tour+Travel-Package
29579
+ * starting prices plus every listed departure — date, VBT's own stop-sell flag, return date,
29580
+ * deposit and final-payment date — exactly as published today, with the page URL as the
29581
+ * booking handoff. Throws if the slug does not resolve to a real tour.
29582
+ */
29583
+ getTourDepartures(tourUrlOrSlug: string): Promise<VbtTourDepartures>;
29584
+ }
29585
+ }
29586
+
28777
29587
  declare namespace BowmarkProvider_vervecoffee {
28778
29588
  // ── Verve Coffee Roasters — the unit's own declarations, verbatim ──
28779
29589
  interface VervecoffeeSubscription {
@@ -30850,6 +31660,7 @@ interface BowmarkProviders {
30850
31660
  aa: BowmarkProvider_aa.Unit;
30851
31661
  aauto: BowmarkProvider_aauto.Unit;
30852
31662
  abercrombie: BowmarkProvider_abercrombie.Unit;
31663
+ abqplumb: BowmarkProvider_abqplumb.Unit;
30853
31664
  acerentacar: BowmarkProvider_acerentacar.Unit;
30854
31665
  achosahw: BowmarkProvider_achosahw.Unit;
30855
31666
  acqualinaresort: BowmarkProvider_acqualinaresort.Unit;
@@ -30920,6 +31731,8 @@ interface BowmarkProviders {
30920
31731
  bykoket: BowmarkProvider_bykoket.Unit;
30921
31732
  byltbasics: BowmarkProvider_byltbasics.Unit;
30922
31733
  cabinsforyou: BowmarkProvider_cabinsforyou.Unit;
31734
+ cal_com: BowmarkProvider_cal_com.Unit;
31735
+ calendly: BowmarkProvider_calendly.Unit;
30923
31736
  caliberhealth: BowmarkProvider_caliberhealth.Unit;
30924
31737
  califloors: BowmarkProvider_califloors.Unit;
30925
31738
  camelcamelcamel: BowmarkProvider_camelcamelcamel.Unit;
@@ -30982,26 +31795,34 @@ interface BowmarkProviders {
30982
31795
  doordash: BowmarkProvider_doordash.Unit;
30983
31796
  dumpsters: BowmarkProvider_dumpsters.Unit;
30984
31797
  ebay: BowmarkProvider_ebay.Unit;
31798
+ elase: BowmarkProvider_elase.Unit;
30985
31799
  elevenlabs: BowmarkProvider_elevenlabs.Unit;
30986
31800
  embroker: BowmarkProvider_embroker.Unit;
30987
31801
  epromos: BowmarkProvider_epromos.Unit;
30988
31802
  eq3: BowmarkProvider_eq3.Unit;
31803
+ equinox_hotels: BowmarkProvider_equinox_hotels.Unit;
30989
31804
  erieinsurance: BowmarkProvider_erieinsurance.Unit;
30990
31805
  etsy: BowmarkProvider_etsy.Unit;
30991
31806
  eventsource: BowmarkProvider_eventsource.Unit;
30992
31807
  evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
31808
+ evolvemedspa: BowmarkProvider_evolvemedspa.Unit;
30993
31809
  executivehomecare: BowmarkProvider_executivehomecare.Unit;
30994
31810
  extraspace: BowmarkProvider_extraspace.Unit;
31811
+ faceforwardaesthetics: BowmarkProvider_faceforwardaesthetics.Unit;
30995
31812
  facerealityskincare: BowmarkProvider_facerealityskincare.Unit;
31813
+ fbsappliance: BowmarkProvider_fbsappliance.Unit;
30996
31814
  fieldstonehomes: BowmarkProvider_fieldstonehomes.Unit;
30997
31815
  firstamericahomes: BowmarkProvider_firstamericahomes.Unit;
30998
31816
  firstdibs: BowmarkProvider_firstdibs.Unit;
31817
+ fitness1440: BowmarkProvider_fitness1440.Unit;
30999
31818
  fivebelow: BowmarkProvider_fivebelow.Unit;
31000
31819
  fivestarbathsolutions: BowmarkProvider_fivestarbathsolutions.Unit;
31001
31820
  flightradar24: BowmarkProvider_flightradar24.Unit;
31821
+ fluencecorp: BowmarkProvider_fluencecorp.Unit;
31002
31822
  ford: BowmarkProvider_ford.Unit;
31003
31823
  formax: BowmarkProvider_formax.Unit;
31004
31824
  forms_hubspot_com: BowmarkProvider_forms_hubspot_com.Unit;
31825
+ fortressbp: BowmarkProvider_fortressbp.Unit;
31005
31826
  fourseasonsyachts: BowmarkProvider_fourseasonsyachts.Unit;
31006
31827
  framebridge: BowmarkProvider_framebridge.Unit;
31007
31828
  fred: BowmarkProvider_fred.Unit;
@@ -31048,6 +31869,7 @@ interface BowmarkProviders {
31048
31869
  islllc: BowmarkProvider_islllc.Unit;
31049
31870
  istanbulkart: BowmarkProvider_istanbulkart.Unit;
31050
31871
  ivoryhomes: BowmarkProvider_ivoryhomes.Unit;
31872
+ jasmine_dilucci: BowmarkProvider_jasmine_dilucci.Unit;
31051
31873
  jennikayne: BowmarkProvider_jennikayne.Unit;
31052
31874
  joybird: BowmarkProvider_joybird.Unit;
31053
31875
  joycefactorydirect: BowmarkProvider_joycefactorydirect.Unit;
@@ -31063,6 +31885,7 @@ interface BowmarkProviders {
31063
31885
  kompan: BowmarkProvider_kompan.Unit;
31064
31886
  kuiu: BowmarkProvider_kuiu.Unit;
31065
31887
  labcorp: BowmarkProvider_labcorp.Unit;
31888
+ landmarkhw_com: BowmarkProvider_landmarkhw_com.Unit;
31066
31889
  lasikplus: BowmarkProvider_lasikplus.Unit;
31067
31890
  legacyhomesal: BowmarkProvider_legacyhomesal.Unit;
31068
31891
  linkedin: BowmarkProvider_linkedin.Unit;
@@ -31137,6 +31960,7 @@ interface BowmarkProviders {
31137
31960
  revisionskincare: BowmarkProvider_revisionskincare.Unit;
31138
31961
  rishitea: BowmarkProvider_rishitea.Unit;
31139
31962
  ritani: BowmarkProvider_ritani.Unit;
31963
+ rivian: BowmarkProvider_rivian.Unit;
31140
31964
  roofmaxx: BowmarkProvider_roofmaxx.Unit;
31141
31965
  rover: BowmarkProvider_rover.Unit;
31142
31966
  rvshare: BowmarkProvider_rvshare.Unit;
@@ -31180,6 +32004,7 @@ interface BowmarkProviders {
31180
32004
  titlenine: BowmarkProvider_titlenine.Unit;
31181
32005
  tmobile: BowmarkProvider_tmobile.Unit;
31182
32006
  topviewtix: BowmarkProvider_topviewtix.Unit;
32007
+ totalplastics: BowmarkProvider_totalplastics.Unit;
31183
32008
  travelinsured: BowmarkProvider_travelinsured.Unit;
31184
32009
  trawickinternational: BowmarkProvider_trawickinternational.Unit;
31185
32010
  trektravel: BowmarkProvider_trektravel.Unit;
@@ -31190,6 +32015,7 @@ interface BowmarkProviders {
31190
32015
  ulrichlifestyle: BowmarkProvider_ulrichlifestyle.Unit;
31191
32016
  ups: BowmarkProvider_ups.Unit;
31192
32017
  usps: BowmarkProvider_usps.Unit;
32018
+ vbt: BowmarkProvider_vbt.Unit;
31193
32019
  vervecoffee: BowmarkProvider_vervecoffee.Unit;
31194
32020
  vessi: BowmarkProvider_vessi.Unit;
31195
32021
  viewrail: BowmarkProvider_viewrail.Unit;