nothumanallowed 9.8.5 → 9.8.6

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.5",
3
+ "version": "9.8.6",
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.5';
8
+ export const VERSION = '9.8.6';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -257,11 +257,11 @@ function showBrowserViewer(title,status){
257
257
  var t=document.getElementById('bvTitle');if(t)t.textContent=title||'Browser';
258
258
  var s=document.getElementById('bvStatus');if(s)s.textContent=status||'Loading...';
259
259
  }
260
- function updateBrowserFrame(base64,format){
260
+ function updateBrowserFrame(base64,format,url){
261
261
  var f=document.getElementById('bvFrame');if(!f)return;
262
262
  f.innerHTML='<img src="data:image/'+(format||'jpeg')+';base64,'+base64+'" alt="Browser view">';
263
- // Also save to canvas browser tab
264
- lastBrowserFrame=base64;
263
+ // Save to per-conversation browser history for canvas Browser tab
264
+ addBrowserPage(base64,url);
265
265
  }
266
266
  function updateBrowserStatus(status){
267
267
  var s=document.getElementById('bvStatus');if(s)s.textContent=status;
@@ -271,7 +271,7 @@ function closeBrowserViewer(){
271
271
  }
272
272
 
273
273
  function loadConvList(){return apiGet('/api/conversations').then(function(r){convList=(r&&r.conversations)||[];renderConvSidebar();})}
274
- function loadConv(id){return apiGet('/api/conversations/'+id).then(function(r){if(r&&r.conversation){activeConvId=r.conversation.id;chatHistory=r.conversation.messages||[];renderMessages();renderConvSidebar();}})}
274
+ function loadConv(id){return apiGet('/api/conversations/'+id).then(function(r){if(r&&r.conversation){activeConvId=r.conversation.id;chatHistory=r.conversation.messages||[];renderMessages();renderConvSidebar();onConversationSwitch();}})}
275
275
  function createNewConv(){return apiPost('/api/conversations',{}).then(function(r){if(r&&r.conversation){activeConvId=r.conversation.id;chatHistory=[];renderMessages();loadConvList();}})}
276
276
  function deleteConv(id){return fetch(API+'/api/conversations/'+id,{method:'DELETE'}).then(function(){loadConvList();if(id===activeConvId)createNewConv();})}
277
277
  function clearChatHistory(){createNewConv()}
@@ -524,58 +524,121 @@ function clearChatAttach(){
524
524
  document.getElementById('chatImageInput').value='';
525
525
  }
526
526
 
527
- // ---- CANVAS (with history + browser viewer) ----
528
- var canvasHistory=[]; // [{html,title,timestamp}]
529
- var canvasIdx=-1; // current index in history
530
- var canvasMode='canvas'; // 'canvas' or 'browser'
531
- var lastBrowserFrame=null;
527
+ // ---- CANVAS + BROWSER (per-conversation history) ----
528
+ var allCanvasData={}; // {convId: {canvases:[{html,title,ts}], browsers:[{base64,url,ts}]}}
529
+ var canvasIdx=-1;
530
+ var browserIdx=-1;
531
+ var canvasMode='canvas';
532
+
533
+ function getConvCanvasData(){
534
+ var id=activeConvId||'_default';
535
+ if(!allCanvasData[id])allCanvasData[id]={canvases:[],browsers:[]};
536
+ return allCanvasData[id];
537
+ }
532
538
 
533
539
  function showCanvas(html,title){
534
- // Save to history
535
- canvasHistory.push({html:html,title:title||'Canvas',timestamp:new Date().toLocaleTimeString()});
536
- canvasIdx=canvasHistory.length-1;
540
+ var d=getConvCanvasData();
541
+ d.canvases.push({html:html,title:title||'Canvas',ts:new Date().toLocaleTimeString()});
542
+ canvasIdx=d.canvases.length-1;
537
543
  canvasMode='canvas';
538
544
  renderCanvasPanel();
539
- // Persist canvas history to localStorage
540
- try{localStorage.setItem('nha_canvas_history',JSON.stringify(canvasHistory.slice(-20)));}catch(e){}
545
+ saveCanvasData();
546
+ }
547
+
548
+ function addBrowserPage(base64,url){
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()});
553
+ browserIdx=d.browsers.length-1;
554
+ saveCanvasData();
555
+ }
556
+
557
+ function saveCanvasData(){
558
+ // Save only canvas HTML (not browser base64 — too large) per conversation
559
+ try{
560
+ var save={};
561
+ for(var id in allCanvasData){
562
+ if(allCanvasData[id].canvases.length>0){
563
+ save[id]={canvases:allCanvasData[id].canvases.slice(-20)};
564
+ }
565
+ }
566
+ localStorage.setItem('nha_canvas_data',JSON.stringify(save));
567
+ }catch(e){}
568
+ }
569
+
570
+ function loadCanvasData(){
571
+ try{
572
+ var saved=localStorage.getItem('nha_canvas_data');
573
+ if(saved){
574
+ var parsed=JSON.parse(saved);
575
+ for(var id in parsed){
576
+ if(!allCanvasData[id])allCanvasData[id]={canvases:[],browsers:[]};
577
+ allCanvasData[id].canvases=parsed[id].canvases||[];
578
+ }
579
+ }
580
+ }catch(e){}
541
581
  }
