nothumanallowed 13.5.199 → 13.5.200

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.199",
3
+ "version": "13.5.200",
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.199';
8
+ export const VERSION = '13.5.200';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -5202,30 +5202,22 @@ function downloadStudioPDF() {
5202
5202
  // When a canvas HTML report exists, print IT directly — it's already pixel-perfect with
5203
5203
  // charts, tables and @media print CSS. No need to rebuild from markdown.
5204
5204
  if (studioState.canvas) {
5205
- var canvasHtmlForPrint = studioState.canvas;
5206
- var btn2c = document.getElementById('studioInlinePdfBtn');
5207
- var dlBtn2c = document.querySelector('button[onclick="downloadStudioPDF()"]');
5208
- function setBusyC(b) {
5209
- if (btn2c) { btn2c.disabled = b; btn2c.textContent = b ? 'Generando PDF...' : '\u2913 PDF'; }
5210
- if (dlBtn2c) { dlBtn2c.disabled = b; dlBtn2c.textContent = b ? 'Generando PDF...' : '\u2913 Download PDF'; }
5205
+ // Open canvas HTML in a new window and print it there.
5206
+ // window.open() allows CDN scripts (Chart.js) to fully execute before print —
5207
+ // unlike a hidden off-screen iframe which browsers block for printing.
5208
+ var printWin = window.open('', '_blank', 'width=1100,height=800');
5209
+ if (printWin) {
5210
+ printWin.document.open();
5211
+ printWin.document.write(studioState.canvas);
5212
+ printWin.document.close();
5213
+ // Wait for Chart.js to render all charts, then trigger print dialog
5214
+ printWin.addEventListener('load', function() {
5215
+ setTimeout(function() {
5216
+ printWin.focus();
5217
+ printWin.print();
5218
+ }, 2000);
5219
+ });
5211
5220
  }
5212
- setBusyC(true);
5213
- var oldIfrC = document.getElementById('nhaPrintFrame');
5214
- if (oldIfrC) oldIfrC.remove();
5215
- var ifrC = document.createElement('iframe');
5216
- ifrC.id = 'nhaPrintFrame';
5217
- ifrC.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:1100px;height:800px;border:none;opacity:0;pointer-events:none';
5218
- ifrC.onload = function() {
5219
- setTimeout(function() {
5220
- try { ifrC.contentWindow.focus(); ifrC.contentWindow.print(); } catch(e) {}
5221
- setBusyC(false);
5222
- setTimeout(function(){ try { ifrC.remove(); } catch(e){} }, 8000);
5223
- }, 2500); // wait for Chart.js charts to render
5224
- };
5225
- document.body.appendChild(ifrC);
5226
- try { ifrC.contentDocument.open(); ifrC.contentDocument.write(canvasHtmlForPrint); ifrC.contentDocument.close(); }
5227
- catch(e) { ifrC.srcdoc = canvasHtmlForPrint; }
5228
- setTimeout(function(){ setBusyC(false); }, 8000);
5229
5221
  return;
5230
5222
  }
5231
5223
 
@@ -6857,13 +6849,24 @@ function restoreStudioSession(idx) {
6857
6849
  // Restore canvas if present
6858
6850
  if (s.canvas) {
6859
6851
  studioState.canvas = s.canvas;
6860
- // Use showCanvas() so allCanvasData is keyed correctly (activeConvId || '_default')
6861
- // and renderCanvasPanel() is called, loading the iframe properly
6862
- showCanvas(s.canvas, 'Studio Report: ' + s.task.slice(0, 50));
6863
- var scb = document.getElementById('studioCanvasBtn');
6864
- if (scb) scb.style.display = '';
6852
+ // Store in allCanvasData under the active conv key (same key getConvCanvasData() uses)
6853
+ var _restoreKey = activeConvId || '_default';
6854
+ if (!allCanvasData[_restoreKey]) allCanvasData[_restoreKey] = {canvases:[], browsers:[]};
6855
+ var _restoreData = allCanvasData[_restoreKey];
6856
+ var _existRestoreIdx = _restoreData.canvases.findIndex(function(c){ return c.title === 'Studio Report'; });
6857
+ var _restoreItem = {html: s.canvas, title: 'Studio Report', ts: s.ts || ''};
6858
+ if (_existRestoreIdx >= 0) { _restoreData.canvases[_existRestoreIdx] = _restoreItem; canvasIdx = _existRestoreIdx; }
6859
+ else { _restoreData.canvases.push(_restoreItem); canvasIdx = _restoreData.canvases.length - 1; }
6860
+ canvasMode = 'canvas';
6861
+ _canvasFrameLoadedHtml = null; // force iframe reload
6862
+ var cf = document.getElementById('canvasFrame');
6863
+ var cp = document.getElementById('canvasPanel');
6864
+ if (cf) cf.srcdoc = s.canvas;
6865
+ if (cp) cp.classList.add('open');
6865
6866
  var ct = document.getElementById('canvasTitle');
6866
6867
  if (ct) ct.textContent = 'Studio Report';
6868
+ var scb = document.getElementById('studioCanvasBtn');
6869
+ if (scb) { scb.style.display = ''; scb.style.background = 'var(--greendim)'; scb.style.borderColor = 'var(--green3)'; scb.style.color = 'var(--green)'; }
6867
6870
  }
6868
6871
  showToast('success', 'Session restored', s.task.slice(0, 60), 3000);
6869
6872
  }
@@ -6989,16 +6992,6 @@ function runStudioStep(idx, node, task, context, stepDef, signal) {
6989
6992
  var st = ev.token.replace(new RegExp(\x27[\\\\r\\\\n]+\x27,\x27g\x27), \x27 \x27);
6990
6993
  // Strip surrounding brackets for display
6991
6994
  var stLabel = st.replace(new RegExp(\x27^\\\\[\x27), \x27\x27).replace(new RegExp(\x27\\\\]\\\\s*$\x27), \x27\x27).trim();
6992
- // If there is accumulated text before this status token, render it as markdown first
6993
- var accText = output.trim();
6994
- if (accText && tb.getAttribute(String.fromCharCode(100,97,116,97,45,114,108,101,110)) !== null) {
6995
- // Render markdown of accumulated text so far, then append the new status chip below
6996
- var mdRendered = renderMd(accText);
6997
- tb.className = \x27studio-log-entry__text md-body\x27;
6998
- tb.removeAttribute(String.fromCharCode(100,97,116,97,45,114,108,101,110));
6999
- // Reset output accumulator for new section (keep full output for final render)
7000
- tb.innerHTML = \x27<div class="md-body" style="margin-bottom:8px">\x27 + mdRendered + \x27</div>\x27;
7001
- }
7002
6995
  // Special chip for Searching
7003
6996
  var srchM = st.match(new RegExp(\x27^\\\\[Searching:\\\\s*"([^"]+)"\\\\]\\\\s*$\x27));
7004
6997
  if (srchM) {