mastra-scavio 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -49,6 +49,8 @@ __export(index_exports, {
49
49
  createScavioCompaniesHouseSearchTool: () => createScavioCompaniesHouseSearchTool,
50
50
  createScavioCrawlStatusTool: () => createScavioCrawlStatusTool,
51
51
  createScavioCrawlWebsiteTool: () => createScavioCrawlWebsiteTool,
52
+ createScavioDecathlonProductTool: () => createScavioDecathlonProductTool,
53
+ createScavioDecathlonSearchTool: () => createScavioDecathlonSearchTool,
52
54
  createScavioEbayProductTool: () => createScavioEbayProductTool,
53
55
  createScavioEbaySearchTool: () => createScavioEbaySearchTool,
54
56
  createScavioEbaySellerTool: () => createScavioEbaySellerTool,
@@ -227,6 +229,7 @@ __export(index_exports, {
227
229
  createScavioZillowAgentReviewsTool: () => createScavioZillowAgentReviewsTool,
228
230
  createScavioZillowPropertyTool: () => createScavioZillowPropertyTool,
229
231
  createScavioZillowSearchTool: () => createScavioZillowSearchTool,
232
+ decathlonToolSpecs: () => decathlonToolSpecs,
230
233
  ebayToolSpecs: () => ebayToolSpecs,
231
234
  extractToolSpecs: () => extractToolSpecs,
232
235
  extractWebToolSpecs: () => extractWebToolSpecs,
@@ -296,6 +299,7 @@ var SCAVIO_PLATFORMS = [
296
299
  "home-depot",
297
300
  "heb",
298
301
  "kroger",
302
+ "decathlon",
299
303
  "zillow",
300
304
  "booking",
301
305
  "tripadvisor",
@@ -2815,11 +2819,14 @@ var hebToolSpecs = [
2815
2819
  platform: "heb",
2816
2820
  endpoint: "/api/v1/heb/search",
2817
2821
  credits: 2,
2818
- description: "Search HEB grocery products: price in cents, sale status, unit price, size, UPC, stock, EBT/SNAP eligibility, aisle location and product URL. Costs 2 credits.",
2822
+ description: "Search HEB grocery products: price in cents, sale status, unit price, size, UPC, stock, EBT/SNAP eligibility, aisle location and product URL. Pass store_id for one store's prices, stock and assortment. Costs 2 credits.",
2819
2823
  inputSchema: import_zod18.z.object({
2820
2824
  query: import_zod18.z.string().describe("Search keywords (1-200 characters)."),
2821
2825
  page: import_zod18.z.number().int().optional().describe("Results page, 1-based (1-100)."),
2822
- page_size: import_zod18.z.number().int().optional().describe("Results per page, 1-60. Server default 30.")
2826
+ page_size: import_zod18.z.number().int().optional().describe("Results per page, 1-60. Defaults to 60."),
2827
+ store_id: import_zod18.z.string().optional().describe(
2828
+ "HEB store number from the HEB stores tool (store_number), e.g. '441'. Prices, stock, aisle location and assortment come from that store; the store used is echoed in data.store {store_id, name}. US only. Omit for HEB's default store."
2829
+ )
2823
2830
  }),
2824
2831
  call: (client, input) => client.heb.search(input)
2825
2832
  }),
@@ -2829,13 +2836,16 @@ var hebToolSpecs = [
2829
2836
  platform: "heb",
2830
2837
  endpoint: "/api/v1/heb/product",
2831
2838
  credits: 2,
2832
- description: "Full HEB product detail: nutrition facts, ingredients, description, images, similar products, coupons, EBT/SNAP eligibility and breadcrumbs. Pass product_url (from search) or slug + product_id. Costs 2 credits.",
2839
+ description: "Full HEB product detail: nutrition facts, ingredients, description, images, similar products, coupons, EBT/SNAP eligibility and breadcrumbs. Pass product_url (from search) or slug + product_id; with store_id, product_id alone works and price, stock and aisle are for that store. Costs 2 credits.",
2833
2840
  inputSchema: import_zod18.z.object({
2834
2841
  product_url: import_zod18.z.string().optional().describe(
2835
2842
  'Full or relative product URL from heb.com (e.g. "/product-detail/central-market-organics-whole-milk-1-gal/931316"). Preferred over slug + product_id.'
2836
2843
  ),
2837
- product_id: import_zod18.z.string().optional().describe("HEB product id (numeric id at the end of a product URL). Requires slug."),
2838
- slug: import_zod18.z.string().optional().describe("Product slug (readable part of the URL). Required with product_id.")
2844
+ product_id: import_zod18.z.string().optional().describe("HEB product id. Needs slug, unless store_id is set (then product_id alone works)."),
2845
+ slug: import_zod18.z.string().optional().describe("Product slug (readable part of the URL). Required with product_id unless store_id is set."),
2846
+ store_id: import_zod18.z.string().optional().describe(
2847
+ "HEB store number from the HEB stores tool (store_number), e.g. '441'. Prices, stock, aisle location and assortment come from that store; the store used is echoed in data.store {store_id, name}. US only. Omit for HEB's default store."
2848
+ )
2839
2849
  }),
2840
2850
  call: (client, input) => client.heb.product(input)
2841
2851
  }),
@@ -2893,8 +2903,44 @@ var krogerToolSpecs = [
2893
2903
  var createScavioKrogerSearchTool = toolFactory(krogerToolSpecs, "scavioKrogerSearch");
2894
2904
  var createScavioKrogerProductTool = toolFactory(krogerToolSpecs, "scavioKrogerProduct");
2895
2905
 
2896
- // src/zillow.ts
2906
+ // src/decathlon.ts
2897
2907
  var import_zod20 = require("zod");
2908
+ var countryEnum = import_zod20.z.enum(["fr", "es", "it", "in", "uk", "pt", "net"]);
2909
+ var decathlonToolSpecs = [
2910
+ defineScavioTool({
2911
+ key: "scavioDecathlonSearch",
2912
+ id: "scavio-decathlon-search",
2913
+ platform: "decathlon",
2914
+ endpoint: "/api/v1/decathlon/search",
2915
+ credits: 2,
2916
+ description: "Search Decathlon products by keyword across 7 country domains (FR, ES, IT, IN, UK, PT, NET). Returns product name, brand, price (cents), currency, availability, rating, review count and image. Costs 2 credits.",
2917
+ inputSchema: import_zod20.z.object({
2918
+ query: import_zod20.z.string().describe("Search keywords (1-200 characters)."),
2919
+ country: countryEnum.describe("Country domain."),
2920
+ page: import_zod20.z.number().int().optional().describe("Results page, 1-based (1-50).")
2921
+ }),
2922
+ call: (client, input) => client.decathlon.search(input)
2923
+ }),
2924
+ defineScavioTool({
2925
+ key: "scavioDecathlonProduct",
2926
+ id: "scavio-decathlon-product",
2927
+ platform: "decathlon",
2928
+ endpoint: "/api/v1/decathlon/product",
2929
+ credits: 2,
2930
+ description: "Full Decathlon product detail by URL or product ID: description, images, SKU, GTIN, color, price (cents), list price, availability, offers/variants, rating, review count, category and breadcrumbs. Supports all 7 country domains. Costs 2 credits.",
2931
+ inputSchema: import_zod20.z.object({
2932
+ product_url: import_zod20.z.string().optional().describe("Full or relative product URL from any Decathlon domain. Preferred."),
2933
+ product_id: import_zod20.z.string().optional().describe("Decathlon numeric product ID."),
2934
+ country: countryEnum.describe("Country domain.")
2935
+ }),
2936
+ call: (client, input) => client.decathlon.product(input)
2937
+ })
2938
+ ];
2939
+ var createScavioDecathlonSearchTool = toolFactory(decathlonToolSpecs, "scavioDecathlonSearch");
2940
+ var createScavioDecathlonProductTool = toolFactory(decathlonToolSpecs, "scavioDecathlonProduct");
2941
+
2942
+ // src/zillow.ts
2943
+ var import_zod21 = require("zod");
2898
2944
  var zillowToolSpecs = [
2899
2945
  defineScavioTool({
2900
2946
  key: "scavioZillowSearch",
@@ -2903,15 +2949,15 @@ var zillowToolSpecs = [
2903
2949
  endpoint: "/api/v1/zillow/search",
2904
2950
  credits: 1,
2905
2951
  description: "Zillow listings in a region: price, beds, baths, living area, Zestimate, coordinates, images, days on market. A bare ZIP works alone but cannot be combined with a filter or a sort. Costs 1 credit.",
2906
- inputSchema: import_zod20.z.object({
2907
- location: import_zod20.z.string().describe(
2952
+ inputSchema: import_zod21.z.object({
2953
+ location: import_zod21.z.string().describe(
2908
2954
  "Region to search (1-200 characters): a Zillow slug ('austin-tx'), a human form ('Austin, TX'), a ZIP, or a pasted zillow.com search URL. A ZIP works alone but cannot be combined with a filter or sort; an unresolvable region is a 404."
2909
2955
  ),
2910
- listing_status: import_zod20.z.enum(["for_sale", "for_rent", "sold"]).optional().describe(
2956
+ listing_status: import_zod21.z.enum(["for_sale", "for_rent", "sold"]).optional().describe(
2911
2957
  "Which listings to return. Defaults to 'for_sale'."
2912
2958
  ),
2913
- page: import_zod20.z.number().int().optional().describe("Results page, 1-based."),
2914
- sort: import_zod20.z.enum([
2959
+ page: import_zod21.z.number().int().optional().describe("Results page, 1-based."),
2960
+ sort: import_zod21.z.enum([
2915
2961
  "relevance",
2916
2962
  "recommended",
2917
2963
  "newest",
@@ -2929,44 +2975,44 @@ var zillowToolSpecs = [
2929
2975
  ]).optional().describe(
2930
2976
  "Result sort order. Sorts that rank against a signed-in profile (saved/featured/personalised) are unsupported - we are never signed in."
2931
2977
  ),
2932
- min_price: import_zod20.z.number().optional().describe(
2978
+ min_price: import_zod21.z.number().optional().describe(
2933
2979
  "Minimum price, inclusive (0 or greater). On listing_status='for_rent' this is MONTHLY RENT - Zillow files rent under its payment filter."
2934
2980
  ),
2935
- max_price: import_zod20.z.number().optional().describe(
2981
+ max_price: import_zod21.z.number().optional().describe(
2936
2982
  "Maximum price, inclusive (0 or greater). On listing_status='for_rent' this is MONTHLY RENT."
2937
2983
  ),
2938
- beds_min: import_zod20.z.number().int().optional().describe(
2984
+ beds_min: import_zod21.z.number().int().optional().describe(
2939
2985
  "Minimum bedrooms; whole number, 0 or greater."
2940
2986
  ),
2941
- beds_max: import_zod20.z.number().int().optional().describe(
2987
+ beds_max: import_zod21.z.number().int().optional().describe(
2942
2988
  "Maximum bedrooms; whole number, 0 or greater."
2943
2989
  ),
2944
- baths_min: import_zod20.z.number().optional().describe(
2990
+ baths_min: import_zod21.z.number().optional().describe(
2945
2991
  "Minimum bathrooms, 0 or greater. Half-baths are allowed (1.5)."
2946
2992
  ),
2947
- baths_max: import_zod20.z.number().optional().describe(
2993
+ baths_max: import_zod21.z.number().optional().describe(
2948
2994
  "Maximum bathrooms, 0 or greater. Half-baths are allowed (1.5)."
2949
2995
  ),
2950
- sqft_min: import_zod20.z.number().int().optional().describe(
2996
+ sqft_min: import_zod21.z.number().int().optional().describe(
2951
2997
  "Minimum living area in square feet; whole number, 0 or greater."
2952
2998
  ),
2953
- sqft_max: import_zod20.z.number().int().optional().describe(
2999
+ sqft_max: import_zod21.z.number().int().optional().describe(
2954
3000
  "Maximum living area in square feet; whole number, 0 or greater."
2955
3001
  ),
2956
- lot_size_min: import_zod20.z.number().int().optional().describe(
3002
+ lot_size_min: import_zod21.z.number().int().optional().describe(
2957
3003
  "Minimum lot size in square feet; whole number, 0 or greater."
2958
3004
  ),
2959
- lot_size_max: import_zod20.z.number().int().optional().describe(
3005
+ lot_size_max: import_zod21.z.number().int().optional().describe(
2960
3006
  "Maximum lot size in square feet; whole number, 0 or greater."
2961
3007
  ),
2962
- year_built_min: import_zod20.z.number().int().optional().describe(
3008
+ year_built_min: import_zod21.z.number().int().optional().describe(
2963
3009
  "Earliest year built; whole number, 0 or greater."
2964
3010
  ),
2965
- year_built_max: import_zod20.z.number().int().optional().describe(
3011
+ year_built_max: import_zod21.z.number().int().optional().describe(
2966
3012
  "Latest year built; whole number, 0 or greater."
2967
3013
  ),
2968
- max_hoa: import_zod20.z.number().optional().describe("Maximum monthly HOA fee in dollars, 0 or greater."),
2969
- home_type: import_zod20.z.enum([
3014
+ max_hoa: import_zod21.z.number().optional().describe("Maximum monthly HOA fee in dollars, 0 or greater."),
3015
+ home_type: import_zod21.z.enum([
2970
3016
  "houses",
2971
3017
  "townhomes",
2972
3018
  "multi_family",
@@ -2977,21 +3023,21 @@ var zillowToolSpecs = [
2977
3023
  ]).optional().describe(
2978
3024
  "Property type filter."
2979
3025
  ),
2980
- days_on_zillow: import_zod20.z.enum(["1", "7", "14", "30", "90", "6m", "12m", "24m", "36m"]).optional().describe(
3026
+ days_on_zillow: import_zod21.z.enum(["1", "7", "14", "30", "90", "6m", "12m", "24m", "36m"]).optional().describe(
2981
3027
  "Listed - or, with listing_status='sold', sold - within the last N days. Closed enum: an unrecognised value returns the UNFILTERED set under a 200."
2982
3028
  ),
2983
- keywords: import_zod20.z.string().optional().describe(
3029
+ keywords: import_zod21.z.string().optional().describe(
2984
3030
  "Free-text match against the listing description (1-200 characters)."
2985
3031
  ),
2986
- has_pool: import_zod20.z.boolean().optional().describe("Only listings with a pool."),
2987
- has_garage: import_zod20.z.boolean().optional().describe("Only listings with a garage."),
2988
- has_air_conditioning: import_zod20.z.boolean().optional().describe("Only listings with air conditioning."),
2989
- is_waterfront: import_zod20.z.boolean().optional().describe("Only waterfront listings."),
2990
- has_basement: import_zod20.z.boolean().optional().describe("Only listings with a basement."),
2991
- is_new_construction: import_zod20.z.boolean().optional().describe("Only new-construction listings."),
2992
- has_open_house: import_zod20.z.boolean().optional().describe("Only listings with an upcoming open house."),
2993
- price_reduced: import_zod20.z.boolean().optional().describe("Only listings whose price was reduced."),
2994
- is_3d_tour: import_zod20.z.boolean().optional().describe("Only listings with a 3D tour.")
3032
+ has_pool: import_zod21.z.boolean().optional().describe("Only listings with a pool."),
3033
+ has_garage: import_zod21.z.boolean().optional().describe("Only listings with a garage."),
3034
+ has_air_conditioning: import_zod21.z.boolean().optional().describe("Only listings with air conditioning."),
3035
+ is_waterfront: import_zod21.z.boolean().optional().describe("Only waterfront listings."),
3036
+ has_basement: import_zod21.z.boolean().optional().describe("Only listings with a basement."),
3037
+ is_new_construction: import_zod21.z.boolean().optional().describe("Only new-construction listings."),
3038
+ has_open_house: import_zod21.z.boolean().optional().describe("Only listings with an upcoming open house."),
3039
+ price_reduced: import_zod21.z.boolean().optional().describe("Only listings whose price was reduced."),
3040
+ is_3d_tour: import_zod21.z.boolean().optional().describe("Only listings with a 3D tour.")
2995
3041
  }),
2996
3042
  call: (client, input) => client.zillow.search(input)
2997
3043
  }),
@@ -3002,8 +3048,8 @@ var zillowToolSpecs = [
3002
3048
  endpoint: "/api/v1/zillow/property",
3003
3049
  credits: 1,
3004
3050
  description: "Full Zillow listing: price and price history, Zestimate, tax history, RESO facts, rooms, schools, open houses, photos. Rental buildings return floor plans instead. Costs 1 credit.",
3005
- inputSchema: import_zod20.z.object({
3006
- zpid: import_zod20.z.string().describe(
3051
+ inputSchema: import_zod21.z.object({
3052
+ zpid: import_zod21.z.string().describe(
3007
3053
  "Zillow property id (e.g. '29414894'), a full /homedetails/ URL, or a rental building URL (zillow.com/apartments/...). The building form is required for buildings: they have no zpid a caller can see."
3008
3054
  )
3009
3055
  }),
@@ -3016,8 +3062,8 @@ var zillowToolSpecs = [
3016
3062
  endpoint: "/api/v1/zillow/reviews",
3017
3063
  credits: 1,
3018
3064
  description: "A Zillow AGENT's profile and reviews: rating, bodies with sub-ratings, specialties, licenses, service areas, sales counts. Zillow server-renders the first five. Costs 1 credit.",
3019
- inputSchema: import_zod20.z.object({
3020
- screen_name: import_zod20.z.string().describe(
3065
+ inputSchema: import_zod21.z.object({
3066
+ screen_name: import_zod21.z.string().describe(
3021
3067
  "Zillow agent profile screen name as it appears in zillow.com/profile/<name>/ (1-200 characters, may contain spaces), or a full profile URL."
3022
3068
  )
3023
3069
  }),
@@ -3032,7 +3078,7 @@ var createScavioZillowAgentReviewsTool = toolFactory(
3032
3078
  );
3033
3079
 
3034
3080
  // src/booking.ts
3035
- var import_zod21 = require("zod");
3081
+ var import_zod22 = require("zod");
3036
3082
  var bookingToolSpecs = [
3037
3083
  defineScavioTool({
3038
3084
  key: "scavioBookingSearch",
@@ -3041,14 +3087,14 @@ var bookingToolSpecs = [
3041
3087
  endpoint: "/api/v1/booking/search",
3042
3088
  credits: 1,
3043
3089
  description: "Booking.com properties for a destination and stay: live nightly price, review score, star rating, location, room type, deal badges. 25 properties per page. Provide destination or dest_id. Costs 1 credit.",
3044
- inputSchema: import_zod21.z.object({
3045
- destination: import_zod21.z.string().optional().describe(
3090
+ inputSchema: import_zod22.z.object({
3091
+ destination: import_zod22.z.string().optional().describe(
3046
3092
  "Destination to search, e.g. 'Paris' (1-200 characters). Required unless dest_id is given."
3047
3093
  ),
3048
- dest_id: import_zod21.z.string().optional().describe(
3094
+ dest_id: import_zod22.z.string().optional().describe(
3049
3095
  "Numeric Booking.com destination id, as an alternative to destination."
3050
3096
  ),
3051
- dest_type: import_zod21.z.enum([
3097
+ dest_type: import_zod22.z.enum([
3052
3098
  "city",
3053
3099
  "region",
3054
3100
  "country",
@@ -3059,10 +3105,10 @@ var bookingToolSpecs = [
3059
3105
  ]).optional().describe(
3060
3106
  "What dest_id refers to. Requires dest_id and is rejected without it, because Booking silently ignores a lone dest_type."
3061
3107
  ),
3062
- page: import_zod21.z.number().int().optional().describe(
3108
+ page: import_zod22.z.number().int().optional().describe(
3063
3109
  "Results page, 1-based. 25 properties per page, 1 credit each."
3064
3110
  ),
3065
- sort_by: import_zod21.z.enum([
3111
+ sort_by: import_zod22.z.enum([
3066
3112
  "popularity",
3067
3113
  "price_low",
3068
3114
  "price_high",
@@ -3074,39 +3120,39 @@ var bookingToolSpecs = [
3074
3120
  ]).optional().describe(
3075
3121
  "Result sort order (default 'popularity')."
3076
3122
  ),
3077
- min_price: import_zod21.z.number().optional().describe(
3123
+ min_price: import_zod22.z.number().optional().describe(
3078
3124
  "Minimum price PER NIGHT in `currency`, >= 0. Must not exceed max_price."
3079
3125
  ),
3080
- max_price: import_zod21.z.number().optional().describe("Maximum price PER NIGHT in `currency`, >= 0."),
3081
- stars: import_zod21.z.array(import_zod21.z.number().int()).optional().describe(
3126
+ max_price: import_zod22.z.number().optional().describe("Maximum price PER NIGHT in `currency`, >= 0."),
3127
+ stars: import_zod22.z.array(import_zod22.z.number().int()).optional().describe(
3082
3128
  "Star ratings to include, each 1-5, 1-5 values, OR'd together (e.g. [4, 5])."
3083
3129
  ),
3084
- min_review_score: import_zod21.z.enum(["6", "7", "8", "9"]).optional().describe(
3130
+ min_review_score: import_zod22.z.enum(["6", "7", "8", "9"]).optional().describe(
3085
3131
  "Minimum guest review score. Only '6', '7', '8' and '9' exist upstream; any other threshold is silently dropped."
3086
3132
  ),
3087
- property_type: import_zod21.z.union([
3088
- import_zod21.z.enum(["apartments", "hostels", "hotels", "motels", "resorts", "bed_and_breakfasts", "villas", "campgrounds", "vacation_homes", "lodges", "homestays"]),
3089
- import_zod21.z.number().int()
3133
+ property_type: import_zod22.z.union([
3134
+ import_zod22.z.enum(["apartments", "hostels", "hotels", "motels", "resorts", "bed_and_breakfasts", "villas", "campgrounds", "vacation_homes", "lodges", "homestays"]),
3135
+ import_zod22.z.number().int()
3090
3136
  ]).optional().describe(
3091
3137
  "Accommodation type by name, or a raw numeric Booking accommodation-type id (>= 1)."
3092
3138
  ),
3093
- free_cancellation: import_zod21.z.boolean().optional().describe(
3139
+ free_cancellation: import_zod22.z.boolean().optional().describe(
3094
3140
  "Only properties offering free cancellation."
3095
3141
  ),
3096
- no_prepayment: import_zod21.z.boolean().optional().describe("Only properties that take no prepayment."),
3097
- breakfast_included: import_zod21.z.boolean().optional().describe("Only rates that include breakfast."),
3098
- checkin: import_zod21.z.string().optional().describe(
3142
+ no_prepayment: import_zod22.z.boolean().optional().describe("Only properties that take no prepayment."),
3143
+ breakfast_included: import_zod22.z.boolean().optional().describe("Only rates that include breakfast."),
3144
+ checkin: import_zod22.z.string().optional().describe(
3099
3145
  "Check-in date, YYYY-MM-DD. Must be sent together with checkout: a lone checkin is ignored and Booking prices a default range of its own."
3100
3146
  ),
3101
- checkout: import_zod21.z.string().optional().describe(
3147
+ checkout: import_zod22.z.string().optional().describe(
3102
3148
  "Check-out date, YYYY-MM-DD. Must be later than checkin and sent together with it."
3103
3149
  ),
3104
- adults: import_zod21.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3105
- children_ages: import_zod21.z.array(import_zod21.z.number().int()).optional().describe(
3150
+ adults: import_zod22.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3151
+ children_ages: import_zod22.z.array(import_zod22.z.number().int()).optional().describe(
3106
3152
  "AGES of accompanying children, each 0-17, max 10 entries. Ages, not a count."
3107
3153
  ),
3108
- rooms: import_zod21.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3109
- currency: import_zod21.z.string().optional().describe(
3154
+ rooms: import_zod22.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3155
+ currency: import_zod22.z.string().optional().describe(
3110
3156
  "ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking picks a currency itself and identical requests can disagree."
3111
3157
  )
3112
3158
  }),
@@ -3119,25 +3165,25 @@ var bookingToolSpecs = [
3119
3165
  endpoint: "/api/v1/booking/hotel",
3120
3166
  credits: 1,
3121
3167
  description: "One Booking.com property in full: rooms and rate plans, facilities, house rules, check-in windows, policies, images, location and review scores, priced for the stay asked for. Chaining the `url` a search row returns is cheaper than a bare slug. Costs 1 credit.",
3122
- inputSchema: import_zod21.z.object({
3123
- hotel: import_zod21.z.string().describe(
3168
+ inputSchema: import_zod22.z.object({
3169
+ hotel: import_zod22.z.string().describe(
3124
3170
  "Booking.com property URL or the bare page slug (1-500 characters); query params are discarded."
3125
3171
  ),
3126
- country_code: import_zod21.z.string().optional().describe(
3172
+ country_code: import_zod22.z.string().optional().describe(
3127
3173
  "Two-letter country code for the property page (default 'us'). Only consulted for a bare slug, where a wrong one is a real, BILLED 404."
3128
3174
  ),
3129
- checkin: import_zod21.z.string().optional().describe(
3175
+ checkin: import_zod22.z.string().optional().describe(
3130
3176
  "Check-in date, YYYY-MM-DD. Must be sent together with checkout; omitting both prices a two-night range Booking chose, echoed back in the response."
3131
3177
  ),
3132
- checkout: import_zod21.z.string().optional().describe(
3178
+ checkout: import_zod22.z.string().optional().describe(
3133
3179
  "Check-out date, YYYY-MM-DD. Must be later than checkin and sent together with it."
3134
3180
  ),
3135
- adults: import_zod21.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3136
- children_ages: import_zod21.z.array(import_zod21.z.number().int()).optional().describe(
3181
+ adults: import_zod22.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3182
+ children_ages: import_zod22.z.array(import_zod22.z.number().int()).optional().describe(
3137
3183
  "AGES of accompanying children, each 0-17, max 10 entries. Ages, not a count."
3138
3184
  ),
3139
- rooms: import_zod21.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3140
- currency: import_zod21.z.string().optional().describe(
3185
+ rooms: import_zod22.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3186
+ currency: import_zod22.z.string().optional().describe(
3141
3187
  "ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking picks a currency itself and identical requests can disagree."
3142
3188
  )
3143
3189
  }),
@@ -3150,25 +3196,25 @@ var bookingToolSpecs = [
3150
3196
  endpoint: "/api/v1/booking/reviews",
3151
3197
  credits: 1,
3152
3198
  description: "Booking.com guest reviews for a property with the score breakdown by category and Booking's own praise/complaint summary. No page param: total_count is the whole review history, count is what this response holds. Costs 1 credit.",
3153
- inputSchema: import_zod21.z.object({
3154
- hotel: import_zod21.z.string().describe(
3199
+ inputSchema: import_zod22.z.object({
3200
+ hotel: import_zod22.z.string().describe(
3155
3201
  "Booking.com property URL or the bare page slug (1-500 characters); query params are discarded."
3156
3202
  ),
3157
- country_code: import_zod21.z.string().optional().describe(
3203
+ country_code: import_zod22.z.string().optional().describe(
3158
3204
  "Two-letter country code for the property page (default 'us'). Only consulted for a bare slug, where a wrong one is a real, BILLED 404."
3159
3205
  ),
3160
- checkin: import_zod21.z.string().optional().describe(
3206
+ checkin: import_zod22.z.string().optional().describe(
3161
3207
  "Check-in date, YYYY-MM-DD. Must be sent together with checkout; it prices the stay the review page is rendered for."
3162
3208
  ),
3163
- checkout: import_zod21.z.string().optional().describe(
3209
+ checkout: import_zod22.z.string().optional().describe(
3164
3210
  "Check-out date, YYYY-MM-DD. Must be later than checkin and sent together with it."
3165
3211
  ),
3166
- adults: import_zod21.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3167
- children_ages: import_zod21.z.array(import_zod21.z.number().int()).optional().describe(
3212
+ adults: import_zod22.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3213
+ children_ages: import_zod22.z.array(import_zod22.z.number().int()).optional().describe(
3168
3214
  "AGES of accompanying children, each 0-17, max 10 entries. Ages, not a count."
3169
3215
  ),
3170
- rooms: import_zod21.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3171
- currency: import_zod21.z.string().optional().describe(
3216
+ rooms: import_zod22.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3217
+ currency: import_zod22.z.string().optional().describe(
3172
3218
  "ISO 4217 currency for prices, 3 letters (default 'USD')."
3173
3219
  )
3174
3220
  }),
@@ -3180,7 +3226,7 @@ var createScavioBookingHotelTool = toolFactory(bookingToolSpecs, "scavioBookingH
3180
3226
  var createScavioBookingReviewsTool = toolFactory(bookingToolSpecs, "scavioBookingReviews");
3181
3227
 
3182
3228
  // src/tripadvisor.ts
3183
- var import_zod22 = require("zod");
3229
+ var import_zod23 = require("zod");
3184
3230
  var tripadvisorToolSpecs = [
3185
3231
  defineScavioTool({
3186
3232
  key: "scavioTripadvisorLocations",
@@ -3189,9 +3235,9 @@ var tripadvisorToolSpecs = [
3189
3235
  endpoint: "/api/v1/tripadvisor/locations",
3190
3236
  credits: 2,
3191
3237
  description: "START HERE: resolve a place or business NAME to the TripAdvisor geo_id / location_id pair every other TripAdvisor endpoint is keyed by. Up to 20 rows. Costs 2 credits.",
3192
- inputSchema: import_zod22.z.object({
3193
- query: import_zod22.z.string().describe("Place or business name to resolve (1-120 characters)."),
3194
- limit: import_zod22.z.number().int().optional().describe(
3238
+ inputSchema: import_zod23.z.object({
3239
+ query: import_zod23.z.string().describe("Place or business name to resolve (1-120 characters)."),
3240
+ limit: import_zod23.z.number().int().optional().describe(
3195
3241
  "Rows to return, 1-20 (default 12). Sizes the response only; there is no paging here."
3196
3242
  )
3197
3243
  }),
@@ -3204,17 +3250,17 @@ var tripadvisorToolSpecs = [
3204
3250
  endpoint: "/api/v1/tripadvisor/search",
3205
3251
  credits: 2,
3206
3252
  description: "Restaurants, hotels or attractions in a TripAdvisor geo, TripAdvisor-ranked: rating, review count, price band, address, coordinates, phone, hours, Travelers' Choice badge; each row carries the location_id + geo_id pair. 30 locations per page. Provide geo_id or url. Costs 2 credits.",
3207
- inputSchema: import_zod22.z.object({
3208
- geo_id: import_zod22.z.string().optional().describe(
3253
+ inputSchema: import_zod23.z.object({
3254
+ geo_id: import_zod23.z.string().optional().describe(
3209
3255
  "TripAdvisor geo id (1-500 characters): 30196, g30196, or a URL carrying one. Required unless url is given."
3210
3256
  ),
3211
- category: import_zod22.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3257
+ category: import_zod23.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3212
3258
  "Listing family to search (default 'restaurants')."
3213
3259
  ),
3214
- page: import_zod22.z.number().int().optional().describe(
3260
+ page: import_zod23.z.number().int().optional().describe(
3215
3261
  "Results page, 1-based. 30 locations per page; a page beyond the last is a 404, not an empty result."
3216
3262
  ),
3217
- url: import_zod22.z.string().optional().describe(
3263
+ url: import_zod23.z.string().optional().describe(
3218
3264
  "Full tripadvisor.com listing URL (1-500 characters), as an alternative to geo_id; country sites are accepted."
3219
3265
  )
3220
3266
  }),
@@ -3227,17 +3273,17 @@ var tripadvisorToolSpecs = [
3227
3273
  endpoint: "/api/v1/tripadvisor/location",
3228
3274
  credits: 2,
3229
3275
  description: "One TripAdvisor location in full: rating, review histogram and per-aspect sub-ratings, city ranking, price band, cuisines, amenities, address, coordinates, contact, photos, and the FIRST PAGE OF REVIEWS. Provide location_id or url. Costs 2 credits.",
3230
- inputSchema: import_zod22.z.object({
3231
- location_id: import_zod22.z.string().optional().describe(
3276
+ inputSchema: import_zod23.z.object({
3277
+ location_id: import_zod23.z.string().optional().describe(
3232
3278
  "TripAdvisor location id (1-500 characters): 1899234, d1899234, or a full _Review URL. Required unless url is given."
3233
3279
  ),
3234
- geo_id: import_zod22.z.string().optional().describe(
3280
+ geo_id: import_zod23.z.string().optional().describe(
3235
3281
  "Geo the location sits in; required when location_id is a bare d-id."
3236
3282
  ),
3237
- category: import_zod22.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3283
+ category: import_zod23.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3238
3284
  "Location family (default 'restaurants'); match the location's own type."
3239
3285
  ),
3240
- url: import_zod22.z.string().optional().describe(
3286
+ url: import_zod23.z.string().optional().describe(
3241
3287
  "Full tripadvisor.com _Review URL (1-500 characters), as an alternative to location_id."
3242
3288
  )
3243
3289
  }),
@@ -3250,20 +3296,20 @@ var tripadvisorToolSpecs = [
3250
3296
  endpoint: "/api/v1/tripadvisor/reviews",
3251
3297
  credits: 2,
3252
3298
  description: "A page of TripAdvisor reviews: rating, trip date and type, reviewer home town and contribution count, management response. Page 1 already rides along in location(), so use this to page PAST it; consecutive pages can repeat one review at the boundary, so de-duplicate on review_id. Provide location_id or url. Costs 2 credits.",
3253
- inputSchema: import_zod22.z.object({
3254
- location_id: import_zod22.z.string().optional().describe(
3299
+ inputSchema: import_zod23.z.object({
3300
+ location_id: import_zod23.z.string().optional().describe(
3255
3301
  "TripAdvisor location id (1-500 characters): 1899234, d1899234, or a full _Review URL. Required unless url is given."
3256
3302
  ),
3257
- geo_id: import_zod22.z.string().optional().describe(
3303
+ geo_id: import_zod23.z.string().optional().describe(
3258
3304
  "Geo the location sits in; required when location_id is a bare d-id."
3259
3305
  ),
3260
- category: import_zod22.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3306
+ category: import_zod23.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3261
3307
  "Location family (default 'restaurants'). It sets the page size, so it must match the location's own type on any page past the first."
3262
3308
  ),
3263
- url: import_zod22.z.string().optional().describe(
3309
+ url: import_zod23.z.string().optional().describe(
3264
3310
  "Full tripadvisor.com _Review URL (1-500 characters), as an alternative to location_id."
3265
3311
  ),
3266
- page: import_zod22.z.number().int().optional().describe(
3312
+ page: import_zod23.z.number().int().optional().describe(
3267
3313
  "Reviews page, 1-based. 15 per page for restaurants, 10 for hotels and attractions; past the last page is a 404."
3268
3314
  )
3269
3315
  }),
@@ -3288,7 +3334,7 @@ var createScavioTripadvisorReviewsTool = toolFactory(
3288
3334
  );
3289
3335
 
3290
3336
  // src/indeed.ts
3291
- var import_zod23 = require("zod");
3337
+ var import_zod24 = require("zod");
3292
3338
  var indeedToolSpecs = [
3293
3339
  defineScavioTool({
3294
3340
  key: "scavioIndeedSearch",
@@ -3297,38 +3343,38 @@ var indeedToolSpecs = [
3297
3343
  endpoint: "/api/v1/indeed/search",
3298
3344
  credits: 2,
3299
3345
  description: "Indeed job postings: title, employer, rating, location, salary range, job type, benefits, posting age, apply route. 10 postings per page. Provide query or location - a location-only search (every posting in a metro) is valid. Costs 2 credits.",
3300
- inputSchema: import_zod23.z.object({
3301
- query: import_zod23.z.string().optional().describe(
3346
+ inputSchema: import_zod24.z.object({
3347
+ query: import_zod24.z.string().optional().describe(
3302
3348
  "Job title, keywords or employer (1-500 characters). Required unless location is given."
3303
3349
  ),
3304
- location: import_zod23.z.string().optional().describe(
3350
+ location: import_zod24.z.string().optional().describe(
3305
3351
  "City and state, postal code, state, country, or 'Remote' (1-200 characters). Valid on its own with no query."
3306
3352
  ),
3307
- page: import_zod23.z.number().int().optional().describe(
3353
+ page: import_zod24.z.number().int().optional().describe(
3308
3354
  "Results page, 1-based. 10 postings per page, 1 call each."
3309
3355
  ),
3310
- radius: import_zod23.z.union([
3311
- import_zod23.z.literal(0),
3312
- import_zod23.z.literal(5),
3313
- import_zod23.z.literal(10),
3314
- import_zod23.z.literal(15),
3315
- import_zod23.z.literal(25),
3316
- import_zod23.z.literal(35),
3317
- import_zod23.z.literal(50),
3318
- import_zod23.z.literal(100)
3356
+ radius: import_zod24.z.union([
3357
+ import_zod24.z.literal(0),
3358
+ import_zod24.z.literal(5),
3359
+ import_zod24.z.literal(10),
3360
+ import_zod24.z.literal(15),
3361
+ import_zod24.z.literal(25),
3362
+ import_zod24.z.literal(35),
3363
+ import_zod24.z.literal(50),
3364
+ import_zod24.z.literal(100)
3319
3365
  ]).optional().describe(
3320
3366
  "Search radius in miles around location. Closed set: Indeed IGNORES any other value and returns the unfiltered set. Upstream default 50."
3321
3367
  ),
3322
- max_age_days: import_zod23.z.union([import_zod23.z.literal(1), import_zod23.z.literal(3), import_zod23.z.literal(7), import_zod23.z.literal(14)]).optional().describe(
3368
+ max_age_days: import_zod24.z.union([import_zod24.z.literal(1), import_zod24.z.literal(3), import_zod24.z.literal(7), import_zod24.z.literal(14)]).optional().describe(
3323
3369
  "Maximum posting age in days. Closed set: Indeed IGNORES any other value and returns postings of every age."
3324
3370
  ),
3325
- job_type: import_zod23.z.enum(["full_time", "part_time", "contract", "temporary", "internship"]).optional().describe(
3371
+ job_type: import_zod24.z.enum(["full_time", "part_time", "contract", "temporary", "internship"]).optional().describe(
3326
3372
  "Employment type filter."
3327
3373
  ),
3328
- min_salary: import_zod23.z.number().optional().describe(
3374
+ min_salary: import_zod24.z.number().optional().describe(
3329
3375
  "Minimum annual salary, >= 0. Filters on INDEED'S OWN ESTIMATE for the role, not a posted figure, so postings publishing no salary still match."
3330
3376
  ),
3331
- remote: import_zod23.z.boolean().optional().describe("Remote postings only.")
3377
+ remote: import_zod24.z.boolean().optional().describe("Remote postings only.")
3332
3378
  }),
3333
3379
  call: (client, input) => client.indeed.search(input)
3334
3380
  }),
@@ -3339,8 +3385,8 @@ var indeedToolSpecs = [
3339
3385
  endpoint: "/api/v1/indeed/job",
3340
3386
  credits: 2,
3341
3387
  description: "One Indeed posting in full: description text and HTML, structured salary, employment types, benefits, geocoded address, employer rating, applicant count, original ATS link. An unknown job key is a real 404 that is still billed. Costs 2 credits.",
3342
- inputSchema: import_zod23.z.object({
3343
- job_id: import_zod23.z.string().describe(
3388
+ inputSchema: import_zod24.z.object({
3389
+ job_id: import_zod24.z.string().describe(
3344
3390
  "16-hex Indeed job key, or any indeed.com URL carrying jk= (/viewjob, /rc/clk, /pagead/clk)."
3345
3391
  )
3346
3392
  }),
@@ -3353,8 +3399,8 @@ var indeedToolSpecs = [
3353
3399
  endpoint: "/api/v1/indeed/company",
3354
3400
  credits: 2,
3355
3401
  description: "Indeed employer profile: description, industry, HQ, size, revenue, CEO approval, overall and per-category ratings, reported salaries, open roles, locations. An unknown slug is a real 404 that is still billed. Costs 2 credits.",
3356
- inputSchema: import_zod23.z.object({
3357
- company: import_zod23.z.string().describe(
3402
+ inputSchema: import_zod24.z.object({
3403
+ company: import_zod24.z.string().describe(
3358
3404
  "indeed.com/cmp/<slug> slug or a full profile URL (1-200 characters); slugs are untidy, e.g. 'Tata-Consultancy-Services-(tcs)'."
3359
3405
  )
3360
3406
  }),
@@ -3367,11 +3413,11 @@ var indeedToolSpecs = [
3367
3413
  endpoint: "/api/v1/indeed/company/reviews",
3368
3414
  credits: 2,
3369
3415
  description: "Indeed employee reviews, 20 per page, with per-category ratings, pros/cons, reviewer job title and location, plus aggregated sentiment and topic/location/job-title breakdowns. Costs 2 credits.",
3370
- inputSchema: import_zod23.z.object({
3371
- company: import_zod23.z.string().describe(
3416
+ inputSchema: import_zod24.z.object({
3417
+ company: import_zod24.z.string().describe(
3372
3418
  "indeed.com/cmp/<slug> slug or a full profile URL (1-200 characters)."
3373
3419
  ),
3374
- page: import_zod23.z.number().int().optional().describe("Reviews page, 1-based. 20 reviews per page.")
3420
+ page: import_zod24.z.number().int().optional().describe("Reviews page, 1-based. 20 reviews per page.")
3375
3421
  }),
3376
3422
  call: (client, input) => client.indeed.companyReviews(input)
3377
3423
  })
@@ -3385,7 +3431,7 @@ var createScavioIndeedCompanyReviewsTool = toolFactory(
3385
3431
  );
3386
3432
 
3387
3433
  // src/airbnb.ts
3388
- var import_zod24 = require("zod");
3434
+ var import_zod25 = require("zod");
3389
3435
  var airbnbToolSpecs = [
3390
3436
  defineScavioTool({
3391
3437
  key: "scavioAirbnbSearch",
@@ -3394,46 +3440,46 @@ var airbnbToolSpecs = [
3394
3440
  endpoint: "/api/v1/airbnb/search",
3395
3441
  credits: 1,
3396
3442
  description: "Airbnb stays: stay-total and per-night price with the full discount ledger, rating and review count, bedrooms/beds/baths, coordinates, badges, images, dates_are_defaulted. 18 listings per page; page and cursor are mutually exclusive. Costs 1 credit.",
3397
- inputSchema: import_zod24.z.object({
3398
- location: import_zod24.z.string().describe(
3443
+ inputSchema: import_zod25.z.object({
3444
+ location: import_zod25.z.string().describe(
3399
3445
  "City, region, ZIP, or a pasted airbnb.com/s/ URL (1-200 characters). An unresolvable location is a 404."
3400
3446
  ),
3401
- check_in: import_zod24.z.string().optional().describe(
3447
+ check_in: import_zod25.z.string().optional().describe(
3402
3448
  "Check-in date, YYYY-MM-DD. Must be sent with check_out; omitting both defaults to +30 days and flags dates_are_defaulted in the response."
3403
3449
  ),
3404
- check_out: import_zod24.z.string().optional().describe(
3450
+ check_out: import_zod25.z.string().optional().describe(
3405
3451
  "Check-out date, YYYY-MM-DD. Must be later than check_in; defaults to check_in plus 5 nights when omitted."
3406
3452
  ),
3407
- adults: import_zod24.z.number().int().optional().describe("Adult guests, >= 1."),
3408
- children: import_zod24.z.number().int().optional().describe("Children aged 2-12, >= 0."),
3409
- infants: import_zod24.z.number().int().optional().describe("Infants under 2, >= 0."),
3410
- pets: import_zod24.z.number().int().optional().describe("Pets, >= 0."),
3411
- min_price: import_zod24.z.number().optional().describe(
3453
+ adults: import_zod25.z.number().int().optional().describe("Adult guests, >= 1."),
3454
+ children: import_zod25.z.number().int().optional().describe("Children aged 2-12, >= 0."),
3455
+ infants: import_zod25.z.number().int().optional().describe("Infants under 2, >= 0."),
3456
+ pets: import_zod25.z.number().int().optional().describe("Pets, >= 0."),
3457
+ min_price: import_zod25.z.number().optional().describe(
3412
3458
  "Minimum price for the WHOLE STAY in `currency`, not per night, >= 0. Must not exceed max_price."
3413
3459
  ),
3414
- max_price: import_zod24.z.number().optional().describe(
3460
+ max_price: import_zod25.z.number().optional().describe(
3415
3461
  "Maximum price for the WHOLE STAY in `currency`, not per night, >= 0."
3416
3462
  ),
3417
- room_type: import_zod24.z.enum(["entire_home", "private_room", "shared_room", "hotel_room"]).optional().describe(
3463
+ room_type: import_zod25.z.enum(["entire_home", "private_room", "shared_room", "hotel_room"]).optional().describe(
3418
3464
  "Room type. Validated before the scrape, because an unrecognised value returns the UNFILTERED set under a 200."
3419
3465
  ),
3420
- min_bedrooms: import_zod24.z.number().int().optional().describe("Minimum bedrooms, >= 0."),
3421
- min_beds: import_zod24.z.number().int().optional().describe("Minimum beds, >= 0."),
3422
- min_bathrooms: import_zod24.z.number().int().optional().describe("Minimum bathrooms, >= 0."),
3423
- superhost: import_zod24.z.boolean().optional().describe("Superhost listings only."),
3424
- instant_book: import_zod24.z.boolean().optional().describe("Instant Book listings only."),
3425
- guest_favorite: import_zod24.z.boolean().optional().describe("Guest Favorite listings only."),
3426
- free_cancellation: import_zod24.z.boolean().optional().describe("Listings with free cancellation only."),
3427
- amenities: import_zod24.z.string().optional().describe(
3466
+ min_bedrooms: import_zod25.z.number().int().optional().describe("Minimum bedrooms, >= 0."),
3467
+ min_beds: import_zod25.z.number().int().optional().describe("Minimum beds, >= 0."),
3468
+ min_bathrooms: import_zod25.z.number().int().optional().describe("Minimum bathrooms, >= 0."),
3469
+ superhost: import_zod25.z.boolean().optional().describe("Superhost listings only."),
3470
+ instant_book: import_zod25.z.boolean().optional().describe("Instant Book listings only."),
3471
+ guest_favorite: import_zod25.z.boolean().optional().describe("Guest Favorite listings only."),
3472
+ free_cancellation: import_zod25.z.boolean().optional().describe("Listings with free cancellation only."),
3473
+ amenities: import_zod25.z.string().optional().describe(
3428
3474
  "Comma-separated amenities (1-200 characters): wifi, air_conditioning, pool, kitchen, free_parking, washer, self_check_in, tv, or raw numeric Airbnb amenity ids. An unrecognised NAME is rejected before the scrape."
3429
3475
  ),
3430
- currency: import_zod24.z.string().optional().describe(
3476
+ currency: import_zod25.z.string().optional().describe(
3431
3477
  "ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Airbnb picks a currency itself and identical requests can disagree."
3432
3478
  ),
3433
- page: import_zod24.z.number().int().optional().describe(
3479
+ page: import_zod25.z.number().int().optional().describe(
3434
3480
  "Results page, 1-based. 18 listings per page. Cannot be combined with cursor."
3435
3481
  ),
3436
- cursor: import_zod24.z.string().optional().describe(
3482
+ cursor: import_zod25.z.string().optional().describe(
3437
3483
  "next_cursor from a previous response (1-500 characters); wins over page, so sending both is rejected."
3438
3484
  )
3439
3485
  }),
@@ -3446,21 +3492,21 @@ var airbnbToolSpecs = [
3446
3492
  endpoint: "/api/v1/airbnb/listing",
3447
3493
  credits: 1,
3448
3494
  description: "One Airbnb listing in full: description, property/room type, capacity and room counts, the complete grouped amenity list (including what the place does NOT have), host profile and stats, house rules, cancellation policy, sleeping arrangements, photo tour and the RATING BREAKDOWN. Carries NO nightly price - prices are search-only. Costs 1 credit.",
3449
- inputSchema: import_zod24.z.object({
3450
- listing_id: import_zod24.z.string().describe(
3495
+ inputSchema: import_zod25.z.object({
3496
+ listing_id: import_zod25.z.string().describe(
3451
3497
  "Airbnb listing id or a full /rooms/ URL (1-500 characters); query params are discarded, since they carry someone else's dates."
3452
3498
  ),
3453
- check_in: import_zod24.z.string().optional().describe(
3499
+ check_in: import_zod25.z.string().optional().describe(
3454
3500
  "Check-in date, YYYY-MM-DD. Must be sent with check_out. Does not produce a price: the room page has no nightly rate."
3455
3501
  ),
3456
- check_out: import_zod24.z.string().optional().describe(
3502
+ check_out: import_zod25.z.string().optional().describe(
3457
3503
  "Check-out date, YYYY-MM-DD. Must be later than check_in and sent together with it."
3458
3504
  ),
3459
- adults: import_zod24.z.number().int().optional().describe("Adult guests, >= 1."),
3460
- children: import_zod24.z.number().int().optional().describe("Children aged 2-12, >= 0."),
3461
- infants: import_zod24.z.number().int().optional().describe("Infants under 2, >= 0."),
3462
- pets: import_zod24.z.number().int().optional().describe("Pets, >= 0."),
3463
- currency: import_zod24.z.string().optional().describe("ISO 4217 currency, 3 letters (default 'USD').")
3505
+ adults: import_zod25.z.number().int().optional().describe("Adult guests, >= 1."),
3506
+ children: import_zod25.z.number().int().optional().describe("Children aged 2-12, >= 0."),
3507
+ infants: import_zod25.z.number().int().optional().describe("Infants under 2, >= 0."),
3508
+ pets: import_zod25.z.number().int().optional().describe("Pets, >= 0."),
3509
+ currency: import_zod25.z.string().optional().describe("ISO 4217 currency, 3 letters (default 'USD').")
3464
3510
  }),
3465
3511
  call: (client, input) => client.airbnb.listing(input)
3466
3512
  }),
@@ -3471,15 +3517,15 @@ var airbnbToolSpecs = [
3471
3517
  endpoint: "/api/v1/airbnb/reviews",
3472
3518
  credits: 1,
3473
3519
  description: "Airbnb review BODIES with per-review rating, date and reviewer name/photo/location, limit/offset paged at up to 50 per call. `count` is the listing's TOTAL review count, `returned` is how many this page holds. The rating breakdown lives on listing(), not here. Costs 1 credit.",
3474
- inputSchema: import_zod24.z.object({
3475
- listing_id: import_zod24.z.string().describe(
3520
+ inputSchema: import_zod25.z.object({
3521
+ listing_id: import_zod25.z.string().describe(
3476
3522
  "Airbnb listing id or a full /rooms/ URL (1-500 characters)."
3477
3523
  ),
3478
- currency: import_zod24.z.string().optional().describe("ISO 4217 currency, 3 letters (default 'USD')."),
3479
- limit: import_zod24.z.number().int().optional().describe(
3524
+ currency: import_zod25.z.string().optional().describe("ISO 4217 currency, 3 letters (default 'USD')."),
3525
+ limit: import_zod25.z.number().int().optional().describe(
3480
3526
  "Reviews to return, 1-50 (default 30). Upstream returns a fixed 7 when no explicit limit is sent."
3481
3527
  ),
3482
- offset: import_zod24.z.number().int().optional().describe(
3528
+ offset: import_zod25.z.number().int().optional().describe(
3483
3529
  "Reviews to skip before this page, >= 0 (default 0)."
3484
3530
  )
3485
3531
  }),
@@ -3491,7 +3537,7 @@ var createScavioAirbnbListingTool = toolFactory(airbnbToolSpecs, "scavioAirbnbLi
3491
3537
  var createScavioAirbnbReviewsTool = toolFactory(airbnbToolSpecs, "scavioAirbnbReviews");
3492
3538
 
3493
3539
  // src/glassdoor.ts
3494
- var import_zod25 = require("zod");
3540
+ var import_zod26 = require("zod");
3495
3541
  var glassdoorToolSpecs = [
3496
3542
  defineScavioTool({
3497
3543
  key: "scavioGlassdoorCompanies",
@@ -3500,8 +3546,8 @@ var glassdoorToolSpecs = [
3500
3546
  endpoint: "/api/v1/glassdoor/companies",
3501
3547
  credits: 1,
3502
3548
  description: "START HERE. Resolve a company NAME to the employer_id every other Glassdoor method is keyed by, ranked by Glassdoor and de-duplicated. Costs 1 credit.",
3503
- inputSchema: import_zod25.z.object({
3504
- query: import_zod25.z.string().describe("Company name to resolve (1-120 characters).")
3549
+ inputSchema: import_zod26.z.object({
3550
+ query: import_zod26.z.string().describe("Company name to resolve (1-120 characters).")
3505
3551
  }),
3506
3552
  call: (client, input) => client.glassdoor.companies(input)
3507
3553
  }),
@@ -3512,14 +3558,14 @@ var glassdoorToolSpecs = [
3512
3558
  endpoint: "/api/v1/glassdoor/company",
3513
3559
  credits: 1,
3514
3560
  description: "Glassdoor employer profile: description, mission, industry, sector, HQ, size and revenue bands, stock symbol, year founded, overall and per-category ratings, star distribution, CEO approval, awards, FAQ and the five server-rendered reviews. Also returns reviews_url and salaries_url, which reviews() and salaries() accept as url to save a fetch. Provide employer_id or url. Costs 1 credit.",
3515
- inputSchema: import_zod25.z.object({
3516
- employer_id: import_zod25.z.string().optional().describe(
3561
+ inputSchema: import_zod26.z.object({
3562
+ employer_id: import_zod26.z.string().optional().describe(
3517
3563
  "Glassdoor employer id (1-50 characters) in any form Glassdoor writes it: '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected."
3518
3564
  ),
3519
- company: import_zod25.z.string().optional().describe(
3565
+ company: import_zod26.z.string().optional().describe(
3520
3566
  "Employer name as it appears in a Glassdoor slug (1-200 characters). COSMETIC: the profile resolves on employer_id alone, it is ignored entirely when url is set, and it does not satisfy the employer_id-or-url requirement."
3521
3567
  ),
3522
- url: import_zod25.z.string().optional().describe(
3568
+ url: import_zod26.z.string().optional().describe(
3523
3569
  "Any glassdoor.com employer URL (1-500 characters): /Overview/, /Reviews/ or /Salary/. A non-glassdoor.com host is rejected."
3524
3570
  )
3525
3571
  }),
@@ -3532,17 +3578,17 @@ var glassdoorToolSpecs = [
3532
3578
  endpoint: "/api/v1/glassdoor/reviews",
3533
3579
  credits: 1,
3534
3580
  description: "Up to THREE full Glassdoor reviews - the cap is Glassdoor's login wall - with per-axis scores, pros, cons, advice, job title, location, employment status and employer response, plus complete rating statistics, star distribution, aggregate pro/con highlight terms and per-job-title review counts. There is no page param: move the window with category and employment_status. Provide employer_id or url. Costs 1 credit.",
3535
- inputSchema: import_zod25.z.object({
3536
- employer_id: import_zod25.z.string().optional().describe(
3581
+ inputSchema: import_zod26.z.object({
3582
+ employer_id: import_zod26.z.string().optional().describe(
3537
3583
  "Glassdoor employer id (1-50 characters): '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected. Addressing by id takes an extra lookup; the customer price is unchanged."
3538
3584
  ),
3539
- company: import_zod25.z.string().optional().describe(
3585
+ company: import_zod26.z.string().optional().describe(
3540
3586
  "Employer name as it appears in a Glassdoor slug (1-200 characters). COSMETIC: ignored when url is set, and it does not satisfy the employer_id-or-url requirement."
3541
3587
  ),
3542
- url: import_zod25.z.string().optional().describe(
3588
+ url: import_zod26.z.string().optional().describe(
3543
3589
  "Any glassdoor.com employer URL (1-500 characters). Pass back reviews_url from company() to skip the resolve fetch. A non-glassdoor.com host is rejected."
3544
3590
  ),
3545
- category: import_zod25.z.enum([
3591
+ category: import_zod26.z.enum([
3546
3592
  "career_development",
3547
3593
  "compensation",
3548
3594
  "culture",
@@ -3552,7 +3598,7 @@ var glassdoorToolSpecs = [
3552
3598
  ]).optional().describe(
3553
3599
  "Restrict to reviews Glassdoor files under one topic. Closed enum: Glassdoor IGNORES an unknown value and serves the unfiltered set under a 200. Read filtered_review_count on the response to see how many match."
3554
3600
  ),
3555
- employment_status: import_zod25.z.enum(["full_time", "part_time", "contract", "intern"]).optional().describe(
3601
+ employment_status: import_zod26.z.enum(["full_time", "part_time", "contract", "intern"]).optional().describe(
3556
3602
  "Restrict to one kind of employment. Closed enum for the same reason as category; FREELANCE is deliberately absent because it was never confirmed to change the result set."
3557
3603
  )
3558
3604
  }),
@@ -3565,17 +3611,17 @@ var glassdoorToolSpecs = [
3565
3611
  endpoint: "/api/v1/glassdoor/salaries",
3566
3612
  credits: 1,
3567
3613
  description: "Glassdoor salaries by job title, 10 titles per page: base-pay and total-pay percentiles P10-P90 with medians called out, sample counts, currency, pay period and last-reported date. The figures are Glassdoor's ESTIMATES for the title, not individual reported salaries. Provide employer_id or url. Costs 1 credit.",
3568
- inputSchema: import_zod25.z.object({
3569
- employer_id: import_zod25.z.string().optional().describe(
3614
+ inputSchema: import_zod26.z.object({
3615
+ employer_id: import_zod26.z.string().optional().describe(
3570
3616
  "Glassdoor employer id (1-50 characters): '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected. Addressing by id takes an extra lookup; the customer price is unchanged."
3571
3617
  ),
3572
- company: import_zod25.z.string().optional().describe(
3618
+ company: import_zod26.z.string().optional().describe(
3573
3619
  "Employer name as it appears in a Glassdoor slug (1-200 characters). COSMETIC: ignored when url is set, and it does not satisfy the employer_id-or-url requirement."
3574
3620
  ),
3575
- url: import_zod25.z.string().optional().describe(
3621
+ url: import_zod26.z.string().optional().describe(
3576
3622
  "Any glassdoor.com employer URL (1-500 characters). Pass back salaries_url from company() to skip the resolve fetch. A non-glassdoor.com host is rejected."
3577
3623
  ),
3578
- page: import_zod25.z.number().int().optional().describe(
3624
+ page: import_zod26.z.number().int().optional().describe(
3579
3625
  "Results page, 1-based. Ten job titles per page; page_count on the response is how many pages exist."
3580
3626
  )
3581
3627
  }),
@@ -3600,7 +3646,7 @@ var createScavioGlassdoorSalariesTool = toolFactory(
3600
3646
  );
3601
3647
 
3602
3648
  // src/yelp.ts
3603
- var import_zod26 = require("zod");
3649
+ var import_zod27 = require("zod");
3604
3650
  var yelpToolSpecs = [
3605
3651
  defineScavioTool({
3606
3652
  key: "scavioYelpSearch",
@@ -3609,29 +3655,29 @@ var yelpToolSpecs = [
3609
3655
  endpoint: "/api/v1/yelp/search",
3610
3656
  credits: 2,
3611
3657
  description: "Businesses in Yelp's ranked order: rating, review count, price band, categories, address, contact rails, hours, photos and a review snippet; every row carries both business_id and alias. Yelp fixes the page size at 10. Provide term and location, or url. Costs 2 credits.",
3612
- inputSchema: import_zod26.z.object({
3613
- term: import_zod26.z.string().optional().describe(
3658
+ inputSchema: import_zod27.z.object({
3659
+ term: import_zod27.z.string().optional().describe(
3614
3660
  "What to look for (1-200 characters): a category ('plumbers'), a dish, or a business name. Required together with location unless url is given."
3615
3661
  ),
3616
- location: import_zod26.z.string().optional().describe(
3662
+ location: import_zod27.z.string().optional().describe(
3617
3663
  "Where to look (1-200 characters): city and region, a full address, or a postcode. Effectively required - without it Yelp picks a location itself, so the same request can answer about a different metro run to run."
3618
3664
  ),
3619
- page: import_zod26.z.number().int().optional().describe(
3665
+ page: import_zod27.z.number().int().optional().describe(
3620
3666
  "Results page, 1-based. Yelp fixes the page size at 10."
3621
3667
  ),
3622
- sort: import_zod26.z.enum(["recommended", "rating", "review_count"]).optional().describe(
3668
+ sort: import_zod27.z.enum(["recommended", "rating", "review_count"]).optional().describe(
3623
3669
  "Result ordering (upstream default 'recommended'). Closed enum: Yelp IGNORES an unrecognised sortby and serves default ranking under a 200, billing a premium scrape for a sort that never ran."
3624
3670
  ),
3625
- price: import_zod26.z.array(import_zod26.z.union([import_zod26.z.literal(1), import_zod26.z.literal(2), import_zod26.z.literal(3), import_zod26.z.literal(4)])).optional().describe(
3671
+ price: import_zod27.z.array(import_zod27.z.union([import_zod27.z.literal(1), import_zod27.z.literal(2), import_zod27.z.literal(3), import_zod27.z.literal(4)])).optional().describe(
3626
3672
  "Price bands to include, 1 ($) to 4 ($$$$); 1-4 values, combined freely - [1, 2] means $ or $$."
3627
3673
  ),
3628
- open_now: import_zod26.z.boolean().optional().describe(
3674
+ open_now: import_zod27.z.boolean().optional().describe(
3629
3675
  "Only businesses open at the moment of the request."
3630
3676
  ),
3631
- attributes: import_zod26.z.array(import_zod26.z.string()).optional().describe(
3677
+ attributes: import_zod27.z.array(import_zod27.z.string()).optional().describe(
3632
3678
  "Raw Yelp filter aliases, max 20, each 1-100 characters ('RestaurantsDelivery', 'GoodForKids', 'WheelchairAccessible'). A deliberate PASSTHROUGH, not an enum - Yelp's vocabulary runs to ~117 values per vertical and an alias it does not know is ignored upstream, returning unfiltered results."
3633
3679
  ),
3634
- url: import_zod26.z.string().optional().describe(
3680
+ url: import_zod27.z.string().optional().describe(
3635
3681
  "A full yelp.com/search URL (1-1000 characters) as an alternative to term + location; the query, offset and sort are read out of it and the URL is rebuilt."
3636
3682
  )
3637
3683
  }),
@@ -3644,11 +3690,11 @@ var yelpToolSpecs = [
3644
3690
  endpoint: "/api/v1/yelp/business",
3645
3691
  credits: 2,
3646
3692
  description: "One business in full: rating and per-star histogram, review count, price band, categories, address and coordinates, phone, website and menu links, hours and holidays, amenities, photos and videos, popular items, health inspections, Q&A, licences and claim status - plus the first page of reviews at no extra cost. Provide business_id or url. Costs 2 credits.",
3647
- inputSchema: import_zod26.z.object({
3648
- business_id: import_zod26.z.string().optional().describe(
3693
+ inputSchema: import_zod27.z.object({
3694
+ business_id: import_zod27.z.string().optional().describe(
3649
3695
  "A Yelp business alias ('desnudo-coffee-austin-2'), its opaque encid, or any yelp.com/biz URL carrying one (1-500 characters). Search rows return both id forms."
3650
3696
  ),
3651
- url: import_zod26.z.string().optional().describe(
3697
+ url: import_zod27.z.string().optional().describe(
3652
3698
  "A full yelp.com/biz URL (1-1000 characters) as an alternative to business_id."
3653
3699
  )
3654
3700
  }),
@@ -3661,17 +3707,17 @@ var yelpToolSpecs = [
3661
3707
  endpoint: "/api/v1/yelp/reviews",
3662
3708
  credits: 2,
3663
3709
  description: "A page of reviews: rating, full text, language, author profile and expertise counts, attached photos, reaction counts and owner response. 10 per page. PAGE 1 IS REDUNDANT - it re-fetches the document business() already returned - so start at page 2. Provide business_id or url. Costs 2 credits.",
3664
- inputSchema: import_zod26.z.object({
3665
- business_id: import_zod26.z.string().optional().describe(
3710
+ inputSchema: import_zod27.z.object({
3711
+ business_id: import_zod27.z.string().optional().describe(
3666
3712
  "A Yelp business alias ('desnudo-coffee-austin-2'), its opaque encid, or any yelp.com/biz URL carrying one (1-500 characters)."
3667
3713
  ),
3668
- url: import_zod26.z.string().optional().describe(
3714
+ url: import_zod27.z.string().optional().describe(
3669
3715
  "A full yelp.com/biz URL (1-1000 characters) as an alternative to business_id."
3670
3716
  ),
3671
- page: import_zod26.z.number().int().optional().describe(
3717
+ page: import_zod27.z.number().int().optional().describe(
3672
3718
  "Reviews page, 1-based, 10 per page. Page 1 duplicates the reviews business() already returned and costs another 2 credits - start at 2. A page past the last review is a 404, not an empty result."
3673
3719
  ),
3674
- sort: import_zod26.z.enum([
3720
+ sort: import_zod27.z.enum([
3675
3721
  "relevance",
3676
3722
  "newest",
3677
3723
  "oldest",
@@ -3681,12 +3727,12 @@ var yelpToolSpecs = [
3681
3727
  ]).optional().describe(
3682
3728
  "Review ordering (upstream default 'relevance'). Closed enum: Yelp IGNORES an unrecognised value and serves default ranking under a billed 200."
3683
3729
  ),
3684
- rating: import_zod26.z.union([
3685
- import_zod26.z.literal(1),
3686
- import_zod26.z.literal(2),
3687
- import_zod26.z.literal(3),
3688
- import_zod26.z.literal(4),
3689
- import_zod26.z.literal(5)
3730
+ rating: import_zod27.z.union([
3731
+ import_zod27.z.literal(1),
3732
+ import_zod27.z.literal(2),
3733
+ import_zod27.z.literal(3),
3734
+ import_zod27.z.literal(4),
3735
+ import_zod27.z.literal(5)
3690
3736
  ]).optional().describe(
3691
3737
  "Only reviews at this star rating, 1-5. Changes filtered_review_count on the response, not review_count."
3692
3738
  )
@@ -3699,7 +3745,7 @@ var createScavioYelpBusinessTool = toolFactory(yelpToolSpecs, "scavioYelpBusines
3699
3745
  var createScavioYelpReviewsTool = toolFactory(yelpToolSpecs, "scavioYelpReviews");
3700
3746
 
3701
3747
  // src/app-store.ts
3702
- var import_zod27 = require("zod");
3748
+ var import_zod28 = require("zod");
3703
3749
  var appStoreToolSpecs = [
3704
3750
  defineScavioTool({
3705
3751
  key: "scavioAppStoreSearch",
@@ -3708,20 +3754,20 @@ var appStoreToolSpecs = [
3708
3754
  endpoint: "/api/v1/appstore/search",
3709
3755
  credits: 1,
3710
3756
  description: "Search the App Store and get up to 200 fully-shaped app rows - the same 43-field row as app() - so a search doubles as a bulk metadata fetch and as a publisher lookup. NO PAGINATION: raise limit, there is no second page. Costs 1 credit.",
3711
- inputSchema: import_zod27.z.object({
3712
- term: import_zod27.z.string().describe(
3757
+ inputSchema: import_zod28.z.object({
3758
+ term: import_zod28.z.string().describe(
3713
3759
  "What to search for (1-500 characters). Apple matches an app name, a keyword OR a publisher name, so searching a developer returns their catalogue."
3714
3760
  ),
3715
- limit: import_zod27.z.number().int().optional().describe(
3761
+ limit: import_zod28.z.number().int().optional().describe(
3716
3762
  "Apps to return, 1-200 (default 25). The ONLY lever on result volume: the search API has no pagination and every offset spelling is silently ignored."
3717
3763
  ),
3718
- country: import_zod27.z.string().optional().describe(
3764
+ country: import_zod28.z.string().optional().describe(
3719
3765
  "Two-letter ISO storefront code (default 'us'); decides price, currency, localised title and whether the app is sold there at all. Anything that is not exactly two letters is rejected with a free 400."
3720
3766
  ),
3721
- entity: import_zod27.z.enum(["software", "ipad_software", "mac_software"]).optional().describe(
3767
+ entity: import_zod28.z.enum(["software", "ipad_software", "mac_software"]).optional().describe(
3722
3768
  "Which catalogue to search: iPhone/iPad apps ('software', the default), iPad apps, or Mac App Store apps. These are separate stores, not a filter - Mac rows carry no iPad/Apple TV screenshots, advisories, features, supported devices or Game Center flag, returning them empty rather than absent."
3723
3769
  ),
3724
- lang: import_zod27.z.string().optional().describe(
3770
+ lang: import_zod28.z.string().optional().describe(
3725
3771
  "Listing text language as a five-letter code ('en_us', 'ja_jp'); any other shape is rejected. Independent of country: the storefront sets the price, this sets the words."
3726
3772
  )
3727
3773
  }),
@@ -3734,11 +3780,11 @@ var appStoreToolSpecs = [
3734
3780
  endpoint: "/api/v1/appstore/app",
3735
3781
  credits: 1,
3736
3782
  description: "Full App Store listing: title, description, developer and seller identity, price and currency, all-time and current-version ratings, version and release notes, genres, content rating and advisories, icons at three sizes, screenshots, download size, minimum OS, languages, supported devices and the Game Center and VPP flags. Costs 1 credit.",
3737
- inputSchema: import_zod27.z.object({
3738
- app_id: import_zod27.z.string().describe(
3783
+ inputSchema: import_zod28.z.object({
3784
+ app_id: import_zod28.z.string().describe(
3739
3785
  "App Store id - the digits after 'id' in an apps.apple.com URL - or the app's bundle id ('notion.id', 'com.burbn.instagram'); both resolve to the identical payload. 1-255 characters matching ^[A-Za-z0-9][A-Za-z0-9._-]*$, so a pasted apps.apple.com URL is rejected with a free 400. An id Apple cannot resolve is a billed 404."
3740
3786
  ),
3741
- country: import_zod27.z.string().optional().describe(
3787
+ country: import_zod28.z.string().optional().describe(
3742
3788
  "Two-letter ISO storefront code (default 'us'); decides price, currency, localised title and whether the app is sold there at all. Anything that is not exactly two letters is rejected with a free 400."
3743
3789
  )
3744
3790
  }),
@@ -3751,17 +3797,17 @@ var appStoreToolSpecs = [
3751
3797
  endpoint: "/api/v1/appstore/reviews",
3752
3798
  credits: 1,
3753
3799
  description: "A page of App Store reviews: star rating, title, full text, author and the APP VERSION the review was written against. 50 per page, hard-stopped at page 10 - 500 reviews per storefront is Apple's anonymous ceiling. This endpoint cannot 404: an unknown id and a real app with no reviews return the same empty feed. Costs 1 credit.",
3754
- inputSchema: import_zod27.z.object({
3755
- app_id: import_zod27.z.string().describe(
3800
+ inputSchema: import_zod28.z.object({
3801
+ app_id: import_zod28.z.string().describe(
3756
3802
  "App Store id, NUMERIC ONLY - unlike app(), the reviews feed has no bundle-id form."
3757
3803
  ),
3758
- country: import_zod27.z.string().optional().describe(
3804
+ country: import_zod28.z.string().optional().describe(
3759
3805
  "Two-letter ISO storefront code (default 'us'). Anything that is not exactly two letters is rejected with a free 400. Ask a different country to reach past the 500-review ceiling."
3760
3806
  ),
3761
- page: import_zod27.z.number().int().optional().describe(
3807
+ page: import_zod28.z.number().int().optional().describe(
3762
3808
  "Reviews page, 1-10, 50 reviews each (default 1). Apple hard-stops at page 10."
3763
3809
  ),
3764
- sort: import_zod27.z.enum(["most_recent", "most_helpful"]).optional().describe(
3810
+ sort: import_zod28.z.enum(["most_recent", "most_helpful"]).optional().describe(
3765
3811
  "Review ordering (default 'most_recent'). The choice decides whether the vote fields mean anything: under most_recent almost every review is too new to have been voted on and returns zeroes, while most_helpful returns them densely populated."
3766
3812
  )
3767
3813
  }),
@@ -3779,7 +3825,7 @@ var createScavioAppStoreReviewsTool = toolFactory(
3779
3825
  );
3780
3826
 
3781
3827
  // src/google-play.ts
3782
- var import_zod28 = require("zod");
3828
+ var import_zod29 = require("zod");
3783
3829
  var googlePlayToolSpecs = [
3784
3830
  defineScavioTool({
3785
3831
  key: "scavioGooglePlaySearch",
@@ -3788,14 +3834,14 @@ var googlePlayToolSpecs = [
3788
3834
  endpoint: "/api/v1/googleplay/search",
3789
3835
  credits: 2,
3790
3836
  description: "Ranked Google Play apps: package name, title, developer, rating, install count, price and IAP range, content rating, icon and screenshots. A branded query returns the hero card as result 1 in the same row shape, plus Play's related-query rail. NO PAGINATION - one shelf of about 30 apps. Costs 2 credits.",
3791
- inputSchema: import_zod28.z.object({
3792
- query: import_zod28.z.string().describe(
3837
+ inputSchema: import_zod29.z.object({
3838
+ query: import_zod29.z.string().describe(
3793
3839
  "What to search the store for (1-200 characters): an app name, a publisher, or a category phrase. Apps only - games are folded into the apps vertical, but books and films use a different card shape and are not covered."
3794
3840
  ),
3795
- hl: import_zod28.z.string().optional().describe(
3841
+ hl: import_zod29.z.string().optional().describe(
3796
3842
  "UI language, 2-20 characters (default 'en'). Changes the STOREFRONT, not only the strings: at hl=pt-BR the title, description, install formatting and content rating all move with it. Play silently falls back to English on a value it does not serve."
3797
3843
  ),
3798
- gl: import_zod28.z.string().optional().describe(
3844
+ gl: import_zod29.z.string().optional().describe(
3799
3845
  "Country code, 2-10 characters (default 'us'), deciding which storefront's price and availability are returned. Play silently falls back to the US storefront on a country it does not serve."
3800
3846
  )
3801
3847
  }),
@@ -3808,14 +3854,14 @@ var googlePlayToolSpecs = [
3808
3854
  endpoint: "/api/v1/googleplay/app",
3809
3855
  credits: 2,
3810
3856
  description: "Full Google Play store listing: installs including the REAL count Play publishes but never renders, rating and star histogram, description, developer identity and legal contact, price and IAPs, categories and gameplay tags, screenshots and trailer, version and Android requirement, release and update dates, changelog, the full permission tree, the Data safety table, the 20 server-rendered reviews and the similar-apps and more-by-developer rails. Costs 2 credits.",
3811
- inputSchema: import_zod28.z.object({
3812
- app_id: import_zod28.z.string().describe(
3857
+ inputSchema: import_zod29.z.object({
3858
+ app_id: import_zod29.z.string().describe(
3813
3859
  "Android package name ('com.spotify.music') or any play.google.com URL carrying one in its id param (1-500 characters)."
3814
3860
  ),
3815
- hl: import_zod28.z.string().optional().describe(
3861
+ hl: import_zod29.z.string().optional().describe(
3816
3862
  "UI language, 2-20 characters (default 'en'). Changes the STOREFRONT, not only the strings: title, description, install formatting and content rating all move with it. Play silently falls back to English on a value it does not serve."
3817
3863
  ),
3818
- gl: import_zod28.z.string().optional().describe(
3864
+ gl: import_zod29.z.string().optional().describe(
3819
3865
  "Country code, 2-10 characters (default 'us'), deciding which storefront's price and availability are returned. Play silently falls back to the US storefront on a country it does not serve."
3820
3866
  )
3821
3867
  }),
@@ -3828,23 +3874,23 @@ var googlePlayToolSpecs = [
3828
3874
  endpoint: "/api/v1/googleplay/reviews",
3829
3875
  credits: 2,
3830
3876
  description: "A page of Google Play reviews: star score, full text, author, thumbs-up count, developer reply and the APP VERSION the reviewer was running. Paged by cursor, up to 200 per call. app() already returns the 20 reviews Play server-renders; use this to page past them or sort differently. Costs 2 credits.",
3831
- inputSchema: import_zod28.z.object({
3832
- app_id: import_zod28.z.string().describe(
3877
+ inputSchema: import_zod29.z.object({
3878
+ app_id: import_zod29.z.string().describe(
3833
3879
  "Android package name ('com.spotify.music') or any play.google.com URL carrying one in its id param (1-500 characters)."
3834
3880
  ),
3835
- sort: import_zod28.z.enum(["relevance", "newest", "rating"]).optional().describe(
3881
+ sort: import_zod29.z.enum(["relevance", "newest", "rating"]).optional().describe(
3836
3882
  "Review ordering (default 'newest'). Closed enum. The cursor encodes the sort, so keep this identical when paging."
3837
3883
  ),
3838
- count: import_zod28.z.number().int().optional().describe(
3884
+ count: import_zod29.z.number().int().optional().describe(
3839
3885
  "Reviews to return, 1-200 (default 50); 200 is our cap, not Play's. Play honours more, but a single page that large is megabytes for one credit - page with cursor instead."
3840
3886
  ),
3841
- cursor: import_zod28.z.string().optional().describe(
3887
+ cursor: import_zod29.z.string().optional().describe(
3842
3888
  "Continuation token from a prior response's next_cursor (1-4000 characters). Opaque and SINGLE-USE, and it encodes the sort as well as the position - send it back with the SAME sort it came from. A cursor past the last review is a 404, not an empty page."
3843
3889
  ),
3844
- hl: import_zod28.z.string().optional().describe(
3890
+ hl: import_zod29.z.string().optional().describe(
3845
3891
  "UI language, 2-20 characters (default 'en'). Changes the STOREFRONT, not only the strings. Play silently falls back to English on a value it does not serve."
3846
3892
  ),
3847
- gl: import_zod28.z.string().optional().describe(
3893
+ gl: import_zod29.z.string().optional().describe(
3848
3894
  "Country code, 2-10 characters (default 'us'), deciding which storefront's price and availability are returned. Play silently falls back to the US storefront on a country it does not serve."
3849
3895
  )
3850
3896
  }),
@@ -3865,7 +3911,7 @@ var createScavioGooglePlayReviewsTool = toolFactory(
3865
3911
  );
3866
3912
 
3867
3913
  // src/sec.ts
3868
- var import_zod29 = require("zod");
3914
+ var import_zod30 = require("zod");
3869
3915
  var secToolSpecs = [
3870
3916
  defineScavioTool({
3871
3917
  key: "scavioSecLookup",
@@ -3874,14 +3920,14 @@ var secToolSpecs = [
3874
3920
  endpoint: "/api/v1/sec/lookup",
3875
3921
  credits: 1,
3876
3922
  description: "START HERE. Resolve a company name or ticker (AAPL) to the CIK (0000320193) every other SEC EDGAR endpoint is keyed by. Up to 100 rows, tiered by match quality. Costs 1 credit.",
3877
- inputSchema: import_zod29.z.object({
3878
- query: import_zod29.z.string().describe(
3923
+ inputSchema: import_zod30.z.object({
3924
+ query: import_zod30.z.string().describe(
3879
3925
  "Ticker ('AAPL', 'BRK.B'), company name, or a fragment of one (1-200 characters); each row carries its match tier as 'match'."
3880
3926
  ),
3881
- limit: import_zod29.z.number().int().optional().describe(
3927
+ limit: import_zod30.z.number().int().optional().describe(
3882
3928
  "Rows to return, 1-100. Defaults to 10. Sizes the response; it is not a page param."
3883
3929
  ),
3884
- exchange: import_zod29.z.enum(["NASDAQ", "NYSE", "OTC", "CBOE"]).optional().describe(
3930
+ exchange: import_zod30.z.enum(["NASDAQ", "NYSE", "OTC", "CBOE"]).optional().describe(
3885
3931
  "Restrict to one listing venue; matched case-insensitively, so 'Nasdaq' also works. Filers the SEC lists with no exchange at all are excluded by any value."
3886
3932
  )
3887
3933
  }),
@@ -3894,11 +3940,11 @@ var secToolSpecs = [
3894
3940
  endpoint: "/api/v1/sec/company",
3895
3941
  credits: 1,
3896
3942
  description: "SEC filer profile: legal and former names, SIC industry, filer category, EIN, LEI, state of incorporation, fiscal year end, addresses, every ticker with its exchange, and a preview of its 10 most recent filings. Provide cik or ticker. Costs 1 credit.",
3897
- inputSchema: import_zod29.z.object({
3898
- cik: import_zod29.z.string().optional().describe(
3943
+ inputSchema: import_zod30.z.object({
3944
+ cik: import_zod30.z.string().optional().describe(
3899
3945
  "Filer CIK in any spelling (1-20 characters): 320193, 0000320193 or CIK0000320193. A ticker is accepted here too."
3900
3946
  ),
3901
- ticker: import_zod29.z.string().optional().describe(
3947
+ ticker: import_zod30.z.string().optional().describe(
3902
3948
  "Ticker symbol (1-20 characters), dotted or dashed (BRK.B / BRK-B). Wins over cik when both are given."
3903
3949
  )
3904
3950
  }),
@@ -3911,23 +3957,23 @@ var secToolSpecs = [
3911
3957
  endpoint: "/api/v1/sec/filings",
3912
3958
  credits: 1,
3913
3959
  description: "A page of one filer's filings: accession number, form and root form, filing and period dates, 8-K item codes, direct links to the primary document, filing index and attachment directory. Up to 500 per page. Provide cik or ticker. Costs 1 credit.",
3914
- inputSchema: import_zod29.z.object({
3915
- cik: import_zod29.z.string().optional().describe(
3960
+ inputSchema: import_zod30.z.object({
3961
+ cik: import_zod30.z.string().optional().describe(
3916
3962
  "Filer CIK, zero-padded or bare (1-20 characters). A ticker is accepted here too."
3917
3963
  ),
3918
- ticker: import_zod29.z.string().optional().describe(
3964
+ ticker: import_zod30.z.string().optional().describe(
3919
3965
  "Ticker symbol (1-20 characters), as an alternative to cik."
3920
3966
  ),
3921
- form: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional().describe(
3967
+ form: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
3922
3968
  "Form types to keep: '10-K', ['10-K', '10-Q'] or the comma-joined '10-K,8-K'; each value 1-50 characters, at most 25 values. Matched against the form AND its root form, so 10-K also returns 10-K/A amendments; ask for '10-K/A' to get only amendments."
3923
3969
  ),
3924
- date_from: import_zod29.z.string().optional().describe("Earliest filing date, inclusive (YYYY-MM-DD)."),
3925
- date_to: import_zod29.z.string().optional().describe("Latest filing date, inclusive (YYYY-MM-DD)."),
3926
- page: import_zod29.z.number().int().optional().describe(
3970
+ date_from: import_zod30.z.string().optional().describe("Earliest filing date, inclusive (YYYY-MM-DD)."),
3971
+ date_to: import_zod30.z.string().optional().describe("Latest filing date, inclusive (YYYY-MM-DD)."),
3972
+ page: import_zod30.z.number().int().optional().describe(
3927
3973
  "Results page, 1-based; page size is whatever limit is set to. No upper bound."
3928
3974
  ),
3929
- limit: import_zod29.z.number().int().optional().describe("Filings per page, 1-500. Defaults to 50."),
3930
- include_history: import_zod29.z.boolean().optional().describe(
3975
+ limit: import_zod30.z.number().int().optional().describe("Filings per page, 1-500. Defaults to 50."),
3976
+ include_history: import_zod30.z.boolean().optional().describe(
3931
3977
  "Also fetch the archived filing history beyond EDGAR's 'recent' block, which is not a fixed window (a decade for a quiet filer, about a year for a prolific one). Off by default; at most 10 archived shards are fetched, history_truncated says when a filer had more, and it is still 1 credit."
3932
3978
  )
3933
3979
  }),
@@ -3940,26 +3986,26 @@ var secToolSpecs = [
3940
3986
  endpoint: "/api/v1/sec/concept",
3941
3987
  credits: 1,
3942
3988
  description: "Every value a filer reported for one XBRL concept, newest period first, with the form and filing each number came from. Restatements are kept, not collapsed. Up to 2000 rows. Provide cik or ticker. Costs 1 credit.",
3943
- inputSchema: import_zod29.z.object({
3944
- concept: import_zod29.z.string().describe(
3989
+ inputSchema: import_zod30.z.object({
3990
+ concept: import_zod30.z.string().describe(
3945
3991
  "XBRL concept tag, CASE-SENSITIVE (1-120 characters, ^[A-Za-z][A-Za-z0-9]*$): 'NetIncomeLoss' matches, 'netincomeloss' is a 404 upstream. Use facts() to list what a filer actually reports."
3946
3992
  ),
3947
- cik: import_zod29.z.string().optional().describe(
3993
+ cik: import_zod30.z.string().optional().describe(
3948
3994
  "Filer CIK, zero-padded or bare (1-20 characters). A ticker is accepted here too."
3949
3995
  ),
3950
- ticker: import_zod29.z.string().optional().describe(
3996
+ ticker: import_zod30.z.string().optional().describe(
3951
3997
  "Ticker symbol (1-20 characters), as an alternative to cik."
3952
3998
  ),
3953
- taxonomy: import_zod29.z.string().optional().describe(
3999
+ taxonomy: import_zod30.z.string().optional().describe(
3954
4000
  "Reporting taxonomy (1-40 characters, ^[A-Za-z][A-Za-z0-9-]*$): us-gaap, dei, ifrs-full or srt. Defaults to 'us-gaap'."
3955
4001
  ),
3956
- unit: import_zod29.z.string().optional().describe(
4002
+ unit: import_zod30.z.string().optional().describe(
3957
4003
  "Unit of measure to keep (1-40 characters), e.g. 'USD' vs 'USD/shares'."
3958
4004
  ),
3959
- form: import_zod29.z.string().optional().describe(
4005
+ form: import_zod30.z.string().optional().describe(
3960
4006
  "Form to keep (1-50 characters). EXACT match here, unlike filings(), so '10-K' excludes 10-K/A."
3961
4007
  ),
3962
- limit: import_zod29.z.number().int().optional().describe(
4008
+ limit: import_zod30.z.number().int().optional().describe(
3963
4009
  "Rows to return, 1-2000. Defaults to 250. Sizes the response; it is not a page param."
3964
4010
  )
3965
4011
  }),
@@ -3972,20 +4018,20 @@ var secToolSpecs = [
3972
4018
  endpoint: "/api/v1/sec/facts",
3973
4019
  credits: 1,
3974
4020
  description: "The index of every XBRL concept a filer reports - tag, label, description, units and most recent value - across us-gaap, dei and any other taxonomy it uses. This is how you find what to ask concept() for. Up to 2000 rows. Provide cik or ticker. Costs 1 credit.",
3975
- inputSchema: import_zod29.z.object({
3976
- cik: import_zod29.z.string().optional().describe(
4021
+ inputSchema: import_zod30.z.object({
4022
+ cik: import_zod30.z.string().optional().describe(
3977
4023
  "Filer CIK, zero-padded or bare (1-20 characters). A ticker is accepted here too."
3978
4024
  ),
3979
- ticker: import_zod29.z.string().optional().describe(
4025
+ ticker: import_zod30.z.string().optional().describe(
3980
4026
  "Ticker symbol (1-20 characters), as an alternative to cik."
3981
4027
  ),
3982
- taxonomy: import_zod29.z.string().optional().describe(
4028
+ taxonomy: import_zod30.z.string().optional().describe(
3983
4029
  "Restrict to one taxonomy (1-40 characters), e.g. 'us-gaap' or 'dei'."
3984
4030
  ),
3985
- query: import_zod29.z.string().optional().describe(
4031
+ query: import_zod30.z.string().optional().describe(
3986
4032
  "Case-insensitive substring matched against the tag name and label (1-200 characters)."
3987
4033
  ),
3988
- limit: import_zod29.z.number().int().optional().describe(
4034
+ limit: import_zod30.z.number().int().optional().describe(
3989
4035
  "Rows to return, 1-2000. Defaults to 250. Sizes the response; it is not a page param."
3990
4036
  )
3991
4037
  }),
@@ -3998,30 +4044,30 @@ var secToolSpecs = [
3998
4044
  endpoint: "/api/v1/sec/search",
3999
4045
  credits: 1,
4000
4046
  description: "EDGAR full-text search, coverage starting 2001: each hit is the matching DOCUMENT with its URL, form, filing date and filer identity, plus facets by company, form, industry and state. 100 documents per page, last page is 100. Costs 1 credit.",
4001
- inputSchema: import_zod29.z.object({
4002
- query: import_zod29.z.string().optional().describe(
4047
+ inputSchema: import_zod30.z.object({
4048
+ query: import_zod30.z.string().optional().describe(
4003
4049
  "Full-text query over filing documents (1-500 characters); a quoted phrase is matched exactly, bare words as a bag of terms. Optional - a cik, ticker, form or date filter on its own is a valid search."
4004
4050
  ),
4005
- cik: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional().describe(
4051
+ cik: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
4006
4052
  "Restrict to one or more filers by CIK: a single value, a list, or a comma-joined string; each 1-20 characters, at most 25 values. Tickers are accepted here too."
4007
4053
  ),
4008
- ticker: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional().describe(
4054
+ ticker: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
4009
4055
  "Restrict to one or more filers by ticker symbol: a single value, a list, or a comma-joined string; each 1-20 characters, at most 25 values."
4010
4056
  ),
4011
- form: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional().describe(
4057
+ form: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
4012
4058
  "Form types to keep: '8-K', ['10-K', '10-Q'] or the comma-joined '10-K,10-Q'; each 1-50 characters, at most 25 values."
4013
4059
  ),
4014
- date_from: import_zod29.z.string().optional().describe(
4060
+ date_from: import_zod30.z.string().optional().describe(
4015
4061
  "Earliest filing date, inclusive (YYYY-MM-DD). Full-text coverage starts in 2001."
4016
4062
  ),
4017
- date_to: import_zod29.z.string().optional().describe("Latest filing date, inclusive (YYYY-MM-DD)."),
4018
- location: import_zod29.z.union([import_zod29.z.string(), import_zod29.z.array(import_zod29.z.string())]).optional().describe(
4063
+ date_to: import_zod30.z.string().optional().describe("Latest filing date, inclusive (YYYY-MM-DD)."),
4064
+ location: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
4019
4065
  "Filer business-address locations as EDGAR's own 2-character codes (CA, NY, and its alphanumeric codes for foreign jurisdictions): a single value, a list, or a comma-joined string; at most 25 values."
4020
4066
  ),
4021
- sort: import_zod29.z.enum(["relevance", "newest", "oldest"]).optional().describe(
4067
+ sort: import_zod30.z.enum(["relevance", "newest", "oldest"]).optional().describe(
4022
4068
  "Result ordering. Defaults to the index's own relevance ranking."
4023
4069
  ),
4024
- page: import_zod29.z.number().int().optional().describe(
4070
+ page: import_zod30.z.number().int().optional().describe(
4025
4071
  "Results page, 1-based, 1-100, 100 documents per page. The SEC's index refuses a result window past 10,000, so 100 is the last page for any query."
4026
4072
  )
4027
4073
  }),
@@ -4036,7 +4082,7 @@ var createScavioSecFactsTool = toolFactory(secToolSpecs, "scavioSecFacts");
4036
4082
  var createScavioSecSearchTool = toolFactory(secToolSpecs, "scavioSecSearch");
4037
4083
 
4038
4084
  // src/redfin.ts
4039
- var import_zod30 = require("zod");
4085
+ var import_zod31 = require("zod");
4040
4086
  var redfinToolSpecs = [
4041
4087
  defineScavioTool({
4042
4088
  key: "scavioRedfinSearch",
@@ -4045,27 +4091,27 @@ var redfinToolSpecs = [
4045
4091
  endpoint: "/api/v1/redfin/search",
4046
4092
  credits: 1,
4047
4093
  description: "Redfin listings: price, price per sqft, beds, baths, living area, lot size, year built, coordinates, listing remarks and full photo galleries, for sale, sold or for rent. Up to 350 per page. Provide location, or region_id together with region_type. Costs 1 credit.",
4048
- inputSchema: import_zod30.z.object({
4049
- location: import_zod30.z.string().optional().describe(
4094
+ inputSchema: import_zod31.z.object({
4095
+ location: import_zod31.z.string().optional().describe(
4050
4096
  "A redfin.com region URL (/city/, /neighborhood/, /county/, /zipcode/) or a bare 5-digit ZIP (1-500 characters). CITY NAMES ARE NOT ACCEPTED - Redfin's own name lookup is blocked to us; use region_id + region_type instead."
4051
4097
  ),
4052
- region_id: import_zod30.z.number().int().optional().describe(
4098
+ region_id: import_zod31.z.number().int().optional().describe(
4053
4099
  "Redfin internal region id (>= 1), used together with region_type. NOT a ZIP code - the two are different number spaces and a ZIP here resolves to another city rather than failing."
4054
4100
  ),
4055
- region_type: import_zod30.z.union([import_zod30.z.literal(1), import_zod30.z.literal(2), import_zod30.z.literal(5), import_zod30.z.literal(6)]).optional().describe(
4101
+ region_type: import_zod31.z.union([import_zod31.z.literal(1), import_zod31.z.literal(2), import_zod31.z.literal(5), import_zod31.z.literal(6)]).optional().describe(
4056
4102
  "Region kind that region_id belongs to: 1 neighborhood, 2 ZIP, 5 county, 6 city. Must be sent together with region_id or both are ignored in favour of location."
4057
4103
  ),
4058
- listing_status: import_zod30.z.enum(["for_sale", "sold", "for_rent"]).optional().describe(
4104
+ listing_status: import_zod31.z.enum(["for_sale", "sold", "for_rent"]).optional().describe(
4059
4105
  "Market to search. Defaults to 'for_sale'."
4060
4106
  ),
4061
- sold_within_days: import_zod30.z.number().int().optional().describe(
4107
+ sold_within_days: import_zod31.z.number().int().optional().describe(
4062
4108
  "Sold within the last N days (>= 1). REJECTED unless listing_status='sold', where it defaults to 90."
4063
4109
  ),
4064
- page: import_zod30.z.number().int().optional().describe(
4110
+ page: import_zod31.z.number().int().optional().describe(
4065
4111
  "Results page, 1-based; page size is whatever limit is set to. No upper bound."
4066
4112
  ),
4067
- limit: import_zod30.z.number().int().optional().describe("Listings per page, 1-350. Defaults to 100."),
4068
- sort: import_zod30.z.enum([
4113
+ limit: import_zod31.z.number().int().optional().describe("Listings per page, 1-350. Defaults to 100."),
4114
+ sort: import_zod31.z.enum([
4069
4115
  "recommended",
4070
4116
  "price_low",
4071
4117
  "price_high",
@@ -4078,38 +4124,38 @@ var redfinToolSpecs = [
4078
4124
  ]).optional().describe(
4079
4125
  "Result sort order. Defaults to 'recommended', Redfin's own ranking."
4080
4126
  ),
4081
- min_price: import_zod30.z.number().optional().describe(
4127
+ min_price: import_zod31.z.number().optional().describe(
4082
4128
  "Minimum price, inclusive (>= 0). Monthly rent when listing_status='for_rent'."
4083
4129
  ),
4084
- max_price: import_zod30.z.number().optional().describe(
4130
+ max_price: import_zod31.z.number().optional().describe(
4085
4131
  "Maximum price, inclusive (>= 0). Monthly rent when listing_status='for_rent'."
4086
4132
  ),
4087
- beds_min: import_zod30.z.number().int().optional().describe(
4133
+ beds_min: import_zod31.z.number().int().optional().describe(
4088
4134
  "Minimum bedrooms (whole number >= 0); fractional values are rejected."
4089
4135
  ),
4090
- beds_max: import_zod30.z.number().int().optional().describe(
4136
+ beds_max: import_zod31.z.number().int().optional().describe(
4091
4137
  "Maximum bedrooms (whole number >= 0); fractional values are rejected."
4092
4138
  ),
4093
- baths_min: import_zod30.z.number().int().optional().describe(
4139
+ baths_min: import_zod31.z.number().int().optional().describe(
4094
4140
  "Minimum bathrooms (whole number >= 0). WHOLE BATHS ONLY - 1.5 is rejected rather than silently truncated to 1. There is no baths_max."
4095
4141
  ),
4096
- sqft_min: import_zod30.z.number().int().optional().describe(
4142
+ sqft_min: import_zod31.z.number().int().optional().describe(
4097
4143
  "Minimum living area in square feet (whole number >= 0)."
4098
4144
  ),
4099
- sqft_max: import_zod30.z.number().int().optional().describe(
4145
+ sqft_max: import_zod31.z.number().int().optional().describe(
4100
4146
  "Maximum living area in square feet (whole number >= 0)."
4101
4147
  ),
4102
- lot_size_min: import_zod30.z.number().int().optional().describe(
4148
+ lot_size_min: import_zod31.z.number().int().optional().describe(
4103
4149
  "Minimum lot size in square feet (whole number >= 0). There is no lot_size_max."
4104
4150
  ),
4105
- year_built_min: import_zod30.z.number().int().optional().describe(
4151
+ year_built_min: import_zod31.z.number().int().optional().describe(
4106
4152
  "Earliest year built (whole number >= 0)."
4107
4153
  ),
4108
- year_built_max: import_zod30.z.number().int().optional().describe(
4154
+ year_built_max: import_zod31.z.number().int().optional().describe(
4109
4155
  "Latest year built (whole number >= 0)."
4110
4156
  ),
4111
- max_hoa: import_zod30.z.number().optional().describe("Maximum monthly HOA fee in dollars (>= 0)."),
4112
- property_type: import_zod30.z.enum([
4157
+ max_hoa: import_zod31.z.number().optional().describe("Maximum monthly HOA fee in dollars (>= 0)."),
4158
+ property_type: import_zod31.z.enum([
4113
4159
  "house",
4114
4160
  "condo",
4115
4161
  "townhouse",
@@ -4120,11 +4166,11 @@ var redfinToolSpecs = [
4120
4166
  ]).optional().describe(
4121
4167
  "Restrict to one property type."
4122
4168
  ),
4123
- has_pool: import_zod30.z.boolean().optional().describe("Only listings with a pool."),
4124
- max_days_on_market: import_zod30.z.number().int().optional().describe(
4169
+ has_pool: import_zod31.z.boolean().optional().describe("Only listings with a pool."),
4170
+ max_days_on_market: import_zod31.z.number().int().optional().describe(
4125
4171
  "Listed at most N days ago (whole number >= 0). Cannot be combined with min_days_on_market - Redfin expresses both bounds through one param."
4126
4172
  ),
4127
- min_days_on_market: import_zod30.z.number().int().optional().describe(
4173
+ min_days_on_market: import_zod31.z.number().int().optional().describe(
4128
4174
  "Listed at least N days ago (whole number >= 0). Cannot be combined with max_days_on_market."
4129
4175
  )
4130
4176
  }),
@@ -4137,8 +4183,8 @@ var redfinToolSpecs = [
4137
4183
  endpoint: "/api/v1/redfin/property",
4138
4184
  credits: 1,
4139
4185
  description: "One Redfin listing in full: price, Redfin Estimate and rental estimate, complete MLS fact sheet, price and tax history, listing agents, open houses, schools, climate risk, walkability, sun exposure, monthly weather, permits, zoning, comparable sales and photos. Costs 1 credit.",
4140
- inputSchema: import_zod30.z.object({
4141
- property_id: import_zod30.z.string().describe(
4186
+ inputSchema: import_zod31.z.object({
4187
+ property_id: import_zod31.z.string().describe(
4142
4188
  "Redfin property id, or any redfin.com listing URL carrying one (1-500 characters)."
4143
4189
  )
4144
4190
  }),
@@ -4151,14 +4197,14 @@ var redfinToolSpecs = [
4151
4197
  endpoint: "/api/v1/redfin/market",
4152
4198
  credits: 1,
4153
4199
  description: "Redfin housing-market stats for a region: median list and sale price, price per sqft, sale-to-list ratio, average offers and days on market, YoY movement, 0-100 compete score, live inventory by property type and by bedroom count, and Redfin agent presence. Provide location, or region_id together with region_type. Costs 1 credit.",
4154
- inputSchema: import_zod30.z.object({
4155
- location: import_zod30.z.string().optional().describe(
4200
+ inputSchema: import_zod31.z.object({
4201
+ location: import_zod31.z.string().optional().describe(
4156
4202
  "A redfin.com region URL (/city/, /neighborhood/, /county/, /zipcode/) or a bare 5-digit ZIP (1-500 characters). City names are not accepted."
4157
4203
  ),
4158
- region_id: import_zod30.z.number().int().optional().describe(
4204
+ region_id: import_zod31.z.number().int().optional().describe(
4159
4205
  "Redfin internal region id (>= 1), used together with region_type. Not a ZIP code."
4160
4206
  ),
4161
- region_type: import_zod30.z.union([import_zod30.z.literal(1), import_zod30.z.literal(2), import_zod30.z.literal(5), import_zod30.z.literal(6)]).optional().describe(
4207
+ region_type: import_zod31.z.union([import_zod31.z.literal(1), import_zod31.z.literal(2), import_zod31.z.literal(5), import_zod31.z.literal(6)]).optional().describe(
4162
4208
  "Region kind that region_id belongs to: 1 neighborhood, 2 ZIP, 5 county, 6 city. Must be sent together with region_id or both are ignored in favour of location."
4163
4209
  )
4164
4210
  }),
@@ -4170,7 +4216,7 @@ var createScavioRedfinPropertyTool = toolFactory(redfinToolSpecs, "scavioRedfinP
4170
4216
  var createScavioRedfinMarketTool = toolFactory(redfinToolSpecs, "scavioRedfinMarket");
4171
4217
 
4172
4218
  // src/companies-house.ts
4173
- var import_zod31 = require("zod");
4219
+ var import_zod32 = require("zod");
4174
4220
  var companiesHouseToolSpecs = [
4175
4221
  defineScavioTool({
4176
4222
  key: "scavioCompaniesHouseSearch",
@@ -4179,11 +4225,11 @@ var companiesHouseToolSpecs = [
4179
4225
  endpoint: "/api/v1/companieshouse/search",
4180
4226
  credits: 1,
4181
4227
  description: "START HERE. Search the UK register by name and get the company_number every other Companies House endpoint is keyed by, plus status, incorporation or dissolution date, registered office and matched former names. 20 per page, last page is 50. Costs 1 credit.",
4182
- inputSchema: import_zod31.z.object({
4183
- query: import_zod31.z.string().describe(
4228
+ inputSchema: import_zod32.z.object({
4229
+ query: import_zod32.z.string().describe(
4184
4230
  "Company name or fragment (1-200 characters, non-blank). Matches CURRENT AND FORMER names."
4185
4231
  ),
4186
- page: import_zod31.z.number().int().optional().describe(
4232
+ page: import_zod32.z.number().int().optional().describe(
4187
4233
  "Results page, 1-based, 1-50, 20 results per page. Defaults to 1. The register serves only a 1000-result window per term whatever hit count it prints, and answers page 51 with HTTP 416."
4188
4234
  )
4189
4235
  }),
@@ -4196,8 +4242,8 @@ var companiesHouseToolSpecs = [
4196
4242
  endpoint: "/api/v1/companieshouse/company",
4197
4243
  credits: 1,
4198
4244
  description: "Full UK register entry: status, type, incorporation and dissolution dates, registered office, SIC codes, previous names, accounts and confirmation-statement due dates with overdue flags, and whether it has charges, insolvency history, officers or UK establishments. Costs 1 credit.",
4199
- inputSchema: import_zod31.z.object({
4200
- company_number: import_zod31.z.string().describe(
4245
+ inputSchema: import_zod32.z.object({
4246
+ company_number: import_zod32.z.string().describe(
4201
4247
  "UK company number (1-20 characters), zero-padded and upper-cased for you, so '445790' and 'sc090312' both work. Registry prefixes supported: SC, NI, OC, SO, NC, FC, BR, CE."
4202
4248
  )
4203
4249
  }),
@@ -4210,11 +4256,11 @@ var companiesHouseToolSpecs = [
4210
4256
  endpoint: "/api/v1/companieshouse/officers",
4211
4257
  credits: 1,
4212
4258
  description: "UK company officers, current and resigned, 35 per page: name, role, appointment and resignation dates, correspondence address, nationality, country of residence, month-and-year date of birth and identity-verification status. Costs 1 credit.",
4213
- inputSchema: import_zod31.z.object({
4214
- company_number: import_zod31.z.string().describe(
4259
+ inputSchema: import_zod32.z.object({
4260
+ company_number: import_zod32.z.string().describe(
4215
4261
  "UK company number (1-20 characters), zero-padded and upper-cased for you."
4216
4262
  ),
4217
- page: import_zod31.z.number().int().optional().describe(
4263
+ page: import_zod32.z.number().int().optional().describe(
4218
4264
  "Results page, 1-based, 35 per page. Defaults to 1. No upper bound: past the last page the register answers an ordinary 200 with an empty list, identical to a company with no officers."
4219
4265
  )
4220
4266
  }),
@@ -4227,11 +4273,11 @@ var companiesHouseToolSpecs = [
4227
4273
  endpoint: "/api/v1/companieshouse/filing-history",
4228
4274
  credits: 1,
4229
4275
  description: "UK filings, most recent first: date, filing type code (AA, CS01, SH03), description, register annotations and child documents, and a link to the filed PDF with its page count. A filing the register has not finished processing carries a processing_note instead of a document. Costs 1 credit.",
4230
- inputSchema: import_zod31.z.object({
4231
- company_number: import_zod31.z.string().describe(
4276
+ inputSchema: import_zod32.z.object({
4277
+ company_number: import_zod32.z.string().describe(
4232
4278
  "UK company number (1-20 characters), zero-padded and upper-cased for you."
4233
4279
  ),
4234
- page: import_zod31.z.number().int().optional().describe(
4280
+ page: import_zod32.z.number().int().optional().describe(
4235
4281
  "Results page, 1-based. Defaults to 1. No upper bound: past the last page the register answers an ordinary 200 with an empty list."
4236
4282
  )
4237
4283
  }),
@@ -4256,7 +4302,7 @@ var createScavioCompaniesHouseFilingHistoryTool = toolFactory(
4256
4302
  );
4257
4303
 
4258
4304
  // src/g2.ts
4259
- var import_zod32 = require("zod");
4305
+ var import_zod33 = require("zod");
4260
4306
  var g2ToolSpecs = [
4261
4307
  defineScavioTool({
4262
4308
  key: "scavioG2Search",
@@ -4265,27 +4311,27 @@ var g2ToolSpecs = [
4265
4311
  endpoint: "/api/v1/g2/search",
4266
4312
  credits: 5,
4267
4313
  description: "Search G2, the B2B software review site, for products: star rating, review count, vendor, categories, seller description and logo, with product_id and slug on every row. Up to 100 results per page (server default 20) and page-paginated; total_results is G2's Products-tab headline and caps at 10000, while total_by_type splits the query across products, sellers, categories and discussions. Provide query or url. Costs 5 credits.",
4268
- inputSchema: import_zod32.z.object({
4269
- query: import_zod32.z.string().optional().describe("Search term (1-200 characters). Provide this or url."),
4270
- page: import_zod32.z.number().int().optional().describe(
4314
+ inputSchema: import_zod33.z.object({
4315
+ query: import_zod33.z.string().optional().describe("Search term (1-200 characters). Provide this or url."),
4316
+ page: import_zod33.z.number().int().optional().describe(
4271
4317
  "1-based page number; page size follows limit (server default 20). G2 keeps paginating well past its own widget's page links."
4272
4318
  ),
4273
- limit: import_zod32.z.number().int().optional().describe(
4319
+ limit: import_zod33.z.number().int().optional().describe(
4274
4320
  "Results per page (1-100; server default 20). The 100 ceiling is ours, to keep a single request inside the 60s deadline; G2 itself paginates at any size."
4275
4321
  ),
4276
- sort: import_zod32.z.enum(["relevance", "popular", "alphabetical", "rating"]).optional().describe(
4322
+ sort: import_zod33.z.enum(["relevance", "popular", "alphabetical", "rating"]).optional().describe(
4277
4323
  "Result sort order (server default 'relevance'). Closed enum: G2 silently accepts an unknown sort and answers 200 with an unstated ordering."
4278
4324
  ),
4279
- rating: import_zod32.z.union([
4280
- import_zod32.z.literal(1),
4281
- import_zod32.z.literal(2),
4282
- import_zod32.z.literal(3),
4283
- import_zod32.z.literal(4),
4284
- import_zod32.z.literal(5)
4325
+ rating: import_zod33.z.union([
4326
+ import_zod33.z.literal(1),
4327
+ import_zod33.z.literal(2),
4328
+ import_zod33.z.literal(3),
4329
+ import_zod33.z.literal(4),
4330
+ import_zod33.z.literal(5)
4285
4331
  ]).optional().describe(
4286
4332
  "Only products at or above this star rating (1-5, sent as an integer). Omit for no rating floor."
4287
4333
  ),
4288
- url: import_zod32.z.string().optional().describe(
4334
+ url: import_zod33.z.string().optional().describe(
4289
4335
  "Full g2.com/search URL, as an alternative to query (1-1000 characters; the host is checked by the transport)."
4290
4336
  )
4291
4337
  }),
@@ -4298,11 +4344,11 @@ var g2ToolSpecs = [
4298
4344
  endpoint: "/api/v1/g2/product",
4299
4345
  credits: 5,
4300
4346
  description: "Full G2 product profile: rating with per-star histogram, review count, vendor, description and seller website, pricing editions with parsed amounts, feature groups, categories and breadcrumbs, supported languages, integrations, alternatives, head-to-head comparisons, media, community discussions and G2's AI-derived pros and cons. Carries NO review text at all -- G2 loads review bodies in a separate frame, so call reviews() for those. Provide product_id or url. Costs 5 credits.",
4301
- inputSchema: import_zod32.z.object({
4302
- product_id: import_zod32.z.string().optional().describe(
4347
+ inputSchema: import_zod33.z.object({
4348
+ product_id: import_zod33.z.string().optional().describe(
4303
4349
  "G2 product slug ('notion') or the numeric G2 id ('82623') as a string (1-200 characters); both resolve on the same upstream path."
4304
4350
  ),
4305
- url: import_zod32.z.string().optional().describe(
4351
+ url: import_zod33.z.string().optional().describe(
4306
4352
  "Full g2.com product URL, as an alternative to product_id (1-1000 characters)."
4307
4353
  )
4308
4354
  }),
@@ -4315,32 +4361,32 @@ var g2ToolSpecs = [
4315
4361
  endpoint: "/api/v1/g2/reviews",
4316
4362
  credits: 5,
4317
4363
  description: "A page of G2 reviews: rating, title, likes and dislikes, problems solved, reviewer job title, industry and company size, validated and incentivized flags -- plus what the profile page has no form of: exact per-star counts, pros and cons with per-theme counts, and company-size, role, industry, region and category facets with counts. Fixed at 10 reviews per page and paginates well past the 10 pages G2's own widget links to. Provide product_id or url. Costs 5 credits.",
4318
- inputSchema: import_zod32.z.object({
4319
- product_id: import_zod32.z.string().optional().describe(
4364
+ inputSchema: import_zod33.z.object({
4365
+ product_id: import_zod33.z.string().optional().describe(
4320
4366
  "G2 product slug or numeric G2 id as a string (1-200 characters)."
4321
4367
  ),
4322
- url: import_zod32.z.string().optional().describe(
4368
+ url: import_zod33.z.string().optional().describe(
4323
4369
  "Full g2.com reviews URL, as an alternative to product_id (1-1000 characters)."
4324
4370
  ),
4325
- page: import_zod32.z.number().int().optional().describe(
4371
+ page: import_zod33.z.number().int().optional().describe(
4326
4372
  "1-based page number; fixed at 10 reviews per page."
4327
4373
  ),
4328
- sort: import_zod32.z.enum(["relevance", "newest", "most_helpful", "rating_high", "rating_low"]).optional().describe(
4374
+ sort: import_zod33.z.enum(["relevance", "newest", "most_helpful", "rating_high", "rating_low"]).optional().describe(
4329
4375
  "Review sort order (server default 'relevance'). Closed enum: an unknown sort is silently accepted upstream and never runs."
4330
4376
  ),
4331
- rating: import_zod32.z.union([
4332
- import_zod32.z.literal(1),
4333
- import_zod32.z.literal(2),
4334
- import_zod32.z.literal(3),
4335
- import_zod32.z.literal(4),
4336
- import_zod32.z.literal(5)
4377
+ rating: import_zod33.z.union([
4378
+ import_zod33.z.literal(1),
4379
+ import_zod33.z.literal(2),
4380
+ import_zod33.z.literal(3),
4381
+ import_zod33.z.literal(4),
4382
+ import_zod33.z.literal(5)
4337
4383
  ]).optional().describe(
4338
4384
  "Only reviews in this star bucket (1-5, sent as an integer). Buckets are half- star-inclusive: 1 returns 0, 0.5 and 1-star reviews."
4339
4385
  ),
4340
- company_size: import_zod32.z.enum(["small_business", "mid_market", "enterprise"]).optional().describe(
4386
+ company_size: import_zod33.z.enum(["small_business", "mid_market", "enterprise"]).optional().describe(
4341
4387
  "Reviewer company size: small_business is 50 employees or fewer, mid_market 51-1000, enterprise over 1000. Closed enum -- an unknown value matches nothing and returns a billed 'Reviews (0)'."
4342
4388
  ),
4343
- role: import_zod32.z.enum([
4389
+ role: import_zod33.z.enum([
4344
4390
  "user",
4345
4391
  "administrator",
4346
4392
  "executive_sponsor",
@@ -4351,7 +4397,7 @@ var g2ToolSpecs = [
4351
4397
  ]).optional().describe(
4352
4398
  "Reviewer role. Closed enum -- an unknown value matches nothing rather than erroring."
4353
4399
  ),
4354
- region: import_zod32.z.enum([
4400
+ region: import_zod33.z.enum([
4355
4401
  "north_america",
4356
4402
  "europe",
4357
4403
  "asia",
@@ -4362,7 +4408,7 @@ var g2ToolSpecs = [
4362
4408
  ]).optional().describe(
4363
4409
  "Reviewer region. Closed enum -- an unknown value matches nothing rather than erroring."
4364
4410
  ),
4365
- query: import_zod32.z.string().optional().describe(
4411
+ query: import_zod33.z.string().optional().describe(
4366
4412
  "Full-text search within this product's reviews (1-200 characters); narrows the review list AND every facet count."
4367
4413
  )
4368
4414
  }),
@@ -4374,7 +4420,7 @@ var createScavioG2ProductTool = toolFactory(g2ToolSpecs, "scavioG2Product");
4374
4420
  var createScavioG2ReviewsTool = toolFactory(g2ToolSpecs, "scavioG2Reviews");
4375
4421
 
4376
4422
  // src/capterra.ts
4377
- var import_zod33 = require("zod");
4423
+ var import_zod34 = require("zod");
4378
4424
  var capterraToolSpecs = [
4379
4425
  defineScavioTool({
4380
4426
  key: "scavioCapterraSearch",
@@ -4383,11 +4429,11 @@ var capterraToolSpecs = [
4383
4429
  endpoint: "/api/v1/capterra/search",
4384
4430
  credits: 2,
4385
4431
  description: "Search Capterra, the B2B software review site: 20 ranked products with name, vendor description, rating, review count, logo and paid-placement flag, each row carrying product_id and slug. The result set is fixed at 20 and does NOT paginate -- Capterra serves identical rows for page 2, so there is deliberately no page parameter. Provide query or url. Costs 2 credits.",
4386
- inputSchema: import_zod33.z.object({
4387
- query: import_zod33.z.string().optional().describe(
4432
+ inputSchema: import_zod34.z.object({
4433
+ query: import_zod34.z.string().optional().describe(
4388
4434
  "Search term (1-200 characters). Required in practice: a term-less Capterra search serves a fixed popular-products list unrelated to the caller."
4389
4435
  ),
4390
- url: import_zod33.z.string().optional().describe(
4436
+ url: import_zod34.z.string().optional().describe(
4391
4437
  "Full capterra.com search URL, as an alternative to query (1-1000 characters; the transport also accepts capterra.co.uk and capterra.com.br hosts)."
4392
4438
  )
4393
4439
  }),
@@ -4400,14 +4446,14 @@ var capterraToolSpecs = [
4400
4446
  endpoint: "/api/v1/capterra/product",
4401
4447
  credits: 2,
4402
4448
  description: "Full Capterra profile: rating with per-star histogram and the four scored criteria, likelihood to recommend, review sentiment and topics, the complete pricing table with every plan and its features, every rated feature and integration, AI-derived pros and cons with the quoted review, FAQs, screenshots, badges and awards, competitor comparisons and alternatives, and the buyer profile by company size, industry and job function -- PLUS the 25 most recent reviews at no extra cost. vendor is always null here: Capterra does not publish it as structured data on the product page. Provide product_id or url. Costs 2 credits.",
4403
- inputSchema: import_zod33.z.object({
4404
- product_id: import_zod33.z.string().optional().describe(
4449
+ inputSchema: import_zod34.z.object({
4450
+ product_id: import_zod34.z.string().optional().describe(
4405
4451
  "The number in a Capterra product path such as /p/186596/Notion/ (1-50 characters). Must be a STRING -- a JSON number is rejected."
4406
4452
  ),
4407
- slug: import_zod33.z.string().optional().describe(
4453
+ slug: import_zod34.z.string().optional().describe(
4408
4454
  "Product slug (1-200 characters). Cosmetic on this endpoint -- a wrong slug still returns the right profile -- but load-bearing on reviews()."
4409
4455
  ),
4410
- url: import_zod33.z.string().optional().describe(
4456
+ url: import_zod34.z.string().optional().describe(
4411
4457
  "Full Capterra product URL, as an alternative to product_id (1-1000 characters)."
4412
4458
  )
4413
4459
  }),
@@ -4420,17 +4466,17 @@ var capterraToolSpecs = [
4420
4466
  endpoint: "/api/v1/capterra/reviews",
4421
4467
  credits: 2,
4422
4468
  description: "A page of Capterra reviews: overall score plus five per-criterion scores, title, pros, cons, advice, usage duration, incentivized flag, alternatives considered and what they switched from, reviewer job title, industry and company size, and the vendor response -- plus a competitor list richer than the profile's, each alternative with its own rating histogram and starting price. 25 reviews per page, capped at page 100. Page 1 already rides along inside product(), so use this to page past it. Provide product_id or url. Costs 2 credits.",
4423
- inputSchema: import_zod33.z.object({
4424
- product_id: import_zod33.z.string().optional().describe(
4469
+ inputSchema: import_zod34.z.object({
4470
+ product_id: import_zod34.z.string().optional().describe(
4425
4471
  "Capterra product id as a string (1-50 characters)."
4426
4472
  ),
4427
- slug: import_zod33.z.string().optional().describe(
4473
+ slug: import_zod34.z.string().optional().describe(
4428
4474
  "Product slug (1-200 characters). LOAD-BEARING here: it is case-sensitive upstream and a wrong one silently serves page one under a billed 200. Pass back the slug from search() or product()."
4429
4475
  ),
4430
- url: import_zod33.z.string().optional().describe(
4476
+ url: import_zod34.z.string().optional().describe(
4431
4477
  "Full Capterra reviews URL, as an alternative to product_id (1-1000 characters). Passing back reviews_url from product() is the reliable way to page."
4432
4478
  ),
4433
- page: import_zod33.z.number().int().optional().describe(
4479
+ page: import_zod34.z.number().int().optional().describe(
4434
4480
  "1-based page number (1-100); 25 reviews per page. 100 is a hard cap whatever the review count says -- past it Capterra answers 200 with page one."
4435
4481
  )
4436
4482
  }),
@@ -4451,7 +4497,7 @@ var createScavioCapterraReviewsTool = toolFactory(
4451
4497
  );
4452
4498
 
4453
4499
  // src/google-ads.ts
4454
- var import_zod34 = require("zod");
4500
+ var import_zod35 = require("zod");
4455
4501
  var googleAdsToolSpecs = [
4456
4502
  defineScavioTool({
4457
4503
  key: "scavioGoogleAdsAdvertisers",
@@ -4460,12 +4506,12 @@ var googleAdsToolSpecs = [
4460
4506
  endpoint: "/api/v1/googleads/advertisers",
4461
4507
  credits: 1,
4462
4508
  description: "Resolve a brand name or domain to the advertiser_id that search() and creative() are keyed by. Returns two row kinds in one list: 'advertiser' rows carrying the id, verified name, verification country and total ad count as a range, and 'domain' rows carrying a website. A name query returns both kinds; a domain-shaped query returns domains only. Autocomplete-backed, roughly 20 rows per arm, and it does not paginate. Costs 1 credit.",
4463
- inputSchema: import_zod34.z.object({
4464
- query: import_zod34.z.string().describe("Brand name or domain to resolve (1-200 characters)."),
4465
- region: import_zod34.z.string().optional().describe(
4509
+ inputSchema: import_zod35.z.object({
4510
+ query: import_zod35.z.string().describe("Brand name or domain to resolve (1-200 characters)."),
4511
+ region: import_zod35.z.string().optional().describe(
4466
4512
  "ISO 3166-1 alpha-2 country ('US', 'GB', 'DE') or a Google geo criteria id as a string (2-12 characters). Default: no region filter."
4467
4513
  ),
4468
- limit: import_zod34.z.number().int().optional().describe(
4514
+ limit: import_zod35.z.number().int().optional().describe(
4469
4515
  "Rows per arm (1-20; server default 10). Advertisers and domains are capped separately, so a name query can return up to twice this many rows."
4470
4516
  )
4471
4517
  }),
@@ -4478,27 +4524,27 @@ var googleAdsToolSpecs = [
4478
4524
  endpoint: "/api/v1/googleads/search",
4479
4525
  credits: 1,
4480
4526
  description: "Every ad Google Ads Transparency holds for one advertiser: the creative (archived image, rich-media bundle, Google's renderer link, dimensions), advertiser id and name, format, first and last seen dates and days actually run, plus total_ads_min and total_ads_max -- Google publishes the advertiser's ad total as a range, never an exact figure. Up to 100 ads per page (server default 40); paginate by sending next_cursor back as cursor alongside the SAME filters. Provide domain or advertiser_id. Costs 1 credit.",
4481
- inputSchema: import_zod34.z.object({
4482
- domain: import_zod34.z.string().optional().describe(
4527
+ inputSchema: import_zod35.z.object({
4528
+ domain: import_zod35.z.string().optional().describe(
4483
4529
  "Advertiser website (1-253 characters): bare host, www host or full URL, reduced to the registrable host. The only way to get `domain` back on each row."
4484
4530
  ),
4485
- advertiser_id: import_zod34.z.string().optional().describe(
4531
+ advertiser_id: import_zod35.z.string().optional().describe(
4486
4532
  "Google advertiser id, e.g. 'AR16735076323512287233' (3-40 characters). The shape is checked before any request, so a typo costs no credits. Querying by id drops `domain` from every row."
4487
4533
  ),
4488
- region: import_zod34.z.string().optional().describe(
4534
+ region: import_zod35.z.string().optional().describe(
4489
4535
  "ISO 3166-1 alpha-2 country ('US', 'GB', 'DE') or a Google geo criteria id as a string (2-12 characters). Scopes the deep links on every row, and the same advertiser can share zero creatives between two countries. Default: worldwide."
4490
4536
  ),
4491
- format: import_zod34.z.enum(["text", "image", "video"]).optional().describe(
4537
+ format: import_zod35.z.enum(["text", "image", "video"]).optional().describe(
4492
4538
  "Creative format. The three sets are disjoint -- an advertiser's text, image and video ads share no creatives. Default: all formats."
4493
4539
  ),
4494
- platform: import_zod34.z.enum(["play", "maps", "search", "shopping", "youtube"]).optional().describe(
4540
+ platform: import_zod35.z.enum(["play", "maps", "search", "shopping", "youtube"]).optional().describe(
4495
4541
  "Google surface the ad ran on. Default: all surfaces."
4496
4542
  ),
4497
- topic: import_zod34.z.enum(["all", "political"]).optional().describe("Ad topic (server default 'all')."),
4498
- limit: import_zod34.z.number().int().optional().describe(
4543
+ topic: import_zod35.z.enum(["all", "political"]).optional().describe("Ad topic (server default 'all')."),
4544
+ limit: import_zod35.z.number().int().optional().describe(
4499
4545
  "Ads per page (1-100; server default 40). 100 is a hard upstream ceiling, not our policy: Google answers a larger request with zero rows rather than an error."
4500
4546
  ),
4501
- cursor: import_zod34.z.string().optional().describe(
4547
+ cursor: import_zod35.z.string().optional().describe(
4502
4548
  "next_cursor from the previous response (1-4000 characters), 100 ads per page. Re-send the same filters alongside it; next_cursor is null once exhausted."
4503
4549
  )
4504
4550
  }),
@@ -4511,11 +4557,11 @@ var googleAdsToolSpecs = [
4511
4557
  endpoint: "/api/v1/googleads/creative",
4512
4558
  credits: 1,
4513
4559
  description: "One creative in full, and the only endpoint carrying its history: every size variation of the asset, the impression bucket, the per-region breakdown with first and last shown dates and a per-surface impression split inside each region, the format, Google's category label and the funder disclosure on political ads. Impressions and first_shown are EEA-only (DSA-compelled) and come back null for US creatives, and an impression bucket may carry only a lower or only an upper bound. Costs 1 credit.",
4514
- inputSchema: import_zod34.z.object({
4515
- advertiser_id: import_zod34.z.string().describe(
4560
+ inputSchema: import_zod35.z.object({
4561
+ advertiser_id: import_zod35.z.string().describe(
4516
4562
  "Google advertiser id, e.g. 'AR16735076323512287233' (3-40 characters)."
4517
4563
  ),
4518
- creative_id: import_zod34.z.string().describe(
4564
+ creative_id: import_zod35.z.string().describe(
4519
4565
  "Creative id (3-40 characters). It must belong to the advertiser_id sent with it -- the lookup is keyed by the pair and a mismatched pair is a 404."
4520
4566
  )
4521
4567
  }),
@@ -4536,7 +4582,7 @@ var createScavioGoogleAdsCreativeTool = toolFactory(
4536
4582
  );
4537
4583
 
4538
4584
  // src/meta-ads.ts
4539
- var import_zod35 = require("zod");
4585
+ var import_zod36 = require("zod");
4540
4586
  var metaAdsToolSpecs = [
4541
4587
  defineScavioTool({
4542
4588
  key: "scavioMetaAdsSearch",
@@ -4545,24 +4591,24 @@ var metaAdsToolSpecs = [
4545
4591
  endpoint: "/api/v1/meta-ads/search",
4546
4592
  credits: 1,
4547
4593
  description: "Search the Meta Ad Library by keyword: 30 ads on page 1 with the full creative -- page name, ad copy, headline, CTA, images and videos, the platforms each ran on and its run dates -- then 10 ads per cursor page, walking has_next_page to the end of the query. total_results caps at 50000 with total_is_capped true, because Meta only reports '>50,000'; never present it as an exact count. Every page costs 1 credit.",
4548
- inputSchema: import_zod35.z.object({
4549
- query: import_zod35.z.string().describe("Keyword to search the ad library for (1-200 characters)."),
4550
- country: import_zod35.z.string().optional().describe(
4594
+ inputSchema: import_zod36.z.object({
4595
+ query: import_zod36.z.string().describe("Keyword to search the ad library for (1-200 characters)."),
4596
+ country: import_zod36.z.string().optional().describe(
4551
4597
  "Ad library country as an exactly 2-character ISO 3166-1 alpha-2 code (server default 'US')."
4552
4598
  ),
4553
- active_status: import_zod35.z.enum(["all", "active", "inactive"]).optional().describe(
4599
+ active_status: import_zod36.z.enum(["all", "active", "inactive"]).optional().describe(
4554
4600
  "Whether the ad is still running (server default 'all')."
4555
4601
  ),
4556
- ad_type: import_zod35.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4602
+ ad_type: import_zod36.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4557
4603
  "Set 'political_and_issue_ads' to expose spend, reach, impressions and the paid-for-by disclosure; commercial ads leave all four null (server default 'all')."
4558
4604
  ),
4559
- media_type: import_zod35.z.enum(["all", "image", "video", "meme", "image_and_meme", "none"]).optional().describe(
4605
+ media_type: import_zod36.z.enum(["all", "image", "video", "meme", "image_and_meme", "none"]).optional().describe(
4560
4606
  "Creative media filter. Default: no media filter."
4561
4607
  ),
4562
- search_type: import_zod35.z.enum(["keyword_unordered", "keyword_exact_phrase"]).optional().describe(
4608
+ search_type: import_zod36.z.enum(["keyword_unordered", "keyword_exact_phrase"]).optional().describe(
4563
4609
  "How the query is matched (server default 'keyword_unordered')."
4564
4610
  ),
4565
- cursor: import_zod35.z.string().optional().describe(
4611
+ cursor: import_zod36.z.string().optional().describe(
4566
4612
  "next_cursor from the previous response: page 1 is 30 ads, every cursor page is 10. The cursor is a self-contained blob, so ALL other filters are ignored when it is present."
4567
4613
  )
4568
4614
  }),
@@ -4575,23 +4621,23 @@ var metaAdsToolSpecs = [
4575
4621
  endpoint: "/api/v1/meta-ads/advertiser",
4576
4622
  credits: 1,
4577
4623
  description: "Every ad a Facebook Page is running, by numeric page id: 30 ads on page 1 with the same creative detail as search(), then 10 ads per cursor page, walking has_next_page to the end of the advertiser. Every page costs 1 credit.",
4578
- inputSchema: import_zod35.z.object({
4579
- page_id: import_zod35.z.string().describe(
4624
+ inputSchema: import_zod36.z.object({
4625
+ page_id: import_zod36.z.string().describe(
4580
4626
  "The advertiser's numeric Facebook Page id (3-25 digits, as a string)."
4581
4627
  ),
4582
- country: import_zod35.z.string().optional().describe(
4628
+ country: import_zod36.z.string().optional().describe(
4583
4629
  "Ad library country as an exactly 2-character ISO 3166-1 alpha-2 code (server default 'US')."
4584
4630
  ),
4585
- active_status: import_zod35.z.enum(["all", "active", "inactive"]).optional().describe(
4631
+ active_status: import_zod36.z.enum(["all", "active", "inactive"]).optional().describe(
4586
4632
  "Whether the ad is still running (server default 'all')."
4587
4633
  ),
4588
- ad_type: import_zod35.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4634
+ ad_type: import_zod36.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4589
4635
  "Set 'political_and_issue_ads' to expose spend, reach, impressions and the paid-for-by disclosure; commercial ads leave all four null (server default 'all')."
4590
4636
  ),
4591
- media_type: import_zod35.z.enum(["all", "image", "video", "meme", "image_and_meme", "none"]).optional().describe(
4637
+ media_type: import_zod36.z.enum(["all", "image", "video", "meme", "image_and_meme", "none"]).optional().describe(
4592
4638
  "Creative media filter. Default: no media filter."
4593
4639
  ),
4594
- cursor: import_zod35.z.string().optional().describe(
4640
+ cursor: import_zod36.z.string().optional().describe(
4595
4641
  "next_cursor from the previous response: page 1 is 30 ads, every cursor page is 10. ALL other filters are ignored when it is present."
4596
4642
  )
4597
4643
  }),
@@ -4604,8 +4650,8 @@ var metaAdsToolSpecs = [
4604
4650
  endpoint: "/api/v1/meta-ads/ad",
4605
4651
  credits: 1,
4606
4652
  description: "One Meta ad in full by archive id: creative, advertiser, run dates, the platforms it ran on, and the political disclosure when the ad carries one. Commercial ads leave spend, reach and impressions null. Costs 1 credit.",
4607
- inputSchema: import_zod35.z.object({
4608
- ad_archive_id: import_zod35.z.string().describe("Meta ad archive id (3-25 digits, as a string).")
4653
+ inputSchema: import_zod36.z.object({
4654
+ ad_archive_id: import_zod36.z.string().describe("Meta ad archive id (3-25 digits, as a string).")
4609
4655
  }),
4610
4656
  call: (client, input) => client.metaAds.ad(input)
4611
4657
  })
@@ -4618,7 +4664,7 @@ var createScavioMetaAdsAdvertiserTool = toolFactory(
4618
4664
  var createScavioMetaAdsAdTool = toolFactory(metaAdsToolSpecs, "scavioMetaAdsAd");
4619
4665
 
4620
4666
  // src/extract-web.ts
4621
- var import_zod36 = require("zod");
4667
+ var import_zod37 = require("zod");
4622
4668
  var JOB_POLL_INTERVAL_MS = 3e3;
4623
4669
  var JOB_WAIT_DEFAULT_SECONDS = 45;
4624
4670
  var JOB_WAIT_MAX_SECONDS = 300;
@@ -4649,20 +4695,20 @@ async function startAndWait(start, status, input) {
4649
4695
  var MODE_DESCRIPTION = "Fetch tier, and the price-bearing parameter: 'normal' is the standard fetch, 'advanced' renders JavaScript-built pages, 'ultra' reaches the hardest pages. Server default 'normal'.";
4650
4696
  var PATHS_DESCRIPTION = "Path globs (max 20). '*' matches within one path segment, '**' across segments; a pattern without wildcards matches that path and everything under it. Example: ['/blog/**'].";
4651
4697
  var JOB_PRICE = "Billed per SUCCESSFUL page at Extract's price for the mode: normal and advanced 1 credit, ultra 2 credits. Failed and skipped pages are free, and if the balance runs out the job stops cleanly.";
4652
- var mode = import_zod36.z.enum(["normal", "advanced", "ultra"]).optional().describe(MODE_DESCRIPTION);
4653
- var format = import_zod36.z.enum(["html", "markdown", "text"]).optional().describe("Format for each page, as on extract: html, markdown or text (server default markdown).");
4654
- var waitSeconds = import_zod36.z.number().int().min(0).max(JOB_WAIT_MAX_SECONDS).optional().describe(
4698
+ var mode = import_zod37.z.enum(["normal", "advanced", "ultra"]).optional().describe(MODE_DESCRIPTION);
4699
+ var format = import_zod37.z.enum(["html", "markdown", "text"]).optional().describe("Format for each page, as on extract: html, markdown or text (server default markdown).");
4700
+ var waitSeconds = import_zod37.z.number().int().min(0).max(JOB_WAIT_MAX_SECONDS).optional().describe(
4655
4701
  "Seconds to wait for the job to finish before returning, 0-300 (default 45). 0 returns the job id at once. A job still running when the wait ends keeps going; read it later with its status tool."
4656
4702
  );
4657
- var limit = import_zod36.z.number().int().min(1).max(100).optional().describe(
4703
+ var limit = import_zod37.z.number().int().min(1).max(100).optional().describe(
4658
4704
  "Results per response, 1-100 (default 10, to keep page content inside the context window); page on with next_cursor."
4659
4705
  );
4660
- var includeContent = import_zod36.z.boolean().optional().describe("Set false to list results without their page content (default true).");
4661
- var statusSchema = import_zod36.z.object({
4662
- id: import_zod36.z.string().describe("Job id returned when the job was started (data.id)."),
4663
- cursor: import_zod36.z.string().optional().describe("next_cursor from the previous response, to read the next page."),
4706
+ var includeContent = import_zod37.z.boolean().optional().describe("Set false to list results without their page content (default true).");
4707
+ var statusSchema = import_zod37.z.object({
4708
+ id: import_zod37.z.string().describe("Job id returned when the job was started (data.id)."),
4709
+ cursor: import_zod37.z.string().optional().describe("next_cursor from the previous response, to read the next page."),
4664
4710
  limit,
4665
- status: import_zod36.z.enum(["succeeded", "failed", "skipped"]).optional().describe("Only results with this status."),
4711
+ status: import_zod37.z.enum(["succeeded", "failed", "skipped"]).optional().describe("Only results with this status."),
4666
4712
  include_content: includeContent
4667
4713
  });
4668
4714
  var readStatus = (fn) => (client, { id, limit: max, ...query }) => fn(client)(id, { ...query, limit: max ?? JOB_RESULTS_DEFAULT_LIMIT });
@@ -4674,19 +4720,19 @@ var extractWebToolSpecs = [
4674
4720
  endpoint: "/api/v1/extract/map",
4675
4721
  credits: 1,
4676
4722
  description: "List a website's page URLs, gathered from its sitemaps and its start page, deduplicated, filtered by path or search words and limited: { url, links: [{ url, source, lastmod }], total_found, returned, truncated }. Pages the site's robots.txt disallows are left out. Use it to find the right pages before extracting or crawling. Costs 1 credit in normal mode; advanced costs up to 2 credits and ultra up to 10, priced by what the call needed.",
4677
- inputSchema: import_zod36.z.object({
4678
- url: import_zod36.z.string().describe("The site to map. A bare host is upgraded to https."),
4679
- search: import_zod36.z.string().optional().describe("Only return URLs containing every word of this text (case-insensitive)."),
4680
- limit: import_zod36.z.number().int().min(1).max(5e3).optional().describe(
4723
+ inputSchema: import_zod37.z.object({
4724
+ url: import_zod37.z.string().describe("The site to map. A bare host is upgraded to https."),
4725
+ search: import_zod37.z.string().optional().describe("Only return URLs containing every word of this text (case-insensitive)."),
4726
+ limit: import_zod37.z.number().int().min(1).max(5e3).optional().describe(
4681
4727
  "Maximum links to return, 1-5000. Default 1000 (or the plan's limit if lower: Free 500, PAYG 1,000, paid plans 5,000)."
4682
4728
  ),
4683
- sitemap: import_zod36.z.enum(["include", "only", "skip"]).optional().describe(
4729
+ sitemap: import_zod37.z.enum(["include", "only", "skip"]).optional().describe(
4684
4730
  "'include' combines the site's sitemaps with the start page's links (default); 'only' uses sitemaps alone; 'skip' uses page links alone."
4685
4731
  ),
4686
- include_subdomains: import_zod36.z.boolean().optional().describe("Also return URLs on subdomains of the site (default false)."),
4687
- include_paths: import_zod36.z.array(import_zod36.z.string()).optional().describe(`Keep only URLs matching these. ${PATHS_DESCRIPTION}`),
4688
- exclude_paths: import_zod36.z.array(import_zod36.z.string()).optional().describe(`Drop URLs matching these. ${PATHS_DESCRIPTION}`),
4689
- ignore_query_parameters: import_zod36.z.boolean().optional().describe("Treat URLs that differ only by query string as one URL (default true)."),
4732
+ include_subdomains: import_zod37.z.boolean().optional().describe("Also return URLs on subdomains of the site (default false)."),
4733
+ include_paths: import_zod37.z.array(import_zod37.z.string()).optional().describe(`Keep only URLs matching these. ${PATHS_DESCRIPTION}`),
4734
+ exclude_paths: import_zod37.z.array(import_zod37.z.string()).optional().describe(`Drop URLs matching these. ${PATHS_DESCRIPTION}`),
4735
+ ignore_query_parameters: import_zod37.z.boolean().optional().describe("Treat URLs that differ only by query string as one URL (default true)."),
4690
4736
  mode
4691
4737
  }),
4692
4738
  call: async (client, input) => await client.extract.map(input)
@@ -4698,17 +4744,17 @@ var extractWebToolSpecs = [
4698
4744
  endpoint: "/api/v1/extract/crawl",
4699
4745
  credits: 1,
4700
4746
  description: "Crawl a website from one start URL: same-site pages are discovered and extracted breadth-first within the page, depth and path limits, each returned as Markdown, text or HTML. Pages the site's robots.txt disallows are skipped. Waits up to wait_seconds (default 45) and returns { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio-crawl-status with the id later. " + JOB_PRICE,
4701
- inputSchema: import_zod36.z.object({
4702
- url: import_zod36.z.string().describe("Where the crawl starts. Only pages on the same site are crawled."),
4703
- max_pages: import_zod36.z.number().int().min(1).max(1e4).optional().describe(
4747
+ inputSchema: import_zod37.z.object({
4748
+ url: import_zod37.z.string().describe("Where the crawl starts. Only pages on the same site are crawled."),
4749
+ max_pages: import_zod37.z.number().int().min(1).max(1e4).optional().describe(
4704
4750
  "Maximum pages to fetch. Default 100. Plan limits: Free 10, PAYG 100, Project 500, Bootstrap 2,000, Startup 5,000, Growth 10,000."
4705
4751
  ),
4706
- max_depth: import_zod36.z.number().int().min(0).max(10).optional().describe("How many links away from the start page to follow, 0-10 (default 3). 0 fetches only the start page."),
4707
- include_paths: import_zod36.z.array(import_zod36.z.string()).optional().describe(`Crawl only paths matching these. ${PATHS_DESCRIPTION}`),
4708
- exclude_paths: import_zod36.z.array(import_zod36.z.string()).optional().describe(`Skip paths matching these. ${PATHS_DESCRIPTION}`),
4709
- allow_subdomains: import_zod36.z.boolean().optional().describe("Also crawl subdomains of the site (default false)."),
4710
- ignore_query_parameters: import_zod36.z.boolean().optional().describe("Treat URLs that differ only by query string as one page (default true)."),
4711
- sitemap: import_zod36.z.enum(["include", "skip", "only"]).optional().describe(
4752
+ max_depth: import_zod37.z.number().int().min(0).max(10).optional().describe("How many links away from the start page to follow, 0-10 (default 3). 0 fetches only the start page."),
4753
+ include_paths: import_zod37.z.array(import_zod37.z.string()).optional().describe(`Crawl only paths matching these. ${PATHS_DESCRIPTION}`),
4754
+ exclude_paths: import_zod37.z.array(import_zod37.z.string()).optional().describe(`Skip paths matching these. ${PATHS_DESCRIPTION}`),
4755
+ allow_subdomains: import_zod37.z.boolean().optional().describe("Also crawl subdomains of the site (default false)."),
4756
+ ignore_query_parameters: import_zod37.z.boolean().optional().describe("Treat URLs that differ only by query string as one page (default true)."),
4757
+ sitemap: import_zod37.z.enum(["include", "skip", "only"]).optional().describe(
4712
4758
  "'include' also starts from the site's sitemap (default); 'skip' follows links only; 'only' fetches sitemap pages without following links."
4713
4759
  ),
4714
4760
  format,
@@ -4740,8 +4786,8 @@ var extractWebToolSpecs = [
4740
4786
  endpoint: "/api/v1/extract/batch",
4741
4787
  credits: 1,
4742
4788
  description: "Extract a list of URLs (up to 1,000, plan-limited) in one job, each returned as Markdown, text or HTML exactly like scavio-extract. Waits up to wait_seconds (default 45) and returns { id, status, pages, credits_used, results, next_cursor }; if status is still queued or running, call scavio-batch-status with the id later. " + JOB_PRICE,
4743
- inputSchema: import_zod36.z.object({
4744
- urls: import_zod36.z.array(import_zod36.z.string()).min(1).max(1e3).describe(
4789
+ inputSchema: import_zod37.z.object({
4790
+ urls: import_zod37.z.array(import_zod37.z.string()).min(1).max(1e3).describe(
4745
4791
  "The pages to extract (duplicates removed). Plan limits: Free 10, PAYG 50, Project 100, Bootstrap 500, Startup and Growth 1,000."
4746
4792
  ),
4747
4793
  format,
@@ -5010,6 +5056,8 @@ function createScavioTools(config) {
5010
5056
  createScavioCompaniesHouseSearchTool,
5011
5057
  createScavioCrawlStatusTool,
5012
5058
  createScavioCrawlWebsiteTool,
5059
+ createScavioDecathlonProductTool,
5060
+ createScavioDecathlonSearchTool,
5013
5061
  createScavioEbayProductTool,
5014
5062
  createScavioEbaySearchTool,
5015
5063
  createScavioEbaySellerTool,
@@ -5188,6 +5236,7 @@ function createScavioTools(config) {
5188
5236
  createScavioZillowAgentReviewsTool,
5189
5237
  createScavioZillowPropertyTool,
5190
5238
  createScavioZillowSearchTool,
5239
+ decathlonToolSpecs,
5191
5240
  ebayToolSpecs,
5192
5241
  extractToolSpecs,
5193
5242
  extractWebToolSpecs,