@bowmark/web 1.21.0 → 1.22.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: 8f74962f532da5df8d2905deb36fe43233b84c4f09f37cb4c76b92a153333d03
9
- // 46 capabilities, 404 providers, 984 typed functions, 20 refused.
8
+ // Manifest version: 629f1aeb04463086ca99af95377a310bbd807733f6a06b36d16890fbc8e3314d
9
+ // 48 capabilities, 410 providers, 1008 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
@@ -36,6 +36,125 @@
36
36
 
37
37
 
38
38
 
39
+ declare namespace BowmarkCapability_booking_links {
40
+ // ── Booking links — find a person's Calendly or Cal.com link and read its form — the unit's own declarations, verbatim ──
41
+ type BookingPlatform = "calendly" | "cal.com" | "savvycal" | "tidycal" | "zcal" | "hubspot"
42
+ | "acuity" | "chilipiper" | "google-calendar" | "microsoft-bookings"
43
+
44
+ // published: READ off a page (foundOn is the citation). archived: read off an old
45
+ // Wayback capture of a page (archivedAt dates it). indexed: Google's site:cal.com search for
46
+ // the name returned it (context quotes the result). name_match: built from the name and
47
+ // it exists — nothing shows the person published it, and a namesake can own it.
48
+ type BookingLinkMethod = "published" | "archived" | "indexed" | "name_match"
49
+
50
+ interface BookingLinkFinding {
51
+ url: string
52
+ platform: BookingPlatform
53
+ method: BookingLinkMethod // the strongest way it was found
54
+ foundBy: BookingLinkMethod[] // every way it was found
55
+ foundOn: string | null // the page it was written on
56
+ archivedAt: string | null // YYYY-MM-DD capture date, for "archived"
57
+ archiveUrl: string | null
58
+ context: string | null // the link's anchor text or the words around it
59
+ ownerName: string | null // the name the booking page itself shows (name_match)
60
+ nameConfirmed: boolean // name_match: page owner carries both names; published/archived: the name is on that page
61
+ }
62
+
63
+ interface FindBookingLinksInput {
64
+ name: string // full name, first and last
65
+ company?: string // name or domain — adds "first-company" slugs
66
+ domain?: string // their company site: about/team/contact/services pages + homepage scanned
67
+ github?: string // a handle READ off a page that names them, never guessed
68
+ urls?: string[] // personal site, speaker bio, blog post — any page of theirs
69
+ }
70
+
71
+ interface FindBookingLinksOptions {
72
+ archive?: boolean // read Wayback captures of the domain's about/team/contact pages; default true with a domain
73
+ search?: boolean // Google site:cal.com "<name>" via Serper; default true; each search is charged to your account, or send your own key as the x-bowmark-vendor-key-serper header
74
+ timeoutMs?: number
75
+ }
76
+
77
+ interface BookingLinkSearch {
78
+ name: string
79
+ links: BookingLinkFinding[] // published first, then archived, then name_match
80
+ checked: { pagesScanned: number; pagesUnreachable: string[]; archivedPagesRead: number; slugsChecked: string[] }
81
+ warnings: string[]
82
+ }
83
+
84
+ interface PublishedBookingLink { url: string; platform: BookingPlatform; context: string; nearbyText: string }
85
+ interface PageScan { url: string; finalUrl: string; status: number; links: PublishedBookingLink[]; warnings: string[] }
86
+
87
+ interface BookingQuestion { label: string; kind: string; required: boolean; choices: string[] }
88
+ interface BookingEvent { name: string; url: string; description: string | null; durationMinutes: number | null }
89
+
90
+ interface BookingPage {
91
+ url: string
92
+ platform: "calendly" | "cal.com"
93
+ ownerName: string | null
94
+ organization: string | null // the org/team the platform files the account under (Cal.com)
95
+ avatarUrl: string | null
96
+ events: BookingEvent[] // every event a profile lists
97
+ event: BookingEvent | null // the event whose form was read; null if several and none named
98
+ questions: BookingQuestion[] // everything the form asks
99
+ qualifyingQuestions: string[] // the questions beyond name/email/notes — "company", "team size": a sales funnel asks these, a personal chat does not
100
+ bookable: "open" | "fully_booked" | "closed" | "unknown" // Cal.com is always "unknown" here; use cal_com.getAvailability
101
+ nextAvailability: string | null
102
+ unavailableReason: string | null // the platform's own words when it cannot be booked
103
+ warnings: string[]
104
+ }
105
+
106
+ interface ReadBookingPageOptions { event?: string; timeoutMs?: number }
107
+
108
+ type CallOptions = {
109
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
110
+ // A provider slower than this is DROPPED from the results and
111
+ // NAMED in warnings — never silently absent
112
+ }
113
+
114
+ /**
115
+ * Finds the public booking link (Calendly, Cal.com, SavvyCal, HubSpot…) a named person
116
+ * publishes — on their company's pages, their GitHub, an old archived copy of their site, or
117
+ * under their own name on Calendly and Cal.com — and reads what the booking form asks and
118
+ * whether the calendar is open, without booking anything.
119
+ */
120
+ interface Unit {
121
+ /**
122
+ * Finds a person's public booking links from their name. Runs four searches at once and merges
123
+ * them, strongest evidence first: links PUBLISHED on their company's
124
+ * about/team/contact/services pages and homepage, their GitHub profile README, the website
125
+ * that profile lists and any `urls` of theirs (each with the page it was on and the words
126
+ * around it); links on ARCHIVED Wayback Machine captures of the company's about/team/contact
127
+ * pages, dated (catches a link since removed); Cal.com pages Google has INDEXED under their
128
+ * name (a `site:cal.com "<name>"` Google search through Serper — each search is charged to
129
+ * your account on Bowmark's key, or send your own as the `x-bowmark-vendor-key-serper` header;
130
+ * if no key can serve it, it is skipped and named in `warnings`); and their name as a slug on
131
+ * Calendly and Cal.com, including "first-company" shapes (NAME_MATCH — exists, but a namesake
132
+ * can own it, so check `ownerName` and tie it to the company). Pass `company` and `domain`
133
+ * whenever known. Google does not index Calendly pages, so the slug check is the only way to
134
+ * find those. Never books.
135
+ */
136
+ find(person: FindBookingLinksInput, options?: FindBookingLinksOptions): Promise<BookingLinkSearch>;
137
+
138
+ /**
139
+ * Lists every booking link written on one page — hrefs, Cal.com embed buttons
140
+ * (`data-cal-link`) and plain-text links — with each link's anchor text and the words around
141
+ * it, ignoring the platforms' own pricing/login/blog pages. Use it on a personal site, a
142
+ * speaker bio or a newsletter footer.
143
+ */
144
+ scanPage(url: string, options?: CallOptions): Promise<PageScan>;
145
+
146
+ /**
147
+ * Reads a Calendly or Cal.com booking page without booking: who owns it, the events it offers,
148
+ * every question its form asks, `qualifyingQuestions` (anything beyond name/email/notes — a
149
+ * sales funnel asks for your company, a personal chat does not), and whether it can be booked
150
+ * (Calendly: open, fully booked, or closed with the platform's own reason). Works on a
151
+ * fully-booked calendar. A profile with several events returns `event: null` and the list
152
+ * unless `options.event` names one (slug or part of the name).
153
+ */
154
+ read(url: string, options?: ReadBookingPageOptions): Promise<BookingPage>;
155
+ }
156
+ }
157
+
39
158
  declare namespace BowmarkCapability_bundles {
40
159
  // ── Check whether a set of products can be built and bought right now — the unit's own declarations, verbatim ──
41
160
  interface BundleItemAvailability {
@@ -291,6 +410,25 @@ type CallOptions = {
291
410
  }
292
411
  }
293
412
 
413
+ declare namespace BowmarkCapability_currency_exchange {
414
+ // ── Currency exchange — the unit's own declarations, verbatim ──
415
+ interface currency_exchangeResult {
416
+ rate: number;
417
+ warnings: string[];
418
+ }
419
+ type CallOptions = {
420
+ timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
421
+ // A provider slower than this is DROPPED from the results and
422
+ // NAMED in warnings — never silently absent
423
+ }
424
+
425
+ /** Get real-time exchange rates between currencies */
426
+ interface Unit {
427
+ /** Returns the current exchange rate between two currencies */
428
+ getRate(from: string, to: string, options?: CallOptions): Promise<currency_exchangeResult>;
429
+ }
430
+ }
431
+
294
432
  declare namespace BowmarkCapability_custom_sofa_configurator {
295
433
  // ── Custom sofa configurator (fabric selection, live pricing) — the unit's own declarations, verbatim ──
296
434
  type CustomSofa = {
@@ -4402,11 +4540,59 @@ interface archive_orgAvailability {
4402
4540
  archivedStatus: string | null; // the original page's own HTTP status when captured
4403
4541
  }
4404
4542
 
4543
+ interface archive_orgSnapshotOptions {
4544
+ scope?: "exact" | "prefix"; // default: "prefix" for a bare domain (every page under it), "exact" for a url with a path
4545
+ limit?: number; // 1-500, default 50 — newest first
4546
+ pathContains?: string[]; // keep only urls whose path contains one of these, e.g. ["about", "team", "contact"]
4547
+ }
4548
+
4549
+ interface archive_orgSnapshot {
4550
+ timestamp: string; // YYYYMMDDhhmmss
4551
+ originalUrl: string;
4552
+ archivedUrl: string; // the browsable capture, web.archive.org/web/<ts>/<url>
4553
+ statusCode: string;
4554
+ mimeType: string;
4555
+ }
4556
+
4557
+ interface archive_orgSnapshotList {
4558
+ query: string;
4559
+ scope: "exact" | "prefix";
4560
+ snapshots: archive_orgSnapshot[]; // prefix: newest capture of each distinct url; exact: each distinct VERSION of the page
4561
+ warnings: string[];
4562
+ }
4563
+
4564
+ interface archive_orgSnapshotPage {
4565
+ originalUrl: string;
4566
+ timestamp: string;
4567
+ archivedUrl: string;
4568
+ html: string; // the ORIGINAL bytes as captured, without the archive's toolbar or rewritten links
4569
+ warnings: string[];
4570
+ }
4571
+
4405
4572
  /**
4406
- * The Wayback Machine's own public availability lookup — is a site or page archived, and
4407
- * where.
4573
+ * The Wayback Machine — is a site or page archived, every capture it holds, and the page
4574
+ * itself as it was captured, so a caller can see what a site published before it was changed
4575
+ * or removed.
4408
4576
  */
4409
4577
  interface Unit {
4578
+ /**
4579
+ * Lists what the Wayback Machine has captured, newest first. A bare domain ("humanlayer.dev")
4580
+ * returns the newest capture of every distinct page under it — narrow it with `pathContains:
4581
+ * ["about", "team", "contact"]`. A url with a path returns every distinct VERSION of that one
4582
+ * page, which is the axis that answers "was this ever on the page". Each row carries the
4583
+ * capture timestamp, the original url and its browsable archive url. Use getSnapshot to read
4584
+ * one.
4585
+ */
4586
+ listSnapshots(site: string, opts?: archive_orgSnapshotOptions): Promise<archive_orgSnapshotList>;
4587
+
4588
+ /**
4589
+ * Reads one archived page as it was captured — the original HTML, without the archive's
4590
+ * toolbar or rewritten links — for a url and a `YYYYMMDDhhmmss` timestamp from listSnapshots
4591
+ * (a nearby timestamp is redirected to the closest capture). Use it to find something a page
4592
+ * carried in the past and has since removed.
4593
+ */
4594
+ getSnapshot(url: string, timestamp: string): Promise<archive_orgSnapshotPage>;
4595
+
4410
4596
  /**
4411
4597
  * Checks the Wayback Machine's own public availability endpoint for one site or page — a bare
4412
4598
  * domain ("carpetlandusa.net"), a domain plus path
@@ -5896,15 +6082,17 @@ interface bestbuyProduct {
5896
6082
  * Runs a Best Buy product search the way bestbuy.com's own search box does, via Best Buy's
5897
6083
  * documented Products API, and returns the matching products — name, sale/regular price,
5898
6084
  * online and in-store availability, manufacturer, model number, UPC and review stats.
5899
- * `pageSize` caps the row count (default 10, Best Buy's own ceiling 100). Requires a Best Buy
5900
- * developer API key see this provider's `auth`.
6085
+ * `pageSize` caps the row count (default 10, Best Buy's own ceiling 100). Uses Bowmark's Best
6086
+ * Buy key and charges each request to your account; send your own key as the
6087
+ * `x-bowmark-vendor-key-bestbuy` header instead.
5901
6088
  */
5902
6089
  search(args: string | { query: string; pageSize?: number }): Promise<bestbuyProduct[]>;
5903
6090
 
5904
6091
  /**
5905
6092
  * Looks up one product by Best Buy's own numeric SKU (the id `search`'s rows carry) and
5906
- * returns its full detail — the same fields as `search`. Requires a Best Buy developer API key
5907
- * see this provider's `auth`.
6093
+ * returns its full detail — the same fields as `search`. Uses Bowmark's Best Buy key and
6094
+ * charges each request to your account; send your own key as the
6095
+ * `x-bowmark-vendor-key-bestbuy` header instead.
5908
6096
  */
5909
6097
  getProduct(sku: string | number): Promise<bestbuyProduct>;
5910
6098
  }
@@ -7562,9 +7750,58 @@ interface CalComAvailabilityResult {
7562
7750
  otherEventTypes: CalComEventType[];
7563
7751
  }
7564
7752
 
7753
+ interface CalComFormQuestion {
7754
+ label: string; // what a booker reads
7755
+ name: string; // Cal.com's own field name ("name", "email", or a custom slug)
7756
+ type: string; // Cal.com's own type: "name" | "email" | "phone" | "text" | "textarea" | "select" | "radio" | …
7757
+ required: boolean;
7758
+ choices: string[];
7759
+ }
7760
+
7761
+ interface CalComBookingEvent {
7762
+ title: string;
7763
+ slug: string;
7764
+ url: string;
7765
+ description: string | null;
7766
+ lengthInMinutes: number | null;
7767
+ }
7768
+
7769
+ interface CalComBookingFormOptions {
7770
+ event?: string; // which event on a multi-event profile — its slug or part of its title
7771
+ }
7772
+
7773
+ interface CalComBookingForm {
7774
+ url: string;
7775
+ username: string;
7776
+ eventTypes: CalComEventType[]; // a profile's list; empty when the url already named an event
7777
+ event: CalComBookingEvent | null; // null when several events exist and none was named
7778
+ ownerName: string | null;
7779
+ organization: string | null; // the org/team Cal.com itself files the account under
7780
+ avatarUrl: string | null;
7781
+ questions: CalComFormQuestion[]; // only what a booker is shown — hidden and reschedule-only fields dropped
7782
+ warnings: string[];
7783
+ }
7784
+
7785
+ interface CalComProfileCandidate {
7786
+ slug: string;
7787
+ url: string; // where the page landed; a one-event profile redirects to that event
7788
+ title: string; // the page's own <title>
7789
+ ownerName: string | null; // read off the title
7790
+ nameMatches: boolean; // ownerName carries BOTH names asked for — a hint, a namesake passes too
7791
+ }
7792
+
7793
+ interface CalComFindProfilesResult {
7794
+ name: string;
7795
+ company: string | null;
7796
+ slugsChecked: string[];
7797
+ candidates: CalComProfileCandidate[];
7798
+ warnings: string[];
7799
+ }
7800
+
7565
7801
  /**
7566
- * Cal.com's own documented, keyless public APIthe event types a booking page offers and the
7567
- * real, currently-open time slots for one of them no browser, no key.
7802
+ * Cal.com's own public surfacesfind a person's Cal.com page from their name, read the event
7803
+ * types it offers, the questions its booking form asks and who owns it, and the real,
7804
+ * currently-open time slots — no browser, no key.
7568
7805
  */
7569
7806
  interface Unit {
7570
7807
  /**
@@ -7581,6 +7818,28 @@ interface CalComAvailabilityResult {
7581
7818
  * event type and reports the rest in `otherEventTypes`.
7582
7819
  */
7583
7820
  getAvailability(username: string, opts?: CalComAvailabilityOptions): Promise<CalComAvailabilityResult>;
7821
+
7822
+ /**
7823
+ * Reads what a Cal.com booking page will ask before anyone books: the event's
7824
+ * title/description/length, every question on its booking form (only the ones a booker is
7825
+ * actually shown, with choices and whether each is required), the owner's name and avatar, and
7826
+ * the organization or team Cal.com files the account under. Needs no open slot. Takes an event
7827
+ * url ("https://cal.com/alexatallah/15min"), a team or org-subdomain event url, or a profile
7828
+ * url — a profile with several events returns `event: null` and the list unless `opts.event`
7829
+ * names one. Never books anything.
7830
+ */
7831
+ getBookingForm(url: string, opts?: CalComBookingFormOptions): Promise<CalComBookingForm>;
7832
+
7833
+ /**
7834
+ * Finds a person's own Cal.com page from their full name, and optionally their company (pass
7835
+ * it). Checks the slug shapes that measured reliable (first-last, firstlast, lastfirst,
7836
+ * first-company, firstcompany, last-company, and the bare company slug — which often belongs
7837
+ * to a stranger, so read `ownerName`) and returns each page that exists with its own title,
7838
+ * the owner name the title states, and `nameMatches`. A match is a GUESS: a namesake passes,
7839
+ * so tie the page to the company before relying on it. Works on pages no search engine has
7840
+ * indexed.
7841
+ */
7842
+ findProfiles(name: string, company?: string): Promise<CalComFindProfilesResult>;
7584
7843
  }
7585
7844
  }
7586
7845
 
@@ -7629,10 +7888,58 @@ interface CalendlyAvailabilityResult {
7629
7888
  otherEventTypes: CalendlyEventType[];
7630
7889
  }
7631
7890
 
7891
+ interface CalendlyFormQuestion {
7892
+ label: string;
7893
+ format: string; // Calendly's own: "string" | "text" | "phone_number" | "select" | "multi_select" | "radios" | "checkboxes"
7894
+ required: boolean;
7895
+ choices: string[];
7896
+ }
7897
+
7898
+ interface CalendlyBookingEvent {
7899
+ name: string;
7900
+ slug: string | null;
7901
+ url: string;
7902
+ description: string | null;
7903
+ durationMinutes: number | null;
7904
+ }
7905
+
7906
+ interface CalendlyBookingFormOptions {
7907
+ event?: string; // which event on a multi-event profile — its slug or part of its name
7908
+ }
7909
+
7910
+ interface CalendlyBookingForm {
7911
+ url: string;
7912
+ profileSlug: string | null; // null for a calendly.com/d/<hash> share link
7913
+ ownerName: string | null;
7914
+ eventTypes: CalendlyEventType[];
7915
+ event: CalendlyBookingEvent | null; // null when several events exist and none was named
7916
+ questions: CalendlyFormQuestion[]; // CUSTOM questions; name + email are always asked on top
7917
+ nextAvailability: string | null; // null + unavailableReason null = fully booked, not unread
7918
+ unavailableReason: string | null; // non-null = Calendly says this cannot be booked
7919
+ warnings: string[];
7920
+ }
7921
+
7922
+ interface CalendlyProfileCandidate {
7923
+ slug: string;
7924
+ url: string;
7925
+ ownerName: string; // the name the profile itself shows
7926
+ nameMatches: boolean; // ownerName carries BOTH names asked for — a hint, a namesake passes too
7927
+ timezone: string;
7928
+ }
7929
+
7930
+ interface CalendlyFindProfilesResult {
7931
+ name: string;
7932
+ company: string | null;
7933
+ slugsChecked: string[];
7934
+ candidates: CalendlyProfileCandidate[];
7935
+ warnings: string[];
7936
+ }
7937
+
7632
7938
  /**
7633
- * Calendly's own public booking-widget data — the event types a scheduling page offers and the
7634
- * real, currently-open time slots for one of them read straight off the widget's
7635
- * undocumented JSON endpoints, no browser, no key.
7939
+ * Calendly's own public booking-widget data — find a person's Calendly page from their name,
7940
+ * read the event types it offers, the questions its booking form asks, and the real,
7941
+ * currently-open time slots — read straight off the widget's undocumented JSON endpoints, no
7942
+ * browser, no key.
7636
7943
  */
7637
7944
  interface Unit {
7638
7945
  /**
@@ -7650,6 +7957,29 @@ interface CalendlyAvailabilityResult {
7650
7957
  * first event type and reports the rest in `otherEventTypes`.
7651
7958
  */
7652
7959
  getAvailability(profile: string, opts?: CalendlyAvailabilityOptions): Promise<CalendlyAvailabilityResult>;
7960
+
7961
+ /**
7962
+ * Reads what a Calendly booking page will ask before anyone books: the owner's name, the
7963
+ * event's name/description/duration, every custom form question (with its choices and whether
7964
+ * it is required), the next open time, and Calendly's own reason when the calendar cannot be
7965
+ * booked. Needs no open slot, so it reads a fully-booked calendar too. Takes a profile url
7966
+ * ("https://calendly.com/eric-ciarla"), an event url, or a one-off share link
7967
+ * ("https://calendly.com/d/ctbt-d45-rgb/simbie-ai-demo"). A profile with several events
7968
+ * returns `event: null` and the list unless `opts.event` names one. Never books anything.
7969
+ */
7970
+ getBookingForm(url: string, opts?: CalendlyBookingFormOptions): Promise<CalendlyBookingForm>;
7971
+
7972
+ /**
7973
+ * Finds a person's own Calendly page from their full name, and optionally their company (pass
7974
+ * it — "caleb-firecrawl" is found only by the company shape). Checks the slug shapes that
7975
+ * measured reliable (first-last, firstlast, lastfirst, first-company, firstcompany,
7976
+ * last-company, and the bare company slug — which often belongs to a stranger, so read
7977
+ * `ownerName`) and returns every one that exists with the name the page itself shows and
7978
+ * `nameMatches`. A match is a GUESS: a namesake with the same first and last name passes, so
7979
+ * tie the page to the company before relying on it. Search engines do not index Calendly
7980
+ * pages, so this is the way to find one.
7981
+ */
7982
+ findProfiles(name: string, company?: string): Promise<CalendlyFindProfilesResult>;
7653
7983
  }
7654
7984
  }
7655
7985
 
@@ -10485,6 +10815,19 @@ interface CuriocityListEventsQuery {
10485
10815
  }
10486
10816
  }
