nothumanallowed 13.5.31 → 13.5.32

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.32",
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.32';
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.32-->';
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+
@@ -5653,6 +5668,9 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
5653
5668
  var wfSafe = wfSnippet.replace(/&/g,\x27&amp;\x27).replace(/</g,\x27&lt;\x27).replace(/>/g,\x27&gt;\x27);
5654
5669
  isoB.className = \x27iso-bubble iso-bubble--active\x27;
5655
5670
  isoB.style.visibility = \x27visible\x27;
5671
+ isoB.style.color = \x27#000000\x27;
5672
+ isoB.style.fontWeight = \x27700\x27;
5673
+ isoB.style.background = \x27#ffffff\x27;
5656
5674
  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
5675
  }
5658
5676
  // Update orchestrator bubble: show which agent it assigned and move the char