// Mock listings + canned conversation responses for the prototype const LISTINGS = [ { id: "f1", name: "2к Тверская", price: 18500000, area: 54, rooms: 2, district: "центр", address: "Тверская ул., 12", building_year: 1952, metro_walk_min: 4, metro_name: "Тверская", lat: 55.7651, lon: 37.6055, distance_km: 0.6, parks_nearby: 3, schools_nearby: 4, image_hue: 24, }, { id: "f2", name: "2к Чистые пруды", price: 19800000, area: 58, rooms: 2, district: "центр", address: "Покровка, 27", building_year: 1928, metro_walk_min: 6, metro_name: "Чистые пруды", lat: 55.7625, lon: 37.6395, distance_km: 1.4, parks_nearby: 2, schools_nearby: 5, image_hue: 14, }, { id: "f3", name: "2к Парк Горького", price: 17200000, area: 51, rooms: 2, district: "центр", address: "Ленинский просп., 8", building_year: 1965, metro_walk_min: 8, metro_name: "Октябрьская", lat: 55.7298, lon: 37.6019, distance_km: 2.1, parks_nearby: 5, schools_nearby: 3, image_hue: 32, }, { id: "f4", name: "2к Сокольники", price: 14900000, area: 49, rooms: 2, district: "север", address: "ул. Стромынка, 19", building_year: 1971, metro_walk_min: 5, metro_name: "Сокольники", lat: 55.7889, lon: 37.6797, distance_km: 5.8, parks_nearby: 6, schools_nearby: 4, image_hue: 18, }, ]; // Canned scripted "agent" responses, keyed by recognized user input. // Order matters — first match wins. const SCRIPTED_REPLIES = [ { match: /(20\s*млн|двадцати).*парк|парк.*(20\s*млн|двадцати)/i, delay: 1400, trace: [ { name: "geocode_place", args: { query: "парк горького" }, ms: 320 }, { name: "search_listings", args: { rooms_min: 2, budget_max: 20000000 }, ms: 480 }, { name: "count_pois_near", args: { listing_id: "f1", kind: "park" }, ms: 220 }, { name: "count_pois_near", args: { listing_id: "f3", kind: "park" }, ms: 220 }, ], response: "Нашёл **3 варианта** до 20 млн ₽ с парком в шаговой доступности. Сортировка — по близости к зелёной зоне:\n\n1. **2к Парк Горького** — 17,2 млн ₽, **5 парков** рядом, до Парка Горького 600 м пешком.\n2. **2к Тверская** — 18,5 млн ₽, 3 парка в радиусе 1 км (Патриаршие, Александровский сад).\n3. **2к Чистые пруды** — 19,8 млн ₽, 2 парка (Чистопрудный б-р, сад Эрмитаж).\n\nПодсказать, как добираться от любой из них до работы?", listings: ["f3", "f1", "f2"], }, { match: /15\s*млн|пятнадцати/i, delay: 1100, trace: [ { name: "search_listings", args: { rooms_min: 2, budget_max: 15000000 }, ms: 420 }, ], response: "В пределах **15 млн ₽** двушек немного. Вот единственная, которая прошла фильтр:\n\n1. **2к Сокольники** — 14,9 млн ₽, 49 м², 5 минут до метро, рядом парк Сокольники.\n\nЕсли расширим бюджет до 18 млн — найдётся ещё 2 варианта в центре. Расширить?", listings: ["f4"], }, { match: /запад/i, delay: 900, trace: [ { name: "search_listings", args: { district: "запад" }, ms: 380 }, ], response: "На **западе Москвы** в каталоге сейчас пусто — мы покрываем в основном центр и север. Могу показать варианты на западной части центра (Арбат, Хамовники)?", listings: [], }, { match: /кремл/i, delay: 1200, trace: [ { name: "geocode_place", args: { query: "кремль" }, ms: 290 }, { name: "search_radius", args: { center: [55.752, 37.617], radius_km: 5 }, ms: 510 }, ], response: "В радиусе **5 км от Кремля** — 3 варианта:\n\n1. **2к Тверская** — 0,6 км, 18,5 млн ₽\n2. **2к Чистые пруды** — 1,4 км, 19,8 млн ₽\n3. **2к Парк Горького** — 2,1 км, 17,2 млн ₽\n\nВсе в пешей доступности от метро.", listings: ["f1", "f2", "f3"], }, { match: /мгу/i, delay: 1500, trace: [ { name: "geocode_place", args: { query: "МГУ" }, ms: 280 }, { name: "search_listings", args: { rooms_min: 2, budget_max: 20000000 }, ms: 460 }, { name: "travel_time", args: { from: "f3", to: "МГУ", mode: "transit" }, ms: 340 }, { name: "travel_time", args: { from: "f1", to: "МГУ", mode: "transit" }, ms: 340 }, ], response: "До **МГУ за 30 минут** на общественном транспорте укладываются:\n\n1. **2к Парк Горького** — 22 мин (метро Октябрьская → Университет), 17,2 млн ₽\n2. **2к Тверская** — 28 мин (с пересадкой), 18,5 млн ₽\n\nХочешь добавить пешие маршруты или велосипед?", listings: ["f3", "f1"], }, { match: /парк.*f1|f1.*парк/i, delay: 700, trace: [ { name: "count_pois_near", args: { listing_id: "f1", kind: "park", radius_m: 1000 }, ms: 240 }, ], response: "Рядом с **f1 (2к Тверская)** в радиусе 1 км — **3 парка**:\n\n- Александровский сад (550 м)\n- Сад Эрмитаж (820 м)\n- Патриаршие пруды (940 м)\n\nВсе в пешей доступности.", listings: ["f1"], }, { match: /подробнее.*f3|f3.*подробнее|расскажи.*f3/i, delay: 900, trace: [ { name: "get_listing", args: { id: "f3" }, ms: 180 }, { name: "count_pois_near", args: { listing_id: "f3", kind: "park" }, ms: 200 }, { name: "count_pois_near", args: { listing_id: "f3", kind: "school" }, ms: 200 }, { name: "count_pois_near", args: { listing_id: "f3", kind: "metro" }, ms: 180 }, ], response: "__DETAIL__f3", listings: ["f3"], }, ]; const FALLBACK_REPLY = { delay: 800, trace: [{ name: "search_listings", args: {}, ms: 280 }], response: "Покажу **что есть в каталоге** — 4 двушки в Москве, цена 14,9–19,8 млн ₽. Уточни район, бюджет или ориентир (например, «в 5 км от Кремля»), и я отфильтрую.", listings: ["f1", "f2", "f3", "f4"], }; const QUICK_PROMPTS = [ "Найди 2-комнатную до 15 млн рублей", "Что есть на западе Москвы?", "Квартиры в 5 км от Кремля", "2-комнатная до 20 млн в 30 минутах от МГУ", "Сколько парков рядом с f1?", "Покажи всё, что есть в каталоге", ]; Object.assign(window, { LISTINGS, SCRIPTED_REPLIES, FALLBACK_REPLY, QUICK_PROMPTS });