nothumanallowed 13.5.32 → 13.5.34

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.32",
3
+ "version": "13.5.34",
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": {
@@ -3050,6 +3050,21 @@ ${rawText.slice(0, 18000)}`;
3050
3050
  } else if (agent === 'WebSearchAgent' || agent === 'ResearchAgent') {
3051
3051
  sendToken('[Searching the web and reading pages...] ');
3052
3052
  try {
3053
+ // If the task or stepPrompt contains explicit URLs, fetch them directly first
3054
+ const explicitUrls = (task + ' ' + stepPrompt).match(/https?:\/\/[^\s"'<>)]+/g);
3055
+ if (explicitUrls && explicitUrls.length > 0) {
3056
+ const uniqueUrls = [...new Set(explicitUrls)].slice(0, 4);
3057
+ for (const u of uniqueUrls) {
3058
+ sendToken(`[Fetching ${u}...] `);
3059
+ try {
3060
+ const fetchRes = await withTimeout(executeTool('fetch_url', { url: u }, config), 30000);
3061
+ const fetchStr = typeof fetchRes === 'string' ? fetchRes : JSON.stringify(fetchRes);
3062
+ if (fetchStr && fetchStr.length > 100) {
3063
+ toolData += (toolData ? '\n\n' : '') + `## Page content: ${u}\n${fetchStr.slice(0, 8000)}`;
3064
+ }
3065
+ } catch (e) { toolData += (toolData ? '\n\n' : '') + `## Fetch ${u} failed: ${e.message}`; }
3066
+ }
3067
+ }
3053
3068
  // If there is document context from a previous step, ask the LLM to derive
3054
3069
  // the optimal search queries. This is generic and works for any document/task.
3055
3070
  let searchQueries = [stepPrompt.slice(0, 120)];
@@ -3111,17 +3126,33 @@ ${rawText.slice(0, 18000)}`;
3111
3126
  } catch (e) { toolData = toolData || `Web search failed: ${e.message}`; }
3112
3127
 
3113
3128
  } else if (agent === 'BrowserAgent') {
3114
- const urlMatch = stepPrompt.match(/https?:\/\/[^\s"']+/);
3115
- if (urlMatch) {
3116
- sendToken(`[Fetching ${urlMatch[0]}...] `);
3117
- try {
3118
- const fetchResult = await withTimeout(executeTool('fetch_url', { url: urlMatch[0] }, config), 'BrowserAgent');
3119
- toolData = typeof fetchResult === 'string' ? fetchResult : JSON.stringify(fetchResult);
3120
- } catch (e) { toolData = `Fetch failed: ${e.message}`; }
3129
+ // Collect all URLs from stepPrompt + task, plus infer subpaths mentioned (e.g. /about, /docs)
3130
+ const allUrlMatches = [...new Set((stepPrompt + ' ' + task).match(/https?:\/\/[^\s"'<>)]+/g) || [])];
3131
+ // Also extract any relative paths like /about, /download, /docs mentioned near a base URL
3132
+ const baseUrlMatch = (stepPrompt + ' ' + task).match(/https?:\/\/[^\s"'<>/]+/);
3133
+ if (baseUrlMatch) {
3134
+ const base = baseUrlMatch[0].replace(/\/$/, '');
3135
+ const subpaths = (stepPrompt + ' ' + task).match(/\/[a-z][a-z0-9_/-]*/g) || [];
3136
+ for (const sp of subpaths) {
3137
+ if (sp.length > 1 && sp.length < 40) allUrlMatches.push(base + sp);
3138
+ }
3139
+ }
3140
+ const urlsToFetch = [...new Set(allUrlMatches)].slice(0, 5);
3141
+ if (urlsToFetch.length > 0) {
3142
+ for (const u of urlsToFetch) {
3143
+ sendToken(`[Fetching ${u}...] `);
3144
+ try {
3145
+ const fetchResult = await withTimeout(executeTool('fetch_url', { url: u }, config), 30000);
3146
+ const fetchStr = typeof fetchResult === 'string' ? fetchResult : JSON.stringify(fetchResult);
3147
+ if (fetchStr && fetchStr.length > 100) {
3148
+ toolData += (toolData ? '\n\n' : '') + `## Page: ${u}\n${fetchStr.slice(0, 8000)}`;
3149
+ }
3150
+ } catch (e) { toolData += (toolData ? '\n\n' : '') + `## Fetch ${u} failed: ${e.message}`; }
3151
+ }
3121
3152
  } else {
3122
3153
  sendToken('[Searching web...] ');
3123
3154
  try {
3124
- const searchResult = await withTimeout(executeTool('web_search', { query: stepPrompt }, config), 'BrowserSearch');
3155
+ const searchResult = await withTimeout(executeTool('web_search', { query: stepPrompt }, config), 30000);
3125
3156
  toolData = typeof searchResult === 'string' ? searchResult : JSON.stringify(searchResult);
3126
3157
  } catch (e) { toolData = `Browser search failed: ${e.message}`; }
3127
3158
  }
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.32';
8
+ export const VERSION = '13.5.34';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -3338,7 +3338,7 @@ var studioAbortController = null;
3338
3338
  var parlActiveAgent = null; // active agent label during parliament streaming
