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 +1 -1
- package/src/commands/ui.mjs +170 -84
- package/src/constants.mjs +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "13.5.
|
|
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": {
|
package/src/commands/ui.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
|
3190
|
-
|
|
3191
|
-
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
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
|
|
3200
|
-
|
|
3201
|
-
const
|
|
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
|
|
3204
|
-
const
|
|
3205
|
-
const
|
|
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
|
-
|
|
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('
|
|
3237
|
+
if (city) summaryParts.push('city: ' + city);
|
|
3213
3238
|
if (targetDateStr) summaryParts.push('date: ' + targetDateStr);
|
|
3214
|
-
if (
|
|
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
|
-
|
|
3244
|
+
const UA = 'NHA-TravelAgent/1.0 (nothumanallowed.com)';
|
|
3220
3245
|
const portalResults = [];
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
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
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
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
|
|
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
|
|
3244
|
-
|
|
3245
|
-
|
|
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
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
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
|
|
3269
|
-
|
|
3270
|
-
|
|
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
|
-
//
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
sendToken('[
|
|
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
|
|
3280
|
-
|
|
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
|
-
//
|
|
3285
|
-
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
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.
|
|
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
|
|