nothumanallowed 14.1.17 → 14.1.19

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": "14.1.17",
3
+ "version": "14.1.19",
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 = '14.1.17';
8
+ export const VERSION = '14.1.19';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -560,13 +560,21 @@ ${authDesc}
560
560
 
561
561
  Design a COMPLETE production-ready file structure. Include ALL files needed for a fully working site: server, routes, middleware, models, public HTML/CSS/JS pages, config files, README. Minimum 20 files.`;
562
562
 
563
- // Round 1: plan files
563
+ // Emit immediately so the browser connection stays alive and the UI shows activity
564
+ emit({ type: 'processing', msg: 'Planning file structure...' });
565
+
566
+ // Round 1: plan files — stream so the client gets bytes immediately
564
567
  let filePlan = [];
565
568
  let planTokensIn = countTokens(FILE_PLAN_SYSTEM) + countTokens(planPrompt);
566
569
  let planTokensOut = 0;
567
570
  try {
568
- const planRaw = await callLLM(config, FILE_PLAN_SYSTEM, planPrompt, { max_tokens: 4096 });
569
- planTokensOut = countTokens(planRaw);
571
+ let planRaw = '';
572
+ await callLLMStream(config, FILE_PLAN_SYSTEM, planPrompt, (chunk) => {
573
+ planRaw += chunk;
574
+ planTokensOut += countTokens(chunk);
575
+ // Emit heartbeat tokens so browser doesn't timeout
576
+ emit({ type: 'planning', chunk });
577
+ }, { max_tokens: 4096 });
570
578
  const clean = planRaw.replace(/<think>[\s\S]*?<\/think>/g, '').trim()
571
579
  .replace(/^```[\w]*\n?/, '').replace(/\n?```$/, '').trim();
572
580
  const arr = JSON.parse(clean.match(/\[[\s\S]*\]/)?.[0] ?? clean);