nothumanallowed 9.4.3 → 9.4.4

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": "9.4.3",
3
+ "version": "9.4.4",
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": {
@@ -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 => `[${t.action} result]: ${t.result.slice(0, 3000)}`).join('\n\n');
1031
- 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 — just natural text.`;
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 => `[${t.action} result]: ${t.result.slice(0, 3000)}`).join('\n\n');
1323
- 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 — just natural text.`;
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 anyway
1330
- finalResponse = finalResponse.replace(/```json[\s\S]*?```/g, '').trim();
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
  }
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.3';
8
+ export const VERSION = '9.4.4';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11