@bowmark/web 1.12.1 → 1.12.3

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: 5207ea33354972da803d6974eed73abefc0ae46410767310486fd5116faa04c1
9
- // 34 capabilities, 257 providers, 674 typed functions, 20 refused.
8
+ // Manifest version: 7ac4a9084853ee226f56e4964cb0bb95339c8375142eebd03526a4d6651ae380
9
+ // 39 capabilities, 274 providers, 707 typed functions, 20 refused.
10
10
  // 51,715 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
11
11
  //
12
12
  // REFUSED — these functions are real and callable, and their declared arguments
@@ -197,6 +197,53 @@ type CallOptions = {
197
197
  }
198
198
  }
199
199
 
200
+ declare namespace BowmarkCapability_costume_size_check {
201
+ // ── Check one costume character's stock at one size, across Target, Walmart, and Spirit Halloween — the unit's own declarations, verbatim ──
202
+ interface RetailerSizeMatch {
203
+ title: string
204
+ url: string
205
+ price: { amount: number; currency: string } | null
206
+ inStock: boolean
207
+ }
208
+ interface RetailerSizeResult {
209
+ matched: RetailerSizeMatch | null // null + incomplete=false means this retailer
210
+ // answered and has no listing in this size
211
+ incomplete: boolean // true means this retailer's call never
212
+ // answered — matched is NOT a stockout then
213
+ }
214
+ interface CostumeSizeCheck {
215
+ character: string
216
+ size: string
217
+ retailers: { target: RetailerSizeResult; walmart: RetailerSizeResult; spirithalloween: RetailerSizeResult }
218
+ warnings: string[]
219
+ }
220
+ type CallOptions = {
221
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
222
+ // A provider slower than this is DROPPED from the results and
223
+ // NAMED in warnings — never silently absent
224
+ }
225
+
226
+ /**
227
+ * Given a costume character and a size, fans out to Target, Walmart, and Spirit Halloween and
228
+ * reports whether each retailer has that exact character-and-size combination in stock right
229
+ * now — the per-size question a plain product search can't answer, because Target and Walmart
230
+ * bake size into a free-text title and Spirit Halloween only exposes its full size matrix on
231
+ * the product page.
232
+ */
233
+ interface Unit {
234
+ /**
235
+ * Checks whether one costume character exists in one size, right now, at Target, Walmart, and
236
+ * Spirit Halloween. `retailers.<name>.matched` is the listing that named both the character
237
+ * and the size, or null when that retailer answered and has none. `incomplete: true` means
238
+ * that retailer's own call never answered — a missed deadline or an error — so `matched: null`
239
+ * there is NOT a stockout; nothing was learned. Never throws on one or two retailers being
240
+ * unreachable — the surviving legs still answer and the dropped ones are named in `warnings`;
241
+ * throws only when all three failed.
242
+ */
243
+ checkSize(args: { character: string; size: string }): Promise<CostumeSizeCheck>;
244
+ }
245
+ }
246
+
200
247
  declare namespace BowmarkCapability_coworking {
201
248
  // ── Coworking space day passes — the unit's own declarations, verbatim ──
202
249
  type CoworkingDayPass = {
@@ -325,6 +372,46 @@ type CallOptions = {
325
372
  }
326
373
  }
327
374
 
375
+ declare namespace BowmarkCapability_delivery {
376
+ // ── Food-delivery fee comparison — the unit's own declarations, verbatim ──
377
+ type DeliveryFeeQuote = {
378
+ app: string // which app quoted this, e.g. "doordash"
379
+ name: string
380
+ deliveryFee: number | null // the app's own advertised delivery fee, before a cart is built
381
+ url: string
382
+ rating: number | null
383
+ }
384
+ type CompareDeliveryFeesResult = {
385
+ query: string
386
+ quotes: DeliveryFeeQuote[] // every store any queried app returned
387
+ warnings: string[] // always present; empty when nothing was dropped
388
+ }
389
+
390
+ type CallOptions = {
391
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
392
+ // A provider slower than this is DROPPED from the results and
393
+ // NAMED in warnings — never silently absent
394
+ }
395
+
396
+ /**
397
+ * Runs a free-text restaurant search on DoorDash and returns each store's own advertised
398
+ * delivery fee, rating and ETA — the fee shown before a cart is built. Uber Eats is declared
399
+ * but not yet wired (its search stub isn't built); a full delivery+service+tax+tip checkout
400
+ * TOTAL needs a real cart and address and is separately not-yet-built on both apps.
401
+ */
402
+ interface Unit {
403
+ /**
404
+ * Runs a free-text search — `bowmark.delivery.compareDeliveryFees("pad thai austin tx")` —
405
+ * across the delivery apps this library covers (DoorDash today) and returns every matching
406
+ * store tagged with which app quoted it, that app's own advertised delivery fee, rating and
407
+ * listing URL. This is the fee shown on the app's OWN results card before a cart is built, not
408
+ * a full checkout total (delivery + service fee + tax + tip after a real cart and address) —
409
+ * see the capability blurb for what that needs.
410
+ */
411
+ compareDeliveryFees(query: string | { query: string; limit?: number }, options?: CallOptions): Promise<CompareDeliveryFeesResult>;
412
+ }
413
+ }
414
+
328
415
  declare namespace BowmarkCapability_developer_api_key_signup {
329
416
  // ── Developer API key signup — the unit's own declarations, verbatim ──
330
417
  interface DeveloperApiKeySignupDetails {
@@ -1258,6 +1345,87 @@ type CallOptions = {
1258
1345
  }
1259
1346
  }
1260
1347
 
1348
+ declare namespace BowmarkCapability_local_database_gui {
1349
+ // ── Browse a local database GUI's tables — the unit's own declarations, verbatim ──
1350
+ interface DbGuiTable {
1351
+ name: string | null // a <caption>, the nearest preceding heading, or an
1352
+ // aria-label/data-testid naming it — null if nothing does
1353
+ columns: string[] // "col_1", "col_2", … when the table has no header row
1354
+ rows: Record<string, string>[]
1355
+ rowCount: number // the real count, even when rows[] was cut
1356
+ truncated: boolean
1357
+ }
1358
+ interface DbGuiBrowseOptions {
1359
+ maxTables?: number // default 25
1360
+ maxRowsPerTable?: number // default 200
1361
+ }
1362
+ interface DbGuiBrowseResult {
1363
+ tables: DbGuiTable[]
1364
+ navLinks: string[] // candidate table/collection names from a sidebar-shaped nav
1365
+ warnings: string[]
1366
+ }
1367
+
1368
+ /**
1369
+ * Turns the HTML of a local database GUI (Adminer, phpMyAdmin, pgAdmin, Drizzle Studio,
1370
+ * mongo-express, or anything similar running on the caller's own localhost) into typed tables
1371
+ * and a candidate table list — Bowmark cannot navigate a caller-private address itself, so
1372
+ * this takes the page the caller's own agent already has and structures it. Read-only; nothing
1373
+ * here can submit or modify a row.
1374
+ */
1375
+ interface Unit {
1376
+ /**
1377
+ * Parses the HTML of a local database GUI page (e.g. the caller's own agent read it off
1378
+ * http://localhost:<port> — Bowmark cannot reach that address itself) and returns every
1379
+ * <table> on the page as structured rows keyed by column name, plus a `navLinks` list of
1380
+ * candidate table/collection names pulled from a sidebar-shaped nav. `options.maxTables`
1381
+ * (default 25) and `options.maxRowsPerTable` (default 200) cap how much is kept; a cut table
1382
+ * reports its real `rowCount` and `truncated: true`. Never throws on odd markup — an empty or
1383
+ * table-less page comes back with `tables: []` and a warning rather than an error.
1384
+ */
1385
+ browse(html: string, options?: DbGuiBrowseOptions): Promise<DbGuiBrowseResult>;
1386
+ }
1387
+ }
1388
+
1389
+ declare namespace BowmarkCapability_local_html_preview {
1390
+ // ── Preview local HTML (structure, text, links, forms — read-only) — the unit's own declarations, verbatim ──
1391
+
1392
+ interface PreviewHeading { level: number; text: string }
1393
+ interface PreviewLink { text: string; href: string | null }
1394
+ interface PreviewImage { src: string | null; alt: string | null }
1395
+ interface PreviewForm { action: string | null; method: string; fieldCount: number }
1396
+
1397
+ interface PreviewOptions {
1398
+ maxChars?: number // default 20000; over it, text is cut + truncated:true
1399
+ }
1400
+
1401
+ interface HtmlPreviewResult {
1402
+ title: string | null
1403
+ text: string // visible text, block structure kept as blank lines
1404
+ chars: number
1405
+ truncated: boolean
1406
+ headings: PreviewHeading[]
1407
+ links: PreviewLink[]
1408
+ images: PreviewImage[]
1409
+ forms: PreviewForm[] // inventory only — nothing here submits a form
1410
+ wordCount: number
1411
+ warnings: string[]
1412
+ }
1413
+
1414
+ /**
1415
+ * Render an HTML file or fragment the caller already has and get back its title, text,
1416
+ * headings, links, images and forms — no network, no browser, nothing executed or submitted.
1417
+ */
1418
+ interface Unit {
1419
+ /**
1420
+ * Parses supplied HTML (a local file's contents, or a fragment) and returns a structured
1421
+ * preview: title, readable text, headings, links, images and a read-only form inventory. Never
1422
+ * executes scripts, never fetches anything, never submits a form — it only reads the markup
1423
+ * you already have.
1424
+ */
1425
+ render(html: string, options?: PreviewOptions): Promise<HtmlPreviewResult>;
1426
+ }
1427
+ }
1428
+
1261
1429
  declare namespace BowmarkCapability_mcp_registry {
1262
1430
  // ── MCP Registry — the unit's own declarations, verbatim ──
1263
1431
  interface McpRegistryEntry {
@@ -1741,6 +1909,49 @@ type CallOptions = {
1741
1909
  }
1742
1910
  }
1743
1911
 
1912
+ declare namespace BowmarkCapability_retail {
1913
+ // ── Retail (general merchandise, multi-store) — the unit's own declarations, verbatim ──
1914
+ type RetailOffer = {
1915
+ store: "walmart" | "target" | "bestbuy" // where this offer is from
1916
+ title: string // the product as the store lists it
1917
+ price: number | null // USD; null if unpriced
1918
+ wasPrice: number | null // the pre-markdown price, when the store publishes one
1919
+ url: string | null // product page
1920
+ inStock: boolean // this store's OWN in-stock signal — not comparable
1921
+ // across stores as one normalized fact
1922
+ }
1923
+ type RetailSearchResult = {
1924
+ results: RetailOffer[] // ONE query across ALL stores, price-sorted (cheapest first)
1925
+ warnings: string[] // always present; names any store that did not answer. A
1926
+ // store named here priced NOTHING, so read this before
1927
+ // concluding a store has no stock or a worse price
1928
+ }
1929
+
1930
+ type CallOptions = {
1931
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
1932
+ // A provider slower than this is DROPPED from the results and
1933
+ // NAMED in warnings — never silently absent
1934
+ }
1935
+
1936
+ /**
1937
+ * General-merchandise retail across Walmart, Target and Best Buy — one keyword search, fanned
1938
+ * out in parallel and returned price-sorted, so an agent can answer 'where can I actually buy
1939
+ * this and what does it cost' without querying each store by hand. Best Buy's leg needs the
1940
+ * caller's own Best Buy developer key; without one the search still returns Walmart + Target
1941
+ * with a `warnings` entry naming the drop.
1942
+ */
1943
+ interface Unit {
1944
+ /**
1945
+ * Searches Walmart, Target and Best Buy in parallel for a keyword and returns one price-sorted
1946
+ * list of offers across all stores, each tagged with which store it's from. `warnings` names
1947
+ * any store that did not answer — including Best Buy when the caller holds no Best Buy
1948
+ * developer key — so a caller can tell a genuinely cheaper/only offer from one where a store
1949
+ * simply didn't answer.
1950
+ */
1951
+ search(args: { query: string }): Promise<RetailSearchResult>;
1952
+ }
1953
+ }
1954
+
1744
1955
  declare namespace BowmarkCapability_school_shopping_basket {
1745
1956
  // ── Price a school-supply list across Target and Walmart — the unit's own declarations, verbatim ──
1746
1957
  interface BasketItemMatch {
@@ -1750,9 +1961,13 @@ interface BasketItemMatch {
1750
1961
  price: { amount: number; currency: string } // integer minor units
1751
1962
  }
1752
1963
  interface RetailerBasket {
1753
- total: { amount: number; currency: string } | null
1964
+ total: { amount: number; currency: string } | null // sums matched only — a partial
1965
+ // sum whenever incomplete is
1966
+ // non-empty
1754
1967
  matched: BasketItemMatch[]
1755
- unavailable: string[]
1968
+ unavailable: string[] // this retailer ANSWERED and has no in-stock priced match
1969
+ incomplete: string[] // this retailer's search never answered — NOT out of stock,
1970
+ // nothing was learned; retry with fewer items or more time
1756
1971
  }
1757
1972
  interface SchoolShoppingBasket {
1758
1973
  retailers: { target: RetailerBasket; walmart: RetailerBasket }
@@ -1771,10 +1986,15 @@ type CallOptions = {
1771
1986
  */
1772
1987
  interface Unit {
1773
1988
  /**
1774
- * Prices a multi-item shopping list at Target and Walmart, one basket total per retailer,
1775
- * naming which items had no in-stock match anywhere. Never throws on one retailer being
1776
- * unreachable that retailer's basket is dropped and named in `warnings` instead; throws only
1777
- * when BOTH retailers failed on every item.
1989
+ * Prices a multi-item shopping list at Target and Walmart, one basket total per retailer. An
1990
+ * item the retailer answered about and does not stock is in `unavailable`; an item whose
1991
+ * search never answered is in `incomplete` and is NOT a stockout nothing was learned about
1992
+ * it, and the retailer's total is then a partial sum. Every incomplete item is also named in
1993
+ * `warnings`. Never throws on one retailer being unreachable — that retailer's basket is
1994
+ * dropped and named in `warnings` instead; throws only when BOTH retailers failed on every
1995
+ * item. Walmart drives a real browser per item and every item is searched at once, so a long
1996
+ * list is what costs time: price fewer items per call before reaching for a larger
1997
+ * `timeoutMs`.
1778
1998
  */
1779
1999
  priceList(args: { items: string[] }): Promise<SchoolShoppingBasket>;
1780
2000
  }
@@ -3141,6 +3361,51 @@ interface AppleTradeInEstimate {
3141
3361
  }
3142
3362
  }
3143
3363
 
3364
+ declare namespace BowmarkProvider_aquaphoenixsci {
3365
+ // ── AquaPhoenix Scientific — the unit's own declarations, verbatim ──
3366
+ // aquaphoenixsci's OWN shapes — not a capability contract.
3367
+
3368
+ interface AquaphoenixsciListing {
3369
+ sku: string;
3370
+ name: string;
3371
+ path: string; // pass to getProduct()
3372
+ price: number | null; // dollars, or null when gated behind a business account
3373
+ requiresBusinessAccount: boolean;
3374
+ }
3375
+
3376
+ interface AquaphoenixsciProduct {
3377
+ sku: string;
3378
+ name: string;
3379
+ path: string;
3380
+ price: number | null; // dollars, or null when gated behind a business account
3381
+ requiresBusinessAccount: boolean;
3382
+ inStock: boolean;
3383
+ checkoutUrl: string; // the real product page — add-to-cart / checkout entry point
3384
+ }
3385
+
3386
+ /**
3387
+ * AquaPhoenix Scientific's real catalog storefront (water/chemical testing and feed-control
3388
+ * equipment) — browse a category for real SKUs and prices, and read one product's real price,
3389
+ * stock status and add-to-cart/checkout URL.
3390
+ */
3391
+ interface Unit {
3392
+ /**
3393
+ * Lists real products in one of AquaPhoenix's catalog categories, e.g.
3394
+ * "testing-supplies/test-kits" or "feed-and-control-equipment/pumps-accessories" — real SKU,
3395
+ * name, product path, and either a real anonymous price or a note that the SKU requires a
3396
+ * business account. THROWS naming the closed set of real category paths on an unknown one.
3397
+ */
3398
+ browseCategory(category: string): Promise<AquaphoenixsciListing[]>;
3399
+
3400
+ /**
3401
+ * Reads one product's real detail page — SKU, name, price (when anonymously priced), stock
3402
+ * status, and the real product URL to hand to the shopper as the add-to-cart / checkout entry
3403
+ * point. THROWS naming browseCategory() as the way to find a real path on an unknown one.
3404
+ */
3405
+ getProduct(path: string): Promise<AquaphoenixsciProduct>;
3406
+ }
3407
+ }
3408
+
3144
3409
  declare namespace BowmarkProvider_archipelago {
3145
3410
  // ── Archipelago — the unit's own declarations, verbatim ──
3146
3411
  interface ArchipelagoAsset {
@@ -3799,6 +4064,44 @@ interface AzureListServicesResult {
3799
4064
  }
3800
4065
  }
3801
4066
 
4067
+ declare namespace BowmarkProvider_bankmycell {
4068
+ // ── BankMyCell — the unit's own declarations, verbatim ──
4069
+ interface BankmycellOffer {
4070
+ merchant: string;
4071
+ price: number;
4072
+ paymentOptions: string;
4073
+ shippingOptions: { id: string; name: string }[];
4074
+ pricelockTimescale: string | null;
4075
+ paymentTimescale: string | null;
4076
+ checkoutLink: string;
4077
+ reviewsRating: number | null;
4078
+ reviewsCount: number | null;
4079
+ }
4080
+ interface BankmycellQuoteResult {
4081
+ deviceUrl: string;
4082
+ selections: { capacity: string | null; condition: string | null; carrier: string | null; lockedStatus: string | null };
4083
+ offers: BankmycellOffer[];
4084
+ unavailableMerchants: string[];
4085
+ summary: { minPrice: number | null; maxPrice: number | null; avgPrice: number | null; count: number };
4086
+ }
4087
+
4088
+ /**
4089
+ * Live trade-in offers for a phone/device from every merchant BankMyCell compares, for a
4090
+ * chosen capacity/condition/carrier — read off the same pricing endpoint the site's own sell
4091
+ * page polls, instead of parsing prose off the rendered page.
4092
+ */
4093
+ interface Unit {
4094
+ /**
4095
+ * Reads live trade-in offers for the device at a bankmycell.com sell page (e.g.
4096
+ * .../sell/iphone-14-pro), from every merchant the site compares, for the given
4097
+ * capacity/condition/carrier/lockedStatus (each matched against that device's own option
4098
+ * labels, e.g. condition: "Flawless"). Any selection left out uses the page's own default
4099
+ * option for that attribute. THROWS if a selection names an option this device does not offer.
4100
+ */
4101
+ getTradeInQuote(deviceUrl: string, selections?: { capacity?: string; condition?: string; carrier?: string; lockedStatus?: string }): Promise<BankmycellQuoteResult>;
4102
+ }
4103
+ }
4104
+
3802
4105
  declare namespace BowmarkProvider_barletta {
3803
4106
  // ── Barletta Boats — the unit's own declarations, verbatim ──
3804
4107
  // Barletta's OWN shapes — not a capability contract.
@@ -6236,6 +6539,43 @@ interface ClasspassSearchResult {
6236
6539
  }
6237
6540
  }
6238
6541
 
6542
+ declare namespace BowmarkProvider_claudemarketplaces_com {
6543
+ // ── Claude Marketplaces — the unit's own declarations, verbatim ──
6544
+ interface claudeMarketplacesListing {
6545
+ url: string;
6546
+ kind: string;
6547
+ publisher: string;
6548
+ slug: string;
6549
+ name: string;
6550
+ description: string;
6551
+ applicationCategory: string | null;
6552
+ operatingSystem: string | null;
6553
+ codeRepository: string | null;
6554
+ featureList: string[];
6555
+ price: string | null;
6556
+ priceCurrency: string | null;
6557
+ }
6558
+
6559
+ /**
6560
+ * A directory of Claude plugin/MCP/skill marketplace listings — fetch one listing's structured
6561
+ * fields (name, description, category, repo, declared tools, price) instead of parsing its
6562
+ * page by hand.
6563
+ */
6564
+ interface Unit {
6565
+ /**
6566
+ * Fetches one MCP server listing page from claudemarketplaces.com — `url` is the listing's
6567
+ * full URL or path, e.g. "https://claudemarketplaces.com/mcp/metroxe/bowmark" or
6568
+ * "/mcp/github/github-mcp-server". Returns the listing's structured fields straight off the
6569
+ * page's own schema.org `SoftwareApplication` record: `name`, `description`,
6570
+ * `applicationCategory`, `operatingSystem`, `codeRepository`, `featureList` (the tool/feature
6571
+ * names the listing declares), and `price`/`priceCurrency`. `publisher`, `kind` and `slug` are
6572
+ * read off the URL path. Only `mcp`-kind listings (`/mcp/<publisher>/<slug>`) are implemented
6573
+ * — `getListing` throws `ClaudeMarketplacesInputError` for any other path shape.
6574
+ */
6575
+ getListing(url: string): Promise<claudeMarketplacesListing>;
6576
+ }
6577
+ }
6578
+
6239
6579
  declare namespace BowmarkProvider_cleanairlawncare {
6240
6580
  // ── Clean Air Lawn Care — the unit's own declarations, verbatim ──
6241
6581
  interface CleanAirEstimateAvailability {
@@ -6426,17 +6766,35 @@ interface ClubchampionFittingsMenu {
6426
6766
  activePromoTerms: string | null;
6427
6767
  }
6428
6768
 
6429
- interface ClubchampionAvailability {
6769
+ interface ClubchampionFitter {
6770
+ id: string; // the id checkAvailability takes
6771
+ name: string;
6772
+ locationId: string;
6773
+ locationName: string; // the studio name listStudios() and getFittings() use
6774
+ timezone: string;
6775
+ handedness: string[];
6776
+ specialties: string[];
6777
+ locationBayCount: number;
6778
+ }
6779
+
6780
+ interface ClubchampionSlot {
6781
+ start: string; // ISO instant, e.g. "2026-09-08T10:00:00.000Z"
6782
+ end: string;
6783
+ status: string; // the site's own word, e.g. "available"
6430
6784
  resourceId: string;
6785
+ }
6786
+
6787
+ interface ClubchampionAvailability {
6788
+ resourceId: string; // the fitter id, echoed back
6431
6789
  range: { start: string; end: string };
6432
- mode: string; // the site's own live/cached indicator
6433
- slots: unknown[]; // the site's own slot list, verbatim — empty is a real answer
6790
+ mode: string; // the site's own live/cached indicator
6791
+ slots: ClubchampionSlot[]; // verbatim — empty is a real answer
6434
6792
  }
6435
6793
 
6436
6794
  /**
6437
- * Club Champion's live studio directory, real per-store fitting pricing, and real open-slot
6438
- * availability checks — the same booking widget backend the site itself calls. Rung 10, no
6439
- * browser.
6795
+ * Club Champion's live studio directory, its fitters, real per-store fitting pricing, and real
6796
+ * open-slot availability on a named fitter's calendar — the same booking widget backend the
6797
+ * site itself calls. Rung 10, no browser.
6440
6798
  */
6441
6799
  interface Unit {
6442
6800
  /**
@@ -6453,12 +6811,22 @@ interface ClubchampionAvailability {
6453
6811
  getFittings(storeName: string): Promise<ClubchampionFittingsMenu>;
6454
6812
 
6455
6813
  /**
6456
- * Checks real, live open-slot availability for one fitting product (a `productId` from
6457
- * getFittings()) over a "YYYY-MM-DD"..."YYYY-MM-DD" date range the same live check the
6458
- * site's own booking widget makes. An empty `slots` array is the site's real answer, not an
6814
+ * Reads the live list of every Club Champion fitter (~396 across the chain) — the person a
6815
+ * fitting is booked with, and the only id checkAvailability accepts. Pass a studio name from
6816
+ * listStudios(), e.g. "Bellevue", to get just that studio's fitters.
6817
+ */
6818
+ listFitters(storeName?: string): Promise<ClubchampionFitter[]>;
6819
+
6820
+ /**
6821
+ * Checks real, live open-slot availability on one FITTER's calendar (an `id` from
6822
+ * listFitters()) over a "YYYY-MM-DD"..."YYYY-MM-DD" range — the same live check the site's own
6823
+ * booking widget makes. A fitting `productId` from getFittings() is a DIFFERENT id space and
6824
+ * the site answers it with an empty list, so pass a fitter id. Optional `durationMinutes` and
6825
+ * `fittingType` mirror what the widget sends. An empty `slots` array is the site's real answer
6826
+ * — a closed day, a booked-out fitter, or a date past the ~60-day booking horizon — not an
6459
6827
  * error.
6460
6828
  */
6461
- checkAvailability(resourceId: string, start: string, end: string): Promise<ClubchampionAvailability>;
6829
+ checkAvailability(fitterId: string, start: string, end: string, durationMinutes?: number, fittingType?: string): Promise<ClubchampionAvailability>;
6462
6830
  }
6463
6831
  }
6464
6832
 
@@ -6658,6 +7026,41 @@ interface CultureFlyCheckoutLink {
6658
7026
  }
6659
7027
  }
6660
7028
 
7029
+ declare namespace BowmarkProvider_curiocity {
7030
+ // ── Curiocity — the unit's own declarations, verbatim ──
7031
+ interface CuriocityEvent {
7032
+ title: string; // "Slayyyter – WOR$T GIRL IN THE WORLD TOUR"
7033
+ url: string; // click-through — the event's own link, or the article's
7034
+ when: string | null; // "Thursday, Sept. 3, 2026" — free text, as curiocity writes it
7035
+ time: string | null; // "7 p.m."
7036
+ where: string | null; // "868 Granville St."
7037
+ cost: string | null; // "$650+"
7038
+ articleTitle: string; // the roundup (or single-event) post this came from
7039
+ articleUrl: string;
7040
+ publishedAt: string | null; // the article's own pubDate
7041
+ }
7042
+
7043
+ interface CuriocityListEventsQuery {
7044
+ city: string; // curiocity's own city slug, e.g. "vancouver", "toronto"
7045
+ }
7046
+
7047
+ /**
7048
+ * Curiocity's own city 'things to do' feeds, parsed into individual events — title, when,
7049
+ * time, where, cost and a click-through link — instead of the raw RSS/HTML a caller would
7050
+ * otherwise have to regex apart.
7051
+ */
7052
+ interface Unit {
7053
+ /**
7054
+ * Reads curiocity.com's own 'things to do' feed for one city and returns individual events —
7055
+ * title, when, time, where, cost and a click-through link — parsed out of the site's roundup
7056
+ * posts instead of the raw RSS. `city` is curiocity's own slug (e.g. "vancouver", "toronto").
7057
+ * An empty array is the feed's own answer for a city curiocity does not cover, never invented
7058
+ * here — a block page or a moved endpoint THROWS instead.
7059
+ */
7060
+ listEvents(query: CuriocityListEventsQuery): Promise<CuriocityEvent[]>;
7061
+ }
7062
+ }
7063
+
6661
7064
  declare namespace BowmarkProvider_cyberpowerpc {
6662
7065
  // ── CyberPowerPC — the unit's own declarations, verbatim ──
6663
7066
  interface CyberpowerpcConfigurator {
@@ -7566,6 +7969,34 @@ interface DisneyTicketPrice {
7566
7969
  }
7567
7970
  }
7568
7971
 
7972
+ declare namespace BowmarkProvider_doordash {
7973
+ // ── DoorDash — the unit's own declarations, verbatim ──
7974
+ interface DoordashSearchArgs {
7975
+ query: string; // free text, e.g. "pad thai austin tx" — DoorDash resolves location itself
7976
+ limit?: number; // default 10, clamped to [1, 30]
7977
+ }
7978
+
7979
+ interface DoordashSearchResult {
7980
+ name: string;
7981
+ url: string;
7982
+ deliveryFee: number | null; // DoorDash's own advertised delivery fee, in dollars
7983
+ rating: number | null;
7984
+ etaMinutes: number | null;
7985
+ }
7986
+
7987
+ /**
7988
+ * DoorDash's own store search — returns real, currently-listed stores for a free-text query
7989
+ * with the delivery fee, rating and ETA DoorDash itself advertises on the results card.
7990
+ */
7991
+ interface Unit {
7992
+ /**
7993
+ * Runs DoorDash's own store search for a free-text query and returns real, currently-listed
7994
+ * stores with DoorDash's own advertised delivery fee, rating and ETA. Read-only.
7995
+ */
7996
+ search(args: DoordashSearchArgs): Promise<DoordashSearchResult[]>;
7997
+ }
7998
+ }
7999
+
7569
8000
  declare namespace BowmarkProvider_ebay {
7570
8001
  // ── eBay — the unit's own declarations, verbatim ──
7571
8002
  interface ebayItem {
@@ -7816,6 +8247,34 @@ interface ErieAgent {
7816
8247
  }
7817
8248
  }
7818
8249
 
8250
+ declare namespace BowmarkProvider_etsy {
8251
+ // ── Etsy — the unit's own declarations, verbatim ──
8252
+ interface etsyListing {
8253
+ listingId: number;
8254
+ title: string;
8255
+ price: number | null;
8256
+ currencyCode: string | null;
8257
+ quantity: number | null;
8258
+ tags: string[];
8259
+ url: string;
8260
+ }
8261
+
8262
+ /**
8263
+ * Etsy's own documented Open API v3 (openapi.etsy.com) — searches active listings on etsy.com
8264
+ * by keyword and returns id, title, price, currency, quantity, tags and the listing's own
8265
+ * etsy.com URL, without scraping etsy.com's search page (which sits behind DataDome).
8266
+ */
8267
+ interface Unit {
8268
+ /**
8269
+ * Searches Etsy's live catalog of active listings by keyword, via Etsy's documented Open API
8270
+ * v3, and returns the matching listings — id, title, price, currency, quantity available, tags
8271
+ * and the listing's own etsy.com URL. `limit` caps the row count (default 10, Etsy's own
8272
+ * ceiling 100). Requires an Etsy developer API key — see this provider's `auth`.
8273
+ */
8274
+ search(args: string | { query: string; limit?: number }): Promise<etsyListing[]>;
8275
+ }
8276
+ }
8277
+
7819
8278
  declare namespace BowmarkProvider_eventsource {
7820
8279
  // ── Event Source — the unit's own declarations, verbatim ──
7821
8280
  interface EventSourceDesign {
@@ -9616,6 +10075,78 @@ interface GlassesusaProduct {
9616
10075
  }
9617
10076
  }
9618
10077
 
10078
+ declare namespace BowmarkProvider_goloadup {
10079
+ // ── LoadUp — the unit's own declarations, verbatim ──
10080
+ // LoadUp's OWN shapes — not a capability contract.
10081
+
10082
+ interface GoloadupItemType {
10083
+ id: string; // the key getQuote's items take
10084
+ name: string;
10085
+ category: string | null; // e.g. "COUCH", "MATTRESS"
10086
+ aliases: string[]; // alternate names the site matches this item on
10087
+ pickupAllowed: boolean;
10088
+ pickupPrice: number | null; // national base price — getQuote is the real, ZIP-priced number
10089
+ assemblyAllowed: boolean;
10090
+ assemblyPrice: number | null;
10091
+ disassemblyAllowed: boolean;
10092
+ disassemblyPrice: number | null;
10093
+ }
10094
+
10095
+ interface GoloadupQuoteItem { itemId: string; quantity: number }
10096
+
10097
+ interface GoloadupQuote {
10098
+ validServiceArea: boolean; // false = ZIP is outside LoadUp's service area, other fields are placeholders
10099
+ validZip: boolean; // false = ZIP itself is not recognized
10100
+ basePrice: number; // the area/trip fee added on top of the items
10101
+ total: number; // the guaranteed total for exactly these items at this ZIP
10102
+ totalFormatted: string; // "$124.00"
10103
+ taxAmount: number;
10104
+ minimumPrice: number; // the floor LoadUp charges regardless of what's selected
10105
+ minimumPriceApplied: boolean;
10106
+ sameDayAllowed: boolean;
10107
+ bookingUrl: string; // hand the shopper here to finish scheduling
10108
+ }
10109
+
10110
+ interface GoloadupServiceAvailability {
10111
+ validZip: boolean;
10112
+ inService: boolean;
10113
+ sameDayAllowed: boolean;
10114
+ estimationAllowed: boolean;
10115
+ retailAssembliesAllowed: boolean;
10116
+ }
10117
+
10118
+ /**
10119
+ * LoadUp's own item-selector and live pricing engine for junk removal, donation and furniture
10120
+ * pickup — the current catalog of items with base prices, a real ZIP-specific guaranteed quote
10121
+ * for an exact set of items, and whether/how a ZIP is served, all off the same GraphQL API the
10122
+ * site's own booking widget calls.
10123
+ */
10124
+ interface Unit {
10125
+ /**
10126
+ * Returns LoadUp's full current catalog of pickupable items (couches, mattresses, appliances,
10127
+ * and 400+ more), each with its category, alternate names, and national base
10128
+ * pickup/assembly/disassembly prices. The `id` on each row is what getQuote's items take —
10129
+ * this is the entry point every quote starts from.
10130
+ */
10131
+ getPricingCatalog(): Promise<GoloadupItemType[]>;
10132
+
10133
+ /**
10134
+ * Prices an EXACT set of items (e.g. [{ itemId: "7412", quantity: 1 }] for one Couch/Loveseat)
10135
+ * at a real ZIP code against LoadUp's live pricing engine — the same call its own booking
10136
+ * widget makes. Returns the guaranteed total, whether the ZIP falls under the site's
10137
+ * minimum-price floor, and same-day availability. `validServiceArea: false` means the ZIP is
10138
+ * real but outside LoadUp's coverage, not an error — check it before reading `total`.
10139
+ */
10140
+ getQuote(zip: string, items: GoloadupQuoteItem[]): Promise<GoloadupQuote>;
10141
+
10142
+ /**
10143
+ * Checks whether and how LoadUp serves one ZIP code, independent of any specific items — in
10144
+ * service, same-day pickup allowed, and whether retail assembly is offered there.
10145
+ */
10146
+ checkServiceAvailability(zip: string): Promise<GoloadupServiceAvailability>;
10147
+ }
10148
+ }
10149
+
9619
10150
  declare namespace BowmarkProvider_goodway {
9620
10151
  // ── Goodway Technologies — the unit's own declarations, verbatim ──
9621
10152
  interface GoodwayProductSummary {
@@ -11370,6 +11901,69 @@ interface HobieLocalAvailability {
11370
11901
  }
11371
11902
  }
11372
11903
 
11904
+ declare namespace BowmarkProvider_hodjapasha {
11905
+ // ── Hodjapasha Culture Center — Istanbul whirling-dervish and dance show ticketing — the unit's own declarations, verbatim ──
11906
+ interface HodjapashaListingEntry {
11907
+ productId: string;
11908
+ title: string;
11909
+ summary: string | null;
11910
+ duration: string | null;
11911
+ priceFrom: string | null; // the site's own "from" price, e.g. "$42.22"
11912
+ currency: string | null;
11913
+ url: string;
11914
+ }
11915
+ interface HodjapashaShowDetail {
11916
+ productId: string;
11917
+ title: string;
11918
+ description: string | null; // the site's own description paragraphs, joined
11919
+ duration: string | null;
11920
+ location: string | null;
11921
+ productCode: string | null;
11922
+ priceFrom: string | null;
11923
+ currency: string | null;
11924
+ url: string;
11925
+ }
11926
+ interface HodjapashaSession {
11927
+ sessionId: string;
11928
+ label: string; // e.g. "20:30 - Available"
11929
+ }
11930
+ interface HodjapashaAvailability {
11931
+ productId: string;
11932
+ date: string; // YYYY-MM-DD, as queried
11933
+ available: boolean;
11934
+ sessions: HodjapashaSession[];
11935
+ totalPrice: string | null; // e.g. "1900"
11936
+ currency: string | null;
11937
+ }
11938
+
11939
+ /**
11940
+ * The Hodjapasha Culture Center's own Rezdy booking widget for its whirling-dervish (Sema) and
11941
+ * Ottoman/folk dance shows in Istanbul — show list, per-show pricing and description, and
11942
+ * date/party-size availability with session times and total price, read straight off the
11943
+ * widget's own pages.
11944
+ */
11945
+ interface Unit {
11946
+ /**
11947
+ * Reads every show hodjapasha.com's own booking widget lists off /widget/index.php — title,
11948
+ * productId, from-price, duration.
11949
+ */
11950
+ listShows(): Promise<HodjapashaListingEntry[]>;
11951
+
11952
+ /**
11953
+ * Reads one show's full description, adult/child pricing, location and duration off its own
11954
+ * /widget/product-detail.php page.
11955
+ */
11956
+ getShow(productId: string): Promise<HodjapashaShowDetail>;
11957
+
11958
+ /**
11959
+ * Checks the widget's own availability endpoint for a show, YYYY-MM-DD date and party size
11960
+ * (defaults: 1 adult, 0 children), returning the session time(s) offered and the total price,
11961
+ * or `available: false` for a date the show does not run.
11962
+ */
11963
+ getAvailability(productId: string, date: string, opts?: { adults?: number; children?: number }): Promise<HodjapashaAvailability>;
11964
+ }
11965
+ }
11966
+
11373
11967
  declare namespace BowmarkProvider_holidaybuilders {
11374
11968
  // ── Holiday Builders — the unit's own declarations, verbatim ──
11375
11969
  // Holiday Builders' OWN shapes — not a capability contract.
@@ -11745,6 +12339,22 @@ interface IdentitygroupMountOptionResult {
11745
12339
  }
11746
12340
  }
11747
12341
 
12342
+ declare namespace BowmarkProvider_ihg {
12343
+ // ── IHG Hotels & Resorts — the unit's own declarations, verbatim ──
12344
+ interface ihgRow { id: string; brandCode: string; availabilityStatus: string; lowestCashOnlyCost: { baseAmount: string; ratePlanType: string | null } | null; highestCashOnlyCost: { baseAmount: string; ratePlanType: string | null } | null; propertyCurrency: string | null; distance: number | null; distanceKm: number | null; }
12345
+
12346
+ /** IHG live hotel availability search across its brand portfolio. */
12347
+ interface Unit {
12348
+ /**
12349
+ * Searches IHG's live cash availability for a destination and increasing ISO
12350
+ * check-in/check-out dates. Returns IHG's hotel mnemonic, brand code, availability status,
12351
+ * cash-price range, currency and distance; IHG's availability endpoint does not include
12352
+ * display names.
12353
+ */
12354
+ search(args: { destination: string; checkIn: string; checkOut: string; adults?: number; rooms?: number; radius?: number }): Promise<ihgRow[]>;
12355
+ }
12356
+ }
12357
+
11748
12358
  declare namespace BowmarkProvider_instagram {
11749
12359
  // ── Instagram — the unit's own declarations, verbatim ──
11750
12360
  interface InstagramProfile {
@@ -13433,6 +14043,24 @@ interface KayakCar {
13433
14043
  }
13434
14044
  }
13435
14045
 
14046
+ declare namespace BowmarkProvider_keepa {
14047
+ // ── Keepa — the unit's own declarations, verbatim ──
14048
+ interface KeepaProductResult { product: KeepaProduct; tokensLeft: number | null; tokensConsumed: number | null; refillRate: number | null; }
14049
+ interface KeepaProduct { asin: string; domainId: number; title: string; csv?: unknown[]; stats?: Record<string, unknown>; }
14050
+
14051
+ /**
14052
+ * Keepa's documented Amazon product API — reads a product's native price history and metadata
14053
+ * by ASIN. Requires a caller-provided Keepa API key.
14054
+ */
14055
+ interface Unit {
14056
+ /**
14057
+ * Reads Keepa's native Amazon product record and compact price-history series for one ASIN.
14058
+ * Requires a caller-provided Keepa API key.
14059
+ */
14060
+ getProduct(args: { asin: string; domain?: number; stats?: number }): Promise<KeepaProductResult>;
14061
+ }
14062
+ }
14063
+
13436
14064
  declare namespace BowmarkProvider_kingsdown {
13437
14065
  // ── Kingsdown — the unit's own declarations, verbatim ──
13438
14066
  interface kingsdownBedmatchResult {
@@ -16115,6 +16743,58 @@ interface StoreShelfRoster {
16115
16743
  }
16116
16744
  }
16117
16745
 
16746
+ declare namespace BowmarkProvider_millisaraylar {
16747
+ // ── millisaraylar.gov.tr — Türkiye Presidential Administration of National Palaces — the unit's own declarations, verbatim ──
16748
+ interface MillisaraylarPalace {
16749
+ id: string;
16750
+ name: string;
16751
+ url: string;
16752
+ }
16753
+ interface MillisaraylarVisitingHours {
16754
+ name: string;
16755
+ closedDays: string | null; // the site's own text, e.g. "Tuesday"
16756
+ ticketOfficeOpeningTime: string | null; // "HH:MM"
16757
+ ticketOfficeClosingTime: string | null; // "HH:MM"
16758
+ url: string;
16759
+ }
16760
+ interface MillisaraylarTicketPrices {
16761
+ name: string;
16762
+ currency: "TRY";
16763
+ domestic: number | null;
16764
+ domesticStudent: number | null;
16765
+ foreign: number | null;
16766
+ url: string;
16767
+ }
16768
+
16769
+ /**
16770
+ * Türkiye's Presidential Administration of National Palaces — the palace/kiosk/pavilion list,
16771
+ * closed days and ticket-office hours, and domestic/domestic-student/foreign ticket prices for
16772
+ * Topkapi Palace, Dolmabahçe Palace, Yıldız Palace, Beylerbeyi Palace and the other sites it
16773
+ * administers, read straight off the site's own ticket-purchase and detail pages.
16774
+ */
16775
+ interface Unit {
16776
+ /**
16777
+ * Reads the full palace/kiosk/pavilion/museum/factory list off millisaraylar.gov.tr's own site
16778
+ * navigation.
16779
+ */
16780
+ getPalaces(): Promise<MillisaraylarPalace[]>;
16781
+
16782
+ /**
16783
+ * Matches `query` against `getPalaces()`'s own listing (a substring match on the site's own
16784
+ * display name, e.g. "Topkapi" or "Dolmabahce") and reads that site's closed day(s) and
16785
+ * ticket-office opening/closing hours off its detail page.
16786
+ */
16787
+ getVisitingHours(query: string): Promise<MillisaraylarVisitingHours>;
16788
+
16789
+ /**
16790
+ * Matches `query` against millisaraylar.gov.tr's own ticket-purchase location list (a narrower
16791
+ * set than `getPalaces` — only what is sold as a standalone ticket) and reads the domestic,
16792
+ * domestic-student and foreign prices (TRY) the site itself quotes.
16793
+ */
16794
+ getTicketPrices(query: string): Promise<MillisaraylarTicketPrices>;
16795
+ }
16796
+ }
16797
+
16118
16798
  declare namespace BowmarkProvider_minimax {
16119
16799
  // ── MiniMax — the unit's own declarations, verbatim ──
16120
16800
  interface MinimaxDocIndexEntry {
@@ -16606,6 +17286,43 @@ interface MuzeVisitingHours {
16606
17286
  }
16607
17287
  }
16608
17288
 
17289
+ declare namespace BowmarkProvider_myollie {
17290
+ // ── Ollie — the unit's own declarations, verbatim ──
17291
+ interface OllieMealPlanOption {
17292
+ planType: string;
17293
+ planTypeName: string;
17294
+ startingPricePerWeek: number;
17295
+ availableCadences: number[];
17296
+ defaultCadence: number;
17297
+ }
17298
+
17299
+ interface GetMealPlanResult {
17300
+ weightLbs: number;
17301
+ activityLevel: "Low" | "Moderate" | "High";
17302
+ plans: OllieMealPlanOption[];
17303
+ checkoutUrl: string;
17304
+ }
17305
+
17306
+ /**
17307
+ * Fresh dog food subscription. getMealPlan is live — the same
17308
+ * weight/activity/neuter-status-driven meal plan and REAL per-plan weekly price the site's own
17309
+ * onboarding quiz computes, given a dog's weight, activity level and neuter status. Returns
17310
+ * all four plan tiers (Fresh, Baked, Mixed, Half Fresh) with this dog's own computed starting
17311
+ * price, plus a checkout link that carries the answers forward.
17312
+ */
17313
+ interface Unit {
17314
+ /**
17315
+ * Computes Ollie's personalized fresh-food meal plan and REAL weekly price for a dog, given
17316
+ * `weightLbs` (number, e.g. 45), `activityLevel` ("Low"|"Moderate"|"High"), `isNeutered`
17317
+ * (boolean) and optional `gender` ("Male"|"Female"). Returns all four plan tiers (Fresh,
17318
+ * Baked, Mixed, Half Fresh) each with this dog's own computed `startingPricePerWeek` — not a
17319
+ * marketing-page range — plus a `checkoutUrl` that carries the answers into the site's own
17320
+ * checkout. Recovered from the onboarding quiz's own API, not guessed at.
17321
+ */
17322
+ getMealPlan(args: object): Promise<GetMealPlanResult>;
17323
+ }
17324
+ }
17325
+
16609
17326
  declare namespace BowmarkProvider_naic {
16610
17327
  // ── NAIC — the unit's own declarations, verbatim ──
16611
17328
  interface naicCompanyQuery {
@@ -17105,6 +17822,43 @@ interface StoreStock {
17105
17822
  }
17106
17823
  }
17107
17824
 
17825
+ declare namespace BowmarkProvider_nutrafol {
17826
+ // ── Nutrafol — the unit's own declarations, verbatim ──
17827
+ interface RootCause {
17828
+ category: "Stress" | "Metabolism" | "Nutrition" | "Lifestyle" | "Hormone" | "Aging";
17829
+ severity: string; // the site's own label, e.g. "NEEDS SUPPORT", "MODERATE", "NORMAL"
17830
+ description: string | null;
17831
+ signs: string[];
17832
+ }
17833
+ interface HairWellnessAssessment {
17834
+ rootCauses: RootCause[];
17835
+ }
17836
+ interface QuizOverview {
17837
+ description: string;
17838
+ rootCauseCategories: string[];
17839
+ }
17840
+
17841
+ /**
17842
+ * Nutrafol's own Hair Wellness Quiz — assessHairWellness runs the real root-cause assessment
17843
+ * and returns its own computed per-category severities (Stress, Metabolism, Nutrition,
17844
+ * Lifestyle, Hormone, Aging), the personalized output the site's marketing pages only
17845
+ * describe.
17846
+ */
17847
+ interface Unit {
17848
+ /**
17849
+ * Runs Nutrafol's own Hair Wellness Quiz along its default answer path and returns the site's
17850
+ * real computed root-cause severities. Read-only — never adds to cart or checks out.
17851
+ */
17852
+ assessHairWellness(): Promise<HairWellnessAssessment>;
17853
+
17854
+ /**
17855
+ * Reads the Hair Wellness Quiz's own static intro page — its real description and the six
17856
+ * root-cause categories it screens for — with a plain browserless fetch.
17857
+ */
17858
+ getQuizOverview(): Promise<QuizOverview>;
17859
+ }
17860
+ }
17861
+
17108
17862
  declare namespace BowmarkProvider_nvisioncenters {
17109
17863
  // ── NVISION Eye Centers — the unit's own declarations, verbatim ──
17110
17864
  // NVISION's OWN shapes — not a capability contract.
@@ -17257,6 +18011,69 @@ interface OliverwineryShippingAvailability {
17257
18011
  }
17258
18012
  }
17259
18013
 
18014
+ declare namespace BowmarkProvider_othership {
18015
+ // ── Othership — the unit's own declarations, verbatim ──
18016
+ // Othership's OWN shapes — not a capability contract.
18017
+
18018
+ interface OthershipLocation {
18019
+ id: string; // the key getClassSchedule's locationId takes
18020
+ name: string; // e.g. "Adelaide", "Flatiron", "Williamsburg"
18021
+ city: string;
18022
+ stateProvince: string;
18023
+ formattedAddress: string;
18024
+ timezone: string;
18025
+ currencyCode: string;
18026
+ regionName: string | null; // e.g. "Toronto", "NYC"
18027
+ }
18028
+
18029
+ interface OthershipClass {
18030
+ id: string;
18031
+ name: string; // e.g. "Guided Up: Arctic Tundra - 60 min"
18032
+ description: string;
18033
+ durationMinutes: number;
18034
+ classroomName: string;
18035
+ instructorNames: string[];
18036
+ tags: string[]; // e.g. ["Guided", "Sun Pass"]
18037
+ startDateTime: string; // ISO 8601 with the location's own UTC offset
18038
+ bookingStartDateTime: string;
18039
+ availableSpotCount: number; // real, live — 0 means fully booked, not "not offered"
18040
+ capacity: number;
18041
+ spotCountIsPublic: boolean;
18042
+ isCancelled: boolean;
18043
+ }
18044
+
18045
+ interface OthershipClassSchedule {
18046
+ classes: OthershipClass[];
18047
+ totalCount: number; // may exceed classes.length if the range was too broad — see warnings
18048
+ scheduleUrl: string; // hand the visitor here to finish booking
18049
+ warnings: string[];
18050
+ }
18051
+
18052
+ /**
18053
+ * Othership's real, live class schedule and seat availability across its Toronto and NYC
18054
+ * sauna/ice-bath/breathwork studios — the same data its Mariana Tek booking widget shows, read
18055
+ * directly rather than through a JS embed nothing outside a real browser can render.
18056
+ */
18057
+ interface Unit {
18058
+ /**
18059
+ * Returns every Othership studio location (Toronto's Adelaide and Yorkville, NYC's Flatiron
18060
+ * and Williamsburg) with its site id, city, address and timezone. The `id` on each row is what
18061
+ * getClassSchedule's locationId takes — this is the entry point every schedule search starts
18062
+ * from.
18063
+ */
18064
+ getLocations(): Promise<OthershipLocation[]>;
18065
+
18066
+ /**
18067
+ * Searches one Othership location's real, live class schedule between two YYYY-MM-DD dates —
18068
+ * sauna, ice bath and breathwork sessions with instructor names, duration, tags and the actual
18069
+ * seats left right now, off the same Mariana Tek API the site's own booking widget calls.
18070
+ * `availableSpotCount: 0` means fully booked, not unavailable; `scheduleUrl` is where to send
18071
+ * someone to finish booking.
18072
+ */
18073
+ getClassSchedule(locationId: string, startDate: string, endDate: string): Promise<OthershipClassSchedule>;
18074
+ }
18075
+ }
18076
+
17260
18077
  declare namespace BowmarkProvider_otto {
17261
18078
  // ── OTTO — the unit's own declarations, verbatim ──
17262
18079
  interface ottoProduct {
@@ -20749,6 +21566,62 @@ interface ScPlaylist {
20749
21566
  }
20750
21567
  }
20751
21568
 
21569
+ declare namespace BowmarkProvider_spirithalloween {
21570
+ // ── Spirit Halloween — the unit's own declarations, verbatim ──
21571
+ interface SpiritHalloweenSearchResult {
21572
+ productId: string
21573
+ sku: string
21574
+ name: string
21575
+ url: string
21576
+ image: string | null
21577
+ price: number | null
21578
+ currency: "USD"
21579
+ listedSize: string | null // the ONE size this listing row is indexed under
21580
+ listedSizeStock: number | null // that size's stock only — not the full range
21581
+ }
21582
+ interface SpiritHalloweenSearchResults {
21583
+ query: string
21584
+ category: string
21585
+ results: SpiritHalloweenSearchResult[]
21586
+ totalMatches: number | null
21587
+ }
21588
+ interface SpiritHalloweenSizeVariant {
21589
+ color: string
21590
+ size: string // the site's own size label, e.g. "CHILD MEDIUM"
21591
+ price: number
21592
+ inStock: boolean
21593
+ shipStockQuantity: number
21594
+ variantId: string
21595
+ }
21596
+ interface SpiritHalloweenProduct {
21597
+ productId: string
21598
+ name: string
21599
+ url: string
21600
+ sizes: SpiritHalloweenSizeVariant[] // every real color/size combination, each with its own live stock
21601
+ }
21602
+
21603
+ /**
21604
+ * The licensed Halloween costume specialist — category browse and per-size, per-color live
21605
+ * stock for the lines it carries (today: KPop Demon Hunters).
21606
+ */
21607
+ interface Unit {
21608
+ /**
21609
+ * Browses Spirit Halloween's category listing for a query resolved against a small internal
21610
+ * directory of mapped categories (today: "KPop Demon Hunters" and its characters — rumi, mira,
21611
+ * zoey, saja) — NOT a general free-text site search, which was probed 2026-09-01 and does not
21612
+ * render results server-side. Each result row carries only its OWN listed size's stock; call
21613
+ * getProduct for the full per-size breakdown.
21614
+ */
21615
+ search(args: { query: string; limit?: number }): Promise<SpiritHalloweenSearchResults>;
21616
+
21617
+ /**
21618
+ * Reads one product page's full live size/color matrix — every real variant this product sells
21619
+ * in, each with its own price and in-stock signal — for a product URL returned by search.
21620
+ */
21621
+ getProduct(args: { url: string }): Promise<SpiritHalloweenProduct>;
21622
+ }
21623
+ }
21624
+
20752
21625
  declare namespace BowmarkProvider_starlighthomes {
20753
21626
  // ── Starlight Homes — the unit's own declarations, verbatim ──
20754
21627
  // Starlight Homes' OWN shapes — not a capability contract.
@@ -21307,7 +22180,7 @@ interface SunHomeSaunasQuizOption {
21307
22180
  interface SunHomeSaunasQuizQuestion {
21308
22181
  id: string; // pass back as answers[].questionId
21309
22182
  title: string;
21310
- type: string; // the site's own node type, e.g. "SIMPLE_MULTI"
22183
+ type: string; // the site's own Digioh question type, e.g. "DIGIOH_PRQ"
21311
22184
  options: SunHomeSaunasQuizOption[]; // option.id -> answers[].optionIds
21312
22185
  }
21313
22186
 
@@ -21315,8 +22188,8 @@ interface SunHomeSaunasMatch {
21315
22188
  handle: string; // the key addSaunaToCart takes
21316
22189
  title: string;
21317
22190
  price: number; // dollars — real live Shopify price
21318
- matchScore: number; // e.g. 5
21319
- matchOutOf: number; // e.g. 5 -> the site's own "5/5 match"
22191
+ matchScore: number; // selected answers that positively weighted this product
22192
+ matchOutOf: number; // submitted answer selections
21320
22193
  }
21321
22194
 
21322
22195
  interface SunHomeSaunasCartResult {
@@ -21330,30 +22203,29 @@ interface SunHomeSaunasCartResult {
21330
22203
  }
21331
22204
 
21332
22205
  /**
21333
- * Sun Home Saunas' real Perfect Product Finder quiz — the site's own 5-question buyer quiz,
21334
- * its real server-computed ranked product matches with live prices, and a real Shopify cart
21335
- * write for the winning match — no login, no dealer routing.
22206
+ * Sun Home Saunas' live Digioh buyer quiz — its current questions, published product-ranking
22207
+ * rules, real Shopify prices, and a real cart write for a recommended product — no login or
22208
+ * dealer routing.
21336
22209
  */
21337
22210
  interface Unit {
21338
22211
  /**
21339
- * Reads Sun Home Saunas' real, live Perfect Product Finder quiz straight off its quiz vendor's
21340
- * own API the current 5 questions and every real option, with the real ids
22212
+ * Reads Sun Home Saunas' real, live Digioh buyer quiz from its published breakpoint
22213
+ * configurationevery current question and answer button, with the ids
21341
22214
  * getPersonalizedSaunaMatches() needs to answer them.
21342
22215
  */
21343
22216
  getSaunaFinderQuestions(): Promise<SunHomeSaunasQuizQuestion[]>;
21344
22217
 
21345
22218
  /**
21346
- * Submits real answers (from getSaunaFinderQuestions()) through the same quiz session flow the
21347
- * site's own UI uses, and returns the site's own SERVER-COMPUTED ranked product matches with
21348
- * real live prices and a real match score the exact personalized result a real buyer would
21349
- * see, never a guess from general knowledge.
22219
+ * Applies real answers (from getSaunaFinderQuestions()) to the live Digioh `prq_keywords`
22220
+ * rules the site's quiz publishes, then returns the site's own weighted ranking with real
22221
+ * current Shopify prices — never a general-knowledge guess.
21350
22222
  */
21351
22223
  getPersonalizedSaunaMatches(answers: {questionId: string, optionIds: string[]}[]): Promise<SunHomeSaunasMatch[]>;
21352
22224
 
21353
22225
  /**
21354
- * Adds one real matched sauna (a handle from getPersonalizedSaunaMatches()) to a real Shopify
21355
- * cart at Sun Home Saunas' own real live price, and reads the cart back to confirm the write
21356
- * landed. THROWS if the product is currently out of stock.
22226
+ * Adds one real matched product (a handle from getPersonalizedSaunaMatches()) to a real
22227
+ * Shopify cart at Sun Home Saunas' own real live price, and reads the cart back to confirm the
22228
+ * write landed. THROWS if the product is currently out of stock.
21357
22229
  */
21358
22230
  addSaunaToCart(handle: string, quantity?: number): Promise<SunHomeSaunasCartResult>;
21359
22231
  }
@@ -21783,7 +22655,7 @@ interface TherabodyRecommendation {
21783
22655
 
21784
22656
  /**
21785
22657
  * Filters the live catalogue by what a shopper actually needs — device family, audience, and
21786
- * the features named (percussion, recovery, hot/cold, breath). Returns the matching products
22658
+ * the features named (percussive, recovery, massage, vibration). Returns the matching products
21787
22659
  * with their real prices, ranked by in-stock first. The storefront does not publish a query or
21788
22660
  * filter endpoint, so the function is local filtering on the catalogue listTheragunProducts
21789
22661
  * already returns — the divide is what the function does with the data, not how it gets there.
@@ -22534,6 +23406,54 @@ interface TitlenineBraSizeResult {
22534
23406
  }
22535
23407
  }
22536
23408
 
23409
+ declare namespace BowmarkProvider_tmobile {
23410
+ // ── T-Mobile — the unit's own declarations, verbatim ──
23411
+ interface TmobileSku {
23412
+ id: string;
23413
+ listPriceUsd: number;
23414
+ monthlyPaymentUsd: number | null;
23415
+ contractTermMonths: number | null;
23416
+ }
23417
+ interface TmobileTradeInCredit {
23418
+ deviceLabel: string;
23419
+ creditUsd: number;
23420
+ }
23421
+ interface TmobilePromotion {
23422
+ promoId: string;
23423
+ displayName: string;
23424
+ headlineCreditUsd: number;
23425
+ tradeInCredits: TmobileTradeInCredit[];
23426
+ }
23427
+ interface TmobileTradeInMatch {
23428
+ model: string;
23429
+ promoId: string;
23430
+ promoDisplayName: string;
23431
+ creditUsd: number;
23432
+ }
23433
+ interface TmobileUpgradeOffer {
23434
+ devicePath: string;
23435
+ sourceUrl: string;
23436
+ sku: TmobileSku;
23437
+ promotions: TmobilePromotion[];
23438
+ tradeInMatch: TmobileTradeInMatch | null;
23439
+ }
23440
+
23441
+ /**
23442
+ * t-mobile.com's own device-page pricing call — real list price, real monthly financing, and
23443
+ * the site's own per-trade-in-device credit tiers, read through a real browser session (the
23444
+ * site signs every pricing request).
23445
+ */
23446
+ interface Unit {
23447
+ /**
23448
+ * Reads one t-mobile.com device page's own pricing call (list price, monthly financing, and
23449
+ * every applicable promotion's per-trade-in-device credit tier) and, when `tradeInModel` is
23450
+ * given, resolves the BEST matching credit across all of them — e.g. "iPhone 13" against a
23451
+ * page carrying tiers like "Save $830: iPhone 13".
23452
+ */
23453
+ getUpgradeOffer(arg: { devicePath: string; tradeInModel?: string }): Promise<TmobileUpgradeOffer>;
23454
+ }
23455
+ }
23456
+
22537
23457
  declare namespace BowmarkProvider_topviewtix {
22538
23458
  // ── TopView Sightseeing — the unit's own declarations, verbatim ──
22539
23459
  interface topviewtixPackageDetails {
@@ -23629,6 +24549,7 @@ interface walmartSearchResult {
23629
24549
  price: number | null;
23630
24550
  wasPrice: number | null;
23631
24551
  priceRangeMin: number | null;
24552
+ conditionCode: number | null;
23632
24553
  inStock: boolean;
23633
24554
  rating: number | null;
23634
24555
  reviewCount: number;
@@ -23924,6 +24845,36 @@ interface XpressWaitTime {
23924
24845
  }
23925
24846
  }
23926
24847
 
24848
+ declare namespace BowmarkProvider_yelp {
24849
+ // ── Yelp — the unit's own declarations, verbatim ──
24850
+ interface YelpSearchArgs {
24851
+ term: string; // e.g. "ramen" — Yelp's own find_desc
24852
+ location: string; // e.g. "Philadelphia, PA" — Yelp's own find_loc
24853
+ limit?: number; // default 10, clamped to [1, 30]
24854
+ }
24855
+
24856
+ interface YelpSearchResult {
24857
+ name: string;
24858
+ url: string;
24859
+ rating: number | null;
24860
+ reviewCount: number | null;
24861
+ priceRange: string | null; // "$".."$$$$", or null
24862
+ neighborhood: string | null;
24863
+ }
24864
+
24865
+ /**
24866
+ * Yelp's own business search — returns real, currently-listed businesses for a search term and
24867
+ * location with Yelp's own star rating, review count, price tier and neighborhood.
24868
+ */
24869
+ interface Unit {
24870
+ /**
24871
+ * Runs Yelp's own business search for a term and location and returns real, currently-listed
24872
+ * businesses with Yelp's own rating, review count, price tier and neighborhood. Read-only.
24873
+ */
24874
+ search(args: YelpSearchArgs): Promise<YelpSearchResult[]>;
24875
+ }
24876
+ }
24877
+
23927
24878
  declare namespace BowmarkProvider_yorkwallcoverings {
23928
24879
  // ── York Wallcoverings — the unit's own declarations, verbatim ──
23929
24880
  interface YorkWallcoveringsSearchResult {
@@ -24940,6 +25891,7 @@ interface BowmarkProviders {
24940
25891
  ancientnutrition: BowmarkProvider_ancientnutrition.Unit;
24941
25892
  andersenwindows: BowmarkProvider_andersenwindows.Unit;
24942
25893
  apple: BowmarkProvider_apple.Unit;
25894
+ aquaphoenixsci: BowmarkProvider_aquaphoenixsci.Unit;
24943
25895
  archipelago: BowmarkProvider_archipelago.Unit;
24944
25896
  ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
24945
25897
  asppoolco: BowmarkProvider_asppoolco.Unit;
@@ -24950,6 +25902,7 @@ interface BowmarkProviders {
24950
25902
  avis: BowmarkProvider_avis.Unit;
24951
25903
  azazie: BowmarkProvider_azazie.Unit;
24952
25904
  azure: BowmarkProvider_azure.Unit;
25905
+ bankmycell: BowmarkProvider_bankmycell.Unit;
24953
25906
  barletta: BowmarkProvider_barletta.Unit;
24954
25907
  baublebar: BowmarkProvider_baublebar.Unit;
24955
25908
  bcparkscamping: BowmarkProvider_bcparkscamping.Unit;
@@ -24984,6 +25937,7 @@ interface BowmarkProviders {
24984
25937
  chriscraft: BowmarkProvider_chriscraft.Unit;
24985
25938
  classichome: BowmarkProvider_classichome.Unit;
24986
25939
  classpass: BowmarkProvider_classpass.Unit;
25940
+ claudemarketplaces_com: BowmarkProvider_claudemarketplaces_com.Unit;
24987
25941
  cleanairlawncare: BowmarkProvider_cleanairlawncare.Unit;
24988
25942
  cloudflare: BowmarkProvider_cloudflare.Unit;
24989
25943
  clubchampion: BowmarkProvider_clubchampion.Unit;
@@ -24991,6 +25945,7 @@ interface BowmarkProviders {
24991
25945
  couponfollow: BowmarkProvider_couponfollow.Unit;
24992
25946
  cruiselakegeneva: BowmarkProvider_cruiselakegeneva.Unit;
24993
25947
  culturefly: BowmarkProvider_culturefly.Unit;
25948
+ curiocity: BowmarkProvider_curiocity.Unit;
24994
25949
  cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
24995
25950
  davidsonhomes: BowmarkProvider_davidsonhomes.Unit;
24996
25951
  deangroup: BowmarkProvider_deangroup.Unit;
@@ -25001,11 +25956,13 @@ interface BowmarkProviders {
25001
25956
  dillards: BowmarkProvider_dillards.Unit;
25002
25957
  discounttire: BowmarkProvider_discounttire.Unit;
25003
25958
  disney: BowmarkProvider_disney.Unit;
25959
+ doordash: BowmarkProvider_doordash.Unit;
25004
25960
  ebay: BowmarkProvider_ebay.Unit;
25005
25961
  elevenlabs: BowmarkProvider_elevenlabs.Unit;
25006
25962
  embroker: BowmarkProvider_embroker.Unit;
25007
25963
  eq3: BowmarkProvider_eq3.Unit;
25008
25964
  erieinsurance: BowmarkProvider_erieinsurance.Unit;
25965
+ etsy: BowmarkProvider_etsy.Unit;
25009
25966
  eventsource: BowmarkProvider_eventsource.Unit;
25010
25967
  evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
25011
25968
  executivehomecare: BowmarkProvider_executivehomecare.Unit;
@@ -25024,6 +25981,7 @@ interface BowmarkProviders {
25024
25981
  geico: BowmarkProvider_geico.Unit;
25025
25982
  github: BowmarkProvider_github.Unit;
25026
25983
  glassesusa: BowmarkProvider_glassesusa.Unit;
25984
+ goloadup: BowmarkProvider_goloadup.Unit;
25027
25985
  goodway: BowmarkProvider_goodway.Unit;
25028
25986
  google_flights: BowmarkProvider_google_flights.Unit;
25029
25987
  gotchacovered: BowmarkProvider_gotchacovered.Unit;
@@ -25042,10 +26000,12 @@ interface BowmarkProviders {
25042
26000
  hilton: BowmarkProvider_hilton.Unit;
25043
26001
  historymaker: BowmarkProvider_historymaker.Unit;
25044
26002
  hobie: BowmarkProvider_hobie.Unit;
26003
+ hodjapasha: BowmarkProvider_hodjapasha.Unit;
25045
26004
  holidaybuilders: BowmarkProvider_holidaybuilders.Unit;
25046
26005
  hunter: BowmarkProvider_hunter.Unit;
25047
26006
  ibuypower: BowmarkProvider_ibuypower.Unit;
25048
26007
  identitygroup: BowmarkProvider_identitygroup.Unit;
26008
+ ihg: BowmarkProvider_ihg.Unit;
25049
26009
  instagram: BowmarkProvider_instagram.Unit;
25050
26010
  insurify: BowmarkProvider_insurify.Unit;
25051
26011
  interiordefine: BowmarkProvider_interiordefine.Unit;
@@ -25060,6 +26020,7 @@ interface BowmarkProviders {
25060
26020
  justinwine: BowmarkProvider_justinwine.Unit;
25061
26021
  kaleidescape: BowmarkProvider_kaleidescape.Unit;
25062
26022
  kayak: BowmarkProvider_kayak.Unit;
26023
+ keepa: BowmarkProvider_keepa.Unit;
25063
26024
  kingsdown: BowmarkProvider_kingsdown.Unit;
25064
26025
  kitchentuneup: BowmarkProvider_kitchentuneup.Unit;
25065
26026
  kompan: BowmarkProvider_kompan.Unit;
@@ -25086,6 +26047,7 @@ interface BowmarkProviders {
25086
26047
  medicare: BowmarkProvider_medicare.Unit;
25087
26048
  mergify: BowmarkProvider_mergify.Unit;
25088
26049
  microcenter: BowmarkProvider_microcenter.Unit;
26050
+ millisaraylar: BowmarkProvider_millisaraylar.Unit;
25089
26051
  minimax: BowmarkProvider_minimax.Unit;
25090
26052
  minted: BowmarkProvider_minted.Unit;
25091
26053
  mixbook: BowmarkProvider_mixbook.Unit;
@@ -25093,14 +26055,17 @@ interface BowmarkProviders {
25093
26055
  momondo: BowmarkProvider_momondo.Unit;
25094
26056
  mossyoak: BowmarkProvider_mossyoak.Unit;
25095
26057
  muze_gov_tr: BowmarkProvider_muze_gov_tr.Unit;
26058
+ myollie: BowmarkProvider_myollie.Unit;
25096
26059
  naic: BowmarkProvider_naic.Unit;
25097
26060
  namecheap: BowmarkProvider_namecheap.Unit;
25098
26061
  nationalbusinessfurniture: BowmarkProvider_nationalbusinessfurniture.Unit;
25099
26062
  newageproducts: BowmarkProvider_newageproducts.Unit;
25100
26063
  newegg: BowmarkProvider_newegg.Unit;
26064
+ nutrafol: BowmarkProvider_nutrafol.Unit;
25101
26065
  nvisioncenters: BowmarkProvider_nvisioncenters.Unit;
25102
26066
  oanda: BowmarkProvider_oanda.Unit;
25103
26067
  oliverwinery: BowmarkProvider_oliverwinery.Unit;
26068
+ othership: BowmarkProvider_othership.Unit;
25104
26069
  otto: BowmarkProvider_otto.Unit;
25105
26070
  outdoorresearch: BowmarkProvider_outdoorresearch.Unit;
25106
26071
  pacificabeauty: BowmarkProvider_pacificabeauty.Unit;
@@ -25142,6 +26107,7 @@ interface BowmarkProviders {
25142
26107
  smithery: BowmarkProvider_smithery.Unit;
25143
26108
  solostove: BowmarkProvider_solostove.Unit;
25144
26109
  soundcloud: BowmarkProvider_soundcloud.Unit;
26110
+ spirithalloween: BowmarkProvider_spirithalloween.Unit;
25145
26111
  starlighthomes: BowmarkProvider_starlighthomes.Unit;
25146
26112
  statefarm: BowmarkProvider_statefarm.Unit;
25147
26113
  stickergiant: BowmarkProvider_stickergiant.Unit;
@@ -25160,6 +26126,7 @@ interface BowmarkProviders {
25160
26126
  thibautdesign: BowmarkProvider_thibautdesign.Unit;
25161
26127
  tilsonhomes: BowmarkProvider_tilsonhomes.Unit;
25162
26128
  titlenine: BowmarkProvider_titlenine.Unit;
26129
+ tmobile: BowmarkProvider_tmobile.Unit;
25163
26130
  topviewtix: BowmarkProvider_topviewtix.Unit;
25164
26131
  travelinsured: BowmarkProvider_travelinsured.Unit;
25165
26132
  trawickinternational: BowmarkProvider_trawickinternational.Unit;
@@ -25181,6 +26148,7 @@ interface BowmarkProviders {
25181
26148
  wellfound: BowmarkProvider_wellfound.Unit;
25182
26149
  winestyles: BowmarkProvider_winestyles.Unit;
25183
26150
  xpresswellnessurgentcare: BowmarkProvider_xpresswellnessurgentcare.Unit;
26151
+ yelp: BowmarkProvider_yelp.Unit;
25184
26152
  yorkwallcoverings: BowmarkProvider_yorkwallcoverings.Unit;
25185
26153
  yourarborhome: BowmarkProvider_yourarborhome.Unit;
25186
26154
  youtube: BowmarkProvider_youtube.Unit;
@@ -76911,8 +77879,10 @@ interface BowmarkLibrary {
76911
77879
  bundles: BowmarkCapability_bundles.Unit;
76912
77880
  cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
76913
77881
  cars: BowmarkCapability_cars.Unit;
77882
+ costume_size_check: BowmarkCapability_costume_size_check.Unit;
76914
77883
  coworking: BowmarkCapability_coworking.Unit;
76915
77884
  custom_sofa_configurator: BowmarkCapability_custom_sofa_configurator.Unit;
77885
+ delivery: BowmarkCapability_delivery.Unit;
76916
77886
  developer_api_key_signup: BowmarkCapability_developer_api_key_signup.Unit;
76917
77887
  domain: BowmarkCapability_domain.Unit;
76918
77888
  email: BowmarkCapability_email.Unit;
@@ -76924,6 +77894,8 @@ interface BowmarkLibrary {
76924
77894
  hvac: BowmarkCapability_hvac.Unit;
76925
77895
  insurance: BowmarkCapability_insurance.Unit;
76926
77896
  istanbul_schedules: BowmarkCapability_istanbul_schedules.Unit;
77897
+ local_database_gui: BowmarkCapability_local_database_gui.Unit;
77898
+ local_html_preview: BowmarkCapability_local_html_preview.Unit;
76927
77899
  mcp_registry: BowmarkCapability_mcp_registry.Unit;
76928
77900
  music: BowmarkCapability_music.Unit;
76929
77901
  pcparts: BowmarkCapability_pcparts.Unit;
@@ -76933,6 +77905,7 @@ interface BowmarkLibrary {
76933
77905
  promocodes: BowmarkCapability_promocodes.Unit;
76934
77906
  read: BowmarkCapability_read.Unit;
76935
77907
  restaurant_booking: BowmarkCapability_restaurant_booking.Unit;
77908
+ retail: BowmarkCapability_retail.Unit;
76936
77909
  school_shopping_basket: BowmarkCapability_school_shopping_basket.Unit;
76937
77910
  search: BowmarkCapability_search.Unit;
76938
77911
  sheds: BowmarkCapability_sheds.Unit;