nothumanallowed 13.5.9 → 13.5.10

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.9",
3
+ "version": "13.5.10",
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.9';
8
+ export const VERSION = '13.5.10';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -3781,121 +3781,55 @@ function isoDeskSvg(x, y, accentColor) {
3781
3781
  \x27</svg>\x27;
3782
3782
  }
3783
3783
  // Isometric JRPG sprite character — top-down 3/4 perspective, Pokemon-style
3784
+ // Agent emojis — rotate through professional/diverse set
3785
+ var AGENT_EMOJIS = [
3786
+ String.fromCodePoint(0x1F9D1,0x200D,0x1F4BB), // person at laptop
3787
+ String.fromCodePoint(0x1F469,0x200D,0x1F4BC), // woman office worker
3788
+ String.fromCodePoint(0x1F468,0x200D,0x1F4BC), // man office worker
3789
+ String.fromCodePoint(0x1F9D1,0x200D,0x1F52C), // scientist
3790
+ String.fromCodePoint(0x1F469,0x200D,0x1F4BB), // woman technologist
3791
+ String.fromCodePoint(0x1F468,0x200D,0x1F4BB), // man technologist
3792
+ String.fromCodePoint(0x1F9D1,0x200D,0x1F3A8), // artist
3793
+ String.fromCodePoint(0x1F9D1,0x200D,0x2696,0xFE0F), // judge
3794
+ ];
3795
+
3784
3796
  function isoCharSvg(opts) {
3785
- var skin = opts.skin || \x27#fbbf24\x27;
3786
- var shirt = opts.shirt || \x27#4f46e5\x27;
3787
- var hair = opts.hair || \x27#1a0e08\x27;
3788
3797
  var isActive = opts.isActive;
3789
3798
  var isDone = opts.isDone;
3790
3799
  var scale = opts.scale || 1;
3791
- var glow = isActive ? (\x27filter:drop-shadow(0 0 6px \x27+(opts.accentColor||shirt)+\x27)\x27) : (isDone ? \x27filter:drop-shadow(0 0 4px #22c55e44)\x27 : \x27\x27);
3792
- var armCls = isActive ? \x27class="prl-arm"\x27 : \x27\x27;
3793
- var headCls = isActive ? \x27class="prl-head"\x27 : \x27\x27;
3794
- var w = Math.round(48 * scale); var h = Math.round(64 * scale);
3795
- return \x27<svg viewBox="0 0 48 64" width="\x27+w+\x27" height="\x27+h+\x27" xmlns="http://www.w3.org/2000/svg" style="\x27+glow+\x27;display:block;overflow:visible">\x27+
3796
- // Shadow beneath character
3797
- \x27<ellipse cx="24" cy="62" rx="\x27+(11*scale)+\x27" ry="\x27+(4*scale)+\x27" fill="rgba(0,0,0,.3)"/>\x27+
3798
- // Legs
3799
- \x27<path d="M18 42 C17 50 16 56 15 60 C14 62 17 63 19 62 C21 61 21 56 21 50 L21 42 Z" fill="\x27+shirt+\x27cc" class="prl-master-leg-l"/>\x27+
3800
- \x27<path d="M24 42 C25 50 26 56 27 60 C28 62 25 63 23 62 C21 61 21 56 21 50 L21 42 Z" fill="\x27+shirt+\x27cc" class="prl-master-leg-r"/>\x27+
3801
- // Shoes
3802
- \x27<ellipse cx="16" cy="62" rx="4" ry="2" fill="#1a0e04" transform="rotate(-10 16 62)"/>\x27+
3803
- \x27<ellipse cx="26" cy="62" rx="4" ry="2" fill="#1a0e04" transform="rotate(10 26 62)"/>\x27+
3804
- // Body
3805
- \x27<rect x="13" y="26" width="20" height="18" rx="3" fill="\x27+shirt+\x27"/>\x27+
3806
- \x27<rect x="13" y="26" width="10" height="18" rx="3" fill="rgba(0,0,0,.1)"/>\x27+
3807
- // Collar
3808
- \x27<path d="M21 26 L18 30 L21 28 L24 30 Z" fill="\x27+skin+\x27"/>\x27+
3809
- // Arms
3810
- \x27<g \x27+armCls+\x27>\x27+
3811
- \x27<path d="M13 28 C8 30 6 35 6 39 C6 42 9 43 11 42 C13 41 13 37 14 33 Z" fill="\x27+shirt+\x27"/>\x27+
3812
- \x27<ellipse cx="7" cy="41" rx="4" ry="3" fill="\x27+skin+\x27" transform="rotate(-15 7 41)"/>\x27+
3813
- \x27<path d="M33 28 C38 30 40 35 40 39 C40 42 37 43 35 42 C33 41 33 37 32 33 Z" fill="\x27+shirt+\x27"/>\x27+
3814
- \x27<ellipse cx="39" cy="41" rx="4" ry="3" fill="\x27+skin+\x27" transform="rotate(15 39 41)"/>\x27+
3815
- \x27</g>\x27+
3816
- // Head
3817
- \x27<g \x27+headCls+\x27>\x27+
3818
- \x27<ellipse cx="21" cy="13" rx="11" ry="12" fill="\x27+skin+\x27"/>\x27+
3819
- \x27<path d="M10 13 C10 6 14 1 21 0 C28 1 32 6 32 13 C31 7 28 4 21 3 C14 4 11 7 10 13" fill="\x27+hair+\x27"/>\x27+
3820
- \x27<circle cx="16" cy="14" r="1.5" fill="#0a0a14"/>\x27+
3821
- \x27<circle cx="26" cy="14" r="1.5" fill="#0a0a14"/>\x27+
3822
- \x27<circle cx="16.7" cy="13" r=".7" fill="rgba(255,255,255,.9)"/>\x27+
3823
- (isDone ?
3824
- \x27<path d="M15 20 Q21 24 27 20" stroke="#8b4513" stroke-width="1.5" fill="none" stroke-linecap="round"/>\x27+
3825
- \x27<path d="M16 20.5 Q21 23 26 20.5 Q21 22 16 20.5" fill="#fff" opacity=".6"/>\x27
3826
- : isActive ?
3827
- \x27<path d="M15 19 Q21 21 27 19" stroke="#8b4513" stroke-width="1.4" fill="none" stroke-linecap="round"/>\x27
3828
- :
3829
- \x27<path d="M16 20 Q21 22 26 20" stroke="#8b4513" stroke-width="1.2" fill="none" stroke-linecap="round"/>\x27
3830
- )+
3831
- \x27</g>\x27+
3832
- \x27</svg>\x27;
3800
+ var accentColor = opts.accentColor || \x27#6366f1\x27;
3801
+ var idx = opts.emojiIdx || 0;
3802
+ var emoji = AGENT_EMOJIS[idx % AGENT_EMOJIS.length];
3803
+ var sz = Math.round(52 * scale);
3804
+ var glowColor = isActive ? accentColor : (isDone ? \x27#22c55e\x27 : \x27transparent\x27);
3805
+ var glowFilter = (isActive || isDone) ? (\x27filter:drop-shadow(0 0 8px \x27+glowColor+\x27aa)\x27) : \x27\x27;
3806
+ var badgeHtml = isDone
3807
+ ? \x27<div style="position:absolute;top:-4px;right:-4px;width:18px;height:18px;background:#22c55e;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;box-shadow:0 0 6px #22c55e88">&#10003;</div>\x27
3808
+ : (isActive
3809
+ ? \x27<div style="position:absolute;top:-4px;right:-4px;width:14px;height:14px;background:\x27+accentColor+\x27;border-radius:50%;animation:statusPulse 1s ease-in-out infinite;box-shadow:0 0 8px \x27+accentColor+\x27"></div>\x27
3810
+ : \x27\x27);
3811
+ var ringStyle = isActive
3812
+ ? (\x27outline:2.5px solid \x27+accentColor+\x27;box-shadow:0 0 16px \x27+accentColor+\x27AA\x27)
3813
+ : (isDone ? \x27outline:2px solid #22c55e88\x27 : \x27outline:none\x27);
3814
+ var animClass = isActive ? \x27 prl-head\x27 : \x27\x27;
3815
+ return \x27<div class="iso-char-wrap\x27+animClass+\x27" style="position:relative;display:inline-flex;align-items:center;justify-content:center;width:\x27+sz+\x27px;height:\x27+sz+\x27px;border-radius:50%;background:rgba(255,255,255,.15);\x27+ringStyle+\x27;\x27+glowFilter+\x27;transition:all .3s">\x27+
3816
+ \x27<span style="font-size:\x27+Math.round(36*scale)+\x27px;line-height:1;user-select:none">\x27+emoji+\x27</span>\x27+
3817
+ badgeHtml+
3818
+ \x27</div>\x27;
3833
3819
  }
3834
- // Orchestrator — bigger, crowned, JRPG boss sprite
3820
+ // Orchestrator — emoji-based, crowned
3835
3821
  function isoOrchSvg(hasActive, doneRatio) {
3836
- var mc = \x27#818cf8\x27;
3837
- var armCls = hasActive ? \x27class="prl-master-arm-l"\x27 : \x27\x27;
3838
- var armRCls = hasActive ? \x27class="prl-master-arm-r"\x27 : \x27\x27;
3839
- return \x27<svg viewBox="0 0 60 80" width="58" height="76" xmlns="http://www.w3.org/2000/svg" style="display:block;overflow:visible;filter:drop-shadow(0 0 10px \x27+mc+\x27aa)">\x27+
3840
- // Shadow
3841
- \x27<ellipse cx="30" cy="78" rx="16" ry="5" fill="rgba(0,0,0,.4)"/>\x27+
3842
- // Legs
3843
- \x27<path d="M24 52 C23 60 22 67 21 72 C20 75 22 76 24 76 C26 76 27 74 27 71 C28 65 28 58 28 52 Z" fill="#1e1c4a" class="prl-master-leg-l"/>\x27+
3844
- \x27<path d="M30 52 C31 60 32 67 33 72 C34 75 32 76 30 76 C28 76 27 74 27 71 C26 65 26 58 26 52 Z" fill="#1e1c4a" class="prl-master-leg-r"/>\x27+
3845
- // Shoes
3846
- \x27<ellipse cx="20" cy="74" rx="5" ry="2.5" fill="#0a0a14" transform="rotate(-8 20 74)"/>\x27+
3847
- \x27<ellipse cx="34" cy="74" rx="5" ry="2.5" fill="#0a0a14" transform="rotate(8 34 74)"/>\x27+
3848
- // Suit body
3849
- \x27<path d="M14 32 C13 30 16 27 27 25 C38 27 41 30 40 32 L41 52 L13 52 Z" fill="#252464"/>\x27+
3850
- \x27<path d="M14 32 C13 30 16 27 27 25 L27 52 L13 52 Z" fill="#1e1d52"/>\x27+
3851
- \x27<path d="M27 25 C38 27 41 30 40 32 L41 52 L27 52 Z" fill="#2a2870"/>\x27+
3852
- // Lapels
3853
- \x27<path d="M27 25 L21 33 L24 36 L27 29 Z" fill="#1a1940"/>\x27+
3854
- \x27<path d="M27 25 L33 33 L30 36 L27 29 Z" fill="#1a1940"/>\x27+
3855
- \x27<path d="M27 29 L24 36 L27 34 L30 36 Z" fill="#f0f0fa"/>\x27+
3856
- // Tie
3857
- \x27<path d="M27 33 L26 44 L27 48 L28 44 Z" fill="\x27+mc+\x27"/>\x27+
3858
- // Arms
3859
- \x27<g \x27+armCls+\x27 style="transform-origin:14px 35px">\x27+
3860
- \x27<path d="M14 35 C8 38 5 44 5 48 C5 51 8 52 10 51 C12 50 13 46 14 42 C15 39 14 36 14 35" fill="#252450"/>\x27+
3861
- \x27<ellipse cx="6" cy="51" rx="5" ry="3.5" fill="#d4a97a" transform="rotate(-15 6 51)"/>\x27+
3862
- \x27</g>\x27+
3863
- \x27<g \x27+armRCls+\x27 style="transform-origin:40px 35px">\x27+
3864
- \x27<path d="M40 35 C46 38 49 43 49 47 C49 50 46 51 44 50 C42 49 41 45 40 41 C39 38 40 36 40 35" fill="#252450"/>\x27+
3865
- // Clipboard
3866
- \x27<rect x="46" y="30" width="12" height="16" rx="2" fill="#1a1a2e" stroke="\x27+mc+\x2799" stroke-width="1.2"/>\x27+
3867
- \x27<rect x="49" y="28" width="6" height="4" rx="1" fill="\x27+mc+\x27"/>\x27+
3868
- \x27<line x1="48" y1="34" x2="56" y2="34" stroke="\x27+mc+\x27cc" stroke-width=".9"/>\x27+
3869
- \x27<line x1="48" y1="37" x2="56" y2="37" stroke="\x27+mc+\x27aa" stroke-width=".9"/>\x27+
3870
- \x27<line x1="48" y1="40" x2="54" y2="40" stroke="\x27+mc+\x2788" stroke-width=".9"/>\x27+
3871
- \x27</g>\x27+
3872
- // Neck
3873
- \x27<rect x="24" y="25" width="6" height="5" rx="2" fill="#d4a97a"/>\x27+
3874
- // Head
3875
- \x27<ellipse cx="27" cy="14" rx="13" ry="13" fill="#d4a97a"/>\x27+
3876
- \x27<path d="M14 14 C14 20 18 24 27 25 C36 24 40 20 40 14" fill="#d4a97a"/>\x27+
3877
- // Hair
3878
- \x27<path d="M14 14 C13 7 17 2 27 1 C37 2 41 7 40 14 C39 7 35 4 27 3 C19 4 15 7 14 14" fill="#1a0e08"/>\x27+
3879
- // Eyes
3880
- \x27<ellipse cx="22" cy="15" rx="3" ry="3.5" fill="#fff"/>\x27+
3881
- \x27<ellipse cx="32" cy="15" rx="3" ry="3.5" fill="#fff"/>\x27+
3882
- \x27<circle cx="22" cy="15.5" r="2" fill="#1e3a6e"/>\x27+
3883
- \x27<circle cx="32" cy="15.5" r="2" fill="#1e3a6e"/>\x27+
3884
- \x27<circle cx="22" cy="15.5" r="1.2" fill="#0a0a18"/>\x27+
3885
- \x27<circle cx="32" cy="15.5" r="1.2" fill="#0a0a18"/>\x27+
3886
- \x27<circle cx="23" cy="14" r=".8" fill="rgba(255,255,255,.9)"/>\x27+
3887
- (hasActive ?
3888
- \x27<path d="M21 21 Q27 25 33 21" stroke="#8b4513" stroke-width="1.8" fill="none" stroke-linecap="round"/>\x27+
3889
- \x27<ellipse cx="27" cy="22.5" rx="3.5" ry="2" fill="#5a1a0a" opacity=".6"/>\x27
3890
- :
3891
- \x27<path d="M21 22 Q27 25 33 22" stroke="#8b4513" stroke-width="1.6" fill="none" stroke-linecap="round"/>\x27
3892
- )+
3893
- // Crown
3894
- \x27<path d="M17 4 L20 9 L27 6 L34 9 L37 4 L27 1 Z" fill="#f59e0b"/>\x27+
3895
- \x27<circle cx="20" cy="9" r="2" fill="#fbbf24"/>\x27+
3896
- \x27<circle cx="27" cy="6" r="2" fill="#fbbf24"/>\x27+
3897
- \x27<circle cx="34" cy="9" r="2" fill="#fbbf24"/>\x27+
3898
- \x27</svg>\x27;
3822
+ void doneRatio;
3823
+ var orchEmoji = String.fromCodePoint(0x1F9D1, 0x200D, 0x1F4BC); // person in suit
3824
+ var glowColor = hasActive ? \x27#818cf8\x27 : \x27#22c55e\x27;
3825
+ var animClass = hasActive ? \x27 prl-head\x27 : \x27\x27;
3826
+ var crown = String.fromCodePoint(0x1F451); // crown emoji above
3827
+ return \x27<div class="iso-orch-wrap\x27+animClass+\x27" style="position:relative;display:inline-flex;flex-direction:column;align-items:center;gap:2px">\x27+
3828
+ \x27<span style="font-size:18px;line-height:1">\x27+crown+\x27</span>\x27+
3829
+ \x27<div style="position:relative;display:flex;align-items:center;justify-content:center;width:68px;height:68px;border-radius:50%;background:rgba(99,102,241,.15);outline:3px solid \x27+glowColor+\x27;box-shadow:0 0 20px \x27+glowColor+\x27AA">\x27+
3830
+ \x27<span style="font-size:42px;line-height:1;user-select:none">\x27+orchEmoji+\x27</span>\x27+
3831
+ \x27</div>\x27+
3832
+ \x27</div>\x27;
3899
3833
  }
3900
3834
 
3901
3835
  // Skin/shirt/hair palette per agent label
@@ -3946,9 +3880,9 @@ function renderStudioNodes() {
3946
3880
  // Bubble: only show when active (live text) or done (checkmark)
3947
3881
  var bubbleText = isActive ? \x27...lavora\x27 : (isDone ? \x27\u2714 fatto\x27 : (isErr ? \x27\u2715 errore\x27 : \x27\x27));
3948
3882
  var bubbleColor = isActive ? \x27#6366f1\x27 : (isDone ? \x27#22c55e\x27 : \x27#ef4444\x27);
3949
- var charSvg = isoCharSvg({skin: pal.skin, shirt: pal.shirt, hair: pal.hair,
3950
- isActive: isActive, isDone: isDone, scale: charScale, accentColor: accentColor});
3951
- var charW = Math.round(48 * charScale); var charH = Math.round(64 * charScale);
3883
+ void pal; // palette no longer used for character rendering
3884
+ var charSvg = isoCharSvg({emojiIdx: idx, isActive: isActive, isDone: isDone, scale: charScale, accentColor: accentColor});
3885
+ var charW = Math.round(52 * charScale); var charH = Math.round(52 * charScale);
3952
3886
 
3953
3887
  agentsHtml += \x27<div class="iso-agent" data-agent-label="\x27+esc(lbl)+\x27" style="position:absolute;left:\x27+(px-charW/2)+\x27px;top:\x27+(py-charH)+\x27px;z-index:\x27+zIdx+\x27;display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer" onclick="studioScrollToAgent(this.getAttribute(String.fromCharCode(100,97,116,97,45,97,103,101,110,116,45,108,97,98,101,108)))">\x27;
3954
3888
  // Bubble — bigger, left-aligned (no mirror issue)
@@ -4632,84 +4566,35 @@ async function runStudio() {
4632
4566
  if (!parlBlockBuilt || !pb.innerHTML.trim()) {
4633
4567
  parlBlockBuilt = true;
4634
4568
 
4635
- // Build agent seat HTML (box + avatar)
4636
- function buildSeat(prop) {
4569
+ // Build agent seat HTML (emoji avatar)
4570
+ function buildSeat(prop, seatIdx) {
4637
4571
  var lbl = prop.label || prop.agent;
4638
- var ico = prop.icon || String.fromCharCode(9632);
4639
- var skinColors = [\x27#fbbf24\x27,\x27#f97316\x27,\x27#a78bfa\x27,\x27#34d399\x27,\x27#60a5fa\x27,\x27#f472b6\x27];
4640
- var skinIdx = Math.abs(lbl.charCodeAt(0)+(lbl.charCodeAt(lbl.length-1)||0)) % skinColors.length;
4641
- var skin = skinColors[skinIdx];
4642
- var shirtC = [\x27#4f46e5\x27,\x27#0891b2\x27,\x27#7c3aed\x27,\x27#059669\x27,\x27#dc2626\x27,\x27#d97706\x27][skinIdx];
4643
- var safeLbl = lbl.replace(/[^a-zA-Z0-9_-]/g,\x27_\x27);
4644
- // Mini agent SVG (seated, top-down perspective hint)
4645
- var agentSvg = \x27<svg viewBox="0 0 44 52" width="44" height="52" xmlns="http://www.w3.org/2000/svg">\x27+
4646
- // Chair back
4647
- \x27<rect x="6" y="2" width="32" height="6" rx="3" fill="#2a2050" stroke="#3a3070" stroke-width="1"/>\x27+
4648
- // Chair seat
4649
- \x27<rect x="6" y="32" width="32" height="12" rx="3" fill="#221840" stroke="#3a3060" stroke-width="1"/>\x27+
4650
- // Body / torso
4651
- \x27<rect x="14" y="8" width="16" height="22" rx="4" fill="\x27+shirtC+\x27" opacity=".9"/>\x27+
4652
- // Head
4653
- \x27<circle cx="22" cy="5" r="7" fill="\x27+skin+\x27"/>\x27+
4654
- // Eyes
4655
- \x27<circle cx="19.5" cy="4.5" r="1.2" fill="#0a0a14"/>\x27+
4656
- \x27<circle cx="24.5" cy="4.5" r="1.2" fill="#0a0a14"/>\x27+
4657
- // Arms on desk
4658
- \x27<rect x="7" y="26" width="9" height="5" rx="2" fill="\x27+skin+\x27" class="br-arm-l"/>\x27+
4659
- \x27<rect x="28" y="26" width="9" height="5" rx="2" fill="\x27+skin+\x27" class="br-arm-r"/>\x27+
4660
- // Monitor on desk in front of agent
4661
- \x27<rect x="12" y="37" width="20" height="13" rx="2" fill="#141028" stroke="#3a3070" stroke-width="1"/>\x27+
4662
- \x27<rect x="13" y="38" width="18" height="11" rx="1" fill="rgba(90,80,180,.35)"/>\x27+
4663
- \x27<line x1="14" y1="41" x2="30" y2="41" stroke="#9090cc" stroke-width=".8" opacity=".8"/>\x27+
4664
- \x27<line x1="14" y1="44" x2="28" y2="44" stroke="#7070aa" stroke-width=".8" opacity=".6"/>\x27+
4665
- // Agent badge
4666
- \x27<circle cx="22" cy="13" r="5" fill="#0f0f1e" stroke="\x27+shirtC+\x2780" stroke-width="1.2"/>\x27+
4667
- \x27<text x="22" y="16" text-anchor="middle" font-size="6" font-family="system-ui">\x27+ico+\x27</text>\x27+
4668
- \x27</svg>\x27;
4572
+ var safeLbl = lbl.replace(new RegExp('[^a-zA-Z0-9_-]','g'),\x27_\x27);
4573
+ var emojiIdx = Math.abs(lbl.charCodeAt(0)+(lbl.charCodeAt(lbl.length-1)||0)) % AGENT_EMOJIS.length;
4574
+ var agentEmoji = AGENT_EMOJIS[emojiIdx];
4575
+ void seatIdx;
4576
+ var agentAvatar = \x27<div style="font-size:36px;line-height:1;user-select:none;filter:drop-shadow(0 2px 4px rgba(0,0,0,.3))">\x27+agentEmoji+\x27</div>\x27;
4669
4577
  return \x27<div class="br-seat" id="brseat_\x27+safeLbl+\x27" data-lbl="\x27+esc(lbl)+\x27">\x27+
4670
4578
  \x27<div class="br-seat-box">\x27+
4671
4579
  \x27<div class="br-bubble" id="brbubble_\x27+safeLbl+\x27"></div>\x27+
4672
- agentSvg+
4580
+ agentAvatar+
4673
4581
  \x27<div class="br-seat-name" id="brname_\x27+safeLbl+\x27">\x27+esc(lbl)+\x27</div>\x27+
4674
4582
  \x27</div>\x27+
4675
4583
  \x27</div>\x27;
4676
4584
  }
4677
4585
 
4678
4586
  // Arrange seats in a circle around center table
4679
- // Positions computed from CSS: use CSS custom properties per seat index
4680
4587
  var seatsHtml = proposals.map(buildSeat).join(\x27\x27);
4681
4588
 
4682
- // Orchestrator at center (standing, prominent)
4683
- 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+
4684
- // Legs
4685
- \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+
4686
- \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+
4687
- // Suit
4688
- \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+
4689
- \x27<path d="M11 26 C10 24 13 21 22 19 L22 45 L10 45 Z" fill="#1e1d52"/>\x27+
4690
- \x27<path d="M22 19 C31 21 34 24 33 26 L34 45 L22 45 Z" fill="#2a2870"/>\x27+
4691
- // Tie
4692
- \x27<path d="M22 22 L21 36 L22 40 L23 36 Z" fill="#818cf8"/>\x27+
4693
- // Arms gesturing (spread wide — presenting)
4694
- \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+
4695
- \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+
4696
- // Head
4697
- \x27<circle cx="22" cy="13" r="9" fill="#fbbf24"/>\x27+
4698
- \x27<circle cx="19" cy="12" r="1.5" fill="#0a0a14"/>\x27+
4699
- \x27<circle cx="25" cy="12" r="1.5" fill="#0a0a14"/>\x27+
4700
- \x27<circle cx="20" cy="11" r=".6" fill="rgba(255,255,255,.8)"/>\x27+
4701
- \x27<circle cx="26" cy="11" r=".6" fill="rgba(255,255,255,.8)"/>\x27+
4702
- // Mouth — speaking
4703
- \x27<path d="M18 16 Q22 20 26 16" stroke="#8b4513" stroke-width="1.6" fill="none" stroke-linecap="round"/>\x27+
4704
- // NHA badge
4705
- \x27<circle cx="16" cy="30" r="3" fill="#0d0d1e" stroke="#818cf888" stroke-width="1"/>\x27+
4706
- \x27<text x="16" y="32.5" text-anchor="middle" font-size="3.5" fill="#818cf8">N</text>\x27+
4707
- // Crown / authority marker
4708
- \x27<path d="M15 3 L17 8 L22 5 L27 8 L29 3 L22 0 Z" fill="#f59e0b"/>\x27+
4709
- \x27<circle cx="17" cy="8" r="1.5" fill="#fbbf24"/>\x27+
4710
- \x27<circle cx="22" cy="5" r="1.5" fill="#fbbf24"/>\x27+
4711
- \x27<circle cx="27" cy="8" r="1.5" fill="#fbbf24"/>\x27+
4712
- \x27</svg>\x27;
4589
+ // Orchestrator at center — emoji (crowned suit)
4590
+ var orchEmoji = String.fromCodePoint(0x1F9D1,0x200D,0x1F4BC);
4591
+ var crownEmoji = String.fromCodePoint(0x1F451);
4592
+ var orchSvgEl = crownEmoji; // crown above orchestrator emoji not SVG anymore
4593
+ var orchSvg = \x27<div style="display:flex;flex-direction:column;align-items:center;gap:2px">\x27+
4594
+ \x27<span style="font-size:22px;line-height:1">\x27+crownEmoji+\x27</span>\x27+
4595
+ \x27<div style="font-size:52px;line-height:1;filter:drop-shadow(0 0 12px #818cf8AA);user-select:none">\x27+orchEmoji+\x27</div>\x27+
4596
+ \x27</div>\x27;
4597
+ void orchSvgEl;
4713
4598
 
4714
4599
  // Center table (SVG oval)
4715
4600
  var tableSvg = \x27<svg viewBox="0 0 160 80" width="160" height="80" xmlns="http://www.w3.org/2000/svg">\x27+
@@ -5972,16 +5857,18 @@ function renderStudio(el) {
5972
5857
  '</div>' +
5973
5858
 
5974
5859
  // ── AGENT SIDEBAR ──
5975
- '<div class="studio-tools-panel">' +
5976
- // Tab bar
5977
- '<div style="display:flex;gap:0;margin-bottom:10px;border:1px solid var(--border);border-radius:6px;overflow:hidden">' +
5978
- '<button id="sideTabTools" onclick="studioSideTab(\\x27tools\\x27)" style="flex:1;padding:5px;font-size:10px;font-weight:600;background:var(--green3);color:#fff;border:none;cursor:pointer">&#128295; Tools</button>' +
5979
- '<button id="sideTabAgents" onclick="studioSideTab(\\x27agents\\x27)" style="flex:1;padding:5px;font-size:10px;font-weight:600;background:var(--bg3);color:var(--dim);border:none;cursor:pointer">&#129302; Agents</button>' +
5860
+ '<div style="display:flex;flex-direction:column;gap:12px;width:220px;flex-shrink:0;position:sticky;top:16px;align-self:flex-start">' +
5861
+ '<div class="studio-tools-panel">' +
5862
+ // Tab bar
5863
+ '<div style="display:flex;gap:0;margin-bottom:10px;border:1px solid var(--border);border-radius:6px;overflow:hidden">' +
5864
+ '<button id="sideTabTools" onclick="studioSideTab(\\x27tools\\x27)" style="flex:1;padding:5px;font-size:10px;font-weight:600;background:var(--green3);color:#fff;border:none;cursor:pointer">&#128295; Tools</button>' +
5865
+ '<button id="sideTabAgents" onclick="studioSideTab(\\x27agents\\x27)" style="flex:1;padding:5px;font-size:10px;font-weight:600;background:var(--bg3);color:var(--dim);border:none;cursor:pointer">&#129302; Agents</button>' +
5866
+ '</div>' +
5867
+ '<div style="font-size:9px;color:var(--dim);margin-bottom:8px">Click to add to pipeline</div>' +
5868
+ '<div id="sideToolsList">'+toolsHtml+'</div>' +
5869
+ '<div id="sideAgentsList" style="display:none">'+specialistHtml+'</div>' +
5980
5870
  '</div>' +
5981
- '<div style="font-size:9px;color:var(--dim);margin-bottom:8px">Click to add to pipeline</div>' +
5982
- '<div id="sideToolsList">'+toolsHtml+'</div>' +
5983
- '<div id="sideAgentsList" style="display:none">'+specialistHtml+'</div>' +
5984
- '<div id="studioSessionsBar" style="margin-top:16px;display:none"></div>' +
5871
+ '<div id="studioSessionsBar" style="display:none;border:1px solid var(--border);border-radius:10px;padding:12px;background:var(--bg2)"></div>' +
5985
5872
  '</div>' +
5986
5873
  '</div>';
5987
5874
 
@@ -6652,13 +6539,18 @@ input:focus,textarea:focus{border-color:var(--green3)}
6652
6539
  @keyframes statusPulse{0%,100%{opacity:.7;border-color:rgba(99,102,241,.3)}50%{opacity:1;border-color:rgba(99,102,241,.7);box-shadow:0 0 8px rgba(99,102,241,.3)}}
6653
6540
  .iso-status-dot{width:6px;height:6px;border-radius:50%;background:#6366f1;animation:dotBounce 1s ease-in-out infinite}
6654
6541
  .iso-agent{transition:filter .3s}
6655
- .iso-agent:hover{filter:brightness(1.15)}
6542
+ .iso-agent:hover{filter:brightness(1.1) saturate(1.2)}
6543
+ .iso-char-wrap{transition:transform .2s,box-shadow .3s}
6544
+ .iso-char-wrap.prl-head{animation:isoCharBob 1.2s ease-in-out infinite}
6545
+ @keyframes isoCharBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
6546
+ .iso-orch-wrap{transition:transform .2s}
6547
+ .iso-orch-wrap.prl-head{animation:isoCharBob 1.4s ease-in-out infinite}
6656
6548
  /* Thought bubble / speech bubble above character */
6657
6549
  .iso-bubble{font-size:8px;font-family:var(--mono);padding:2px 7px;border-radius:10px 10px 10px 2px;border:1px solid #3a3060;background:rgba(10,8,20,.85);color:#6b7280;white-space:nowrap;max-width:110px;overflow:hidden;text-overflow:ellipsis;line-height:1.4;transition:all .25s;pointer-events:none;backdrop-filter:blur(4px)}
6658
6550
  .iso-bubble--active{background:rgba(30,20,60,.9);border-color:#6366f1;color:#a5b4fc;animation:isoBubblePop .35s ease;white-space:normal;max-width:110px;word-break:break-word;line-height:1.35}
6659
6551
  .iso-bubble--orch{font-size:9px;padding:3px 9px;border-radius:12px;border-color:#818cf8;color:#a5b4fc;background:rgba(20,15,50,.9)}
6660
6552
  @keyframes isoBubblePop{0%{transform:scale(.8) translateY(4px);opacity:.4}100%{transform:scale(1) translateY(0);opacity:1}}
6661
- .iso-name{font-size:8px;font-family:var(--mono);font-weight:700;letter-spacing:.3px;text-align:center;max-width:80px;white-space:normal;word-break:break-word;line-height:1.3;text-shadow:0 1px 4px rgba(0,0,0,.8);pointer-events:none}
6553
+ .iso-name{font-size:10px;font-family:var(--mono);font-weight:700;letter-spacing:.3px;text-align:center;max-width:90px;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)}
6662
6554
  /* Desks row — kept for boardroom compat */
6663
6555
  .prl-desks-row{display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;position:relative;z-index:2;padding-bottom:8px}
6664
6556
  .prl-desk{display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 6px 4px;border-radius:12px;background:#1a1535;border:1.5px solid #3a3060;transition:border-color .4s,background .4s,box-shadow .4s;position:relative;min-width:80px;box-shadow:0 2px 8px rgba(0,0,0,.3),inset 0 1px 0 rgba(255,255,255,.06)}
@@ -6734,7 +6626,7 @@ input:focus,textarea:focus{border-color:var(--green3)}
6734
6626
  .studio-result__body{font-size:13px;color:var(--text);word-wrap:break-word;line-height:1.7}
6735
6627
  .studio-example-btn{display:inline-block;padding:5px 12px;border:1px solid var(--border2);border-radius:20px;font-size:10px;color:var(--dim);cursor:pointer;background:none;margin:0 4px 6px 0;transition:all .15s}
6736
6628
  .studio-example-btn:hover{border-color:var(--green3);color:var(--green);background:var(--greendim)}
6737
- .studio-tools-panel{width:220px;flex-shrink:0;border:1px solid var(--border);border-radius:10px;padding:12px;background:var(--bg2);max-height:calc(100vh - 120px);overflow-y:auto;position:sticky;top:16px}
6629
+ .studio-tools-panel{width:100%;border:1px solid var(--border);border-radius:10px;padding:12px;background:var(--bg2);max-height:calc(100vh - 200px);overflow-y:auto}
6738
6630
  .studio-tool-item{display:flex;align-items:flex-start;gap:8px;padding:8px;border-radius:6px;cursor:pointer;transition:background .15s;margin-bottom:4px}
6739
6631
  .studio-tool-item:hover{background:var(--bg3);border-radius:6px}
6740
6632
  .studio-tool-icon{font-size:16px;flex-shrink:0;margin-top:1px}