nothumanallowed 13.5.1 → 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 +400 -166
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
|
@@ -3465,11 +3465,11 @@ function buildWorkflowChar(n) {
|
|
|
3465
3465
|
\x27<line x1="22" y1="41" x2="43" y2="41" stroke="#22c55e44" stroke-width="1" stroke-linecap="round"/>\x27
|
|
3466
3466
|
:
|
|
3467
3467
|
// Idle: dim standby screen — agent is waiting, screen lit but quiet
|
|
3468
|
-
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="rgba(
|
|
3469
|
-
\x27<line x1="22" y1="33" x2="46" y2="33" stroke="#
|
|
3470
|
-
\x27<line x1="22" y1="36" x2="38" y2="36" stroke="#
|
|
3471
|
-
\x27<line x1="22" y1="39" x2="44" y2="39" stroke="#
|
|
3472
|
-
\x27<line x1="22" y1="42" x2="34" y2="42" stroke="#
|
|
3468
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="rgba(90,80,180,.35)"/>\x27+
|
|
3469
|
+
\x27<line x1="22" y1="33" x2="46" y2="33" stroke="#9090cc" stroke-width="1" stroke-linecap="round" opacity=".8"/>\x27+
|
|
3470
|
+
\x27<line x1="22" y1="36" x2="38" y2="36" stroke="#8080bb" stroke-width="1" stroke-linecap="round" opacity=".65"/>\x27+
|
|
3471
|
+
\x27<line x1="22" y1="39" x2="44" y2="39" stroke="#7070aa" stroke-width="1" stroke-linecap="round" opacity=".5"/>\x27+
|
|
3472
|
+
\x27<line x1="22" y1="42" x2="34" y2="42" stroke="#6060a0" stroke-width="1" stroke-linecap="round" opacity=".4"/>\x27+
|
|
3473
3473
|
// Standby dot — blinking cursor
|
|
3474
3474
|
\x27<circle cx="22" cy="45" r="1" fill="#6366f1" opacity=".6" class="prl-doc-hold"/>\x27
|
|
3475
3475
|
)+
|
|
@@ -3598,7 +3598,9 @@ function officeRoomDecor() {
|
|
|
3598
3598
|
\x27<div class="prl-office-window-light"></div>\x27+
|
|
3599
3599
|
\x27<div class="prl-office-frame"></div>\x27+
|
|
3600
3600
|
\x27<div class="prl-office-frame2"></div>\x27+
|
|
3601
|
+
\x27<div class="prl-office-poster"></div>\x27+
|
|
3601
3602
|
\x27<div class="prl-office-lamp"></div>\x27+
|
|
3603
|
+
\x27<div class="prl-office-lamp2"></div>\x27+
|
|
3602
3604
|
\x27<div class="prl-office-plant">\x27+plantSvg+\x27</div>\x27+
|
|
3603
3605
|
\x27<div class="prl-office-plant2">\x27+plant2Svg+\x27</div>\x27;
|
|
3604
3606
|
}
|
|
@@ -3715,17 +3717,17 @@ function renderStudioNodes() {
|
|
|
3715
3717
|
? (\x27<div class="wf-sbraita-bubble">\x27+sbraitaText+\x27</div>\x27)
|
|
3716
3718
|
: \x27\x27;
|
|
3717
3719
|
|
|
3720
|
+
// Phase label
|
|
3721
|
+
var doneCount = studioState.nodes.filter(function(n){return n.status===\x27done\x27;}).length;
|
|
3722
|
+
var totalCount = studioState.nodes.length;
|
|
3723
|
+
var wfMasterAnim = hasActive ? \x27prl-master-walk\x27 : (doneCount===totalCount && totalCount>0 ? \x27prl-master-done\x27 : \x27prl-master-walk\x27);
|
|
3718
3724
|
var masterWfHtml = showMaster ? (
|
|
3719
|
-
\x27<div class="prl-master
|
|
3725
|
+
\x27<div class="prl-master \x27+wfMasterAnim+\x27 wf-master" style="bottom:20px">\x27+
|
|
3720
3726
|
bubbleHtml+
|
|
3721
3727
|
masterSvg2+
|
|
3722
3728
|
\x27<div class="prl-master-label" style="color:\x27+masterColor3+\x27;font-size:8px">Orchestratore</div>\x27+
|
|
3723
3729
|
\x27</div>\x27
|
|
3724
3730
|
) : \x27\x27;
|
|
3725
|
-
|
|
3726
|
-
// Phase label
|
|
3727
|
-
var doneCount = studioState.nodes.filter(function(n){return n.status===\x27done\x27;}).length;
|
|
3728
|
-
var totalCount = studioState.nodes.length;
|
|
3729
3731
|
var phaseLabel2 = hasActive
|
|
3730
3732
|
? (\x27Workflow in esecuzione \u2014 \x27+doneCount+\x27/\x27+totalCount+\x27 completati\x27)
|
|
3731
3733
|
: (doneCount===totalCount && totalCount>0 ? \x27Workflow completato\x27 : \x27Workflow pianificato\x27);
|
|
@@ -4076,53 +4078,59 @@ function downloadStudioPDF() {
|
|
|
4076
4078
|
'</div>' +
|
|
4077
4079
|
'</body></html>';
|
|
4078
4080
|
|
|
4079
|
-
// ── Generate PDF via
|
|
4080
|
-
//
|
|
4081
|
-
//
|
|
4082
|
-
//
|
|
4083
|
-
//
|
|
4084
|
-
//
|
|
4085
|
-
// - -webkit-print-color-adjust:exact for gradient headers and charts
|
|
4086
|
-
// This approach never cuts text in the middle of a paragraph.
|
|
4081
|
+
// ── Generate PDF via hidden in-page iframe ─────────────────────────────────
|
|
4082
|
+
// Uses a hidden iframe instead of window.open() to avoid popup blockers.
|
|
4083
|
+
// The iframe loads the full report HTML (with Chart.js), waits for charts to
|
|
4084
|
+
// render, then calls contentWindow.print() — browser handles all page breaks
|
|
4085
|
+
// via the @media print block already in NHA_CSS (break-inside:avoid, etc.)
|
|
4086
|
+
// User gets the native "Save as PDF" dialog from the browser print dialog.
|
|
4087
4087
|
function doGeneratePdf() {
|
|
4088
4088
|
var btn2 = document.getElementById('studioInlinePdfBtn');
|
|
4089
4089
|
var dlBtn2 = document.querySelector('button[onclick="downloadStudioPDF()"]');
|
|
4090
4090
|
function setBusy(b) {
|
|
4091
|
-
if (btn2) { btn2.disabled = b; btn2.textContent = b ? '
|
|
4092
|
-
if (dlBtn2) { dlBtn2.disabled = b; dlBtn2.textContent = b ? '
|
|
4091
|
+
if (btn2) { btn2.disabled = b; btn2.textContent = b ? 'Generando PDF...' : '\u2913 PDF'; }
|
|
4092
|
+
if (dlBtn2) { dlBtn2.disabled = b; dlBtn2.textContent = b ? 'Generando PDF...' : '\u2913 Download PDF'; }
|
|
4093
4093
|
}
|
|
4094
4094
|
setBusy(true);
|
|
4095
4095
|
|
|
4096
|
-
//
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
var
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4104
|
-
|
|
4105
|
-
|
|
4106
|
-
|
|
4107
|
-
}
|
|
4108
|
-
printWin.document.open();
|
|
4109
|
-
printWin.document.write(html);
|
|
4110
|
-
printWin.document.close();
|
|
4111
|
-
// Wait for Chart.js to render all charts before printing
|
|
4112
|
-
// (charts need ~500ms after DOMContentLoaded for animation frame)
|
|
4113
|
-
printWin.onload = function() {
|
|
4096
|
+
// Remove any previous print iframe
|
|
4097
|
+
var oldIframe = document.getElementById('nhaPrintFrame');
|
|
4098
|
+
if (oldIframe) oldIframe.remove();
|
|
4099
|
+
|
|
4100
|
+
var iframe = document.createElement('iframe');
|
|
4101
|
+
iframe.id = 'nhaPrintFrame';
|
|
4102
|
+
iframe.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:900px;height:700px;border:none;opacity:0;pointer-events:none';
|
|
4103
|
+
|
|
4104
|
+
// Set up onload BEFORE appending — avoids WebKit race condition
|
|
4105
|
+
iframe.onload = function() {
|
|
4106
|
+
// Wait for Chart.js to initialize all charts (needs ~800ms for animation frames)
|
|
4114
4107
|
setTimeout(function() {
|
|
4115
|
-
|
|
4116
|
-
|
|
4108
|
+
try {
|
|
4109
|
+
iframe.contentWindow.focus();
|
|
4110
|
+
iframe.contentWindow.print();
|
|
4111
|
+
} catch(e2) {
|
|
4112
|
+
// Cross-origin fallback should not happen since we write the content
|
|
4113
|
+
}
|
|
4117
4114
|
setBusy(false);
|
|
4118
|
-
//
|
|
4119
|
-
setTimeout(function(){ try {
|
|
4120
|
-
},
|
|
4115
|
+
// Remove iframe after print dialog closes (delayed to allow Safari)
|
|
4116
|
+
setTimeout(function(){ try { iframe.remove(); } catch(e3){} }, 8000);
|
|
4117
|
+
}, 800);
|
|
4121
4118
|
};
|
|
4122
|
-
|
|
4123
|
-
|
|
4124
|
-
|
|
4125
|
-
|
|
4119
|
+
|
|
4120
|
+
document.body.appendChild(iframe);
|
|
4121
|
+
|
|
4122
|
+
// Write HTML into iframe document
|
|
4123
|
+
try {
|
|
4124
|
+
iframe.contentDocument.open();
|
|
4125
|
+
iframe.contentDocument.write(html);
|
|
4126
|
+
iframe.contentDocument.close();
|
|
4127
|
+
} catch(e4) {
|
|
4128
|
+
// If contentDocument write fails (very rare), fall back to srcdoc
|
|
4129
|
+
iframe.srcdoc = html;
|
|
4130
|
+
}
|
|
4131
|
+
|
|
4132
|
+
// Safety fallback: if onload never fires (e.g. Safari blank srcdoc), force after 3s
|
|
4133
|
+
setTimeout(function() { setBusy(false); }, 5000);
|
|
4126
4134
|
}
|
|
4127
4135
|
doGeneratePdf();
|
|
4128
4136
|
}
|
|
@@ -4320,49 +4328,236 @@ async function runStudio() {
|
|
|
4320
4328
|
var parlActiveAgent = null;
|
|
4321
4329
|
var parlDoneAgents = {};
|
|
4322
4330
|
|
|
4331
|
+
// ── Parliament boardroom: first call builds DOM, subsequent calls only update state ──
|
|
4332
|
+
var parlBlockBuilt = false;
|
|
4333
|
+
|
|
4323
4334
|
function renderParlBlock(phase, activeLabel, convergence) {
|
|
4324
4335
|
var pb = document.getElementById(\x27studioParliamentBlock\x27);
|
|
4325
4336
|
if (!pb) return;
|
|
4326
4337
|
pb.style.display = \x27block\x27;
|
|
4327
|
-
if (convergence != null) {
|
|
4328
|
-
// Deliberation complete — return to normal flow, anchored in place
|
|
4329
|
-
pb.style.position = \x27\x27; pb.style.bottom = \x27\x27; pb.style.left = \x27\x27;
|
|
4330
|
-
pb.style.transform = \x27\x27; pb.style.width = \x27\x27;
|
|
4331
|
-
pb.style.top = \x27\x27; pb.style.zIndex = \x27\x27; pb.style.boxShadow = \x27\x27;
|
|
4332
|
-
pb.style.maxWidth = \x27\x27;
|
|
4333
|
-
} else {
|
|
4334
|
-
// Fixed overlay at bottom of viewport so it never scrolls away
|
|
4335
|
-
pb.style.position = \x27fixed\x27;
|
|
4336
|
-
pb.style.bottom = \x2716px\x27;
|
|
4337
|
-
pb.style.left = \x2750%\x27;
|
|
4338
|
-
pb.style.transform = \x27translateX(-50%)\x27;
|
|
4339
|
-
pb.style.width = \x27calc(100vw - 32px)\x27;
|
|
4340
|
-
pb.style.maxWidth = \x27860px\x27;
|
|
4341
|
-
pb.style.top = \x27\x27;
|
|
4342
|
-
pb.style.zIndex = \x271010\x27;
|
|
4343
|
-
pb.style.boxShadow = \x270 8px 40px rgba(99,102,241,.5),0 2px 0 rgba(99,102,241,.2)\x27;
|
|
4344
|
-
}
|
|
4345
4338
|
|
|
4346
|
-
// ── OFFICE CARTOON ANIMATION ─────────────────────────────────────────
|
|
4347
|
-
// Each agent = a character at a desk doing visible work.
|
|
4348
|
-
// Documents fly between agents during R2. MASTER walks around in R1.
|
|
4349
4339
|
var phaseColor = {r1:\x27#6366f1\x27,r2:\x27#22d3ee\x27,r3:\x27#f59e0b\x27,done:\x27#22c55e\x27}[phase]||\x27#6366f1\x27;
|
|
4350
4340
|
var phaseLabel = {
|
|
4351
|
-
r1:\x27Round 1 \u2014 Ogni agente analizza
|
|
4352
|
-
r2:\x27Round 2 \u2014
|
|
4353
|
-
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,
|
|
4354
4344
|
done:\x27Deliberazione completata\x27
|
|
4355
4345
|
}[phase]||\x27\x27;
|
|
4356
|
-
|
|
4357
4346
|
var n = proposals.length;
|
|
4358
4347
|
var doneCount = Object.keys(parlDoneAgents).length;
|
|
4359
4348
|
var progressPct = n > 0 ? Math.round(doneCount / n * 100) : 0;
|
|
4360
4349
|
|
|
4361
|
-
//
|
|
4362
|
-
//
|
|
4363
|
-
//
|
|
4364
|
-
//
|
|
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;
|
|
4365
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) ──────────
|
|
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 ────────────────
|
|
4366
4561
|
function buildChar(prop, isDone, isActive, isOrchestratorTarget) {
|
|
4367
4562
|
var lbl = prop.label || prop.agent;
|
|
4368
4563
|
var ico = prop.icon || String.fromCharCode(9632);
|
|
@@ -4370,9 +4565,9 @@ async function runStudio() {
|
|
|
4370
4565
|
var skinColors = [\x27#fbbf24\x27,\x27#f97316\x27,\x27#a78bfa\x27,\x27#34d399\x27,\x27#60a5fa\x27,\x27#f472b6\x27];
|
|
4371
4566
|
var skinIdx = Math.abs(lbl.charCodeAt(0)+lbl.charCodeAt(lbl.length-1)) % skinColors.length;
|
|
4372
4567
|
var skin = skinColors[skinIdx];
|
|
4373
|
-
var deskColor = isDone ? \x27#
|
|
4374
|
-
var deskBorder = isDone ? \x27#22c55e\x27 : (isActive ? phaseColor : \x27#
|
|
4375
|
-
var shadow = isActive ? (\x270 0 18px \x27+phaseColor+\
|
|
4568
|
+
var deskColor = isDone ? \x27#253a25\x27 : (isActive ? \x27#282050\x27 : \x27#221c44\x27);
|
|
4569
|
+
var deskBorder = isDone ? \x27#22c55e\x27 : (isActive ? phaseColor : \x27#4a3880\x27);
|
|
4570
|
+
var shadow = isActive ? (\x270 0 18px \x27+phaseColor+\x2755\x27) : \x27none\x27;
|
|
4376
4571
|
|
|
4377
4572
|
// Action text shown above character
|
|
4378
4573
|
var actionStr = \x27\x27;
|
|
@@ -4459,15 +4654,15 @@ async function runStudio() {
|
|
|
4459
4654
|
\x27<line x1="22" y1="41" x2="43" y2="41" stroke="#22c55e44" stroke-width="1" stroke-linecap="round"/>\x27
|
|
4460
4655
|
:
|
|
4461
4656
|
// Idle: dim standby screen — waiting, lit but quiet
|
|
4462
|
-
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="rgba(
|
|
4463
|
-
\x27<line x1="22" y1="33" x2="46" y2="33" stroke="#
|
|
4464
|
-
\x27<line x1="22" y1="36" x2="38" y2="36" stroke="#
|
|
4465
|
-
\x27<line x1="22" y1="39" x2="44" y2="39" stroke="#
|
|
4466
|
-
\x27<line x1="22" y1="42" x2="34" y2="42" stroke="#
|
|
4657
|
+
\x27<rect x="20" y="29" width="30" height="18" rx="2" fill="rgba(90,80,180,.35)"/>\x27+
|
|
4658
|
+
\x27<line x1="22" y1="33" x2="46" y2="33" stroke="#9090cc" stroke-width="1" stroke-linecap="round" opacity=".8"/>\x27+
|
|
4659
|
+
\x27<line x1="22" y1="36" x2="38" y2="36" stroke="#8080bb" stroke-width="1" stroke-linecap="round" opacity=".65"/>\x27+
|
|
4660
|
+
\x27<line x1="22" y1="39" x2="44" y2="39" stroke="#7070aa" stroke-width="1" stroke-linecap="round" opacity=".5"/>\x27+
|
|
4661
|
+
\x27<line x1="22" y1="42" x2="34" y2="42" stroke="#6060a0" stroke-width="1" stroke-linecap="round" opacity=".4"/>\x27+
|
|
4467
4662
|
\x27<circle cx="22" cy="45" r="1" fill="#6366f1" opacity=".6" class="prl-doc-hold"/>\x27
|
|
4468
4663
|
)+
|
|
4469
4664
|
// Monitor camera dot
|
|
4470
|
-
\x27<circle cx="35" cy="28.2" r=".9" fill="\x27+(isActive?phaseColor:(isDone?\x27#22c55e\x27:\x27#
|
|
4665
|
+
\x27<circle cx="35" cy="28.2" r=".9" fill="\x27+(isActive?phaseColor:(isDone?\x27#22c55e\x27:\x27#6060c8\x27))+\x27"/>\x27+
|
|
4471
4666
|
// ════ KEYBOARD (detailed, realistic) ════
|
|
4472
4667
|
\x27<rect x="13" y="48" width="36" height="7" rx="2.5" fill="#0c0c1e" stroke="#202036" stroke-width="1"/>\x27+
|
|
4473
4668
|
// Key rows
|
|
@@ -4609,7 +4804,7 @@ async function runStudio() {
|
|
|
4609
4804
|
// In R3: stands center with lightning bolt.
|
|
4610
4805
|
var masterIcon = phase===\x27r3\x27 ? \x27\u26a1\x27 : (phase===\x27done\x27 ? \x27\u2714\x27 : \x27\u2666\x27);
|
|
4611
4806
|
var masterColor2 = {r1:\x27#818cf8\x27,r2:\x27#818cf8\x27,r3:\x27#f59e0b\x27,done:\x27#22c55e\x27}[phase]||\x27#818cf8\x27;
|
|
4612
|
-
var masterAnim = (phase===\x27r1\x27) ? \x27prl-master-walk\x27 : (phase===\x27r2\x27 ? \x27prl-master-supervise\x27 : \x27\x27);
|
|
4807
|
+
var masterAnim = (phase===\x27r1\x27) ? \x27prl-master-walk\x27 : (phase===\x27r2\x27 ? \x27prl-master-supervise\x27 : (phase===\x27done\x27 ? \x27prl-master-done\x27 : \x27prl-master-walk\x27));
|
|
4613
4808
|
var masterSvg = \x27<svg viewBox="0 0 60 90" width="56" height="86" xmlns="http://www.w3.org/2000/svg" font-family="system-ui,sans-serif" style="filter:drop-shadow(0 0 12px \x27+masterColor2+\x27aa)">\x27+
|
|
4614
4809
|
// ════ LEGS (walking when R1) ════
|
|
4615
4810
|
// Left leg — trouser
|
|
@@ -4772,37 +4967,6 @@ async function runStudio() {
|
|
|
4772
4967
|
flyingDocHtml += \x27</div>\x27;
|
|
4773
4968
|
}
|
|
4774
4969
|
|
|
4775
|
-
// ── Assemble agent desks row ──────────────────────────────────────
|
|
4776
|
-
var desksHtml = proposals.map(function(prop) {
|
|
4777
|
-
var lbl = prop.label || prop.agent;
|
|
4778
|
-
return buildChar(prop, !!parlDoneAgents[lbl], lbl===activeLabel, false);
|
|
4779
|
-
}).join(\x27\x27);
|
|
4780
|
-
|
|
4781
|
-
var convergenceHtml = convergence != null
|
|
4782
|
-
? (\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+
|
|
4783
|
-
\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)
|
|
4784
|
-
: (\x27<div class="prl-progress"><div class="prl-progress__bar" style="width:\x27+progressPct+\x27%"></div></div>\x27);
|
|
4785
|
-
|
|
4786
|
-
pb.innerHTML =
|
|
4787
|
-
\x27<div class="prl-wrap">\x27+
|
|
4788
|
-
\x27<div class="prl-header"><span class="prl-phase-chip" style="--pc:\x27+phaseColor+\x27">\x27+phaseLabel+\x27</span></div>\x27+
|
|
4789
|
-
\x27<div class="prl-office">\x27+
|
|
4790
|
-
officeRoomDecor()+
|
|
4791
|
-
\x27<div class="prl-office-floor"></div>\x27+
|
|
4792
|
-
\x27<div class="prl-desks-row" style="position:relative;z-index:2">\x27+desksHtml+\x27</div>\x27+
|
|
4793
|
-
masterHtml+
|
|
4794
|
-
flyingDocHtml+
|
|
4795
|
-
\x27</div>\x27+
|
|
4796
|
-
convergenceHtml+
|
|
4797
|
-
\x27</div>\x27;
|
|
4798
|
-
|
|
4799
|
-
// Force Safari compositing repaint
|
|
4800
|
-
void pb.offsetHeight;
|
|
4801
|
-
pb.style.transform = \x27translateZ(0)\x27;
|
|
4802
|
-
requestAnimationFrame(function(){
|
|
4803
|
-
pb.style.opacity = \x270.99\x27;
|
|
4804
|
-
requestAnimationFrame(function(){ pb.style.opacity = \x271\x27; });
|
|
4805
|
-
});
|
|
4806
4970
|
}
|
|
4807
4971
|
|
|
4808
4972
|
// Show initial R1 block and scroll into view
|
|
@@ -5943,7 +6107,7 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
5943
6107
|
.studio-arrow--done{color:#22c55e}
|
|
5944
6108
|
/* ── Workflow scene (office layout, replaces cramped pill nodes) ── */
|
|
5945
6109
|
.studio-canvas{background:none!important;border:none!important;padding:0!important;margin-bottom:0!important}
|
|
5946
|
-
#studioNodes .prl-office{border-radius:10px;border:1px solid rgba(99,102,241,.25);
|
|
6110
|
+
#studioNodes .prl-office{border-radius:10px;border:1px solid rgba(99,102,241,.25);margin-bottom:16px;min-height:200px;padding:16px 12px 12px;position:relative;overflow:hidden}
|
|
5947
6111
|
.wf-office{display:block}
|
|
5948
6112
|
.wf-desks-row{display:flex;align-items:flex-end;justify-content:center;gap:6px;flex-wrap:wrap;padding-bottom:10px}
|
|
5949
6113
|
.wf-desk{position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;cursor:pointer;transition:opacity .2s}
|
|
@@ -5957,52 +6121,120 @@ input:focus,textarea:focus{border-color:var(--green3)}
|
|
|
5957
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}
|
|
5958
6122
|
.wf-sbraita-bubble::after{content:"";position:absolute;top:100%;left:50%;transform:translateX(-50%);border:5px solid transparent;border-top-color:#ef4444}
|
|
5959
6123
|
@keyframes sbraitaPop{0%{transform:translateX(-50%) scale(1) rotate(-2deg)}100%{transform:translateX(-50%) scale(1.06) rotate(2deg)}}
|
|
5960
|
-
/* ── Parliament
|
|
5961
|
-
|
|
5962
|
-
|
|
5963
|
-
|
|
5964
|
-
|
|
5965
|
-
|
|
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) */
|
|
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}
|
|
5966
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)}}
|
|
5967
6188
|
.prl-header{display:flex;align-items:center;margin-bottom:10px}
|
|
5968
6189
|
.prl-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 rgba(99,102,241,.35);border-radius:20px;padding:3px 12px;display:inline-block}
|
|
5969
|
-
/* Office
|
|
5970
|
-
.prl-office{position:relative;min-height:
|
|
5971
|
-
background:linear-gradient(180deg,#
|
|
5972
|
-
/* Back wall —
|
|
6190
|
+
/* ── Office room — bright, lit, full scene ── */
|
|
6191
|
+
.prl-office{position:relative;min-height:160px;display:flex;align-items:flex-end;padding:0 0 14px 0;overflow:hidden;border-radius:10px;
|
|
6192
|
+
background:linear-gradient(180deg,#1a1440 0%,#221a52 40%,#2a2060 70%,#1e1a42 100%)}
|
|
6193
|
+
/* Back wall — ambient light from ceiling + panel lines */
|
|
5973
6194
|
.prl-office::before{content:"";position:absolute;inset:0;background:
|
|
5974
|
-
|
|
5975
|
-
linear-gradient(
|
|
5976
|
-
/* Floor — parquet
|
|
5977
|
-
.prl-office-floor{position:absolute;bottom:0;left:0;right:0;height:
|
|
5978
|
-
background:repeating-linear-gradient(90deg,#
|
|
5979
|
-
border-top:
|
|
5980
|
-
/*
|
|
5981
|
-
.prl-office-window{position:absolute;top:
|
|
5982
|
-
.prl-office-window::before{content:"";
|
|
5983
|
-
|
|
5984
|
-
/*
|
|
5985
|
-
|
|
5986
|
-
|
|
5987
|
-
|
|
5988
|
-
|
|
5989
|
-
.prl-office-
|
|
6195
|
+
radial-gradient(ellipse 80% 60% at 50% 0%,rgba(180,160,255,.18) 0%,transparent 70%),
|
|
6196
|
+
repeating-linear-gradient(90deg,transparent,transparent 79px,rgba(255,255,255,.04) 80px);pointer-events:none;z-index:0}
|
|
6197
|
+
/* Floor — warm parquet with shine */
|
|
6198
|
+
.prl-office-floor{position:absolute;bottom:0;left:0;right:0;height:16px;
|
|
6199
|
+
background:repeating-linear-gradient(90deg,#2a1c10 0px,#3d2a18 40px,#2c1e12 41px,#2a1c10 80px);
|
|
6200
|
+
border-top:2px solid rgba(180,120,60,.3);box-shadow:0 -1px 0 rgba(255,200,100,.08),inset 0 2px 4px rgba(255,180,80,.06);z-index:1}
|
|
6201
|
+
/* THREE centered windows — sky blue with sunlight */
|
|
6202
|
+
.prl-office-window{position:absolute;top:4px;left:50%;transform:translateX(-50%);width:120px;height:52px;display:flex;gap:4px;z-index:1;pointer-events:none}
|
|
6203
|
+
.prl-office-window::before,.prl-office-window::after{content:"";flex:1;background:linear-gradient(180deg,#7ecfff 0%,#a8e4ff 40%,#c8f0ff 100%);border:1.5px solid #4a8fbb;border-radius:3px;
|
|
6204
|
+
box-shadow:inset 0 0 8px rgba(255,255,255,.4),0 0 16px rgba(100,200,255,.25);position:relative}
|
|
6205
|
+
/* Center divider of each window pane */
|
|
6206
|
+
/* Sunlight shafts from windows */
|
|
6207
|
+
.prl-office-window-light{position:absolute;top:0;left:50%;transform:translateX(-50%);width:200px;height:100%;
|
|
6208
|
+
background:linear-gradient(175deg,rgba(200,240,255,.12) 0%,rgba(180,220,255,.06) 30%,transparent 60%);pointer-events:none;z-index:1}
|
|
6209
|
+
/* Chandelier hanging from ceiling — center */
|
|
6210
|
+
.prl-office-lamp{position:absolute;top:0;left:50%;transform:translateX(-50%);width:4px;height:18px;background:rgba(255,220,150,.3);z-index:3}
|
|
6211
|
+
.prl-office-lamp::before{content:"";position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:32px;height:14px;border-radius:50%;background:radial-gradient(ellipse,rgba(255,220,100,.5) 0%,rgba(255,180,50,.2) 60%,transparent 100%);box-shadow:0 0 30px rgba(255,200,80,.5),0 0 60px rgba(255,200,80,.2),0 0 100px rgba(255,200,80,.08)}
|
|
6212
|
+
.prl-office-lamp::after{content:"";position:absolute;bottom:-2px;left:50%;transform:translateX(-50%);width:20px;height:10px;background:radial-gradient(ellipse,rgba(255,220,150,.8) 0%,rgba(255,200,100,.4) 50%,transparent 100%);border-radius:50%;filter:blur(3px)}
|
|
6213
|
+
/* Standing lamp (floor lamp) — right side */
|
|
6214
|
+
.prl-office-lamp2{position:absolute;bottom:14px;right:28px;width:3px;height:44px;background:linear-gradient(180deg,#4a4060 0%,#3a3050 100%);border-radius:2px;z-index:2}
|
|
6215
|
+
.prl-office-lamp2::before{content:"";position:absolute;top:-6px;left:50%;transform:translateX(-50%);width:18px;height:10px;background:linear-gradient(135deg,#4a4060,#6a6080);border-radius:3px 3px 0 0;box-shadow:0 -4px 20px rgba(255,220,150,.4),0 -2px 40px rgba(255,200,80,.2)}
|
|
6216
|
+
.prl-office-lamp2::after{content:"";position:absolute;top:-3px;left:50%;transform:translateX(-50%);width:22px;height:16px;background:radial-gradient(ellipse,rgba(255,220,120,.6) 0%,rgba(255,200,80,.2) 60%,transparent 100%);border-radius:50%;filter:blur(4px)}
|
|
6217
|
+
/* Wall art frames — left+center+right */
|
|
6218
|
+
.prl-office-frame{position:absolute;top:6px;right:8px;width:30px;height:22px;border:2px solid rgba(180,160,255,.4);border-radius:2px;background:linear-gradient(135deg,#2a1060,#103060);box-shadow:0 2px 6px rgba(0,0,0,.4),inset 0 0 6px rgba(150,100,255,.15);z-index:1;overflow:hidden}
|
|
6219
|
+
.prl-office-frame::before{content:"";position:absolute;inset:2px;border-radius:1px;background:linear-gradient(135deg,#3a1a6e 0%,#0a2060 50%,#1a3a20 100%)}
|
|
6220
|
+
.prl-office-frame::after{content:"";position:absolute;top:4px;left:50%;transform:translateX(-50%);width:60%;height:1px;background:rgba(255,255,255,.2)}
|
|
5990
6221
|
/* Second frame */
|
|
5991
|
-
.prl-office-frame2{position:absolute;top:
|
|
5992
|
-
.prl-office-frame2::before{content:"";position:absolute;inset:2px;background:linear-gradient(45deg,#
|
|
5993
|
-
/*
|
|
5994
|
-
.prl-office-
|
|
6222
|
+
.prl-office-frame2{position:absolute;top:6px;right:46px;width:22px;height:16px;border:2px solid rgba(180,160,255,.35);border-radius:2px;background:linear-gradient(135deg,#1a1030,#0a2030);box-shadow:0 2px 4px rgba(0,0,0,.3);z-index:1}
|
|
6223
|
+
.prl-office-frame2::before{content:"";position:absolute;inset:2px;background:linear-gradient(45deg,#2e1060,#102040);border-radius:1px}
|
|
6224
|
+
/* Poster left — inspirational */
|
|
6225
|
+
.prl-office-poster{position:absolute;top:6px;left:8px;width:28px;height:20px;border:1.5px solid rgba(100,200,255,.3);border-radius:2px;background:linear-gradient(135deg,#0a1840,#0a3040);box-shadow:0 2px 4px rgba(0,0,0,.3);z-index:1}
|
|
6226
|
+
.prl-office-poster::before{content:"";position:absolute;inset:2px;background:linear-gradient(180deg,#0a2060 0%,#103050 40%,#0a1040 100%);border-radius:1px}
|
|
6227
|
+
.prl-office-poster::after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(100,200,255,.05) 3px);border-radius:1px}
|
|
6228
|
+
/* Plant left — larger, luminous */
|
|
6229
|
+
.prl-office-plant{position:absolute;bottom:14px;left:4px;width:22px;height:42px;z-index:2;pointer-events:none}
|
|
5995
6230
|
/* Plant right */
|
|
5996
|
-
.prl-office-plant2{position:absolute;bottom:
|
|
5997
|
-
/* Ceiling lamp */
|
|
5998
|
-
.prl-office-lamp{position:absolute;top:0;left:50%;transform:translateX(-50%);width:2px;height:14px;background:rgba(255,255,255,.15);z-index:1}
|
|
5999
|
-
.prl-office-lamp::after{content:"";position:absolute;bottom:0;left:50%;transform:translateX(-50%);width:16px;height:8px;border-radius:0 0 12px 12px;background:rgba(99,102,241,.25);box-shadow:0 4px 20px rgba(99,102,241,.3),0 2px 40px rgba(99,102,241,.1)}
|
|
6231
|
+
.prl-office-plant2{position:absolute;bottom:14px;right:8px;width:22px;height:42px;z-index:2;pointer-events:none}
|
|
6000
6232
|
/* Desks row */
|
|
6001
6233
|
.prl-desks-row{display:flex;gap:8px;align-items:flex-end;flex-wrap:wrap;position:relative;z-index:2;padding-bottom:8px}
|
|
6002
|
-
/* Individual desk card */
|
|
6003
|
-
.prl-desk{display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 6px 4px;border-radius:12px;background:#
|
|
6004
|
-
.prl-desk--active{background:#
|
|
6005
|
-
.prl-desk--done{border-color:#
|
|
6234
|
+
/* Individual desk card — illuminated */
|
|
6235
|
+
.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)}
|
|
6236
|
+
.prl-desk--active{background:#1e1a45;border-color:var(--dc,#6366f1);box-shadow:0 0 20px rgba(99,102,241,.3),0 0 40px rgba(99,102,241,.1),inset 0 1px 0 rgba(150,130,255,.15)}
|
|
6237
|
+
.prl-desk--done{border-color:#2a4a2a;background:#162516}
|
|
6006
6238
|
/* Action bubble above character */
|
|
6007
6239
|
.prl-action-bubble{font-size:9px;color:#6b7280;font-family:var(--mono);padding:2px 6px;border-radius:8px;background:#111;border:1px solid #2a2a38;min-height:16px;text-align:center;white-space:normal;word-break:break-word;max-width:88px;line-height:1.3;transition:all .3s}
|
|
6008
6240
|
.prl-action-bubble--active{color:var(--dc,#6366f1);border-color:var(--dc,#6366f1);background:rgba(99,102,241,.08);animation:parlBubblePop .4s ease}
|
|
@@ -6032,18 +6264,20 @@ body.canvas-open #studioParliamentBlock[style*="fixed"]{left:16px!important;tran
|
|
|
6032
6264
|
@keyframes parlMasterClipboard{0%,100%{transform:rotate(0deg) translateY(0)}30%{transform:rotate(-6deg) translateY(-1px)}70%{transform:rotate(4deg) translateY(1px)}}
|
|
6033
6265
|
/* Whole body: subtle sway of a confident executive */
|
|
6034
6266
|
@keyframes parlMasterBodySway{0%,100%{transform:translateY(0) rotate(0deg)}25%{transform:translateY(-2px) rotate(.6deg)}75%{transform:translateY(-1px) rotate(-.5deg)}}
|
|
6035
|
-
.prl-master-walk{animation:parlMasterWalk
|
|
6036
|
-
.prl-master-walk .prl-master-leg-l{transform-origin:50% 0;animation:parlMasterLegL
|
|
6037
|
-
.prl-master-walk .prl-master-leg-r{transform-origin:50% 0;animation:parlMasterLegR
|
|
6038
|
-
.prl-master-walk .prl-master-arm-l{transform-origin:50% 0;animation:parlMasterArmL
|
|
6039
|
-
.prl-master-walk .prl-master-arm-r{transform-origin:50% 0;animation:parlMasterArmR
|
|
6267
|
+
.prl-master-walk{animation:parlMasterWalk 16s cubic-bezier(.45,0,.55,1) infinite}
|
|
6268
|
+
.prl-master-walk .prl-master-leg-l{transform-origin:50% 0;animation:parlMasterLegL 1.8s ease-in-out infinite}
|
|
6269
|
+
.prl-master-walk .prl-master-leg-r{transform-origin:50% 0;animation:parlMasterLegR 1.8s ease-in-out infinite}
|
|
6270
|
+
.prl-master-walk .prl-master-arm-l{transform-origin:50% 0;animation:parlMasterArmL 2.2s ease-in-out infinite}
|
|
6271
|
+
.prl-master-walk .prl-master-arm-r{transform-origin:50% 0;animation:parlMasterArmR 2.2s ease-in-out infinite}
|
|
6040
6272
|
/* R2 supervise: executive pacing — short back-and-forth at the active desk */
|
|
6041
6273
|
@keyframes parlMasterSupervise{0%{right:8px}30%{right:28px}60%{right:10px}80%{right:24px}100%{right:8px}}
|
|
6042
|
-
.prl-master-supervise{animation:parlMasterSupervise
|
|
6043
|
-
.prl-master-supervise .prl-master-leg-l{transform-origin:50% 0;animation:parlMasterLegL
|
|
6044
|
-
.prl-master-supervise .prl-master-leg-r{transform-origin:50% 0;animation:parlMasterLegR
|
|
6045
|
-
.prl-master-supervise .prl-master-arm-l{transform-origin:50% 0;animation:parlMasterArmL
|
|
6046
|
-
.prl-master-supervise .prl-master-arm-r{transform-origin:50% 0;animation:parlMasterArmR
|
|
6274
|
+
.prl-master-supervise{animation:parlMasterSupervise 8s ease-in-out infinite}
|
|
6275
|
+
.prl-master-supervise .prl-master-leg-l{transform-origin:50% 0;animation:parlMasterLegL 1.8s ease-in-out infinite}
|
|
6276
|
+
.prl-master-supervise .prl-master-leg-r{transform-origin:50% 0;animation:parlMasterLegR 1.8s ease-in-out infinite}
|
|
6277
|
+
.prl-master-supervise .prl-master-arm-l{transform-origin:50% 0;animation:parlMasterArmL 2.2s ease-in-out infinite}
|
|
6278
|
+
.prl-master-supervise .prl-master-arm-r{transform-origin:50% 0;animation:parlMasterArmR 2.2s ease-in-out infinite}
|
|
6279
|
+
/* Done: standing still — no walk animation */
|
|
6280
|
+
.prl-master-done{animation:none}
|
|
6047
6281
|
/* Flying documents: smooth parabolic arc between agents */
|
|
6048
6282
|
.prl-fly-container{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden;z-index:4}
|
|
6049
6283
|
@keyframes parlFlyDoc{0%{transform:translate(0,70px) scale(.6) rotate(-20deg);opacity:0}15%{opacity:1;transform:translate(8%,20px) scale(.9) rotate(-5deg)}40%{transform:translate(30%,-15px) scale(1.1) rotate(3deg);opacity:1}65%{transform:translate(60%,5px) scale(.95) rotate(8deg);opacity:.9}85%{opacity:.6}100%{transform:translate(90%,60px) scale(.6) rotate(15deg);opacity:0}}
|