nothumanallowed 11.5.3 → 11.6.0

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": "11.5.3",
3
+ "version": "11.6.0",
4
4
  "description": "NotHumanAllowed — 38 AI agents, 53 tools. Email, calendar, browser automation, screen capture, canvas, cron/heartbeat, GitHub, Notion, Slack, voice chat, 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 = '11.5.3';
8
+ export const VERSION = '11.6.0';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -262,7 +262,8 @@ export async function callNHA(apiKey, model, systemPrompt, userMessage, stream =
262
262
  stream,
263
263
  chat_template_kwargs: { enable_thinking: thinkingEnabled },
264
264
  };
265
- const res = await fetch('https://liara.nothumanallowed.com/v1/chat/completions', {
265
+ // Route through NHA server proxy (SENTINEL protection) instead of direct to Hetzner
266
+ const res = await fetch('https://nothumanallowed.com/api/v1/liara/chat', {
266
267
  method: 'POST',
267
268
  headers: {
268
269
  'Content-Type': 'application/json',
@@ -511,7 +512,7 @@ function buildRequestBody(provider, model, systemPrompt, userMessage, stream) {
511
512
  /** Get provider API URL */
512
513
  function getProviderUrl(provider, model, apiKey) {
513
514
  const urls = {
514
- nha: 'https://liara.nothumanallowed.com/v1/chat/completions',
515
+ nha: 'https://nothumanallowed.com/api/v1/liara/chat',
515
516
  anthropic: 'https://api.anthropic.com/v1/messages',
516
517
  openai: 'https://api.openai.com/v1/chat/completions',
517
518
  deepseek: 'https://api.deepseek.com/v1/chat/completions',
@@ -2054,14 +2054,42 @@ function settingsSection(id, title, desc, fields) {
2054
2054
  try { var cfg = JSON.parse(localStorage.getItem('nha_config_cache') || '{}'); currentVal = cfg[key] || ''; } catch(e) {}
2055
2055
 
2056
2056
  h += '<div style="margin-bottom:10px">' +
2057
- '<label style="display:block;font-size:11px;color:var(--dim);margin-bottom:3px">' + esc(label) + '</label>' +
2058
- '<input type="' + (isSecret ? 'password' : 'text') + '" ' +
2057
+ '<label style="display:block;font-size:11px;color:var(--dim);margin-bottom:3px">' + esc(label) + '</label>';
2058
+
2059
+ if (key === 'provider') {
2060
+ // Dropdown for provider selection
2061
+ var providers = [
2062
+ {value:'nha',label:'NHA Free (Liara) — no API key needed'},
2063
+ {value:'anthropic',label:'Anthropic (Claude)'},
2064
+ {value:'openai',label:'OpenAI (GPT-4)'},
2065
+ {value:'gemini',label:'Google (Gemini)'},
2066
+ {value:'deepseek',label:'DeepSeek'},
2067
+ {value:'grok',label:'xAI (Grok)'},
2068
+ {value:'mistral',label:'Mistral'},
2069
+ {value:'cohere',label:'Cohere'},
2070
+ ];
2071
+ 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="provider" data-section="' + esc(id) + '">';
2072
+ for (var pi=0;pi<providers.length;pi++) {
2073
+ var sel = currentVal === providers[pi].value ? ' selected' : '';
2074
+ h += '<option value="' + providers[pi].value + '"' + sel + '>' + providers[pi].label + '</option>';
2075
+ }
2076
+ h += '</select>';
2077
+ } else if (key === 'thinking') {
2078
+ // Dropdown for thinking toggle
2079
+ 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) + '">' +
2080
+ '<option value="off"' + (currentVal !== 'on' ? ' selected' : '') + '>Off — faster responses</option>' +
2081
+ '<option value="on"' + (currentVal === 'on' ? ' selected' : '') + '>On — extended reasoning (NHA Free only)</option>' +
2082
+ '</select>';
2083
+ } else {
2084
+ h += '<input type="' + (isSecret ? 'password' : 'text') + '" ' +
2059
2085
  'value="' + esc(currentVal) + '" ' +
2060
2086
  'placeholder="' + esc(placeholder) + '" ' +
2061
2087
  'style="width:100%;padding:8px 12px;font-size:13px" ' +
2062
2088
  'data-config-key="' + esc(key) + '" ' +
2063
- 'data-section="' + esc(id) + '">' +
2064
- '</div>';
2089
+ 'data-section="' + esc(id) + '">';
2090
+ }
2091
+
2092
+ h += '</div>';
2065
2093
  }
2066
2094
 
2067
2095
  h += '<div style="display:flex;align-items:center;gap:12px;margin-top:14px">' +
@@ -2077,7 +2105,7 @@ function settingsSection(id, title, desc, fields) {
2077
2105
  }
2078
2106
 
2079
2107
  function saveSettingsSection(sectionId) {
2080
- var inputs = document.querySelectorAll('input[data-section="' + sectionId + '"]');
2108
+ var inputs = document.querySelectorAll('input[data-section="' + sectionId + '"], select[data-section="' + sectionId + '"]');
2081
2109
  var statusEl = document.getElementById('settings-status-' + sectionId);
2082
2110
  if (statusEl) { statusEl.textContent = 'Saving...'; statusEl.style.color = 'var(--amber)'; }
2083
2111