@bowmark/web 1.22.1 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,8 +5,8 @@
5
5
  // rather than imported. An `import` or `export` at the top level of this file would
6
6
  // turn it into a module and every declaration below would stop being global.
7
7
  //
8
- // Manifest version: d7a4e150ac8b92a335cf1f8c899427d12236d7556bd04d8e873ba0729e5a347b
9
- // 49 capabilities, 416 providers, 1090 typed functions, 20 refused.
8
+ // Manifest version: 33a70781b68188bc68feb315e91e0c61cb56ecb49e10d82f223e4feb9d6b3399
9
+ // 50 capabilities, 418 providers, 1121 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
@@ -155,6 +155,118 @@ type CallOptions = {
155
155
  }
156
156
  }
157
157
 
158
+ declare namespace BowmarkCapability_browser_agent {
159
+ // ── Browser agent — the unit's own declarations, verbatim ──
160
+ type BrowserAgentStatus = "running" | "needs_input" | "idle" | "failed" | "stopped" | "closed";
161
+ interface BrowserAgentQuestion {
162
+ kind: "question" | "takeover"; // takeover = a person must act in watchUrl (login, captcha)
163
+ question: string;
164
+ }
165
+ interface StartBrowserAgentOptions {
166
+ task: string; // plain language, name the site
167
+ backend?: string; // default "browser_use"
168
+ model?: string; // e.g. "claude-sonnet-5"; default "gpt-5.6-luna"
169
+ maxCostUsd?: number; // vendor spend ceiling per turn, default 2, max 25
170
+ proxyCountry?: string; // e.g. "us"
171
+ timeoutMs?: number;
172
+ }
173
+ interface StartBrowserAgentResult {
174
+ id: string; // keep this: status/send/stop take it
175
+ status: BrowserAgentStatus;
176
+ watchUrl: string; // private link to WATCH AND CONTROL the live browser — show it to your user only
177
+ backend: string;
178
+ model: string;
179
+ warnings: string[];
180
+ }
181
+ interface BrowserAgentStep { at: string; kind: "thinking" | "action" | "message"; text: string }
182
+ interface BrowserAgentStatusOptions {
183
+ cursor?: string; // from the previous status() — only newer steps return
184
+ waitMs?: number; // wait up to this long (max 60000) for the status to change
185
+ timeoutMs?: number;
186
+ }
187
+ interface BrowserAgentStatusResult {
188
+ id: string;
189
+ status: BrowserAgentStatus;
190
+ question: BrowserAgentQuestion | null; // set when status is "needs_input"
191
+ result: string | null; // the agent's answer for its last finished turn
192
+ error: string | null;
193
+ steps: BrowserAgentStep[];
194
+ cursor: string;
195
+ task: string;
196
+ backend: string;
197
+ model: string;
198
+ closed: boolean;
199
+ warnings: string[];
200
+ }
201
+ interface SendBrowserAgentOptions { interrupt?: boolean; timeoutMs?: number }
202
+ interface SendBrowserAgentResult { id: string; status: BrowserAgentStatus; warnings: string[] }
203
+ interface StopBrowserAgentResult { id: string; status: BrowserAgentStatus; warnings: string[] }
204
+ interface BrowserAgentSummary {
205
+ id: string; status: BrowserAgentStatus; task: string; backend: string; model: string;
206
+ question: BrowserAgentQuestion | null; createdAt: string; closedAt: string | null;
207
+ }
208
+ interface ListBrowserAgentsOptions { open?: boolean } // default true
209
+ interface ListBrowserAgentsResult { sessions: BrowserAgentSummary[]; warnings: string[] }
210
+ interface WatchLinkResult { id: string; watchUrl: string; warnings: string[] }
211
+
212
+ type CallOptions = {
213
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
214
+ // A provider slower than this is DROPPED from the results and
215
+ // NAMED in warnings — never silently absent
216
+ }
217
+
218
+ /**
219
+ * LAST RESORT, and it costs money: hands a plain-language task to a hosted AI browser agent
220
+ * (Browser Use) when no Bowmark function covers the site or a script against one failed.
221
+ * Returns a session id and a private link your user can open to watch and take over the live
222
+ * browser; later scripts poll it, answer its questions and stop it.
223
+ */
224
+ interface Unit {
225
+ /**
226
+ * Starts a hosted browser agent on `task` and returns at once with its session `id` and a
227
+ * `watchUrl`. Use ONLY after the library had nothing for this site or a function failed — each
228
+ * turn spends real vendor money, charged to the account. Show `watchUrl` to your user: it lets
229
+ * them watch the agent and take over the browser (log in, solve a captcha). Then poll with
230
+ * `status`.
231
+ */
232
+ start(options: StartBrowserAgentOptions): Promise<StartBrowserAgentResult>;
233
+
234
+ /**
235
+ * Reads a session: `running`, `needs_input` (relay `question` to your user, answer with
236
+ * `send`), `idle` (done — read `result`), `failed`, `stopped` or `closed`. Pass the previous
237
+ * `cursor` for only new steps, and `waitMs` (≤ 60000) to wait for a change instead of polling
238
+ * tightly.
239
+ */
240
+ status(id: string, options?: BrowserAgentStatusOptions): Promise<BrowserAgentStatusResult>;
241
+
242
+ /**
243
+ * Sends the agent a follow-up in the same browser: an answer to its question, the go-ahead
244
+ * after your user took over, or a new instruction. Runs when its current turn ends, or at once
245
+ * with `interrupt: true`. Each turn is billed.
246
+ */
247
+ send(id: string, message: string, options?: SendBrowserAgentOptions): Promise<SendBrowserAgentResult>;
248
+
249
+ /**
250
+ * Stops the agent and shuts its browser; the watch link stops working. Always stop a session
251
+ * you are done with — an open browser keeps costing money until Bowmark closes it after 20
252
+ * idle minutes.
253
+ */
254
+ stop(id: string): Promise<StopBrowserAgentResult>;
255
+
256
+ /**
257
+ * Lists this account's browser agent sessions, open ones by default — how to recover an id you
258
+ * lost.
259
+ */
260
+ list(options?: ListBrowserAgentsOptions): Promise<ListBrowserAgentsResult>;
261
+
262
+ /**
263
+ * Makes a NEW watch link for an open session, for when the one from `start` was lost. The
264
+ * previous link stops working.
265
+ */
266
+ watchLink(id: string): Promise<WatchLinkResult>;
267
+ }
268
+ }
269
+
158
270
  declare namespace BowmarkCapability_bundles {
159
271
  // ── Check whether a set of products can be built and bought right now — the unit's own declarations, verbatim ──
160
272
  interface BundleItemAvailability {
@@ -571,23 +683,19 @@ type CallOptions = {
571
683
  }
572
684
 
573
685
  /**
574
- * Actually RUNS a developer dashboard's signup flow and hands back a real, usable API key — no
575
- * email verification, no CAPTCHA, for the dashboards this covers. Today: Alpha Vantage's free
576
- * stock-data API. Call it directly; don't just describe the steps. If the caller gave no
577
- * organization/email of their own, invent a placeholder this is an instant, unverified
578
- * free-tier signup, not an account tied to a real identity, so there is nothing to ask
579
- * permission for. MAKE THE EMAIL UNIQUE PER CALL (see the worked example) — the dashboard
580
- * dedupes by address, so a copied literal example email gets "Redundant origin" on the second
581
- * and every later run.
686
+ * Actually RUNS a developer dashboard's signup flow and hands back a real, usable API key.
687
+ * Supports: Alpha Vantage (instant, no verification). Call it directly; don't just describe
688
+ * the steps. For Alpha Vantage with a placeholder identity: MAKE THE EMAIL UNIQUE PER CALL
689
+ * (see the worked example) the dashboard dedupes by address, so a copied literal example
690
+ * email gets "Redundant origin" on the second and every later run.
582
691
  */
583
692
  interface Unit {
584
693
  /**
585
694
  * Signs up for a real developer API key on a dashboard. `service` selects which dashboard:
586
- * "alphavantage" for stock data. Supported today: alphavantage THROWS naming the supported
587
- * list otherwise. Signs up instantly; `details.organization` and `details.email` required
588
- * (MAKE EMAIL UNIQUE PER CALL, e.g. `qa-${Date.now()}@example.com`, dashboard rejects
589
- * repeats). `details.occupation` optional. Returns real key plus confirmation.
590
- * `options.timeoutMs` sets call budget (default 30000).
695
+ * "alphavantage" for stock data. For alphavantage: `details.organization` and `details.email`
696
+ * required (MAKE EMAIL UNIQUE PER CALL, e.g. `qa-${Date.now()}@example.com`);
697
+ * `details.occupation` optional. Returns real key plus confirmation. `options.timeoutMs` sets
698
+ * call budget (default 30000).
591
699
  */
592
700
  signUp(service: string, details: object, options?: CallOptions): Promise<DeveloperApiKeySignupResult>;
593
701
  }
@@ -724,6 +832,27 @@ type CallOptions = {
724
832
 
725
833
  declare namespace BowmarkCapability_flights {
726
834
  // ── Flights — the unit's own declarations, verbatim ──
835
+ // ── "Which day is cheapest?" ── NOT a flights.* function: it is ONE provider call,
836
+ // bowmark.providers.google_flights.getPriceGraph(query: FlightQuery): Promise<PriceGraph>,
837
+ // typed here so no second lookup is needed. Only from/to/depart/return are read.
838
+ // The window is Google's own: about depart-7 days to depart+52 days, not selectable,
839
+ // so to cover a whole month from its 1st pass depart = the 8th.
840
+ type PricePoint = {
841
+ date: string // departure date, "2026-11-08"
842
+ returnDate: string | null // the return priced with it; null for one-way
843
+ price: number | null // cheapest total that day; null where none was priced
844
+ currency: string
845
+ }
846
+ type PriceGraph = {
847
+ from: string
848
+ to: string
849
+ tripType: "round trip" | "one way"
850
+ rangeStart: string // the window Google actually returned
851
+ rangeEnd: string
852
+ points: PricePoint[] // ascending by date
853
+ cheapest: PricePoint | null // ties go to the earliest date
854
+ url: string
855
+ }
727
856
  type FlightQuery = {
728
857
  from: string // IATA ("SFO") — best for cross-provider matching
729
858
  to: string
@@ -876,7 +1005,10 @@ type FlightStatusResult = {
876
1005
  * returning `flights: []`, since an empty list would otherwise be indistinguishable from a
877
1006
  * route nobody flies. `options.timeoutMs` sets the per-site budget (default 30000) — a site
878
1007
  * slower than that is dropped and named, so the answer arrives inside the calling client's own
879
- * tool-call limit rather than not at all.
1008
+ * tool-call limit rather than not at all. **For 'which day is cheapest' over a range of dates,
1009
+ * do not call this once per date**: `bowmark.providers.google_flights.getPriceGraph(query:
1010
+ * FlightQuery): Promise<PriceGraph>` (both typed above) prices every departure date from about
1011
+ * depart-7 to depart+52 in one call.
880
1012
  */
881
1013
  search(query: FlightQuery, options?: CallOptions): Promise<FlightSearchResult>;
882
1014
 
@@ -2591,11 +2723,12 @@ type ShippingQuery = {
2591
2723
  // One normalized shipping-rate quote. Same shape no matter which carrier
2592
2724
  // quoted it.
2593
2725
  type ShippingRate = {
2594
- source: string // "usps" | "ups"
2726
+ source: string // "usps" | "ups" | "pirateship"
2595
2727
  serviceCode: string // the carrier's own code, verbatim
2596
2728
  serviceName: string // the carrier's own name, e.g. "UPS Ground"
2597
2729
  price: { amount: number; currency: string } // integer minor units (cents)
2598
2730
  transitDays: number | null // null when the carrier didn't state one
2731
+ deliveryEstimate?: string | null // the carrier's own delivery-date text, when stated
2599
2732
  }
2600
2733
 
2601
2734
  type ShippingEstimateResult = {
@@ -2613,20 +2746,23 @@ type CallOptions = {
2613
2746
  * Prices a domestic package across USPS and UPS for a ZIP-to-ZIP move, weight and optional
2614
2747
  * dimensions, and returns normalized quotes cheapest first — service name, price and transit
2615
2748
  * days where the carrier states one. Direct JSON, no browser. USPS needs no key and always
2616
- * quotes; UPS is BYOK, and a caller without a UPS developer key gets the USPS quotes plus a
2617
- * `warnings` line naming what was dropped rather than a silent skip.
2749
+ * quotes. Pirate Ship (source `pirateship`) also quotes USPS AND UPS with no key, at its
2750
+ * discounted label prices, with a delivery date. UPS direct is BYOK; without a UPS developer
2751
+ * key that one leg is dropped and named in `warnings`.
2618
2752
  */
2619
2753
  interface Unit {
2620
2754
  /**
2621
2755
  * Prices a domestic package — `{ fromZip: "20024", toZip: "10001", weightOz: 16 }` — across
2622
2756
  * every USPS and UPS service that quotes it, and returns `rates` cheapest first.
2623
2757
  * `length`/`width`/`height` (inches) must be given together or omitted entirely. USPS needs no
2624
- * API key. UPS is BYOK: bring your own UPS developer key or that leg is dropped and named in
2625
- * `warnings` (it is never served off a fleet credential). `warnings` also names any carrier
2626
- * dropped for a timeout or an error. THROWS `AllProvidersFailedError` when NEITHER carrier
2627
- * answered, because that is a different fact from "no service quotes this shipment" and only
2628
- * one of them means there truly is no rate. `options.timeoutMs` sets the per-carrier budget
2629
- * (default 30000).
2758
+ * API key. Pirate Ship (`source: "pirateship"`) needs none either and quotes BOTH USPS and UPS
2759
+ * at its discounted label prices, with the carrier named in `serviceName` and a
2760
+ * `deliveryEstimate` date; given no dimensions, it prices a 10x8x4 inch box. UPS direct is
2761
+ * BYOK: bring your own UPS developer key or that leg is dropped and named in `warnings` (it is
2762
+ * never served off a fleet credential). `warnings` also names any carrier dropped for a
2763
+ * timeout or an error. THROWS `AllProvidersFailedError` when NEITHER carrier answered, because
2764
+ * that is a different fact from "no service quotes this shipment" and only one of them means
2765
+ * there truly is no rate. `options.timeoutMs` sets the per-carrier budget (default 30000).
2630
2766
  */
2631
2767
  estimate(query: ShippingQuery, options?: CallOptions): Promise<ShippingEstimateResult>;
2632
2768
  }
@@ -4691,6 +4827,7 @@ interface GetAppsResult {
4691
4827
  }
4692
4828
  interface GetAppDetailsArgs {
4693
4829
  app: string | number;
4830
+ country?: string;
4694
4831
  }
4695
4832
  interface AppStoreRatingHistogram {
4696
4833
  average: number;
@@ -4725,6 +4862,7 @@ interface AppStoreFeaturedStory {
4725
4862
  }
4726
4863
  interface AppStoreAppDetails {
4727
4864
  id: string;
4865
+ country: string;
4728
4866
  url: string;
4729
4867
  ratings: AppStoreRatingHistogram | null;
4730
4868
  chartPosition: AppStoreChartPosition | null;
@@ -4751,6 +4889,7 @@ interface ListTopChartsArgs {
4751
4889
  device?: AppStoreChartDevice;
4752
4890
  chart?: AppStoreChartKind;
4753
4891
  genreId?: string | number;
4892
+ country?: string;
4754
4893
  limit?: number;
4755
4894
  }
4756
4895
  interface AppStoreChartApp {
@@ -4769,6 +4908,7 @@ interface ListTopChartsResult {
4769
4908
  device: AppStoreChartDevice;
4770
4909
  chart: AppStoreChartKind;
4771
4910
  genreId: string;
4911
+ country: string;
4772
4912
  source: "page" | "feed";
4773
4913
  apps: AppStoreChartApp[];
4774
4914
  }
@@ -4784,6 +4924,7 @@ interface ListDeveloperAppsResult {
4784
4924
  }
4785
4925
  interface ListSimilarAppsArgs {
4786
4926
  app: string | number;
4927
+ country?: string;
4787
4928
  }
4788
4929
  interface AppStoreSimilarApp {
4789
4930
  id: string;
@@ -4797,11 +4938,13 @@ interface AppStoreSimilarApp {
4797
4938
  }
4798
4939
  interface AppStoreSimilarAppsResult {
4799
4940
  id: string;
4941
+ country: string;
4800
4942
  apps: AppStoreSimilarApp[];
4801
4943
  }
4802
4944
  interface GetStoryArgs {
4803
4945
  story: string | number;
4804
4946
  platform?: AppStoreChartDevice;
4947
+ country?: string;
4805
4948
  }
4806
4949
  interface AppStoreStoryApp {
4807
4950
  id: string;
@@ -4816,6 +4959,7 @@ interface AppStoreStoryApp {
4816
4959
  }
4817
4960
  interface AppStoreStory {
4818
4961
  id: string;
4962
+ country: string;
4819
4963
  url: string;
4820
4964
  heading: string;
4821
4965
  title: string;
@@ -4823,6 +4967,20 @@ interface AppStoreStory {
4823
4967
  body: string;
4824
4968
  apps: AppStoreStoryApp[];
4825
4969
  }
4970
+ interface ListTodayStoriesArgs {
4971
+ device?: AppStoreChartDevice;
4972
+ country?: string;
4973
+ }
4974
+ interface AppStoreTodayStory {
4975
+ id: string;
4976
+ title: string;
4977
+ url: string;
4978
+ }
4979
+ interface ListTodayStoriesResult {
4980
+ device: AppStoreChartDevice;
4981
+ country: string;
4982
+ stories: AppStoreTodayStory[];
4983
+ }
4826
4984
  type AppStoreReviewSort = "mostRecent" | "mostHelpful";
4827
4985
  interface ListReviewsArgs {
4828
4986
  app: string | number;
@@ -4941,6 +5099,13 @@ interface ListReviewsResult {
4941
5099
  * into a reason.
4942
5100
  */
4943
5101
  listReviews(args: ListReviewsArgs): Promise<ListReviewsResult>;
5102
+
5103
+ /**
5104
+ * List the editorial stories Apple is featuring on the Today tab right now — the page a person
5105
+ * actually sees when they open the App Store — each with the id and URL getStory takes. The
5106
+ * door into getStory for an agent that holds no app yet, rather than one that already does.
5107
+ */
5108
+ listTodayStories(args?: ListTodayStoriesArgs): Promise<ListTodayStoriesResult>;
4944
5109
  }
4945
5110
  }
4946
5111
 
@@ -5000,6 +5165,24 @@ interface AppleConfigurationOptions {
5000
5165
  configDimensions: AppleConfigDimension[];
5001
5166
  configurations: AppleConfiguration[];
5002
5167
  }
5168
+ interface ApplePurchaseOptionTerm {
5169
+ id: string;
5170
+ name: string;
5171
+ sectionHeader: string;
5172
+ sectionFooter: string;
5173
+ }
5174
+ interface ApplePurchaseOption {
5175
+ id: string;
5176
+ formValue: string;
5177
+ sectionHeader: string;
5178
+ sectionFooter: string;
5179
+ hideCarrier: boolean;
5180
+ terms: ApplePurchaseOptionTerm[];
5181
+ }
5182
+ interface ApplePurchaseOptions {
5183
+ url: string;
5184
+ options: ApplePurchaseOption[];
5185
+ }
5003
5186
  interface AppleFamilyModel {
5004
5187
  name: string;
5005
5188
  startingPrice: number | null;
@@ -5130,6 +5313,34 @@ interface AppleStore {
5130
5313
  longitude: number | null;
5131
5314
  hours: AppleStoreHours[];
5132
5315
  }
5316
+ interface AppleNewsroomPost {
5317
+ title: string;
5318
+ category: string;
5319
+ date: string;
5320
+ url: string;
5321
+ summary: string;
5322
+ }
5323
+ interface AppleNewsroomPostList {
5324
+ posts: AppleNewsroomPost[];
5325
+ }
5326
+ interface AppleNewsroomArticle {
5327
+ title: string;
5328
+ summary: string;
5329
+ date: string;
5330
+ url: string;
5331
+ body: string;
5332
+ }
5333
+ interface AppleCompareSpec {
5334
+ label: string;
5335
+ value: string;
5336
+ }
5337
+ interface AppleCompareModel {
5338
+ name: string;
5339
+ specs: AppleCompareSpec[];
5340
+ }
5341
+ interface AppleCompareModels {
5342
+ models: AppleCompareModel[];
5343
+ }
5133
5344
 
5134
5345
  /** apple.com's own site search and product pages — no API, no login, no browser. */
5135
5346
  interface Unit {
@@ -5175,6 +5386,32 @@ interface AppleStore {
5175
5386
  */
5176
5387
  getConfigurationOptions(urlOrPath: string): Promise<AppleConfigurationOptions>;
5177
5388
 
5389
+ /**
5390
+ * Reads the ways apple.com will let you pay for the product a buy page has settled on — buy
5391
+ * outright, Apple Card Monthly Installments, or the Apple Upgrade Program lease (with its 24-
5392
+ * vs 36-month term choice) — with apple.com's own copy for each, straight off the buy page's
5393
+ * own window.PURCHASE_OPTIONS_BOOTSTRAP. Only a page that has resolved to ONE product exposes
5394
+ * this: every Mac family buy page has (e.g. "/shop/buy-mac/macbook-air"), an iPhone/iPad
5395
+ * chooser page has not even at one specific part number, and this throws a caller-fixable
5396
+ * error naming that rather than guessing. Carries no dollar figure — apple.com computes a
5397
+ * monthly amount only after a term and trade-in are picked on the buy page itself; read a
5398
+ * configuration's own price off getConfigurationOptions.
5399
+ */
5400
+ getPurchaseOptions(urlOrPath: string): Promise<ApplePurchaseOptions>;
5401
+
5402
+ /**
5403
+ * Puts two or more iPhone models side by side on the specs apple.com itself compares them on —
5404
+ * screen size, chip, camera system, battery, capacity, finish, durability rating, connectivity
5405
+ * — straight off apple.com's own /iphone/compare/ grid. Model names must match the page's own
5406
+ * naming exactly (e.g. "iPhone 17 Pro", not "17 Pro" or "iphone17pro"); an unmatched name
5407
+ * throws naming the page's own list. Carries no price: apple.com's own compare page renders
5408
+ * its Price row as an unfilled client-side template with no number in the static HTML, so this
5409
+ * omits it rather than guess — read a price off getConfigurationOptions or getPurchaseOptions
5410
+ * instead. A spec absent for one model (an older phone with no Dynamic Island) is simply
5411
+ * missing from that model's own list, never a false "no".
5412
+ */
5413
+ compareModels(models: string[]): Promise<AppleCompareModels>;
5414
+
5178
5415
  /**
5179
5416
  * Lists every model apple.com currently sells in one product family — the chooser page's own
5180
5417
  * cards (e.g. "MacBook Air", "iPad mini"), each with its starting price and the buy page that
@@ -5276,6 +5513,19 @@ interface AppleStore {
5276
5513
  * Takes a URL or /retail/ path, e.g. one of listStores()'s own rows.
5277
5514
  */
5278
5515
  getStore(urlOrPath: string): Promise<AppleStore>;
5516
+
5517
+ /**
5518
+ * Apple's official announcements, newest first, off its own published RSS feed — every product
5519
+ * launch, financial result and press release, with its headline, category, publish date and
5520
+ * link. The primary source for "what did Apple just announce", with no publisher in between.
5521
+ */
5522
+ listNewsroomPosts(): Promise<AppleNewsroomPostList>;
5523
+
5524
+ /**
5525
+ * Read one Apple press release or announcement in full from its URL — the article text itself,
5526
+ * not the feed's one-line summary. Takes a URL straight off listNewsroomPosts()'s own rows.
5527
+ */
5528
+ getNewsroomPost(url: string): Promise<AppleNewsroomArticle>;
5279
5529
  }
5280
5530
  }
5281
5531
 
@@ -6979,18 +7229,18 @@ interface bestbuyProduct {
6979
7229
  }
6980
7230
 
6981
7231
  /**
6982
- * Best Buy's own documented Products API (api.bestbuy.com) searches the live bestbuy.com
6983
- * catalog by query and returns price, availability and review data, and looks up one product
6984
- * by Best Buy's own SKU, without scraping bestbuy.com's search page.
7232
+ * Searches the live bestbuy.com catalog by query and returns price, availability and review
7233
+ * data off bestbuy.com's own search page with no key, or Best Buy's documented Products API
7234
+ * when a key is available — and looks up one product by Best Buy's own SKU (key required).
6985
7235
  */
6986
7236
  interface Unit {
6987
7237
  /**
6988
- * Runs a Best Buy product search the way bestbuy.com's own search box does, via Best Buy's
6989
- * documented Products API, and returns the matching products — name, sale/regular price,
6990
- * online and in-store availability, manufacturer, model number, UPC and review stats.
6991
- * `pageSize` caps the row count (default 10, Best Buy's own ceiling 100). Uses Bowmark's Best
6992
- * Buy key and charges each request to your account; send your own key as the
6993
- * `x-bowmark-vendor-key-bestbuy` header instead.
7238
+ * Runs a Best Buy product search the way bestbuy.com's own search box does and returns the
7239
+ * matching products — name, sale/regular price, online and in-store availability and review
7240
+ * stats. With a Best Buy developer key (Bowmark's, charged to your account, or your own on the
7241
+ * `x-bowmark-vendor-key-bestbuy` header) it reads the documented Products API and also fills
7242
+ * manufacturer, model number and UPC. With no key it reads bestbuy.com's own search results
7243
+ * page, where those three fields are null. `pageSize` caps the row count (default 10).
6994
7244
  */
6995
7245
  search(args: string | { query: string; pageSize?: number }): Promise<bestbuyProduct[]>;
6996
7246
 
@@ -8251,6 +8501,107 @@ interface BrixtonCheckoutLink {
8251
8501
  }
8252
8502
  }
8253
8503
 
8504
+ declare namespace BowmarkProvider_browser_use {
8505
+ // ── Browser Use — the unit's own declarations, verbatim ──
8506
+ type BrowserUseRunStatus = "queued" | "dispatching" | "running" | "completed" | "failed" | "cancelled";
8507
+
8508
+ interface BrowserUseCreateRunArgs {
8509
+ task: string;
8510
+ model?: string; // e.g. "claude-sonnet-5"; absent = vendor default
8511
+ sessionId?: string; // continue a session
8512
+ maxCostUsd?: number;
8513
+ proxyCountryCode?: string; // e.g. "us"
8514
+ }
8515
+
8516
+ interface BrowserUseRunStatusReading { runId: string; status: BrowserUseRunStatus }
8517
+ interface BrowserUseCreatedRun { id: string; status: BrowserUseRunStatus; model: string; sessionId: string; workspaceId: string }
8518
+
8519
+ interface BrowserUseRun {
8520
+ id: string; sessionId: string; task: string; title: string | null; model: string;
8521
+ status: BrowserUseRunStatus; result: string | null; error: string | null;
8522
+ inputTokens: number; outputTokens: number;
8523
+ costUsd: number; // LLM cost only
8524
+ createdAt: string; updatedAt: string;
8525
+ }
8526
+
8527
+ interface BrowserUseRunList { runs: BrowserUseRun[]; hasMore: boolean }
8528
+ interface BrowserUseEvent { id: number; ts: string; type: string; data: Record<string, unknown> }
8529
+ interface BrowserUseEventsPage { events: BrowserUseEvent[]; nextAfter: number | null; hasMore: boolean }
8530
+ interface BrowserUseEventsArgs { runId: string; after?: number; limit?: number }
8531
+
8532
+ interface BrowserUseSession { sessionId: string; latestRunId: string; status: string; title: string | null; createdAt: string; updatedAt: string }
8533
+
8534
+ interface BrowserUseQueueArgs { sessionId: string; text: string; interrupt?: boolean }
8535
+ interface BrowserUseQueuedMessage { id: number; sessionId: string; status: string; mode: string }
8536
+
8537
+ interface BrowserUseBrowser {
8538
+ id: string; status: string;
8539
+ liveUrl: string | null; // interactive; whoever holds it drives the browser
8540
+ agentSessionId: string | null;
8541
+ timeoutAt: string; startedAt: string; finishedAt: string | null;
8542
+ browserCostUsd: number; proxyCostUsd: number; proxyUsedMb: number;
8543
+ }
8544
+
8545
+ /**
8546
+ * Browser Use Cloud's hosted browser agent. Not callable directly: use
8547
+ * `bowmark.browser_agent`, which runs it for you with a private watch link and bills the
8548
+ * session to your account.
8549
+ */
8550
+ interface Unit {
8551
+ /**
8552
+ * Starts a Browser Use agent run on a natural-language task, optionally continuing an existing
8553
+ * session. Returns immediately; the run executes on Browser Use's cloud for seconds to
8554
+ * minutes. Spends money.
8555
+ */
8556
+ createRun(args: BrowserUseCreateRunArgs): Promise<BrowserUseCreatedRun>;
8557
+
8558
+ /** Reads one run: status, final result or error, token totals and LLM cost. */
8559
+ getRun(runId: string): Promise<BrowserUseRun>;
8560
+
8561
+ /** The cheap status poll for one run. */
8562
+ getRunStatus(runId: string): Promise<BrowserUseRunStatusReading>;
8563
+
8564
+ /**
8565
+ * A run's step-by-step event stream after a cursor — the agent's reasoning, tool calls, and
8566
+ * the `browser.ready` event carrying the live view url.
8567
+ */
8568
+ listRunEvents(args: BrowserUseEventsArgs): Promise<BrowserUseEventsPage>;
8569
+
8570
+ /**
8571
+ * Lists every run (agent turn) in a session, newest first, each with its status and LLM cost —
8572
+ * how a session's whole spend is read.
8573
+ */
8574
+ listSessionRuns(sessionId: string): Promise<BrowserUseRunList>;
8575
+
8576
+ /**
8577
+ * Cancels an in-flight run; idempotent on a finished one. The browser keeps running — stop it
8578
+ * separately.
8579
+ */
8580
+ cancelRun(runId: string): Promise<BrowserUseRun>;
8581
+
8582
+ /** Reads a session, including the id of its latest run (a queued message becomes a new run). */
8583
+ getSession(sessionId: string): Promise<BrowserUseSession>;
8584
+
8585
+ /**
8586
+ * Sends a follow-up instruction into a session: it runs as the next turn when the current one
8587
+ * ends, or at once with `interrupt: true`.
8588
+ */
8589
+ queueMessage(args: BrowserUseQueueArgs): Promise<BrowserUseQueuedMessage>;
8590
+
8591
+ /** The cloud browser attached to a session, with its live view url and running cost, or null. */
8592
+ findSessionBrowser(sessionId: string): Promise<BrowserUseBrowser | null>;
8593
+
8594
+ /** Reads one cloud browser: status, live view url, browser and proxy cost. */
8595
+ getBrowser(browserId: string): Promise<BrowserUseBrowser>;
8596
+
8597
+ /**
8598
+ * Stops a cloud browser (cannot be undone). Its cost is then settled down to the time actually
8599
+ * used.
8600
+ */
8601
+ stopBrowser(browserId: string): Promise<BrowserUseBrowser>;
8602
+ }
8603
+ }
8604
+
8254
8605
  declare namespace BowmarkProvider_builder_strucsure_com {
8255
8606
  // ── StrucSure Home Warranty — the unit's own declarations, verbatim ──
8256
8607
  interface StrucsureRegistrationState {
@@ -9038,7 +9389,10 @@ interface CamelPriceHistory {
9038
9389
  /**
9039
9390
  * Runs camelcamelcamel's own Amazon-product search and returns each hit's ASIN, title and
9040
9391
  * current price — the locator this provider was missing: `getPriceHistory` takes an ASIN, and
9041
- * this is how a caller holding only a shopper's words finds one.
9392
+ * this is how a caller holding only a shopper's words finds one. Pass the product's name; if
9393
+ * the full wording matches nothing it retries on its own with measurements ("24000mAh",
9394
+ * "140W") dropped, so there is no need to re-run it with shorter queries, and no need to
9395
+ * search Amazon as well to find the ASIN.
9042
9396
  */
9043
9397
  search(query: string): Promise<CamelSearchResult[]>;
9044
9398
 
@@ -9046,6 +9400,11 @@ interface CamelPriceHistory {
9046
9400
  * Reads camelcamelcamel's independently-tracked Amazon price history for one ASIN — the site's
9047
9401
  * own lowest-ever/highest-ever/current/average figures, each dated, for the Amazon,
9048
9402
  * 3rd-party-new and 3rd-party-used price types, plus the full-history chart image URL.
9403
+ * `amazon.current.price` is Amazon's own price today and is null when Amazon itself is not
9404
+ * selling it, which is an answer rather than a gap. These summary figures are ALL the history
9405
+ * the library has: there is no month-by-month series anywhere (the chart is an image), so
9406
+ * answer 'how has the price moved' from lowest/highest/average/current and do not look for
9407
+ * another source.
9049
9408
  */
9050
9409
  getPriceHistory(asinOrUrl: string): Promise<CamelPriceHistory>;
9051
9410
  }
@@ -16868,12 +17227,52 @@ interface GoogleTranslateSpeech {
16868
17227
  contentType: string;
16869
17228
  chunkCount: number;
16870
17229
  }
17230
+ interface TranslateWebPageArgs {
17231
+ url: string;
17232
+ to: string;
17233
+ from?: string;
17234
+ }
17235
+ interface GoogleTranslateWebPageSegment {
17236
+ original: string;
17237
+ translated: string;
17238
+ }
17239
+ interface GoogleTranslateWebPage {
17240
+ url: string;
17241
+ title: string;
17242
+ translatedTitle: string;
17243
+ targetLanguage: string;
17244
+ sourceLanguage: string;
17245
+ detected: boolean;
17246
+ segments: GoogleTranslateWebPageSegment[];
17247
+ }
17248
+ interface TranslateDocumentArgs {
17249
+ fileBase64: string;
17250
+ mimeType: string;
17251
+ to: string;
17252
+ from?: string;
17253
+ }
17254
+ interface GoogleTranslateDocumentResult {
17255
+ translatedBase64: string;
17256
+ mimeType: string;
17257
+ }
17258
+ interface TranslateImageArgs {
17259
+ imageBase64: string;
17260
+ mimeType: string;
17261
+ to: string;
17262
+ from?: string;
17263
+ }
17264
+ interface GoogleTranslateImageResult {
17265
+ translatedImageBase64: string;
17266
+ mimeType: string;
17267
+ sourceText: string;
17268
+ translatedText: string;
17269
+ }
16871
17270
 
16872
17271
  /**
16873
17272
  * Translate text into any of 249 languages, in a batch if you have a list, and find out what
16874
17273
  * language something already is — plus the dictionary underneath: senses, definitions,
16875
- * synonyms, alternative wordings, the romanization and the spoken audio. `translate` is built;
16876
- * everything else is still a declared stub.
17274
+ * synonyms, alternative wordings, the romanization and the spoken audio. Thirteen functions
17275
+ * are built; the four account-gated ones (saved phrases, history) are still declared stubs.
16877
17276
  */
16878
17277
  interface Unit {
16879
17278
  /**
@@ -16976,6 +17375,41 @@ interface GoogleTranslateSpeech {
16976
17375
  * function must not do.
16977
17376
  */
16978
17377
  speak(args: SpeakArgs): Promise<GoogleTranslateSpeech>;
17378
+
17379
+ /**
17380
+ * Read `args.url` in `args.to` — fetches the page with a plain GET (no browser; a page that
17381
+ * renders its text client-side is out of reach), walks its rendered text nodes in reading
17382
+ * order, and translates them through this provider's own `translate` door. Measured 2026-09-16
17383
+ * that `<host>.translate.goog` (the site's own page-translation product) serves the ORIGINAL
17384
+ * page plus a client-side translator script and never returns translated text browserless,
17385
+ * which is why this fetches the caller's url directly instead. `args.from` is optional and,
17386
+ * left out, the source is detected off the page's title. `segments` preserves the page's own
17387
+ * reading order.
17388
+ */
17389
+ translateWebPage(args: TranslateWebPageArgs): Promise<GoogleTranslateWebPage>;
17390
+
17391
+ /**
17392
+ * Translate a whole PDF, Word or PowerPoint file — the Documents tab. Takes `fileBase64` (the
17393
+ * document, base64-encoded), `mimeType`, `to`, and optional `from` (left out, auto-detects),
17394
+ * and returns `translatedBase64` + `mimeType` for the SAME document translated. Built on a
17395
+ * real browser (rung 15): the RPC answers 200 to a bare browserless replay too, but silently
17396
+ * returns the document UNTRANSLATED without a BotGuard token (`x-goog-batchexecute-bgr`) only
17397
+ * a real browser produces — measured 2026-09-16, two earlier browserless-adjacent attempts
17398
+ * read that 200 as success.
17399
+ */
17400
+ translateDocument(args: TranslateDocumentArgs): Promise<GoogleTranslateDocumentResult>;
17401
+
17402
+ /**
17403
+ * Read the text in a picture and translate it — the Images tab. Takes `imageBase64` (the
17404
+ * image, base64-encoded), `mimeType`, `to`, and optional `from` (left out, auto-detects), and
17405
+ * returns `translatedImageBase64` + `mimeType` (a copy of the image with the detected text
17406
+ * replaced in place) plus the plain `sourceText`/`translatedText` strings Google's OCR found.
17407
+ * Shares `translateDocument`'s RPC channel and BotGuard gate (rung 15, real browser) but its
17408
+ * own rpcid (`WqWDPb`) and upload shape — measured 2026-09-16 uploading a real PNG with
17409
+ * rendered glyphs, verified "Hola mundo" → "Bonjour le monde" (tl=fr) and → "Hello world"
17410
+ * (tl=en).
17411
+ */
17412
+ translateImage(args: TranslateImageArgs): Promise<GoogleTranslateImageResult>;
16979
17413
  }
16980
17414
  }
16981
17415
 
@@ -22634,7 +23068,7 @@ interface LululemonColorway {
22634
23068
  imageAssets: ProductImage[];
22635
23069
  sale: SaleEvidence;
22636
23070
  coordination: CoordinationMetadata;
22637
- /** ISO 4217, or null. Always null see SaleEvidence.currency. */
23071
+ /** ISO 4217 from the colourway url's own locale, or null for an unknown one. */
22638
23072
  currency: string | null;
22639
23073
  inStock: boolean;
22640
23074
  optionGroups: LululemonOptionGroup[];
@@ -27006,6 +27440,7 @@ interface PrimeVideoTitleDetail {
27006
27440
  releaseYear: number | null;
27007
27441
  releaseDate: string | null;
27008
27442
  runtime: string | null;
27443
+ durationSeconds: number | null;
27009
27444
  genres: string[];
27010
27445
  maturityRating: string | null;
27011
27446
  cast: PrimeVideoCredit[];
@@ -27046,6 +27481,25 @@ interface PrimeVideoEpisode {
27046
27481
  isPrime: boolean;
27047
27482
  isAd: boolean;
27048
27483
  }
27484
+ interface PrimeVideoPersonCredit {
27485
+ titleId: string | null;
27486
+ catalogId: string;
27487
+ title: string;
27488
+ releaseYear: number | null;
27489
+ runtime: string | null;
27490
+ synopsis: string | null;
27491
+ maturityRating: string | null;
27492
+ }
27493
+ interface PrimeVideoPerson {
27494
+ personId: string;
27495
+ name: string;
27496
+ roles: string[];
27497
+ birthPlace: string | null;
27498
+ dateOfBirth: string | null;
27499
+ bio: string | null;
27500
+ imdbUrl: string | null;
27501
+ filmography: PrimeVideoPersonCredit[];
27502
+ }
27049
27503
  interface PrimeVideoCategory {
27050
27504
  name: string;
27051
27505
  slug: string;
@@ -27084,6 +27538,26 @@ interface PrimeVideoLiveStation {
27084
27538
  group: string;
27085
27539
  nowPlaying: PrimeVideoLiveProgram | null;
27086
27540
  }
27541
+ interface PrimeVideoLiveScheduleEntry {
27542
+ title: string;
27543
+ seriesTitle: string | null;
27544
+ seasonNumber: number | null;
27545
+ episodeNumber: number | null;
27546
+ synopsis: string | null;
27547
+ maturityRating: string | null;
27548
+ start: number;
27549
+ end: number;
27550
+ }
27551
+ interface PrimeVideoLiveSportsEvent {
27552
+ titleId: string;
27553
+ title: string;
27554
+ group: string;
27555
+ status: "LIVE" | "UPCOMING" | null;
27556
+ timeBadge: string | null;
27557
+ venue: string | null;
27558
+ entitled: boolean;
27559
+ watchMessage: string | null;
27560
+ }
27087
27561
 
27088
27562
  /**
27089
27563
  * Search Prime Video's catalogue and read a film or series the way a viewer does — synopsis,
@@ -27091,8 +27565,8 @@ interface PrimeVideoLiveStation {
27091
27565
  * included with Prime, free with ads, on a named add-on channel, or rentable and buyable with
27092
27566
  * the real price. Plus the browse surfaces (genres, collections, the top ten, this week's
27093
27567
  * deals), the add-on channels, and the free live TV, news and sports schedules. searchTitles,
27094
- * suggestTitles, getTitle, getWatchOptions, listSeasons, listEpisodes and listCategories are
27095
- * built; everything else is still a declared stub.
27568
+ * suggestTitles, getTitle, getWatchOptions, listSeasons, listEpisodes, getPerson and
27569
+ * listCategories are built; everything else is still a declared stub.
27096
27570
  */
27097
27571
  interface Unit {
27098
27572
  /**
@@ -27101,13 +27575,21 @@ interface PrimeVideoLiveStation {
27101
27575
  * function here takes, whether it is a film or a series, the year, the maturity rating, and
27102
27576
  * the site's own sentence for how to watch it. THE provider's door: every titleId-taking
27103
27577
  * function below is fed by this one. Returns the FIRST page only — Prime Video's search page
27104
- * carries no pagination markers at all (measured 2026-09-15) and the site's six refinement
27105
- * filters (film-or-series, how you can watch it, which channel, HD/UHD, theme, audio language)
27106
- * are not built here: they ride an opaque per-page `serviceToken`, not a query parameter, and
27107
- * a query parameter silently returns the unfiltered set rather than erroring. A query that
27108
- * matches nothing returns an empty array rather than throwing.
27109
- */
27110
- searchTitles(query: string): Promise<PrimeVideoTitle[]>;
27578
+ * carries no pagination markers at all (measured 2026-09-15). `options.waysToWatch` narrows by
27579
+ * how you can watch it "prime" (included with a Prime membership), "channels" (an add-on
27580
+ * subscription) or "rentOrBuy" the commonest thing a viewer does after typing a query and
27581
+ * the one refinement built so far. The site's other five refinement dimensions (which channel,
27582
+ * HD/UHD, theme, subtitle language, film-or-series) are still not built here: every one of
27583
+ * them rides the same opaque per-page `serviceToken` mechanism (rung 11 — an undocumented
27584
+ * endpoint reached by harvesting the token off the page a search already returned), never a
27585
+ * query parameter, and a hand-constructed query parameter silently returns the unfiltered set
27586
+ * rather than erroring. A query that matches nothing returns an empty array rather than
27587
+ * throwing. A filtered call whose real matches are too few can carry the site's own generic
27588
+ * recommendations under a heading still labelled "Top results" — measured 2026-09-16, not a
27589
+ * defect in this parser: the site does this identically on the unfiltered page's own "More to
27590
+ * explore" row.
27591
+ */
27592
+ searchTitles(query: string, options?: { waysToWatch?: "prime" | "channels" | "rentOrBuy" }): Promise<PrimeVideoTitle[]>;
27111
27593
 
27112
27594
  /**
27113
27595
  * Ask Prime Video's own search box what it would autocomplete a prefix to — "the boy" comes
@@ -27119,12 +27601,13 @@ interface PrimeVideoLiveStation {
27119
27601
 
27120
27602
  /**
27121
27603
  * Read one film, series-season or episode the way a viewer reads its page: title, synopsis,
27122
- * year, release date, runtime, genres, maturity rating, cast, directors, studio, the Amazon
27123
- * customer rating and its five-star histogram, the IMDb score, which audio languages and
27124
- * subtitles it ships, and whether it is in UHD, HDR, Dolby Atmos or X-Ray. The core read of
27125
- * the whole provider. Takes a titleId or a title URL, e.g. one read off searchTitles(). THE
27126
- * REVIEW TEXT IS NOT HERE — the aggregate rating and histogram are real and logged out, but
27127
- * review bodies are amazon.com's own surface behind amazon.com's sign-in wall.
27604
+ * year, release date, runtime (both the display string and durationSeconds), genres, maturity
27605
+ * rating, cast, directors, studio, the Amazon customer rating and its five-star histogram, the
27606
+ * IMDb score, which audio languages and subtitles it ships, and whether it is in UHD, HDR,
27607
+ * Dolby Atmos or X-Ray. The core read of the whole provider. Takes a titleId or a title URL,
27608
+ * e.g. one read off searchTitles(). THE REVIEW TEXT IS NOT HERE — the aggregate rating and
27609
+ * histogram are real and logged out, but review bodies are amazon.com's own surface behind
27610
+ * amazon.com's sign-in wall.
27128
27611
  */
27129
27612
  getTitle(titleId: string): Promise<PrimeVideoTitleDetail>;
27130
27613
 
@@ -27163,6 +27646,16 @@ interface PrimeVideoLiveStation {
27163
27646
  */
27164
27647
  listEpisodes(titleId: string): Promise<PrimeVideoEpisode[]>;
27165
27648
 
27649
+ /**
27650
+ * Read a cast member's own Prime Video page: their name, what they are credited as, when and
27651
+ * where they were born, their biography, and the titles of theirs the catalogue carries — with
27652
+ * each credit's own synopsis, runtime and maturity rating, not just its title. How an agent
27653
+ * answers "what else is she in" without leaving the site. Takes a personId or a person URL —
27654
+ * read one off getTitle().cast[].searchLink, never .directors[].searchLink, which points at a
27655
+ * search instead: a director gets no page of their own here, only a searchTitles() fallback.
27656
+ */
27657
+ getPerson(personId: string): Promise<PrimeVideoPerson>;
27658
+
27166
27659
  /**
27167
27660
  * List the ways Prime Video lets you browse — its genres (action, comedy, horror, anime,
27168
27661
  * documentary and more, plus kids), its editorial collections (new and upcoming, award
@@ -27297,6 +27790,25 @@ interface PrimeVideoLiveStation {
27297
27790
  * when the page carries no station with that id.
27298
27791
  */
27299
27792
  getLiveSchedule(section: "livetv" | "news", stationId: string): Promise<PrimeVideoLiveProgram[]>;
27793
+
27794
+ /**
27795
+ * What sport is on Prime Video now and what is coming — live and upcoming EVENTS, off
27796
+ * `/sports`, never a station (that is `listLiveChannels`'s own shape, a `LinearStationCard`,
27797
+ * which this function ignores) and never an on-demand documentary sharing the same page. No
27798
+ * arguments. `group` names the row the event is listed under: "Sports with a subscription" is
27799
+ * entitlement a Prime member already carries some of, "Apple TV: Live and upcoming events" is
27800
+ * a different provider's events entirely, and `entitled`/`watchMessage` carry the site's own
27801
+ * per-event verdict — measured 2026-09-16, a Prime-entitled poker event on the "Sports with a
27802
+ * subscription" row reads `entitled: true, watchMessage: "Watch for free"` beside an
27803
+ * Unentitled squash event on the SAME row reading `entitled: false, watchMessage: "Free trial
27804
+ * of SquashTV"`, so the row heading alone never says whether a given event is free. `status`
27805
+ * and `timeBadge` are the site's own words ("LIVE", "Live at 7 PM EDT", "Fri, Sep 18 6:30 PM
27806
+ * EDT") — no epoch timestamp exists on an event card the way one does on a station's
27807
+ * `schedule[]`, so none is invented. `venue` is `null` for an event with no physical location
27808
+ * (an online poker series, a studio broadcast) — a real and common answer, never a parse
27809
+ * failure.
27810
+ */
27811
+ listLiveSports(): Promise<PrimeVideoLiveSportsEvent[]>;
27300
27812
  }
27301
27813
  }
27302
27814
 
@@ -32729,6 +33241,25 @@ interface TwitchHighlight {
32729
33241
  channel: string;
32730
33242
  dashboardUrl: string;
32731
33243
  }
33244
+ interface SetChannelArgs {
33245
+ /** The channel title shown on the stream page. Twitch's own input field for
33246
+ * this is called "status"; this provider takes the name the UI shows. */
33247
+ title?: string;
33248
+ /** ISO 639-1 language code, e.g. "en". */
33249
+ language?: string;
33250
+ /** Category NAME, e.g. "Wetrix" — not a category id. */
33251
+ game?: string;
33252
+ }
33253
+ interface TwitchChannelSettings {
33254
+ id: string;
33255
+ /** The channel title shown on the stream page. */
33256
+ title: string;
33257
+ /** ISO 639-1 language code, e.g. "en". */
33258
+ language: string;
33259
+ /** The category. Empty strings when the channel has never set one. */
33260
+ gameId: string;
33261
+ gameName: string;
33262
+ }
32732
33263
  interface RegisterDeveloperAppArgs {
32733
33264
  /** Application name */
32734
33265
  name: string;
@@ -32770,6 +33301,21 @@ interface TwitchDeveloperApp {
32770
33301
  * live archive has recorded so far (retry shortly in that case).
32771
33302
  */
32772
33303
  createHighlight(args: CreateHighlightArgs): Promise<TwitchHighlight>;
33304
+
33305
+ /**
33306
+ * Reads the signed-in streamer's channel settings: title, language and current game/category.
33307
+ * Takes no arguments. NEEDS the streamer's Twitch sign-in, which only a capability can hold:
33308
+ * call it as bowmark.stream_channel.get.
33309
+ */
33310
+ getChannel(): Promise<TwitchChannelSettings>;
33311
+
33312
+ /**
33313
+ * Updates the signed-in streamer's channel settings: title, language and game/category.
33314
+ * Returns the updated settings. It cannot set tags — `tags` is not a field of Twitch's own
33315
+ * UpdateBroadcastSettingsInput. NEEDS the streamer's Twitch sign-in, which only a capability
33316
+ * can hold: call it as bowmark.stream_channel.set.
33317
+ */
33318
+ setChannel(args: SetChannelArgs): Promise<TwitchChannelSettings>;
32773
33319
  }
32774
33320
  }
32775
33321
 
@@ -33561,6 +34107,41 @@ interface VisibleGetPlansResult {
33561
34107
  }
33562
34108
  }
33563
34109
 
34110
+ declare namespace BowmarkProvider_vistaprint {
34111
+ // ── Vistaprint — the unit's own declarations, verbatim ──
34112
+ type ShippingBoxSize = "11x8.5x5.5" | "12x12x5.5" | "13x13x10";
34113
+ type ShippingBoxPrintArea = "inside-and-outside" | "outside-only";
34114
+
34115
+ interface GetShippingBoxPriceArgs {
34116
+ size: ShippingBoxSize;
34117
+ printArea: ShippingBoxPrintArea;
34118
+ quantity: number;
34119
+ }
34120
+
34121
+ interface ShippingBoxPrice {
34122
+ size: ShippingBoxSize;
34123
+ printArea: ShippingBoxPrintArea;
34124
+ quantity: number;
34125
+ price: { amount: number; currency: string }; // real total for `quantity` units
34126
+ unitPrice: { amount: number; currency: string };
34127
+ }
34128
+
34129
+ /**
34130
+ * Prices Vistaprint's Full-Print Shipping Boxes for a real size, print area and quantity — the
34131
+ * live, quantity-tiered price the site's own PDP configurator computes, with no browser,
34132
+ * account or cart. Custom printed boxes, mailer boxes and packaging boxes.
34133
+ */
34134
+ interface Unit {
34135
+ /**
34136
+ * Reads Vistaprint's own live pricing service for its Full-Print Shipping Boxes — the real,
34137
+ * quantity-tiered total and per-unit price for a chosen box size, print area and quantity, the
34138
+ * same figure the site's PDP configurator computes as a buyer changes those inputs. THROWS a
34139
+ * caller-fixable error for a size/printArea/quantity combination Vistaprint has no price for.
34140
+ */
34141
+ getShippingBoxPrice(args: GetShippingBoxPriceArgs): Promise<ShippingBoxPrice>;
34142
+ }
34143
+ }
34144
+
33564
34145
  declare namespace BowmarkProvider_voluspa {
33565
34146
  // ── Voluspa — the unit's own declarations, verbatim ──
33566
34147
  interface VoluspaQuizButton {
@@ -34279,12 +34860,34 @@ interface YoutubeTranscript {
34279
34860
  fullText: string;
34280
34861
  }
34281
34862
 
34863
+ interface YoutubeSearchVideo {
34864
+ videoId: string;
34865
+ url: string;
34866
+ title: string;
34867
+ channel: string | null;
34868
+ channelId: string | null;
34869
+ published: string | null; // YouTube's own phrase, e.g. "4 weeks ago"
34870
+ publishedAgeSeconds: number | null; // that phrase in seconds, to order newest-first
34871
+ length: string | null; // e.g. "22:28"; null for a live stream
34872
+ views: number | null;
34873
+ thumbnail: string | null;
34874
+ }
34875
+
34282
34876
  /**
34283
34877
  * A YouTube video's own caption transcript, read off the site's own Transcript panel —
34284
34878
  * timestamped lines plus the full text as one string. Language selection is not offered yet;
34285
34879
  * this reads whichever track the panel shows by default.
34286
34880
  */
34287
34881
  interface Unit {
34882
+ /**
34883
+ * Searches YouTube the way its search box does and returns the videos on the results page —
34884
+ * id, url, title, channel, upload age, length and views. `uploadedWithin` applies YouTube's
34885
+ * own upload-date filter. Rows come back in YouTube's own order either way, which is NOT
34886
+ * newest first, so sort on `publishedAgeSeconds` (smaller is newer) to find the most recent.
34887
+ * Pass a video's `url` or `videoId` straight to `getTranscript`.
34888
+ */
34889
+ search(input: { query: string; uploadedWithin?: "today" | "week" | "month" | "year" }): Promise<YoutubeSearchVideo[]>;
34890
+
34288
34891
  /**
34289
34892
  * Returns a YouTube video's own caption transcript. `video` is a bare 11-character video id or
34290
34893
  * any watch/shorts/embed/live/youtu.be URL. `segments` is [] — a real, honest answer — when
@@ -35260,6 +35863,7 @@ interface BowmarkProviders {
35260
35863
  boydsleep: BowmarkProvider_boydsleep.Unit;
35261
35864
  brius: BowmarkProvider_brius.Unit;
35262
35865
  brixton: BowmarkProvider_brixton.Unit;
35866
+ browser_use: BowmarkProvider_browser_use.Unit;
35263
35867
  builder_strucsure_com: BowmarkProvider_builder_strucsure_com.Unit;
35264
35868
  bulletproof: BowmarkProvider_bulletproof.Unit;
35265
35869
  bungalow: BowmarkProvider_bungalow.Unit;
@@ -35585,6 +36189,7 @@ interface BowmarkProviders {
35585
36189
  viewrail: BowmarkProvider_viewrail.Unit;
35586
36190
  villagerealtyobx: BowmarkProvider_villagerealtyobx.Unit;
35587
36191
  visible: BowmarkProvider_visible.Unit;
36192
+ vistaprint: BowmarkProvider_vistaprint.Unit;
35588
36193
  voluspa: BowmarkProvider_voluspa.Unit;
35589
36194
  vscode: BowmarkProvider_vscode.Unit;
35590
36195
  walkerhughes: BowmarkProvider_walkerhughes.Unit;
@@ -87324,6 +87929,7 @@ interface BowmarkProviders {
87324
87929
  * generated once precisely so those two cannot drift. */
87325
87930
  interface BowmarkLibrary {
87326
87931
  booking_links: BowmarkCapability_booking_links.Unit;
87932
+ browser_agent: BowmarkCapability_browser_agent.Unit;
87327
87933
  bundles: BowmarkCapability_bundles.Unit;
87328
87934
  cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
87329
87935
  cars: BowmarkCapability_cars.Unit;