3339
3339
  var parlDoneAgents = {}; // set of completed agent labels during parliament
3340
3340
  var _parlPersistHtml = null; // persists parliament block HTML across tab navigations
3341
- var _PARL_STAMP = '<!--nha-parl-v13.5.32-->';
3341
+ var _PARL_STAMP = '<!--nha-parl-v13.5.34-->';
3342
3342
 
3343
3343
  function stopStudio() {
3344
3344
  if (!studioState.running) return;
@@ -4921,7 +4921,7 @@ async function runStudio() {
4921
4921
  \x27<div style="position:absolute;top:112px;left:58px;font-size:20px;z-index:5">\x27+String.fromCodePoint(0x1F331)+\x27</div>\x27+
4922
4922
  \x27<div style="position:absolute;top:112px;right:58px;font-size:20px;z-index:5">\x27+String.fromCodePoint(0x1F331)+\x27</div>\x27+
4923
4923
  // Cross-agent communication SVG overlay (dynamic, updated per call)
4924
- \x27<svg id="brCommSvg" style="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:8;overflow:visible"></svg>\x27+
4924
+ \x27<svg id="brCommSvg" style="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:20;overflow:visible"></svg>\x27+
4925
4925
  \x27<div style="position:relative;z-index:10;display:flex;flex-direction:column;justify-content:center;min-height:480px;padding:20px 16px;gap:0;box-sizing:border-box">\x27+
4926
4926
  \x27<div class="br-seats-row">\x27+topHtml+\x27</div>\x27+
4927
4927
  \x27<div style="position:relative;display:flex;align-items:center;width:100%;min-height:160px">\x27+
@@ -4971,8 +4971,9 @@ async function runStudio() {
4971
4971
  orchSpeech.style.display = \x27\x27;
4972
4972
  // Rotate through phrases based on progress
4973
4973
  orchSpeech.textContent = spArr[doneCount % spArr.length];
4974
- orchSpeech.style.borderColor = phaseColor;
4975
- orchSpeech.style.color = phaseColor;
4974
+ orchSpeech.style.borderColor = \x27#374151\x27;
4975
+ orchSpeech.style.color = \x27#000000\x27;
4976
+ orchSpeech.style.fontWeight = \x27700\x27;
4976
4977
  }
4977
4978
  }
4978
4979
 
@@ -5025,7 +5026,7 @@ async function runStudio() {
5025
5026
  bubbleEl.style.fontWeight = isActive ? \x27700\x27 : \x27500\x27;
5026
5027
  }
5027
5028
  if (nameEl) {
5028
- nameEl.style.color = isDone ? \x27#111827\x27 : (isActive ? phaseColor : \x27#374151\x27);
5029
+ nameEl.style.color = isDone ? \x27#111827\x27 : (isActive ? \x27#000000\x27 : \x27#374151\x27);
5029
5030
  nameEl.style.fontWeight = isActive ? \x27800\x27 : \x27600\x27;
5030
5031
  }
5031
5032
  });
