nothumanallowed 13.5.109 → 13.5.111

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.109",
3
+ "version": "13.5.111",
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": {
@@ -3215,12 +3215,19 @@ ${rawText.slice(0, 18000)}`;
3215
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
3216
  // P3: "a/in <lowercase city>" (case insensitive)
3217
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: known cities via word-split (avoids new RegExp \s escape issues)
3218
+ // P4: known cities via word-split also checks adjectival forms (mantovana→mantova, milanese→milano)
3219
3219
  const _knownCitiesArr = ['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','Prato','Livorno','Messina','Paris','Lyon','Marseille','Nice','Bordeaux','Toulouse','Strasbourg','Nantes','Madrid','Barcelona','Sevilla','Valencia','Bilbao','Malaga','Lisbon','Porto','Berlin','Munich','Hamburg','Frankfurt','Stuttgart','Cologne','Amsterdam','Rotterdam','Brussels','Vienna','Zurich','Geneva','Prague','Warsaw','Budapest','Bucharest','Athens','Istanbul','London','Manchester','Edinburgh','Dublin','Copenhagen','Stockholm','Oslo','Helsinki','Tokyo','Osaka','Seoul','Beijing','Shanghai','Singapore','Sydney','Melbourne','Toronto','Montreal','Vancouver','Dubai','Bangkok','Mumbai','Delhi','Cairo','Nairobi'];
3220
3220
  const _taskWords = travelTask.toLowerCase().split(/[\s,;:.!?]+/);
3221
- const _cp4found = _knownCitiesArr.find(c => _taskWords.includes(c.toLowerCase()));
3222
- // P5: "zona <city>" or "zona di <city>" — Italian "in the area of <city>"
3223
- const _cp5 = travelTask.match(/zona\s+(?:di\s+)?([a-zA-Z\u00C0-\u017E]{3,})/i);
3221
+ // Exact match, then prefix match (with and without final vowel) for demonyms
3222
+ // e.g. mantovana→mantova, veneziano→venezia, milanese→milano (milan+ese)
3223
+ const _cp4found = _knownCitiesArr.find(c => _taskWords.includes(c.toLowerCase()))
3224
+ || _knownCitiesArr.find(c => {
3225
+ const cl = c.toLowerCase();
3226
+ const cl0 = cl.slice(0, -1); // without final vowel (milan from milano)
3227
+ return c.length >= 4 && _taskWords.some(w => w.length > cl.length - 1 && (w.toLowerCase().startsWith(cl) || (cl0.length >= 4 && w.toLowerCase().startsWith(cl0))));
3228
+ });
3229
+ // P5: "zona <city>" or "zona di <city>" — only if P4 didn't find anything
3230
+ const _cp5 = !_cp4found && travelTask.match(/zona\s+(?:di\s+)?([a-zA-Z\u00C0-\u017E]{3,})/i);
3224
3231
  const _cityRaw = (_cp1 && _cp1[1]) || (_cp2 && _cp2[1]) || (_cp3 && _cp3[1]) || _cp4found || (_cp5 && _cp5[1]) || null;
3225
3232
  if (_cityRaw) {
3226
3233
  city = _cityRaw.replace(_stopRx, '').trim();
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.109';
8
+ export const VERSION = '13.5.111';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -929,7 +929,7 @@ function sendChat(){
929
929
  }
930
930
  if(chatAttachedImage){payload.imageBase64=chatAttachedImage.base64;payload.imageMimeType=chatAttachedImage.mimeType;}
931
931
  clearChatAttach();
932
- apiPost('/api/chat',payload).then(function(r){
932
+ fetch(API+'/api/chat',{method:'POST',headers:{'Content-Type':'application/json','x-nha-client':'web-ui'},body:JSON.stringify(payload)}).then(function(r){return r.json();}).then(function(r){
933
933
  chatHistory.pop();
934
934
  if(r&&r.response){chatHistory.push({role:'assistant',content:r.response})}
935
935
  else if(r&&r.error){chatHistory.push({role:'assistant',content:'Error: '+r.error})}
@@ -952,7 +952,7 @@ function sendChat(){
952
952
  var allHistory=chatHistory.slice(0,-1).map(function(m){return{role:m.role,content:(m.content||'').replace(/!\\[Screenshot\\]\\(data:image\\/[^)]+\\)/g,'[Screenshot taken]')};});
953
953
  var payload={message:msg,history:allHistory,conversationId:activeConvId,isRetry:isRetry};
954
954
 
955
- fetch(API+'/api/chat/stream',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload),signal:chatAbortController.signal}).then(function(response){
955
+ fetch(API+'/api/chat/stream',{method:'POST',headers:{'Content-Type':'application/json','x-nha-client':'web-ui'},body:JSON.stringify(payload),signal:chatAbortController.signal}).then(function(response){
956
956
  if(!response.ok||!response.body||typeof response.body.getReader!=='function'){
957
957
  // Fallback for browsers without ReadableStream support - use non-streaming endpoint
958
958
  chatHistory[streamIdx].content='Thinking...';renderMessages();