nothumanallowed 9.8.4 → 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 +1 -1
- package/src/constants.mjs +1 -1
- package/src/services/web-ui.mjs +137 -14
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "9.8.
|
|
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.
|
|
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
|
|
package/src/services/web-ui.mjs
CHANGED
|
@@ -257,9 +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
|
+
// Save to per-conversation browser history for canvas Browser tab
|
|
264
|
+
addBrowserPage(base64,url);
|
|
263
265
|
}
|
|
264
266
|
function updateBrowserStatus(status){
|
|
265
267
|
var s=document.getElementById('bvStatus');if(s)s.textContent=status;
|
|
@@ -269,7 +271,7 @@ function closeBrowserViewer(){
|
|
|
269
271
|
}
|
|
270
272
|
|
|
271
273
|
function loadConvList(){return apiGet('/api/conversations').then(function(r){convList=(r&&r.conversations)||[];renderConvSidebar();})}
|
|
272
|
-
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();}})}
|
|
273
275
|
function createNewConv(){return apiPost('/api/conversations',{}).then(function(r){if(r&&r.conversation){activeConvId=r.conversation.id;chatHistory=[];renderMessages();loadConvList();}})}
|
|
274
276
|
function deleteConv(id){return fetch(API+'/api/conversations/'+id,{method:'DELETE'}).then(function(){loadConvList();if(id===activeConvId)createNewConv();})}
|
|
275
277
|
function clearChatHistory(){createNewConv()}
|
|
@@ -407,7 +409,7 @@ function renderChat(el){
|
|
|
407
409
|
'</div>'+
|
|
408
410
|
'<div class="chat"><div class="chat__messages" id="chatMessages"></div>'+
|
|
409
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">×</button></div>'+
|
|
410
|
-
'<div class="chat__bar"><button class="chat__mic" id="chatMic" onclick="toggleVoiceInput()" title="Voice input">🎤</button><button onclick="document.getElementById(\\x27chatFileInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach file">📎</button><button onclick="document.getElementById(\\x27chatImageInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach image">📷</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></div>'+
|
|
412
|
+
'<div class="chat__bar"><button class="chat__mic" id="chatMic" onclick="toggleVoiceInput()" title="Voice input">🎤</button><button onclick="document.getElementById(\\x27chatFileInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach file">📎</button><button onclick="document.getElementById(\\x27chatImageInput\\x27).click()" style="background:none;border:none;cursor:pointer;font-size:16px;padding:4px" title="Attach image">📷</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">▣</button></div>'+
|
|
411
413
|
'</div>'+
|
|
412
414
|
'</div>'+
|
|
413
415
|
'</div>';
|
|
@@ -522,16 +524,139 @@ function clearChatAttach(){
|
|
|
522
524
|
document.getElementById('chatImageInput').value='';
|
|
523
525
|
}
|
|
524
526
|
|
|
525
|
-
// ---- CANVAS ----
|
|
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
|
+
}
|
|
538
|
+
|
|
526
539
|
function showCanvas(html,title){
|
|
540
|
+
var d=getConvCanvasData();
|
|
541
|
+
d.canvases.push({html:html,title:title||'Canvas',ts:new Date().toLocaleTimeString()});
|
|
542
|
+
canvasIdx=d.canvases.length-1;
|
|
543
|
+
canvasMode='canvas';
|
|
544
|
+
renderCanvasPanel();
|
|
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){}
|
|
581
|
+
}
|
|
582
|
+
loadCanvasData();
|
|
583
|
+
|
|
584
|
+
function renderCanvasPanel(){
|
|
527
585
|
var p=document.getElementById('canvasPanel');
|
|
528
|
-
|
|
529
|
-
var f=document.getElementById('canvasFrame');
|
|
530
|
-
if(!p||!f)return;
|
|
531
|
-
if(t)t.textContent=title||'Canvas';
|
|
586
|
+
if(!p)return;
|
|
532
587
|
p.classList.add('open');
|
|
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
|
|
593
|
+
var t=document.getElementById('canvasTitle');
|
|
594
|
+
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+')':'');}
|
|
598
|
+
}
|
|
599
|
+
// Nav arrows
|
|
600
|
+
var navEl=document.getElementById('canvasNav');
|
|
601
|
+
if(navEl){navEl.style.display=list.length>1?'flex':'none';}
|
|
602
|
+
// Tab highlight
|
|
603
|
+
var tabC=document.getElementById('canvasTabC');
|
|
604
|
+
var tabB=document.getElementById('canvasTabB');
|
|
605
|
+
if(tabC)tabC.style.borderBottom=canvasMode==='canvas'?'2px solid var(--green)':'none';
|
|
606
|
+
if(tabB)tabB.style.borderBottom=canvasMode==='browser'?'2px solid var(--green)':'none';
|
|
607
|
+
// Render iframe
|
|
608
|
+
var f=document.getElementById('canvasFrame');if(!f)return;
|
|
533
609
|
var doc=f.contentDocument||f.contentWindow.document;
|
|
534
|
-
|
|
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">▣</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 {
|
|
615
|
+
doc.open();doc.write(item.html);doc.close();
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
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
|
+
}
|
|
642
|
+
|
|
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
|
+
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();
|
|
535
660
|
}
|
|
536
661
|
function closeCanvas(){var p=document.getElementById('canvasPanel');if(p)p.classList.remove('open');}
|
|
537
662
|
function toggleCanvasSize(){
|
|
@@ -641,15 +766,13 @@ function sendChat(){
|
|
|
641
766
|
renderMessages();
|
|
642
767
|
}
|
|
643
768
|
if(currentEvent==='screenshot'&&data.base64){
|
|
644
|
-
// Only update the browser viewer — the actual image in chat is handled by the 'done' event via screenshotFiles
|
|
645
769
|
showBrowserViewer('Screenshot','Captured');
|
|
646
|
-
updateBrowserFrame(data.base64,data.format||'jpeg');
|
|
770
|
+
updateBrowserFrame(data.base64,data.format||'jpeg','Screenshot');
|
|
647
771
|
updateBrowserStatus('Screenshot captured');
|
|
648
772
|
}
|
|
649
773
|
if(currentEvent==='browser_frame'&&data.base64){
|
|
650
|
-
// Live frame update — also ensure viewer is open
|
|
651
774
|
showBrowserViewer(data.url||'Browser','Live');
|
|
652
|
-
updateBrowserFrame(data.base64,data.format||'jpeg');
|
|
775
|
+
updateBrowserFrame(data.base64,data.format||'jpeg',data.url||'Browser');
|
|
653
776
|
if(data.url)updateBrowserStatus(data.url);
|
|
654
777
|
}
|
|
655
778
|
if(currentEvent==='canvas'&&data.markers){
|
|
@@ -2024,7 +2147,7 @@ init();
|
|
|
2024
2147
|
</div>
|
|
2025
2148
|
</div>
|
|
2026
2149
|
|
|
2027
|
-
<div id="canvasPanel"><div class="cvs-header"><span id="canvasTitle">Canvas</span><div><button onclick="toggleCanvasSize()" title="Resize">⤢</button><button onclick="closeCanvas()" title="Close">×</button></div></div><iframe id="canvasFrame" sandbox="allow-scripts allow-same-origin"></iframe></div>
|
|
2150
|
+
<div id="canvasPanel"><div class="cvs-header"><div style="display:flex;align-items:center;gap:8px"><button id="canvasTabC" onclick="canvasShowCanvas()" style="background:none;border:none;border-bottom:2px solid var(--green);color:var(--green);cursor:pointer;font-family:var(--mono);font-size:11px;padding:2px 6px">Canvas</button><button id="canvasTabB" onclick="canvasShowBrowser()" style="background:none;border:none;color:var(--dim);cursor:pointer;font-family:var(--mono);font-size:11px;padding:2px 6px">Browser</button><span id="canvasTitle" style="font-family:var(--mono);color:var(--green);font-size:11px;margin-left:8px">Canvas</span></div><div style="display:flex;align-items:center;gap:4px"><span id="canvasNav" style="display:none;gap:4px"><button onclick="canvasPrev()" style="background:none;border:none;color:var(--dim);cursor:pointer;font-size:14px" title="Previous">◀</button><button onclick="canvasNext()" style="background:none;border:none;color:var(--dim);cursor:pointer;font-size:14px" title="Next">▶</button></span><button onclick="toggleCanvasSize()" style="background:none;border:none;color:var(--dim);cursor:pointer;font-size:14px" title="Resize">⤢</button><button onclick="closeCanvas()" style="background:none;border:none;color:var(--dim);cursor:pointer;font-size:14px" title="Close">×</button></div></div><iframe id="canvasFrame" sandbox="allow-scripts allow-same-origin"></iframe></div>
|
|
2028
2151
|
<script>${JS}</script>
|
|
2029
2152
|
</body>
|
|
2030
2153
|
</html>`;
|