nothumanallowed 13.5.36 → 13.5.38

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.36",
3
+ "version": "13.5.38",
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.5.36';
8
+ export const VERSION = '13.5.38';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -3136,6 +3136,14 @@ var I18N = {
3136
3136
  nav_slack:'Slack', nav_birthdays:'Birthdays', nav_agents:'Agents',
3137
3137
  nav_studio:'Studio', nav_collab:'AgentMessenger', nav_settings:'Settings',
3138
3138
  nav_docs:'Documentation', nav_agents_guide:'Agents Guide', nav_mobile:'Mobile App',
3139
+ nav_webcraft:'WebCraft',
3140
+ wc_title:'WebCraft', wc_subtitle:'Generate enterprise-grade web projects — security headers A+, BEM CSS, PostgreSQL pool, Auth, GDPR cookie banner.',
3141
+ wc_project:'Project', wc_project_name:'Project name (e.g. MySaaS)', wc_desc:'Describe your project...',
3142
+ wc_blocks:'Included Blocks', wc_auth_fields:'Auth Fields', wc_add_field:'+ Add field',
3143
+ wc_required_hint:'Checked = Required | Edit label & type inline',
3144
+ wc_generate:'Generate Project', wc_generating:'Generating',
3145
+ wc_download:'Download Archive', wc_describe_first:'Please describe your project first.',
3146
+ wc_no_files:'Describe your project and click Generate',
3139
3147
  },
