mastra-scavio 0.8.0 → 0.8.1

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