@bowmark/web 1.12.2 → 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.
package/README.md CHANGED
@@ -18,9 +18,13 @@ lmstudio://add_mcp?name=bowmark&config=eyJ1cmwiOiJodHRwczovL2FwaS5ib3dtYXJrLmFpL
18
18
  > `bowmark-web` and `bowmark-web-stubs` on PyPI at the same version. The plan that built it
19
19
  > is deleted; the reasoning is in the four
20
20
  > [`docs/decisions/2026-08-06-*`](../../../docs/decisions/) records and the enforceable half
21
- > is [`.claude/rules/public-types.md`](../../../.claude/rules/public-types.md).
22
- > **What would make this doc wrong:** a build step appearing, the declarations moving out
23
- > into a second package, or a runtime dependency landing in `package.json`.
21
+ > is [`.claude/rules/public-types.md`](../../../.claude/rules/public-types.md). Since
22
+ > 2026-09-01 the TARBALL ships compiled `dist/`, not raw `src/` see
23
+ > [`docs/decisions/2026-09-01-the-published-npm-client-ships-compiled-js.md`](../../../docs/decisions/2026-09-01-the-published-npm-client-ships-compiled-js.md).
24
+ > **What would make THIS doc wrong:** the declarations moving out into a second package,
25
+ > a runtime dependency landing in `package.json`, or a build step reappearing where a
26
+ > CONSUMER or this MONOREPO has to run it — the one that ships is at publish time only,
27
+ > in the public mirror's own CI, and neither of those two ever sees it.
24
28
 
25
29
  ```sh
26
30
  npm i @bowmark/web
@@ -226,6 +230,35 @@ refuses one, with no exception set — an exception would be a declaration that
226
230
  parameter is uncallable. Found once, on `pizzahut.priceOrder`, by generating validators
227
231
  for all 253 typed parameters.
228
232
 
233
+ ## What ships is compiled, not `src/` verbatim
234
+
235
+ `main`/`types` point at `dist/index.{js,d.ts}`. `dist/` is never committed — it does not
236
+ exist in this workspace and does not exist in the public mirror's git history either — it
237
+ is produced once, in the mirror's own `publish.yml`, by `npm run build`
238
+ (`scripts/build.mjs`, `tsconfig.build.json`), immediately before `npm publish`. Nobody
239
+ runs it but that one CI job:
240
+
241
+ - **This workspace never does.** `pnpm typecheck` is `tsc -p tsconfig.json --noEmit` —
242
+ reads `src/` directly, emits nothing, unaffected.
243
+ - **A consumer never does.** `npm i @bowmark/web` installs the already-compiled `dist/`;
244
+ there is still no build step on their side, which is the property this package has
245
+ always promised.
246
+
247
+ Why compiled at all: Node refuses to strip types out of a `.ts` file found inside
248
+ `node_modules`, so shipping `main: src/index.ts` made plain `node app.mjs` fail with
249
+ `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING` for every consumer who was not already on
250
+ `tsx`, Bun, or a bundler.
251
+ [`docs/decisions/2026-09-01-the-published-npm-client-ships-compiled-js.md`](../../../docs/decisions/2026-09-01-the-published-npm-client-ships-compiled-js.md).
252
+
253
+ **One thing `tsc`'s declaration emit does not do on its own, and `build.mjs` does by
254
+ hand:** `src/generated/library.d.ts` is ambient (no imports, no exports — see below) and
255
+ `index.ts` reaches it only with `/// <reference path="./generated/library.d.ts" />`. tsc
256
+ consumes that directive for this package's own compile but does not carry it into the
257
+ emitted `dist/index.d.ts`. Left alone, a downstream `tsc` never loads `library.d.ts` at
258
+ all and `BowmarkLibrary` — the type this package exists to ship — reads as `Cannot find
259
+ name`. `build.mjs` re-inserts the reference line and copies `library.d.ts` into
260
+ `dist/generated/` verbatim (it has nothing to compile).
261
+
229
262
  ## Regenerating
230
263
 