@@ -6515,14 +6516,14 @@ input:focus,textarea:focus{border-color:var(--green3)}
6515
6516
  .br-orch--active .br-orch-emoji{animation:brOrchWalk 1.4s ease-in-out infinite alternate;filter:drop-shadow(0 0 20px #6366f1CC)}
6516
6517
  @keyframes brOrchWalk{0%{transform:translateX(0) scale(1)}100%{transform:translateX(14px) scale(1.07)}}
6517
6518
  .br-orch--done .br-orch-emoji{animation:orchBounce .7s ease forwards}
6518
- .br-orch-speech{font-size:10px;font-weight:800;font-family:var(--mono);padding:4px 10px;border:2px solid #6366f1;border-radius:10px;background:rgba(255,255,255,.95);color:#4338ca;white-space:nowrap;animation:brSpeechPop .7s ease-in-out infinite alternate;pointer-events:none;margin-bottom:4px;box-shadow:0 2px 8px rgba(99,102,241,.25)}
6519
+ .br-orch-speech{font-size:10px;font-weight:800;font-family:var(--mono);padding:4px 10px;border:2px solid #374151;border-radius:10px;background:#ffffff;color:#000000;white-space:nowrap;animation:brSpeechPop .7s ease-in-out infinite alternate;pointer-events:none;margin-bottom:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}
6519
6520
  @keyframes brSpeechPop{0%{transform:scale(1) rotate(-1deg)}100%{transform:scale(1.06) rotate(1deg)}}
6520
- .br-orch-label{font-size:9px;font-family:var(--mono);font-weight:800;color:#6366f1;background:rgba(99,102,241,.15);border-radius:6px;padding:2px 8px;margin-top:2px}
6521
+ .br-orch-label{font-size:9px;font-family:var(--mono);font-weight:800;color:#000000;background:rgba(255,255,255,.92);border-radius:6px;padding:2px 8px;margin-top:2px}
6521
6522
  /* Bubble above agent */
6522
- .br-bubble{font-size:9px;font-family:var(--mono);padding:4px 9px;border-radius:10px 10px 10px 2px;border:1.5px solid rgba(99,102,241,.35);background:rgba(255,255,255,.96);color:#1e1b4b;line-height:1.4;word-break:break-word;max-width:120px;white-space:normal;box-shadow:0 2px 8px rgba(0,0,0,.12);margin-bottom:3px}
6523
+ .br-bubble{font-size:9px;font-family:var(--mono);font-weight:700;padding:4px 9px;border-radius:10px 10px 10px 2px;border:1.5px solid #374151;background:#ffffff;color:#000000;line-height:1.4;word-break:break-word;max-width:120px;white-space:normal;box-shadow:0 2px 8px rgba(0,0,0,.12);margin-bottom:3px}
6523
6524
  /* Agent name pill */
6524
6525
  .br-seat-name{font-size:9px;font-family:var(--mono);font-weight:600;color:#374151;text-align:center;white-space:normal;word-break:break-word;max-width:100px;line-height:1.3;margin-top:1px;background:rgba(255,255,255,.75);border-radius:4px;padding:1px 4px;transition:color .3s,font-weight .2s;backdrop-filter:blur(2px)}
6525
- .br-seat--active .br-seat-name{color:#4338ca;font-weight:800}
6526
+ .br-seat--active .br-seat-name{color:#000000;font-weight:800}
6526
6527
  .br-seat--done .br-seat-name{color:#111827}
6527
6528
  @keyframes brDotFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
6528
6529
  /* Convergence */
@@ -6623,7 +6624,7 @@ input:focus,textarea:focus{border-color:var(--green3)}
6623
6624
  .prl-desk--active{background:#1e1a45;border-color:var(--dc,#6366f1);box-shadow:0 0 20px rgba(99,102,241,.3),0 0 40px rgba(99,102,241,.1),inset 0 1px 0 rgba(150,130,255,.15)}
6624
6625
  .prl-desk--done{border-color:#2a4a2a;background:#162516}
6625
6626
  .prl-action-bubble{font-size:9px;color:#6b7280;font-family:var(--mono);padding:2px 6px;border-radius:8px;background:#111;border:1px solid #2a2a38;min-height:16px;text-align:center;white-space:normal;word-break:break-word;max-width:88px;line-height:1.3;transition:all .3s}
6626
- .prl-action-bubble--active{color:var(--dc,#6366f1);border-color:var(--dc,#6366f1);background:rgba(99,102,241,.08);animation:parlBubblePop .4s ease}
6627
+ .prl-action-bubble--active{color:#000000;font-weight:700;border-color:#374151;background:#ffffff;animation:parlBubblePop .4s ease}
6627
6628
  @keyframes parlBubblePop{0%{transform:scale(.85);opacity:.5}100%{transform:scale(1);opacity:1}}
6628
6629
  @keyframes streamBlink{0%,100%{opacity:1}50%{opacity:0}}
6629
6630
  /* Character SVG animations */