nothumanallowed 13.5.2 → 13.5.3
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 +279 -48
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nothumanallowed",
|
|
3
|
-
"version": "13.5.
|
|
3
|
+
"version": "13.5.3",
|
|
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.3';
|
|
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
|
@@ -4328,36 +4328,236 @@ async function runStudio() {
|
|
|
4328
4328
|
var parlActiveAgent = null;
|
|
4329
4329
|
var parlDoneAgents = {};
|
|
4330
4330
|
|
|
4331
|
+
// ── Parliament boardroom: first call builds DOM, subsequent calls only update state ──
|
|
4332
|
+
var parlBlockBuilt = false;
|
|
4333
|
+
|
|
4331
4334
|
function renderParlBlock(phase, activeLabel, convergence) {
|
|
4332
4335
|
var pb = document.getElementById(\x27studioParliamentBlock\x27);
|
|
4333
4336
|
if (!pb) return;
|
|
4334
4337
|
pb.style.display = \x27block\x27;
|
|
4335
|
-
|
|
4336
|
-
pb.style.position = \x27\x27; pb.style.bottom = \x27\x27; pb.style.left = \x27\x27;
|
|
4337
|
-
pb.style.transform = \x27\x27; pb.style.width = \x27\x27;
|
|
4338
|
-
pb.style.top = \x27\x27; pb.style.zIndex = \x27\x27; pb.style.boxShadow = \x27\x27;
|
|
4339
|
-
pb.style.maxWidth = \x27\x27;
|
|
4340
|
-
|
|
4341
|
-
// ── OFFICE CARTOON ANIMATION ─────────────────────────────────────────
|
|
4342
|
-
// Each agent = a character at a desk doing visible work.
|
|
4343
|
-
// Documents fly between agents during R2. MASTER walks around in R1.
|
|
4338
|
+
|
|
4344
4339
|
var phaseColor = {r1:\x27#6366f1\x27,r2:\x27#22d3ee\x27,r3:\x27#f59e0b\x27,done:\x27#22c55e\x27}[phase]||\x27#6366f1\x27;
|
|
4345
4340
|
var phaseLabel = {
|
|
4346
|
-
r1:\x27Round 1 \u2014 Ogni agente analizza
|
|
4347
|
-
r2:\x27Round 2 \u2014
|
|
4348
|
-
r3:\x27Round 3 \u2014 HERALD media le
|
|
4341
|
+
r1:\x27Round 1 \u2014 Ogni agente analizza\x27,
|
|
4342
|
+
r2:\x27Round 2 \u2014 Cross-reading e raffinamento\x27,
|
|
4343
|
+
r3:\x27Round 3 \u2014 HERALD media le divergenze\x27,
|
|
4349
4344
|
done:\x27Deliberazione completata\x27
|
|
4350
4345
|
}[phase]||\x27\x27;
|
|
4351
|
-
|
|
4352
4346
|
var n = proposals.length;
|
|
4353
4347
|
var doneCount = Object.keys(parlDoneAgents).length;
|
|
4354
4348
|
var progressPct = n > 0 ? Math.round(doneCount / n * 100) : 0;
|
|
4355
4349
|
|
|
4356
|
-
//
|
|
4357
|
-
//
|
|
4358
|
-
//
|
|
4359
|
-
//
|
|
4350
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
4351
|
+
// BOARDROOM 3D — first call builds the full DOM structure.
|
|
4352
|
+
// Subsequent calls ONLY update agent states (no innerHTML overwrite).
|
|
4353
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
4354
|
+
|
|
4355
|
+
if (!parlBlockBuilt) {
|
|
4356
|
+
parlBlockBuilt = true;
|
|
4357
|
+
|
|
4358
|
+
// Build agent seat HTML (box + avatar)
|
|
4359
|
+
function buildSeat(prop) {
|
|
4360
|
+
var lbl = prop.label || prop.agent;
|
|
4361
|
+
var ico = prop.icon || String.fromCharCode(9632);
|
|
4362
|
+
var skinColors = [\x27#fbbf24\x27,\x27#f97316\x27,\x27#a78bfa\x27,\x27#34d399\x27,\x27#60a5fa\x27,\x27#f472b6\x27];
|
|
4363
|
+
var skinIdx = Math.abs(lbl.charCodeAt(0)+(lbl.charCodeAt(lbl.length-1)||0)) % skinColors.length;
|
|
4364
|
+
var skin = skinColors[skinIdx];
|
|
4365
|
+
var shirtC = [\x27#4f46e5\x27,\x27#0891b2\x27,\x27#7c3aed\x27,\x27#059669\x27,\x27#dc2626\x27,\x27#d97706\x27][skinIdx];
|
|
4366
|
+
var safeLbl = lbl.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27);
|
|
4367
|
+
// Mini agent SVG (seated, top-down perspective hint)
|
|
4368
|
+
var agentSvg = \x27<svg viewBox="0 0 44 52" width="44" height="52" xmlns="http://www.w3.org/2000/svg">\x27+
|
|
4369
|
+
// Chair back
|
|
4370
|
+
\x27<rect x="6" y="2" width="32" height="6" rx="3" fill="#2a2050" stroke="#3a3070" stroke-width="1"/>\x27+
|
|
4371
|
+
// Chair seat
|
|
4372
|
+
\x27<rect x="6" y="32" width="32" height="12" rx="3" fill="#221840" stroke="#3a3060" stroke-width="1"/>\x27+
|
|
4373
|
+
// Body / torso
|
|
4374
|
+
\x27<rect x="14" y="8" width="16" height="22" rx="4" fill="\x27+shirtC+\x27" opacity=".9"/>\x27+
|
|
4375
|
+
// Head
|
|
4376
|
+
\x27<circle cx="22" cy="5" r="7" fill="\x27+skin+\x27"/>\x27+
|
|
4377
|
+
// Eyes
|
|
4378
|
+
\x27<circle cx="19.5" cy="4.5" r="1.2" fill="#0a0a14"/>\x27+
|
|
4379
|
+
\x27<circle cx="24.5" cy="4.5" r="1.2" fill="#0a0a14"/>\x27+
|
|
4380
|
+
// Arms on desk
|
|
4381
|
+
\x27<rect x="7" y="26" width="9" height="5" rx="2" fill="\x27+skin+\x27" class="br-arm-l"/>\x27+
|
|
4382
|
+
\x27<rect x="28" y="26" width="9" height="5" rx="2" fill="\x27+skin+\x27" class="br-arm-r"/>\x27+
|
|
4383
|
+
// Monitor on desk in front of agent
|
|
4384
|
+
\x27<rect x="12" y="37" width="20" height="13" rx="2" fill="#141028" stroke="#3a3070" stroke-width="1"/>\x27+
|
|
4385
|
+
\x27<rect x="13" y="38" width="18" height="11" rx="1" fill="rgba(90,80,180,.35)"/>\x27+
|
|
4386
|
+
\x27<line x1="14" y1="41" x2="30" y2="41" stroke="#9090cc" stroke-width=".8" opacity=".8"/>\x27+
|
|
4387
|
+
\x27<line x1="14" y1="44" x2="28" y2="44" stroke="#7070aa" stroke-width=".8" opacity=".6"/>\x27+
|
|
4388
|
+
// Agent badge
|
|
4389
|
+
\x27<circle cx="22" cy="13" r="5" fill="#0f0f1e" stroke="\x27+shirtC+\x2780" stroke-width="1.2"/>\x27+
|
|
4390
|
+
\x27<text x="22" y="16" text-anchor="middle" font-size="6" font-family="system-ui">\x27+ico+\x27</text>\x27+
|
|
4391
|
+
\x27</svg>\x27;
|
|
4392
|
+
return \x27<div class="br-seat" id="brseat_\x27+safeLbl+\x27" data-lbl="\x27+esc(lbl)+\x27">\x27+
|
|
4393
|
+
\x27<div class="br-seat-box">\x27+
|
|
4394
|
+
\x27<div class="br-bubble" id="brbubble_\x27+safeLbl+\x27"></div>\x27+
|
|
4395
|
+
agentSvg+
|
|
4396
|
+
\x27<div class="br-seat-name" id="brname_\x27+safeLbl+\x27">\x27+esc(lbl)+\x27</div>\x27+
|
|
4397
|
+
\x27</div>\x27+
|
|
4398
|
+
\x27</div>\x27;
|
|
4399
|
+
}
|
|
4400
|
+
|
|
4401
|
+
// Arrange seats in a circle around center table
|
|
4402
|
+
// Positions computed from CSS: use CSS custom properties per seat index
|
|
4403
|
+
var seatsHtml = proposals.map(buildSeat).join(\x27\x27);
|
|
4404
|
+
|
|
4405
|
+
// Orchestrator at center (standing, prominent)
|
|
4406
|
+
var orchSvg = \x27<svg viewBox="0 0 54 70" width="54" height="70" xmlns="http://www.w3.org/2000/svg" font-family="system-ui,sans-serif">\x27+
|
|
4407
|
+
// Legs
|
|
4408
|
+
\x27<path d="M20 45 C19 54 18 62 17 66 C16 68 18 69 20 69 C22 69 23 68 23 65 C24 59 24 52 25 45 Z" fill="#252460"/>\x27+
|
|
4409
|
+
\x27<path d="M27 45 C28 54 29 62 30 66 C31 68 29 69 27 69 C25 69 24 68 24 65 C23 59 23 52 22 45 Z" fill="#252460"/>\x27+
|
|
4410
|
+
// Suit
|
|
4411
|
+
\x27<path d="M11 26 C10 24 13 21 22 19 C31 21 34 24 33 26 L34 45 L10 45 Z" fill="#252464"/>\x27+
|
|
4412
|
+
\x27<path d="M11 26 C10 24 13 21 22 19 L22 45 L10 45 Z" fill="#1e1d52"/>\x27+
|
|
4413
|
+
\x27<path d="M22 19 C31 21 34 24 33 26 L34 45 L22 45 Z" fill="#2a2870"/>\x27+
|
|
4414
|
+
// Tie
|
|
4415
|
+
\x27<path d="M22 22 L21 36 L22 40 L23 36 Z" fill="#818cf8"/>\x27+
|
|
4416
|
+
// Arms gesturing (spread wide — presenting)
|
|
4417
|
+
\x27<path d="M10 28 C4 30 1 36 2 41 C3 44 6 44 8 42 C10 40 11 36 12 32 C13 30 11 27 10 28" fill="#252464" class="br-orch-arm-l"/>\x27+
|
|
4418
|
+
\x27<path d="M34 28 C40 30 43 36 42 41 C41 44 38 44 36 42 C34 40 33 36 32 32 C31 30 33 27 34 28" fill="#252464" class="br-orch-arm-r"/>\x27+
|
|
4419
|
+
// Head
|
|
4420
|
+
\x27<circle cx="22" cy="13" r="9" fill="#fbbf24"/>\x27+
|
|
4421
|
+
\x27<circle cx="19" cy="12" r="1.5" fill="#0a0a14"/>\x27+
|
|
4422
|
+
\x27<circle cx="25" cy="12" r="1.5" fill="#0a0a14"/>\x27+
|
|
4423
|
+
\x27<circle cx="20" cy="11" r=".6" fill="rgba(255,255,255,.8)"/>\x27+
|
|
4424
|
+
\x27<circle cx="26" cy="11" r=".6" fill="rgba(255,255,255,.8)"/>\x27+
|
|
4425
|
+
// Mouth — speaking
|
|
4426
|
+
\x27<path d="M18 16 Q22 20 26 16" stroke="#8b4513" stroke-width="1.6" fill="none" stroke-linecap="round"/>\x27+
|
|
4427
|
+
// NHA badge
|
|
4428
|
+
\x27<circle cx="16" cy="30" r="3" fill="#0d0d1e" stroke="#818cf888" stroke-width="1"/>\x27+
|
|
4429
|
+
\x27<text x="16" y="32.5" text-anchor="middle" font-size="3.5" fill="#818cf8">N</text>\x27+
|
|
4430
|
+
// Crown / authority marker
|
|
4431
|
+
\x27<path d="M15 3 L17 8 L22 5 L27 8 L29 3 L22 0 Z" fill="#f59e0b"/>\x27+
|
|
4432
|
+
\x27<circle cx="17" cy="8" r="1.5" fill="#fbbf24"/>\x27+
|
|
4433
|
+
\x27<circle cx="22" cy="5" r="1.5" fill="#fbbf24"/>\x27+
|
|
4434
|
+
\x27<circle cx="27" cy="8" r="1.5" fill="#fbbf24"/>\x27+
|
|
4435
|
+
\x27</svg>\x27;
|
|
4436
|
+
|
|
4437
|
+
// Center table (SVG oval)
|
|
4438
|
+
var tableSvg = \x27<svg viewBox="0 0 160 80" width="160" height="80" xmlns="http://www.w3.org/2000/svg">\x27+
|
|
4439
|
+
// Table shadow
|
|
4440
|
+
\x27<ellipse cx="80" cy="44" rx="74" ry="34" fill="rgba(0,0,0,.3)"/>\x27+
|
|
4441
|
+
// Table surface — glossy dark wood
|
|
4442
|
+
\x27<ellipse cx="80" cy="40" rx="74" ry="34" fill="#1e1440" stroke="#3a2880" stroke-width="2"/>\x27+
|
|
4443
|
+
// Table shine
|
|
4444
|
+
\x27<ellipse cx="60" cy="28" rx="30" ry="12" fill="rgba(150,130,255,.08)"/>\x27+
|
|
4445
|
+
// NHA logo on table
|
|
4446
|
+
\x27<text x="80" y="46" text-anchor="middle" font-family="system-ui" font-size="18" font-weight="900" fill="rgba(100,90,200,.25)" letter-spacing="2">NHA</text>\x27+
|
|
4447
|
+
// Documents on table
|
|
4448
|
+
\x27<rect x="62" y="34" width="18" height="14" rx="2" fill="#141028" stroke="#4a3880" stroke-width="1" transform="rotate(-8 71 41)"/>\x27+
|
|
4449
|
+
\x27<rect x="82" y="36" width="18" height="14" rx="2" fill="#141028" stroke="#4a3880" stroke-width="1" transform="rotate(5 91 43)"/>\x27+
|
|
4450
|
+
\x27</svg>\x27;
|
|
4451
|
+
|
|
4452
|
+
var orchHtml = \x27<div class="br-orch" id="brOrch">\x27+
|
|
4453
|
+
\x27<div class="br-orch-speech" id="brOrchSpeech"></div>\x27+
|
|
4454
|
+
orchSvg+
|
|
4455
|
+
\x27<div class="br-orch-label">Orchestratore</div>\x27+
|
|
4456
|
+
\x27</div>\x27;
|
|
4457
|
+
|
|
4458
|
+
// Phase indicator + progress
|
|
4459
|
+
var headerHtml = \x27<div class="br-header">\x27+
|
|
4460
|
+
\x27<span class="br-phase-chip" id="brPhaseChip"></span>\x27+
|
|
4461
|
+
\x27<div class="br-progress-wrap" id="brProgressWrap"><div class="br-progress-bar" id="brProgressBar"></div></div>\x27+
|
|
4462
|
+
\x27</div>\x27;
|
|
4463
|
+
|
|
4464
|
+
var convergeHtml = \x27<div class="br-convergence" id="brConvergence" style="display:none"></div>\x27;
|
|
4465
|
+
|
|
4466
|
+
pb.innerHTML =
|
|
4467
|
+
\x27<div class="br-wrap">\x27+
|
|
4468
|
+
headerHtml+
|
|
4469
|
+
\x27<div class="br-room" style="--br-n:\x27+n+\x27">\x27+
|
|
4470
|
+
\x27<div class="br-table-center">\x27+tableSvg+orchHtml+\x27</div>\x27+
|
|
4471
|
+
\x27<div class="br-seats-ring" style="--br-n:\x27+n+\x27">\x27+seatsHtml+\x27</div>\x27+
|
|
4472
|
+
\x27</div>\x27+
|
|
4473
|
+
convergeHtml+
|
|
4474
|
+
\x27</div>\x27;
|
|
4475
|
+
}
|
|
4476
|
+
|
|
4477
|
+
// ── Update state (runs every call, including initial build) ──────────
|
|
4360
4478
|
|
|
4479
|
+
// Phase chip
|
|
4480
|
+
var chipEl = document.getElementById(\x27brPhaseChip\x27);
|
|
4481
|
+
if (chipEl) { chipEl.textContent = phaseLabel; chipEl.style.setProperty(\x27--pc\x27, phaseColor); }
|
|
4482
|
+
|
|
4483
|
+
// Progress bar
|
|
4484
|
+
var pbBar = document.getElementById(\x27brProgressBar\x27);
|
|
4485
|
+
if (pbBar) pbBar.style.width = progressPct + \x27%\x27;
|
|
4486
|
+
var pbWrap = document.getElementById(\x27brProgressWrap\x27);
|
|
4487
|
+
if (pbWrap) pbWrap.style.display = convergence != null ? \x27none\x27 : \x27\x27;
|
|
4488
|
+
|
|
4489
|
+
// Convergence
|
|
4490
|
+
var convEl = document.getElementById(\x27brConvergence\x27);
|
|
4491
|
+
if (convEl && convergence != null) {
|
|
4492
|
+
convEl.style.display = \x27block\x27;
|
|
4493
|
+
convEl.innerHTML = \x27<div class="br-conv-bar-outer"><div class="br-conv-bar-inner" style="width:\x27+Math.min(convergence,100)+\x27%"></div></div>\x27+
|
|
4494
|
+
\x27<div class="br-conv-text"><strong>\u2714 Convergenza \x27+convergence+\x27%</strong> \u2014 HERALD ha sintetizzato il consenso finale.</div>\x27;
|
|
4495
|
+
}
|
|
4496
|
+
|
|
4497
|
+
// Orchestrator speech bubble
|
|
4498
|
+
var orchSpeech = document.getElementById(\x27brOrchSpeech\x27);
|
|
4499
|
+
if (orchSpeech) {
|
|
4500
|
+
var orchSpeeches = {
|
|
4501
|
+
r1: [\x27Analizzate!\x27,\x27Al lavoro!\x27,\x27Forza!\x27,\x27Pensate!\x27],
|
|
4502
|
+
r2: [\x27Confrontate!\x27,\x27Leggete tutto!\x27,\x27Raffinare!\x27,\x27Scambiate!\x27],
|
|
4503
|
+
r3: [\x27Mediazione!\x27,\x27Convergete!\x27,\x27Trovate accordo!\x27],
|
|
4504
|
+
done: [\x27Ottimo!\x27,\x27Consenso!\x27,\x27Bene!\x27]
|
|
4505
|
+
};
|
|
4506
|
+
var spArr = orchSpeeches[phase] || orchSpeeches.r1;
|
|
4507
|
+
if (phase === \x27done\x27) {
|
|
4508
|
+
orchSpeech.style.display = \x27none\x27;
|
|
4509
|
+
} else {
|
|
4510
|
+
orchSpeech.style.display = \x27\x27;
|
|
4511
|
+
// Rotate through phrases based on progress
|
|
4512
|
+
orchSpeech.textContent = spArr[doneCount % spArr.length];
|
|
4513
|
+
orchSpeech.style.borderColor = phaseColor;
|
|
4514
|
+
orchSpeech.style.color = phaseColor;
|
|
4515
|
+
}
|
|
4516
|
+
}
|
|
4517
|
+
|
|
4518
|
+
// Orchestrator animation class
|
|
4519
|
+
var orchEl = document.getElementById(\x27brOrch\x27);
|
|
4520
|
+
if (orchEl) {
|
|
4521
|
+
orchEl.className = \x27br-orch\x27 + (phase===\x27done\x27 ? \x27 br-orch--done\x27 : \x27 br-orch--active\x27);
|
|
4522
|
+
orchEl.style.setProperty(\x27--oc\x27, phaseColor);
|
|
4523
|
+
}
|
|
4524
|
+
|
|
4525
|
+
// Update each agent seat state
|
|
4526
|
+
proposals.forEach(function(prop) {
|
|
4527
|
+
var lbl = prop.label || prop.agent;
|
|
4528
|
+
var safeLbl = lbl.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27);
|
|
4529
|
+
var seatEl = document.getElementById(\x27brseat_\x27+safeLbl);
|
|
4530
|
+
var bubbleEl = document.getElementById(\x27brbubble_\x27+safeLbl);
|
|
4531
|
+
var nameEl = document.getElementById(\x27brname_\x27+safeLbl);
|
|
4532
|
+
var isDone = !!parlDoneAgents[lbl];
|
|
4533
|
+
var isActive = lbl === activeLabel;
|
|
4534
|
+
|
|
4535
|
+
if (seatEl) {
|
|
4536
|
+
seatEl.className = \x27br-seat\x27 +
|
|
4537
|
+
(isActive ? \x27 br-seat--active\x27 : \x27\x27) +
|
|
4538
|
+
(isDone ? \x27 br-seat--done\x27 : \x27\x27);
|
|
4539
|
+
seatEl.style.setProperty(\x27--sc\x27, phaseColor);
|
|
4540
|
+
}
|
|
4541
|
+
if (bubbleEl) {
|
|
4542
|
+
var actionStr2 = \x27\x27;
|
|
4543
|
+
if (phase===\x27r1\x27 && isActive) actionStr2 = \x27...analizza\x27;
|
|
4544
|
+
else if (phase===\x27r1\x27 && isDone) actionStr2 = \x27\u2714 bozza pronta\x27;
|
|
4545
|
+
else if (phase===\x27r2\x27 && isActive) actionStr2 = \x27...legge + raffina\x27;
|
|
4546
|
+
else if (phase===\x27r2\x27 && isDone) actionStr2 = \x27\u2714 raffinato\x27;
|
|
4547
|
+
else if (phase===\x27r3\x27 && isActive) actionStr2 = \x27...media\x27;
|
|
4548
|
+
else if (phase===\x27done\x27) actionStr2 = \x27\u2714 consenso\x27;
|
|
4549
|
+
else if (!isActive && !isDone) actionStr2 = \x27in attesa\x27;
|
|
4550
|
+
bubbleEl.textContent = actionStr2;
|
|
4551
|
+
bubbleEl.style.display = actionStr2 ? \x27\x27 : \x27none\x27;
|
|
4552
|
+
bubbleEl.style.borderColor = isActive ? phaseColor : (isDone ? \x27#22c55e\x27 : \x27#3a3060\x27);
|
|
4553
|
+
bubbleEl.style.color = isActive ? phaseColor : (isDone ? \x27#4ade80\x27 : \x27#6b7280\x27);
|
|
4554
|
+
}
|
|
4555
|
+
if (nameEl) {
|
|
4556
|
+
nameEl.style.color = isDone ? \x27#4ade80\x27 : (isActive ? phaseColor : \x27#8880aa\x27);
|
|
4557
|
+
}
|
|
4558
|
+
});
|
|
4559
|
+
|
|
4560
|
+
// ── Old function stubs needed by remaining code paths ────────────────
|
|
4361
4561
|
function buildChar(prop, isDone, isActive, isOrchestratorTarget) {
|
|
4362
4562
|
var lbl = prop.label || prop.agent;
|
|
4363
4563
|
var ico = prop.icon || String.fromCharCode(9632);
|
|
@@ -4767,36 +4967,6 @@ async function runStudio() {
|
|
|
4767
4967
|
flyingDocHtml += \x27</div>\x27;
|
|
4768
4968
|
}
|
|
4769
4969
|
|
|
4770
|
-
// ── Assemble agent desks row ──────────────────────────────────────
|
|
4771
|
-
var desksHtml = proposals.map(function(prop) {
|
|
4772
|
-
var lbl = prop.label || prop.agent;
|
|
4773
|
-
return buildChar(prop, !!parlDoneAgents[lbl], lbl===activeLabel, false);
|
|
4774
|
-
}).join(\x27\x27);
|
|
4775
|
-
|
|
4776
|
-
var convergenceHtml = convergence != null
|
|
4777
|
-
? (\x27<div class="prl-conv-wrap"><div class="prl-conv-bar-outer"><div class="prl-conv-bar-inner" style="width:\x27+Math.min(convergence,100)+\x27%"></div></div>\x27+
|
|
4778
|
-
\x27<div class="prl-conv-text"><strong>\u2714 Convergenza \x27+convergence+\x27%</strong> — le analisi condividono il \x27+convergence+\x27% dei concetti chiave (Jaccard). HERALD ha sintetizzato il consenso finale.</div></div>\x27)
|
|
4779
|
-
: (\x27<div class="prl-progress"><div class="prl-progress__bar" style="width:\x27+progressPct+\x27%"></div></div>\x27);
|
|
4780
|
-
|
|
4781
|
-
pb.innerHTML =
|
|
4782
|
-
\x27<div class="prl-wrap">\x27+
|
|
4783
|
-
\x27<div class="prl-header"><span class="prl-phase-chip" style="--pc:\x27+phaseColor+\x27">\x27+phaseLabel+\x27</span></div>\x27+
|
|
4784
|
-
\x27<div class="prl-office">\x27+
|
|
4785
|
-
officeRoomDecor()+
|
|
4786
|
-
\x27<div class="prl-office-floor"></div>\x27+
|
|
4787
|
-
\x27<div class="prl-desks-row" style="position:relative;z-index:2">\x27+desksHtml+\x27</div>\x27+
|
|
4788
|
-
masterHtml+
|
|
4789
|
-
flyingDocHtml+
|
|
4790
|
-
\x27</div>\x27+
|
|
4791
|
-
convergenceHtml+
|
|
4792
|
-
\x27</div>\x27;
|
|
4793
|
-
|
|
4794
|
-
// Force Safari compositing repaint
|
|
4795
|
-
void pb.offsetHeight;
|
|
4796
|
-
requestAnimationFrame(function(){
|
|
4797
|
-
pb.style.opacity = \x270.99\x27;
|
|
4798
|
-
requestAnimationFrame(function(){ pb.style.opacity = \x271\x27; });
|
|
4799
|
-
});
|
|
4800
4970
|
}
|
|
4801
4971
|
|
|
4802
4972
|
// Show initial R1 block and scroll into view
|
|
@@ -5951,7 +6121,68 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
5951
6121
|
.wf-sbraita-bubble{position:absolute;top:-28px;left:50%;transform:translateX(-50%);background:#1a0a0a;border:1.5px solid #ef4444;color:#fca5a5;font-family:var(--mono);font-size:9px;font-weight:800;padding:3px 8px;border-radius:8px;white-space:nowrap;letter-spacing:.5px;animation:sbraitaPop .4s ease-in-out infinite alternate;pointer-events:none;z-index:4}
|
|
5952
6122
|
.wf-sbraita-bubble::after{content:"";position:absolute;top:100%;left:50%;transform:translateX(-50%);border:5px solid transparent;border-top-color:#ef4444}
|
|
5953
6123
|
@keyframes sbraitaPop{0%{transform:translateX(-50%) scale(1) rotate(-2deg)}100%{transform:translateX(-50%) scale(1.06) rotate(2deg)}}
|
|
5954
|
-
/* ── Parliament
|
|
6124
|
+
/* ── Parliament Boardroom 3D ── */
|
|
6125
|
+
/* Outer wrapper */
|
|
6126
|
+
.br-wrap{background:#090714;border:1.5px solid #6366f1;border-radius:14px;padding:12px 14px;margin-bottom:16px;animation:stNodeIn .35s ease forwards;overflow:hidden}
|
|
6127
|
+
/* Header: phase chip + progress */
|
|
6128
|
+
.br-header{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
|
|
6129
|
+
.br-phase-chip{font-size:10px;font-weight:800;font-family:var(--mono);letter-spacing:.3px;color:var(--pc,#6366f1);background:rgba(99,102,241,.12);border:1px solid var(--pc,rgba(99,102,241,.4));border-radius:20px;padding:3px 12px;display:inline-block;transition:color .4s,border-color .4s}
|
|
6130
|
+
.br-progress-wrap{flex:1;height:3px;background:#1a1630;border-radius:4px;overflow:hidden;min-width:60px}
|
|
6131
|
+
.br-progress-bar{height:100%;background:linear-gradient(90deg,#6366f1,#22d3ee);border-radius:4px;transition:width .5s ease;width:0%}
|
|
6132
|
+
/* Boardroom 3D scene */
|
|
6133
|
+
.br-room{position:relative;min-height:220px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:10px 8px 16px;
|
|
6134
|
+
background:linear-gradient(180deg,#141030 0%,#1c1848 50%,#141030 100%);
|
|
6135
|
+
border-radius:10px;overflow:hidden}
|
|
6136
|
+
/* Ambient ceiling glow */
|
|
6137
|
+
.br-room::before{content:"";position:absolute;inset:0;background:
|
|
6138
|
+
radial-gradient(ellipse 70% 50% at 50% 5%,rgba(180,160,255,.2) 0%,transparent 70%),
|
|
6139
|
+
radial-gradient(ellipse 30% 30% at 50% 0%,rgba(255,220,100,.12) 0%,transparent 60%);pointer-events:none}
|
|
6140
|
+
/* Floor perspective */
|
|
6141
|
+
.br-room::after{content:"";position:absolute;bottom:0;left:0;right:0;height:40px;
|
|
6142
|
+
background:linear-gradient(180deg,transparent 0%,rgba(100,80,200,.08) 50%,rgba(60,40,120,.25) 100%);
|
|
6143
|
+
border-top:1px solid rgba(100,80,200,.15);pointer-events:none}
|
|
6144
|
+
/* Center: table + orchestrator */
|
|
6145
|
+
.br-table-center{position:relative;display:flex;flex-direction:column;align-items:center;gap:0;z-index:3}
|
|
6146
|
+
/* Orchestrator standing at head of table */
|
|
6147
|
+
.br-orch{display:flex;flex-direction:column;align-items:center;gap:2px;z-index:4;position:relative}
|
|
6148
|
+
.br-orch--active .br-orch-arm-l{transform-origin:50% 0%;animation:brOrchArmL 2s ease-in-out infinite}
|
|
6149
|
+
.br-orch--active .br-orch-arm-r{transform-origin:50% 0%;animation:brOrchArmR 2.4s ease-in-out infinite}
|
|
6150
|
+
@keyframes brOrchArmL{0%,100%{transform:rotate(0deg)}40%{transform:rotate(-22deg)}70%{transform:rotate(-10deg)}}
|
|
6151
|
+
@keyframes brOrchArmR{0%,100%{transform:rotate(0deg)}30%{transform:rotate(18deg)}65%{transform:rotate(8deg)}}
|
|
6152
|
+
.br-orch--done{filter:drop-shadow(0 0 12px #22c55eaa)}
|
|
6153
|
+
.br-orch-speech{position:absolute;top:-28px;left:50%;transform:translateX(-50%);
|
|
6154
|
+
font-size:9px;font-weight:800;font-family:var(--mono);letter-spacing:.4px;
|
|
6155
|
+
padding:3px 8px;border:1.5px solid #6366f1;border-radius:8px;
|
|
6156
|
+
background:#0d0a1e;white-space:nowrap;
|
|
6157
|
+
animation:brSpeechPop .6s ease-in-out infinite alternate;z-index:5;pointer-events:none}
|
|
6158
|
+
@keyframes brSpeechPop{0%{transform:translateX(-50%) scale(1) rotate(-1deg)}100%{transform:translateX(-50%) scale(1.05) rotate(1deg)}}
|
|
6159
|
+
.br-orch-speech::after{content:"";position:absolute;top:100%;left:50%;transform:translateX(-50%);border:4px solid transparent;border-top-color:#6366f1}
|
|
6160
|
+
.br-orch-label{font-size:8px;font-family:var(--mono);font-weight:800;color:#818cf8;text-align:center;letter-spacing:.5px}
|
|
6161
|
+
/* Seats ring around table */
|
|
6162
|
+
.br-seats-ring{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;z-index:2;padding:4px 0;width:100%}
|
|
6163
|
+
/* Individual seat / cubicle */
|
|
6164
|
+
.br-seat{display:flex;flex-direction:column;align-items:center;gap:0;transition:transform .3s}
|
|
6165
|
+
.br-seat-box{display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 8px 6px;border-radius:12px;
|
|
6166
|
+
background:#1a1535;border:1.5px solid #3a3060;
|
|
6167
|
+
box-shadow:0 2px 10px rgba(0,0,0,.4),inset 0 1px 0 rgba(255,255,255,.06);
|
|
6168
|
+
transition:border-color .3s,background .3s,box-shadow .3s;position:relative;min-width:70px}
|
|
6169
|
+
.br-seat--active .br-seat-box{background:#1e1a45;border-color:var(--sc,#6366f1);box-shadow:0 0 20px rgba(99,102,241,.3),0 0 40px rgba(99,102,241,.08),inset 0 1px 0 rgba(150,130,255,.15)}
|
|
6170
|
+
.br-seat--active{transform:scale(1.04)}
|
|
6171
|
+
.br-seat--done .br-seat-box{background:#162516;border-color:#2a4a2a}
|
|
6172
|
+
/* Action bubble above agent */
|
|
6173
|
+
.br-bubble{font-size:9px;font-family:var(--mono);padding:2px 7px;border-radius:7px;border:1px solid #3a3060;background:#0d0a1e;min-height:14px;text-align:center;line-height:1.4;transition:all .3s;word-break:break-word;max-width:90px}
|
|
6174
|
+
/* Agent name */
|
|
6175
|
+
.br-seat-name{font-size:9px;font-family:var(--mono);font-weight:700;text-align:center;white-space:normal;word-break:break-word;max-width:90px;line-height:1.3;margin-top:2px;transition:color .3s}
|
|
6176
|
+
/* SVG arm animations when agent is active (typing) */
|
|
6177
|
+
.br-seat--active .br-arm-l{transform-origin:50% 100%;animation:brArmType .7s ease-in-out infinite}
|
|
6178
|
+
.br-seat--active .br-arm-r{transform-origin:50% 100%;animation:brArmType .7s ease-in-out infinite reverse}
|
|
6179
|
+
@keyframes brArmType{0%,100%{transform:rotate(-6deg) translateY(0)}50%{transform:rotate(6deg) translateY(2px)}}
|
|
6180
|
+
/* Convergence */
|
|
6181
|
+
.br-convergence{margin-top:10px;padding:8px 12px;background:rgba(34,197,94,.06);border:1px solid rgba(34,197,94,.22);border-radius:8px}
|
|
6182
|
+
.br-conv-bar-outer{height:4px;background:#1a2e1a;border-radius:4px;overflow:hidden;margin-bottom:6px}
|
|
6183
|
+
.br-conv-bar-inner{height:100%;background:linear-gradient(90deg,#22c55e,#4ade80);border-radius:4px;transition:width .8s ease}
|
|
6184
|
+
.br-conv-text{font-size:9px;color:#86efac;line-height:1.55}
|
|
6185
|
+
/* Keep old prl-* classes for workflow (not touched) */
|
|
5955
6186
|
.prl-wrap{background:#0b0918;border:1.5px solid #6366f1;border-radius:14px;padding:14px 16px 12px;margin-bottom:16px;animation:stNodeIn .35s ease forwards;overflow:hidden}
|
|
5956
6187
|
@keyframes parlPulse{0%,100%{border-color:#6366f1;box-shadow:none}50%{border-color:#818cf8;box-shadow:0 0 20px rgba(99,102,241,.3)}}
|
|
5957
6188
|
.prl-header{display:flex;align-items:center;margin-bottom:10px}
|