10487
10817
 
10818
+ declare namespace BowmarkProvider_currency_exchange {
10819
+ // ── ExchangeRate-API — the unit's own declarations, verbatim ──
10820
+ interface currency_exchangeRow {
10821
+ rate: number;
10822
+ }
10823
+
10824
+ /** Get real-time exchange rates from ExchangeRate-API */
10825
+ interface Unit {
10826
+ /** Returns the current exchange rate between two currencies */
10827
+ getRate(from: string, to: string): Promise<currency_exchangeRow>;
10828
+ }
10829
+ }
10830
+
10488
10831
  declare namespace BowmarkProvider_cyberpowerpc {
10489
10832
  // ── CyberPowerPC — the unit's own declarations, verbatim ──
10490
10833
  interface CyberpowerpcConfigurator {
@@ -11025,6 +11368,29 @@ interface DdCartHandoff {
11025
11368
  }
11026
11369
  }
11027
11370
 
11371
+ declare namespace BowmarkProvider_dell {
11372
+ // ── Dell — the unit's own declarations, verbatim ──
11373
+ interface SearchForumThreadsArgs {
11374
+ query: string;
11375
+ }
11376
+
11377
+ interface DellForumThread {
11378
+ title: string;
11379
+ url: string;
11380
+ postCount: number;
11381
+ }
11382
+
11383
+ /** Search Dell's community forum for discussion threads. */
11384
+ interface Unit {
11385
+ /**
11386
+ * Search Dell community forums for threads matching a query — needs a topic or keywords (e.g.
11387
+ * "storage issues", "laptop battery"), never a bare "search the forum" with nothing to search
11388
+ * for.
11389
+ */
11390
+ searchForumThreads(args: SearchForumThreadsArgs): Promise<DellForumThread[]>;
11391
+ }
11392
+ }
11393
+
11028
11394
  declare namespace BowmarkProvider_deltadentalma {
11029
11395
  // ── Delta Dental of Massachusetts — the unit's own declarations, verbatim ──
11030
11396
  // Delta Dental of Massachusetts's OWN shapes — not a capability contract.
@@ -12354,7 +12720,8 @@ interface etsyListing {
12354
12720
  * Searches Etsy's live catalog of active listings by keyword, via Etsy's documented Open API
12355
12721
  * v3, and returns the matching listings — id, title, price, currency, quantity available, tags
12356
12722
  * and the listing's own etsy.com URL. `limit` caps the row count (default 10, Etsy's own
12357
- * ceiling 100). Requires an Etsy developer API key see this provider's `auth`.
12723
+ * ceiling 100). Uses Bowmark's Etsy key and charges each request to your account; send your
12724
+ * own key as the `x-bowmark-vendor-key-etsy` header instead.
12358
12725
  */
12359
12726
  search(args: string | { query: string; limit?: number }): Promise<etsyListing[]>;
12360
12727
  }