582
+ loadCanvasData();
542
583
 
543
584
  function renderCanvasPanel(){
544
585
  var p=document.getElementById('canvasPanel');
545
586
  if(!p)return;
546
587
  p.classList.add('open');
547
- var item=canvasMode==='browser'?null:canvasHistory[canvasIdx];
548
- // Update header
588
+ var d=getConvCanvasData();
589
+ var list=canvasMode==='browser'?d.browsers:d.canvases;
590
+ var idx=canvasMode==='browser'?browserIdx:canvasIdx;
591
+ var item=list[idx];
592
+ // Header title
549
593
  var t=document.getElementById('canvasTitle');
550
594
  if(t){
551
- if(canvasMode==='browser'){t.textContent='Browser';}
552
- else if(item){t.textContent=item.title+(canvasHistory.length>1?' ('+(canvasIdx+1)+'/'+canvasHistory.length+')':'');}
553
- else{t.textContent='Canvas';}
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+')':'');}
554
598
  }
555
- // Update nav buttons visibility
599
+ // Nav arrows
556
600
  var navEl=document.getElementById('canvasNav');
557
- if(navEl){navEl.style.display=canvasHistory.length>1&&canvasMode==='canvas'?'flex':'none';}
558
- // Update tab buttons
601
+ if(navEl){navEl.style.display=list.length>1?'flex':'none';}
602
+ // Tab highlight
559
603
  var tabC=document.getElementById('canvasTabC');
560
604
  var tabB=document.getElementById('canvasTabB');
561
605
  if(tabC)tabC.style.borderBottom=canvasMode==='canvas'?'2px solid var(--green)':'none';
562
606
  if(tabB)tabB.style.borderBottom=canvasMode==='browser'?'2px solid var(--green)':'none';
563
- // Render content
564
- var f=document.getElementById('canvasFrame');
565
- if(!f)return;
566
- if(canvasMode==='browser'&&lastBrowserFrame){
567
- var doc=f.contentDocument||f.contentWindow.document;
568
- 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,'+lastBrowserFrame+'" style="max-width:100%;max-height:100%"/></body></html>');doc.close();
569
- } else if(item){
570
- var doc=f.contentDocument||f.contentWindow.document;
607
+ // Render iframe
608
+ var f=document.getElementById('canvasFrame');if(!f)return;
609
+ 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();
614
+ } else {
571
615
  doc.open();doc.write(item.html);doc.close();
572
616
  }
573
617
  }
574
618
 
