nothumanallowed 13.5.160 → 13.5.162

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.160",
3
+ "version": "13.5.162",
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": {
@@ -617,13 +617,14 @@ export async function cmdUI(args) {
617
617
 
618
618
  // GET /api/status
619
619
  if (method === 'GET' && pathname === '/api/status') {
620
+ const { loadTokens: loadTokSt } = await import('../services/token-store.mjs');
620
621
  sendJSON(res, 200, {
621
622
  connected: true,
622
623
  version: VERSION,
623
624
  provider: config.llm.provider,
624
625
  hasApiKey: !!config.llm.apiKey || config.llm.provider === 'nha',
625
- hasGoogle: !!config.google?.clientId,
626
- hasMicrosoft: !!config.microsoft?.clientId,
626
+ hasGoogle: loadTokSt('google') !== null,
627
+ hasMicrosoft: loadTokSt('microsoft') !== null,
627
628
  mailProvider: detectMailProvider(config),
628
629
  mailProviders: getProviderStatus(),
629
630
  agentName: config.agent?.name || null,
@@ -655,6 +656,7 @@ export async function cmdUI(args) {
655
656
 
656
657
  // GET /api/config — read config values for settings UI
657
658
  if (method === 'GET' && pathname === '/api/config') {
659
+ const { loadTokens: loadTok } = await import('../services/token-store.mjs');
658
660
  // Return non-sensitive config for the settings form
659
661
  sendJSON(res, 200, {
660
662
  profile: config.profile || {},
@@ -666,6 +668,8 @@ export async function cmdUI(args) {
666
668
  meetingAlert: config.ops?.meetingAlertMinutes || 30,
667
669
  hasTelegram: !!config.responder?.telegram?.token,
668
670
  hasDiscord: !!config.responder?.discord?.token,
671
+ hasGoogle: loadTok('google') !== null,
672
+ hasMicrosoft: loadTok('microsoft') !== null,
669
673
  });
670
674
  logRequest(method, pathname, 200, Date.now() - start);
671
675
  return;
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.160';
8
+ export const VERSION = '13.5.162';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -7589,6 +7589,7 @@ function renderWebCraft(el) {
7589
7589
  +'<span style="font-size:10px;color:#fde68a;font-family:var(--mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1" id="wcRepairFile">'+wcEsc(wcState.repairCurrent || '')+'</span>'
7590
7590
  +'<span style="font-size:10px;color:var(--dim);flex-shrink:0" id="wcRepairCounter">'+wcState.repairDone+' / '+wcState.repairTotal+'</span>'
7591
7591
  +'<span style="display:flex;gap:3px">'+[0,1,2].map(function(_,idx){ return '<span style="width:4px;height:4px;border-radius:50%;background:#facc15;animation:wcDot 1.1s ease-in-out infinite '+(idx*0.18)+'s"></span>'; }).join('')+'</span>'
7592
+ +'<button onclick="wcStopRepair()" style="padding:2px 8px;background:rgba(239,68,68,0.15);border:1px solid rgba(239,68,68,0.4);border-radius:4px;color:#f87171;font-size:10px;font-weight:700;cursor:pointer;flex-shrink:0">&#9632; Stop</button>'
7592
7593
  +'</div>'
7593
7594
  +'<div style="height:2px;background:rgba(255,255,255,0.07);border-radius:1px;overflow:hidden">'
7594
7595
  +'<div id="wcRepairProg" style="height:100%;width:'+(wcState.repairTotal>0?Math.round((wcState.repairDone/wcState.repairTotal)*100):0)+'%;background:#facc15;border-radius:1px;transition:width .3s ease"></div>'
@@ -9032,12 +9033,17 @@ async function wcGenerate() {
9032
9033
  // ── Auto-repair pass — fixes _error and _syntaxError files ────────────────
9033
9034
  // Called automatically after generation and available as manual button
9034
9035
  var _wcRepairRunning = false;
9036
+ var _wcRepairAbortCtrl = null;
9037
+ function wcStopRepair() {
9038
+ if (_wcRepairAbortCtrl) { _wcRepairAbortCtrl.abort(); _wcRepairAbortCtrl = null; }
9039
+ }
9035
9040
  async function wcAutoRepair(filePlan, sysPreamble) {
9036
9041
  if (_wcRepairRunning) return;
9037
9042
  // Collect broken files: LLM errors + syntax errors
9038
9043
  var toFix = wcState.generatedFiles.filter(function(f){ return f._error || f._syntaxError; });
9039
9044
  if (toFix.length === 0) return;
9040
9045
 
9046
+ _wcRepairAbortCtrl = new AbortController();
9041
9047
  _wcRepairRunning = true;
9042
9048
  wcState.repairing = true;
9043
9049
  wcState.repairTotal = toFix.length;
@@ -9053,6 +9059,7 @@ async function wcAutoRepair(filePlan, sysPreamble) {
9053
9059
  var sysBase = 'You are an expert full-stack engineer. Output ONLY the complete corrected file content. No explanations, no markdown fences, no preamble. Raw file content only.';
9054
9060
 
9055
9061
  for (var ri = 0; ri < toFix.length; ri++) {
9062
+ if (_wcRepairAbortCtrl && _wcRepairAbortCtrl.signal.aborted) break;
9056
9063
  var broken = toFix[ri];
9057
9064
  var plan = planMap[broken.name];
9058
9065
  wcState.repairDone = ri;
@@ -9100,7 +9107,7 @@ async function wcAutoRepair(filePlan, sysPreamble) {
9100
9107
  // Stream repair tokens directly into the <pre>
9101
9108
  var repairAccum = '';
9102
9109
  var repairLang2 = broken.lang || (plan && plan.lang) || 'text';
9103
- var fixed = await wcCallLLM(fixSys, fixUser, null, repairLang2, 8192, function(tok) {
9110
+ var fixed = await wcCallLLM(fixSys, fixUser, _wcRepairAbortCtrl ? _wcRepairAbortCtrl.signal : null, repairLang2, 8192, function(tok) {
9104
9111
  repairAccum += tok;
9105
9112
  var pre2 = document.getElementById('wcLiveCode');
9106
9113
  if (pre2) { pre2.textContent = repairAccum; pre2.style.opacity = '1'; var cw = document.getElementById('wcCodeWrap'); if(cw) cw.scrollTop = cw.scrollHeight; }
@@ -9125,6 +9132,7 @@ async function wcAutoRepair(filePlan, sysPreamble) {
9125
9132
  }
9126
9133
 
9127
9134
  _wcRepairRunning = false;
9135
+ _wcRepairAbortCtrl = null;
9128
9136
  wcState.repairing = false;
9129
9137
  wcState.repairTotal = 0;
9130
9138
  wcState.repairDone = 0;