@@ -14608,6 +14975,19 @@ interface GithubListReleasesResult {
14608
14975
  warnings: string[];
14609
14976
  }
14610
14977
 
14978
+ interface GithubProfileReadme {
14979
+ login: string;
14980
+ name: string | null;
14981
+ company: string | null;
14982
+ blog: string | null; // the website they list on their profile
14983
+ bio: string | null;
14984
+ twitterUsername: string | null;
14985
+ profileUrl: string;
14986
+ readme: string | null; // the profile README's raw markdown; null when they have none
14987
+ readmeUrl: string | null;
14988
+ warnings: string[];
14989
+ }
14990
+
14611
14991
  /**
14612
14992
  * GitHub's own REST API, keyless. Built: a public repo's commit log (sha, author, date,
14613
14993
  * message), paged and windowed; a public repo's release history (tag, name, dates, release
@@ -14639,6 +15019,16 @@ interface GithubListReleasesResult {
14639
15019
  * `releases: []`, not a throw.
14640
15020
  */
14641
15021
  listReleases(owner: string, repo: string, options?: GithubListReleasesOptions): Promise<GithubListReleasesResult>;
15022
+
15023
+ /**
15024
+ * Reads a person's own GitHub profile — display name, company, the website they list, bio, X
15025
+ * handle — and the raw markdown of their profile README (the `<handle>/<handle>` repo GitHub
15026
+ * shows on the profile page), which is where people put a personal site, a booking link or
15027
+ * contact details. Takes a username, `@handle` or github.com url. `readme` is null when they
15028
+ * have no profile README. Unauthenticated calls share GitHub's 60 requests/hour per IP; this
15029
+ * spends two. THROWS on an unknown user or a rate limit.
15030
+ */
15031
+ getProfileReadme(handle: string): Promise<GithubProfileReadme>;
14642
15032
  }
