nothumanallowed 13.2.24 → 13.2.25

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.2.24",
3
+ "version": "13.2.25",
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/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.2.24';
8
+ export const VERSION = '13.2.25';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -2275,8 +2275,8 @@ function renderSettings(el) {
2275
2275
  ['profile-notes', 'Notes', 'Anything else agents should know about you'],
2276
2276
  ]) +
2277
2277
  '<div style="padding:12px 16px;margin-bottom:16px;background:var(--amberdim);border:1px solid var(--amber3);border-radius:8px"><span style="font-family:var(--term);color:var(--amber);font-size:13px;font-weight:700">NHA Free (Liara)</span><div style="font-size:11px;color:var(--dim);margin:4px 0 8px">Powered by Qwen3 32B. Free, no API key needed. Slower (5-15s).</div><button onclick="apiPost(\\x27/api/config\\x27,{key:\\x27provider\\x27,value:\\x27nha\\x27}).then(function(){location.reload()})" style="padding:6px 16px;background:var(--amber3);color:var(--bg);border:none;border-radius:6px;cursor:pointer;font-family:var(--mono);font-size:11px;font-weight:700">Use NHA Free</button></div>' +
2278
- settingsSection('language', 'Language / Lingua', 'Set the UI language. Applies on reload.', [
2279
- ['lang', 'Language', 'en / it / es / fr / de / pt / zh / ja / ar / hi / ru / nl / pl / tr / ko / sv / da / fi / no / cs'],
2278
+ settingsSection('language', 'Language / Lingua', 'Select the language used by all agents and Studio workflows.', [
2279
+ ['lang', 'Language', ''],
2280
2280
  ]) +
2281
2281
  settingsSection('llm', 'LLM Provider', 'Or use your own API key for faster, more capable responses.', [
2282
2282
  ['provider', 'Provider', 'nha (free) / anthropic / openai / gemini / deepseek / grok / mistral'],
@@ -2345,6 +2345,35 @@ function settingsSection(id, title, desc, fields) {
2345
2345
  h += '<option value="' + providers[pi].value + '"' + sel + '>' + providers[pi].label + '</option>';
2346
2346
  }
2347
2347
  h += '</select>';
2348
+ } else if (key === 'lang') {
2349
+ var langs = [
2350
+ {value:'it',label:'🇮🇹 Italiano'},
2351
+ {value:'en',label:'🇬🇧 English'},
2352
+ {value:'es',label:'🇪🇸 Español'},
2353
+ {value:'fr',label:'🇫🇷 Français'},
2354
+ {value:'de',label:'🇩🇪 Deutsch'},
2355
+ {value:'pt',label:'🇵🇹 Português'},
2356
+ {value:'nl',label:'🇳🇱 Nederlands'},
2357
+ {value:'pl',label:'🇵🇱 Polski'},
2358
+ {value:'ru',label:'🇷🇺 Русский'},
2359
+ {value:'zh',label:'🇨🇳 中文'},
2360
+ {value:'ja',label:'🇯🇵 日本語'},
2361
+ {value:'ko',label:'🇰🇷 한국어'},
2362
+ {value:'ar',label:'🇸🇦 العربية'},
2363
+ {value:'hi',label:'🇮🇳 हिन्दी'},
2364
+ {value:'tr',label:'🇹🇷 Türkçe'},
2365
+ {value:'sv',label:'🇸🇪 Svenska'},
2366
+ {value:'da',label:'🇩🇰 Dansk'},
2367
+ {value:'fi',label:'🇫🇮 Suomi'},
2368
+ {value:'cs',label:'🇨🇿 Čeština'},
2369
+ ];
2370
+ var curLang = currentVal || 'it';
2371
+ h += '<select style="width:100%;padding:8px 12px;font-size:13px;background:var(--bg);color:var(--fg);border:1px solid var(--border2);border-radius:var(--r)" data-config-key="lang" data-section="' + esc(id) + '">';
2372
+ for (var li=0;li<langs.length;li++) {
2373
+ var lsel = curLang === langs[li].value ? ' selected' : '';
2374
+ h += '<option value="' + langs[li].value + '"' + lsel + '>' + langs[li].label + '</option>';
2375
+ }
2376
+ h += '</select>';
2348
2377
  } else if (key === 'thinking') {
2349
2378
  // Dropdown for thinking toggle
2350
2379
  h += '<select style="width:100%;padding:8px 12px;font-size:13px;background:var(--bg);color:var(--fg);border:1px solid var(--border2);border-radius:var(--r)" data-config-key="thinking" data-section="' + esc(id) + '">' +
@@ -2404,13 +2433,22 @@ function saveSettingsSection(sectionId) {
2404
2433
  var allOk = results.every(function(r) { return r; });
2405
2434
  if (statusEl) {
2406
2435
  if (allOk) {
2407
- statusEl.textContent = 'Saved!';
2436
+ if (sectionId === 'language') {
2437
+ var langNames = {it:'Italiano',en:'English',es:'Español',fr:'Français',de:'Deutsch',pt:'Português',nl:'Nederlands',pl:'Polski',ru:'Русский',zh:'中文',ja:'日本語',ko:'한국어',ar:'العربية',hi:'हिन्दी',tr:'Türkçe',sv:'Svenska',da:'Dansk',fi:'Suomi',cs:'Čeština'};
2438
+ try {
2439
+ var cfg2 = JSON.parse(localStorage.getItem('nha_config_cache') || '{}');
2440
+ var ln = langNames[cfg2.lang] || cfg2.lang || 'Italian';
2441
+ statusEl.textContent = '✓ Language set to ' + ln + '. All agents and Studio will now respond in ' + ln + '.';
2442
+ } catch(e) { statusEl.textContent = '✓ Saved!'; }
2443
+ } else {
2444
+ statusEl.textContent = 'Saved!';
2445
+ }
2408
2446
  statusEl.style.color = 'var(--green)';
2409
2447
  } else {
2410
2448
  statusEl.textContent = 'Some fields failed to save.';
2411
2449
  statusEl.style.color = 'var(--red)';
2412
2450
  }
2413
- setTimeout(function() { statusEl.textContent = ''; }, 3000);
2451
+ setTimeout(function() { statusEl.textContent = ''; }, 4000);
2414
2452
  }
2415
2453
  });
2416
2454
  }
@@ -3042,8 +3080,13 @@ var studioTokens = {in: 0, out: 0};
3042
3080
  function studioAddTokens(inp, out) {
3043
3081
  studioTokens.in += (inp||0);
3044
3082
  studioTokens.out += (out||0);
3083
+ studioUpdateTokenBar();
3084
+ }
3085
+ function studioUpdateTokenBar() {
3045
3086
  var el = document.getElementById('studioTokenBar');
3046
- if (el) el.textContent = 'Tokens: ' + studioTokens.in + ' in / ' + studioTokens.out + ' out';
3087
+ if (!el) return;
3088
+ if (studioTokens.in === 0 && studioTokens.out === 0) { el.textContent = ''; return; }
3089
+ el.textContent = '⬆ ' + studioTokens.in.toLocaleString() + ' in ⬇ ' + studioTokens.out.toLocaleString() + ' out';
3047
3090
  }
3048
3091
 
3049
3092
  function runStudioStep(idx, node, task, context, stepDef, signal) {
@@ -3104,6 +3147,7 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
3104
3147
  if (scb) scb.style.display = '';
3105
3148
  }
3106
3149
  if (ev.usage) { studioAddTokens(ev.usage.input||0, ev.usage.output||0); }
3150
+ else if (ev.token && !isStatus) { studioTokens.out += Math.ceil(ev.token.length/4); studioUpdateTokenBar(); }
3107
3151
  if (ev.done) { resolve({output: output || '(no output)', canvas: canvasHtml}); return; }
3108
3152
  if (ev.error) { resolve({error: ev.error}); return; }
3109
3153
  } catch(e) {}