3140
3148
  it: {
3141
3149
  chat:'Chat', studio:'Studio', settings:'Impostazioni', agents:'Agenti',
@@ -3163,6 +3171,14 @@ var I18N = {
3163
3171
  nav_slack:'Slack', nav_birthdays:'Compleanni', nav_agents:'Agenti',
3164
3172
  nav_studio:'Studio', nav_collab:'AgentMessenger', nav_settings:'Impostazioni',
3165
3173
  nav_docs:'Documentazione', nav_agents_guide:'Guida Agenti', nav_mobile:'App Mobile',
3174
+ nav_webcraft:'WebCraft',
3175
+ wc_title:'WebCraft', wc_subtitle:'Genera progetti web enterprise — security headers A+, CSS BEM, PostgreSQL pool, Auth, cookie banner GDPR.',
3176
+ wc_project:'Progetto', wc_project_name:'Nome progetto (es. MioSaaS)', wc_desc:'Descrivi il tuo progetto...',
3177
+ wc_blocks:'Blocchi inclusi', wc_auth_fields:'Campi registrazione', wc_add_field:'+ Aggiungi campo',
3178
+ wc_required_hint:'Spuntato = Obbligatorio | Modifica etichetta e tipo inline',
3179
+ wc_generate:'Genera progetto', wc_generating:'Generazione in corso',
3180
+ wc_download:'Scarica archivio', wc_describe_first:'Descrivi prima il tuo progetto.',
3181
+ wc_no_files:'Descrivi il progetto e clicca Genera',
3166
3182
  },
3167
3183
  es: {
3168
3184
  chat:'Chat', studio:'Studio', settings:'Configuración', agents:'Agentes',
@@ -3189,6 +3205,14 @@ var I18N = {
3189
3205
  nav_slack:'Slack', nav_birthdays:'Cumplea\u00f1os', nav_agents:'Agentes',
3190
3206
  nav_studio:'Studio', nav_collab:'AgentMessenger', nav_settings:'Configuraci\u00f3n',
3191
3207
  nav_docs:'Documentaci\u00f3n', nav_agents_guide:'Gu\u00eda Agentes', nav_mobile:'App M\u00f3vil',
3208
+ nav_webcraft:'WebCraft',
3209
+ wc_title:'WebCraft', wc_subtitle:'Genera proyectos web empresariales — headers A+, CSS BEM, PostgreSQL pool, Auth, banner de cookies GDPR.',
3210
+ wc_project:'Proyecto', wc_project_name:'Nombre del proyecto (ej. MiSaaS)', wc_desc:'Describe tu proyecto...',
3211
+ wc_blocks:'Bloques incluidos', wc_auth_fields:'Campos de registro', wc_add_field:'+ A\u00f1adir campo',
3212
+ wc_required_hint:'Marcado = Obligatorio | Edita etiqueta y tipo inline',
3213
+ wc_generate:'Generar proyecto', wc_generating:'Generando',
3214
+ wc_download:'Descargar archivo', wc_describe_first:'Por favor describe tu proyecto primero.',
3215
+ wc_no_files:'Describe el proyecto y haz clic en Generar',
3192
3216
  },
3193
3217
  fr: {
3194
3218
  chat:'Chat', studio:'Studio', settings:'Paramètres', agents:'Agents',
@@ -3215,6 +3239,14 @@ var I18N = {
3215
3239
  nav_slack:'Slack', nav_birthdays:'Anniversaires', nav_agents:'Agents',
3216
3240
  nav_studio:'Studio', nav_collab:'AgentMessenger', nav_settings:'Param\u00e8tres',
3217
3241
  nav_docs:'Documentation', nav_agents_guide:'Guide Agents', nav_mobile:'App Mobile',
3242
+ nav_webcraft:'WebCraft',
3243
+ wc_title:'WebCraft', wc_subtitle:'G\u00e9n\u00e9rez des projets web entreprise — headers A+, CSS BEM, pool PostgreSQL, Auth, bandeau cookies RGPD.',
3244
+ wc_project:'Projet', wc_project_name:'Nom du projet (ex. MonSaaS)', wc_desc:'D\u00e9crivez votre projet...',
3245
+ wc_blocks:'Blocs inclus', wc_auth_fields:'Champs inscription', wc_add_field:'+ Ajouter un champ',
3246
+ wc_required_hint:'Coch\u00e9 = Obligatoire | Modifier \u00e9tiquette et type inline',
3247
+ wc_generate:'G\u00e9n\u00e9rer le projet', wc_generating:'G\u00e9n\u00e9ration en cours',
3248
+ wc_download:'T\u00e9l\u00e9charger archive', wc_describe_first:'Veuillez d\u00e9crire votre projet.',
3249
+ wc_no_files:'D\u00e9crivez le projet et cliquez sur G\u00e9n\u00e9rer',
3218
3250
  },
3219
3251
  de: {
3220
3252
  chat:'Chat', studio:'Studio', settings:'Einstellungen', agents:'Agenten',
@@ -3241,6 +3273,14 @@ var I18N = {
3241
3273
  nav_slack:'Slack', nav_birthdays:'Geburtstage', nav_agents:'Agenten',
3242
3274
  nav_studio:'Studio', nav_collab:'AgentMessenger', nav_settings:'Einstellungen',
3243
3275
  nav_docs:'Dokumentation', nav_agents_guide:'Agenten-Leitfaden', nav_mobile:'Mobile App',
3276
+ nav_webcraft:'WebCraft',
3277
+ wc_title:'WebCraft', wc_subtitle:'Enterprise-Web-Projekte generieren — Security-Headers A+, BEM CSS, PostgreSQL Pool, Auth, DSGVO Cookie-Banner.',
3278
+ wc_project:'Projekt', wc_project_name:'Projektname (z.B. MeinSaaS)', wc_desc:'Beschreibe dein Projekt...',
3279
+ wc_blocks:'Enthaltene Bl\u00f6cke', wc_auth_fields:'Registrierungsfelder', wc_add_field:'+ Feld hinzuf\u00fcgen',
3280
+ wc_required_hint:'Aktiviert = Pflichtfeld | Beschriftung und Typ inline bearbeiten',
3281
+ wc_generate:'Projekt generieren', wc_generating:'Generierung',
3282
+ wc_download:'Archiv herunterladen', wc_describe_first:'Bitte beschreibe zuerst dein Projekt.',
3283
+ wc_no_files:'Beschreibe das Projekt und klicke auf Generieren',
3244
3284
  },
3245
3285
  };
3246
3286
  // Fallback to 'en' for unmapped languages
@@ -3309,7 +3349,7 @@ function renderSidebar() {
3309
3349
  \x27<span style="font-size:8px;padding:1px 5px;border-radius:4px;background:rgba(99,102,241,.25);color:var(--green);margin-left:4px;font-weight:700">NEW</span>\x27+
3310
3350
  \x27</div>\x27+
3311
3351
  \x27<div class="nav-item\x27+(activeView===\x27webcraft\x27?\x27 nav-item--active\x27:\x27\x27)+\x27" data-view="webcraft" onclick="switchView(\\\x27webcraft\\\x27)">\x27+
3312
- \x27<span class="nav-item__icon">&#128736;</span> WebCraft\x27+
3352
+ \x27<span class="nav-item__icon">&#128736;</span> \x27+t(\x27nav_webcraft\x27)+
3313
3353
  \x27<span style="font-size:8px;padding:1px 5px;border-radius:4px;background:rgba(99,102,241,.25);color:var(--green);margin-left:4px;font-weight:700">NEW</span>\x27+
3314
3354
  \x27</div>\x27+
3315
3355
  \x27<div class="nav-item\x27+(activeView===\x27collab\x27?\x27 nav-item--active\x27:\x27\x27)+\x27" data-view="collab" onclick="switchView(\\\x27collab\\\x27)">\x27+
@@ -3345,7 +3385,7 @@ var studioAbortController = null;
3345
3385
  var parlActiveAgent = null; // active agent label during parliament streaming
3346
3386
  var parlDoneAgents = {}; // set of completed agent labels during parliament
3347
3387
  var _parlPersistHtml = null; // persists parliament block HTML across tab navigations
3348
- var _PARL_STAMP = '<!--nha-parl-v13.5.36-->';
3388
+ var _PARL_STAMP = '<!--nha-parl-v13.5.38-->';
3349
3389
 
3350
3390
  function stopStudio() {
3351
3391
  if (!studioState.running) return;
@@ -6185,7 +6225,7 @@ function renderWebCraft(el) {
6185
6225
  '</div>'
6186
6226
  : '<div style="flex:1;display:flex;align-items:center;justify-content:center;color:var(--dim);font-size:12px;flex-direction:column;gap:8px">' +
6187
6227
  '<span style="font-size:36px;opacity:.25">&#128736;</span>' +
6188
- '<span>Describe your project and click Generate</span>' +
6228
+ '<span>'+t('wc_no_files')+'</span>' +
6189
6229
  '</div>';
6190
6230
 
6191
6231
  var authFieldsHtml = wcState.authFields.map(function(f,i){
@@ -6202,8 +6242,8 @@ function renderWebCraft(el) {
6202
6242
  el.innerHTML =
6203
6243
  '<div style="max-width:1100px;margin:0 auto;padding:0 8px">' +
6204
6244
  '<div style="margin-bottom:18px">' +
6205
- '<h2 style="font-size:15px;color:var(--green);margin-bottom:4px">&#128736; WebCraft</h2>' +
6206
- '<p style="font-size:11px;color:var(--dim);line-height:1.5">Generate enterprise-grade web projects — security headers A+, BEM CSS, PostgreSQL pool, Auth, GDPR cookie banner.</p>' +
6245
+ '<h2 style="font-size:15px;color:var(--green);margin-bottom:4px">&#128736; '+t('wc_title')+'</h2>' +
6246
+ '<p style="font-size:11px;color:var(--dim);line-height:1.5">'+t('wc_subtitle')+'</p>' +
6207
6247
  '</div>' +
6208
6248
 
6209
6249
  '<div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap">' +
@@ -6213,14 +6253,14 @@ function renderWebCraft(el) {
6213
6253
 
6214
6254
  // Project name + description
6215
6255
  '<div style="background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:14px">' +
6216
- '<div style="font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.8px;margin-bottom:8px">Project</div>' +
6217
- '<input id="wcProjectName" placeholder="Project name (e.g. MySaaS)" value="'+wcEsc(wcState.projectName)+'" oninput="wcState.projectName=this.value" style="width:100%;padding:8px 10px;font-size:12px;border-radius:6px;border:1px solid var(--border2);background:var(--bg3);color:var(--text);margin-bottom:8px;box-sizing:border-box">' +
6218
- '<textarea id="wcDesc" placeholder="Describe your project... e.g. SaaS landing page with user registration, dashboard, Stripe-ready pricing section" rows="4" oninput="wcState.description=this.value" style="width:100%;padding:8px 10px;font-size:12px;border-radius:6px;border:1px solid var(--border2);background:var(--bg3);color:var(--text);resize:vertical;box-sizing:border-box;line-height:1.5">'+wcEsc(wcState.description)+'</textarea>' +
6256
+ '<div style="font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.8px;margin-bottom:8px">'+t('wc_project')+'</div>' +
6257
+ '<input id="wcProjectName" placeholder="'+t('wc_project_name')+'" value="'+wcEsc(wcState.projectName)+'" oninput="wcState.projectName=this.value" style="width:100%;padding:8px 10px;font-size:12px;border-radius:6px;border:1px solid var(--border2);background:var(--bg3);color:var(--text);margin-bottom:8px;box-sizing:border-box">' +
6258
+ '<textarea id="wcDesc" placeholder="'+t('wc_desc')+' e.g. SaaS landing page with user registration, dashboard, Stripe-ready pricing section" rows="4" oninput="wcState.description=this.value" style="width:100%;padding:8px 10px;font-size:12px;border-radius:6px;border:1px solid var(--border2);background:var(--bg3);color:var(--text);resize:vertical;box-sizing:border-box;line-height:1.5">'+wcEsc(wcState.description)+'</textarea>' +
6219
6259
  '</div>' +
6220
6260
 
6221
6261
  // Blocks
6222
6262
  '<div style="background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:14px">' +
6223
- '<div style="font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.8px;margin-bottom:10px">Included Blocks</div>' +
6263
+ '<div style="font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.8px;margin-bottom:10px">'+t('wc_blocks')+'</div>' +
6224
6264
  ['auth','cookieBanner','securityMiddleware','emailVerification'].map(function(b){
6225
6265
  var labels = {auth:'Auth (register/login/JWT)',cookieBanner:'GDPR Cookie Banner',securityMiddleware:'Security Middleware',emailVerification:'Email Verification'};
6226
6266
  var icons = {auth:'&#128274;',cookieBanner:'&#127850;',securityMiddleware:'&#128737;',emailVerification:'&#9993;'};
@@ -6234,20 +6274,20 @@ function renderWebCraft(el) {
6234
6274
  // Auth fields configurator
6235
6275
  '<div id="wcAuthFieldsPanel" style="background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:14px;'+(wcState.blocks.auth?'':'display:none')+'">' +
6236
6276
  '<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:8px">' +
6237
- '<div style="font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.8px">Auth Fields</div>' +
6238
- '<button onclick="wcAddField()" style="font-size:10px;padding:3px 8px;background:var(--bg3);border:1px solid var(--border2);border-radius:5px;color:var(--green);cursor:pointer">+ Add field</button>' +
6277
+ '<div style="font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.8px">'+t('wc_auth_fields')+'</div>' +
6278
+ '<button onclick="wcAddField()" style="font-size:10px;padding:3px 8px;background:var(--bg3);border:1px solid var(--border2);border-radius:5px;color:var(--green);cursor:pointer">'+t('wc_add_field')+'</button>' +
6239
6279
  '</div>' +
6240
6280
  '<div id="wcFieldsList">'+authFieldsHtml+'</div>' +
6241
- '<div style="font-size:9px;color:var(--dim);margin-top:4px">&#9745; = Required &nbsp;|&nbsp; Edit label &amp; type inline</div>' +
6281
+ '<div style="font-size:9px;color:var(--dim);margin-top:4px">'+t('wc_required_hint')+'</div>' +
6242
6282
  '</div>' +
6243
6283
 
6244
6284
  // Generate button
6245
6285
  '<button id="wcRunBtn" onclick="wcGenerate()" style="width:100%;padding:12px;background:var(--green3);border:none;border-radius:8px;color:var(--bg);font-size:13px;font-weight:700;cursor:pointer;letter-spacing:.2px"'+(wcState.running?' disabled':'')+'>'+
6246
- (wcState.running ? '&#9203; Generating...' : '&#9654; Generate Project') +
6286
+ (wcState.running ? '&#9203; '+t('wc_generating')+'...' : '&#9654; '+t('wc_generate')) +
6247
6287
  '</button>' +
6248
6288
 
6249
6289
  (wcState.generatedFiles.length > 0 ?
6250
- '<button onclick="wcDownloadZip()" style="width:100%;padding:10px;background:var(--bg3);border:1px solid var(--border2);border-radius:8px;color:var(--text);font-size:12px;font-weight:600;cursor:pointer">&#8681; Download ZIP</button>' : '') +
6290
+ '<button onclick="wcDownloadZip()" style="width:100%;padding:10px;background:var(--bg3);border:1px solid var(--border2);border-radius:8px;color:var(--text);font-size:12px;font-weight:600;cursor:pointer">&#8681; '+t('wc_download')+'</button>' : '') +
6251
6291
 
6252
6292
  '</div>' +
6253
6293
 
@@ -6275,7 +6315,7 @@ async function wcGenerate() {
6275
6315
  if (wcState.running) return;
6276
6316
  var desc = (document.getElementById('wcDesc')||{}).value || wcState.description;
6277
6317
  var projName = (document.getElementById('wcProjectName')||{}).value || wcState.projectName || 'myproject';
6278
- if (!desc || desc.length < 10) { alert('Please describe your project first.'); return; }
6318
+ if (!desc || desc.length < 10) { alert(t('wc_describe_first')); return; }
6279
6319
  wcState.description = desc;
6280
6320
  wcState.projectName = projName;
6281
6321
  wcState.running = true;
@@ -6295,7 +6335,7 @@ async function wcGenerate() {
6295
6335
  'CSS MUST follow BEM naming: block__element--modifier. No inline styles except dynamic values.',
6296
6336
  'PostgreSQL: use pg.Pool (max:10, idleTimeoutMillis:30000). Export singleton. Always use parameterized queries.',
6297
6337
  'JWT: access token 15min, refresh token 7 days with rotation. Store refresh in httpOnly cookie.',
6298
- ].join('\n');
6338
+ ].join(String.fromCharCode(10));
6299
6339
 
6300
6340
  var authFieldsDef = wcState.authFields.map(function(f){ return f.label+' ('+f.type+(f.required?', required':'')+')'; }).join(', ');
6301
6341
  var blocksEnabled = Object.keys(wcState.blocks).filter(function(b){ return wcState.blocks[b]; }).join(', ');
@@ -6336,16 +6376,22 @@ async function wcGenerate() {
6336
6376
  filePlan = filePlan.map(function(f){ return f.name === 'server/services/email.js' ? Object.assign({},f,{prompt:f.prompt+' (Skip email verification — not enabled)'}) : f; });
6337
6377
  }
6338
6378
 
6339
- var sysPreamble = 'You are an expert full-stack engineer generating production-quality code.\n\nSECURITY RULES (non-negotiable):\n'+SECURITY_RULES+'\n\nProject: '+projName+'\nDescription: '+desc+'\nEnabled blocks: '+blocksEnabled+'\n\nGenerate ONLY the file content requested. No explanations, no markdown code fences, no comments like "here is the file". Output raw file content only.';
6379
+ var _nl = String.fromCharCode(10);
6380
+ var sysPreamble = 'You are an expert full-stack engineer generating production-quality code.' + _nl + _nl + 'SECURITY RULES (non-negotiable):' + _nl + SECURITY_RULES + _nl + _nl + 'Project: ' + projName + _nl + 'Description: ' + desc + _nl + 'Enabled blocks: ' + blocksEnabled + _nl + _nl + 'Generate ONLY the file content requested. No explanations, no markdown code fences, no comments like "here is the file". Output raw file content only.';
6340
6381
 
6341
6382
  for (var fi = 0; fi < filePlan.length; fi++) {
6342
6383
  var fp = filePlan[fi];
6343
6384
  var runBtn = document.getElementById('wcRunBtn');
6344
- if (runBtn) runBtn.textContent = '&#9203; Generating ' + fp.name + ' (' + (fi+1) + '/' + filePlan.length + ')...';
6385
+ if (runBtn) runBtn.textContent = '&#9203; '+t('wc_generating')+' ' + fp.name + ' (' + (fi+1) + '/' + filePlan.length + ')...';
6345
6386
  try {
6346
- var content = await wcCallLLM(sysPreamble, fp.prompt + '\n\nFile to generate: ' + fp.name);
6387
+ var _nl2 = String.fromCharCode(10);
6388
+ var content = await wcCallLLM(sysPreamble, fp.prompt + _nl2 + _nl2 + 'File to generate: ' + fp.name);
6347
6389
  // Strip markdown code fences if model added them anyway
6348
- content = content.replace(/^```[a-z]*\n?/i,'').replace(/\n?```$/,'').trim();
6390
+ var _fence = String.fromCharCode(96,96,96);
6391
+ var wcLines = content.split(_nl2);
6392
+ if (wcLines.length > 0 && wcLines[0].indexOf(_fence) === 0) wcLines.shift();
6393
+ if (wcLines.length > 0 && wcLines[wcLines.length-1].trim() === _fence) wcLines.pop();
6394
+ content = wcLines.join(_nl2).trim();
6349
6395
  wcState.generatedFiles.push({ name: fp.name, content: content, lang: fp.lang });
6350
6396
  if (fi === 0) wcState.activeFile = 0;
6351
6397
  renderWebCraft(document.getElementById('content'));
@@ -6380,7 +6426,7 @@ function wcDownloadZip() {
6380
6426
  lines.push('=== END: ' + f.name + ' ===');
6381
6427
  lines.push('');
6382
6428
  });
6383
- var blob = new Blob([lines.join('\n')], {type:'text/plain'});
6429
+ var blob = new Blob([lines.join(String.fromCharCode(10))], {type:'text/plain'});
6384
6430
  var a = document.createElement('a');
6385
6431
  a.href = URL.createObjectURL(blob);
6386
6432
  a.download = (wcState.projectName || 'project') + '-webcraft.txt';