nothumanallowed 13.5.105 → 13.5.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nothumanallowed",
3
- "version": "13.5.105",
3
+ "version": "13.5.107",
4
4
  "description": "NotHumanAllowed — 38 AI agents, 80 tools, Studio (visual agentic workflows). Email, calendar, browser automation, screen capture, canvas, cron/heartbeat, Alexandria E2E messaging, GitHub, Notion, Slack, voice chat, free AI (Liara), 28 languages. Zero-dependency CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -3180,120 +3180,206 @@ ${rawText.slice(0, 18000)}`;
3180
3180
 
3181
3181
  // ── Extract parameters from task ──
3182
3182
  // Date: "16 maggio", "16/05", "16-05-2026", "sabato 16", etc.
3183
- const dateMatch = travelTask.match(/(\d{1,2})\s+(gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)/i)
3184
- || travelTask.match(/(\d{1,2})[\/\-](\d{1,2})(?:[\/\-](\d{4}))?/)
3185
- || travelTask.match(/(monday|tuesday|wednesday|thursday|friday|saturday|sunday|luned|marted|mercoled|gioved|venerd|sabato|domenica)\s+\w+/i);
3183
+ // ── PARAMETER EXTRACTION ──
3186
3184
  const monthNames = {gennaio:1,febbraio:2,marzo:3,aprile:4,maggio:5,giugno:6,luglio:7,agosto:8,settembre:9,ottobre:10,novembre:11,dicembre:12};
3185
+ const dateMatch = travelTask.match(/(\d{1,2})\s+(gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)/i)
3186
+ || travelTask.match(/(\d{1,2})[\/\-](\d{1,2})(?:[\/\-](\d{4}))?/);
3187
3187
  let targetDate = null;
3188
3188
  let targetDateStr = null;
