@bowmark/web 1.18.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: 12940343b1f8c9228a6b145e3e5125fe143419901694198fcc8789af04b5dc2e
9
- // 45 capabilities, 367 providers, 913 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`.
2629
2703
  */
2630
- getFields(url: string): Promise<FormInspectionResult>;
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.
2716
+ */
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.
@@ -12227,6 +12497,31 @@ interface ExtraspaceUnitAvailability {
12227
12497
  }
12228
12498
  }
12229
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
+
12230
12525
  declare namespace BowmarkProvider_facerealityskincare {
12231
12526
  // ── Face Reality Skincare — the unit's own declarations, verbatim ──
12232
12527
  interface FaceRealitySkincareEstheticianRow {
@@ -12267,6 +12562,38 @@ interface FaceRealitySkincareEstheticianRow {
12267
12562
  }
12268
12563
  }
12269
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
+
12270
12597
  declare namespace BowmarkProvider_fieldstonehomes {
12271
12598
  // ── Fieldstone Homes — the unit's own declarations, verbatim ──
12272
12599
  interface FieldstonehomesSearchArgs { city?: string; homeType?: string; minPrice?: number; maxPrice?: number; minBeds?: number; minSqft?: number; }
@@ -12410,6 +12737,56 @@ interface FirstdibsListing {
12410
12737
  }
12411
12738
  }
12412
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
+
12413
12790
  declare namespace BowmarkProvider_fivebelow {
12414
12791
  // ── Five Below — the unit's own declarations, verbatim ──
12415
12792
  interface FiveBelowVariant {
@@ -12570,6 +12947,71 @@ interface flightradar24ArrivalsBoard {
12570
12947
  }
12571
12948
  }
12572
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
+
12573
13015
  declare namespace BowmarkProvider_ford {
12574
13016
  // ── Ford — the unit's own declarations, verbatim ──
12575
13017
  interface fordDayHours {
@@ -12996,6 +13438,46 @@ interface HubspotPageForms {
12996
13438
  }
12997
13439
  }
12998
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
+
12999
13481
  declare namespace BowmarkProvider_fourseasonsyachts {
13000
13482
  // ── Four Seasons Yachts — the unit's own declarations, verbatim ──
13001
13483
  interface FourseasonsyachtsVoyage {
@@ -17583,6 +18065,35 @@ interface IvoryHomesSearchFilters {
17583
18065
  }
17584
18066
  }
17585
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
+
17586
18097
  declare namespace BowmarkProvider_jennikayne {
17587
18098
  // ── Jenni Kayne — the unit's own declarations, verbatim ──
17588
18099
  interface GiftCardDenomination {
@@ -18464,6 +18975,42 @@ interface LabcorpTestDetail extends LabcorpTestSummary {
18464
18975
  }
18465
18976
  }
18466
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
+
18467
19014
  declare namespace BowmarkProvider_lasikplus {
18468
19015
  // ── LasikPlus — the unit's own declarations, verbatim ──
18469
19016
  interface LasikPlusCenter {
@@ -25076,6 +25623,52 @@ interface RitaniPriceResult {
25076
25623
  }
25077
25624
  }
25078
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
+
25079
25672
  declare namespace BowmarkProvider_roofmaxx {
25080
25673
  // ── Roof Maxx — the unit's own declarations, verbatim ──
25081
25674
  interface RoofmaxxCalculatorSettings {
@@ -28353,6 +28946,41 @@ interface topviewtixPackageSummary {
28353
28946
  }
28354
28947
  }
28355
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
+
28356
28984
  declare namespace BowmarkProvider_travelinsured {
28357
28985
  // ── Travel Insured International — the unit's own declarations, verbatim ──
28358
28986
  interface TravelinsuredDestination {
@@ -31032,6 +31660,7 @@ interface BowmarkProviders {
31032
31660
  aa: BowmarkProvider_aa.Unit;
31033
31661
  aauto: BowmarkProvider_aauto.Unit;
31034
31662
  abercrombie: BowmarkProvider_abercrombie.Unit;
31663
+ abqplumb: BowmarkProvider_abqplumb.Unit;
31035
31664
  acerentacar: BowmarkProvider_acerentacar.Unit;
31036
31665
  achosahw: BowmarkProvider_achosahw.Unit;
31037
31666
  acqualinaresort: BowmarkProvider_acqualinaresort.Unit;
@@ -31102,6 +31731,8 @@ interface BowmarkProviders {
31102
31731
  bykoket: BowmarkProvider_bykoket.Unit;
31103
31732
  byltbasics: BowmarkProvider_byltbasics.Unit;
31104
31733
  cabinsforyou: BowmarkProvider_cabinsforyou.Unit;
31734
+ cal_com: BowmarkProvider_cal_com.Unit;
31735
+ calendly: BowmarkProvider_calendly.Unit;
31105
31736
  caliberhealth: BowmarkProvider_caliberhealth.Unit;
31106
31737
  califloors: BowmarkProvider_califloors.Unit;
31107
31738
  camelcamelcamel: BowmarkProvider_camelcamelcamel.Unit;
@@ -31177,16 +31808,21 @@ interface BowmarkProviders {
31177
31808
  evolvemedspa: BowmarkProvider_evolvemedspa.Unit;
31178
31809
  executivehomecare: BowmarkProvider_executivehomecare.Unit;
31179
31810
  extraspace: BowmarkProvider_extraspace.Unit;
31811
+ faceforwardaesthetics: BowmarkProvider_faceforwardaesthetics.Unit;
31180
31812
  facerealityskincare: BowmarkProvider_facerealityskincare.Unit;
31813
+ fbsappliance: BowmarkProvider_fbsappliance.Unit;
31181
31814
  fieldstonehomes: BowmarkProvider_fieldstonehomes.Unit;
31182
31815
  firstamericahomes: BowmarkProvider_firstamericahomes.Unit;
31183
31816
  firstdibs: BowmarkProvider_firstdibs.Unit;
31817
+ fitness1440: BowmarkProvider_fitness1440.Unit;
31184
31818
  fivebelow: BowmarkProvider_fivebelow.Unit;
31185
31819
  fivestarbathsolutions: BowmarkProvider_fivestarbathsolutions.Unit;
31186
31820
  flightradar24: BowmarkProvider_flightradar24.Unit;
31821
+ fluencecorp: BowmarkProvider_fluencecorp.Unit;
31187
31822
  ford: BowmarkProvider_ford.Unit;
31188
31823
  formax: BowmarkProvider_formax.Unit;
31189
31824
  forms_hubspot_com: BowmarkProvider_forms_hubspot_com.Unit;
31825
+ fortressbp: BowmarkProvider_fortressbp.Unit;
31190
31826
  fourseasonsyachts: BowmarkProvider_fourseasonsyachts.Unit;
31191
31827
  framebridge: BowmarkProvider_framebridge.Unit;
31192
31828
  fred: BowmarkProvider_fred.Unit;
@@ -31233,6 +31869,7 @@ interface BowmarkProviders {
31233
31869
  islllc: BowmarkProvider_islllc.Unit;
31234
31870
  istanbulkart: BowmarkProvider_istanbulkart.Unit;
31235
31871
  ivoryhomes: BowmarkProvider_ivoryhomes.Unit;
31872
+ jasmine_dilucci: BowmarkProvider_jasmine_dilucci.Unit;
31236
31873
  jennikayne: BowmarkProvider_jennikayne.Unit;
31237
31874
  joybird: BowmarkProvider_joybird.Unit;
31238
31875
  joycefactorydirect: BowmarkProvider_joycefactorydirect.Unit;
@@ -31248,6 +31885,7 @@ interface BowmarkProviders {
31248
31885
  kompan: BowmarkProvider_kompan.Unit;
31249
31886
  kuiu: BowmarkProvider_kuiu.Unit;
31250
31887
  labcorp: BowmarkProvider_labcorp.Unit;
31888
+ landmarkhw_com: BowmarkProvider_landmarkhw_com.Unit;
31251
31889
  lasikplus: BowmarkProvider_lasikplus.Unit;
31252
31890
  legacyhomesal: BowmarkProvider_legacyhomesal.Unit;
31253
31891
  linkedin: BowmarkProvider_linkedin.Unit;
@@ -31322,6 +31960,7 @@ interface BowmarkProviders {
31322
31960
  revisionskincare: BowmarkProvider_revisionskincare.Unit;
31323
31961
  rishitea: BowmarkProvider_rishitea.Unit;
31324
31962
  ritani: BowmarkProvider_ritani.Unit;
31963
+ rivian: BowmarkProvider_rivian.Unit;
31325
31964
  roofmaxx: BowmarkProvider_roofmaxx.Unit;
31326
31965
  rover: BowmarkProvider_rover.Unit;
31327
31966
  rvshare: BowmarkProvider_rvshare.Unit;
@@ -31365,6 +32004,7 @@ interface BowmarkProviders {
31365
32004
  titlenine: BowmarkProvider_titlenine.Unit;
31366
32005
  tmobile: BowmarkProvider_tmobile.Unit;
31367
32006
  topviewtix: BowmarkProvider_topviewtix.Unit;
32007
+ totalplastics: BowmarkProvider_totalplastics.Unit;
31368
32008
  travelinsured: BowmarkProvider_travelinsured.Unit;
31369
32009
  trawickinternational: BowmarkProvider_trawickinternational.Unit;
31370
32010
  trektravel: BowmarkProvider_trektravel.Unit;