nothumanallowed 9.4.3 → 9.4.5
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 +1 -1
- package/src/commands/ui.mjs +19 -7
- package/src/constants.mjs +1 -1
- package/src/services/web-ui.mjs +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "9.4.
|
|
3
|
+
"version": "9.4.5",
|
|
4
4
|
"description": "NotHumanAllowed — 38 AI agents + 58 tools + browser automation + web search. Streaming chat, headless Chrome CDP, multi-conversation, export. Gmail, Calendar, Drive, GitHub, Notion, Slack. Zero-dependency CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/src/commands/ui.mjs
CHANGED
|
@@ -1027,8 +1027,11 @@ export async function cmdUI(args) {
|
|
|
1027
1027
|
let fullResponse;
|
|
1028
1028
|
if (toolResults.length > 0) {
|
|
1029
1029
|
// Second LLM call with real tool results — forces the LLM to use actual data
|
|
1030
|
-
const toolContext = toolResults.map(t =>
|
|
1031
|
-
|
|
1030
|
+
const toolContext = toolResults.map(t => {
|
|
1031
|
+
let clean = t.result.replace(/\[Screenshot[^\]]*\]/g, '').replace(/!\[.*?\]\(data:image[^)]+\)/g, '').slice(0, 3000);
|
|
1032
|
+
return `[${t.action} result]: ${clean.trim()}`;
|
|
1033
|
+
}).join('\n\n');
|
|
1034
|
+
const followUp = `The user asked: "${body.message}"\n\nI executed these tools and got REAL results:\n\n${toolContext}\n\nNow respond conversationally based ONLY on the REAL data above. Do NOT output any JSON blocks, base64, or image markdown — just natural text.`;
|
|
1032
1035
|
try {
|
|
1033
1036
|
fullResponse = await callLLM(config, enrichedSystemPrompt, followUp);
|
|
1034
1037
|
} catch {
|
|
@@ -1319,15 +1322,23 @@ export async function cmdUI(args) {
|
|
|
1319
1322
|
// If tools were executed, make a second LLM call with results
|
|
1320
1323
|
let finalResponse = fullResponse;
|
|
1321
1324
|
if (toolResults.length > 0) {
|
|
1322
|
-
const toolContext = toolResults.map(t =>
|
|
1323
|
-
|
|
1325
|
+
const toolContext = toolResults.map(t => {
|
|
1326
|
+
// Strip screenshot file references and base64 from tool results — the screenshot was already sent to the UI
|
|
1327
|
+
let clean = t.result.replace(/\[Screenshot[^\]]*\]/g, '').replace(/!\[.*?\]\(data:image[^)]+\)/g, '').slice(0, 3000);
|
|
1328
|
+
return `[${t.action} result]: ${clean.trim()}`;
|
|
1329
|
+
}).join('\n\n');
|
|
1330
|
+
const followUp = `The user asked: "${msg}"\n\nI executed these tools and got REAL results:\n\n${toolContext}\n\nNow respond to the user conversationally based ONLY on the REAL data above. Present the results clearly. Do NOT output any JSON blocks, any base64 data, or any image markdown — just natural text. If a screenshot was taken, just mention "Screenshot captured" without embedding it.`;
|
|
1324
1331
|
sendSSE('tool_synthesis', {});
|
|
1325
1332
|
try {
|
|
1326
1333
|
finalResponse = await callLLMStream(config, enrichedPrompt, followUp, (chunk) => {
|
|
1327
1334
|
sendSSE('token', { content: chunk });
|
|
1328
1335
|
});
|
|
1329
|
-
// Strip any JSON blocks the LLM might have emitted
|
|
1330
|
-
finalResponse = finalResponse
|
|
1336
|
+
// Strip any JSON blocks and base64 the LLM might have emitted
|
|
1337
|
+
finalResponse = finalResponse
|
|
1338
|
+
.replace(/```json[\s\S]*?```/g, '')
|
|
1339
|
+
.replace(/!\[.*?\]\(data:image\/[^)]+\)/g, '')
|
|
1340
|
+
.replace(/data:image\/[a-z]+;base64,[A-Za-z0-9+/=]{100,}/g, '[image]')
|
|
1341
|
+
.trim();
|
|
1331
1342
|
} catch {
|
|
1332
1343
|
finalResponse = toolResults.map(t => `${t.action}: ${t.result}`).join('\n\n');
|
|
1333
1344
|
}
|
|
@@ -1352,7 +1363,8 @@ export async function cmdUI(args) {
|
|
|
1352
1363
|
// Extract memory
|
|
1353
1364
|
try { extractMemory('chat', msg, finalResponse); } catch {}
|
|
1354
1365
|
|
|
1355
|
-
|
|
1366
|
+
const ssFiles = res._screenshotFiles || [];
|
|
1367
|
+
sendSSE('done', { content: finalResponse, screenshotFiles: ssFiles });
|
|
1356
1368
|
} catch (e) {
|
|
1357
1369
|
sendSSE('error', { message: e.message });
|
|
1358
1370
|
}
|
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 = '9.4.
|
|
8
|
+
export const VERSION = '9.4.5';
|
|
9
9
|
export const BASE_URL = 'https://nothumanallowed.com/cli';
|
|
10
10
|
export const API_BASE = 'https://nothumanallowed.com/api/v1';
|
|
11
11
|
|
package/src/services/web-ui.mjs
CHANGED
|
@@ -591,7 +591,7 @@ function sendChat(){
|
|
|
591
591
|
if(data.url)updateBrowserStatus(data.url);
|
|
592
592
|
}
|
|
593
593
|
if(currentEvent==='tool_synthesis'){chatHistory[streamIdx].content='';renderMessages();}
|
|
594
|
-
if(currentEvent==='done'){endStreaming();if(data.content)chatHistory[streamIdx].content=data.content;var ss=chatHistory[streamIdx]._screenshots;if(ss
|
|
594
|
+
if(currentEvent==='done'){endStreaming();if(data.content)chatHistory[streamIdx].content=data.content;var ssf=data.screenshotFiles||[];for(var fi=0;fi<ssf.length;fi++){chatHistory[streamIdx].content+='\\n\\n';}var ss=chatHistory[streamIdx]._screenshots||[];for(var si=0;si<ss.length;si++){if(ss[si].indexOf('/api/screenshots/')===0){var alreadyAdded=false;for(var fj=0;fj<ssf.length;fj++){if(ss[si].indexOf(ssf[fj])!==-1)alreadyAdded=true;}if(!alreadyAdded)chatHistory[streamIdx].content+='\\n\\n';}else if(ssf.length===0){chatHistory[streamIdx].content+='\\n\\n';}}renderMessages();loadConvList();closeBrowserViewer();}
|
|
595
595
|
if(currentEvent==='error'){endStreaming();chatHistory[streamIdx].content='Error: '+(data.message||'Unknown');renderMessages();}
|
|
596
596
|
}catch(e){}
|
|
597
597
|
}
|