3189
- if (dateMatch && dateMatch[2] && isNaN(Number(dateMatch[2]))) {
3190
- const day = parseInt(dateMatch[1]);
3191
- const month = monthNames[(dateMatch[2] || '').toLowerCase()];
3192
- if (day && month) {
3193
- const year = new Date().getFullYear();
3194
- targetDate = new Date(year, month - 1, day);
3195
- targetDateStr = String(day).padStart(2, '0') + '/' + String(month).padStart(2, '0') + '/' + year;
3189
+ if (dateMatch) {
3190
+ if (dateMatch[2] && isNaN(Number(dateMatch[2]))) {
3191
+ const day = parseInt(dateMatch[1]);
3192
+ const month = monthNames[(dateMatch[2] || '').toLowerCase()];
3193
+ if (day && month) {
3194
+ const year = new Date().getFullYear();
3195
+ targetDate = new Date(year, month - 1, day);
3196
+ targetDateStr = String(day).padStart(2, '0') + '/' + String(month).padStart(2, '0') + '/' + year;
3197
+ }
3198
+ } else if (dateMatch[1] && dateMatch[2]) {
3199
+ const day = parseInt(dateMatch[1]);
3200
+ const month = parseInt(dateMatch[2]);
3201
+ const year = dateMatch[3] ? parseInt(dateMatch[3]) : new Date().getFullYear();
3202
+ if (day >= 1 && day <= 31 && month >= 1 && month <= 12) {
3203
+ targetDate = new Date(year, month - 1, day);
3204
+ targetDateStr = String(day).padStart(2, '0') + '/' + String(month).padStart(2, '0') + '/' + year;
3205
+ }
3196
3206
  }
3197
3207
  }
3198
3208
 
3199
- // City/location: "a Bologna", "a Roma", "near Milan", "vicino a Firenze"
3200
- const cityMatch = travelTask.match(/\b(?:a|in|near|vicino\s+a|at)\s+([A-Z][a-zA-Z\s]{2,20}?)(?:\s*[,\.!?]|\s+(?:il|la|per|con|un|una|mi|mia|del|della)|$)/);
3201
- const city = cityMatch ? cityMatch[1].trim() : null;
3209
+ // City extraction multi-attempt, most specific first
3210
+ let city = null;
3211
+ const _stopRx = /\s+(il|la|lo|i|le|gli|per|con|un|una|del|della|dei|delle|e|o|\d).*$/i;
3212
+ // P1: "vicino a/near/around <City>"
3213
+ const _cp1 = travelTask.match(/\b(?:vicino\s+a|near|around)\s+([A-Z][a-zA-Z\u00C0-\u017E]{1,}(?:\s+[A-Z][a-zA-Z\u00C0-\u017E]+)?)/);
3214
+ // P2: "a/in <Capitalized City>"
3215
+ const _cp2 = travelTask.match(/\b(?:a|in)\s+([A-Z][a-zA-Z\u00C0-\u017E]{2,}(?:\s+[A-Z][a-zA-Z\u00C0-\u017E]+)?)/);
3216
+ // P3: "a/in <lowercase city>" (case insensitive)
3217
+ const _cp3 = travelTask.match(/\b(?:a|in|at|near)\s+([a-zA-Z\u00C0-\u017E]{3,}(?:\s+[a-zA-Z\u00C0-\u017E]+)?)/i);
3218
+ // P4: standalone known Italian cities (capitalized, no preposition needed)
3219
+ const _knownCities = 'Milano|Roma|Napoli|Torino|Firenze|Bologna|Venezia|Genova|Palermo|Bari|Catania|Verona|Padova|Trieste|Brescia|Bergamo|Modena|Parma|Reggio|Mantova|Ferrara|Vicenza|Treviso|Udine|Trento|Bolzano|Perugia|Ancona|Pescara|Foggia|Salerno|Taranto|Cagliari|Sassari|Siena|Pisa|Lucca|Arezzo|Rimini|Ravenna|Forl|Prato|Livorno|Messina';
3220
+ const _cp4 = travelTask.match(new RegExp('\\b(' + _knownCities + ')\\b', 'i'));
3221
+ const _cityRaw = (_cp1 && _cp1[1]) || (_cp2 && _cp2[1]) || (_cp3 && _cp3[1]) || (_cp4 && _cp4[1]) || null;
3222
+ if (_cityRaw) {
3223
+ city = _cityRaw.replace(_stopRx, '').trim();
3224
+ if (city.length < 2) city = null;
3225
+ }
3202
3226
 
3203
- // Cuisine/restaurant type
3204
- const cuisineMatch = travelTask.match(/\b(sushi|pizza|giapponese|japanese|italiano|italian|cinese|chinese|indiano|indian|steakhouse|bistrot|trattoria|osteria)\b/i);
3205
- const cuisine = cuisineMatch ? cuisineMatch[1].toLowerCase() : null;
3227
+ // Cuisine type → OSM cuisine tag
3228
+ const cuisineMap = {sushi:'sushi',pizza:'pizza',giapponese:'japanese',japanese:'japanese',italiano:'italian',italian:'italian',cinese:'chinese',chinese:'chinese',indiano:'indian',indian:'indian',steakhouse:'steak_house',trattoria:'italian',osteria:'italian'};
3229
+ const cuisineMatch = travelTask.match(/\b(sushi|pizza|giapponese|japanese|italiano|italian|cinese|chinese|indiano|indian|steakhouse|trattoria|osteria)\b/i);
3230
+ const cuisineRaw = cuisineMatch ? cuisineMatch[1].toLowerCase() : null;
3231
+ const cuisineOSM = cuisineRaw ? (cuisineMap[cuisineRaw] || cuisineRaw) : null;
3206
3232
 
3207
- // Accommodation type
3208
- const hasAccommodation = /b&b|bed\s*&?\s*breakfast|hotel|albergo|agriturismo|locanda|ostello|hostel|airbnb/i.test(travelTask);
3233
+ const hasAccommodation = /b&b|bed\s*(?:&|and)\s*breakfast|hotel|albergo|agriturismo|locanda|ostello|hostel|pernottament|soggiorno/i.test(travelTask);
3209
3234
  const hasRestaurant = /ristorante|restaurant|sushi|cena|dinner|pranzo|lunch|mangiare|eat/i.test(travelTask);
3210
3235
 
3211
3236
  const summaryParts = [];
3212
- if (city) summaryParts.push('location: ' + city);
3237
+ if (city) summaryParts.push('city: ' + city);
3213
3238
  if (targetDateStr) summaryParts.push('date: ' + targetDateStr);
3214
- if (cuisine) summaryParts.push('cuisine: ' + cuisine);
3239
+ if (cuisineRaw) summaryParts.push('cuisine: ' + cuisineRaw);
3215
3240
  if (hasAccommodation) summaryParts.push('accommodation: yes');
3216
3241
  if (hasRestaurant) summaryParts.push('restaurant: yes');
3217
3242
  sendToken('[Extracted — ' + (summaryParts.join(', ') || 'general search') + '] ');
3218
3243
 
3219
- // ── Build search URLs for portals ──
3244
+ const UA = 'NHA-TravelAgent/1.0 (nothumanallowed.com)';
3220
3245
  const portalResults = [];
3221
- const cityQ = city ? encodeURIComponent(city) : '';
3222
- const cuisineQ = cuisine ? encodeURIComponent(cuisine) : '';
3223
- const dateQ = targetDateStr || '';
3224
-
3225
- // TheFork: restaurant search
3226
- if (hasRestaurant) {
3227
- const theforkQuery = [cuisine, city].filter(Boolean).join(' ');
3228
- const theforkUrl = 'https://www.thefork.it/ristoranti/' + (city ? encodeURIComponent(city.toLowerCase()) : 'italia') + (cuisine ? '?q=' + cuisineQ : '');
3229
- sendToken('[Searching TheFork...] ');
3246
+
3247
+ // ── TIER 1: Nominatim geocoding get lat/lon for city ──
3248
+ let lat = null, lon = null;
3249
+ if (city) {
3250
+ sendToken('[Geocoding ' + city + '...] ');
3230
3251
  try {
3231
- if (!be.isBrowserRunning()) await be.browserOpen(theforkUrl, { waitForLoad: true });
3232
- else await be.browserNavigate(theforkUrl, { waitForLoad: true });
3233
- await new Promise(r => setTimeout(r, 2500));
3234
- const theforkContent = await be.browserExtract({ selector: 'body', format: 'text' });
3235
- if (theforkContent && !theforkContent.error && theforkContent.text && theforkContent.text.length > 200) {
3236
- portalResults.push('## TheFork — ' + theforkUrl + '\n' + theforkContent.text.slice(0, 5000));
3237
- } else {
3238
- const fetchFork = await withTimeout(executeTool('fetch_url', { url: theforkUrl }, config), 20000);
3239
- if (fetchFork && fetchFork.length > 200) portalResults.push('## TheFork — ' + theforkUrl + '\n' + fetchFork.slice(0, 5000));
3252
+ const geoUrl = 'https://nominatim.openstreetmap.org/search?' + new URLSearchParams({ q: city, format: 'json', limit: '1', addressdetails: '0' }).toString();
3253
+ const geoRes = await withTimeout(fetch(geoUrl, { headers: { 'User-Agent': UA, 'Accept': 'application/json' } }), 8000);
3254
+ if (geoRes.ok) {
3255
+ const geoData = await geoRes.json();
3256
+ if (geoData && geoData[0]) {
3257
+ lat = parseFloat(geoData[0].lat);
3258
+ lon = parseFloat(geoData[0].lon);
3259
+ sendToken('[Found: ' + lat.toFixed(4) + ', ' + lon.toFixed(4) + '] ');
3260
+ }
3240
3261
  }
3241
- } catch (e) {
3262
+ } catch {}
3263
+ }
3264
+
3265
+ // ── TIER 1: Overpass API — real OSM data ──
3266
+ if (lat !== null && lon !== null) {
3267
+ const radius = 5000; // 5km radius
3268
+ const formatPlace = (el) => {
3269
+ const t = el.tags || {};
3270
+ const parts = [];
3271
+ if (t.name) parts.push('**' + t.name + '**');
3272
+ if (t['addr:street']) parts.push(t['addr:street'] + (t['addr:housenumber'] ? ' ' + t['addr:housenumber'] : ''));
3273
+ if (t['addr:city']) parts.push(t['addr:city']);
3274
+ if (t.phone || t['contact:phone']) parts.push('Tel: ' + (t.phone || t['contact:phone']));
3275
+ if (t.website || t['contact:website']) parts.push('Web: ' + (t.website || t['contact:website']));
3276
+ if (t.opening_hours) parts.push('Orari: ' + t.opening_hours);
3277
+ if (t.email || t['contact:email']) parts.push('Email: ' + (t.email || t['contact:email']));
3278
+ if (t.cuisine) parts.push('Cucina: ' + t.cuisine);
3279
+ if (t.stars) parts.push('Stelle: ' + t.stars);
3280
+ const coordLat = el.lat || (el.center && el.center.lat);
3281
+ const coordLon = el.lon || (el.center && el.center.lon);
3282
+ if (coordLat && coordLon) parts.push('Maps: https://www.openstreetmap.org/?mlat=' + coordLat + '&mlon=' + coordLon + '&zoom=17');
3283
+ return parts.join(' | ');
3284
+ };
3285
+
3286
+ // Restaurants query
3287
+ if (hasRestaurant) {
3288
+ sendToken('[Overpass: searching restaurants' + (cuisineOSM ? ' (' + cuisineOSM + ')' : '') + '...] ');
3242
3289
  try {
3243
- const fetchFork = await withTimeout(executeTool('fetch_url', { url: theforkUrl }, config), 20000);
3244
- if (fetchFork && fetchFork.length > 200) portalResults.push('## TheFork ' + theforkUrl + '\n' + fetchFork.slice(0, 5000));
3245
- } catch {}
3290
+ const cuisineFilter = cuisineOSM ? '["cuisine"="' + cuisineOSM + '"]' : '';
3291
+ const restQuery = '[out:json][timeout:20];(node["amenity"="restaurant"]' + cuisineFilter + '(around:' + radius + ',' + lat + ',' + lon + ');way["amenity"="restaurant"]' + cuisineFilter + '(around:' + radius + ',' + lat + ',' + lon + '););out center tags;';
3292
+ const restRes = await withTimeout(fetch('https://overpass.kumi.systems/api/interpreter', {
3293
+ method: 'POST',
3294
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA },
3295
+ body: 'data=' + encodeURIComponent(restQuery)
3296
+ }), 25000);
3297
+ if (restRes.ok) {
3298
+ const restData = await restRes.json();
3299
+ const elements = (restData.elements || []).filter(el => el.tags && el.tags.name);
3300
+ if (elements.length > 0) {
3301
+ const lines = ['## Ristoranti trovati via OpenStreetMap (' + elements.length + ' risultati, raggio ' + (radius/1000) + 'km da ' + city + ')'];
3302
+ elements.slice(0, 15).forEach((el, i) => { lines.push((i+1) + '. ' + formatPlace(el)); });
3303
+ portalResults.push(lines.join('\n'));
3304
+ sendToken('[Found ' + elements.length + ' restaurants] ');
3305
+ } else if (cuisineOSM) {
3306
+ // Retry without cuisine filter — broader search
3307
+ sendToken('[No ' + cuisineOSM + ' found, retrying broader...] ');
3308
+ const broadQuery = '[out:json][timeout:20];(node["amenity"="restaurant"](around:' + radius + ',' + lat + ',' + lon + ');way["amenity"="restaurant"](around:' + radius + ',' + lat + ',' + lon + '););out center tags;';
3309
+ const broadRes = await withTimeout(fetch('https://overpass.kumi.systems/api/interpreter', {
3310
+ method: 'POST',
3311
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA },
3312
+ body: 'data=' + encodeURIComponent(broadQuery)
3313
+ }), 25000);
3314
+ if (broadRes.ok) {
3315
+ const broadData = await broadRes.json();
3316
+ const broadEl = (broadData.elements || []).filter(el => el.tags && el.tags.name);
3317
+ if (broadEl.length > 0) {
3318
+ const lines = ['## Ristoranti a ' + city + ' (tutti i tipi, ' + broadEl.length + ' trovati — nessun ristorante ' + cuisineRaw + ' su OpenStreetMap in questa zona)'];
3319
+ broadEl.slice(0, 10).forEach((el, i) => { lines.push((i+1) + '. ' + formatPlace(el)); });
3320
+ portalResults.push(lines.join('\n'));
3321
+ }
3322
+ }
3323
+ }
3324
+ }
3325
+ } catch (e) { sendToken('[Overpass restaurants error: ' + e.message.slice(0,50) + '] '); }
3246
3326
  }
3247
- }
3248
3327
 
3249
- // Booking.com: B&B / hotel search
3250
- if (hasAccommodation) {
3251
- const checkin = targetDate ? targetDate.toISOString().slice(0, 10) : '';
3252
- const checkout = targetDate ? new Date(targetDate.getTime() + 86400000).toISOString().slice(0, 10) : '';
3253
- const bookingUrl = 'https://www.booking.com/search.html?ss=' + (cityQ || 'Italy') + (checkin ? '&checkin=' + checkin + '&checkout=' + checkout : '') + '&group_adults=2&no_rooms=1&b_h4u_keep_filters=&from_sf=1';
3254
- sendToken('[Searching Booking.com...] ');
3255
- try {
3256
- if (!be.isBrowserRunning()) await be.browserOpen(bookingUrl, { waitForLoad: true });
3257
- else await be.browserNavigate(bookingUrl, { waitForLoad: true });
3258
- await new Promise(r => setTimeout(r, 3000));
3259
- const bookingContent = await be.browserExtract({ selector: 'body', format: 'text' });
3260
- if (bookingContent && !bookingContent.error && bookingContent.text && bookingContent.text.length > 200) {
3261
- portalResults.push('## Booking.com — ' + bookingUrl + '\n' + bookingContent.text.slice(0, 5000));
3262
- } else {
3263
- const fetchBook = await withTimeout(executeTool('fetch_url', { url: bookingUrl }, config), 20000);
3264
- if (fetchBook && fetchBook.length > 200) portalResults.push('## Booking.com — ' + bookingUrl + '\n' + fetchBook.slice(0, 5000));
3265
- }
3266
- } catch (e) {
3328
+ // Accommodation query
3329
+ if (hasAccommodation) {
3330
+ sendToken('[Overpass: searching accommodation...] ');
3267
3331
  try {
3268
- const fetchBook = await withTimeout(executeTool('fetch_url', { url: bookingUrl }, config), 20000);
3269
- if (fetchBook && fetchBook.length > 200) portalResults.push('## Booking.com — ' + bookingUrl + '\n' + fetchBook.slice(0, 5000));
3270
- } catch {}
3332
+ const accQuery = '[out:json][timeout:20];(node["tourism"~"hotel|guest_house|bed_and_breakfast|hostel|motel"](around:' + radius + ',' + lat + ',' + lon + ');way["tourism"~"hotel|guest_house|bed_and_breakfast|hostel|motel"](around:' + radius + ',' + lat + ',' + lon + ');node["amenity"="hotel"](around:' + radius + ',' + lat + ',' + lon + '););out center tags;';
3333
+ const accRes = await withTimeout(fetch('https://overpass.kumi.systems/api/interpreter', {
3334
+ method: 'POST',
3335
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': UA },
3336
+ body: 'data=' + encodeURIComponent(accQuery)
3337
+ }), 25000);
3338
+ if (accRes.ok) {
3339
+ const accData = await accRes.json();
3340
+ const elements = (accData.elements || []).filter(el => el.tags && el.tags.name);
3341
+ if (elements.length > 0) {
3342
+ const lines = ['## Alloggi trovati via OpenStreetMap (' + elements.length + ' risultati, raggio ' + (radius/1000) + 'km da ' + city + ')'];
3343
+ elements.slice(0, 15).forEach((el, i) => {
3344
+ const t = el.tags || {};
3345
+ const type = t.tourism === 'guest_house' ? 'B&B/Guest house' : t.tourism === 'hotel' ? 'Hotel' : t.tourism === 'bed_and_breakfast' ? 'B&B' : (t.tourism || 'Alloggio');
3346
+ lines.push((i+1) + '. [' + type + '] ' + formatPlace(el));
3347
+ });
3348
+ portalResults.push(lines.join('\n'));
3349
+ sendToken('[Found ' + elements.length + ' accommodations] ');
3350
+ }
3351
+ }
3352
+ } catch (e) { sendToken('[Overpass accommodation error: ' + e.message.slice(0,50) + '] '); }
3271
3353
  }
3354
+ } else if (city) {
3355
+ sendToken('[Geocoding failed, skipping Overpass] ');
3272
3356
  }
3273
3357
 
3274
- // TripAdvisor: restaurants
3275
- if (hasRestaurant && city) {
3276
- const taUrl = 'https://www.tripadvisor.it/Search?q=' + [cuisineQ, cityQ].filter(Boolean).join('+') + '&searchSessionId=&sid=&blockRedirect=true';
3277
- sendToken('[Searching TripAdvisor...] ');
3358
+ // ── TIER 2: Web search fallback — only if Overpass found nothing ──
3359
+ const dataFound = portalResults.length > 0;
3360
+ if (!dataFound) {
3361
+ sendToken('[Web search fallback...] ');
3278
3362
  try {
3279
- const fetchTa = await withTimeout(executeTool('fetch_url', { url: taUrl }, config), 20000);
3280
- if (fetchTa && fetchTa.length > 200) portalResults.push('## TripAdvisor — ' + taUrl + '\n' + fetchTa.slice(0, 5000));
3363
+ const cityStr = city || '';
3364
+ const queries = [];
3365
+ if (hasRestaurant && cityStr) queries.push((cuisineRaw ? cuisineRaw + ' ' : '') + 'ristorante ' + cityStr + ' prenotazione');
3366
+ else if (hasRestaurant) queries.push((cuisineRaw ? cuisineRaw + ' ' : '') + 'ristorante prenotazione online');
3367
+ if (hasAccommodation && cityStr) queries.push('b&b hotel ' + cityStr + (targetDateStr ? ' ' + targetDateStr.slice(0,5) : ''));
3368
+ if (queries.length === 0) queries.push(travelTask.slice(0, 80));
3369
+ for (const q of queries) {
3370
+ const sr = await withTimeout(executeTool('web_search', { query: q, deep: true }, config), 30000);
3371
+ if (sr && sr.length > 100) portalResults.push('## Web search: "' + q + '"\n' + (typeof sr === 'string' ? sr : JSON.stringify(sr)));
3372
+ }
3281
3373
  } catch {}
3282
3374
  }
3283
3375
 
3284
- // Also do a DuckDuckGo search for the full task to capture any other results
3285
- sendToken('[Web search backup...] ');
3286
- try {
3287
- const generalQuery = [cuisine, 'ristorante', city, targetDateStr ? 'prenotazione' : '', hasAccommodation ? 'b&b romantico' : ''].filter(Boolean).join(' ');
3288
- const searchResult = await withTimeout(executeTool('web_search', { query: generalQuery, deep: true }, config), 30000);
3289
- if (searchResult && searchResult.length > 100) {
3290
- portalResults.push('## Web search: "' + generalQuery + '"\n' + (typeof searchResult === 'string' ? searchResult : JSON.stringify(searchResult)));
3291
- }
3292
- } catch {}
3293
-
3294
- toolData = portalResults.length > 0
3295
- ? portalResults.join('\n\n')
3296
- : 'No results found on travel portals. Try specifying city, date, and type of place.';
3376
+ // ── Build final output ──
3377
+ if (portalResults.length > 0) {
3378
+ const header = '# TravelAgent — Risultati per: ' + (city || 'zona non specificata') + (targetDateStr ? ' | Data: ' + targetDateStr : '') + (cuisineRaw ? ' | Cucina: ' + cuisineRaw : '') + '\n\n';
3379
+ toolData = header + portalResults.join('\n\n');
3380
+ } else {
3381
+ toolData = '# TravelAgent — Nessun risultato trovato\n\nNon sono stati trovati ristoranti o alloggi per i parametri specificati.\n\n**Parametri cercati:**\n- Città: ' + (city || 'non specificata') + '\n- Data: ' + (targetDateStr || 'non specificata') + '\n- Tipo cucina: ' + (cuisineRaw || 'qualsiasi') + '\n\n**Suggerimento:** Specifica la città esatta (es. "a Mantova") e il tipo di cucina per ottenere risultati migliori.';
3382
+ }
3297
3383
  } catch (e) { toolData = toolData || 'TravelAgent failed: ' + e.message; }
3298
3384
 
3299
3385
  } else if (agent === 'BrowserAgent') {
package/src/constants.mjs CHANGED
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'url';
5
5
  const __filename = fileURLToPath(import.meta.url);
6
6
  const __dirname = path.dirname(__filename);
7
7
 
8
- export const VERSION = '13.5.105';
8
+ export const VERSION = '13.5.107';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11