231
264
  ```bash
@@ -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: 4367aae3846695ff98e8537819e01ea3e2b841043d73690123b839fb07c2a19a
9
- // 38 capabilities, 266 providers, 693 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 = {
@@ -1865,7 +1912,7 @@ type CallOptions = {
1865
1912
  declare namespace BowmarkCapability_retail {
1866
1913
  // ── Retail (general merchandise, multi-store) — the unit's own declarations, verbatim ──
1867
1914
  type RetailOffer = {
1868
- store: "walmart" | "target" // where this offer is from
1915
+ store: "walmart" | "target" | "bestbuy" // where this offer is from
1869
1916
  title: string // the product as the store lists it
1870
1917
  price: number | null // USD; null if unpriced
1871
1918
  wasPrice: number | null // the pre-markdown price, when the store publishes one
@@ -1887,16 +1934,19 @@ type CallOptions = {
1887
1934
  }
1888
1935
 
1889
1936
  /**
1890
- * General-merchandise retail across Walmart and Target — one keyword search, fanned out in
1891
- * parallel and returned price-sorted, so an agent can answer 'where can I actually buy this
1892
- * and what does it cost' without querying each store by hand.
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.
1893
1942
  */
1894
1943
  interface Unit {
1895
1944
  /**
1896
- * Searches Walmart and Target in parallel for a keyword and returns one price-sorted list of
1897
- * offers across both stores, each tagged with which store it's from. `warnings` names any
1898
- * store that did not answer, so a caller can tell a genuinely cheaper/only offer from one
1899
- * where a store simply timed out.
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.
1900
1950
  */
1901
1951
  search(args: { query: string }): Promise<RetailSearchResult>;
1902
1952
  }
@@ -4014,6 +4064,44 @@ interface AzureListServicesResult {
4014
4064
  }
4015
4065
  }
4016
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
+
4017
4105
  declare namespace BowmarkProvider_barletta {
4018
4106
  // ── Barletta Boats — the unit's own declarations, verbatim ──
4019
4107
  // Barletta's OWN shapes — not a capability contract.
@@ -6451,6 +6539,43 @@ interface ClasspassSearchResult {
6451
6539
  }
6452
6540
  }
6453
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
+
6454
6579
  declare namespace BowmarkProvider_cleanairlawncare {
6455
6580
  // ── Clean Air Lawn Care — the unit's own declarations, verbatim ──
6456
6581
  interface CleanAirEstimateAvailability {
@@ -6901,6 +7026,41 @@ interface CultureFlyCheckoutLink {
6901
7026
  }
6902
7027
  }
6903
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
+
6904
7064
  declare namespace BowmarkProvider_cyberpowerpc {
6905
7065
  // ── CyberPowerPC — the unit's own declarations, verbatim ──
6906
7066
  interface CyberpowerpcConfigurator {
@@ -8087,6 +8247,34 @@ interface ErieAgent {
8087
8247
  }
8088
8248
  }
8089
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
+
8090
8278
  declare namespace BowmarkProvider_eventsource {
8091
8279
  // ── Event Source — the unit's own declarations, verbatim ──
8092
8280
  interface EventSourceDesign {
@@ -11713,6 +11901,69 @@ interface HobieLocalAvailability {
11713
11901
  }
11714
11902
  }
11715
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
+
11716
11967
  declare namespace BowmarkProvider_holidaybuilders {
11717
11968
  // ── Holiday Builders — the unit's own declarations, verbatim ──
11718
11969
  // Holiday Builders' OWN shapes — not a capability contract.
@@ -16492,6 +16743,58 @@ interface StoreShelfRoster {
16492
16743
  }
16493
16744
  }
16494
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
+
16495
16798
  declare namespace BowmarkProvider_minimax {
16496
16799
  // ── MiniMax — the unit's own declarations, verbatim ──
16497
16800
  interface MinimaxDocIndexEntry {
@@ -21263,6 +21566,62 @@ interface ScPlaylist {
21263
21566
  }
21264
21567
  }
21265
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
+
21266
21625
  declare namespace BowmarkProvider_starlighthomes {
21267
21626
  // ── Starlight Homes — the unit's own declarations, verbatim ──
21268
21627
  // Starlight Homes' OWN shapes — not a capability contract.
@@ -22296,7 +22655,7 @@ interface TherabodyRecommendation {
22296
22655
 
22297
22656
  /**
22298
22657
  * Filters the live catalogue by what a shopper actually needs — device family, audience, and
22299
- * the features named (percussion, recovery, hot/cold, breath). Returns the matching products
22658
+ * the features named (percussive, recovery, massage, vibration). Returns the matching products
22300
22659
  * with their real prices, ranked by in-stock first. The storefront does not publish a query or
22301
22660
  * filter endpoint, so the function is local filtering on the catalogue listTheragunProducts
22302
22661
  * already returns — the divide is what the function does with the data, not how it gets there.
@@ -24486,6 +24845,36 @@ interface XpressWaitTime {
24486
24845
  }
24487
24846
  }
24488
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
+
24489
24878
  declare namespace BowmarkProvider_yorkwallcoverings {
24490
24879
  // ── York Wallcoverings — the unit's own declarations, verbatim ──
24491
24880
  interface YorkWallcoveringsSearchResult {
@@ -25513,6 +25902,7 @@ interface BowmarkProviders {
25513
25902
  avis: BowmarkProvider_avis.Unit;
25514
25903
  azazie: BowmarkProvider_azazie.Unit;
25515
25904
  azure: BowmarkProvider_azure.Unit;
25905
+ bankmycell: BowmarkProvider_bankmycell.Unit;
25516
25906
  barletta: BowmarkProvider_barletta.Unit;
25517
25907
  baublebar: BowmarkProvider_baublebar.Unit;
25518
25908
  bcparkscamping: BowmarkProvider_bcparkscamping.Unit;
@@ -25547,6 +25937,7 @@ interface BowmarkProviders {
25547
25937
  chriscraft: BowmarkProvider_chriscraft.Unit;
25548
25938
  classichome: BowmarkProvider_classichome.Unit;
25549
25939
  classpass: BowmarkProvider_classpass.Unit;
25940
+ claudemarketplaces_com: BowmarkProvider_claudemarketplaces_com.Unit;
25550
25941
  cleanairlawncare: BowmarkProvider_cleanairlawncare.Unit;
25551
25942
  cloudflare: BowmarkProvider_cloudflare.Unit;
25552
25943
  clubchampion: BowmarkProvider_clubchampion.Unit;
@@ -25554,6 +25945,7 @@ interface BowmarkProviders {
25554
25945
  couponfollow: BowmarkProvider_couponfollow.Unit;
25555
25946
  cruiselakegeneva: BowmarkProvider_cruiselakegeneva.Unit;
25556
25947
  culturefly: BowmarkProvider_culturefly.Unit;
25948
+ curiocity: BowmarkProvider_curiocity.Unit;
25557
25949
  cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
25558
25950
  davidsonhomes: BowmarkProvider_davidsonhomes.Unit;
25559
25951
  deangroup: BowmarkProvider_deangroup.Unit;
@@ -25570,6 +25962,7 @@ interface BowmarkProviders {
25570
25962
  embroker: BowmarkProvider_embroker.Unit;
25571
25963
  eq3: BowmarkProvider_eq3.Unit;
25572
25964
  erieinsurance: BowmarkProvider_erieinsurance.Unit;
25965
+ etsy: BowmarkProvider_etsy.Unit;
25573
25966
  eventsource: BowmarkProvider_eventsource.Unit;
25574
25967
  evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
25575
25968
  executivehomecare: BowmarkProvider_executivehomecare.Unit;
@@ -25607,6 +26000,7 @@ interface BowmarkProviders {
25607
26000
  hilton: BowmarkProvider_hilton.Unit;
25608
26001
  historymaker: BowmarkProvider_historymaker.Unit;
25609
26002
  hobie: BowmarkProvider_hobie.Unit;
26003
+ hodjapasha: BowmarkProvider_hodjapasha.Unit;
25610
26004
  holidaybuilders: BowmarkProvider_holidaybuilders.Unit;
25611
26005
  hunter: BowmarkProvider_hunter.Unit;
25612
26006
  ibuypower: BowmarkProvider_ibuypower.Unit;
@@ -25653,6 +26047,7 @@ interface BowmarkProviders {
25653
26047
  medicare: BowmarkProvider_medicare.Unit;
25654
26048
  mergify: BowmarkProvider_mergify.Unit;
25655
26049
  microcenter: BowmarkProvider_microcenter.Unit;
26050
+ millisaraylar: BowmarkProvider_millisaraylar.Unit;
25656
26051
  minimax: BowmarkProvider_minimax.Unit;
25657
26052
  minted: BowmarkProvider_minted.Unit;
25658
26053
  mixbook: BowmarkProvider_mixbook.Unit;
@@ -25712,6 +26107,7 @@ interface BowmarkProviders {
25712
26107
  smithery: BowmarkProvider_smithery.Unit;
25713
26108
  solostove: BowmarkProvider_solostove.Unit;
25714
26109
  soundcloud: BowmarkProvider_soundcloud.Unit;
26110
+ spirithalloween: BowmarkProvider_spirithalloween.Unit;
25715
26111
  starlighthomes: BowmarkProvider_starlighthomes.Unit;
25716
26112
  statefarm: BowmarkProvider_statefarm.Unit;
25717
26113
  stickergiant: BowmarkProvider_stickergiant.Unit;
@@ -25752,6 +26148,7 @@ interface BowmarkProviders {
25752
26148
  wellfound: BowmarkProvider_wellfound.Unit;
25753
26149
  winestyles: BowmarkProvider_winestyles.Unit;
25754
26150
  xpresswellnessurgentcare: BowmarkProvider_xpresswellnessurgentcare.Unit;
26151
+ yelp: BowmarkProvider_yelp.Unit;
25755
26152
  yorkwallcoverings: BowmarkProvider_yorkwallcoverings.Unit;
25756
26153
  yourarborhome: BowmarkProvider_yourarborhome.Unit;
25757
26154
  youtube: BowmarkProvider_youtube.Unit;
@@ -77482,6 +77879,7 @@ interface BowmarkLibrary {
77482
77879
  bundles: BowmarkCapability_bundles.Unit;
77483
77880
  cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
77484
77881
  cars: BowmarkCapability_cars.Unit;
77882
+ costume_size_check: BowmarkCapability_costume_size_check.Unit;
77485
77883
  coworking: BowmarkCapability_coworking.Unit;
77486
77884
  custom_sofa_configurator: BowmarkCapability_custom_sofa_configurator.Unit;
77487
77885
  delivery: BowmarkCapability_delivery.Unit;
@@ -0,0 +1,2 @@
1
+ import type { ValidatorTable } from "../validate.js";
2
+ export declare const VALIDATORS: ValidatorTable;