nothumanallowed 15.1.46 → 15.1.48

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": "15.1.46",
3
+ "version": "15.1.48",
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 = '15.1.46';
8
+ export const VERSION = '15.1.48';
9
9
  export const BASE_URL = 'https://nothumanallowed.com/cli';
10
10
  export const API_BASE = 'https://nothumanallowed.com/api/v1';
11
11
 
@@ -16,7 +16,7 @@ import {
16
16
  } from '../../services/conversations.mjs';
17
17
  import { callLLMStream, callLLM, callLLMVision, parseAgentFile } from '../../services/llm.mjs';
18
18
  import { buildMemoryContext } from '../../services/memory.mjs';
19
- import { parseActions, executeTool, buildSystemPrompt } from '../../services/tool-executor.mjs';
19
+ import { parseActions, executeTool, buildSystemPrompt, stripOrphanFences } from '../../services/tool-executor.mjs';
20
20
 
21
21
  // Migrate on import (once)
22
22
  migrateOldHistory();
@@ -275,17 +275,59 @@ export function register(router) {
275
275
  a.params = { url: 'https://' + a.params.query.trim() };
276
276
  }
277
277
  }
278
- // Auto-detect email reading intent — force imap_list if LLM didn't emit the tool
278
+ // Auto-detect email reading intent — force the right IMAP tool if the
279
+ // LLM didn't emit one. Semantic keywords (offerta/RFQ/preventivo/...)
280
+ // trigger `imap_search` across all synced messages with each variant,
281
+ // because users almost never want "just the 5 latest" — they want
282
+ // "everything matching X". Generic "leggi le email" still falls back
283
+ // to imap_list. Multi-language: it/en/de/fr/es.
284
+ const lower = msg.toLowerCase();
279
285
  const wantsReadEmail = /\b(leggi|read|mostra|lista|ultime?|recenti?|email|mail|inbox|posta)\b.*\b(email|mail|messag|inbox|posta)\b|\b(email|mail)\b.*\b(leggi|read|mostra|lista|ultime?|recenti?)\b/i.test(msg);
280
- if (wantsReadEmail && !actions.some(a => a.action?.startsWith('imap_') || a.action === 'list_emails')) {
286
+ // Semantic intent quote / offer / proposal / order requests
287
+ const QUOTE_KEYWORDS = {
288
+ offerta: ['offerta', 'richiesta offerta', 'richiesta di offerta', 'preventivo', 'quotazione', 'rdo', 'rda'],
289
+ quote: ['quote', 'quotation', 'rfq', 'rfp', 'request for quote', 'request for proposal', 'price request', 'pricing'],
290
+ order: ['ordine', 'order', 'po ', 'purchase order', 'commessa', 'bestellung', 'commande'],
291
+ invoice: ['fattura', 'invoice', 'rechnung', 'facture'],
292
+ proposal: ['proposta', 'proposal', 'angebot', 'devis'],
293
+ };
294
+ let semanticBag = null;
295
+ if (/\b(offert|preventiv|quotaz|rdo\b|rda\b|quotation|rfq|rfp|request\s+for\s+(quote|proposal|pricing)|price\s+request|pricing|angebot|devis|proposta|proposal)/i.test(lower)) {
296
+ semanticBag = 'offerta';
297
+ } else if (/\b(ordin|order|purchase\s+order|po\s+\d|commessa|bestellung|commande)/i.test(lower)) {
298
+ semanticBag = 'order';
299
+ } else if (/\b(fattur|invoice|rechnung|facture)/i.test(lower)) {
300
+ semanticBag = 'invoice';
301
+ } else if (/\b(propost|proposal|angebot|devis)/i.test(lower)) {
302
+ semanticBag = 'proposal';
303
+ }
304
+
305
+ if ((wantsReadEmail || semanticBag) && !actions.some(a => a.action?.startsWith('imap_') || a.action === 'list_emails')) {
281
306
  try {
282
307
  const { listAccounts: _la } = await import('../../services/email-db.mjs');
283
308
  const imapAccs = _la();
284
309
  if (imapAccs.length > 0) {
285
310
  const firstAcc = imapAccs[0];
286
- const limitMatch = msg.match(/\b(\d+)\b/);
287
- const limit = limitMatch ? Math.min(parseInt(limitMatch[1]), 20) : 5;
288
- actions.push({ action: 'imap_list', params: { accountId: firstAcc.id, limit } });
311
+ if (semanticBag) {
312
+ // Push one imap_search per keyword variant in the bag. The
313
+ // synthesis step will dedupe overlapping hits. We default to a
314
+ // 60-day window (limit=80 per query) — much wider than the
315
+ // 5-email peek the old branch did.
316
+ const bag = QUOTE_KEYWORDS[semanticBag] || [];
317
+ const variants = [
318
+ ...(QUOTE_KEYWORDS.offerta || []).slice(0, 3),
319
+ ...(QUOTE_KEYWORDS.quote || []).slice(0, 3),
320
+ ...bag,
321
+ ];
322
+ const unique = [...new Set(variants)].slice(0, 6);
323
+ for (const q of unique) {
324
+ actions.push({ action: 'imap_search', params: { accountId: firstAcc.id, query: q, limit: 50 } });
325
+ }
326
+ } else {
327
+ const limitMatch = msg.match(/\b(\d+)\b/);
328
+ const limit = limitMatch ? Math.min(parseInt(limitMatch[1]), 50) : 20;
329
+ actions.push({ action: 'imap_list', params: { accountId: firstAcc.id, limit } });
330
+ }
289
331
  }
290
332
  } catch { /* fallback to LLM response */ }
291
333
  }
@@ -389,18 +431,23 @@ export function register(router) {
389
431
  });
390
432
  }
391
433
 
434
+ // Strip orphan tool-fence blocks that the LLM may have emitted as
435
+ // a "no-more-tools" marker (e.g. empty ```json ``` or '''json ''').
436
+ // They leaked into the chat panel as visible noise.
437
+ const cleanFullResponse = stripOrphanFences(fullResponse);
438
+
392
439
  // Persist to conversation
393
440
  if (body.conversationId) {
394
441
  try {
395
442
  const conv = loadConversation(body.conversationId);
396
443
  if (conv) {
397
- addMessages(conv, msg, fullResponse);
444
+ addMessages(conv, msg, cleanFullResponse);
398
445
  }
399
446
  } catch {}
400
447
  }
401
448
 
402
449
  if (heartbeatInterval) { clearInterval(heartbeatInterval); heartbeatInterval = null; }
403
- sse('done', { content: fullResponse });
450
+ sse('done', { content: cleanFullResponse });
404
451
  res.write('data: [DONE]\n\n');
405
452
  res.end();
406
453
  } catch (e) {
@@ -416,6 +416,23 @@ export function register(router) {
416
416
  } catch (e) { sendError(res, 500, e.message); }
417
417
  });
418
418
 
419
+ // POST /api/imap/probe — raw TCP probe of host:port (no TLS, no IMAP).
420
+ // Returns what the server actually sends as the first ~256 bytes, plus a
421
+ // human-readable verdict ("server speaks STARTTLS", "server speaks
422
+ // implicit TLS", "port closed", etc.). Lets the user understand why an
423
+ // IMAP connection fails without needing to read OpenSSL errors.
424
+ router.post('/api/imap/probe', async (req, res) => {
425
+ try {
426
+ const body = await parseBody(req);
427
+ const host = body.imap_host || body.host;
428
+ const port = parseInt(body.imap_port || body.port, 10);
429
+ if (!host || !port) return sendError(res, 400, 'host and port required');
430
+ const { probeImapPort } = await import('../../services/email-imap.mjs');
431
+ const result = await probeImapPort(host, port);
432
+ sendJSON(res, 200, { host, port, ...result });
433
+ } catch (e) { sendError(res, 500, e.message); }
434
+ });
435
+
419
436
  // POST /api/imap/test — dry-run connection test (no DB writes).
420
437
  // Body: { imap_host, imap_port, smtp_host, smtp_port, username, password,
421
438
  // email_address, from_name, sendTest? }
@@ -72,7 +72,7 @@ function createImapClient(label, creds, accountId, secureOverride, opts = {}) {
72
72
  rejectUnauthorized: false,
73
73
  ...(opts.legacy ? { minVersion: 'TLSv1', maxVersion: 'TLSv1.3' } : {}),
74
74
  };
75
- const client = new ImapFlow({
75
+ const clientOpts = {
76
76
  host: creds.imap_host,
77
77
  port,
78
78
  secure: isSecure,
@@ -87,7 +87,16 @@ function createImapClient(label, creds, accountId, secureOverride, opts = {}) {
87
87
  greetingTimeout: 30000,
88
88
  socketTimeout: 120000,
89
89
  tls: tlsOpts,
90
- });
90
+ };
91
+ // `plaintext` strategy: connect cleartext AND skip STARTTLS upgrade. For
92
+ // self-hosted servers that advertise STARTTLS but the upgrade itself is
93
+ // broken (the most common cause of "wrong version number" after a
94
+ // successful TCP connect on port 143).
95
+ if (opts.plaintext) {
96
+ clientOpts.disableAutoIdle = true;
97
+ clientOpts.disableSTARTTLS = true;
98
+ }
99
+ const client = new ImapFlow(clientOpts);
91
100
  client.on('error', (err) => {
92
101
  console.error(`[email:imap] ${label} error:`, err.message);
93
102
  if (accountId) syncClients.delete(accountId);
@@ -95,6 +104,54 @@ function createImapClient(label, creds, accountId, secureOverride, opts = {}) {
95
104
  return client;
96
105
  }
97
106
 
107
+ // Raw TCP probe that just opens the socket and reads the first ~256 bytes of
108
+ // whatever the server sends. No TLS handshake, no IMAP protocol. This is the
109
+ // "smoking gun" diagnostic: if the server returns "* OK [CAPABILITY ... STARTTLS ...]"
110
+ // we know STARTTLS is the right mode. If it returns binary garbage starting
111
+ // with 0x16, that's a TLS handshake → we need implicit TLS. If it returns
112
+ // nothing within timeout, the host/port is wrong or firewalled.
113
+ export async function probeImapPort(host, port) {
114
+ const net = await import('net');
115
+ return new Promise((resolve) => {
116
+ const socket = net.createConnection({ host, port, timeout: 10000 });
117
+ let buf = Buffer.alloc(0);
118
+ const done = (verdict) => {
119
+ try { socket.destroy(); } catch {}
120
+ resolve(verdict);
121
+ };
122
+ socket.on('connect', () => {
123
+ // Some servers wait for client greeting before sending anything; we just
124
+ // wait up to 5 more seconds for the server banner.
125
+ setTimeout(() => {
126
+ if (buf.length === 0) done({ ok: true, banner: '', advice: 'tcp-open-silent', message: `Connessione TCP riuscita ma il server non ha inviato banner entro 5s. Probabilmente è un server che parla TLS implicito — prova porta 993.` });
127
+ }, 5000);
128
+ });
129
+ socket.on('data', (chunk) => {
130
+ buf = Buffer.concat([buf, chunk]);
131
+ if (buf.length >= 200) {
132
+ const first = buf[0];
133
+ const text = buf.toString('utf8').slice(0, 200);
134
+ if (first === 0x16 || first === 0x15 || first === 0x14) {
135
+ done({ ok: true, banner: text.replace(/[^\x20-\x7e]/g, '·').slice(0, 100), advice: 'tls-implicit', message: `Il server risponde con un handshake TLS binario. Modalità corretta: TLS IMPLICITO (secure=true). Probabile porta sbagliata se hai messo 143 — prova 993.` });
136
+ } else if (/^\*\s+OK/i.test(text)) {
137
+ const hasStartTls = /STARTTLS/i.test(text);
138
+ done({ ok: true, banner: text.split('\r\n')[0], advice: hasStartTls ? 'starttls' : 'plaintext', message: hasStartTls ? `Server IMAP in chiaro che annuncia STARTTLS. Modalità corretta: STARTTLS (secure=false, upgrade automatico).` : `Server IMAP in CHIARO senza STARTTLS. ATTENZIONE: nessuna crittografia. Solo per LAN o test — usa "plaintext" se vuoi davvero proseguire.` });
139
+ } else {
140
+ done({ ok: true, banner: text.slice(0, 100), advice: 'unknown', message: `Risposta non riconosciuta dal server: ${text.slice(0, 80)}...` });
141
+ }
142
+ }
143
+ });
144
+ socket.on('error', (err) => done({ ok: false, error: err.message, advice: 'connect-error', message: `Impossibile connettersi: ${err.message}. Verifica host e porta.` }));
145
+ socket.on('timeout', () => done({ ok: false, error: 'timeout', advice: 'firewall', message: `Timeout (10s) — host o porta non raggiungibili. Possibili cause: firewall, host sbagliato, oppure il server è offline.` }));
146
+ socket.on('close', () => {
147
+ if (buf.length > 0) {
148
+ const text = buf.toString('utf8').slice(0, 200);
149
+ done({ ok: true, banner: text.slice(0, 100), advice: 'partial', message: `Risposta parziale dal server: ${text.slice(0, 80)}` });
150
+ }
151
+ });
152
+ });
153
+ }
154
+
98
155
  // Match the most common "wrong TLS mode" failure modes from ImapFlow / node
99
156
  // tls. Errors can surface as cleartext OpenSSL output ("wrong version
100
157
  // number"), as ImapFlow strings ("Failed to receive greeting"), or as plain
@@ -135,33 +192,37 @@ export async function getImapClient(accountId, override) {
135
192
  // Explicit override (used by the outer syncAccount retry): obey it
136
193
  // exactly, but still try legacy TLS as a fallback within that mode.
137
194
  strategies = [
138
- { secure: override, legacy: false, why: 'override-modern' },
139
- { secure: override, legacy: true, why: 'override-legacy' },
195
+ { secure: override, legacy: false, plaintext: false, why: 'override-modern' },
196
+ { secure: override, legacy: true, plaintext: false, why: 'override-legacy' },
140
197
  ];
141
198
  } else {
142
199
  strategies = [
143
- { secure: heuristicSecure, legacy: false, why: 'heuristic-modern' },
144
- { secure: !heuristicSecure, legacy: false, why: 'opposite-modern' },
145
- { secure: heuristicSecure, legacy: true, why: 'heuristic-legacy' },
146
- { secure: !heuristicSecure, legacy: true, why: 'opposite-legacy' },
200
+ { secure: heuristicSecure, legacy: false, plaintext: false, why: 'heuristic-modern' },
201
+ { secure: !heuristicSecure, legacy: false, plaintext: false, why: 'opposite-modern' },
202
+ { secure: heuristicSecure, legacy: true, plaintext: false, why: 'heuristic-legacy' },
203
+ { secure: !heuristicSecure, legacy: true, plaintext: false, why: 'opposite-legacy' },
204
+ // Last-resort plaintext (no encryption): for servers that advertise
205
+ // STARTTLS but the upgrade is broken, OR for explicitly insecure
206
+ // LAN-only servers. Skipped on standard secure ports.
207
+ ...(heuristicSecure ? [] : [{ secure: false, legacy: false, plaintext: true, why: 'plaintext-no-tls' }]),
147
208
  ];
148
209
  const remembered = lastGoodProfile.get(accountId);
149
210
  if (remembered) {
150
211
  strategies = [
151
- { secure: remembered.secure, legacy: !!remembered.legacy, why: 'remembered' },
152
- ...strategies.filter(s => !(s.secure === remembered.secure && s.legacy === !!remembered.legacy)),
212
+ { secure: remembered.secure, legacy: !!remembered.legacy, plaintext: !!remembered.plaintext, why: 'remembered' },
213
+ ...strategies.filter(s => !(s.secure === remembered.secure && s.legacy === !!remembered.legacy && !!s.plaintext === !!remembered.plaintext)),
153
214
  ];
154
215
  }
155
216
  }
156
217
 
157
218
  const errors = [];
158
219
  for (const s of strategies) {
159
- const client = createImapClient(label, creds, accountId, s.secure, { legacy: s.legacy });
220
+ const client = createImapClient(label, creds, accountId, s.secure, { legacy: s.legacy, plaintext: s.plaintext });
160
221
  try {
161
222
  await client.connect();
162
- lastGoodProfile.set(accountId, { secure: s.secure, legacy: s.legacy });
223
+ lastGoodProfile.set(accountId, { secure: s.secure, legacy: s.legacy, plaintext: s.plaintext });
163
224
  if (s.why !== 'remembered' && s.why !== 'heuristic-modern') {
164
- console.warn(`[email:imap] ${label} connected via ${s.why} (secure=${s.secure}, legacy=${s.legacy})`);
225
+ console.warn(`[email:imap] ${label} connected via ${s.why} (secure=${s.secure}, legacy=${s.legacy}, plaintext=${s.plaintext})`);
165
226
  }
166
227
  syncClients.set(accountId, client);
167
228
  return client;
@@ -175,7 +236,17 @@ export async function getImapClient(accountId, override) {
175
236
  }
176
237
  }
177
238
  }
178
- throw new Error(`IMAP connection failed after ${strategies.length} attempts:\n${errors.join('\n')}`);
239
+ // Final attempt failed. Run a raw TCP probe so the user can see what the
240
+ // server actually replies (or whether the port is reachable at all), and
241
+ // include that diagnostic in the thrown error.
242
+ let diagnosis = '';
243
+ try {
244
+ const probe = await probeImapPort(creds.imap_host, port);
245
+ diagnosis = `\n\nDIAGNOSI: ${probe.message}${probe.banner ? ` (banner: "${probe.banner}")` : ''}`;
246
+ } catch (probeErr) {
247
+ diagnosis = `\n\nProbe diagnostico fallito: ${probeErr.message}`;
248
+ }
249
+ throw new Error(`IMAP connection failed after ${strategies.length} attempts on ${creds.imap_host}:${port}:\n${errors.join('\n')}${diagnosis}`);
179
250
  }
180
251
 
181
252
  // Dry-run connectivity test used by Settings UI (no DB writes, no persistent
@@ -188,23 +259,27 @@ export async function testImapConnection(creds) {
188
259
  const port = parseInt(creds.imap_port, 10) || 993;
189
260
  const heuristicSecure = port === 993 || port === 465;
190
261
  const strategies = [
191
- { secure: heuristicSecure, legacy: false, why: 'heuristic-modern' },
192
- { secure: !heuristicSecure, legacy: false, why: 'opposite-modern' },
193
- { secure: heuristicSecure, legacy: true, why: 'heuristic-legacy' },
194
- { secure: !heuristicSecure, legacy: true, why: 'opposite-legacy' },
262
+ { secure: heuristicSecure, legacy: false, plaintext: false, why: 'heuristic-modern' },
263
+ { secure: !heuristicSecure, legacy: false, plaintext: false, why: 'opposite-modern' },
264
+ { secure: heuristicSecure, legacy: true, plaintext: false, why: 'heuristic-legacy' },
265
+ { secure: !heuristicSecure, legacy: true, plaintext: false, why: 'opposite-legacy' },
266
+ ...(heuristicSecure ? [] : [{ secure: false, legacy: false, plaintext: true, why: 'plaintext-no-tls' }]),
195
267
  ];
196
268
  const errors = [];
197
269
  for (const s of strategies) {
198
- const client = createImapClient('test', creds, null, s.secure, { legacy: s.legacy });
270
+ const client = createImapClient('test', creds, null, s.secure, { legacy: s.legacy, plaintext: s.plaintext });
199
271
  try {
200
272
  await client.connect();
201
273
  const list = await client.list();
202
274
  try { await client.logout(); } catch {}
203
- const mode = `${s.secure ? 'implicit TLS' : 'STARTTLS'}${s.legacy ? ' (legacy ≥TLSv1.0)' : ''}`;
275
+ const mode = s.plaintext
276
+ ? 'plaintext (NESSUNA crittografia)'
277
+ : `${s.secure ? 'TLS implicito' : 'STARTTLS'}${s.legacy ? ' (legacy ≥TLSv1.0)' : ''}`;
204
278
  return {
205
279
  ok: true,
206
280
  secure: s.secure,
207
281
  legacy: s.legacy,
282
+ plaintext: s.plaintext,
208
283
  folderCount: list.length,
209
284
  message: `Connesso con modalità: ${mode}`,
210
285
  };
@@ -212,12 +287,17 @@ export async function testImapConnection(creds) {
212
287
  errors.push(`• ${s.why}: ${err.message.slice(0, 160)}`);
213
288
  try { await client.logout(); } catch {}
214
289
  if (!_looksLikeTlsMismatch(err) && !/timeout|hang/i.test(err.message)) {
215
- // Hard error (auth / DNS): bail with that exact message.
216
290
  throw err;
217
291
  }
218
292
  }
219
293
  }
220
- throw new Error(`IMAP test failed dopo ${strategies.length} tentativi:\n${errors.join('\n')}`);
294
+ // Probe in fallback so the user gets actionable info.
295
+ let diagnosis = '';
296
+ try {
297
+ const probe = await probeImapPort(creds.imap_host, port);
298
+ diagnosis = `\n\nDIAGNOSI: ${probe.message}${probe.banner ? ` (banner: "${probe.banner}")` : ''}`;
299
+ } catch {}
300
+ throw new Error(`IMAP test failed dopo ${strategies.length} tentativi su ${creds.imap_host}:${port}:\n${errors.join('\n')}${diagnosis}`);
221
301
  }
222
302
 
223
303
  export async function closeImapClient(accountId) {
@@ -463,16 +543,10 @@ const FIRST_SYNC_LIMIT = 0;
463
543
 
464
544
  export async function syncAccount(accountId, opts = {}) {
465
545
  setSyncStatus(accountId, 'syncing', null);
466
- // _retried is set by the recursion below — it forces the *opposite* TLS
467
- // mode on the second attempt so we never spin twice on the same setting.
468
- const tlsOverride = (typeof opts._forceSecure === 'boolean') ? opts._forceSecure : undefined;
469
546
  try {
470
- // Prime the connection with the (optional) explicit TLS mode so any
471
- // cached `syncClients` entry uses it for the whole sync.
472
- if (tlsOverride !== undefined) {
473
- await closeImapClient(accountId);
474
- await getImapClient(accountId, tlsOverride);
475
- }
547
+ // getImapClient does the full 5-strategy TLS discovery internally and
548
+ // remembers the working profile, so the outer retry layer is no longer
549
+ // needed by the time we get a client back, the connection is good.
476
550
  const folders = await listImapFolders(accountId);
477
551
  const priority = ['inbox', 'sent'];
478
552
  const toSync = [
@@ -489,22 +563,11 @@ export async function syncAccount(accountId, opts = {}) {
489
563
  console.log(`[email:sync] ${f.path}: ${result.synced} new messages (total on server: ${result.total})`);
490
564
  } catch (err) {
491
565
  console.warn(`[email:imap] Sync folder ${f.path} failed:`, err.message);
492
- // Per-folder TLS mismatch propagates up so the outer catch can
493
- // restart the whole sync with the opposite secure mode.
494
- if (_looksLikeTlsMismatch(err) && opts._retried !== true) throw err;
495
566
  }
496
567
  }
497
568
  setSyncStatus(accountId, 'idle', null);
498
569
  return { synced: totalSynced };
499
570
  } catch (err) {
500
- if (_looksLikeTlsMismatch(err) && opts._retried !== true) {
501
- const port = parseInt(getAccountCredentials(accountId)?.imap_port, 10) || 993;
502
- const heuristic = port === 993 || port === 465;
503
- const opposite = (typeof tlsOverride === 'boolean') ? !tlsOverride : !heuristic;
504
- console.warn(`[email:imap] sync ${accountId.slice(0, 8)} TLS mismatch — retrying entire sync with secure=${opposite}`);
505
- await closeImapClient(accountId);
506
- return syncAccount(accountId, { ...opts, _retried: true, _forceSecure: opposite });
507
- }
508
571
  setSyncStatus(accountId, 'error', err.message);
509
572
  throw err;
510
573
  }
@@ -820,9 +820,12 @@ export function parseActions(text) {
820
820
  const actions = [];
821
821
  const textParts = [];
822
822
 
823
- // Normalize: some LLMs output "json ... " (double-quote fences) instead of ```json ... ```
824
- // Replace "json\n{...}\n" patterns with proper ```json fences before parsing
823
+ // Normalize: some LLMs output "json ... ", 'json ... ' or '''json ... '''
824
+ // (Python-style triple-quote) instead of ```json ... ```. We rewrite all
825
+ // these to proper triple-backtick fences before the main regex runs.
825
826
  const normalized = text
827
+ .replace(/'''json\s*\n?([\s\S]*?)\n?\s*'''/g, (_, body) => '```json\n' + body.trim() + '\n```')
828
+ .replace(/"""json\s*\n?([\s\S]*?)\n?\s*"""/g, (_, body) => '```json\n' + body.trim() + '\n```')
826
829
  .replace(/"json\s*\n([\s\S]*?)\n\s*"/g, (_, body) => '```json\n' + body.trim() + '\n```')
827
830
  .replace(/'json\s*\n([\s\S]*?)\n\s*'/g, (_, body) => '```json\n' + body.trim() + '\n```');
828
831
 
@@ -914,6 +917,30 @@ export function parseActions(text) {
914
917
  return { textParts, actions };
915
918
  }
916
919
 
920
+ /**
921
+ * Strip orphan tool-fence blocks from a finished LLM response. These appear
922
+ * when the model emits an empty `'''json '''` (or backtick-fenced) block
923
+ * as a no-op marker — the parser doesn't pick them up as actions but they
924
+ * leak into the UI as visible noise. Run this on the final assistant text
925
+ * before showing it to the user.
926
+ */
927
+ export function stripOrphanFences(text) {
928
+ if (!text || typeof text !== 'string') return text;
929
+ return text
930
+ // Triple-backtick, triple-single, triple-double quote fences with `json`
931
+ // marker — empty or with a body. We strip the whole block.
932
+ .replace(/```json\s*\n?[\s\S]*?```/g, '')
933
+ .replace(/'''json\s*\n?[\s\S]*?'''/g, '')
934
+ .replace(/"""json\s*\n?[\s\S]*?"""/g, '')
935
+ // Bare action JSON that the parser already consumed but the synthesis
936
+ // step regurgitated (rare but happens with Liara). Only strip if the
937
+ // JSON shape matches "action":"...".
938
+ .replace(/\{\s*"action"\s*:\s*"[^"]+"\s*,?\s*("params"\s*:\s*\{[\s\S]*?\}\s*)?\}/g, '')
939
+ // Collapse blank-line clusters produced by the stripping.
940
+ .replace(/\n{3,}/g, '\n\n')
941
+ .trim();
942
+ }
943
+
917
944
  // ── Formatting Helpers ───────────────────────────────────────────────────────
918
945
 
919
946
  /**
@@ -650,7 +650,7 @@ ${d}
650
650
  ${e.map(e=>`<div class="section"><div class="agent-header"><span class="icon">${e.icon}</span><div class="agent-name">${e.label}</div></div><div class="section-body"><p>${r(e.output)}</p></div></div>`).join(``)}
651
651
  ${f}
652
652
  <div class="footer">NHA Studio · nothumanallowed.com · ${new Date().getFullYear()}</div>
653
- </body></html>`,m=new Blob([p],{type:`text/html`}),h=URL.createObjectURL(m),g=document.createElement(`a`);g.href=h,g.download=`nha-report-${Date.now()}.html`,g.click(),URL.revokeObjectURL(h);let _=window.open(``,`_blank`,`width=1100,height=800`);_&&(_.document.open(),_.document.write(p),_.document.close(),_.onload=()=>setTimeout(()=>{_.focus(),_.print()},600))},N=t=>{let n=`**Studio Workflow Result**\n\nTask: ${t.task}\n\nAgents: ${t.nodes.map(e=>e.label).join(` → `)}\n\n---\n\n${t.result}`;try{sessionStorage.setItem(`nha_studio_import`,n)}catch{}e(`chat`)},Ce=()=>{if(!u){r(``),a([]),s([]),l(``),S(``),de.current=``,w(null),j.current=null,T(!1),b({in:0,out:0}),v(null),re(!1);try{sessionStorage.removeItem(dt)}catch{}}},we=i.some(e=>e.output||e.status===`running`);return(0,k.jsxs)(`div`,{className:P.root,children:[(0,k.jsxs)(`div`,{className:P.header,children:[(0,k.jsxs)(`div`,{className:P.headerLeft,children:[(0,k.jsx)(`div`,{className:P.title,children:`Studio`}),(0,k.jsx)(`div`,{className:P.subtitle,children:`Multi-agent orchestration · Council deliberation · Geth Consensus`})]}),(0,k.jsxs)(`div`,{className:P.headerActions,children:[y.in+y.out>0&&(0,k.jsxs)(`div`,{className:P.tokenBar,children:[(0,k.jsxs)(`span`,{className:P.tokIn,children:[`↑ `,y.in.toLocaleString()]}),(0,k.jsx)(`span`,{className:P.tokDim,children:` in `}),(0,k.jsxs)(`span`,{className:P.tokOut,children:[`↓ `,y.out.toLocaleString()]}),(0,k.jsx)(`span`,{className:P.tokDim,children:` out`})]}),(0,k.jsxs)(`div`,{style:{position:`relative`},ref:fe,children:[(0,k.jsxs)(`button`,{className:P.sessionsBtn,onClick:()=>h(e=>!e),children:[`Sessions (`,f.length,`)`]}),m&&(0,k.jsx)(`div`,{className:P.sessionsDrawer,children:f.length===0?(0,k.jsx)(`div`,{className:P.noSessions,children:`No saved sessions yet.`}):(0,k.jsxs)(k.Fragment,{children:[f.map(e=>(0,k.jsxs)(`div`,{className:P.sessionItem,children:[(0,k.jsxs)(`div`,{className:P.sessionInfo,onClick:()=>ve(e),children:[(0,k.jsx)(`div`,{className:P.sessionTask,children:e.task.slice(0,80)}),(0,k.jsxs)(`div`,{className:P.sessionMeta,children:[e.ts.slice(0,16),` · `,e.nodes.length,` agents`,e.council?.phase===`done`?` · 🏛️ Council`:``]})]}),(0,k.jsxs)(`div`,{className:P.sessionBtns,children:[(0,k.jsx)(`button`,{className:P.importBtn,onClick:()=>N(e),children:`→ Chat`}),(0,k.jsx)(`button`,{className:P.delSessionBtn,onClick:()=>ye(e.id),children:`✕`})]})]},e.id)),(0,k.jsx)(`div`,{className:P.sessionsFooter,children:(0,k.jsx)(`button`,{className:P.clearAllSessionsBtn,onClick:be,children:`Clear All`})})]})})]}),x&&(0,k.jsx)(`button`,{className:P.canvasToggleBtn,onClick:()=>{re(!0),O(`canvas`)},children:`📊 Panel`}),c&&(0,k.jsx)(`button`,{className:P.pdfBtn,onClick:xe,children:`⬇ PDF / HTML`}),(i.length>0||c||o.length>0)&&!u&&(0,k.jsx)(`button`,{className:P.clearBtn,onClick:Ce,title:`Clear all — start fresh`,children:`✕ Clear`})]})]}),(0,k.jsxs)(`div`,{className:P.inputArea,children:[(0,k.jsxs)(`div`,{className:P.inputRow,children:[(0,k.jsx)(`textarea`,{className:P.taskInput,value:n,onChange:e=>r(e.target.value),placeholder:`Describe your task… e.g. Analyze my emails and create a priority action plan`,rows:4,onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),he())}}),(0,k.jsxs)(`div`,{className:P.inputControls,children:[u?(0,k.jsx)(`button`,{className:P.stopBtn,onClick:ge,children:`■ Stop`}):(0,k.jsx)(`button`,{className:P.runBtn,onClick:he,disabled:!n.trim(),children:`Run ▶`}),(0,k.jsxs)(`label`,{className:P.attachBtn,title:`Attach PDF or image`,children:[`📎`,(0,k.jsx)(`input`,{type:`file`,accept:`.pdf,.png,.jpg,.jpeg,.gif,.webp`,style:{display:`none`},onChange:e=>me(e.target.files?.[0])})]})]})]}),g&&(0,k.jsxs)(`div`,{className:P.attachBadge,children:[`📎 `,g.name,(0,k.jsx)(`button`,{className:P.clearAttach,onClick:()=>v(null),children:`✕`})]}),!u&&i.length===0&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`div`,{className:P.examples,children:ke.map((e,t)=>(0,k.jsx)(`button`,{className:P.exampleBtn,onClick:()=>r(e),children:e},t))}),(0,k.jsxs)(`div`,{className:P.financeSection,children:[(0,k.jsx)(`div`,{className:P.financeSectionTitle,children:`📈 Finance & Trading Workflows`}),(0,k.jsx)(`div`,{className:P.financePresets,children:De.map((e,t)=>(0,k.jsx)(`button`,{className:P.financeBtn,onClick:()=>{r(e.task),a(e.agents)},children:e.label},t))})]})]})]}),i.length>0&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`div`,{className:P.officeSceneWrap,style:{overflow:`hidden`,position:`relative`,height:`180px`},children:(0,k.jsxs)(`div`,{style:{display:`flex`,width:`200%`,height:`100%`,transition:`transform 700ms cubic-bezier(0.22, 1, 0.36, 1)`,transform:C&&C.phase!==`idle`&&C.phase!==`skipped`?`translateX(-50%)`:`translateX(0)`},children:[(0,k.jsx)(`div`,{style:{width:`50%`,height:`100%`,flexShrink:0},children:(0,k.jsx)(Qe,{nodes:i,running:u})}),(0,k.jsx)(`div`,{style:{width:`50%`,height:`100%`,flexShrink:0},children:(0,k.jsx)(rt,{agents:ne.length>0?ne:i,council:C})})]})}),(0,k.jsxs)(`div`,{className:`${P.pipelineWrap} ${u?P.pipelineRunning:``}`,children:[(0,k.jsxs)(`div`,{className:P.pipelineTitle,children:[`Agent Pipeline`,u&&(0,k.jsx)(`span`,{className:P.pipelineLiveTag,children:`● LIVE`})]}),(0,k.jsx)(`div`,{className:P.pipelineNodes,children:i.map((e,t)=>(0,k.jsxs)(`div`,{className:P.pipelineStep,children:[(0,k.jsxs)(`div`,{className:`${P.agentChip} ${P[`chip_${e.status}`]}`,children:[(0,k.jsx)(`span`,{className:P.chipIcon,children:e.icon}),(0,k.jsx)(`span`,{className:P.chipLabel,children:e.label}),e.status===`running`&&(0,k.jsxs)(`span`,{className:P.chipDots,children:[(0,k.jsx)(`span`,{className:P.dot1,children:`.`}),(0,k.jsx)(`span`,{className:P.dot2,children:`.`}),(0,k.jsx)(`span`,{className:P.dot3,children:`.`})]}),e.status===`done`&&(0,k.jsx)(`span`,{className:P.chipCheck,children:`✓`}),e.status===`error`&&(0,k.jsx)(`span`,{className:P.chipErr,children:`✗`})]}),t<i.length-1&&(0,k.jsx)(`div`,{className:`${P.arrow} ${u?P.arrowActive:``}`,children:`→`})]},t))}),i.some(e=>e.reason)&&(0,k.jsx)(`div`,{className:P.reasonRow,children:i.map((e,t)=>e.reason?(0,k.jsxs)(`div`,{className:P.reasonChip,title:e.reason,children:[(0,k.jsx)(`span`,{className:P.reasonIcon,children:e.icon}),(0,k.jsxs)(`span`,{className:P.reasonText,children:[e.reason.slice(0,60),e.reason.length>60?`…`:``]})]},t):null)})]})]}),(0,k.jsxs)(`div`,{className:P.body,ref:ue,children:[(o.length>0||we)&&(0,k.jsxs)(`div`,{className:P.twoCol,children:[(0,k.jsxs)(`div`,{className:P.logPanel,children:[(0,k.jsx)(`div`,{className:P.panelTitle,children:`Live Log`}),(0,k.jsx)(`div`,{className:P.logBody,ref:le,children:o.map((e,t)=>(0,k.jsxs)(`div`,{className:`${P.logEntry} ${P[`log_${e.type}`]}`,children:[(0,k.jsx)(`span`,{className:P.logTime,children:e.time}),(0,k.jsx)(`span`,{className:P.logIcon,children:e.icon}),(0,k.jsx)(`span`,{className:P.logAgent,children:e.agent}),(0,k.jsx)(`span`,{className:P.logText,children:e.text})]},t))})]}),(0,k.jsx)(`div`,{className:P.liveOutputPanel,children:i.filter(e=>e.output||e.status===`running`).map((e,t)=>(0,k.jsxs)(`div`,{className:`${P.liveBlock} ${e.status===`running`?P.liveBlockActive:``} ${e.status===`done`&&e.output?P.liveBlockClickable:``}`,onClick:()=>e.status===`done`&&e.output?se(e):void 0,children:[(0,k.jsxs)(`div`,{className:P.liveBlockHeader,children:[(0,k.jsx)(`span`,{className:P.liveBlockIcon,children:e.icon}),(0,k.jsx)(`span`,{className:P.liveBlockLabel,children:e.label}),e.reason&&(0,k.jsx)(`span`,{className:P.liveBlockReason,title:e.reason,children:`ℹ`}),(0,k.jsx)(`span`,{className:`${P.outputStatus} ${P[`status_${e.status}`]}`,children:e.status}),e.status===`done`&&e.output&&(0,k.jsx)(`span`,{className:P.expandHint,children:`↗ espandi`})]}),e.status===`running`&&(0,k.jsxs)(`div`,{className:P.liveBlockWorking,children:[(0,k.jsx)(`span`,{className:P.workingDot}),(0,k.jsx)(`span`,{className:P.workingDot}),(0,k.jsx)(`span`,{className:P.workingDot}),(0,k.jsx)(`span`,{className:P.workingLabel,children:e.statusLine??`elaborazione in corso`})]}),(0,k.jsx)(`div`,{className:`${P.liveBlockBody} ${e.status===`done`&&e.output?P.liveBlockBodyClamped:``}`,dangerouslySetInnerHTML:{__html:Se(e.output)+(e.status===`running`&&e.output?`<span class="studio-cursor"></span>`:``)}})]},t))})]}),ee&&(0,k.jsxs)(`div`,{className:P.parliamentPrompt,children:[(0,k.jsx)(`div`,{className:P.parliamentPromptIcon,children:`🏛️`}),(0,k.jsxs)(`div`,{className:P.parliamentPromptContent,children:[(0,k.jsx)(`div`,{className:P.parliamentPromptTitle,children:`Attivare il Consiglio?`}),(0,k.jsxs)(`div`,{className:P.parliamentPromptDesc,children:[ne.length,` agenti (`,ne.map(e=>e.label).join(`, `),`) hanno prodotto output. Il Geth Consensus eseguirà cross-reading, refinement e mediazione HERALD per raggiungere un consenso collettivo.`]}),(0,k.jsxs)(`div`,{className:P.parliamentPromptMeta,children:[`Complessità: `,ne.length<=3?`⚡ Rapido (~30s)`:ne.length<=5?`⏱ Medio (~60s)`:`🕐 Lungo (~2min)`,`\xA0· Consigliato per task analitici complessi`]})]}),(0,k.jsxs)(`div`,{className:P.parliamentPromptBtns,children:[(0,k.jsx)(`button`,{className:P.parliamentActivateBtn,onClick:_e,children:`🏛️ Attiva`}),(0,k.jsx)(`button`,{className:P.parliamentSkipBtn,onClick:()=>T(!1),children:`Salta`})]})]}),C&&!ee&&(0,k.jsx)(`div`,{className:P.councilWrapper,children:(0,k.jsx)(vt,{council:C})}),c&&!u&&(0,k.jsxs)(`details`,{className:P.resultAccordion,open:i.length<=1,children:[(0,k.jsxs)(`summary`,{className:P.resultAccordionSummary,children:[`Full Combined Report (`,i.filter(e=>e.output&&e.output!==`(no output)`).length,` agents)`]}),(0,k.jsx)(`div`,{className:P.resultAccordionBody,dangerouslySetInnerHTML:{__html:Se(c)}})]})]}),D&&(0,k.jsxs)(`div`,{className:P.canvasPanel,children:[(0,k.jsxs)(`div`,{className:P.canvasPanelHeader,children:[(0,k.jsxs)(`div`,{className:P.panelTabs,children:[(0,k.jsx)(`button`,{className:`${P.panelTabBtn} ${ie===`canvas`?P.panelTabActive:``}`,onClick:()=>O(`canvas`),children:`📊 Canvas`}),(0,k.jsx)(`button`,{className:`${P.panelTabBtn} ${ie===`browser`?P.panelTabActive:``}`,onClick:()=>O(`browser`),children:`🌐 Browser`})]}),(0,k.jsxs)(`div`,{className:P.canvasPanelActions,children:[ie===`canvas`&&x&&(0,k.jsx)(`button`,{className:P.canvasPanelBtn,onClick:()=>{let e=new Blob([x],{type:`text/html`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`nha-canvas-report.html`,n.click(),URL.revokeObjectURL(t)},children:`⬇ HTML`}),(0,k.jsx)(`button`,{className:P.canvasPanelClose,onClick:()=>re(!1),children:`✕`})]})]}),ie===`canvas`?x?(0,k.jsx)(`iframe`,{className:P.canvasFrame,srcDoc:x,sandbox:`allow-scripts`,title:`Canvas Report`}):(0,k.jsx)(`div`,{className:P.panelEmpty,children:`No canvas report yet. Run a workflow first.`}):(0,k.jsxs)(`div`,{className:P.browserPanel,children:[(0,k.jsxs)(`div`,{className:P.browserBar,children:[(0,k.jsx)(`input`,{className:P.browserInput,value:ae,onChange:e=>A(e.target.value),placeholder:`https://…`,onKeyDown:e=>{e.key===`Enter`&&A(ae)}}),(0,k.jsx)(`button`,{className:P.browserGo,onClick:()=>A(ae),children:`Go`})]}),ae?(0,k.jsx)(`iframe`,{className:P.canvasFrame,src:ae,sandbox:`allow-scripts allow-same-origin allow-forms`,title:`Browser`}):(0,k.jsx)(`div`,{className:P.panelEmpty,children:`Enter a URL above to browse`})]})]}),oe&&(0,k.jsx)(`div`,{className:P.blockModalOverlay,onClick:()=>se(null),children:(0,k.jsxs)(`div`,{className:P.blockModal,onClick:e=>e.stopPropagation(),children:[(0,k.jsxs)(`div`,{className:P.blockModalHeader,children:[(0,k.jsx)(`span`,{className:P.liveBlockIcon,children:oe.icon}),(0,k.jsx)(`span`,{className:P.blockModalTitle,children:oe.label}),(0,k.jsx)(`button`,{className:P.blockModalClose,onClick:()=>se(null),children:`✕`})]}),(0,k.jsx)(`div`,{className:`${P.liveBlockBody} ${P.blockModalBody}`,dangerouslySetInnerHTML:{__html:Se(oe.output)}})]})})]})}var R={root:`_root_13wnr_2`,hero:`_hero_13wnr_12`,heroLeft:`_heroLeft_13wnr_21`,heroDate:`_heroDate_13wnr_22`,heroTitle:`_heroTitle_13wnr_23`,heroVer:`_heroVer_13wnr_24`,heroUptime:`_heroUptime_13wnr_25`,heroWeather:`_heroWeather_13wnr_27`,wIcon:`_wIcon_13wnr_35`,wInfo:`_wInfo_13wnr_36`,wTemp:`_wTemp_13wnr_37`,wCity:`_wCity_13wnr_38`,wDesc:`_wDesc_13wnr_39`,wEmpty:`_wEmpty_13wnr_40`,kpiRow:`_kpiRow_13wnr_43`,kpi:`_kpi_13wnr_43`,kpiNum:`_kpiNum_13wnr_55`,kpiLbl:`_kpiLbl_13wnr_56`,kpiBar:`_kpiBar_13wnr_57`,kpiFill:`_kpiFill_13wnr_58`,liveGrid:`_liveGrid_13wnr_61`,liveCard:`_liveCard_13wnr_67`,liveHdr:`_liveHdr_13wnr_71`,liveMore:`_liveMore_13wnr_79`,liveRow:`_liveRow_13wnr_81`,liveUnread:`_liveUnread_13wnr_89`,liveTitle:`_liveTitle_13wnr_89`,liveTime:`_liveTime_13wnr_91`,liveBody:`_liveBody_13wnr_95`,liveSub:`_liveSub_13wnr_97`,prio:`_prio_13wnr_99`,prio_high:`_prio_high_13wnr_103`,prio_medium:`_prio_medium_13wnr_104`,prio_low:`_prio_low_13wnr_105`,launcher:`_launcher_13wnr_108`,launchGroup:`_launchGroup_13wnr_115`,launchGroupLabel:`_launchGroupLabel_13wnr_117`,launchTiles:`_launchTiles_13wnr_123`,tile:`_tile_13wnr_129`,tileIcon:`_tileIcon_13wnr_143`,tileLabel:`_tileLabel_13wnr_144`},bt=[{view:`chat`,icon:`💬`,label:`Chat`,color:`#38bdf8`,group:`Panoramica`},{view:`plan`,icon:`🗓️`,label:`Daily Plan`,color:`#818cf8`,group:`Panoramica`},{view:`tasks`,icon:`✅`,label:`Tasks`,color:`#4ade80`,group:`Panoramica`},{view:`email`,icon:`📧`,label:`Email`,color:`#f87171`,group:`Google`},{view:`calendar`,icon:`📅`,label:`Calendar`,color:`#fb923c`,group:`Google`},{view:`drive`,icon:`💾`,label:`Drive`,color:`#facc15`,group:`Google`},{view:`contacts`,icon:`👤`,label:`Contacts`,color:`#34d399`,group:`Google`},{view:`notes`,icon:`📝`,label:`Notes`,color:`#a78bfa`,group:`Google`},{view:`onedrive`,icon:`☁️`,label:`OneDrive`,color:`#60a5fa`,group:`Microsoft`},{view:`mstodo`,icon:`📋`,label:`MS Todo`,color:`#38bdf8`,group:`Microsoft`},{view:`github`,icon:`🐙`,label:`GitHub`,color:`#e2e8f0`,group:`Tools`},{view:`notion`,icon:`📓`,label:`Notion`,color:`#94a3b8`,group:`Tools`},{view:`slack`,icon:`💼`,label:`Slack`,color:`#e879f9`,group:`Tools`},{view:`maps`,icon:`🗺️`,label:`Maps`,color:`#2dd4bf`,group:`Tools`},{view:`reminders`,icon:`🔔`,label:`Reminders`,color:`#fbbf24`,group:`Tools`},{view:`birthdays`,icon:`🎂`,label:`Birthdays`,color:`#f472b6`,group:`Tools`},{view:`cron`,icon:`⏰`,label:`Cron`,color:`#fb923c`,group:`Tools`},{view:`screen`,icon:`🖥️`,label:`Screen`,color:`#64748b`,group:`Tools`},{view:`agents`,icon:`🤖`,label:`Agents`,color:`#4ade80`,group:`AI`},{view:`studio`,icon:`🎭`,label:`Studio`,color:`#a78bfa`,group:`AI`},{view:`webcraft`,icon:`🔨`,label:`WebCraft`,color:`#f59e0b`,group:`AI`},{view:`collab`,icon:`🏛️`,label:`Alexandria`,color:`#38bdf8`,group:`AI`},{view:`connectors`,icon:`🔗`,label:`AWF - AutoWorkFlow`,color:`#94a3b8`,group:`Config`},{view:`settings`,icon:`⚙️`,label:`Settings`,color:`#64748b`,group:`Config`}],xt={Sunny:`☀️`,Clear:`☀️`,"Partly Cloudy":`⛅`,"Partly cloudy":`⛅`,Cloudy:`☁️`,Overcast:`☁️`,"Light rain":`🌧️`,Rain:`🌧️`,Drizzle:`🌧️`,"Moderate rain":`🌧️`,"Heavy rain":`🌧️`,Snow:`❄️`,"Light snow":`❄️`,Fog:`🌫️`,Mist:`🌫️`,Thunder:`⚡`,"Thundery outbreaks":`⚡`};function St(e){try{return new Date(e).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,hour12:!1})}catch{return e}}function Ct(e){try{return new Date(e).toLocaleDateString(`en`,{month:`short`,day:`numeric`})}catch{return e}}function wt(){let e=te(e=>e.setView),t=j(),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)([]),[o,s]=(0,_.useState)([]),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)(null),[f,p]=(0,_.useState)(new Date);(0,_.useEffect)(()=>{let e=setInterval(()=>p(new Date),6e4);return()=>clearInterval(e)},[]),(0,_.useEffect)(()=>{let e=!0,t=t=>n=>{e&&n!=null&&t(n)};E(`/api/tasks`).then(e=>t(r)(e?.tasks??[])),E(`/api/emails?page=0&pageSize=8`).then(e=>t(a)(e?.emails??[])),E(`/api/calendar`).then(e=>t(s)(e?.events??[])),E(`/api/status`).then(t(l));let n=localStorage.getItem(`nha_weather_location`),i=t=>E(`/api/weather?location=${encodeURIComponent(t)}`).then(t=>{e&&t&&t.city&&d(t)});return n?i(n):navigator.geolocation?.getCurrentPosition(e=>i(`${e.coords.latitude.toFixed(4)},${e.coords.longitude.toFixed(4)}`),()=>{},{timeout:6e3}),()=>{e=!1}},[]);let m=n.filter(e=>e.status!==`done`),h=n.filter(e=>e.status===`done`),g=n.length>0?Math.round(h.length/n.length*100):0,v=i.filter(e=>e.isUnread).length,y=f.toLocaleDateString(`en`,{weekday:`long`,month:`long`,day:`numeric`}),b=[...new Set(bt.map(e=>e.group))];return(0,k.jsxs)(`div`,{className:R.root,children:[(0,k.jsxs)(`div`,{className:R.hero,children:[(0,k.jsxs)(`div`,{className:R.heroLeft,children:[(0,k.jsx)(`div`,{className:R.heroDate,children:y}),(0,k.jsx)(`div`,{className:R.heroTitle,children:c?(0,k.jsxs)(k.Fragment,{children:[`NHA `,(0,k.jsxs)(`span`,{className:R.heroVer,children:[`v`,c.version]}),` · `,(0,k.jsxs)(`span`,{className:R.heroUptime,children:[Math.floor(c.uptime/60),`m uptime`]})]}):`NotHumanAllowed`})]}),(0,k.jsx)(`div`,{className:R.heroWeather,onClick:()=>{let e=prompt(`City or lat,lon:`);e&&(localStorage.setItem(`nha_weather_location`,e),d(null),E(`/api/weather?location=${encodeURIComponent(e)}`).then(e=>{e&&e.city&&d(e)}))},children:u?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`span`,{className:R.wIcon,children:xt[u.desc]??u.icon??`🌡️`}),(0,k.jsxs)(`div`,{className:R.wInfo,children:[(0,k.jsxs)(`span`,{className:R.wTemp,children:[u.tempC,`°C`]}),(0,k.jsxs)(`span`,{className:R.wCity,children:[u.city.split(`,`)[0],u.country?`, ${u.country.slice(0,2).toUpperCase()}`:``]}),(0,k.jsxs)(`span`,{className:R.wDesc,children:[u.desc,` · 💧`,u.humidity,`%`]})]})]}):(0,k.jsxs)(`span`,{className:R.wEmpty,children:[`🌡️ `,t(`dashboard.weather`)]})})]}),(0,k.jsxs)(`div`,{className:R.kpiRow,children:[(0,k.jsxs)(`div`,{className:R.kpi,onClick:()=>e(`tasks`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.kpiNum,children:m.length}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:`Pending tasks`}),n.length>0&&(0,k.jsx)(`div`,{className:R.kpiBar,children:(0,k.jsx)(`div`,{className:R.kpiFill,style:{width:`${g}%`}})})]}),(0,k.jsxs)(`div`,{className:R.kpi,onClick:()=>e(`email`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.kpiNum,children:v>0?v:i.length}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:v>0?`Unread emails`:`Emails`})]}),(0,k.jsxs)(`div`,{className:R.kpi,onClick:()=>e(`calendar`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.kpiNum,children:o.length}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:`Today's events`})]}),u&&(0,k.jsxs)(`div`,{className:R.kpi,children:[(0,k.jsxs)(`span`,{className:R.kpiNum,children:[u.feelsC,`°`]}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:`Feels like`})]})]}),(0,k.jsxs)(`div`,{className:R.liveGrid,children:[o.length>0&&(0,k.jsxs)(`div`,{className:R.liveCard,children:[(0,k.jsxs)(`div`,{className:R.liveHdr,onClick:()=>e(`calendar`),role:`button`,children:[(0,k.jsxs)(`span`,{children:[`📅 `,t(`calendar.title`)]}),(0,k.jsx)(`span`,{className:R.liveMore,children:`→`})]}),o.slice(0,5).map((t,n)=>(0,k.jsxs)(`div`,{className:R.liveRow,onClick:()=>e(`calendar`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.liveTime,children:t.isAllDay?`All day`:St(t.start)}),(0,k.jsxs)(`div`,{className:R.liveBody,children:[(0,k.jsx)(`span`,{className:R.liveTitle,children:t.summary}),t.location&&(0,k.jsx)(`span`,{className:R.liveSub,children:t.location})]})]},n))]}),i.length>0&&(0,k.jsxs)(`div`,{className:R.liveCard,children:[(0,k.jsxs)(`div`,{className:R.liveHdr,onClick:()=>e(`email`),role:`button`,children:[(0,k.jsxs)(`span`,{children:[`📧 `,t(`email.inbox`)]}),(0,k.jsx)(`span`,{className:R.liveMore,children:`→`})]}),i.slice(0,5).map((t,n)=>(0,k.jsxs)(`div`,{className:`${R.liveRow} ${t.isUnread?R.liveUnread:``}`,onClick:()=>e(`email`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.liveTime,children:Ct(t.date)}),(0,k.jsxs)(`div`,{className:R.liveBody,children:[(0,k.jsx)(`span`,{className:R.liveTitle,children:t.subject}),(0,k.jsx)(`span`,{className:R.liveSub,children:t.from})]})]},n))]}),m.length>0&&(0,k.jsxs)(`div`,{className:R.liveCard,children:[(0,k.jsxs)(`div`,{className:R.liveHdr,onClick:()=>e(`tasks`),role:`button`,children:[(0,k.jsxs)(`span`,{children:[`✅ `,t(`tasks.title`),` · `,h.length,`/`,n.length,` (`,g,`%)`]}),(0,k.jsx)(`span`,{className:R.liveMore,children:`→`})]}),m.slice(0,5).map((t,n)=>(0,k.jsxs)(`div`,{className:R.liveRow,onClick:()=>e(`tasks`),role:`button`,children:[(0,k.jsx)(`span`,{className:`${R.prio} ${R[`prio_`+t.priority]}`,children:t.priority[0].toUpperCase()}),(0,k.jsx)(`div`,{className:R.liveBody,children:(0,k.jsx)(`span`,{className:R.liveTitle,children:t.description})})]},n))]})]}),(0,k.jsx)(`div`,{className:R.launcher,children:b.map(t=>(0,k.jsxs)(`div`,{className:R.launchGroup,children:[(0,k.jsx)(`div`,{className:R.launchGroupLabel,children:t}),(0,k.jsx)(`div`,{className:R.launchTiles,children:bt.filter(e=>e.group===t).map(t=>(0,k.jsxs)(`button`,{className:R.tile,onClick:()=>e(t.view),style:{"--tc":t.color},children:[(0,k.jsx)(`span`,{className:R.tileIcon,children:t.icon}),(0,k.jsx)(`span`,{className:R.tileLabel,children:t.label})]},t.view))})]},t))})]})}var Tt={root:`_root_1pldx_1`,loading:`_loading_1pldx_2`,bar:`_bar_1pldx_4`,input:`_input_1pldx_5`,select:`_select_1pldx_6`,addBtn:`_addBtn_1pldx_7`,actions:`_actions_1pldx_10`,clearDone:`_clearDone_1pldx_11`,clearAll:`_clearAll_1pldx_12`,stats:`_stats_1pldx_14`,progress:`_progress_1pldx_15`,progressBar:`_progressBar_1pldx_16`,empty:`_empty_1pldx_18`,task:`_task_1pldx_20`,taskDone:`_taskDone_1pldx_22`,check:`_check_1pldx_23`,checkDone:`_checkDone_1pldx_25`,desc:`_desc_1pldx_26`,del:`_del_1pldx_27`,badge:`_badge_1pldx_30`,badge_high:`_badge_high_1pldx_31`,badge_medium:`_badge_medium_1pldx_32`,badge_low:`_badge_low_1pldx_33`,doneLabel:`_doneLabel_1pldx_35`};function Et(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(`medium`),[l,u]=(0,_.useState)(!1),d=(0,_.useRef)(null),f=()=>E(`/api/tasks`).then(e=>{n(e?.tasks??[]),i(!1)});(0,_.useEffect)(()=>{f()},[]);let p=async()=>{a.trim()&&(u(!0),await D(`/api/tasks`,{description:a.trim(),priority:s}),o(``),u(!1),f(),d.current?.focus())},m=e=>D(`/api/tasks/${e}/done`,{},`PATCH`).then(f),h=e=>D(`/api/tasks/${e}/delete`,{}).then(f),g=()=>D(`/api/tasks/clear`,{filter:`done`}).then(f),v=()=>{confirm(e(`tasks.deleteTask`))&&D(`/api/tasks/clear`,{filter:`all`}).then(f)},y=t.filter(e=>e.status!==`done`),b=t.filter(e=>e.status===`done`);return r?(0,k.jsxs)(`div`,{className:Tt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),e(`common.loading`)]}):(0,k.jsxs)(`div`,{className:Tt.root,children:[(0,k.jsxs)(`div`,{className:Tt.bar,children:[(0,k.jsx)(`input`,{ref:d,className:Tt.input,value:a,onChange:e=>o(e.target.value),onKeyDown:e=>e.key===`Enter`&&p(),placeholder:e(`tasks.newTask`)}),(0,k.jsxs)(`select`,{className:Tt.select,value:s,onChange:e=>c(e.target.value),children:[(0,k.jsx)(`option`,{value:`high`,children:`High`}),(0,k.jsx)(`option`,{value:`medium`,children:`Medium`}),(0,k.jsx)(`option`,{value:`low`,children:`Low`})]}),(0,k.jsx)(`button`,{className:Tt.addBtn,onClick:p,disabled:l||!a.trim(),children:l?`…`:`+ `+e(`common.add`)})]}),t.length>0&&(0,k.jsxs)(`div`,{className:Tt.actions,children:[(0,k.jsx)(`button`,{className:Tt.clearDone,onClick:g,children:`Clear completed`}),(0,k.jsx)(`button`,{className:Tt.clearAll,onClick:v,children:`Clear all`})]}),t.length>0&&(0,k.jsxs)(`div`,{className:Tt.stats,children:[y.length,` pending · `,b.length,` done`,t.length>0&&(0,k.jsx)(`span`,{className:Tt.progress,children:(0,k.jsx)(`span`,{className:Tt.progressBar,style:{width:`${Math.round(b.length/t.length*100)}%`}})})]}),y.length===0&&b.length===0&&(0,k.jsx)(`div`,{className:Tt.empty,children:`No tasks yet. Add one above ↑`}),y.map(e=>(0,k.jsxs)(`div`,{className:Tt.task,children:[(0,k.jsx)(`span`,{className:Tt.check,onClick:()=>m(e.id)}),(0,k.jsx)(`span`,{className:Tt.desc,onClick:()=>m(e.id),children:e.description}),(0,k.jsx)(`span`,{className:`${Tt.badge} ${Tt[`badge_`+e.priority]}`,children:e.priority}),(0,k.jsx)(`span`,{className:Tt.del,onClick:()=>h(e.id),children:`×`})]},e.id)),b.length>0&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`div`,{className:Tt.doneLabel,children:`Completed`}),b.map(e=>(0,k.jsxs)(`div`,{className:`${Tt.task} ${Tt.taskDone}`,children:[(0,k.jsx)(`span`,{className:`${Tt.check} ${Tt.checkDone}`,onClick:()=>m(e.id),children:`✓`}),(0,k.jsx)(`span`,{className:Tt.desc,onClick:()=>m(e.id),children:e.description}),(0,k.jsx)(`span`,{className:`${Tt.badge} ${Tt[`badge_`+e.priority]}`,children:e.priority}),(0,k.jsx)(`span`,{className:Tt.del,onClick:()=>h(e.id),children:`×`})]},e.id))]})]})}var z={root:`_root_k5v14_1`,loading:`_loading_k5v14_2`,card:`_card_k5v14_4`,cardTitle:`_cardTitle_k5v14_5`,cardTitleRow:`_cardTitleRow_k5v14_6`,cardSub:`_cardSub_k5v14_7`,connected:`_connected_k5v14_8`,statusMsg:`_statusMsg_k5v14_9`,fields:`_fields_k5v14_11`,field:`_field_k5v14_11`,fieldLabel:`_fieldLabel_k5v14_13`,fieldInput:`_fieldInput_k5v14_14`,saveBtn:`_saveBtn_k5v14_17`,dangerBtn:`_dangerBtn_k5v14_18`,cancelBtn:`_cancelBtn_k5v14_19`,btnRow:`_btnRow_k5v14_20`,keySet:`_keySet_k5v14_22`,keySummary:`_keySummary_k5v14_23`,keySummaryIcon:`_keySummaryIcon_k5v14_24`,nhaFree:`_nhaFree_k5v14_26`,nhaFreeTitle:`_nhaFreeTitle_k5v14_27`,nhaFreeSub:`_nhaFreeSub_k5v14_28`,nhaFreeBtn:`_nhaFreeBtn_k5v14_29`,imapRow:`_imapRow_k5v14_31`,imapName:`_imapName_k5v14_32`,imapMeta:`_imapMeta_k5v14_33`,imapStatus:`_imapStatus_k5v14_34`,imapBtns:`_imapBtns_k5v14_38`,imapSyncBtn:`_imapSyncBtn_k5v14_39`,imapEditBtn:`_imapEditBtn_k5v14_40`,imapDelBtn:`_imapDelBtn_k5v14_41`,emptyImap:`_emptyImap_k5v14_42`,imapForm:`_imapForm_k5v14_44`,imapFormTitle:`_imapFormTitle_k5v14_45`,pwdNote:`_pwdNote_k5v14_46`,pwdRow:`_pwdRow_k5v14_47`,togglePwd:`_togglePwd_k5v14_48`},Dt={id:``,display_name:``,email_address:``,from_name:``,imap_host:``,imap_port:`993`,smtp_host:``,smtp_port:`587`,username:``,password:``};function Ot({id:e,label:t,placeholder:n,value:r,onChange:i,type:a=`text`}){return(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t}),(0,k.jsx)(`input`,{id:e,type:a,placeholder:n,value:r,onChange:e=>i(e.target.value),className:z.fieldInput})]})}function kt(){let[e,t]=(0,_.useState)([]),[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)(``),f=()=>{E(`/api/credentials`).then(e=>t(e?.credentials??[])).catch(()=>t([]))};(0,_.useEffect)(()=>{f()},[]);let p=async()=>{if(!/^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(n)){d(`Name: lettere, cifre, _ — primo carattere non numerico`);return}if(!i.trim()){d(`Value required`);return}l(!0),d(``);try{let e=await D(`/api/credentials`,{name:n,value:i,description:o});e&&!e.ok&&e.error?d(e.error):(r(``),a(``),s(``),f())}finally{l(!1)}},m=async e=>{confirm(`Delete credential "${e}"?`)&&(await fetch(`/api/credentials/${encodeURIComponent(e)}`,{method:`DELETE`}),f())};return(0,k.jsxs)(`div`,{style:{marginTop:16,padding:16,background:`var(--bg2, rgba(15,23,42,0.4))`,border:`1px solid var(--border, rgba(148,163,184,0.18))`,borderRadius:10},children:[(0,k.jsx)(`div`,{style:{fontSize:14,fontWeight:800,marginBottom:4},children:`Credentials Vault 🔐`}),(0,k.jsxs)(`div`,{style:{fontSize:11,opacity:.7,marginBottom:10},children:[`Encrypted secrets (AES-256-GCM, machine-bound key). Reference them in workflow nodes with `,(0,k.jsx)(`code`,{children:"${cred.NAME}"}),`. The raw value never leaves your computer.`]}),e.length>0&&(0,k.jsx)(`div`,{style:{marginBottom:12,border:`1px solid rgba(148,163,184,0.15)`,borderRadius:6},children:e.map(e=>(0,k.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,padding:`6px 10px`,borderBottom:`1px solid rgba(148,163,184,0.1)`,fontSize:12},children:[(0,k.jsx)(`code`,{style:{background:`rgba(99,102,241,0.12)`,padding:`2px 6px`,borderRadius:4,color:`#a5b4fc`,fontWeight:700},children:e.name}),(0,k.jsx)(`span`,{style:{flex:1,opacity:.7},children:e.description||(0,k.jsx)(`em`,{children:`no description`})}),(0,k.jsx)(`span`,{style:{fontSize:10,opacity:.5},children:new Date(e.updatedAt).toLocaleString()}),e.hasError&&(0,k.jsx)(`span`,{style:{color:`#ef4444`,fontSize:10},children:`⚠ decrypt error`}),(0,k.jsx)(`button`,{onClick:()=>m(e.name),style:{background:`transparent`,border:`none`,cursor:`pointer`,color:`#ef4444`,fontSize:14},children:`✕`})]},e.name))}),(0,k.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`1fr 1fr`,gap:8},children:[(0,k.jsx)(`input`,{placeholder:`NAME (e.g. STRIPE_KEY)`,value:n,onChange:e=>r(e.target.value),style:{padding:6,borderRadius:4,border:`1px solid rgba(148,163,184,0.2)`,background:`transparent`,color:`inherit`,fontFamily:`SF Mono, monospace`}}),(0,k.jsx)(`input`,{placeholder:`Description (optional)`,value:o,onChange:e=>s(e.target.value),style:{padding:6,borderRadius:4,border:`1px solid rgba(148,163,184,0.2)`,background:`transparent`,color:`inherit`}})]}),(0,k.jsx)(`input`,{type:`password`,placeholder:`Value (encrypted at rest)`,value:i,onChange:e=>a(e.target.value),style:{width:`100%`,marginTop:6,padding:6,borderRadius:4,border:`1px solid rgba(148,163,184,0.2)`,background:`transparent`,color:`inherit`}}),u&&(0,k.jsx)(`div`,{style:{color:`#ef4444`,fontSize:11,marginTop:4},children:u}),(0,k.jsx)(`button`,{onClick:p,disabled:c,style:{marginTop:8,padding:`6px 14px`,borderRadius:4,border:`none`,background:`#6366f1`,color:`white`,fontWeight:700,cursor:`pointer`,opacity:c?.5:1},children:c?`Saving…`:`+ Add credential`})]})}function At(){let{setConfig:e}=te(),t=j(),[n,r]=(0,_.useState)({}),[i,a]=(0,_.useState)(!0),[o,s]=(0,_.useState)(null),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)([]),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(``),[y,b]=(0,_.useState)(!1),[x,S]=(0,_.useState)({name:``,email:``,phone:``,homeAddress:``,workAddress:``,city:``,country:``,company:``,role:``,notes:``}),[C,w]=(0,_.useState)(`nha`),[ee,T]=(0,_.useState)(``),[ne,re]=(0,_.useState)(``),[ie,O]=(0,_.useState)(``),[ae,A]=(0,_.useState)(``),[oe,se]=(0,_.useState)(``),[ce,le]=(0,_.useState)(``),[ue,de]=(0,_.useState)(``),[M,fe]=(0,_.useState)(``),[pe,me]=(0,_.useState)(!1),[he,ge]=(0,_.useState)(``),[_e,ve]=(0,_.useState)(`en`),[ye,be]=(0,_.useState)(`07:00`),[xe,Se]=(0,_.useState)(`18:00`),[N,Ce]=(0,_.useState)(`30`),[we,Te]=(0,_.useState)(`off`),[Ee,P]=(0,_.useState)(``),[De,Oe]=(0,_.useState)(``),[ke,F]=(0,_.useState)(``),[I,Ae]=(0,_.useState)(`agent`),[je,Me]=(0,_.useState)(``),[Ne,Pe]=(0,_.useState)(!0),[Fe,Ie]=(0,_.useState)(!0),[Le,Re]=(0,_.useState)(`3`),[ze,L]=(0,_.useState)(`0.30`),[Be,Ve]=(0,_.useState)(!0),[He,Ue]=(0,_.useState)(!1),[We,Ge]=(0,_.useState)(!1),[Ke,qe]=(0,_.useState)(!1),[Je,Ye]=(0,_.useState)(!1),[Xe,Ze]=(0,_.useState)(!1),[Qe,$e]=(0,_.useState)(!1),[et,tt]=(0,_.useState)(!0),[nt,rt]=(0,_.useState)(``),[it,at]=(0,_.useState)(!1),[ot,st]=(0,_.useState)(!1),[ct,lt]=(0,_.useState)(!0),[ut,dt]=(0,_.useState)(``),[ft,pt]=(0,_.useState)(``),[mt,ht]=(0,_.useState)(``),[gt,_t]=(0,_.useState)(``),[vt,yt]=(0,_.useState)(`common`),[R,bt]=(0,_.useState)(!1),[xt,St]=(0,_.useState)(``);(0,_.useEffect)(()=>{E(`/api/config`).then(t=>{r(t??{});let n=t?.profile??{};S({name:n.name??``,email:n.email??``,phone:n.phone??``,homeAddress:n.homeAddress??``,workAddress:n.workAddress??``,city:n.city??``,country:n.country??``,company:n.company??``,role:n.role??``,notes:n.notes??``}),w(t?.provider??`nha`),ge(t?.model??``),ve(t?.lang??`en`),be(t?.planTime??`07:00`),Se(t?.summaryTime??`18:00`),Ce(String(t?.meetingAlert??`30`)),Te(t?.thinking??`off`),T(``);let i=t?.responder,o=i?.telegram;F(String(o?.botName??``));let s=String(o?.personaMode??`agent`);Ae(s===`persona`||s===`persona-only`||s===`persona+role`?s:`agent`),Me(Array.isArray(o?.allowedChatIds)?o.allowedChatIds.join(`, `):``),Pe(i?.autoRoute!==!1);let c=t?.deliberation;Ie(c?.enabled!==!1),Re(String(c?.rounds??`3`)),L(String(c?.convergence??`0.30`)),Ve(c?.tribunalEnabled!==!1);let l=t?.ops?.proactive;Ue(!!l?.enabled),Ge(!!l?.emailFollowUp),qe(!!l?.meetingPrep),Ye(!!l?.patterns),Ze(!!l?.deadlines);let u=t?.voice;$e(!!u?.preferWhisper),tt(u?.speechSynthesis!==!1),rt(String(u?.language??``));let d=t?.features;at(!!d?.verbose),st(!!d?.immersive),lt(d?.knowledgeEnabled!==!1),dt(``),pt(String(t?.github?.defaultRepo??``)),ht(``),_t(``);let f=t?.microsoft;yt(String(f?.tenantId??`common`));let p=t?.plugins;bt(!!p?.autoRun),St(String(p?.directory??``)),a(!1),t&&e(t)}),Ct()},[]);let Ct=()=>E(`/api/imap/accounts`).then(e=>d(e?.accounts??[])),wt=async(e,t)=>{s(e),await D(`/api/config`,{key:e,value:t}),l(e),s(null),setTimeout(()=>l(null),2e3)},Tt=()=>wt(`profile`,x),Et=()=>{wt(`provider`,C),wt(`model`,he),wt(`thinking`,we),ee&&wt(`key`,ee),ne&&wt(`groq-key`,ne),ie&&wt(`openai-key`,ie),ae&&wt(`gemini-key`,ae),oe&&wt(`deepseek-key`,oe),ce&&wt(`grok-key`,ce),ue&&wt(`mistral-key`,ue),M&&wt(`cohere-key`,M)},At=()=>{wt(`planTime`,ye),wt(`summaryTime`,xe),wt(`meetingAlert`,Number(N))},jt=()=>{v(t(`settings.googleOpening`)),D(`/api/google/auth`,{}).then(e=>{e?.url?(window.open(e.url,`_blank`),v(t(`settings.googleOpened`))):e?.error&&v(t(`common.error`)+`: `+e.error)}).catch(e=>v(t(`common.error`)+`: `+e.message))},Mt=()=>{confirm(t(`settings.disconnectGoogleConfirm`))&&D(`/api/google/revoke`,{}).then(()=>{r(e=>({...e,hasGoogle:!1})),v(t(`common.disconnected`))})},B=()=>{if(!f)return;let e=!!f.id,t={display_name:f.display_name,email_address:f.email_address,from_name:f.from_name,imap_host:f.imap_host,imap_port:Number(f.imap_port),smtp_host:f.smtp_host,smtp_port:Number(f.smtp_port),username:f.username};f.password&&(t.password=f.password),e&&(t.id=f.id),h(`Saving…`),D(e?`/api/imap/accounts/update`:`/api/imap/accounts`,t).then(e=>{e?.ok||e?.id?(h(`Saved!`),p(null),Ct()):h(`Error: `+(e?.error??`Unknown error`))}).catch(e=>h(`Error: `+e.message))},Nt=(e,n)=>{confirm(t(`settings.imapDelete`,{name:n}))&&D(`/api/imap/accounts/delete`,{id:e}).then(()=>Ct())},Pt=e=>{D(`/api/imap/sync`,{accountId:e}).then(()=>setTimeout(Ct,3e3))},Ft=async e=>{if(!f)return;if(!f.password&&!f.id){h(`⚠ Inserisci la password prima di testare.`);return}h(e?`Invio email di prova…`:`Test connessione in corso…`);let t={imap_host:f.imap_host,imap_port:Number(f.imap_port),smtp_host:f.smtp_host,smtp_port:Number(f.smtp_port),username:f.username,password:f.password,email_address:f.email_address,from_name:f.from_name,sendTest:e};try{let e=await D(`/api/imap/test`,t),n=e?.imap,r=e?.smtp,i=[];n?.ok?i.push(`✓ IMAP OK (TLS=${n.secure?`implicit`:`STARTTLS`}, ${n.folderCount??`?`} cartelle)`):i.push(`✗ IMAP errore: ${n?.error??`sconosciuto`}`),r?.ok?r.sent?i.push(`✓ SMTP OK — email di prova inviata a ${f.email_address} (id ${(r.messageId||``).slice(0,24)}…)`):i.push(`✓ SMTP OK (TLS=${r.secure?`implicit`:`STARTTLS`}, auth valida)`):i.push(`✗ SMTP errore: ${r?.error??`sconosciuto`}`),h(i.join(` · `))}catch(e){h(`✗ Test fallito: ${e.message}`)}};if(i)return(0,k.jsxs)(`div`,{className:z.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),t(`common.loading`)]});let It=e=>t(o===e?`common.saving`:c===e?`common.saved`:`common.save`);return(0,k.jsxs)(`div`,{className:z.root,children:[(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.profile`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.profileSub`)}),(0,k.jsx)(`div`,{className:z.fields,children:[[`name`,t(`settings.name`),t(`settings.namePh`)],[`email`,t(`common.email`),t(`settings.emailPh`)],[`phone`,t(`common.phone`),t(`settings.phonePh`)],[`homeAddress`,t(`settings.homeAddress`),t(`settings.homeAddressPh`)],[`workAddress`,t(`settings.workAddress`),t(`settings.workAddressPh`)],[`city`,t(`settings.city`),t(`settings.cityPh`)],[`country`,t(`settings.country`),t(`settings.countryPh`)],[`company`,t(`settings.company`),t(`settings.companyPh`)],[`role`,t(`settings.role`),t(`settings.rolePh`)],[`notes`,t(`settings.notes`),t(`settings.notesPh`)]].map(([e,t,n])=>(0,k.jsx)(Ot,{id:e,label:t,placeholder:n,value:x[e],onChange:t=>S(n=>({...n,[e]:t}))},e))}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:Tt,children:[It(`profile`),` `,t(`settings.saveProfile`)]})]}),(0,k.jsxs)(`div`,{className:z.nhaFree,children:[(0,k.jsx)(`div`,{className:z.nhaFreeTitle,children:t(`settings.nhaFreeTitle`)}),(0,k.jsx)(`div`,{className:z.nhaFreeSub,children:t(`settings.nhaFreeSub`)}),(0,k.jsx)(`button`,{className:z.nhaFreeBtn,onClick:()=>{D(`/api/config`,{updates:[{key:`provider`,value:`nha`},{key:`model`,value:``},{key:`key`,value:``}]}).then(()=>{w(`nha`),ge(``),T(``),l(`nhaFree`),setTimeout(()=>l(null),2e3)})},children:t(c===`nhaFree`?`settings.liaraActivated`:`settings.useLiara`)})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.llmProvider`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.llmProviderSub`)}),(()=>{let e=[];return n.hasApiKey&&e.push(`Anthropic`),n.hasOpenaiKey&&e.push(`OpenAI`),n.hasGeminiKey&&e.push(`Gemini`),n.hasDeepseekKey&&e.push(`DeepSeek`),n.hasGrokKey&&e.push(`Grok`),n.hasMistralKey&&e.push(`Mistral`),n.hasCohereKey&&e.push(`Cohere`),e.length===0?null:(0,k.jsxs)(`div`,{className:z.keySummary,children:[(0,k.jsx)(`span`,{className:z.keySummaryIcon,children:`🔑`}),(0,k.jsxs)(`span`,{children:[`Chiavi configurate: `,(0,k.jsx)(`strong`,{children:e.join(`, `)})]})]})})(),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t(`settings.provider`)}),(0,k.jsxs)(`select`,{value:C,onChange:e=>w(e.target.value),className:z.fieldInput,children:[(0,k.jsx)(`option`,{value:`nha`,children:`NHA Free (Liara) — no API key needed`}),(0,k.jsx)(`option`,{value:`anthropic`,children:`Anthropic (Claude)`}),(0,k.jsx)(`option`,{value:`openai`,children:`OpenAI (GPT-4)`}),(0,k.jsx)(`option`,{value:`gemini`,children:`Google (Gemini)`}),(0,k.jsx)(`option`,{value:`deepseek`,children:`DeepSeek`}),(0,k.jsx)(`option`,{value:`grok`,children:`xAI (Grok)`}),(0,k.jsx)(`option`,{value:`mistral`,children:`Mistral`}),(0,k.jsx)(`option`,{value:`cohere`,children:`Cohere`})]})]}),C!==`nha`&&({anthropic:n.hasApiKey,openai:n.hasOpenaiKey,gemini:n.hasGeminiKey,deepseek:n.hasDeepseekKey,grok:n.hasGrokKey,mistral:n.hasMistralKey,cohere:n.hasCohereKey}[C]?(0,k.jsx)(`div`,{className:z.keySet,children:t(`settings.apiKeySet`)}):null),(0,k.jsx)(Ot,{id:`apiKey`,label:t(`settings.apiKey`),placeholder:t(C===`nha`?`settings.apiKeyFreeNote`:`settings.apiKeyPh`),type:`password`,value:ee,onChange:T}),(0,k.jsx)(Ot,{id:`groqKey`,label:`Groq Key (voice / Whisper)`,placeholder:n.hasGroqKey?`✓ configured — leave empty to keep`:`gsk_... (free at console.groq.com/keys) — enables Telegram voice transcription`,type:`password`,value:ne,onChange:re}),(0,k.jsx)(`div`,{style:{marginTop:8,marginBottom:4},children:(0,k.jsxs)(`button`,{type:`button`,onClick:()=>me(!pe),style:{background:`transparent`,border:`none`,color:`var(--accent, #6366f1)`,cursor:`pointer`,fontSize:12,padding:0,fontWeight:600},children:[pe?`▾`:`▸`,` Optional provider keys (OpenAI, Gemini, DeepSeek, Grok, Mistral, Cohere)`]})}),pe&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(Ot,{id:`openaiKey`,label:`OpenAI Key`,placeholder:n.hasOpenaiKey?`✓ configured — leave empty to keep`:`sk-... (platform.openai.com)`,type:`password`,value:ie,onChange:O}),(0,k.jsx)(Ot,{id:`geminiKey`,label:`Gemini Key (Google)`,placeholder:n.hasGeminiKey?`✓ configured — leave empty to keep`:`AIza... (aistudio.google.com)`,type:`password`,value:ae,onChange:A}),(0,k.jsx)(Ot,{id:`deepseekKey`,label:`DeepSeek Key`,placeholder:n.hasDeepseekKey?`✓ configured — leave empty to keep`:`sk-... (platform.deepseek.com)`,type:`password`,value:oe,onChange:se}),(0,k.jsx)(Ot,{id:`grokKey`,label:`Grok Key (X.AI)`,placeholder:n.hasGrokKey?`✓ configured — leave empty to keep`:`xai-... (console.x.ai)`,type:`password`,value:ce,onChange:le}),(0,k.jsx)(Ot,{id:`mistralKey`,label:`Mistral Key`,placeholder:n.hasMistralKey?`✓ configured — leave empty to keep`:`... (console.mistral.ai)`,type:`password`,value:ue,onChange:de}),(0,k.jsx)(Ot,{id:`cohereKey`,label:`Cohere Key`,placeholder:n.hasCohereKey?`✓ configured — leave empty to keep`:`... (dashboard.cohere.com)`,type:`password`,value:M,onChange:fe})]}),(0,k.jsx)(Ot,{id:`model`,label:t(`settings.model`),placeholder:t(`settings.modelPh`),value:he,onChange:ge}),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t(`settings.thinking`)}),(0,k.jsxs)(`select`,{value:we,onChange:e=>Te(e.target.value),className:z.fieldInput,children:[(0,k.jsx)(`option`,{value:`off`,children:t(`settings.thinkingOff`)}),(0,k.jsx)(`option`,{value:`on`,children:t(`settings.thinkingOn`)})]})]}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:Et,children:[It(`provider`),` `,t(`settings.saveProvider`)]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.language`)}),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t(`settings.languageLabel`)}),(0,k.jsx)(`select`,{value:_e,onChange:t=>{let r=t.target.value;ve(r),wt(`lang`,r),e({...n,lang:r})},className:z.fieldInput,children:[[`it`,`Italiano`],[`en`,`English`],[`es`,`Español`],[`fr`,`Français`],[`de`,`Deutsch`],[`pt`,`Português`],[`nl`,`Nederlands`],[`pl`,`Polski`],[`ru`,`Русский`],[`zh`,`中文`],[`ja`,`日本語`],[`ko`,`한국어`],[`ar`,`العربية`],[`hi`,`हिन्दी`],[`tr`,`Türkçe`],[`sv`,`Svenska`],[`da`,`Dansk`],[`fi`,`Suomi`],[`cs`,`Čeština`]].map(([e,t])=>(0,k.jsx)(`option`,{value:e,children:t},e))})]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.telegram`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.telegramSub`)}),n.hasTelegram&&(0,k.jsxs)(`div`,{className:z.connected,children:[`Telegram: `,t(`common.connected`)]}),n.hasDiscord&&(0,k.jsxs)(`div`,{className:z.connected,children:[`Discord: `,t(`common.connected`)]}),(0,k.jsx)(Ot,{id:`tgToken`,label:t(`settings.telegramToken`),placeholder:n.hasTelegram?t(`settings.telegramSet`):t(`settings.telegramPh`),type:`password`,value:Ee,onChange:P}),(0,k.jsx)(Ot,{id:`discordToken`,label:t(`settings.discordToken`),placeholder:n.hasDiscord?t(`settings.discordSet`):t(`settings.discordPh`),type:`password`,value:De,onChange:Oe}),(0,k.jsx)(Ot,{id:`botName`,label:`Bot Persona Name`,placeholder:`e.g. Agata — what name the bot uses when replying. Empty = show internal agent name (HERALD/ATHENA/...)`,value:ke,onChange:F}),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:`Persona display mode`}),(0,k.jsxs)(`select`,{value:I,onChange:e=>Ae(e.target.value),className:z.fieldInput,children:[(0,k.jsx)(`option`,{value:`agent`,children:`agent — show internal name [HERALD] (legacy/debug)`}),(0,k.jsx)(`option`,{value:`persona`,children:`persona — show [BotName] only (recommended)`}),(0,k.jsx)(`option`,{value:`persona-only`,children:`persona-only — no prefix at all (most natural)`}),(0,k.jsx)(`option`,{value:`persona+role`,children:`persona+role — [BotName · agent] (power users)`})]})]}),(0,k.jsx)(Ot,{id:`allowedChatIds`,label:`Allowed Chat IDs (Telegram)`,placeholder:`comma-separated numeric chat IDs (empty = anyone can chat with the bot)`,value:je,onChange:Me}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Ne,onChange:e=>Pe(e.target.checked)}),` `,`Auto-route messages to specialist agents (recommended)`]})}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{Ee&&wt(`telegram-bot-token`,Ee),De&&wt(`discord-bot-token`,De),wt(`bot-name`,ke),wt(`persona-mode`,I),wt(`responder.telegram.allowedChatIds`,je.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>Number(e)||e)),wt(`responder-auto-route`,Ne)},children:[It(`telegram-bot-token`),` `,t(`settings.saveBots`)]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.dailyOps`)}),(0,k.jsx)(Ot,{id:`planTime`,label:t(`settings.planTime`),placeholder:`07:00`,value:ye,onChange:be}),(0,k.jsx)(Ot,{id:`summaryTime`,label:t(`settings.summaryTime`),placeholder:`18:00`,value:xe,onChange:Se}),(0,k.jsx)(Ot,{id:`meetingAlert`,label:t(`settings.meetingAlert`),placeholder:`30`,value:N,onChange:Ce}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:At,children:[It(`planTime`),` `,t(`settings.saveSchedule`)]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Deliberation (Geth Consensus)`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Multi-round inter-agent reasoning for higher-quality answers`}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Fe,onChange:e=>Ie(e.target.checked)}),` `,`Enable deliberation`]})}),(0,k.jsx)(Ot,{id:`delibRounds`,label:`Rounds (1–5)`,placeholder:`3`,value:Le,onChange:Re}),(0,k.jsx)(Ot,{id:`delibConvergence`,label:`Convergence threshold (0–1, lower = stricter)`,placeholder:`0.30`,value:ze,onChange:L}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Be,onChange:e=>Ve(e.target.checked)}),` `,`Tribunal (final HERALD mediation)`]})}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`deliberation`,Fe),wt(`rounds`,Number(Le)),wt(`convergence`,Number(ze)),wt(`tribunal`,Be)},children:[It(`deliberation`),` Save deliberation`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Proactive Intelligence`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`The bot acts on its own initiative (follow-ups, meeting prep, pattern detection)`}),[[`proactive`,`Master switch — enable proactive`,He,Ue],[`proactive-email`,`Email follow-up reminders`,We,Ge],[`proactive-meeting`,`Meeting preparation digests`,Ke,qe],[`proactive-patterns`,`Behavioural pattern detection`,Je,Ye],[`proactive-deadlines`,`Deadline tracking`,Xe,Ze]].map(([e,t,n,r])=>(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:n,onChange:e=>r(e.target.checked)}),` `,t]})},String(e))),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`proactive`,He),wt(`proactive-email`,We),wt(`proactive-meeting`,Ke),wt(`proactive-patterns`,Je),wt(`proactive-deadlines`,Xe)},children:[It(`proactive`),` Save proactive`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Voice`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Transcription (Whisper via Groq) and text-to-speech`}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Qe,onChange:e=>$e(e.target.checked)}),` `,`Prefer Whisper (Groq) over local STT`]})}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:et,onChange:e=>tt(e.target.checked)}),` `,`Speech synthesis (read replies aloud)`]})}),(0,k.jsx)(Ot,{id:`voiceLanguage`,label:`Voice language (BCP 47, e.g. it-IT, en-US)`,placeholder:`empty = use UI language`,value:nt,onChange:rt}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`voice-whisper`,Qe),wt(`voice-speech`,et),nt&&wt(`voice-language`,nt)},children:[It(`voice-whisper`),` Save voice`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Features`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Core behaviour toggles`}),[[`verbose`,`Verbose logging (more diagnostics, more tokens)`,it,at],[`immersive`,`Immersive office scene animation in Studio`,ot,st],[`knowledge`,`Knowledge base (memories + skills retrieval)`,ct,lt]].map(([e,t,n,r])=>(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:n,onChange:e=>r(e.target.checked)}),` `,t]})},String(e))),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`verbose`,it),wt(`immersive`,ot),wt(`knowledge`,ct)},children:[It(`verbose`),` Save features`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Integration tokens`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`GitHub, Notion, Slack — used by the corresponding tools`}),(0,k.jsx)(Ot,{id:`githubToken`,label:`GitHub Token (PAT)`,placeholder:n.hasGithubToken?`✓ configured — leave empty to keep`:`ghp_... — needs repo + read:org scopes`,type:`password`,value:ut,onChange:dt}),(0,k.jsx)(Ot,{id:`githubRepo`,label:`Default GitHub repo (owner/name)`,placeholder:`acme/website`,value:ft,onChange:pt}),(0,k.jsx)(Ot,{id:`notionToken`,label:`Notion Token (Internal Integration)`,placeholder:n.hasNotionToken?`✓ configured — leave empty to keep`:`secret_...`,type:`password`,value:mt,onChange:ht}),(0,k.jsx)(Ot,{id:`slackToken`,label:`Slack Bot Token (xoxb-)`,placeholder:n.hasSlackToken?`✓ configured — leave empty to keep`:`xoxb-...`,type:`password`,value:gt,onChange:_t}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{ut&&wt(`github-token`,ut),ft&&wt(`github-repo`,ft),mt&&wt(`notion-token`,mt),gt&&wt(`slack-token`,gt)},children:[It(`github-token`),` Save tokens`]})]}),(0,k.jsx)(kt,{}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Advanced`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Plugins, Microsoft tenant ID, runtime extras`}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:R,onChange:e=>bt(e.target.checked)}),` `,`Auto-run plugins at startup`]})}),(0,k.jsx)(Ot,{id:`pluginDir`,label:`Plugin directory (absolute path)`,placeholder:`empty = ~/.nha/plugins`,value:xt,onChange:St}),(0,k.jsx)(Ot,{id:`microsoftTenant`,label:`Microsoft Tenant ID`,placeholder:`common (default) | organizations | consumers | <GUID>`,value:vt,onChange:yt}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`plugin-autorun`,R),xt&&wt(`plugin-dir`,xt),wt(`microsoft-tenant`,vt)},children:[It(`plugin-autorun`),` Save advanced`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.googleAccount`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.googleSub`)}),n.hasGoogle&&(0,k.jsxs)(`div`,{className:z.connected,children:[`✅ `,t(`common.connected`),n.googleEmail?` · ${n.googleEmail}`:``]}),(0,k.jsxs)(`div`,{className:z.btnRow,children:[(0,k.jsx)(`button`,{className:z.saveBtn,onClick:jt,children:n.hasGoogle?t(`settings.reconnectGoogle`):t(`settings.connectGoogle`)}),n.hasGoogle&&(0,k.jsx)(`button`,{className:z.dangerBtn,onClick:Mt,children:t(`settings.disconnectGoogle`)})]}),g&&(0,k.jsx)(`div`,{className:z.statusMsg,children:g})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsxs)(`div`,{className:z.cardTitleRow,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.imapAccounts`)}),(0,k.jsx)(`button`,{className:z.saveBtn,onClick:()=>{p({...Dt}),h(``)},children:t(`settings.addAccount`)})]}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.imapSub`)}),u.length===0&&!f&&(0,k.jsx)(`div`,{className:z.emptyImap,children:t(`settings.noImapAccounts`)}),u.map(e=>(0,k.jsxs)(`div`,{className:z.imapRow,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:z.imapName,children:e.display_name}),(0,k.jsxs)(`div`,{className:z.imapMeta,children:[e.email_address,` · `,e.imap_host]}),(0,k.jsxs)(`div`,{className:z.imapStatus,"data-status":e.sync_status,children:[e.sync_status,e.last_sync_at?` · ${t(`email.lastSync`)}: ${e.last_sync_at.slice(0,16)}`:``]})]}),(0,k.jsxs)(`div`,{className:z.imapBtns,children:[(0,k.jsx)(`button`,{className:z.imapSyncBtn,onClick:()=>Pt(e.id),children:t(`settings.sync`)}),(0,k.jsx)(`button`,{className:z.imapEditBtn,onClick:()=>{p({...Dt,id:e.id,display_name:e.display_name,email_address:e.email_address,from_name:e.from_name??``,imap_host:e.imap_host,imap_port:String(e.imap_port??993),smtp_host:e.smtp_host??``,smtp_port:String(e.smtp_port??587),username:e.username??``,password:``}),h(``)},children:t(`common.edit`)}),(0,k.jsx)(`button`,{className:z.imapDelBtn,onClick:()=>Nt(e.id,e.display_name),children:t(`common.delete`)})]})]},e.id)),f&&(0,k.jsxs)(`div`,{className:z.imapForm,children:[(0,k.jsx)(`div`,{className:z.imapFormTitle,children:f.id?t(`settings.editImapAccount`):t(`settings.addImapAccount`)}),[[`display_name`,t(`settings.displayName`),t(`settings.displayNamePh`)],[`email_address`,t(`common.email`),`user@example.com`],[`from_name`,t(`settings.fromName`),t(`settings.fromNamePh`)],[`imap_host`,t(`settings.imapServer`),`e.g. imap.gmail.com`],[`imap_port`,t(`settings.imapPort`),`993`],[`smtp_host`,t(`settings.smtpServer`),`e.g. smtp.gmail.com`],[`smtp_port`,t(`settings.smtpPort`),`587`],[`username`,t(`settings.username`),`user@example.com`]].map(([e,t,n])=>(0,k.jsx)(Ot,{id:`imap_${e}`,label:t,placeholder:n,value:f[e],onChange:t=>p(n=>n&&{...n,[e]:t})},e)),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[t(`settings.password`),` `,f.id&&(0,k.jsx)(`span`,{className:z.pwdNote,children:t(`settings.passwordKeep`)})]}),(0,k.jsxs)(`div`,{className:z.pwdRow,children:[(0,k.jsx)(`input`,{type:y?`text`:`password`,placeholder:t(`settings.passwordPh`),value:f.password,onChange:e=>p(t=>t&&{...t,password:e.target.value}),className:z.fieldInput,style:{flex:1}}),(0,k.jsx)(`button`,{className:z.togglePwd,onClick:()=>b(e=>!e),children:t(y?`settings.hide`:`settings.show`)})]})]}),(0,k.jsxs)(`div`,{className:z.btnRow,children:[(0,k.jsx)(`button`,{className:z.saveBtn,onClick:B,children:t(`common.save`)}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:()=>Ft(!1),title:`Verifica IMAP+SMTP senza inviare nulla`,children:`Test connessione`}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:()=>Ft(!0),title:`Invia un'email di prova alla tua casella per verificare il round-trip`,children:`Invia email di prova`}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:()=>p(null),children:t(`common.cancel`)})]}),m&&(0,k.jsx)(`div`,{className:z.statusMsg,style:{whiteSpace:`pre-line`},children:m})]})]})]})}var jt={root:`_root_o07ov_1`,loading:`_loading_o07ov_2`,err:`_err_o07ov_3`,header:`_header_o07ov_4`,title:`_title_o07ov_5`,addBtn:`_addBtn_o07ov_6`,empty:`_empty_o07ov_7`,card:`_card_o07ov_8`,cardToday:`_cardToday_o07ov_9`,icon:`_icon_o07ov_10`,info:`_info_o07ov_11`,name:`_name_o07ov_12`,date:`_date_o07ov_13`,labelToday:`_labelToday_o07ov_14`,labelTomorrow:`_labelTomorrow_o07ov_15`,labelFuture:`_labelFuture_o07ov_16`,editBtn:`_editBtn_o07ov_17`,delBtn:`_delBtn_o07ov_18`,overlay:`_overlay_o07ov_20`,modal:`_modal_o07ov_21`,modalTitle:`_modalTitle_o07ov_22`,label:`_label_o07ov_14`,input:`_input_o07ov_24`,hint:`_hint_o07ov_25`,formErr:`_formErr_o07ov_26`,modalBtns:`_modalBtns_o07ov_27`,cancelBtn:`_cancelBtn_o07ov_28`,saveBtn:`_saveBtn_o07ov_29`};function Mt(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(null),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(!1),p=(0,_.useCallback)(()=>{i(!0),E(`/api/birthdays`).then(e=>{e?.error?o(e.error):n(e?.birthdays??[]),i(!1)})},[]);(0,_.useEffect)(()=>{p()},[p]);let m=()=>{c({name:``,date:``}),u(``)},h=e=>{c({name:e.name,date:e.date,contactId:e.contactId}),u(``)},g=async()=>{if(!s)return;if(!s.name.trim()){u(`Name is required`);return}if(!s.date.trim()){u(`Date is required`);return}f(!0);let e=s.date;/^\d{2}-\d{2}$/.test(e)&&(e=`${new Date().getFullYear()}-${e}`),await D(`/api/birthdays`,{name:s.name,date:e,contactId:s.contactId??null,edit:!!s.contactId}),f(!1),c(null),p()},v=e=>{confirm(`Remove birthday for ${e.name}?`)&&D(`/api/birthdays/delete`,{contactId:e.contactId}).then(p)};return r?(0,k.jsxs)(`div`,{className:jt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),e(`common.loading`)]}):a?(0,k.jsx)(`div`,{className:jt.err,children:a}):(0,k.jsxs)(`div`,{className:jt.root,children:[(0,k.jsxs)(`div`,{className:jt.header,children:[(0,k.jsx)(`div`,{className:jt.title,children:`Upcoming Birthdays`}),(0,k.jsx)(`button`,{className:jt.addBtn,onClick:m,children:`+ Add Birthday`})]}),t.length===0&&(0,k.jsxs)(`div`,{className:jt.empty,children:[e(`birthdays.noBirthdays`),(0,k.jsx)(`br`,{}),(0,k.jsx)(`small`,{children:`Add one above, or add birthdays to your Google Contacts.`})]}),t.map((t,n)=>{let r=t.daysUntil===0,i=t.daysUntil===1;return(0,k.jsxs)(`div`,{className:`${jt.card} ${r?jt.cardToday:``}`,children:[(0,k.jsx)(`span`,{className:jt.icon,children:`🎂`}),(0,k.jsxs)(`div`,{className:jt.info,children:[(0,k.jsx)(`div`,{className:jt.name,children:t.name}),(0,k.jsx)(`div`,{className:jt.date,children:t.date})]}),(0,k.jsx)(`div`,{className:r?jt.labelToday:i?jt.labelTomorrow:jt.labelFuture,children:r?`TODAY!`:i?`Tomorrow`:`in ${t.daysUntil} days`}),t.contactId&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`button`,{className:jt.editBtn,onClick:()=>h(t),children:e(`common.edit`)}),(0,k.jsx)(`button`,{className:jt.delBtn,onClick:()=>v(t),children:e(`common.delete`)})]})]},n)}),s&&(0,k.jsx)(`div`,{className:jt.overlay,onClick:e=>{e.target===e.currentTarget&&c(null)},children:(0,k.jsxs)(`div`,{className:jt.modal,children:[(0,k.jsx)(`div`,{className:jt.modalTitle,children:s.contactId?`Edit Birthday`:`Add Birthday`}),(0,k.jsx)(`label`,{className:jt.label,children:`Name *`}),(0,k.jsx)(`input`,{className:jt.input,value:s.name,onChange:e=>c(t=>t&&{...t,name:e.target.value}),placeholder:`Contact name`}),(0,k.jsx)(`label`,{className:jt.label,children:`Birthday (MM-DD or YYYY-MM-DD)`}),(0,k.jsx)(`input`,{className:jt.input,value:s.date,onChange:e=>c(t=>t&&{...t,date:e.target.value}),placeholder:`e.g. 03-15 or 1990-03-15`}),(0,k.jsx)(`div`,{className:jt.hint,children:`Birthday will be saved as a Google Calendar event.`}),l&&(0,k.jsx)(`div`,{className:jt.formErr,children:l}),(0,k.jsxs)(`div`,{className:jt.modalBtns,children:[(0,k.jsx)(`button`,{className:jt.cancelBtn,onClick:()=>c(null),children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:jt.saveBtn,onClick:g,disabled:d,children:d?`Saving…`:s.contactId?`Save`:`Add`})]})]})})]})}var B={root:`_root_1z04o_1`,header:`_header_1z04o_3`,title:`_title_1z04o_4`,subtitle:`_subtitle_1z04o_5`,code:`_code_1z04o_6`,addBtn:`_addBtn_1z04o_8`,tabs:`_tabs_1z04o_10`,tab:`_tab_1z04o_10`,tabActive:`_tabActive_1z04o_12`,loading:`_loading_1z04o_14`,err:`_err_1z04o_15`,empty:`_empty_1z04o_17`,emptyIcon:`_emptyIcon_1z04o_18`,emptyTitle:`_emptyTitle_1z04o_19`,emptySub:`_emptySub_1z04o_20`,card:`_card_1z04o_23`,cardDisabled:`_cardDisabled_1z04o_24`,cardTop:`_cardTop_1z04o_25`,cardLeft:`_cardLeft_1z04o_26`,jobName:`_jobName_1z04o_27`,schedule:`_schedule_1z04o_28`,agentBadge:`_agentBadge_1z04o_29`,statusBadge:`_statusBadge_1z04o_30`,statusActive:`_statusActive_1z04o_31`,statusPaused:`_statusPaused_1z04o_32`,jobPrompt:`_jobPrompt_1z04o_33`,jobMeta:`_jobMeta_1z04o_34`,cardActions:`_cardActions_1z04o_35`,runBtn:`_runBtn_1z04o_36`,editBtn:`_editBtn_1z04o_37`,pauseBtn:`_pauseBtn_1z04o_38`,resumeBtn:`_resumeBtn_1z04o_39`,delBtn:`_delBtn_1z04o_40`,templates:`_templates_1z04o_43`,templatesNote:`_templatesNote_1z04o_44`,templateCard:`_templateCard_1z04o_45`,templateLabel:`_templateLabel_1z04o_46`,templatePrompt:`_templatePrompt_1z04o_47`,templateBtns:`_templateBtns_1z04o_48`,scheduleTplBtn:`_scheduleTplBtn_1z04o_49`,runTplBtn:`_runTplBtn_1z04o_50`,formOverlay:`_formOverlay_1z04o_54`,formModal:`_formModal_1z04o_55`,formTitle:`_formTitle_1z04o_56`,label:`_label_1z04o_57`,input:`_input_1z04o_58`,textarea:`_textarea_1z04o_59`,presets:`_presets_1z04o_61`,preset:`_preset_1z04o_61`,presetActive:`_presetActive_1z04o_63`,cronHints:`_cronHints_1z04o_65`,cronHint:`_cronHint_1z04o_65`,formErr:`_formErr_1z04o_70`,formOk:`_formOk_1z04o_71`,formBtns:`_formBtns_1z04o_72`,cancelBtn:`_cancelBtn_1z04o_73`,saveBtn:`_saveBtn_1z04o_74`},Nt=[{label:`Every 15 min`,value:`every 15 minutes`},{label:`Every 30 min`,value:`every 30 minutes`},{label:`Every hour`,value:`every hour`},{label:`Every 6h`,value:`every 6 hours`},{label:`Daily 8am`,value:`every day at 08:00`},{label:`Daily 9am`,value:`every day at 09:00`},{label:`Daily noon`,value:`every day at 12:00`},{label:`Daily 6pm`,value:`every day at 18:00`},{label:`Mon–Fri 9am`,value:`weekdays at 09:00`},{label:`Every Monday`,value:`every monday at 09:00`}],Pt=[{label:`🌅 Morning Briefing`,prompt:`Summarize my unread emails from the last 12 hours, check today's calendar events, list my top 3 priority tasks, and give me a focused action plan for the day.`},{label:`🌆 Evening Review`,prompt:`Review what I accomplished today: check completed tasks, summarize any important emails received, flag unresolved issues, and prepare a priority list for tomorrow.`},{label:`📰 News Digest`,prompt:`Search for the top AI, tech, and finance news from the last 24 hours. Summarize the 5 most important stories with key takeaways and market implications.`},{label:`📈 Market Update`,prompt:`Provide a comprehensive market update: macro environment, major indices performance, top movers, notable events, and key levels to watch. Use herald and mercury agents.`},{label:`🐙 GitHub Monitor`,prompt:`Check my GitHub notifications, summarize open issues and pull requests that need attention, and draft brief responses for the most urgent ones.`},{label:`📊 Weekly Report`,prompt:`Generate a weekly productivity report: tasks completed vs pending, email response rate, upcoming calendar events, and 3 strategic priorities for next week.`},{label:`🔒 Security Scan`,prompt:`Run a security awareness check: scan recent code commits for potential vulnerabilities, check dependency alerts, and summarize any security-related GitHub notifications.`},{label:`🎯 Goal Tracker`,prompt:`Review my tasks and notes for goal progress. Identify what's on track, what's at risk, and suggest one concrete action to unblock the most important goal.`}],Ft=[{label:`0 9 * * 1-5`,desc:`Mon–Fri at 9:00 AM`},{label:`0 */6 * * *`,desc:`Every 6 hours`},{label:`*/30 * * * *`,desc:`Every 30 minutes`},{label:`0 8 * * *`,desc:`Daily at 8:00 AM`},{label:`0 20 * * 5`,desc:`Every Friday at 8 PM`}];function It(){let e=j(),t=te(e=>e.setView),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)(!0),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)({name:``,schedule:``,prompt:``,agent:``}),[f,p]=(0,_.useState)(!1),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(``),[y,b]=(0,_.useState)(null),[x,S]=(0,_.useState)(`jobs`),C=()=>{a(!0),E(`/api/cron`).then(e=>{e?.error?s(e.error):r(e?.jobs??[]),a(!1)}).catch(()=>{r([]),a(!1)})};(0,_.useEffect)(()=>{C()},[]);let w=()=>{d({name:``,schedule:``,prompt:``,agent:``}),h(``),v(``),b(null),l(!0)},ee=e=>{d({name:e.name??``,schedule:e.schedule,prompt:e.prompt??e.command??``,agent:e.agent??``}),h(``),v(``),b(e.id),l(!0)},T=async()=>{if(!u.schedule.trim()){h(`Schedule is required`);return}if(!u.prompt.trim()){h(`Task prompt is required`);return}p(!0),h(``);try{y?await D(`/api/cron/update`,{id:y,schedule:u.schedule,prompt:u.prompt,agent:u.agent||void 0,name:u.name||void 0}):await D(`/api/cron`,{schedule:u.schedule,prompt:u.prompt,agent:u.agent||void 0,name:u.name||void 0}),v(y?`Updated!`:`Job scheduled!`),setTimeout(()=>{v(``),l(!1)},1500),C()}catch(e){h(e.message??`Failed`)}p(!1)},ne=(e,t)=>D(`/api/cron/toggle`,{id:e,enabled:!t}).then(C),re=e=>{confirm(`Delete this scheduled task?`)&&D(`/api/cron/delete`,{id:e}).then(C)},ie=e=>{try{sessionStorage.setItem(`nha_chat_prefill`,e)}catch{}t(`chat`)},O=e=>{d(t=>({...t,prompt:e.prompt,name:e.label.replace(/^[^\s]+\s/,``)})),S(`jobs`),l(!0)};return(0,k.jsxs)(`div`,{className:B.root,children:[(0,k.jsxs)(`div`,{className:B.header,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:B.title,children:`⏰ Scheduled Tasks`}),(0,k.jsxs)(`div`,{className:B.subtitle,children:[`Automate agents on a recurring schedule. Daemon must be running: `,(0,k.jsx)(`code`,{className:B.code,children:`nha ops start`})]})]}),(0,k.jsx)(`button`,{className:B.addBtn,onClick:w,children:`+ New Task`})]}),(0,k.jsxs)(`div`,{className:B.tabs,children:[(0,k.jsxs)(`button`,{className:`${B.tab} ${x===`jobs`?B.tabActive:``}`,onClick:()=>S(`jobs`),children:[`Jobs (`,n.length,`)`]}),(0,k.jsx)(`button`,{className:`${B.tab} ${x===`templates`?B.tabActive:``}`,onClick:()=>S(`templates`),children:`Templates`})]}),x===`templates`&&(0,k.jsxs)(`div`,{className:B.templates,children:[(0,k.jsx)(`div`,{className:B.templatesNote,children:`Click a template to pre-fill the job form or run it immediately in Chat.`}),Pt.map(t=>(0,k.jsxs)(`div`,{className:B.templateCard,children:[(0,k.jsx)(`div`,{className:B.templateLabel,children:t.label}),(0,k.jsx)(`div`,{className:B.templatePrompt,children:t.prompt}),(0,k.jsxs)(`div`,{className:B.templateBtns,children:[(0,k.jsx)(`button`,{className:B.scheduleTplBtn,onClick:()=>O(t),children:`Schedule`}),(0,k.jsxs)(`button`,{className:B.runTplBtn,onClick:()=>ie(t.prompt),children:[e(`cron.run`),` in Chat →`]})]})]},t.label))]}),x===`jobs`&&(0,k.jsxs)(k.Fragment,{children:[i&&(0,k.jsxs)(`div`,{className:B.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),`Loading jobs…`]}),o&&(0,k.jsx)(`div`,{className:B.err,children:o}),!i&&n.length===0&&!c&&(0,k.jsxs)(`div`,{className:B.empty,children:[(0,k.jsx)(`div`,{className:B.emptyIcon,children:`⏰`}),(0,k.jsxs)(`div`,{className:B.emptyTitle,children:[e(`cron.noJobs`),` tasks`]}),(0,k.jsx)(`div`,{className:B.emptySub,children:`Create a job to automate agents on a recurring schedule, or browse the Templates tab for ready-made automation recipes.`}),(0,k.jsx)(`button`,{className:B.addBtn,onClick:w,children:`+ New Task`})]}),n.map(e=>(0,k.jsxs)(`div`,{className:`${B.card} ${e.enabled?``:B.cardDisabled}`,children:[(0,k.jsxs)(`div`,{className:B.cardTop,children:[(0,k.jsxs)(`div`,{className:B.cardLeft,children:[e.name&&(0,k.jsx)(`div`,{className:B.jobName,children:e.name}),(0,k.jsx)(`code`,{className:B.schedule,children:e.schedule}),e.agent&&(0,k.jsx)(`span`,{className:B.agentBadge,children:e.agent}),(0,k.jsx)(`span`,{className:`${B.statusBadge} ${e.enabled?B.statusActive:B.statusPaused}`,children:e.enabled?`active`:`paused`})]}),(0,k.jsxs)(`div`,{className:B.cardActions,children:[(0,k.jsx)(`button`,{className:B.runBtn,onClick:()=>ie(e.prompt??e.command??``),title:`Run now in Chat`,children:`▶`}),(0,k.jsx)(`button`,{className:B.editBtn,onClick:()=>ee(e),children:`Edit`}),(0,k.jsx)(`button`,{className:e.enabled?B.pauseBtn:B.resumeBtn,onClick:()=>ne(e.id,e.enabled),children:e.enabled?`Pause`:`Resume`}),(0,k.jsx)(`button`,{className:B.delBtn,onClick:()=>re(e.id),children:`✕`})]})]}),(0,k.jsx)(`div`,{className:B.jobPrompt,children:e.prompt??e.command}),(0,k.jsxs)(`div`,{className:B.jobMeta,children:[e.runCount!==void 0&&(0,k.jsxs)(`span`,{children:[`ran `,e.runCount,`×`]}),e.lastRun&&(0,k.jsxs)(`span`,{children:[` · last `,new Date(e.lastRun).toLocaleString()]}),e.nextRun&&(0,k.jsxs)(`span`,{children:[` · next `,new Date(e.nextRun).toLocaleString()]})]})]},e.id))]}),c&&(0,k.jsx)(`div`,{className:B.formOverlay,onClick:e=>{e.target===e.currentTarget&&l(!1)},children:(0,k.jsxs)(`div`,{className:B.formModal,children:[(0,k.jsx)(`div`,{className:B.formTitle,children:y?`Edit Scheduled Task`:`New Scheduled Task`}),(0,k.jsx)(`label`,{className:B.label,children:`Name (optional)`}),(0,k.jsx)(`input`,{className:B.input,value:u.name,onChange:e=>d(t=>({...t,name:e.target.value})),placeholder:`e.g. Morning Briefing`}),(0,k.jsx)(`label`,{className:B.label,children:`Schedule *`}),(0,k.jsx)(`div`,{className:B.presets,children:Nt.map(e=>(0,k.jsx)(`button`,{className:`${B.preset} ${u.schedule===e.value?B.presetActive:``}`,onClick:()=>d(t=>({...t,schedule:e.value})),children:e.label},e.value))}),(0,k.jsx)(`input`,{className:B.input,value:u.schedule,onChange:e=>d(t=>({...t,schedule:e.target.value})),placeholder:`every day at 09:00 — or cron syntax: 0 9 * * 1-5`}),(0,k.jsx)(`div`,{className:B.cronHints,children:Ft.map(e=>(0,k.jsxs)(`span`,{className:B.cronHint,onClick:()=>d(t=>({...t,schedule:e.label})),children:[(0,k.jsx)(`code`,{children:e.label}),` `,e.desc]},e.label))}),(0,k.jsx)(`label`,{className:B.label,children:`Task / Prompt *`}),(0,k.jsx)(`textarea`,{className:B.textarea,value:u.prompt,onChange:e=>d(t=>({...t,prompt:e.target.value})),placeholder:`Describe what the agent should do (e.g. Summarize my unread emails and list my 3 top priority tasks)`,rows:4}),(0,k.jsx)(`label`,{className:B.label,children:`Agent (optional — leave blank for auto-routing)`}),(0,k.jsx)(`input`,{className:B.input,value:u.agent,onChange:e=>d(t=>({...t,agent:e.target.value})),placeholder:`e.g. herald, oracle, mercury, EmailAgent, general`}),m&&(0,k.jsx)(`div`,{className:B.formErr,children:m}),g&&(0,k.jsx)(`div`,{className:B.formOk,children:g}),(0,k.jsxs)(`div`,{className:B.formBtns,children:[(0,k.jsx)(`button`,{className:B.cancelBtn,onClick:()=>l(!1),children:`Cancel`}),(0,k.jsx)(`button`,{className:B.saveBtn,onClick:T,disabled:f,children:f?`Saving…`:y?`Update`:`Schedule`})]})]})})]})}var Lt={root:`_root_1npv7_1`,loading:`_loading_1npv7_2`,sidebar:`_sidebar_1npv7_4`,newBtn:`_newBtn_1npv7_5`,empty:`_empty_1npv7_6`,noteItem:`_noteItem_1npv7_8`,noteItemActive:`_noteItemActive_1npv7_10`,noteTitle:`_noteTitle_1npv7_11`,noteMeta:`_noteMeta_1npv7_12`,notePreview:`_notePreview_1npv7_13`,noteTags:`_noteTags_1npv7_14`,noteTag:`_noteTag_1npv7_14`,editor:`_editor_1npv7_17`,emptyEditor:`_emptyEditor_1npv7_18`,titleInput:`_titleInput_1npv7_19`,contentArea:`_contentArea_1npv7_21`,editorFooter:`_editorFooter_1npv7_22`,delNoteBtn:`_delNoteBtn_1npv7_23`,cancelBtn:`_cancelBtn_1npv7_24`,saveBtn:`_saveBtn_1npv7_25`};function Rt(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(!1),[p,m]=(0,_.useState)(!1),h=()=>E(`/api/notes`).then(e=>{n(e?.notes??[]),i(!1)});(0,_.useEffect)(()=>{h()},[]);let g=e=>{o(e),c(e.title),u(e.content),m(!1)},v=()=>{o(null),c(``),u(``),m(!0)},y=async()=>{f(!0),p?await D(`/api/notes`,{title:s||`Untitled`,content:l}):a&&await D(`/api/notes/${a.id}`,{title:s,content:l}),f(!1),m(!1),h()},b=(e,t)=>{confirm(`Delete note "${t}"?`)&&D(`/api/notes/${e}/delete`,{}).then(h)};return r?(0,k.jsxs)(`div`,{className:Lt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),e(`common.loading`)]}):(0,k.jsxs)(`div`,{className:Lt.root,children:[(0,k.jsxs)(`div`,{className:Lt.sidebar,children:[(0,k.jsx)(`button`,{className:Lt.newBtn,onClick:v,children:`+ New Note`}),t.length===0&&(0,k.jsx)(`div`,{className:Lt.empty,children:e(`notes.noNotes`)}),t.map(e=>(0,k.jsxs)(`div`,{className:`${Lt.noteItem} ${a?.id===e.id?Lt.noteItemActive:``}`,onClick:()=>g(e),children:[(0,k.jsx)(`div`,{className:Lt.noteTitle,children:e.title||`Untitled`}),(0,k.jsx)(`div`,{className:Lt.noteMeta,children:e.updatedAt?new Date(e.updatedAt).toLocaleDateString():``}),e.content&&(0,k.jsx)(`div`,{className:Lt.notePreview,children:e.content.slice(0,150)}),e.tags&&e.tags.length>0&&(0,k.jsx)(`div`,{className:Lt.noteTags,children:e.tags.map(e=>(0,k.jsx)(`span`,{className:Lt.noteTag,children:e},e))})]},e.id))]}),(0,k.jsx)(`div`,{className:Lt.editor,children:a||p?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`input`,{className:Lt.titleInput,value:s,onChange:e=>c(e.target.value),placeholder:`Note title…`}),(0,k.jsx)(`textarea`,{className:Lt.contentArea,value:l,onChange:e=>u(e.target.value),placeholder:`Start writing…`}),(0,k.jsxs)(`div`,{className:Lt.editorFooter,children:[a&&(0,k.jsx)(`button`,{className:Lt.delNoteBtn,onClick:()=>b(a.id,a.title),children:e(`common.delete`)}),(0,k.jsx)(`button`,{className:Lt.cancelBtn,onClick:()=>{o(null),m(!1)},children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:Lt.saveBtn,onClick:y,disabled:d,children:d?`Saving…`:`Save`})]})]}):(0,k.jsx)(`div`,{className:Lt.emptyEditor,children:`Select a note or create a new one`})})]})}var zt={root:`_root_18yos_1`,loading:`_loading_18yos_2`,error:`_error_18yos_3`,toolbar:`_toolbar_18yos_5`,search:`_search_18yos_6`,addBtn:`_addBtn_18yos_7`,count:`_count_18yos_10`,empty:`_empty_18yos_12`,grid:`_grid_18yos_14`,card:`_card_18yos_16`,actions:`_actions_18yos_29`,avatar:`_avatar_18yos_31`,avatarImg:`_avatarImg_18yos_38`,info:`_info_18yos_40`,name:`_name_18yos_41`,row:`_row_18yos_42`,email:`_email_18yos_43`,phone:`_phone_18yos_44`,company:`_company_18yos_45`,birthday:`_birthday_18yos_46`,iconBtn:`_iconBtn_18yos_52`,iconBtnRed:`_iconBtnRed_18yos_58`,overlay:`_overlay_18yos_61`,modal:`_modal_18yos_62`,modalTitle:`_modalTitle_18yos_63`,field:`_field_18yos_64`,label:`_label_18yos_65`,input:`_input_18yos_66`,formStatus:`_formStatus_18yos_67`,formError:`_formError_18yos_68`,modalBtns:`_modalBtns_18yos_69`,cancelBtn:`_cancelBtn_18yos_70`,saveBtn:`_saveBtn_18yos_71`},Bt={name:``,email:``,phone:``,company:``,address:``,notes:``};function Vt(){let e=j(),t=te(e=>e.setView),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)(!0),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),[u,d]=(0,_.useState)(null),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(!1),[g,v]=(0,_.useState)(``),y=(0,_.useRef)(null),b=(e=``)=>{E(e?`/api/contacts?q=${encodeURIComponent(e)}`:`/api/contacts`).then(e=>{r(e?.contacts??[]),a(!1),s(``)}).catch(()=>{s(`Could not load contacts. Run nha google revoke then nha google auth.`),a(!1)})};(0,_.useEffect)(()=>{b()},[]);let x=e=>{l(e),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>b(e),400)},S=()=>{d(null),p({...Bt}),v(``)},C=e=>{d(e),p({name:e.name,email:e.email??``,phone:e.phone??``,company:e.company??``,address:e.address??``,notes:e.notes??``}),v(``)},w=async()=>{if(f?.name){h(!0),v(`Saving…`);try{if(u?.resourceName){let e=await D(`/api/contacts/update`,{resourceName:u.resourceName,fields:f});if(e?.error){v(`Error: `+e.error);return}}else if(u)await D(`/api/contacts/update`,{resourceName:u.id,fields:f});else{let e=await D(`/api/contacts`,f);if(e?.error){v(`Error: `+e.error);return}}v(`Saved!`),setTimeout(()=>{p(null),d(null),b(c)},800)}catch(e){v(`Error: `+e.message)}finally{h(!1)}}},ee=(e,t)=>{e.stopPropagation(),confirm(`Delete "${t.name}"?`)&&D(`/api/contacts/delete`,{resourceName:t.resourceName||t.id}).then(e=>{let t=e;if(t?.error){alert(`Error: `+t.error);return}b(c)})},T=(e,n,r)=>{e.stopPropagation(),t(`chat`),setTimeout(()=>{let e=document.getElementById(`chatInput`);e&&(e.value=`Send an email to ${r} (${n}) about `,e.focus())},300)},ne=e=>(e||`?`).split(` `).map(e=>e[0]).slice(0,2).join(``).toUpperCase();return i?(0,k.jsxs)(`div`,{className:zt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),`Loading contacts…`]}):o?(0,k.jsx)(`div`,{className:zt.error,children:o}):(0,k.jsxs)(`div`,{className:zt.root,children:[(0,k.jsxs)(`div`,{className:zt.toolbar,children:[(0,k.jsx)(`input`,{className:zt.search,value:c,onChange:e=>x(e.target.value),placeholder:`Search contacts…`}),n.length>0&&(0,k.jsxs)(`span`,{className:zt.count,children:[n.length,` contact`,n.length===1?``:`s`]}),(0,k.jsx)(`button`,{className:zt.addBtn,onClick:S,children:`+ Add`})]}),n.length===0&&(0,k.jsxs)(`div`,{className:zt.empty,children:[e(`contacts.noContacts`),(0,k.jsx)(`br`,{}),`Add a Google account or add contacts manually.`]}),(0,k.jsx)(`div`,{className:zt.grid,children:n.map(e=>(0,k.jsxs)(`div`,{className:zt.card,onClick:()=>C(e),children:[(0,k.jsx)(`div`,{className:zt.avatar,children:e.photo?(0,k.jsx)(`img`,{src:e.photo,alt:e.name,className:zt.avatarImg}):ne(e.name)}),(0,k.jsxs)(`div`,{className:zt.info,children:[(0,k.jsx)(`div`,{className:zt.name,children:e.name||`(no name)`}),(0,k.jsxs)(`div`,{className:zt.row,children:[e.email&&(0,k.jsx)(`span`,{className:zt.email,children:e.email}),e.phone&&(0,k.jsx)(`span`,{className:zt.phone,children:e.phone}),e.company&&(0,k.jsxs)(`span`,{className:zt.company,children:[e.company,e.title?` · ${e.title}`:``]}),e.birthday&&(0,k.jsxs)(`span`,{className:zt.birthday,children:[`🎂 `,e.birthday]})]})]}),(0,k.jsxs)(`div`,{className:zt.actions,children:[e.email&&(0,k.jsx)(`button`,{className:zt.iconBtn,onClick:t=>T(t,e.email,e.name),title:`Send email via chat`,children:`✉`}),(0,k.jsx)(`button`,{className:zt.iconBtn,onClick:t=>{t.stopPropagation(),C(e)},title:`Edit`,children:`✎`}),(0,k.jsx)(`button`,{className:`${zt.iconBtn} ${zt.iconBtnRed}`,onClick:t=>ee(t,e),title:`Delete`,children:`✕`})]})]},e.id))}),f&&(0,k.jsx)(`div`,{className:zt.overlay,onClick:e=>{e.target===e.currentTarget&&p(null)},children:(0,k.jsxs)(`div`,{className:zt.modal,children:[(0,k.jsx)(`div`,{className:zt.modalTitle,children:u?`Edit Contact`:`New Contact`}),[[`name`,`Name`,`Full name *`],[`email`,`Email`,`user@example.com`],[`phone`,`Phone`,`+1 555 123 4567`],[`company`,`Company`,`Acme Inc`],[`address`,`Address`,`123 Main St, New York`],[`notes`,`Notes`,`Any additional info`]].map(([e,t,n])=>(0,k.jsxs)(`div`,{className:zt.field,children:[(0,k.jsx)(`label`,{className:zt.label,children:t}),(0,k.jsx)(`input`,{className:zt.input,value:f[e],onChange:t=>p(n=>n&&{...n,[e]:t.target.value}),placeholder:n,onKeyDown:t=>t.key===`Enter`&&e===`name`&&w()})]},e)),g&&(0,k.jsx)(`div`,{className:g.startsWith(`Error`)?zt.formError:zt.formStatus,children:g}),(0,k.jsxs)(`div`,{className:zt.modalBtns,children:[(0,k.jsx)(`button`,{className:zt.cancelBtn,onClick:()=>p(null),children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:zt.saveBtn,onClick:w,disabled:m||!f.name,children:m?`…`:`Save`})]})]})})]})}var V={root:`_root_1hm4q_2`,topbar:`_topbar_1hm4q_11`,topbarLeft:`_topbarLeft_1hm4q_20`,topbarTitle:`_topbarTitle_1hm4q_21`,topbarSub:`_topbarSub_1hm4q_22`,topbarActions:`_topbarActions_1hm4q_23`,runBtn:`_runBtn_1hm4q_25`,runBtnActive:`_runBtnActive_1hm4q_32`,logBtn:`_logBtn_1hm4q_34`,newWfBtn:`_newWfBtn_1hm4q_41`,body:`_body_1hm4q_50`,sidebar:`_sidebar_1hm4q_53`,sidebarTitle:`_sidebarTitle_1hm4q_61`,sidebarEmpty:`_sidebarEmpty_1hm4q_65`,wfItem:`_wfItem_1hm4q_67`,wfItemActive:`_wfItemActive_1hm4q_78`,wfItemRow:`_wfItemRow_1hm4q_79`,wfItemName:`_wfItemName_1hm4q_80`,wfItemMeta:`_wfItemMeta_1hm4q_81`,wfOn:`_wfOn_1hm4q_82`,wfOff:`_wfOff_1hm4q_83`,wfDelBtn:`_wfDelBtn_1hm4q_84`,canvasArea:`_canvasArea_1hm4q_92`,canvasHeader:`_canvasHeader_1hm4q_94`,wfNameInput:`_wfNameInput_1hm4q_99`,canvasHint:`_canvasHint_1hm4q_106`,portHint:`_portHint_1hm4q_107`,connectHint:`_connectHint_1hm4q_108`,cancelConnectBtn:`_cancelConnectBtn_1hm4q_109`,canvas:`_canvas_1hm4q_92`,canvasConnecting:`_canvasConnecting_1hm4q_122`,canvasSvg:`_canvasSvg_1hm4q_124`,canvasNode:`_canvasNode_1hm4q_134`,canvasNodeSelected:`_canvasNodeSelected_1hm4q_152`,canvasNodeConnecting:`_canvasNodeConnecting_1hm4q_153`,nodeIcon:`_nodeIcon_1hm4q_155`,nodeLabel:`_nodeLabel_1hm4q_156`,nodeConfigPreview:`_nodeConfigPreview_1hm4q_157`,nodeDelBtn:`_nodeDelBtn_1hm4q_159`,portOut:`_portOut_1hm4q_171`,portActive:`_portActive_1hm4q_182`,portIn:`_portIn_1hm4q_184`,pulse:`_pulse_1hm4q_1`,canvasDrop:`_canvasDrop_1hm4q_195`,canvasEmpty:`_canvasEmpty_1hm4q_203`,canvasEmptyIcon:`_canvasEmptyIcon_1hm4q_208`,canvasEmptyTitle:`_canvasEmptyTitle_1hm4q_209`,canvasEmptyDesc:`_canvasEmptyDesc_1hm4q_210`,logPanel:`_logPanel_1hm4q_213`,logHeader:`_logHeader_1hm4q_220`,logTime:`_logTime_1hm4q_226`,logClose:`_logClose_1hm4q_227`,logEmpty:`_logEmpty_1hm4q_228`,logStep:`_logStep_1hm4q_229`,logStepError:`_logStepError_1hm4q_230`,logStepHeader:`_logStepHeader_1hm4q_231`,logStepIcon:`_logStepIcon_1hm4q_232`,logStepLabel:`_logStepLabel_1hm4q_233`,logStepErrBadge:`_logStepErrBadge_1hm4q_234`,logStepErr:`_logStepErr_1hm4q_230`,logStepOutput:`_logStepOutput_1hm4q_236`,rightPanel:`_rightPanel_1hm4q_241`,configPanel:`_configPanel_1hm4q_252`,configHeader:`_configHeader_1hm4q_253`,configClose:`_configClose_1hm4q_254`,configDesc:`_configDesc_1hm4q_255`,configFields:`_configFields_1hm4q_256`,configField:`_configField_1hm4q_256`,configLabel:`_configLabel_1hm4q_258`,configRequired:`_configRequired_1hm4q_259`,configInput:`_configInput_1hm4q_260`,configTextarea:`_configTextarea_1hm4q_267`,zoomControls:`_zoomControls_1hm4q_277`,configHint:`_configHint_1hm4q_303`,configDelete:`_configDelete_1hm4q_305`,palette:`_palette_1hm4q_309`,paletteTitle:`_paletteTitle_1hm4q_310`,paletteTabs:`_paletteTabs_1hm4q_311`,paletteTab:`_paletteTab_1hm4q_311`,paletteTabActive:`_paletteTabActive_1hm4q_317`,paletteNodes:`_paletteNodes_1hm4q_318`,paletteDef:`_paletteDef_1hm4q_320`,paletteDefIcon:`_paletteDefIcon_1hm4q_328`,paletteDefLabel:`_paletteDefLabel_1hm4q_329`,paletteDefDesc:`_paletteDefDesc_1hm4q_330`,paletteFooter:`_paletteFooter_1hm4q_332`,paletteGuide:`_paletteGuide_1hm4q_336`,guideTitle:`_guideTitle_1hm4q_344`,guideStep:`_guideStep_1hm4q_353`,guideNum:`_guideNum_1hm4q_361`,guideTip:`_guideTip_1hm4q_377`,guideCode:`_guideCode_1hm4q_388`},Ht=[{id:`trigger_manual`,type:`trigger`,label:`Manual`,icon:`▶`,color:`#6366f1`,description:`Run manually with optional text input.`,configFields:[{key:`input`,label:`Input text`,placeholder:`Optional initial input`}]},{id:`trigger_cron`,type:`trigger`,label:`Cron`,icon:`⏰`,color:`#fbbf24`,description:`Run on a schedule (cron expression).`,configFields:[{key:`schedule`,label:`Cron expression`,placeholder:`0 8 * * *`,required:!0}]},{id:`trigger_email`,type:`trigger`,label:`New Email`,icon:`📧`,color:`#38bdf8`,description:`Trigger when a new email arrives matching a filter.`,configFields:[{key:`filter`,label:`Gmail filter`,placeholder:`subject:TODO is:unread`}]},{id:`trigger_webhook`,type:`trigger`,label:`Webhook`,icon:`🔗`,color:`#a5b4fc`,description:`Trigger via HTTP POST/GET/PUT/DELETE. URL: http://localhost:3847/api/webhooks/<slug>`,configFields:[{key:`slug`,label:`Slug (URL path)`,placeholder:`my-trigger`,required:!0}]},{id:`action_email`,type:`action`,label:`Send Email`,icon:`✉`,color:`#38bdf8`,description:`Send email via Gmail or IMAP.`,configFields:[{key:`to`,label:`To`,placeholder:`email@example.com`,required:!0},{key:`subject`,label:`Subject`,placeholder:`Subject or {{output}}`},{key:`body`,label:`Body`,placeholder:`{{output}}`}]},{id:`action_slack`,type:`action`,label:`Slack Message`,icon:`💬`,color:`#818cf8`,description:`Post a message to a Slack channel.`,configFields:[{key:`channel`,label:`Channel`,placeholder:`#general`,required:!0},{key:`text`,label:`Text`,placeholder:`{{output}}`}]},{id:`action_calendar`,type:`action`,label:`Create Event`,icon:`📅`,color:`#4ade80`,description:`Create a Google Calendar event.`,configFields:[{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`date`,label:`Date (YYYY-MM-DD)`,placeholder:`2025-01-15`},{key:`time`,label:`Time (HH:MM)`,placeholder:`09:00`}]},{id:`action_task`,type:`action`,label:`Create Task`,icon:`✅`,color:`#fbbf24`,description:`Add a task to your task list.`,configFields:[{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`priority`,label:`Priority`,placeholder:`medium`}]},{id:`action_drive`,type:`action`,label:`Save to Drive`,icon:`💾`,color:`#a78bfa`,description:`Save a text file to Google Drive.`,configFields:[{key:`name`,label:`Filename`,placeholder:`output.txt`,required:!0},{key:`content`,label:`Content`,placeholder:`{{output}}`}]},{id:`action_notion`,type:`action`,label:`Notion Page`,icon:`📋`,color:`#e4e4e7`,description:`Create or update a Notion page.`,configFields:[{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`content`,label:`Content`,placeholder:`{{output}}`}]},{id:`action_github`,type:`action`,label:`GitHub Issue`,icon:`🐙`,color:`#6ee7b7`,description:`Create a GitHub issue.`,configFields:[{key:`repo`,label:`Repo (owner/name)`,placeholder:`user/repo`,required:!0},{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`body`,label:`Body`,placeholder:``}]},{id:`action_webhook`,type:`action`,label:`HTTP Request`,icon:`🌐`,color:`#38bdf8`,description:`Make an HTTP request.`,configFields:[{key:`url`,label:`URL`,placeholder:`https://…`,required:!0},{key:`method`,label:`Method`,placeholder:`POST`},{key:`body`,label:`Body`,placeholder:`{{output}}`}]},{id:`ai_agent`,type:`ai`,label:`Run Agent`,icon:`🤖`,color:`#818cf8`,description:`Run any of the 38 NHA specialist agents.`,configFields:[{key:`agent`,label:`Agent name`,placeholder:`herald, saber, forge…`,required:!0},{key:`prompt`,label:`Prompt`,placeholder:`Summarize this: {{output}}`,required:!0}]},{id:`ai_summarize`,type:`ai`,label:`Summarize`,icon:`📝`,color:`#a5b4fc`,description:`Summarize text with AI (free via Liara).`,configFields:[{key:`prompt`,label:`Prompt`,placeholder:`Summarize: {{output}}`}]},{id:`ai_classify`,type:`ai`,label:`Classify`,icon:`🏷`,color:`#a5b4fc`,description:`Classify content into categories.`,configFields:[{key:`categories`,label:`Categories (comma-separated)`,placeholder:`urgent, normal, spam`},{key:`prompt`,label:`Prompt`,placeholder:`Classify this email: {{output}}`}]},{id:`ai_extract`,type:`ai`,label:`Extract Data`,icon:`🔍`,color:`#a5b4fc`,description:`Extract structured data from text.`,configFields:[{key:`prompt`,label:`What to extract`,placeholder:`Extract name, email, date from: {{output}}`}]},{id:`ai_translate`,type:`ai`,label:`Translate`,icon:`🌍`,color:`#a5b4fc`,description:`Translate text to another language.`,configFields:[{key:`lang`,label:`Target language`,placeholder:`Italian`,required:!0},{key:`prompt`,label:`Text`,placeholder:`{{output}}`}]},{id:`ai_code`,type:`ai`,label:`Code (JS)`,icon:`💻`,color:`#818cf8`,description:"Execute JavaScript code. Access previous output via `input` variable. Return a value.",configFields:[{key:`code`,label:`JavaScript code`,placeholder:`const data = JSON.parse(input);
653
+ </body></html>`,m=new Blob([p],{type:`text/html`}),h=URL.createObjectURL(m),g=document.createElement(`a`);g.href=h,g.download=`nha-report-${Date.now()}.html`,g.click(),URL.revokeObjectURL(h);let _=window.open(``,`_blank`,`width=1100,height=800`);_&&(_.document.open(),_.document.write(p),_.document.close(),_.onload=()=>setTimeout(()=>{_.focus(),_.print()},600))},N=t=>{let n=`**Studio Workflow Result**\n\nTask: ${t.task}\n\nAgents: ${t.nodes.map(e=>e.label).join(` → `)}\n\n---\n\n${t.result}`;try{sessionStorage.setItem(`nha_studio_import`,n)}catch{}e(`chat`)},Ce=()=>{if(!u){r(``),a([]),s([]),l(``),S(``),de.current=``,w(null),j.current=null,T(!1),b({in:0,out:0}),v(null),re(!1);try{sessionStorage.removeItem(dt)}catch{}}},we=i.some(e=>e.output||e.status===`running`);return(0,k.jsxs)(`div`,{className:P.root,children:[(0,k.jsxs)(`div`,{className:P.header,children:[(0,k.jsxs)(`div`,{className:P.headerLeft,children:[(0,k.jsx)(`div`,{className:P.title,children:`Studio`}),(0,k.jsx)(`div`,{className:P.subtitle,children:`Multi-agent orchestration · Council deliberation · Geth Consensus`})]}),(0,k.jsxs)(`div`,{className:P.headerActions,children:[y.in+y.out>0&&(0,k.jsxs)(`div`,{className:P.tokenBar,children:[(0,k.jsxs)(`span`,{className:P.tokIn,children:[`↑ `,y.in.toLocaleString()]}),(0,k.jsx)(`span`,{className:P.tokDim,children:` in `}),(0,k.jsxs)(`span`,{className:P.tokOut,children:[`↓ `,y.out.toLocaleString()]}),(0,k.jsx)(`span`,{className:P.tokDim,children:` out`})]}),(0,k.jsxs)(`div`,{style:{position:`relative`},ref:fe,children:[(0,k.jsxs)(`button`,{className:P.sessionsBtn,onClick:()=>h(e=>!e),children:[`Sessions (`,f.length,`)`]}),m&&(0,k.jsx)(`div`,{className:P.sessionsDrawer,children:f.length===0?(0,k.jsx)(`div`,{className:P.noSessions,children:`No saved sessions yet.`}):(0,k.jsxs)(k.Fragment,{children:[f.map(e=>(0,k.jsxs)(`div`,{className:P.sessionItem,children:[(0,k.jsxs)(`div`,{className:P.sessionInfo,onClick:()=>ve(e),children:[(0,k.jsx)(`div`,{className:P.sessionTask,children:e.task.slice(0,80)}),(0,k.jsxs)(`div`,{className:P.sessionMeta,children:[e.ts.slice(0,16),` · `,e.nodes.length,` agents`,e.council?.phase===`done`?` · 🏛️ Council`:``]})]}),(0,k.jsxs)(`div`,{className:P.sessionBtns,children:[(0,k.jsx)(`button`,{className:P.importBtn,onClick:()=>N(e),children:`→ Chat`}),(0,k.jsx)(`button`,{className:P.delSessionBtn,onClick:()=>ye(e.id),children:`✕`})]})]},e.id)),(0,k.jsx)(`div`,{className:P.sessionsFooter,children:(0,k.jsx)(`button`,{className:P.clearAllSessionsBtn,onClick:be,children:`Clear All`})})]})})]}),x&&(0,k.jsx)(`button`,{className:P.canvasToggleBtn,onClick:()=>{re(!0),O(`canvas`)},children:`📊 Panel`}),c&&(0,k.jsx)(`button`,{className:P.pdfBtn,onClick:xe,children:`⬇ PDF / HTML`}),(i.length>0||c||o.length>0)&&!u&&(0,k.jsx)(`button`,{className:P.clearBtn,onClick:Ce,title:`Clear all — start fresh`,children:`✕ Clear`})]})]}),(0,k.jsxs)(`div`,{className:P.inputArea,children:[(0,k.jsxs)(`div`,{className:P.inputRow,children:[(0,k.jsx)(`textarea`,{className:P.taskInput,value:n,onChange:e=>r(e.target.value),placeholder:`Describe your task… e.g. Analyze my emails and create a priority action plan`,rows:4,onKeyDown:e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),he())}}),(0,k.jsxs)(`div`,{className:P.inputControls,children:[u?(0,k.jsx)(`button`,{className:P.stopBtn,onClick:ge,children:`■ Stop`}):(0,k.jsx)(`button`,{className:P.runBtn,onClick:he,disabled:!n.trim(),children:`Run ▶`}),(0,k.jsxs)(`label`,{className:P.attachBtn,title:`Attach PDF or image`,children:[`📎`,(0,k.jsx)(`input`,{type:`file`,accept:`.pdf,.png,.jpg,.jpeg,.gif,.webp`,style:{display:`none`},onChange:e=>me(e.target.files?.[0])})]})]})]}),g&&(0,k.jsxs)(`div`,{className:P.attachBadge,children:[`📎 `,g.name,(0,k.jsx)(`button`,{className:P.clearAttach,onClick:()=>v(null),children:`✕`})]}),!u&&i.length===0&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`div`,{className:P.examples,children:ke.map((e,t)=>(0,k.jsx)(`button`,{className:P.exampleBtn,onClick:()=>r(e),children:e},t))}),(0,k.jsxs)(`div`,{className:P.financeSection,children:[(0,k.jsx)(`div`,{className:P.financeSectionTitle,children:`📈 Finance & Trading Workflows`}),(0,k.jsx)(`div`,{className:P.financePresets,children:De.map((e,t)=>(0,k.jsx)(`button`,{className:P.financeBtn,onClick:()=>{r(e.task),a(e.agents)},children:e.label},t))})]})]})]}),i.length>0&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`div`,{className:P.officeSceneWrap,style:{overflow:`hidden`,position:`relative`,height:`180px`},children:(0,k.jsxs)(`div`,{style:{display:`flex`,width:`200%`,height:`100%`,transition:`transform 700ms cubic-bezier(0.22, 1, 0.36, 1)`,transform:C&&C.phase!==`idle`&&C.phase!==`skipped`?`translateX(-50%)`:`translateX(0)`},children:[(0,k.jsx)(`div`,{style:{width:`50%`,height:`100%`,flexShrink:0},children:(0,k.jsx)(Qe,{nodes:i,running:u})}),(0,k.jsx)(`div`,{style:{width:`50%`,height:`100%`,flexShrink:0},children:(0,k.jsx)(rt,{agents:ne.length>0?ne:i,council:C})})]})}),(0,k.jsxs)(`div`,{className:`${P.pipelineWrap} ${u?P.pipelineRunning:``}`,children:[(0,k.jsxs)(`div`,{className:P.pipelineTitle,children:[`Agent Pipeline`,u&&(0,k.jsx)(`span`,{className:P.pipelineLiveTag,children:`● LIVE`})]}),(0,k.jsx)(`div`,{className:P.pipelineNodes,children:i.map((e,t)=>(0,k.jsxs)(`div`,{className:P.pipelineStep,children:[(0,k.jsxs)(`div`,{className:`${P.agentChip} ${P[`chip_${e.status}`]}`,children:[(0,k.jsx)(`span`,{className:P.chipIcon,children:e.icon}),(0,k.jsx)(`span`,{className:P.chipLabel,children:e.label}),e.status===`running`&&(0,k.jsxs)(`span`,{className:P.chipDots,children:[(0,k.jsx)(`span`,{className:P.dot1,children:`.`}),(0,k.jsx)(`span`,{className:P.dot2,children:`.`}),(0,k.jsx)(`span`,{className:P.dot3,children:`.`})]}),e.status===`done`&&(0,k.jsx)(`span`,{className:P.chipCheck,children:`✓`}),e.status===`error`&&(0,k.jsx)(`span`,{className:P.chipErr,children:`✗`})]}),t<i.length-1&&(0,k.jsx)(`div`,{className:`${P.arrow} ${u?P.arrowActive:``}`,children:`→`})]},t))}),i.some(e=>e.reason)&&(0,k.jsx)(`div`,{className:P.reasonRow,children:i.map((e,t)=>e.reason?(0,k.jsxs)(`div`,{className:P.reasonChip,title:e.reason,children:[(0,k.jsx)(`span`,{className:P.reasonIcon,children:e.icon}),(0,k.jsxs)(`span`,{className:P.reasonText,children:[e.reason.slice(0,60),e.reason.length>60?`…`:``]})]},t):null)})]})]}),(0,k.jsxs)(`div`,{className:P.body,ref:ue,children:[(o.length>0||we)&&(0,k.jsxs)(`div`,{className:P.twoCol,children:[(0,k.jsxs)(`div`,{className:P.logPanel,children:[(0,k.jsx)(`div`,{className:P.panelTitle,children:`Live Log`}),(0,k.jsx)(`div`,{className:P.logBody,ref:le,children:o.map((e,t)=>(0,k.jsxs)(`div`,{className:`${P.logEntry} ${P[`log_${e.type}`]}`,children:[(0,k.jsx)(`span`,{className:P.logTime,children:e.time}),(0,k.jsx)(`span`,{className:P.logIcon,children:e.icon}),(0,k.jsx)(`span`,{className:P.logAgent,children:e.agent}),(0,k.jsx)(`span`,{className:P.logText,children:e.text})]},t))})]}),(0,k.jsx)(`div`,{className:P.liveOutputPanel,children:i.filter(e=>e.output||e.status===`running`).map((e,t)=>(0,k.jsxs)(`div`,{className:`${P.liveBlock} ${e.status===`running`?P.liveBlockActive:``} ${e.status===`done`&&e.output?P.liveBlockClickable:``}`,onClick:()=>e.status===`done`&&e.output?se(e):void 0,children:[(0,k.jsxs)(`div`,{className:P.liveBlockHeader,children:[(0,k.jsx)(`span`,{className:P.liveBlockIcon,children:e.icon}),(0,k.jsx)(`span`,{className:P.liveBlockLabel,children:e.label}),e.reason&&(0,k.jsx)(`span`,{className:P.liveBlockReason,title:e.reason,children:`ℹ`}),(0,k.jsx)(`span`,{className:`${P.outputStatus} ${P[`status_${e.status}`]}`,children:e.status}),e.status===`done`&&e.output&&(0,k.jsx)(`span`,{className:P.expandHint,children:`↗ espandi`})]}),e.status===`running`&&(0,k.jsxs)(`div`,{className:P.liveBlockWorking,children:[(0,k.jsx)(`span`,{className:P.workingDot}),(0,k.jsx)(`span`,{className:P.workingDot}),(0,k.jsx)(`span`,{className:P.workingDot}),(0,k.jsx)(`span`,{className:P.workingLabel,children:e.statusLine??`elaborazione in corso`})]}),(0,k.jsx)(`div`,{className:`${P.liveBlockBody} ${e.status===`done`&&e.output?P.liveBlockBodyClamped:``}`,dangerouslySetInnerHTML:{__html:Se(e.output)+(e.status===`running`&&e.output?`<span class="studio-cursor"></span>`:``)}})]},t))})]}),ee&&(0,k.jsxs)(`div`,{className:P.parliamentPrompt,children:[(0,k.jsx)(`div`,{className:P.parliamentPromptIcon,children:`🏛️`}),(0,k.jsxs)(`div`,{className:P.parliamentPromptContent,children:[(0,k.jsx)(`div`,{className:P.parliamentPromptTitle,children:`Attivare il Consiglio?`}),(0,k.jsxs)(`div`,{className:P.parliamentPromptDesc,children:[ne.length,` agenti (`,ne.map(e=>e.label).join(`, `),`) hanno prodotto output. Il Geth Consensus eseguirà cross-reading, refinement e mediazione HERALD per raggiungere un consenso collettivo.`]}),(0,k.jsxs)(`div`,{className:P.parliamentPromptMeta,children:[`Complessità: `,ne.length<=3?`⚡ Rapido (~30s)`:ne.length<=5?`⏱ Medio (~60s)`:`🕐 Lungo (~2min)`,`\xA0· Consigliato per task analitici complessi`]})]}),(0,k.jsxs)(`div`,{className:P.parliamentPromptBtns,children:[(0,k.jsx)(`button`,{className:P.parliamentActivateBtn,onClick:_e,children:`🏛️ Attiva`}),(0,k.jsx)(`button`,{className:P.parliamentSkipBtn,onClick:()=>T(!1),children:`Salta`})]})]}),C&&!ee&&(0,k.jsx)(`div`,{className:P.councilWrapper,children:(0,k.jsx)(vt,{council:C})}),c&&!u&&(0,k.jsxs)(`details`,{className:P.resultAccordion,open:i.length<=1,children:[(0,k.jsxs)(`summary`,{className:P.resultAccordionSummary,children:[`Full Combined Report (`,i.filter(e=>e.output&&e.output!==`(no output)`).length,` agents)`]}),(0,k.jsx)(`div`,{className:P.resultAccordionBody,dangerouslySetInnerHTML:{__html:Se(c)}})]})]}),D&&(0,k.jsxs)(`div`,{className:P.canvasPanel,children:[(0,k.jsxs)(`div`,{className:P.canvasPanelHeader,children:[(0,k.jsxs)(`div`,{className:P.panelTabs,children:[(0,k.jsx)(`button`,{className:`${P.panelTabBtn} ${ie===`canvas`?P.panelTabActive:``}`,onClick:()=>O(`canvas`),children:`📊 Canvas`}),(0,k.jsx)(`button`,{className:`${P.panelTabBtn} ${ie===`browser`?P.panelTabActive:``}`,onClick:()=>O(`browser`),children:`🌐 Browser`})]}),(0,k.jsxs)(`div`,{className:P.canvasPanelActions,children:[ie===`canvas`&&x&&(0,k.jsx)(`button`,{className:P.canvasPanelBtn,onClick:()=>{let e=new Blob([x],{type:`text/html`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`nha-canvas-report.html`,n.click(),URL.revokeObjectURL(t)},children:`⬇ HTML`}),(0,k.jsx)(`button`,{className:P.canvasPanelClose,onClick:()=>re(!1),children:`✕`})]})]}),ie===`canvas`?x?(0,k.jsx)(`iframe`,{className:P.canvasFrame,srcDoc:x,sandbox:`allow-scripts`,title:`Canvas Report`}):(0,k.jsx)(`div`,{className:P.panelEmpty,children:`No canvas report yet. Run a workflow first.`}):(0,k.jsxs)(`div`,{className:P.browserPanel,children:[(0,k.jsxs)(`div`,{className:P.browserBar,children:[(0,k.jsx)(`input`,{className:P.browserInput,value:ae,onChange:e=>A(e.target.value),placeholder:`https://…`,onKeyDown:e=>{e.key===`Enter`&&A(ae)}}),(0,k.jsx)(`button`,{className:P.browserGo,onClick:()=>A(ae),children:`Go`})]}),ae?(0,k.jsx)(`iframe`,{className:P.canvasFrame,src:ae,sandbox:`allow-scripts allow-same-origin allow-forms`,title:`Browser`}):(0,k.jsx)(`div`,{className:P.panelEmpty,children:`Enter a URL above to browse`})]})]}),oe&&(0,k.jsx)(`div`,{className:P.blockModalOverlay,onClick:()=>se(null),children:(0,k.jsxs)(`div`,{className:P.blockModal,onClick:e=>e.stopPropagation(),children:[(0,k.jsxs)(`div`,{className:P.blockModalHeader,children:[(0,k.jsx)(`span`,{className:P.liveBlockIcon,children:oe.icon}),(0,k.jsx)(`span`,{className:P.blockModalTitle,children:oe.label}),(0,k.jsx)(`button`,{className:P.blockModalClose,onClick:()=>se(null),children:`✕`})]}),(0,k.jsx)(`div`,{className:`${P.liveBlockBody} ${P.blockModalBody}`,dangerouslySetInnerHTML:{__html:Se(oe.output)}})]})})]})}var R={root:`_root_13wnr_2`,hero:`_hero_13wnr_12`,heroLeft:`_heroLeft_13wnr_21`,heroDate:`_heroDate_13wnr_22`,heroTitle:`_heroTitle_13wnr_23`,heroVer:`_heroVer_13wnr_24`,heroUptime:`_heroUptime_13wnr_25`,heroWeather:`_heroWeather_13wnr_27`,wIcon:`_wIcon_13wnr_35`,wInfo:`_wInfo_13wnr_36`,wTemp:`_wTemp_13wnr_37`,wCity:`_wCity_13wnr_38`,wDesc:`_wDesc_13wnr_39`,wEmpty:`_wEmpty_13wnr_40`,kpiRow:`_kpiRow_13wnr_43`,kpi:`_kpi_13wnr_43`,kpiNum:`_kpiNum_13wnr_55`,kpiLbl:`_kpiLbl_13wnr_56`,kpiBar:`_kpiBar_13wnr_57`,kpiFill:`_kpiFill_13wnr_58`,liveGrid:`_liveGrid_13wnr_61`,liveCard:`_liveCard_13wnr_67`,liveHdr:`_liveHdr_13wnr_71`,liveMore:`_liveMore_13wnr_79`,liveRow:`_liveRow_13wnr_81`,liveUnread:`_liveUnread_13wnr_89`,liveTitle:`_liveTitle_13wnr_89`,liveTime:`_liveTime_13wnr_91`,liveBody:`_liveBody_13wnr_95`,liveSub:`_liveSub_13wnr_97`,prio:`_prio_13wnr_99`,prio_high:`_prio_high_13wnr_103`,prio_medium:`_prio_medium_13wnr_104`,prio_low:`_prio_low_13wnr_105`,launcher:`_launcher_13wnr_108`,launchGroup:`_launchGroup_13wnr_115`,launchGroupLabel:`_launchGroupLabel_13wnr_117`,launchTiles:`_launchTiles_13wnr_123`,tile:`_tile_13wnr_129`,tileIcon:`_tileIcon_13wnr_143`,tileLabel:`_tileLabel_13wnr_144`},bt=[{view:`chat`,icon:`💬`,label:`Chat`,color:`#38bdf8`,group:`Panoramica`},{view:`plan`,icon:`🗓️`,label:`Daily Plan`,color:`#818cf8`,group:`Panoramica`},{view:`tasks`,icon:`✅`,label:`Tasks`,color:`#4ade80`,group:`Panoramica`},{view:`email`,icon:`📧`,label:`Email`,color:`#f87171`,group:`Google`},{view:`calendar`,icon:`📅`,label:`Calendar`,color:`#fb923c`,group:`Google`},{view:`drive`,icon:`💾`,label:`Drive`,color:`#facc15`,group:`Google`},{view:`contacts`,icon:`👤`,label:`Contacts`,color:`#34d399`,group:`Google`},{view:`notes`,icon:`📝`,label:`Notes`,color:`#a78bfa`,group:`Google`},{view:`onedrive`,icon:`☁️`,label:`OneDrive`,color:`#60a5fa`,group:`Microsoft`},{view:`mstodo`,icon:`📋`,label:`MS Todo`,color:`#38bdf8`,group:`Microsoft`},{view:`github`,icon:`🐙`,label:`GitHub`,color:`#e2e8f0`,group:`Tools`},{view:`notion`,icon:`📓`,label:`Notion`,color:`#94a3b8`,group:`Tools`},{view:`slack`,icon:`💼`,label:`Slack`,color:`#e879f9`,group:`Tools`},{view:`maps`,icon:`🗺️`,label:`Maps`,color:`#2dd4bf`,group:`Tools`},{view:`reminders`,icon:`🔔`,label:`Reminders`,color:`#fbbf24`,group:`Tools`},{view:`birthdays`,icon:`🎂`,label:`Birthdays`,color:`#f472b6`,group:`Tools`},{view:`cron`,icon:`⏰`,label:`Cron`,color:`#fb923c`,group:`Tools`},{view:`screen`,icon:`🖥️`,label:`Screen`,color:`#64748b`,group:`Tools`},{view:`agents`,icon:`🤖`,label:`Agents`,color:`#4ade80`,group:`AI`},{view:`studio`,icon:`🎭`,label:`Studio`,color:`#a78bfa`,group:`AI`},{view:`webcraft`,icon:`🔨`,label:`WebCraft`,color:`#f59e0b`,group:`AI`},{view:`collab`,icon:`🏛️`,label:`Alexandria`,color:`#38bdf8`,group:`AI`},{view:`connectors`,icon:`🔗`,label:`AWF - AutoWorkFlow`,color:`#94a3b8`,group:`Config`},{view:`settings`,icon:`⚙️`,label:`Settings`,color:`#64748b`,group:`Config`}],xt={Sunny:`☀️`,Clear:`☀️`,"Partly Cloudy":`⛅`,"Partly cloudy":`⛅`,Cloudy:`☁️`,Overcast:`☁️`,"Light rain":`🌧️`,Rain:`🌧️`,Drizzle:`🌧️`,"Moderate rain":`🌧️`,"Heavy rain":`🌧️`,Snow:`❄️`,"Light snow":`❄️`,Fog:`🌫️`,Mist:`🌫️`,Thunder:`⚡`,"Thundery outbreaks":`⚡`};function St(e){try{return new Date(e).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,hour12:!1})}catch{return e}}function Ct(e){try{return new Date(e).toLocaleDateString(`en`,{month:`short`,day:`numeric`})}catch{return e}}function wt(){let e=te(e=>e.setView),t=j(),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)([]),[o,s]=(0,_.useState)([]),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)(null),[f,p]=(0,_.useState)(new Date);(0,_.useEffect)(()=>{let e=setInterval(()=>p(new Date),6e4);return()=>clearInterval(e)},[]),(0,_.useEffect)(()=>{let e=!0,t=t=>n=>{e&&n!=null&&t(n)};E(`/api/tasks`).then(e=>t(r)(e?.tasks??[])),E(`/api/emails?page=0&pageSize=8`).then(e=>t(a)(e?.emails??[])),E(`/api/calendar`).then(e=>t(s)(e?.events??[])),E(`/api/status`).then(t(l));let n=localStorage.getItem(`nha_weather_location`),i=t=>E(`/api/weather?location=${encodeURIComponent(t)}`).then(t=>{e&&t&&t.city&&d(t)});return n?i(n):navigator.geolocation?.getCurrentPosition(e=>i(`${e.coords.latitude.toFixed(4)},${e.coords.longitude.toFixed(4)}`),()=>{},{timeout:6e3}),()=>{e=!1}},[]);let m=n.filter(e=>e.status!==`done`),h=n.filter(e=>e.status===`done`),g=n.length>0?Math.round(h.length/n.length*100):0,v=i.filter(e=>e.isUnread).length,y=f.toLocaleDateString(`en`,{weekday:`long`,month:`long`,day:`numeric`}),b=[...new Set(bt.map(e=>e.group))];return(0,k.jsxs)(`div`,{className:R.root,children:[(0,k.jsxs)(`div`,{className:R.hero,children:[(0,k.jsxs)(`div`,{className:R.heroLeft,children:[(0,k.jsx)(`div`,{className:R.heroDate,children:y}),(0,k.jsx)(`div`,{className:R.heroTitle,children:c?(0,k.jsxs)(k.Fragment,{children:[`NHA `,(0,k.jsxs)(`span`,{className:R.heroVer,children:[`v`,c.version]}),` · `,(0,k.jsxs)(`span`,{className:R.heroUptime,children:[Math.floor(c.uptime/60),`m uptime`]})]}):`NotHumanAllowed`})]}),(0,k.jsx)(`div`,{className:R.heroWeather,onClick:()=>{let e=prompt(`City or lat,lon:`);e&&(localStorage.setItem(`nha_weather_location`,e),d(null),E(`/api/weather?location=${encodeURIComponent(e)}`).then(e=>{e&&e.city&&d(e)}))},children:u?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`span`,{className:R.wIcon,children:xt[u.desc]??u.icon??`🌡️`}),(0,k.jsxs)(`div`,{className:R.wInfo,children:[(0,k.jsxs)(`span`,{className:R.wTemp,children:[u.tempC,`°C`]}),(0,k.jsxs)(`span`,{className:R.wCity,children:[u.city.split(`,`)[0],u.country?`, ${u.country.slice(0,2).toUpperCase()}`:``]}),(0,k.jsxs)(`span`,{className:R.wDesc,children:[u.desc,` · 💧`,u.humidity,`%`]})]})]}):(0,k.jsxs)(`span`,{className:R.wEmpty,children:[`🌡️ `,t(`dashboard.weather`)]})})]}),(0,k.jsxs)(`div`,{className:R.kpiRow,children:[(0,k.jsxs)(`div`,{className:R.kpi,onClick:()=>e(`tasks`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.kpiNum,children:m.length}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:`Pending tasks`}),n.length>0&&(0,k.jsx)(`div`,{className:R.kpiBar,children:(0,k.jsx)(`div`,{className:R.kpiFill,style:{width:`${g}%`}})})]}),(0,k.jsxs)(`div`,{className:R.kpi,onClick:()=>e(`email`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.kpiNum,children:v>0?v:i.length}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:v>0?`Unread emails`:`Emails`})]}),(0,k.jsxs)(`div`,{className:R.kpi,onClick:()=>e(`calendar`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.kpiNum,children:o.length}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:`Today's events`})]}),u&&(0,k.jsxs)(`div`,{className:R.kpi,children:[(0,k.jsxs)(`span`,{className:R.kpiNum,children:[u.feelsC,`°`]}),(0,k.jsx)(`span`,{className:R.kpiLbl,children:`Feels like`})]})]}),(0,k.jsxs)(`div`,{className:R.liveGrid,children:[o.length>0&&(0,k.jsxs)(`div`,{className:R.liveCard,children:[(0,k.jsxs)(`div`,{className:R.liveHdr,onClick:()=>e(`calendar`),role:`button`,children:[(0,k.jsxs)(`span`,{children:[`📅 `,t(`calendar.title`)]}),(0,k.jsx)(`span`,{className:R.liveMore,children:`→`})]}),o.slice(0,5).map((t,n)=>(0,k.jsxs)(`div`,{className:R.liveRow,onClick:()=>e(`calendar`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.liveTime,children:t.isAllDay?`All day`:St(t.start)}),(0,k.jsxs)(`div`,{className:R.liveBody,children:[(0,k.jsx)(`span`,{className:R.liveTitle,children:t.summary}),t.location&&(0,k.jsx)(`span`,{className:R.liveSub,children:t.location})]})]},n))]}),i.length>0&&(0,k.jsxs)(`div`,{className:R.liveCard,children:[(0,k.jsxs)(`div`,{className:R.liveHdr,onClick:()=>e(`email`),role:`button`,children:[(0,k.jsxs)(`span`,{children:[`📧 `,t(`email.inbox`)]}),(0,k.jsx)(`span`,{className:R.liveMore,children:`→`})]}),i.slice(0,5).map((t,n)=>(0,k.jsxs)(`div`,{className:`${R.liveRow} ${t.isUnread?R.liveUnread:``}`,onClick:()=>e(`email`),role:`button`,children:[(0,k.jsx)(`span`,{className:R.liveTime,children:Ct(t.date)}),(0,k.jsxs)(`div`,{className:R.liveBody,children:[(0,k.jsx)(`span`,{className:R.liveTitle,children:t.subject}),(0,k.jsx)(`span`,{className:R.liveSub,children:t.from})]})]},n))]}),m.length>0&&(0,k.jsxs)(`div`,{className:R.liveCard,children:[(0,k.jsxs)(`div`,{className:R.liveHdr,onClick:()=>e(`tasks`),role:`button`,children:[(0,k.jsxs)(`span`,{children:[`✅ `,t(`tasks.title`),` · `,h.length,`/`,n.length,` (`,g,`%)`]}),(0,k.jsx)(`span`,{className:R.liveMore,children:`→`})]}),m.slice(0,5).map((t,n)=>(0,k.jsxs)(`div`,{className:R.liveRow,onClick:()=>e(`tasks`),role:`button`,children:[(0,k.jsx)(`span`,{className:`${R.prio} ${R[`prio_`+t.priority]}`,children:t.priority[0].toUpperCase()}),(0,k.jsx)(`div`,{className:R.liveBody,children:(0,k.jsx)(`span`,{className:R.liveTitle,children:t.description})})]},n))]})]}),(0,k.jsx)(`div`,{className:R.launcher,children:b.map(t=>(0,k.jsxs)(`div`,{className:R.launchGroup,children:[(0,k.jsx)(`div`,{className:R.launchGroupLabel,children:t}),(0,k.jsx)(`div`,{className:R.launchTiles,children:bt.filter(e=>e.group===t).map(t=>(0,k.jsxs)(`button`,{className:R.tile,onClick:()=>e(t.view),style:{"--tc":t.color},children:[(0,k.jsx)(`span`,{className:R.tileIcon,children:t.icon}),(0,k.jsx)(`span`,{className:R.tileLabel,children:t.label})]},t.view))})]},t))})]})}var Tt={root:`_root_1pldx_1`,loading:`_loading_1pldx_2`,bar:`_bar_1pldx_4`,input:`_input_1pldx_5`,select:`_select_1pldx_6`,addBtn:`_addBtn_1pldx_7`,actions:`_actions_1pldx_10`,clearDone:`_clearDone_1pldx_11`,clearAll:`_clearAll_1pldx_12`,stats:`_stats_1pldx_14`,progress:`_progress_1pldx_15`,progressBar:`_progressBar_1pldx_16`,empty:`_empty_1pldx_18`,task:`_task_1pldx_20`,taskDone:`_taskDone_1pldx_22`,check:`_check_1pldx_23`,checkDone:`_checkDone_1pldx_25`,desc:`_desc_1pldx_26`,del:`_del_1pldx_27`,badge:`_badge_1pldx_30`,badge_high:`_badge_high_1pldx_31`,badge_medium:`_badge_medium_1pldx_32`,badge_low:`_badge_low_1pldx_33`,doneLabel:`_doneLabel_1pldx_35`};function Et(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(`medium`),[l,u]=(0,_.useState)(!1),d=(0,_.useRef)(null),f=()=>E(`/api/tasks`).then(e=>{n(e?.tasks??[]),i(!1)});(0,_.useEffect)(()=>{f()},[]);let p=async()=>{a.trim()&&(u(!0),await D(`/api/tasks`,{description:a.trim(),priority:s}),o(``),u(!1),f(),d.current?.focus())},m=e=>D(`/api/tasks/${e}/done`,{},`PATCH`).then(f),h=e=>D(`/api/tasks/${e}/delete`,{}).then(f),g=()=>D(`/api/tasks/clear`,{filter:`done`}).then(f),v=()=>{confirm(e(`tasks.deleteTask`))&&D(`/api/tasks/clear`,{filter:`all`}).then(f)},y=t.filter(e=>e.status!==`done`),b=t.filter(e=>e.status===`done`);return r?(0,k.jsxs)(`div`,{className:Tt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),e(`common.loading`)]}):(0,k.jsxs)(`div`,{className:Tt.root,children:[(0,k.jsxs)(`div`,{className:Tt.bar,children:[(0,k.jsx)(`input`,{ref:d,className:Tt.input,value:a,onChange:e=>o(e.target.value),onKeyDown:e=>e.key===`Enter`&&p(),placeholder:e(`tasks.newTask`)}),(0,k.jsxs)(`select`,{className:Tt.select,value:s,onChange:e=>c(e.target.value),children:[(0,k.jsx)(`option`,{value:`high`,children:`High`}),(0,k.jsx)(`option`,{value:`medium`,children:`Medium`}),(0,k.jsx)(`option`,{value:`low`,children:`Low`})]}),(0,k.jsx)(`button`,{className:Tt.addBtn,onClick:p,disabled:l||!a.trim(),children:l?`…`:`+ `+e(`common.add`)})]}),t.length>0&&(0,k.jsxs)(`div`,{className:Tt.actions,children:[(0,k.jsx)(`button`,{className:Tt.clearDone,onClick:g,children:`Clear completed`}),(0,k.jsx)(`button`,{className:Tt.clearAll,onClick:v,children:`Clear all`})]}),t.length>0&&(0,k.jsxs)(`div`,{className:Tt.stats,children:[y.length,` pending · `,b.length,` done`,t.length>0&&(0,k.jsx)(`span`,{className:Tt.progress,children:(0,k.jsx)(`span`,{className:Tt.progressBar,style:{width:`${Math.round(b.length/t.length*100)}%`}})})]}),y.length===0&&b.length===0&&(0,k.jsx)(`div`,{className:Tt.empty,children:`No tasks yet. Add one above ↑`}),y.map(e=>(0,k.jsxs)(`div`,{className:Tt.task,children:[(0,k.jsx)(`span`,{className:Tt.check,onClick:()=>m(e.id)}),(0,k.jsx)(`span`,{className:Tt.desc,onClick:()=>m(e.id),children:e.description}),(0,k.jsx)(`span`,{className:`${Tt.badge} ${Tt[`badge_`+e.priority]}`,children:e.priority}),(0,k.jsx)(`span`,{className:Tt.del,onClick:()=>h(e.id),children:`×`})]},e.id)),b.length>0&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`div`,{className:Tt.doneLabel,children:`Completed`}),b.map(e=>(0,k.jsxs)(`div`,{className:`${Tt.task} ${Tt.taskDone}`,children:[(0,k.jsx)(`span`,{className:`${Tt.check} ${Tt.checkDone}`,onClick:()=>m(e.id),children:`✓`}),(0,k.jsx)(`span`,{className:Tt.desc,onClick:()=>m(e.id),children:e.description}),(0,k.jsx)(`span`,{className:`${Tt.badge} ${Tt[`badge_`+e.priority]}`,children:e.priority}),(0,k.jsx)(`span`,{className:Tt.del,onClick:()=>h(e.id),children:`×`})]},e.id))]})]})}var z={root:`_root_k5v14_1`,loading:`_loading_k5v14_2`,card:`_card_k5v14_4`,cardTitle:`_cardTitle_k5v14_5`,cardTitleRow:`_cardTitleRow_k5v14_6`,cardSub:`_cardSub_k5v14_7`,connected:`_connected_k5v14_8`,statusMsg:`_statusMsg_k5v14_9`,fields:`_fields_k5v14_11`,field:`_field_k5v14_11`,fieldLabel:`_fieldLabel_k5v14_13`,fieldInput:`_fieldInput_k5v14_14`,saveBtn:`_saveBtn_k5v14_17`,dangerBtn:`_dangerBtn_k5v14_18`,cancelBtn:`_cancelBtn_k5v14_19`,btnRow:`_btnRow_k5v14_20`,keySet:`_keySet_k5v14_22`,keySummary:`_keySummary_k5v14_23`,keySummaryIcon:`_keySummaryIcon_k5v14_24`,nhaFree:`_nhaFree_k5v14_26`,nhaFreeTitle:`_nhaFreeTitle_k5v14_27`,nhaFreeSub:`_nhaFreeSub_k5v14_28`,nhaFreeBtn:`_nhaFreeBtn_k5v14_29`,imapRow:`_imapRow_k5v14_31`,imapName:`_imapName_k5v14_32`,imapMeta:`_imapMeta_k5v14_33`,imapStatus:`_imapStatus_k5v14_34`,imapBtns:`_imapBtns_k5v14_38`,imapSyncBtn:`_imapSyncBtn_k5v14_39`,imapEditBtn:`_imapEditBtn_k5v14_40`,imapDelBtn:`_imapDelBtn_k5v14_41`,emptyImap:`_emptyImap_k5v14_42`,imapForm:`_imapForm_k5v14_44`,imapFormTitle:`_imapFormTitle_k5v14_45`,pwdNote:`_pwdNote_k5v14_46`,pwdRow:`_pwdRow_k5v14_47`,togglePwd:`_togglePwd_k5v14_48`},Dt={id:``,display_name:``,email_address:``,from_name:``,imap_host:``,imap_port:`993`,smtp_host:``,smtp_port:`587`,username:``,password:``};function Ot({id:e,label:t,placeholder:n,value:r,onChange:i,type:a=`text`}){return(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t}),(0,k.jsx)(`input`,{id:e,type:a,placeholder:n,value:r,onChange:e=>i(e.target.value),className:z.fieldInput})]})}function kt(){let[e,t]=(0,_.useState)([]),[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)(``),f=()=>{E(`/api/credentials`).then(e=>t(e?.credentials??[])).catch(()=>t([]))};(0,_.useEffect)(()=>{f()},[]);let p=async()=>{if(!/^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(n)){d(`Name: lettere, cifre, _ — primo carattere non numerico`);return}if(!i.trim()){d(`Value required`);return}l(!0),d(``);try{let e=await D(`/api/credentials`,{name:n,value:i,description:o});e&&!e.ok&&e.error?d(e.error):(r(``),a(``),s(``),f())}finally{l(!1)}},m=async e=>{confirm(`Delete credential "${e}"?`)&&(await fetch(`/api/credentials/${encodeURIComponent(e)}`,{method:`DELETE`}),f())};return(0,k.jsxs)(`div`,{style:{marginTop:16,padding:16,background:`var(--bg2, rgba(15,23,42,0.4))`,border:`1px solid var(--border, rgba(148,163,184,0.18))`,borderRadius:10},children:[(0,k.jsx)(`div`,{style:{fontSize:14,fontWeight:800,marginBottom:4},children:`Credentials Vault 🔐`}),(0,k.jsxs)(`div`,{style:{fontSize:11,opacity:.7,marginBottom:10},children:[`Encrypted secrets (AES-256-GCM, machine-bound key). Reference them in workflow nodes with `,(0,k.jsx)(`code`,{children:"${cred.NAME}"}),`. The raw value never leaves your computer.`]}),e.length>0&&(0,k.jsx)(`div`,{style:{marginBottom:12,border:`1px solid rgba(148,163,184,0.15)`,borderRadius:6},children:e.map(e=>(0,k.jsxs)(`div`,{style:{display:`flex`,alignItems:`center`,gap:8,padding:`6px 10px`,borderBottom:`1px solid rgba(148,163,184,0.1)`,fontSize:12},children:[(0,k.jsx)(`code`,{style:{background:`rgba(99,102,241,0.12)`,padding:`2px 6px`,borderRadius:4,color:`#a5b4fc`,fontWeight:700},children:e.name}),(0,k.jsx)(`span`,{style:{flex:1,opacity:.7},children:e.description||(0,k.jsx)(`em`,{children:`no description`})}),(0,k.jsx)(`span`,{style:{fontSize:10,opacity:.5},children:new Date(e.updatedAt).toLocaleString()}),e.hasError&&(0,k.jsx)(`span`,{style:{color:`#ef4444`,fontSize:10},children:`⚠ decrypt error`}),(0,k.jsx)(`button`,{onClick:()=>m(e.name),style:{background:`transparent`,border:`none`,cursor:`pointer`,color:`#ef4444`,fontSize:14},children:`✕`})]},e.name))}),(0,k.jsxs)(`div`,{style:{display:`grid`,gridTemplateColumns:`1fr 1fr`,gap:8},children:[(0,k.jsx)(`input`,{placeholder:`NAME (e.g. STRIPE_KEY)`,value:n,onChange:e=>r(e.target.value),style:{padding:6,borderRadius:4,border:`1px solid rgba(148,163,184,0.2)`,background:`transparent`,color:`inherit`,fontFamily:`SF Mono, monospace`}}),(0,k.jsx)(`input`,{placeholder:`Description (optional)`,value:o,onChange:e=>s(e.target.value),style:{padding:6,borderRadius:4,border:`1px solid rgba(148,163,184,0.2)`,background:`transparent`,color:`inherit`}})]}),(0,k.jsx)(`input`,{type:`password`,placeholder:`Value (encrypted at rest)`,value:i,onChange:e=>a(e.target.value),style:{width:`100%`,marginTop:6,padding:6,borderRadius:4,border:`1px solid rgba(148,163,184,0.2)`,background:`transparent`,color:`inherit`}}),u&&(0,k.jsx)(`div`,{style:{color:`#ef4444`,fontSize:11,marginTop:4},children:u}),(0,k.jsx)(`button`,{onClick:p,disabled:c,style:{marginTop:8,padding:`6px 14px`,borderRadius:4,border:`none`,background:`#6366f1`,color:`white`,fontWeight:700,cursor:`pointer`,opacity:c?.5:1},children:c?`Saving…`:`+ Add credential`})]})}function At(){let{setConfig:e}=te(),t=j(),[n,r]=(0,_.useState)({}),[i,a]=(0,_.useState)(!0),[o,s]=(0,_.useState)(null),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)([]),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(``),[y,b]=(0,_.useState)(!1),[x,S]=(0,_.useState)({name:``,email:``,phone:``,homeAddress:``,workAddress:``,city:``,country:``,company:``,role:``,notes:``}),[C,w]=(0,_.useState)(`nha`),[ee,T]=(0,_.useState)(``),[ne,re]=(0,_.useState)(``),[ie,O]=(0,_.useState)(``),[ae,A]=(0,_.useState)(``),[oe,se]=(0,_.useState)(``),[ce,le]=(0,_.useState)(``),[ue,de]=(0,_.useState)(``),[M,fe]=(0,_.useState)(``),[pe,me]=(0,_.useState)(!1),[he,ge]=(0,_.useState)(``),[_e,ve]=(0,_.useState)(`en`),[ye,be]=(0,_.useState)(`07:00`),[xe,Se]=(0,_.useState)(`18:00`),[N,Ce]=(0,_.useState)(`30`),[we,Te]=(0,_.useState)(`off`),[Ee,P]=(0,_.useState)(``),[De,Oe]=(0,_.useState)(``),[ke,F]=(0,_.useState)(``),[I,Ae]=(0,_.useState)(`agent`),[je,Me]=(0,_.useState)(``),[Ne,Pe]=(0,_.useState)(!0),[Fe,Ie]=(0,_.useState)(!0),[Le,Re]=(0,_.useState)(`3`),[ze,L]=(0,_.useState)(`0.30`),[Be,Ve]=(0,_.useState)(!0),[He,Ue]=(0,_.useState)(!1),[We,Ge]=(0,_.useState)(!1),[Ke,qe]=(0,_.useState)(!1),[Je,Ye]=(0,_.useState)(!1),[Xe,Ze]=(0,_.useState)(!1),[Qe,$e]=(0,_.useState)(!1),[et,tt]=(0,_.useState)(!0),[nt,rt]=(0,_.useState)(``),[it,at]=(0,_.useState)(!1),[ot,st]=(0,_.useState)(!1),[ct,lt]=(0,_.useState)(!0),[ut,dt]=(0,_.useState)(``),[ft,pt]=(0,_.useState)(``),[mt,ht]=(0,_.useState)(``),[gt,_t]=(0,_.useState)(``),[vt,yt]=(0,_.useState)(`common`),[R,bt]=(0,_.useState)(!1),[xt,St]=(0,_.useState)(``);(0,_.useEffect)(()=>{E(`/api/config`).then(t=>{r(t??{});let n=t?.profile??{};S({name:n.name??``,email:n.email??``,phone:n.phone??``,homeAddress:n.homeAddress??``,workAddress:n.workAddress??``,city:n.city??``,country:n.country??``,company:n.company??``,role:n.role??``,notes:n.notes??``}),w(t?.provider??`nha`),ge(t?.model??``),ve(t?.lang??`en`),be(t?.planTime??`07:00`),Se(t?.summaryTime??`18:00`),Ce(String(t?.meetingAlert??`30`)),Te(t?.thinking??`off`),T(``);let i=t?.responder,o=i?.telegram;F(String(o?.botName??``));let s=String(o?.personaMode??`agent`);Ae(s===`persona`||s===`persona-only`||s===`persona+role`?s:`agent`),Me(Array.isArray(o?.allowedChatIds)?o.allowedChatIds.join(`, `):``),Pe(i?.autoRoute!==!1);let c=t?.deliberation;Ie(c?.enabled!==!1),Re(String(c?.rounds??`3`)),L(String(c?.convergence??`0.30`)),Ve(c?.tribunalEnabled!==!1);let l=t?.ops?.proactive;Ue(!!l?.enabled),Ge(!!l?.emailFollowUp),qe(!!l?.meetingPrep),Ye(!!l?.patterns),Ze(!!l?.deadlines);let u=t?.voice;$e(!!u?.preferWhisper),tt(u?.speechSynthesis!==!1),rt(String(u?.language??``));let d=t?.features;at(!!d?.verbose),st(!!d?.immersive),lt(d?.knowledgeEnabled!==!1),dt(``),pt(String(t?.github?.defaultRepo??``)),ht(``),_t(``);let f=t?.microsoft;yt(String(f?.tenantId??`common`));let p=t?.plugins;bt(!!p?.autoRun),St(String(p?.directory??``)),a(!1),t&&e(t)}),Ct()},[]);let Ct=()=>E(`/api/imap/accounts`).then(e=>d(e?.accounts??[])),wt=async(e,t)=>{s(e),await D(`/api/config`,{key:e,value:t}),l(e),s(null),setTimeout(()=>l(null),2e3)},Tt=()=>wt(`profile`,x),Et=()=>{wt(`provider`,C),wt(`model`,he),wt(`thinking`,we),ee&&wt(`key`,ee),ne&&wt(`groq-key`,ne),ie&&wt(`openai-key`,ie),ae&&wt(`gemini-key`,ae),oe&&wt(`deepseek-key`,oe),ce&&wt(`grok-key`,ce),ue&&wt(`mistral-key`,ue),M&&wt(`cohere-key`,M)},At=()=>{wt(`planTime`,ye),wt(`summaryTime`,xe),wt(`meetingAlert`,Number(N))},jt=()=>{v(t(`settings.googleOpening`)),D(`/api/google/auth`,{}).then(e=>{e?.url?(window.open(e.url,`_blank`),v(t(`settings.googleOpened`))):e?.error&&v(t(`common.error`)+`: `+e.error)}).catch(e=>v(t(`common.error`)+`: `+e.message))},Mt=()=>{confirm(t(`settings.disconnectGoogleConfirm`))&&D(`/api/google/revoke`,{}).then(()=>{r(e=>({...e,hasGoogle:!1})),v(t(`common.disconnected`))})},B=()=>{if(!f)return;let e=!!f.id,t={display_name:f.display_name,email_address:f.email_address,from_name:f.from_name,imap_host:f.imap_host,imap_port:Number(f.imap_port),smtp_host:f.smtp_host,smtp_port:Number(f.smtp_port),username:f.username};f.password&&(t.password=f.password),e&&(t.id=f.id),h(`Saving…`),D(e?`/api/imap/accounts/update`:`/api/imap/accounts`,t).then(e=>{e?.ok||e?.id?(h(`Saved!`),p(null),Ct()):h(`Error: `+(e?.error??`Unknown error`))}).catch(e=>h(`Error: `+e.message))},Nt=(e,n)=>{confirm(t(`settings.imapDelete`,{name:n}))&&D(`/api/imap/accounts/delete`,{id:e}).then(()=>Ct())},Pt=e=>{D(`/api/imap/sync`,{accountId:e}).then(()=>setTimeout(Ct,3e3))},Ft=async()=>{if(f){if(!f.imap_host||!f.imap_port){h(`⚠ Inserisci prima host e porta IMAP.`);return}h(`Diagnostica porta IMAP in corso…`);try{let e=await D(`/api/imap/probe`,{imap_host:f.imap_host,imap_port:Number(f.imap_port)});e?.ok?h(`✓ ${f.imap_host}:${f.imap_port} risponde\n${e.message}${e.banner?`\n\nBanner: ${e.banner}`:``}`):h(`✗ ${f.imap_host}:${f.imap_port} non risponde\n${e?.message??e?.error??`errore sconosciuto`}`)}catch(e){h(`✗ Diagnostica fallita: ${e.message}`)}}},It=async e=>{if(!f)return;if(!f.password&&!f.id){h(`⚠ Inserisci la password prima di testare.`);return}h(e?`Invio email di prova…`:`Test connessione in corso…`);let t={imap_host:f.imap_host,imap_port:Number(f.imap_port),smtp_host:f.smtp_host,smtp_port:Number(f.smtp_port),username:f.username,password:f.password,email_address:f.email_address,from_name:f.from_name,sendTest:e};try{let e=await D(`/api/imap/test`,t),n=e?.imap,r=e?.smtp,i=[];n?.ok?i.push(`✓ IMAP OK (TLS=${n.secure?`implicit`:`STARTTLS`}, ${n.folderCount??`?`} cartelle)`):i.push(`✗ IMAP errore: ${n?.error??`sconosciuto`}`),r?.ok?r.sent?i.push(`✓ SMTP OK — email di prova inviata a ${f.email_address} (id ${(r.messageId||``).slice(0,24)}…)`):i.push(`✓ SMTP OK (TLS=${r.secure?`implicit`:`STARTTLS`}, auth valida)`):i.push(`✗ SMTP errore: ${r?.error??`sconosciuto`}`),h(i.join(` · `))}catch(e){h(`✗ Test fallito: ${e.message}`)}};if(i)return(0,k.jsxs)(`div`,{className:z.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),t(`common.loading`)]});let Lt=e=>t(o===e?`common.saving`:c===e?`common.saved`:`common.save`);return(0,k.jsxs)(`div`,{className:z.root,children:[(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.profile`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.profileSub`)}),(0,k.jsx)(`div`,{className:z.fields,children:[[`name`,t(`settings.name`),t(`settings.namePh`)],[`email`,t(`common.email`),t(`settings.emailPh`)],[`phone`,t(`common.phone`),t(`settings.phonePh`)],[`homeAddress`,t(`settings.homeAddress`),t(`settings.homeAddressPh`)],[`workAddress`,t(`settings.workAddress`),t(`settings.workAddressPh`)],[`city`,t(`settings.city`),t(`settings.cityPh`)],[`country`,t(`settings.country`),t(`settings.countryPh`)],[`company`,t(`settings.company`),t(`settings.companyPh`)],[`role`,t(`settings.role`),t(`settings.rolePh`)],[`notes`,t(`settings.notes`),t(`settings.notesPh`)]].map(([e,t,n])=>(0,k.jsx)(Ot,{id:e,label:t,placeholder:n,value:x[e],onChange:t=>S(n=>({...n,[e]:t}))},e))}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:Tt,children:[Lt(`profile`),` `,t(`settings.saveProfile`)]})]}),(0,k.jsxs)(`div`,{className:z.nhaFree,children:[(0,k.jsx)(`div`,{className:z.nhaFreeTitle,children:t(`settings.nhaFreeTitle`)}),(0,k.jsx)(`div`,{className:z.nhaFreeSub,children:t(`settings.nhaFreeSub`)}),(0,k.jsx)(`button`,{className:z.nhaFreeBtn,onClick:()=>{D(`/api/config`,{updates:[{key:`provider`,value:`nha`},{key:`model`,value:``},{key:`key`,value:``}]}).then(()=>{w(`nha`),ge(``),T(``),l(`nhaFree`),setTimeout(()=>l(null),2e3)})},children:t(c===`nhaFree`?`settings.liaraActivated`:`settings.useLiara`)})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.llmProvider`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.llmProviderSub`)}),(()=>{let e=[];return n.hasApiKey&&e.push(`Anthropic`),n.hasOpenaiKey&&e.push(`OpenAI`),n.hasGeminiKey&&e.push(`Gemini`),n.hasDeepseekKey&&e.push(`DeepSeek`),n.hasGrokKey&&e.push(`Grok`),n.hasMistralKey&&e.push(`Mistral`),n.hasCohereKey&&e.push(`Cohere`),e.length===0?null:(0,k.jsxs)(`div`,{className:z.keySummary,children:[(0,k.jsx)(`span`,{className:z.keySummaryIcon,children:`🔑`}),(0,k.jsxs)(`span`,{children:[`Chiavi configurate: `,(0,k.jsx)(`strong`,{children:e.join(`, `)})]})]})})(),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t(`settings.provider`)}),(0,k.jsxs)(`select`,{value:C,onChange:e=>w(e.target.value),className:z.fieldInput,children:[(0,k.jsx)(`option`,{value:`nha`,children:`NHA Free (Liara) — no API key needed`}),(0,k.jsx)(`option`,{value:`anthropic`,children:`Anthropic (Claude)`}),(0,k.jsx)(`option`,{value:`openai`,children:`OpenAI (GPT-4)`}),(0,k.jsx)(`option`,{value:`gemini`,children:`Google (Gemini)`}),(0,k.jsx)(`option`,{value:`deepseek`,children:`DeepSeek`}),(0,k.jsx)(`option`,{value:`grok`,children:`xAI (Grok)`}),(0,k.jsx)(`option`,{value:`mistral`,children:`Mistral`}),(0,k.jsx)(`option`,{value:`cohere`,children:`Cohere`})]})]}),C!==`nha`&&({anthropic:n.hasApiKey,openai:n.hasOpenaiKey,gemini:n.hasGeminiKey,deepseek:n.hasDeepseekKey,grok:n.hasGrokKey,mistral:n.hasMistralKey,cohere:n.hasCohereKey}[C]?(0,k.jsx)(`div`,{className:z.keySet,children:t(`settings.apiKeySet`)}):null),(0,k.jsx)(Ot,{id:`apiKey`,label:t(`settings.apiKey`),placeholder:t(C===`nha`?`settings.apiKeyFreeNote`:`settings.apiKeyPh`),type:`password`,value:ee,onChange:T}),(0,k.jsx)(Ot,{id:`groqKey`,label:`Groq Key (voice / Whisper)`,placeholder:n.hasGroqKey?`✓ configured — leave empty to keep`:`gsk_... (free at console.groq.com/keys) — enables Telegram voice transcription`,type:`password`,value:ne,onChange:re}),(0,k.jsx)(`div`,{style:{marginTop:8,marginBottom:4},children:(0,k.jsxs)(`button`,{type:`button`,onClick:()=>me(!pe),style:{background:`transparent`,border:`none`,color:`var(--accent, #6366f1)`,cursor:`pointer`,fontSize:12,padding:0,fontWeight:600},children:[pe?`▾`:`▸`,` Optional provider keys (OpenAI, Gemini, DeepSeek, Grok, Mistral, Cohere)`]})}),pe&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(Ot,{id:`openaiKey`,label:`OpenAI Key`,placeholder:n.hasOpenaiKey?`✓ configured — leave empty to keep`:`sk-... (platform.openai.com)`,type:`password`,value:ie,onChange:O}),(0,k.jsx)(Ot,{id:`geminiKey`,label:`Gemini Key (Google)`,placeholder:n.hasGeminiKey?`✓ configured — leave empty to keep`:`AIza... (aistudio.google.com)`,type:`password`,value:ae,onChange:A}),(0,k.jsx)(Ot,{id:`deepseekKey`,label:`DeepSeek Key`,placeholder:n.hasDeepseekKey?`✓ configured — leave empty to keep`:`sk-... (platform.deepseek.com)`,type:`password`,value:oe,onChange:se}),(0,k.jsx)(Ot,{id:`grokKey`,label:`Grok Key (X.AI)`,placeholder:n.hasGrokKey?`✓ configured — leave empty to keep`:`xai-... (console.x.ai)`,type:`password`,value:ce,onChange:le}),(0,k.jsx)(Ot,{id:`mistralKey`,label:`Mistral Key`,placeholder:n.hasMistralKey?`✓ configured — leave empty to keep`:`... (console.mistral.ai)`,type:`password`,value:ue,onChange:de}),(0,k.jsx)(Ot,{id:`cohereKey`,label:`Cohere Key`,placeholder:n.hasCohereKey?`✓ configured — leave empty to keep`:`... (dashboard.cohere.com)`,type:`password`,value:M,onChange:fe})]}),(0,k.jsx)(Ot,{id:`model`,label:t(`settings.model`),placeholder:t(`settings.modelPh`),value:he,onChange:ge}),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t(`settings.thinking`)}),(0,k.jsxs)(`select`,{value:we,onChange:e=>Te(e.target.value),className:z.fieldInput,children:[(0,k.jsx)(`option`,{value:`off`,children:t(`settings.thinkingOff`)}),(0,k.jsx)(`option`,{value:`on`,children:t(`settings.thinkingOn`)})]})]}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:Et,children:[Lt(`provider`),` `,t(`settings.saveProvider`)]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.language`)}),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:t(`settings.languageLabel`)}),(0,k.jsx)(`select`,{value:_e,onChange:t=>{let r=t.target.value;ve(r),wt(`lang`,r),e({...n,lang:r})},className:z.fieldInput,children:[[`it`,`Italiano`],[`en`,`English`],[`es`,`Español`],[`fr`,`Français`],[`de`,`Deutsch`],[`pt`,`Português`],[`nl`,`Nederlands`],[`pl`,`Polski`],[`ru`,`Русский`],[`zh`,`中文`],[`ja`,`日本語`],[`ko`,`한국어`],[`ar`,`العربية`],[`hi`,`हिन्दी`],[`tr`,`Türkçe`],[`sv`,`Svenska`],[`da`,`Dansk`],[`fi`,`Suomi`],[`cs`,`Čeština`]].map(([e,t])=>(0,k.jsx)(`option`,{value:e,children:t},e))})]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.telegram`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.telegramSub`)}),n.hasTelegram&&(0,k.jsxs)(`div`,{className:z.connected,children:[`Telegram: `,t(`common.connected`)]}),n.hasDiscord&&(0,k.jsxs)(`div`,{className:z.connected,children:[`Discord: `,t(`common.connected`)]}),(0,k.jsx)(Ot,{id:`tgToken`,label:t(`settings.telegramToken`),placeholder:n.hasTelegram?t(`settings.telegramSet`):t(`settings.telegramPh`),type:`password`,value:Ee,onChange:P}),(0,k.jsx)(Ot,{id:`discordToken`,label:t(`settings.discordToken`),placeholder:n.hasDiscord?t(`settings.discordSet`):t(`settings.discordPh`),type:`password`,value:De,onChange:Oe}),(0,k.jsx)(Ot,{id:`botName`,label:`Bot Persona Name`,placeholder:`e.g. Agata — what name the bot uses when replying. Empty = show internal agent name (HERALD/ATHENA/...)`,value:ke,onChange:F}),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsx)(`label`,{className:z.fieldLabel,children:`Persona display mode`}),(0,k.jsxs)(`select`,{value:I,onChange:e=>Ae(e.target.value),className:z.fieldInput,children:[(0,k.jsx)(`option`,{value:`agent`,children:`agent — show internal name [HERALD] (legacy/debug)`}),(0,k.jsx)(`option`,{value:`persona`,children:`persona — show [BotName] only (recommended)`}),(0,k.jsx)(`option`,{value:`persona-only`,children:`persona-only — no prefix at all (most natural)`}),(0,k.jsx)(`option`,{value:`persona+role`,children:`persona+role — [BotName · agent] (power users)`})]})]}),(0,k.jsx)(Ot,{id:`allowedChatIds`,label:`Allowed Chat IDs (Telegram)`,placeholder:`comma-separated numeric chat IDs (empty = anyone can chat with the bot)`,value:je,onChange:Me}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Ne,onChange:e=>Pe(e.target.checked)}),` `,`Auto-route messages to specialist agents (recommended)`]})}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{Ee&&wt(`telegram-bot-token`,Ee),De&&wt(`discord-bot-token`,De),wt(`bot-name`,ke),wt(`persona-mode`,I),wt(`responder.telegram.allowedChatIds`,je.split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>Number(e)||e)),wt(`responder-auto-route`,Ne)},children:[Lt(`telegram-bot-token`),` `,t(`settings.saveBots`)]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.dailyOps`)}),(0,k.jsx)(Ot,{id:`planTime`,label:t(`settings.planTime`),placeholder:`07:00`,value:ye,onChange:be}),(0,k.jsx)(Ot,{id:`summaryTime`,label:t(`settings.summaryTime`),placeholder:`18:00`,value:xe,onChange:Se}),(0,k.jsx)(Ot,{id:`meetingAlert`,label:t(`settings.meetingAlert`),placeholder:`30`,value:N,onChange:Ce}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:At,children:[Lt(`planTime`),` `,t(`settings.saveSchedule`)]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Deliberation (Geth Consensus)`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Multi-round inter-agent reasoning for higher-quality answers`}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Fe,onChange:e=>Ie(e.target.checked)}),` `,`Enable deliberation`]})}),(0,k.jsx)(Ot,{id:`delibRounds`,label:`Rounds (1–5)`,placeholder:`3`,value:Le,onChange:Re}),(0,k.jsx)(Ot,{id:`delibConvergence`,label:`Convergence threshold (0–1, lower = stricter)`,placeholder:`0.30`,value:ze,onChange:L}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Be,onChange:e=>Ve(e.target.checked)}),` `,`Tribunal (final HERALD mediation)`]})}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`deliberation`,Fe),wt(`rounds`,Number(Le)),wt(`convergence`,Number(ze)),wt(`tribunal`,Be)},children:[Lt(`deliberation`),` Save deliberation`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Proactive Intelligence`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`The bot acts on its own initiative (follow-ups, meeting prep, pattern detection)`}),[[`proactive`,`Master switch — enable proactive`,He,Ue],[`proactive-email`,`Email follow-up reminders`,We,Ge],[`proactive-meeting`,`Meeting preparation digests`,Ke,qe],[`proactive-patterns`,`Behavioural pattern detection`,Je,Ye],[`proactive-deadlines`,`Deadline tracking`,Xe,Ze]].map(([e,t,n,r])=>(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:n,onChange:e=>r(e.target.checked)}),` `,t]})},String(e))),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`proactive`,He),wt(`proactive-email`,We),wt(`proactive-meeting`,Ke),wt(`proactive-patterns`,Je),wt(`proactive-deadlines`,Xe)},children:[Lt(`proactive`),` Save proactive`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Voice`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Transcription (Whisper via Groq) and text-to-speech`}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:Qe,onChange:e=>$e(e.target.checked)}),` `,`Prefer Whisper (Groq) over local STT`]})}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:et,onChange:e=>tt(e.target.checked)}),` `,`Speech synthesis (read replies aloud)`]})}),(0,k.jsx)(Ot,{id:`voiceLanguage`,label:`Voice language (BCP 47, e.g. it-IT, en-US)`,placeholder:`empty = use UI language`,value:nt,onChange:rt}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`voice-whisper`,Qe),wt(`voice-speech`,et),nt&&wt(`voice-language`,nt)},children:[Lt(`voice-whisper`),` Save voice`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Features`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Core behaviour toggles`}),[[`verbose`,`Verbose logging (more diagnostics, more tokens)`,it,at],[`immersive`,`Immersive office scene animation in Studio`,ot,st],[`knowledge`,`Knowledge base (memories + skills retrieval)`,ct,lt]].map(([e,t,n,r])=>(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:n,onChange:e=>r(e.target.checked)}),` `,t]})},String(e))),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`verbose`,it),wt(`immersive`,ot),wt(`knowledge`,ct)},children:[Lt(`verbose`),` Save features`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Integration tokens`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`GitHub, Notion, Slack — used by the corresponding tools`}),(0,k.jsx)(Ot,{id:`githubToken`,label:`GitHub Token (PAT)`,placeholder:n.hasGithubToken?`✓ configured — leave empty to keep`:`ghp_... — needs repo + read:org scopes`,type:`password`,value:ut,onChange:dt}),(0,k.jsx)(Ot,{id:`githubRepo`,label:`Default GitHub repo (owner/name)`,placeholder:`acme/website`,value:ft,onChange:pt}),(0,k.jsx)(Ot,{id:`notionToken`,label:`Notion Token (Internal Integration)`,placeholder:n.hasNotionToken?`✓ configured — leave empty to keep`:`secret_...`,type:`password`,value:mt,onChange:ht}),(0,k.jsx)(Ot,{id:`slackToken`,label:`Slack Bot Token (xoxb-)`,placeholder:n.hasSlackToken?`✓ configured — leave empty to keep`:`xoxb-...`,type:`password`,value:gt,onChange:_t}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{ut&&wt(`github-token`,ut),ft&&wt(`github-repo`,ft),mt&&wt(`notion-token`,mt),gt&&wt(`slack-token`,gt)},children:[Lt(`github-token`),` Save tokens`]})]}),(0,k.jsx)(kt,{}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:`Advanced`}),(0,k.jsx)(`div`,{className:z.cardSub,children:`Plugins, Microsoft tenant ID, runtime extras`}),(0,k.jsx)(`div`,{className:z.field,children:(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[(0,k.jsx)(`input`,{type:`checkbox`,checked:R,onChange:e=>bt(e.target.checked)}),` `,`Auto-run plugins at startup`]})}),(0,k.jsx)(Ot,{id:`pluginDir`,label:`Plugin directory (absolute path)`,placeholder:`empty = ~/.nha/plugins`,value:xt,onChange:St}),(0,k.jsx)(Ot,{id:`microsoftTenant`,label:`Microsoft Tenant ID`,placeholder:`common (default) | organizations | consumers | <GUID>`,value:vt,onChange:yt}),(0,k.jsxs)(`button`,{className:z.saveBtn,onClick:()=>{wt(`plugin-autorun`,R),xt&&wt(`plugin-dir`,xt),wt(`microsoft-tenant`,vt)},children:[Lt(`plugin-autorun`),` Save advanced`]})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.googleAccount`)}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.googleSub`)}),n.hasGoogle&&(0,k.jsxs)(`div`,{className:z.connected,children:[`✅ `,t(`common.connected`),n.googleEmail?` · ${n.googleEmail}`:``]}),(0,k.jsxs)(`div`,{className:z.btnRow,children:[(0,k.jsx)(`button`,{className:z.saveBtn,onClick:jt,children:n.hasGoogle?t(`settings.reconnectGoogle`):t(`settings.connectGoogle`)}),n.hasGoogle&&(0,k.jsx)(`button`,{className:z.dangerBtn,onClick:Mt,children:t(`settings.disconnectGoogle`)})]}),g&&(0,k.jsx)(`div`,{className:z.statusMsg,children:g})]}),(0,k.jsxs)(`div`,{className:z.card,children:[(0,k.jsxs)(`div`,{className:z.cardTitleRow,children:[(0,k.jsx)(`div`,{className:z.cardTitle,children:t(`settings.imapAccounts`)}),(0,k.jsx)(`button`,{className:z.saveBtn,onClick:()=>{p({...Dt}),h(``)},children:t(`settings.addAccount`)})]}),(0,k.jsx)(`div`,{className:z.cardSub,children:t(`settings.imapSub`)}),u.length===0&&!f&&(0,k.jsx)(`div`,{className:z.emptyImap,children:t(`settings.noImapAccounts`)}),u.map(e=>(0,k.jsxs)(`div`,{className:z.imapRow,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:z.imapName,children:e.display_name}),(0,k.jsxs)(`div`,{className:z.imapMeta,children:[e.email_address,` · `,e.imap_host]}),(0,k.jsxs)(`div`,{className:z.imapStatus,"data-status":e.sync_status,children:[e.sync_status,e.last_sync_at?` · ${t(`email.lastSync`)}: ${e.last_sync_at.slice(0,16)}`:``]})]}),(0,k.jsxs)(`div`,{className:z.imapBtns,children:[(0,k.jsx)(`button`,{className:z.imapSyncBtn,onClick:()=>Pt(e.id),children:t(`settings.sync`)}),(0,k.jsx)(`button`,{className:z.imapEditBtn,onClick:()=>{p({...Dt,id:e.id,display_name:e.display_name,email_address:e.email_address,from_name:e.from_name??``,imap_host:e.imap_host,imap_port:String(e.imap_port??993),smtp_host:e.smtp_host??``,smtp_port:String(e.smtp_port??587),username:e.username??``,password:``}),h(``)},children:t(`common.edit`)}),(0,k.jsx)(`button`,{className:z.imapDelBtn,onClick:()=>Nt(e.id,e.display_name),children:t(`common.delete`)})]})]},e.id)),f&&(0,k.jsxs)(`div`,{className:z.imapForm,children:[(0,k.jsx)(`div`,{className:z.imapFormTitle,children:f.id?t(`settings.editImapAccount`):t(`settings.addImapAccount`)}),[[`display_name`,t(`settings.displayName`),t(`settings.displayNamePh`)],[`email_address`,t(`common.email`),`user@example.com`],[`from_name`,t(`settings.fromName`),t(`settings.fromNamePh`)],[`imap_host`,t(`settings.imapServer`),`e.g. imap.gmail.com`],[`imap_port`,t(`settings.imapPort`),`993`],[`smtp_host`,t(`settings.smtpServer`),`e.g. smtp.gmail.com`],[`smtp_port`,t(`settings.smtpPort`),`587`],[`username`,t(`settings.username`),`user@example.com`]].map(([e,t,n])=>(0,k.jsx)(Ot,{id:`imap_${e}`,label:t,placeholder:n,value:f[e],onChange:t=>p(n=>n&&{...n,[e]:t})},e)),(0,k.jsxs)(`div`,{className:z.field,children:[(0,k.jsxs)(`label`,{className:z.fieldLabel,children:[t(`settings.password`),` `,f.id&&(0,k.jsx)(`span`,{className:z.pwdNote,children:t(`settings.passwordKeep`)})]}),(0,k.jsxs)(`div`,{className:z.pwdRow,children:[(0,k.jsx)(`input`,{type:y?`text`:`password`,placeholder:t(`settings.passwordPh`),value:f.password,onChange:e=>p(t=>t&&{...t,password:e.target.value}),className:z.fieldInput,style:{flex:1}}),(0,k.jsx)(`button`,{className:z.togglePwd,onClick:()=>b(e=>!e),children:t(y?`settings.hide`:`settings.show`)})]})]}),(0,k.jsxs)(`div`,{className:z.btnRow,children:[(0,k.jsx)(`button`,{className:z.saveBtn,onClick:B,children:t(`common.save`)}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:()=>It(!1),title:`Verifica IMAP+SMTP senza inviare nulla`,children:`Test connessione`}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:()=>It(!0),title:`Invia un'email di prova alla tua casella per verificare il round-trip`,children:`Invia email di prova`}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:Ft,title:`Diagnostica raw: mostra cosa risponde realmente il server sulla porta indicata`,children:`Diagnostica porta`}),(0,k.jsx)(`button`,{className:z.cancelBtn,onClick:()=>p(null),children:t(`common.cancel`)})]}),m&&(0,k.jsx)(`div`,{className:z.statusMsg,style:{whiteSpace:`pre-line`},children:m})]})]})]})}var jt={root:`_root_o07ov_1`,loading:`_loading_o07ov_2`,err:`_err_o07ov_3`,header:`_header_o07ov_4`,title:`_title_o07ov_5`,addBtn:`_addBtn_o07ov_6`,empty:`_empty_o07ov_7`,card:`_card_o07ov_8`,cardToday:`_cardToday_o07ov_9`,icon:`_icon_o07ov_10`,info:`_info_o07ov_11`,name:`_name_o07ov_12`,date:`_date_o07ov_13`,labelToday:`_labelToday_o07ov_14`,labelTomorrow:`_labelTomorrow_o07ov_15`,labelFuture:`_labelFuture_o07ov_16`,editBtn:`_editBtn_o07ov_17`,delBtn:`_delBtn_o07ov_18`,overlay:`_overlay_o07ov_20`,modal:`_modal_o07ov_21`,modalTitle:`_modalTitle_o07ov_22`,label:`_label_o07ov_14`,input:`_input_o07ov_24`,hint:`_hint_o07ov_25`,formErr:`_formErr_o07ov_26`,modalBtns:`_modalBtns_o07ov_27`,cancelBtn:`_cancelBtn_o07ov_28`,saveBtn:`_saveBtn_o07ov_29`};function Mt(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(null),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(!1),p=(0,_.useCallback)(()=>{i(!0),E(`/api/birthdays`).then(e=>{e?.error?o(e.error):n(e?.birthdays??[]),i(!1)})},[]);(0,_.useEffect)(()=>{p()},[p]);let m=()=>{c({name:``,date:``}),u(``)},h=e=>{c({name:e.name,date:e.date,contactId:e.contactId}),u(``)},g=async()=>{if(!s)return;if(!s.name.trim()){u(`Name is required`);return}if(!s.date.trim()){u(`Date is required`);return}f(!0);let e=s.date;/^\d{2}-\d{2}$/.test(e)&&(e=`${new Date().getFullYear()}-${e}`),await D(`/api/birthdays`,{name:s.name,date:e,contactId:s.contactId??null,edit:!!s.contactId}),f(!1),c(null),p()},v=e=>{confirm(`Remove birthday for ${e.name}?`)&&D(`/api/birthdays/delete`,{contactId:e.contactId}).then(p)};return r?(0,k.jsxs)(`div`,{className:jt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),e(`common.loading`)]}):a?(0,k.jsx)(`div`,{className:jt.err,children:a}):(0,k.jsxs)(`div`,{className:jt.root,children:[(0,k.jsxs)(`div`,{className:jt.header,children:[(0,k.jsx)(`div`,{className:jt.title,children:`Upcoming Birthdays`}),(0,k.jsx)(`button`,{className:jt.addBtn,onClick:m,children:`+ Add Birthday`})]}),t.length===0&&(0,k.jsxs)(`div`,{className:jt.empty,children:[e(`birthdays.noBirthdays`),(0,k.jsx)(`br`,{}),(0,k.jsx)(`small`,{children:`Add one above, or add birthdays to your Google Contacts.`})]}),t.map((t,n)=>{let r=t.daysUntil===0,i=t.daysUntil===1;return(0,k.jsxs)(`div`,{className:`${jt.card} ${r?jt.cardToday:``}`,children:[(0,k.jsx)(`span`,{className:jt.icon,children:`🎂`}),(0,k.jsxs)(`div`,{className:jt.info,children:[(0,k.jsx)(`div`,{className:jt.name,children:t.name}),(0,k.jsx)(`div`,{className:jt.date,children:t.date})]}),(0,k.jsx)(`div`,{className:r?jt.labelToday:i?jt.labelTomorrow:jt.labelFuture,children:r?`TODAY!`:i?`Tomorrow`:`in ${t.daysUntil} days`}),t.contactId&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`button`,{className:jt.editBtn,onClick:()=>h(t),children:e(`common.edit`)}),(0,k.jsx)(`button`,{className:jt.delBtn,onClick:()=>v(t),children:e(`common.delete`)})]})]},n)}),s&&(0,k.jsx)(`div`,{className:jt.overlay,onClick:e=>{e.target===e.currentTarget&&c(null)},children:(0,k.jsxs)(`div`,{className:jt.modal,children:[(0,k.jsx)(`div`,{className:jt.modalTitle,children:s.contactId?`Edit Birthday`:`Add Birthday`}),(0,k.jsx)(`label`,{className:jt.label,children:`Name *`}),(0,k.jsx)(`input`,{className:jt.input,value:s.name,onChange:e=>c(t=>t&&{...t,name:e.target.value}),placeholder:`Contact name`}),(0,k.jsx)(`label`,{className:jt.label,children:`Birthday (MM-DD or YYYY-MM-DD)`}),(0,k.jsx)(`input`,{className:jt.input,value:s.date,onChange:e=>c(t=>t&&{...t,date:e.target.value}),placeholder:`e.g. 03-15 or 1990-03-15`}),(0,k.jsx)(`div`,{className:jt.hint,children:`Birthday will be saved as a Google Calendar event.`}),l&&(0,k.jsx)(`div`,{className:jt.formErr,children:l}),(0,k.jsxs)(`div`,{className:jt.modalBtns,children:[(0,k.jsx)(`button`,{className:jt.cancelBtn,onClick:()=>c(null),children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:jt.saveBtn,onClick:g,disabled:d,children:d?`Saving…`:s.contactId?`Save`:`Add`})]})]})})]})}var B={root:`_root_1z04o_1`,header:`_header_1z04o_3`,title:`_title_1z04o_4`,subtitle:`_subtitle_1z04o_5`,code:`_code_1z04o_6`,addBtn:`_addBtn_1z04o_8`,tabs:`_tabs_1z04o_10`,tab:`_tab_1z04o_10`,tabActive:`_tabActive_1z04o_12`,loading:`_loading_1z04o_14`,err:`_err_1z04o_15`,empty:`_empty_1z04o_17`,emptyIcon:`_emptyIcon_1z04o_18`,emptyTitle:`_emptyTitle_1z04o_19`,emptySub:`_emptySub_1z04o_20`,card:`_card_1z04o_23`,cardDisabled:`_cardDisabled_1z04o_24`,cardTop:`_cardTop_1z04o_25`,cardLeft:`_cardLeft_1z04o_26`,jobName:`_jobName_1z04o_27`,schedule:`_schedule_1z04o_28`,agentBadge:`_agentBadge_1z04o_29`,statusBadge:`_statusBadge_1z04o_30`,statusActive:`_statusActive_1z04o_31`,statusPaused:`_statusPaused_1z04o_32`,jobPrompt:`_jobPrompt_1z04o_33`,jobMeta:`_jobMeta_1z04o_34`,cardActions:`_cardActions_1z04o_35`,runBtn:`_runBtn_1z04o_36`,editBtn:`_editBtn_1z04o_37`,pauseBtn:`_pauseBtn_1z04o_38`,resumeBtn:`_resumeBtn_1z04o_39`,delBtn:`_delBtn_1z04o_40`,templates:`_templates_1z04o_43`,templatesNote:`_templatesNote_1z04o_44`,templateCard:`_templateCard_1z04o_45`,templateLabel:`_templateLabel_1z04o_46`,templatePrompt:`_templatePrompt_1z04o_47`,templateBtns:`_templateBtns_1z04o_48`,scheduleTplBtn:`_scheduleTplBtn_1z04o_49`,runTplBtn:`_runTplBtn_1z04o_50`,formOverlay:`_formOverlay_1z04o_54`,formModal:`_formModal_1z04o_55`,formTitle:`_formTitle_1z04o_56`,label:`_label_1z04o_57`,input:`_input_1z04o_58`,textarea:`_textarea_1z04o_59`,presets:`_presets_1z04o_61`,preset:`_preset_1z04o_61`,presetActive:`_presetActive_1z04o_63`,cronHints:`_cronHints_1z04o_65`,cronHint:`_cronHint_1z04o_65`,formErr:`_formErr_1z04o_70`,formOk:`_formOk_1z04o_71`,formBtns:`_formBtns_1z04o_72`,cancelBtn:`_cancelBtn_1z04o_73`,saveBtn:`_saveBtn_1z04o_74`},Nt=[{label:`Every 15 min`,value:`every 15 minutes`},{label:`Every 30 min`,value:`every 30 minutes`},{label:`Every hour`,value:`every hour`},{label:`Every 6h`,value:`every 6 hours`},{label:`Daily 8am`,value:`every day at 08:00`},{label:`Daily 9am`,value:`every day at 09:00`},{label:`Daily noon`,value:`every day at 12:00`},{label:`Daily 6pm`,value:`every day at 18:00`},{label:`Mon–Fri 9am`,value:`weekdays at 09:00`},{label:`Every Monday`,value:`every monday at 09:00`}],Pt=[{label:`🌅 Morning Briefing`,prompt:`Summarize my unread emails from the last 12 hours, check today's calendar events, list my top 3 priority tasks, and give me a focused action plan for the day.`},{label:`🌆 Evening Review`,prompt:`Review what I accomplished today: check completed tasks, summarize any important emails received, flag unresolved issues, and prepare a priority list for tomorrow.`},{label:`📰 News Digest`,prompt:`Search for the top AI, tech, and finance news from the last 24 hours. Summarize the 5 most important stories with key takeaways and market implications.`},{label:`📈 Market Update`,prompt:`Provide a comprehensive market update: macro environment, major indices performance, top movers, notable events, and key levels to watch. Use herald and mercury agents.`},{label:`🐙 GitHub Monitor`,prompt:`Check my GitHub notifications, summarize open issues and pull requests that need attention, and draft brief responses for the most urgent ones.`},{label:`📊 Weekly Report`,prompt:`Generate a weekly productivity report: tasks completed vs pending, email response rate, upcoming calendar events, and 3 strategic priorities for next week.`},{label:`🔒 Security Scan`,prompt:`Run a security awareness check: scan recent code commits for potential vulnerabilities, check dependency alerts, and summarize any security-related GitHub notifications.`},{label:`🎯 Goal Tracker`,prompt:`Review my tasks and notes for goal progress. Identify what's on track, what's at risk, and suggest one concrete action to unblock the most important goal.`}],Ft=[{label:`0 9 * * 1-5`,desc:`Mon–Fri at 9:00 AM`},{label:`0 */6 * * *`,desc:`Every 6 hours`},{label:`*/30 * * * *`,desc:`Every 30 minutes`},{label:`0 8 * * *`,desc:`Daily at 8:00 AM`},{label:`0 20 * * 5`,desc:`Every Friday at 8 PM`}];function It(){let e=j(),t=te(e=>e.setView),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)(!0),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)({name:``,schedule:``,prompt:``,agent:``}),[f,p]=(0,_.useState)(!1),[m,h]=(0,_.useState)(``),[g,v]=(0,_.useState)(``),[y,b]=(0,_.useState)(null),[x,S]=(0,_.useState)(`jobs`),C=()=>{a(!0),E(`/api/cron`).then(e=>{e?.error?s(e.error):r(e?.jobs??[]),a(!1)}).catch(()=>{r([]),a(!1)})};(0,_.useEffect)(()=>{C()},[]);let w=()=>{d({name:``,schedule:``,prompt:``,agent:``}),h(``),v(``),b(null),l(!0)},ee=e=>{d({name:e.name??``,schedule:e.schedule,prompt:e.prompt??e.command??``,agent:e.agent??``}),h(``),v(``),b(e.id),l(!0)},T=async()=>{if(!u.schedule.trim()){h(`Schedule is required`);return}if(!u.prompt.trim()){h(`Task prompt is required`);return}p(!0),h(``);try{y?await D(`/api/cron/update`,{id:y,schedule:u.schedule,prompt:u.prompt,agent:u.agent||void 0,name:u.name||void 0}):await D(`/api/cron`,{schedule:u.schedule,prompt:u.prompt,agent:u.agent||void 0,name:u.name||void 0}),v(y?`Updated!`:`Job scheduled!`),setTimeout(()=>{v(``),l(!1)},1500),C()}catch(e){h(e.message??`Failed`)}p(!1)},ne=(e,t)=>D(`/api/cron/toggle`,{id:e,enabled:!t}).then(C),re=e=>{confirm(`Delete this scheduled task?`)&&D(`/api/cron/delete`,{id:e}).then(C)},ie=e=>{try{sessionStorage.setItem(`nha_chat_prefill`,e)}catch{}t(`chat`)},O=e=>{d(t=>({...t,prompt:e.prompt,name:e.label.replace(/^[^\s]+\s/,``)})),S(`jobs`),l(!0)};return(0,k.jsxs)(`div`,{className:B.root,children:[(0,k.jsxs)(`div`,{className:B.header,children:[(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:B.title,children:`⏰ Scheduled Tasks`}),(0,k.jsxs)(`div`,{className:B.subtitle,children:[`Automate agents on a recurring schedule. Daemon must be running: `,(0,k.jsx)(`code`,{className:B.code,children:`nha ops start`})]})]}),(0,k.jsx)(`button`,{className:B.addBtn,onClick:w,children:`+ New Task`})]}),(0,k.jsxs)(`div`,{className:B.tabs,children:[(0,k.jsxs)(`button`,{className:`${B.tab} ${x===`jobs`?B.tabActive:``}`,onClick:()=>S(`jobs`),children:[`Jobs (`,n.length,`)`]}),(0,k.jsx)(`button`,{className:`${B.tab} ${x===`templates`?B.tabActive:``}`,onClick:()=>S(`templates`),children:`Templates`})]}),x===`templates`&&(0,k.jsxs)(`div`,{className:B.templates,children:[(0,k.jsx)(`div`,{className:B.templatesNote,children:`Click a template to pre-fill the job form or run it immediately in Chat.`}),Pt.map(t=>(0,k.jsxs)(`div`,{className:B.templateCard,children:[(0,k.jsx)(`div`,{className:B.templateLabel,children:t.label}),(0,k.jsx)(`div`,{className:B.templatePrompt,children:t.prompt}),(0,k.jsxs)(`div`,{className:B.templateBtns,children:[(0,k.jsx)(`button`,{className:B.scheduleTplBtn,onClick:()=>O(t),children:`Schedule`}),(0,k.jsxs)(`button`,{className:B.runTplBtn,onClick:()=>ie(t.prompt),children:[e(`cron.run`),` in Chat →`]})]})]},t.label))]}),x===`jobs`&&(0,k.jsxs)(k.Fragment,{children:[i&&(0,k.jsxs)(`div`,{className:B.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),`Loading jobs…`]}),o&&(0,k.jsx)(`div`,{className:B.err,children:o}),!i&&n.length===0&&!c&&(0,k.jsxs)(`div`,{className:B.empty,children:[(0,k.jsx)(`div`,{className:B.emptyIcon,children:`⏰`}),(0,k.jsxs)(`div`,{className:B.emptyTitle,children:[e(`cron.noJobs`),` tasks`]}),(0,k.jsx)(`div`,{className:B.emptySub,children:`Create a job to automate agents on a recurring schedule, or browse the Templates tab for ready-made automation recipes.`}),(0,k.jsx)(`button`,{className:B.addBtn,onClick:w,children:`+ New Task`})]}),n.map(e=>(0,k.jsxs)(`div`,{className:`${B.card} ${e.enabled?``:B.cardDisabled}`,children:[(0,k.jsxs)(`div`,{className:B.cardTop,children:[(0,k.jsxs)(`div`,{className:B.cardLeft,children:[e.name&&(0,k.jsx)(`div`,{className:B.jobName,children:e.name}),(0,k.jsx)(`code`,{className:B.schedule,children:e.schedule}),e.agent&&(0,k.jsx)(`span`,{className:B.agentBadge,children:e.agent}),(0,k.jsx)(`span`,{className:`${B.statusBadge} ${e.enabled?B.statusActive:B.statusPaused}`,children:e.enabled?`active`:`paused`})]}),(0,k.jsxs)(`div`,{className:B.cardActions,children:[(0,k.jsx)(`button`,{className:B.runBtn,onClick:()=>ie(e.prompt??e.command??``),title:`Run now in Chat`,children:`▶`}),(0,k.jsx)(`button`,{className:B.editBtn,onClick:()=>ee(e),children:`Edit`}),(0,k.jsx)(`button`,{className:e.enabled?B.pauseBtn:B.resumeBtn,onClick:()=>ne(e.id,e.enabled),children:e.enabled?`Pause`:`Resume`}),(0,k.jsx)(`button`,{className:B.delBtn,onClick:()=>re(e.id),children:`✕`})]})]}),(0,k.jsx)(`div`,{className:B.jobPrompt,children:e.prompt??e.command}),(0,k.jsxs)(`div`,{className:B.jobMeta,children:[e.runCount!==void 0&&(0,k.jsxs)(`span`,{children:[`ran `,e.runCount,`×`]}),e.lastRun&&(0,k.jsxs)(`span`,{children:[` · last `,new Date(e.lastRun).toLocaleString()]}),e.nextRun&&(0,k.jsxs)(`span`,{children:[` · next `,new Date(e.nextRun).toLocaleString()]})]})]},e.id))]}),c&&(0,k.jsx)(`div`,{className:B.formOverlay,onClick:e=>{e.target===e.currentTarget&&l(!1)},children:(0,k.jsxs)(`div`,{className:B.formModal,children:[(0,k.jsx)(`div`,{className:B.formTitle,children:y?`Edit Scheduled Task`:`New Scheduled Task`}),(0,k.jsx)(`label`,{className:B.label,children:`Name (optional)`}),(0,k.jsx)(`input`,{className:B.input,value:u.name,onChange:e=>d(t=>({...t,name:e.target.value})),placeholder:`e.g. Morning Briefing`}),(0,k.jsx)(`label`,{className:B.label,children:`Schedule *`}),(0,k.jsx)(`div`,{className:B.presets,children:Nt.map(e=>(0,k.jsx)(`button`,{className:`${B.preset} ${u.schedule===e.value?B.presetActive:``}`,onClick:()=>d(t=>({...t,schedule:e.value})),children:e.label},e.value))}),(0,k.jsx)(`input`,{className:B.input,value:u.schedule,onChange:e=>d(t=>({...t,schedule:e.target.value})),placeholder:`every day at 09:00 — or cron syntax: 0 9 * * 1-5`}),(0,k.jsx)(`div`,{className:B.cronHints,children:Ft.map(e=>(0,k.jsxs)(`span`,{className:B.cronHint,onClick:()=>d(t=>({...t,schedule:e.label})),children:[(0,k.jsx)(`code`,{children:e.label}),` `,e.desc]},e.label))}),(0,k.jsx)(`label`,{className:B.label,children:`Task / Prompt *`}),(0,k.jsx)(`textarea`,{className:B.textarea,value:u.prompt,onChange:e=>d(t=>({...t,prompt:e.target.value})),placeholder:`Describe what the agent should do (e.g. Summarize my unread emails and list my 3 top priority tasks)`,rows:4}),(0,k.jsx)(`label`,{className:B.label,children:`Agent (optional — leave blank for auto-routing)`}),(0,k.jsx)(`input`,{className:B.input,value:u.agent,onChange:e=>d(t=>({...t,agent:e.target.value})),placeholder:`e.g. herald, oracle, mercury, EmailAgent, general`}),m&&(0,k.jsx)(`div`,{className:B.formErr,children:m}),g&&(0,k.jsx)(`div`,{className:B.formOk,children:g}),(0,k.jsxs)(`div`,{className:B.formBtns,children:[(0,k.jsx)(`button`,{className:B.cancelBtn,onClick:()=>l(!1),children:`Cancel`}),(0,k.jsx)(`button`,{className:B.saveBtn,onClick:T,disabled:f,children:f?`Saving…`:y?`Update`:`Schedule`})]})]})})]})}var Lt={root:`_root_1npv7_1`,loading:`_loading_1npv7_2`,sidebar:`_sidebar_1npv7_4`,newBtn:`_newBtn_1npv7_5`,empty:`_empty_1npv7_6`,noteItem:`_noteItem_1npv7_8`,noteItemActive:`_noteItemActive_1npv7_10`,noteTitle:`_noteTitle_1npv7_11`,noteMeta:`_noteMeta_1npv7_12`,notePreview:`_notePreview_1npv7_13`,noteTags:`_noteTags_1npv7_14`,noteTag:`_noteTag_1npv7_14`,editor:`_editor_1npv7_17`,emptyEditor:`_emptyEditor_1npv7_18`,titleInput:`_titleInput_1npv7_19`,contentArea:`_contentArea_1npv7_21`,editorFooter:`_editorFooter_1npv7_22`,delNoteBtn:`_delNoteBtn_1npv7_23`,cancelBtn:`_cancelBtn_1npv7_24`,saveBtn:`_saveBtn_1npv7_25`};function Rt(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(!1),[p,m]=(0,_.useState)(!1),h=()=>E(`/api/notes`).then(e=>{n(e?.notes??[]),i(!1)});(0,_.useEffect)(()=>{h()},[]);let g=e=>{o(e),c(e.title),u(e.content),m(!1)},v=()=>{o(null),c(``),u(``),m(!0)},y=async()=>{f(!0),p?await D(`/api/notes`,{title:s||`Untitled`,content:l}):a&&await D(`/api/notes/${a.id}`,{title:s,content:l}),f(!1),m(!1),h()},b=(e,t)=>{confirm(`Delete note "${t}"?`)&&D(`/api/notes/${e}/delete`,{}).then(h)};return r?(0,k.jsxs)(`div`,{className:Lt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),e(`common.loading`)]}):(0,k.jsxs)(`div`,{className:Lt.root,children:[(0,k.jsxs)(`div`,{className:Lt.sidebar,children:[(0,k.jsx)(`button`,{className:Lt.newBtn,onClick:v,children:`+ New Note`}),t.length===0&&(0,k.jsx)(`div`,{className:Lt.empty,children:e(`notes.noNotes`)}),t.map(e=>(0,k.jsxs)(`div`,{className:`${Lt.noteItem} ${a?.id===e.id?Lt.noteItemActive:``}`,onClick:()=>g(e),children:[(0,k.jsx)(`div`,{className:Lt.noteTitle,children:e.title||`Untitled`}),(0,k.jsx)(`div`,{className:Lt.noteMeta,children:e.updatedAt?new Date(e.updatedAt).toLocaleDateString():``}),e.content&&(0,k.jsx)(`div`,{className:Lt.notePreview,children:e.content.slice(0,150)}),e.tags&&e.tags.length>0&&(0,k.jsx)(`div`,{className:Lt.noteTags,children:e.tags.map(e=>(0,k.jsx)(`span`,{className:Lt.noteTag,children:e},e))})]},e.id))]}),(0,k.jsx)(`div`,{className:Lt.editor,children:a||p?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`input`,{className:Lt.titleInput,value:s,onChange:e=>c(e.target.value),placeholder:`Note title…`}),(0,k.jsx)(`textarea`,{className:Lt.contentArea,value:l,onChange:e=>u(e.target.value),placeholder:`Start writing…`}),(0,k.jsxs)(`div`,{className:Lt.editorFooter,children:[a&&(0,k.jsx)(`button`,{className:Lt.delNoteBtn,onClick:()=>b(a.id,a.title),children:e(`common.delete`)}),(0,k.jsx)(`button`,{className:Lt.cancelBtn,onClick:()=>{o(null),m(!1)},children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:Lt.saveBtn,onClick:y,disabled:d,children:d?`Saving…`:`Save`})]})]}):(0,k.jsx)(`div`,{className:Lt.emptyEditor,children:`Select a note or create a new one`})})]})}var zt={root:`_root_18yos_1`,loading:`_loading_18yos_2`,error:`_error_18yos_3`,toolbar:`_toolbar_18yos_5`,search:`_search_18yos_6`,addBtn:`_addBtn_18yos_7`,count:`_count_18yos_10`,empty:`_empty_18yos_12`,grid:`_grid_18yos_14`,card:`_card_18yos_16`,actions:`_actions_18yos_29`,avatar:`_avatar_18yos_31`,avatarImg:`_avatarImg_18yos_38`,info:`_info_18yos_40`,name:`_name_18yos_41`,row:`_row_18yos_42`,email:`_email_18yos_43`,phone:`_phone_18yos_44`,company:`_company_18yos_45`,birthday:`_birthday_18yos_46`,iconBtn:`_iconBtn_18yos_52`,iconBtnRed:`_iconBtnRed_18yos_58`,overlay:`_overlay_18yos_61`,modal:`_modal_18yos_62`,modalTitle:`_modalTitle_18yos_63`,field:`_field_18yos_64`,label:`_label_18yos_65`,input:`_input_18yos_66`,formStatus:`_formStatus_18yos_67`,formError:`_formError_18yos_68`,modalBtns:`_modalBtns_18yos_69`,cancelBtn:`_cancelBtn_18yos_70`,saveBtn:`_saveBtn_18yos_71`},Bt={name:``,email:``,phone:``,company:``,address:``,notes:``};function Vt(){let e=j(),t=te(e=>e.setView),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)(!0),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),[u,d]=(0,_.useState)(null),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(!1),[g,v]=(0,_.useState)(``),y=(0,_.useRef)(null),b=(e=``)=>{E(e?`/api/contacts?q=${encodeURIComponent(e)}`:`/api/contacts`).then(e=>{r(e?.contacts??[]),a(!1),s(``)}).catch(()=>{s(`Could not load contacts. Run nha google revoke then nha google auth.`),a(!1)})};(0,_.useEffect)(()=>{b()},[]);let x=e=>{l(e),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>b(e),400)},S=()=>{d(null),p({...Bt}),v(``)},C=e=>{d(e),p({name:e.name,email:e.email??``,phone:e.phone??``,company:e.company??``,address:e.address??``,notes:e.notes??``}),v(``)},w=async()=>{if(f?.name){h(!0),v(`Saving…`);try{if(u?.resourceName){let e=await D(`/api/contacts/update`,{resourceName:u.resourceName,fields:f});if(e?.error){v(`Error: `+e.error);return}}else if(u)await D(`/api/contacts/update`,{resourceName:u.id,fields:f});else{let e=await D(`/api/contacts`,f);if(e?.error){v(`Error: `+e.error);return}}v(`Saved!`),setTimeout(()=>{p(null),d(null),b(c)},800)}catch(e){v(`Error: `+e.message)}finally{h(!1)}}},ee=(e,t)=>{e.stopPropagation(),confirm(`Delete "${t.name}"?`)&&D(`/api/contacts/delete`,{resourceName:t.resourceName||t.id}).then(e=>{let t=e;if(t?.error){alert(`Error: `+t.error);return}b(c)})},T=(e,n,r)=>{e.stopPropagation(),t(`chat`),setTimeout(()=>{let e=document.getElementById(`chatInput`);e&&(e.value=`Send an email to ${r} (${n}) about `,e.focus())},300)},ne=e=>(e||`?`).split(` `).map(e=>e[0]).slice(0,2).join(``).toUpperCase();return i?(0,k.jsxs)(`div`,{className:zt.loading,children:[(0,k.jsx)(`div`,{className:`spinner`}),`Loading contacts…`]}):o?(0,k.jsx)(`div`,{className:zt.error,children:o}):(0,k.jsxs)(`div`,{className:zt.root,children:[(0,k.jsxs)(`div`,{className:zt.toolbar,children:[(0,k.jsx)(`input`,{className:zt.search,value:c,onChange:e=>x(e.target.value),placeholder:`Search contacts…`}),n.length>0&&(0,k.jsxs)(`span`,{className:zt.count,children:[n.length,` contact`,n.length===1?``:`s`]}),(0,k.jsx)(`button`,{className:zt.addBtn,onClick:S,children:`+ Add`})]}),n.length===0&&(0,k.jsxs)(`div`,{className:zt.empty,children:[e(`contacts.noContacts`),(0,k.jsx)(`br`,{}),`Add a Google account or add contacts manually.`]}),(0,k.jsx)(`div`,{className:zt.grid,children:n.map(e=>(0,k.jsxs)(`div`,{className:zt.card,onClick:()=>C(e),children:[(0,k.jsx)(`div`,{className:zt.avatar,children:e.photo?(0,k.jsx)(`img`,{src:e.photo,alt:e.name,className:zt.avatarImg}):ne(e.name)}),(0,k.jsxs)(`div`,{className:zt.info,children:[(0,k.jsx)(`div`,{className:zt.name,children:e.name||`(no name)`}),(0,k.jsxs)(`div`,{className:zt.row,children:[e.email&&(0,k.jsx)(`span`,{className:zt.email,children:e.email}),e.phone&&(0,k.jsx)(`span`,{className:zt.phone,children:e.phone}),e.company&&(0,k.jsxs)(`span`,{className:zt.company,children:[e.company,e.title?` · ${e.title}`:``]}),e.birthday&&(0,k.jsxs)(`span`,{className:zt.birthday,children:[`🎂 `,e.birthday]})]})]}),(0,k.jsxs)(`div`,{className:zt.actions,children:[e.email&&(0,k.jsx)(`button`,{className:zt.iconBtn,onClick:t=>T(t,e.email,e.name),title:`Send email via chat`,children:`✉`}),(0,k.jsx)(`button`,{className:zt.iconBtn,onClick:t=>{t.stopPropagation(),C(e)},title:`Edit`,children:`✎`}),(0,k.jsx)(`button`,{className:`${zt.iconBtn} ${zt.iconBtnRed}`,onClick:t=>ee(t,e),title:`Delete`,children:`✕`})]})]},e.id))}),f&&(0,k.jsx)(`div`,{className:zt.overlay,onClick:e=>{e.target===e.currentTarget&&p(null)},children:(0,k.jsxs)(`div`,{className:zt.modal,children:[(0,k.jsx)(`div`,{className:zt.modalTitle,children:u?`Edit Contact`:`New Contact`}),[[`name`,`Name`,`Full name *`],[`email`,`Email`,`user@example.com`],[`phone`,`Phone`,`+1 555 123 4567`],[`company`,`Company`,`Acme Inc`],[`address`,`Address`,`123 Main St, New York`],[`notes`,`Notes`,`Any additional info`]].map(([e,t,n])=>(0,k.jsxs)(`div`,{className:zt.field,children:[(0,k.jsx)(`label`,{className:zt.label,children:t}),(0,k.jsx)(`input`,{className:zt.input,value:f[e],onChange:t=>p(n=>n&&{...n,[e]:t.target.value}),placeholder:n,onKeyDown:t=>t.key===`Enter`&&e===`name`&&w()})]},e)),g&&(0,k.jsx)(`div`,{className:g.startsWith(`Error`)?zt.formError:zt.formStatus,children:g}),(0,k.jsxs)(`div`,{className:zt.modalBtns,children:[(0,k.jsx)(`button`,{className:zt.cancelBtn,onClick:()=>p(null),children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:zt.saveBtn,onClick:w,disabled:m||!f.name,children:m?`…`:`Save`})]})]})})]})}var V={root:`_root_1hm4q_2`,topbar:`_topbar_1hm4q_11`,topbarLeft:`_topbarLeft_1hm4q_20`,topbarTitle:`_topbarTitle_1hm4q_21`,topbarSub:`_topbarSub_1hm4q_22`,topbarActions:`_topbarActions_1hm4q_23`,runBtn:`_runBtn_1hm4q_25`,runBtnActive:`_runBtnActive_1hm4q_32`,logBtn:`_logBtn_1hm4q_34`,newWfBtn:`_newWfBtn_1hm4q_41`,body:`_body_1hm4q_50`,sidebar:`_sidebar_1hm4q_53`,sidebarTitle:`_sidebarTitle_1hm4q_61`,sidebarEmpty:`_sidebarEmpty_1hm4q_65`,wfItem:`_wfItem_1hm4q_67`,wfItemActive:`_wfItemActive_1hm4q_78`,wfItemRow:`_wfItemRow_1hm4q_79`,wfItemName:`_wfItemName_1hm4q_80`,wfItemMeta:`_wfItemMeta_1hm4q_81`,wfOn:`_wfOn_1hm4q_82`,wfOff:`_wfOff_1hm4q_83`,wfDelBtn:`_wfDelBtn_1hm4q_84`,canvasArea:`_canvasArea_1hm4q_92`,canvasHeader:`_canvasHeader_1hm4q_94`,wfNameInput:`_wfNameInput_1hm4q_99`,canvasHint:`_canvasHint_1hm4q_106`,portHint:`_portHint_1hm4q_107`,connectHint:`_connectHint_1hm4q_108`,cancelConnectBtn:`_cancelConnectBtn_1hm4q_109`,canvas:`_canvas_1hm4q_92`,canvasConnecting:`_canvasConnecting_1hm4q_122`,canvasSvg:`_canvasSvg_1hm4q_124`,canvasNode:`_canvasNode_1hm4q_134`,canvasNodeSelected:`_canvasNodeSelected_1hm4q_152`,canvasNodeConnecting:`_canvasNodeConnecting_1hm4q_153`,nodeIcon:`_nodeIcon_1hm4q_155`,nodeLabel:`_nodeLabel_1hm4q_156`,nodeConfigPreview:`_nodeConfigPreview_1hm4q_157`,nodeDelBtn:`_nodeDelBtn_1hm4q_159`,portOut:`_portOut_1hm4q_171`,portActive:`_portActive_1hm4q_182`,portIn:`_portIn_1hm4q_184`,pulse:`_pulse_1hm4q_1`,canvasDrop:`_canvasDrop_1hm4q_195`,canvasEmpty:`_canvasEmpty_1hm4q_203`,canvasEmptyIcon:`_canvasEmptyIcon_1hm4q_208`,canvasEmptyTitle:`_canvasEmptyTitle_1hm4q_209`,canvasEmptyDesc:`_canvasEmptyDesc_1hm4q_210`,logPanel:`_logPanel_1hm4q_213`,logHeader:`_logHeader_1hm4q_220`,logTime:`_logTime_1hm4q_226`,logClose:`_logClose_1hm4q_227`,logEmpty:`_logEmpty_1hm4q_228`,logStep:`_logStep_1hm4q_229`,logStepError:`_logStepError_1hm4q_230`,logStepHeader:`_logStepHeader_1hm4q_231`,logStepIcon:`_logStepIcon_1hm4q_232`,logStepLabel:`_logStepLabel_1hm4q_233`,logStepErrBadge:`_logStepErrBadge_1hm4q_234`,logStepErr:`_logStepErr_1hm4q_230`,logStepOutput:`_logStepOutput_1hm4q_236`,rightPanel:`_rightPanel_1hm4q_241`,configPanel:`_configPanel_1hm4q_252`,configHeader:`_configHeader_1hm4q_253`,configClose:`_configClose_1hm4q_254`,configDesc:`_configDesc_1hm4q_255`,configFields:`_configFields_1hm4q_256`,configField:`_configField_1hm4q_256`,configLabel:`_configLabel_1hm4q_258`,configRequired:`_configRequired_1hm4q_259`,configInput:`_configInput_1hm4q_260`,configTextarea:`_configTextarea_1hm4q_267`,zoomControls:`_zoomControls_1hm4q_277`,configHint:`_configHint_1hm4q_303`,configDelete:`_configDelete_1hm4q_305`,palette:`_palette_1hm4q_309`,paletteTitle:`_paletteTitle_1hm4q_310`,paletteTabs:`_paletteTabs_1hm4q_311`,paletteTab:`_paletteTab_1hm4q_311`,paletteTabActive:`_paletteTabActive_1hm4q_317`,paletteNodes:`_paletteNodes_1hm4q_318`,paletteDef:`_paletteDef_1hm4q_320`,paletteDefIcon:`_paletteDefIcon_1hm4q_328`,paletteDefLabel:`_paletteDefLabel_1hm4q_329`,paletteDefDesc:`_paletteDefDesc_1hm4q_330`,paletteFooter:`_paletteFooter_1hm4q_332`,paletteGuide:`_paletteGuide_1hm4q_336`,guideTitle:`_guideTitle_1hm4q_344`,guideStep:`_guideStep_1hm4q_353`,guideNum:`_guideNum_1hm4q_361`,guideTip:`_guideTip_1hm4q_377`,guideCode:`_guideCode_1hm4q_388`},Ht=[{id:`trigger_manual`,type:`trigger`,label:`Manual`,icon:`▶`,color:`#6366f1`,description:`Run manually with optional text input.`,configFields:[{key:`input`,label:`Input text`,placeholder:`Optional initial input`}]},{id:`trigger_cron`,type:`trigger`,label:`Cron`,icon:`⏰`,color:`#fbbf24`,description:`Run on a schedule (cron expression).`,configFields:[{key:`schedule`,label:`Cron expression`,placeholder:`0 8 * * *`,required:!0}]},{id:`trigger_email`,type:`trigger`,label:`New Email`,icon:`📧`,color:`#38bdf8`,description:`Trigger when a new email arrives matching a filter.`,configFields:[{key:`filter`,label:`Gmail filter`,placeholder:`subject:TODO is:unread`}]},{id:`trigger_webhook`,type:`trigger`,label:`Webhook`,icon:`🔗`,color:`#a5b4fc`,description:`Trigger via HTTP POST/GET/PUT/DELETE. URL: http://localhost:3847/api/webhooks/<slug>`,configFields:[{key:`slug`,label:`Slug (URL path)`,placeholder:`my-trigger`,required:!0}]},{id:`action_email`,type:`action`,label:`Send Email`,icon:`✉`,color:`#38bdf8`,description:`Send email via Gmail or IMAP.`,configFields:[{key:`to`,label:`To`,placeholder:`email@example.com`,required:!0},{key:`subject`,label:`Subject`,placeholder:`Subject or {{output}}`},{key:`body`,label:`Body`,placeholder:`{{output}}`}]},{id:`action_slack`,type:`action`,label:`Slack Message`,icon:`💬`,color:`#818cf8`,description:`Post a message to a Slack channel.`,configFields:[{key:`channel`,label:`Channel`,placeholder:`#general`,required:!0},{key:`text`,label:`Text`,placeholder:`{{output}}`}]},{id:`action_calendar`,type:`action`,label:`Create Event`,icon:`📅`,color:`#4ade80`,description:`Create a Google Calendar event.`,configFields:[{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`date`,label:`Date (YYYY-MM-DD)`,placeholder:`2025-01-15`},{key:`time`,label:`Time (HH:MM)`,placeholder:`09:00`}]},{id:`action_task`,type:`action`,label:`Create Task`,icon:`✅`,color:`#fbbf24`,description:`Add a task to your task list.`,configFields:[{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`priority`,label:`Priority`,placeholder:`medium`}]},{id:`action_drive`,type:`action`,label:`Save to Drive`,icon:`💾`,color:`#a78bfa`,description:`Save a text file to Google Drive.`,configFields:[{key:`name`,label:`Filename`,placeholder:`output.txt`,required:!0},{key:`content`,label:`Content`,placeholder:`{{output}}`}]},{id:`action_notion`,type:`action`,label:`Notion Page`,icon:`📋`,color:`#e4e4e7`,description:`Create or update a Notion page.`,configFields:[{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`content`,label:`Content`,placeholder:`{{output}}`}]},{id:`action_github`,type:`action`,label:`GitHub Issue`,icon:`🐙`,color:`#6ee7b7`,description:`Create a GitHub issue.`,configFields:[{key:`repo`,label:`Repo (owner/name)`,placeholder:`user/repo`,required:!0},{key:`title`,label:`Title`,placeholder:`{{output}}`,required:!0},{key:`body`,label:`Body`,placeholder:``}]},{id:`action_webhook`,type:`action`,label:`HTTP Request`,icon:`🌐`,color:`#38bdf8`,description:`Make an HTTP request.`,configFields:[{key:`url`,label:`URL`,placeholder:`https://…`,required:!0},{key:`method`,label:`Method`,placeholder:`POST`},{key:`body`,label:`Body`,placeholder:`{{output}}`}]},{id:`ai_agent`,type:`ai`,label:`Run Agent`,icon:`🤖`,color:`#818cf8`,description:`Run any of the 38 NHA specialist agents.`,configFields:[{key:`agent`,label:`Agent name`,placeholder:`herald, saber, forge…`,required:!0},{key:`prompt`,label:`Prompt`,placeholder:`Summarize this: {{output}}`,required:!0}]},{id:`ai_summarize`,type:`ai`,label:`Summarize`,icon:`📝`,color:`#a5b4fc`,description:`Summarize text with AI (free via Liara).`,configFields:[{key:`prompt`,label:`Prompt`,placeholder:`Summarize: {{output}}`}]},{id:`ai_classify`,type:`ai`,label:`Classify`,icon:`🏷`,color:`#a5b4fc`,description:`Classify content into categories.`,configFields:[{key:`categories`,label:`Categories (comma-separated)`,placeholder:`urgent, normal, spam`},{key:`prompt`,label:`Prompt`,placeholder:`Classify this email: {{output}}`}]},{id:`ai_extract`,type:`ai`,label:`Extract Data`,icon:`🔍`,color:`#a5b4fc`,description:`Extract structured data from text.`,configFields:[{key:`prompt`,label:`What to extract`,placeholder:`Extract name, email, date from: {{output}}`}]},{id:`ai_translate`,type:`ai`,label:`Translate`,icon:`🌍`,color:`#a5b4fc`,description:`Translate text to another language.`,configFields:[{key:`lang`,label:`Target language`,placeholder:`Italian`,required:!0},{key:`prompt`,label:`Text`,placeholder:`{{output}}`}]},{id:`ai_code`,type:`ai`,label:`Code (JS)`,icon:`💻`,color:`#818cf8`,description:"Execute JavaScript code. Access previous output via `input` variable. Return a value.",configFields:[{key:`code`,label:`JavaScript code`,placeholder:`const data = JSON.parse(input);
654
654
  return data.map(x => x.name).join(", ");`,type:`textarea`}]},{id:`logic_if`,type:`logic`,label:`If / Condition`,icon:`🔀`,color:`#f59e0b`,description:`Branch based on a condition. Outputs to "true" or "false" path.`,configFields:[{key:`condition`,label:`Condition (JS expression)`,placeholder:`{{output}}.includes("urgent")`,required:!0}],outputs:[`true`,`false`]},{id:`logic_switch`,type:`logic`,label:`Switch`,icon:`🔄`,color:`#f59e0b`,description:`Route to different paths based on value. Add cases as comma-separated values.`,configFields:[{key:`expression`,label:`Expression`,placeholder:`{{output}}`,required:!0},{key:`cases`,label:`Cases (comma-separated)`,placeholder:`urgent, normal, spam`,required:!0}]},{id:`logic_loop`,type:`logic`,label:`Loop / For Each`,icon:`🔁`,color:`#f59e0b`,description:`Iterate over items. Input should be JSON array or newline-separated text.`,configFields:[{key:`separator`,label:`Separator`,placeholder:`\\n (newline) or , (comma)`}]},{id:`logic_merge`,type:`logic`,label:`Merge`,icon:`🔗`,color:`#f59e0b`,description:`Merge outputs from multiple branches into one.`,configFields:[{key:`mode`,label:`Mode`,placeholder:`concat`,type:`select`,options:[`concat`,`json_array`,`first_non_empty`]}]},{id:`logic_delay`,type:`logic`,label:`Delay`,icon:`⏳`,color:`#f59e0b`,description:`Wait before continuing.`,configFields:[{key:`seconds`,label:`Seconds`,placeholder:`5`,required:!0}]},{id:`logic_error`,type:`logic`,label:`Error Handler`,icon:`🛡`,color:`#ef4444`,description:`Catch errors from previous nodes. Configure retry count and fallback behavior.`,configFields:[{key:`retries`,label:`Max retries`,placeholder:`3`},{key:`fallback`,label:`Fallback output`,placeholder:`Default value if all retries fail`}]},{id:`logic_subworkflow`,type:`logic`,label:`Subworkflow`,icon:`🪆`,color:`#a855f7`,description:`Run another workflow inline. Output of the sub becomes this node's output. Max nesting depth 5.`,configFields:[{key:`workflowId`,label:`Target workflow ID`,placeholder:`wf_abc123`,required:!0},{key:`inputMapping`,label:`Input expression`,placeholder:`{{output}} (default)`}]},{id:`action_browser`,type:`action`,label:`Open URL`,icon:`🌐`,color:`#60a5fa`,description:`Open a URL in headless browser and extract text content.`,configFields:[{key:`url`,label:`URL`,placeholder:`https://example.com or {{output}}`,required:!0}]},{id:`action_file_read`,type:`action`,label:`Read File`,icon:`📖`,color:`#4ade80`,description:`Read a file from the filesystem.`,configFields:[{key:`path`,label:`File path`,placeholder:`/path/to/file.txt`,required:!0}]},{id:`action_file_write`,type:`action`,label:`Write File`,icon:`📝`,color:`#4ade80`,description:`Write content to a file.`,configFields:[{key:`path`,label:`File path`,placeholder:`/path/to/output.txt`,required:!0},{key:`content`,label:`Content`,placeholder:`{{output}}`}]},{id:`action_contact`,type:`action`,label:`Find Contact`,icon:`👤`,color:`#38bdf8`,description:`Search Google Contacts by name or email.`,configFields:[{key:`query`,label:`Search query`,placeholder:`John or john@example.com`,required:!0}]},{id:`action_screen`,type:`action`,label:`Screenshot`,icon:`📸`,color:`#c084fc`,description:`Take a screenshot of the screen.`,configFields:[]},{id:`action_maps`,type:`action`,label:`Maps Directions`,icon:`🗺`,color:`#4ade80`,description:`Get directions between two locations.`,configFields:[{key:`from`,label:`From`,placeholder:`Milan`,required:!0},{key:`to`,label:`To`,placeholder:`Rome`,required:!0}]},{id:`action_notify`,type:`action`,label:`Notification`,icon:`🔔`,color:`#fbbf24`,description:`Send a system notification or Telegram message.`,configFields:[{key:`message`,label:`Message`,placeholder:`{{output}}`,required:!0},{key:`channel`,label:`Channel`,placeholder:`telegram or system`,type:`select`,options:[`system`,`telegram`]}]}],Ut=Object.fromEntries(Ht.map(e=>[e.id,e])),Wt=90,Gt=72;function Kt(){return`n_${Date.now()}_${Math.random().toString(36).slice(2,6)}`}function qt(e,t){return{x:e.x+(t===`out`?Wt:0),y:e.y+Gt/2}}function Jt(){let[e,t]=(0,_.useState)([]),[n,r]=(0,_.useState)(null),[i,a]=(0,_.useState)(null),[o,s]=(0,_.useState)(null),[c,l]=(0,_.useState)(!1),[u,d]=(0,_.useState)([]),[f,p]=(0,_.useState)(!1),[m,h]=(0,_.useState)(`trigger`),[g,v]=(0,_.useState)(1),[y,b]=(0,_.useState)({x:0,y:0}),x=(0,_.useRef)(!1),S=(0,_.useRef)({x:0,y:0,px:0,py:0}),C=(0,_.useRef)(null),w=(0,_.useRef)(null),ee=(0,_.useRef)(null),T=(0,_.useCallback)(async()=>{let e=(await E(`/api/workflows`).catch(()=>null))?.workflows??[];t(e),r(t=>t?e.find(e=>e.id===t.id)??e[0]??null:e[0]??null)},[]);(0,_.useEffect)(()=>{T()},[T]);let te=(0,_.useCallback)(async e=>{r(e),t(t=>t.map(t=>t.id===e.id?e:t)),await D(`/api/workflows/${e.id}`,e,`PUT`).catch(()=>null)},[]),ne=async()=>{let e={id:`wf_${Date.now()}`,name:`New Workflow`,enabled:!1,nodes:[],edges:[],nodeDefs:Ht},n=(await D(`/api/workflows`,e).catch(()=>null))?.workflow??e;t(e=>[...e,n]),r(n),a(null),d([]),p(!1)},re=async e=>{confirm(`Delete this workflow?`)&&(await D(`/api/workflows/${e}`,{},`DELETE`).catch(()=>null),T())},ie=(0,_.useCallback)(e=>{e.preventDefault();let t=w.current;if(!t||!n)return;let r=ee.current.getBoundingClientRect(),i=Math.round((e.clientX-r.left-Wt/2)/20)*20,o=Math.round((e.clientY-r.top-Gt/2)/20)*20,s={id:Kt(),defId:t,x:Math.max(0,i),y:Math.max(0,o),config:{}};te({...n,nodes:[...n.nodes,s]}),a(s.id),w.current=null},[n,te]),O=(0,_.useCallback)((e,t)=>{if(e.stopPropagation(),o){o!==t&&n&&(n.edges.some(e=>e.from===o&&e.to===t)||te({...n,edges:[...n.edges,{from:o,to:t}]})),s(null);return}a(t);let r=n?.nodes.find(e=>e.id===t);r&&(C.current={id:t,ox:e.clientX-r.x,oy:e.clientY-r.y})},[o,n,te]),ae=(0,_.useCallback)(e=>{if(!C.current||!n)return;let{id:t,ox:i,oy:a}=C.current,o=e.clientX-i,s=e.clientY-a,c=Math.max(0,Math.round(o/20)*20),l=Math.max(0,Math.round(s/20)*20);r(e=>e&&{...e,nodes:e.nodes.map(e=>e.id===t?{...e,x:c,y:l}:e)})},[n]),A=(0,_.useCallback)(()=>{if(!C.current||!n){C.current=null;return}n.nodes.find(e=>e.id===C.current.id)&&te(n),C.current=null},[n,te]),oe=(0,_.useCallback)(e=>{n&&(te({...n,nodes:n.nodes.filter(t=>t.id!==e),edges:n.edges.filter(t=>t.from!==e&&t.to!==e)}),a(null))},[n,te]),se=(0,_.useCallback)((e,t)=>{n&&te({...n,edges:n.edges.filter(n=>!(n.from===e&&n.to===t))})},[n,te]),ce=(0,_.useCallback)((e,i,a)=>{if(!n)return;let o={...n,nodes:n.nodes.map(t=>t.id===e?{...t,config:{...t.config,[i]:a}}:t)};r(o),t(e=>e.map(e=>e.id===o.id?o:e))},[n]),le=(0,_.useCallback)(()=>{n&&te(n)},[n,te]),ue=async()=>{if(!(!n||c)){l(!0),p(!0),d([]);try{let e={...n,nodeDefs:Ht};await D(`/api/workflows/${n.id}`,e,`PUT`).catch(()=>null),d((await D(`/api/workflows/${n.id}/run`,{}))?.steps??[]),T()}catch(e){d([{nodeId:`__error`,nodeLabel:`Error`,nodeIcon:`❌`,output:``,error:e.message}])}finally{l(!1)}}},de=async e=>{let i={...e,enabled:!e.enabled};await D(`/api/workflows/${e.id}`,i,`PUT`).catch(()=>null),t(t=>t.map(t=>t.id===e.id?i:t)),n?.id===e.id&&r(i)},j=n?.nodes.find(e=>e.id===i)??null,M=j?Ut[j.defId]:null;return(0,k.jsxs)(`div`,{className:V.root,children:[(0,k.jsxs)(`div`,{className:V.topbar,children:[(0,k.jsxs)(`div`,{className:V.topbarLeft,children:[(0,k.jsx)(`span`,{className:V.topbarTitle,children:`AWF - AutoWorkFlow`}),(0,k.jsx)(`span`,{className:V.topbarSub,children:`Visual workflow automation · 80 tools · 38 AI agents · free AI via Liara`})]}),(0,k.jsxs)(`div`,{className:V.topbarActions,children:[n&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`button`,{className:`${V.runBtn} ${c?V.runBtnActive:``}`,onClick:ue,disabled:c||n.nodes.length===0,children:c?`⏳ Running…`:`▶ Run`}),(0,k.jsx)(`button`,{className:V.logBtn,onClick:()=>p(e=>!e),children:f?`Hide Log`:`📋 Log`})]}),(0,k.jsx)(`button`,{className:V.newWfBtn,onClick:ne,children:`+ New Workflow`})]})]}),(0,k.jsxs)(`div`,{className:V.body,children:[(0,k.jsxs)(`div`,{className:V.sidebar,children:[(0,k.jsx)(`div`,{className:V.sidebarTitle,children:`Workflows`}),e.length===0&&(0,k.jsxs)(`div`,{className:V.sidebarEmpty,children:[`No workflows yet.`,(0,k.jsx)(`br`,{}),`Click "New Workflow" to start.`]}),e.map(e=>(0,k.jsxs)(`div`,{className:`${V.wfItem} ${n?.id===e.id?V.wfItemActive:``}`,onClick:()=>{r(e),a(null),d(e.lastRun?.steps??[]),p(!1)},children:[(0,k.jsxs)(`div`,{className:V.wfItemRow,children:[(0,k.jsx)(`span`,{className:V.wfItemName,children:e.name}),(0,k.jsx)(`button`,{className:e.enabled?V.wfOn:V.wfOff,onClick:t=>{t.stopPropagation(),de(e)},children:e.enabled?`ON`:`OFF`})]}),(0,k.jsxs)(`div`,{className:V.wfItemMeta,children:[e.nodes.length,` nodes · `,e.edges.length,` edges`,e.lastRun&&(0,k.jsxs)(`span`,{children:[` · ran `,new Date(e.lastRun.at).toLocaleTimeString()]})]}),(0,k.jsx)(`button`,{className:V.wfDelBtn,onClick:t=>{t.stopPropagation(),re(e.id)},children:`✕`})]},e.id))]}),(0,k.jsx)(`div`,{className:V.canvasArea,children:n?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(`div`,{className:V.canvasHeader,children:[(0,k.jsx)(`input`,{className:V.wfNameInput,value:n.name,onChange:e=>r(t=>t&&{...t,name:e.target.value}),onBlur:()=>n&&te(n)}),o?(0,k.jsxs)(`span`,{className:V.connectHint,children:[`Click a target node to connect · `,(0,k.jsx)(`button`,{className:V.cancelConnectBtn,onClick:()=>s(null),children:`Cancel`})]}):(0,k.jsxs)(`span`,{className:V.canvasHint,children:[`Drag nodes from palette · Click `,(0,k.jsx)(`span`,{className:V.portHint,children:`▶`}),` to connect · Drag nodes to reposition`]})]}),(0,k.jsxs)(`div`,{ref:ee,className:`${V.canvas} ${o?V.canvasConnecting:``}`,onMouseMove:e=>{if(x.current){b({x:S.current.px+(e.clientX-S.current.x),y:S.current.py+(e.clientY-S.current.y)});return}ae(e)},onMouseDown:e=>{e.button===1&&(e.preventDefault(),x.current=!0,S.current={x:e.clientX,y:e.clientY,px:y.x,py:y.y})},onMouseUp:()=>{x.current=!1,A()},onMouseLeave:()=>{x.current=!1,A()},onWheel:e=>{if(e.preventDefault(),e.ctrlKey||e.metaKey){let t=e.deltaY>0?-.1:.1;v(e=>Math.max(.3,Math.min(2,e+t)))}else b(t=>({x:t.x-e.deltaX,y:t.y-e.deltaY}))},onDragOver:e=>e.preventDefault(),onDrop:ie,onClick:()=>{o||a(null)},children:[(0,k.jsxs)(`div`,{className:V.zoomControls,children:[(0,k.jsx)(`button`,{onClick:()=>v(e=>Math.min(2,e+.1)),children:`+`}),(0,k.jsxs)(`span`,{children:[Math.round(g*100),`%`]}),(0,k.jsx)(`button`,{onClick:()=>v(e=>Math.max(.3,e-.1)),children:`−`}),(0,k.jsx)(`button`,{onClick:()=>{v(1),b({x:0,y:0})},children:`⊙`})]}),(0,k.jsxs)(`div`,{style:{transform:`translate(${y.x}px, ${y.y}px) scale(${g})`,transformOrigin:`0 0`,position:`absolute`,inset:0},children:[(0,k.jsx)(`svg`,{className:V.canvasSvg,children:n.edges.map((e,t)=>{let r=n.nodes.find(t=>t.id===e.from),i=n.nodes.find(t=>t.id===e.to);if(!r||!i)return null;let a=qt(r,`out`),o=qt(i,`in`),s=(a.x+o.x)/2;return(0,k.jsxs)(`g`,{children:[(0,k.jsx)(`path`,{d:`M${a.x},${a.y} C${s},${a.y} ${s},${o.y} ${o.x},${o.y}`,stroke:`var(--green3)`,strokeWidth:`2`,fill:`none`,strokeDasharray:`6,3`,opacity:`0.8`}),(0,k.jsx)(`path`,{d:`M${a.x},${a.y} C${s},${a.y} ${s},${o.y} ${o.x},${o.y}`,stroke:`transparent`,strokeWidth:`12`,fill:`none`,style:{cursor:`pointer`},onClick:t=>{t.stopPropagation(),se(e.from,e.to)}}),(0,k.jsx)(`circle`,{cx:s,cy:(a.y+o.y)/2,r:`7`,fill:`var(--bg2)`,stroke:`var(--border)`,strokeWidth:`1.5`,style:{cursor:`pointer`},onClick:t=>{t.stopPropagation(),se(e.from,e.to)}}),(0,k.jsx)(`text`,{x:s,y:(a.y+o.y)/2+4,textAnchor:`middle`,fill:`var(--dim)`,fontSize:`9`,style:{cursor:`pointer`,pointerEvents:`none`},children:`✕`})]},t)})}),n.nodes.map(e=>{let t=Ut[e.defId];if(!t)return null;let n=i===e.id,r=o===e.id;return(0,k.jsxs)(`div`,{className:`${V.canvasNode} ${n?V.canvasNodeSelected:``} ${r?V.canvasNodeConnecting:``}`,style:{left:e.x,top:e.y,borderColor:t.color+(n?`ff`:`88`),background:t.color+`18`},onMouseDown:t=>O(t,e.id),onClick:e=>e.stopPropagation(),children:[(0,k.jsx)(`button`,{className:V.nodeDelBtn,onMouseDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),oe(e.id)},children:`✕`}),(0,k.jsx)(`span`,{className:V.nodeIcon,children:t.icon}),(0,k.jsx)(`span`,{className:V.nodeLabel,style:{color:t.color},children:t.label}),Object.values(e.config).filter(Boolean).slice(0,1).map((e,t)=>(0,k.jsx)(`span`,{className:V.nodeConfigPreview,children:String(e).slice(0,14)},t)),(0,k.jsx)(`button`,{className:`${V.portOut} ${r?V.portActive:``}`,onMouseDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),s(t=>t===e.id?null:e.id)},title:`Connect from here`,children:`▶`}),o&&o!==e.id&&(0,k.jsx)(`button`,{className:V.portIn,onMouseDown:e=>e.stopPropagation(),onClick:t=>{t.stopPropagation(),O(t,e.id)},title:`Connect here`,children:`◀`})]},e.id)}),n.nodes.length===0&&(0,k.jsx)(`div`,{className:V.canvasDrop,children:`Drag nodes from the right panel and drop here`})]})]}),f&&(0,k.jsxs)(`div`,{className:V.logPanel,children:[(0,k.jsxs)(`div`,{className:V.logHeader,children:[(0,k.jsx)(`span`,{children:`Run Log`}),n.lastRun&&(0,k.jsx)(`span`,{className:V.logTime,children:new Date(n.lastRun.at).toLocaleString()}),(0,k.jsx)(`button`,{className:V.logClose,onClick:()=>p(!1),children:`✕`})]}),u.length===0&&(0,k.jsx)(`div`,{className:V.logEmpty,children:c?`Running…`:`No run results yet.`}),u.map((e,t)=>(0,k.jsxs)(`div`,{className:`${V.logStep} ${e.error?V.logStepError:``}`,children:[(0,k.jsxs)(`div`,{className:V.logStepHeader,children:[(0,k.jsx)(`span`,{className:V.logStepIcon,children:e.nodeIcon}),(0,k.jsx)(`span`,{className:V.logStepLabel,children:e.nodeLabel}),e.error&&(0,k.jsx)(`span`,{className:V.logStepErrBadge,children:`ERROR`})]}),e.error&&(0,k.jsx)(`div`,{className:V.logStepErr,children:e.error}),e.output&&(0,k.jsx)(`div`,{className:V.logStepOutput,dangerouslySetInnerHTML:{__html:Se(e.output.slice(0,500))}})]},t))]})]}):(0,k.jsxs)(`div`,{className:V.canvasEmpty,children:[(0,k.jsx)(`div`,{className:V.canvasEmptyIcon,children:`🔗`}),(0,k.jsx)(`div`,{className:V.canvasEmptyTitle,children:`Select or create a workflow`}),(0,k.jsxs)(`div`,{className:V.canvasEmptyDesc,children:[`Drag nodes from the right panel onto the canvas.`,(0,k.jsx)(`br`,{}),`Connect them by clicking the `,(0,k.jsx)(`span`,{className:V.portHint,children:`▶`}),` output port then the target node.`,(0,k.jsx)(`br`,{}),`Run with one click — all 80 NHA tools already authenticated.`]}),(0,k.jsx)(`button`,{className:V.newWfBtn,onClick:ne,children:`+ New Workflow`})]})}),(0,k.jsx)(`div`,{className:V.rightPanel,children:j&&M?(0,k.jsxs)(`div`,{className:V.configPanel,children:[(0,k.jsxs)(`div`,{className:V.configHeader,children:[(0,k.jsxs)(`span`,{style:{color:M.color},children:[M.icon,` `,M.label]}),(0,k.jsx)(`button`,{className:V.configClose,onClick:()=>a(null),children:`✕`})]}),(0,k.jsx)(`div`,{className:V.configDesc,children:M.description}),(0,k.jsx)(`div`,{className:V.configFields,children:(M.configFields??[]).map(e=>(0,k.jsxs)(`div`,{className:V.configField,children:[(0,k.jsxs)(`label`,{className:V.configLabel,children:[e.label,e.required&&(0,k.jsx)(`span`,{className:V.configRequired,children:`*`})]}),e.type===`textarea`?(0,k.jsx)(`textarea`,{className:V.configTextarea,value:j.config[e.key]??``,placeholder:e.placeholder??``,onChange:t=>ce(j.id,e.key,t.target.value),onBlur:le,rows:4}):e.type===`select`&&e.options?(0,k.jsx)(`select`,{className:V.configInput,value:j.config[e.key]??e.options[0]??``,onChange:t=>{ce(j.id,e.key,t.target.value),le()},children:e.options.map(e=>(0,k.jsx)(`option`,{value:e,children:e},e))}):(0,k.jsx)(`input`,{className:V.configInput,value:j.config[e.key]??``,placeholder:e.placeholder??``,onChange:t=>ce(j.id,e.key,t.target.value),onBlur:le}),(e.placeholder?.includes(`{{`)??!1)&&(0,k.jsxs)(`div`,{className:V.configHint,children:[`Use `,(0,k.jsx)(`code`,{children:`{{output}}`}),` to pass previous node result`]})]},e.key))}),(0,k.jsx)(`button`,{className:V.configDelete,onClick:()=>oe(j.id),children:`Delete node`})]}):(0,k.jsxs)(`div`,{className:V.palette,children:[(0,k.jsx)(`div`,{className:V.paletteTitle,children:`Node Palette`}),(0,k.jsx)(`div`,{className:V.paletteTabs,children:[{id:`trigger`,label:`Triggers`,color:`#fbbf24`},{id:`action`,label:`Actions`,color:`#38bdf8`},{id:`ai`,label:`AI`,color:`#a5b4fc`},{id:`logic`,label:`Logic`,color:`#f59e0b`}].map(e=>(0,k.jsx)(`button`,{className:`${V.paletteTab} ${m===e.id?V.paletteTabActive:``}`,style:m===e.id?{borderColor:e.color,color:e.color}:{},onClick:()=>h(e.id),children:e.label},e.id))}),(0,k.jsx)(`div`,{className:V.paletteNodes,children:Ht.filter(e=>e.type===m).map(e=>(0,k.jsxs)(`div`,{className:V.paletteDef,style:{borderColor:e.color+`44`,background:e.color+`14`},draggable:!0,onDragStart:()=>{w.current=e.id},onDragEnd:()=>{w.current=null},children:[(0,k.jsx)(`span`,{className:V.paletteDefIcon,children:e.icon}),(0,k.jsxs)(`div`,{children:[(0,k.jsx)(`div`,{className:V.paletteDefLabel,style:{color:e.color},children:e.label}),(0,k.jsx)(`div`,{className:V.paletteDefDesc,children:e.description})]})]},e.id))}),(0,k.jsxs)(`div`,{className:V.paletteGuide,children:[(0,k.jsx)(`div`,{className:V.guideTitle,children:`How to use AWF`}),(0,k.jsxs)(`div`,{className:V.guideStep,children:[(0,k.jsx)(`span`,{className:V.guideNum,children:`1`}),(0,k.jsxs)(`span`,{children:[(0,k.jsx)(`strong`,{children:`Create`}),` a workflow with "+ New Workflow"`]})]}),(0,k.jsxs)(`div`,{className:V.guideStep,children:[(0,k.jsx)(`span`,{className:V.guideNum,children:`2`}),(0,k.jsxs)(`span`,{children:[(0,k.jsx)(`strong`,{children:`Drag`}),` a Trigger node (e.g. Manual, Cron) onto the canvas`]})]}),(0,k.jsxs)(`div`,{className:V.guideStep,children:[(0,k.jsx)(`span`,{className:V.guideNum,children:`3`}),(0,k.jsxs)(`span`,{children:[(0,k.jsx)(`strong`,{children:`Drag`}),` Action or AI nodes to chain operations`]})]}),(0,k.jsxs)(`div`,{className:V.guideStep,children:[(0,k.jsx)(`span`,{className:V.guideNum,children:`4`}),(0,k.jsxs)(`span`,{children:[`Click the `,(0,k.jsx)(`strong`,{style:{color:`var(--green3)`},children:`▶`}),` port on a node then click the next to `,(0,k.jsx)(`strong`,{children:`connect`}),` them`]})]}),(0,k.jsxs)(`div`,{className:V.guideStep,children:[(0,k.jsx)(`span`,{className:V.guideNum,children:`5`}),(0,k.jsxs)(`span`,{children:[(0,k.jsx)(`strong`,{children:`Click`}),` a node to configure it — use `,(0,k.jsx)(`code`,{className:V.guideCode,children:`{{output}}`}),` to pass the previous result`]})]}),(0,k.jsxs)(`div`,{className:V.guideStep,children:[(0,k.jsx)(`span`,{className:V.guideNum,children:`6`}),(0,k.jsxs)(`span`,{children:[`Press `,(0,k.jsx)(`strong`,{children:`▶ Run`}),` to execute · toggle `,(0,k.jsx)(`strong`,{children:`ON`}),` to run automatically (cron/webhook)`]})]}),(0,k.jsxs)(`div`,{className:V.guideTip,children:[(0,k.jsx)(`strong`,{children:`Tip:`}),` Click an edge to delete it. Drag nodes on the canvas to reposition. All 80 NHA tools are pre-authenticated — no extra setup.`]}),(0,k.jsxs)(`div`,{className:V.guideTip,children:[(0,k.jsx)(`strong`,{children:`AI nodes`}),` use Liara (free) by default. They receive `,(0,k.jsx)(`code`,{className:V.guideCode,children:`{{output}}`}),` from the previous step automatically.`]})]})]})})]})]})}var H={root:`_root_1ssbe_1`,sidebar:`_sidebar_1ssbe_12`,sidebarSection:`_sidebarSection_1ssbe_23`,sidebarLabel:`_sidebarLabel_1ssbe_28`,accountSelect:`_accountSelect_1ssbe_36`,sidebarCompose:`_sidebarCompose_1ssbe_46`,composeBtn:`_composeBtn_1ssbe_51`,folderList:`_folderList_1ssbe_63`,folderItem:`_folderItem_1ssbe_69`,folderActive:`_folderActive_1ssbe_82`,badge:`_badge_1ssbe_88`,labelHeader:`_labelHeader_1ssbe_103`,addLabelBtn:`_addLabelBtn_1ssbe_114`,newLabelRow:`_newLabelRow_1ssbe_123`,newLabelInput:`_newLabelInput_1ssbe_129`,newLabelSave:`_newLabelSave_1ssbe_139`,labelDot:`_labelDot_1ssbe_150`,syncArea:`_syncArea_1ssbe_158`,syncBtn:`_syncBtn_1ssbe_163`,messageList:`_messageList_1ssbe_175`,listHeader:`_listHeader_1ssbe_185`,searchInput:`_searchInput_1ssbe_194`,searchBtn:`_searchBtn_1ssbe_204`,listBody:`_listBody_1ssbe_214`,listLoading:`_listLoading_1ssbe_219`,noMessages:`_noMessages_1ssbe_224`,msgRow:`_msgRow_1ssbe_231`,msgUnread:`_msgUnread_1ssbe_242`,msgActive:`_msgActive_1ssbe_247`,msgTop:`_msgTop_1ssbe_251`,msgFrom:`_msgFrom_1ssbe_257`,msgDate:`_msgDate_1ssbe_270`,msgSubject:`_msgSubject_1ssbe_277`,msgPreview:`_msgPreview_1ssbe_289`,listFooter:`_listFooter_1ssbe_300`,loadMoreBtn:`_loadMoreBtn_1ssbe_311`,pane:`_pane_1ssbe_322`,emptyPane:`_emptyPane_1ssbe_330`,readingPane:`_readingPane_1ssbe_337`,paneToolbar:`_paneToolbar_1ssbe_344`,paneActions:`_paneActions_1ssbe_354`,replyBtn:`_replyBtn_1ssbe_360`,fwdBtn:`_fwdBtn_1ssbe_371`,trashBtn:`_trashBtn_1ssbe_371`,starBtn:`_starBtn_1ssbe_371`,aiBtn:`_aiBtn_1ssbe_384`,labelSelect:`_labelSelect_1ssbe_394`,paneHeader:`_paneHeader_1ssbe_403`,paneSubject:`_paneSubject_1ssbe_409`,paneMeta:`_paneMeta_1ssbe_416`,attachments:`_attachments_1ssbe_424`,attachLink:`_attachLink_1ssbe_431`,paneBody:`_paneBody_1ssbe_441`,bodyFrame:`_bodyFrame_1ssbe_447`,bodyText:`_bodyText_1ssbe_455`,composePane:`_composePane_1ssbe_465`,composeTitle:`_composeTitle_1ssbe_474`,composeField:`_composeField_1ssbe_483`,templateRow:`_templateRow_1ssbe_495`,templateToggle:`_templateToggle_1ssbe_500`,templateDrop:`_templateDrop_1ssbe_510`,templateItem:`_templateItem_1ssbe_524`,templateSubject:`_templateSubject_1ssbe_534`,composeBody:`_composeBody_1ssbe_540`,composeActions:`_composeActions_1ssbe_556`,sendBtn:`_sendBtn_1ssbe_563`,cancelBtn:`_cancelBtn_1ssbe_574`,compStatus:`_compStatus_1ssbe_584`,ok:`_ok_1ssbe_585`,err:`_err_1ssbe_586`},Yt=[{id:`INBOX`,name:`Inbox`,icon:`✉`},{id:`SENT`,name:`Sent`,icon:`→`},{id:`DRAFTS`,name:`Drafts`,icon:`📄`},{id:`SPAM`,name:`Spam`,icon:`🛡`},{id:`TRASH`,name:`Trash`,icon:`🗑`}],Xt=[{name:`Product Promo`,subject:`Discover our offer on [PRODUCT]`},{name:`Monthly Newsletter`,subject:`[COMPANY] Newsletter — [MONTH] [YEAR]`},{name:`Commercial Follow-up`,subject:`Following our conversation — [TOPIC]`},{name:`Offer / Quote`,subject:`Offer [NUMBER] — [SUBJECT]`},{name:`Event Invitation`,subject:`You are invited: [EVENT NAME] — [DATE]`},{name:`Customer Thank You`,subject:`Thank you for your trust, [NAME]`}];function Zt(e){return e?e.slice(0,10):``}function Qt(e){if(!e)return``;try{let t=typeof e==`string`?JSON.parse(e):e;return Array.isArray(t)?t.map(e=>e.name?`${e.name} <${e.address}>`:e.address||``).join(`, `):String(e)}catch{return String(e)}}function $t(){let e=j(),t=te(e=>e.setView),[n,r]=(0,_.useState)(!1),[i,a]=(0,_.useState)([]),[o,s]=(0,_.useState)(null),[c,l]=(0,_.useState)(`google`),[u,d]=(0,_.useState)([]),[f,p]=(0,_.useState)(`INBOX`),[m,h]=(0,_.useState)([]),[g,v]=(0,_.useState)(0),[y,b]=(0,_.useState)(0),[x,S]=(0,_.useState)(null),[C,w]=(0,_.useState)(null),[ee,T]=(0,_.useState)(!1),[ne,re]=(0,_.useState)(!1),[ie,O]=(0,_.useState)(``),[ae,A]=(0,_.useState)(``),[oe,se]=(0,_.useState)(0),[ce,le]=(0,_.useState)(!1),[ue,de]=(0,_.useState)({}),[M,fe]=(0,_.useState)(``),[pe,me]=(0,_.useState)(``),[he,ge]=(0,_.useState)(``),[_e,ve]=(0,_.useState)(``),[ye,be]=(0,_.useState)(``),[xe,Se]=(0,_.useState)(!1),[N,Ce]=(0,_.useState)(``),[we,Te]=(0,_.useState)(!1),Ee=(0,_.useRef)(null),P=(0,_.useRef)(0);(0,_.useEffect)(()=>{E(`/api/config`).then(e=>r(!!e?.hasGoogle)),E(`/api/imap/accounts`).then(e=>{let t=(e?.accounts??[]).filter(e=>e.id!==`google`);a(t);let n=localStorage.getItem(`nha-email-account-type`),r=localStorage.getItem(`nha-email-account-id`);n===`google`?De(`google`,`google`):n===`imap`&&r&&t.some(e=>e.id===r)?De(r,`imap`):t.length>0?De(t[0].id,`imap`):De(`google`,`google`)})},[]);let De=(e,t)=>{s(e),l(t),p(t===`google`?`INBOX`:null),localStorage.setItem(`nha-email-account-type`,t),localStorage.setItem(`nha-email-account-id`,e),h([]),b(0),S(null),w(null),t===`imap`?E(`/api/imap/labels?accountId=${e}`).then(t=>{let n=t?.labels??[];d(n);let r=n.find(e=>e.system_type===`inbox`)?.id??null;p(r),Oe(e,r,0,``)}):(d([]),ke(`INBOX`,``))},Oe=(e,t,n,r)=>{let i=++P.current;T(!0);let a=`/api/imap/messages?accountId=${encodeURIComponent(e)}&limit=50&offset=${n}`;t&&(a+=`&labelId=${encodeURIComponent(t)}`),r&&(a+=`&search=${encodeURIComponent(r)}`),E(a).then(e=>{i===P.current&&(h(n===0?e?.messages??[]:t=>[...t,...e?.messages??[]]),v(e?.total??0),T(!1))}).catch(()=>{i===P.current&&T(!1)})},ke=(e,t)=>{T(!0);let n=e||`INBOX`;E(`/api/emails?folder=${encodeURIComponent(n)}&page=0&pageSize=50${t?`&search=${encodeURIComponent(t)}`:``}`).then(e=>{if(e?.authRequired){h([]),v(0),T(!1);return}let t=e?.emails??[];if(t.length>0){let e=t.map(e=>({id:e.id,subject:e.subject,from_name:e.from,from_address:e.from,internal_date:e.date,body_preview:e.snippet,is_read:!e.isUnread,is_starred:!1,has_attachments:!1,_google:!0}));h(e),v(e.length),n===`INBOX`&&se(e.filter(e=>!e.is_read).length)}else h([]),v(0);T(!1)}).catch(()=>{h([]),T(!1)})},F=()=>{O(ae),b(0),h([]),c===`imap`&&o?Oe(o,f,0,ae):ke(f||`INBOX`,ae)},I=e=>{S(e),le(!1),re(!0),c===`google`?E(`/api/imap/message?id=${encodeURIComponent(e)}`).then(t=>{t?.message&&(t.message.body_text||t.message.body_html)?(w({...t.message,id:e,_google:!0}),h(t=>t.map(t=>t.id===e?{...t,is_read:!0}:t)),re(!1)):D(`/api/email/read`,{messageId:e}).then(t=>{if(t?.message){let n=t.message;w({...t.message,body_text:n.body||n.body_text,body_html:n.body_html,from_address:n.from||n.from_address,id:e,_google:!0}),h(t=>t.map(t=>t.id===e?{...t,is_read:!0}:t)),D(`/api/email/mark-read`,{messageId:e}).catch(()=>{})}re(!1)}).catch(()=>re(!1))}).catch(()=>re(!1)):E(`/api/imap/message?id=${encodeURIComponent(e)}`).then(t=>{w(t?.message??null),h(t=>t.map(t=>t.id===e?{...t,is_read:!0}:t)),re(!1)}).catch(()=>re(!1))},Ae=(e={})=>{le(!0),de(e),fe(e.to??``),me(``),ge(e.subject??``),ve(e.type===`forward`&&e.body?`\n\n---------- Forwarded message ----------\n${e.body}`:``),be(``),Se(!1),S(null),w(null)},je=async()=>{if(!M.trim()){be(`Recipient required`);return}be(`Sending…`);try{if(c===`imap`&&o){let e=await D(`/api/imap/send`,{accountId:o,to:M.trim(),cc:pe.trim()||void 0,subject:he.trim(),bodyHtml:_e.replace(/\n/g,`<br>`),bodyText:_e,inReplyTo:ue.inReplyTo||void 0});e?.ok?(be(`Sent!`),setTimeout(()=>le(!1),800)):be(e?.error??`Error`)}else{let e=await D(`/api/email/send`,{to:M.trim(),subject:he.trim(),body:_e});e?.ok||e?.id?(be(`Sent!`),setTimeout(()=>le(!1),800)):be(e?.error??`Error`)}}catch(e){be(e.message??`Error`)}},Me=e=>{confirm(`Move to trash? Email stays on the server.`)&&D(`/api/imap/trash`,{messageId:e}).then(()=>{h(t=>t.filter(t=>t.id!==e)),w(null),S(null)})},Ne=(e,t)=>{D(`/api/imap/mark-starred`,{messageId:e,isStarred:t}).then(()=>{C?.id===e&&w(e=>e&&{...e,is_starred:t})})},Pe=(e,t)=>{t&&D(`/api/imap/labels/assign`,{messageId:e,labelId:t})},Fe=()=>{!N.trim()||!o||D(`/api/imap/labels`,{accountId:o,name:N.trim()}).then(()=>{Te(!1),Ce(``),E(`/api/imap/labels?accountId=${o}`).then(e=>d(e?.labels??[]))})},Ie=()=>{o&&c===`imap`&&D(`/api/imap/sync/${o}`,{})},Le=()=>{if(c===`google`){T(!0);let e=f||`INBOX`,t=m.length+50;E(`/api/emails?folder=${encodeURIComponent(e)}&page=0&pageSize=${t}`).then(e=>{let t=(e?.emails??[]).map(e=>({id:e.id,subject:e.subject,from_name:e.from,from_address:e.from,internal_date:e.date,body_preview:e.snippet,is_read:!e.isUnread,is_starred:!1,has_attachments:!1,_google:!0}));h(t),v(t.length),T(!1)}).catch(()=>T(!1))}else{let e=y+50;b(e),o&&Oe(o,f,e,ie)}};return(0,k.jsxs)(`div`,{className:H.root,children:[(0,k.jsxs)(`div`,{className:H.sidebar,children:[(0,k.jsxs)(`div`,{className:H.sidebarSection,children:[(0,k.jsx)(`div`,{className:H.sidebarLabel,children:`Account`}),(0,k.jsxs)(`select`,{className:H.accountSelect,value:c===`google`?`google`:`imap:${o}`,onChange:e=>{let t=e.target.value;t===`google`?De(`google`,`google`):t.startsWith(`imap:`)&&De(t.slice(5),`imap`)},children:[n&&(0,k.jsx)(`option`,{value:`google`,children:`Google (Gmail)`}),i.map(e=>(0,k.jsx)(`option`,{value:`imap:${e.id}`,children:e.display_name||e.email_address},e.id)),!n&&i.length===0&&(0,k.jsx)(`option`,{value:``,children:`No accounts — add in Settings`})]})]}),(0,k.jsx)(`div`,{className:H.sidebarCompose,children:(0,k.jsx)(`button`,{className:H.composeBtn,onClick:()=>Ae(),children:`+ Compose`})}),(0,k.jsx)(`div`,{className:H.folderList,children:c===`google`?Yt.map(e=>(0,k.jsxs)(`div`,{className:`${H.folderItem} ${f===e.id?H.folderActive:``}`,onClick:()=>{p(e.id),h([]),b(0),ke(e.id,ie)},children:[(0,k.jsx)(`span`,{children:e.icon}),(0,k.jsx)(`span`,{children:e.name}),e.id===`INBOX`&&oe>0&&(0,k.jsx)(`span`,{className:H.badge,children:oe})]},e.id)):(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(`div`,{className:H.labelHeader,children:[(0,k.jsx)(`span`,{children:`Labels`}),(0,k.jsx)(`button`,{className:H.addLabelBtn,onClick:()=>Te(e=>!e),children:`+`})]}),we&&(0,k.jsxs)(`div`,{className:H.newLabelRow,children:[(0,k.jsx)(`input`,{className:H.newLabelInput,value:N,onChange:e=>Ce(e.target.value),placeholder:`Label name`,onKeyDown:e=>e.key===`Enter`&&Fe()}),(0,k.jsx)(`button`,{className:H.newLabelSave,onClick:Fe,children:`+`})]}),u.map(e=>(0,k.jsxs)(`div`,{className:`${H.folderItem} ${f===e.id?H.folderActive:``}`,onClick:()=>{p(e.id),h([]),b(0),o&&Oe(o,e.id,0,ie)},children:[(0,k.jsx)(`span`,{className:H.labelDot,style:{background:e.color??`var(--dim)`}}),(0,k.jsx)(`span`,{children:e.name}),e.system_type===`inbox`&&e.unread_count?(0,k.jsx)(`span`,{className:H.badge,children:e.unread_count}):null]},e.id))]})}),c===`imap`&&o&&(0,k.jsx)(`div`,{className:H.syncArea,children:(0,k.jsx)(`button`,{className:H.syncBtn,onClick:Ie,children:`Sync now`})}),c===`google`&&(0,k.jsx)(`div`,{className:H.syncArea,children:(0,k.jsx)(`button`,{className:H.syncBtn,onClick:()=>{h([]),ke(f||`INBOX`,``)},children:`Refresh`})})]}),(0,k.jsxs)(`div`,{className:H.messageList,children:[(0,k.jsxs)(`div`,{className:H.listHeader,children:[(0,k.jsx)(`input`,{className:H.searchInput,value:ae,onChange:e=>A(e.target.value),placeholder:`Search…`,onKeyDown:e=>e.key===`Enter`&&F()}),(0,k.jsx)(`button`,{className:H.searchBtn,onClick:F,children:`Go`})]}),(0,k.jsxs)(`div`,{className:H.listBody,children:[ee&&(0,k.jsx)(`div`,{className:H.listLoading,children:(0,k.jsx)(`div`,{className:`spinner`})}),!ee&&m.length===0&&(0,k.jsx)(`div`,{className:H.noMessages,children:`No messages`}),m.map(e=>(0,k.jsxs)(`div`,{className:`${H.msgRow} ${e.id===x?H.msgActive:``} ${e.is_read?``:H.msgUnread}`,onClick:()=>I(e.id),children:[(0,k.jsxs)(`div`,{className:H.msgTop,children:[(0,k.jsx)(`span`,{className:H.msgFrom,children:e.from_name||e.from_address||``}),(0,k.jsx)(`span`,{className:H.msgDate,children:Zt(e.internal_date)})]}),(0,k.jsx)(`div`,{className:H.msgSubject,children:e.subject||`(no subject)`}),(0,k.jsx)(`div`,{className:H.msgPreview,children:(e.body_preview||``).slice(0,80)})]},e.id))]}),(0,k.jsxs)(`div`,{className:H.listFooter,children:[(0,k.jsxs)(`span`,{children:[g,` messages`]}),c===`imap`&&m.length<g&&(0,k.jsx)(`button`,{className:H.loadMoreBtn,onClick:Le,children:`Load more`}),c===`google`&&m.length>=50&&(0,k.jsx)(`button`,{className:H.loadMoreBtn,onClick:Le,disabled:ee,children:ee?`Loading...`:`Scarica altre`})]})]}),(0,k.jsx)(`div`,{className:H.pane,children:(()=>{if(ce)return(0,k.jsxs)(`div`,{className:H.composePane,children:[(0,k.jsx)(`div`,{className:H.composeTitle,children:e(`email.compose`)}),(0,k.jsx)(`input`,{className:H.composeField,value:M,onChange:e=>fe(e.target.value),placeholder:`To`}),(0,k.jsx)(`input`,{className:H.composeField,value:pe,onChange:e=>me(e.target.value),placeholder:`Cc`}),(0,k.jsx)(`input`,{className:H.composeField,value:he,onChange:e=>ge(e.target.value),placeholder:`Subject`}),(0,k.jsxs)(`div`,{className:H.templateRow,children:[(0,k.jsx)(`button`,{className:H.templateToggle,onClick:()=>Se(e=>!e),children:`📄 Templates`}),xe&&(0,k.jsx)(`div`,{className:H.templateDrop,children:Xt.map((e,t)=>(0,k.jsxs)(`div`,{className:H.templateItem,onClick:()=>{ge(t=>t||e.subject),Se(!1)},children:[(0,k.jsx)(`strong`,{children:e.name}),(0,k.jsx)(`div`,{className:H.templateSubject,children:e.subject})]},t))})]}),(0,k.jsx)(`textarea`,{className:H.composeBody,value:_e,onChange:e=>ve(e.target.value),placeholder:`Write your message…`}),(0,k.jsxs)(`div`,{className:H.composeActions,children:[(0,k.jsx)(`button`,{className:H.sendBtn,onClick:je,children:e(`email.send_ok`)}),(0,k.jsx)(`button`,{className:H.cancelBtn,onClick:()=>le(!1),children:`Discard`}),ye&&(0,k.jsx)(`span`,{className:`${H.compStatus} ${ye===`Sent!`?H.ok:H.err}`,children:ye})]})]});if(ne)return(0,k.jsx)(`div`,{className:H.emptyPane,children:(0,k.jsx)(`div`,{className:`spinner`})});if(!C)return(0,k.jsx)(`div`,{className:H.emptyPane,children:`Select a message`});let n=Qt(C.to_addresses);return(0,k.jsxs)(`div`,{className:H.readingPane,children:[(0,k.jsx)(`div`,{className:H.paneToolbar,children:(0,k.jsxs)(`div`,{className:H.paneActions,children:[(0,k.jsx)(`button`,{className:H.replyBtn,onClick:()=>Ae({to:C.from_address,subject:`Re: ${C.subject??``}`,inReplyTo:C.message_id??C.id,replyTo:C.id,type:`reply`}),children:e(`email.reply`)}),(0,k.jsx)(`button`,{className:H.fwdBtn,onClick:()=>Ae({subject:`Fwd: ${C.subject??``}`,type:`forward`,body:C.body_text??C.body_preview??``}),children:`Forward`}),!C._google&&(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)(`button`,{className:H.trashBtn,onClick:()=>Me(C.id),children:`🗑`}),(0,k.jsx)(`button`,{className:H.starBtn,onClick:()=>Ne(C.id,!C.is_starred),children:C.is_starred?`★`:`☆`}),u.length>0&&(0,k.jsxs)(`select`,{className:H.labelSelect,defaultValue:``,onChange:e=>Pe(C.id,e.target.value),children:[(0,k.jsx)(`option`,{value:``,children:`+ Label`}),u.map(e=>(0,k.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]}),(0,k.jsx)(`button`,{className:H.aiBtn,onClick:()=>t(`chat`),children:`Ask AI`})]})}),(0,k.jsxs)(`div`,{className:H.paneHeader,children:[(0,k.jsx)(`div`,{className:H.paneSubject,children:C.subject||`(no subject)`}),(0,k.jsxs)(`div`,{className:H.paneMeta,children:[(0,k.jsx)(`strong`,{children:`From:`}),` `,C.from_name&&C.from_name!==C.from_address?`${C.from_name} <${C.from_address}>`:C.from_address]}),(0,k.jsxs)(`div`,{className:H.paneMeta,children:[(0,k.jsx)(`strong`,{children:`To:`}),` `,n]}),(0,k.jsxs)(`div`,{className:H.paneMeta,children:[(0,k.jsx)(`strong`,{children:`Date:`}),` `,C.internal_date]}),C.attachments&&C.attachments.length>0&&(0,k.jsx)(`div`,{className:H.attachments,children:C.attachments.map((e,t)=>(0,k.jsxs)(`a`,{className:H.attachLink,href:`/api/imap/attachment?messageId=${encodeURIComponent(C.id)}&partId=${encodeURIComponent(e.part_id??``)}&accountId=${encodeURIComponent(o??``)}`,download:e.filename??`attachment`,children:[`📎 `,e.filename??`attachment`,` (`,Math.round((e.size_bytes??0)/1024),`KB)`]},t))})]}),(0,k.jsx)(`div`,{className:H.paneBody,children:C.body_html?(0,k.jsx)(`iframe`,{ref:Ee,sandbox:`allow-same-origin`,className:H.bodyFrame,srcDoc:C.body_html,title:`Email body`}):(0,k.jsx)(`pre`,{className:H.bodyText,children:C.body_text??C.body_preview??`(empty)`})})]})})()})]})}var U={root:`_root_7ur7d_1`,center:`_center_7ur7d_9`,noGoogle:`_noGoogle_7ur7d_16`,noGoogleIcon:`_noGoogleIcon_7ur7d_25`,noGoogleTitle:`_noGoogleTitle_7ur7d_26`,noGoogleSub:`_noGoogleSub_7ur7d_27`,connectBtn:`_connectBtn_7ur7d_29`,calCol:`_calCol_7ur7d_41`,navRow:`_navRow_7ur7d_49`,navBtn:`_navBtn_7ur7d_57`,monthTitle:`_monthTitle_7ur7d_70`,dayHeaders:`_dayHeaders_7ur7d_78`,dayHeader:`_dayHeader_7ur7d_78`,weekend:`_weekend_7ur7d_94`,grid:`_grid_7ur7d_96`,cell:`_cell_7ur7d_105`,emptyCell:`_emptyCell_7ur7d_119`,weekendCell:`_weekendCell_7ur7d_121`,todayCell:`_todayCell_7ur7d_122`,activeCell:`_activeCell_7ur7d_123`,hasEvtsCell:`_hasEvtsCell_7ur7d_124`,holidayCell:`_holidayCell_7ur7d_125`,dayNum:`_dayNum_7ur7d_127`,todayNum:`_todayNum_7ur7d_134`,weekendNum:`_weekendNum_7ur7d_135`,evtPills:`_evtPills_7ur7d_137`,evtPill:`_evtPill_7ur7d_137`,holidayPill:`_holidayPill_7ur7d_158`,morePill:`_morePill_7ur7d_160`,loadingBar:`_loadingBar_7ur7d_166`,detailCol:`_detailCol_7ur7d_175`,detailHeader:`_detailHeader_7ur7d_187`,detailDate:`_detailDate_7ur7d_197`,addEvtBtn:`_addEvtBtn_7ur7d_203`,noEvts:`_noEvts_7ur7d_218`,selectDay:`_selectDay_7ur7d_225`,evtCard:`_evtCard_7ur7d_233`,evtTop:`_evtTop_7ur7d_246`,evtTime:`_evtTime_7ur7d_253`,evtBtns:`_evtBtns_7ur7d_259`,editBtn:`_editBtn_7ur7d_265`,delBtn:`_delBtn_7ur7d_278`,readOnly:`_readOnly_7ur7d_291`,evtTitle:`_evtTitle_7ur7d_300`,evtLoc:`_evtLoc_7ur7d_306`,evtMeta:`_evtMeta_7ur7d_307`,attendees:`_attendees_7ur7d_309`,attendee:`_attendee_7ur7d_309`,evtDesc:`_evtDesc_7ur7d_320`,joinBtn:`_joinBtn_7ur7d_330`,gcalLink:`_gcalLink_7ur7d_337`,overlay:`_overlay_7ur7d_344`,formCard:`_formCard_7ur7d_354`,formTitle:`_formTitle_7ur7d_368`,formLabel:`_formLabel_7ur7d_375`,formInput:`_formInput_7ur7d_381`,formTextarea:`_formTextarea_7ur7d_394`,formError:`_formError_7ur7d_410`,formBtns:`_formBtns_7ur7d_415`,cancelFormBtn:`_cancelFormBtn_7ur7d_422`,saveFormBtn:`_saveFormBtn_7ur7d_432`};function en(e,t,n){return`${e}-${String(t+1).padStart(2,`0`)}-${String(n).padStart(2,`0`)}`}function tn(e,t,n){let r=new Date;return r.getFullYear()===e&&r.getMonth()===t&&r.getDate()===n}function nn(e){if(!e)return``;let t=new Date(e);return isNaN(t.getTime())?e.slice(11,16):t.toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`})}function rn(){let e=j(),t=te(e=>e.setView),[n,r]=(0,_.useState)(null),i=new Date,[a,o]=(0,_.useState)(i.getFullYear()),[s,c]=(0,_.useState)(i.getMonth()),[l,u]=(0,_.useState)({}),[d,f]=(0,_.useState)(!1),[p,m]=(0,_.useState)(null),[h,g]=(0,_.useState)(null),[v,y]=(0,_.useState)(``),[b,x]=(0,_.useState)(!1);(0,_.useEffect)(()=>{E(`/api/config`).then(e=>r(!!e?.hasGoogle))},[]);let S=(0,_.useCallback)((e,t)=>{let n=`${e}-${String(t+1).padStart(2,`0`)}`;f(!0),E(`/api/calendar?month=${n}`).then(e=>{e?.byDate&&u(t=>({...t,...e.byDate})),f(!1)}).catch(()=>f(!1))},[]);(0,_.useEffect)(()=>{n&&S(a,s)},[n,a,s,S]);let C=e=>{E(`/api/calendar?date=${e}`).then(t=>{u(n=>({...n,[e]:t?.events??[]}))})},w=(e,t,n)=>{confirm(`Delete this event?`)&&D(`/api/calendar/${encodeURIComponent(e)}/${encodeURIComponent(t)}`,{},`DELETE`).then(()=>C(n))},ee=e=>{g({title:``,start:`${e}T09:00`,end:`${e}T10:00`,location:``,description:``,isEdit:!1}),y(``)},T=(e,t)=>{let n=e.start?e.start.slice(0,16):`${t}T09:00`,r=e.end?e.end.slice(0,16):`${t}T10:00`;g({id:e.id,calId:e.calendarId??`primary`,title:e.summary,start:n,end:r,location:e.location??``,description:e.description??``,isEdit:!0}),y(``)},ne=async()=>{if(h){if(!h.title.trim()){y(`Title is required`);return}x(!0);try{if(h.isEdit&&h.id){let e=h.calId??`primary`;await D(`/api/calendar/${encodeURIComponent(e)}/${encodeURIComponent(h.id)}`,{summary:h.title,start:h.start,end:h.end,location:h.location||void 0,description:h.description||void 0},`PATCH`)}else{let e=h.start.split(`T`)[0];await D(`/api/calendar`,{summary:h.title,start:h.start,end:h.end,location:h.location||void 0,description:h.description||void 0,date:e})}let e=h.start.split(`T`)[0];C(e),g(null)}catch(e){y(`Error: `+(e.message??`Unknown`))}finally{x(!1)}}};if(n===null)return(0,k.jsx)(`div`,{className:U.center,children:(0,k.jsx)(`div`,{className:`spinner`})});if(!n)return(0,k.jsx)(`div`,{className:U.center,children:(0,k.jsxs)(`div`,{className:U.noGoogle,children:[(0,k.jsx)(`div`,{className:U.noGoogleIcon,children:`📅`}),(0,k.jsx)(`div`,{className:U.noGoogleTitle,children:`Calendar`}),(0,k.jsx)(`div`,{className:U.noGoogleSub,children:`Connect your Google account to view and manage calendar events.`}),(0,k.jsx)(`button`,{className:U.connectBtn,onClick:()=>t(`settings`),children:`Connect Google →`})]})});let re=new Date(a,s,1).getDay(),ie=new Date(a,s+1,0).getDate(),O=new Date(a,s,1).toLocaleDateString(`en`,{month:`long`,year:`numeric`}),ae=(re+6)%7,A=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],oe=p?l[p]??[]:[];return(0,k.jsxs)(`div`,{className:U.root,children:[(0,k.jsxs)(`div`,{className:U.calCol,children:[(0,k.jsxs)(`div`,{className:U.navRow,children:[(0,k.jsx)(`button`,{className:U.navBtn,onClick:()=>{let e=s-1;e<0?(o(e=>e-1),c(11)):c(e)},children:`←`}),(0,k.jsx)(`div`,{className:U.monthTitle,children:O}),(0,k.jsx)(`button`,{className:U.navBtn,onClick:()=>{let e=s+1;e>11?(o(e=>e+1),c(0)):c(e)},children:`→`})]}),(0,k.jsx)(`div`,{className:U.dayHeaders,children:A.map((e,t)=>(0,k.jsx)(`div`,{className:`${U.dayHeader} ${t>=5?U.weekend:``}`,children:e},e))}),(0,k.jsxs)(`div`,{className:U.grid,children:[Array.from({length:ae}).map((e,t)=>(0,k.jsx)(`div`,{className:`${U.cell} ${U.emptyCell} ${t>=5?U.weekendCell:``}`},`e${t}`)),Array.from({length:ie}).map((e,t)=>{let n=t+1,r=en(a,s,n),i=tn(a,s,n),o=l[r]??[],c=o.length,u=(ae+n-1)%7>=5,d=o.some(e=>e._isHoliday||e.readOnly),f=p===r;return(0,k.jsxs)(`div`,{className:`${U.cell} ${i?U.todayCell:u?U.weekendCell:``} ${f?U.activeCell:``} ${d?U.holidayCell:c>0?U.hasEvtsCell:``}`,onClick:()=>m(r),children:[(0,k.jsx)(`div`,{className:`${U.dayNum} ${i?U.todayNum:u?U.weekendNum:``}`,children:n}),c>0&&(0,k.jsxs)(`div`,{className:U.evtPills,children:[o.slice(0,2).map((e,t)=>(0,k.jsx)(`div`,{className:`${U.evtPill} ${e._isHoliday||e.readOnly?U.holidayPill:``}`,children:e.summary},t)),c>2&&(0,k.jsxs)(`div`,{className:U.morePill,children:[`+`,c-2]})]})]},r)})]}),d&&(0,k.jsx)(`div`,{className:U.loadingBar,children:`Loading events…`})]}),(0,k.jsx)(`div`,{className:U.detailCol,children:p?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(`div`,{className:U.detailHeader,children:[(0,k.jsx)(`div`,{className:U.detailDate,children:new Date(p+`T12:00:00`).toLocaleDateString(`en`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}),(0,k.jsx)(`button`,{className:U.addEvtBtn,onClick:()=>ee(p),children:`+ Add Event`})]}),oe.length===0?(0,k.jsx)(`div`,{className:U.noEvts,children:`No events on this day`}):oe.map((t,n)=>{let r=t.isAllDay?`All day`:`${nn(t.start)} - ${nn(t.end)}`,i=t.calendarId??`primary`;return(0,k.jsxs)(`div`,{className:U.evtCard,children:[(0,k.jsxs)(`div`,{className:U.evtTop,children:[(0,k.jsx)(`div`,{className:U.evtTime,children:r}),t.id&&!t.readOnly&&(0,k.jsxs)(`div`,{className:U.evtBtns,children:[(0,k.jsx)(`button`,{className:U.editBtn,onClick:()=>T(t,p),children:`Edit`}),(0,k.jsx)(`button`,{className:U.delBtn,onClick:()=>w(i,t.id,p),children:e(`common.delete`)})]}),t.readOnly&&(0,k.jsx)(`span`,{className:U.readOnly,children:`read-only`})]}),(0,k.jsx)(`div`,{className:U.evtTitle,children:t.summary}),t.location&&(0,k.jsxs)(`div`,{className:U.evtLoc,children:[`📍 `,t.location]}),t.organizer&&(0,k.jsxs)(`div`,{className:U.evtMeta,children:[`Organizer: `,t.organizer]}),t.attendees&&t.attendees.length>0&&(0,k.jsxs)(`div`,{className:U.attendees,children:[(0,k.jsx)(`div`,{className:U.evtMeta,children:`Attendees:`}),t.attendees.map((e,t)=>(0,k.jsxs)(`div`,{className:U.attendee,"data-status":e.responseStatus,children:[e.name||e.email,` (`,e.responseStatus,`)`]},t))]}),t.description&&(0,k.jsx)(`div`,{className:U.evtDesc,children:t.description}),t.hangoutLink&&(0,k.jsx)(`a`,{className:U.joinBtn,href:t.hangoutLink,target:`_blank`,rel:`noreferrer`,children:`Join Video Call`}),t.htmlLink&&(0,k.jsx)(`a`,{className:U.gcalLink,href:t.htmlLink,target:`_blank`,rel:`noreferrer`,children:`Open in Google Calendar`})]},n)})]}):(0,k.jsxs)(`div`,{className:U.selectDay,children:[`Click a day to see events, edit or delete them.`,(0,k.jsx)(`br`,{}),(0,k.jsx)(`br`,{}),`Use `,(0,k.jsx)(`strong`,{children:`+ Add Event`}),` to create a new event — it syncs with Google Calendar.`]})}),h&&(0,k.jsx)(`div`,{className:U.overlay,onClick:e=>{e.target===e.currentTarget&&g(null)},children:(0,k.jsxs)(`div`,{className:U.formCard,children:[(0,k.jsx)(`div`,{className:U.formTitle,children:h.isEdit?`Edit Event`:`New Event`}),(0,k.jsx)(`label`,{className:U.formLabel,children:`Title *`}),(0,k.jsx)(`input`,{className:U.formInput,value:h.title,onChange:e=>g(t=>t&&{...t,title:e.target.value}),placeholder:`Event title`}),(0,k.jsx)(`label`,{className:U.formLabel,children:`Start`}),(0,k.jsx)(`input`,{className:U.formInput,type:`datetime-local`,value:h.start,onChange:e=>g(t=>t&&{...t,start:e.target.value})}),(0,k.jsx)(`label`,{className:U.formLabel,children:`End`}),(0,k.jsx)(`input`,{className:U.formInput,type:`datetime-local`,value:h.end,onChange:e=>g(t=>t&&{...t,end:e.target.value})}),(0,k.jsx)(`label`,{className:U.formLabel,children:`Location`}),(0,k.jsx)(`input`,{className:U.formInput,value:h.location,onChange:e=>g(t=>t&&{...t,location:e.target.value}),placeholder:`Optional`}),(0,k.jsx)(`label`,{className:U.formLabel,children:`Description`}),(0,k.jsx)(`textarea`,{className:U.formTextarea,value:h.description,onChange:e=>g(t=>t&&{...t,description:e.target.value})}),v&&(0,k.jsx)(`div`,{className:U.formError,children:v}),(0,k.jsxs)(`div`,{className:U.formBtns,children:[(0,k.jsx)(`button`,{className:U.cancelFormBtn,onClick:()=>g(null),children:e(`common.cancel`)}),(0,k.jsx)(`button`,{className:U.saveFormBtn,onClick:ne,disabled:b,children:b?`Saving…`:h.isEdit?`Save Changes`:`Create Event`})]})]})})]})}var W={root:`_root_1tngw_1`,gridSection:`_gridSection_1tngw_9`,gridHeader:`_gridHeader_1tngw_14`,headerRow:`_headerRow_1tngw_21`,search:`_search_1tngw_23`,createBtn:`_createBtn_1tngw_34`,catTabs:`_catTabs_1tngw_41`,catTab:`_catTab_1tngw_41`,catActive:`_catActive_1tngw_48`,grid:`_grid_1tngw_9`,agentCard:`_agentCard_1tngw_59`,agentActive:`_agentActive_1tngw_66`,agentCardTop:`_agentCardTop_1tngw_68`,agentIcon:`_agentIcon_1tngw_69`,agentActions:`_agentActions_1tngw_70`,agentEditBtn:`_agentEditBtn_1tngw_71`,agentDelBtn:`_agentDelBtn_1tngw_71`,agentLabel:`_agentLabel_1tngw_74`,agentDesc:`_agentDesc_1tngw_75`,agentCat:`_agentCat_1tngw_76`,loading:`_loading_1tngw_78`,chatArea:`_chatArea_1tngw_81`,emptyChat:`_emptyChat_1tngw_88`,emptyChatHint:`_emptyChatHint_1tngw_98`,chatPanel:`_chatPanel_1tngw_101`,chatHeader:`_chatHeader_1tngw_111`,chatIcon:`_chatIcon_1tngw_118`,chatHeaderInfo:`_chatHeaderInfo_1tngw_119`,chatAgentName:`_chatAgentName_1tngw_120`,chatAgentDesc:`_chatAgentDesc_1tngw_121`,closeChat:`_closeChat_1tngw_122`,chatMessages:`_chatMessages_1tngw_125`,chatEmpty:`_chatEmpty_1tngw_130`,chatMsg:`_chatMsg_1tngw_132`,msgUser:`_msgUser_1tngw_136`,msgAgent:`_msgAgent_1tngw_137`,thinking:`_thinking_1tngw_139`,dot:`_dot_1tngw_140`,dotPulse:`_dotPulse_1tngw_1`,chatInput:`_chatInput_1tngw_146`,chatTools:`_chatTools_1tngw_147`,toolBtn:`_toolBtn_1tngw_148`,toolBtnActive:`_toolBtnActive_1tngw_156`,attachBar:`_attachBar_1tngw_158`,attachClear:`_attachClear_1tngw_163`,chatInputRow:`_chatInputRow_1tngw_165`,chatTextarea:`_chatTextarea_1tngw_166`,sendBtn:`_sendBtn_1tngw_173`,orchBar:`_orchBar_1tngw_181`,orchLabel:`_orchLabel_1tngw_192`,orchRow:`_orchRow_1tngw_193`,orchInput:`_orchInput_1tngw_194`,orchBtn:`_orchBtn_1tngw_201`,orchSynthesis:`_orchSynthesis_1tngw_208`,orchSynthHeader:`_orchSynthHeader_1tngw_214`,orchSynthSpinner:`_orchSynthSpinner_1tngw_220`,blink:`_blink_1tngw_1`,orchSynthBody:`_orchSynthBody_1tngw_222`,modalOverlay:`_modalOverlay_1tngw_230`,modal:`_modal_1tngw_230`,modalTitle:`_modalTitle_1tngw_232`,formField:`_formField_1tngw_233`,formLabel:`_formLabel_1tngw_234`,formInput:`_formInput_1tngw_235`,formTextarea:`_formTextarea_1tngw_236`,formError:`_formError_1tngw_237`,modalBtns:`_modalBtns_1tngw_238`,cancelBtn:`_cancelBtn_1tngw_239`,modalSaveBtn:`_modalSaveBtn_1tngw_240`},an={saber:{icon:`🛡`},zero:{icon:`🔍`},ade:{icon:`🔬`},heimdall:{icon:`🔒`},cassandra:{icon:`⚠`},sauron:{icon:`👁`},jarvis:{icon:`💻`},forge:{icon:`⚙`},pipe:{icon:`🔧`},shell:{icon:`📟`},glitch:{icon:`🐛`},hermes:{icon:`🔗`},babel:{icon:`🌎`},shogun:{icon:`☸`},flux:{icon:`🔄`},cron:{icon:`⏰`},atlas:{icon:`🗺`},oracle:{icon:`📊`},logos:{icon:`🧮`},navi:{icon:`🧭`},edi:{icon:`📈`},mercury:{icon:`🌐`},tempest:{icon:`⛈`},cartographer:{icon:`🌍`},scheherazade:{icon:`✍`},quill:{icon:`📝`},muse:{icon:`🎨`},murasaki:{icon:`🖌`},echo:{icon:`📡`},polyglot:{icon:`🗣`},prometheus:{icon:`🔥`},herald:{icon:`📢`},veritas:{icon:`✓`},athena:{icon:`🧠`},conductor:{icon:`🎼`},link:{icon:`🔌`},macro:{icon:`⚡`},epicure:{icon:`🍽`}};function on(e){let t=e.card??e,n=(t.name||t.displayName||t.agentName||e.name||``).toLowerCase().replace(/\s+/g,`-`),r=an[n],i=t.displayName||t.agentName||t.name||e.displayName||n,a=t.tagline||t.description||e.tagline||``,o=t.category||e.category||`Other`;return{id:n,icon:r?.icon??t.icon??`🤖`,label:i,description:a,category:o,isCustom:o===`custom`,systemPrompt:e.systemPrompt}}function sn(e){return{agent:e,history:[],streaming:!1,input:``,attachedFile:null,attachedImage:null,voiceActive:!1}}function cn(){let e=j(),[t,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(!0),[a,o]=(0,_.useState)(``),[s,c]=(0,_.useState)(`All`),[l,u]=(0,_.useState)([]),[d,f]=(0,_.useState)(``),[p,m]=(0,_.useState)(!1),[h,g]=(0,_.useState)(``),[v,y]=(0,_.useState)(!1),[b,x]=(0,_.useState)(null),[S,C]=(0,_.useState)(`create`),[w,ee]=(0,_.useState)(``),[T,te]=(0,_.useState)(!1),ne=(0,_.useRef)(new Map),re=(0,_.useRef)(new Map),O=(0,_.useRef)(new Map),ae=(0,_.useRef)(new Map),A=(0,_.useRef)(new Map),oe=(0,_.useRef)(null),se=()=>{E(`/api/agents`).then(e=>{n((e?.agents??[]).map(on)),i(!1)}).catch(()=>i(!1))};(0,_.useEffect)(()=>{se()},[]);let ce=[`All`,...Array.from(new Set(t.map(e=>e.category))).sort()],le=t.filter(e=>{let t=s===`All`||e.category===s,n=a.toLowerCase();return t&&(!n||e.label.toLowerCase().includes(n)||e.description.toLowerCase().includes(n))}),ue=e=>{u(t=>{let n=t.findIndex(t=>t.agent.id===e.id);return n>=0?(re.current.get(e.id)?.abort(),re.current.delete(e.id),t.filter((e,t)=>t!==n)):[...t,sn(e)]})},de=e=>{re.current.get(e)?.abort(),re.current.delete(e),u(t=>t.filter(t=>t.agent.id!==e))},M=(e,t)=>{u(n=>n.map(n=>n.agent.id===e?{...n,...t}:n))},fe=(e,t)=>{u(n=>n.map(n=>n.agent.id===e?{...n,history:[...n.history,t]}:n))},pe=(e,t)=>{u(n=>n.map(n=>{if(n.agent.id!==e)return n;let r=[...n.history];return r[r.length-1]={...r[r.length-1],content:t},{...n,history:r}}))},me=async(e,t,n,r)=>{let i=e.agent.id;if(!t.trim()&&!n&&!r)return;fe(i,{role:`user`,content:n?(t?t+` `:``)+`[File: ${n.name}]`:r?(t?t+` `:``)+`[Image: ${r.name}]`:t}),M(i,{streaming:!0,input:``,attachedFile:null,attachedImage:null});let a=e.history.slice(-20);if(n||r){try{let e={message:t||`Analyze this`,agent:i};n?.isPDF&&n.base64?(e.pdfBase64=n.base64,e.pdfName=n.name):n?.content&&(e.fileContent=n.content,e.fileName=n.name),r?.base64&&(e.imageBase64=r.base64,e.imageMimeType=r.mimeType??`image/jpeg`);let a=await D(`/api/chat`,e);fe(i,{role:`assistant`,content:a?.response||a?.content||``})}catch{fe(i,{role:`assistant`,content:`Error sending attachment.`})}M(i,{streaming:!1});return}fe(i,{role:`assistant`,content:``,streaming:!0});let o=new AbortController;re.current.set(i,o);let s=``;try{await ie(`/api/chat/stream`,{message:t,agent:i,history:a,_agentSystemPrompt:e.agent.systemPrompt},e=>{s+=e,pe(i,s);let t=O.current.get(i);t&&(t.scrollTop=t.scrollHeight)},o.signal)}catch{}finally{M(i,{streaming:!1}),re.current.delete(i)}},he=async()=>{let e=d.trim();if(!e||p||l.length===0)return;f(``),m(!0),g(``);let t=[];if(await Promise.all(l.map(async n=>{let r=n.agent.id;fe(r,{role:`user`,content:e}),M(r,{streaming:!0});let i=``,a=new AbortController;re.current.set(r,a),fe(r,{role:`assistant`,content:``,streaming:!0});try{await ie(`/api/chat/stream`,{message:e,agent:r,history:n.history.slice(-20),_agentSystemPrompt:n.agent.systemPrompt},e=>{i+=e,pe(r,i);let t=O.current.get(r);t&&(t.scrollTop=t.scrollHeight)},a.signal)}catch{}finally{M(r,{streaming:!1}),re.current.delete(r)}t.push({agentId:r,agentLabel:n.agent.label,icon:n.agent.icon,content:i})})),m(!1),t.length<2)return;y(!0);let n=t.map(e=>`## ${e.icon} ${e.agentLabel}\n${e.content}`).join(`
655
655
 
656
656
  ---
@@ -8,7 +8,7 @@
8
8
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
9
9
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
10
10
  <title>NHA — NotHumanAllowed</title>
11
- <script type="module" crossorigin src="/assets/index-DTy-ohQm.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-BAw59tZG.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-DnJMrYkq.css">
13
13
  </head>
14
14
  <body>