nothumanallowed 13.5.31 → 13.5.33

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.31",
3
+ "version": "13.5.33",
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.31';
8
+ export const VERSION = '13.5.33';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -231,6 +231,9 @@ var agentChatHistory = []; // [{role:'user'|'agent', text:'...'}]
231
231
 
232
232
  // ---- NAV ----
233
233
  function switchView(v) {
234
+ // Close any open modal (e.g. calendar day detail) before switching view
235
+ var modal=document.getElementById('agentModal');
236
+ if(modal&&modal.classList.contains('modal-overlay--open')){closeModal();}
234
237
  currentView = v;
235
238
  // Invalidate cached data so pages always show fresh content
236
239
  if(v==='contacts')contactsData=null;
@@ -1195,6 +1198,16 @@ function calKey(y,m,d){return y+'-'+String(m+1).padStart(2,'0')+'-'+String(d).pa
1195
1198
  function isToday(y,m,d){var t=new Date();return t.getFullYear()===y&&t.getMonth()===m&&t.getDate()===d}
1196
1199
 
1197
1200
  function renderCalendar(el){
1201
+ // Guard: if Google not connected, show setup message — don't block on API call
1202
+ if(!settingsData.hasGoogle){
1203
+ el.innerHTML='<div style="max-width:400px;margin:60px auto;text-align:center;padding:32px;border:1px solid var(--border);border-radius:12px;background:var(--bg2)">' +
1204
+ '<div style="font-size:40px;margin-bottom:16px">&#128197;</div>' +
1205
+ '<div style="color:var(--bright);font-size:18px;font-weight:700;margin-bottom:8px">Calendar</div>' +
1206
+ '<div style="color:var(--dim);font-size:13px;margin-bottom:24px">Connect your Google account to view and manage calendar events.</div>' +
1207
+ '<button onclick="switchView(\\x27settings\\x27)" style="background:var(--green3);color:var(--bg);padding:10px 24px;border-radius:var(--r);font-weight:700;font-size:13px;cursor:pointer;border:none">Connect Google \u2192</button>' +
1208
+ '</div>';
1209
+ return;
1210
+ }
1198
1211
  var firstDay=new Date(calYear,calMonth,1).getDay();
1199
1212
  var daysInMonth=new Date(calYear,calMonth+1,0).getDate();
1200
1213
  var monthName=new Date(calYear,calMonth,1).toLocaleDateString('en',{month:'long',year:'numeric'});
@@ -3325,7 +3338,7 @@ var studioAbortController = null;
3325
3338
  var parlActiveAgent = null; // active agent label during parliament streaming
3326
3339
  var parlDoneAgents = {}; // set of completed agent labels during parliament
3327
3340
  var _parlPersistHtml = null; // persists parliament block HTML across tab navigations
3328
- var _PARL_STAMP = '<!--nha-parl-v13.5.31-->';
3341
+ var _PARL_STAMP = '<!--nha-parl-v13.5.33-->';
3329
3342
 
3330
3343
  function stopStudio() {
3331
3344
  if (!studioState.running) return;
@@ -3949,7 +3962,9 @@ function renderStudioNodes() {
3949
3962
  var bubbleText = isOrch
3950
3963
  ? (hasActive ? (\x27Assegno step \x27+(doneCount+1)+\x27/\x27+totalCount) : (doneCount===totalCount&&totalCount>0 ? \x27\u2714 Fatto!\x27 : \x27In attesa\x27))
3951
3964
  : (isDone ? \x27\u2714 fatto\x27 : (isErr ? \x27\u2715 errore\x27 : (isActive ? \x27\x27 : \x27\x27)));
3952
- var bubbleBg = isOrch ? \x27rgba(99,102,241,.15)\x27 : (isActive ? \x27rgba(99,102,241,.12)\x27 : (isDone ? \x27rgba(0,0,0,.08)\x27 : \x27rgba(239,68,68,.12)\x27));
3965
+ var bubbleBg = isOrch ? \x27rgba(255,255,255,.95)\x27 : (isActive ? \x27#ffffff\x27 : (isDone ? \x27rgba(0,0,0,.08)\x27 : \x27rgba(239,68,68,.12)\x27));
3966
+ var bubbleColor = isActive ? \x27#000000\x27 : (isOrch ? \x27#111827\x27 : (isDone ? \x27#374151\x27 : \x27#6b7280\x27));
3967
+ var bubbleFontWeight = isActive ? \x27700\x27 : \x27500\x27;
3953
3968
  var glowBox = isActive ? (\x270 0 0 3px \x27+accentColor+\x2744,0 8px 24px \x27+accentColor+\x2733\x27) : (isDone ? (\x270 0 0 2px rgba(0,0,0,.25)\x27) : \x27none\x27);
3954
3969
  // Orchestrator char: no CSS walk animation — JS moves it via inline transform toward the active agent column
3955
3970
  var charIdAttr = isOrch ? \x27 id="wfOrchChar"\x27 : \x27\x27;
@@ -3963,7 +3978,7 @@ function renderStudioNodes() {
3963
3978
  var bubbleVisible = (bubbleText || isOrch || isActive) ? \x27visible\x27 : \x27hidden\x27;
3964
3979
  return \x27<div class="iso-station" \x27+clickAttr+\x27 data-station-idx="\x27+(isOrch?-1:nodeIdx)+\x27" style="box-shadow:\x27+glowBox+\x27;border-color:\x27+accentColor+\x27;transition:box-shadow .4s">\x27+
3965
3980
  flyDoc+
3966
- \x27<div class="iso-bubble\x27+(isActive?\x27 iso-bubble--active\x27:\x27\x27)+\x27" id="\x27+bubbleId+\x27" style="border-color:\x27+accentColor+\x27;color:\x27+accentColor+\x27;background:\x27+bubbleBg+\x27;visibility:\x27+bubbleVisible+\x27">\x27+esc(bubbleText)+\x27</div>\x27+
3981
+ \x27<div class="iso-bubble\x27+(isActive?\x27 iso-bubble--active\x27:\x27\x27)+\x27" id="\x27+bubbleId+\x27" style="border-color:\x27+accentColor+\x27;color:\x27+bubbleColor+\x27;font-weight:\x27+bubbleFontWeight+\x27;background:\x27+bubbleBg+\x27;visibility:\x27+bubbleVisible+\x27">\x27+esc(bubbleText)+\x27</div>\x27+
3967
3982
  \x27<div class="iso-tool-badge">\x27+toolEmoji+\x27</div>\x27+
3968
3983
  charHtml+
3969
3984
  \x27<div class="iso-desk" style="width:85%;border-top-color:\x27+accentColor+\x2733"></div>\x27+
@@ -4906,7 +4921,7 @@ async function runStudio() {
4906
4921
  \x27<div style="position:absolute;top:112px;left:58px;font-size:20px;z-index:5">\x27+String.fromCodePoint(0x1F331)+\x27</div>\x27+
4907
4922
  \x27<div style="position:absolute;top:112px;right:58px;font-size:20px;z-index:5">\x27+String.fromCodePoint(0x1F331)+\x27</div>\x27+
4908
4923
  // Cross-agent communication SVG overlay (dynamic, updated per call)
4909
- \x27<svg id="brCommSvg" style="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:8;overflow:visible"></svg>\x27+
4924
+ \x27<svg id="brCommSvg" style="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:20;overflow:visible"></svg>\x27+
4910
4925
  \x27<div style="position:relative;z-index:10;display:flex;flex-direction:column;justify-content:center;min-height:480px;padding:20px 16px;gap:0;box-sizing:border-box">\x27+
4911
4926
  \x27<div class="br-seats-row">\x27+topHtml+\x27</div>\x27+
4912
4927
  \x27<div style="position:relative;display:flex;align-items:center;width:100%;min-height:160px">\x27+
@@ -4956,8 +4971,9 @@ async function runStudio() {
4956
4971
  orchSpeech.style.display = \x27\x27;
4957
4972
  // Rotate through phrases based on progress
4958
4973
  orchSpeech.textContent = spArr[doneCount % spArr.length];
4959
- orchSpeech.style.borderColor = phaseColor;
4960
- orchSpeech.style.color = phaseColor;
4974
+ orchSpeech.style.borderColor = \x27#374151\x27;
4975
+ orchSpeech.style.color = \x27#000000\x27;
4976
+ orchSpeech.style.fontWeight = \x27700\x27;
4961
4977
  }
4962
4978
  }
4963
4979
 
@@ -5010,7 +5026,7 @@ async function runStudio() {
5010
5026
  bubbleEl.style.fontWeight = isActive ? \x27700\x27 : \x27500\x27;
5011
5027
  }
5012
5028
  if (nameEl) {
5013
- nameEl.style.color = isDone ? \x27#111827\x27 : (isActive ? phaseColor : \x27#374151\x27);
5029
+ nameEl.style.color = isDone ? \x27#111827\x27 : (isActive ? \x27#000000\x27 : \x27#374151\x27);
5014
5030
  nameEl.style.fontWeight = isActive ? \x27800\x27 : \x27600\x27;
5015
5031
  }
5016
5032
  });
@@ -5653,6 +5669,9 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
5653
5669
  var wfSafe = wfSnippet.replace(/&/g,\x27&amp;\x27).replace(/</g,\x27&lt;\x27).replace(/>/g,\x27&gt;\x27);
5654
5670
  isoB.className = \x27iso-bubble iso-bubble--active\x27;
5655
5671
  isoB.style.visibility = \x27visible\x27;
5672
+ isoB.style.color = \x27#000000\x27;
5673
+ isoB.style.fontWeight = \x27700\x27;
5674
+ isoB.style.background = \x27#ffffff\x27;
5656
5675
  isoB.innerHTML = wfSafe + \x27<span style="display:inline-block;width:2px;height:8px;background:#1d4ed8;margin-left:1px;vertical-align:text-bottom;animation:streamBlink .7s step-end infinite">&#8203;</span>\x27;
5657
5676
  }
5658
5677
  // Update orchestrator bubble: show which agent it assigned and move the char
@@ -6497,14 +6516,14 @@ input:focus,textarea:focus{border-color:var(--green3)}
6497
6516
  .br-orch--active .br-orch-emoji{animation:brOrchWalk 1.4s ease-in-out infinite alternate;filter:drop-shadow(0 0 20px #6366f1CC)}
6498
6517
  @keyframes brOrchWalk{0%{transform:translateX(0) scale(1)}100%{transform:translateX(14px) scale(1.07)}}
6499
6518
  .br-orch--done .br-orch-emoji{animation:orchBounce .7s ease forwards}
6500
- .br-orch-speech{font-size:10px;font-weight:800;font-family:var(--mono);padding:4px 10px;border:2px solid #6366f1;border-radius:10px;background:rgba(255,255,255,.95);color:#4338ca;white-space:nowrap;animation:brSpeechPop .7s ease-in-out infinite alternate;pointer-events:none;margin-bottom:4px;box-shadow:0 2px 8px rgba(99,102,241,.25)}
6519
+ .br-orch-speech{font-size:10px;font-weight:800;font-family:var(--mono);padding:4px 10px;border:2px solid #374151;border-radius:10px;background:#ffffff;color:#000000;white-space:nowrap;animation:brSpeechPop .7s ease-in-out infinite alternate;pointer-events:none;margin-bottom:4px;box-shadow:0 2px 8px rgba(0,0,0,.15)}
6501
6520
  @keyframes brSpeechPop{0%{transform:scale(1) rotate(-1deg)}100%{transform:scale(1.06) rotate(1deg)}}
6502
- .br-orch-label{font-size:9px;font-family:var(--mono);font-weight:800;color:#6366f1;background:rgba(99,102,241,.15);border-radius:6px;padding:2px 8px;margin-top:2px}
6521
+ .br-orch-label{font-size:9px;font-family:var(--mono);font-weight:800;color:#000000;background:rgba(255,255,255,.92);border-radius:6px;padding:2px 8px;margin-top:2px}
6503
6522
  /* Bubble above agent */
6504
- .br-bubble{font-size:9px;font-family:var(--mono);padding:4px 9px;border-radius:10px 10px 10px 2px;border:1.5px solid rgba(99,102,241,.35);background:rgba(255,255,255,.96);color:#1e1b4b;line-height:1.4;word-break:break-word;max-width:120px;white-space:normal;box-shadow:0 2px 8px rgba(0,0,0,.12);margin-bottom:3px}
6523
+ .br-bubble{font-size:9px;font-family:var(--mono);font-weight:700;padding:4px 9px;border-radius:10px 10px 10px 2px;border:1.5px solid #374151;background:#ffffff;color:#000000;line-height:1.4;word-break:break-word;max-width:120px;white-space:normal;box-shadow:0 2px 8px rgba(0,0,0,.12);margin-bottom:3px}
6505
6524
  /* Agent name pill */
6506
6525
  .br-seat-name{font-size:9px;font-family:var(--mono);font-weight:600;color:#374151;text-align:center;white-space:normal;word-break:break-word;max-width:100px;line-height:1.3;margin-top:1px;background:rgba(255,255,255,.75);border-radius:4px;padding:1px 4px;transition:color .3s,font-weight .2s;backdrop-filter:blur(2px)}
6507
- .br-seat--active .br-seat-name{color:#4338ca;font-weight:800}
6526
+ .br-seat--active .br-seat-name{color:#000000;font-weight:800}
6508
6527
  .br-seat--done .br-seat-name{color:#111827}
6509
6528
  @keyframes brDotFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
6510
6529
  /* Convergence */
@@ -6605,7 +6624,7 @@ input:focus,textarea:focus{border-color:var(--green3)}
6605
6624
  .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)}
6606
6625
  .prl-desk--done{border-color:#2a4a2a;background:#162516}
6607
6626
  .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}
6608
- .prl-action-bubble--active{color:var(--dc,#6366f1);border-color:var(--dc,#6366f1);background:rgba(99,102,241,.08);animation:parlBubblePop .4s ease}
6627
+ .prl-action-bubble--active{color:#000000;font-weight:700;border-color:#374151;background:#ffffff;animation:parlBubblePop .4s ease}
6609
6628
  @keyframes parlBubblePop{0%{transform:scale(.85);opacity:.5}100%{transform:scale(1);opacity:1}}
6610
6629
  @keyframes streamBlink{0%,100%{opacity:1}50%{opacity:0}}
6611
6630
  /* Character SVG animations */