14643
15033
  }
14644
15034
 
@@ -14971,6 +15361,189 @@ interface GooglePriceGraph {
14971
15361
  }
14972
15362
  }
14973
15363
 
15364
+ declare namespace BowmarkProvider_google_maps {
15365
+ // ── Google Maps — the unit's own declarations, verbatim ──
15366
+ interface GoogleMapsPlace {
15367
+ featureId: string;
15368
+ name: string;
15369
+ }
15370
+ interface SuggestPlacesArgs {
15371
+ query: string;
15372
+ }
15373
+ interface SearchPlacesArgs {
15374
+ query: string;
15375
+ }
15376
+ interface SearchPlacesResult {
15377
+ featureId: string;
15378
+ name: string;
15379
+ address: string;
15380
+ coordinates: { lat: number; lng: number } | null;
15381
+ categories: string[];
15382
+ rating?: number;
15383
+ reviewCount?: number;
15384
+ }
15385
+ interface GeocodeAddressArgs {
15386
+ address: string;
15387
+ }
15388
+ interface GeocodeAddressResult {
15389
+ featureId: string;
15390
+ name: string;
15391
+ formattedAddress: string;
15392
+ coordinates: { lat: number; lng: number } | null;
15393
+ }
15394
+ interface GetPlaceArgs {
15395
+ query: string;
15396
+ }
15397
+ interface GetPlaceResult {
15398
+ featureId: string;
15399
+ name: string;
15400
+ address: string;
15401
+ coordinates: { lat: number; lng: number } | null;
15402
+ categories: string[];
15403
+ neighborhood?: string;
15404
+ phone?: string;
15405
+ website?: string;
15406
+ rating?: number;
15407
+ reviewCount?: number;
15408
+ hours?: { day: string; hours: string[] }[];
15409
+ }
15410
+ interface ListReviewsArgs {
15411
+ query: string;
15412
+ }
15413
+ interface Review {
15414
+ author: string;
15415
+ authorId?: string;
15416
+ rating: number;
15417
+ text: string;
15418
+ relativeDate?: string;
15419
+ }
15420
+
15421
+ /**
15422
+ * Local business search on Google Maps — find places by what a person would say, then read the
15423
+ * address, hours, rating, reviews and route. suggestPlaces (autocomplete), searchPlaces (the
15424
+ * door), geocodeAddress, getPlace and listReviews are built; everything else is still a
15425
+ * declared stub.
15426
+ */
15427
+ interface Unit {
15428
+ /**
15429
+ * Google Maps' own autocomplete for a half-typed query — what the search box offers while
15430
+ * somebody types. Returns the completed queries, ready to hand to searchPlaces once it lands.
15431
+ */
15432
+ suggestPlaces(args: SuggestPlacesArgs): Promise<string[]>;
15433
+
15434
+ /**
15435
+ * The door every other Maps function chains off. Takes what a person would say — "coffee shops
15436
+ * in Seattle WA", "pizza near Austin TX" — and returns the ranked places Google shows for it:
15437
+ * feature id, name, address, coordinates and categories, plus rating and review count when the
15438
+ * site's response carries them. The location lives in the query text; Google resolves it from
15439
+ * there rather than from a separate coordinate.
15440
+ */
15441
+ searchPlaces(args: SearchPlacesArgs): Promise<SearchPlacesResult[]>;
15442
+
15443
+ /**
15444
+ * A street address, a city, or a business name in — the matching Google Maps place, its
15445
+ * feature id and its coordinates out. Rides the same door as searchPlaces (a second reading of
15446
+ * the same response), so it only resolves a query that names ONE place; a category or
15447
+ * list-style query throws.
15448
+ */
15449
+ geocodeAddress(args: GeocodeAddressArgs): Promise<GeocodeAddressResult>;
15450
+
15451
+ /**
15452
+ * Everything Google Maps shows on one business's panel — name, full address, coordinates,
15453
+ * category, neighborhood, phone, website, rating, review count and weekly hours, each present
15454
+ * only when the site's own response carried it. A THIRD reading of searchPlaces' door: takes
15455
+ * the same resolving query geocodeAddress does (typically a name plus address, since this does
15456
+ * not take a feature id — measured live, neither the raw id nor a cid string resolves through
15457
+ * this door), and throws when the query names a category or list rather than one business.
15458
+ */
15459
+ getPlace(args: GetPlaceArgs): Promise<GetPlaceResult>;
15460
+
15461
+ /**
15462
+ * The reviews Google Maps shows on a business's own panel — up to 5, each with author, star
15463
+ * rating, review text and the site's own relative date. A FOURTH reading of searchPlaces' door
15464
+ * (the same record getPlace reads, one section further in), not the listugcposts route the
15465
+ * survey planned: that route needed a session token minted by a place-page bootstrap that was
15466
+ * never cracked, but the same reviews the token would have fetched are already sitting in the
15467
+ * panel response. Takes the same resolving query getPlace does. Returns [] for a place with no
15468
+ * reviews rather than throwing; throws only when the query itself does not resolve to one
15469
+ * place.
15470
+ */
15471
+ listReviews(args: ListReviewsArgs): Promise<Review[]>;
15472
+ }
15473
+ }
15474
+
15475
+ declare namespace BowmarkProvider_google_news {
15476
+ // ── Google News — the unit's own declarations, verbatim ──
15477
+ interface GoogleNewsClusterEntry {
15478
+ title: string;
15479
+ link: string;
15480
+ publisher: string;
15481
+ }
15482
+ interface GoogleNewsArticle {
15483
+ articleId: string;
15484
+ title: string;
15485
+ link: string;
15486
+ publisher: string;
15487
+ publisherUrl: string | null;
15488
+ publishedAt: string | null;
15489
+ cluster: GoogleNewsClusterEntry[];
15490
+ }
15491
+ interface GoogleNewsSearchResult {
15492
+ query: string;
15493
+ articles: GoogleNewsArticle[];
15494
+ }
15495
+ interface GoogleNewsTopStories {
15496
+ title: string;
15497
+ clusters: GoogleNewsArticle[];
15498
+ }
15499
+ interface GoogleNewsTopicHeadlines {
15500
+ section: "World" | "Nation" | "Business" | "Technology" | "Entertainment" | "Sports" | "Science" | "Health";
15501
+ title: string;
15502
+ articles: GoogleNewsArticle[];
15503
+ }
15504
+
15505
+ /**
15506
+ * Headlines from every publisher at once — today's top stories as clusters, a section or a
15507
+ * city's local news, and everything indexed about a subject with Google's own when: and site:
15508
+ * operators. searchNews (the door) and topStories are built; everything else is still a
15509
+ * declared stub.
15510
+ */
15511
+ interface Unit {
15512
+ /**
15513
+ * Everything Google News has indexed about a subject, across every publisher at once —
15514
+ * headline, publisher, publication time and the Google News link, newest first. `query` is
15515
+ * exactly what a person would type into Google News' own search box, and Google's own
15516
+ * operators work inside it: `when:1h`/`when:1d`/`when:7d` narrows the window,
15517
+ * `site:reuters.com` pins one publisher, quotes pin a phrase and `(a OR b)` unions two
15518
+ * subjects — measured 2026-09-15: `site:reuters.com tesla` returned 100 items of which 100
15519
+ * carried `<source>Reuters</source>`. This is the provider's main door: a caller holding only
15520
+ * words gets in here. A query that matches nothing returns an empty `articles` array rather
15521
+ * than throwing.
15522
+ */
15523
+ searchNews(query: string): Promise<GoogleNewsSearchResult>;
15524
+
15525
+ /**
15526
+ * What Google News is leading with right now — the front page, as ranked story CLUSTERS rather
15527
+ * than a flat list. Each entry carries the lead headline and publisher plus every other outlet
15528
+ * covering the same story, which is the one thing a single publisher's own feed can never give
15529
+ * a caller asking "what is everyone saying about this today". No arguments: the front page is
15530
+ * the whole ask.
15531
+ */
15532
+ topStories(): Promise<GoogleNewsTopStories>;
15533
+
15534
+ /**
15535
+ * The latest headlines in one of Google News' own eight sections — World, Nation, Business,
15536
+ * Technology, Entertainment, Sports, Science or Health — by section NAME, so a caller who has
15537
+ * only the word "technology" never has to hold an opaque topic id. The name is matched
15538
+ * case-insensitively against the closed list of eight; anything else throws before any request
15539
+ * is made, because an unrecognized section answers 200 with Google News' own app-shell HTML
15540
+ * rather than a 404 (measured 2026-09-15) — reading that as an empty section would be silently
15541
+ * wrong rather than refused.
15542
+ */
15543
+ listTopicHeadlines(section: string): Promise<GoogleNewsTopicHeadlines>;
15544
+ }
15545
+ }
15546
+
14974
15547
  declare namespace BowmarkProvider_gostoreit {
14975
15548
  // ── Go Store It — the unit's own declarations, verbatim ──
14976
15549
  interface GetFacilityUnitsArgs { facilityUrl: string; }
@@ -15608,6 +16181,14 @@ interface HavenPricingProgram {
15608
16181
 
15609
16182
  interface HavenPricingProgramsResult { programs: HavenPricingProgram[] }
15610
16183
 
16184
+ interface HavenListPricingProgramsResult {
16185
+ property: HavenPropertyDetails;
16186
+ state: string | null; // read off the caller's own address, e.g. "CA"
16187
+ programs: HavenPricingProgram[]; // filtered to what `state` qualifies for
16188
+ }
16189
+
16190
+ interface HavenListPricingProgramsArgs { address: string }
16191
+
15611
16192
  /**
15612
16193
  * Haven Energy home battery quoting — read a US address's own property attributes (home size,
15613
16194
  * county, energy-community status) the way Haven's /quote flow does, and read the site's own
@@ -15633,6 +16214,16 @@ interface HavenPricingProgramsResult { programs: HavenPricingProgram[] }
15633
16214
  * county/utility context to narrow to the programs a specific home actually qualifies for.
15634
16215
  */
15635
16216
  getPricingPrograms(): Promise<HavenPricingProgramsResult>;
16217
+
16218
+ /**
16219
+ * One call for the question getPropertyDetails + getPricingPrograms need composing to answer:
16220
+ * which of Haven's active programs does THIS address actually qualify for. Reads the property
16221
+ * attributes and the full program table (the same two live calls the two other functions make)
16222
+ * and filters to the state parsed out of the address string. `state` is null and `programs` is
16223
+ * the full unfiltered table when no 2-letter state code could be read from the address —
16224
+ * Haven's own property-details response never returns one to fall back on.
16225
+ */
16226
+ listPricingPrograms(arg0: HavenListPricingProgramsArgs): Promise<HavenListPricingProgramsResult>;
15636
16227
  }
15637
16228
  }
