nothumanallowed 13.5.27 → 13.5.29
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/commands/ui.mjs +11 -8
- package/src/constants.mjs +1 -1
- package/src/services/web-ui.mjs +31 -25
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "13.5.
|
|
3
|
+
"version": "13.5.29",
|
|
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/commands/ui.mjs
CHANGED
|
@@ -3568,16 +3568,17 @@ Use ## prefix for each heading. Maximum 8 sections. Example:
|
|
|
3568
3568
|
fullOutputClean = stripThink(fullOutput);
|
|
3569
3569
|
} else {
|
|
3570
3570
|
// Phase 2: one call per section, each sees the sections already written
|
|
3571
|
+
// Cap context to 4000 chars max — passing the full output of previous agents
|
|
3572
|
+
// causes the model to think the content is already written and skip sections.
|
|
3573
|
+
const cappedContext = context && context.length > 4000 ? context.slice(-4000) : context;
|
|
3571
3574
|
const dataBlock = [
|
|
3572
3575
|
attachmentText ? `## ATTACHED FILE:\n${attachmentText}` : '',
|
|
3573
3576
|
toolData ? `## LIVE DATA:\n${toolData}` : '',
|
|
3574
|
-
|
|
3577
|
+
cappedContext ? `## RESEARCH DATA FROM PREVIOUS AGENTS (use as source material):\n${cappedContext}` : '',
|
|
3575
3578
|
].filter(Boolean).join('\n\n');
|
|
3576
3579
|
const sectionParts = [];
|
|
3577
3580
|
for (let si = 0; si < headingLines.length; si++) {
|
|
3578
3581
|
const heading = headingLines[si];
|
|
3579
|
-
// Pass only the headings of completed sections (not full content) to keep context small
|
|
3580
|
-
// and leave maximum token budget for the current section body.
|
|
3581
3582
|
const completedHeadings = sectionParts.map(p => p.split('\n')[0]).join('\n');
|
|
3582
3583
|
const secSys = `You are ${agent}, a specialist AI agent inside NHA Studio. Today is ${today}. Respond entirely in ${language}.
|
|
3583
3584
|
|
|
@@ -3585,14 +3586,16 @@ Use ## prefix for each heading. Maximum 8 sections. Example:
|
|
|
3585
3586
|
${task}
|
|
3586
3587
|
|
|
3587
3588
|
CRITICAL RULES:
|
|
3589
|
+
- The section below has NOT been written yet — YOU must write its full content now
|
|
3588
3590
|
- Write ONLY the body content for the section heading given — do NOT repeat the heading
|
|
3589
|
-
- Do NOT
|
|
3590
|
-
-
|
|
3591
|
-
- Be thorough
|
|
3591
|
+
- Do NOT skip, summarize, or reference "see above" — write complete original content for this section
|
|
3592
|
+
- Use the DATA block below as source material, but write in your own analytical voice
|
|
3593
|
+
- Be thorough: at least 3-5 bullet points or 2-3 full paragraphs per section
|
|
3594
|
+
- Do NOT invent data not present in the DATA block
|
|
3592
3595
|
|
|
3593
3596
|
${dataBlock}
|
|
3594
|
-
${completedHeadings ? `## SECTIONS ALREADY WRITTEN (headings only
|
|
3595
|
-
const secUser = `Write the
|
|
3597
|
+
${completedHeadings ? `## SECTIONS ALREADY WRITTEN (headings only):\n${completedHeadings}` : ''}`;
|
|
3598
|
+
const secUser = `This section has NOT been written yet. Write the COMPLETE body content for it now (minimum 150 words). Do NOT leave it empty or reference other sections:\n${heading}`;
|
|
3596
3599
|
sendToken('\n\n' + heading + '\n');
|
|
3597
3600
|
sendToken('[Sezione ' + (si + 1) + ' di ' + headingLines.length + '...] ');
|
|
3598
3601
|
let secContent = '';
|
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.29';
|
|
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.29-->';
|
|
3329
3329
|
|
|
3330
3330
|
function stopStudio() {
|
|
3331
3331
|
if (!studioState.running) return;
|
|
@@ -3956,7 +3956,8 @@ function renderStudioNodes() {
|
|
|
3956
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;
|
|
3957
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);
|
|
3958
3958
|
// Flying doc emoji when active
|
|
3959
|
-
|
|
3959
|
+
// 3 paper sheets flying up from above the monitor — staggered animation via nth-child
|
|
3960
|
+
var flyDoc = isActive ? \x27<div class="iso-fly-doc"><span>\x27+String.fromCodePoint(0x1F4C4)+\x27</span><span>\x27+String.fromCodePoint(0x1F4C3)+\x27</span><span>\x27+String.fromCodePoint(0x1F4C4)+\x27</span></div>\x27 : \x27\x27;
|
|
3960
3961
|
// Bubble id: orchestrator gets wfOrchBubble, agents get isobubble_IDX
|
|
3961
3962
|
var bubbleId = isOrch ? \x27wfOrchBubble\x27 : (\x27isobubble_\x27+nodeIdx);
|
|
3962
3963
|
var bubbleVisible = (bubbleText || isOrch || isActive) ? \x27visible\x27 : \x27hidden\x27;
|
|
@@ -4053,16 +4054,16 @@ function renderStudioNodes() {
|
|
|
4053
4054
|
if (activeNodeIdx >= 0) {
|
|
4054
4055
|
requestAnimationFrame(function() {
|
|
4055
4056
|
var orchChar = document.getElementById(\x27wfOrchChar\x27);
|
|
4056
|
-
var orchStation =
|
|
4057
|
-
var activeStation =
|
|
4057
|
+
var orchStation = document.querySelector(\x27[data-station-idx="-1"]\x27);
|
|
4058
|
+
var activeStation = document.querySelector(\x27[data-station-idx="\x27+activeNodeIdx+\x27"]\x27);
|
|
4058
4059
|
if (orchChar && orchStation && activeStation) {
|
|
4059
4060
|
var orchRect = orchStation.getBoundingClientRect();
|
|
4060
4061
|
var activeRect = activeStation.getBoundingClientRect();
|
|
4061
|
-
// Shift the char 60% of the way toward the active column center
|
|
4062
4062
|
var delta = (activeRect.left + activeRect.width/2) - (orchRect.left + orchRect.width/2);
|
|
4063
|
-
var shift = Math.round(delta * 0.
|
|
4064
|
-
orchChar.style.transition = \x27transform
|
|
4063
|
+
var shift = Math.round(delta * 0.62);
|
|
4064
|
+
orchChar.style.transition = \x27transform 1.2s cubic-bezier(.4,0,.2,1)\x27;
|
|
4065
4065
|
orchChar.style.transform = \x27translateX(\x27+shift+\x27px)\x27;
|
|
4066
|
+
orchChar.setAttribute(\x27data-last-shift\x27, String(shift));
|
|
4066
4067
|
// Also update orch bubble to show what it is assigning
|
|
4067
4068
|
var orchBubble = document.getElementById(\x27wfOrchBubble\x27);
|
|
4068
4069
|
if (orchBubble) {
|
|
@@ -5077,22 +5078,22 @@ async function runStudio() {
|
|
|
5077
5078
|
if (ib2 <= ia) return;
|
|
5078
5079
|
var ea = document.getElementById(\x27brseat_\x27+pa.label.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27));
|
|
5079
5080
|
var eb = document.getElementById(\x27brseat_\x27+pb2.label.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27));
|
|
5080
|
-
addCommLine(ea, eb, \x27#
|
|
5081
|
+
addCommLine(ea, eb, \x27#111827\x27, \x274 3\x27, 2, 0.9, \x27\x27);
|
|
5081
5082
|
});
|
|
5082
5083
|
});
|
|
5083
5084
|
} else if (activeLabel) {
|
|
5084
5085
|
var aLblSafe2 = activeLabel.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27);
|
|
5085
5086
|
var activeSeatEl2 = document.getElementById(\x27brseat_\x27+aLblSafe2);
|
|
5086
|
-
// Orch → active agent
|
|
5087
|
-
addCommLine(orchEl2, activeSeatEl2, \x27#
|
|
5088
|
-
// R2/R3: done agents → active agent
|
|
5087
|
+
// Orch → active agent: thick black dashed animated line
|
|
5088
|
+
addCommLine(orchEl2, activeSeatEl2, \x27#111827\x27, \x276 4\x27, 3, 1, \x27brDashFlow 1s linear infinite\x27);
|
|
5089
|
+
// R2/R3: done agents → active agent: dark grey dashed
|
|
5089
5090
|
if (phase === \x27r2\x27 || phase === \x27r3\x27) {
|
|
5090
5091
|
proposals.forEach(function(pp2) {
|
|
5091
5092
|
var doneL = pp2.label || pp2.agent;
|
|
5092
5093
|
if (doneL === activeLabel) return;
|
|
5093
5094
|
if (!parlDoneAgents[doneL]) return;
|
|
5094
5095
|
var doneSeat = document.getElementById(\x27brseat_\x27+doneL.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27));
|
|
5095
|
-
addCommLine(doneSeat, activeSeatEl2, \x27#
|
|
5096
|
+
addCommLine(doneSeat, activeSeatEl2, \x27#374151\x27, \x275 3\x27, 2.5, 1, \x27brDashFlow 1.4s linear infinite\x27);
|
|
5096
5097
|
});
|
|
5097
5098
|
}
|
|
5098
5099
|
}
|
|
@@ -5649,7 +5650,7 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
|
|
|
5649
5650
|
var wfSafe = wfSnippet.replace(/&/g,\x27&\x27).replace(/</g,\x27<\x27).replace(/>/g,\x27>\x27);
|
|
5650
5651
|
isoB.className = \x27iso-bubble iso-bubble--active\x27;
|
|
5651
5652
|
isoB.style.visibility = \x27visible\x27;
|
|
5652
|
-
isoB.innerHTML = wfSafe + \x27<span style="display:inline-block;width:2px;height:8px;background:#
|
|
5653
|
+
isoB.innerHTML = wfSafe + \x27<span style="display:inline-block;width:2px;height:8px;background:#1d4ed8;margin-left:1px;vertical-align:text-bottom;animation:streamBlink .7s step-end infinite">​</span>\x27;
|
|
5653
5654
|
}
|
|
5654
5655
|
// Update orchestrator bubble: show which agent it assigned and move the char
|
|
5655
5656
|
var orchB = document.getElementById(\x27wfOrchBubble\x27);
|
|
@@ -5660,15 +5661,17 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
|
|
|
5660
5661
|
}
|
|
5661
5662
|
// Move orchestrator char toward active agent column (live, every token)
|
|
5662
5663
|
var orchCharEl = document.getElementById(\x27wfOrchChar\x27);
|
|
5663
|
-
var orchStEl =
|
|
5664
|
-
var actStEl =
|
|
5664
|
+
var orchStEl = document.querySelector(\x27[data-station-idx="-1"]\x27);
|
|
5665
|
+
var actStEl = document.querySelector(\x27[data-station-idx="\x27+idx+\x27"]\x27);
|
|
5665
5666
|
if (orchCharEl && orchStEl && actStEl) {
|
|
5666
5667
|
var orchR = orchStEl.getBoundingClientRect();
|
|
5667
5668
|
var actR = actStEl.getBoundingClientRect();
|
|
5668
5669
|
var dlt = (actR.left + actR.width/2) - (orchR.left + orchR.width/2);
|
|
5669
|
-
var shft = Math.round(dlt * 0.
|
|
5670
|
-
if
|
|
5671
|
-
|
|
5670
|
+
var shft = Math.round(dlt * 0.62);
|
|
5671
|
+
// Only update if shift changed by more than 4px (avoid jitter)
|
|
5672
|
+
var lastShft = parseFloat(orchCharEl.getAttribute(\x27data-last-shift\x27) || \x270\x27);
|
|
5673
|
+
if (Math.abs(shft - lastShft) > 4) {
|
|
5674
|
+
orchCharEl.style.transition = \x27transform 1.2s cubic-bezier(.4,0,.2,1)\x27;
|
|
5672
5675
|
orchCharEl.style.transform = \x27translateX(\x27+shft+\x27px)\x27;
|
|
5673
5676
|
orchCharEl.setAttribute(\x27data-last-shift\x27, String(shft));
|
|
5674
5677
|
}
|
|
@@ -6558,19 +6561,22 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
6558
6561
|
.iso-scene{background:#f0ede6;cursor:default;max-width:100%;overflow-x:auto;box-shadow:0 4px 24px rgba(0,0,0,.18);border-radius:12px;overflow:hidden}
|
|
6559
6562
|
.iso-station{display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;transition:filter .2s,transform .2s;padding:8px 4px;border-radius:12px;border:1.5px solid transparent;position:relative}
|
|
6560
6563
|
.iso-station:hover{filter:brightness(1.06);transform:translateY(-2px)}
|
|
6561
|
-
.iso-char-mover{position:relative;transition:transform .
|
|
6562
|
-
.iso-char-mover.iso-orch-walking{animation:orchWalkGrid 1.8s ease-in-out infinite alternate}
|
|
6563
|
-
@keyframes orchWalkGrid{0%{transform:translateX(0) scale(1)}100%{transform:translateX(18px) scale(1.05)}}
|
|
6564
|
+
.iso-char-mover{position:relative;transition:transform 0.9s cubic-bezier(.4,0,.2,1)}
|
|
6564
6565
|
.iso-char-mover.iso-orch-done{animation:orchBounce .7s ease forwards}
|
|
6565
6566
|
@keyframes orchBounce{0%{transform:scale(1)}40%{transform:scale(1.18) translateY(-6px)}100%{transform:scale(1)}}
|
|
6566
|
-
|
|
6567
|
-
|
|
6567
|
+
/* Fly-doc: multiple sheets flying from monitor upward */
|
|
6568
|
+
.iso-fly-doc{position:absolute;top:2px;left:50%;font-size:14px;pointer-events:none;z-index:25}
|
|
6569
|
+
.iso-fly-doc span{position:absolute;display:block;animation:flySheet 1.4s ease-in-out infinite}
|
|
6570
|
+
.iso-fly-doc span:nth-child(1){animation-delay:0s;left:-10px}
|
|
6571
|
+
.iso-fly-doc span:nth-child(2){animation-delay:.45s;left:2px}
|
|
6572
|
+
.iso-fly-doc span:nth-child(3){animation-delay:.9s;left:12px}
|
|
6573
|
+
@keyframes flySheet{0%{transform:translateY(0) rotate(-8deg);opacity:0}15%{opacity:1}60%{transform:translateY(-38px) rotate(14deg);opacity:.9}100%{transform:translateY(-58px) rotate(-5deg);opacity:0}}
|
|
6568
6574
|
.iso-desk{width:90%;height:16px;background:linear-gradient(180deg,#d4a448 0%,#b8832a 100%);border-radius:4px 4px 2px 2px;box-shadow:0 4px 0 #8a5e18,0 6px 10px rgba(0,0,0,.3);border-top:2px solid #e8c060;position:relative;margin-top:4px}
|
|
6569
6575
|
.iso-desk::after{content:'';position:absolute;bottom:-4px;left:8px;right:8px;height:4px;background:#7a5010;border-radius:0 0 3px 3px}
|
|
6570
6576
|
.iso-monitor{width:56px;height:40px;background:#12101e;border:2px solid #3a3070;border-radius:5px;display:flex;align-items:center;justify-content:center;position:relative;margin-bottom:-2px}
|
|
6571
6577
|
.iso-monitor::after{content:'';position:absolute;bottom:-5px;left:50%;transform:translateX(-50%);width:10px;height:5px;background:#252436;border-radius:0 0 3px 3px}
|
|
6572
6578
|
.iso-monitor-screen{width:44px;height:28px;background:rgba(60,40,160,.35);border-radius:2px;display:flex;align-items:center;justify-content:center}
|
|
6573
|
-
.iso-monitor-blink{width:7px;height:7px;border-radius:50%;background:#6366f1;animation:monBlink .9s ease-in-out infinite}
|
|
6579
|
+
.iso-monitor-blink{width:7px;height:7px;border-radius:50%;background:#6366f1;animation:monBlink .9s ease-in-out infinite;margin-right:6px}
|
|
6574
6580
|
@keyframes monBlink{0%,100%{opacity:1;box-shadow:0 0 8px #6366f1}50%{opacity:.25;box-shadow:none}}
|
|
6575
6581
|
.iso-tool-badge{font-size:22px;line-height:1;filter:drop-shadow(0 2px 5px rgba(0,0,0,.35));user-select:none;margin-bottom:1px}
|
|
6576
6582
|
/* Animated status chip for [bracket tokens] */
|
|
@@ -6586,7 +6592,7 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
6586
6592
|
.iso-orch-wrap.prl-head{animation:isoCharBob 1.4s ease-in-out infinite}
|
|
6587
6593
|
/* Thought bubble / speech bubble above character */
|
|
6588
6594
|
.iso-bubble{font-size:9px;font-family:var(--mono);padding:3px 9px;border-radius:12px;border:1px solid #ccc;background:rgba(255,255,255,.9);color:#6b7280;white-space:normal;word-break:break-word;max-width:160px;line-height:1.4;transition:all .25s;pointer-events:none;backdrop-filter:blur(6px);text-align:center}
|
|
6589
|
-
.iso-bubble--active{background
|
|
6595
|
+
.iso-bubble--active{background:#0f172a;border-color:#1d4ed8;color:#dbeafe;animation:isoBubblePop .35s ease;white-space:normal;max-width:160px;word-break:break-word;line-height:1.35}
|
|
6590
6596
|
.iso-bubble--orch{font-size:9px;padding:3px 9px;border-radius:12px;border-color:#818cf8;color:#a5b4fc;background:rgba(20,15,50,.9)}
|
|
6591
6597
|
@keyframes isoBubblePop{0%{transform:scale(.8) translateY(4px);opacity:.4}100%{transform:scale(1) translateY(0);opacity:1}}
|
|
6592
6598
|
.iso-name{font-size:10px;font-family:var(--mono);font-weight:700;letter-spacing:.3px;text-align:center;max-width:160px;white-space:normal;word-break:break-word;line-height:1.3;background:rgba(255,255,255,.85);border-radius:6px;padding:2px 6px;pointer-events:none;backdrop-filter:blur(4px)}
|