nothumanallowed 9.8.6 → 9.8.7

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.8.6",
3
+ "version": "9.8.7",
4
4
  "description": "NotHumanAllowed — 38 AI agents, 53 tools. Email, calendar, browser automation, screen capture, canvas, cron/heartbeat, GitHub, Notion, Slack, voice chat, 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 = '9.8.6';
8
+ export const VERSION = '9.8.7';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -409,7 +409,7 @@ function renderChat(el){
409
409
  '</div>'+
410
410
  '<div class="chat"><div class="chat__messages" id="chatMessages"></div>'+
411
411
  '<div id="chatAttachInfo" style="display:none;padding:4px 12px;font-size:11px;color:var(--cyan);background:var(--bg2);border-top:1px solid var(--border)"><span id="chatAttachName"></span> <button onclick="clearChatAttach()" style="background:none;border:none;color:#f44;cursor:pointer;font-size:14px;font-weight:700">&times;</button></div>'+
412
- '<div class="chat__bar"><button class="chat__mic" id="chatMic" onclick="toggleVoiceInput()" title="Voice input">&#127908;</button><button onclick="document.getElementById(\\x27chatFileInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach file">&#128206;</button><button onclick="document.getElementById(\\x27chatImageInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach image">&#128247;</button><input type="file" id="chatFileInput" style="display:none" onchange="handleChatFile(this)"><input type="file" id="chatImageInput" accept="image/*" style="display:none" onchange="handleChatImage(this)"><textarea class="chat__input" id="chatInput" placeholder="Ask anything... (or attach file/image first)" rows="1"></textarea><button class="chat__send" id="chatSend">Send</button><button class="chat__stop" id="chatStop" onclick="stopChat()">Stop</button><button onclick="reopenCanvas()" style="background:none;border:none;cursor:pointer;font-size:14px;padding:4px;color:var(--dim)" title="Open Canvas panel">&#x25A3;</button></div>'+
412
+ '<div class="chat__bar"><button class="chat__mic" id="chatMic" onclick="toggleVoiceInput()" title="Voice input">&#127908;</button><button onclick="document.getElementById(\\x27chatFileInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach file">&#128206;</button><button onclick="document.getElementById(\\x27chatImageInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach image">&#128247;</button><input type="file" id="chatFileInput" style="display:none" onchange="handleChatFile(this)"><input type="file" id="chatImageInput" accept="image/*" style="display:none" onchange="handleChatImage(this)"><textarea class="chat__input" id="chatInput" placeholder="Ask anything... (or attach file/image first)" rows="1"></textarea><button class="chat__send" id="chatSend">Send</button><button class="chat__stop" id="chatStop" onclick="stopChat()">Stop</button><button onclick="reopenCanvas()" style="background:none;border:1px solid var(--border2);border-radius:6px;cursor:pointer;font-size:11px;padding:4px 8px;color:var(--dim);font-family:var(--mono);display:flex;align-items:center;gap:4px" title="Open Canvas / Browser panel"><span style="font-size:14px">&#x25A3;</span>Canvas</button></div>'+
413
413
  '</div>'+
414
414
  '</div>'+
415
415
  '</div>';
@@ -547,11 +547,18 @@ function showCanvas(html,title){
547
547
 
548
548
  function addBrowserPage(base64,url){
549
549
  var d=getConvCanvasData();
550
- // Avoid duplicates (same URL in a row)
551
- if(d.browsers.length>0&&d.browsers[d.browsers.length-1].url===url)return;
552
- d.browsers.push({base64:base64,url:url||'Browser',ts:new Date().toLocaleTimeString()});
550
+ var cleanUrl=(url||'Browser').replace(/^https?:\\/\\//, '').slice(0,60);
551
+ // Only add if URL is different from the last entry (avoid frame duplicates)
552
+ if(d.browsers.length>0&&d.browsers[d.browsers.length-1].url===cleanUrl){
553
+ // Update the thumbnail with the latest frame
554
+ d.browsers[d.browsers.length-1].base64=base64;
555
+ return;
556
+ }
557
+ d.browsers.push({base64:base64,url:cleanUrl,ts:new Date().toLocaleTimeString()});
553
558
  browserIdx=d.browsers.length-1;
554
- saveCanvasData();
559
+ // Auto-update canvas panel if browser tab is open
560
+ var p=document.getElementById('canvasPanel');
561
+ if(p&&p.classList.contains('open')&&canvasMode==='browser'){renderCanvasPanel();}
555
562
  }
556
563
 
557
564
  function saveCanvasData(){
@@ -592,25 +599,38 @@ function renderCanvasPanel(){
592
599
  // Header title
593
600
  var t=document.getElementById('canvasTitle');
594
601
  if(t){
595
- if(!item){t.textContent=canvasMode==='browser'?'No pages visited':'Empty canvas';}
596
- else if(canvasMode==='browser'){t.textContent=(item.url||'Browser')+(list.length>1?' ('+(idx+1)+'/'+list.length+')':'');}
597
- else{t.textContent=(item.title||'Canvas')+(list.length>1?' ('+(idx+1)+'/'+list.length+')':'');}
602
+ if(canvasMode==='browser'){t.textContent=d.browsers.length>0?d.browsers.length+' pages visited':'No pages visited';}
603
+ else if(!item){t.textContent='Empty canvas';}
604
+ else{t.textContent=(item.title||'Canvas')+(d.canvases.length>1?' ('+(canvasIdx+1)+'/'+d.canvases.length+')':'');}
598
605
  }
599
- // Nav arrows
606
+ // Nav arrows — only for canvas mode (browser uses gallery grid)
600
607
  var navEl=document.getElementById('canvasNav');
601
- if(navEl){navEl.style.display=list.length>1?'flex':'none';}
608
+ if(navEl){navEl.style.display=d.canvases.length>1&&canvasMode==='canvas'?'flex':'none';}
602
609
  // Tab highlight
603
610
  var tabC=document.getElementById('canvasTabC');
604
611
  var tabB=document.getElementById('canvasTabB');
605
612
  if(tabC)tabC.style.borderBottom=canvasMode==='canvas'?'2px solid var(--green)':'none';
606
613
  if(tabB)tabB.style.borderBottom=canvasMode==='browser'?'2px solid var(--green)':'none';
607
- // Render iframe
614
+ // Render iframe content
608
615
  var f=document.getElementById('canvasFrame');if(!f)return;
609
616
  var doc=f.contentDocument||f.contentWindow.document;
610
- if(!item){
611
- doc.open();doc.write('<html><body style="margin:0;background:#111;display:flex;align-items:center;justify-content:center;height:100vh;font-family:monospace;color:#555"><div style="text-align:center"><div style="font-size:48px;margin-bottom:12px">&#x25A3;</div><div>No '+(canvasMode==='browser'?'pages visited':'canvas content')+'</div><div style="font-size:11px;margin-top:8px;color:#333">in this conversation</div></div></body></html>');doc.close();
612
- } else if(canvasMode==='browser'){
613
- doc.open();doc.write('<html><body style="margin:0;background:#1a1a1a;display:flex;align-items:center;justify-content:center;height:100vh"><img src="data:image/jpeg;base64,'+item.base64+'" style="max-width:100%;max-height:100%"/></body></html>');doc.close();
617
+ if(canvasMode==='browser'){
618
+ // Browser tab: gallery of visited page thumbnails
619
+ var d=getConvCanvasData();
620
+ if(d.browsers.length===0){
621
+ doc.open();doc.write('<html><body style="margin:0;background:#111;display:flex;align-items:center;justify-content:center;height:100vh;font-family:monospace;color:#555"><div style="text-align:center"><div style="font-size:48px;margin-bottom:12px">&#x1F310;</div><div>No pages visited</div><div style="font-size:11px;margin-top:8px;color:#333">in this conversation</div></div></body></html>');doc.close();
622
+ } else {
623
+ var gallery='<html><head><style>*{margin:0;padding:0;box-sizing:border-box}body{background:#111;padding:12px;font-family:monospace}h3{color:#00ff41;font-size:12px;margin-bottom:12px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px}.card{background:#1a1a1a;border:1px solid #333;border-radius:8px;overflow:hidden;cursor:pointer;transition:border-color .2s}.card:hover{border-color:#00ff41}.card img{width:100%;height:120px;object-fit:cover;display:block}.card .info{padding:6px 8px}.card .url{color:#8ab4f8;font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card .time{color:#555;font-size:9px;margin-top:2px}.selected{border-color:#00ff41;box-shadow:0 0 10px rgba(0,255,65,0.2)}</style></head><body><h3>Pages visited ('+d.browsers.length+')</h3><div class="grid">';
624
+ for(var bi=0;bi<d.browsers.length;bi++){
625
+ var b=d.browsers[bi];
626
+ var sel=bi===browserIdx?' selected':'';
627
+ gallery+='<div class="card'+sel+'" onclick="parent.selectBrowserPage('+bi+')"><img src="data:image/jpeg;base64,'+b.base64+'" alt="'+b.url+'"/><div class="info"><div class="url">'+b.url+'</div><div class="time">'+b.ts+'</div></div></div>';
628
+ }
629
+ gallery+='</div></body></html>';
630
+ doc.open();doc.write(gallery);doc.close();
631
+ }
632
+ } else if(!item){
633
+ doc.open();doc.write('<html><body style="margin:0;background:#111;display:flex;align-items:center;justify-content:center;height:100vh;font-family:monospace;color:#555"><div style="text-align:center"><div style="font-size:48px;margin-bottom:12px">&#x25A3;</div><div>No canvas content</div><div style="font-size:11px;margin-top:8px;color:#333">in this conversation</div></div></body></html>');doc.close();
614
634
  } else {
615
635
  doc.open();doc.write(item.html);doc.close();
616
636
  }
@@ -626,6 +646,7 @@ function canvasNext(){
626
646
  if(canvasMode==='browser'){if(browserIdx<d.browsers.length-1){browserIdx++;renderCanvasPanel();}}
627
647
  else{if(canvasIdx<d.canvases.length-1){canvasIdx++;renderCanvasPanel();}}
628
648
  }
649
+ function selectBrowserPage(i){browserIdx=i;canvasMode='browser';renderCanvasPanel();}
629
650
  function canvasShowBrowser(){var d=getConvCanvasData();browserIdx=d.browsers.length-1;canvasMode='browser';renderCanvasPanel();}
630
651
  function canvasShowCanvas(){var d=getConvCanvasData();canvasIdx=d.canvases.length-1;canvasMode='canvas';renderCanvasPanel();}
631
652
 
@@ -640,15 +661,6 @@ function onConversationSwitch(){
640
661
  }
641
662
  }
642
663
 
643
- function reopenCanvas(){
644
- if(canvasHistory.length===0){
645
- // Try restore from localStorage
646
- try{var saved=localStorage.getItem('nha_canvas_history');if(saved){canvasHistory=JSON.parse(saved);canvasIdx=canvasHistory.length-1;}}catch(e){}
647
- }
648
- if(canvasHistory.length>0){canvasIdx=canvasHistory.length-1;canvasMode='canvas';renderCanvasPanel();}
649
- else if(d.browsers.length>0){canvasMode='browser';renderCanvasPanel();}
650
- }
651
-
652
664
  function reopenCanvas(){
653
665
  var d=getConvCanvasData();
654
666
  canvasIdx=d.canvases.length-1;