nothumanallowed 13.5.36 → 13.5.37

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.37",
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.37';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -3345,7 +3345,7 @@ var studioAbortController = null;
3345
3345
  var parlActiveAgent = null; // active agent label during parliament streaming
3346
3346
  var parlDoneAgents = {}; // set of completed agent labels during parliament
3347
3347
  var _parlPersistHtml = null; // persists parliament block HTML across tab navigations
3348
- var _PARL_STAMP = '<!--nha-parl-v13.5.36-->';
3348
+ var _PARL_STAMP = '<!--nha-parl-v13.5.37-->';
3349
3349
 
3350
3350
  function stopStudio() {
3351
3351
  if (!studioState.running) return;
@@ -6295,7 +6295,7 @@ async function wcGenerate() {
6295
6295
  'CSS MUST follow BEM naming: block__element--modifier. No inline styles except dynamic values.',
6296
6296
  'PostgreSQL: use pg.Pool (max:10, idleTimeoutMillis:30000). Export singleton. Always use parameterized queries.',
6297
6297
  'JWT: access token 15min, refresh token 7 days with rotation. Store refresh in httpOnly cookie.',
6298
- ].join('\n');
6298
+ ].join(String.fromCharCode(10));
6299
6299
 
6300
6300
  var authFieldsDef = wcState.authFields.map(function(f){ return f.label+' ('+f.type+(f.required?', required':'')+')'; }).join(', ');
6301
6301
  var blocksEnabled = Object.keys(wcState.blocks).filter(function(b){ return wcState.blocks[b]; }).join(', ');
@@ -6336,16 +6336,22 @@ async function wcGenerate() {
6336
6336
  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
6337
  }
6338
6338
 
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.';
6339
+ var _nl = String.fromCharCode(10);
6340
+ 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
6341
 
6341
6342
  for (var fi = 0; fi < filePlan.length; fi++) {
6342
6343
  var fp = filePlan[fi];
6343
6344
  var runBtn = document.getElementById('wcRunBtn');
6344
6345
  if (runBtn) runBtn.textContent = '&#9203; Generating ' + fp.name + ' (' + (fi+1) + '/' + filePlan.length + ')...';
6345
6346
  try {
6346
- var content = await wcCallLLM(sysPreamble, fp.prompt + '\n\nFile to generate: ' + fp.name);
6347
+ var _nl2 = String.fromCharCode(10);
6348
+ var content = await wcCallLLM(sysPreamble, fp.prompt + _nl2 + _nl2 + 'File to generate: ' + fp.name);
6347
6349
  // Strip markdown code fences if model added them anyway
6348
- content = content.replace(/^```[a-z]*\n?/i,'').replace(/\n?```$/,'').trim();
6350
+ var _fence = String.fromCharCode(96,96,96);
6351
+ var wcLines = content.split(_nl2);
6352
+ if (wcLines.length > 0 && wcLines[0].indexOf(_fence) === 0) wcLines.shift();
6353
+ if (wcLines.length > 0 && wcLines[wcLines.length-1].trim() === _fence) wcLines.pop();
6354
+ content = wcLines.join(_nl2).trim();
6349
6355
  wcState.generatedFiles.push({ name: fp.name, content: content, lang: fp.lang });
6350
6356
  if (fi === 0) wcState.activeFile = 0;
6351
6357
  renderWebCraft(document.getElementById('content'));
@@ -6380,7 +6386,7 @@ function wcDownloadZip() {
6380
6386
  lines.push('=== END: ' + f.name + ' ===');
6381
6387
  lines.push('');
6382
6388
  });
6383
- var blob = new Blob([lines.join('\n')], {type:'text/plain'});
6389
+ var blob = new Blob([lines.join(String.fromCharCode(10))], {type:'text/plain'});
6384
6390
  var a = document.createElement('a');
6385
6391
  a.href = URL.createObjectURL(blob);
6386
6392
  a.download = (wcState.projectName || 'project') + '-webcraft.txt';