mastra-scavio 0.8.0 → 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,
@@ -80,6 +82,9 @@ __export(index_exports, {
80
82
  createScavioGoogleShoppingTool: () => createScavioGoogleShoppingTool,
81
83
  createScavioGoogleTrendingTool: () => createScavioGoogleTrendingTool,
82
84
  createScavioGoogleTrendsTool: () => createScavioGoogleTrendsTool,
85
+ createScavioHebProductTool: () => createScavioHebProductTool,
86
+ createScavioHebSearchTool: () => createScavioHebSearchTool,
87
+ createScavioHebStoresTool: () => createScavioHebStoresTool,
83
88
  createScavioHomeDepotProductTool: () => createScavioHomeDepotProductTool,
84
89
  createScavioHomeDepotReviewsTool: () => createScavioHomeDepotReviewsTool,
85
90
  createScavioHomeDepotSearchTool: () => createScavioHomeDepotSearchTool,
@@ -99,6 +104,8 @@ __export(index_exports, {
99
104
  createScavioInstagramUserReelsTool: () => createScavioInstagramUserReelsTool,
100
105
  createScavioInstagramUserStoriesTool: () => createScavioInstagramUserStoriesTool,
101
106
  createScavioInstagramUserTaggedTool: () => createScavioInstagramUserTaggedTool,
107
+ createScavioKrogerProductTool: () => createScavioKrogerProductTool,
108
+ createScavioKrogerSearchTool: () => createScavioKrogerSearchTool,
102
109
  createScavioKuaishouCommentRepliesTool: () => createScavioKuaishouCommentRepliesTool,
103
110
  createScavioKuaishouProfileTool: () => createScavioKuaishouProfileTool,
104
111
  createScavioKuaishouSearchLiveTool: () => createScavioKuaishouSearchLiveTool,
@@ -222,6 +229,7 @@ __export(index_exports, {
222
229
  createScavioZillowAgentReviewsTool: () => createScavioZillowAgentReviewsTool,
223
230
  createScavioZillowPropertyTool: () => createScavioZillowPropertyTool,
224
231
  createScavioZillowSearchTool: () => createScavioZillowSearchTool,
232
+ decathlonToolSpecs: () => decathlonToolSpecs,
225
233
  ebayToolSpecs: () => ebayToolSpecs,
226
234
  extractToolSpecs: () => extractToolSpecs,
227
235
  extractWebToolSpecs: () => extractWebToolSpecs,
@@ -231,9 +239,11 @@ __export(index_exports, {
231
239
  googleAdsToolSpecs: () => googleAdsToolSpecs,
232
240
  googlePlayToolSpecs: () => googlePlayToolSpecs,
233
241
  googleToolSpecs: () => googleToolSpecs,
242
+ hebToolSpecs: () => hebToolSpecs,
234
243
  homeDepotToolSpecs: () => homeDepotToolSpecs,
235
244
  indeedToolSpecs: () => indeedToolSpecs,
236
245
  instagramToolSpecs: () => instagramToolSpecs,
246
+ krogerToolSpecs: () => krogerToolSpecs,
237
247
  kuaishouToolSpecs: () => kuaishouToolSpecs,
238
248
  linkedinToolSpecs: () => linkedinToolSpecs,
239
249
  metaAdsToolSpecs: () => metaAdsToolSpecs,
@@ -287,6 +297,9 @@ var SCAVIO_PLATFORMS = [
287
297
  "ebay",
288
298
  "target",
289
299
  "home-depot",
300
+ "heb",
301
+ "kroger",
302
+ "decathlon",
290
303
  "zillow",
291
304
  "booking",
292
305
  "tripadvisor",
@@ -2797,8 +2810,137 @@ var createScavioHomeDepotReviewsTool = toolFactory(
2797
2810
  "scavioHomeDepotReviews"
2798
2811
  );
2799
2812
 
2800
- // src/zillow.ts
2813
+ // src/heb.ts
2801
2814
  var import_zod18 = require("zod");
2815
+ var hebToolSpecs = [
2816
+ defineScavioTool({
2817
+ key: "scavioHebSearch",
2818
+ id: "scavio-heb-search",
2819
+ platform: "heb",
2820
+ endpoint: "/api/v1/heb/search",
2821
+ credits: 2,
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.",
2823
+ inputSchema: import_zod18.z.object({
2824
+ query: import_zod18.z.string().describe("Search keywords (1-200 characters)."),
2825
+ page: import_zod18.z.number().int().optional().describe("Results page, 1-based (1-100)."),
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
+ )
2830
+ }),
2831
+ call: (client, input) => client.heb.search(input)
2832
+ }),
2833
+ defineScavioTool({
2834
+ key: "scavioHebProduct",
2835
+ id: "scavio-heb-product",
2836
+ platform: "heb",
2837
+ endpoint: "/api/v1/heb/product",
2838
+ credits: 2,
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.",
2840
+ inputSchema: import_zod18.z.object({
2841
+ product_url: import_zod18.z.string().optional().describe(
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.'
2843
+ ),
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
+ )
2849
+ }),
2850
+ call: (client, input) => client.heb.product(input)
2851
+ }),
2852
+ defineScavioTool({
2853
+ key: "scavioHebStores",
2854
+ id: "scavio-heb-stores",
2855
+ platform: "heb",
2856
+ endpoint: "/api/v1/heb/stores",
2857
+ credits: 2,
2858
+ description: "HEB stores near a US ZIP code or city: store number, address, phone, hours, pharmacy availability, fulfillment channels, distance and store URL. Pass zip or city. Costs 2 credits.",
2859
+ inputSchema: import_zod18.z.object({
2860
+ zip: import_zod18.z.string().optional().describe('5-digit US ZIP code (e.g. "78701").'),
2861
+ city: import_zod18.z.string().optional().describe('City name (e.g. "Austin"). Pass zip or city.')
2862
+ }),
2863
+ call: (client, input) => client.heb.stores(input)
2864
+ })
2865
+ ];
2866
+ var createScavioHebSearchTool = toolFactory(hebToolSpecs, "scavioHebSearch");
2867
+ var createScavioHebProductTool = toolFactory(hebToolSpecs, "scavioHebProduct");
2868
+ var createScavioHebStoresTool = toolFactory(hebToolSpecs, "scavioHebStores");
2869
+
2870
+ // src/kroger.ts
2871
+ var import_zod19 = require("zod");
2872
+ var krogerToolSpecs = [
2873
+ defineScavioTool({
2874
+ key: "scavioKrogerSearch",
2875
+ id: "scavio-kroger-search",
2876
+ platform: "kroger",
2877
+ endpoint: "/api/v1/kroger/search",
2878
+ credits: 2,
2879
+ description: "Search Kroger grocery products: price in cents, promo price, n-for deals, unit price, size, UPC, stock, SNAP eligibility, dietary info, rating and category. Kroger operates Kroger, Ralphs, Fred Meyer, Harris Teeter, King Soopers, Fry's and other banners. Costs 2 credits.",
2880
+ inputSchema: import_zod19.z.object({
2881
+ query: import_zod19.z.string().describe("Search keywords (1-200 characters)."),
2882
+ page: import_zod19.z.number().int().optional().describe("Results page, 1-based (1-100).")
2883
+ }),
2884
+ call: (client, input) => client.kroger.search(input)
2885
+ }),
2886
+ defineScavioTool({
2887
+ key: "scavioKrogerProduct",
2888
+ id: "scavio-kroger-product",
2889
+ platform: "kroger",
2890
+ endpoint: "/api/v1/kroger/product",
2891
+ credits: 2,
2892
+ description: "Full Kroger product detail by URL or UPC: nutrition facts, allergens, ingredients, nutrients with daily values, description, images, rating distribution, store aisle, stock, dietary flags, SNAP eligibility, dimensions and country of origin. Costs 2 credits.",
2893
+ inputSchema: import_zod19.z.object({
2894
+ product_url: import_zod19.z.string().optional().describe(
2895
+ 'Full or relative product URL from kroger.com (e.g. "/p/kroger-2-reduced-fat-milk-gallon/0001111041700"). Preferred.'
2896
+ ),
2897
+ upc: import_zod19.z.string().optional().describe("Kroger product UPC (from search or product URLs: /p/{slug}/{upc})."),
2898
+ slug: import_zod19.z.string().optional().describe("Product slug for readable URL. Optional with upc.")
2899
+ }),
2900
+ call: (client, input) => client.kroger.product(input)
2901
+ })
2902
+ ];
2903
+ var createScavioKrogerSearchTool = toolFactory(krogerToolSpecs, "scavioKrogerSearch");
2904
+ var createScavioKrogerProductTool = toolFactory(krogerToolSpecs, "scavioKrogerProduct");
2905
+
2906
+ // src/decathlon.ts
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");
2802
2944
  var zillowToolSpecs = [
2803
2945
  defineScavioTool({
2804
2946
  key: "scavioZillowSearch",
@@ -2807,15 +2949,15 @@ var zillowToolSpecs = [
2807
2949
  endpoint: "/api/v1/zillow/search",
2808
2950
  credits: 1,
2809
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.",
2810
- inputSchema: import_zod18.z.object({
2811
- location: import_zod18.z.string().describe(
2952
+ inputSchema: import_zod21.z.object({
2953
+ location: import_zod21.z.string().describe(
2812
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."
2813
2955
  ),
2814
- listing_status: import_zod18.z.enum(["for_sale", "for_rent", "sold"]).optional().describe(
2956
+ listing_status: import_zod21.z.enum(["for_sale", "for_rent", "sold"]).optional().describe(
2815
2957
  "Which listings to return. Defaults to 'for_sale'."
2816
2958
  ),
2817
- page: import_zod18.z.number().int().optional().describe("Results page, 1-based."),
2818
- sort: import_zod18.z.enum([
2959
+ page: import_zod21.z.number().int().optional().describe("Results page, 1-based."),
2960
+ sort: import_zod21.z.enum([
2819
2961
  "relevance",
2820
2962
  "recommended",
2821
2963
  "newest",
@@ -2833,44 +2975,44 @@ var zillowToolSpecs = [
2833
2975
  ]).optional().describe(
2834
2976
  "Result sort order. Sorts that rank against a signed-in profile (saved/featured/personalised) are unsupported - we are never signed in."
2835
2977
  ),
2836
- min_price: import_zod18.z.number().optional().describe(
2978
+ min_price: import_zod21.z.number().optional().describe(
2837
2979
  "Minimum price, inclusive (0 or greater). On listing_status='for_rent' this is MONTHLY RENT - Zillow files rent under its payment filter."
2838
2980
  ),
2839
- max_price: import_zod18.z.number().optional().describe(
2981
+ max_price: import_zod21.z.number().optional().describe(
2840
2982
  "Maximum price, inclusive (0 or greater). On listing_status='for_rent' this is MONTHLY RENT."
2841
2983
  ),
2842
- beds_min: import_zod18.z.number().int().optional().describe(
2984
+ beds_min: import_zod21.z.number().int().optional().describe(
2843
2985
  "Minimum bedrooms; whole number, 0 or greater."
2844
2986
  ),
2845
- beds_max: import_zod18.z.number().int().optional().describe(
2987
+ beds_max: import_zod21.z.number().int().optional().describe(
2846
2988
  "Maximum bedrooms; whole number, 0 or greater."
2847
2989
  ),
2848
- baths_min: import_zod18.z.number().optional().describe(
2990
+ baths_min: import_zod21.z.number().optional().describe(
2849
2991
  "Minimum bathrooms, 0 or greater. Half-baths are allowed (1.5)."
2850
2992
  ),
2851
- baths_max: import_zod18.z.number().optional().describe(
2993
+ baths_max: import_zod21.z.number().optional().describe(
2852
2994
  "Maximum bathrooms, 0 or greater. Half-baths are allowed (1.5)."
2853
2995
  ),
2854
- sqft_min: import_zod18.z.number().int().optional().describe(
2996
+ sqft_min: import_zod21.z.number().int().optional().describe(
2855
2997
  "Minimum living area in square feet; whole number, 0 or greater."
2856
2998
  ),
2857
- sqft_max: import_zod18.z.number().int().optional().describe(
2999
+ sqft_max: import_zod21.z.number().int().optional().describe(
2858
3000
  "Maximum living area in square feet; whole number, 0 or greater."
2859
3001
  ),
2860
- lot_size_min: import_zod18.z.number().int().optional().describe(
3002
+ lot_size_min: import_zod21.z.number().int().optional().describe(
2861
3003
  "Minimum lot size in square feet; whole number, 0 or greater."
2862
3004
  ),
2863
- lot_size_max: import_zod18.z.number().int().optional().describe(
3005
+ lot_size_max: import_zod21.z.number().int().optional().describe(
2864
3006
  "Maximum lot size in square feet; whole number, 0 or greater."
2865
3007
  ),
2866
- year_built_min: import_zod18.z.number().int().optional().describe(
3008
+ year_built_min: import_zod21.z.number().int().optional().describe(
2867
3009
  "Earliest year built; whole number, 0 or greater."
2868
3010
  ),
2869
- year_built_max: import_zod18.z.number().int().optional().describe(
3011
+ year_built_max: import_zod21.z.number().int().optional().describe(
2870
3012
  "Latest year built; whole number, 0 or greater."
2871
3013
  ),
2872
- max_hoa: import_zod18.z.number().optional().describe("Maximum monthly HOA fee in dollars, 0 or greater."),
2873
- home_type: import_zod18.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([
2874
3016
  "houses",
2875
3017
  "townhomes",
2876
3018
  "multi_family",
@@ -2881,21 +3023,21 @@ var zillowToolSpecs = [
2881
3023
  ]).optional().describe(
2882
3024
  "Property type filter."
2883
3025
  ),
2884
- days_on_zillow: import_zod18.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(
2885
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."
2886
3028
  ),
2887
- keywords: import_zod18.z.string().optional().describe(
3029
+ keywords: import_zod21.z.string().optional().describe(
2888
3030
  "Free-text match against the listing description (1-200 characters)."
2889
3031
  ),
2890
- has_pool: import_zod18.z.boolean().optional().describe("Only listings with a pool."),
2891
- has_garage: import_zod18.z.boolean().optional().describe("Only listings with a garage."),
2892
- has_air_conditioning: import_zod18.z.boolean().optional().describe("Only listings with air conditioning."),
2893
- is_waterfront: import_zod18.z.boolean().optional().describe("Only waterfront listings."),
2894
- has_basement: import_zod18.z.boolean().optional().describe("Only listings with a basement."),
2895
- is_new_construction: import_zod18.z.boolean().optional().describe("Only new-construction listings."),
2896
- has_open_house: import_zod18.z.boolean().optional().describe("Only listings with an upcoming open house."),
2897
- price_reduced: import_zod18.z.boolean().optional().describe("Only listings whose price was reduced."),
2898
- is_3d_tour: import_zod18.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.")
2899
3041
  }),
2900
3042
  call: (client, input) => client.zillow.search(input)
2901
3043
  }),
@@ -2906,8 +3048,8 @@ var zillowToolSpecs = [
2906
3048
  endpoint: "/api/v1/zillow/property",
2907
3049
  credits: 1,
2908
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.",
2909
- inputSchema: import_zod18.z.object({
2910
- zpid: import_zod18.z.string().describe(
3051
+ inputSchema: import_zod21.z.object({
3052
+ zpid: import_zod21.z.string().describe(
2911
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."
2912
3054
  )
2913
3055
  }),
@@ -2920,8 +3062,8 @@ var zillowToolSpecs = [
2920
3062
  endpoint: "/api/v1/zillow/reviews",
2921
3063
  credits: 1,
2922
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.",
2923
- inputSchema: import_zod18.z.object({
2924
- screen_name: import_zod18.z.string().describe(
3065
+ inputSchema: import_zod21.z.object({
3066
+ screen_name: import_zod21.z.string().describe(
2925
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."
2926
3068
  )
2927
3069
  }),
@@ -2936,7 +3078,7 @@ var createScavioZillowAgentReviewsTool = toolFactory(
2936
3078
  );
2937
3079
 
2938
3080
  // src/booking.ts
2939
- var import_zod19 = require("zod");
3081
+ var import_zod22 = require("zod");
2940
3082
  var bookingToolSpecs = [
2941
3083
  defineScavioTool({
2942
3084
  key: "scavioBookingSearch",
@@ -2945,14 +3087,14 @@ var bookingToolSpecs = [
2945
3087
  endpoint: "/api/v1/booking/search",
2946
3088
  credits: 1,
2947
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.",
2948
- inputSchema: import_zod19.z.object({
2949
- destination: import_zod19.z.string().optional().describe(
3090
+ inputSchema: import_zod22.z.object({
3091
+ destination: import_zod22.z.string().optional().describe(
2950
3092
  "Destination to search, e.g. 'Paris' (1-200 characters). Required unless dest_id is given."
2951
3093
  ),
2952
- dest_id: import_zod19.z.string().optional().describe(
3094
+ dest_id: import_zod22.z.string().optional().describe(
2953
3095
  "Numeric Booking.com destination id, as an alternative to destination."
2954
3096
  ),
2955
- dest_type: import_zod19.z.enum([
3097
+ dest_type: import_zod22.z.enum([
2956
3098
  "city",
2957
3099
  "region",
2958
3100
  "country",
@@ -2963,10 +3105,10 @@ var bookingToolSpecs = [
2963
3105
  ]).optional().describe(
2964
3106
  "What dest_id refers to. Requires dest_id and is rejected without it, because Booking silently ignores a lone dest_type."
2965
3107
  ),
2966
- page: import_zod19.z.number().int().optional().describe(
3108
+ page: import_zod22.z.number().int().optional().describe(
2967
3109
  "Results page, 1-based. 25 properties per page, 1 credit each."
2968
3110
  ),
2969
- sort_by: import_zod19.z.enum([
3111
+ sort_by: import_zod22.z.enum([
2970
3112
  "popularity",
2971
3113
  "price_low",
2972
3114
  "price_high",
@@ -2978,39 +3120,39 @@ var bookingToolSpecs = [
2978
3120
  ]).optional().describe(
2979
3121
  "Result sort order (default 'popularity')."
2980
3122
  ),
2981
- min_price: import_zod19.z.number().optional().describe(
3123
+ min_price: import_zod22.z.number().optional().describe(
2982
3124
  "Minimum price PER NIGHT in `currency`, >= 0. Must not exceed max_price."
2983
3125
  ),
2984
- max_price: import_zod19.z.number().optional().describe("Maximum price PER NIGHT in `currency`, >= 0."),
2985
- stars: import_zod19.z.array(import_zod19.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(
2986
3128
  "Star ratings to include, each 1-5, 1-5 values, OR'd together (e.g. [4, 5])."
2987
3129
  ),
2988
- min_review_score: import_zod19.z.enum(["6", "7", "8", "9"]).optional().describe(
3130
+ min_review_score: import_zod22.z.enum(["6", "7", "8", "9"]).optional().describe(
2989
3131
  "Minimum guest review score. Only '6', '7', '8' and '9' exist upstream; any other threshold is silently dropped."
2990
3132
  ),
2991
- property_type: import_zod19.z.union([
2992
- import_zod19.z.enum(["apartments", "hostels", "hotels", "motels", "resorts", "bed_and_breakfasts", "villas", "campgrounds", "vacation_homes", "lodges", "homestays"]),
2993
- import_zod19.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()
2994
3136
  ]).optional().describe(
2995
3137
  "Accommodation type by name, or a raw numeric Booking accommodation-type id (>= 1)."
2996
3138
  ),
2997
- free_cancellation: import_zod19.z.boolean().optional().describe(
3139
+ free_cancellation: import_zod22.z.boolean().optional().describe(
2998
3140
  "Only properties offering free cancellation."
2999
3141
  ),
3000
- no_prepayment: import_zod19.z.boolean().optional().describe("Only properties that take no prepayment."),
3001
- breakfast_included: import_zod19.z.boolean().optional().describe("Only rates that include breakfast."),
3002
- checkin: import_zod19.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(
3003
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."
3004
3146
  ),
3005
- checkout: import_zod19.z.string().optional().describe(
3147
+ checkout: import_zod22.z.string().optional().describe(
3006
3148
  "Check-out date, YYYY-MM-DD. Must be later than checkin and sent together with it."
3007
3149
  ),
3008
- adults: import_zod19.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3009
- children_ages: import_zod19.z.array(import_zod19.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(
3010
3152
  "AGES of accompanying children, each 0-17, max 10 entries. Ages, not a count."
3011
3153
  ),
3012
- rooms: import_zod19.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3013
- currency: import_zod19.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(
3014
3156
  "ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking picks a currency itself and identical requests can disagree."
3015
3157
  )
3016
3158
  }),
@@ -3023,25 +3165,25 @@ var bookingToolSpecs = [
3023
3165
  endpoint: "/api/v1/booking/hotel",
3024
3166
  credits: 1,
3025
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.",
3026
- inputSchema: import_zod19.z.object({
3027
- hotel: import_zod19.z.string().describe(
3168
+ inputSchema: import_zod22.z.object({
3169
+ hotel: import_zod22.z.string().describe(
3028
3170
  "Booking.com property URL or the bare page slug (1-500 characters); query params are discarded."
3029
3171
  ),
3030
- country_code: import_zod19.z.string().optional().describe(
3172
+ country_code: import_zod22.z.string().optional().describe(
3031
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."
3032
3174
  ),
3033
- checkin: import_zod19.z.string().optional().describe(
3175
+ checkin: import_zod22.z.string().optional().describe(
3034
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."
3035
3177
  ),
3036
- checkout: import_zod19.z.string().optional().describe(
3178
+ checkout: import_zod22.z.string().optional().describe(
3037
3179
  "Check-out date, YYYY-MM-DD. Must be later than checkin and sent together with it."
3038
3180
  ),
3039
- adults: import_zod19.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3040
- children_ages: import_zod19.z.array(import_zod19.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(
3041
3183
  "AGES of accompanying children, each 0-17, max 10 entries. Ages, not a count."
3042
3184
  ),
3043
- rooms: import_zod19.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3044
- currency: import_zod19.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(
3045
3187
  "ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking picks a currency itself and identical requests can disagree."
3046
3188
  )
3047
3189
  }),
@@ -3054,25 +3196,25 @@ var bookingToolSpecs = [
3054
3196
  endpoint: "/api/v1/booking/reviews",
3055
3197
  credits: 1,
3056
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.",
3057
- inputSchema: import_zod19.z.object({
3058
- hotel: import_zod19.z.string().describe(
3199
+ inputSchema: import_zod22.z.object({
3200
+ hotel: import_zod22.z.string().describe(
3059
3201
  "Booking.com property URL or the bare page slug (1-500 characters); query params are discarded."
3060
3202
  ),
3061
- country_code: import_zod19.z.string().optional().describe(
3203
+ country_code: import_zod22.z.string().optional().describe(
3062
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."
3063
3205
  ),
3064
- checkin: import_zod19.z.string().optional().describe(
3206
+ checkin: import_zod22.z.string().optional().describe(
3065
3207
  "Check-in date, YYYY-MM-DD. Must be sent together with checkout; it prices the stay the review page is rendered for."
3066
3208
  ),
3067
- checkout: import_zod19.z.string().optional().describe(
3209
+ checkout: import_zod22.z.string().optional().describe(
3068
3210
  "Check-out date, YYYY-MM-DD. Must be later than checkin and sent together with it."
3069
3211
  ),
3070
- adults: import_zod19.z.number().int().optional().describe("Adult guests, >= 1 (default 2)."),
3071
- children_ages: import_zod19.z.array(import_zod19.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(
3072
3214
  "AGES of accompanying children, each 0-17, max 10 entries. Ages, not a count."
3073
3215
  ),
3074
- rooms: import_zod19.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
3075
- currency: import_zod19.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(
3076
3218
  "ISO 4217 currency for prices, 3 letters (default 'USD')."
3077
3219
  )
3078
3220
  }),
@@ -3084,7 +3226,7 @@ var createScavioBookingHotelTool = toolFactory(bookingToolSpecs, "scavioBookingH
3084
3226
  var createScavioBookingReviewsTool = toolFactory(bookingToolSpecs, "scavioBookingReviews");
3085
3227
 
3086
3228
  // src/tripadvisor.ts
3087
- var import_zod20 = require("zod");
3229
+ var import_zod23 = require("zod");
3088
3230
  var tripadvisorToolSpecs = [
3089
3231
  defineScavioTool({
3090
3232
  key: "scavioTripadvisorLocations",
@@ -3093,9 +3235,9 @@ var tripadvisorToolSpecs = [
3093
3235
  endpoint: "/api/v1/tripadvisor/locations",
3094
3236
  credits: 2,
3095
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.",
3096
- inputSchema: import_zod20.z.object({
3097
- query: import_zod20.z.string().describe("Place or business name to resolve (1-120 characters)."),
3098
- limit: import_zod20.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(
3099
3241
  "Rows to return, 1-20 (default 12). Sizes the response only; there is no paging here."
3100
3242
  )
3101
3243
  }),
@@ -3108,17 +3250,17 @@ var tripadvisorToolSpecs = [
3108
3250
  endpoint: "/api/v1/tripadvisor/search",
3109
3251
  credits: 2,
3110
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.",
3111
- inputSchema: import_zod20.z.object({
3112
- geo_id: import_zod20.z.string().optional().describe(
3253
+ inputSchema: import_zod23.z.object({
3254
+ geo_id: import_zod23.z.string().optional().describe(
3113
3255
  "TripAdvisor geo id (1-500 characters): 30196, g30196, or a URL carrying one. Required unless url is given."
3114
3256
  ),
3115
- category: import_zod20.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3257
+ category: import_zod23.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3116
3258
  "Listing family to search (default 'restaurants')."
3117
3259
  ),
3118
- page: import_zod20.z.number().int().optional().describe(
3260
+ page: import_zod23.z.number().int().optional().describe(
3119
3261
  "Results page, 1-based. 30 locations per page; a page beyond the last is a 404, not an empty result."
3120
3262
  ),
3121
- url: import_zod20.z.string().optional().describe(
3263
+ url: import_zod23.z.string().optional().describe(
3122
3264
  "Full tripadvisor.com listing URL (1-500 characters), as an alternative to geo_id; country sites are accepted."
3123
3265
  )
3124
3266
  }),
@@ -3131,17 +3273,17 @@ var tripadvisorToolSpecs = [
3131
3273
  endpoint: "/api/v1/tripadvisor/location",
3132
3274
  credits: 2,
3133
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.",
3134
- inputSchema: import_zod20.z.object({
3135
- location_id: import_zod20.z.string().optional().describe(
3276
+ inputSchema: import_zod23.z.object({
3277
+ location_id: import_zod23.z.string().optional().describe(
3136
3278
  "TripAdvisor location id (1-500 characters): 1899234, d1899234, or a full _Review URL. Required unless url is given."
3137
3279
  ),
3138
- geo_id: import_zod20.z.string().optional().describe(
3280
+ geo_id: import_zod23.z.string().optional().describe(
3139
3281
  "Geo the location sits in; required when location_id is a bare d-id."
3140
3282
  ),
3141
- category: import_zod20.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3283
+ category: import_zod23.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3142
3284
  "Location family (default 'restaurants'); match the location's own type."
3143
3285
  ),
3144
- url: import_zod20.z.string().optional().describe(
3286
+ url: import_zod23.z.string().optional().describe(
3145
3287
  "Full tripadvisor.com _Review URL (1-500 characters), as an alternative to location_id."
3146
3288
  )
3147
3289
  }),
@@ -3154,20 +3296,20 @@ var tripadvisorToolSpecs = [
3154
3296
  endpoint: "/api/v1/tripadvisor/reviews",
3155
3297
  credits: 2,
3156
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.",
3157
- inputSchema: import_zod20.z.object({
3158
- location_id: import_zod20.z.string().optional().describe(
3299
+ inputSchema: import_zod23.z.object({
3300
+ location_id: import_zod23.z.string().optional().describe(
3159
3301
  "TripAdvisor location id (1-500 characters): 1899234, d1899234, or a full _Review URL. Required unless url is given."
3160
3302
  ),
3161
- geo_id: import_zod20.z.string().optional().describe(
3303
+ geo_id: import_zod23.z.string().optional().describe(
3162
3304
  "Geo the location sits in; required when location_id is a bare d-id."
3163
3305
  ),
3164
- category: import_zod20.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3306
+ category: import_zod23.z.enum(["restaurants", "hotels", "attractions"]).optional().describe(
3165
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."
3166
3308
  ),
3167
- url: import_zod20.z.string().optional().describe(
3309
+ url: import_zod23.z.string().optional().describe(
3168
3310
  "Full tripadvisor.com _Review URL (1-500 characters), as an alternative to location_id."
3169
3311
  ),
3170
- page: import_zod20.z.number().int().optional().describe(
3312
+ page: import_zod23.z.number().int().optional().describe(
3171
3313
  "Reviews page, 1-based. 15 per page for restaurants, 10 for hotels and attractions; past the last page is a 404."
3172
3314
  )
3173
3315
  }),
@@ -3192,7 +3334,7 @@ var createScavioTripadvisorReviewsTool = toolFactory(
3192
3334
  );
3193
3335
 
3194
3336
  // src/indeed.ts
3195
- var import_zod21 = require("zod");
3337
+ var import_zod24 = require("zod");
3196
3338
  var indeedToolSpecs = [
3197
3339
  defineScavioTool({
3198
3340
  key: "scavioIndeedSearch",
@@ -3201,38 +3343,38 @@ var indeedToolSpecs = [
3201
3343
  endpoint: "/api/v1/indeed/search",
3202
3344
  credits: 2,
3203
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.",
3204
- inputSchema: import_zod21.z.object({
3205
- query: import_zod21.z.string().optional().describe(
3346
+ inputSchema: import_zod24.z.object({
3347
+ query: import_zod24.z.string().optional().describe(
3206
3348
  "Job title, keywords or employer (1-500 characters). Required unless location is given."
3207
3349
  ),
3208
- location: import_zod21.z.string().optional().describe(
3350
+ location: import_zod24.z.string().optional().describe(
3209
3351
  "City and state, postal code, state, country, or 'Remote' (1-200 characters). Valid on its own with no query."
3210
3352
  ),
3211
- page: import_zod21.z.number().int().optional().describe(
3353
+ page: import_zod24.z.number().int().optional().describe(
3212
3354
  "Results page, 1-based. 10 postings per page, 1 call each."
3213
3355
  ),
3214
- radius: import_zod21.z.union([
3215
- import_zod21.z.literal(0),
3216
- import_zod21.z.literal(5),
3217
- import_zod21.z.literal(10),
3218
- import_zod21.z.literal(15),
3219
- import_zod21.z.literal(25),
3220
- import_zod21.z.literal(35),
3221
- import_zod21.z.literal(50),
3222
- import_zod21.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)
3223
3365
  ]).optional().describe(
3224
3366
  "Search radius in miles around location. Closed set: Indeed IGNORES any other value and returns the unfiltered set. Upstream default 50."
3225
3367
  ),
3226
- max_age_days: import_zod21.z.union([import_zod21.z.literal(1), import_zod21.z.literal(3), import_zod21.z.literal(7), import_zod21.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(
3227
3369
  "Maximum posting age in days. Closed set: Indeed IGNORES any other value and returns postings of every age."
3228
3370
  ),
3229
- job_type: import_zod21.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(
3230
3372
  "Employment type filter."
3231
3373
  ),
3232
- min_salary: import_zod21.z.number().optional().describe(
3374
+ min_salary: import_zod24.z.number().optional().describe(
3233
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."
3234
3376
  ),
3235
- remote: import_zod21.z.boolean().optional().describe("Remote postings only.")
3377
+ remote: import_zod24.z.boolean().optional().describe("Remote postings only.")
3236
3378
  }),
3237
3379
  call: (client, input) => client.indeed.search(input)
3238
3380
  }),
@@ -3243,8 +3385,8 @@ var indeedToolSpecs = [
3243
3385
  endpoint: "/api/v1/indeed/job",
3244
3386
  credits: 2,
3245
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.",
3246
- inputSchema: import_zod21.z.object({
3247
- job_id: import_zod21.z.string().describe(
3388
+ inputSchema: import_zod24.z.object({
3389
+ job_id: import_zod24.z.string().describe(
3248
3390
  "16-hex Indeed job key, or any indeed.com URL carrying jk= (/viewjob, /rc/clk, /pagead/clk)."
3249
3391
  )
3250
3392
  }),
@@ -3257,8 +3399,8 @@ var indeedToolSpecs = [
3257
3399
  endpoint: "/api/v1/indeed/company",
3258
3400
  credits: 2,
3259
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.",
3260
- inputSchema: import_zod21.z.object({
3261
- company: import_zod21.z.string().describe(
3402
+ inputSchema: import_zod24.z.object({
3403
+ company: import_zod24.z.string().describe(
3262
3404
  "indeed.com/cmp/<slug> slug or a full profile URL (1-200 characters); slugs are untidy, e.g. 'Tata-Consultancy-Services-(tcs)'."
3263
3405
  )
3264
3406
  }),
@@ -3271,11 +3413,11 @@ var indeedToolSpecs = [
3271
3413
  endpoint: "/api/v1/indeed/company/reviews",
3272
3414
  credits: 2,
3273
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.",
3274
- inputSchema: import_zod21.z.object({
3275
- company: import_zod21.z.string().describe(
3416
+ inputSchema: import_zod24.z.object({
3417
+ company: import_zod24.z.string().describe(
3276
3418
  "indeed.com/cmp/<slug> slug or a full profile URL (1-200 characters)."
3277
3419
  ),
3278
- page: import_zod21.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.")
3279
3421
  }),
3280
3422
  call: (client, input) => client.indeed.companyReviews(input)
3281
3423
  })
@@ -3289,7 +3431,7 @@ var createScavioIndeedCompanyReviewsTool = toolFactory(
3289
3431
  );
3290
3432
 
3291
3433
  // src/airbnb.ts
3292
- var import_zod22 = require("zod");
3434
+ var import_zod25 = require("zod");
3293
3435
  var airbnbToolSpecs = [
3294
3436
  defineScavioTool({
3295
3437
  key: "scavioAirbnbSearch",
@@ -3298,46 +3440,46 @@ var airbnbToolSpecs = [
3298
3440
  endpoint: "/api/v1/airbnb/search",
3299
3441
  credits: 1,
3300
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.",
3301
- inputSchema: import_zod22.z.object({
3302
- location: import_zod22.z.string().describe(
3443
+ inputSchema: import_zod25.z.object({
3444
+ location: import_zod25.z.string().describe(
3303
3445
  "City, region, ZIP, or a pasted airbnb.com/s/ URL (1-200 characters). An unresolvable location is a 404."
3304
3446
  ),
3305
- check_in: import_zod22.z.string().optional().describe(
3447
+ check_in: import_zod25.z.string().optional().describe(
3306
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."
3307
3449
  ),
3308
- check_out: import_zod22.z.string().optional().describe(
3450
+ check_out: import_zod25.z.string().optional().describe(
3309
3451
  "Check-out date, YYYY-MM-DD. Must be later than check_in; defaults to check_in plus 5 nights when omitted."
3310
3452
  ),
3311
- adults: import_zod22.z.number().int().optional().describe("Adult guests, >= 1."),
3312
- children: import_zod22.z.number().int().optional().describe("Children aged 2-12, >= 0."),
3313
- infants: import_zod22.z.number().int().optional().describe("Infants under 2, >= 0."),
3314
- pets: import_zod22.z.number().int().optional().describe("Pets, >= 0."),
3315
- min_price: import_zod22.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(
3316
3458
  "Minimum price for the WHOLE STAY in `currency`, not per night, >= 0. Must not exceed max_price."
3317
3459
  ),
3318
- max_price: import_zod22.z.number().optional().describe(
3460
+ max_price: import_zod25.z.number().optional().describe(
3319
3461
  "Maximum price for the WHOLE STAY in `currency`, not per night, >= 0."
3320
3462
  ),
3321
- room_type: import_zod22.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(
3322
3464
  "Room type. Validated before the scrape, because an unrecognised value returns the UNFILTERED set under a 200."
3323
3465
  ),
3324
- min_bedrooms: import_zod22.z.number().int().optional().describe("Minimum bedrooms, >= 0."),
3325
- min_beds: import_zod22.z.number().int().optional().describe("Minimum beds, >= 0."),
3326
- min_bathrooms: import_zod22.z.number().int().optional().describe("Minimum bathrooms, >= 0."),
3327
- superhost: import_zod22.z.boolean().optional().describe("Superhost listings only."),
3328
- instant_book: import_zod22.z.boolean().optional().describe("Instant Book listings only."),
3329
- guest_favorite: import_zod22.z.boolean().optional().describe("Guest Favorite listings only."),
3330
- free_cancellation: import_zod22.z.boolean().optional().describe("Listings with free cancellation only."),
3331
- amenities: import_zod22.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(
3332
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."
3333
3475
  ),
3334
- currency: import_zod22.z.string().optional().describe(
3476
+ currency: import_zod25.z.string().optional().describe(
3335
3477
  "ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Airbnb picks a currency itself and identical requests can disagree."
3336
3478
  ),
3337
- page: import_zod22.z.number().int().optional().describe(
3479
+ page: import_zod25.z.number().int().optional().describe(
3338
3480
  "Results page, 1-based. 18 listings per page. Cannot be combined with cursor."
3339
3481
  ),
3340
- cursor: import_zod22.z.string().optional().describe(
3482
+ cursor: import_zod25.z.string().optional().describe(
3341
3483
  "next_cursor from a previous response (1-500 characters); wins over page, so sending both is rejected."
3342
3484
  )
3343
3485
  }),
@@ -3350,21 +3492,21 @@ var airbnbToolSpecs = [
3350
3492
  endpoint: "/api/v1/airbnb/listing",
3351
3493
  credits: 1,
3352
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.",
3353
- inputSchema: import_zod22.z.object({
3354
- listing_id: import_zod22.z.string().describe(
3495
+ inputSchema: import_zod25.z.object({
3496
+ listing_id: import_zod25.z.string().describe(
3355
3497
  "Airbnb listing id or a full /rooms/ URL (1-500 characters); query params are discarded, since they carry someone else's dates."
3356
3498
  ),
3357
- check_in: import_zod22.z.string().optional().describe(
3499
+ check_in: import_zod25.z.string().optional().describe(
3358
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."
3359
3501
  ),
3360
- check_out: import_zod22.z.string().optional().describe(
3502
+ check_out: import_zod25.z.string().optional().describe(
3361
3503
  "Check-out date, YYYY-MM-DD. Must be later than check_in and sent together with it."
3362
3504
  ),
3363
- adults: import_zod22.z.number().int().optional().describe("Adult guests, >= 1."),
3364
- children: import_zod22.z.number().int().optional().describe("Children aged 2-12, >= 0."),
3365
- infants: import_zod22.z.number().int().optional().describe("Infants under 2, >= 0."),
3366
- pets: import_zod22.z.number().int().optional().describe("Pets, >= 0."),
3367
- currency: import_zod22.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').")
3368
3510
  }),
3369
3511
  call: (client, input) => client.airbnb.listing(input)
3370
3512
  }),
@@ -3375,15 +3517,15 @@ var airbnbToolSpecs = [
3375
3517
  endpoint: "/api/v1/airbnb/reviews",
3376
3518
  credits: 1,
3377
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.",
3378
- inputSchema: import_zod22.z.object({
3379
- listing_id: import_zod22.z.string().describe(
3520
+ inputSchema: import_zod25.z.object({
3521
+ listing_id: import_zod25.z.string().describe(
3380
3522
  "Airbnb listing id or a full /rooms/ URL (1-500 characters)."
3381
3523
  ),
3382
- currency: import_zod22.z.string().optional().describe("ISO 4217 currency, 3 letters (default 'USD')."),
3383
- limit: import_zod22.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(
3384
3526
  "Reviews to return, 1-50 (default 30). Upstream returns a fixed 7 when no explicit limit is sent."
3385
3527
  ),
3386
- offset: import_zod22.z.number().int().optional().describe(
3528
+ offset: import_zod25.z.number().int().optional().describe(
3387
3529
  "Reviews to skip before this page, >= 0 (default 0)."
3388
3530
  )
3389
3531
  }),
@@ -3395,7 +3537,7 @@ var createScavioAirbnbListingTool = toolFactory(airbnbToolSpecs, "scavioAirbnbLi
3395
3537
  var createScavioAirbnbReviewsTool = toolFactory(airbnbToolSpecs, "scavioAirbnbReviews");
3396
3538
 
3397
3539
  // src/glassdoor.ts
3398
- var import_zod23 = require("zod");
3540
+ var import_zod26 = require("zod");
3399
3541
  var glassdoorToolSpecs = [
3400
3542
  defineScavioTool({
3401
3543
  key: "scavioGlassdoorCompanies",
@@ -3404,8 +3546,8 @@ var glassdoorToolSpecs = [
3404
3546
  endpoint: "/api/v1/glassdoor/companies",
3405
3547
  credits: 1,
3406
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.",
3407
- inputSchema: import_zod23.z.object({
3408
- query: import_zod23.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).")
3409
3551
  }),
3410
3552
  call: (client, input) => client.glassdoor.companies(input)
3411
3553
  }),
@@ -3416,14 +3558,14 @@ var glassdoorToolSpecs = [
3416
3558
  endpoint: "/api/v1/glassdoor/company",
3417
3559
  credits: 1,
3418
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.",
3419
- inputSchema: import_zod23.z.object({
3420
- employer_id: import_zod23.z.string().optional().describe(
3561
+ inputSchema: import_zod26.z.object({
3562
+ employer_id: import_zod26.z.string().optional().describe(
3421
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."
3422
3564
  ),
3423
- company: import_zod23.z.string().optional().describe(
3565
+ company: import_zod26.z.string().optional().describe(
3424
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."
3425
3567
  ),
3426
- url: import_zod23.z.string().optional().describe(
3568
+ url: import_zod26.z.string().optional().describe(
3427
3569
  "Any glassdoor.com employer URL (1-500 characters): /Overview/, /Reviews/ or /Salary/. A non-glassdoor.com host is rejected."
3428
3570
  )
3429
3571
  }),
@@ -3436,17 +3578,17 @@ var glassdoorToolSpecs = [
3436
3578
  endpoint: "/api/v1/glassdoor/reviews",
3437
3579
  credits: 1,
3438
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.",
3439
- inputSchema: import_zod23.z.object({
3440
- employer_id: import_zod23.z.string().optional().describe(
3581
+ inputSchema: import_zod26.z.object({
3582
+ employer_id: import_zod26.z.string().optional().describe(
3441
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."
3442
3584
  ),
3443
- company: import_zod23.z.string().optional().describe(
3585
+ company: import_zod26.z.string().optional().describe(
3444
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."
3445
3587
  ),
3446
- url: import_zod23.z.string().optional().describe(
3588
+ url: import_zod26.z.string().optional().describe(
3447
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."
3448
3590
  ),
3449
- category: import_zod23.z.enum([
3591
+ category: import_zod26.z.enum([
3450
3592
  "career_development",
3451
3593
  "compensation",
3452
3594
  "culture",
@@ -3456,7 +3598,7 @@ var glassdoorToolSpecs = [
3456
3598
  ]).optional().describe(
3457
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."
3458
3600
  ),
3459
- employment_status: import_zod23.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(
3460
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."
3461
3603
  )
3462
3604
  }),
@@ -3469,17 +3611,17 @@ var glassdoorToolSpecs = [
3469
3611
  endpoint: "/api/v1/glassdoor/salaries",
3470
3612
  credits: 1,
3471
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.",
3472
- inputSchema: import_zod23.z.object({
3473
- employer_id: import_zod23.z.string().optional().describe(
3614
+ inputSchema: import_zod26.z.object({
3615
+ employer_id: import_zod26.z.string().optional().describe(
3474
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."
3475
3617
  ),
3476
- company: import_zod23.z.string().optional().describe(
3618
+ company: import_zod26.z.string().optional().describe(
3477
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."
3478
3620
  ),
3479
- url: import_zod23.z.string().optional().describe(
3621
+ url: import_zod26.z.string().optional().describe(
3480
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."
3481
3623
  ),
3482
- page: import_zod23.z.number().int().optional().describe(
3624
+ page: import_zod26.z.number().int().optional().describe(
3483
3625
  "Results page, 1-based. Ten job titles per page; page_count on the response is how many pages exist."
3484
3626
  )
3485
3627
  }),
@@ -3504,7 +3646,7 @@ var createScavioGlassdoorSalariesTool = toolFactory(
3504
3646
  );
3505
3647
 
3506
3648
  // src/yelp.ts
3507
- var import_zod24 = require("zod");
3649
+ var import_zod27 = require("zod");
3508
3650
  var yelpToolSpecs = [
3509
3651
  defineScavioTool({
3510
3652
  key: "scavioYelpSearch",
@@ -3513,29 +3655,29 @@ var yelpToolSpecs = [
3513
3655
  endpoint: "/api/v1/yelp/search",
3514
3656
  credits: 2,
3515
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.",
3516
- inputSchema: import_zod24.z.object({
3517
- term: import_zod24.z.string().optional().describe(
3658
+ inputSchema: import_zod27.z.object({
3659
+ term: import_zod27.z.string().optional().describe(
3518
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."
3519
3661
  ),
3520
- location: import_zod24.z.string().optional().describe(
3662
+ location: import_zod27.z.string().optional().describe(
3521
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."
3522
3664
  ),
3523
- page: import_zod24.z.number().int().optional().describe(
3665
+ page: import_zod27.z.number().int().optional().describe(
3524
3666
  "Results page, 1-based. Yelp fixes the page size at 10."
3525
3667
  ),
3526
- sort: import_zod24.z.enum(["recommended", "rating", "review_count"]).optional().describe(
3668
+ sort: import_zod27.z.enum(["recommended", "rating", "review_count"]).optional().describe(
3527
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."
3528
3670
  ),
3529
- price: import_zod24.z.array(import_zod24.z.union([import_zod24.z.literal(1), import_zod24.z.literal(2), import_zod24.z.literal(3), import_zod24.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(
3530
3672
  "Price bands to include, 1 ($) to 4 ($$$$); 1-4 values, combined freely - [1, 2] means $ or $$."
3531
3673
  ),
3532
- open_now: import_zod24.z.boolean().optional().describe(
3674
+ open_now: import_zod27.z.boolean().optional().describe(
3533
3675
  "Only businesses open at the moment of the request."
3534
3676
  ),
3535
- attributes: import_zod24.z.array(import_zod24.z.string()).optional().describe(
3677
+ attributes: import_zod27.z.array(import_zod27.z.string()).optional().describe(
3536
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."
3537
3679
  ),
3538
- url: import_zod24.z.string().optional().describe(
3680
+ url: import_zod27.z.string().optional().describe(
3539
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."
3540
3682
  )
3541
3683
  }),
@@ -3548,11 +3690,11 @@ var yelpToolSpecs = [
3548
3690
  endpoint: "/api/v1/yelp/business",
3549
3691
  credits: 2,
3550
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.",
3551
- inputSchema: import_zod24.z.object({
3552
- business_id: import_zod24.z.string().optional().describe(
3693
+ inputSchema: import_zod27.z.object({
3694
+ business_id: import_zod27.z.string().optional().describe(
3553
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."
3554
3696
  ),
3555
- url: import_zod24.z.string().optional().describe(
3697
+ url: import_zod27.z.string().optional().describe(
3556
3698
  "A full yelp.com/biz URL (1-1000 characters) as an alternative to business_id."
3557
3699
  )
3558
3700
  }),
@@ -3565,17 +3707,17 @@ var yelpToolSpecs = [
3565
3707
  endpoint: "/api/v1/yelp/reviews",
3566
3708
  credits: 2,
3567
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.",
3568
- inputSchema: import_zod24.z.object({
3569
- business_id: import_zod24.z.string().optional().describe(
3710
+ inputSchema: import_zod27.z.object({
3711
+ business_id: import_zod27.z.string().optional().describe(
3570
3712
  "A Yelp business alias ('desnudo-coffee-austin-2'), its opaque encid, or any yelp.com/biz URL carrying one (1-500 characters)."
3571
3713
  ),
3572
- url: import_zod24.z.string().optional().describe(
3714
+ url: import_zod27.z.string().optional().describe(
3573
3715
  "A full yelp.com/biz URL (1-1000 characters) as an alternative to business_id."
3574
3716
  ),
3575
- page: import_zod24.z.number().int().optional().describe(
3717
+ page: import_zod27.z.number().int().optional().describe(
3576
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."
3577
3719
  ),
3578
- sort: import_zod24.z.enum([
3720
+ sort: import_zod27.z.enum([
3579
3721
  "relevance",
3580
3722
  "newest",
3581
3723
  "oldest",
@@ -3585,12 +3727,12 @@ var yelpToolSpecs = [
3585
3727
  ]).optional().describe(
3586
3728
  "Review ordering (upstream default 'relevance'). Closed enum: Yelp IGNORES an unrecognised value and serves default ranking under a billed 200."
3587
3729
  ),
3588
- rating: import_zod24.z.union([
3589
- import_zod24.z.literal(1),
3590
- import_zod24.z.literal(2),
3591
- import_zod24.z.literal(3),
3592
- import_zod24.z.literal(4),
3593
- import_zod24.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)
3594
3736
  ]).optional().describe(
3595
3737
  "Only reviews at this star rating, 1-5. Changes filtered_review_count on the response, not review_count."
3596
3738
  )
@@ -3603,7 +3745,7 @@ var createScavioYelpBusinessTool = toolFactory(yelpToolSpecs, "scavioYelpBusines
3603
3745
  var createScavioYelpReviewsTool = toolFactory(yelpToolSpecs, "scavioYelpReviews");
3604
3746
 
3605
3747
  // src/app-store.ts
3606
- var import_zod25 = require("zod");
3748
+ var import_zod28 = require("zod");
3607
3749
  var appStoreToolSpecs = [
3608
3750
  defineScavioTool({
3609
3751
  key: "scavioAppStoreSearch",
@@ -3612,20 +3754,20 @@ var appStoreToolSpecs = [
3612
3754
  endpoint: "/api/v1/appstore/search",
3613
3755
  credits: 1,
3614
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.",
3615
- inputSchema: import_zod25.z.object({
3616
- term: import_zod25.z.string().describe(
3757
+ inputSchema: import_zod28.z.object({
3758
+ term: import_zod28.z.string().describe(
3617
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."
3618
3760
  ),
3619
- limit: import_zod25.z.number().int().optional().describe(
3761
+ limit: import_zod28.z.number().int().optional().describe(
3620
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."
3621
3763
  ),
3622
- country: import_zod25.z.string().optional().describe(
3764
+ country: import_zod28.z.string().optional().describe(
3623
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."
3624
3766
  ),
3625
- entity: import_zod25.z.enum(["software", "ipad_software", "mac_software"]).optional().describe(
3767
+ entity: import_zod28.z.enum(["software", "ipad_software", "mac_software"]).optional().describe(
3626
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."
3627
3769
  ),
3628
- lang: import_zod25.z.string().optional().describe(
3770
+ lang: import_zod28.z.string().optional().describe(
3629
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."
3630
3772
  )
3631
3773
  }),
@@ -3638,11 +3780,11 @@ var appStoreToolSpecs = [
3638
3780
  endpoint: "/api/v1/appstore/app",
3639
3781
  credits: 1,
3640
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.",
3641
- inputSchema: import_zod25.z.object({
3642
- app_id: import_zod25.z.string().describe(
3783
+ inputSchema: import_zod28.z.object({
3784
+ app_id: import_zod28.z.string().describe(
3643
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."
3644
3786
  ),
3645
- country: import_zod25.z.string().optional().describe(
3787
+ country: import_zod28.z.string().optional().describe(
3646
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."
3647
3789
  )
3648
3790
  }),
@@ -3655,17 +3797,17 @@ var appStoreToolSpecs = [
3655
3797
  endpoint: "/api/v1/appstore/reviews",
3656
3798
  credits: 1,
3657
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.",
3658
- inputSchema: import_zod25.z.object({
3659
- app_id: import_zod25.z.string().describe(
3800
+ inputSchema: import_zod28.z.object({
3801
+ app_id: import_zod28.z.string().describe(
3660
3802
  "App Store id, NUMERIC ONLY - unlike app(), the reviews feed has no bundle-id form."
3661
3803
  ),
3662
- country: import_zod25.z.string().optional().describe(
3804
+ country: import_zod28.z.string().optional().describe(
3663
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."
3664
3806
  ),
3665
- page: import_zod25.z.number().int().optional().describe(
3807
+ page: import_zod28.z.number().int().optional().describe(
3666
3808
  "Reviews page, 1-10, 50 reviews each (default 1). Apple hard-stops at page 10."
3667
3809
  ),
3668
- sort: import_zod25.z.enum(["most_recent", "most_helpful"]).optional().describe(
3810
+ sort: import_zod28.z.enum(["most_recent", "most_helpful"]).optional().describe(
3669
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."
3670
3812
  )
3671
3813
  }),
@@ -3683,7 +3825,7 @@ var createScavioAppStoreReviewsTool = toolFactory(
3683
3825
  );
3684
3826
 
3685
3827
  // src/google-play.ts
3686
- var import_zod26 = require("zod");
3828
+ var import_zod29 = require("zod");
3687
3829
  var googlePlayToolSpecs = [
3688
3830
  defineScavioTool({
3689
3831
  key: "scavioGooglePlaySearch",
@@ -3692,14 +3834,14 @@ var googlePlayToolSpecs = [
3692
3834
  endpoint: "/api/v1/googleplay/search",
3693
3835
  credits: 2,
3694
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.",
3695
- inputSchema: import_zod26.z.object({
3696
- query: import_zod26.z.string().describe(
3837
+ inputSchema: import_zod29.z.object({
3838
+ query: import_zod29.z.string().describe(
3697
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."
3698
3840
  ),
3699
- hl: import_zod26.z.string().optional().describe(
3841
+ hl: import_zod29.z.string().optional().describe(
3700
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."
3701
3843
  ),
3702
- gl: import_zod26.z.string().optional().describe(
3844
+ gl: import_zod29.z.string().optional().describe(
3703
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."
3704
3846
  )
3705
3847
  }),
@@ -3712,14 +3854,14 @@ var googlePlayToolSpecs = [
3712
3854
  endpoint: "/api/v1/googleplay/app",
3713
3855
  credits: 2,
3714
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.",
3715
- inputSchema: import_zod26.z.object({
3716
- app_id: import_zod26.z.string().describe(
3857
+ inputSchema: import_zod29.z.object({
3858
+ app_id: import_zod29.z.string().describe(
3717
3859
  "Android package name ('com.spotify.music') or any play.google.com URL carrying one in its id param (1-500 characters)."
3718
3860
  ),
3719
- hl: import_zod26.z.string().optional().describe(
3861
+ hl: import_zod29.z.string().optional().describe(
3720
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."
3721
3863
  ),
3722
- gl: import_zod26.z.string().optional().describe(
3864
+ gl: import_zod29.z.string().optional().describe(
3723
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."
3724
3866
  )
3725
3867
  }),
@@ -3732,23 +3874,23 @@ var googlePlayToolSpecs = [
3732
3874
  endpoint: "/api/v1/googleplay/reviews",
3733
3875
  credits: 2,
3734
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.",
3735
- inputSchema: import_zod26.z.object({
3736
- app_id: import_zod26.z.string().describe(
3877
+ inputSchema: import_zod29.z.object({
3878
+ app_id: import_zod29.z.string().describe(
3737
3879
  "Android package name ('com.spotify.music') or any play.google.com URL carrying one in its id param (1-500 characters)."
3738
3880
  ),
3739
- sort: import_zod26.z.enum(["relevance", "newest", "rating"]).optional().describe(
3881
+ sort: import_zod29.z.enum(["relevance", "newest", "rating"]).optional().describe(
3740
3882
  "Review ordering (default 'newest'). Closed enum. The cursor encodes the sort, so keep this identical when paging."
3741
3883
  ),
3742
- count: import_zod26.z.number().int().optional().describe(
3884
+ count: import_zod29.z.number().int().optional().describe(
3743
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."
3744
3886
  ),
3745
- cursor: import_zod26.z.string().optional().describe(
3887
+ cursor: import_zod29.z.string().optional().describe(
3746
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."
3747
3889
  ),
3748
- hl: import_zod26.z.string().optional().describe(
3890
+ hl: import_zod29.z.string().optional().describe(
3749
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."
3750
3892
  ),
3751
- gl: import_zod26.z.string().optional().describe(
3893
+ gl: import_zod29.z.string().optional().describe(
3752
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."
3753
3895
  )
3754
3896
  }),
@@ -3769,7 +3911,7 @@ var createScavioGooglePlayReviewsTool = toolFactory(
3769
3911
  );
3770
3912
 
3771
3913
  // src/sec.ts
3772
- var import_zod27 = require("zod");
3914
+ var import_zod30 = require("zod");
3773
3915
  var secToolSpecs = [
3774
3916
  defineScavioTool({
3775
3917
  key: "scavioSecLookup",
@@ -3778,14 +3920,14 @@ var secToolSpecs = [
3778
3920
  endpoint: "/api/v1/sec/lookup",
3779
3921
  credits: 1,
3780
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.",
3781
- inputSchema: import_zod27.z.object({
3782
- query: import_zod27.z.string().describe(
3923
+ inputSchema: import_zod30.z.object({
3924
+ query: import_zod30.z.string().describe(
3783
3925
  "Ticker ('AAPL', 'BRK.B'), company name, or a fragment of one (1-200 characters); each row carries its match tier as 'match'."
3784
3926
  ),
3785
- limit: import_zod27.z.number().int().optional().describe(
3927
+ limit: import_zod30.z.number().int().optional().describe(
3786
3928
  "Rows to return, 1-100. Defaults to 10. Sizes the response; it is not a page param."
3787
3929
  ),
3788
- exchange: import_zod27.z.enum(["NASDAQ", "NYSE", "OTC", "CBOE"]).optional().describe(
3930
+ exchange: import_zod30.z.enum(["NASDAQ", "NYSE", "OTC", "CBOE"]).optional().describe(
3789
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."
3790
3932
  )
3791
3933
  }),
@@ -3798,11 +3940,11 @@ var secToolSpecs = [
3798
3940
  endpoint: "/api/v1/sec/company",
3799
3941
  credits: 1,
3800
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.",
3801
- inputSchema: import_zod27.z.object({
3802
- cik: import_zod27.z.string().optional().describe(
3943
+ inputSchema: import_zod30.z.object({
3944
+ cik: import_zod30.z.string().optional().describe(
3803
3945
  "Filer CIK in any spelling (1-20 characters): 320193, 0000320193 or CIK0000320193. A ticker is accepted here too."
3804
3946
  ),
3805
- ticker: import_zod27.z.string().optional().describe(
3947
+ ticker: import_zod30.z.string().optional().describe(
3806
3948
  "Ticker symbol (1-20 characters), dotted or dashed (BRK.B / BRK-B). Wins over cik when both are given."
3807
3949
  )
3808
3950
  }),
@@ -3815,23 +3957,23 @@ var secToolSpecs = [
3815
3957
  endpoint: "/api/v1/sec/filings",
3816
3958
  credits: 1,
3817
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.",
3818
- inputSchema: import_zod27.z.object({
3819
- cik: import_zod27.z.string().optional().describe(
3960
+ inputSchema: import_zod30.z.object({
3961
+ cik: import_zod30.z.string().optional().describe(
3820
3962
  "Filer CIK, zero-padded or bare (1-20 characters). A ticker is accepted here too."
3821
3963
  ),
3822
- ticker: import_zod27.z.string().optional().describe(
3964
+ ticker: import_zod30.z.string().optional().describe(
3823
3965
  "Ticker symbol (1-20 characters), as an alternative to cik."
3824
3966
  ),
3825
- form: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.z.string())]).optional().describe(
3967
+ form: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
3826
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."
3827
3969
  ),
3828
- date_from: import_zod27.z.string().optional().describe("Earliest filing date, inclusive (YYYY-MM-DD)."),
3829
- date_to: import_zod27.z.string().optional().describe("Latest filing date, inclusive (YYYY-MM-DD)."),
3830
- page: import_zod27.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(
3831
3973
  "Results page, 1-based; page size is whatever limit is set to. No upper bound."
3832
3974
  ),
3833
- limit: import_zod27.z.number().int().optional().describe("Filings per page, 1-500. Defaults to 50."),
3834
- include_history: import_zod27.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(
3835
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."
3836
3978
  )
3837
3979
  }),
@@ -3844,26 +3986,26 @@ var secToolSpecs = [
3844
3986
  endpoint: "/api/v1/sec/concept",
3845
3987
  credits: 1,
3846
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.",
3847
- inputSchema: import_zod27.z.object({
3848
- concept: import_zod27.z.string().describe(
3989
+ inputSchema: import_zod30.z.object({
3990
+ concept: import_zod30.z.string().describe(
3849
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."
3850
3992
  ),
3851
- cik: import_zod27.z.string().optional().describe(
3993
+ cik: import_zod30.z.string().optional().describe(
3852
3994
  "Filer CIK, zero-padded or bare (1-20 characters). A ticker is accepted here too."
3853
3995
  ),
3854
- ticker: import_zod27.z.string().optional().describe(
3996
+ ticker: import_zod30.z.string().optional().describe(
3855
3997
  "Ticker symbol (1-20 characters), as an alternative to cik."
3856
3998
  ),
3857
- taxonomy: import_zod27.z.string().optional().describe(
3999
+ taxonomy: import_zod30.z.string().optional().describe(
3858
4000
  "Reporting taxonomy (1-40 characters, ^[A-Za-z][A-Za-z0-9-]*$): us-gaap, dei, ifrs-full or srt. Defaults to 'us-gaap'."
3859
4001
  ),
3860
- unit: import_zod27.z.string().optional().describe(
4002
+ unit: import_zod30.z.string().optional().describe(
3861
4003
  "Unit of measure to keep (1-40 characters), e.g. 'USD' vs 'USD/shares'."
3862
4004
  ),
3863
- form: import_zod27.z.string().optional().describe(
4005
+ form: import_zod30.z.string().optional().describe(
3864
4006
  "Form to keep (1-50 characters). EXACT match here, unlike filings(), so '10-K' excludes 10-K/A."
3865
4007
  ),
3866
- limit: import_zod27.z.number().int().optional().describe(
4008
+ limit: import_zod30.z.number().int().optional().describe(
3867
4009
  "Rows to return, 1-2000. Defaults to 250. Sizes the response; it is not a page param."
3868
4010
  )
3869
4011
  }),
@@ -3876,20 +4018,20 @@ var secToolSpecs = [
3876
4018
  endpoint: "/api/v1/sec/facts",
3877
4019
  credits: 1,
3878
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.",
3879
- inputSchema: import_zod27.z.object({
3880
- cik: import_zod27.z.string().optional().describe(
4021
+ inputSchema: import_zod30.z.object({
4022
+ cik: import_zod30.z.string().optional().describe(
3881
4023
  "Filer CIK, zero-padded or bare (1-20 characters). A ticker is accepted here too."
3882
4024
  ),
3883
- ticker: import_zod27.z.string().optional().describe(
4025
+ ticker: import_zod30.z.string().optional().describe(
3884
4026
  "Ticker symbol (1-20 characters), as an alternative to cik."
3885
4027
  ),
3886
- taxonomy: import_zod27.z.string().optional().describe(
4028
+ taxonomy: import_zod30.z.string().optional().describe(
3887
4029
  "Restrict to one taxonomy (1-40 characters), e.g. 'us-gaap' or 'dei'."
3888
4030
  ),
3889
- query: import_zod27.z.string().optional().describe(
4031
+ query: import_zod30.z.string().optional().describe(
3890
4032
  "Case-insensitive substring matched against the tag name and label (1-200 characters)."
3891
4033
  ),
3892
- limit: import_zod27.z.number().int().optional().describe(
4034
+ limit: import_zod30.z.number().int().optional().describe(
3893
4035
  "Rows to return, 1-2000. Defaults to 250. Sizes the response; it is not a page param."
3894
4036
  )
3895
4037
  }),
@@ -3902,30 +4044,30 @@ var secToolSpecs = [
3902
4044
  endpoint: "/api/v1/sec/search",
3903
4045
  credits: 1,
3904
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.",
3905
- inputSchema: import_zod27.z.object({
3906
- query: import_zod27.z.string().optional().describe(
4047
+ inputSchema: import_zod30.z.object({
4048
+ query: import_zod30.z.string().optional().describe(
3907
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."
3908
4050
  ),
3909
- cik: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.z.string())]).optional().describe(
4051
+ cik: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
3910
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."
3911
4053
  ),
3912
- ticker: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.z.string())]).optional().describe(
4054
+ ticker: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
3913
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."
3914
4056
  ),
3915
- form: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.z.string())]).optional().describe(
4057
+ form: import_zod30.z.union([import_zod30.z.string(), import_zod30.z.array(import_zod30.z.string())]).optional().describe(
3916
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."
3917
4059
  ),
3918
- date_from: import_zod27.z.string().optional().describe(
4060
+ date_from: import_zod30.z.string().optional().describe(
3919
4061
  "Earliest filing date, inclusive (YYYY-MM-DD). Full-text coverage starts in 2001."
3920
4062
  ),
3921
- date_to: import_zod27.z.string().optional().describe("Latest filing date, inclusive (YYYY-MM-DD)."),
3922
- location: import_zod27.z.union([import_zod27.z.string(), import_zod27.z.array(import_zod27.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(
3923
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."
3924
4066
  ),
3925
- sort: import_zod27.z.enum(["relevance", "newest", "oldest"]).optional().describe(
4067
+ sort: import_zod30.z.enum(["relevance", "newest", "oldest"]).optional().describe(
3926
4068
  "Result ordering. Defaults to the index's own relevance ranking."
3927
4069
  ),
3928
- page: import_zod27.z.number().int().optional().describe(
4070
+ page: import_zod30.z.number().int().optional().describe(
3929
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."
3930
4072
  )
3931
4073
  }),
@@ -3940,7 +4082,7 @@ var createScavioSecFactsTool = toolFactory(secToolSpecs, "scavioSecFacts");
3940
4082
  var createScavioSecSearchTool = toolFactory(secToolSpecs, "scavioSecSearch");
3941
4083
 
3942
4084
  // src/redfin.ts
3943
- var import_zod28 = require("zod");
4085
+ var import_zod31 = require("zod");
3944
4086
  var redfinToolSpecs = [
3945
4087
  defineScavioTool({
3946
4088
  key: "scavioRedfinSearch",
@@ -3949,27 +4091,27 @@ var redfinToolSpecs = [
3949
4091
  endpoint: "/api/v1/redfin/search",
3950
4092
  credits: 1,
3951
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.",
3952
- inputSchema: import_zod28.z.object({
3953
- location: import_zod28.z.string().optional().describe(
4094
+ inputSchema: import_zod31.z.object({
4095
+ location: import_zod31.z.string().optional().describe(
3954
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."
3955
4097
  ),
3956
- region_id: import_zod28.z.number().int().optional().describe(
4098
+ region_id: import_zod31.z.number().int().optional().describe(
3957
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."
3958
4100
  ),
3959
- region_type: import_zod28.z.union([import_zod28.z.literal(1), import_zod28.z.literal(2), import_zod28.z.literal(5), import_zod28.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(
3960
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."
3961
4103
  ),
3962
- listing_status: import_zod28.z.enum(["for_sale", "sold", "for_rent"]).optional().describe(
4104
+ listing_status: import_zod31.z.enum(["for_sale", "sold", "for_rent"]).optional().describe(
3963
4105
  "Market to search. Defaults to 'for_sale'."
3964
4106
  ),
3965
- sold_within_days: import_zod28.z.number().int().optional().describe(
4107
+ sold_within_days: import_zod31.z.number().int().optional().describe(
3966
4108
  "Sold within the last N days (>= 1). REJECTED unless listing_status='sold', where it defaults to 90."
3967
4109
  ),
3968
- page: import_zod28.z.number().int().optional().describe(
4110
+ page: import_zod31.z.number().int().optional().describe(
3969
4111
  "Results page, 1-based; page size is whatever limit is set to. No upper bound."
3970
4112
  ),
3971
- limit: import_zod28.z.number().int().optional().describe("Listings per page, 1-350. Defaults to 100."),
3972
- sort: import_zod28.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([
3973
4115
  "recommended",
3974
4116
  "price_low",
3975
4117
  "price_high",
@@ -3982,38 +4124,38 @@ var redfinToolSpecs = [
3982
4124
  ]).optional().describe(
3983
4125
  "Result sort order. Defaults to 'recommended', Redfin's own ranking."
3984
4126
  ),
3985
- min_price: import_zod28.z.number().optional().describe(
4127
+ min_price: import_zod31.z.number().optional().describe(
3986
4128
  "Minimum price, inclusive (>= 0). Monthly rent when listing_status='for_rent'."
3987
4129
  ),
3988
- max_price: import_zod28.z.number().optional().describe(
4130
+ max_price: import_zod31.z.number().optional().describe(
3989
4131
  "Maximum price, inclusive (>= 0). Monthly rent when listing_status='for_rent'."
3990
4132
  ),
3991
- beds_min: import_zod28.z.number().int().optional().describe(
4133
+ beds_min: import_zod31.z.number().int().optional().describe(
3992
4134
  "Minimum bedrooms (whole number >= 0); fractional values are rejected."
3993
4135
  ),
3994
- beds_max: import_zod28.z.number().int().optional().describe(
4136
+ beds_max: import_zod31.z.number().int().optional().describe(
3995
4137
  "Maximum bedrooms (whole number >= 0); fractional values are rejected."
3996
4138
  ),
3997
- baths_min: import_zod28.z.number().int().optional().describe(
4139
+ baths_min: import_zod31.z.number().int().optional().describe(
3998
4140
  "Minimum bathrooms (whole number >= 0). WHOLE BATHS ONLY - 1.5 is rejected rather than silently truncated to 1. There is no baths_max."
3999
4141
  ),
4000
- sqft_min: import_zod28.z.number().int().optional().describe(
4142
+ sqft_min: import_zod31.z.number().int().optional().describe(
4001
4143
  "Minimum living area in square feet (whole number >= 0)."
4002
4144
  ),
4003
- sqft_max: import_zod28.z.number().int().optional().describe(
4145
+ sqft_max: import_zod31.z.number().int().optional().describe(
4004
4146
  "Maximum living area in square feet (whole number >= 0)."
4005
4147
  ),
4006
- lot_size_min: import_zod28.z.number().int().optional().describe(
4148
+ lot_size_min: import_zod31.z.number().int().optional().describe(
4007
4149
  "Minimum lot size in square feet (whole number >= 0). There is no lot_size_max."
4008
4150
  ),
4009
- year_built_min: import_zod28.z.number().int().optional().describe(
4151
+ year_built_min: import_zod31.z.number().int().optional().describe(
4010
4152
  "Earliest year built (whole number >= 0)."
4011
4153
  ),
4012
- year_built_max: import_zod28.z.number().int().optional().describe(
4154
+ year_built_max: import_zod31.z.number().int().optional().describe(
4013
4155
  "Latest year built (whole number >= 0)."
4014
4156
  ),
4015
- max_hoa: import_zod28.z.number().optional().describe("Maximum monthly HOA fee in dollars (>= 0)."),
4016
- property_type: import_zod28.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([
4017
4159
  "house",
4018
4160
  "condo",
4019
4161
  "townhouse",
@@ -4024,11 +4166,11 @@ var redfinToolSpecs = [
4024
4166
  ]).optional().describe(
4025
4167
  "Restrict to one property type."
4026
4168
  ),
4027
- has_pool: import_zod28.z.boolean().optional().describe("Only listings with a pool."),
4028
- max_days_on_market: import_zod28.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(
4029
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."
4030
4172
  ),
4031
- min_days_on_market: import_zod28.z.number().int().optional().describe(
4173
+ min_days_on_market: import_zod31.z.number().int().optional().describe(
4032
4174
  "Listed at least N days ago (whole number >= 0). Cannot be combined with max_days_on_market."
4033
4175
  )
4034
4176
  }),
@@ -4041,8 +4183,8 @@ var redfinToolSpecs = [
4041
4183
  endpoint: "/api/v1/redfin/property",
4042
4184
  credits: 1,
4043
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.",
4044
- inputSchema: import_zod28.z.object({
4045
- property_id: import_zod28.z.string().describe(
4186
+ inputSchema: import_zod31.z.object({
4187
+ property_id: import_zod31.z.string().describe(
4046
4188
  "Redfin property id, or any redfin.com listing URL carrying one (1-500 characters)."
4047
4189
  )
4048
4190
  }),
@@ -4055,14 +4197,14 @@ var redfinToolSpecs = [
4055
4197
  endpoint: "/api/v1/redfin/market",
4056
4198
  credits: 1,
4057
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.",
4058
- inputSchema: import_zod28.z.object({
4059
- location: import_zod28.z.string().optional().describe(
4200
+ inputSchema: import_zod31.z.object({
4201
+ location: import_zod31.z.string().optional().describe(
4060
4202
  "A redfin.com region URL (/city/, /neighborhood/, /county/, /zipcode/) or a bare 5-digit ZIP (1-500 characters). City names are not accepted."
4061
4203
  ),
4062
- region_id: import_zod28.z.number().int().optional().describe(
4204
+ region_id: import_zod31.z.number().int().optional().describe(
4063
4205
  "Redfin internal region id (>= 1), used together with region_type. Not a ZIP code."
4064
4206
  ),
4065
- region_type: import_zod28.z.union([import_zod28.z.literal(1), import_zod28.z.literal(2), import_zod28.z.literal(5), import_zod28.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(
4066
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."
4067
4209
  )
4068
4210
  }),
@@ -4074,7 +4216,7 @@ var createScavioRedfinPropertyTool = toolFactory(redfinToolSpecs, "scavioRedfinP
4074
4216
  var createScavioRedfinMarketTool = toolFactory(redfinToolSpecs, "scavioRedfinMarket");
4075
4217
 
4076
4218
  // src/companies-house.ts
4077
- var import_zod29 = require("zod");
4219
+ var import_zod32 = require("zod");
4078
4220
  var companiesHouseToolSpecs = [
4079
4221
  defineScavioTool({
4080
4222
  key: "scavioCompaniesHouseSearch",
@@ -4083,11 +4225,11 @@ var companiesHouseToolSpecs = [
4083
4225
  endpoint: "/api/v1/companieshouse/search",
4084
4226
  credits: 1,
4085
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.",
4086
- inputSchema: import_zod29.z.object({
4087
- query: import_zod29.z.string().describe(
4228
+ inputSchema: import_zod32.z.object({
4229
+ query: import_zod32.z.string().describe(
4088
4230
  "Company name or fragment (1-200 characters, non-blank). Matches CURRENT AND FORMER names."
4089
4231
  ),
4090
- page: import_zod29.z.number().int().optional().describe(
4232
+ page: import_zod32.z.number().int().optional().describe(
4091
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."
4092
4234
  )
4093
4235
  }),
@@ -4100,8 +4242,8 @@ var companiesHouseToolSpecs = [
4100
4242
  endpoint: "/api/v1/companieshouse/company",
4101
4243
  credits: 1,
4102
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.",
4103
- inputSchema: import_zod29.z.object({
4104
- company_number: import_zod29.z.string().describe(
4245
+ inputSchema: import_zod32.z.object({
4246
+ company_number: import_zod32.z.string().describe(
4105
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."
4106
4248
  )
4107
4249
  }),
@@ -4114,11 +4256,11 @@ var companiesHouseToolSpecs = [
4114
4256
  endpoint: "/api/v1/companieshouse/officers",
4115
4257
  credits: 1,
4116
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.",
4117
- inputSchema: import_zod29.z.object({
4118
- company_number: import_zod29.z.string().describe(
4259
+ inputSchema: import_zod32.z.object({
4260
+ company_number: import_zod32.z.string().describe(
4119
4261
  "UK company number (1-20 characters), zero-padded and upper-cased for you."
4120
4262
  ),
4121
- page: import_zod29.z.number().int().optional().describe(
4263
+ page: import_zod32.z.number().int().optional().describe(
4122
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."
4123
4265
  )
4124
4266
  }),
@@ -4131,11 +4273,11 @@ var companiesHouseToolSpecs = [
4131
4273
  endpoint: "/api/v1/companieshouse/filing-history",
4132
4274
  credits: 1,
4133
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.",
4134
- inputSchema: import_zod29.z.object({
4135
- company_number: import_zod29.z.string().describe(
4276
+ inputSchema: import_zod32.z.object({
4277
+ company_number: import_zod32.z.string().describe(
4136
4278
  "UK company number (1-20 characters), zero-padded and upper-cased for you."
4137
4279
  ),
4138
- page: import_zod29.z.number().int().optional().describe(
4280
+ page: import_zod32.z.number().int().optional().describe(
4139
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."
4140
4282
  )
4141
4283
  }),
@@ -4160,7 +4302,7 @@ var createScavioCompaniesHouseFilingHistoryTool = toolFactory(
4160
4302
  );
4161
4303
 
4162
4304
  // src/g2.ts
4163
- var import_zod30 = require("zod");
4305
+ var import_zod33 = require("zod");
4164
4306
  var g2ToolSpecs = [
4165
4307
  defineScavioTool({
4166
4308
  key: "scavioG2Search",
@@ -4169,27 +4311,27 @@ var g2ToolSpecs = [
4169
4311
  endpoint: "/api/v1/g2/search",
4170
4312
  credits: 5,
4171
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.",
4172
- inputSchema: import_zod30.z.object({
4173
- query: import_zod30.z.string().optional().describe("Search term (1-200 characters). Provide this or url."),
4174
- page: import_zod30.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(
4175
4317
  "1-based page number; page size follows limit (server default 20). G2 keeps paginating well past its own widget's page links."
4176
4318
  ),
4177
- limit: import_zod30.z.number().int().optional().describe(
4319
+ limit: import_zod33.z.number().int().optional().describe(
4178
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."
4179
4321
  ),
4180
- sort: import_zod30.z.enum(["relevance", "popular", "alphabetical", "rating"]).optional().describe(
4322
+ sort: import_zod33.z.enum(["relevance", "popular", "alphabetical", "rating"]).optional().describe(
4181
4323
  "Result sort order (server default 'relevance'). Closed enum: G2 silently accepts an unknown sort and answers 200 with an unstated ordering."
4182
4324
  ),
4183
- rating: import_zod30.z.union([
4184
- import_zod30.z.literal(1),
4185
- import_zod30.z.literal(2),
4186
- import_zod30.z.literal(3),
4187
- import_zod30.z.literal(4),
4188
- import_zod30.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)
4189
4331
  ]).optional().describe(
4190
4332
  "Only products at or above this star rating (1-5, sent as an integer). Omit for no rating floor."
4191
4333
  ),
4192
- url: import_zod30.z.string().optional().describe(
4334
+ url: import_zod33.z.string().optional().describe(
4193
4335
  "Full g2.com/search URL, as an alternative to query (1-1000 characters; the host is checked by the transport)."
4194
4336
  )
4195
4337
  }),
@@ -4202,11 +4344,11 @@ var g2ToolSpecs = [
4202
4344
  endpoint: "/api/v1/g2/product",
4203
4345
  credits: 5,
4204
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.",
4205
- inputSchema: import_zod30.z.object({
4206
- product_id: import_zod30.z.string().optional().describe(
4347
+ inputSchema: import_zod33.z.object({
4348
+ product_id: import_zod33.z.string().optional().describe(
4207
4349
  "G2 product slug ('notion') or the numeric G2 id ('82623') as a string (1-200 characters); both resolve on the same upstream path."
4208
4350
  ),
4209
- url: import_zod30.z.string().optional().describe(
4351
+ url: import_zod33.z.string().optional().describe(
4210
4352
  "Full g2.com product URL, as an alternative to product_id (1-1000 characters)."
4211
4353
  )
4212
4354
  }),
@@ -4219,32 +4361,32 @@ var g2ToolSpecs = [
4219
4361
  endpoint: "/api/v1/g2/reviews",
4220
4362
  credits: 5,
4221
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.",
4222
- inputSchema: import_zod30.z.object({
4223
- product_id: import_zod30.z.string().optional().describe(
4364
+ inputSchema: import_zod33.z.object({
4365
+ product_id: import_zod33.z.string().optional().describe(
4224
4366
  "G2 product slug or numeric G2 id as a string (1-200 characters)."
4225
4367
  ),
4226
- url: import_zod30.z.string().optional().describe(
4368
+ url: import_zod33.z.string().optional().describe(
4227
4369
  "Full g2.com reviews URL, as an alternative to product_id (1-1000 characters)."
4228
4370
  ),
4229
- page: import_zod30.z.number().int().optional().describe(
4371
+ page: import_zod33.z.number().int().optional().describe(
4230
4372
  "1-based page number; fixed at 10 reviews per page."
4231
4373
  ),
4232
- sort: import_zod30.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(
4233
4375
  "Review sort order (server default 'relevance'). Closed enum: an unknown sort is silently accepted upstream and never runs."
4234
4376
  ),
4235
- rating: import_zod30.z.union([
4236
- import_zod30.z.literal(1),
4237
- import_zod30.z.literal(2),
4238
- import_zod30.z.literal(3),
4239
- import_zod30.z.literal(4),
4240
- import_zod30.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)
4241
4383
  ]).optional().describe(
4242
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."
4243
4385
  ),
4244
- company_size: import_zod30.z.enum(["small_business", "mid_market", "enterprise"]).optional().describe(
4386
+ company_size: import_zod33.z.enum(["small_business", "mid_market", "enterprise"]).optional().describe(
4245
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)'."
4246
4388
  ),
4247
- role: import_zod30.z.enum([
4389
+ role: import_zod33.z.enum([
4248
4390
  "user",
4249
4391
  "administrator",
4250
4392
  "executive_sponsor",
@@ -4255,7 +4397,7 @@ var g2ToolSpecs = [
4255
4397
  ]).optional().describe(
4256
4398
  "Reviewer role. Closed enum -- an unknown value matches nothing rather than erroring."
4257
4399
  ),
4258
- region: import_zod30.z.enum([
4400
+ region: import_zod33.z.enum([
4259
4401
  "north_america",
4260
4402
  "europe",
4261
4403
  "asia",
@@ -4266,7 +4408,7 @@ var g2ToolSpecs = [
4266
4408
  ]).optional().describe(
4267
4409
  "Reviewer region. Closed enum -- an unknown value matches nothing rather than erroring."
4268
4410
  ),
4269
- query: import_zod30.z.string().optional().describe(
4411
+ query: import_zod33.z.string().optional().describe(
4270
4412
  "Full-text search within this product's reviews (1-200 characters); narrows the review list AND every facet count."
4271
4413
  )
4272
4414
  }),
@@ -4278,7 +4420,7 @@ var createScavioG2ProductTool = toolFactory(g2ToolSpecs, "scavioG2Product");
4278
4420
  var createScavioG2ReviewsTool = toolFactory(g2ToolSpecs, "scavioG2Reviews");
4279
4421
 
4280
4422
  // src/capterra.ts
4281
- var import_zod31 = require("zod");
4423
+ var import_zod34 = require("zod");
4282
4424
  var capterraToolSpecs = [
4283
4425
  defineScavioTool({
4284
4426
  key: "scavioCapterraSearch",
@@ -4287,11 +4429,11 @@ var capterraToolSpecs = [
4287
4429
  endpoint: "/api/v1/capterra/search",
4288
4430
  credits: 2,
4289
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.",
4290
- inputSchema: import_zod31.z.object({
4291
- query: import_zod31.z.string().optional().describe(
4432
+ inputSchema: import_zod34.z.object({
4433
+ query: import_zod34.z.string().optional().describe(
4292
4434
  "Search term (1-200 characters). Required in practice: a term-less Capterra search serves a fixed popular-products list unrelated to the caller."
4293
4435
  ),
4294
- url: import_zod31.z.string().optional().describe(
4436
+ url: import_zod34.z.string().optional().describe(
4295
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)."
4296
4438
  )
4297
4439
  }),
@@ -4304,14 +4446,14 @@ var capterraToolSpecs = [
4304
4446
  endpoint: "/api/v1/capterra/product",
4305
4447
  credits: 2,
4306
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.",
4307
- inputSchema: import_zod31.z.object({
4308
- product_id: import_zod31.z.string().optional().describe(
4449
+ inputSchema: import_zod34.z.object({
4450
+ product_id: import_zod34.z.string().optional().describe(
4309
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."
4310
4452
  ),
4311
- slug: import_zod31.z.string().optional().describe(
4453
+ slug: import_zod34.z.string().optional().describe(
4312
4454
  "Product slug (1-200 characters). Cosmetic on this endpoint -- a wrong slug still returns the right profile -- but load-bearing on reviews()."
4313
4455
  ),
4314
- url: import_zod31.z.string().optional().describe(
4456
+ url: import_zod34.z.string().optional().describe(
4315
4457
  "Full Capterra product URL, as an alternative to product_id (1-1000 characters)."
4316
4458
  )
4317
4459
  }),
@@ -4324,17 +4466,17 @@ var capterraToolSpecs = [
4324
4466
  endpoint: "/api/v1/capterra/reviews",
4325
4467
  credits: 2,
4326
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.",
4327
- inputSchema: import_zod31.z.object({
4328
- product_id: import_zod31.z.string().optional().describe(
4469
+ inputSchema: import_zod34.z.object({
4470
+ product_id: import_zod34.z.string().optional().describe(
4329
4471
  "Capterra product id as a string (1-50 characters)."
4330
4472
  ),
4331
- slug: import_zod31.z.string().optional().describe(
4473
+ slug: import_zod34.z.string().optional().describe(
4332
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()."
4333
4475
  ),
4334
- url: import_zod31.z.string().optional().describe(
4476
+ url: import_zod34.z.string().optional().describe(
4335
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."
4336
4478
  ),
4337
- page: import_zod31.z.number().int().optional().describe(
4479
+ page: import_zod34.z.number().int().optional().describe(
4338
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."
4339
4481
  )
4340
4482
  }),
@@ -4355,7 +4497,7 @@ var createScavioCapterraReviewsTool = toolFactory(
4355
4497
  );
4356
4498
 
4357
4499
  // src/google-ads.ts
4358
- var import_zod32 = require("zod");
4500
+ var import_zod35 = require("zod");
4359
4501
  var googleAdsToolSpecs = [
4360
4502
  defineScavioTool({
4361
4503
  key: "scavioGoogleAdsAdvertisers",
@@ -4364,12 +4506,12 @@ var googleAdsToolSpecs = [
4364
4506
  endpoint: "/api/v1/googleads/advertisers",
4365
4507
  credits: 1,
4366
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.",
4367
- inputSchema: import_zod32.z.object({
4368
- query: import_zod32.z.string().describe("Brand name or domain to resolve (1-200 characters)."),
4369
- region: import_zod32.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(
4370
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."
4371
4513
  ),
4372
- limit: import_zod32.z.number().int().optional().describe(
4514
+ limit: import_zod35.z.number().int().optional().describe(
4373
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."
4374
4516
  )
4375
4517
  }),
@@ -4382,27 +4524,27 @@ var googleAdsToolSpecs = [
4382
4524
  endpoint: "/api/v1/googleads/search",
4383
4525
  credits: 1,
4384
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.",
4385
- inputSchema: import_zod32.z.object({
4386
- domain: import_zod32.z.string().optional().describe(
4527
+ inputSchema: import_zod35.z.object({
4528
+ domain: import_zod35.z.string().optional().describe(
4387
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."
4388
4530
  ),
4389
- advertiser_id: import_zod32.z.string().optional().describe(
4531
+ advertiser_id: import_zod35.z.string().optional().describe(
4390
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."
4391
4533
  ),
4392
- region: import_zod32.z.string().optional().describe(
4534
+ region: import_zod35.z.string().optional().describe(
4393
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."
4394
4536
  ),
4395
- format: import_zod32.z.enum(["text", "image", "video"]).optional().describe(
4537
+ format: import_zod35.z.enum(["text", "image", "video"]).optional().describe(
4396
4538
  "Creative format. The three sets are disjoint -- an advertiser's text, image and video ads share no creatives. Default: all formats."
4397
4539
  ),
4398
- platform: import_zod32.z.enum(["play", "maps", "search", "shopping", "youtube"]).optional().describe(
4540
+ platform: import_zod35.z.enum(["play", "maps", "search", "shopping", "youtube"]).optional().describe(
4399
4541
  "Google surface the ad ran on. Default: all surfaces."
4400
4542
  ),
4401
- topic: import_zod32.z.enum(["all", "political"]).optional().describe("Ad topic (server default 'all')."),
4402
- limit: import_zod32.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(
4403
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."
4404
4546
  ),
4405
- cursor: import_zod32.z.string().optional().describe(
4547
+ cursor: import_zod35.z.string().optional().describe(
4406
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."
4407
4549
  )
4408
4550
  }),
@@ -4415,11 +4557,11 @@ var googleAdsToolSpecs = [
4415
4557
  endpoint: "/api/v1/googleads/creative",
4416
4558
  credits: 1,
4417
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.",
4418
- inputSchema: import_zod32.z.object({
4419
- advertiser_id: import_zod32.z.string().describe(
4560
+ inputSchema: import_zod35.z.object({
4561
+ advertiser_id: import_zod35.z.string().describe(
4420
4562
  "Google advertiser id, e.g. 'AR16735076323512287233' (3-40 characters)."
4421
4563
  ),
4422
- creative_id: import_zod32.z.string().describe(
4564
+ creative_id: import_zod35.z.string().describe(
4423
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."
4424
4566
  )
4425
4567
  }),
@@ -4440,7 +4582,7 @@ var createScavioGoogleAdsCreativeTool = toolFactory(
4440
4582
  );
4441
4583
 
4442
4584
  // src/meta-ads.ts
4443
- var import_zod33 = require("zod");
4585
+ var import_zod36 = require("zod");
4444
4586
  var metaAdsToolSpecs = [
4445
4587
  defineScavioTool({
4446
4588
  key: "scavioMetaAdsSearch",
@@ -4449,24 +4591,24 @@ var metaAdsToolSpecs = [
4449
4591
  endpoint: "/api/v1/meta-ads/search",
4450
4592
  credits: 1,
4451
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.",
4452
- inputSchema: import_zod33.z.object({
4453
- query: import_zod33.z.string().describe("Keyword to search the ad library for (1-200 characters)."),
4454
- country: import_zod33.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(
4455
4597
  "Ad library country as an exactly 2-character ISO 3166-1 alpha-2 code (server default 'US')."
4456
4598
  ),
4457
- active_status: import_zod33.z.enum(["all", "active", "inactive"]).optional().describe(
4599
+ active_status: import_zod36.z.enum(["all", "active", "inactive"]).optional().describe(
4458
4600
  "Whether the ad is still running (server default 'all')."
4459
4601
  ),
4460
- ad_type: import_zod33.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4602
+ ad_type: import_zod36.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4461
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')."
4462
4604
  ),
4463
- media_type: import_zod33.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(
4464
4606
  "Creative media filter. Default: no media filter."
4465
4607
  ),
4466
- search_type: import_zod33.z.enum(["keyword_unordered", "keyword_exact_phrase"]).optional().describe(
4608
+ search_type: import_zod36.z.enum(["keyword_unordered", "keyword_exact_phrase"]).optional().describe(
4467
4609
  "How the query is matched (server default 'keyword_unordered')."
4468
4610
  ),
4469
- cursor: import_zod33.z.string().optional().describe(
4611
+ cursor: import_zod36.z.string().optional().describe(
4470
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."
4471
4613
  )
4472
4614
  }),
@@ -4479,23 +4621,23 @@ var metaAdsToolSpecs = [
4479
4621
  endpoint: "/api/v1/meta-ads/advertiser",
4480
4622
  credits: 1,
4481
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.",
4482
- inputSchema: import_zod33.z.object({
4483
- page_id: import_zod33.z.string().describe(
4624
+ inputSchema: import_zod36.z.object({
4625
+ page_id: import_zod36.z.string().describe(
4484
4626
  "The advertiser's numeric Facebook Page id (3-25 digits, as a string)."
4485
4627
  ),
4486
- country: import_zod33.z.string().optional().describe(
4628
+ country: import_zod36.z.string().optional().describe(
4487
4629
  "Ad library country as an exactly 2-character ISO 3166-1 alpha-2 code (server default 'US')."
4488
4630
  ),
4489
- active_status: import_zod33.z.enum(["all", "active", "inactive"]).optional().describe(
4631
+ active_status: import_zod36.z.enum(["all", "active", "inactive"]).optional().describe(
4490
4632
  "Whether the ad is still running (server default 'all')."
4491
4633
  ),
4492
- ad_type: import_zod33.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4634
+ ad_type: import_zod36.z.enum(["all", "political_and_issue_ads"]).optional().describe(
4493
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')."
4494
4636
  ),
4495
- media_type: import_zod33.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(
4496
4638
  "Creative media filter. Default: no media filter."
4497
4639
  ),
4498
- cursor: import_zod33.z.string().optional().describe(
4640
+ cursor: import_zod36.z.string().optional().describe(
4499
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."
4500
4642
  )
4501
4643
  }),
@@ -4508,8 +4650,8 @@ var metaAdsToolSpecs = [
4508
4650
  endpoint: "/api/v1/meta-ads/ad",
4509
4651
  credits: 1,
4510
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.",
4511
- inputSchema: import_zod33.z.object({
4512
- ad_archive_id: import_zod33.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).")
4513
4655
  }),
4514
4656
  call: (client, input) => client.metaAds.ad(input)
4515
4657
  })
@@ -4522,7 +4664,7 @@ var createScavioMetaAdsAdvertiserTool = toolFactory(
4522
4664
  var createScavioMetaAdsAdTool = toolFactory(metaAdsToolSpecs, "scavioMetaAdsAd");
4523
4665
 
4524
4666
  // src/extract-web.ts
4525
- var import_zod34 = require("zod");
4667
+ var import_zod37 = require("zod");
4526
4668
  var JOB_POLL_INTERVAL_MS = 3e3;
4527
4669
  var JOB_WAIT_DEFAULT_SECONDS = 45;
4528
4670
  var JOB_WAIT_MAX_SECONDS = 300;
@@ -4553,20 +4695,20 @@ async function startAndWait(start, status, input) {
4553
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'.";
4554
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/**'].";
4555
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.";
4556
- var mode = import_zod34.z.enum(["normal", "advanced", "ultra"]).optional().describe(MODE_DESCRIPTION);
4557
- var format = import_zod34.z.enum(["html", "markdown", "text"]).optional().describe("Format for each page, as on extract: html, markdown or text (server default markdown).");
4558
- var waitSeconds = import_zod34.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(
4559
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."
4560
4702
  );
4561
- var limit = import_zod34.z.number().int().min(1).max(100).optional().describe(
4703
+ var limit = import_zod37.z.number().int().min(1).max(100).optional().describe(
4562
4704
  "Results per response, 1-100 (default 10, to keep page content inside the context window); page on with next_cursor."
4563
4705
  );
4564
- var includeContent = import_zod34.z.boolean().optional().describe("Set false to list results without their page content (default true).");
4565
- var statusSchema = import_zod34.z.object({
4566
- id: import_zod34.z.string().describe("Job id returned when the job was started (data.id)."),
4567
- cursor: import_zod34.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."),
4568
4710
  limit,
4569
- status: import_zod34.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."),
4570
4712
  include_content: includeContent
4571
4713
  });
4572
4714
  var readStatus = (fn) => (client, { id, limit: max, ...query }) => fn(client)(id, { ...query, limit: max ?? JOB_RESULTS_DEFAULT_LIMIT });
@@ -4578,19 +4720,19 @@ var extractWebToolSpecs = [
4578
4720
  endpoint: "/api/v1/extract/map",
4579
4721
  credits: 1,
4580
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.",
4581
- inputSchema: import_zod34.z.object({
4582
- url: import_zod34.z.string().describe("The site to map. A bare host is upgraded to https."),
4583
- search: import_zod34.z.string().optional().describe("Only return URLs containing every word of this text (case-insensitive)."),
4584
- limit: import_zod34.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(
4585
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)."
4586
4728
  ),
4587
- sitemap: import_zod34.z.enum(["include", "only", "skip"]).optional().describe(
4729
+ sitemap: import_zod37.z.enum(["include", "only", "skip"]).optional().describe(
4588
4730
  "'include' combines the site's sitemaps with the start page's links (default); 'only' uses sitemaps alone; 'skip' uses page links alone."
4589
4731
  ),
4590
- include_subdomains: import_zod34.z.boolean().optional().describe("Also return URLs on subdomains of the site (default false)."),
4591
- include_paths: import_zod34.z.array(import_zod34.z.string()).optional().describe(`Keep only URLs matching these. ${PATHS_DESCRIPTION}`),
4592
- exclude_paths: import_zod34.z.array(import_zod34.z.string()).optional().describe(`Drop URLs matching these. ${PATHS_DESCRIPTION}`),
4593
- ignore_query_parameters: import_zod34.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)."),
4594
4736
  mode
4595
4737
  }),
4596
4738
  call: async (client, input) => await client.extract.map(input)
@@ -4602,17 +4744,17 @@ var extractWebToolSpecs = [
4602
4744
  endpoint: "/api/v1/extract/crawl",
4603
4745
  credits: 1,
4604
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,
4605
- inputSchema: import_zod34.z.object({
4606
- url: import_zod34.z.string().describe("Where the crawl starts. Only pages on the same site are crawled."),
4607
- max_pages: import_zod34.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(
4608
4750
  "Maximum pages to fetch. Default 100. Plan limits: Free 10, PAYG 100, Project 500, Bootstrap 2,000, Startup 5,000, Growth 10,000."
4609
4751
  ),
4610
- max_depth: import_zod34.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."),
4611
- include_paths: import_zod34.z.array(import_zod34.z.string()).optional().describe(`Crawl only paths matching these. ${PATHS_DESCRIPTION}`),
4612
- exclude_paths: import_zod34.z.array(import_zod34.z.string()).optional().describe(`Skip paths matching these. ${PATHS_DESCRIPTION}`),
4613
- allow_subdomains: import_zod34.z.boolean().optional().describe("Also crawl subdomains of the site (default false)."),
4614
- ignore_query_parameters: import_zod34.z.boolean().optional().describe("Treat URLs that differ only by query string as one page (default true)."),
4615
- sitemap: import_zod34.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(
4616
4758
  "'include' also starts from the site's sitemap (default); 'skip' follows links only; 'only' fetches sitemap pages without following links."
4617
4759
  ),
4618
4760
  format,
@@ -4644,8 +4786,8 @@ var extractWebToolSpecs = [
4644
4786
  endpoint: "/api/v1/extract/batch",
4645
4787
  credits: 1,
4646
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,
4647
- inputSchema: import_zod34.z.object({
4648
- urls: import_zod34.z.array(import_zod34.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(
4649
4791
  "The pages to extract (duplicates removed). Plan limits: Free 10, PAYG 50, Project 100, Bootstrap 500, Startup and Growth 1,000."
4650
4792
  ),
4651
4793
  format,
@@ -4814,6 +4956,11 @@ function createScavioTools(config) {
4814
4956
  scavioHomeDepotSearch: createScavioHomeDepotSearchTool(config),
4815
4957
  scavioHomeDepotProduct: createScavioHomeDepotProductTool(config),
4816
4958
  scavioHomeDepotReviews: createScavioHomeDepotReviewsTool(config),
4959
+ scavioHebSearch: createScavioHebSearchTool(config),
4960
+ scavioHebProduct: createScavioHebProductTool(config),
4961
+ scavioHebStores: createScavioHebStoresTool(config),
4962
+ scavioKrogerSearch: createScavioKrogerSearchTool(config),
4963
+ scavioKrogerProduct: createScavioKrogerProductTool(config),
4817
4964
  scavioZillowSearch: createScavioZillowSearchTool(config),
4818
4965
  scavioZillowProperty: createScavioZillowPropertyTool(config),
4819
4966
  scavioZillowAgentReviews: createScavioZillowAgentReviewsTool(config),
@@ -4909,6 +5056,8 @@ function createScavioTools(config) {
4909
5056
  createScavioCompaniesHouseSearchTool,
4910
5057
  createScavioCrawlStatusTool,
4911
5058
  createScavioCrawlWebsiteTool,
5059
+ createScavioDecathlonProductTool,
5060
+ createScavioDecathlonSearchTool,
4912
5061
  createScavioEbayProductTool,
4913
5062
  createScavioEbaySearchTool,
4914
5063
  createScavioEbaySellerTool,
@@ -4940,6 +5089,9 @@ function createScavioTools(config) {
4940
5089
  createScavioGoogleShoppingTool,
4941
5090
  createScavioGoogleTrendingTool,
4942
5091
  createScavioGoogleTrendsTool,
5092
+ createScavioHebProductTool,
5093
+ createScavioHebSearchTool,
5094
+ createScavioHebStoresTool,
4943
5095
  createScavioHomeDepotProductTool,
4944
5096
  createScavioHomeDepotReviewsTool,
4945
5097
  createScavioHomeDepotSearchTool,
@@ -4959,6 +5111,8 @@ function createScavioTools(config) {
4959
5111
  createScavioInstagramUserReelsTool,
4960
5112
  createScavioInstagramUserStoriesTool,
4961
5113
  createScavioInstagramUserTaggedTool,
5114
+ createScavioKrogerProductTool,
5115
+ createScavioKrogerSearchTool,
4962
5116
  createScavioKuaishouCommentRepliesTool,
4963
5117
  createScavioKuaishouProfileTool,
4964
5118
  createScavioKuaishouSearchLiveTool,
@@ -5082,6 +5236,7 @@ function createScavioTools(config) {
5082
5236
  createScavioZillowAgentReviewsTool,
5083
5237
  createScavioZillowPropertyTool,
5084
5238
  createScavioZillowSearchTool,
5239
+ decathlonToolSpecs,
5085
5240
  ebayToolSpecs,
5086
5241
  extractToolSpecs,
5087
5242
  extractWebToolSpecs,
@@ -5091,9 +5246,11 @@ function createScavioTools(config) {
5091
5246
  googleAdsToolSpecs,
5092
5247
  googlePlayToolSpecs,
5093
5248
  googleToolSpecs,
5249
+ hebToolSpecs,
5094
5250
  homeDepotToolSpecs,
5095
5251
  indeedToolSpecs,
5096
5252
  instagramToolSpecs,
5253
+ krogerToolSpecs,
5097
5254
  kuaishouToolSpecs,
5098
5255
  linkedinToolSpecs,
5099
5256
  metaAdsToolSpecs,