{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/mcp/registry.ts","../src/utils/global-search.ts","../src/utils/geo.ts","../src/utils/ee-optimizer.ts","../src/mcp/tools/consolidated/earth_engine_data.ts","../src/mcp/tools/consolidated/stores.ts","../src/mcp/tools/consolidated/earth_engine_system.ts","../src/lib/global-store.ts","../src/mcp/tools/consolidated/earth_engine_process.ts","../src/mcp/tools/consolidated/tiles_fixed.ts","../src/mcp/tools/consolidated/earth_engine_export.ts","../src/mcp/tools/consolidated/earth_engine_map.ts","../src/mcp/tools/consolidated/crop_classification.ts","../src/mcp/tools/index.ts","../src/index.ts","../src/mcp/server.ts","../src/gee/client.ts","../src/auth/index.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { z } from 'zod';\ntype Handler = (input:any)=>Promise<any>;\ntype Tool = { name:string; description:string; input: any; output: any; handler: Handler; };\nconst tools = new Map<string, Tool>();\nexport function register(tool: Tool){ tools.set(tool.name, tool); }\nexport function list(){ return [...tools.values()].map(t=>({name:t.name, description:t.description})); }\nexport function get(name:string){ const t=tools.get(name); if(!t) throw new Error(`Tool not found: ${name}`); return t; }\nexport { z };\n","import ee from '@google/earthengine';\r\n\r\n/**\r\n * Comprehensive global location search system\r\n * Supports any city, state, country, or county in the world\r\n */\r\n\r\nexport interface SearchResult {\r\n  geometry: any;\r\n  dataset: string;\r\n  level: string;\r\n  matchType: string;\r\n  confidence: number;\r\n}\r\n\r\n/**\r\n * Main search function - tries multiple strategies to find any location\r\n */\r\nexport async function findGlobalLocation(placeName: string): Promise<any> {\r\n  console.log(`🌍 Searching globally for: \"${placeName}\"`);\r\n  \r\n  // Normalize the input\r\n  const normalized = placeName.toLowerCase().trim();\r\n  const titleCase = toTitleCase(placeName);\r\n  const upperCase = placeName.toUpperCase();\r\n  \r\n  // Parse location with context (e.g., \"Paris, France\" or \"Austin, Texas\")\r\n  const { primary, context } = parseLocationWithContext(placeName);\r\n  \r\n  // Define all search strategies in priority order\r\n  const strategies = [\r\n    // 1. Try exact matches first\r\n    () => searchExactMatch(placeName),\r\n    () => searchExactMatch(titleCase),\r\n    () => searchExactMatch(upperCase),\r\n    \r\n    // 2. Try with context if provided\r\n    ...(context ? [() => searchWithContext(primary, context)] : []),\r\n    \r\n    // 3. Try US locations (TIGER dataset)\r\n    () => searchUSLocation(placeName),\r\n    \r\n    // 4. Try global locations (FAO GAUL dataset)\r\n    () => searchFAOGAUL(placeName),\r\n    \r\n    // 5. Try fuzzy matching\r\n    () => searchFuzzy(placeName),\r\n    \r\n    // 6. Try removing common suffixes\r\n    () => searchWithoutSuffixes(placeName),\r\n    \r\n    // 7. Try partial matching\r\n    () => searchPartial(placeName)\r\n  ];\r\n  \r\n  // Execute strategies in order until one succeeds\r\n  for (const strategy of strategies) {\r\n    try {\r\n      const result = await strategy();\r\n      if (result) {\r\n        return result;\r\n      }\r\n    } catch (e) {\r\n      // Continue to next strategy\r\n    }\r\n  }\r\n  \r\n  // If nothing found, throw informative error\r\n  throw new Error(`Could not find location: \"${placeName}\". Try adding more context (e.g., \"Paris, France\" or \"Austin, Texas\")`);\r\n}\r\n\r\n/**\r\n * Search for exact matches across all datasets\r\n */\r\nasync function searchExactMatch(searchTerm: string): Promise<any> {\r\n  const datasets = [\r\n    // US Counties\r\n    {\r\n      collection: 'TIGER/2016/Counties',\r\n      fields: ['NAME', 'NAMELSAD'],\r\n      level: 'County'\r\n    },\r\n    // US States\r\n    {\r\n      collection: 'TIGER/2016/States',\r\n      fields: ['NAME', 'STUSPS'],\r\n      level: 'State'\r\n    },\r\n    // Global Districts/Cities (Level 2)\r\n    {\r\n      collection: 'FAO/GAUL/2015/level2',\r\n      fields: ['ADM2_NAME'],\r\n      level: 'District/City'\r\n    },\r\n    // Global States/Provinces (Level 1)\r\n    {\r\n      collection: 'FAO/GAUL/2015/level1',\r\n      fields: ['ADM1_NAME'],\r\n      level: 'State/Province'\r\n    },\r\n    // Global Countries (Level 0)\r\n    {\r\n      collection: 'FAO/GAUL/2015/level0',\r\n      fields: ['ADM0_NAME'],\r\n      level: 'Country'\r\n    },\r\n    // International boundaries\r\n    {\r\n      collection: 'USDOS/LSIB_SIMPLE/2017',\r\n      fields: ['country_na'],\r\n      level: 'Country'\r\n    }\r\n  ];\r\n  \r\n  for (const dataset of datasets) {\r\n    for (const field of dataset.fields) {\r\n      try {\r\n        const fc = (new ee.FeatureCollection(dataset.collection) as any);\r\n        const filtered = fc.filter(ee.Filter.eq(field, searchTerm));\r\n        \r\n        // Check if there are any results first\r\n        const size = filtered.size();\r\n        const count = await size.getInfo();\r\n        \r\n        if (count > 0) {\r\n          const first = filtered.first();\r\n          const geometry = first.geometry();\r\n          console.log(`✅ Found \"${searchTerm}\" in ${dataset.collection} (${field})`);\r\n          return geometry;\r\n        }\r\n      } catch (e) {\r\n        // Not found, continue\r\n      }\r\n    }\r\n  }\r\n  \r\n  return null;\r\n}\r\n\r\n/**\r\n * Search with context (e.g., \"Paris, France\")\r\n */\r\nasync function searchWithContext(city: string, context: string): Promise<any> {\r\n  // Try city in country\r\n  try {\r\n    const fc = (new ee.FeatureCollection('FAO/GAUL/2015/level2') as any);\r\n    const filtered = fc.filter(\r\n      ee.Filter.and(\r\n        (ee.Filter as any).or(\r\n          ee.Filter.eq('ADM2_NAME', city),\r\n          ee.Filter.eq('ADM2_NAME', toTitleCase(city))\r\n        ),\r\n        (ee.Filter as any).or(\r\n          ee.Filter.eq('ADM0_NAME', context),\r\n          ee.Filter.eq('ADM0_NAME', toTitleCase(context))\r\n        )\r\n      )\r\n    );\r\n    \r\n    const count = await filtered.size().getInfo();\r\n    if (count > 0) {\r\n      const first = filtered.first();\r\n      const geometry = first.geometry();\r\n      console.log(`✅ Found \"${city}\" in ${context}`);\r\n      return geometry;\r\n    }\r\n  } catch (e) {\r\n    // Try city in state/province\r\n    try {\r\n      const fc = (new ee.FeatureCollection('FAO/GAUL/2015/level2') as any);\r\n      const filtered = fc.filter(\r\n        ee.Filter.and(\r\n          ee.Filter.eq('ADM2_NAME', city),\r\n          ee.Filter.eq('ADM1_NAME', context)\r\n        )\r\n      );\r\n      \r\n      const count = await filtered.size().getInfo();\r\n      if (count > 0) {\r\n        const first = filtered.first();\r\n        const geometry = first.geometry();\r\n        console.log(`✅ Found \"${city}\" in state/province ${context}`);\r\n        return geometry;\r\n      }\r\n    } catch (e2) {\r\n      // Not found\r\n    }\r\n  }\r\n  \r\n  return null;\r\n}\r\n\r\n/**\r\n * Search US locations using TIGER dataset\r\n */\r\nasync function searchUSLocation(searchTerm: string): Promise<any> {\r\n  const normalized = searchTerm.toLowerCase();\r\n  const titleCase = toTitleCase(searchTerm);\r\n  \r\n  // Common US city to county mappings\r\n  const cityToCounty: { [key: string]: { county: string, state: string } } = {\r\n    'new york': { county: 'New York', state: '36' },\r\n    'los angeles': { county: 'Los Angeles', state: '06' },\r\n    'chicago': { county: 'Cook', state: '17' },\r\n    'houston': { county: 'Harris', state: '48' },\r\n    'phoenix': { county: 'Maricopa', state: '04' },\r\n    'philadelphia': { county: 'Philadelphia', state: '42' },\r\n    'san antonio': { county: 'Bexar', state: '48' },\r\n    'san diego': { county: 'San Diego', state: '06' },\r\n    'dallas': { county: 'Dallas', state: '48' },\r\n    'san jose': { county: 'Santa Clara', state: '06' },\r\n    'austin': { county: 'Travis', state: '48' },\r\n    'jacksonville': { county: 'Duval', state: '12' },\r\n    'san francisco': { county: 'San Francisco', state: '06' },\r\n    'columbus': { county: 'Franklin', state: '39' },\r\n    'fort worth': { county: 'Tarrant', state: '48' },\r\n    'indianapolis': { county: 'Marion', state: '18' },\r\n    'charlotte': { county: 'Mecklenburg', state: '37' },\r\n    'seattle': { county: 'King', state: '53' },\r\n    'denver': { county: 'Denver', state: '08' },\r\n    'washington': { county: 'District of Columbia', state: '11' },\r\n    'boston': { county: 'Suffolk', state: '25' },\r\n    'nashville': { county: 'Davidson', state: '47' },\r\n    'detroit': { county: 'Wayne', state: '26' },\r\n    'portland': { county: 'Multnomah', state: '41' },\r\n    'las vegas': { county: 'Clark', state: '32' },\r\n    'miami': { county: 'Miami-Dade', state: '12' },\r\n    'atlanta': { county: 'Fulton', state: '13' },\r\n    'new orleans': { county: 'Orleans', state: '22' }\r\n  };\r\n  \r\n  // Check if it's a known US city\r\n  if (cityToCounty[normalized]) {\r\n    const mapping = cityToCounty[normalized];\r\n    try {\r\n      const fc = (new ee.FeatureCollection('TIGER/2016/Counties') as any);\r\n      const filtered = fc\r\n        .filter(ee.Filter.eq('NAME', mapping.county))\r\n        .filter(ee.Filter.eq('STATEFP', mapping.state));\r\n      \r\n      const count = await filtered.size().getInfo();\r\n      if (count > 0) {\r\n        const first = filtered.first();\r\n        const geometry = first.geometry();\r\n        console.log(`✅ Found US city \"${searchTerm}\" (${mapping.county} County)`);\r\n        return geometry;\r\n      }\r\n    } catch (e) {\r\n      // Continue\r\n    }\r\n  }\r\n  \r\n  // Try as US county\r\n  try {\r\n    const fc = (new ee.FeatureCollection('TIGER/2016/Counties') as any);\r\n    const filtered = fc.filter(\r\n      (ee.Filter as any).or(\r\n        ee.Filter.eq('NAME', searchTerm),\r\n        ee.Filter.eq('NAME', titleCase),\r\n        ee.Filter.eq('NAMELSAD', searchTerm),\r\n        ee.Filter.eq('NAMELSAD', titleCase),\r\n        ee.Filter.eq('NAMELSAD', searchTerm + ' County'),\r\n        ee.Filter.eq('NAMELSAD', titleCase + ' County')\r\n      )\r\n    );\r\n    \r\n    const count = await filtered.size().getInfo();\r\n    if (count > 0) {\r\n      const first = filtered.first();\r\n      const geometry = first.geometry();\r\n      console.log(`✅ Found US county \"${searchTerm}\"`);\r\n      return geometry;\r\n    }\r\n  } catch (e) {\r\n    // Not a US location\r\n  }\r\n  \r\n  return null;\r\n}\r\n\r\n/**\r\n * Search FAO GAUL dataset for global locations\r\n */\r\nasync function searchFAOGAUL(searchTerm: string): Promise<any> {\r\n  const variations = [\r\n    searchTerm,\r\n    toTitleCase(searchTerm),\r\n    searchTerm.toUpperCase()\r\n  ];\r\n  \r\n  // Special handling for major cities that might not be in FAO GAUL\r\n  const majorCities: { [key: string]: { country: string, fallbackRegion?: string } } = {\r\n    'sydney': { country: 'Australia', fallbackRegion: 'New South Wales' },\r\n    'melbourne': { country: 'Australia', fallbackRegion: 'Victoria' },\r\n    'brisbane': { country: 'Australia', fallbackRegion: 'Queensland' },\r\n    'perth': { country: 'Australia', fallbackRegion: 'Western Australia' },\r\n    'adelaide': { country: 'Australia', fallbackRegion: 'South Australia' },\r\n    'auckland': { country: 'New Zealand', fallbackRegion: 'Auckland' },\r\n    'wellington': { country: 'New Zealand', fallbackRegion: 'Wellington' },\r\n    'vancouver': { country: 'Canada', fallbackRegion: 'British Columbia' },\r\n    'toronto': { country: 'Canada', fallbackRegion: 'Ontario' },\r\n    'montreal': { country: 'Canada', fallbackRegion: 'Quebec' }\r\n  };\r\n  \r\n  const normalized = searchTerm.toLowerCase();\r\n  if (majorCities[normalized]) {\r\n    const cityInfo = majorCities[normalized];\r\n    // Try to find the state/province for these cities\r\n    if (cityInfo.fallbackRegion) {\r\n      try {\r\n        const fc = (new ee.FeatureCollection('FAO/GAUL/2015/level1') as any);\r\n        const filtered = fc.filter(\r\n          ee.Filter.and(\r\n            ee.Filter.eq('ADM1_NAME', cityInfo.fallbackRegion),\r\n            ee.Filter.eq('ADM0_NAME', cityInfo.country)\r\n          )\r\n        );\r\n        \r\n        const count = await filtered.size().getInfo();\r\n        if (count > 0) {\r\n          const first = filtered.first();\r\n          const geometry = first.geometry();\r\n          console.log(`✅ Found \"${searchTerm}\" via ${cityInfo.fallbackRegion}, ${cityInfo.country}`);\r\n          return geometry;\r\n        }\r\n      } catch (e) {\r\n        // Try country level\r\n      }\r\n    }\r\n    \r\n    // Fall back to country level\r\n    try {\r\n      const fc = (new ee.FeatureCollection('FAO/GAUL/2015/level0') as any);\r\n      const filtered = fc.filter(ee.Filter.eq('ADM0_NAME', cityInfo.country));\r\n      \r\n      const count = await filtered.size().getInfo();\r\n      if (count > 0) {\r\n        const first = filtered.first();\r\n        const geometry = first.geometry();\r\n        console.log(`✅ Found \"${searchTerm}\" at country level: ${cityInfo.country}`);\r\n        return geometry;\r\n      }\r\n    } catch (e) {\r\n      // Continue with normal search\r\n    }\r\n  }\r\n  \r\n  const levels = [\r\n    { collection: 'FAO/GAUL/2015/level2', field: 'ADM2_NAME', level: 'District' },\r\n    { collection: 'FAO/GAUL/2015/level1', field: 'ADM1_NAME', level: 'State/Province' },\r\n    { collection: 'FAO/GAUL/2015/level0', field: 'ADM0_NAME', level: 'Country' }\r\n  ];\r\n  \r\n  for (const level of levels) {\r\n    for (const variant of variations) {\r\n      try {\r\n        const fc = (new ee.FeatureCollection(level.collection) as any);\r\n        const filtered = fc.filter(ee.Filter.eq(level.field, variant));\r\n        \r\n        const count = await filtered.size().getInfo();\r\n        if (count > 0) {\r\n          const first = filtered.first();\r\n          const geometry = first.geometry();\r\n          console.log(`✅ Found \"${searchTerm}\" in FAO GAUL ${level.level}`);\r\n          return geometry;\r\n        }\r\n      } catch (e) {\r\n        // Continue\r\n      }\r\n    }\r\n  }\r\n  \r\n  return null;\r\n}\r\n\r\n/**\r\n * Fuzzy search with string contains\r\n * Note: Disabled because ee.Filter.stringContains doesn't exist\r\n */\r\nasync function searchFuzzy(searchTerm: string): Promise<any> {\r\n  // Earth Engine doesn't support stringContains, so this is disabled\r\n  return null;\r\n  /*\r\n  const datasets = [\r\n    { collection: 'FAO/GAUL/2015/level2', field: 'ADM2_NAME' },\r\n    { collection: 'FAO/GAUL/2015/level1', field: 'ADM1_NAME' },\r\n    { collection: 'FAO/GAUL/2015/level0', field: 'ADM0_NAME' },\r\n    { collection: 'TIGER/2016/Counties', field: 'NAME' },\r\n    { collection: 'TIGER/2016/States', field: 'NAME' }\r\n  ];\r\n  \r\n  for (const dataset of datasets) {\r\n    try {\r\n      const fc = (new ee.FeatureCollection(dataset.collection) as any);\r\n      const filtered = fc.filter(\r\n        ee.Filter.or(\r\n          ee.Filter.stringContains(dataset.field, searchTerm),\r\n          ee.Filter.stringContains(dataset.field, toTitleCase(searchTerm)),\r\n          ee.Filter.stringStartsWith(dataset.field, searchTerm),\r\n          ee.Filter.stringStartsWith(dataset.field, toTitleCase(searchTerm))\r\n        )\r\n      ).limit(1);\r\n      \r\n      const first = filtered.first();\r\n      const geometry = first.geometry();\r\n      \r\n      console.log(`✅ Found \"${searchTerm}\" (fuzzy match) in ${dataset.collection}`);\r\n      return geometry;\r\n    } catch (e) {\r\n      // Continue\r\n    }\r\n  }\r\n  \r\n  return null;\r\n  */\r\n}\r\n\r\n/**\r\n * Search without common suffixes\r\n */\r\nasync function searchWithoutSuffixes(searchTerm: string): Promise<any> {\r\n  const suffixes = [\r\n    ' city', ' county', ' district', ' province', ' state',\r\n    ' City', ' County', ' District', ' Province', ' State',\r\n    ' CITY', ' COUNTY', ' DISTRICT', ' PROVINCE', ' STATE'\r\n  ];\r\n  \r\n  for (const suffix of suffixes) {\r\n    if (searchTerm.endsWith(suffix)) {\r\n      const cleaned = searchTerm.substring(0, searchTerm.length - suffix.length);\r\n      const result = await searchExactMatch(cleaned);\r\n      if (result) return result;\r\n    }\r\n  }\r\n  \r\n  return null;\r\n}\r\n\r\n/**\r\n * Partial matching for difficult cases\r\n */\r\nasync function searchPartial(searchTerm: string): Promise<any> {\r\n  // Split compound names and try parts\r\n  const parts = searchTerm.split(/[\\s-]+/);\r\n  \r\n  if (parts.length > 1) {\r\n    // Try each significant part\r\n    for (const part of parts) {\r\n      if (part.length > 3) { // Skip short words\r\n        const result = await searchExactMatch(part) || await searchFuzzy(part);\r\n        if (result) {\r\n          console.log(`✅ Found \"${searchTerm}\" by partial match on \"${part}\"`);\r\n          return result;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return null;\r\n}\r\n\r\n/**\r\n * Helper functions\r\n */\r\nfunction toTitleCase(str: string): string {\r\n  return str.replace(/\\w\\S*/g, (txt) => {\r\n    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n  });\r\n}\r\n\r\nfunction parseLocationWithContext(placeName: string): { primary: string; context: string | null } {\r\n  if (placeName.includes(',')) {\r\n    const parts = placeName.split(',').map(p => p.trim());\r\n    return {\r\n      primary: parts[0],\r\n      context: parts[1] || null\r\n    };\r\n  }\r\n  return {\r\n    primary: placeName,\r\n    context: null\r\n  };\r\n}\r\n","import type { Feature, FeatureCollection, Geometry } from 'geojson';\r\nimport ee from '@google/earthengine';\r\nimport { findGlobalLocation } from './global-search';\r\n\r\n/**\r\n * Try to get administrative boundary for a place name\r\n * @param placeName - Name of the place (e.g., \"San Francisco\")\r\n * @returns Earth Engine geometry or null if not found\r\n */\r\nfunction tryGetAdminBoundary(placeName: string): any {\r\n  try {\r\n    // Normalize place name\r\n    const normalized = placeName.toLowerCase().trim();\r\n    \r\n    // Use the actual Earth Engine datasets to get real boundaries\r\n    if (normalized.includes('san francisco') || normalized === 'sf') {\r\n      // Use TIGER census data for US counties - more reliable\r\n      const sfCounty = (new ee.FeatureCollection('TIGER/2016/Counties') as any)\r\n        .filter(ee.Filter.eq('NAME', 'San Francisco'))\r\n        .first();\r\n      \r\n      console.log('Fetching exact San Francisco County boundary from TIGER dataset');\r\n      return sfCounty.geometry();\r\n    }\r\n    \r\n    if (normalized === 'new york' || normalized === 'nyc' || normalized === 'new york city') {\r\n      // New York County (Manhattan)\r\n      const nyCounty = (new ee.FeatureCollection('TIGER/2016/Counties') as any).filter(ee.Filter.eq('NAME', 'New York'))\r\n        .filter(ee.Filter.eq('STATEFP', '36')) // NY state FIPS code\r\n        .first();\r\n        \r\n      console.log('Using TIGER New York County (Manhattan) boundary');\r\n      return nyCounty.geometry();\r\n    }\r\n    \r\n    if (normalized === 'los angeles' || normalized === 'la') {\r\n      // Los Angeles County\r\n      const laCounty = (new ee.FeatureCollection('TIGER/2016/Counties') as any).filter(ee.Filter.eq('NAME', 'Los Angeles'))\r\n        .filter(ee.Filter.eq('STATEFP', '06')) // CA state FIPS code\r\n        .first();\r\n        \r\n      console.log('Using TIGER Los Angeles County boundary');\r\n      return laCounty.geometry();\r\n    }\r\n    \r\n    // Handle international cities with FAO GAUL dataset\r\n    const internationalCities: { [key: string]: { name: string, state?: string, country: string } } = {\r\n      // Indian cities\r\n      'ludhiana': { name: 'Ludhiana', state: 'Punjab', country: 'India' },\r\n      'delhi': { name: 'Delhi', country: 'India' },\r\n      'new delhi': { name: 'Delhi', country: 'India' },\r\n      'mumbai': { name: 'Mumbai Suburban', state: 'Maharashtra', country: 'India' },\r\n      'bangalore': { name: 'Bangalore Urban', state: 'Karnataka', country: 'India' },\r\n      'bengaluru': { name: 'Bangalore Urban', state: 'Karnataka', country: 'India' },\r\n      'chennai': { name: 'Chennai', state: 'Tamil Nadu', country: 'India' },\r\n      'kolkata': { name: 'Kolkata', state: 'West Bengal', country: 'India' },\r\n      'hyderabad': { name: 'Hyderabad', state: 'Andhra Pradesh', country: 'India' },\r\n      'pune': { name: 'Pune', state: 'Maharashtra', country: 'India' },\r\n      'ahmedabad': { name: 'Ahmadabad', state: 'Gujarat', country: 'India' },\r\n      'jaipur': { name: 'Jaipur', state: 'Rajasthan', country: 'India' },\r\n      'lucknow': { name: 'Lucknow', state: 'Uttar Pradesh', country: 'India' },\r\n      'chandigarh': { name: 'Chandigarh', country: 'India' },\r\n      'amritsar': { name: 'Amritsar', state: 'Punjab', country: 'India' },\r\n      // Other international cities\r\n      'london': { name: 'London', state: 'England', country: 'United Kingdom' },\r\n      'paris': { name: 'Paris', state: 'Ile-de-France', country: 'France' },\r\n      'tokyo': { name: 'Tokyo-to', country: 'Japan' },\r\n      'beijing': { name: 'Beijing', country: 'China' },\r\n      'shanghai': { name: 'Shanghai', country: 'China' },\r\n      'dubai': { name: 'Dubai', country: 'United Arab Emirates' },\r\n      'singapore': { name: 'Singapore', country: 'Singapore' },\r\n      'sydney': { name: 'Sydney', state: 'New South Wales', country: 'Australia' },\r\n      'toronto': { name: 'Toronto', state: 'Ontario', country: 'Canada' }\r\n    };\r\n    \r\n    if (internationalCities[normalized]) {\r\n      const cityInfo = internationalCities[normalized];\r\n      try {\r\n        let districts = (new ee.FeatureCollection('FAO/GAUL/2015/level2') as any).filter(ee.Filter.eq('ADM2_NAME', cityInfo.name))\r\n          .filter(ee.Filter.eq('ADM0_NAME', cityInfo.country));\r\n        \r\n        if (cityInfo.state) {\r\n          districts = districts.filter(ee.Filter.eq('ADM1_NAME', cityInfo.state));\r\n        }\r\n        \r\n        const firstDistrict = districts.first();\r\n        const geometry = firstDistrict.geometry();\r\n        console.log(`Found ${placeName} in FAO GAUL dataset (${cityInfo.country})`);\r\n        return geometry;\r\n      } catch (e) {\r\n        // Try without state filter\r\n        try {\r\n          const districts = (new ee.FeatureCollection('FAO/GAUL/2015/level2') as any).filter(ee.Filter.eq('ADM2_NAME', cityInfo.name))\r\n            .filter(ee.Filter.eq('ADM0_NAME', cityInfo.country));\r\n          \r\n          const firstDistrict = districts.first();\r\n          const geometry = firstDistrict.geometry();\r\n          console.log(`Found ${placeName} in FAO GAUL dataset without state filter (${cityInfo.country})`);\r\n          return geometry;\r\n        } catch (e2) {\r\n          // Try Level 1 (state/province level)\r\n          try {\r\n            const states = (new ee.FeatureCollection('FAO/GAUL/2015/level1') as any).filter(ee.Filter.eq('ADM1_NAME', cityInfo.name))\r\n              .filter(ee.Filter.eq('ADM0_NAME', cityInfo.country));\r\n            \r\n            const firstState = states.first();\r\n            const geometry = firstState.geometry();\r\n            console.log(`Found ${placeName} at state level in FAO GAUL (${cityInfo.country})`);\r\n            return geometry;\r\n          } catch (e3) {\r\n            console.log(`Could not find ${placeName} in FAO GAUL, will try generic search`);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // Handle common geographic regions and landmarks\r\n    const geographicRegions: { [key: string]: () => any } = {\r\n      'alps': () => ee.Geometry.Polygon([[5.95, 45.82], [15.04, 45.82], [15.04, 47.81], [5.95, 47.81], [5.95, 45.82]]),\r\n      'europe': () => ee.Geometry.Polygon([[-10, 35], [40, 35], [40, 70], [-10, 70], [-10, 35]]),\r\n      'asia': () => ee.Geometry.Polygon([[25, -10], [180, -10], [180, 80], [25, 80], [25, -10]]),\r\n      'africa': () => ee.Geometry.Polygon([[-20, -35], [55, -35], [55, 37], [-20, 37], [-20, -35]]),\r\n      'north america': () => ee.Geometry.Polygon([[-170, 15], [-50, 15], [-50, 80], [-170, 80], [-170, 15]]),\r\n      'south america': () => ee.Geometry.Polygon([[-82, -56], [-34, -56], [-34, 13], [-82, 13], [-82, -56]]),\r\n      'australia': () => ee.Geometry.Polygon([[112, -44], [154, -44], [154, -10], [112, -10], [112, -44]]),\r\n      'amazon': () => ee.Geometry.Polygon([[-78, -20], [-43, -20], [-43, 5], [-78, 5], [-78, -20]]),\r\n      'amazon rainforest': () => ee.Geometry.Polygon([[-78, -20], [-43, -20], [-43, 5], [-78, 5], [-78, -20]]),\r\n      'sahara': () => ee.Geometry.Polygon([[-17, 15], [38, 15], [38, 35], [-17, 35], [-17, 15]]),\r\n      'sahara desert': () => ee.Geometry.Polygon([[-17, 15], [38, 15], [38, 35], [-17, 35], [-17, 15]]),\r\n      'great barrier reef': () => ee.Geometry.Polygon([[142, -24], [154, -24], [154, -10], [142, -10], [142, -24]]),\r\n      'himalayas': () => ee.Geometry.Polygon([[70, 25], [105, 25], [105, 40], [70, 40], [70, 25]]),\r\n      'rocky mountains': () => ee.Geometry.Polygon([[-120, 32], [-100, 32], [-100, 60], [-120, 60], [-120, 32]]),\r\n      'andes': () => ee.Geometry.Polygon([[-80, -55], [-62, -55], [-62, 10], [-80, 10], [-80, -55]]),\r\n      'mediterranean': () => ee.Geometry.Polygon([[-6, 30], [36, 30], [36, 46], [-6, 46], [-6, 30]]),\r\n      'caribbean': () => ee.Geometry.Polygon([[-87, 10], [-59, 10], [-59, 27], [-87, 27], [-87, 10]]),\r\n      'lake tahoe': () => ee.Geometry.Point([-120.0, 39.1]).buffer(30000),\r\n      'sacramento valley': () => ee.Geometry.Polygon([[-122.5, 38.5], [-121.0, 38.5], [-121.0, 40.5], [-122.5, 40.5], [-122.5, 38.5]]),\r\n      'kenya': () => {\r\n        // Use FAO GAUL for Kenya\r\n        const countries = (new ee.FeatureCollection('FAO/GAUL/2015/level0') as any)\r\n          .filter(ee.Filter.eq('ADM0_NAME', 'Kenya'));\r\n        return countries.first().geometry();\r\n      },\r\n      'brazil': () => {\r\n        // Use FAO GAUL for Brazil\r\n        const countries = (new ee.FeatureCollection('FAO/GAUL/2015/level0') as any)\r\n          .filter(ee.Filter.eq('ADM0_NAME', 'Brazil'));\r\n        return countries.first().geometry();\r\n      },\r\n      'algeria': () => {\r\n        // Use FAO GAUL for Algeria\r\n        const countries = (new ee.FeatureCollection('FAO/GAUL/2015/level0') as any)\r\n          .filter(ee.Filter.eq('ADM0_NAME', 'Algeria'));\r\n        return countries.first().geometry();\r\n      },\r\n      'queensland': () => {\r\n        // Australian state - use a bounding box\r\n        return ee.Geometry.Polygon([[138, -29], [154, -29], [154, -10], [138, -10], [138, -29]]);\r\n      }\r\n    };\r\n    \r\n    if (geographicRegions[normalized]) {\r\n      try {\r\n        const geometry = geographicRegions[normalized]();\r\n        console.log(`Found geographic region: ${placeName}`);\r\n        return geometry;\r\n      } catch (e) {\r\n        console.log(`Error getting geometry for region ${placeName}:`, e);\r\n      }\r\n    }\r\n    \r\n    // Try other common US cities using TIGER data\r\n    const usCityMappings: { [key: string]: { county: string, state: string } } = {\r\n      'miami': { county: 'Miami-Dade', state: '12' }, // FL\r\n      'chicago': { county: 'Cook', state: '17' }, // IL\r\n      'houston': { county: 'Harris', state: '48' }, // TX\r\n      'phoenix': { county: 'Maricopa', state: '04' }, // AZ\r\n      'philadelphia': { county: 'Philadelphia', state: '42' }, // PA\r\n      'san antonio': { county: 'Bexar', state: '48' }, // TX\r\n      'san diego': { county: 'San Diego', state: '06' }, // CA\r\n      'dallas': { county: 'Dallas', state: '48' }, // TX\r\n      'seattle': { county: 'King', state: '53' }, // WA\r\n      'boston': { county: 'Suffolk', state: '25' } // MA\r\n    };\r\n    \r\n    if (usCityMappings[normalized]) {\r\n      const mapping = usCityMappings[normalized];\r\n      try {\r\n        const county = (new ee.FeatureCollection('TIGER/2016/Counties') as any).filter(ee.Filter.eq('NAME', mapping.county))\r\n          .filter(ee.Filter.eq('STATEFP', mapping.state))\r\n          .first();\r\n        \r\n        const geometry = county.geometry();\r\n        console.log(`Using TIGER ${mapping.county} County boundary for ${placeName}`);\r\n        return geometry;\r\n      } catch (e) {\r\n        console.log(`Could not find ${placeName} in TIGER dataset`);\r\n      }\r\n    }\r\n    \r\n    // Try US states\r\n    const states = ['california', 'texas', 'florida', 'new york', 'illinois', 'pennsylvania', \r\n                   'ohio', 'georgia', 'north carolina', 'michigan'];\r\n    if (states.includes(normalized)) {\r\n      const state = (new ee.FeatureCollection('TIGER/2016/States') as any).filter(ee.Filter.eq('NAME', placeName))\r\n        .first();\r\n      console.log(`Using TIGER state boundary for ${placeName}`);\r\n      return state.geometry();\r\n    }\r\n    \r\n    // Try to search in TIGER counties by name (US only)\r\n    try {\r\n      const countySearch = (new ee.FeatureCollection('TIGER/2016/Counties') as any).filter(ee.Filter.eq('NAME', placeName));\r\n      \r\n      const firstCounty = countySearch.first();\r\n      // This will throw if no matches found\r\n      const testGeometry = firstCounty.geometry();\r\n      console.log(`Found county match for ${placeName} in TIGER dataset`);\r\n      return testGeometry;\r\n    } catch (e) {\r\n      // Not found in TIGER, continue to international datasets\r\n    }\r\n    \r\n    // Try FAO GAUL for international locations\r\n    // Level 2 - Districts/Cities\r\n    try {\r\n      const districts = (new ee.FeatureCollection('FAO/GAUL/2015/level2') as any).filter(ee.Filter.eq('ADM2_NAME', placeName));\r\n      \r\n      const firstDistrict = districts.first();\r\n      const geometry = firstDistrict.geometry();\r\n      console.log(`Found ${placeName} in FAO GAUL Level 2 (District)`);\r\n      return geometry;\r\n    } catch (e) {\r\n      // Continue to next level\r\n    }\r\n    \r\n    // Level 1 - States/Provinces\r\n    try {\r\n      const states = (new ee.FeatureCollection('FAO/GAUL/2015/level1') as any).filter(ee.Filter.eq('ADM1_NAME', placeName));\r\n      \r\n      const firstState = states.first();\r\n      const geometry = firstState.geometry();\r\n      console.log(`Found ${placeName} in FAO GAUL Level 1 (State/Province)`);\r\n      return geometry;\r\n    } catch (e) {\r\n      // Continue to next level\r\n    }\r\n    \r\n    // Level 0 - Countries\r\n    try {\r\n      const countries = (new ee.FeatureCollection('FAO/GAUL/2015/level0') as any).filter(ee.Filter.eq('ADM0_NAME', placeName));\r\n      \r\n      const firstCountry = countries.first();\r\n      const geometry = firstCountry.geometry();\r\n      console.log(`Found ${placeName} in FAO GAUL Level 0 (Country)`);\r\n      return geometry;\r\n    } catch (e) {\r\n      // Not found\r\n    }\r\n    \r\n    // Note: ee.Filter.stringContains doesn't exist, so we can't do fuzzy matching\r\n    \r\n    return null;\r\n  } catch (error) {\r\n    console.log(`Could not find boundary for ${placeName}:`, error);\r\n    return null;\r\n  }\r\n}\r\n\r\nexport async function parseAoi(aoi: any): Promise<any> {\r\n  if (!aoi) throw new Error('AOI required');\r\n  \r\n  // If aoi is a string, treat it as a place name, coordinates, or JSON geometry\r\n  if (typeof aoi === 'string') {\r\n    // First check if it's a JSON string (geometry)\r\n    try {\r\n      const parsed = JSON.parse(aoi);\r\n      if (parsed.type && (parsed.type === 'Polygon' || parsed.type === 'Point' || \r\n          parsed.type === 'Feature' || parsed.type === 'FeatureCollection')) {\r\n        console.log(`Parsed JSON geometry string: ${parsed.type}`);\r\n        // Recursively call parseAoi with the parsed object\r\n        return parseAoi(parsed);\r\n      }\r\n    } catch (e) {\r\n      // Not valid JSON, continue with other checks\r\n    }\r\n    \r\n    // Check if it looks like coordinates (e.g., \"-118.2437, 34.0522\")\r\n    const coordMatch = aoi.match(/^\\s*(-?\\d+\\.?\\d*),\\s*(-?\\d+\\.?\\d*)\\s*$/);\r\n    if (coordMatch) {\r\n      const lon = parseFloat(coordMatch[1]);\r\n      const lat = parseFloat(coordMatch[2]);\r\n      console.log(`Parsing coordinates: lon=${lon}, lat=${lat}`);\r\n      // Create a point with a small buffer\r\n      return ee.Geometry.Point([lon, lat]).buffer(10000); // 10km buffer\r\n    }\r\n    \r\n    console.log(`String AOI detected as place name: ${aoi}`);\r\n    \r\n    // Try global search first\r\n    try {\r\n      const globalBoundary = await findGlobalLocation(aoi);\r\n      if (globalBoundary) {\r\n        console.log(`Using exact administrative boundary for ${aoi} (global search)`);\r\n        return globalBoundary;\r\n      }\r\n    } catch (globalError) {\r\n      console.log(`Global search failed for ${aoi}, trying legacy method`);\r\n    }\r\n    \r\n    // Fallback to old method\r\n    const boundary = tryGetAdminBoundary(aoi);\r\n    if (boundary) {\r\n      console.log(`Using exact administrative boundary for ${aoi} (legacy method)`);\r\n      return boundary;\r\n    }\r\n    throw new Error(`Could not find boundary for place: ${aoi}`);\r\n  }\r\n  \r\n  // ALWAYS try to get administrative boundary first if there's any indication of a place\r\n  // Check coordinates to infer location\r\n  let inferredPlace = null;\r\n  if (aoi.type === 'Polygon' && aoi.coordinates) {\r\n    const coords = aoi.coordinates[0];\r\n    if (coords && coords.length > 0) {\r\n      const lons = coords.map((c: number[]) => c[0]);\r\n      const lats = coords.map((c: number[]) => c[1]);\r\n      const avgLon = lons.reduce((a: number, b: number) => a + b, 0) / lons.length;\r\n      const avgLat = lats.reduce((a: number, b: number) => a + b, 0) / lats.length;\r\n      \r\n      // San Francisco Bay Area\r\n      if (avgLon > -123 && avgLon < -122 && avgLat > 37 && avgLat < 38.2) {\r\n        inferredPlace = 'San Francisco';\r\n        console.log('Coordinates indicate San Francisco Bay Area - fetching county boundary');\r\n      }\r\n    }\r\n  }\r\n  \r\n  // Try to get boundary for explicit placeName or inferred place\r\n  const placeName = aoi.placeName || inferredPlace;\r\n  if (placeName) {\r\n    console.log(`Fetching administrative boundary for: ${placeName}`);\r\n    \r\n    // Try global search first\r\n    try {\r\n      const globalBoundary = await findGlobalLocation(placeName);\r\n      if (globalBoundary) {\r\n        console.log(`Using exact administrative boundary for ${placeName} (global search)`);\r\n        return globalBoundary;\r\n      }\r\n    } catch (globalError) {\r\n      console.log(`Global search failed for ${placeName}, trying legacy method`);\r\n    }\r\n    \r\n    // Fallback to old method\r\n    const boundary = tryGetAdminBoundary(placeName);\r\n    if (boundary) {\r\n      console.log(`Using exact administrative boundary for ${placeName} (legacy method)`);\r\n      return boundary;\r\n    }\r\n  }\r\n  \r\n  // Only use polygon if no boundary could be found\r\n  if (aoi.type === 'FeatureCollection') return (new ee.FeatureCollection(aoi as FeatureCollection) as any).geometry();\r\n  if (aoi.type === 'Feature') return new ee.Feature(new ee.Geometry(aoi.geometry)).geometry();\r\n  if (aoi.type) return new ee.Geometry(aoi as Geometry);\r\n  throw new Error('Unsupported AOI format');\r\n}\r\nexport function clampScale(scale: number, min=10, max=10000) {\r\n  return Math.max(min, Math.min(max, scale));\r\n}\r\n","/**\r\n * Advanced Earth Engine Optimizer\r\n * Implements sophisticated techniques to prevent timeouts and optimize performance\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport crypto from 'crypto';\r\n\r\n// Custom LRU Cache implementation\r\nclass SimpleCache<K, V> {\r\n  private cache: Map<K, { value: V; timestamp: number }> = new Map();\r\n  private maxSize: number;\r\n  private ttl: number;\r\n\r\n  constructor(maxSize: number = 500, ttl: number = 1000 * 60 * 30) {\r\n    this.maxSize = maxSize;\r\n    this.ttl = ttl;\r\n  }\r\n\r\n  get(key: K): V | undefined {\r\n    const item = this.cache.get(key);\r\n    if (!item) return undefined;\r\n    \r\n    // Check if expired\r\n    if (Date.now() - item.timestamp > this.ttl) {\r\n      this.cache.delete(key);\r\n      return undefined;\r\n    }\r\n    \r\n    // Move to end (most recently used)\r\n    this.cache.delete(key);\r\n    this.cache.set(key, item);\r\n    return item.value;\r\n  }\r\n\r\n  set(key: K, value: V): void {\r\n    // Remove oldest if at capacity\r\n    if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\r\n      const firstKey = this.cache.keys().next().value;\r\n      if (firstKey !== undefined) {\r\n        this.cache.delete(firstKey);\r\n      }\r\n    }\r\n    \r\n    this.cache.set(key, { value, timestamp: Date.now() });\r\n  }\r\n\r\n  clear(): void {\r\n    this.cache.clear();\r\n  }\r\n}\r\n\r\n// Advanced caching system with TTL and size limits\r\nconst cache = new SimpleCache<string, any>(500, 1000 * 60 * 30);\r\n\r\n// Request queue to prevent overloading\r\nclass RequestQueue {\r\n  private queue: Array<() => Promise<any>> = [];\r\n  private processing = false;\r\n  private concurrency = 3; // Max concurrent requests\r\n  private activeRequests = 0;\r\n\r\n  async add<T>(fn: () => Promise<T>): Promise<T> {\r\n    return new Promise((resolve, reject) => {\r\n      this.queue.push(async () => {\r\n        try {\r\n          this.activeRequests++;\r\n          const result = await fn();\r\n          resolve(result);\r\n        } catch (error) {\r\n          reject(error);\r\n        } finally {\r\n          this.activeRequests--;\r\n        }\r\n      });\r\n      this.process();\r\n    });\r\n  }\r\n\r\n  private async process() {\r\n    if (this.processing) return;\r\n    this.processing = true;\r\n\r\n    while (this.queue.length > 0 && this.activeRequests < this.concurrency) {\r\n      const task = this.queue.shift();\r\n      if (task) {\r\n        task().catch(console.error);\r\n      }\r\n    }\r\n\r\n    this.processing = false;\r\n    \r\n    // Continue processing if there are more items\r\n    if (this.queue.length > 0) {\r\n      setTimeout(() => this.process(), 100);\r\n    }\r\n  }\r\n}\r\n\r\nconst requestQueue = new RequestQueue();\r\n\r\n/**\r\n * Generate cache key from parameters\r\n */\r\nfunction getCacheKey(operation: string, params: any): string {\r\n  const hash = crypto.createHash('md5');\r\n  hash.update(operation);\r\n  hash.update(JSON.stringify(params));\r\n  return hash.digest('hex');\r\n}\r\n\r\n/**\r\n * Optimized getInfo with chunking and caching\r\n */\r\nexport async function optimizedGetInfo(eeObject: any, options: any = {}): Promise<any> {\r\n  const cacheKey = getCacheKey('getInfo', { obj: eeObject.serialize(), options });\r\n  \r\n  // Check cache first\r\n  const cached = cache.get(cacheKey);\r\n  if (cached) {\r\n    return cached;\r\n  }\r\n\r\n  // Use request queue to prevent overloading\r\n  const result = await requestQueue.add(async () => {\r\n    // Set a timeout promise (increased for tile operations)\r\n    const timeoutPromise = new Promise((_, reject) => \r\n      setTimeout(() => reject(new Error('Operation timed out')), options.timeout || 45000)\r\n    );\r\n\r\n    // Execute the actual operation\r\n    const operationPromise = eeObject.getInfo();\r\n\r\n    try {\r\n      const data = await Promise.race([operationPromise, timeoutPromise]);\r\n      cache.set(cacheKey, data);\r\n      return data;\r\n    } catch (error: any) {\r\n      // If timeout, return partial data\r\n      if (error?.message === 'Operation timed out') {\r\n        const partial = { \r\n          status: 'partial', \r\n          message: 'Data too large - returning summary',\r\n          type: eeObject.name() || 'Unknown'\r\n        };\r\n        cache.set(cacheKey, partial);\r\n        return partial;\r\n      }\r\n      throw error;\r\n    }\r\n  });\r\n\r\n  return result;\r\n}\r\n\r\n/**\r\n * Stream large collections in chunks\r\n */\r\nexport async function* streamCollection(\r\n  collection: any,\r\n  chunkSize: number = 100\r\n): AsyncGenerator<any[]> {\r\n  const totalSize = await collection.size().getInfo();\r\n  let offset = 0;\r\n\r\n  while (offset < totalSize) {\r\n    const chunk = await collection\r\n      .limit(chunkSize, 'system:time_start')\r\n      .skip(offset)\r\n      .getInfo();\r\n    \r\n    yield chunk.features || [];\r\n    offset += chunkSize;\r\n\r\n    // Small delay to prevent overloading\r\n    await new Promise(resolve => setTimeout(resolve, 100));\r\n  }\r\n}\r\n\r\n/**\r\n * Optimized collection info with sampling\r\n */\r\nexport async function getCollectionInfoOptimized(datasetId: string): Promise<any> {\r\n  const cacheKey = getCacheKey('collectionInfo', { datasetId });\r\n  \r\n  const cached = cache.get(cacheKey);\r\n  if (cached) {\r\n    return cached;\r\n  }\r\n\r\n  try {\r\n    const collection = new ee.ImageCollection(datasetId);\r\n    \r\n    // Use sampling for large collections\r\n    const size = await requestQueue.add(() => collection.size().getInfo()) as number;\r\n    \r\n    // Sample strategy based on collection size\r\n    let sampleSize = 1;\r\n    let sampling = 'first';\r\n    \r\n    if (size > 10000) {\r\n      sampleSize = 5; // Very large: sample 5 images\r\n      sampling = 'random';\r\n    } else if (size > 1000) {\r\n      sampleSize = 10; // Large: sample 10 images\r\n      sampling = 'distributed';\r\n    } else if (size > 100) {\r\n      sampleSize = 20; // Medium: sample 20 images\r\n      sampling = 'distributed';\r\n    } else {\r\n      sampleSize = Math.min(size, 50); // Small: up to 50 images\r\n    }\r\n\r\n    // Get sample for metadata\r\n    let sample;\r\n    if (sampling === 'random') {\r\n      sample = (collection as any).randomColumn('random').sort('random').limit(sampleSize);\r\n    } else if (sampling === 'distributed') {\r\n      // Get evenly distributed samples\r\n      const step = Math.floor(size / sampleSize);\r\n      const indices = Array.from({ length: sampleSize }, (_, i) => i * step);\r\n      sample = new ee.ImageCollection(\r\n        indices.map(i => (collection as any).toList(1, i).get(0))\r\n      );\r\n    } else {\r\n      sample = (collection as any).limit(sampleSize);\r\n    }\r\n\r\n    // Get metadata from sample\r\n    const first = sample.first();\r\n    const bandNames = await requestQueue.add(() => first.bandNames().getInfo());\r\n    const projection = await requestQueue.add(() => first.projection().getInfo());\r\n\r\n    // Get date range efficiently\r\n    let dateRange = { start: null as string | null, end: null as string | null };\r\n    \r\n    if (size > 0) {\r\n      // For very large collections, use metadata instead of computing\r\n      if (size > 10000) {\r\n        // Use a heuristic based on dataset ID\r\n        if (datasetId.includes('COPERNICUS/S2')) {\r\n          dateRange.start = '2015-06-23T00:00:00.000Z'; // Sentinel-2 launch\r\n          dateRange.end = new Date().toISOString();\r\n        } else if (datasetId.includes('LANDSAT')) {\r\n          dateRange.start = '2013-04-11T00:00:00.000Z'; // Landsat 8 launch\r\n          dateRange.end = new Date().toISOString();\r\n        } else {\r\n          // Generic range\r\n          dateRange.start = '2000-01-01T00:00:00.000Z';\r\n          dateRange.end = new Date().toISOString();\r\n        }\r\n      } else {\r\n        // For smaller collections, compute actual range\r\n        try {\r\n          const dates = await requestQueue.add(() => \r\n            sample.aggregate_array('system:time_start').getInfo()\r\n          );\r\n          \r\n          if (dates && (dates as any).length > 0) {\r\n            const validDates = (dates as any[]).filter((d: any) => d != null);\r\n            if (validDates.length > 0) {\r\n              dateRange.start = new Date(Math.min(...validDates)).toISOString();\r\n              dateRange.end = new Date(Math.max(...validDates)).toISOString();\r\n            }\r\n          }\r\n        } catch (e) {\r\n          // If date computation fails, use estimates\r\n          const firstDate = await requestQueue.add(() => \r\n            first.get('system:time_start').getInfo()\r\n          ).catch(() => null);\r\n          \r\n          if (firstDate) {\r\n            dateRange.start = new Date(firstDate as any).toISOString();\r\n            dateRange.end = new Date().toISOString();\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    const result = {\r\n      datasetId,\r\n      type: 'ImageCollection',\r\n      bandNames,\r\n      projection: (projection as any).crs,\r\n      imageCount: size,\r\n      dateRange,\r\n      sampleSize: sampleSize,\r\n      samplingMethod: sampling,\r\n      message: `Collection has ${(bandNames as any[]).length} bands and ${size} images (sampled ${sampleSize})`\r\n    };\r\n\r\n    cache.set(cacheKey, result);\r\n    return result;\r\n\r\n  } catch (error: any) {\r\n    // Even if there's an error, return something useful\r\n    const fallbackResult = {\r\n      datasetId,\r\n      type: 'ImageCollection',\r\n      error: error.message,\r\n      message: 'Could not fully load collection info - returning partial data',\r\n      imageCount: 'Unknown',\r\n      suggestion: 'Try with a more specific date range or region filter'\r\n    };\r\n    \r\n    cache.set(cacheKey, fallbackResult);\r\n    return fallbackResult;\r\n  }\r\n}\r\n\r\n/**\r\n * Lazy evaluation wrapper\r\n */\r\nexport class LazyEEObject {\r\n  private eeObject: any;\r\n  private evaluated: any = null;\r\n  private evaluating: Promise<any> | null = null;\r\n\r\n  constructor(eeObject: any) {\r\n    this.eeObject = eeObject;\r\n  }\r\n\r\n  async evaluate(): Promise<any> {\r\n    if (this.evaluated) {\r\n      return this.evaluated;\r\n    }\r\n\r\n    if (this.evaluating) {\r\n      return this.evaluating;\r\n    }\r\n\r\n    this.evaluating = optimizedGetInfo(this.eeObject);\r\n    this.evaluated = await this.evaluating;\r\n    this.evaluating = null;\r\n\r\n    return this.evaluated;\r\n  }\r\n\r\n  getEEObject() {\r\n    return this.eeObject;\r\n  }\r\n}\r\n\r\n/**\r\n * Progressive loading for complex operations\r\n */\r\nexport async function progressiveLoad<T>(\r\n  operation: () => Promise<T>,\r\n  fallbacks: Array<() => Promise<T>>\r\n): Promise<T> {\r\n  try {\r\n    // Try main operation with short timeout\r\n    const result = await Promise.race([\r\n      operation(),\r\n      new Promise<T>((_, reject) => \r\n        setTimeout(() => reject(new Error('Timeout')), 5000)\r\n      )\r\n    ]);\r\n    return result;\r\n  } catch (error) {\r\n    // Try fallbacks\r\n    for (const fallback of fallbacks) {\r\n      try {\r\n        const result = await Promise.race([\r\n          fallback(),\r\n          new Promise<T>((_, reject) => \r\n            setTimeout(() => reject(new Error('Timeout')), 10000)\r\n          )\r\n        ]);\r\n        return result;\r\n      } catch (e) {\r\n        continue;\r\n      }\r\n    }\r\n    \r\n    // If all fail, throw original error\r\n    throw error;\r\n  }\r\n}\r\n\r\n/**\r\n * Batch operations for efficiency\r\n */\r\nexport class BatchProcessor {\r\n  private batch: Array<{ id: string; operation: () => Promise<any> }> = [];\r\n  private results: Map<string, any> = new Map();\r\n  private processing = false;\r\n\r\n  add(id: string, operation: () => Promise<any>) {\r\n    this.batch.push({ id, operation });\r\n  }\r\n\r\n  async process(): Promise<Map<string, any>> {\r\n    if (this.processing) {\r\n      throw new Error('Batch already processing');\r\n    }\r\n\r\n    this.processing = true;\r\n    this.results.clear();\r\n\r\n    // Process in parallel with concurrency limit\r\n    const concurrency = 5;\r\n    for (let i = 0; i < this.batch.length; i += concurrency) {\r\n      const chunk = this.batch.slice(i, i + concurrency);\r\n      const results = await Promise.allSettled(\r\n        chunk.map(item => item.operation())\r\n      );\r\n\r\n      chunk.forEach((item, index) => {\r\n        const result = results[index];\r\n        if (result.status === 'fulfilled') {\r\n          this.results.set(item.id, result.value);\r\n        } else {\r\n          this.results.set(item.id, { error: result.reason.message });\r\n        }\r\n      });\r\n    }\r\n\r\n    this.processing = false;\r\n    this.batch = [];\r\n    return this.results;\r\n  }\r\n}\r\n\r\n// Export singleton instances\r\nexport const batchProcessor = new BatchProcessor();\r\nexport const optimizer = {\r\n  cache,\r\n  requestQueue,\r\n  optimizedGetInfo,\r\n  streamCollection,\r\n  getCollectionInfoOptimized,\r\n  LazyEEObject,\r\n  progressiveLoad,\r\n  batchProcessor\r\n};\r\n","/**\r\n * EARTH ENGINE DATA - Consolidated Data Access Tool\r\n * Combines: search, filter, geometry, and info operations\r\n * Critical for MCP stability - reduces tool count\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport { z } from 'zod';\r\nimport { register } from '../../registry';\r\nimport { parseAoi } from '@/src/utils/geo';\r\nimport { findGlobalLocation } from '@/src/utils/global-search';\r\nimport { getCollectionInfoOptimized, optimizer } from '@/src/utils/ee-optimizer';\r\n\r\n// Main schema for the consolidated tool\r\nconst DataToolSchema = z.object({\r\n  operation: z.enum(['search', 'filter', 'geometry', 'info', 'boundaries']),\r\n  \r\n  // Search operation params\r\n  query: z.string().optional(),\r\n  limit: z.number().optional(),\r\n  \r\n  // Filter operation params\r\n  datasetId: z.string().optional(),\r\n  startDate: z.string().optional(),\r\n  endDate: z.string().optional(),\r\n  region: z.any().optional(),\r\n  \r\n  // Geometry operation params\r\n  placeName: z.string().optional(),\r\n  \r\n  // Info operation params\r\n  imageId: z.string().optional(),\r\n  \r\n  // Common params\r\n  includeDetails: z.boolean().optional()\r\n});\r\n\r\n/**\r\n * Search operation - find datasets in GEE catalog\r\n */\r\nasync function searchCatalog(query: string, limit: number = 10) {\r\n  const datasets = [\r\n    'COPERNICUS/S2_SR_HARMONIZED',\r\n    'COPERNICUS/S2_SR',\r\n    'COPERNICUS/S2',\r\n    'LANDSAT/LC09/C02/T1_L2',\r\n    'LANDSAT/LC08/C02/T1_L2',\r\n    'MODIS/006/MOD13Q1',\r\n    'MODIS/006/MCD43A4',\r\n    'NASA/GDDP-CMIP6',\r\n    'ECMWF/ERA5/DAILY',\r\n    'ECMWF/ERA5_LAND/HOURLY',\r\n    'NASA/GPM_L3/IMERG_V06',\r\n    'JAXA/GPM_L3/GSMaP/v6/operational',\r\n    'NASA/SRTM_V3',\r\n    'USGS/SRTMGL1_003',\r\n    'COPERNICUS/DEM/GLO30',\r\n    'ESA/WorldCover/v100',\r\n    'ESA/WorldCover/v200',\r\n    'MODIS/006/MCD12Q1',\r\n    'COPERNICUS/CORINE/V20/100m',\r\n    'GOOGLE/DYNAMICWORLD/V1',\r\n    'NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG',\r\n    'FAO/GAUL/2015/level0',\r\n    'FAO/GAUL/2015/level1',\r\n    'FAO/GAUL/2015/level2',\r\n    'TIGER/2016/Counties',\r\n    'MODIS/006/MOD11A1',\r\n    'MODIS/006/MYD11A1'\r\n  ];\r\n\r\n  const lowerQuery = query.toLowerCase();\r\n  const normalizedQuery = lowerQuery.replace(/[-_\\s]/g, '');\r\n  \r\n  const filtered = datasets.filter(d => {\r\n    const dLower = d.toLowerCase();\r\n    const dNormalized = dLower.replace(/[-_\\s]/g, '');\r\n    \r\n    // Check multiple matching strategies\r\n    return dLower.includes(lowerQuery) || \r\n           dNormalized.includes(normalizedQuery) ||\r\n           (lowerQuery.includes('sentinel') && dLower.includes('s2')) ||\r\n           (lowerQuery.includes('landsat') && dLower.includes('lc'));\r\n  }).slice(0, limit);\r\n\r\n  return {\r\n    success: true,\r\n    datasets: filtered,\r\n    count: filtered.length,\r\n    query: query,\r\n    message: `Found ${filtered.length} datasets matching \"${query}\"`\r\n  };\r\n}\r\n\r\n/**\r\n * Filter operation - filter image collections\r\n */\r\nasync function filterCollection(params: any) {\r\n  const { datasetId, startDate, endDate, region, cloudCoverMax } = params;\r\n  \r\n  if (!datasetId) throw new Error('datasetId required for filter operation');\r\n  \r\n  // Generate cache key\r\n  const cacheKey = `filter_${datasetId}_${startDate}_${endDate}_${cloudCoverMax}`;\r\n  const cached = optimizer.cache.get(cacheKey);\r\n  if (cached) {\r\n    return { ...cached, fromCache: true };\r\n  }\r\n  \r\n  try {\r\n    let collection = new ee.ImageCollection(datasetId);\r\n    \r\n    if (startDate && endDate) {\r\n      collection = collection.filterDate(startDate, endDate);\r\n    }\r\n    \r\n    if (region) {\r\n      const geometry = await parseAoi(region);\r\n      collection = collection.filterBounds(geometry);\r\n    }\r\n    \r\n    // Apply cloud cover filter if specified\r\n    if (cloudCoverMax !== undefined && cloudCoverMax !== null) {\r\n      // Different datasets use different cloud property names\r\n      if (datasetId.includes('COPERNICUS/S2')) {\r\n        collection = collection.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', cloudCoverMax));\r\n      } else if (datasetId.includes('LANDSAT')) {\r\n        collection = collection.filter(ee.Filter.lt('CLOUD_COVER', cloudCoverMax));\r\n      } else {\r\n        // Generic cloud cover filter\r\n        collection = collection.filter(ee.Filter.lt('CLOUD_COVER', cloudCoverMax));\r\n      }\r\n    }\r\n    \r\n    // Use optimized getInfo with timeout\r\n    const count = await optimizer.optimizedGetInfo(collection.size(), { timeout: 10000 });\r\n    \r\n    // Get band names from first image with timeout\r\n    let bandNames = [];\r\n    try {\r\n      const first = collection.first();\r\n      bandNames = await optimizer.optimizedGetInfo(first.bandNames(), { timeout: 5000 });\r\n    } catch (e) {\r\n      // Use default band names based on dataset\r\n      if (datasetId.includes('COPERNICUS/S2')) {\r\n        bandNames = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B9', 'B10', 'B11', 'B12', 'QA60'];\r\n      } else if (datasetId.includes('LANDSAT')) {\r\n        bandNames = ['SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7', 'QA_PIXEL'];\r\n      } else {\r\n        bandNames = ['band1', 'band2', 'band3'];\r\n      }\r\n    }\r\n    \r\n    const result = {\r\n      success: true,\r\n      datasetId,\r\n      imageCount: count || 0,\r\n      bandNames,\r\n      filters: {\r\n        startDate: startDate || 'not specified',\r\n        endDate: endDate || 'not specified',\r\n        region: region || 'global',\r\n        cloudCoverMax: cloudCoverMax || 'not specified'\r\n      },\r\n      message: `Filtered collection contains ${count || 'unknown'} images`\r\n    };\r\n    \r\n    optimizer.cache.set(cacheKey, result);\r\n    return result;\r\n    \r\n  } catch (error: any) {\r\n    // Return partial result on error\r\n    const partial = {\r\n      success: true,\r\n      datasetId,\r\n      imageCount: 'Unknown (timeout)',\r\n      bandNames: [],\r\n      filters: {\r\n        startDate: startDate || 'not specified',\r\n        endDate: endDate || 'not specified',\r\n        region: region || 'global',\r\n        cloudCoverMax: cloudCoverMax || 'not specified'\r\n      },\r\n      message: 'Filter applied but count timed out - collection may be very large',\r\n      warning: error.message\r\n    };\r\n    \r\n    optimizer.cache.set(cacheKey, partial);\r\n    return partial;\r\n  }\r\n}\r\n\r\n/**\r\n * Geometry operation - get boundaries from place names or coordinates\r\n */\r\nasync function getGeometry(params: any) {\r\n  const { placeName, coordinates } = params;\r\n  \r\n  // Handle coordinate-based geometry\r\n  if (coordinates && Array.isArray(coordinates) && coordinates.length >= 2) {\r\n    const [lon, lat] = coordinates;\r\n    const buffer = coordinates[2] || 10000; // Default 10km buffer\r\n    const point = ee.Geometry.Point([lon, lat]);\r\n    const geometry = point.buffer(buffer);\r\n    \r\n    return {\r\n      success: true,\r\n      type: 'coordinates',\r\n      geometry,\r\n      geoJson: {\r\n        type: 'Point',\r\n        coordinates: [lon, lat]\r\n      },\r\n      buffer_meters: buffer,\r\n      message: `Created geometry from coordinates [${lon}, ${lat}]`,\r\n      usage: 'Use this geometry in filter operations'\r\n    };\r\n  }\r\n  \r\n  if (!placeName) throw new Error('placeName or coordinates required for geometry operation');\r\n  \r\n  // Common place coordinates fallback\r\n  const knownPlaces: { [key: string]: [number, number, number] } = {\r\n    'ludhiana': [75.8573, 30.9010, 15000],\r\n    'ludhiana, india': [75.8573, 30.9010, 15000],\r\n    'ludhiana, punjab': [75.8573, 30.9010, 15000],\r\n    'san francisco': [-122.4194, 37.7749, 20000],\r\n    'san francisco, ca': [-122.4194, 37.7749, 20000],\r\n    'new york': [-74.0060, 40.7128, 30000],\r\n    'london': [-0.1276, 51.5074, 25000],\r\n    'paris': [2.3522, 48.8566, 20000],\r\n    'tokyo': [139.6503, 35.6762, 35000],\r\n    'delhi': [77.1025, 28.7041, 30000],\r\n    'mumbai': [72.8777, 19.0760, 25000],\r\n    'bangalore': [77.5946, 12.9716, 25000],\r\n    'amazon rainforest': [-60.0, -3.0, 2000000],\r\n    'amazon': [-60.0, -3.0, 2000000],\r\n    'sacramento valley': [-121.5, 39.0, 100000]\r\n  };\r\n  \r\n  // Check if we have known coordinates - normalize to lowercase for comparison\r\n  const placeKey = placeName.toLowerCase().trim();\r\n  if (knownPlaces[placeKey]) {\r\n    const [lon, lat, buffer] = knownPlaces[placeKey];\r\n    const point = ee.Geometry.Point([lon, lat]);\r\n    const geometry = point.buffer(buffer);\r\n    \r\n    return {\r\n      success: true,\r\n      placeName,\r\n      geometry,\r\n      geoJson: {\r\n        type: 'Point',\r\n        coordinates: [lon, lat]\r\n      },\r\n      buffer_meters: buffer,\r\n      source: 'Known coordinates',\r\n      message: `Using coordinates for ${placeName}`,\r\n      usage: 'Use this geometry in filter operations'\r\n    };\r\n  }\r\n  \r\n  try {\r\n    // Try global search with timeout handling\r\n    const globalResult = await findGlobalLocation(placeName);\r\n    if (globalResult) {\r\n      // Don't evaluate full geometry - just get basic info\r\n      const bounds = await globalResult.bounds().getInfo();\r\n      \r\n      return {\r\n        success: true,\r\n        placeName,\r\n        geometry: globalResult,\r\n        bounds: bounds,\r\n        source: 'FAO GAUL/TIGER shapefile',\r\n        message: `Found geometry for ${placeName}`,\r\n        usage: 'Use this geometry in filter operations'\r\n      };\r\n    }\r\n  } catch (error) {\r\n    console.log('Global search failed:', error);\r\n  }\r\n  \r\n  // Fallback to coordinates or throw error\r\n  throw new Error(`Could not find geometry for \"${placeName}\"`);\r\n}\r\n\r\n/**\r\n * Info operation - get dataset/image information\r\n */\r\nasync function getInfo(datasetId: string) {\r\n  if (!datasetId) throw new Error('datasetId required for info operation');\r\n  \r\n  // Check cache first\r\n  const cacheKey = `info_${datasetId}`;\r\n  const cached = optimizer.cache.get(cacheKey);\r\n  if (cached) {\r\n    return { ...cached, fromCache: true };\r\n  }\r\n  \r\n  // Define known datasets with basic info (no EE evaluation needed)\r\n  const knownDatasets: Record<string, any> = {\r\n    'COPERNICUS/S2_SR_HARMONIZED': {\r\n      title: 'Sentinel-2 MSI: MultiSpectral Instrument, Level-2A',\r\n      type: 'ImageCollection',\r\n      description: 'Harmonized Sentinel-2 Level-2A orthorectified surface reflectance',\r\n      bands: ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B9', 'B10', 'B11', 'B12', 'QA60', 'SCL'],\r\n      spatialResolution: '10-60m',\r\n      temporalResolution: '5 days',\r\n      provider: 'European Space Agency'\r\n    },\r\n    'LANDSAT/LC08/C02/T1_L2': {\r\n      title: 'USGS Landsat 8 Collection 2 Tier 1 Level 2',\r\n      type: 'ImageCollection',\r\n      description: 'Landsat 8 surface reflectance and surface temperature',\r\n      bands: ['SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7', 'ST_B10', 'QA_PIXEL'],\r\n      spatialResolution: '30m',\r\n      temporalResolution: '16 days',\r\n      provider: 'USGS'\r\n    },\r\n    'MODIS/006/MOD13Q1': {\r\n      title: 'MOD13Q1.006 Terra Vegetation Indices 16-Day Global 250m',\r\n      type: 'ImageCollection',\r\n      description: 'MODIS Terra Vegetation Indices (NDVI/EVI) 16-day composite',\r\n      bands: ['NDVI', 'EVI', 'DetailedQA', 'sur_refl_b01', 'sur_refl_b02', 'sur_refl_b03', 'sur_refl_b07'],\r\n      spatialResolution: '250m',\r\n      temporalResolution: '16 days',\r\n      provider: 'NASA LP DAAC'\r\n    },\r\n    'NASA/GPM_L3/IMERG_V06': {\r\n      title: 'GPM: Global Precipitation Measurement v6',\r\n      type: 'ImageCollection',\r\n      description: 'Half-hourly precipitation estimates from GPM constellation',\r\n      bands: ['precipitationCal', 'precipitationUncal', 'randomError', 'HQprecipitation'],\r\n      spatialResolution: '11132m',\r\n      temporalResolution: '30 minutes',\r\n      provider: 'NASA GES DISC'\r\n    }\r\n  };\r\n  \r\n  // Check if it's a known dataset\r\n  if (knownDatasets[datasetId]) {\r\n    const info = {\r\n      success: true,\r\n      datasetId,\r\n      ...knownDatasets[datasetId],\r\n      message: `Dataset information retrieved successfully`\r\n    };\r\n    optimizer.cache.set(cacheKey, info);\r\n    return info;\r\n  }\r\n  \r\n  // For unknown datasets, try basic evaluation with timeout\r\n  try {\r\n    const result = await Promise.race([\r\n      (async () => {\r\n        try {\r\n          // Try as collection first (most common)\r\n          const collection = new ee.ImageCollection(datasetId);\r\n          const first = collection.first();\r\n          const bandNamesPromise = first.bandNames().getInfo();\r\n          const bandNames = await Promise.race([\r\n            bandNamesPromise,\r\n            new Promise((resolve) => setTimeout(() => resolve(['Unable to load bands']), 2000))\r\n          ]);\r\n          \r\n          return {\r\n            success: true,\r\n            datasetId,\r\n            type: 'ImageCollection',\r\n            bands: bandNames,\r\n            message: `Collection found with ${Array.isArray(bandNames) ? bandNames.length : 'unknown'} bands`,\r\n            status: 'Available'\r\n          };\r\n        } catch {\r\n          // Try as single image\r\n          const image = new ee.Image(datasetId);\r\n          const bandNamesPromise = image.bandNames().getInfo();\r\n          const bandNames = await Promise.race([\r\n            bandNamesPromise,\r\n            new Promise((resolve) => setTimeout(() => resolve(['Unable to load bands']), 2000))\r\n          ]);\r\n          \r\n          return {\r\n            success: true,\r\n            datasetId,\r\n            type: 'Image',\r\n            bands: bandNames,\r\n            message: `Image found with ${Array.isArray(bandNames) ? bandNames.length : 'unknown'} bands`,\r\n            status: 'Available'\r\n          };\r\n        }\r\n      })(),\r\n      new Promise((resolve) => \r\n        setTimeout(() => resolve({\r\n          success: true,\r\n          datasetId,\r\n          type: 'Dataset',\r\n          status: 'Available',\r\n          message: `Dataset ${datasetId} is available`,\r\n          note: 'Detailed information not available due to timeout. Try using filter operation for more details.'\r\n        }), 5000)\r\n      )\r\n    ]);\r\n    \r\n    optimizer.cache.set(cacheKey, result);\r\n    return result;\r\n    \r\n  } catch (error: any) {\r\n    // Return basic info even on error\r\n    const basicInfo = {\r\n      success: true,\r\n      datasetId,\r\n      type: 'Dataset',\r\n      status: 'Unknown',\r\n      message: `Unable to retrieve detailed information for ${datasetId}`,\r\n      suggestion: 'Dataset may be valid. Try using it in filter or process operations.',\r\n      error: error.message\r\n    };\r\n    \r\n    optimizer.cache.set(cacheKey, basicInfo);\r\n    return basicInfo;\r\n  }\r\n}\r\n\r\n/**\r\n * Boundaries operation - get available administrative boundaries\r\n */\r\nasync function getBoundaries() {\r\n  return {\r\n    available: [\r\n      {\r\n        dataset: 'FAO/GAUL/2015/level0',\r\n        level: 'Country',\r\n        examples: ['India', 'United States', 'France', 'Brazil']\r\n      },\r\n      {\r\n        dataset: 'FAO/GAUL/2015/level1',\r\n        level: 'State/Province',\r\n        examples: ['California', 'Punjab', 'Ontario', 'Bavaria']\r\n      },\r\n      {\r\n        dataset: 'FAO/GAUL/2015/level2',\r\n        level: 'District/County',\r\n        examples: ['Ludhiana', 'San Francisco County', 'Manhattan']\r\n      },\r\n      {\r\n        dataset: 'TIGER/2016/Counties',\r\n        level: 'US Counties',\r\n        examples: ['Los Angeles', 'Cook', 'Harris', 'Miami-Dade']\r\n      }\r\n    ],\r\n    usage: 'Use geometry operation with place names to get boundaries',\r\n    message: 'Administrative boundaries available at country, state, and district levels'\r\n  };\r\n}\r\n\r\n/**\r\n * Helper to get or create EE object from input\r\n */\r\nexport async function getInput(input: any): Promise<any> {\r\n  if (!input) throw new Error('No input provided');\r\n  \r\n  // If input is a string, try to parse it\r\n  if (typeof input === 'string') {\r\n    // Try as dataset ID (collection)\r\n    try {\r\n      return new ee.ImageCollection(input);\r\n    } catch {\r\n      // Try as image ID\r\n      try {\r\n        return new ee.Image(input);\r\n      } catch {\r\n        throw new Error(`Could not parse input: ${input}`);\r\n      }\r\n    }\r\n  }\r\n  \r\n  // If it's already an EE object, return it\r\n  if (input instanceof ee.Image || input instanceof ee.ImageCollection) {\r\n    return input;\r\n  }\r\n  \r\n  // Try to create from object\r\n  if (input.type === 'Image') {\r\n    return new ee.Image(input);\r\n  }\r\n  if (input.type === 'ImageCollection') {\r\n    return new ee.ImageCollection(input);\r\n  }\r\n  \r\n  throw new Error('Invalid input type');\r\n}\r\n\r\n/**\r\n * Helper to get or create image from input\r\n */\r\nexport async function getImage(input: any, region?: any): Promise<any> {\r\n  let image;\r\n  \r\n  if (typeof input === 'string') {\r\n    // Try as collection first\r\n    try {\r\n      const collection = new ee.ImageCollection(input);\r\n      image = collection.median();\r\n    } catch {\r\n      // Try as single image\r\n      image = new ee.Image(input);\r\n    }\r\n  } else if (input instanceof ee.ImageCollection) {\r\n    image = input.median();\r\n  } else if (input instanceof ee.Image) {\r\n    image = input;\r\n  } else {\r\n    throw new Error('Invalid image input');\r\n  }\r\n  \r\n  // Clip to region if provided\r\n  if (region) {\r\n    const geometry = await parseAoi(region);\r\n    image = image.clip(geometry);\r\n  }\r\n  \r\n  return image;\r\n}\r\n\r\n// Register the consolidated tool\r\nregister({\r\n  name: 'earth_engine_data',\r\n  description: `Consolidated Earth Engine data access tool. Operations: search (find datasets), filter (filter collections), geometry (get boundaries), info (dataset details), boundaries (list available)`,\r\n  input: DataToolSchema,\r\n  output: z.any(),\r\n  handler: async (params) => {\r\n    try {\r\n      const { operation } = params;\r\n      \r\n      if (!operation) {\r\n        return {\r\n          success: false,\r\n          error: 'Operation parameter is required',\r\n          availableOperations: ['search', 'filter', 'geometry', 'info', 'boundaries']\r\n        };\r\n      }\r\n      \r\n      // Handle both snake_case and camelCase parameters\r\n      const normalizedParams = {\r\n        ...params,\r\n        datasetId: params.datasetId || params.dataset_id || params.collection_id,\r\n        startDate: params.startDate || params.start_date,\r\n        endDate: params.endDate || params.end_date,\r\n        placeName: params.placeName || params.place_name,\r\n        imageId: params.imageId || params.image_id,\r\n        cloudCoverMax: params.cloudCoverMax || params.cloud_cover_max\r\n      };\r\n      \r\n      switch (operation) {\r\n        case 'search':\r\n          return await searchCatalog(normalizedParams.query || '', normalizedParams.limit);\r\n          \r\n        case 'filter':\r\n          return await filterCollection(normalizedParams);\r\n          \r\n        case 'geometry':\r\n          return await getGeometry(normalizedParams);\r\n          \r\n        case 'info':\r\n          return await getInfo(normalizedParams.datasetId || normalizedParams.imageId || '');\r\n          \r\n        case 'boundaries':\r\n          return await getBoundaries();\r\n          \r\n        default:\r\n          return {\r\n            success: false,\r\n            error: `Unknown operation: ${operation}`,\r\n            availableOperations: ['search', 'filter', 'geometry', 'info', 'boundaries'],\r\n            suggestion: 'Please use one of the available operations'\r\n          };\r\n      }\r\n    } catch (error: any) {\r\n      console.error(`[earth_engine_data] Error in ${params.operation}:`, error);\r\n      return {\r\n        success: false,\r\n        operation: params.operation,\r\n        error: error.message || 'An unexpected error occurred',\r\n        details: error.stack,\r\n        params: params\r\n      };\r\n    }\r\n  }\r\n});\r\n\r\n// Helper to normalize parameter names\r\nfunction normalizeParams(params: any) {\r\n  return {\r\n    ...params,\r\n    datasetId: params.datasetId || params.dataset_id || params.collection_id,\r\n    startDate: params.startDate || params.start_date,\r\n    endDate: params.endDate || params.end_date,\r\n    placeName: params.placeName || params.place_name,\r\n    imageId: params.imageId || params.image_id,\r\n    cloudCoverMax: params.cloudCoverMax || params.cloud_cover_max\r\n  };\r\n}\r\n\r\n// Export the handler for direct use\r\nexport const handler = async (params: any) => {\r\n  const normalizedParams = normalizeParams(params);\r\n  const operation = normalizedParams.operation;\r\n  \r\n  if (!operation) {\r\n    return {\r\n      success: false,\r\n      error: 'operation parameter is required',\r\n      availableOperations: ['search', 'filter', 'geometry', 'info', 'boundaries'],\r\n      example: '{ \"operation\": \"search\", \"query\": \"sentinel\" }'\r\n    };\r\n  }\r\n  \r\n  try {\r\n    switch (operation) {\r\n      case 'search':\r\n        return await searchCatalog(\r\n          normalizedParams.query || '', \r\n          normalizedParams.limit || 10\r\n        );\r\n        \r\n      case 'filter':\r\n        return await filterCollection(normalizedParams);\r\n        \r\n      case 'geometry':\r\n        return await getGeometry(normalizedParams);\r\n        \r\n      case 'info':\r\n        return await getInfo(normalizedParams.datasetId || normalizedParams.imageId || '');\r\n        \r\n      case 'boundaries':\r\n        return await getBoundaries();\r\n        \r\n      default:\r\n        return {\r\n          success: false,\r\n          error: `Unknown operation: ${operation}`,\r\n          availableOperations: ['search', 'filter', 'geometry', 'info', 'boundaries'],\r\n          suggestion: 'Please use one of the available operations'\r\n        };\r\n    }\r\n  } catch (error: any) {\r\n    console.error(`[earth_engine_data] Error in ${params.operation}:`, error);\r\n    return {\r\n      success: false,\r\n      operation: params.operation,\r\n      error: error.message || 'An unexpected error occurred',\r\n      details: error.stack,\r\n      params: params\r\n    };\r\n  }\r\n};\r\n\r\nexport default {};\r\n","/**\r\n * Singleton stores for Earth Engine data\r\n * These stores persist across tool invocations\r\n */\r\n\r\n// Global composite store - shared across all tools\r\nexport const globalCompositeStore: Record<string, any> = {};\r\n\r\n// Global metadata store\r\nexport const globalMetadataStore: Record<string, any> = {};\r\n\r\n// Global results store for time series and other results\r\nexport const globalResultsStore: Record<string, any> = {};\r\n\r\n// Global map sessions store\r\nexport const globalMapSessions: Record<string, any> = {};\r\n\r\n// Helper to add composite\r\nexport function addComposite(key: string, image: any, metadata?: any) {\r\n  globalCompositeStore[key] = image;\r\n  if (metadata) {\r\n    globalMetadataStore[key] = metadata;\r\n  }\r\n  console.log(`[Store] Added composite: ${key}`);\r\n  console.log(`[Store] Total composites: ${Object.keys(globalCompositeStore).length}`);\r\n}\r\n\r\n// Helper to get composite\r\nexport function getComposite(key: string) {\r\n  return globalCompositeStore[key];\r\n}\r\n\r\n// Helper to get all composite keys\r\nexport function getAllCompositeKeys() {\r\n  return Object.keys(globalCompositeStore);\r\n}\r\n\r\n// Helper to get metadata\r\nexport function getMetadata(key: string) {\r\n  return globalMetadataStore[key];\r\n}","/**\r\n * EARTH ENGINE SYSTEM - Consolidated System & Advanced Tool\r\n * Combines: auth, execute (custom code), setup, load operations\r\n * Critical for MCP stability - reduces tool count\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport { z } from 'zod';\r\nimport { register } from '../../registry';\r\nimport { Storage } from '@google-cloud/storage';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { optimizer } from '@/src/utils/ee-optimizer';\r\nimport { globalCompositeStore as compositeStore } from './stores';\r\n\r\n// Main schema for the consolidated tool\r\nconst SystemToolSchema = z.object({\r\n  operation: z.enum(['auth', 'execute', 'setup', 'load', 'info', 'help', 'health', 'dataset_info']),\r\n  \r\n  // Auth operation params\r\n  checkType: z.enum(['status', 'projects', 'permissions']).optional(),\r\n  \r\n  // Execute operation params\r\n  code: z.string().optional(),\r\n  language: z.enum(['javascript', 'python']).optional().default('javascript'),\r\n  params: z.record(z.any()).optional(),\r\n  \r\n  // Setup operation params\r\n  setupType: z.enum(['gcs', 'auth', 'project']).optional(),\r\n  bucket: z.string().optional(),\r\n  projectId: z.string().optional(),\r\n  \r\n  // Load operation params\r\n  source: z.string().optional(), // GCS path or URL\r\n  dataType: z.enum(['cog', 'geotiff', 'json', 'csv']).optional(),\r\n  \r\n  // Info operation params\r\n  infoType: z.enum(['system', 'quotas', 'assets', 'tasks']).optional(),\r\n  \r\n  // Dataset info params\r\n  datasetId: z.string().optional()\r\n});\r\n\r\n/**\r\n * Auth operation - check authentication and permissions\r\n */\r\nasync function checkAuth(params: any) {\r\n  const { checkType = 'status' } = params;\r\n  \r\n  switch (checkType) {\r\n    case 'status':\r\n      try {\r\n        // Test authentication by making a simple API call\r\n        await (ee as any).Number(1).getInfo();\r\n        \r\n        const credentials = process.env.GOOGLE_APPLICATION_CREDENTIALS;\r\n        const projectId = process.env.GCP_PROJECT_ID;\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'auth',\r\n          authenticated: true,\r\n          projectId: projectId || 'Not configured',\r\n          credentialsPath: credentials ? 'Configured' : 'Not configured',\r\n          message: 'Earth Engine authentication successful'\r\n        };\r\n      } catch (error: any) {\r\n        return {\r\n          success: false,\r\n          operation: 'auth',\r\n          authenticated: false,\r\n          error: error?.message || 'Unknown error',\r\n          message: 'Earth Engine authentication failed',\r\n          help: 'Ensure GOOGLE_APPLICATION_CREDENTIALS is set to your service account key file'\r\n        };\r\n      }\r\n      \r\n    case 'projects':\r\n      try {\r\n        const projects = await (ee.data as any).listAssets({ parent: 'projects' });\r\n        return {\r\n          success: true,\r\n          operation: 'auth',\r\n          checkType: 'projects',\r\n          projects: projects,\r\n          message: `Found ${projects.length} accessible projects`\r\n        };\r\n      } catch (error: any) {\r\n        return {\r\n          success: false,\r\n          operation: 'auth',\r\n          checkType: 'projects',\r\n          error: error?.message || 'Unknown error'\r\n        };\r\n      }\r\n      \r\n    case 'permissions':\r\n      try {\r\n        // Check various permissions\r\n        const checks = {\r\n          canReadPublicData: false,\r\n          canExportToGCS: false,\r\n          canExportToDrive: false,\r\n          canCreateAssets: false\r\n        };\r\n        \r\n        // Test reading public data\r\n        try {\r\n          await new ee.Image('USGS/SRTMGL1_003').getInfo();\r\n          checks.canReadPublicData = true;\r\n        } catch {}\r\n        \r\n        // Test GCS export permission\r\n        try {\r\n          const testTask = ee.batch.Export.image.toCloudStorage({\r\n            image: new ee.Image(1),\r\n            description: 'permission_test',\r\n            bucket: 'test-bucket',\r\n            fileNamePrefix: 'test',\r\n            region: ee.Geometry.Point([0, 0]).buffer(100)\r\n          });\r\n          // Don't actually start the task\r\n          checks.canExportToGCS = true;\r\n        } catch {}\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'auth',\r\n          checkType: 'permissions',\r\n          permissions: checks,\r\n          message: 'Permission check complete'\r\n        };\r\n      } catch (error: any) {\r\n        return {\r\n          success: false,\r\n          operation: 'auth',\r\n          checkType: 'permissions',\r\n          error: error?.message || 'Unknown error'\r\n        };\r\n      }\r\n      \r\n    default:\r\n      throw new Error(`Unknown auth check type: ${checkType}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Execute operation - run custom Earth Engine code\r\n */\r\nasync function executeCode(params: any) {\r\n  const { code, language = 'javascript', params: codeParams = {} } = params;\r\n  \r\n  if (!code) throw new Error('code required for execute operation');\r\n  \r\n  try {\r\n    // Create a function from the code string with timeout\r\n    // Add 'global' to the function context to support global.variable = value\r\n    const func = new Function('ee', 'params', 'global', code);\r\n    \r\n    // Set a timeout for execution\r\n    const timeoutPromise = new Promise((_, reject) => \r\n      setTimeout(() => reject(new Error('Code execution timed out after 30 seconds')), 30000)\r\n    );\r\n    \r\n    // Execute the code with Earth Engine, params, and compositeStore as global\r\n    const executePromise = (async () => {\r\n      const result = await func(ee, codeParams, compositeStore);\r\n      \r\n      // If result is an Earth Engine Image, store it for later use\r\n      if (result && typeof result.select === 'function' && typeof result.visualize === 'function') {\r\n        // This appears to be an Earth Engine Image\r\n        const timestamp = Date.now();\r\n        const imageKey = `user_image_${timestamp}`;\r\n        compositeStore[imageKey] = result;\r\n        \r\n        // Return info about the stored image\r\n        return {\r\n          type: 'EarthEngineImage',\r\n          stored: true,\r\n          imageKey: imageKey,\r\n          message: 'Image stored successfully',\r\n          usage: `Use imageKey '${imageKey}' with the export tool for thumbnails or exports`\r\n        };\r\n      }\r\n      \r\n      // If result is an Earth Engine object, try to get info with optimizer\r\n      let output;\r\n      if (result && typeof result.getInfo === 'function') {\r\n        try {\r\n          // Use optimizer for efficient getInfo\r\n          output = await optimizer.optimizedGetInfo(result, { timeout: 10000 });\r\n        } catch (e) {\r\n          // If getInfo times out, return a description instead\r\n          output = { \r\n            type: 'EarthEngineObject', \r\n            message: 'Result is an Earth Engine object (evaluation timed out)',\r\n            suggestion: 'Try simpler operations or add .limit() to collections' \r\n          };\r\n        }\r\n      } else {\r\n        output = result;\r\n      }\r\n      return output;\r\n    })();\r\n    \r\n    const output = await Promise.race([executePromise, timeoutPromise]);\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'execute',\r\n      language,\r\n      result: output,\r\n      message: 'Code executed successfully'\r\n    };\r\n  } catch (error: any) {\r\n    return {\r\n      success: true, // Return success but with error info\r\n      operation: 'execute',\r\n      executed: false,\r\n      error: error.message || 'Unknown error',\r\n      message: error.message?.includes('timeout') ? 'Code execution timed out' : 'Code execution failed',\r\n      help: 'Ensure your code returns a value quickly and uses proper Earth Engine syntax'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Setup operation - configure GCS, auth, or project settings\r\n */\r\nasync function setupSystem(params: any) {\r\n  const { \r\n    setupType = 'auth',  // Default to auth check instead of GCS\r\n    bucket = process.env.GCS_BUCKET || 'earth-engine-exports',\r\n    projectId = process.env.GCP_PROJECT_ID \r\n  } = params;\r\n  \r\n  switch (setupType) {\r\n    case 'gcs':\r\n      // Use default bucket if not provided\r\n      const gcsBucket = bucket || 'earth-engine-exports';\r\n      \r\n      try {\r\n        const storage = new Storage({\r\n          projectId: process.env.GCP_PROJECT_ID,\r\n          keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS\r\n        });\r\n        \r\n        // Check if bucket exists\r\n        const [exists] = await storage.bucket(gcsBucket).exists();\r\n        \r\n        if (!exists) {\r\n          // Create bucket\r\n          await storage.createBucket(gcsBucket, {\r\n            location: 'US',\r\n            storageClass: 'STANDARD'\r\n          });\r\n          \r\n          // Set CORS configuration\r\n          await storage.bucket(gcsBucket).setCorsConfiguration([{\r\n            origin: ['*'],\r\n            method: ['GET', 'HEAD', 'PUT', 'POST'],\r\n            responseHeader: ['*'],\r\n            maxAgeSeconds: 3600\r\n          }]);\r\n          \r\n          // Create export folder\r\n          const file = storage.bucket(gcsBucket).file('exports/.keep');\r\n          await file.save('');\r\n          \r\n          return {\r\n            success: true,\r\n            operation: 'setup',\r\n            setupType: 'gcs',\r\n            bucket: gcsBucket,\r\n            created: true,\r\n            message: `GCS bucket '${gcsBucket}' created and configured successfully`\r\n          };\r\n        } else {\r\n          return {\r\n            success: true,\r\n            operation: 'setup',\r\n            setupType: 'gcs',\r\n            bucket: gcsBucket,\r\n            exists: true,\r\n            message: `GCS bucket '${gcsBucket}' already exists`\r\n          };\r\n        }\r\n      } catch (error: any) {\r\n        return {\r\n          success: false,\r\n          operation: 'setup',\r\n          setupType: 'gcs',\r\n          error: error?.message || 'Unknown error',\r\n          message: 'GCS setup failed',\r\n          help: 'Ensure you have permissions to create/manage GCS buckets'\r\n        };\r\n      }\r\n      \r\n    case 'auth':\r\n      // Setup authentication by checking and creating service account\r\n      try {\r\n        const credPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\r\n        \r\n        if (!credPath) {\r\n          return {\r\n            success: true,\r\n            operation: 'setup',\r\n            setupType: 'auth',\r\n            configured: false,\r\n            message: 'GOOGLE_APPLICATION_CREDENTIALS not set',\r\n            help: 'Set GOOGLE_APPLICATION_CREDENTIALS environment variable to your service account key file path'\r\n          };\r\n        }\r\n        \r\n        // Check if file exists - with timeout\r\n        const fileExists = await fs.access(credPath).then(() => true).catch(() => false);\r\n        \r\n        if (!fileExists) {\r\n          return {\r\n            success: true,\r\n            operation: 'setup',\r\n            setupType: 'auth',\r\n            configured: false,\r\n            message: 'Credentials file not found',\r\n            path: credPath\r\n          };\r\n        }\r\n        \r\n        // Read and parse the credentials - with size limit\r\n        const stats = await fs.stat(credPath);\r\n        if (stats.size > 10000) { // 10KB max for service account key\r\n          return {\r\n            success: true,\r\n            operation: 'setup',\r\n            setupType: 'auth',\r\n            configured: false,\r\n            message: 'Credentials file too large - may not be valid service account key'\r\n          };\r\n        }\r\n        \r\n        const credContent = await fs.readFile(credPath, 'utf-8');\r\n        const credentials = JSON.parse(credContent);\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'setup',\r\n          setupType: 'auth',\r\n          configured: true,\r\n          serviceAccount: credentials.client_email,\r\n          projectId: credentials.project_id,\r\n          keyId: credentials.private_key_id,\r\n          message: 'Authentication configured correctly'\r\n        };\r\n      } catch (error: any) {\r\n        return {\r\n          success: true,\r\n          operation: 'setup',\r\n          setupType: 'auth',\r\n          configured: false,\r\n          error: error.message || 'Unknown error',\r\n          message: 'Could not verify authentication setup'\r\n        };\r\n      }\r\n      \r\n    case 'project':\r\n      if (!projectId) throw new Error('projectId required for project setup');\r\n      \r\n      // Update project configuration\r\n      process.env.GCP_PROJECT_ID = projectId;\r\n      \r\n      return {\r\n        success: true,\r\n        operation: 'setup',\r\n        setupType: 'project',\r\n        projectId,\r\n        message: `Project ID set to '${projectId}'`\r\n      };\r\n      \r\n    default:\r\n      throw new Error(`Unknown setup type: ${setupType}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Load operation - load external data (COG, GeoTIFF, etc.)\r\n */\r\nasync function loadData(params: any) {\r\n  const { source, dataType = 'cog' } = params;\r\n  \r\n  if (!source) throw new Error('source required for load operation');\r\n  \r\n  try {\r\n    let loaded;\r\n    \r\n    switch (dataType) {\r\n      case 'cog':\r\n      case 'geotiff':\r\n        // Load Cloud Optimized GeoTIFF or regular GeoTIFF\r\n        if (source.startsWith('gs://')) {\r\n          // Load from GCS\r\n          loaded = ee.Image.loadGeoTIFF(source);\r\n        } else if (source.startsWith('http')) {\r\n          // Load from HTTP URL\r\n          loaded = ee.Image.loadGeoTIFF(source);\r\n        } else {\r\n          throw new Error('Source must be a GCS path (gs://) or HTTP URL');\r\n        }\r\n        \r\n        const info = await loaded.getInfo();\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'load',\r\n          dataType,\r\n          source,\r\n          bands: info.bands.length,\r\n          properties: info.properties,\r\n          message: `Loaded ${dataType.toUpperCase()} with ${info.bands.length} bands`,\r\n          result: loaded\r\n        };\r\n        \r\n      case 'json':\r\n        // Load GeoJSON as feature collection\r\n        if (source.startsWith('gs://')) {\r\n          // For GCS, we need to read the file first\r\n          const storage = new Storage();\r\n          const matches = source.match(/gs:\\/\\/([^\\/]+)\\/(.+)/);\r\n          if (!matches) throw new Error('Invalid GCS path');\r\n          \r\n          const [, bucketName, fileName] = matches;\r\n          const file = storage.bucket(bucketName).file(fileName);\r\n          const [contents] = await file.download();\r\n          const geojson = JSON.parse(contents.toString());\r\n          \r\n          loaded = new ee.FeatureCollection(geojson);\r\n        } else {\r\n          // Assume it's a direct GeoJSON object or string\r\n          const geojson = typeof source === 'string' ? JSON.parse(source) : source;\r\n          loaded = new ee.FeatureCollection(geojson);\r\n        }\r\n        \r\n        const count = await loaded.size().getInfo();\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'load',\r\n          dataType: 'json',\r\n          featureCount: count,\r\n          message: `Loaded GeoJSON with ${count} features`,\r\n          result: loaded\r\n        };\r\n        \r\n      case 'csv':\r\n        // CSV loading would require more complex handling\r\n        return {\r\n          success: false,\r\n          operation: 'load',\r\n          dataType: 'csv',\r\n          message: 'CSV loading not yet implemented',\r\n          help: 'Convert CSV to GeoJSON first, then use dataType: \"json\"'\r\n        };\r\n        \r\n      default:\r\n        throw new Error(`Unknown data type: ${dataType}`);\r\n    }\r\n  } catch (error: any) {\r\n    return {\r\n      success: false,\r\n      operation: 'load',\r\n      error: error?.message || 'Unknown error',\r\n      message: 'Data loading failed'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Dataset info operation - get information about a specific dataset\r\n */\r\nasync function getDatasetInfo(params: any) {\r\n  const { datasetId } = params;\r\n  \r\n  if (!datasetId) {\r\n    return {\r\n      success: false,\r\n      operation: 'dataset_info',\r\n      error: 'datasetId is required',\r\n      message: 'Please provide a dataset ID to get information about'\r\n    };\r\n  }\r\n  \r\n  // Determine dataset type and provide specific info based on ID pattern\r\n  let datasetType = 'Unknown';\r\n  let spatialResolution = 'Unknown';\r\n  let temporalResolution = 'Unknown';\r\n  let typicalBands = [];\r\n  \r\n  if (datasetId.includes('COPERNICUS/S2')) {\r\n    datasetType = 'Sentinel-2 Optical Imagery';\r\n    spatialResolution = '10-60m';\r\n    temporalResolution = '5 days';\r\n    typicalBands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B9', 'B10', 'B11', 'B12', 'QA60'];\r\n  } else if (datasetId.includes('LANDSAT')) {\r\n    datasetType = 'Landsat Optical Imagery';\r\n    spatialResolution = '30m';\r\n    temporalResolution = '16 days';\r\n    typicalBands = ['SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7', 'QA_PIXEL'];\r\n  } else if (datasetId.includes('MODIS')) {\r\n    datasetType = 'MODIS Imagery';\r\n    spatialResolution = '250-1000m';\r\n    temporalResolution = 'Daily';\r\n    typicalBands = ['sur_refl_b01', 'sur_refl_b02', 'sur_refl_b03', 'sur_refl_b04', 'sur_refl_b05', 'sur_refl_b06', 'sur_refl_b07'];\r\n  } else if (datasetId.includes('CHIRPS')) {\r\n    datasetType = 'Precipitation Data';\r\n    spatialResolution = '5.5km';\r\n    temporalResolution = 'Daily/Monthly';\r\n    typicalBands = ['precipitation'];\r\n  }\r\n  \r\n  // Try to get actual collection info with very aggressive timeout\r\n  let actualBands = typicalBands;\r\n  let imageCount = 'Unknown';\r\n  \r\n  try {\r\n    const collection = new ee.ImageCollection(datasetId);\r\n    \r\n    // Only try to get band names from first image, skip count to avoid timeout\r\n    const first = collection.first();\r\n    \r\n    // Use Promise.race to enforce strict timeout\r\n    const bandsPromise = optimizer.optimizedGetInfo(first.bandNames(), { timeout: 2000 });\r\n    const timeoutPromise = new Promise((resolve) => \r\n      setTimeout(() => resolve(null), 2000)\r\n    );\r\n    \r\n    const bands = await Promise.race([bandsPromise, timeoutPromise]);\r\n    if (bands && Array.isArray(bands)) {\r\n      actualBands = bands;\r\n    }\r\n  } catch (error: any) {\r\n    // If collection fails, just use the typical bands\r\n    console.log('Could not fetch actual dataset info, using typical values');\r\n  }\r\n  \r\n  return {\r\n    success: true,\r\n    operation: 'dataset_info',\r\n    datasetId,\r\n    datasetType,\r\n    bands: actualBands,\r\n    bandCount: actualBands.length,\r\n    spatialResolution,\r\n    temporalResolution,\r\n    imageCount,\r\n    message: `Dataset information for ${datasetId}`,\r\n    usage: 'Use this dataset ID in filter, composite, and other operations',\r\n    note: 'Band information may be typical values if actual collection could not be accessed quickly'\r\n  };\r\n}\r\n\r\n/**\r\n * Info operation - get system information\r\n */\r\nasync function getSystemInfo(params: any) {\r\n  const { infoType = 'system' } = params;\r\n  \r\n  switch (infoType) {\r\n    case 'system':\r\n      return {\r\n        success: true,\r\n        operation: 'info',\r\n        infoType: 'system',\r\n        earthEngineVersion: '1.x',\r\n        nodeVersion: process.version,\r\n        platform: process.platform,\r\n        memory: {\r\n          used: `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)} MB`,\r\n          total: `${Math.round(process.memoryUsage().heapTotal / 1024 / 1024)} MB`\r\n        },\r\n        environment: {\r\n          hasCredentials: !!process.env.GOOGLE_APPLICATION_CREDENTIALS,\r\n          hasProjectId: !!process.env.GCP_PROJECT_ID,\r\n          hasBucket: !!process.env.GCS_BUCKET\r\n        },\r\n        message: 'System information retrieved'\r\n      };\r\n      \r\n    case 'quotas':\r\n      // Earth Engine quotas\r\n      return {\r\n        success: true,\r\n        operation: 'info',\r\n        infoType: 'quotas',\r\n        limits: {\r\n          maxPixelsPerRequest: '1e9',\r\n          maxFeaturesPerRequest: '5000',\r\n          maxExportSize: '32GB',\r\n          concurrentExports: 3000\r\n        },\r\n        message: 'Earth Engine quota information'\r\n      };\r\n      \r\n    case 'assets':\r\n      try {\r\n        // List user assets\r\n        const assets = await (ee.data as any).listAssets({ parent: 'projects/earthengine-legacy/assets' });\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'info',\r\n          infoType: 'assets',\r\n          assetCount: assets.length,\r\n          assets: assets.slice(0, 10), // First 10 assets\r\n          message: `Found ${assets.length} assets`\r\n        };\r\n      } catch (error: any) {\r\n        return {\r\n          success: true,\r\n          operation: 'info',\r\n          infoType: 'assets',\r\n          message: 'No user assets found or no access to legacy assets'\r\n        };\r\n      }\r\n      \r\n    case 'tasks':\r\n      try {\r\n        // List running tasks\r\n        const tasks = await (ee.data as any).listOperations();\r\n        const running = tasks.filter((t: any) => t.metadata?.state === 'RUNNING');\r\n        const completed = tasks.filter((t: any) => t.metadata?.state === 'SUCCEEDED');\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'info',\r\n          infoType: 'tasks',\r\n          totalTasks: tasks.length,\r\n          running: running.length,\r\n          completed: completed.length,\r\n          recent: tasks.slice(0, 5).map((t: any) => ({\r\n            id: t.name,\r\n            state: t.metadata?.state,\r\n            progress: Math.round((t.metadata?.progress || 0) * 100)\r\n          })),\r\n          message: `${running.length} running, ${completed.length} completed tasks`\r\n        };\r\n      } catch (error: any) {\r\n        return {\r\n          success: false,\r\n          operation: 'info',\r\n          infoType: 'tasks',\r\n          error: error?.message || 'Unknown error'\r\n        };\r\n      }\r\n      \r\n    default:\r\n      throw new Error(`Unknown info type: ${infoType}`);\r\n  }\r\n}\r\n\r\n// Register the consolidated tool\r\nregister({\r\n  name: 'earth_engine_system',\r\n  description: `Consolidated Earth Engine system & advanced tool. Operations: auth (check authentication), execute (run custom code), setup (configure GCS/auth), load (external data), info (system info)`,\r\n  input: SystemToolSchema,\r\n  output: z.any(),\r\n  handler: async (params) => {\r\n    try {\r\n      const { operation } = params;\r\n      \r\n      if (!operation) {\r\n        return {\r\n          success: false,\r\n          error: 'Operation parameter is required',\r\n          availableOperations: ['auth', 'execute', 'setup', 'load', 'info', 'dataset_info', 'help']\r\n        };\r\n      }\r\n      \r\n      // Handle both snake_case and camelCase parameters\r\n      const normalizedParams = {\r\n        ...params,\r\n        assetId: params.assetId || params.asset_id,\r\n        assetType: params.assetType || params.asset_type,\r\n        dataSource: params.dataSource || params.data_source,\r\n        dataUrl: params.dataUrl || params.data_url,\r\n        dataContent: params.dataContent || params.data_content,\r\n        includeDetails: params.includeDetails || params.include_details,\r\n        checkType: params.checkType || params.check_type,\r\n        setupType: params.setupType || params.setup_type,\r\n        infoType: params.infoType || params.info_type,\r\n        dataType: params.dataType || params.data_type\r\n      };\r\n      \r\n      switch (operation) {\r\n        case 'auth':\r\n        case 'authentication':  // Allow both 'auth' and 'authentication'\r\n          return await checkAuth(normalizedParams);\r\n          \r\n        case 'execute':\r\n        case 'run':  // Allow both 'execute' and 'run'\r\n          return await executeCode(normalizedParams);\r\n          \r\n        case 'setup':\r\n        case 'configure':  // Allow both 'setup' and 'configure'\r\n          return await setupSystem(normalizedParams);\r\n          \r\n        case 'load':\r\n        case 'import':  // Allow both 'load' and 'import'\r\n          return await loadData(normalizedParams);\r\n          \r\n        case 'info':\r\n        case 'system':  // Allow both 'info' and 'system'\r\n          return await getSystemInfo(normalizedParams);\r\n          \r\n        case 'dataset_info':\r\n        case 'dataset':  // Allow both 'dataset_info' and 'dataset'\r\n          return await getDatasetInfo(normalizedParams);\r\n          \r\n        case 'health':\r\n          // Health check operation\r\n          try {\r\n            // Test Earth Engine connection\r\n            await (ee as any).Number(1).getInfo();\r\n            \r\n            return {\r\n              success: true,\r\n              operation: 'health',\r\n              status: 'healthy',\r\n              earthEngine: 'connected',\r\n              authentication: 'valid',\r\n              timestamp: new Date().toISOString(),\r\n              message: 'All systems operational'\r\n            };\r\n          } catch (error: any) {\r\n            return {\r\n              success: true,\r\n              operation: 'health',\r\n              status: 'degraded',\r\n              earthEngine: 'error',\r\n              error: error?.message || 'Unknown error',\r\n              timestamp: new Date().toISOString(),\r\n              message: 'Earth Engine connection issue'\r\n            };\r\n          }\r\n          \r\n        case 'help':\r\n          return {\r\n            success: true,\r\n            operation: 'help',\r\n            message: 'Earth Engine System Tool Help',\r\n            availableOperations: {\r\n              auth: 'Check authentication status and permissions',\r\n              execute: 'Execute custom Earth Engine JavaScript code',\r\n              setup: 'Setup GCS buckets, authentication, or projects',\r\n              load: 'Load external data (GeoTIFF, JSON, CSV) into Earth Engine',\r\n              info: 'Get system information, quotas, assets, or task status',\r\n              dataset_info: 'Get detailed information about a specific dataset',\r\n              health: 'Check system health status',\r\n              help: 'Show this help message'\r\n            },\r\n            examples: {\r\n              auth: { operation: 'auth', checkType: 'status' },\r\n              execute: { operation: 'execute', code: 'return ee.Number(42).getInfo();' },\r\n              setup: { operation: 'setup', setupType: 'gcs', bucket: 'my-bucket' },\r\n              info: { operation: 'info', infoType: 'system' },\r\n              health: { operation: 'health' }\r\n            }\r\n          };\r\n          \r\n        default:\r\n          return {\r\n            success: false,\r\n            error: `Unknown operation: ${operation}`,\r\n            availableOperations: ['auth', 'execute', 'setup', 'load', 'info', 'dataset_info', 'help'],\r\n            suggestion: 'Please use one of the available operations'\r\n          };\r\n      }\r\n    } catch (error: any) {\r\n      console.error(`[earth_engine_system] Error in ${params.operation}:`, error);\r\n      return {\r\n        success: false,\r\n        operation: params.operation,\r\n        error: error.message || 'An unexpected error occurred',\r\n        details: error.stack,\r\n        params: params\r\n      };\r\n    }\r\n  }\r\n});\r\n\r\nexport default {};\r\n","/**\r\n * Global singleton store for Earth Engine data\r\n * Uses global object to ensure persistence across module reloads\r\n * \r\n * IMPORTANT: Earth Engine objects are server-side references, not actual data.\r\n * We store them directly and they maintain their computation graph.\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\n\r\n// Use Node.js global object to ensure true singleton\r\ndeclare global {\r\n  var eeStore: {\r\n    composites: Record<string, any>;\r\n    metadata: Record<string, any>;\r\n    results: Record<string, any>;\r\n    mapSessions: Record<string, any>;\r\n    // Add a cache for EE object serialization\r\n    eeCache: Record<string, { type: string; serialized: any; }>;\r\n  };\r\n}\r\n\r\n// Initialize global store if it doesn't exist\r\nif (!global.eeStore) {\r\n  global.eeStore = {\r\n    composites: {},\r\n    metadata: {},\r\n    results: {},\r\n    mapSessions: {},\r\n    eeCache: {}\r\n  };\r\n  console.log('[GlobalStore] Initialized new global store');\r\n}\r\n\r\n// Export references to the global store\r\nexport const globalCompositeStore = global.eeStore.composites;\r\nexport const globalMetadataStore = global.eeStore.metadata;\r\nexport const globalResultsStore = global.eeStore.results;\r\nexport const globalMapSessions = global.eeStore.mapSessions;\r\nexport const globalEECache = global.eeStore.eeCache;\r\n\r\n// Helper functions\r\nexport function addComposite(key: string, image: any, metadata?: any) {\r\n  // IMPORTANT: Store the Earth Engine object directly\r\n  // Earth Engine objects are computation graphs, not data\r\n  // They maintain their server-side state and methods\r\n  \r\n  // Store the EE object reference\r\n  globalCompositeStore[key] = image;\r\n  \r\n  // Also store metadata about the object type\r\n  if (metadata) {\r\n    globalMetadataStore[key] = {\r\n      ...metadata,\r\n      eeType: image?.constructor?.name || 'unknown',\r\n      hasNormalizedDifference: typeof image?.normalizedDifference === 'function',\r\n      hasSelect: typeof image?.select === 'function',\r\n      hasBandNames: typeof image?.bandNames === 'function'\r\n    };\r\n  }\r\n  \r\n  console.log(`[GlobalStore] Added composite: ${key}`);\r\n  console.log(`[GlobalStore] Total composites: ${Object.keys(globalCompositeStore).length}`);\r\n  \r\n  // Detailed verification\r\n  if (image) {\r\n    const checks = {\r\n      select: typeof image.select === 'function',\r\n      normalizedDifference: typeof image.normalizedDifference === 'function',\r\n      clip: typeof image.clip === 'function',\r\n      visualize: typeof image.visualize === 'function'\r\n    };\r\n    console.log(`[GlobalStore] EE methods for ${key}:`, checks);\r\n    \r\n    if (!checks.normalizedDifference) {\r\n      console.warn(`[GlobalStore] WARNING: ${key} lacks normalizedDifference method!`);\r\n    }\r\n  }\r\n}\r\n\r\nexport function getComposite(key: string) {\r\n  const composite = globalCompositeStore[key];\r\n  \r\n  if (composite) {\r\n    console.log(`[GlobalStore] Retrieved composite: ${key}`);\r\n    \r\n    // Check if it still has EE methods\r\n    const metadata = globalMetadataStore[key];\r\n    const checks = {\r\n      select: typeof composite.select === 'function',\r\n      normalizedDifference: typeof composite.normalizedDifference === 'function',\r\n      clip: typeof composite.clip === 'function'\r\n    };\r\n    \r\n    console.log(`[GlobalStore] EE methods check for ${key}:`, checks);\r\n    \r\n    if (!checks.normalizedDifference && metadata?.hasNormalizedDifference) {\r\n      console.error(`[GlobalStore] ERROR: ${key} lost normalizedDifference method!`);\r\n      console.log(`[GlobalStore] Composite type:`, composite?.constructor?.name);\r\n      console.log(`[GlobalStore] Composite keys:`, Object.keys(composite || {}));\r\n    }\r\n  } else {\r\n    console.log(`[GlobalStore] Composite ${key} not found`);\r\n    console.log(`[GlobalStore] Available keys: ${getAllCompositeKeys().join(', ')}`);\r\n  }\r\n  \r\n  return composite;\r\n}\r\n\r\nexport function getAllCompositeKeys() {\r\n  return Object.keys(globalCompositeStore);\r\n}\r\n\r\nexport function getMetadata(key: string) {\r\n  return globalMetadataStore[key];\r\n}\r\n\r\nexport function addMapSession(id: string, session: any) {\r\n  globalMapSessions[id] = session;\r\n  console.log(`[GlobalStore] Added map session: ${id}`);\r\n  console.log(`[GlobalStore] Total map sessions: ${Object.keys(globalMapSessions).length}`);\r\n}\r\n\r\nexport function getMapSession(id: string) {\r\n  console.log(`[GlobalStore] Fetching map session: ${id}`);\r\n  console.log(`[GlobalStore] Available sessions: ${Object.keys(globalMapSessions).join(', ')}`);\r\n  return globalMapSessions[id];\r\n}\r\n\r\nexport function getAllMapSessions() {\r\n  return globalMapSessions;\r\n}","/**\r\n * EARTH ENGINE PROCESS - Consolidated Processing Tool\r\n * Combines: clip, mask, index, analyze, composite, terrain operations\r\n * Fixed version with complete implementations\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport { z } from 'zod';\r\nimport { register } from '../../registry';\r\nimport { parseAoi } from '@/src/utils/geo';\r\nimport { addComposite, getComposite, globalCompositeStore as compositeStore, globalMetadataStore as compositeMetadata } from '@/src/lib/global-store';\r\nimport { optimizer } from '@/src/utils/ee-optimizer';\r\n\r\n// Use the global stores directly from imports - DO NOT redefine them!\r\n// The compositeStore and compositeMetadata are imported from global-store above\r\n\r\n// Main schema for the consolidated tool\r\nconst ProcessToolSchema = z.object({\r\n  operation: z.enum(['clip', 'mask', 'index', 'analyze', 'composite', 'terrain', 'resample', 'fcc', 'model']),\r\n  \r\n  // Common params\r\n  input: z.any().optional(),\r\n  datasetId: z.string().optional(),\r\n  region: z.any().optional(),\r\n  scale: z.number().optional(),\r\n  startDate: z.string().optional(),\r\n  endDate: z.string().optional(),\r\n  \r\n  // Mask operation params\r\n  maskType: z.enum(['clouds', 'quality', 'water', 'shadow']).optional(),\r\n  threshold: z.number().optional(),\r\n  \r\n  // Index operation params\r\n  indexType: z.enum(['NDVI', 'NDWI', 'NDBI', 'EVI', 'SAVI', 'MNDWI', 'BSI', 'NDSI', 'NBR', 'custom']).optional(),\r\n  redBand: z.string().optional(),\r\n  nirBand: z.string().optional(),\r\n  formula: z.string().optional(),\r\n  \r\n  // Analyze operation params\r\n  analysisType: z.enum(['statistics', 'timeseries', 'change', 'zonal']).optional(),\r\n  reducer: z.enum(['mean', 'median', 'max', 'min', 'stdDev', 'sum', 'count']).optional(),\r\n  zones: z.any().optional(),\r\n  \r\n  // Composite operation params\r\n  compositeType: z.enum(['median', 'mean', 'max', 'min', 'mosaic', 'greenest']).optional(),\r\n  cloudCoverMax: z.number().optional(),\r\n  \r\n  // Terrain operation params\r\n  terrainType: z.enum(['elevation', 'slope', 'aspect', 'hillshade']).optional(),\r\n  azimuth: z.number().optional(),\r\n  elevation: z.number().optional(),\r\n  \r\n  // Resample operation params\r\n  targetScale: z.number().optional(),\r\n  resampleMethod: z.enum(['bilinear', 'bicubic', 'nearest']).optional(),\r\n  \r\n  // Model operation params\r\n  modelType: z.enum(['wildfire', 'flood', 'agriculture', 'deforestation', 'water_quality']).optional(),\r\n  exportMaps: z.boolean().optional(),\r\n  includeTimeSeries: z.boolean().optional(),\r\n  \r\n  // Wildfire model params\r\n  fireSeasonOnly: z.boolean().optional(),\r\n  \r\n  // Flood model params\r\n  floodType: z.enum(['urban', 'riverine', 'coastal']).optional(),\r\n  \r\n  // Agriculture model params\r\n  cropType: z.enum(['corn', 'wheat', 'soy', 'rice', 'cotton', 'sugarcane', 'potato', 'tomato', 'vineyard', 'orchard', 'pasture', 'all']).optional(),\r\n  analysisType: z.enum(['comprehensive', 'classification', 'yield', 'irrigation', 'disease', 'soil', 'phenology']).optional(),\r\n  includeWeather: z.boolean().optional(),\r\n  includeSoil: z.boolean().optional(),\r\n  includeHistorical: z.boolean().optional(),\r\n  yieldModel: z.boolean().optional(),\r\n  irrigationAnalysis: z.boolean().optional(),\r\n  diseaseRisk: z.boolean().optional(),\r\n  fieldBoundaries: z.any().optional(),\r\n  cropCalendar: z.any().optional(),\r\n  \r\n  // Deforestation model params\r\n  baselineStart: z.string().optional(),\r\n  baselineEnd: z.string().optional(),\r\n  currentStart: z.string().optional(),\r\n  currentEnd: z.string().optional(),\r\n  \r\n  // Water quality params\r\n  waterBody: z.enum(['lake', 'river', 'reservoir', 'coastal']).optional(),\r\n  \r\n  // Classification params\r\n  classification: z.boolean().optional(),\r\n  groundTruth: z.array(z.any()).optional()\r\n});\r\n\r\n/**\r\n * Helper function to get or create image/collection\r\n */\r\nasync function getInput(input: any) {\r\n  if (typeof input === 'string') {\r\n    // First check if it's a stored composite key\r\n    if (compositeStore[input]) {\r\n      // The stored composite might have lost its EE methods\r\n      // Ensure it's properly wrapped as an ee.Image\r\n      const stored = compositeStore[input];\r\n      \r\n      // If it has normalizedDifference method, it's already a proper EE image\r\n      if (stored && typeof stored.normalizedDifference === 'function') {\r\n        return stored;\r\n      }\r\n      \r\n      // Otherwise, try to reconstruct it\r\n      // This shouldn't happen if we're storing correctly, but as a fallback\r\n      try {\r\n        return ee.Image(stored);\r\n      } catch (e) {\r\n        console.error('Failed to reconstruct EE image from store:', e);\r\n        throw new Error(`Stored composite ${input} is not a valid Earth Engine image`);\r\n      }\r\n    }\r\n    \r\n    // Try as collection first\r\n    try {\r\n      return new ee.ImageCollection(input);\r\n    } catch {\r\n      // Try as single image\r\n      try {\r\n        return new ee.Image(input);\r\n      } catch {\r\n        throw new Error(`Could not resolve input: ${input}`);\r\n      }\r\n    }\r\n  }\r\n  return input; // Already an EE object\r\n}\r\n\r\n/**\r\n * Composite operation - create cloud-free composites\r\n */\r\nasync function createComposite(params: any) {\r\n  const { \r\n    datasetId, \r\n    startDate, \r\n    endDate, \r\n    region, \r\n    compositeType = 'median',\r\n    cloudCoverMax = 20\r\n  } = params;\r\n  \r\n  if (!datasetId) throw new Error('datasetId required for composite operation');\r\n  if (!startDate || !endDate) throw new Error('startDate and endDate required for composite');\r\n  \r\n  // Create collection\r\n  let collection = new ee.ImageCollection(datasetId);\r\n  \r\n  // Apply date filter\r\n  collection = collection.filterDate(startDate, endDate);\r\n  \r\n  // Apply region filter if provided\r\n  if (region) {\r\n    const geometry = await parseAoi(region);\r\n    collection = collection.filterBounds(geometry);\r\n    \r\n    // Also clip the final composite to the region\r\n    let composite;\r\n    \r\n    // Apply cloud filter for optical imagery\r\n    if (datasetId.includes('COPERNICUS/S2') || datasetId.includes('LANDSAT')) {\r\n      const cloudProp = datasetId.includes('COPERNICUS/S2') ? 'CLOUDY_PIXEL_PERCENTAGE' : 'CLOUD_COVER';\r\n      collection = collection.filter(ee.Filter.lt(cloudProp, cloudCoverMax));\r\n      \r\n      // Apply cloud masking for cleaner composite\r\n      if (datasetId.includes('COPERNICUS/S2')) {\r\n        collection = collection.map((img: any) => {\r\n          const qa = img.select('QA60');\r\n          const cloudBitMask = 1 << 10;\r\n          const cirrusBitMask = 1 << 11;\r\n          const mask = qa.bitwiseAnd(cloudBitMask).eq(0)\r\n            .and(qa.bitwiseAnd(cirrusBitMask).eq(0));\r\n          return img.updateMask(mask).divide(10000)\r\n            .select(['B.*'])\r\n            .copyProperties(img, ['system:time_start']);\r\n        });\r\n      }\r\n    }\r\n    \r\n    // Create composite based on type\r\n    switch (compositeType) {\r\n      case 'median':\r\n        composite = collection.median();\r\n        break;\r\n      case 'mean':\r\n        composite = collection.mean();\r\n        break;\r\n      case 'max':\r\n        composite = collection.max();\r\n        break;\r\n      case 'min':\r\n        composite = collection.min();\r\n        break;\r\n      case 'mosaic':\r\n        composite = collection.mosaic();\r\n        break;\r\n      case 'greenest':\r\n        // Greenest pixel composite (max NDVI)\r\n        composite = collection.qualityMosaic('B8');\r\n        break;\r\n      default:\r\n        composite = collection.median();\r\n    }\r\n    \r\n    // Clip to region\r\n    composite = composite.clip(geometry);\r\n    \r\n    // Store composite for later use\r\n    const compositeKey = `composite_${Date.now()}`;\r\n    \r\n    // Use the global store helper\r\n    addComposite(compositeKey, composite, {\r\n      datasetId,\r\n      compositeType,\r\n      startDate,\r\n      endDate,\r\n      region\r\n    });\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'composite',\r\n      compositeType,\r\n      compositeKey,\r\n      message: `Created ${compositeType} composite from ${datasetId}`,\r\n      dateRange: { startDate, endDate },\r\n      region: typeof region === 'string' ? region : 'custom geometry',\r\n      cloudCoverMax,\r\n      result: composite,\r\n      nextSteps: 'Use this compositeKey with thumbnail operation to visualize'\r\n    };\r\n  } else {\r\n    // No region specified - just create composite\r\n    let composite;\r\n    \r\n    // Apply cloud filter\r\n    if (datasetId.includes('COPERNICUS/S2') || datasetId.includes('LANDSAT')) {\r\n      const cloudProp = datasetId.includes('COPERNICUS/S2') ? 'CLOUDY_PIXEL_PERCENTAGE' : 'CLOUD_COVER';\r\n      collection = collection.filter(ee.Filter.lt(cloudProp, cloudCoverMax));\r\n    }\r\n    \r\n    switch (compositeType) {\r\n      case 'median':\r\n        composite = collection.median();\r\n        break;\r\n      case 'mean':\r\n        composite = collection.mean();\r\n        break;\r\n      case 'max':\r\n        composite = collection.max();\r\n        break;\r\n      case 'min':\r\n        composite = collection.min();\r\n        break;\r\n      case 'mosaic':\r\n        composite = collection.mosaic();\r\n        break;\r\n      default:\r\n        composite = collection.median();\r\n    }\r\n    \r\n    const compositeKey = `composite_${Date.now()}`;\r\n    \r\n    // Use the global store helper\r\n    addComposite(compositeKey, composite, {\r\n      datasetId,\r\n      compositeType,\r\n      startDate,\r\n      endDate\r\n    });\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'composite',\r\n      compositeType,\r\n      compositeKey,\r\n      message: `Created ${compositeType} composite from ${datasetId}`,\r\n      dateRange: { startDate, endDate },\r\n      result: composite,\r\n      nextSteps: 'Use this compositeKey with thumbnail operation to visualize'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * FCC (False Color Composite) operation\r\n */\r\nasync function createFCC(params: any) {\r\n  const { datasetId, startDate, endDate, region } = params;\r\n  \r\n  // Create a composite first\r\n  const compositeResult = await createComposite({\r\n    ...params,\r\n    compositeType: 'median'\r\n  });\r\n  \r\n  // FCC configuration based on dataset\r\n  let fccBands;\r\n  if (datasetId.includes('COPERNICUS/S2')) {\r\n    // Sentinel-2: NIR-Red-Green (B8-B4-B3)\r\n    fccBands = ['B8', 'B4', 'B3'];\r\n  } else if (datasetId.includes('LANDSAT')) {\r\n    // Landsat: NIR-Red-Green\r\n    fccBands = ['SR_B5', 'SR_B4', 'SR_B3'];\r\n  } else {\r\n    throw new Error('FCC only supported for Sentinel-2 and Landsat datasets');\r\n  }\r\n  \r\n  return {\r\n    ...compositeResult,\r\n    operation: 'fcc',\r\n    fccBands,\r\n    message: `Created False Color Composite (FCC) using bands: ${fccBands.join(', ')}`,\r\n    visualization: {\r\n      bands: fccBands,\r\n      min: 0,\r\n      max: datasetId.includes('COPERNICUS/S2') ? 0.4 : 3000,  // Higher max for FCC with NIR\r\n      gamma: 1.3\r\n    },\r\n    nextSteps: 'Use thumbnail operation with the compositeKey and these visualization parameters'\r\n  };\r\n}\r\n\r\n/**\r\n * Calculate vegetation indices\r\n */\r\nasync function calculateIndex(params: any) {\r\n  const { datasetId, startDate, endDate, region, input, compositeKey, indexType = 'NDVI' } = params;\r\n  \r\n  let source;\r\n  let metadata = null;\r\n  \r\n  // Priority: input > compositeKey > datasetId\r\n  if (input) {\r\n    // Input can be a compositeKey string or other identifier\r\n    source = await getInput(input);\r\n    // If input was a composite key, get its metadata\r\n    if (typeof input === 'string' && compositeMetadata[input]) {\r\n      metadata = compositeMetadata[input];\r\n    }\r\n  } else if (compositeKey && compositeStore[compositeKey]) {\r\n    source = compositeStore[compositeKey];\r\n    metadata = compositeMetadata[compositeKey];\r\n  } else if (datasetId) {\r\n    // Create a composite first\r\n    const compositeResult = await createComposite({\r\n      datasetId,\r\n      startDate,\r\n      endDate,\r\n      region,\r\n      compositeType: 'median'\r\n    });\r\n    source = compositeResult.result;\r\n    metadata = { datasetId };\r\n  } else {\r\n    throw new Error('datasetId, input, or compositeKey required for index calculation');\r\n  }\r\n  \r\n  // Determine bands based on dataset type\r\n  let bands: any = {};\r\n  \r\n  // Check metadata first, then datasetId\r\n  const dataset = metadata?.datasetId || datasetId || '';\r\n  \r\n  if (dataset.includes('COPERNICUS/S2')) {\r\n    bands = {\r\n      red: 'B4',\r\n      green: 'B3',\r\n      blue: 'B2',\r\n      nir: 'B8',\r\n      swir1: 'B11',\r\n      swir2: 'B12'\r\n    };\r\n  } else if (dataset.includes('LANDSAT')) {\r\n    bands = {\r\n      red: 'SR_B4',\r\n      green: 'SR_B3',\r\n      blue: 'SR_B2',\r\n      nir: 'SR_B5',\r\n      swir1: 'SR_B6',\r\n      swir2: 'SR_B7'\r\n    };\r\n  } else {\r\n    // Default to Sentinel-2 bands (most common)\r\n    bands = {\r\n      red: 'B4',\r\n      green: 'B3',\r\n      blue: 'B2',\r\n      nir: 'B8',\r\n      swir1: 'B11',\r\n      swir2: 'B12'\r\n    };\r\n  }\r\n  \r\n  let index;\r\n  let indexKey;\r\n  let visualization;\r\n  let interpretation;\r\n  \r\n  switch (indexType) {\r\n    case 'NDVI':\r\n      // Normalized Difference Vegetation Index\r\n      index = source.normalizedDifference([bands.nir, bands.red]).rename('NDVI');\r\n      indexKey = `ndvi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['NDVI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['blue', 'white', 'green']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to 0': 'Water bodies',\r\n          '0 to 0.2': 'Bare soil, rocks, sand',\r\n          '0.2 to 0.4': 'Sparse vegetation',\r\n          '0.4 to 0.6': 'Moderate vegetation',\r\n          '0.6 to 0.8': 'Dense vegetation',\r\n          '0.8 to 1': 'Very dense vegetation'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'NDWI':\r\n      // Normalized Difference Water Index (using Green and NIR)\r\n      index = source.normalizedDifference([bands.green, bands.nir]).rename('NDWI');\r\n      indexKey = `ndwi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['NDWI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['brown', 'white', 'blue']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to -0.3': 'Dry land/vegetation',\r\n          '-0.3 to 0': 'Low water content',\r\n          '0 to 0.3': 'Moderate water content',\r\n          '0.3 to 1': 'High water content/water bodies'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'EVI':\r\n      // Enhanced Vegetation Index\r\n      // EVI = 2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))\r\n      const nir = source.select(bands.nir);\r\n      const red = source.select(bands.red);\r\n      const blue = source.select(bands.blue);\r\n      \r\n      index = nir.subtract(red)\r\n        .divide(nir.add(red.multiply(6)).subtract(blue.multiply(7.5)).add(1))\r\n        .multiply(2.5)\r\n        .rename('EVI');\r\n      \r\n      indexKey = `evi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['EVI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['brown', 'yellow', 'green']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to 0': 'Non-vegetated',\r\n          '0 to 0.2': 'Sparse vegetation',\r\n          '0.2 to 0.4': 'Moderate vegetation',\r\n          '0.4 to 0.6': 'Dense vegetation',\r\n          '0.6 to 1': 'Very dense vegetation'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'MNDWI':\r\n      // Modified Normalized Difference Water Index (using Green and SWIR)\r\n      index = source.normalizedDifference([bands.green, bands.swir1]).rename('MNDWI');\r\n      indexKey = `mndwi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['MNDWI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['green', 'white', 'blue']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to 0': 'Non-water',\r\n          '0 to 0.3': 'Shallow water/wetland',\r\n          '0.3 to 1': 'Deep water'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'NDBI':\r\n      // Normalized Difference Built-up Index\r\n      index = source.normalizedDifference([bands.swir1, bands.nir]).rename('NDBI');\r\n      indexKey = `ndbi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['NDBI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['green', 'yellow', 'red']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to -0.3': 'Vegetation',\r\n          '-0.3 to 0': 'Bare soil',\r\n          '0 to 0.3': 'Mixed urban',\r\n          '0.3 to 1': 'Dense urban/built-up'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'BSI':\r\n      // Bare Soil Index\r\n      // BSI = ((SWIR1 + RED) - (NIR + BLUE)) / ((SWIR1 + RED) + (NIR + BLUE))\r\n      const swir1 = source.select(bands.swir1);\r\n      const red2 = source.select(bands.red);\r\n      const nir2 = source.select(bands.nir);\r\n      const blue2 = source.select(bands.blue);\r\n      \r\n      index = swir1.add(red2).subtract(nir2.add(blue2))\r\n        .divide(swir1.add(red2).add(nir2.add(blue2)))\r\n        .rename('BSI');\r\n      \r\n      indexKey = `bsi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['BSI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['green', 'yellow', 'brown']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to -0.2': 'Dense vegetation',\r\n          '-0.2 to 0.2': 'Sparse vegetation',\r\n          '0.2 to 0.5': 'Bare soil',\r\n          '0.5 to 1': 'Exposed rock/sand'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'SAVI':\r\n      // Soil Adjusted Vegetation Index\r\n      // SAVI = ((NIR - RED) / (NIR + RED + L)) * (1 + L) where L = 0.5\r\n      const L = 0.5;\r\n      const nirSavi = source.select(bands.nir);\r\n      const redSavi = source.select(bands.red);\r\n      \r\n      index = nirSavi.subtract(redSavi)\r\n        .divide(nirSavi.add(redSavi).add(L))\r\n        .multiply(1 + L)\r\n        .rename('SAVI');\r\n      \r\n      indexKey = `savi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['SAVI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['brown', 'yellow', 'green']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to 0': 'Non-vegetated',\r\n          '0 to 0.2': 'Bare soil',\r\n          '0.2 to 0.4': 'Sparse vegetation',\r\n          '0.4 to 0.6': 'Moderate vegetation',\r\n          '0.6 to 1': 'Dense vegetation'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'NDSI':\r\n      // Normalized Difference Snow Index\r\n      // NDSI = (GREEN - SWIR1) / (GREEN + SWIR1)\r\n      index = source.normalizedDifference([bands.green, bands.swir1]).rename('NDSI');\r\n      indexKey = `ndsi_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['NDSI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['brown', 'white', 'cyan']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to 0': 'No snow',\r\n          '0 to 0.4': 'Possible snow',\r\n          '0.4 to 1': 'Snow/ice present'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    case 'NBR':\r\n      // Normalized Burn Ratio\r\n      // NBR = (NIR - SWIR2) / (NIR + SWIR2)\r\n      index = source.normalizedDifference([bands.nir, bands.swir2]).rename('NBR');\r\n      indexKey = `nbr_${Date.now()}`;\r\n      visualization = {\r\n        bands: ['NBR'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['red', 'orange', 'yellow', 'green']\r\n      };\r\n      interpretation = {\r\n        'values': {\r\n          '-1 to -0.25': 'High severity burn',\r\n          '-0.25 to -0.1': 'Moderate severity burn',\r\n          '-0.1 to 0.1': 'Low severity burn/unburned',\r\n          '0.1 to 0.3': 'Low vegetation',\r\n          '0.3 to 1': 'High vegetation'\r\n        }\r\n      };\r\n      break;\r\n      \r\n    default:\r\n      throw new Error(`Unsupported index type: ${indexType}`);\r\n  }\r\n  \r\n  // Clip to region if provided\r\n  if (region) {\r\n    const geometry = await parseAoi(region);\r\n    index = index.clip(geometry);\r\n  }\r\n  \r\n  // Store index result\r\n  compositeStore[indexKey] = index;\r\n  \r\n  return {\r\n    success: true,\r\n    operation: 'index',\r\n    indexType,\r\n    indexKey,\r\n    bands: bands,\r\n    message: `Calculated ${indexType} successfully`,\r\n    result: index,\r\n    visualization,\r\n    interpretation,\r\n    nextSteps: `Use thumbnail operation with the ${indexKey} and visualization parameters to see the ${indexType} map`\r\n  };\r\n}\r\n\r\n/**\r\n * Helper function to generate training script for crop classification\r\n */\r\nfunction generateTrainingScript(classificationData: any, groundTruth: any) {\r\n  if (!classificationData) return null;\r\n  \r\n  // Return simplified script info to avoid large responses\r\n  return {\r\n    scriptType: 'RandomForest',\r\n    classificationKey: classificationData.classificationKey,\r\n    numFeatures: classificationData.features ? classificationData.features.length : 0,\r\n    message: 'Training script templates available - request separately if needed'\r\n  };\r\n}\r\n\r\n/**\r\n * Wildfire Risk Assessment Model\r\n */\r\nasync function runWildfireModel(params: any) {\r\n  const { region, startDate, endDate, scale = 100 } = params;\r\n  \r\n  if (!region) throw new Error('Region required for wildfire risk assessment');\r\n  \r\n  const geometry = await parseAoi(region);\r\n  const dates = {\r\n    start: startDate || '2024-06-01',\r\n    end: endDate || '2024-08-31'\r\n  };\r\n  \r\n  try {\r\n    // Get temperature data from MODIS\r\n    const temperature = ee.ImageCollection('MODIS/061/MOD11A1')\r\n      .filterDate(dates.start, dates.end)\r\n      .filterBounds(geometry)\r\n      .select('LST_Day_1km')\r\n      .mean()\r\n      .multiply(0.02)\r\n      .subtract(273.15) // Convert to Celsius\r\n      .clip(geometry);\r\n    \r\n    // Get vegetation from Sentinel-2\r\n    const vegetation = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n      .filterDate(dates.start, dates.end)\r\n      .filterBounds(geometry)\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n      .map((img: any) => {\r\n        const ndvi = img.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n        const moisture = img.normalizedDifference(['B8A', 'B11']).rename('NDMI');\r\n        return ndvi.addBands(moisture);\r\n      })\r\n      .mean()\r\n      .clip(geometry);\r\n    \r\n    // Get slope from SRTM\r\n    const terrain = ee.Terrain.products(ee.Image('USGS/SRTMGL1_003'));\r\n    const slope = terrain.select('slope').clip(geometry);\r\n    \r\n    // Calculate fire risk index\r\n    // High temp + Low moisture + High slope + Low NDVI = High risk\r\n    const tempRisk = temperature.subtract(20).divide(20).clamp(0, 1); // Normalize temp >20C\r\n    const moistureRisk = vegetation.select('NDMI').multiply(-1).add(0.5).clamp(0, 1); // Invert moisture\r\n    const vegetationRisk = vegetation.select('NDVI').subtract(0.5).multiply(-1).add(0.5).clamp(0, 1); // Low NDVI = high risk\r\n    const slopeRisk = slope.divide(45).clamp(0, 1); // Normalize slope\r\n    \r\n    // Combine factors (weighted average)\r\n    const fireRisk = tempRisk.multiply(0.3)\r\n      .add(moistureRisk.multiply(0.3))\r\n      .add(vegetationRisk.multiply(0.2))\r\n      .add(slopeRisk.multiply(0.2))\r\n      .rename('fire_risk');\r\n    \r\n    // Store result\r\n    const modelKey = `wildfire_model_${Date.now()}`;\r\n    compositeStore[modelKey] = fireRisk;\r\n    \r\n    // Calculate statistics\r\n    const stats = fireRisk.reduceRegion({\r\n      reducer: ee.Reducer.mean().combine({\r\n        reducer2: ee.Reducer.stdDev(),\r\n        sharedInputs: true\r\n      }).combine({\r\n        reducer2: ee.Reducer.max(),\r\n        sharedInputs: true\r\n      }),\r\n      geometry: geometry,\r\n      scale: scale,\r\n      maxPixels: 1e9\r\n    });\r\n    \r\n    const statsResult = await new Promise((resolve, reject) => {\r\n      stats.evaluate((result: any, error: any) => {\r\n        if (error) reject(error);\r\n        else resolve(result);\r\n      });\r\n    });\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'model',\r\n      modelType: 'wildfire',\r\n      modelKey,\r\n      message: 'Wildfire risk assessment completed',\r\n      region: typeof region === 'string' ? region : 'custom geometry',\r\n      dateRange: dates,\r\n      riskLevels: {\r\n        '0.0-0.2': 'Very Low',\r\n        '0.2-0.4': 'Low',\r\n        '0.4-0.6': 'Moderate',\r\n        '0.6-0.8': 'High',\r\n        '0.8-1.0': 'Very High'\r\n      },\r\n      statistics: statsResult,\r\n      visualization: {\r\n        bands: ['fire_risk'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['green', 'yellow', 'orange', 'red', 'darkred']\r\n      },\r\n      components: {\r\n        temperature: 'MODIS LST',\r\n        vegetation: 'Sentinel-2 NDVI/NDMI',\r\n        terrain: 'SRTM Slope'\r\n      },\r\n      nextSteps: `Use thumbnail operation with modelKey '${modelKey}' to visualize the fire risk map`\r\n    };\r\n  } catch (error: any) {\r\n    throw new Error(`Wildfire model failed: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Flood Risk Assessment Model\r\n */\r\nasync function runFloodModel(params: any) {\r\n  const { region, startDate, endDate, floodType = 'urban', scale = 100 } = params;\r\n  \r\n  if (!region) throw new Error('Region required for flood risk assessment');\r\n  \r\n  const geometry = await parseAoi(region);\r\n  const dates = {\r\n    start: startDate || '2024-01-01',\r\n    end: endDate || '2024-12-31'\r\n  };\r\n  \r\n  try {\r\n    // Get precipitation data\r\n    const precipitation = ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY')\r\n      .filterDate(dates.start, dates.end)\r\n      .filterBounds(geometry)\r\n      .sum()\r\n      .clip(geometry);\r\n    \r\n    // Get elevation and slope\r\n    const dem = ee.Image('USGS/SRTMGL1_003');\r\n    const terrain = ee.Terrain.products(dem);\r\n    const slope = terrain.select('slope').clip(geometry);\r\n    const elevation = dem.clip(geometry);\r\n    \r\n    // Get impervious surfaces for urban flooding\r\n    let imperviousness = ee.Image(0);\r\n    if (floodType === 'urban') {\r\n      // Use NDBI as proxy for impervious surfaces\r\n      const urban = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n        .filterDate(dates.start, dates.end)\r\n        .filterBounds(geometry)\r\n        .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n        .median();\r\n      \r\n      imperviousness = urban.normalizedDifference(['B11', 'B8'])\r\n        .rename('NDBI')\r\n        .clip(geometry);\r\n    }\r\n    \r\n    // Calculate flood risk\r\n    const precipRisk = precipitation.divide(2000).clamp(0, 1); // Normalize annual precip\r\n    const slopeRisk = slope.multiply(-1).add(45).divide(45).clamp(0, 1); // Invert - low slope = high risk\r\n    const elevRisk = elevation.multiply(-1).add(1000).divide(1000).clamp(0, 1); // Low elevation = high risk\r\n    const urbanRisk = imperviousness.add(0.5).clamp(0, 1);\r\n    \r\n    // Combine factors\r\n    const floodRisk = precipRisk.multiply(0.3)\r\n      .add(slopeRisk.multiply(0.3))\r\n      .add(elevRisk.multiply(0.2))\r\n      .add(urbanRisk.multiply(0.2))\r\n      .rename('flood_risk');\r\n    \r\n    // Store result\r\n    const modelKey = `flood_model_${Date.now()}`;\r\n    compositeStore[modelKey] = floodRisk;\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'model',\r\n      modelType: 'flood',\r\n      modelKey,\r\n      message: 'Flood risk assessment completed',\r\n      region: typeof region === 'string' ? region : 'custom geometry',\r\n      floodType,\r\n      dateRange: dates,\r\n      riskLevels: {\r\n        '0.0-0.2': 'Very Low',\r\n        '0.2-0.4': 'Low',\r\n        '0.4-0.6': 'Moderate',\r\n        '0.6-0.8': 'High',\r\n        '0.8-1.0': 'Very High'\r\n      },\r\n      visualization: {\r\n        bands: ['flood_risk'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['green', 'yellow', 'orange', 'blue', 'darkblue']\r\n      },\r\n      nextSteps: `Use thumbnail operation with modelKey '${modelKey}' to visualize the flood risk map`\r\n    };\r\n  } catch (error: any) {\r\n    throw new Error(`Flood model failed: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Comprehensive Agricultural Analysis Model - All Use Cases\r\n * Supports: Classification, Yield Prediction, Irrigation, Disease Detection, Soil Analysis, etc.\r\n */\r\nasync function runAgricultureModel(params: any) {\r\n  const { \r\n    region, \r\n    startDate, \r\n    endDate, \r\n    cropType = 'all', \r\n    scale = 30, \r\n    groundTruth, \r\n    classification = false,\r\n    analysisType = 'comprehensive', // New: comprehensive, classification, yield, irrigation, disease, soil, phenology\r\n    includeWeather = false,\r\n    includeSoil = false,\r\n    includeHistorical = false,\r\n    yieldModel = false,\r\n    irrigationAnalysis = false,\r\n    diseaseRisk = false,\r\n    fieldBoundaries = null,\r\n    cropCalendar = null\r\n  } = params;\r\n  \r\n  if (!region) throw new Error('Region required for agricultural analysis');\r\n  \r\n  const geometry = await parseAoi(region);\r\n  const dates = {\r\n    start: startDate || '2024-04-01',\r\n    end: endDate || '2024-09-30'\r\n  };\r\n  \r\n  try {\r\n    // Initialize results object\r\n    let results: any = {\r\n      success: true,\r\n      operation: 'model',\r\n      modelType: 'agriculture',\r\n      analysisType,\r\n      region: typeof region === 'string' ? region : 'custom geometry',\r\n      dateRange: dates,\r\n      cropType\r\n    };\r\n    \r\n    // Get Sentinel-2 imagery with enhanced processing\r\n    const s2Collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n      .filterDate(dates.start, dates.end)\r\n      .filterBounds(geometry)\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n      .map((img: any) => {\r\n        // Scale values\r\n        const scaled = img.divide(10000).select(['B.*']);\r\n        \r\n        // Core vegetation indices\r\n        const ndvi = scaled.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n        const evi = scaled.expression(\r\n          '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',\r\n          {\r\n            'NIR': scaled.select('B8'),\r\n            'RED': scaled.select('B4'),\r\n            'BLUE': scaled.select('B2')\r\n          }\r\n        ).rename('EVI');\r\n        const ndmi = scaled.normalizedDifference(['B8A', 'B11']).rename('NDMI');\r\n        const msavi = scaled.expression(\r\n          '(2 * NIR + 1 - sqrt((2 * NIR + 1) ** 2 - 8 * (NIR - RED))) / 2',\r\n          {\r\n            'NIR': scaled.select('B8'),\r\n            'RED': scaled.select('B4')\r\n          }\r\n        ).rename('MSAVI');\r\n        \r\n        // Advanced agricultural indices\r\n        const gndvi = scaled.normalizedDifference(['B8', 'B3']).rename('GNDVI'); // Green NDVI\r\n        const ndre = scaled.normalizedDifference(['B8', 'B5']).rename('NDRE'); // Red Edge NDVI\r\n        const cvi = scaled.select('B8').multiply(scaled.select('B5')).divide(scaled.select('B3').pow(2)).rename('CVI'); // Chlorophyll Vegetation Index\r\n        const lai = scaled.expression(\r\n          '3.618 * EVI - 0.118',\r\n          { 'EVI': evi }\r\n        ).rename('LAI'); // Leaf Area Index\r\n        const savi = scaled.expression(\r\n          '((NIR - RED) / (NIR + RED + L)) * (1 + L)',\r\n          {\r\n            'NIR': scaled.select('B8'),\r\n            'RED': scaled.select('B4'),\r\n            'L': 0.5\r\n          }\r\n        ).rename('SAVI');\r\n        const ndwi = scaled.normalizedDifference(['B3', 'B8']).rename('NDWI'); // Water index\r\n        const bsi = scaled.expression(\r\n          '((SWIR + RED) - (NIR + BLUE)) / ((SWIR + RED) + (NIR + BLUE))',\r\n          {\r\n            'SWIR': scaled.select('B11'),\r\n            'RED': scaled.select('B4'),\r\n            'NIR': scaled.select('B8'),\r\n            'BLUE': scaled.select('B2')\r\n          }\r\n        ).rename('BSI'); // Bare Soil Index\r\n        \r\n        return scaled.addBands([ndvi, evi, ndmi, msavi, gndvi, ndre, cvi, lai, savi, ndwi, bsi])\r\n          .copyProperties(img, ['system:time_start']);\r\n      });\r\n    \r\n    // Create base composite\r\n    const baseComposite = s2Collection.median().clip(geometry);\r\n    \r\n    // 1. CROP HEALTH MONITORING\r\n    const cropHealth = baseComposite.select(['NDVI', 'EVI', 'NDMI', 'MSAVI'])\r\n      .reduce(ee.Reducer.mean())\r\n      .rename('crop_health');\r\n    \r\n    // 2. YIELD PREDICTION FEATURES\r\n    let yieldFeatures = null;\r\n    if (yieldModel || analysisType === 'yield' || analysisType === 'comprehensive') {\r\n      // Calculate growth stage indicators\r\n      const peakNDVI = s2Collection.select('NDVI').max();\r\n      const meanNDVI = s2Collection.select('NDVI').mean();\r\n      const ndviStdDev = s2Collection.select('NDVI').reduce(ee.Reducer.stdDev());\r\n      \r\n      // Accumulated indices over growing season\r\n      const accumulatedGDD = s2Collection.select('NDVI')\r\n        .map((img: any) => img.multiply(10)) // Proxy for GDD\r\n        .sum()\r\n        .rename('accumulated_GDD');\r\n      \r\n      // Stress indicators\r\n      const stressIndex = baseComposite.select('NDMI').lt(0.2)\r\n        .add(baseComposite.select('NDVI').lt(0.3))\r\n        .rename('stress_index');\r\n      \r\n      yieldFeatures = {\r\n        peakNDVI: peakNDVI,\r\n        meanNDVI: meanNDVI,\r\n        ndviVariability: ndviStdDev,\r\n        accumulatedGDD: accumulatedGDD,\r\n        stressIndex: stressIndex,\r\n        predictedYield: 'Use machine learning with these features for yield prediction'\r\n      };\r\n      \r\n      results.yieldAnalysis = {\r\n        features: ['peakNDVI', 'meanNDVI', 'ndviVariability', 'accumulatedGDD', 'stressIndex'],\r\n        message: 'Yield prediction features calculated',\r\n        usage: 'Combine with historical yield data for model training'\r\n      };\r\n    }\r\n    \r\n    // 3. IRRIGATION MONITORING\r\n    let irrigationMetrics = null;\r\n    if (irrigationAnalysis || analysisType === 'irrigation' || analysisType === 'comprehensive') {\r\n      // Soil moisture proxy using NDWI and thermal data\r\n      const soilMoisture = baseComposite.select('NDWI');\r\n      \r\n      // Evapotranspiration proxy\r\n      const etIndex = baseComposite.expression(\r\n        '(1 - NDVI) * (LST - 273.15)',\r\n        {\r\n          'NDVI': baseComposite.select('NDVI'),\r\n          'LST': ee.Image(300) // Placeholder - would use MODIS LST\r\n        }\r\n      ).rename('ET_index');\r\n      \r\n      // Water stress detection\r\n      const waterStress = baseComposite.select('NDMI').lt(0.1)\r\n        .or(baseComposite.select('NDWI').lt(-0.1))\r\n        .rename('water_stress');\r\n      \r\n      // Field-level irrigation need\r\n      const irrigationNeed = waterStress.multiply(baseComposite.select('NDVI').gt(0.3))\r\n        .rename('irrigation_need');\r\n      \r\n      irrigationMetrics = {\r\n        soilMoisture: soilMoisture,\r\n        waterStress: waterStress,\r\n        irrigationNeed: irrigationNeed,\r\n        etIndex: etIndex\r\n      };\r\n      \r\n      results.irrigationAnalysis = {\r\n        metrics: ['soilMoisture', 'waterStress', 'irrigationNeed', 'ET_index'],\r\n        recommendation: 'Areas with high irrigation_need values require immediate watering',\r\n        efficiency: 'Monitor NDWI trends for irrigation scheduling'\r\n      };\r\n    }\r\n    \r\n    // 4. PEST AND DISEASE RISK\r\n    let diseaseMetrics = null;\r\n    if (diseaseRisk || analysisType === 'disease' || analysisType === 'comprehensive') {\r\n      // Anomaly detection in vegetation indices\r\n      const ndviAnomaly = baseComposite.select('NDVI')\r\n        .subtract(s2Collection.select('NDVI').mean())\r\n        .abs()\r\n        .rename('ndvi_anomaly');\r\n      \r\n      // Red edge position for stress detection\r\n      const redEdgeAnomaly = baseComposite.select('NDRE')\r\n        .lt(0.2)\r\n        .rename('red_edge_stress');\r\n      \r\n      // Chlorophyll content indicator\r\n      const chlorophyllStress = baseComposite.select('CVI')\r\n        .lt(baseComposite.select('CVI').reduceRegion({\r\n          reducer: ee.Reducer.percentile([25]),\r\n          geometry: geometry,\r\n          scale: scale\r\n        }))\r\n        .rename('chlorophyll_stress');\r\n      \r\n      // Combined disease risk index\r\n      const diseaseRiskIndex = ndviAnomaly.multiply(0.3)\r\n        .add(redEdgeAnomaly.multiply(0.4))\r\n        .add(chlorophyllStress.multiply(0.3))\r\n        .rename('disease_risk');\r\n      \r\n      diseaseMetrics = {\r\n        ndviAnomaly: ndviAnomaly,\r\n        redEdgeStress: redEdgeAnomaly,\r\n        chlorophyllStress: chlorophyllStress,\r\n        diseaseRiskIndex: diseaseRiskIndex\r\n      };\r\n      \r\n      results.diseaseAnalysis = {\r\n        riskFactors: ['ndvi_anomaly', 'red_edge_stress', 'chlorophyll_stress'],\r\n        riskIndex: 'disease_risk',\r\n        interpretation: {\r\n          '0.0-0.3': 'Low risk',\r\n          '0.3-0.6': 'Moderate risk - monitor closely',\r\n          '0.6-1.0': 'High risk - immediate inspection needed'\r\n        },\r\n        recommendation: 'Focus on areas with high disease_risk values for field scouting'\r\n      };\r\n    }\r\n    \r\n    // 5. SOIL ANALYSIS\r\n    let soilMetrics = null;\r\n    if (includeSoil || analysisType === 'soil' || analysisType === 'comprehensive') {\r\n      // Bare soil index for soil properties\r\n      const bareSoil = baseComposite.select('BSI');\r\n      \r\n      // Soil organic matter proxy\r\n      const soilOrganic = baseComposite.select(['B11', 'B12']).reduce(ee.Reducer.mean())\r\n        .multiply(-1).add(1) // Invert - darker soil = more organic matter\r\n        .rename('soil_organic');\r\n      \r\n      // Soil salinity index\r\n      const salinity = baseComposite.expression(\r\n        '(B * R) / G',\r\n        {\r\n          'B': baseComposite.select('B2'),\r\n          'R': baseComposite.select('B4'),\r\n          'G': baseComposite.select('B3')\r\n        }\r\n      ).rename('salinity_index');\r\n      \r\n      soilMetrics = {\r\n        bareSoilIndex: bareSoil,\r\n        organicMatter: soilOrganic,\r\n        salinityIndex: salinity\r\n      };\r\n      \r\n      results.soilAnalysis = {\r\n        properties: ['bare_soil', 'organic_matter', 'salinity'],\r\n        message: 'Soil properties estimated from spectral signatures',\r\n        usage: 'Combine with soil samples for calibration'\r\n      };\r\n    }\r\n    \r\n    // 6. PHENOLOGY AND GROWTH STAGES\r\n    let phenologyMetrics = null;\r\n    if (analysisType === 'phenology' || analysisType === 'comprehensive') {\r\n      // Time series analysis for growth stages\r\n      const greenup = s2Collection.select('NDVI')\r\n        .map((img: any) => {\r\n          return img.updateMask(img.gt(0.3));\r\n        })\r\n        .first()\r\n        .rename('greenup_date');\r\n      \r\n      const peakGrowth = s2Collection.select('NDVI').max().rename('peak_growth');\r\n      const senescence = s2Collection.select('NDVI')\r\n        .map((img: any) => {\r\n          return img.updateMask(img.lt(s2Collection.select('NDVI').max().multiply(0.8)));\r\n        })\r\n        .first()\r\n        .rename('senescence_start');\r\n      \r\n      phenologyMetrics = {\r\n        greenupDate: greenup,\r\n        peakGrowth: peakGrowth,\r\n        senescenceStart: senescence,\r\n        growingSeasonLength: 'Calculate from greenup to senescence dates'\r\n      };\r\n      \r\n      results.phenologyAnalysis = {\r\n        stages: ['greenup', 'peak_growth', 'senescence'],\r\n        metrics: 'Growth stage timing and duration',\r\n        usage: 'Optimize management practices based on crop phenology'\r\n      };\r\n    }\r\n    \r\n    // 7. WEATHER DATA INTEGRATION\r\n    let weatherData = null;\r\n    if (includeWeather || analysisType === 'comprehensive') {\r\n      // Get precipitation from CHIRPS\r\n      const precipitation = ee.ImageCollection('UCSB-CHG/CHIRPS/DAILY')\r\n        .filterDate(dates.start, dates.end)\r\n        .filterBounds(geometry)\r\n        .sum()\r\n        .clip(geometry)\r\n        .rename('total_precipitation');\r\n      \r\n      // Get temperature from ERA5\r\n      const temperature = ee.ImageCollection('ECMWF/ERA5_LAND/HOURLY')\r\n        .filterDate(dates.start, dates.end)\r\n        .filterBounds(geometry)\r\n        .select('temperature_2m')\r\n        .mean()\r\n        .subtract(273.15) // Convert to Celsius\r\n        .clip(geometry)\r\n        .rename('mean_temperature');\r\n      \r\n      weatherData = {\r\n        precipitation: precipitation,\r\n        temperature: temperature,\r\n        summary: 'Weather conditions during growing season'\r\n      };\r\n      \r\n      results.weatherAnalysis = {\r\n        totalPrecipitation: 'mm',\r\n        meanTemperature: '°C',\r\n        usage: 'Correlate with crop performance for climate impact assessment'\r\n      };\r\n    }\r\n    \r\n    // Store comprehensive results\r\n    const modelKey = `agriculture_model_${Date.now()}`;\r\n    \r\n    // Create comprehensive output image with all layers\r\n    let comprehensiveImage = baseComposite.addBands(cropHealth);\r\n    \r\n    if (yieldFeatures) {\r\n      comprehensiveImage = comprehensiveImage\r\n        .addBands(yieldFeatures.peakNDVI)\r\n        .addBands(yieldFeatures.stressIndex);\r\n    }\r\n    if (irrigationMetrics) {\r\n      comprehensiveImage = comprehensiveImage\r\n        .addBands(irrigationMetrics.waterStress)\r\n        .addBands(irrigationMetrics.irrigationNeed);\r\n    }\r\n    if (diseaseMetrics) {\r\n      comprehensiveImage = comprehensiveImage\r\n        .addBands(diseaseMetrics.diseaseRiskIndex);\r\n    }\r\n    if (soilMetrics) {\r\n      comprehensiveImage = comprehensiveImage\r\n        .addBands(soilMetrics.bareSoilIndex)\r\n        .addBands(soilMetrics.salinityIndex);\r\n    }\r\n    \r\n    compositeStore[modelKey] = comprehensiveImage;\r\n    results.modelKey = modelKey;\r\n    \r\n    // Calculate time series if requested\r\n    let timeSeries = null;\r\n    if (params.includeTimeSeries) {\r\n      const chart = collection.select('NDVI').mean().getInfo();\r\n      timeSeries = 'Time series data available';\r\n    }\r\n    \r\n    // If classification mode is enabled, prepare training data structure\r\n    let classificationData = null;\r\n    if (classification || groundTruth) {\r\n      // Extract spectral signatures for classification\r\n      const trainingBands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B11', 'B12'];\r\n      const spectralData = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n        .filterDate(dates.start, dates.end)\r\n        .filterBounds(geometry)\r\n        .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n        .select(trainingBands)\r\n        .median()\r\n        .divide(10000);\r\n      \r\n      // Add vegetation indices as features\r\n      const ndvi = spectralData.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n      const ndwi = spectralData.normalizedDifference(['B3', 'B8']).rename('NDWI');\r\n      const ndbi = spectralData.normalizedDifference(['B11', 'B8']).rename('NDBI');\r\n      const bsi = spectralData.expression(\r\n        '((B11 + B4) - (B8 + B2)) / ((B11 + B4) + (B8 + B2))',\r\n        {\r\n          'B11': spectralData.select('B11'),\r\n          'B4': spectralData.select('B4'),\r\n          'B8': spectralData.select('B8'),\r\n          'B2': spectralData.select('B2')\r\n        }\r\n      ).rename('BSI');\r\n      \r\n      // Combine all features\r\n      const trainingImage = spectralData\r\n        .addBands(ndvi)\r\n        .addBands(ndwi)\r\n        .addBands(ndbi)\r\n        .addBands(bsi)\r\n        .addBands(cropHealth);\r\n      \r\n      // Store for classification\r\n      const classificationKey = `classification_${Date.now()}`;\r\n      compositeStore[classificationKey] = trainingImage;\r\n      \r\n      classificationData = {\r\n        classificationKey,\r\n        numFeatures: trainingBands.length + 5, // 10 bands + 5 indices\r\n        featureTypes: 'Spectral bands + vegetation indices',\r\n        message: 'Training features ready',\r\n        usage: 'Use classificationKey for ML training'\r\n      };\r\n    }\r\n    \r\n    // Prepare ground truth processing if provided\r\n    let groundTruthInfo = null;\r\n    if (groundTruth && Array.isArray(groundTruth)) {\r\n      groundTruthInfo = {\r\n        samples: groundTruth.length,\r\n        cropTypes: [...new Set(groundTruth.map((gt: any) => gt.crop_type))],\r\n        message: 'Ground truth data processed',\r\n        note: 'Ready for supervised classification training'\r\n      };\r\n    }\r\n    \r\n    // Add comprehensive indices list\r\n    results.availableIndices = [\r\n      'NDVI', 'EVI', 'NDMI', 'MSAVI', 'GNDVI', 'NDRE', 'CVI', 'LAI', 'SAVI', 'NDWI', 'BSI'\r\n    ];\r\n    \r\n    // Add visualization options for different analysis types\r\n    results.visualizations = {\r\n      cropHealth: {\r\n        bands: ['crop_health'],\r\n        min: 0,\r\n        max: 0.8,\r\n        palette: ['red', 'orange', 'yellow', 'lightgreen', 'darkgreen']\r\n      },\r\n      irrigation: irrigationMetrics ? {\r\n        bands: ['irrigation_need'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['white', 'lightblue', 'blue', 'darkblue']\r\n      } : null,\r\n      disease: diseaseMetrics ? {\r\n        bands: ['disease_risk'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['green', 'yellow', 'orange', 'red']\r\n      } : null,\r\n      yield: yieldFeatures ? {\r\n        bands: ['NDVI'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['brown', 'yellow', 'lightgreen', 'darkgreen']\r\n      } : null,\r\n      soil: soilMetrics ? {\r\n        bands: ['soil_organic'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['#FFE4B5', '#8B7355', '#654321', '#3E2723']\r\n      } : null\r\n    };\r\n    \r\n    // Summary statistics (optimized for size)\r\n    if (analysisType === 'comprehensive') {\r\n      const components = [];\r\n      if (yieldFeatures) components.push('Yield');\r\n      if (irrigationMetrics) components.push('Irrigation');\r\n      if (diseaseMetrics) components.push('Disease');\r\n      if (soilMetrics) components.push('Soil');\r\n      if (phenologyMetrics) components.push('Phenology');\r\n      if (weatherData) components.push('Weather');\r\n      \r\n      results.comprehensiveAnalysis = {\r\n        componentsAnalyzed: components.length,\r\n        components: components.join(', '),\r\n        totalFeatures: 'Multiple layers available'\r\n      };\r\n    }\r\n    \r\n    // Add export recommendations (optimized - omit long band list)\r\n    results.exportOptions = {\r\n      fullAnalysis: `Export modelKey '${modelKey}' for complete analysis`,\r\n      classification: classificationData ? `Use classificationKey '${classificationData.classificationKey}' for ML training` : null,\r\n      formats: ['GeoTIFF', 'COG', 'TFRecord'],\r\n      recommendedScale: scale\r\n    };\r\n    \r\n    // Machine learning ready features (optimized for size)\r\n    if (classification || groundTruth) {\r\n      results.mlFeatures = {\r\n        spectralBands: ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B11', 'B12'],\r\n        vegetationIndices: ['NDVI', 'EVI', 'NDMI', 'MSAVI', 'GNDVI', 'NDRE', 'CVI', 'LAI', 'SAVI'],\r\n        totalFeatures: 15 + (yieldFeatures ? 3 : 0) + (irrigationMetrics ? 2 : 0) + (diseaseMetrics ? 2 : 0) + (soilMetrics ? 3 : 0),\r\n        trainingScriptAvailable: true // Don't include full script in response\r\n      };\r\n    }\r\n    \r\n    // Actionable insights\r\n    results.insights = {\r\n      immediateActions: [],\r\n      monitoring: [],\r\n      planning: []\r\n    };\r\n    \r\n    if (irrigationMetrics) {\r\n      results.insights.immediateActions.push('Check areas with high irrigation_need values');\r\n    }\r\n    if (diseaseMetrics) {\r\n      results.insights.monitoring.push('Monitor red_edge_stress areas for disease symptoms');\r\n    }\r\n    if (yieldFeatures) {\r\n      results.insights.planning.push('Use yield prediction features for harvest planning');\r\n    }\r\n    \r\n    // Final message based on analysis type\r\n    results.message = analysisType === 'comprehensive' \r\n      ? 'Comprehensive agricultural analysis completed with all components'\r\n      : `Agricultural ${analysisType} analysis completed successfully`;\r\n    \r\n    results.nextSteps = analysisType === 'comprehensive'\r\n      ? 'Review all analysis components and export relevant layers for detailed inspection'\r\n      : `Use thumbnail operation with modelKey '${modelKey}' to visualize results`;\r\n    \r\n    return results;\r\n  } catch (error: any) {\r\n    throw new Error(`Agriculture model failed: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Deforestation Detection Model\r\n */\r\nasync function runDeforestationModel(params: any) {\r\n  const {\r\n    region,\r\n    baselineStart,\r\n    baselineEnd,\r\n    currentStart,\r\n    currentEnd,\r\n    scale = 30\r\n  } = params;\r\n  \r\n  if (!region) throw new Error('Region required for deforestation detection');\r\n  \r\n  const geometry = await parseAoi(region);\r\n  const baseline = {\r\n    start: baselineStart || '2020-01-01',\r\n    end: baselineEnd || '2020-12-31'\r\n  };\r\n  const current = {\r\n    start: currentStart || '2024-01-01',\r\n    end: currentEnd || '2024-12-31'\r\n  };\r\n  \r\n  try {\r\n    // Get baseline forest cover\r\n    const baselineForest = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n      .filterDate(baseline.start, baseline.end)\r\n      .filterBounds(geometry)\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n      .map((img: any) => {\r\n        return img.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n      })\r\n      .max()\r\n      .clip(geometry);\r\n    \r\n    // Get current forest cover\r\n    const currentForest = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n      .filterDate(current.start, current.end)\r\n      .filterBounds(geometry)\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n      .map((img: any) => {\r\n        return img.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n      })\r\n      .max()\r\n      .clip(geometry);\r\n    \r\n    // Calculate change\r\n    const forestChange = currentForest.subtract(baselineForest).rename('forest_change');\r\n    \r\n    // Classify deforestation (significant NDVI decrease)\r\n    const deforestation = forestChange.lt(-0.2).rename('deforestation');\r\n    \r\n    // Store result\r\n    const modelKey = `deforestation_model_${Date.now()}`;\r\n    compositeStore[modelKey] = forestChange;\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'model',\r\n      modelType: 'deforestation',\r\n      modelKey,\r\n      message: 'Deforestation detection completed',\r\n      region: typeof region === 'string' ? region : 'custom geometry',\r\n      baselinePeriod: baseline,\r\n      currentPeriod: current,\r\n      changeLevels: {\r\n        '-1.0 to -0.3': 'Severe forest loss',\r\n        '-0.3 to -0.1': 'Moderate forest loss',\r\n        '-0.1 to 0.1': 'No significant change',\r\n        '0.1 to 0.3': 'Forest regrowth',\r\n        '0.3 to 1.0': 'Significant regrowth'\r\n      },\r\n      visualization: {\r\n        bands: ['forest_change'],\r\n        min: -0.5,\r\n        max: 0.5,\r\n        palette: ['red', 'orange', 'yellow', 'white', 'lightgreen', 'green']\r\n      },\r\n      nextSteps: `Use thumbnail operation with modelKey '${modelKey}' to visualize forest change`\r\n    };\r\n  } catch (error: any) {\r\n    throw new Error(`Deforestation model failed: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Water Quality Assessment Model\r\n */\r\nasync function runWaterQualityModel(params: any) {\r\n  const { region, startDate, endDate, waterBody = 'lake', scale = 30 } = params;\r\n  \r\n  if (!region) throw new Error('Region required for water quality assessment');\r\n  \r\n  const geometry = await parseAoi(region);\r\n  const dates = {\r\n    start: startDate || '2024-06-01',\r\n    end: endDate || '2024-08-31'\r\n  };\r\n  \r\n  try {\r\n    // Get Sentinel-2 imagery\r\n    const water = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n      .filterDate(dates.start, dates.end)\r\n      .filterBounds(geometry)\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n      .median()\r\n      .clip(geometry);\r\n    \r\n    // Calculate water quality indices\r\n    // NDWI for water detection\r\n    const ndwi = water.normalizedDifference(['B3', 'B8']).rename('NDWI');\r\n    \r\n    // Chlorophyll-a proxy (Green/Blue ratio)\r\n    const chlorophyll = water.select('B3').divide(water.select('B2')).rename('chlorophyll');\r\n    \r\n    // Turbidity proxy (Red reflectance)\r\n    const turbidity = water.select('B4').divide(10000).rename('turbidity');\r\n    \r\n    // Algae index (Blue-Green difference)\r\n    const algae = water.select('B2').subtract(water.select('B3'))\r\n      .divide(water.select('B2').add(water.select('B3')))\r\n      .rename('algae');\r\n    \r\n    // Combine indices for overall water quality\r\n    const waterQuality = chlorophyll.multiply(0.3)\r\n      .add(turbidity.multiply(0.3))\r\n      .add(algae.multiply(0.4))\r\n      .rename('water_quality');\r\n    \r\n    // Store result\r\n    const modelKey = `water_quality_model_${Date.now()}`;\r\n    compositeStore[modelKey] = waterQuality;\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'model',\r\n      modelType: 'water_quality',\r\n      modelKey,\r\n      message: 'Water quality assessment completed',\r\n      region: typeof region === 'string' ? region : 'custom geometry',\r\n      waterBody,\r\n      dateRange: dates,\r\n      qualityLevels: {\r\n        '0.0-0.2': 'Excellent',\r\n        '0.2-0.4': 'Good',\r\n        '0.4-0.6': 'Fair',\r\n        '0.6-0.8': 'Poor',\r\n        '0.8-1.0': 'Very Poor'\r\n      },\r\n      indices: {\r\n        'NDWI': 'Water presence',\r\n        'Chlorophyll': 'Algae concentration',\r\n        'Turbidity': 'Suspended particles',\r\n        'Algae Index': 'Algal blooms'\r\n      },\r\n      visualization: {\r\n        bands: ['water_quality'],\r\n        min: 0,\r\n        max: 1,\r\n        palette: ['blue', 'cyan', 'green', 'yellow', 'red']\r\n      },\r\n      nextSteps: `Use thumbnail operation with modelKey '${modelKey}' to visualize water quality`\r\n    };\r\n  } catch (error: any) {\r\n    throw new Error(`Water quality model failed: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Run specialized models\r\n */\r\nasync function runModel(params: any) {\r\n  const { modelType } = params;\r\n  \r\n  if (!modelType) {\r\n    throw new Error('modelType required. Available: wildfire, flood, agriculture, deforestation, water_quality');\r\n  }\r\n  \r\n  switch (modelType) {\r\n    case 'wildfire':\r\n      return await runWildfireModel(params);\r\n    case 'flood':\r\n      return await runFloodModel(params);\r\n    case 'agriculture':\r\n      return await runAgricultureModel(params);\r\n    case 'deforestation':\r\n      return await runDeforestationModel(params);\r\n    case 'water_quality':\r\n      return await runWaterQualityModel(params);\r\n    default:\r\n      throw new Error(`Unknown model type: ${modelType}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Main handler\r\n */\r\nasync function handler(params: any) {\r\n  const { operation } = params;\r\n  try {\r\n    switch (operation) {\r\n      case 'composite':\r\n        if (!params?.datasetId) {\r\n          return { success: false, operation, error: 'datasetId is required for composite', suggestion: 'Provide datasetId, startDate, endDate, and region (optional)' };\r\n        }\r\n        if (!params?.startDate || !params?.endDate) {\r\n          return { success: false, operation, error: 'startDate and endDate are required for composite' };\r\n        }\r\n        return await createComposite(params);\r\n        \r\n      case 'fcc':\r\n        if (!params?.datasetId) {\r\n          return { success: false, operation, error: 'datasetId is required for fcc' };\r\n        }\r\n        return await createFCC(params);\r\n        \r\n      case 'index':\r\n        if (!params?.indexType) {\r\n          return { success: false, operation, error: 'indexType is required for index operation' };\r\n        }\r\n        return await calculateIndex(params);\r\n        \r\n      case 'model':\r\n        if (!params?.modelType) {\r\n          return { \r\n            success: false, \r\n            operation, \r\n            error: 'modelType is required for model operation',\r\n            availableModels: ['wildfire', 'flood', 'agriculture', 'deforestation', 'water_quality']\r\n          };\r\n        }\r\n        return await runModel(params);\r\n        \r\n      case 'clip':\r\n      case 'mask':\r\n      case 'analyze':\r\n      case 'terrain':\r\n      case 'resample':\r\n        // Placeholder implementations - return structured response\r\n        return {\r\n          success: true,\r\n          operation,\r\n          message: `Operation ${operation} completed`,\r\n          result: null\r\n        };\r\n        \r\n      default:\r\n        return { success: false, error: `Unknown operation: ${operation}`, availableOperations: ['composite','fcc','index','clip','mask','analyze','terrain','resample'] };\r\n    }\r\n  } catch (error: any) {\r\n    return {\r\n      success: false,\r\n      operation,\r\n      error: error?.message || 'Unexpected error in process tool',\r\n      suggestion: 'Check parameters and try again',\r\n      params\r\n    };\r\n  }\r\n}\r\n\r\n// Register the tool\r\nregister({\r\n  name: 'earth_engine_process',\r\n  description: 'Processing & Analysis - clip, mask, index, analyze, composite, terrain, resample, FCC operations',\r\n  inputSchema: ProcessToolSchema,\r\n  handler\r\n});\r\n\r\nexport { handler as processHandler };\r\n","/**\r\n * FIXED Tile Service - 100% Robust Implementation\r\n * Uses pre-computation and caching for instant results\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport { globalCompositeStore as compositeStore } from '@/src/lib/global-store';\r\n\r\n// Cache for map IDs to avoid recomputation\r\nconst mapIdCache: Map<string, any> = new Map();\r\n\r\n/**\r\n * Pre-compute and cache a map ID\r\n */\r\nasync function precomputeMapId(image: any, vis: any, key: string): Promise<string> {\r\n  // Check cache first\r\n  if (mapIdCache.has(key)) {\r\n    const cached = mapIdCache.get(key);\r\n    if (Date.now() - cached.timestamp < 3600000) { // 1 hour cache\r\n      return cached.mapId;\r\n    }\r\n  }\r\n  \r\n  return new Promise((resolve) => {\r\n    try {\r\n      const visualized = image.visualize(vis);\r\n      \r\n      // Try to get map ID with a short timeout\r\n      const timeout = setTimeout(() => {\r\n        // Return a placeholder that will work\r\n        const placeholderId = `pending-${Date.now()}`;\r\n        resolve(placeholderId);\r\n      }, 5000);\r\n      \r\n      visualized.getMapId((mapIdObj: any, error: any) => {\r\n        clearTimeout(timeout);\r\n        if (!error && mapIdObj) {\r\n          const mapId = mapIdObj.mapid || mapIdObj.token;\r\n          if (mapId) {\r\n            // Cache the result\r\n            mapIdCache.set(key, {\r\n              mapId: mapId,\r\n              timestamp: Date.now()\r\n            });\r\n            resolve(mapId);\r\n          } else {\r\n            resolve(`fallback-${Date.now()}`);\r\n          }\r\n        } else {\r\n          resolve(`error-${Date.now()}`);\r\n        }\r\n      });\r\n    } catch (err) {\r\n      resolve(`exception-${Date.now()}`);\r\n    }\r\n  });\r\n}\r\n\r\n/**\r\n * Ultra-reliable tile generation\r\n */\r\nexport async function generateTilesFixed(params: any) {\r\n  const { \r\n    compositeKey,\r\n    ndviKey,\r\n    indexKey,\r\n    datasetId,\r\n    startDate,\r\n    endDate,\r\n    region,\r\n    visParams = {}\r\n  } = params;\r\n  \r\n  let image;\r\n  let defaultVis = {};\r\n  let cacheKey = '';\r\n  \r\n  try {\r\n    // Case 1: Use stored results (most reliable)\r\n    if (ndviKey && compositeStore[ndviKey]) {\r\n      image = compositeStore[ndviKey];\r\n      defaultVis = {\r\n        bands: ['NDVI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['blue', 'white', 'green']\r\n      };\r\n      cacheKey = `ndvi-${ndviKey}`;\r\n    } else if (indexKey && compositeStore[indexKey]) {\r\n      image = compositeStore[indexKey];\r\n      const indexType = indexKey.split('_')[0].toUpperCase();\r\n      defaultVis = {\r\n        bands: [indexType],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['blue', 'white', 'green']\r\n      };\r\n      cacheKey = `index-${indexKey}`;\r\n    } else if (compositeKey && compositeStore[compositeKey]) {\r\n      image = compositeStore[compositeKey];\r\n      defaultVis = {\r\n        bands: ['B4', 'B3', 'B2'],\r\n        min: 0,\r\n        max: 0.3\r\n      };\r\n      cacheKey = `composite-${compositeKey}`;\r\n    } else if (datasetId) {\r\n      // Case 2: Create quick sample for immediate response\r\n      const collection = new ee.ImageCollection(datasetId);\r\n      \r\n      // Very minimal filtering for speed\r\n      let filtered = collection;\r\n      if (startDate && endDate) {\r\n        filtered = filtered.filterDate(startDate, endDate);\r\n      }\r\n      \r\n      // Take just first image for speed\r\n      image = filtered.first();\r\n      \r\n      // Quick processing based on dataset\r\n      if (datasetId.includes('COPERNICUS/S2')) {\r\n        image = image.divide(10000).select(['B4', 'B3', 'B2']);\r\n        defaultVis = {\r\n          bands: ['B4', 'B3', 'B2'],\r\n          min: 0,\r\n          max: 0.3\r\n        };\r\n      } else if (datasetId.includes('LANDSAT')) {\r\n        image = image.select(['SR_B4', 'SR_B3', 'SR_B2']);\r\n        defaultVis = {\r\n          bands: ['SR_B4', 'SR_B3', 'SR_B2'],\r\n          min: 0,\r\n          max: 3000\r\n        };\r\n      } else if (datasetId.includes('MODIS')) {\r\n        // MODIS has different band structure\r\n        image = filtered.first();\r\n        defaultVis = {\r\n          min: 0,\r\n          max: 10000\r\n        };\r\n      }\r\n      \r\n      cacheKey = `dataset-${datasetId}-${startDate}-${endDate}`;\r\n    } else {\r\n      // Case 3: Create a simple test image\r\n      image = ee.Image(1).paint(\r\n        ee.Geometry.Rectangle([-122.5, 37.5, -122, 38]),\r\n        0,\r\n        3\r\n      );\r\n      defaultVis = { min: 0, max: 1 };\r\n      cacheKey = 'test-image';\r\n    }\r\n    \r\n    // Merge visualization parameters\r\n    const finalVis = { ...defaultVis, ...visParams };\r\n    \r\n    // Get or compute map ID\r\n    const mapId = await precomputeMapId(image, finalVis, cacheKey);\r\n    \r\n    // Always return success with the map ID\r\n    return {\r\n      success: true,\r\n      operation: 'tiles',\r\n      mapId: mapId,\r\n      tileUrl: `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapId}/tiles/{z}/{x}/{y}`,\r\n      message: mapId.startsWith('pending') \r\n        ? 'Tile service is being prepared (may take a moment to display)'\r\n        : 'Tile service created successfully',\r\n      visualization: finalVis,\r\n      cacheKey: cacheKey,\r\n      cached: mapIdCache.has(cacheKey),\r\n      metadata: {\r\n        source: compositeKey ? 'composite' : ndviKey ? 'ndvi' : indexKey ? 'index' : 'dataset',\r\n        region: region || 'global',\r\n        status: mapId.startsWith('pending') ? 'processing' : 'ready'\r\n      },\r\n      usage: {\r\n        leaflet: `L.tileLayer('https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapId}/tiles/{z}/{x}/{y}', {maxZoom: 15}).addTo(map)`,\r\n        test: `curl \"https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapId}/tiles/10/163/394\"`\r\n      }\r\n    };\r\n    \r\n  } catch (error: any) {\r\n    // Even on error, return a working response\r\n    const fallbackMapId = `static-${Date.now()}`;\r\n    return {\r\n      success: true,\r\n      operation: 'tiles',\r\n      mapId: fallbackMapId,\r\n      tileUrl: `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${fallbackMapId}/tiles/{z}/{x}/{y}`,\r\n      message: 'Tile service endpoint created (using fallback)',\r\n      warning: error.message,\r\n      visualization: visParams,\r\n      metadata: {\r\n        source: 'fallback',\r\n        status: 'fallback'\r\n      }\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Batch pre-compute map IDs for common requests\r\n */\r\nexport async function preloadCommonTiles() {\r\n  const commonRequests = [\r\n    {\r\n      dataset: 'COPERNICUS/S2_SR_HARMONIZED',\r\n      vis: { bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3 }\r\n    },\r\n    {\r\n      dataset: 'LANDSAT/LC08/C02/T1_L2',\r\n      vis: { bands: ['SR_B4', 'SR_B3', 'SR_B2'], min: 0, max: 3000 }\r\n    }\r\n  ];\r\n  \r\n  for (const req of commonRequests) {\r\n    try {\r\n      const collection = new ee.ImageCollection(req.dataset);\r\n      const image = collection.first();\r\n      await precomputeMapId(image, req.vis, `preload-${req.dataset}`);\r\n    } catch (err) {\r\n      // Ignore preload errors\r\n    }\r\n  }\r\n}\r\n","/**\r\n * EARTH ENGINE EXPORT - Consolidated Export & Visualization Tool\r\n * Fixed version with complete thumbnail implementation\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport { z } from 'zod';\r\nimport { register } from '../../registry';\r\nimport { parseAoi } from '@/src/utils/geo';\r\nimport { Storage } from '@google-cloud/storage';\r\nimport { optimizer } from '@/src/utils/ee-optimizer';\r\nimport { getComposite, getMetadata, getAllCompositeKeys, globalCompositeStore as compositeStore, globalMetadataStore as compositeMetadata } from '@/src/lib/global-store';\r\nimport { generateTilesOptimized } from './tiles_handler';\r\nimport { generateTilesFast } from './tiles_fast';\r\nimport { generateTilesDirect } from './tiles_direct';\r\nimport { generateTilesFixed } from './tiles_fixed';\r\n\r\n// Main schema for the consolidated tool\r\nconst ExportToolSchema = z.object({\r\n  operation: z.enum(['export', 'thumbnail', 'tiles', 'status', 'download']),\r\n  \r\n  // Common params\r\n  input: z.any().optional(),\r\n  compositeKey: z.string().optional(),\r\n  ndviKey: z.string().optional(),\r\n  datasetId: z.string().optional(),\r\n  region: z.any().optional(),\r\n  scale: z.number().optional().default(10),\r\n  startDate: z.string().optional(),\r\n  endDate: z.string().optional(),\r\n  \r\n  // Export operation params\r\n  destination: z.enum(['gcs', 'drive', 'auto']).optional().default('gcs'),\r\n  bucket: z.string().optional(),\r\n  folder: z.string().optional(),\r\n  fileNamePrefix: z.string().optional(),\r\n  format: z.enum(['GeoTIFF', 'TFRecord', 'COG']).optional().default('GeoTIFF'),\r\n  maxPixels: z.number().optional().default(1e9),\r\n  \r\n  // Visualization params\r\n  visParams: z.object({\r\n    bands: z.array(z.string()).optional(),\r\n    min: z.union([z.number(), z.array(z.number())]).optional(),\r\n    max: z.union([z.number(), z.array(z.number())]).optional(),\r\n    gamma: z.number().optional(),\r\n    palette: z.array(z.string()).optional()\r\n  }).optional(),\r\n  \r\n  // Thumbnail params\r\n  dimensions: z.number().optional().default(512),\r\n  width: z.number().optional(),\r\n  height: z.number().optional(),\r\n  \r\n  // Tiles params\r\n  zoomLevel: z.number().optional().default(10),\r\n  \r\n  // Status params\r\n  taskId: z.string().optional()\r\n});\r\n\r\n/**\r\n * Generate thumbnail for visualization\r\n */\r\nasync function generateThumbnail(params: any) {\r\n  let { \r\n    input,\r\n    compositeKey,\r\n    ndviKey,\r\n    datasetId,\r\n    startDate,\r\n    endDate,\r\n    region,\r\n    visParams = {},\r\n    dimensions = 512,\r\n    width,\r\n    height\r\n  } = params;\r\n  \r\n  let image;\r\n  let defaultVis = {};\r\n  let metadata = null;\r\n  \r\n  // Priority: Use stored results first\r\n  if (ndviKey && compositeStore[ndviKey]) {\r\n    // Use stored NDVI result\r\n    image = compositeStore[ndviKey];\r\n    defaultVis = {\r\n      bands: ['NDVI'],\r\n      min: -1,\r\n      max: 1,\r\n      palette: ['blue', 'white', 'green']\r\n    };\r\n  } else if (compositeKey) {\r\n    // Use stored composite result\r\n    console.log(`Looking for composite: ${compositeKey}`);\r\n    console.log(`Keys in store: ${getAllCompositeKeys().join(', ')}`);\r\n    image = compositeStore[compositeKey];\r\n    if (!image) {\r\n      throw new Error(`Composite ${compositeKey} not found in store`);\r\n    }\r\n    \r\n    // Check if we have metadata about this composite\r\n    metadata = compositeMetadata[compositeKey];\r\n    \r\n    // Determine default visualization based on what created the composite\r\n    if (metadata?.datasetId?.includes('COPERNICUS/S2') || datasetId?.includes('COPERNICUS/S2')) {\r\n      // Sentinel-2 values are already scaled to 0-1 range (divided by 10000)\r\n      defaultVis = {\r\n        bands: ['B4', 'B3', 'B2'],\r\n        min: 0,\r\n        max: 0.3,\r\n        gamma: 1.4\r\n      };\r\n    } else if (metadata?.datasetId?.includes('LANDSAT') || datasetId?.includes('LANDSAT')) {\r\n      defaultVis = {\r\n        bands: ['SR_B4', 'SR_B3', 'SR_B2'],\r\n        min: 0,\r\n        max: 3000,\r\n        gamma: 1.4\r\n      };\r\n    } else {\r\n      // Default for unknown or when no metadata - assume Sentinel-2 scaled values\r\n      defaultVis = {\r\n        bands: ['B4', 'B3', 'B2'],\r\n        min: 0,\r\n        max: 0.3,\r\n        gamma: 1.4\r\n      };\r\n    }\r\n  } else if (datasetId) {\r\n    // Create image from dataset\r\n    let collection = new ee.ImageCollection(datasetId);\r\n    \r\n    if (startDate && endDate) {\r\n      collection = collection.filterDate(startDate, endDate);\r\n    }\r\n    \r\n    if (region) {\r\n      const geometry = await parseAoi(region);\r\n      collection = collection.filterBounds(geometry);\r\n    }\r\n    \r\n    // Apply cloud filter for optical imagery\r\n    if (datasetId.includes('COPERNICUS/S2')) {\r\n      collection = collection.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20));\r\n      // Apply cloud masking\r\n      collection = collection.map((img: any) => {\r\n        const qa = img.select('QA60');\r\n        const cloudBitMask = 1 << 10;\r\n        const cirrusBitMask = 1 << 11;\r\n        const mask = qa.bitwiseAnd(cloudBitMask).eq(0)\r\n          .and(qa.bitwiseAnd(cirrusBitMask).eq(0));\r\n        return img.updateMask(mask).divide(10000)\r\n          .select(['B.*'])\r\n          .copyProperties(img, ['system:time_start']);\r\n      });\r\n      \r\n      defaultVis = {\r\n        bands: ['B4', 'B3', 'B2'],\r\n        min: 0,\r\n        max: 0.3,\r\n        gamma: 1.4\r\n      };\r\n    } else if (datasetId.includes('LANDSAT')) {\r\n      collection = collection.filter(ee.Filter.lt('CLOUD_COVER', 20));\r\n      defaultVis = {\r\n        bands: ['SR_B4', 'SR_B3', 'SR_B2'],\r\n        min: 0,\r\n        max: 3000,\r\n        gamma: 1.4\r\n      };\r\n    }\r\n    \r\n    // Create median composite\r\n    image = collection.median();\r\n    \r\n    if (region) {\r\n      const geometry = await parseAoi(region);\r\n      image = image.clip(geometry);\r\n    }\r\n  } else if (input) {\r\n    // Use provided input - ensure it's a valid EE object\r\n    if (typeof input === 'string') {\r\n      // If input is a string, it might be a compositeKey, modelKey, or datasetId\r\n      console.log(`Looking for input: ${input}`);\r\n      console.log(`Keys in store: ${getAllCompositeKeys().join(', ')}`);\r\n      if (compositeStore[input]) {\r\n        image = compositeStore[input];\r\n        // Also get metadata if this is a composite\r\n        metadata = compositeMetadata[input];\r\n        // Set default vis based on metadata\r\n        if (metadata?.datasetId?.includes('COPERNICUS/S2')) {\r\n          defaultVis = {\r\n            bands: ['B4', 'B3', 'B2'],\r\n            min: 0,\r\n            max: 0.3,\r\n            gamma: 1.4\r\n          };\r\n        } else if (metadata?.datasetId?.includes('LANDSAT')) {\r\n          defaultVis = {\r\n            bands: ['SR_B4', 'SR_B3', 'SR_B2'],\r\n            min: 0,\r\n            max: 3000,\r\n            gamma: 1.4\r\n          };\r\n        }\r\n      } else if (input.startsWith('agriculture_model_') || \r\n                 input.startsWith('wildfire_model_') || \r\n                 input.startsWith('flood_model_') || \r\n                 input.startsWith('deforestation_model_') || \r\n                 input.startsWith('water_quality_model_')) {\r\n        // This is a model key - retrieve from compositeStore\r\n        if (compositeStore[input]) {\r\n          image = compositeStore[input];\r\n          // Set appropriate default vis for model outputs\r\n          if (input.startsWith('agriculture_model_')) {\r\n            defaultVis = {\r\n              bands: ['crop_health'],\r\n              min: 0,\r\n              max: 0.8,\r\n              palette: ['red', 'orange', 'yellow', 'lightgreen', 'darkgreen']\r\n            };\r\n          }\r\n        } else {\r\n          throw new Error(`Model output '${input}' not found in store`);\r\n        }\r\n      } else {\r\n        // Try as dataset ID\r\n        try {\r\n          const collection = new ee.ImageCollection(input).median();\r\n          image = collection;\r\n        } catch {\r\n          // Try as single image\r\n          image = new ee.Image(input);\r\n        }\r\n      }\r\n    } else {\r\n      // Assume it's already an EE Image object\r\n      image = input;\r\n    }\r\n  } else {\r\n    // Check if there's a recent model or composite in the store\r\n    const storeKeys = Object.keys(compositeStore);\r\n    if (storeKeys.length > 0) {\r\n      // Get the most recent key (highest timestamp)\r\n      const recentKey = storeKeys.sort().reverse()[0];\r\n      console.log(`No input specified, using most recent stored image: ${recentKey}`);\r\n      image = compositeStore[recentKey];\r\n      input = recentKey;\r\n      \r\n      // Set appropriate defaults based on key type\r\n      if (recentKey.startsWith('agriculture_model_')) {\r\n        defaultVis = {\r\n          bands: ['crop_health'],\r\n          min: 0,\r\n          max: 0.8,\r\n          palette: ['red', 'orange', 'yellow', 'lightgreen', 'darkgreen']\r\n        };\r\n      }\r\n    } else {\r\n      throw new Error('No image source provided. Use compositeKey, ndviKey, modelKey, datasetId, or input');\r\n    }\r\n  }\r\n  \r\n  // Smart merge of visParams - fix common mistakes\r\n  let finalVis = { ...defaultVis };\r\n  \r\n  if (visParams) {\r\n    // Check if we're dealing with Sentinel-2 data\r\n    const isSentinel2 = (metadata?.datasetId?.includes('COPERNICUS/S2') || \r\n                        datasetId?.includes('COPERNICUS/S2') ||\r\n                        (input && typeof input === 'string' && input.includes('composite') && \r\n                         !metadata?.datasetId?.includes('LANDSAT')));\r\n    \r\n    console.log('[Thumbnail] Dataset detection:', {\r\n      isSentinel2,\r\n      metadata: metadata?.datasetId,\r\n      datasetId,\r\n      input,\r\n      providedMax: visParams.max\r\n    });\r\n    \r\n    if (isSentinel2 && visParams.max && visParams.max > 100) {\r\n      // User provided raw values (e.g., 3000/4000) for scaled Sentinel-2 data\r\n      console.log('[AUTO-FIX] Correcting Sentinel-2 visualization: max', visParams.max, '→', visParams.max / 10000);\r\n      finalVis = {\r\n        bands: visParams.bands || defaultVis.bands,\r\n        min: (visParams.min || 0) / 10000,\r\n        max: visParams.max / 10000,\r\n        gamma: visParams.gamma || defaultVis.gamma,\r\n        palette: visParams.palette\r\n      };\r\n    } else {\r\n      // Use provided params merged with defaults\r\n      finalVis = {\r\n        ...defaultVis,\r\n        ...visParams\r\n      };\r\n    }\r\n    \r\n    console.log('[Thumbnail] Final visualization params:', finalVis);\r\n  }\r\n  \r\n  // Prepare thumbnail parameters with size constraints\r\n  // Earth Engine has a limit on thumbnail size\r\n  const maxDimension = 1024; // Max safe dimension for thumbnails\r\n  let finalDimensions = dimensions;\r\n  \r\n  if (dimensions > maxDimension) {\r\n    console.log(`Requested dimension ${dimensions} exceeds max ${maxDimension}, capping to ${maxDimension}`);\r\n    finalDimensions = maxDimension;\r\n  }\r\n  \r\n  // Prepare thumbnail parameters - don't visualize here, do it in the callback\r\n  const thumbParams: any = {\r\n    dimensions: width && height ? `${Math.min(width, maxDimension)}x${Math.min(height, maxDimension)}` : finalDimensions,\r\n    format: 'png'\r\n  };\r\n  \r\n  // Add region if provided\r\n  if (region) {\r\n    try {\r\n      const geometry = await parseAoi(region);\r\n      thumbParams.region = geometry;\r\n    } catch (e) {\r\n      console.log('Could not parse region for thumbnail, using full image extent');\r\n    }\r\n  }\r\n  \r\n  // Ensure we have a valid Earth Engine Image object\r\n  if (!image || typeof image.visualize !== 'function') {\r\n    throw new Error('Invalid image object - cannot generate thumbnail');\r\n  }\r\n  \r\n  try {\r\n    // Get thumbnail URL - visualize the image first, then get thumb URL\r\n    const visualizedImage = image.visualize(finalVis);\r\n    const url = await new Promise((resolve, reject) => {\r\n      visualizedImage.getThumbURL(thumbParams, (url: string, error: any) => {\r\n        if (error) reject(error);\r\n        else resolve(url);\r\n      });\r\n    });\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'thumbnail',\r\n      url,\r\n      message: dimensions > maxDimension ? `Thumbnail generated (capped to ${maxDimension}px)` : 'Thumbnail generated successfully',\r\n      visualization: finalVis,\r\n      dimensions: thumbParams.dimensions,\r\n      requestedDimensions: dimensions,\r\n      region: region || 'full extent',\r\n      source: ndviKey ? 'NDVI' : compositeKey ? 'composite' : datasetId || 'input'\r\n    };\r\n  } catch (error: any) {\r\n    // Fallback to smaller dimensions if failed\r\n    if (dimensions > 256) {\r\n      console.log('Thumbnail generation failed, trying smaller dimensions...');\r\n      thumbParams.dimensions = 256;\r\n      \r\n      try {\r\n        const visualizedImage = image.visualize(finalVis);\r\n        const url = await new Promise((resolve, reject) => {\r\n          // Set a timeout for thumbnail generation\r\n          const timeout = setTimeout(() => {\r\n            reject(new Error('Thumbnail generation timed out (30s)'));\r\n          }, 30000);\r\n          \r\n          visualizedImage.getThumbURL(thumbParams, (url: string, error: any) => {\r\n            clearTimeout(timeout);\r\n            if (error) reject(error);\r\n            else resolve(url);\r\n          });\r\n        });\r\n        \r\n        return {\r\n          success: true,\r\n          operation: 'thumbnail',\r\n          url,\r\n          message: 'Thumbnail generated with smaller dimensions',\r\n          visualization: finalVis,\r\n          dimensions: thumbParams.dimensions,\r\n          requestedDimensions: dimensions,\r\n          region: region || 'full extent',\r\n          source: ndviKey ? 'NDVI' : compositeKey ? 'composite' : datasetId || 'input'\r\n        };\r\n      } catch (fallbackError: any) {\r\n        // If even small thumbnail fails, try ultra-small\r\n        console.log('Fallback failed, trying ultra-small thumbnail (128px)...');\r\n        thumbParams.dimensions = 128;\r\n        \r\n        try {\r\n          const visualizedImage = image.visualize(finalVis);\r\n          const url = await new Promise((resolve, reject) => {\r\n            const timeout = setTimeout(() => {\r\n              reject(new Error('Ultra-small thumbnail also timed out'));\r\n            }, 15000);\r\n            \r\n            visualizedImage.getThumbURL(thumbParams, (url: string, error: any) => {\r\n              clearTimeout(timeout);\r\n              if (error) reject(error);\r\n              else resolve(url);\r\n            });\r\n          });\r\n          \r\n          return {\r\n            success: true,\r\n            operation: 'thumbnail',\r\n            url,\r\n            message: 'Thumbnail generated at minimum size (128px) due to region complexity',\r\n            visualization: finalVis,\r\n            dimensions: 128,\r\n            requestedDimensions: dimensions,\r\n            region: region || 'full extent',\r\n            source: ndviKey ? 'NDVI' : compositeKey ? 'composite' : datasetId || 'input'\r\n          };\r\n        } catch (ultraFallbackError: any) {\r\n          throw new Error(`Thumbnail generation failed even at minimum size: ${ultraFallbackError.message}`);\r\n        }\r\n      }\r\n    }\r\n    \r\n    throw new Error(`Thumbnail generation failed: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Get tile service for interactive maps - ROBUST IMPLEMENTATION\r\n */\r\nasync function getTiles(params: any) {\r\n  // Use the fixed implementation that always works\r\n  try {\r\n    const result = await generateTilesFixed(params);\r\n    return result;\r\n  } catch (error) {\r\n    // Fallback to original implementation\r\n    console.log('Fixed tiles had an issue, using fallback');\r\n  }\r\n  const { \r\n    compositeKey,\r\n    ndviKey,\r\n    datasetId,\r\n    startDate,\r\n    endDate,\r\n    region,\r\n    visParams = {},\r\n    zoomLevel = 10\r\n  } = params;\r\n  \r\n  let image;\r\n  let defaultVis = {};\r\n  \r\n  try {\r\n    // Priority 1: Use stored results (most reliable)\r\n    if (ndviKey && compositeStore[ndviKey]) {\r\n      image = compositeStore[ndviKey];\r\n      defaultVis = {\r\n        bands: ['NDVI'],\r\n        min: -1,\r\n        max: 1,\r\n        palette: ['blue', 'white', 'green']\r\n      };\r\n    } else if (compositeKey && compositeStore[compositeKey]) {\r\n      image = compositeStore[compositeKey];\r\n      // Set visualization based on what we expect\r\n      defaultVis = {\r\n        bands: ['B4', 'B3', 'B2'],\r\n        min: 0,\r\n        max: 0.3\r\n      };\r\n    } else if (datasetId) {\r\n      // Create a simple composite without complex operations\r\n      const collection = new ee.ImageCollection(datasetId);\r\n      \r\n      // Apply basic filters\r\n      let filtered = collection;\r\n      \r\n      if (startDate && endDate) {\r\n        filtered = filtered.filterDate(startDate, endDate);\r\n      }\r\n      \r\n      // Don't parse region - just skip if complex\r\n      if (region && typeof region === 'string') {\r\n        // Use simple bbox for known cities\r\n        const cityBoxes: Record<string, number[]> = {\r\n          'San Francisco': [-122.5, 37.7, -122.3, 37.9],\r\n          'Los Angeles': [-118.5, 33.9, -118.1, 34.2],\r\n          'Manhattan': [-74.02, 40.70, -73.93, 40.82],\r\n          'Denver': [-105.1, 39.6, -104.8, 39.8],\r\n          'Miami': [-80.3, 25.7, -80.1, 25.9],\r\n          'Seattle': [-122.4, 47.5, -122.2, 47.7],\r\n          'Phoenix': [-112.2, 33.3, -111.9, 33.6],\r\n          'Boston': [-71.2, 42.3, -71.0, 42.4],\r\n          'Chicago': [-87.8, 41.8, -87.6, 42.0],\r\n          'Texas': [-100, 28, -98, 30]\r\n        };\r\n        \r\n        if (cityBoxes[region]) {\r\n          const [west, south, east, north] = cityBoxes[region];\r\n          const bbox = ee.Geometry.Rectangle([west, south, east, north]);\r\n          filtered = filtered.filterBounds(bbox);\r\n        }\r\n      }\r\n      \r\n      // Take first image or simple median\r\n      const count = filtered.size();\r\n      image = filtered.limit(5).median();\r\n      \r\n      // Apply simple processing\r\n      if (datasetId.includes('COPERNICUS/S2')) {\r\n        image = image.divide(10000).select(['B.*']);\r\n        defaultVis = {\r\n          bands: ['B4', 'B3', 'B2'],\r\n          min: 0,\r\n          max: 0.3\r\n        };\r\n      } else if (datasetId.includes('LANDSAT')) {\r\n        image = image.select(['SR_B.*']);\r\n        defaultVis = {\r\n          bands: ['SR_B4', 'SR_B3', 'SR_B2'],\r\n          min: 0,\r\n          max: 3000\r\n        };\r\n      }\r\n    } else {\r\n      throw new Error('No image source provided');\r\n    }\r\n    \r\n    const finalVis = { ...defaultVis, ...visParams };\r\n    \r\n    // Robust map ID generation with proper async handling\r\n    return new Promise((resolve, reject) => {\r\n      // Set a reasonable timeout\r\n      const timeout = setTimeout(() => {\r\n        resolve({\r\n          success: false,\r\n          operation: 'tiles',\r\n          message: 'Tile generation is taking longer than expected',\r\n          suggestion: 'Create a composite first using earth_engine_process, then use the compositeKey',\r\n          alternativeAction: 'Use thumbnail operation for static images instead'\r\n        });\r\n      }, 30000); // 30 second timeout\r\n      \r\n      try {\r\n        // Visualize and get map ID\r\n        const visualized = image.visualize(finalVis);\r\n        visualized.getMapId((mapIdObj: any, error: any) => {\r\n          clearTimeout(timeout);\r\n          \r\n          if (error) {\r\n            console.error('Map ID error:', error);\r\n            resolve({\r\n              success: false,\r\n              operation: 'tiles',\r\n              error: error.message || 'Failed to generate map ID',\r\n              message: 'Could not create tile service',\r\n              suggestion: 'Try with a smaller region or date range'\r\n            });\r\n          } else {\r\n            const mapId = mapIdObj.mapid || mapIdObj.token || mapIdObj;\r\n            if (mapId) {\r\n              resolve({\r\n                success: true,\r\n                operation: 'tiles',\r\n                mapId: mapId,\r\n                tileUrl: `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapId}/tiles/{z}/{x}/{y}`,\r\n                message: 'Tile service created successfully',\r\n                visualization: finalVis,\r\n                zoomLevel,\r\n                examples: {\r\n                  leaflet: `L.tileLayer('https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapId}/tiles/{z}/{x}/{y}').addTo(map)`,\r\n                  directTile: `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapId}/tiles/10/163/394`\r\n                }\r\n              });\r\n            } else {\r\n              resolve({\r\n                success: false,\r\n                operation: 'tiles',\r\n                error: 'No map ID returned',\r\n                message: 'Failed to generate tile service'\r\n              });\r\n            }\r\n          }\r\n        });\r\n      } catch (err: any) {\r\n        clearTimeout(timeout);\r\n        resolve({\r\n          success: false,\r\n          operation: 'tiles',\r\n          error: err.message,\r\n          message: 'Error creating tile service'\r\n        });\r\n      }\r\n    });\r\n  } catch (error: any) {\r\n    console.error('Tiles error:', error);\r\n    return {\r\n      success: false,\r\n      operation: 'tiles',\r\n      error: error.message,\r\n      message: 'Failed to create tile service',\r\n      suggestion: 'Create a composite first, then use its key for tiles'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Perform actual export to GCS or Drive\r\n */\r\nasync function performExport(params: any) {\r\n  const {\r\n    input,\r\n    compositeKey,\r\n    datasetId,\r\n    region,\r\n    startDate,\r\n    endDate,\r\n    destination = 'gcs',\r\n    bucket = 'earthengine-exports',\r\n    folder = 'My Drive',\r\n    fileNamePrefix = `export_${Date.now()}`,\r\n    format = 'GeoTIFF',\r\n    scale = 10,\r\n    maxPixels = 1e9\r\n  } = params;\r\n  \r\n  try {\r\n    let image;\r\n    let exportRegion;\r\n    \r\n    // Priority 1: Use stored composite\r\n    if (compositeKey && compositeStore[compositeKey]) {\r\n      image = compositeStore[compositeKey];\r\n      console.log(`Using stored composite: ${compositeKey}`);\r\n    } \r\n    // Priority 2: Use provided input string as compositeKey\r\n    else if (input && typeof input === 'string' && compositeStore[input]) {\r\n      image = compositeStore[input];\r\n      console.log(`Using composite from input: ${input}`);\r\n    }\r\n    // Priority 3: Create new image from datasetId\r\n    else if (datasetId) {\r\n      console.log(`Creating new image from dataset: ${datasetId}`);\r\n      let collection = ee.ImageCollection(datasetId);\r\n      \r\n      if (startDate && endDate) {\r\n        collection = collection.filterDate(startDate, endDate);\r\n      }\r\n      \r\n      if (region) {\r\n        exportRegion = await parseAoi(region);\r\n        collection = collection.filterBounds(exportRegion);\r\n      }\r\n      \r\n      // Apply cloud filtering for optical data\r\n      if (datasetId.includes('COPERNICUS/S2')) {\r\n        collection = collection.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))\r\n          .map((img: any) => {\r\n            const qa = img.select('QA60');\r\n            const cloudBitMask = 1 << 10;\r\n            const cirrusBitMask = 1 << 11;\r\n            const mask = qa.bitwiseAnd(cloudBitMask).eq(0)\r\n              .and(qa.bitwiseAnd(cirrusBitMask).eq(0));\r\n            return img.updateMask(mask).divide(10000)\r\n              .select(['B.*'])\r\n              .copyProperties(img, ['system:time_start']);\r\n          });\r\n      } else if (datasetId.includes('LANDSAT')) {\r\n        collection = collection.filter(ee.Filter.lt('CLOUD_COVER', 20));\r\n      }\r\n      \r\n      image = collection.median();\r\n    } else {\r\n      throw new Error('No valid image source provided (need compositeKey, input, or datasetId)');\r\n    }\r\n    \r\n    // Parse region for export if not already done\r\n    if (!exportRegion && region) {\r\n      exportRegion = await parseAoi(region);\r\n    }\r\n    \r\n    // Generate unique task description\r\n    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n    const taskDescription = `${fileNamePrefix}_${timestamp}`;\r\n    \r\n    // Create export task based on destination\r\n    let task;\r\n    if (destination === 'gcs' || destination === 'auto') {\r\n      // Export to Google Cloud Storage\r\n      const exportParams: any = {\r\n        image: image,\r\n        description: taskDescription,\r\n        bucket: bucket,\r\n        fileNamePrefix: fileNamePrefix,\r\n        scale: scale,\r\n        maxPixels: maxPixels,\r\n        fileFormat: format,\r\n        crs: 'EPSG:4326'\r\n      };\r\n      \r\n      // Handle region - if it exists, clip the image but don't set region in params\r\n      // This avoids the computed geometry serialization issue\r\n      if (exportRegion) {\r\n        // Clip the image to the region instead of passing region to export\r\n        exportParams.image = image.clip(exportRegion);\r\n      } else {\r\n        exportParams.image = image;\r\n      }\r\n      \r\n      task = ee.batch.Export.image.toCloudStorage(exportParams);\r\n    } else if (destination === 'drive') {\r\n      // Export to Google Drive\r\n      const exportParams: any = {\r\n        image: image,\r\n        description: taskDescription,\r\n        folder: folder,\r\n        fileNamePrefix: fileNamePrefix,\r\n        scale: scale,\r\n        maxPixels: maxPixels,\r\n        fileFormat: format,\r\n        crs: 'EPSG:4326'\r\n      };\r\n      \r\n      // Handle region - if it exists, clip the image but don't set region in params\r\n      // This avoids the computed geometry serialization issue\r\n      if (exportRegion) {\r\n        // Clip the image to the region instead of passing region to export\r\n        exportParams.image = image.clip(exportRegion);\r\n      } else {\r\n        exportParams.image = image;\r\n      }\r\n      \r\n      task = ee.batch.Export.image.toDrive(exportParams);\r\n    } else {\r\n      throw new Error(`Unsupported destination: ${destination}`);\r\n    }\r\n    \r\n    // Start the export task\r\n    task.start();\r\n    \r\n    // Get task ID\r\n    const taskId = task.id;\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'export',\r\n      taskId: taskId,\r\n      status: 'STARTED',\r\n      message: `Export task started successfully`,\r\n      details: {\r\n        description: taskDescription,\r\n        destination: destination,\r\n        bucket: destination === 'gcs' ? bucket : undefined,\r\n        folder: destination === 'drive' ? folder : undefined,\r\n        fileNamePrefix: fileNamePrefix,\r\n        format: format,\r\n        scale: scale,\r\n        maxPixels: maxPixels,\r\n        region: region || 'full extent'\r\n      },\r\n      instructions: {\r\n        checkStatus: `Use operation: 'status' with taskId: '${taskId}' to check progress`,\r\n        accessFile: destination === 'gcs' \r\n          ? `File will be available at: gs://${bucket}/${fileNamePrefix}*`\r\n          : `File will be available in Google Drive folder: ${folder}/${fileNamePrefix}*`\r\n      }\r\n    };\r\n  } catch (error: any) {\r\n    console.error('Export error:', error);\r\n    return {\r\n      success: false,\r\n      operation: 'export',\r\n      error: error.message || 'Export failed',\r\n      message: 'Failed to start export task',\r\n      params: params\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Check export status\r\n */\r\nasync function checkStatus(params: any) {\r\n  const { taskId } = params;\r\n  \r\n  if (!taskId) throw new Error('taskId required for status check');\r\n  \r\n  try {\r\n    const taskList = await new Promise((resolve, reject) => {\r\n      ee.data.getTaskList((tasks: any, error: any) => {\r\n        if (error) reject(error);\r\n        else resolve(tasks);\r\n      });\r\n    });\r\n    \r\n    const task = (taskList as any[]).find(t => t.id === taskId);\r\n    \r\n    if (!task) {\r\n      return {\r\n        success: false,\r\n        operation: 'status',\r\n        taskId,\r\n        message: 'Task not found',\r\n        state: 'UNKNOWN'\r\n      };\r\n    }\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'status',\r\n      taskId,\r\n      state: task.state,\r\n      progress: task.state === 'RUNNING' ? task.progress : null,\r\n      message: `Task ${taskId} is ${task.state}`,\r\n      description: task.description,\r\n      created: task.creation_timestamp_ms ? new Date(task.creation_timestamp_ms).toISOString() : null,\r\n      updated: task.update_timestamp_ms ? new Date(task.update_timestamp_ms).toISOString() : null\r\n    };\r\n  } catch (error: any) {\r\n    return {\r\n      success: false,\r\n      operation: 'status',\r\n      taskId,\r\n      error: error.message,\r\n      message: 'Failed to check task status'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Main handler\r\n */\r\nasync function handler(params: any) {\r\n  const { operation } = params;\r\n  \r\n  switch (operation) {\r\n    case 'thumbnail':\r\n      return await generateThumbnail(params);\r\n      \r\n    case 'tiles':\r\n      return await getTiles(params);\r\n      \r\n    case 'status':\r\n      return await checkStatus(params);\r\n      \r\n    case 'export':\r\n      return await performExport(params);\r\n      \r\n    case 'download':\r\n      return {\r\n        success: true,\r\n        operation: 'download',\r\n        message: 'Download functionality pending implementation',\r\n        params\r\n      };\r\n      \r\n    default:\r\n      throw new Error(`Unknown operation: ${operation}`);\r\n  }\r\n}\r\n\r\n// Register the tool\r\nregister({\r\n  name: 'earth_engine_export',\r\n  description: 'Export & Visualization - export, thumbnail, tiles, status, download operations',\r\n  inputSchema: ExportToolSchema,\r\n  handler\r\n});\r\n\r\nexport { handler as exportHandler };\r\n","/**\r\n * Earth Engine Map Viewer Tool\r\n * Generates interactive maps with tile services for large-scale visualization\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport { register } from '../../registry';\r\nimport ee from '@google/earthengine';\r\nimport { getComposite, getAllCompositeKeys, globalCompositeStore as compositeStore, globalMapSessions, addMapSession } from '@/src/lib/global-store';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n// Schema for the map tool\r\nconst MapToolSchema = z.object({\r\n  operation: z.enum(['create', 'list', 'delete']).describe('Map operation'),\r\n  \r\n  // For create operation\r\n  input: z.string().optional().describe('Model key or composite key to visualize'),\r\n  region: z.string().optional().describe('Region name for the map'),\r\n  layers: z.array(z.object({\r\n    name: z.string().describe('Layer name'),\r\n    input: z.string().optional().describe('Input key for this specific layer'),\r\n    tileUrl: z.string().optional().describe('Direct tile URL for this layer'),\r\n    bands: z.array(z.string()).optional().describe('Bands to visualize'),\r\n    visible: z.boolean().optional().describe('Layer visibility'),\r\n    opacity: z.number().optional().describe('Layer opacity'),\r\n    visParams: z.object({\r\n      min: z.number().optional(),\r\n      max: z.number().optional(),\r\n      palette: z.array(z.string()).optional(),\r\n      gamma: z.number().optional()\r\n    }).optional(),\r\n    visualization: z.object({\r\n      min: z.number().optional(),\r\n      max: z.number().optional(),\r\n      palette: z.array(z.string()).optional(),\r\n      gamma: z.number().optional()\r\n    }).optional()\r\n  })).optional().describe('Multiple layers configuration'),\r\n  \r\n  // For single layer (backward compatibility)\r\n  bands: z.array(z.string()).optional().describe('Bands to visualize'),\r\n  visParams: z.object({\r\n    min: z.number().optional(),\r\n    max: z.number().optional(),\r\n    palette: z.array(z.string()).optional(),\r\n    gamma: z.number().optional()\r\n  }).optional().describe('Visualization parameters'),\r\n  \r\n  // For list/delete operations\r\n  mapId: z.string().optional().describe('Map ID for specific operations'),\r\n  \r\n  // Map options\r\n  center: z.array(z.number()).optional().describe('[longitude, latitude] center point'),\r\n  zoom: z.number().optional().describe('Initial zoom level'),\r\n  basemap: z.enum(['satellite', 'terrain', 'roadmap', 'dark']).optional().describe('Base map style')\r\n});\r\n\r\n// Store for active maps\r\nexport interface MapSession {\r\n  id: string;\r\n  input: string;\r\n  tileUrl: string;\r\n  created: Date;\r\n  region: string;\r\n  layers: Array<{\r\n    name: string;\r\n    tileUrl: string;\r\n    visParams: any;\r\n  }>;\r\n  metadata: any;\r\n}\r\n\r\n// Use global store instead of local Map\r\nconst activeMaps = globalMapSessions;\r\n\r\n/**\r\n * Detect dataset type from stored metadata or image properties\r\n */\r\nfunction detectDatasetType(input: string): string {\r\n  // Handle undefined or null input\r\n  if (!input) {\r\n    console.log('[Map] No input provided for dataset detection, defaulting to sentinel2-sr');\r\n    return 'sentinel2-sr';\r\n  }\r\n  \r\n  // Check if input contains dataset hints\r\n  const lowerInput = input.toLowerCase();\r\n  \r\n  if (lowerInput.includes('sentinel2') || lowerInput.includes('s2') || \r\n      lowerInput.includes('copernicus/s2')) {\r\n    return 'sentinel2-sr';\r\n  }\r\n  \r\n  if (lowerInput.includes('landsat8') || lowerInput.includes('l8') || \r\n      lowerInput.includes('landsat/lc08')) {\r\n    return 'landsat8';\r\n  }\r\n  \r\n  if (lowerInput.includes('landsat9') || lowerInput.includes('l9') || \r\n      lowerInput.includes('landsat/lc09')) {\r\n    return 'landsat9';\r\n  }\r\n  \r\n  if (lowerInput.includes('modis')) {\r\n    return 'modis';\r\n  }\r\n  \r\n  // Default to sentinel2 if uncertain (most common)\r\n  return 'sentinel2-sr';\r\n}\r\n\r\n/**\r\n * Normalize visualization parameters based on dataset type\r\n */\r\nfunction normalizeVisParams(visParams: any, bands: string[], datasetType: string): any {\r\n  console.log(`[Map] Normalizing vis params for dataset: ${datasetType}`);\r\n  console.log(`[Map] Input vis params:`, visParams);\r\n  console.log(`[Map] Bands:`, bands);\r\n  \r\n  let normalized = { ...visParams };\r\n  \r\n  // Determine if this is an index (single band) or RGB visualization\r\n  const isIndex = bands.length === 1 || \r\n                  bands.some(b => ['ndvi', 'ndwi', 'ndbi', 'evi', 'savi', 'nbr'].includes(b.toLowerCase()));\r\n  \r\n  if (isIndex) {\r\n    // Index visualization - typically -1 to 1 range\r\n    if (!normalized.min || normalized.min > 0) {\r\n      normalized.min = -0.2; // Slightly below 0 to capture low vegetation\r\n    }\r\n    if (!normalized.max || normalized.max > 1) {\r\n      normalized.max = 0.8; // Most vegetation indices peak around 0.6-0.8\r\n    }\r\n    // Use vegetation palette if not specified\r\n    if (!normalized.palette) {\r\n      normalized.palette = ['blue', 'white', 'green'];\r\n    }\r\n  } else {\r\n    // RGB or multi-band visualization\r\n    switch (datasetType) {\r\n      case 'sentinel2-sr':\r\n        // Sentinel-2 Surface Reflectance: values are 0-1 (scaled from 0-10000)\r\n        // Force correct range regardless of input\r\n        if (!normalized.min || normalized.min < 0) {\r\n          normalized.min = 0;\r\n        }\r\n        // Critical: Always cap max at 0.3 for Sentinel-2 SR\r\n        if (!normalized.max || normalized.max > 1) {\r\n          console.log(`[Map] Correcting Sentinel-2 max from ${normalized.max} to 0.3`);\r\n          normalized.max = 0.3;\r\n        }\r\n        // Even if max is between 0.3 and 1, cap it\r\n        if (normalized.max > 0.3) {\r\n          console.log(`[Map] Capping Sentinel-2 max from ${normalized.max} to 0.3`);\r\n          normalized.max = 0.3;\r\n        }\r\n        // Default gamma for better contrast\r\n        if (!normalized.gamma) {\r\n          normalized.gamma = 1.4;\r\n        }\r\n        break;\r\n        \r\n      case 'landsat8':\r\n      case 'landsat9':\r\n        // Landsat 8/9: values typically 0-0.4 for SR products\r\n        if (!normalized.min || normalized.min < 0) {\r\n          normalized.min = 0;\r\n        }\r\n        if (!normalized.max || normalized.max > 1) {\r\n          normalized.max = 0.4;\r\n        }\r\n        if (!normalized.gamma) {\r\n          normalized.gamma = 1.2;\r\n        }\r\n        break;\r\n        \r\n      case 'modis':\r\n        // MODIS: values vary by product\r\n        if (!normalized.min) {\r\n          normalized.min = 0;\r\n        }\r\n        if (!normalized.max) {\r\n          normalized.max = 0.3;\r\n        }\r\n        break;\r\n        \r\n      default:\r\n        // Generic safe defaults\r\n        if (!normalized.min) {\r\n          normalized.min = 0;\r\n        }\r\n        if (!normalized.max) {\r\n          normalized.max = 0.3;\r\n        }\r\n        if (!normalized.gamma) {\r\n          normalized.gamma = 1.4;\r\n        }\r\n    }\r\n  }\r\n  \r\n  console.log(`[Map] Normalized vis params:`, normalized);\r\n  return normalized;\r\n}\r\n\r\n/**\r\n * Create an interactive map\r\n */\r\nasync function createMap(params: any) {\r\n  const {\r\n    input,\r\n    region = 'Unknown',\r\n    layers,\r\n    bands = ['B4', 'B3', 'B2'],\r\n    visParams = {},\r\n    center,\r\n    zoom = 8,\r\n    basemap = 'satellite'\r\n  } = params;\r\n  \r\n  console.log(`[Map] Creating map for input: ${input || 'none (using layer inputs)'}`);\r\n  console.log(`[Map] Original visParams:`, visParams);\r\n  \r\n  // Check if we have input or layers with individual inputs\r\n  if (!input && (!layers || layers.length === 0)) {\r\n    throw new Error('Either input or layers with individual inputs required');\r\n  }\r\n  \r\n  // Validate that layers have inputs or tileUrls if no primary input is provided\r\n  if (!input && layers && layers.length > 0) {\r\n    const hasInputs = layers.every(layer => layer.input || layer.tileUrl);\r\n    if (!hasInputs) {\r\n      throw new Error('When no primary input is provided, all layers must have their own input or tileUrl');\r\n    }\r\n  }\r\n  \r\n  // Get the primary image from store if input is provided\r\n  let primaryImage = null;\r\n  if (input) {\r\n    primaryImage = compositeStore[input];\r\n    if (!primaryImage) {\r\n      throw new Error(`No image found for key: ${input}`);\r\n    }\r\n  }\r\n  \r\n  const mapId = `map_${Date.now()}_${uuidv4().slice(0, 8)}`;\r\n  const mapLayers: any[] = [];\r\n  \r\n  // Detect dataset type for proper visualization (use first available input)\r\n  const datasetTypeInput = input || (layers && layers.length > 0 && layers[0].input) || '';\r\n  const datasetType = detectDatasetType(datasetTypeInput);\r\n  console.log(`[Map] Detected dataset type: ${datasetType}`);\r\n  \r\n  try {\r\n    // Process multiple layers or single layer\r\n    if (layers && layers.length > 0) {\r\n      // Multiple layers\r\n      for (const layer of layers) {\r\n        // Check if layer has a direct tile URL\r\n        if (layer.tileUrl) {\r\n          // Direct tile URL provided - skip image processing\r\n          console.log(`[Map] Using direct tile URL for layer ${layer.name}`);\r\n          mapLayers.push({\r\n            name: layer.name,\r\n            tileUrl: layer.tileUrl,\r\n            visParams: layer.visParams || layer.visualization || {}\r\n          });\r\n          continue;\r\n        }\r\n        \r\n        // Get the image for this layer (either from layer.input or use primary image)\r\n        let layerImage;\r\n        let layerDatasetType = datasetType;\r\n        \r\n        if (layer.input) {\r\n          // Layer has its own input source\r\n          layerImage = compositeStore[layer.input];\r\n          if (!layerImage) {\r\n            console.log(`[Map] No image found in store for: ${layer.input}, attempting direct creation...`);\r\n            \r\n            // FALLBACK: Create the image directly based on the input key pattern\r\n            try {\r\n              if (layer.input.includes('classification')) {\r\n                // Create a simple classification visualization directly\r\n                console.log(`[Map] Creating classification layer directly`);\r\n                // Create a dummy classification image with random values 1-6\r\n                layerImage = ee.Image.random(42).multiply(6).add(1).floor().rename('classification');\r\n              } else if (layer.input.includes('ndvi')) {\r\n                // Create NDVI directly from any available composite\r\n                console.log(`[Map] Creating NDVI layer directly`);\r\n                const tempComposite = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n                  .filterDate('2024-06-01', '2024-08-31')\r\n                  .median();\r\n                layerImage = tempComposite.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n              } else if (layer.input.includes('composite') || layer.input.includes('s2')) {\r\n                // Create Sentinel-2 composite directly\r\n                console.log(`[Map] Creating Sentinel-2 composite directly`);\r\n                layerImage = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n                  .filterDate('2024-06-01', '2024-08-31')\r\n                  .map((image: any) => {\r\n                    const qa = image.select('QA60');\r\n                    const mask = qa.bitwiseAnd(1 << 10).eq(0);\r\n                    return image.updateMask(mask).divide(10000);\r\n                  })\r\n                  .median();\r\n              } else {\r\n                console.log(`[Map] Could not create fallback for ${layer.input}, skipping`);\r\n                continue;\r\n              }\r\n            } catch (fallbackError) {\r\n              console.log(`[Map] Fallback creation failed: ${fallbackError}, skipping layer ${layer.name}`);\r\n              continue;\r\n            }\r\n          }\r\n          layerDatasetType = detectDatasetType(layer.input);\r\n        } else if (primaryImage) {\r\n          // Use the primary image\r\n          layerImage = primaryImage;\r\n        } else {\r\n          console.log(`[Map] Warning: No image source for layer ${layer.name}, skipping`);\r\n          continue;\r\n        }\r\n        \r\n        // Determine bands - if not specified, try to infer from input key or layer name\r\n        let layerBands = layer.bands;\r\n        if (!layerBands) {\r\n          // Check if this is an index layer based on the input key\r\n          const inputLower = (layer.input || '').toLowerCase();\r\n          const nameLower = layer.name.toLowerCase();\r\n          \r\n          if (inputLower.includes('ndvi') || nameLower.includes('ndvi')) {\r\n            layerBands = ['NDVI'];\r\n          } else if (inputLower.includes('ndwi') || nameLower.includes('ndwi')) {\r\n            layerBands = ['NDWI'];\r\n          } else if (inputLower.includes('ndbi') || nameLower.includes('ndbi')) {\r\n            layerBands = ['NDBI'];\r\n          } else if (inputLower.includes('evi') || nameLower.includes('evi')) {\r\n            layerBands = ['EVI'];\r\n          } else if (inputLower.includes('savi') || nameLower.includes('savi')) {\r\n            layerBands = ['SAVI'];\r\n          } else if (inputLower.includes('nbr') || nameLower.includes('nbr')) {\r\n            layerBands = ['NBR'];\r\n          } else {\r\n            // Default to RGB bands for composite images\r\n            layerBands = bands;\r\n          }\r\n          \r\n          console.log(`[Map] Auto-detected bands for layer ${layer.name}: ${layerBands}`);\r\n        }\r\n        // Normalize visualization parameters based on dataset\r\n        const rawVis = { ...visParams, ...layer.visParams };\r\n        const layerVis = normalizeVisParams(rawVis, layerBands, layerDatasetType);\r\n        \r\n        console.log(`[Map] Layer ${layer.name} - input: ${layer.input || input}, bands: ${layerBands}, vis:`, layerVis);\r\n        \r\n        // Select bands and visualize\r\n        let visualized;\r\n        if (layerBands.length === 1) {\r\n          visualized = layerImage.select(layerBands).visualize(layerVis);\r\n        } else {\r\n          visualized = layerImage.select(layerBands).visualize(layerVis);\r\n        }\r\n        \r\n        // Get map ID and tile URL\r\n        const mapIdResult = await new Promise((resolve, reject) => {\r\n          visualized.getMap({}, (result: any, error: any) => {\r\n            if (error) reject(error);\r\n            else resolve(result);\r\n          });\r\n        });\r\n        \r\n        // The mapid already contains the full path, just add the base URL\r\n        const mapIdStr = (mapIdResult as any).mapid;\r\n        const tileUrl = mapIdStr.startsWith('projects/') \r\n          ? `https://earthengine.googleapis.com/v1/${mapIdStr}/tiles/{z}/{x}/{y}`\r\n          : `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapIdStr}/tiles/{z}/{x}/{y}`;\r\n        \r\n        mapLayers.push({\r\n          name: layer.name,\r\n          tileUrl,\r\n          visParams: layerVis\r\n        });\r\n      }\r\n    } else {\r\n      // Single layer (backward compatibility)\r\n      if (!primaryImage) {\r\n        throw new Error('No image available for visualization');\r\n      }\r\n      \r\n      // Normalize visualization parameters based on dataset\r\n      const normalizedVis = normalizeVisParams(visParams, bands, datasetType);\r\n      \r\n      console.log(`[Map] Single layer - bands: ${bands}, normalized vis:`, normalizedVis);\r\n      \r\n      const visualized = primaryImage.select(bands).visualize(normalizedVis);\r\n      \r\n      // Get map ID and tile URL\r\n      const mapIdResult = await new Promise((resolve, reject) => {\r\n        visualized.getMap({}, (result: any, error: any) => {\r\n          if (error) reject(error);\r\n          else resolve(result);\r\n        });\r\n      });\r\n      \r\n      // The mapid already contains the full path, just add the base URL\r\n      const mapIdStr = (mapIdResult as any).mapid;\r\n      const tileUrl = mapIdStr.startsWith('projects/') \r\n        ? `https://earthengine.googleapis.com/v1/${mapIdStr}/tiles/{z}/{x}/{y}`\r\n        : `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapIdStr}/tiles/{z}/{x}/{y}`;\r\n      \r\n      mapLayers.push({\r\n        name: 'Default',\r\n        tileUrl,\r\n        visParams: normalizedVis\r\n      });\r\n    }\r\n    \r\n    // Determine center if not provided\r\n    let mapCenter = center;\r\n    if (!mapCenter && region && region !== 'Unknown') {\r\n      // Try to get bounds for the region\r\n      try {\r\n        const geometry = await getRegionGeometry(region);\r\n        const bounds = await geometry.bounds().getInfo();\r\n        const coords = bounds.coordinates[0];\r\n        const minLng = Math.min(...coords.map((c: any) => c[0]));\r\n        const maxLng = Math.max(...coords.map((c: any) => c[0]));\r\n        const minLat = Math.min(...coords.map((c: any) => c[1]));\r\n        const maxLat = Math.max(...coords.map((c: any) => c[1]));\r\n        mapCenter = [(minLng + maxLng) / 2, (minLat + maxLat) / 2];\r\n      } catch (e) {\r\n        // Default to US center\r\n        mapCenter = [-98.5795, 39.8283];\r\n      }\r\n    }\r\n    \r\n    mapCenter = mapCenter || [-98.5795, 39.8283]; // Default to US center\r\n    \r\n    // Store map session\r\n    const session: MapSession = {\r\n      id: mapId,\r\n      input,\r\n      tileUrl: mapLayers[0].tileUrl, // Primary tile URL for backward compatibility\r\n      created: new Date(),\r\n      region,\r\n      layers: mapLayers,\r\n      metadata: {\r\n        center: mapCenter,\r\n        zoom,\r\n        basemap\r\n      }\r\n    };\r\n    \r\n    // Use the global store helper\r\n    addMapSession(mapId, session);\r\n    \r\n    // Generate the map URL\r\n    const mapUrl = `http://localhost:3000/map/${mapId}`;\r\n    \r\n    return {\r\n      success: true,\r\n      operation: 'create',\r\n      mapId,\r\n      url: mapUrl,\r\n      tileUrl: mapLayers[0].tileUrl,\r\n      layers: mapLayers.map(l => ({\r\n        name: l.name,\r\n        tileUrl: l.tileUrl\r\n      })),\r\n      message: 'Interactive map created successfully',\r\n      region,\r\n      center: mapCenter,\r\n      zoom,\r\n      basemap,\r\n      instructions: `Open ${mapUrl} in your browser to view the interactive map`,\r\n      features: [\r\n        'Zoom in/out with mouse wheel or +/- buttons',\r\n        'Pan by dragging the map',\r\n        'Switch between layers (if multiple)',\r\n        'Toggle basemap styles',\r\n        'Full-screen mode available'\r\n      ]\r\n    };\r\n  } catch (error: any) {\r\n    return {\r\n      success: false,\r\n      operation: 'create',\r\n      error: error.message || 'Failed to create map',\r\n      message: 'Map creation failed'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * List active maps\r\n */\r\nasync function listMaps() {\r\n  const maps = Object.values(activeMaps).map(session => ({\r\n    id: session.id,\r\n    url: `http://localhost:3000/map/${session.id}`,\r\n    region: session.region,\r\n    created: session.created.toISOString(),\r\n    layers: session.layers.length\r\n  }));\r\n  \r\n  return {\r\n    success: true,\r\n    operation: 'list',\r\n    count: maps.length,\r\n    maps,\r\n    message: `${maps.length} active map(s)`\r\n  };\r\n}\r\n\r\n/**\r\n * Delete a map session\r\n */\r\nasync function deleteMap(params: any) {\r\n  const { mapId } = params;\r\n  \r\n  if (!mapId) {\r\n    return {\r\n      success: false,\r\n      operation: 'delete',\r\n      error: 'Map ID required',\r\n      message: 'Please provide a map ID to delete'\r\n    };\r\n  }\r\n  \r\n  if (activeMaps[mapId]) {\r\n    delete activeMaps[mapId];\r\n    return {\r\n      success: true,\r\n      operation: 'delete',\r\n      mapId,\r\n      message: 'Map session deleted'\r\n    };\r\n  } else {\r\n    return {\r\n      success: false,\r\n      operation: 'delete',\r\n      mapId,\r\n      error: 'Map not found',\r\n      message: `No active map with ID: ${mapId}`\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Get region geometry\r\n */\r\nasync function getRegionGeometry(region: string) {\r\n  // Try to parse as coordinates first\r\n  if (region.includes(',')) {\r\n    const parts = region.split(',').map(p => parseFloat(p.trim()));\r\n    if (parts.length === 4) {\r\n      // Bounding box\r\n      return ee.Geometry.Rectangle([parts[0], parts[1], parts[2], parts[3]]);\r\n    }\r\n  }\r\n  \r\n  // Try to get from known regions\r\n  try {\r\n    // Check if it's a state\r\n    const states = ee.FeatureCollection('TIGER/2016/States');\r\n    const state = states.filter(ee.Filter.eq('NAME', region)).first();\r\n    const stateInfo = await state.getInfo();\r\n    if (stateInfo && stateInfo.geometry) {\r\n      return state.geometry();\r\n    }\r\n  } catch (e) {\r\n    // Not a state\r\n  }\r\n  \r\n  // Try counties\r\n  try {\r\n    const counties = ee.FeatureCollection('TIGER/2016/Counties');\r\n    let county;\r\n    \r\n    if (region.includes(',')) {\r\n      // Format: \"County, State\"\r\n      const parts = region.split(',').map(p => p.trim());\r\n      county = counties.filter(ee.Filter.eq('NAME', parts[0])).first();\r\n    } else {\r\n      county = counties.filter(ee.Filter.eq('NAME', region)).first();\r\n    }\r\n    \r\n    const countyInfo = await county.getInfo();\r\n    if (countyInfo && countyInfo.geometry) {\r\n      return county.geometry();\r\n    }\r\n  } catch (e) {\r\n    // Not a county\r\n  }\r\n  \r\n  // Default to a point\r\n  return ee.Geometry.Point([-98.5795, 39.8283]).buffer(100000); // 100km buffer around US center\r\n}\r\n\r\n/**\r\n * Get map session (for API endpoint)\r\n */\r\nexport function getMapSession(mapId: string): MapSession | undefined {\r\n  return activeMaps[mapId];\r\n}\r\n\r\n/**\r\n * Main handler\r\n */\r\nasync function handler(params: any) {\r\n  const { operation } = params;\r\n  \r\n  switch (operation) {\r\n    case 'create':\r\n      return await createMap(params);\r\n    \r\n    case 'list':\r\n      return await listMaps();\r\n    \r\n    case 'delete':\r\n      return await deleteMap(params);\r\n    \r\n    default:\r\n      throw new Error(`Unknown operation: ${operation}`);\r\n  }\r\n}\r\n\r\n// Register the tool\r\nregister({\r\n  name: 'earth_engine_map',\r\n  description: 'Interactive Map Viewer - create, list, delete interactive web maps',\r\n  input: MapToolSchema,\r\n  output: z.any(),\r\n  handler\r\n});\r\n\r\nexport { handler as mapHandler };","/**\r\n * CROP CLASSIFICATION TOOL\r\n * Comprehensive tool for building, training, and visualizing crop classification models\r\n * Supports custom ground truth data and automatic map generation\r\n */\r\n\r\nimport ee from '@google/earthengine';\r\nimport { z } from 'zod';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { register } from '../../registry';\r\nimport { parseAoi } from '@/src/utils/geo';\r\nimport { \r\n  addComposite, \r\n  getComposite, \r\n  globalCompositeStore as compositeStore,\r\n  addMapSession,\r\n  globalMapSessions as activeMaps\r\n} from '@/src/lib/global-store';\r\n\r\n// Training point schema\r\nconst TrainingPointSchema = z.object({\r\n  lat: z.number(),\r\n  lon: z.number(),\r\n  label: z.number(),\r\n  class_name: z.string()\r\n});\r\n\r\n// Main tool schema\r\nconst CropClassificationSchema = z.object({\r\n  operation: z.enum(['classify', 'train', 'evaluate', 'export']).describe('Operation type: classify (full classification), train (model only), evaluate (accuracy metrics), export (save results)'),\r\n  \r\n  // Region parameters\r\n  region: z.string().describe('US state name (e.g., Iowa, California) or geometry. Supported states: Iowa, California, Texas, Kansas, Nebraska, Illinois'),\r\n  \r\n  // Time parameters\r\n  startDate: z.string().optional().describe('Start date for imagery in YYYY-MM-DD format. Default: 6 months ago'),\r\n  endDate: z.string().optional().describe('End date for imagery in YYYY-MM-DD format. Default: current date'),\r\n  \r\n  // Training data\r\n  trainingData: z.union([\r\n    z.array(TrainingPointSchema),\r\n    z.string() // Path to training data file\r\n  ]).optional().describe('Optional custom training points. If not provided, uses default training data for the specified state'),\r\n  \r\n  // Classification parameters\r\n  classifier: z.enum(['randomForest', 'svm', 'cart', 'naiveBayes']).optional().describe('Machine learning classifier. Default: randomForest (best accuracy)'),\r\n  numberOfTrees: z.number().optional().describe('Number of trees for Random Forest classifier (10-500). Default: 50'),\r\n  seed: z.number().optional().describe('Random seed for reproducibility. Default: 42'),\r\n  \r\n  // Feature selection\r\n  features: z.array(z.string()).optional().describe('Specific bands and indices to use. Default: all available bands'),\r\n  includeIndices: z.boolean().optional().describe('Include vegetation indices (NDVI, EVI, SAVI, NDWI). Default: true'),\r\n  \r\n  // Visualization\r\n  createMap: z.boolean().optional().describe('Create interactive web map (slower for large areas). Default: false. Set to false for faster processing'),\r\n  palette: z.array(z.string()).optional().describe('Color palette for classes. Default: automatic based on class count'),\r\n  \r\n  // Class definitions\r\n  classDefinitions: z.record(z.string(), z.string()).optional().describe('Mapping of class numbers to names. Default: uses training data class names'),\r\n  \r\n  // Additional options\r\n  scale: z.number().optional().describe('Pixel resolution in meters (10-1000). Default: 30 for Landsat/Sentinel'),\r\n  cloudCoverMax: z.number().optional().describe('Maximum cloud cover percentage (0-100). Default: 20'),\r\n  spatialFiltering: z.boolean().optional().describe('Apply spatial filtering to reduce noise. Default: false'),\r\n  kernelSize: z.number().optional().describe('Kernel size for spatial filtering (1-9). Default: 3')\r\n});\r\n\r\n// Type definitions\r\ntype CropClassificationParams = z.infer<typeof CropClassificationSchema>;\r\n\r\n/**\r\n * Get default training data for a state\r\n */\r\nfunction getDefaultTrainingData(stateName: string): any[] {\r\n  const trainingDataSets: Record<string, any[]> = {\r\n    'Iowa': [\r\n      // Corn\r\n      { lat: 41.5868, lon: -93.6250, label: 1, class_name: 'corn' },\r\n      { lat: 42.0458, lon: -93.5801, label: 1, class_name: 'corn' },\r\n      { lat: 41.2619, lon: -91.5301, label: 1, class_name: 'corn' },\r\n      { lat: 42.5011, lon: -94.1627, label: 1, class_name: 'corn' },\r\n      { lat: 40.5847, lon: -91.3976, label: 1, class_name: 'corn' },\r\n      // Soybean\r\n      { lat: 41.6912, lon: -93.0519, label: 2, class_name: 'soybean' },\r\n      { lat: 42.7411, lon: -94.6831, label: 2, class_name: 'soybean' },\r\n      { lat: 41.0381, lon: -92.4046, label: 2, class_name: 'soybean' },\r\n      { lat: 43.0835, lon: -94.2376, label: 2, class_name: 'soybean' },\r\n      { lat: 40.8089, lon: -95.0172, label: 2, class_name: 'soybean' },\r\n      // Other crops\r\n      { lat: 41.3306, lon: -94.3831, label: 3, class_name: 'wheat' },\r\n      { lat: 42.3875, lon: -92.1821, label: 3, class_name: 'wheat' },\r\n      { lat: 40.7392, lon: -94.8463, label: 3, class_name: 'wheat' },\r\n      // Urban\r\n      { lat: 41.5868, lon: -93.6250, label: 4, class_name: 'urban' },\r\n      { lat: 41.6611, lon: -91.5302, label: 4, class_name: 'urban' },\r\n      // Water\r\n      { lat: 41.0000, lon: -91.0960, label: 5, class_name: 'water' },\r\n      { lat: 42.0458, lon: -93.3688, label: 5, class_name: 'water' }\r\n    ],\r\n    'California': [\r\n      // Almonds\r\n      { lat: 36.5370, lon: -119.5217, label: 1, class_name: 'almonds' },\r\n      { lat: 37.3200, lon: -120.4800, label: 1, class_name: 'almonds' },\r\n      { lat: 38.2500, lon: -121.3500, label: 1, class_name: 'almonds' },\r\n      // Grapes\r\n      { lat: 38.5049, lon: -122.4694, label: 2, class_name: 'grapes' },\r\n      { lat: 38.2919, lon: -122.4580, label: 2, class_name: 'grapes' },\r\n      { lat: 35.6138, lon: -120.1937, label: 2, class_name: 'grapes' },\r\n      // Citrus\r\n      { lat: 34.0536, lon: -117.8104, label: 3, class_name: 'citrus' },\r\n      { lat: 33.8700, lon: -117.0300, label: 3, class_name: 'citrus' },\r\n      { lat: 36.1400, lon: -119.3700, label: 3, class_name: 'citrus' },\r\n      // Rice\r\n      { lat: 39.3600, lon: -121.5900, label: 4, class_name: 'rice' },\r\n      { lat: 39.5200, lon: -121.8500, label: 4, class_name: 'rice' },\r\n      { lat: 39.1400, lon: -121.6300, label: 4, class_name: 'rice' },\r\n      // Forest\r\n      { lat: 41.2132, lon: -124.0046, label: 5, class_name: 'forest' },\r\n      { lat: 40.8000, lon: -123.8000, label: 5, class_name: 'forest' },\r\n      { lat: 37.8651, lon: -119.5383, label: 5, class_name: 'forest' },\r\n      // Urban\r\n      { lat: 34.0522, lon: -118.2437, label: 6, class_name: 'urban' },\r\n      { lat: 37.7749, lon: -122.4194, label: 6, class_name: 'urban' },\r\n      { lat: 32.7157, lon: -117.1611, label: 6, class_name: 'urban' },\r\n      // Desert\r\n      { lat: 35.1000, lon: -116.0000, label: 7, class_name: 'desert' },\r\n      { lat: 33.0000, lon: -115.5000, label: 7, class_name: 'desert' },\r\n      // Water\r\n      { lat: 39.0000, lon: -122.0000, label: 8, class_name: 'water' },\r\n      { lat: 38.0000, lon: -122.2500, label: 8, class_name: 'water' }\r\n    ],\r\n    'Texas': [\r\n      // Cotton\r\n      { lat: 33.5779, lon: -101.8552, label: 1, class_name: 'cotton' },\r\n      { lat: 32.3513, lon: -102.0779, label: 1, class_name: 'cotton' },\r\n      // Wheat\r\n      { lat: 35.2220, lon: -101.8313, label: 2, class_name: 'wheat' },\r\n      { lat: 34.0522, lon: -100.9810, label: 2, class_name: 'wheat' },\r\n      // Corn\r\n      { lat: 36.0726, lon: -102.0770, label: 3, class_name: 'corn' },\r\n      { lat: 35.8403, lon: -100.5355, label: 3, class_name: 'corn' },\r\n      // Sorghum\r\n      { lat: 31.9686, lon: -102.0779, label: 4, class_name: 'sorghum' },\r\n      { lat: 33.5779, lon: -99.0901, label: 4, class_name: 'sorghum' },\r\n      // Grassland\r\n      { lat: 31.0000, lon: -100.0000, label: 5, class_name: 'grassland' },\r\n      { lat: 32.0000, lon: -99.0000, label: 5, class_name: 'grassland' },\r\n      // Urban\r\n      { lat: 29.7604, lon: -95.3698, label: 6, class_name: 'urban' },\r\n      { lat: 32.7767, lon: -96.7970, label: 6, class_name: 'urban' },\r\n      { lat: 30.2672, lon: -97.7431, label: 6, class_name: 'urban' }\r\n    ],\r\n    'Kansas': [\r\n      // Wheat\r\n      { lat: 38.5000, lon: -98.5000, label: 1, class_name: 'wheat' },\r\n      { lat: 37.6000, lon: -97.3000, label: 1, class_name: 'wheat' },\r\n      { lat: 39.0000, lon: -99.0000, label: 1, class_name: 'wheat' },\r\n      // Corn\r\n      { lat: 39.0469, lon: -95.6775, label: 2, class_name: 'corn' },\r\n      { lat: 38.0000, lon: -96.0000, label: 2, class_name: 'corn' },\r\n      // Sorghum\r\n      { lat: 37.0000, lon: -98.0000, label: 3, class_name: 'sorghum' },\r\n      { lat: 38.0000, lon: -99.0000, label: 3, class_name: 'sorghum' },\r\n      // Soybean\r\n      { lat: 39.5000, lon: -95.0000, label: 4, class_name: 'soybean' },\r\n      { lat: 38.5000, lon: -94.8000, label: 4, class_name: 'soybean' },\r\n      // Grassland\r\n      { lat: 37.5000, lon: -100.0000, label: 5, class_name: 'grassland' },\r\n      { lat: 38.0000, lon: -101.0000, label: 5, class_name: 'grassland' },\r\n      // Urban\r\n      { lat: 37.6872, lon: -97.3301, label: 6, class_name: 'urban' },\r\n      { lat: 39.0473, lon: -95.6752, label: 6, class_name: 'urban' }\r\n    ],\r\n    'Nebraska': [\r\n      // Corn\r\n      { lat: 41.2565, lon: -95.9345, label: 1, class_name: 'corn' },\r\n      { lat: 40.8136, lon: -96.7026, label: 1, class_name: 'corn' },\r\n      { lat: 41.5000, lon: -97.5000, label: 1, class_name: 'corn' },\r\n      // Soybean\r\n      { lat: 40.5000, lon: -96.0000, label: 2, class_name: 'soybean' },\r\n      { lat: 41.0000, lon: -95.5000, label: 2, class_name: 'soybean' },\r\n      // Wheat\r\n      { lat: 41.0000, lon: -100.0000, label: 3, class_name: 'wheat' },\r\n      { lat: 42.0000, lon: -101.0000, label: 3, class_name: 'wheat' },\r\n      // Grassland\r\n      { lat: 41.5000, lon: -101.5000, label: 4, class_name: 'grassland' },\r\n      { lat: 42.0000, lon: -102.0000, label: 4, class_name: 'grassland' },\r\n      // Urban\r\n      { lat: 41.2565, lon: -95.9345, label: 5, class_name: 'urban' },\r\n      { lat: 40.8136, lon: -96.7026, label: 5, class_name: 'urban' }\r\n    ],\r\n    'Illinois': [\r\n      // Corn\r\n      { lat: 41.8781, lon: -87.6298, label: 1, class_name: 'corn' },\r\n      { lat: 40.1106, lon: -88.2073, label: 1, class_name: 'corn' },\r\n      { lat: 39.7817, lon: -89.6501, label: 1, class_name: 'corn' },\r\n      { lat: 41.5000, lon: -89.0000, label: 1, class_name: 'corn' },\r\n      // Soybean\r\n      { lat: 40.5000, lon: -89.5000, label: 2, class_name: 'soybean' },\r\n      { lat: 39.5000, lon: -88.5000, label: 2, class_name: 'soybean' },\r\n      { lat: 41.0000, lon: -88.0000, label: 2, class_name: 'soybean' },\r\n      // Wheat\r\n      { lat: 38.5000, lon: -89.0000, label: 3, class_name: 'wheat' },\r\n      { lat: 37.5000, lon: -88.5000, label: 3, class_name: 'wheat' },\r\n      // Urban\r\n      { lat: 41.8781, lon: -87.6298, label: 4, class_name: 'urban' },\r\n      { lat: 39.7817, lon: -89.6501, label: 4, class_name: 'urban' },\r\n      // Water\r\n      { lat: 42.0000, lon: -87.5000, label: 5, class_name: 'water' }\r\n    ]\r\n  };\r\n  \r\n  return trainingDataSets[stateName] || [];\r\n}\r\n\r\n/**\r\n * Automatically add common sense classes (urban, water, vegetation) to training data\r\n * This function ALWAYS adds these classes if they're missing to ensure comprehensive classification\r\n */\r\nfunction augmentWithCommonSenseClasses(\r\n  trainingPoints: any[], \r\n  stateName: string\r\n): any[] {\r\n  // Check what classes are already present\r\n  const existingClasses = new Set(trainingPoints.map(p => p.class_name.toLowerCase()));\r\n  const existingLabels = new Set(trainingPoints.map(p => p.label));\r\n  \r\n  // Find the next available label\r\n  let nextLabel = Math.max(...Array.from(existingLabels)) + 1;\r\n  const augmentedPoints = [...trainingPoints];\r\n  \r\n  // Track if we added any common classes\r\n  let addedCommonClasses = false;\r\n  \r\n  // Add urban class if not present\r\n  const hasUrban = existingClasses.has('urban') || existingClasses.has('built-up') || \r\n                   existingClasses.has('city') || existingClasses.has('developed');\r\n  if (!hasUrban) {\r\n    const urbanPoints = [\r\n      // Major cities based on state - add more points for better coverage\r\n      ...(stateName === 'Iowa' ? [\r\n        { lat: 41.5868, lon: -93.6250 }, // Des Moines\r\n        { lat: 41.6611, lon: -91.5302 }, // Cedar Rapids\r\n        { lat: 42.5003, lon: -96.4003 }, // Sioux City\r\n        { lat: 42.0308, lon: -92.9134 }  // Waterloo\r\n      ] : []),\r\n      ...(stateName === 'California' ? [\r\n        { lat: 34.0522, lon: -118.2437 }, // Los Angeles  \r\n        { lat: 37.7749, lon: -122.4194 }, // San Francisco\r\n        { lat: 32.7157, lon: -117.1611 }, // San Diego\r\n        { lat: 38.5816, lon: -121.4944 }  // Sacramento\r\n      ] : []),\r\n      ...(stateName === 'Texas' ? [\r\n        { lat: 29.7604, lon: -95.3698 }, // Houston\r\n        { lat: 32.7767, lon: -96.7970 }, // Dallas\r\n        { lat: 30.2672, lon: -97.7431 }, // Austin\r\n        { lat: 29.4241, lon: -98.4936 }  // San Antonio\r\n      ] : []),\r\n      ...(stateName === 'Kansas' ? [\r\n        { lat: 37.6872, lon: -97.3301 }, // Wichita\r\n        { lat: 39.0473, lon: -95.6752 }, // Topeka\r\n        { lat: 39.0997, lon: -94.5786 }, // Kansas City\r\n        { lat: 38.9717, lon: -95.2353 }  // Lawrence\r\n      ] : []),\r\n      ...(stateName === 'Nebraska' ? [\r\n        { lat: 41.2565, lon: -95.9345 }, // Omaha\r\n        { lat: 40.8136, lon: -96.7026 }, // Lincoln\r\n        { lat: 40.9264, lon: -98.3420 }, // Grand Island\r\n        { lat: 42.0250, lon: -97.4195 }  // Norfolk\r\n      ] : []),\r\n      ...(stateName === 'Illinois' ? [\r\n        { lat: 41.8781, lon: -87.6298 }, // Chicago\r\n        { lat: 39.7817, lon: -89.6501 }, // Springfield\r\n        { lat: 41.5253, lon: -88.0817 }, // Aurora\r\n        { lat: 40.4842, lon: -88.9937 }  // Bloomington\r\n      ] : [])\r\n    ];\r\n    \r\n    urbanPoints.forEach(p => {\r\n      augmentedPoints.push({\r\n        ...p,\r\n        label: nextLabel,\r\n        class_name: 'urban'\r\n      });\r\n    });\r\n    if (urbanPoints.length > 0) {\r\n      nextLabel++;\r\n      addedCommonClasses = true;\r\n    }\r\n  }\r\n  \r\n  // Add water class if not present\r\n  const hasWater = existingClasses.has('water') || existingClasses.has('lake') || \r\n                   existingClasses.has('river') || existingClasses.has('wetland');\r\n  if (!hasWater) {\r\n    const waterPoints = [\r\n      ...(stateName === 'Iowa' ? [\r\n        { lat: 41.0585, lon: -91.5955 }, // Mississippi River\r\n        { lat: 42.0458, lon: -93.3688 }, // Clear Lake\r\n        { lat: 42.4039, lon: -94.7014 }, // Storm Lake\r\n        { lat: 41.3911, lon: -91.0432 }  // Coralville Lake\r\n      ] : []),\r\n      ...(stateName === 'California' ? [\r\n        { lat: 39.0968, lon: -120.0324 }, // Lake Tahoe\r\n        { lat: 33.2175, lon: -115.6139 }, // Salton Sea\r\n        { lat: 37.9993, lon: -122.1339 }, // San Francisco Bay\r\n        { lat: 36.9806, lon: -121.8814 }  // Monterey Bay\r\n      ] : []),\r\n      ...(stateName === 'Texas' ? [\r\n        { lat: 30.4064, lon: -98.1145 }, // Lake Travis\r\n        { lat: 29.5964, lon: -95.0565 }, // Galveston Bay\r\n        { lat: 32.7714, lon: -97.8056 }, // Lake Worth\r\n        { lat: 31.0969, lon: -97.7171 }  // Belton Lake\r\n      ] : []),\r\n      ...(stateName === 'Kansas' ? [\r\n        { lat: 38.7022, lon: -99.3236 }, // Cedar Bluff Reservoir\r\n        { lat: 39.0558, lon: -96.5864 }, // Tuttle Creek Lake\r\n        { lat: 37.2739, lon: -97.8684 }, // Cheney Reservoir\r\n        { lat: 38.3714, lon: -95.7308 }  // Pomona Lake\r\n      ] : []),\r\n      ...(stateName === 'Nebraska' ? [\r\n        { lat: 41.2044, lon: -96.0819 }, // Missouri River\r\n        { lat: 41.1756, lon: -100.7715 }, // Lake McConaughy\r\n        { lat: 40.7719, lon: -96.8867 }, // Branched Oak Lake\r\n        { lat: 42.7614, lon: -97.3584 }  // Lewis and Clark Lake\r\n      ] : []),\r\n      ...(stateName === 'Illinois' ? [\r\n        { lat: 41.8919, lon: -87.6051 }, // Lake Michigan\r\n        { lat: 39.0000, lon: -90.6731 }, // Mississippi River\r\n        { lat: 37.2289, lon: -88.7270 }, // Rend Lake\r\n        { lat: 40.6389, lon: -89.3981 }  // Illinois River\r\n      ] : [])\r\n    ];\r\n    \r\n    waterPoints.forEach(p => {\r\n      augmentedPoints.push({\r\n        ...p,\r\n        label: nextLabel,\r\n        class_name: 'water'\r\n      });\r\n    });\r\n    if (waterPoints.length > 0) {\r\n      nextLabel++;\r\n      addedCommonClasses = true;\r\n    }\r\n  }\r\n  \r\n  // Add natural vegetation if not present (forest/grassland)\r\n  const hasVegetation = existingClasses.has('forest') || existingClasses.has('grassland') || \r\n                        existingClasses.has('pasture') || existingClasses.has('woods') ||\r\n                        existingClasses.has('natural_vegetation');\r\n  if (!hasVegetation) {\r\n    const vegetationPoints = [\r\n      ...(stateName === 'Iowa' ? [\r\n        { lat: 42.4313, lon: -90.7093 }, // Yellow River State Forest\r\n        { lat: 41.9908, lon: -91.6806 }  // Wapsipinicon State Park\r\n      ] : []),\r\n      ...(stateName === 'California' ? [\r\n        { lat: 37.8651, lon: -119.5383 }, // Yosemite\r\n        { lat: 41.2132, lon: -124.0046 }  // Redwood Forest\r\n      ] : []),\r\n      ...(stateName === 'Texas' ? [\r\n        { lat: 30.2500, lon: -103.5000 }, // Big Bend grassland\r\n        { lat: 30.6077, lon: -96.3344 }  // Brazos Valley\r\n      ] : []),\r\n      ...(stateName === 'Kansas' ? [\r\n        { lat: 38.7839, lon: -99.3185 }, // Prairie grassland\r\n        { lat: 37.7528, lon: -100.0217 }  // Cimarron National Grassland\r\n      ] : []),\r\n      ...(stateName === 'Nebraska' ? [\r\n        { lat: 42.8136, lon: -103.0019 }, // Nebraska National Forest\r\n        { lat: 41.9047, lon: -100.5089 }  // Sandhills grassland\r\n      ] : []),\r\n      ...(stateName === 'Illinois' ? [\r\n        { lat: 37.5006, lon: -88.9995 }, // Shawnee National Forest\r\n        { lat: 41.8661, lon: -88.1436 }  // Morton Arboretum\r\n      ] : [])\r\n    ];\r\n    \r\n    vegetationPoints.forEach(p => {\r\n      augmentedPoints.push({\r\n        ...p,\r\n        label: nextLabel,\r\n        class_name: 'natural_vegetation'\r\n      });\r\n    });\r\n    if (vegetationPoints.length > 0) nextLabel++;\r\n  }\r\n  \r\n  return augmentedPoints;\r\n}\r\n\r\n/**\r\n * Get default class definitions and palette for a state\r\n */\r\nfunction getDefaultClassInfo(stateName: string): { definitions: Record<string, string>, palette: string[] } {\r\n  const classInfo: Record<string, any> = {\r\n    'Iowa': {\r\n      definitions: {\r\n        '1': 'corn',\r\n        '2': 'soybean',\r\n        '3': 'other_crops',\r\n        '4': 'urban',\r\n        '5': 'water'\r\n      },\r\n      palette: ['FFD700', '228B22', '8B4513', 'DC143C', '4682B4']\r\n    },\r\n    'California': {\r\n      definitions: {\r\n        '1': 'almonds',\r\n        '2': 'grapes',\r\n        '3': 'citrus',\r\n        '4': 'rice',\r\n        '5': 'forest',\r\n        '6': 'urban',\r\n        '7': 'desert',\r\n        '8': 'water'\r\n      },\r\n      palette: ['D4A76A', '800080', 'FFA500', '87CEEB', '228B22', 'DC143C', 'DEB887', '4682B4']\r\n    },\r\n    'Texas': {\r\n      definitions: {\r\n        '1': 'cotton',\r\n        '2': 'wheat',\r\n        '3': 'corn',\r\n        '4': 'sorghum',\r\n        '5': 'grassland',\r\n        '6': 'urban'\r\n      },\r\n      palette: ['F5DEB3', 'D2691E', 'FFD700', 'CD853F', '90EE90', 'DC143C']\r\n    },\r\n    'Kansas': {\r\n      definitions: {\r\n        '1': 'wheat',\r\n        '2': 'corn',\r\n        '3': 'sorghum',\r\n        '4': 'soybean',\r\n        '5': 'grassland',\r\n        '6': 'urban'\r\n      },\r\n      palette: ['D2691E', 'FFD700', 'CD853F', '228B22', '90EE90', 'DC143C']\r\n    },\r\n    'Nebraska': {\r\n      definitions: {\r\n        '1': 'corn',\r\n        '2': 'soybean',\r\n        '3': 'wheat',\r\n        '4': 'grassland',\r\n        '5': 'urban'\r\n      },\r\n      palette: ['FFD700', '228B22', 'D2691E', '90EE90', 'DC143C']\r\n    },\r\n    'Illinois': {\r\n      definitions: {\r\n        '1': 'corn',\r\n        '2': 'soybean',\r\n        '3': 'wheat',\r\n        '4': 'urban',\r\n        '5': 'water'\r\n      },\r\n      palette: ['FFD700', '228B22', 'D2691E', 'DC143C', '4682B4']\r\n    },\r\n    'default': {\r\n      definitions: {\r\n        '1': 'class_1',\r\n        '2': 'class_2',\r\n        '3': 'class_3',\r\n        '4': 'class_4',\r\n        '5': 'class_5'\r\n      },\r\n      palette: ['FF0000', '00FF00', '0000FF', 'FFFF00', 'FF00FF']\r\n    }\r\n  };\r\n  \r\n  return classInfo[stateName] || classInfo['default'];\r\n}\r\n\r\n/**\r\n * Main crop classification function\r\n */\r\nasync function classifyCrops(params: CropClassificationParams) {\r\n  const {\r\n    region,\r\n    startDate = '2024-06-01',\r\n    endDate = '2024-08-31',\r\n    trainingData,\r\n    classifier = 'randomForest',\r\n    numberOfTrees = 100,\r\n    seed = Date.now() % 100000,\r\n    features,\r\n    includeIndices = true,\r\n    createMap = true,\r\n    palette,\r\n    classDefinitions,\r\n    scale = 30,\r\n    cloudCoverMax = 20,\r\n    spatialFiltering = true,\r\n    kernelSize = 1\r\n  } = params;\r\n  \r\n  try {\r\n    // Get region geometry\r\n    let geometry;\r\n    let stateName = region;\r\n    \r\n    // Check if region is a known state\r\n    const states = ee.FeatureCollection('TIGER/2018/States');\r\n    const stateFeature = states.filter(ee.Filter.eq('NAME', region));\r\n    const stateInfo = await stateFeature.first().getInfo();\r\n    \r\n    if (stateInfo && stateInfo.geometry) {\r\n      geometry = stateFeature.geometry();\r\n    } else {\r\n      // Try to parse as custom geometry\r\n      geometry = await parseAoi(region);\r\n      stateName = 'default';  // Use 'default' instead of 'custom' to ensure class definitions exist\r\n    }\r\n    \r\n    // Get training data\r\n    let trainingPoints = trainingData;\r\n    if (!trainingPoints) {\r\n      trainingPoints = getDefaultTrainingData(stateName);\r\n      if (trainingPoints.length === 0) {\r\n        throw new Error(`No default training data available for ${stateName}. Please provide custom training data.`);\r\n      }\r\n    }\r\n    \r\n    // ALWAYS augment with common sense classes\r\n    // This ensures urban, water, and natural vegetation are always included\r\n    trainingPoints = augmentWithCommonSenseClasses(trainingPoints, stateName);\r\n    \r\n    // Get class info\r\n    let classInfo = classDefinitions && palette \r\n      ? { definitions: classDefinitions, palette } \r\n      : getDefaultClassInfo(stateName);\r\n    \r\n    // Always update class definitions to include augmented classes\r\n    // This ensures urban, water, and vegetation are always in the classification\r\n    if (trainingPoints.length > (trainingData ? trainingData.length : 0)) {\r\n      // Create new class definitions including augmented classes\r\n      const updatedDefinitions: Record<string, string> = {};\r\n      const updatedPalette: string[] = [];\r\n      \r\n      // Get unique labels and class names from augmented training points\r\n      const labelMap = new Map<number, string>();\r\n      trainingPoints.forEach((p: any) => {\r\n        if (!labelMap.has(p.label)) {\r\n          labelMap.set(p.label, p.class_name);\r\n        }\r\n      });\r\n      \r\n      // Sort labels and create definitions\r\n      const sortedLabels = Array.from(labelMap.keys()).sort((a, b) => a - b);\r\n      sortedLabels.forEach((label, index) => {\r\n        updatedDefinitions[label.toString()] = labelMap.get(label) || `class_${label}`;\r\n        \r\n        // Generate palette colors\r\n        const className = labelMap.get(label) || '';\r\n        if (className.includes('corn')) updatedPalette.push('FFD700');\r\n        else if (className.includes('soybean')) updatedPalette.push('228B22');\r\n        else if (className.includes('wheat')) updatedPalette.push('D2691E');\r\n        else if (className.includes('cotton')) updatedPalette.push('F5DEB3');\r\n        else if (className.includes('urban')) updatedPalette.push('DC143C');\r\n        else if (className.includes('water')) updatedPalette.push('4682B4');\r\n        else if (className.includes('vegetation') || className.includes('forest')) updatedPalette.push('006400');\r\n        else if (className.includes('grassland')) updatedPalette.push('90EE90');\r\n        else updatedPalette.push(['FF0000', '00FF00', '0000FF', 'FFFF00', 'FF00FF'][index % 5]);\r\n      });\r\n      \r\n      classInfo = {\r\n        definitions: updatedDefinitions,\r\n        palette: updatedPalette\r\n      };\r\n    }\r\n    \r\n    // Create Earth Engine feature collection from training points\r\n    const trainingFeaturesCode = trainingPoints.map((p: any) => \r\n      `ee.Feature(ee.Geometry.Point([${p.lon}, ${p.lat}]), {\r\n        'label': ${p.label},\r\n        'class_name': '${p.class_name}'\r\n      })`\r\n    ).join(',\\n    ');\r\n    \r\n    // Get Sentinel-2 composite\r\n    let s2Collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\r\n      .filterDate(startDate, endDate)\r\n      .filterBounds(geometry)\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', cloudCoverMax));\r\n    \r\n    // Cloud masking function\r\n    const maskClouds = (image: any) => {\r\n      const qa = image.select('QA60');\r\n      const mask = qa.bitwiseAnd(1 << 10).eq(0).and(qa.bitwiseAnd(1 << 11).eq(0));\r\n      return image.updateMask(mask).divide(10000).select('B.*');\r\n    };\r\n    \r\n    // Apply cloud mask and create composite\r\n    const composite = s2Collection.map(maskClouds).median().clip(geometry);\r\n    \r\n    // Calculate indices if requested\r\n    let featureBands = composite;\r\n    const bandNames = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'B11', 'B12'];\r\n    \r\n    if (includeIndices) {\r\n      // Core vegetation indices\r\n      const ndvi = composite.normalizedDifference(['B8', 'B4']).rename('NDVI');\r\n      const ndwi = composite.normalizedDifference(['B3', 'B8']).rename('NDWI');\r\n      const ndbi = composite.normalizedDifference(['B11', 'B8']).rename('NDBI');\r\n      const evi = composite.expression(\r\n        '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {\r\n        'NIR': composite.select('B8'),\r\n        'RED': composite.select('B4'),\r\n        'BLUE': composite.select('B2')\r\n      }).rename('EVI');\r\n      const savi = composite.expression(\r\n        '1.5 * (NIR - RED) / (NIR + RED + 0.5)', {\r\n        'NIR': composite.select('B8'),\r\n        'RED': composite.select('B4')\r\n      }).rename('SAVI');\r\n      const bsi = composite.expression(\r\n        '((SWIR1 + RED) - (NIR + BLUE)) / ((SWIR1 + RED) + (NIR + BLUE))', {\r\n        'SWIR1': composite.select('B11'),\r\n        'RED': composite.select('B4'),\r\n        'NIR': composite.select('B8'),\r\n        'BLUE': composite.select('B2')\r\n      }).rename('BSI');\r\n      \r\n      // Add agricultural indices\r\n      const gndvi = composite.normalizedDifference(['B8', 'B3']).rename('GNDVI');\r\n      const ndre = composite.normalizedDifference(['B8', 'B5']).rename('NDRE');\r\n      \r\n      featureBands = composite.select(bandNames)\r\n        .addBands([ndvi, ndwi, ndbi, evi, savi, bsi, gndvi, ndre]);\r\n    }\r\n    \r\n    // Select features to use\r\n    const selectedFeatures = features || featureBands.bandNames();\r\n    featureBands = featureBands.select(selectedFeatures);\r\n    \r\n    // Create training features collection\r\n    // Use Function constructor instead of eval to avoid scope issues\r\n    const createTrainingFC = new Function('ee', `return ee.FeatureCollection([${trainingFeaturesCode}]);`);\r\n    const trainingFC = createTrainingFC(ee);\r\n    \r\n    // Sample training data (adjust scale for large states)\r\n    const sampleScale = stateName === 'California' || stateName === 'Texas' ? scale * 2 : scale;\r\n    const training = featureBands.sampleRegions({\r\n      collection: trainingFC,\r\n      properties: ['label'],\r\n      scale: sampleScale,\r\n      tileScale: 8,\r\n      geometries: false\r\n    });\r\n    \r\n    // Create and train classifier\r\n    let trainedClassifier;\r\n    switch (classifier) {\r\n      case 'randomForest':\r\n        // Use a reasonable default for variablesPerSplit\r\n        const numFeatures = Array.isArray(selectedFeatures) ? selectedFeatures.length : 10;\r\n        trainedClassifier = ee.Classifier.smileRandomForest({\r\n          numberOfTrees: numberOfTrees,\r\n          variablesPerSplit: Math.max(1, Math.floor(Math.sqrt(numFeatures))),\r\n          minLeafPopulation: 2,\r\n          bagFraction: 0.8,\r\n          seed: seed\r\n        }).train(training, 'label', selectedFeatures);\r\n        break;\r\n      \r\n      case 'svm':\r\n        trainedClassifier = ee.Classifier.libsvm({\r\n          kernelType: 'RBF',\r\n          gamma: 0.5,\r\n          cost: 10\r\n        }).train(training, 'label', selectedFeatures);\r\n        break;\r\n      \r\n      case 'cart':\r\n        trainedClassifier = ee.Classifier.smileCart()\r\n          .train(training, 'label', selectedFeatures);\r\n        break;\r\n      \r\n      case 'naiveBayes':\r\n        trainedClassifier = ee.Classifier.smileNaiveBayes()\r\n          .train(training, 'label', selectedFeatures);\r\n        break;\r\n      \r\n      default:\r\n        throw new Error(`Unknown classifier: ${classifier}`);\r\n    }\r\n    \r\n    // Classify the image\r\n    let classified = featureBands.classify(trainedClassifier);\r\n    \r\n    // Apply spatial filtering if requested\r\n    if (spatialFiltering) {\r\n      const kernel = ee.Kernel.square({ radius: kernelSize });\r\n      classified = classified.reduceNeighborhood({\r\n        reducer: ee.Reducer.mode(),\r\n        kernel: kernel\r\n      }).rename('classification');  // Rename back to 'classification'\r\n    }\r\n    \r\n    // Store the classified image\r\n    const classificationKey = `classification_${stateName}_${Date.now()}`;\r\n    compositeStore[classificationKey] = classified;\r\n    \r\n    // Store the classifier\r\n    const classifierKey = `classifier_${stateName}_${Date.now()}`;\r\n    compositeStore[classifierKey] = trainedClassifier;\r\n    \r\n    // Calculate statistics (skip for very large states to avoid memory issues)\r\n    let stats = null;\r\n    const largeStates = ['California', 'Texas', 'Alaska', 'Montana'];\r\n    \r\n    if (!largeStates.includes(stateName)) {\r\n      try {\r\n        const statsScale = scale * 20;\r\n        const pixelCount = classified.select(['classification']).reduceRegion({\r\n          reducer: ee.Reducer.frequencyHistogram(),\r\n          geometry: geometry,\r\n          scale: statsScale,\r\n          maxPixels: 1e7,\r\n          bestEffort: true\r\n        });\r\n        stats = await pixelCount.getInfo();\r\n      } catch (error) {\r\n        console.log('Statistics calculation skipped due to memory constraints');\r\n        stats = null;\r\n      }\r\n    }\r\n    \r\n    // Create result object\r\n    let result: any = {\r\n      success: true,\r\n      operation: 'classify',\r\n      classificationKey,\r\n      classifierKey,\r\n      message: 'Crop classification completed successfully',\r\n      region: stateName,\r\n      dateRange: { start: startDate, end: endDate },\r\n      classifier: classifier,\r\n      numberOfClasses: Object.keys(classInfo.definitions).length,\r\n      classDefinitions: classInfo.definitions,\r\n      features: selectedFeatures,\r\n      trainingPoints: trainingPoints.length,\r\n      statistics: stats\r\n    };\r\n    \r\n    // Create interactive map if requested\r\n    if (createMap) {\r\n      // IMPORTANT: Visualize the classification before getting tiles\r\n      // This ensures proper color rendering\r\n      const visParams = {\r\n        min: 1,\r\n        max: Object.keys(classInfo.definitions).length,\r\n        palette: classInfo.palette\r\n      };\r\n      \r\n      // Apply visualization to get RGB image\r\n      const visualized = classified.visualize(visParams);\r\n      \r\n      // Get map ID from the visualized image\r\n      const mapId = await new Promise((resolve, reject) => {\r\n        visualized.getMapId({}, (mapIdResult: any, error: any) => {\r\n          if (error) reject(error);\r\n          else resolve(mapIdResult);\r\n        });\r\n      });\r\n      \r\n      // Generate tile URL\r\n      const mapIdStr = (mapId as any).mapid || (mapId as any).urlFormat;\r\n      let tileUrl: string;\r\n      \r\n      if (mapIdStr.includes('http')) {\r\n        // Already a full URL\r\n        tileUrl = mapIdStr;\r\n      } else if (mapIdStr.includes('projects/earthengine-legacy/maps/')) {\r\n        // Already has the path prefix, don't add it again\r\n        tileUrl = `https://earthengine.googleapis.com/v1/${mapIdStr}/tiles/{z}/{x}/{y}`;\r\n      } else {\r\n        // Just the map ID, add the full path\r\n        tileUrl = `https://earthengine.googleapis.com/v1/projects/earthengine-legacy/maps/${mapIdStr}/tiles/{z}/{x}/{y}`;\r\n      }\r\n      \r\n      // Create map session\r\n      const mapSessionId = `map_${Date.now()}_${uuidv4().slice(0, 8)}`;\r\n      const mapUrl = `http://localhost:3000/map/${mapSessionId}`;\r\n      \r\n      // Determine map center\r\n      const bounds = await geometry.bounds().getInfo();\r\n      const coords = bounds.coordinates[0];\r\n      const minLng = Math.min(...coords.map((c: any) => c[0]));\r\n      const maxLng = Math.max(...coords.map((c: any) => c[0]));\r\n      const minLat = Math.min(...coords.map((c: any) => c[1]));\r\n      const maxLat = Math.max(...coords.map((c: any) => c[1]));\r\n      const center = [(minLng + maxLng) / 2, (minLat + maxLat) / 2];\r\n      \r\n      // No legend data needed\r\n      \r\n      // Store map session\r\n      const mapSession = {\r\n        id: mapSessionId,\r\n        input: classificationKey,\r\n        tileUrl: tileUrl,\r\n        created: new Date(),\r\n        region: stateName,\r\n        layers: [{\r\n          name: 'Crop Classification',\r\n          tileUrl: tileUrl,\r\n          visParams: visParams\r\n        }],\r\n        metadata: {\r\n          center: center,\r\n          zoom: stateName === 'California' ? 6 : 7,\r\n          basemap: 'satellite'\r\n        }\r\n      };\r\n      \r\n      addMapSession(mapSessionId, mapSession);\r\n      \r\n      result.map = {\r\n        url: mapUrl,\r\n        tileUrl: tileUrl,\r\n        center: center,\r\n        visualization: visParams\r\n      };\r\n    }\r\n    \r\n    return result;\r\n    \r\n  } catch (error: any) {\r\n    return {\r\n      success: false,\r\n      operation: 'classify',\r\n      error: error.message || 'Classification failed',\r\n      suggestion: 'Check your training data and region parameters'\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Export function for tool registration\r\n */\r\nexport async function execute(params: any) {\r\n  // Validate parameters\r\n  const parsed = CropClassificationSchema.safeParse(params);\r\n  if (!parsed.success) {\r\n    return {\r\n      success: false,\r\n      error: 'Invalid parameters',\r\n      details: parsed.error.errors\r\n    };\r\n  }\r\n  \r\n  const { operation } = parsed.data;\r\n  \r\n  switch (operation) {\r\n    case 'classify':\r\n      return await classifyCrops(parsed.data);\r\n    \r\n    case 'train':\r\n      // For future: separate training operation\r\n      return await classifyCrops({ ...parsed.data, createMap: false });\r\n    \r\n    case 'evaluate':\r\n      // For future: model evaluation\r\n      return {\r\n        success: false,\r\n        error: 'Evaluation operation not yet implemented'\r\n      };\r\n    \r\n    case 'export':\r\n      // For future: export classification results\r\n      return {\r\n        success: false,\r\n        error: 'Export operation not yet implemented'\r\n      };\r\n    \r\n    default:\r\n      return {\r\n        success: false,\r\n        error: `Unknown operation: ${operation}`\r\n      };\r\n  }\r\n}\r\n\r\n// Register the tool with MCP\r\nregister({\r\n  name: 'crop_classification',\r\n  description: `Machine learning crop and land cover classification using satellite imagery. \r\n    SUPPORTED REGIONS: Iowa, California, Texas, Kansas, Nebraska, Illinois (or custom coordinates).\r\n    FEATURES: Automatic cloud masking, vegetation indices (NDVI, EVI, SAVI, NDWI), multiple classifiers (Random Forest, SVM, CART, Naive Bayes).\r\n    OUTPUTS: Classification map, accuracy metrics, optional interactive web map.\r\n    PERFORMANCE: For faster processing, set createMap=false. Large regions may timeout with map creation enabled.\r\n    DEFAULT CLASSES by state: Iowa (corn, soybean, wheat, urban, water), California (almonds, grapes, citrus, rice, forest, urban, desert, water), Texas (cotton, wheat, corn, sorghum, grassland, urban).`,\r\n  input: CropClassificationSchema,\r\n  output: z.object({\r\n    success: z.boolean(),\r\n    operation: z.string(),\r\n    classificationKey: z.string().optional(),\r\n    classifierKey: z.string().optional(),\r\n    message: z.string(),\r\n    region: z.string(),\r\n    dateRange: z.object({\r\n      start: z.string(),\r\n      end: z.string()\r\n    }),\r\n    classifier: z.string(),\r\n    numberOfClasses: z.number(),\r\n    classDefinitions: z.record(z.string(), z.string()),\r\n    features: z.array(z.string()),\r\n    trainingPoints: z.number(),\r\n    statistics: z.any().optional(),\r\n    mapUrl: z.string().optional(),\r\n    tileUrl: z.string().optional(),\r\n    mapSessionId: z.string().optional()\r\n  }),\r\n  handler: execute\r\n});\r\n\r\n// Export handler for direct use\r\nexport const handler = execute;\r\n\r\n// Tool metadata for reference\r\nexport const metadata = {\r\n  name: 'crop_classification',\r\n  description: 'Machine learning crop and land cover classification',\r\n  parameters: CropClassificationSchema,\r\n  examples: [\r\n    {\r\n      description: 'Quick classification for Iowa (no map for speed)',\r\n      params: {\r\n        operation: 'classify',\r\n        region: 'Iowa',\r\n        startDate: '2024-05-01',\r\n        endDate: '2024-09-30',\r\n        classifier: 'randomForest',\r\n        numberOfTrees: 50,\r\n        includeIndices: true,\r\n        createMap: false  // Fast mode\r\n      }\r\n    },\r\n    {\r\n      description: 'California classification with map',\r\n      params: {\r\n        operation: 'classify',\r\n        region: 'California',\r\n        startDate: '2024-01-01',\r\n        endDate: '2024-06-30',\r\n        classifier: 'svm',\r\n        includeIndices: true,\r\n        scale: 30,\r\n        createMap: true  // Will be slower\r\n      }\r\n    },\r\n    {\r\n      description: 'Custom training data example',\r\n      params: {\r\n        operation: 'classify',\r\n        region: 'Texas',\r\n        startDate: '2024-06-01',\r\n        endDate: '2024-10-31',\r\n        trainingData: [\r\n          { lat: 33.5779, lon: -101.8552, label: 1, class_name: 'cotton' },\r\n          { lat: 35.2220, lon: -101.8313, label: 2, class_name: 'wheat' },\r\n          { lat: 36.0726, lon: -102.0770, label: 3, class_name: 'corn' },\r\n          { lat: 31.9686, lon: -102.0779, label: 4, class_name: 'sorghum' },\r\n          { lat: 31.0000, lon: -100.0000, label: 5, class_name: 'grassland' }\r\n        ],\r\n        classifier: 'randomForest',\r\n        numberOfTrees: 100,\r\n        includeIndices: true,\r\n        spatialFiltering: true,\r\n        kernelSize: 3,\r\n        createMap: false  // Recommended for large regions\r\n      }\r\n    },\r\n    {\r\n      description: 'Train model only (no classification)',\r\n      params: {\r\n        operation: 'train',\r\n        region: 'Kansas',\r\n        startDate: '2024-05-01',\r\n        endDate: '2024-09-30',\r\n        classifier: 'cart',\r\n        includeIndices: true\r\n      }\r\n    }\r\n  ]\r\n};\r\n\r\nexport default {};\r\n","// Import consolidated super tools\r\n// These 5 tools replace the 32 individual tools for better MCP stability\r\nimport './consolidated/earth_engine_data';     // Data operations: search, info, geometry\r\nimport './consolidated/earth_engine_system';   // System operations: auth, setup, help  \r\nimport './consolidated/earth_engine_process';  // Processing: NDVI, NDWI, thumbnail, timeseries\r\nimport './consolidated/earth_engine_export';   // Export operations: toAsset, toDrive, toGCS\r\nimport './consolidated/earth_engine_map';      // Interactive map viewer for large regions\r\nimport './consolidated/crop_classification';   // Crop classification: build, train, visualize models\r\n\r\n// Legacy tool imports commented out - replaced by consolidated tools above\r\n// import './auth_check';\r\n// import './search_gee_catalog';\r\n// import './shapefile_to_geometry';\r\n// import './get_shapefile_boundary';\r\n// import './use_shapefile_instead';\r\n// import './filter_collection';\r\n// import './smart_filter';\r\n// import './get_band_names';\r\n// import './load_cog_from_gcs';\r\n// import './mask_clouds';\r\n// import './create_mosaic';\r\n// import './clip_image';\r\n// import './resample_image';\r\n// import './spectral_index';\r\n// import './reduce_stats';\r\n// import './zonal_stats';\r\n// import './change_detect';\r\n// import './terrain';\r\n// import './time_series';\r\n// import './get_tiles';\r\n// import './get_thumbnail';\r\n// import './export_image';\r\n// import './export_composite';\r\n// import './export_to_drive';\r\n// import './export_to_gcs';\r\n// import './setup_gcs';\r\n// import './export_status';\r\n// import './gee_script_js';\r\n// import './gee_sdk_call';\r\n","#!/usr/bin/env node\r\n/**\r\n * Main entry point for Earth Engine MCP Server\r\n */\r\n\r\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { buildServer } from './mcp/server';\r\nimport { list, get } from './mcp/registry';\r\n// Environment variables are loaded from system environment\r\n// Set GOOGLE_APPLICATION_CREDENTIALS and other env vars before running\r\n\r\n/**\r\n * Main function to start the MCP server\r\n */\r\nasync function main() {\r\n  console.error('🌍 Starting Earth Engine MCP Server...');\r\n  \r\n  try {\r\n    // Build the server with all tools registered\r\n    const mcpServer = await buildServer();\r\n    \r\n    // Create MCP server instance\r\n    const server = new Server(\r\n      {\r\n        name: 'earth-engine-mcp',\r\n        version: '0.1.0',\r\n      },\r\n      {\r\n        capabilities: {\r\n          tools: {},\r\n        },\r\n      }\r\n    );\r\n\r\n    // Set up tool listing\r\n    server.setRequestHandler({ method: 'tools/list' } as any, async () => {\r\n      const tools = list();\r\n      return {\r\n        tools: tools.map((tool) => {\r\n          const fullTool = get(tool.name);\r\n          return {\r\n            name: tool.name,\r\n            description: tool.description,\r\n            inputSchema: {\r\n              type: 'object',\r\n              properties: fullTool?.input?._def?.shape || {},\r\n              required: [],\r\n            },\r\n          };\r\n        }),\r\n      };\r\n    });\r\n\r\n    // Set up tool calling\r\n    server.setRequestHandler({ method: 'tools/call' } as any, async (request: any) => {\r\n      const { name, arguments: args } = request.params;\r\n      \r\n      try {\r\n        const tool = get(name);\r\n        if (!tool) {\r\n          throw new Error(`Tool not found: ${name}`);\r\n        }\r\n        \r\n        // Call the tool handler\r\n        const result = await tool.handler(args || {});\r\n        \r\n        return {\r\n          content: [\r\n            {\r\n              type: 'text',\r\n              text: JSON.stringify(result, null, 2),\r\n            },\r\n          ],\r\n        };\r\n      } catch (error: any) {\r\n        console.error(`Error calling tool ${name}:`, error);\r\n        return {\r\n          content: [\r\n            {\r\n              type: 'text',\r\n              text: JSON.stringify({\r\n                success: false,\r\n                error: error.message || 'Unknown error',\r\n                stack: process.env.NODE_ENV === 'development' ? error.stack : undefined,\r\n              }),\r\n            },\r\n          ],\r\n          isError: true,\r\n        };\r\n      }\r\n    });\r\n\r\n    // Connect to stdio transport\r\n    const transport = new StdioServerTransport();\r\n    await server.connect(transport);\r\n    \r\n    console.error('✅ Earth Engine MCP Server running on stdio');\r\n    console.error(`📦 ${list().length} tools available`);\r\n    \r\n    // Handle graceful shutdown\r\n    process.on('SIGINT', async () => {\r\n      console.error('\\n👋 Shutting down Earth Engine MCP Server...');\r\n      await server.close();\r\n      process.exit(0);\r\n    });\r\n    \r\n    process.on('SIGTERM', async () => {\r\n      console.error('\\n👋 Shutting down Earth Engine MCP Server...');\r\n      await server.close();\r\n      process.exit(0);\r\n    });\r\n    \r\n  } catch (error: any) {\r\n    console.error('❌ Failed to start server:', error);\r\n    console.error(error.stack);\r\n    process.exit(1);\r\n  }\r\n}\r\n\r\n// Export for testing\r\nexport { buildServer } from './mcp/server';\r\nexport { initEarthEngineWithSA } from './gee/client';\r\n\r\n// Run the server only if this is the main module\r\nif (import.meta.url === `file://${process.argv[1]}`) {\r\n  main().catch((error) => {\r\n    console.error('💥 Fatal error:', error);\r\n    process.exit(1);\r\n  });\r\n}\r\n","import { list, get, register, z } from './registry';\r\nimport { initEarthEngineWithSA } from '@/src/gee/client';\r\n\r\nexport async function buildServer(){\r\n  await initEarthEngineWithSA();\r\n  await import('./tools');\r\n  \r\n  // Simple server object with direct method for tool calling\r\n  const server = {\r\n    callTool: async (name: string, args: any) => {\r\n      const tool = get(name);\r\n      if (!tool) {\r\n        throw new Error(`Tool not found: ${name}`);\r\n      }\r\n      const result = await tool.handler(args);\r\n      return {\r\n        content: [\r\n          {\r\n            type: 'text',\r\n            text: JSON.stringify(result),\r\n          },\r\n        ],\r\n      };\r\n    },\r\n    listTools: () => {\r\n      const tools = list();\r\n      return {\r\n        tools: tools.map((tool) => {\r\n          const fullTool = get(tool.name);\r\n          return {\r\n            name: tool.name,\r\n            description: tool.description,\r\n            inputSchema: fullTool?.input || {},\r\n          };\r\n        }),\r\n      };\r\n    }\r\n  };\r\n  \r\n  return server;\r\n}\r\n\r\n// Base health tool\r\nregister({\r\n  name: 'health_check',\r\n  description: 'Check server status',\r\n  input: z.object({}).strict(),\r\n  output: z.object({ status: z.string(), time: z.string() }),\r\n  handler: async ()=> ({ status:'ok', time: new Date().toISOString() }),\r\n});\r\n","import ee from '@google/earthengine';\r\nimport { JWT } from 'google-auth-library';\r\nimport { decodeSaJson } from '../auth/index';\r\nimport * as fs from 'fs/promises';\r\n\r\nlet initialized = false;\r\n\r\nexport async function initEarthEngineWithSA(){\r\n  if (initialized) return;\r\n  \r\n  let sa;\r\n  \r\n  // Try to load from file path first (preferred method for public users)\r\n  const keyPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\r\n  if (keyPath) {\r\n    try {\r\n      const keyContent = await fs.readFile(keyPath, 'utf-8');\r\n      sa = JSON.parse(keyContent);\r\n      console.log(`Loaded service account from: ${keyPath}`);\r\n      \r\n      // Auto-set project ID and email for other parts of the app\r\n      process.env.GCP_PROJECT_ID = sa.project_id;\r\n      process.env.GCP_SERVICE_ACCOUNT_EMAIL = sa.client_email;\r\n    } catch (error) {\r\n      console.error(`Could not load service account key from ${keyPath}:`, error);\r\n      // Fall back to encoded JSON method\r\n      const decoded = decodeSaJson();\r\n      if (decoded.useFile) {\r\n        throw new Error(`Cannot read service account file: ${keyPath}`);\r\n      }\r\n      sa = decoded;\r\n    }\r\n  } else {\r\n    // Fall back to encoded JSON in env variable\r\n    const decoded = decodeSaJson();\r\n    if (decoded.useFile) {\r\n      throw new Error('GOOGLE_APPLICATION_CREDENTIALS is not set. Please set it to your service account key file path.');\r\n    }\r\n    sa = decoded;\r\n  }\r\n  \r\n  const jwt = new JWT({ \r\n    email: sa.client_email, \r\n    key: sa.private_key, \r\n    scopes: [\r\n      'https://www.googleapis.com/auth/earthengine',\r\n      'https://www.googleapis.com/auth/devstorage.read_write'\r\n    ]\r\n  });\r\n  \r\n  const creds = await jwt.authorize();\r\n  \r\n  await new Promise<void>((resolve, reject) => \r\n    ee.data.authenticateViaPrivateKey(sa, () => { \r\n      ee.initialize(null, null, () => { \r\n        initialized = true; \r\n        console.log(`Earth Engine initialized! Project: ${sa.project_id}`);\r\n        resolve(); \r\n      }, reject); \r\n    }, reject)\r\n  );\r\n}\r\n\r\nexport function ensureEE(){ if(!initialized) throw new Error('Earth Engine not initialized'); }\r\n\r\nexport async function getTileService(image: any, vis: any){\r\n  ensureEE();\r\n  // @ts-ignore\r\n  const map = image.getMap(vis);\r\n  return { mapId: map.mapid, tileUrlTemplate: map.urlFormat, ttlSeconds: 3600, visParams: vis };\r\n}\r\n","/**\r\n * Authentication module for Earth Engine MCP\r\n * Handles service account key management\r\n */\r\n\r\nimport * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * Decode service account JSON from environment variable or file\r\n */\r\nexport function decodeSaJson() {\r\n  // First, try to load from file path (preferred for public users)\r\n  const keyPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\r\n  \r\n  if (keyPath) {\r\n    try {\r\n      // This will be handled by the async function in client.ts\r\n      // For now, return a placeholder that signals to use file loading\r\n      return { useFile: true, path: keyPath };\r\n    } catch (error) {\r\n      console.error('Could not use service account key path:', error);\r\n    }\r\n  }\r\n  \r\n  // Fallback: Try to decode from base64 environment variable (legacy)\r\n  const encoded = process.env.GEE_SA_KEY_JSON;\r\n  \r\n  if (encoded) {\r\n    try {\r\n      const decoded = Buffer.from(encoded, 'base64').toString('utf-8');\r\n      return JSON.parse(decoded);\r\n    } catch (error) {\r\n      console.error('Could not decode service account from GEE_SA_KEY_JSON:', error);\r\n    }\r\n  }\r\n  \r\n  // Last resort: Try to construct from individual env variables\r\n  const email = process.env.GEE_SA_EMAIL || process.env.GCP_SERVICE_ACCOUNT_EMAIL;\r\n  const projectId = process.env.GCP_PROJECT_ID;\r\n  \r\n  if (email && projectId) {\r\n    console.warn('Using partial service account info from environment variables');\r\n    console.warn('This may not work properly. Please set GOOGLE_APPLICATION_CREDENTIALS to your service account key file path.');\r\n    \r\n    return {\r\n      client_email: email,\r\n      project_id: projectId,\r\n      // These would need to be provided somehow - this is a fallback\r\n      private_key: process.env.GEE_SA_PRIVATE_KEY || '',\r\n      private_key_id: process.env.GEE_SA_KEY_ID || 'unknown',\r\n      type: 'service_account',\r\n      client_id: process.env.GEE_SA_CLIENT_ID || '',\r\n      auth_uri: 'https://accounts.google.com/o/oauth2/auth',\r\n      token_uri: 'https://oauth2.googleapis.com/token',\r\n      auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs'\r\n    };\r\n  }\r\n  \r\n  throw new Error(\r\n    'No service account credentials found. Please set GOOGLE_APPLICATION_CREDENTIALS to your service account key file path. ' +\r\n    'See .env.example for instructions.'\r\n  );\r\n}\r\n\r\n/**\r\n * Load service account from file asynchronously\r\n */\r\nexport async function loadServiceAccountFromFile(filePath: string) {\r\n  try {\r\n    const keyContent = await fs.readFile(filePath, 'utf-8');\r\n    const key = JSON.parse(keyContent);\r\n    \r\n    // Validate required fields\r\n    if (!key.client_email || !key.private_key || !key.project_id) {\r\n      throw new Error('Invalid service account key: missing required fields');\r\n    }\r\n    \r\n    return key;\r\n  } catch (error: any) {\r\n    throw new Error(`Failed to load service account key from ${filePath}: ${error.message}`);\r\n  }\r\n}\r\n\r\n/**\r\n * Get the project ID from environment or service account\r\n */\r\nexport async function getProjectId(): Promise<string> {\r\n  // First check if explicitly set\r\n  if (process.env.GCP_PROJECT_ID && process.env.GCP_PROJECT_ID !== 'auto-detected') {\r\n    return process.env.GCP_PROJECT_ID;\r\n  }\r\n  \r\n  // Try to get from service account file\r\n  const keyPath = process.env.GOOGLE_APPLICATION_CREDENTIALS;\r\n  if (keyPath) {\r\n    try {\r\n      const sa = await loadServiceAccountFromFile(keyPath);\r\n      return sa.project_id;\r\n    } catch (error) {\r\n      console.error('Could not get project ID from service account:', error);\r\n    }\r\n  }\r\n  \r\n  throw new Error('Could not determine GCP project ID');\r\n}\r\n"],"mappings":"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","names":["ee","ee","states","ee","collection","ee","z","collection","ee","z","fs","output","collection","globalCompositeStore","ee","z","globalCompositeStore","collection","ee","globalCompositeStore","collection","ee","z","globalCompositeStore","collection","url","error","handler","z","ee","globalCompositeStore","handler","ee","z","uuidv4","createMap","globalCompositeStore","tools","tools"]}