nothumanallowed 13.2.99 → 13.3.0

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.2.99",
3
+ "version": "13.3.0",
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": {
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.2.99';
8
+ export const VERSION = '13.3.0';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -342,8 +342,12 @@ export async function webSearch(query, maxResults = MAX_RESULTS) {
342
342
  function parseDuckDuckGoResults(html, maxResults) {
343
343
  const results = [];
344
344
 
345
- // Split on individual result divs. Each web result starts with this class sequence.
346
- const resultBlocks = html.split('class="result results_links');
345
+ // Split on result__body stable across DDG HTML layout changes.
346
+ // Fallback to legacy class="result results_links" if result__body not present.
347
+ const primarySplit = 'result__body">';
348
+ const fallbackSplit = 'class="result results_links';
349
+ const splitOn = html.includes(primarySplit) ? primarySplit : fallbackSplit;
350
+ const resultBlocks = html.split(splitOn);
347
351
 
348
352
  for (let i = 1; i < resultBlocks.length && results.length < maxResults; i++) {
349
353
  const block = resultBlocks[i];
@@ -192,9 +192,13 @@ function updateBrowserFrame(data){
192
192
  var f=document.getElementById('bvFrame');if(f)f.innerHTML='<img src="'+imgSrc+'" alt="Browser view">';
193
193
  // Save to per-conversation browser history for canvas Browser tab
194
194
  addBrowserPage(data.file||null,data.base64||null,data.url);
195
- // Update canvas browser tab live if open
195
+ // Update canvas browser tab live if open — show detail view of new page
196
196
  var p=document.getElementById('canvasPanel');
197
- if(p&&p.classList.contains('open')&&canvasMode==='browser'){renderCanvasPanel();}
197
+ if(p&&p.classList.contains('open')&&canvasMode==='browser'){
198
+ var dBr=getConvCanvasData();
199
+ browserViewIdx=dBr.browsers.length-1;
200
+ renderCanvasPanel();
201
+ }
198
202
  }
199
203
  function updateBrowserStatus(status){
200
204
  var s=document.getElementById('bvStatus');if(s)s.textContent=status;
@@ -524,6 +528,7 @@ var allCanvasData={}; // {convId: {canvases:[{html,title,ts}], browsers:[{base
524
528
  var canvasIdx=-1;
525
529
  var browserIdx=-1;
526
530
  var canvasMode='canvas';
531
+ var browserViewIdx=-1; // -1=gallery, >=0=detail page view
527
532
 
528
533
  function getConvCanvasData(){
529
534
  var id=activeConvId||'_default';
@@ -599,7 +604,11 @@ function renderCanvasPanel(){
599
604
  // Header title
600
605
  var t=document.getElementById('canvasTitle');
601
606
  if(t){
602
- if(canvasMode==='browser'){t.textContent=d.browsers.length>0?d.browsers.length+' pages visited':'No pages visited';}
607
+ if(canvasMode==='browser'&&browserViewIdx>=0&&d.browsers[browserViewIdx]){
608
+ var bvTitle=d.browsers[browserViewIdx].url||'Page';
609
+ try{var u=new URL(bvTitle);bvTitle=u.hostname+(u.pathname!=='/'?u.pathname:'');}catch(e){}
610
+ t.textContent=bvTitle;
611
+ } else if(canvasMode==='browser'){t.textContent=d.browsers.length>0?d.browsers.length+' pages visited':'No pages visited';}
603
612
  else if(!item){t.textContent='Empty canvas';}
604
613
  else{t.textContent=(item.title||'Canvas')+(d.canvases.length>1?' ('+(canvasIdx+1)+'/'+d.canvases.length+')':'');}
605
614
  }
@@ -617,7 +626,25 @@ function renderCanvasPanel(){
617
626
  var d=getConvCanvasData();
618
627
  if(d.browsers.length===0){
619
628
  f.srcdoc='<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 yet</div><div style="font-size:11px;margin-top:8px;color:#333">in this conversation</div><div style="margin-top:16px;font-size:11px;color:#888">Ask me to search or open a page</div></div></body></html>';
629
+ } else if(browserViewIdx>=0&&d.browsers[browserViewIdx]){
630
+ // Detail view: URL bar + screenshot + prev/next + back button
631
+ var bv=d.browsers[browserViewIdx];
632
+ var apiBase=window.API||'';
633
+ var imgSrc=bv.file?apiBase+'/api/screenshots/'+bv.file:(bv.base64?'data:image/jpeg;base64,'+bv.base64:'');
634
+ var total=d.browsers.length;
635
+ var prevBtn=browserViewIdx>0?'<button onclick="window.parent.postMessage({type:\\x27browserNav\\x27,dir:-1},\\x27*\\x27)" style="background:none;border:1px solid #444;color:#aaa;padding:4px 10px;border-radius:4px;cursor:pointer;font-size:12px">&larr;</button>':'<button disabled style="background:none;border:1px solid #222;color:#333;padding:4px 10px;border-radius:4px;font-size:12px">&larr;</button>';
636
+ var nextBtn=browserViewIdx<total-1?'<button onclick="window.parent.postMessage({type:\\x27browserNav\\x27,dir:1},\\x27*\\x27)" style="background:none;border:1px solid #444;color:#aaa;padding:4px 10px;border-radius:4px;cursor:pointer;font-size:12px">&rarr;</button>':'<button disabled style="background:none;border:1px solid #222;color:#333;padding:4px 10px;border-radius:4px;font-size:12px">&rarr;</button>';
637
+ var detail='<html><head><style>*{margin:0;padding:0;box-sizing:border-box}body{background:#111;display:flex;flex-direction:column;height:100vh;font-family:monospace}.toolbar{display:flex;align-items:center;gap:8px;padding:8px 10px;background:#1a1a1a;border-bottom:1px solid #2a2a2a;flex-shrink:0}.back-btn{background:none;border:1px solid #444;color:#00ff41;padding:4px 10px;border-radius:4px;cursor:pointer;font-size:12px;white-space:nowrap}.url-bar{flex:1;background:#0d0d0d;border:1px solid #333;color:#8ab4f8;padding:4px 8px;border-radius:4px;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.counter{color:#555;font-size:11px;white-space:nowrap}.content{flex:1;overflow-y:auto;display:flex;align-items:flex-start;justify-content:center;padding:8px}.content img{max-width:100%;height:auto;display:block;border:1px solid #222;border-radius:4px}.no-img{color:#555;font-size:12px;margin:auto}</style></head><body>';
638
+ detail+='<div class="toolbar"><button class="back-btn" onclick="window.parent.postMessage({type:\\x27browserBack\\x27},\\x27*\\x27)">&#x25C4; All</button>';
639
+ detail+=prevBtn+nextBtn;
640
+ detail+='<div class="url-bar" title="'+bv.url+'">'+bv.url+'</div>';
641
+ detail+='<span class="counter">'+(browserViewIdx+1)+'/'+total+'</span>';
642
+ detail+='</div>';
643
+ detail+='<div class="content">'+(imgSrc?'<img src="'+imgSrc+'" alt="screenshot"/>':'<div class="no-img">No screenshot available</div>')+'</div>';
644
+ detail+='</body></html>';
645
+ f.srcdoc=detail;
620
646
  } else {
647
+ // Gallery view
621
648
  var apiBase=window.API||'';
622
649
  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;background:#222}.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}</style></head><body><h3>Pages visited ('+d.browsers.length+')</h3><div class="grid">';
623
650
  for(var bi=0;bi<d.browsers.length;bi++){
@@ -647,19 +674,19 @@ function canvasNext(){
647
674
  }
648
675
  // Listen for messages from sandboxed canvas iframe
649
676
  window.addEventListener('message',function(e){
650
- if(e.data&&e.data.type==='selectBrowser'&&typeof e.data.index==='number'){selectBrowserPage(e.data.index);}
677
+ if(!e.data)return;
678
+ if(e.data.type==='selectBrowser'&&typeof e.data.index==='number'){selectBrowserPage(e.data.index);}
679
+ else if(e.data.type==='browserBack'){browserViewIdx=-1;renderCanvasPanel();}
680
+ else if(e.data.type==='browserNav'){
681
+ var d=getConvCanvasData();
682
+ var next=browserViewIdx+e.data.dir;
683
+ if(next>=0&&next<d.browsers.length){browserViewIdx=next;renderCanvasPanel();}
684
+ }
651
685
  });
652
686
  function selectBrowserPage(i){
653
- browserIdx=i;canvasMode='browser';renderCanvasPanel();
654
- // Also show in monitor viewer
655
- var d=getConvCanvasData();var b=d.browsers[i];
656
- if(b){
657
- showBrowserViewer(b.url,'Viewing saved page');
658
- var f=document.getElementById('bvFrame');
659
- if(f){var src=b.file?API+'/api/screenshots/'+b.file:(b.base64?'data:image/jpeg;base64,'+b.base64:'');if(src)f.innerHTML='<img src="'+src+'" alt="'+b.url+'">';}
660
- }
687
+ browserIdx=i;browserViewIdx=i;canvasMode='browser';renderCanvasPanel();
661
688
  }
662
- function canvasShowBrowser(){var d=getConvCanvasData();browserIdx=d.browsers.length-1;canvasMode='browser';renderCanvasPanel();}
689
+ function canvasShowBrowser(){var d=getConvCanvasData();browserIdx=d.browsers.length-1;browserViewIdx=-1;canvasMode='browser';renderCanvasPanel();}
663
690
  function canvasShowCanvas(){var d=getConvCanvasData();canvasIdx=d.canvases.length-1;canvasMode='canvas';renderCanvasPanel();}
664
691
 
665
692
  function onConversationSwitch(){
@@ -669,6 +696,7 @@ function onConversationSwitch(){
669
696
  var d=getConvCanvasData();
670
697
  canvasIdx=d.canvases.length-1;
671
698
  browserIdx=d.browsers.length-1;
699
+ browserViewIdx=-1;
672
700
  renderCanvasPanel();
673
701
  }
674
702
  }