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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nothumanallowed",
3
- "version": "13.5.2",
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.2';
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
 
@@ -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
- // Always in normal document flow — no fixed/absolute positioning
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 il task in autonomia\x27,
4347
- r2:\x27Round 2 \u2014 Gli agenti si scambiano le analisi e le raffinano\x27,
4348
- r3:\x27Round 3 \u2014 HERALD media le posizioni divergenti\x27,
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
- // ── Build one desk+character card per agent ───────────────────────
4357
- // Character is SVG-drawn inline: head + body + arms + desk.
4358
- // Active = character types (arms animate). Done = character leans back, checkmark.
4359
- // R2 active = character holds document up and turns head.
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> &mdash; 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 Office Cartoon ── */
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}