nothumanallowed 13.2.98 → 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 +1 -1
- package/src/constants.mjs +1 -1
- package/src/services/web-tools.mjs +6 -2
- package/src/services/web-ui.mjs +51 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "13.
|
|
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.
|
|
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
|
|
346
|
-
|
|
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];
|
package/src/services/web-ui.mjs
CHANGED
|
@@ -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'){
|
|
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'
|
|
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">🌐</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">←</button>':'<button disabled style="background:none;border:1px solid #222;color:#333;padding:4px 10px;border-radius:4px;font-size:12px">←</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">→</button>':'<button disabled style="background:none;border:1px solid #222;color:#333;padding:4px 10px;border-radius:4px;font-size:12px">→</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)">◄ 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
|
|
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
|
}
|
|
@@ -3949,10 +3977,19 @@ async function runStudio() {
|
|
|
3949
3977
|
studioSetNodeStatus(i, 'error');
|
|
3950
3978
|
break;
|
|
3951
3979
|
}
|
|
3980
|
+
var NL = String.fromCharCode(10);
|
|
3952
3981
|
if (stepResult.error) {
|
|
3953
3982
|
studioSetNodeStatus(i, 'error');
|
|
3954
3983
|
studioLog(node.label, node.icon, 'Error: ' + stepResult.error, 'error');
|
|
3955
|
-
|
|
3984
|
+
// For live-data/tool agents (first steps), a failure is critical — stop
|
|
3985
|
+
// For specialist/synthesis agents, log the error in context and continue
|
|
3986
|
+
var isEarlyToolStep = (node.agent === 'EmailAgent' || node.agent === 'CalendarAgent' || node.agent === 'GitHubAgent' || node.agent === 'WebSearchAgent' || node.agent === 'BrowserAgent');
|
|
3987
|
+
if (isEarlyToolStep && i === 0) { break; }
|
|
3988
|
+
// Non-critical: inject error note into context so CanvasAgent can note the gap
|
|
3989
|
+
var errNote = '## ' + node.label + ':' + NL + '[Agent unavailable: ' + stepResult.error.slice(0, 120) + ']';
|
|
3990
|
+
context = context ? context + NL + NL + '---' + NL + errNote : errNote;
|
|
3991
|
+
studioState.nodes[i].output = errNote;
|
|
3992
|
+
continue; // proceed to next agent
|
|
3956
3993
|
}
|
|
3957
3994
|
studioSetNodeStatus(i, 'done');
|
|
3958
3995
|
var realOutput = (stepResult.output && stepResult.output !== '(no output)') ? stepResult.output : null;
|
|
@@ -3970,7 +4007,6 @@ async function runStudio() {
|
|
|
3970
4007
|
}
|
|
3971
4008
|
}
|
|
3972
4009
|
// Accumulate context: append each step's output so specialist agents see ALL previous data
|
|
3973
|
-
var NL = String.fromCharCode(10);
|
|
3974
4010
|
if (realOutput) {
|
|
3975
4011
|
context = context
|
|
3976
4012
|
? context + NL + NL + '---' + NL + '## ' + node.label + ':' + NL + realOutput
|