15638
16229
 
@@ -15697,6 +16288,32 @@ interface HaydenhomesSearchFilters {
15697
16288
  }
15698
16289
  }
15699
16290
 
16291
+ declare namespace BowmarkProvider_hccts {
16292
+ // ── hccts.org Online Application Appointment Booking — the unit's own declarations, verbatim ──
16293
+ interface ApplicationStatus {
16294
+ available: boolean;
16295
+ formUrl: string;
16296
+ message: string;
16297
+ lastChecked: string;
16298
+ }
16299
+
16300
+ interface CheckApplicationAvailabilityArgs {
16301
+ refresh?: boolean;
16302
+ }
16303
+
16304
+ /**
16305
+ * Checks application availability and appointment scheduling for Highlands' adult education
16306
+ * programs.
16307
+ */
16308
+ interface Unit {
16309
+ /**
16310
+ * Checks if the HCCTS online application form is currently accessible and returns the
16311
+ * application status.
16312
+ */
16313
+ checkApplicationAvailability(args: CheckApplicationAvailabilityArgs): Promise<ApplicationStatus>;
16314
+ }
16315
+ }
16316
+
15700
16317
  declare namespace BowmarkProvider_healthcare_gov {
15701
16318
  // ── HealthCare.gov — the unit's own declarations, verbatim ──
15702
16319
  interface healthcare_govPlan {
@@ -19229,12 +19846,14 @@ interface KeepaProduct { asin: string; domainId: number; title: string; csv?: un
19229
19846
 
19230
19847
  /**
19231
19848
  * Keepa's documented Amazon product API — reads a product's native price history and metadata
19232
- * by ASIN. Requires a caller-provided Keepa API key.
19849
+ * by ASIN. Uses Bowmark's Keepa key and charges each request to your account; send your own
19850
+ * key as the `x-bowmark-vendor-key-keepa` header to spend your own Keepa tokens instead.
19233
19851
  */
19234
19852
  interface Unit {
19235
19853
  /**
19236
19854
  * Reads Keepa's native Amazon product record and compact price-history series for one ASIN.
19237
- * Requires a caller-provided Keepa API key.
19855
+ * Uses Bowmark's Keepa key and charges each request to your account; send your own key as the
19856
+ * `x-bowmark-vendor-key-keepa` header to spend your own Keepa tokens instead.
19238
19857
  */
19239
19858
  getProduct(args: { asin: string; domain?: number; stats?: number }): Promise<KeepaProductResult>;
19240
19859
  }
@@ -27356,6 +27975,47 @@ interface SemihandmadePriceResult {
27356
27975
  }
27357
27976
  }
27358
27977
 
27978
+ declare namespace BowmarkProvider_serper {
27979
+ // ── Serper — the unit's own declarations, verbatim ──
27980
+ interface SerperOrganicResult {
27981
+ position: number;
27982
+ title: string;
27983
+ link: string; // the destination url
27984
+ snippet: string | null;
27985
+ date: string | null;
27986
+ }
27987
+
27988
+ interface SerperSearchOptions {
27989
+ num?: number; // 1-100, default 10
27990
+ gl?: string; // country, e.g. "us"
27991
+ hl?: string; // language, e.g. "en"
27992
+ }
27993
+
27994
+ interface SerperSearchResult {
27995
+ query: string;
27996
+ results: SerperOrganicResult[]; // empty only when Google matched nothing
27997
+ credits: number | null; // Serper credits this search spent
27998
+ warnings: string[];
27999
+ }
28000
+
28001
+ /**
28002
+ * Google's own search results as JSON through Serper's API — honours site:, quoted phrases and
28003
+ * every other Google operator, in about a second. Uses Bowmark's Serper key and charges each
28004
+ * search to your account, or your own key sent as the `x-bowmark-vendor-key-serper` header.
28005
+ */
28006
+ interface Unit {
28007
+ /**
28008
+ * Runs a Google search and returns Google's organic results — position, title, destination
28009
+ * url, snippet — with every Google operator honoured. `site:cal.com "Chris Field"` returns
28010
+ * only cal.com pages naming him (cal.com/analytics/quick-chat among them), which is how to
28011
+ * find a page on one site by any words printed on it. An empty `results` is Google matching
28012
+ * nothing. Uses Bowmark's Serper key and charges each search to your account; send your own
28013
+ * key as the `x-bowmark-vendor-key-serper` header to spend your own credits instead.
28014
+ */
28015
+ searchGoogle(query: string, opts?: SerperSearchOptions): Promise<SerperSearchResult>;
28016
+ }
28017
+ }
28018
+
27359
28019
  declare namespace BowmarkProvider_sitmeanssit {
27360
28020
  // ── Sit Means Sit — the unit's own declarations, verbatim ──
27361
28021
  interface SitmeanssitLocation {
@@ -32690,6 +33350,7 @@ interface BowmarkProviders {
32690
33350
  cruiselakegeneva: BowmarkProvider_cruiselakegeneva.Unit;
32691
33351
  culturefly: BowmarkProvider_culturefly.Unit;
32692
33352
  curiocity: BowmarkProvider_curiocity.Unit;
33353
+ currency_exchange: BowmarkProvider_currency_exchange.Unit;
32693
33354
  cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
32694
33355
  dahlconsulting: BowmarkProvider_dahlconsulting.Unit;
32695
33356
  dansons: BowmarkProvider_dansons.Unit;
@@ -32697,6 +33358,7 @@ interface BowmarkProviders {
32697
33358
  deangroup: BowmarkProvider_deangroup.Unit;
32698
33359
  decked: BowmarkProvider_decked.Unit;
32699
33360
  decksdirect: BowmarkProvider_decksdirect.Unit;
33361
+ dell: BowmarkProvider_dell.Unit;
32700
33362
  deltadentalma: BowmarkProvider_deltadentalma.Unit;
32701
33363
  dentalplans: BowmarkProvider_dentalplans.Unit;
32702
33364
  detailxperts: BowmarkProvider_detailxperts.Unit;
@@ -32754,6 +33416,8 @@ interface BowmarkProviders {
32754
33416
  goloadup: BowmarkProvider_goloadup.Unit;
32755
33417
  goodway: BowmarkProvider_goodway.Unit;
32756
33418
  google_flights: BowmarkProvider_google_flights.Unit;
33419
+ google_maps: BowmarkProvider_google_maps.Unit;
33420
+ google_news: BowmarkProvider_google_news.Unit;
32757
33421
  gostoreit: BowmarkProvider_gostoreit.Unit;
32758
33422
  gotchacovered: BowmarkProvider_gotchacovered.Unit;
32759
33423
  grainger: BowmarkProvider_grainger.Unit;
@@ -32767,6 +33431,7 @@ interface BowmarkProviders {
32767
33431
  hauslabs: BowmarkProvider_hauslabs.Unit;
32768
33432
  havenenergy: BowmarkProvider_havenenergy.Unit;
32769
33433
  haydenhomes: BowmarkProvider_haydenhomes.Unit;
33434
+ hccts: BowmarkProvider_hccts.Unit;
32770
33435
  healthcare_gov: BowmarkProvider_healthcare_gov.Unit;
32771
33436
  heatherwood: BowmarkProvider_heatherwood.Unit;
32772
33437
  hellofresh: BowmarkProvider_hellofresh.Unit;
@@ -32903,6 +33568,7 @@ interface BowmarkProviders {
32903
33568
  selectblinds: BowmarkProvider_selectblinds.Unit;
32904
33569
  sellcell: BowmarkProvider_sellcell.Unit;
32905
33570
  semihandmade: BowmarkProvider_semihandmade.Unit;
33571
+ serper: BowmarkProvider_serper.Unit;
32906
33572
  sitmeanssit: BowmarkProvider_sitmeanssit.Unit;
32907
33573
  sixflags: BowmarkProvider_sixflags.Unit;
32908
33574
  smartsign: BowmarkProvider_smartsign.Unit;
@@ -84690,11 +85356,13 @@ interface BowmarkProviders {
84690
85356
  * `run()` script, and the Proxy over HTTP in a caller's own process. They are
84691
85357
  * generated once precisely so those two cannot drift. */
84692
85358
  interface BowmarkLibrary {
85359
+ booking_links: BowmarkCapability_booking_links.Unit;
84693
85360
  bundles: BowmarkCapability_bundles.Unit;
84694
85361
  cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
84695
85362
  cars: BowmarkCapability_cars.Unit;
84696
85363
  costume_size_check: BowmarkCapability_costume_size_check.Unit;
84697
85364
  coworking: BowmarkCapability_coworking.Unit;
85365
+ currency_exchange: BowmarkCapability_currency_exchange.Unit;
84698
85366
  custom_sofa_configurator: BowmarkCapability_custom_sofa_configurator.Unit;
84699
85367
  delivery: BowmarkCapability_delivery.Unit;
84700
85368
  developer_api_key_signup: BowmarkCapability_developer_api_key_signup.Unit;