575
- function canvasPrev(){if(canvasIdx>0){canvasIdx--;canvasMode='canvas';renderCanvasPanel();}}
576
- function canvasNext(){if(canvasIdx<canvasHistory.length-1){canvasIdx++;canvasMode='canvas';renderCanvasPanel();}}
577
- function canvasShowBrowser(){canvasMode='browser';renderCanvasPanel();}
578
- function canvasShowCanvas(){canvasMode='canvas';renderCanvasPanel();}
619
+ function canvasPrev(){
620
+ var d=getConvCanvasData();
621
+ if(canvasMode==='browser'){if(browserIdx>0){browserIdx--;renderCanvasPanel();}}
622
+ else{if(canvasIdx>0){canvasIdx--;renderCanvasPanel();}}
623
+ }
624
+ function canvasNext(){
625
+ var d=getConvCanvasData();
626
+ if(canvasMode==='browser'){if(browserIdx<d.browsers.length-1){browserIdx++;renderCanvasPanel();}}
627
+ else{if(canvasIdx<d.canvases.length-1){canvasIdx++;renderCanvasPanel();}}
628
+ }
629
+ function canvasShowBrowser(){var d=getConvCanvasData();browserIdx=d.browsers.length-1;canvasMode='browser';renderCanvasPanel();}
630
+ function canvasShowCanvas(){var d=getConvCanvasData();canvasIdx=d.canvases.length-1;canvasMode='canvas';renderCanvasPanel();}
631
+
632
+ function onConversationSwitch(){
633
+ // Called when user switches conversation — update canvas panel
634
+ var p=document.getElementById('canvasPanel');
635
+ if(p&&p.classList.contains('open')){
636
+ var d=getConvCanvasData();
637
+ canvasIdx=d.canvases.length-1;
638
+ browserIdx=d.browsers.length-1;
639
+ renderCanvasPanel();
640
+ }
641
+ }
579
642
 
580
643
  function reopenCanvas(){
581
644
  if(canvasHistory.length===0){
@@ -583,9 +646,18 @@ function reopenCanvas(){
583
646
  try{var saved=localStorage.getItem('nha_canvas_history');if(saved){canvasHistory=JSON.parse(saved);canvasIdx=canvasHistory.length-1;}}catch(e){}
584
647
  }
585
648
  if(canvasHistory.length>0){canvasIdx=canvasHistory.length-1;canvasMode='canvas';renderCanvasPanel();}
586
- else if(lastBrowserFrame){canvasMode='browser';renderCanvasPanel();}
649
+ else if(d.browsers.length>0){canvasMode='browser';renderCanvasPanel();}
587
650
  }
588
651
 
652
+ function reopenCanvas(){
653
+ var d=getConvCanvasData();
654
+ canvasIdx=d.canvases.length-1;
655
+ browserIdx=d.browsers.length-1;
656
+ if(d.canvases.length>0){canvasMode='canvas';}
657
+ else if(d.browsers.length>0){canvasMode='browser';}
658
+ else{canvasMode='canvas';} // show empty state
659
+ renderCanvasPanel();
660
+ }
589
661
  function closeCanvas(){var p=document.getElementById('canvasPanel');if(p)p.classList.remove('open');}
590
662
  function toggleCanvasSize(){
591
663
  var p=document.getElementById('canvasPanel');if(!p)return;
@@ -694,15 +766,13 @@ function sendChat(){
694
766
  renderMessages();
695
767
  }
696
768
  if(currentEvent==='screenshot'&&data.base64){
697
- // Only update the browser viewer — the actual image in chat is handled by the 'done' event via screenshotFiles
698
769
  showBrowserViewer('Screenshot','Captured');
699
- updateBrowserFrame(data.base64,data.format||'jpeg');
770
+ updateBrowserFrame(data.base64,data.format||'jpeg','Screenshot');
700
771
  updateBrowserStatus('Screenshot captured');
701
772
  }
702
773
  if(currentEvent==='browser_frame'&&data.base64){
703
- // Live frame update — also ensure viewer is open
704
774
  showBrowserViewer(data.url||'Browser','Live');
705
- updateBrowserFrame(data.base64,data.format||'jpeg');
775
+ updateBrowserFrame(data.base64,data.format||'jpeg',data.url||'Browser');
706
776
  if(data.url)updateBrowserStatus(data.url);
707
777
  }
708
778
  if(currentEvent==='canvas'&&data.markers){