nothumanallowed 13.5.24 → 13.5.25
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 +87 -23
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "13.5.
|
|
3
|
+
"version": "13.5.25",
|
|
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.5.
|
|
8
|
+
export const VERSION = '13.5.25';
|
|
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
|
@@ -3325,7 +3325,7 @@ var studioAbortController = null;
|
|
|
3325
3325
|
var parlActiveAgent = null; // active agent label during parliament streaming
|
|
3326
3326
|
var parlDoneAgents = {}; // set of completed agent labels during parliament
|
|
3327
3327
|
var _parlPersistHtml = null; // persists parliament block HTML across tab navigations
|
|
3328
|
-
var _PARL_STAMP = '<!--nha-parl-v13.5.
|
|
3328
|
+
var _PARL_STAMP = '<!--nha-parl-v13.5.25-->';
|
|
3329
3329
|
|
|
3330
3330
|
function stopStudio() {
|
|
3331
3331
|
if (!studioState.running) return;
|
|
@@ -3932,7 +3932,11 @@ function renderStudioNodes() {
|
|
|
3932
3932
|
var bigPlant = String.fromCodePoint(0x1FAB4);
|
|
3933
3933
|
var plantEmoji = String.fromCodePoint(0x1F331);
|
|
3934
3934
|
|
|
3935
|
-
|
|
3935
|
+
// Find the index of the currently active node (for orchestrator positioning)
|
|
3936
|
+
var activeNodeIdx = -1;
|
|
3937
|
+
nodes.forEach(function(n, i) { if (n.status === \x27running\x27) activeNodeIdx = i; });
|
|
3938
|
+
|
|
3939
|
+
function buildStation2(label, toolEmoji, isOrch, isActive, isDone, isErr, emojiIdx, nodeIdx) {
|
|
3936
3940
|
var accentColor = isOrch ? \x27#818cf8\x27 : (isActive ? \x27#6366f1\x27 : (isDone ? \x27#374151\x27 : (isErr ? \x27#ef4444\x27 : \x27#9ca3af\x27)));
|
|
3937
3941
|
var nameBg = isDone ? \x27rgba(0,0,0,.1)\x27 : (isActive ? \x27#ede9fe\x27 : (isOrch ? \x27#e0e7ff\x27 : \x27rgba(255,255,255,.85)\x27));
|
|
3938
3942
|
var nameColor = isDone ? \x27#111827\x27 : (isActive ? \x27#4f46e5\x27 : (isOrch ? \x27#4338ca\x27 : (isErr ? \x27#dc2626\x27 : \x27#374151\x27)));
|
|
@@ -3941,20 +3945,24 @@ function renderStudioNodes() {
|
|
|
3941
3945
|
: (isDone ? \x27<span style="color:#111827;font-size:13px">✓</span>\x27
|
|
3942
3946
|
: (isActive ? \x27<span class="iso-monitor-blink"></span>\x27
|
|
3943
3947
|
: \x27<span style="font-size:8px;opacity:.35;color:#818cf8">■</span>\x27));
|
|
3948
|
+
// Bubble: for agents, leave text empty so JS streaming fills it live; show "✓ fatto" when done
|
|
3944
3949
|
var bubbleText = isOrch
|
|
3945
|
-
? (hasActive ? (\
|
|
3946
|
-
: (
|
|
3950
|
+
? (hasActive ? (\x27Assegno step \x27+(doneCount+1)+\x27/\x27+totalCount) : (doneCount===totalCount&&totalCount>0 ? \x27\u2714 Fatto!\x27 : \x27In attesa\x27))
|
|
3951
|
+
: (isDone ? \x27\u2714 fatto\x27 : (isErr ? \x27\u2715 errore\x27 : (isActive ? \x27\x27 : \x27\x27)));
|
|
3947
3952
|
var bubbleBg = isOrch ? \x27rgba(99,102,241,.15)\x27 : (isActive ? \x27rgba(99,102,241,.12)\x27 : (isDone ? \x27rgba(0,0,0,.08)\x27 : \x27rgba(239,68,68,.12)\x27));
|
|
3948
3953
|
var glowBox = isActive ? (\x270 0 0 3px \x27+accentColor+\x2744,0 8px 24px \x27+accentColor+\x2733\x27) : (isDone ? (\x270 0 0 2px rgba(0,0,0,.25)\x27) : \x27none\x27);
|
|
3949
|
-
//
|
|
3950
|
-
var
|
|
3951
|
-
var charHtml = \x27<div class="iso-char-mover\x27+
|
|
3954
|
+
// Orchestrator char: no CSS walk animation — JS moves it via inline transform toward the active agent column
|
|
3955
|
+
var charIdAttr = isOrch ? \x27 id="wfOrchChar"\x27 : \x27\x27;
|
|
3956
|
+
var charHtml = \x27<div class="iso-char-mover"\x27+charIdAttr+\x27>\x27+isoCharSvg({emojiIdx: isOrch ? 99 : emojiIdx, isActive: isActive, isDone: isDone, scale: 1.1, accentColor: accentColor})+\x27</div>\x27;
|
|
3952
3957
|
var clickAttr = isOrch ? \x27\x27 : (\x27data-agent-label="\x27+esc(label)+\x27" onclick="studioScrollToAgent(this.getAttribute(String.fromCharCode(100,97,116,97,45,97,103,101,110,116,45,108,97,98,101,108)))"\x27);
|
|
3953
3958
|
// Flying doc emoji when active
|
|
3954
3959
|
var flyDoc = isActive ? \x27<div class="iso-fly-doc" style="color:\x27+accentColor+\x27">\x27+String.fromCodePoint(0x1F4C4)+\x27</div>\x27 : \x27\x27;
|
|
3955
|
-
|
|
3960
|
+
// Bubble id: orchestrator gets wfOrchBubble, agents get isobubble_IDX
|
|
3961
|
+
var bubbleId = isOrch ? \x27wfOrchBubble\x27 : (\x27isobubble_\x27+nodeIdx);
|
|
3962
|
+
var bubbleVisible = (bubbleText || isOrch || isActive) ? \x27visible\x27 : \x27hidden\x27;
|
|
3963
|
+
return \x27<div class="iso-station" \x27+clickAttr+\x27 data-station-idx="\x27+(isOrch?-1:nodeIdx)+\x27" style="box-shadow:\x27+glowBox+\x27;border-color:\x27+accentColor+\x27;transition:box-shadow .4s">\x27+
|
|
3956
3964
|
flyDoc+
|
|
3957
|
-
\x27<div class="iso-bubble\x27+(isActive?\x27 iso-bubble--active\x27:\x27\x27)+\x27" style="border-color:\x27+accentColor+\x27;color:\x27+accentColor+\x27;background:\x27+bubbleBg+\x27;visibility:\x27+
|
|
3965
|
+
\x27<div class="iso-bubble\x27+(isActive?\x27 iso-bubble--active\x27:\x27\x27)+\x27" id="\x27+bubbleId+\x27" style="border-color:\x27+accentColor+\x27;color:\x27+accentColor+\x27;background:\x27+bubbleBg+\x27;visibility:\x27+bubbleVisible+\x27">\x27+esc(bubbleText)+\x27</div>\x27+
|
|
3958
3966
|
\x27<div class="iso-tool-badge">\x27+toolEmoji+\x27</div>\x27+
|
|
3959
3967
|
charHtml+
|
|
3960
3968
|
\x27<div class="iso-desk" style="width:85%;border-top-color:\x27+accentColor+\x2733"></div>\x27+
|
|
@@ -3965,7 +3973,7 @@ function renderStudioNodes() {
|
|
|
3965
3973
|
|
|
3966
3974
|
var stationsHtml = \x27\x27;
|
|
3967
3975
|
var orchDone2 = !hasActive && doneCount===totalCount && totalCount>0;
|
|
3968
|
-
stationsHtml += buildStation2(\x27Orchestratore\x27, String.fromCodePoint(0x1F4CB), true, hasActive, orchDone2, false, 99);
|
|
3976
|
+
stationsHtml += buildStation2(\x27Orchestratore\x27, String.fromCodePoint(0x1F4CB), true, hasActive, orchDone2, false, 99, -1);
|
|
3969
3977
|
nodes.forEach(function(n, idx) {
|
|
3970
3978
|
stationsHtml += buildStation2(
|
|
3971
3979
|
n.label || n.agent,
|
|
@@ -3974,6 +3982,7 @@ function renderStudioNodes() {
|
|
|
3974
3982
|
n.status===\x27running\x27,
|
|
3975
3983
|
n.status===\x27done\x27,
|
|
3976
3984
|
n.status===\x27error\x27,
|
|
3985
|
+
idx,
|
|
3977
3986
|
idx
|
|
3978
3987
|
);
|
|
3979
3988
|
});
|
|
@@ -4037,6 +4046,42 @@ function renderStudioNodes() {
|
|
|
4037
4046
|
\x27</div>\x27+
|
|
4038
4047
|
\x27</div>\x27+
|
|
4039
4048
|
\x27</div>\x27;
|
|
4049
|
+
|
|
4050
|
+
// Move orchestrator character toward the active agent column.
|
|
4051
|
+
// Grid: col 0 = orchestrator, col 1..N = agents. Each column is 1fr.
|
|
4052
|
+
// We measure the pixel offset between the orchestrator station and the active agent station.
|
|
4053
|
+
if (activeNodeIdx >= 0) {
|
|
4054
|
+
requestAnimationFrame(function() {
|
|
4055
|
+
var orchChar = document.getElementById(\x27wfOrchChar\x27);
|
|
4056
|
+
var orchStation = el.querySelector(\x27[data-station-idx="-1"]\x27);
|
|
4057
|
+
var activeStation = el.querySelector(\x27[data-station-idx="\x27+activeNodeIdx+\x27"]\x27);
|
|
4058
|
+
if (orchChar && orchStation && activeStation) {
|
|
4059
|
+
var orchRect = orchStation.getBoundingClientRect();
|
|
4060
|
+
var activeRect = activeStation.getBoundingClientRect();
|
|
4061
|
+
// Shift the char 60% of the way toward the active column center
|
|
4062
|
+
var delta = (activeRect.left + activeRect.width/2) - (orchRect.left + orchRect.width/2);
|
|
4063
|
+
var shift = Math.round(delta * 0.6);
|
|
4064
|
+
orchChar.style.transition = \x27transform 0.8s cubic-bezier(.4,0,.2,1)\x27;
|
|
4065
|
+
orchChar.style.transform = \x27translateX(\x27+shift+\x27px)\x27;
|
|
4066
|
+
// Also update orch bubble to show what it is assigning
|
|
4067
|
+
var orchBubble = document.getElementById(\x27wfOrchBubble\x27);
|
|
4068
|
+
if (orchBubble) {
|
|
4069
|
+
var activeNode = studioState.nodes[activeNodeIdx];
|
|
4070
|
+
orchBubble.style.visibility = \x27visible\x27;
|
|
4071
|
+
orchBubble.textContent = \x27Assegno a \x27+(activeNode ? (activeNode.label || activeNode.agent) : \x27agente\x27);
|
|
4072
|
+
}
|
|
4073
|
+
}
|
|
4074
|
+
});
|
|
4075
|
+
} else {
|
|
4076
|
+
// No active agent: reset orchestrator to home position
|
|
4077
|
+
requestAnimationFrame(function() {
|
|
4078
|
+
var orchChar = document.getElementById(\x27wfOrchChar\x27);
|
|
4079
|
+
if (orchChar) {
|
|
4080
|
+
orchChar.style.transition = \x27transform 0.8s cubic-bezier(.4,0,.2,1)\x27;
|
|
4081
|
+
orchChar.style.transform = \x27translateX(0)\x27;
|
|
4082
|
+
}
|
|
4083
|
+
});
|
|
4084
|
+
}
|
|
4040
4085
|
}
|
|
4041
4086
|
|
|
4042
4087
|
function studioScrollToAgent(agentLabel) {
|
|
@@ -5026,28 +5071,28 @@ async function runStudio() {
|
|
|
5026
5071
|
|
|
5027
5072
|
var orchEl2 = document.getElementById(\x27brOrch\x27);
|
|
5028
5073
|
if (phase === \x27done\x27) {
|
|
5029
|
-
// All done: show web of connections between all agents
|
|
5074
|
+
// All done: show web of solid connections between all agents
|
|
5030
5075
|
proposals.forEach(function(pa, ia) {
|
|
5031
5076
|
proposals.forEach(function(pb2, ib2) {
|
|
5032
5077
|
if (ib2 <= ia) return;
|
|
5033
5078
|
var ea = document.getElementById(\x27brseat_\x27+pa.label.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27));
|
|
5034
5079
|
var eb = document.getElementById(\x27brseat_\x27+pb2.label.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27));
|
|
5035
|
-
addCommLine(ea, eb, \x27#
|
|
5080
|
+
addCommLine(ea, eb, \x27#16a34a\x27, \x273 3\x27, 2, 0.85, \x27\x27);
|
|
5036
5081
|
});
|
|
5037
5082
|
});
|
|
5038
5083
|
} else if (activeLabel) {
|
|
5039
5084
|
var aLblSafe2 = activeLabel.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27);
|
|
5040
5085
|
var activeSeatEl2 = document.getElementById(\x27brseat_\x27+aLblSafe2);
|
|
5041
|
-
// Orch → active agent (always)
|
|
5042
|
-
addCommLine(orchEl2, activeSeatEl2,
|
|
5043
|
-
// R2/R3:
|
|
5086
|
+
// Orch → active agent (always) — thick, bright, animated
|
|
5087
|
+
addCommLine(orchEl2, activeSeatEl2, \x27#818cf8\x27, \x275 4\x27, 3, 0.95, \x27brDashFlow 1.2s linear infinite\x27);
|
|
5088
|
+
// R2/R3: done agents → active agent (cross-reading) — amber, solid
|
|
5044
5089
|
if (phase === \x27r2\x27 || phase === \x27r3\x27) {
|
|
5045
5090
|
proposals.forEach(function(pp2) {
|
|
5046
5091
|
var doneL = pp2.label || pp2.agent;
|
|
5047
5092
|
if (doneL === activeLabel) return;
|
|
5048
5093
|
if (!parlDoneAgents[doneL]) return;
|
|
5049
5094
|
var doneSeat = document.getElementById(\x27brseat_\x27+doneL.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27));
|
|
5050
|
-
addCommLine(doneSeat, activeSeatEl2, \x27#
|
|
5095
|
+
addCommLine(doneSeat, activeSeatEl2, \x27#d97706\x27, \x274 3\x27, 2, 0.9, \x27brDashFlow 1.8s linear infinite\x27);
|
|
5051
5096
|
});
|
|
5052
5097
|
}
|
|
5053
5098
|
}
|
|
@@ -5510,18 +5555,37 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
|
|
|
5510
5555
|
// Update iso thought bubble of the active agent
|
|
5511
5556
|
var isoB = document.getElementById(\x27isobubble_\x27+idx);
|
|
5512
5557
|
if (isoB) {
|
|
5513
|
-
|
|
5514
|
-
var
|
|
5558
|
+
// Show last ~6 complete words from the streaming output
|
|
5559
|
+
var wfClean = output.replace(new RegExp(\x27[\\r\\n]+\x27, \x27g\x27), \x27 \x27).trim();
|
|
5560
|
+
var wfWords = wfClean.split(\x27 \x27).filter(function(w){return w.length>0;});
|
|
5561
|
+
var wfSnippet = wfWords.slice(-6).join(\x27 \x27);
|
|
5562
|
+
if (wfSnippet.length > 52) wfSnippet = wfSnippet.slice(-52);
|
|
5563
|
+
var wfSafe = wfSnippet.replace(/&/g,\x27&\x27).replace(/</g,\x27<\x27).replace(/>/g,\x27>\x27);
|
|
5515
5564
|
isoB.className = \x27iso-bubble iso-bubble--active\x27;
|
|
5565
|
+
isoB.style.visibility = \x27visible\x27;
|
|
5516
5566
|
isoB.innerHTML = wfSafe + \x27<span style="display:inline-block;width:2px;height:8px;background:#6366f1;margin-left:1px;vertical-align:text-bottom;animation:streamBlink .7s step-end infinite">​</span>\x27;
|
|
5517
5567
|
}
|
|
5518
|
-
// Update orchestrator bubble
|
|
5568
|
+
// Update orchestrator bubble: show which agent it assigned and move the char
|
|
5519
5569
|
var orchB = document.getElementById(\x27wfOrchBubble\x27);
|
|
5520
5570
|
if (orchB) {
|
|
5521
|
-
var
|
|
5522
|
-
|
|
5523
|
-
|
|
5524
|
-
|
|
5571
|
+
var activeNode2 = studioState.nodes[idx];
|
|
5572
|
+
orchB.style.visibility = \x27visible\x27;
|
|
5573
|
+
orchB.textContent = \x27Assegno a \x27+(activeNode2 ? (activeNode2.label || activeNode2.agent) : \x27agente\x27);
|
|
5574
|
+
}
|
|
5575
|
+
// Move orchestrator char toward active agent column (live, every token)
|
|
5576
|
+
var orchCharEl = document.getElementById(\x27wfOrchChar\x27);
|
|
5577
|
+
var orchStEl = el.querySelector(\x27[data-station-idx="-1"]\x27);
|
|
5578
|
+
var actStEl = el.querySelector(\x27[data-station-idx="\x27+idx+\x27"]\x27);
|
|
5579
|
+
if (orchCharEl && orchStEl && actStEl) {
|
|
5580
|
+
var orchR = orchStEl.getBoundingClientRect();
|
|
5581
|
+
var actR = actStEl.getBoundingClientRect();
|
|
5582
|
+
var dlt = (actR.left + actR.width/2) - (orchR.left + orchR.width/2);
|
|
5583
|
+
var shft = Math.round(dlt * 0.6);
|
|
5584
|
+
if (orchCharEl.getAttribute(\x27data-last-shift\x27) !== String(shft)) {
|
|
5585
|
+
orchCharEl.style.transition = \x27transform 0.9s cubic-bezier(.4,0,.2,1)\x27;
|
|
5586
|
+
orchCharEl.style.transform = \x27translateX(\x27+shft+\x27px)\x27;
|
|
5587
|
+
orchCharEl.setAttribute(\x27data-last-shift\x27, String(shft));
|
|
5588
|
+
}
|
|
5525
5589
|
}
|
|
5526
5590
|
// Update boardroom seat bubble if parliament is active
|
|
5527
5591
|
if (parlActiveAgent) {
|