nerhia 1.0.10 → 1.0.11
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/dist/index.js +112 -68
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,44 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __esm = (fn, res) => function __init() {
|
|
5
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
|
-
};
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
// src/services/liza.ts
|
|
13
|
-
var liza_exports = {};
|
|
14
|
-
__export(liza_exports, {
|
|
15
|
-
fetchLizaRealtime: () => fetchLizaRealtime
|
|
16
|
-
});
|
|
17
|
-
async function fetchLizaRealtime() {
|
|
18
|
-
const res = await fetch(
|
|
19
|
-
"https://api.openaq.org/v3/locations/25/latest",
|
|
20
|
-
{ headers: { "X-API-Key": "8401ef9a7ba8c1c7af76cc82869201b6213905b9224ce18f7639aa221a3336b9" } }
|
|
21
|
-
);
|
|
22
|
-
const data = await res.json();
|
|
23
|
-
const ahora = /* @__PURE__ */ new Date();
|
|
24
|
-
const recientes = data.results.filter((r) => {
|
|
25
|
-
const fecha = new Date(r.datetime.utc);
|
|
26
|
-
return ahora.getTime() - fecha.getTime() < 24 * 60 * 60 * 1e3;
|
|
27
|
-
});
|
|
28
|
-
const pm10 = recientes.find((r) => r.sensorsId === 1047)?.value || 0;
|
|
29
|
-
const pm25 = recientes.find((r) => r.sensorsId === 1044)?.value || 0;
|
|
30
|
-
return {
|
|
31
|
-
pm10,
|
|
32
|
-
pm25,
|
|
33
|
-
timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString("es-CL"),
|
|
34
|
-
alerta: pm10 > 150 ? "CRITICO" : pm10 > 100 ? "ALERTA" : "NORMAL",
|
|
35
|
-
source: "LIZA/SINCA - Parque OHiggins"
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
var init_liza = __esm({
|
|
39
|
-
"src/services/liza.ts"() {
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
2
|
|
|
43
3
|
// src/index.js
|
|
44
4
|
import { Command as Command2 } from "commander";
|
|
@@ -598,6 +558,52 @@ function sleep(ms) {
|
|
|
598
558
|
|
|
599
559
|
// src/commands/status.js
|
|
600
560
|
import pc3 from "picocolors";
|
|
561
|
+
|
|
562
|
+
// src/services/liza.js
|
|
563
|
+
async function fetchLizaRealtime() {
|
|
564
|
+
const res = await fetch(
|
|
565
|
+
"https://api.openaq.org/v3/locations/25/latest",
|
|
566
|
+
{ headers: { "X-API-Key": "8401ef9a7ba8c1c7af76cc82869201b6213905b9224ce18f7639aa221a3336b9" } }
|
|
567
|
+
);
|
|
568
|
+
const data = await res.json();
|
|
569
|
+
const ahora = /* @__PURE__ */ new Date();
|
|
570
|
+
const recientes = data.results.filter((r) => {
|
|
571
|
+
const fecha = new Date(r.datetime.utc);
|
|
572
|
+
return ahora.getTime() - fecha.getTime() < 24 * 60 * 60 * 1e3;
|
|
573
|
+
});
|
|
574
|
+
const pm10 = recientes.find((r) => r.sensorsId === 1047)?.value || 0;
|
|
575
|
+
const pm25 = recientes.find((r) => r.sensorsId === 1044)?.value || 0;
|
|
576
|
+
return {
|
|
577
|
+
pm10,
|
|
578
|
+
pm25,
|
|
579
|
+
timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString("es-CL"),
|
|
580
|
+
alerta: pm10 > 150 ? "CRITICO" : pm10 > 100 ? "ALERTA" : "NORMAL",
|
|
581
|
+
source: "LIZA/SINCA - Parque OHiggins"
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// src/services/core.js
|
|
586
|
+
var CORE_BASE = typeof process !== "undefined" && process.env.VIBRAALTO_CORE_URL || "https://us-central1-vibraaltoai-11f55.cloudfunctions.net/api";
|
|
587
|
+
async function fetchCoreHealth() {
|
|
588
|
+
try {
|
|
589
|
+
var res = await fetch(CORE_BASE + "/core/health", { signal: AbortSignal.timeout(3e3) });
|
|
590
|
+
if (!res.ok) return { ok: false, error: "http_" + res.status };
|
|
591
|
+
return await res.json();
|
|
592
|
+
} catch {
|
|
593
|
+
return { ok: false, error: "offline" };
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
async function fetchCoreAirContext() {
|
|
597
|
+
try {
|
|
598
|
+
var res = await fetch(CORE_BASE + "/core/air-context", { signal: AbortSignal.timeout(3e3) });
|
|
599
|
+
if (!res.ok) return { ok: false, error: "http_" + res.status };
|
|
600
|
+
return await res.json();
|
|
601
|
+
} catch {
|
|
602
|
+
return { ok: false, error: "offline" };
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// src/commands/status.js
|
|
601
607
|
var SONDAS_DEMO = [
|
|
602
608
|
{ id: "correa-01a", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: "ok", zone: "transporte" },
|
|
603
609
|
{ id: "edificio-f3", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: "ok", zone: "edificio" },
|
|
@@ -606,59 +612,97 @@ var SONDAS_DEMO = [
|
|
|
606
612
|
{ id: "silo-mts", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: "critical", zone: "chancado" }
|
|
607
613
|
];
|
|
608
614
|
async function status(opts) {
|
|
609
|
-
|
|
615
|
+
var config = readConfig();
|
|
610
616
|
if (!config) {
|
|
611
617
|
console.log(pc3.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
612
618
|
process.exit(1);
|
|
613
619
|
}
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
620
|
+
var lang = config.lang || "es";
|
|
621
|
+
var sondas = addJitter(SONDAS_DEMO);
|
|
622
|
+
var maxPM = Math.max.apply(null, sondas.map(function(s) {
|
|
623
|
+
return s.pm10;
|
|
624
|
+
}));
|
|
625
|
+
var avgPM = Math.round(sondas.reduce(function(a, s) {
|
|
626
|
+
return a + s.pm10;
|
|
627
|
+
}, 0) / sondas.length);
|
|
628
|
+
var critCount = sondas.filter(function(s) {
|
|
629
|
+
return s.status === "critical";
|
|
630
|
+
}).length;
|
|
631
|
+
var liza = null;
|
|
632
|
+
var coreHealth = null;
|
|
633
|
+
var coreAir = null;
|
|
634
|
+
var [lizaResult, coreHealthResult, coreAirResult] = await Promise.allSettled([
|
|
635
|
+
fetchLizaRealtime(),
|
|
636
|
+
fetchCoreHealth(),
|
|
637
|
+
fetchCoreAirContext()
|
|
638
|
+
]);
|
|
639
|
+
if (lizaResult.status === "fulfilled" && lizaResult.value?.ok) liza = lizaResult.value;
|
|
640
|
+
if (coreHealthResult.status === "fulfilled" && coreHealthResult.value?.ok) coreHealth = coreHealthResult.value;
|
|
641
|
+
if (coreAirResult.status === "fulfilled" && coreAirResult.value?.ok) coreAir = coreAirResult.value;
|
|
642
|
+
if (opts.json) {
|
|
643
|
+
console.log(JSON.stringify({
|
|
644
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
645
|
+
sondas_total: config.sondas,
|
|
646
|
+
sondas_data: sondas,
|
|
647
|
+
pm10_max: maxPM,
|
|
648
|
+
pm10_avg: avgPM,
|
|
649
|
+
critical_zones: critCount,
|
|
650
|
+
liza,
|
|
651
|
+
core: coreHealth,
|
|
652
|
+
core_air: coreAir,
|
|
653
|
+
system: "operational"
|
|
654
|
+
}, null, 2));
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
619
657
|
console.log("");
|
|
620
658
|
console.log(pc3.yellow(" \u25C8 ") + pc3.bold(pc3.white(t(lang, "status_header"))));
|
|
621
659
|
console.log(pc3.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
622
660
|
console.log("");
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
661
|
+
var maxSonda = sondas.reduce(function(a, b) {
|
|
662
|
+
return a.pm10 > b.pm10 ? a : b;
|
|
663
|
+
});
|
|
664
|
+
var maxColor = maxPM > 300 ? pc3.red : maxPM > 150 ? pc3.yellow : pc3.green;
|
|
665
|
+
var avgColor = avgPM > 200 ? pc3.red : avgPM > 100 ? pc3.yellow : pc3.green;
|
|
626
666
|
row(" " + t(lang, "status_sondas"), config.sondas + " " + t(lang, "status_connected"), pc3.green("\u25CF " + t(lang, "status_online")));
|
|
627
667
|
row(" " + t(lang, "status_pm_max"), maxColor(maxPM + " \xB5g/m\xB3"), pc3.dim(maxSonda.id) + " " + dot(maxSonda.status, lang));
|
|
628
668
|
row(" " + t(lang, "status_pm_avg"), avgColor(avgPM + " \xB5g/m\xB3"), pc3.dim("flota") + " " + (avgPM > 150 ? dot("warning", lang) : dot("ok", lang)));
|
|
629
669
|
row(" " + t(lang, "status_suppress"), critCount + " " + t(lang, "status_zones_active"), "");
|
|
630
670
|
row(" " + t(lang, "status_ledger"), "1,247 " + t(lang, "status_events_today"), "");
|
|
631
671
|
row(" " + t(lang, "status_last_action"), t(lang, "status_ago") + " 12 " + t(lang, "status_seconds"), "");
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
const lizaAlert = liza.alerta === "CRITICO" ? pc3.red("\u25CF " + liza.alerta) : liza.alerta === "ALERTA" ? pc3.yellow("\u25CF " + liza.alerta) : pc3.green("\u25CF " + liza.alerta);
|
|
636
|
-
row(" \u{1F310} LIZA/SINCA", "PM10: " + liza.pm10 + " | PM2.5: " + liza.pm25, lizaAlert);
|
|
672
|
+
if (liza) {
|
|
673
|
+
var lizaColor = liza.alerta === "CR\xCDTICO" ? pc3.red : liza.alerta === "ALERTA" ? pc3.yellow : pc3.green;
|
|
674
|
+
row(" U0001f310 LIZA/SINCA", "PM10: " + liza.pm10 + " | PM2.5: " + liza.pm25, lizaColor("\u25CF " + liza.alerta));
|
|
637
675
|
console.log(pc3.dim(" Fuente: " + liza.source));
|
|
638
|
-
}
|
|
639
|
-
row("
|
|
676
|
+
} else {
|
|
677
|
+
row(" U0001f310 LIZA/SINCA", "sin conexi\xF3n", pc3.dim("\u25CF offline"));
|
|
640
678
|
}
|
|
641
679
|
if (coreHealth) {
|
|
642
|
-
row("
|
|
680
|
+
row(" U0001f9e0 VIBRAALTO CORE", "conectado", pc3.green("\u25CF online"));
|
|
643
681
|
if (coreAir) {
|
|
644
682
|
var coreColor = coreAir.recommendation === "CRITICO" ? pc3.red : coreAir.recommendation === "ALERTA" ? pc3.yellow : pc3.green;
|
|
645
|
-
console.log(pc3.dim("
|
|
646
|
-
console.log(pc3.dim(" Recomendacion: ") + coreColor(coreAir.recommendation));
|
|
683
|
+
console.log(pc3.dim(" Core: PM10 ref " + coreAir.pm10_reference + " | PM2.5 ref " + coreAir.pm25_reference + " " + coreAir.recommendation));
|
|
647
684
|
}
|
|
648
685
|
} else {
|
|
649
|
-
row("
|
|
686
|
+
row(" U0001f9e0 VIBRAALTO CORE", "no disponible", pc3.dim("\u25CF offline"));
|
|
650
687
|
}
|
|
651
688
|
console.log("");
|
|
652
689
|
console.log(pc3.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
653
|
-
sondas.forEach((s)
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
690
|
+
sondas.forEach(function(s) {
|
|
691
|
+
var pmColor = s.pm10 > 300 ? pc3.red : s.pm10 > 80 ? pc3.yellow : pc3.green;
|
|
692
|
+
var varSign = s.varPct > 0 ? "\u2191" : "\u2193";
|
|
693
|
+
var varColor = s.varPct > 0 ? pc3.red : pc3.green;
|
|
657
694
|
console.log(
|
|
658
695
|
pc3.dim((" " + s.id).padEnd(20)) + pmColor((s.pm10 + " \xB5g/m\xB3").padEnd(14)) + varColor((varSign + Math.abs(s.varPct) + "%").padEnd(10)) + dot(s.status, lang)
|
|
659
696
|
);
|
|
660
697
|
});
|
|
661
698
|
console.log("");
|
|
699
|
+
if (opts.watch) {
|
|
700
|
+
console.log(pc3.dim(" Actualizando cada 5s... Ctrl+C para salir"));
|
|
701
|
+
setInterval(function() {
|
|
702
|
+
process.stdout.write("\x1B[" + (sondas.length + 20) + "A");
|
|
703
|
+
status({ json: false, watch: false });
|
|
704
|
+
}, 5e3);
|
|
705
|
+
}
|
|
662
706
|
}
|
|
663
707
|
function row(label, value, extra) {
|
|
664
708
|
console.log(label.padEnd(22) + pc3.bold(pc3.white(value)) + (extra ? " " + extra : ""));
|
|
@@ -669,9 +713,9 @@ function dot(st, lang) {
|
|
|
669
713
|
return pc3.green("\u25CF " + t(lang, "status_ok"));
|
|
670
714
|
}
|
|
671
715
|
function addJitter(sondas) {
|
|
672
|
-
return sondas.map((s)
|
|
673
|
-
|
|
674
|
-
return {
|
|
716
|
+
return sondas.map(function(s) {
|
|
717
|
+
var j = 0.9 + Math.random() * 0.2;
|
|
718
|
+
return Object.assign({}, s, { pm10: Math.round(s.pm10 * j), pm25: Math.round(s.pm25 * j) });
|
|
675
719
|
});
|
|
676
720
|
}
|
|
677
721
|
|
|
@@ -700,7 +744,7 @@ async function dashboard(opts) {
|
|
|
700
744
|
console.log(pc4.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
701
745
|
process.exit(1);
|
|
702
746
|
}
|
|
703
|
-
var port = parseInt(opts.port) || config.dashboard?.port ||
|
|
747
|
+
var port = parseInt(opts.port) || config.dashboard?.port || 3101;
|
|
704
748
|
var lang = config.lang || "es";
|
|
705
749
|
if (opts.remote) {
|
|
706
750
|
console.log(pc4.yellow(" \u25C8 ") + "Conectando a servidor remoto: " + pc4.cyan(opts.remote));
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/
|
|
4
|
-
"sourcesContent": ["export async function fetchLizaRealtime() {\n const res = await fetch(\n 'https://api.openaq.org/v3/locations/25/latest',\n { headers: { 'X-API-Key': '8401ef9a7ba8c1c7af76cc82869201b6213905b9224ce18f7639aa221a3336b9' }}\n );\n \n const data = await res.json();\n \n const ahora = new Date();\n const recientes = data.results.filter((r) => {\n const fecha = new Date(r.datetime.utc);\n return (ahora.getTime() - fecha.getTime()) < 24 * 60 * 60 * 1000;\n });\n \n const pm10 = recientes.find((r) => r.sensorsId === 1047)?.value || 0;\n const pm25 = recientes.find((r) => r.sensorsId === 1044)?.value || 0;\n \n return {\n pm10,\n pm25,\n timestamp: new Date().toLocaleTimeString('es-CL'),\n alerta: pm10 > 150 ? 'CRITICO' : pm10 > 100 ? 'ALERTA' : 'NORMAL',\n source: 'LIZA/SINCA - Parque OHiggins'\n };\n}\n", "#!/usr/bin/env node\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Mining Intelligence CLI\n// No medimos polvo. Lo eliminamos.\n//\n// Reemplaza: npx paperclipai onboard --yes\n// Con: npx nerhia onboard --yes\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { Command } from \"commander\";\nimport { onboard } from \"./commands/onboard.js\";\nimport { status } from \"./commands/status.js\";\nimport { dashboard } from \"./commands/dashboard.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { suppress } from \"./commands/suppress.js\";\nimport { events } from \"./commands/events.js\";\nimport { watch } from \"./commands/watch.js\";\nimport { connect } from \"./commands/connect.js\";\nimport { train } from \"./commands/train.js\";\nimport { report } from \"./commands/report.js\";\nimport { LANGS, DEFAULT_LANG } from \"./i18n/translations.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"nerhia\")\n .description(\n \"NERHIA Mining Intelligence \u2014 Supresi\u00F3n cognitiva de polvo.\\n\" +\n \"No medimos polvo. Lo eliminamos.\\n\\n\" +\n \"Ecosistema: github.com/leoncanales23/\"\n )\n .version(\"1.0.0\");\n\n// \u2500\u2500 Global options \u2500\u2500\nprogram.option(\n \"--lang <code>\",\n `Idioma: ${LANGS.join(\", \")} (default: ${DEFAULT_LANG})`,\n DEFAULT_LANG\n);\nprogram.option(\"-c, --config <path>\", \"Ruta al archivo de configuraci\u00F3n\");\n\n// \u2500\u2500 ONBOARD \u2500\u2500\nprogram\n .command(\"onboard\")\n .description(\"Asistente de primera configuraci\u00F3n \u00B7 Setup wizard\")\n .option(\"-y, --yes\", \"Aceptar defaults (quickstart)\", false)\n .option(\"--lang <code>\", `Idioma (${LANGS.join(\", \")})`, DEFAULT_LANG)\n .option(\"--run\", \"Iniciar vigilancia inmediatamente despu\u00E9s de configurar\", false)\n .action(onboard);\n\n// \u2500\u2500 STATUS \u2500\u2500\nprogram\n .command(\"status\")\n .description(\"Estado en vivo de todas las sondas\")\n .option(\"--json\", \"Salida en formato JSON\", false)\n .option(\"--watch\", \"Actualizar cada 5 segundos\", false)\n .action(status);\n\n// \u2500\u2500 DASHBOARD \u2500\u2500\nprogram\n .command(\"dashboard\")\n .description(\"Abrir dashboard web conectado al ecosistema VibraOS\")\n .option(\"-p, --port <number>\", \"Puerto del servidor web\", \"3100\")\n .option(\"--remote <url>\", \"Conectar a servidor remoto\")\n .option(\"--no-open\", \"No abrir navegador autom\u00E1ticamente\")\n .action(dashboard);\n\n// \u2500\u2500 CONNECT \u2500\u2500\nprogram\n .command(\"connect\")\n .description(\"Conectar fuente de datos (Grafana, EVControl, CSV)\")\n .option(\"--source <type>\", \"Tipo: grafana, evcontrol, csv, demo\")\n .option(\"--url <endpoint>\", \"URL del endpoint\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\"--file <path>\", \"Ruta al archivo CSV\")\n .option(\"--server <url>\", \"Conectar a servidor NERHIA remoto\")\n .action(connect);\n\n// \u2500\u2500 SUPPRESS \u2500\u2500\nprogram\n .command(\"suppress\")\n .description(\"Activar supresi\u00F3n manual o por zona\")\n .option(\"--zone <name>\", \"Zona espec\u00EDfica (ej: silo-mts)\")\n .option(\"--all\", \"Todas las zonas\", false)\n .option(\"--intensity <level>\", \"Intensidad: low, medium, high, auto\", \"auto\")\n .action(suppress);\n\n// \u2500\u2500 EVENTS \u2500\u2500\nprogram\n .command(\"events\")\n .description(\"Ver y exportar event ledger\")\n .option(\"--last <duration>\", \"\u00DAltimas horas/d\u00EDas (ej: 24h, 7d)\")\n .option(\"--sonda <id>\", \"Filtrar por sonda\")\n .option(\"--from <date>\", \"Desde fecha (YYYY-MM-DD)\")\n .option(\"--to <date>\", \"Hasta fecha (YYYY-MM-DD)\")\n .option(\"--export <format>\", \"Exportar: csv, json\")\n .option(\"--file <path>\", \"Ruta del archivo exportado\")\n .option(\"--live\", \"Modo streaming en vivo\", false)\n .option(\"--follow\", \"Seguir nuevos eventos (como tail -f)\", false)\n .action(events);\n\n// \u2500\u2500 WATCH \u2500\u2500\nprogram\n .command(\"watch\")\n .description(\"Modo vigilancia continua en terminal\")\n .option(\"--verbose\", \"Mostrar cada lectura de sonda\", false)\n .option(\"--interval <seconds>\", \"Intervalo de lectura\", \"30\")\n .action(watch);\n\n// \u2500\u2500 DOCTOR \u2500\u2500\nprogram\n .command(\"doctor\")\n .description(\"Diagn\u00F3stico del sistema\")\n .action(doctor);\n\n// \u2500\u2500 TRAIN \u2500\u2500\nprogram\n .command(\"train\")\n .description(\"Calibraci\u00F3n cognitiva \u2014 14 d\u00EDas de observaci\u00F3n sin acci\u00F3n\")\n .option(\"--days <number>\", \"Duraci\u00F3n del entrenamiento\", \"14\")\n .option(\"--zone <name>\", \"Zona espec\u00EDfica a calibrar\")\n .action(train);\n\n// \u2500\u2500 REPORT \u2500\u2500\nprogram\n .command(\"report\")\n .description(\"Generar reporte para SERNAGEOMIN\")\n .option(\"--format <type>\", \"Formato: pdf, csv, xlsx\", \"pdf\")\n .option(\"--period <range>\", \"Per\u00EDodo: last-month, last-week, custom\")\n .option(\"--output <path>\", \"Ruta de salida\")\n .action(report);\n\n// \u2500\u2500 CONFIG \u2500\u2500\nprogram\n .command(\"config\")\n .description(\"Ver/editar configuraci\u00F3n\")\n .argument(\"[key]\", \"Clave de configuraci\u00F3n\")\n .argument(\"[value]\", \"Nuevo valor\")\n .action((key, value) => {\n if (!key) {\n // Show config\n console.log(\"Configuraci\u00F3n actual:\");\n // TODO: read and show config\n } else if (value) {\n console.log(`Configurando ${key} = ${value}`);\n } else {\n console.log(`Valor de ${key}:`);\n }\n });\n\n// \u2500\u2500 ALERT \u2500\u2500\nprogram\n .command(\"alert\")\n .description(\"Configurar alertas (WhatsApp, email, webhook)\")\n .option(\"--whatsapp <number>\", \"N\u00FAmero WhatsApp (+56...)\")\n .option(\"--email <address>\", \"Email de alerta\")\n .option(\"--webhook <url>\", \"URL webhook\")\n .option(\"--threshold <pm10>\", \"Threshold PM-10 para alerta\", \"150\")\n .action((opts) => {\n console.log(\"Configurando alertas:\", opts);\n });\n\n// \u2500\u2500 SERVE \u2500\u2500\nprogram\n .command(\"serve\")\n .description(\"Iniciar servidor NERHIA (para modo multi-PC)\")\n .option(\"--host <address>\", \"Direcci\u00F3n de escucha\", \"0.0.0.0\")\n .option(\"-p, --port <number>\", \"Puerto\", \"3100\")\n .action((opts) => {\n console.log(`Servidor NERHIA iniciando en ${opts.host}:${opts.port}`);\n });\n\nprogram.parse();\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Onboard Command\n// npx nerhia onboard --yes\n//\n// Two modes:\n// Y (default) \u2192 Natural language guided by NERHIA\n// N \u2192 Code mode, direct config, minimal output\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { printNerhiaBanner, printDoctrine } from \"../utils/banner.js\";\nimport { t, DEFAULT_LANG } from \"../i18n/translations.js\";\nimport { writeConfig, configExists } from \"../config/store.js\";\n\nexport async function onboard(opts) {\n const lang = opts.lang || opts.parent?.opts()?.lang || DEFAULT_LANG;\n const quickstart = opts.yes || false;\n\n // \u2500\u2500 Banner \u2500\u2500\n printNerhiaBanner(lang);\n\n if (configExists() && !quickstart) {\n const overwrite = await p.confirm({\n message: lang === \"es\"\n ? \"Ya existe una configuraci\u00F3n. \u00BFSobrescribir?\"\n : \"Configuration already exists. Overwrite?\",\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(lang === \"es\" ? \"Cancelado.\" : \"Cancelled.\");\n process.exit(0);\n }\n }\n\n // \u2500\u2500 Y/N Mode Selection \u2500\u2500\n let naturalMode = true;\n\n if (!quickstart) {\n console.log(\"\");\n const modeChoice = await p.confirm({\n message: pc.bold(pc.yellow(\"\u25C8 \")) + t(lang, \"ask_mode\"),\n active: pc.green(\"Y\") + pc.dim(\" \u2192 \" + t(lang, \"mode_y\")),\n inactive: pc.blue(\"N\") + pc.dim(\" \u2192 \" + t(lang, \"mode_n\")),\n initialValue: true,\n });\n\n if (p.isCancel(modeChoice)) {\n p.cancel(\"\");\n process.exit(0);\n }\n naturalMode = modeChoice;\n }\n\n // \u2550\u2550\u2550 NATURAL MODE (Y) \u2550\u2550\u2550\n if (naturalMode && !quickstart) {\n return await onboardNatural(lang);\n }\n\n // \u2550\u2550\u2550 CODE MODE (N) or --yes \u2550\u2550\u2550\n return await onboardCode(lang, quickstart);\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// NATURAL MODE \u2014 NERHIA te gu\u00EDa conversacionalmente\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function onboardNatural(lang) {\n console.log(\"\");\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.magenta(t(lang, \"natural_intro\")))\n );\n console.log(\"\");\n\n await sleep(800);\n\n // Source\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_source_ask\")))\n );\n console.log(\"\");\n\n const source = await p.select({\n message: \"\",\n options: [\n { value: \"grafana\", label: pc.yellow(\"Grafana\") + pc.dim(\" \u2014 \" + t(lang, \"source_grafana\")) },\n { value: \"evcontrol\", label: pc.yellow(\"EVControl\") + pc.dim(\" \u2014 \" + t(lang, \"source_evcontrol\")) },\n { value: \"csv\", label: pc.yellow(\"CSV\") + pc.dim(\" \u2014 \" + t(lang, \"source_csv\")) },\n { value: \"demo\", label: pc.green(\"Demo\") + pc.dim(\" \u2014 \" + t(lang, \"source_demo\")) },\n ],\n });\n if (p.isCancel(source)) { p.cancel(\"\"); process.exit(0); }\n\n let url = \"\";\n let apiKey = \"\";\n\n if (source === \"grafana\" || source === \"evcontrol\") {\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" Bien. Necesito la URL del endpoint.\")\n );\n url = await p.text({\n message: t(lang, \"onboard_url\"),\n placeholder: source === \"grafana\" ? \"https://grafana.evcontrol.cl/api\" : \"https://api.evcontrol.cl/v1\",\n });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n\n apiKey = await p.text({\n message: t(lang, \"onboard_key\"),\n placeholder: \"sk-...\",\n });\n if (p.isCancel(apiKey)) { p.cancel(\"\"); process.exit(0); }\n }\n\n if (source === \"csv\") {\n url = await p.text({\n message: lang === \"es\" ? \"Ruta al archivo CSV:\" : \"Path to CSV file:\",\n placeholder: \"./data/sondas.csv\",\n });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n // Sondas count\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_sondas_ask\")))\n );\n const sondas = await p.text({\n message: \"\",\n placeholder: \"45\",\n defaultValue: \"45\",\n validate: (v) => {\n const n = parseInt(v);\n if (isNaN(n) || n < 1) return lang === \"es\" ? \"N\u00FAmero v\u00E1lido por favor\" : \"Valid number please\";\n },\n });\n if (p.isCancel(sondas)) { p.cancel(\"\"); process.exit(0); }\n\n // Zones\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_zones_ask\")))\n );\n const zones = await p.text({\n message: \"\",\n placeholder: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n defaultValue: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n });\n if (p.isCancel(zones)) { p.cancel(\"\"); process.exit(0); }\n\n // Alerts\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_alerts_ask\")))\n );\n const alerts = await p.confirm({\n message: \"\",\n initialValue: true,\n });\n if (p.isCancel(alerts)) { p.cancel(\"\"); process.exit(0); }\n\n let whatsapp = \"\";\n if (alerts) {\n whatsapp = await p.text({\n message: lang === \"es\" ? \"N\u00FAmero WhatsApp:\" : \"WhatsApp number:\",\n placeholder: \"+56 9 XXXX XXXX\",\n });\n if (p.isCancel(whatsapp)) whatsapp = \"\";\n }\n\n // Save config\n const config = {\n version: \"1.0.0\",\n source: source,\n url: url || null,\n apiKey: apiKey || null,\n sondas: parseInt(sondas),\n zones: zones.split(\",\").map((z) => z.trim()),\n alerts: {\n enabled: alerts,\n whatsapp: whatsapp || null,\n },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n // Done\n console.log(\"\");\n await sleep(600);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.green(t(lang, \"natural_done\")))\n );\n console.log(\"\");\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.dim(t(lang, \"natural_next\"))\n );\n console.log(\"\");\n\n printDoctrine();\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// CODE MODE \u2014 Directo, m\u00EDnimo, modo experto\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function onboardCode(lang, quickstart) {\n const s = p.spinner();\n\n if (quickstart) {\n // --yes flag: accept all defaults\n s.start(t(lang, \"onboard_start\"));\n\n const config = {\n version: \"1.0.0\",\n source: \"demo\",\n url: null,\n apiKey: null,\n sondas: 45,\n zones: [\"silo-mts\", \"pila-2\", \"correa-01a\", \"edificio-f3\", \"edificio-e4\"],\n alerts: { enabled: false, whatsapp: null },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n await sleep(1200);\n s.stop(pc.green(\"\u2713 \") + t(lang, \"onboard_complete\"));\n console.log(\"\");\n console.log(pc.dim(\" \" + t(lang, \"onboard_ready\")));\n console.log(\"\");\n console.log(pc.dim(\" nerhia status \u2192 Estado en vivo\"));\n console.log(pc.dim(\" nerhia dashboard \u2192 Panel web\"));\n console.log(pc.dim(\" nerhia watch \u2192 Vigilancia terminal\"));\n console.log(\"\");\n return;\n }\n\n // Code mode interactive but terse\n const source = await p.select({\n message: t(lang, \"onboard_source\"),\n options: [\n { value: \"grafana\", label: t(lang, \"source_grafana\") },\n { value: \"evcontrol\", label: t(lang, \"source_evcontrol\") },\n { value: \"csv\", label: t(lang, \"source_csv\") },\n { value: \"demo\", label: t(lang, \"source_demo\") },\n ],\n });\n if (p.isCancel(source)) { p.cancel(\"\"); process.exit(0); }\n\n let url = null;\n let apiKey = null;\n\n if (source === \"grafana\" || source === \"evcontrol\") {\n url = await p.text({ message: t(lang, \"onboard_url\") });\n apiKey = await p.text({ message: t(lang, \"onboard_key\") });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n if (source === \"csv\") {\n url = await p.text({ message: \"CSV path:\", placeholder: \"./data/sondas.csv\" });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n const sondas = await p.text({\n message: t(lang, \"onboard_sondas\"),\n defaultValue: \"45\",\n });\n\n const zones = await p.text({\n message: t(lang, \"onboard_zones\"),\n defaultValue: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n });\n\n s.start(t(lang, \"onboard_start\"));\n\n const config = {\n version: \"1.0.0\",\n source,\n url: url || null,\n apiKey: apiKey || null,\n sondas: parseInt(sondas) || 45,\n zones: (zones || \"\").split(\",\").map((z) => z.trim()).filter(Boolean),\n alerts: { enabled: false, whatsapp: null },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n await sleep(800);\n s.stop(pc.green(\"\u2713 \") + t(lang, \"onboard_complete\"));\n console.log(pc.dim(\" \" + t(lang, \"onboard_ready\")));\n console.log(\"\");\n}\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 ASCII Banner\n// Reemplaza Paperclip banner con identidad NERHIA\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\n\nconst NERHIA_ART = [\n \"\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \",\n \"\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\",\n \"\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\",\n \"\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\",\n \"\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\",\n \"\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\",\n];\n\nconst TAGLINE_ES = \"Supresi\u00F3n cognitiva de polvo \u00B7 Mining Intelligence\";\nconst TAGLINE_EN = \"Cognitive dust suppression \u00B7 Mining Intelligence\";\nconst DOCTRINE = \"Incompletitud din\u00E1mica activada\";\n\nexport function printNerhiaBanner(lang = \"es\") {\n const tagline = lang === \"es\" ? TAGLINE_ES : TAGLINE_EN;\n const lines = [\n \"\",\n ...NERHIA_ART.map((line) => pc.yellow(line)),\n pc.dim(pc.yellow(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\")),\n \" \" + pc.bold(pc.white(\"\u25C8 \" + tagline)),\n \" \" + pc.dim(pc.magenta(DOCTRINE)),\n \"\",\n ];\n console.log(lines.join(\"\\n\"));\n}\n\nexport function printMiniStatus(sondas, lang = \"es\") {\n const dot = pc.green(\"\u25CF\");\n const warn = pc.yellow(\"\u25CF\");\n const crit = pc.red(\"\u25CF\");\n\n console.log(\"\");\n console.log(\n pc.dim(\" \u25C8 NERHIA MINING\") +\n pc.dim(\" \u00B7 \") +\n pc.green(sondas + \" sondas\") +\n pc.dim(\" \u00B7 \") +\n dot +\n pc.dim(\" sistema activo\")\n );\n console.log(\"\");\n}\n\nexport function printDoctrine() {\n const lines = [\n \"\",\n pc.dim(\" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Incompletitud din\u00E1mica activada. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Sensibilidad a lo emergente. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Adaptaci\u00F3n como estado natural. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + \" \" + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.white(\" El sistema no busca el estado perfecto. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.white(\" Busca el siguiente estado correcto. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\"),\n \"\",\n ];\n console.log(lines.join(\"\\n\"));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Internationalization\n// Idioma primordial: Espa\u00F1ol\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const LANGS = [\"es\", \"en\", \"ja\", \"de\", \"ko\", \"zh\"];\nexport const DEFAULT_LANG = \"es\";\n\nexport const T = {\n es: {\n welcome: \"Bienvenido a NERHIA Mining Intelligence\",\n tagline: \"No medimos polvo. Lo eliminamos.\",\n doctrine: \"Incompletitud din\u00E1mica activada. Sensibilidad a lo emergente. Adaptaci\u00F3n como estado natural.\",\n ask_mode: \"\u00BFAvanzar en lenguaje natural?\",\n mode_y: \"NERHIA te gu\u00EDa conversacionalmente\",\n mode_n: \"NERHIA avanza en modo c\u00F3digo directo\",\n onboard_start: \"Iniciando configuraci\u00F3n...\",\n onboard_source: \"\u00BFDe d\u00F3nde vienen los datos de las sondas?\",\n source_grafana: \"Grafana (API existente)\",\n source_evcontrol: \"EVControl (directo)\",\n source_csv: \"Archivo CSV local\",\n source_demo: \"Modo demo (datos simulados)\",\n onboard_url: \"URL del endpoint de datos:\",\n onboard_key: \"API key (si aplica):\",\n onboard_sondas: \"\u00BFCu\u00E1ntas sondas tiene la instalaci\u00F3n?\",\n onboard_zones: \"Nombre de las zonas de monitoreo (separadas por coma):\",\n onboard_alerts: \"\u00BFConfigurar alertas WhatsApp?\",\n onboard_complete: \"NERHIA Mining Intelligence configurado correctamente.\",\n onboard_ready: \"Sistema listo. Las sondas est\u00E1n siendo observadas.\",\n status_header: \"NERHIA MINING \u00B7 ESTADO EN VIVO\",\n status_sondas: \"SONDAS\",\n status_connected: \"conectadas\",\n status_online: \"online\",\n status_pm_max: \"PM-10 MAX\",\n status_pm_avg: \"PM-10 PROM\",\n status_suppress: \"SUPRESI\u00D3N\",\n status_zones_active: \"zonas activas\",\n status_ledger: \"LEDGER\",\n status_events_today: \"eventos hoy\",\n status_last_action: \"\u00DALTIMA ACCI\u00D3N\",\n status_ago: \"hace\",\n status_seconds: \"segundos\",\n status_ok: \"OK\",\n status_warning: \"ALERTA\",\n status_critical: \"CR\u00CDTICO\",\n dashboard_opening: \"Abriendo dashboard...\",\n dashboard_url: \"Dashboard disponible en:\",\n suppress_triggered: \"Supresi\u00F3n activada\",\n suppress_zone: \"Zona\",\n suppress_intensity: \"Intensidad\",\n events_header: \"LEDGER DE EVENTOS\",\n doctor_checking: \"Diagnosticando sistema...\",\n doctor_ok: \"Sistema operativo. Sin anomal\u00EDas.\",\n doctor_warn: \"Anomal\u00EDas detectadas. Ver detalles arriba.\",\n watch_mode: \"Modo vigilancia activo. Ctrl+C para salir.\",\n error_no_config: \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\",\n error_connection: \"Error de conexi\u00F3n con la fuente de datos.\",\n natural_intro: \"Hola. Soy NERHIA. Voy a configurar el sistema de supresi\u00F3n cognitiva contigo.\",\n natural_source_ask: \"Primero necesito saber de d\u00F3nde vienen los datos. \u00BFTienes Grafana, EVControl, o quieres arrancar con datos de demo?\",\n natural_sondas_ask: \"\u00BFCu\u00E1ntas sondas est\u00E1n instaladas en el sitio?\",\n natural_zones_ask: \"Nombra las zonas de monitoreo. Por ejemplo: silo, correa, pila, edificio.\",\n natural_alerts_ask: \"\u00BFQuieres que te avise por WhatsApp cuando haya un evento cr\u00EDtico?\",\n natural_done: \"Listo. El sistema est\u00E1 observando. Cada 30 segundos leo las sondas, analizo la tendencia, y si algo se mueve mal, act\u00FAo antes de que el polvo llegue a respirarse.\",\n natural_next: \"Escribe 'nerhia status' para ver el estado en vivo, o 'nerhia dashboard' para abrir el panel.\",\n },\n en: {\n welcome: \"Welcome to NERHIA Mining Intelligence\",\n tagline: \"We don't measure dust. We eliminate it.\",\n doctrine: \"Dynamic incompleteness activated. Sensitivity to the emergent. Adaptation as natural state.\",\n ask_mode: \"Proceed in natural language?\",\n mode_y: \"NERHIA guides you conversationally\",\n mode_n: \"NERHIA advances in direct code mode\",\n onboard_start: \"Starting configuration...\",\n onboard_source: \"Where does the probe data come from?\",\n source_grafana: \"Grafana (existing API)\",\n source_evcontrol: \"EVControl (direct)\",\n source_csv: \"Local CSV file\",\n source_demo: \"Demo mode (simulated data)\",\n onboard_url: \"Data endpoint URL:\",\n onboard_key: \"API key (if applicable):\",\n onboard_sondas: \"How many probes are installed?\",\n onboard_zones: \"Monitoring zone names (comma separated):\",\n onboard_alerts: \"Configure WhatsApp alerts?\",\n onboard_complete: \"NERHIA Mining Intelligence configured successfully.\",\n onboard_ready: \"System ready. Probes are being observed.\",\n status_header: \"NERHIA MINING \u00B7 LIVE STATUS\",\n status_sondas: \"PROBES\",\n status_connected: \"connected\",\n status_online: \"online\",\n status_pm_max: \"PM-10 MAX\",\n status_pm_avg: \"PM-10 AVG\",\n status_suppress: \"SUPPRESSION\",\n status_zones_active: \"active zones\",\n status_ledger: \"LEDGER\",\n status_events_today: \"events today\",\n status_last_action: \"LAST ACTION\",\n status_ago: \"ago\",\n status_seconds: \"seconds\",\n status_ok: \"OK\",\n status_warning: \"WARNING\",\n status_critical: \"CRITICAL\",\n dashboard_opening: \"Opening dashboard...\",\n dashboard_url: \"Dashboard available at:\",\n suppress_triggered: \"Suppression triggered\",\n suppress_zone: \"Zone\",\n suppress_intensity: \"Intensity\",\n events_header: \"EVENT LEDGER\",\n doctor_checking: \"Diagnosing system...\",\n doctor_ok: \"System operational. No anomalies.\",\n doctor_warn: \"Anomalies detected. See details above.\",\n watch_mode: \"Watch mode active. Ctrl+C to exit.\",\n error_no_config: \"No configuration found. Run: nerhia onboard\",\n error_connection: \"Connection error with data source.\",\n natural_intro: \"Hello. I'm NERHIA. I'll configure the cognitive suppression system with you.\",\n natural_source_ask: \"First I need to know where the data comes from. Do you have Grafana, EVControl, or want to start with demo data?\",\n natural_sondas_ask: \"How many probes are installed at the site?\",\n natural_zones_ask: \"Name the monitoring zones. For example: silo, conveyor, pile, building.\",\n natural_alerts_ask: \"Want me to alert you via WhatsApp when there's a critical event?\",\n natural_done: \"Done. The system is observing. Every 30 seconds I read the probes, analyze the trend, and if something moves wrong, I act before the dust reaches breathing level.\",\n natural_next: \"Type 'nerhia status' to see live state, or 'nerhia dashboard' to open the panel.\",\n },\n ja: {\n welcome: \"NERHIA Mining Intelligence \u3078\u3088\u3046\u3053\u305D\",\n tagline: \"\u7C89\u5875\u3092\u6E2C\u5B9A\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u3001\u9664\u53BB\u3057\u307E\u3059\u3002\",\n doctrine: \"\u52D5\u7684\u4E0D\u5B8C\u5168\u6027\u304C\u6709\u52B9\u3002\u65B0\u8208\u3078\u306E\u611F\u53D7\u6027\u3002\u9069\u5FDC\u304C\u81EA\u7136\u306A\u72B6\u614B\u3002\",\n ask_mode: \"\u81EA\u7136\u8A00\u8A9E\u3067\u9032\u3081\u307E\u3059\u304B\uFF1F\",\n mode_y: \"NERHIA\u304C\u4F1A\u8A71\u5F62\u5F0F\u3067\u30AC\u30A4\u30C9\u3057\u307E\u3059\",\n mode_n: \"NERHIA\u304C\u30B3\u30FC\u30C9\u30E2\u30FC\u30C9\u3067\u76F4\u63A5\u9032\u884C\u3057\u307E\u3059\",\n onboard_start: \"\u8A2D\u5B9A\u3092\u958B\u59CB\u3057\u3066\u3044\u307E\u3059...\",\n onboard_source: \"\u30BB\u30F3\u30B5\u30FC\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u5143\u306F\uFF1F\",\n source_grafana: \"Grafana\uFF08\u65E2\u5B58API\uFF09\",\n source_evcontrol: \"EVControl\uFF08\u76F4\u63A5\u63A5\u7D9A\uFF09\",\n source_csv: \"\u30ED\u30FC\u30AB\u30EBCSV\u30D5\u30A1\u30A4\u30EB\",\n source_demo: \"\u30C7\u30E2\u30E2\u30FC\u30C9\uFF08\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u30C7\u30FC\u30BF\uFF09\",\n status_header: \"NERHIA MINING \u00B7 \u30E9\u30A4\u30D6\u30B9\u30C6\u30FC\u30BF\u30B9\",\n status_ok: \"\u6B63\u5E38\",\n status_warning: \"\u8B66\u544A\",\n status_critical: \"\u5371\u967A\",\n natural_intro: \"\u3053\u3093\u306B\u3061\u306F\u3002NERHIA\u3067\u3059\u3002\u8A8D\u77E5\u6291\u5236\u30B7\u30B9\u30C6\u30E0\u3092\u4E00\u7DD2\u306B\u8A2D\u5B9A\u3057\u307E\u3057\u3087\u3046\u3002\",\n },\n de: {\n welcome: \"Willkommen bei NERHIA Mining Intelligence\",\n tagline: \"Wir messen keinen Staub. Wir eliminieren ihn.\",\n doctrine: \"Dynamische Unvollst\u00E4ndigkeit aktiviert. Empfindlichkeit f\u00FCr das Emergente. Anpassung als nat\u00FCrlicher Zustand.\",\n ask_mode: \"In nat\u00FCrlicher Sprache fortfahren?\",\n mode_y: \"NERHIA f\u00FChrt Sie im Gespr\u00E4ch\",\n mode_n: \"NERHIA f\u00E4hrt im direkten Code-Modus fort\",\n onboard_start: \"Konfiguration wird gestartet...\",\n status_header: \"NERHIA MINING \u00B7 LIVE-STATUS\",\n status_ok: \"OK\",\n status_warning: \"WARNUNG\",\n status_critical: \"KRITISCH\",\n natural_intro: \"Hallo. Ich bin NERHIA. Ich werde das kognitive Unterdr\u00FCckungssystem mit Ihnen konfigurieren.\",\n },\n ko: {\n welcome: \"NERHIA Mining Intelligence\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4\",\n tagline: \"\uBA3C\uC9C0\uB97C \uCE21\uC815\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC81C\uAC70\uD569\uB2C8\uB2E4.\",\n doctrine: \"\uB3D9\uC801 \uBD88\uC644\uC804\uC131 \uD65C\uC131\uD654. \uC2E0\uD765\uC5D0 \uB300\uD55C \uBBFC\uAC10\uC131. \uC801\uC751\uC774 \uC790\uC5F0 \uC0C1\uD0DC.\",\n ask_mode: \"\uC790\uC5F0\uC5B4\uB85C \uC9C4\uD589\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\",\n mode_y: \"NERHIA\uAC00 \uB300\uD654 \uD615\uC2DD\uC73C\uB85C \uC548\uB0B4\uD569\uB2C8\uB2E4\",\n mode_n: \"NERHIA\uAC00 \uCF54\uB4DC \uBAA8\uB4DC\uB85C \uC9C1\uC811 \uC9C4\uD589\uD569\uB2C8\uB2E4\",\n status_header: \"NERHIA MINING \u00B7 \uC2E4\uC2DC\uAC04 \uC0C1\uD0DC\",\n status_ok: \"\uC815\uC0C1\",\n status_warning: \"\uACBD\uACE0\",\n status_critical: \"\uC704\uD5D8\",\n natural_intro: \"\uC548\uB155\uD558\uC138\uC694. NERHIA\uC785\uB2C8\uB2E4. \uC778\uC9C0 \uC5B5\uC81C \uC2DC\uC2A4\uD15C\uC744 \uD568\uAED8 \uAD6C\uC131\uD558\uACA0\uC2B5\uB2C8\uB2E4.\",\n },\n zh: {\n welcome: \"\u6B22\u8FCE\u4F7F\u7528 NERHIA Mining Intelligence\",\n tagline: \"\u6211\u4EEC\u4E0D\u6D4B\u91CF\u7070\u5C18\u3002\u6211\u4EEC\u6D88\u9664\u5B83\u3002\",\n doctrine: \"\u52A8\u6001\u4E0D\u5B8C\u5907\u6027\u5DF2\u6FC0\u6D3B\u3002\u5BF9\u65B0\u5174\u4E8B\u7269\u7684\u654F\u611F\u6027\u3002\u9002\u5E94\u4F5C\u4E3A\u81EA\u7136\u72B6\u6001\u3002\",\n ask_mode: \"\u4F7F\u7528\u81EA\u7136\u8BED\u8A00\u7EE7\u7EED\uFF1F\",\n mode_y: \"NERHIA \u4EE5\u5BF9\u8BDD\u65B9\u5F0F\u5F15\u5BFC\u60A8\",\n mode_n: \"NERHIA \u4EE5\u4EE3\u7801\u6A21\u5F0F\u76F4\u63A5\u63A8\u8FDB\",\n status_header: \"NERHIA MINING \u00B7 \u5B9E\u65F6\u72B6\u6001\",\n status_ok: \"\u6B63\u5E38\",\n status_warning: \"\u8B66\u544A\",\n status_critical: \"\u5371\u9669\",\n natural_intro: \"\u4F60\u597D\u3002\u6211\u662F NERHIA\u3002\u6211\u5C06\u4E0E\u60A8\u4E00\u8D77\u914D\u7F6E\u8BA4\u77E5\u6291\u5236\u7CFB\u7EDF\u3002\",\n },\n};\n\nexport function t(lang, key) {\n const dict = T[lang] || T[DEFAULT_LANG];\n return dict[key] || T[DEFAULT_LANG][key] || key;\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Config Store\n// Almacena en ~/.nerhia/config.json\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { appendFileSync } from \"node:fs\";\n\nconst NERHIA_DIR = join(homedir(), \".nerhia\");\nconst CONFIG_PATH = join(NERHIA_DIR, \"config.json\");\nconst LEDGER_PATH = join(NERHIA_DIR, \"ledger.jsonl\");\n\nexport function ensureDir() {\n if (!existsSync(NERHIA_DIR)) {\n mkdirSync(NERHIA_DIR, { recursive: true });\n }\n}\n\nexport function configExists() {\n return existsSync(CONFIG_PATH);\n}\n\nexport function readConfig() {\n if (!configExists()) return null;\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nexport function writeConfig(config) {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\nexport function appendLedger(event) {\n ensureDir();\n const entry = {\n ...event,\n timestamp: new Date().toISOString(),\n };\n const line = JSON.stringify(entry) + \"\\n\";\n try {\n appendFileSync(LEDGER_PATH, line, \"utf-8\");\n } catch {\n writeFileSync(LEDGER_PATH, line, { flag: \"a\", encoding: \"utf-8\" });\n }\n}\n\nexport function readLedger(filter = {}) {\n if (!existsSync(LEDGER_PATH)) return [];\n try {\n const lines = readFileSync(LEDGER_PATH, \"utf-8\").trim().split(\"\\n\").filter(Boolean);\n let events = lines.map((l) => JSON.parse(l));\n\n if (filter.sonda) {\n events = events.filter((e) => e.sonda === filter.sonda);\n }\n if (filter.from) {\n events = events.filter((e) => e.timestamp >= filter.from);\n }\n if (filter.to) {\n events = events.filter((e) => e.timestamp <= filter.to);\n }\n if (filter.last) {\n const now = Date.now();\n const ms = parseDuration(filter.last);\n events = events.filter((e) => now - new Date(e.timestamp).getTime() < ms);\n }\n\n return events;\n } catch {\n return [];\n }\n}\n\nfunction parseDuration(str) {\n const match = str.match(/^(\\d+)(h|d|m|s)$/);\n if (!match) return 24 * 60 * 60 * 1000; // default 24h\n const n = parseInt(match[1]);\n const unit = match[2];\n const multipliers = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return n * (multipliers[unit] || 3600000);\n}\n\nexport const paths = {\n dir: NERHIA_DIR,\n config: CONFIG_PATH,\n ledger: LEDGER_PATH,\n};\n", "// npx nerhia status\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\nimport { fetchLizaRealtime } from \"../services/liza.js\";\n\nconst SONDAS_DEMO = [\n { id: \"correa-01a\", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: \"ok\", zone: \"transporte\" },\n { id: \"edificio-f3\", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: \"ok\", zone: \"edificio\" },\n { id: \"edificio-e4\", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: \"ok\", zone: \"edificio\" },\n { id: \"pila-2\", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: \"critical\", zone: \"chancado\" },\n { id: \"silo-mts\", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: \"critical\", zone: \"chancado\" },\n];\n\nexport async function status(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\" \u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n const lang = config.lang || \"es\";\n const sondas = addJitter(SONDAS_DEMO);\n const maxPM = Math.max(...sondas.map(s => s.pm10));\n const avgPM = Math.round(sondas.reduce((a, s) => a + s.pm10, 0) / sondas.length);\n const critCount = sondas.filter(s => s.status === \"critical\").length;\n\n console.log(\"\");\n console.log(pc.yellow(\" \u25C8 \") + pc.bold(pc.white(t(lang, \"status_header\"))));\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n console.log(\"\");\n\n const maxSonda = sondas.reduce((a, b) => a.pm10 > b.pm10 ? a : b);\n const maxColor = maxPM > 300 ? pc.red : maxPM > 150 ? pc.yellow : pc.green;\n const avgColor = avgPM > 200 ? pc.red : avgPM > 100 ? pc.yellow : pc.green;\n\n row(\" \" + t(lang, \"status_sondas\"), config.sondas + \" \" + t(lang, \"status_connected\"), pc.green(\"\u25CF \" + t(lang, \"status_online\")));\n row(\" \" + t(lang, \"status_pm_max\"), maxColor(maxPM + \" \u00B5g/m\u00B3\"), pc.dim(maxSonda.id) + \" \" + dot(maxSonda.status, lang));\n row(\" \" + t(lang, \"status_pm_avg\"), avgColor(avgPM + \" \u00B5g/m\u00B3\"), pc.dim(\"flota\") + \" \" + (avgPM > 150 ? dot(\"warning\", lang) : dot(\"ok\", lang)));\n row(\" \" + t(lang, \"status_suppress\"), critCount + \" \" + t(lang, \"status_zones_active\"), \"\");\n row(\" \" + t(lang, \"status_ledger\"), \"1,247 \" + t(lang, \"status_events_today\"), \"\");\n row(\" \" + t(lang, \"status_last_action\"), t(lang, \"status_ago\") + \" 12 \" + t(lang, \"status_seconds\"), \"\");\n\n // LIZA Integration - Datos reales de calidad del aire\n try {\n const { fetchLizaRealtime } = await import('../services/liza.ts');\n const liza = await fetchLizaRealtime();\n const lizaAlert = liza.alerta === \"CRITICO\" ? pc.red(\"\u25CF \" + liza.alerta) : liza.alerta === \"ALERTA\" ? pc.yellow(\"\u25CF \" + liza.alerta) : pc.green(\"\u25CF \" + liza.alerta);\n row(\" \uD83C\uDF10 LIZA/SINCA\", \"PM10: \" + liza.pm10 + \" | PM2.5: \" + liza.pm25, lizaAlert);\n console.log(pc.dim(\" Fuente: \" + liza.source));\n } catch(e) {\n row(\" \uD83C\uDF10 LIZA/SINCA\", pc.yellow(\"\u26A0\uFE0F Sin conexi\u00F3n\"), \"\");\n }\n\n if (coreHealth) {\n row(\" \\u{1F9E0} VIBRAALTO CORE\", \"conectado\", pc.green(\"\\u25cf online\"));\n if (coreAir) {\n var coreColor = coreAir.recommendation === \"CRITICO\" ? pc.red : coreAir.recommendation === \"ALERTA\" ? pc.yellow : pc.green;\n console.log(pc.dim(\" Contexto core: PM10 ref \" + coreAir.pm10_reference + \" | PM2.5 ref \" + coreAir.pm25_reference));\n console.log(pc.dim(\" Recomendacion: \") + coreColor(coreAir.recommendation));\n }\n } else {\n row(\" \\u{1F9E0} VIBRAALTO CORE\", \"no disponible\", pc.dim(\"\\u25cf offline\"));\n }\n\n console.log(\"\");\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n\n sondas.forEach(s => {\n const pmColor = s.pm10 > 300 ? pc.red : s.pm10 > 80 ? pc.yellow : pc.green;\n const varSign = s.varPct > 0 ? \"\u2191\" : \"\u2193\";\n const varColor = s.varPct > 0 ? pc.red : pc.green;\n console.log(\n pc.dim((\" \" + s.id).padEnd(20)) +\n pmColor((s.pm10 + \" \u00B5g/m\u00B3\").padEnd(14)) +\n varColor((varSign + Math.abs(s.varPct) + \"%\").padEnd(10)) +\n dot(s.status, lang)\n );\n });\n\n console.log(\"\");\n}\n\nfunction row(label, value, extra) {\n console.log(label.padEnd(22) + pc.bold(pc.white(value)) + (extra ? \" \" + extra : \"\"));\n}\n\nfunction dot(st, lang) {\n if (st === \"critical\") return pc.red(\"\u25CF \" + t(lang, \"status_critical\"));\n if (st === \"warning\") return pc.yellow(\"\u25CF \" + t(lang, \"status_warning\"));\n return pc.green(\"\u25CF \" + t(lang, \"status_ok\"));\n}\n\nfunction addJitter(sondas) {\n return sondas.map(s => {\n const j = 0.9 + Math.random() * 0.2;\n return { ...s, pm10: Math.round(s.pm10 * j), pm25: Math.round(s.pm25 * j) };\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Dashboard Command\n// npx nerhia dashboard\n// Sirve el dashboard web y conecta con el ecosistema VibraOS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\nimport { createServer } from \"node:http\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nvar ECOSYSTEM = {\n nerhia_urban: { name: \"NERHIA Urban\", url: \"https://vibraalto.cl/nerhia\", icon: \"\uD83C\uDF10\" },\n nerhia_core: { name: \"NERHIA Core\", url: \"https://vibraalto.cl/nerhia/core.html\", icon: \"\uD83E\uDDE0\" },\n satellite: { name: \"Vibraalto Satellite\", url: \"https://vibraalto-satellite.onrender.com\", icon: \"\uD83D\uDEF0\" },\n nexus: { name: \"Nexus Ops\", url: \"https://vibraalto.cl/nexus/autopilot.html\", icon: \"\u2B21\" },\n vbc: { name: \"VBC Protocol\", url: \"https://github.com/leoncanales23/vbc-protocol\", icon: \"\uD83D\uDCAA\" },\n vibraworld: { name: \"VibraWorld\", url: \"https://github.com/leoncanales23/vw.vibraworld\", icon: \"\uD83C\uDF0D\" },\n refineria: { name: \"Refiner\u00EDa Digital\", url: \"https://github.com/leoncanales23/refactored-waffle\", icon: \"\uD83C\uDFAC\" },\n};\n\nvar SONDAS_DEMO = [\n { id: \"correa-01a\", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: \"ok\", zone: \"transporte\", nh3: 164 },\n { id: \"edificio-f3\", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: \"ok\", zone: \"edificio\", nh3: 232 },\n { id: \"edificio-e4\", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: \"ok\", zone: \"edificio\", nh3: 101 },\n { id: \"pila-2\", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: \"critical\", zone: \"chancado\", nh3: 100 },\n { id: \"silo-mts\", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: \"critical\", zone: \"chancado\", nh3: 116 },\n];\n\nexport async function dashboard(opts) {\n var config = readConfig();\n if (!config) {\n console.log(pc.red(\" \u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n var port = parseInt(opts.port) || config.dashboard?.port || 3100;\n var lang = config.lang || \"es\";\n\n if (opts.remote) {\n console.log(pc.yellow(\" \u25C8 \") + \"Conectando a servidor remoto: \" + pc.cyan(opts.remote));\n // TODO: proxy to remote\n return;\n }\n\n var server = createServer(function(req, res) {\n var url = req.url.split(\"?\")[0];\n\n // API endpoints\n if (url === \"/api/v1/sondas\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n var data = SONDAS_DEMO.map(function(s) {\n var j = 0.9 + Math.random() * 0.2;\n return Object.assign({}, s, {\n pm10_live: Math.round(s.pm10 * j),\n pm25_live: Math.round(s.pm25 * j),\n timestamp: new Date().toISOString(),\n nerhia_status: s.status === \"ok\" ? \"monitoring\" : \"suppressing\",\n });\n });\n res.end(JSON.stringify({ ok: true, count: data.length, data: data, timestamp: new Date().toISOString() }));\n return;\n }\n\n if (url === \"/api/v1/ecosystem\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(JSON.stringify({ ok: true, nodes: ECOSYSTEM }));\n return;\n }\n\n if (url === \"/api/v1/nerhia/status\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(JSON.stringify({\n system: \"NERHIA Mining Intelligence\",\n version: \"1.0.0\",\n status: \"operational\",\n sondas_connected: config.sondas || 45,\n suppression_engine: \"cognitive\",\n incompletitud_dinamica: \"activada\",\n ecosystem: Object.keys(ECOSYSTEM),\n }));\n return;\n }\n\n if (url === \"/health\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"healthy\", service: \"nerhia-mining-dashboard\" }));\n return;\n }\n\n // Serve dashboard HTML\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(generateDashboardHTML(config));\n });\n\n server.listen(port, function() {\n console.log(\"\");\n console.log(pc.yellow(\" \u25C8 \") + pc.bold(pc.white(\"NERHIA Mining Dashboard\")));\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n console.log(\" \" + t(lang, \"dashboard_url\") + \" \" + pc.cyan(\"http://localhost:\" + port));\n console.log(\"\");\n console.log(pc.dim(\" API endpoints:\"));\n console.log(pc.dim(\" /api/v1/sondas \u2192 Datos de sondas en vivo\"));\n console.log(pc.dim(\" /api/v1/ecosystem \u2192 Nodos del ecosistema VibraOS\"));\n console.log(pc.dim(\" /api/v1/nerhia/status \u2192 Estado del motor cognitivo\"));\n console.log(\"\");\n console.log(pc.dim(\" Ecosistema conectado:\"));\n Object.values(ECOSYSTEM).forEach(function(node) {\n console.log(pc.dim(\" \" + node.icon + \" \" + node.name));\n });\n console.log(\"\");\n console.log(pc.dim(\" Ctrl+C para detener\"));\n console.log(\"\");\n\n // Auto-open browser\n if (opts.open !== false) {\n import(\"open\").then(function(mod) {\n mod.default(\"http://localhost:\" + port);\n }).catch(function() {});\n }\n });\n}\n\nfunction generateDashboardHTML(config) {\n return '<!DOCTYPE html>\\n<html lang=\"es\">\\n<head>\\n<meta charset=\"UTF-8\">\\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\\n<title>NERHIA \u00B7 Mining Dashboard</title>\\n<link href=\"https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Syne:wght@400;600;800&display=swap\" rel=\"stylesheet\">\\n<style>\\n:root{--bg:#03060f;--bg2:#060a18;--amber:#ff9f1c;--green:#00e87a;--red:#ff3d3d;--cyan:#00f5ff;--purple:#a78bfa;--text:rgba(230,245,255,.92);--muted:rgba(180,210,230,.55);--border:rgba(255,159,28,.12);--mono:\"Space Mono\",monospace;--sans:\"Syne\",sans-serif}\\n*{margin:0;padding:0;box-sizing:border-box}\\nbody{background:var(--bg);color:var(--text);font-family:var(--sans);min-height:100vh}\\nbody::after{content:\"\";position:fixed;inset:0;pointer-events:none;z-index:3000;background-image:url(\"data:image/svg+xml,%3Csvg viewBox=\\'0 0 200 200\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Cfilter id=\\'n\\'%3E%3CfeTurbulence type=\\'fractalNoise\\' baseFrequency=\\'0.85\\' numOctaves=\\'4\\' stitchTiles=\\'stitch\\'/%3E%3C/filter%3E%3Crect width=\\'100%25\\' height=\\'100%25\\' filter=\\'url(%23n)\\' opacity=\\'0.03\\'/%3E%3C/svg%3E\");opacity:.2}\\n.top{display:flex;align-items:center;gap:10px;padding:14px 24px;border-bottom:1px solid var(--border);background:rgba(3,6,15,.95)}\\n.dot{width:7px;height:7px;border-radius:50%;background:var(--amber);box-shadow:0 0 8px var(--amber);animation:p 2s ease-in-out infinite}\\n@keyframes p{0%,100%{opacity:1}50%{opacity:.2}}\\n.brand{font-family:var(--mono);font-size:12px;color:var(--amber);letter-spacing:3px}\\n.live{margin-left:auto;display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;color:var(--green)}\\n.ldot{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 6px var(--green);animation:p 1.5s ease-in-out infinite}\\n.grid{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:rgba(255,255,255,.04);margin:20px}\\n.sonda{background:var(--bg2);padding:20px;text-align:center;transition:background .3s}\\n.sonda:hover{background:rgba(255,159,28,.03)}\\n.sid{font-family:var(--mono);font-size:9px;color:var(--muted);letter-spacing:1.5px;margin-bottom:8px;text-transform:uppercase}\\n.spm{font-family:var(--sans);font-size:36px;font-weight:800;line-height:1;margin-bottom:4px}\\n.sunit{font-family:var(--mono);font-size:8px;color:var(--muted)}\\n.svar{font-family:var(--mono);font-size:11px;font-weight:700;margin-top:8px;padding:2px 6px;display:inline-block}\\n.ok .spm{color:var(--green)}.critical .spm{color:var(--red)}.warning .spm{color:var(--amber)}\\n.vdown{color:var(--green);background:rgba(0,232,122,.08);border:1px solid rgba(0,232,122,.15)}\\n.vup{color:var(--red);background:rgba(255,61,61,.08);border:1px solid rgba(255,61,61,.15)}\\n.eco{padding:20px 24px}\\n.eco-title{font-family:var(--mono);font-size:9px;letter-spacing:2px;color:var(--amber);margin-bottom:12px;text-transform:uppercase}\\n.eco-grid{display:flex;gap:8px;flex-wrap:wrap}\\n.eco-node{font-family:var(--mono);font-size:10px;padding:6px 12px;border:1px solid var(--border);color:var(--muted);text-decoration:none;transition:.2s}\\n.eco-node:hover{border-color:rgba(255,159,28,.4);color:var(--text);background:rgba(255,159,28,.04)}\\n.doctrine{text-align:center;padding:32px 20px;border-top:1px solid var(--border);margin-top:20px}\\n.doctrine p{font-family:var(--mono);font-size:11px;color:var(--amber);opacity:.6;line-height:1.8}\\n</style>\\n</head>\\n<body>\\n<div class=\"top\"><div class=\"dot\"></div><span class=\"brand\">NERHIA \u00B7 MINING DASHBOARD</span><div class=\"live\"><div class=\"ldot\"></div>' + (config.sondas || 45) + ' SONDAS \u00B7 STREAMING</div></div>\\n<div class=\"grid\" id=\"g\"></div>\\n<div class=\"eco\"><div class=\"eco-title\">Ecosistema VibraOS conectado</div><div class=\"eco-grid\" id=\"eco\"></div></div>\\n<div class=\"doctrine\"><p>Incompletitud din\u00E1mica activada \u00B7 Sensibilidad a lo emergente \u00B7 Adaptaci\u00F3n como estado natural</p></div>\\n<script>\\nvar g=document.getElementById(\"g\");\\nfunction render(data){\\n g.innerHTML=\"\";\\n data.forEach(function(s){\\n var cls=s.pm10_live>300?\"critical\":s.pm10_live>80?\"warning\":\"ok\";\\n var vcls=s.varPct>0?\"vup\":\"vdown\";\\n var sign=s.varPct>0?\"+\":\"\";\\n var d=document.createElement(\"div\");\\n d.className=\"sonda \"+cls;\\n d.innerHTML=\\'<div class=\"sid\">\\'+s.id+\\'</div><div class=\"spm\">\\'+s.pm10_live+\\'</div><div class=\"sunit\">PM-10 \u00B5g/m\u00B3</div><div class=\"svar \\'+vcls+\\'\">\\'+sign+s.varPct+\\'%</div>\\';\\n g.appendChild(d);\\n });\\n}\\nfunction fetchSondas(){\\n fetch(\"/api/v1/sondas\").then(function(r){return r.json()}).then(function(d){\\n if(d.ok) render(d.data);\\n }).catch(function(){});\\n}\\nfetchSondas();\\nsetInterval(fetchSondas,3000);\\nfetch(\"/api/v1/ecosystem\").then(function(r){return r.json()}).then(function(d){\\n if(!d.ok) return;\\n var eco=document.getElementById(\"eco\");\\n Object.values(d.nodes).forEach(function(n){\\n var a=document.createElement(\"a\");\\n a.className=\"eco-node\";\\n a.href=n.url;\\n a.target=\"_blank\";\\n a.textContent=n.icon+\" \"+n.name;\\n eco.appendChild(a);\\n });\\n}).catch(function(){});\\n</script>\\n</body>\\n</html>'\n}\n", "// NERHIA \u00B7 doctor command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function doctor(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 doctor\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "// NERHIA \u00B7 suppress command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function suppress(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 suppress\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "import { Command } from \"commander\";\nimport { readJSON, writeJSON, PATHS } from \"../utils/fileStore.js\";\nimport { intro, outro, select, text, confirm } from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nexport const eventsCommand = new Command(\"events\")\n .description(\"Ver y exportar event ledger\")\n .option(\"-l, --list\", \"Listar todos los eventos\")\n .option(\"-a, --add\", \"Agregar nuevo evento\")\n .option(\"-e, --export <format>\", \"Exportar a formato (json|csv)\")\n .action(async (options) => {\n intro(pc.bgCyan(\" NERHIA EVENTS \u2014 Gesti\u00F3n de Eventos de Particulado \"));\n \n const eventsData = readJSON(PATHS.events) || { events: [] };\n \n if (options.list || (!options.add && !options.export)) {\n console.log(pc.cyan(`\\n\uD83D\uDCCA Total de eventos: ${eventsData.events.length}`));\n \n if (eventsData.events.length === 0) {\n console.log(pc.yellow(\"No hay eventos registrados.\"));\n } else {\n eventsData.events.slice(-10).forEach(evt => {\n const color = evt.severity === 'high' ? pc.red : evt.severity === 'medium' ? pc.yellow : pc.green;\n console.log(color(`\\n [${evt.id}] ${evt.type}`));\n console.log(` \uD83D\uDCCD ${evt.location} | \uD83D\uDCC5 ${evt.timestamp}`);\n console.log(` \uD83D\uDCC8 Valor: ${evt.value} ${evt.unit} | Estado: ${evt.status}`);\n });\n }\n }\n \n if (options.add) {\n const type = await select({\n message: \"Tipo de evento:\",\n options: [\n { value: \"PM10_THRESHOLD\", label: \"PM10 Umbral Superado\" },\n { value: \"PM25_THRESHOLD\", label: \"PM2.5 Umbral Superado\" },\n { value: \"SUPPRESS_ACTIVATED\", label: \"Supresi\u00F3n Activada\" },\n { value: \"SENSOR_OFFLINE\", label: \"Sensor Desconectado\" }\n ]\n });\n \n const location = await text({\n message: \"Ubicaci\u00F3n:\",\n placeholder: \"mina-norte\"\n });\n \n const value = await text({\n message: \"Valor medido:\",\n placeholder: \"150\"\n });\n \n const newEvent = {\n id: `evt-${String(eventsData.events.length + 1).padStart(3, '0')}`,\n timestamp: new Date().toISOString(),\n type,\n location,\n value: parseFloat(value),\n unit: type.includes('PM10') ? '\u00B5g/m\u00B3' : 'activaciones',\n severity: 'medium',\n status: 'active'\n };\n \n eventsData.events.push(newEvent);\n eventsData.lastUpdated = new Date().toISOString();\n \n if (writeJSON(PATHS.events, eventsData)) {\n outro(pc.green(`\u2705 Evento ${newEvent.id} registrado exitosamente`));\n } else {\n outro(pc.red(\"\u274C Error al guardar el evento\"));\n }\n }\n \n if (options.export) {\n const format = options.export;\n const timestamp = new Date().toISOString().split('T')[0];\n const filename = `report-${timestamp}.${format}`;\n \n if (format === 'json') {\n writeJSON(PATHS.reports + '/' + filename, eventsData);\n outro(pc.green(`\uD83D\uDCC4 Exportado a reports/${filename}`));\n } else if (format === 'csv') {\n // Simple CSV conversion\n const headers = \"id,timestamp,type,location,value,unit,severity,status\\n\";\n const rows = eventsData.events.map(e => \n `${e.id},${e.timestamp},${e.type},${e.location},${e.value},${e.unit},${e.severity},${e.status}`\n ).join('\\n');\n writeFileSync(PATHS.reports + '/' + filename, headers + rows);\n outro(pc.green(`\uD83D\uDCC4 Exportado a reports/${filename}`));\n }\n }\n });\n\nexport { eventsCommand as events };\n", "import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst ROOT_DIR = join(__dirname, '..', '..', '..');\n\nexport const PATHS = {\n events: join(ROOT_DIR, 'data', 'events.json'),\n sensors: join(ROOT_DIR, 'data', 'sensors.json'),\n suppression: join(ROOT_DIR, 'data', 'suppression-log.json'),\n training: join(ROOT_DIR, 'data', 'training-data.json'),\n config: join(ROOT_DIR, 'config', 'sensors.json'),\n reports: join(ROOT_DIR, 'reports')\n};\n\nexport function readJSON(filepath) {\n if (!existsSync(filepath)) {\n return null;\n }\n try {\n const data = readFileSync(filepath, 'utf8');\n return JSON.parse(data);\n } catch (err) {\n console.error(`Error leyendo ${filepath}:`, err.message);\n return null;\n }\n}\n\nexport function writeJSON(filepath, data) {\n try {\n const dir = dirname(filepath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filepath, JSON.stringify(data, null, 2), 'utf8');\n return true;\n } catch (err) {\n console.error(`Error escribiendo ${filepath}:`, err.message);\n return false;\n }\n}\n\nexport function ensureDataDir() {\n const dirs = ['data', 'reports', 'config', 'models'];\n dirs.forEach(dir => {\n const path = join(ROOT_DIR, dir);\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Watch Command\n// npx nerhia watch --verbose\n// Modo vigilancia continua en terminal\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nvar SONDAS = [\n { id: \"correa-01a\", pm10: 8, status: \"ok\" },\n { id: \"edificio-f3\", pm10: 22, status: \"ok\" },\n { id: \"edificio-e4\", pm10: 3, status: \"ok\" },\n { id: \"pila-2\", pm10: 282, status: \"critical\" },\n { id: \"silo-mts\", pm10: 483, status: \"critical\" },\n];\n\nexport async function watch(opts) {\n var config = readConfig();\n if (!config) {\n console.log(pc.red(\" \u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n var lang = config.lang || \"es\";\n var interval = parseInt(opts.interval) || 30;\n var verbose = opts.verbose || false;\n var cycle = 0;\n\n console.log(\"\");\n console.log(pc.yellow(\" \u25C8 \") + pc.bold(pc.white(\"NERHIA MINING \u00B7 WATCH MODE\")));\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n console.log(pc.dim(\" Intervalo: \" + interval + \"s \u00B7 Verbose: \" + (verbose ? \"s\u00ED\" : \"no\")));\n console.log(pc.dim(\" \" + t(lang, \"watch_mode\")));\n console.log(\"\");\n\n function tick() {\n cycle++;\n var now = new Date().toTimeString().split(\" \")[0];\n var sondas = SONDAS.map(function(s) {\n var j = 0.85 + Math.random() * 0.3;\n var pm = Math.round(s.pm10 * j);\n var st = pm > 300 ? \"critical\" : pm > 80 ? \"warning\" : \"ok\";\n return { id: s.id, pm10: pm, status: st };\n });\n\n var max = sondas.reduce(function(a, b) { return a.pm10 > b.pm10 ? a : b; });\n var maxC = max.pm10 > 300 ? pc.red : max.pm10 > 150 ? pc.yellow : pc.green;\n var dotC = max.pm10 > 300 ? pc.red(\"\u25CF\") : max.pm10 > 150 ? pc.yellow(\"\u25CF\") : pc.green(\"\u25CF\");\n\n console.log(\n pc.dim(\" [\" + now + \"]\") + \" \" +\n dotC + \" \" +\n pc.dim(\"ciclo \" + cycle) + \" \u00B7 \" +\n pc.dim(\"max=\") + maxC(max.pm10 + \"\") + pc.dim(\" \u00B5g/m\u00B3 (\" + max.id + \")\")\n );\n\n if (verbose) {\n sondas.forEach(function(s) {\n var c = s.pm10 > 300 ? pc.red : s.pm10 > 80 ? pc.yellow : pc.green;\n console.log(pc.dim(\" \u21B3 \" + s.id.padEnd(16)) + c(s.pm10 + \" \u00B5g/m\u00B3\"));\n });\n }\n\n // Cognitive analysis\n if (max.pm10 > 300) {\n console.log(pc.red(\" \u26A1 NERHIA: spike detectado en \" + max.id + \" \u2192 supresi\u00F3n activada \u00B7 caudal AUTO\"));\n } else if (max.pm10 > 200) {\n console.log(pc.yellow(\" \u25C8 NERHIA: tendencia ascendente en \" + max.id + \" \u2192 pre-alerta activa\"));\n }\n }\n\n tick();\n setInterval(tick, interval * 1000);\n}\n", "// NERHIA \u00B7 connect command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function connect(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 connect\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "// NERHIA \u00B7 train command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function train(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 train\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "// NERHIA \u00B7 report command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function report(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 report\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Command", "pc", "writeFileSync", "writeFileSync", "pc", "config", "pc", "pc", "
|
|
3
|
+
"sources": ["../src/index.js", "../src/commands/onboard.js", "../src/utils/banner.js", "../src/i18n/translations.js", "../src/config/store.js", "../src/commands/status.js", "../src/services/liza.js", "../src/services/core.js", "../src/commands/dashboard.js", "../src/commands/doctor.js", "../src/commands/suppress.js", "../src/commands/events.js", "../src/utils/fileStore.js", "../src/commands/watch.js", "../src/commands/connect.js", "../src/commands/train.js", "../src/commands/report.js"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Mining Intelligence CLI\n// No medimos polvo. Lo eliminamos.\n//\n// Reemplaza: npx paperclipai onboard --yes\n// Con: npx nerhia onboard --yes\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { Command } from \"commander\";\nimport { onboard } from \"./commands/onboard.js\";\nimport { status } from \"./commands/status.js\";\nimport { dashboard } from \"./commands/dashboard.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { suppress } from \"./commands/suppress.js\";\nimport { events } from \"./commands/events.js\";\nimport { watch } from \"./commands/watch.js\";\nimport { connect } from \"./commands/connect.js\";\nimport { train } from \"./commands/train.js\";\nimport { report } from \"./commands/report.js\";\nimport { LANGS, DEFAULT_LANG } from \"./i18n/translations.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"nerhia\")\n .description(\n \"NERHIA Mining Intelligence \u2014 Supresi\u00F3n cognitiva de polvo.\\n\" +\n \"No medimos polvo. Lo eliminamos.\\n\\n\" +\n \"Ecosistema: github.com/leoncanales23/\"\n )\n .version(\"1.0.0\");\n\n// \u2500\u2500 Global options \u2500\u2500\nprogram.option(\n \"--lang <code>\",\n `Idioma: ${LANGS.join(\", \")} (default: ${DEFAULT_LANG})`,\n DEFAULT_LANG\n);\nprogram.option(\"-c, --config <path>\", \"Ruta al archivo de configuraci\u00F3n\");\n\n// \u2500\u2500 ONBOARD \u2500\u2500\nprogram\n .command(\"onboard\")\n .description(\"Asistente de primera configuraci\u00F3n \u00B7 Setup wizard\")\n .option(\"-y, --yes\", \"Aceptar defaults (quickstart)\", false)\n .option(\"--lang <code>\", `Idioma (${LANGS.join(\", \")})`, DEFAULT_LANG)\n .option(\"--run\", \"Iniciar vigilancia inmediatamente despu\u00E9s de configurar\", false)\n .action(onboard);\n\n// \u2500\u2500 STATUS \u2500\u2500\nprogram\n .command(\"status\")\n .description(\"Estado en vivo de todas las sondas\")\n .option(\"--json\", \"Salida en formato JSON\", false)\n .option(\"--watch\", \"Actualizar cada 5 segundos\", false)\n .action(status);\n\n// \u2500\u2500 DASHBOARD \u2500\u2500\nprogram\n .command(\"dashboard\")\n .description(\"Abrir dashboard web conectado al ecosistema VibraOS\")\n .option(\"-p, --port <number>\", \"Puerto del servidor web\", \"3100\")\n .option(\"--remote <url>\", \"Conectar a servidor remoto\")\n .option(\"--no-open\", \"No abrir navegador autom\u00E1ticamente\")\n .action(dashboard);\n\n// \u2500\u2500 CONNECT \u2500\u2500\nprogram\n .command(\"connect\")\n .description(\"Conectar fuente de datos (Grafana, EVControl, CSV)\")\n .option(\"--source <type>\", \"Tipo: grafana, evcontrol, csv, demo\")\n .option(\"--url <endpoint>\", \"URL del endpoint\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\"--file <path>\", \"Ruta al archivo CSV\")\n .option(\"--server <url>\", \"Conectar a servidor NERHIA remoto\")\n .action(connect);\n\n// \u2500\u2500 SUPPRESS \u2500\u2500\nprogram\n .command(\"suppress\")\n .description(\"Activar supresi\u00F3n manual o por zona\")\n .option(\"--zone <name>\", \"Zona espec\u00EDfica (ej: silo-mts)\")\n .option(\"--all\", \"Todas las zonas\", false)\n .option(\"--intensity <level>\", \"Intensidad: low, medium, high, auto\", \"auto\")\n .action(suppress);\n\n// \u2500\u2500 EVENTS \u2500\u2500\nprogram\n .command(\"events\")\n .description(\"Ver y exportar event ledger\")\n .option(\"--last <duration>\", \"\u00DAltimas horas/d\u00EDas (ej: 24h, 7d)\")\n .option(\"--sonda <id>\", \"Filtrar por sonda\")\n .option(\"--from <date>\", \"Desde fecha (YYYY-MM-DD)\")\n .option(\"--to <date>\", \"Hasta fecha (YYYY-MM-DD)\")\n .option(\"--export <format>\", \"Exportar: csv, json\")\n .option(\"--file <path>\", \"Ruta del archivo exportado\")\n .option(\"--live\", \"Modo streaming en vivo\", false)\n .option(\"--follow\", \"Seguir nuevos eventos (como tail -f)\", false)\n .action(events);\n\n// \u2500\u2500 WATCH \u2500\u2500\nprogram\n .command(\"watch\")\n .description(\"Modo vigilancia continua en terminal\")\n .option(\"--verbose\", \"Mostrar cada lectura de sonda\", false)\n .option(\"--interval <seconds>\", \"Intervalo de lectura\", \"30\")\n .action(watch);\n\n// \u2500\u2500 DOCTOR \u2500\u2500\nprogram\n .command(\"doctor\")\n .description(\"Diagn\u00F3stico del sistema\")\n .action(doctor);\n\n// \u2500\u2500 TRAIN \u2500\u2500\nprogram\n .command(\"train\")\n .description(\"Calibraci\u00F3n cognitiva \u2014 14 d\u00EDas de observaci\u00F3n sin acci\u00F3n\")\n .option(\"--days <number>\", \"Duraci\u00F3n del entrenamiento\", \"14\")\n .option(\"--zone <name>\", \"Zona espec\u00EDfica a calibrar\")\n .action(train);\n\n// \u2500\u2500 REPORT \u2500\u2500\nprogram\n .command(\"report\")\n .description(\"Generar reporte para SERNAGEOMIN\")\n .option(\"--format <type>\", \"Formato: pdf, csv, xlsx\", \"pdf\")\n .option(\"--period <range>\", \"Per\u00EDodo: last-month, last-week, custom\")\n .option(\"--output <path>\", \"Ruta de salida\")\n .action(report);\n\n// \u2500\u2500 CONFIG \u2500\u2500\nprogram\n .command(\"config\")\n .description(\"Ver/editar configuraci\u00F3n\")\n .argument(\"[key]\", \"Clave de configuraci\u00F3n\")\n .argument(\"[value]\", \"Nuevo valor\")\n .action((key, value) => {\n if (!key) {\n // Show config\n console.log(\"Configuraci\u00F3n actual:\");\n // TODO: read and show config\n } else if (value) {\n console.log(`Configurando ${key} = ${value}`);\n } else {\n console.log(`Valor de ${key}:`);\n }\n });\n\n// \u2500\u2500 ALERT \u2500\u2500\nprogram\n .command(\"alert\")\n .description(\"Configurar alertas (WhatsApp, email, webhook)\")\n .option(\"--whatsapp <number>\", \"N\u00FAmero WhatsApp (+56...)\")\n .option(\"--email <address>\", \"Email de alerta\")\n .option(\"--webhook <url>\", \"URL webhook\")\n .option(\"--threshold <pm10>\", \"Threshold PM-10 para alerta\", \"150\")\n .action((opts) => {\n console.log(\"Configurando alertas:\", opts);\n });\n\n// \u2500\u2500 SERVE \u2500\u2500\nprogram\n .command(\"serve\")\n .description(\"Iniciar servidor NERHIA (para modo multi-PC)\")\n .option(\"--host <address>\", \"Direcci\u00F3n de escucha\", \"0.0.0.0\")\n .option(\"-p, --port <number>\", \"Puerto\", \"3100\")\n .action((opts) => {\n console.log(`Servidor NERHIA iniciando en ${opts.host}:${opts.port}`);\n });\n\nprogram.parse();\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Onboard Command\n// npx nerhia onboard --yes\n//\n// Two modes:\n// Y (default) \u2192 Natural language guided by NERHIA\n// N \u2192 Code mode, direct config, minimal output\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { printNerhiaBanner, printDoctrine } from \"../utils/banner.js\";\nimport { t, DEFAULT_LANG } from \"../i18n/translations.js\";\nimport { writeConfig, configExists } from \"../config/store.js\";\n\nexport async function onboard(opts) {\n const lang = opts.lang || opts.parent?.opts()?.lang || DEFAULT_LANG;\n const quickstart = opts.yes || false;\n\n // \u2500\u2500 Banner \u2500\u2500\n printNerhiaBanner(lang);\n\n if (configExists() && !quickstart) {\n const overwrite = await p.confirm({\n message: lang === \"es\"\n ? \"Ya existe una configuraci\u00F3n. \u00BFSobrescribir?\"\n : \"Configuration already exists. Overwrite?\",\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(lang === \"es\" ? \"Cancelado.\" : \"Cancelled.\");\n process.exit(0);\n }\n }\n\n // \u2500\u2500 Y/N Mode Selection \u2500\u2500\n let naturalMode = true;\n\n if (!quickstart) {\n console.log(\"\");\n const modeChoice = await p.confirm({\n message: pc.bold(pc.yellow(\"\u25C8 \")) + t(lang, \"ask_mode\"),\n active: pc.green(\"Y\") + pc.dim(\" \u2192 \" + t(lang, \"mode_y\")),\n inactive: pc.blue(\"N\") + pc.dim(\" \u2192 \" + t(lang, \"mode_n\")),\n initialValue: true,\n });\n\n if (p.isCancel(modeChoice)) {\n p.cancel(\"\");\n process.exit(0);\n }\n naturalMode = modeChoice;\n }\n\n // \u2550\u2550\u2550 NATURAL MODE (Y) \u2550\u2550\u2550\n if (naturalMode && !quickstart) {\n return await onboardNatural(lang);\n }\n\n // \u2550\u2550\u2550 CODE MODE (N) or --yes \u2550\u2550\u2550\n return await onboardCode(lang, quickstart);\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// NATURAL MODE \u2014 NERHIA te gu\u00EDa conversacionalmente\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function onboardNatural(lang) {\n console.log(\"\");\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.magenta(t(lang, \"natural_intro\")))\n );\n console.log(\"\");\n\n await sleep(800);\n\n // Source\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_source_ask\")))\n );\n console.log(\"\");\n\n const source = await p.select({\n message: \"\",\n options: [\n { value: \"grafana\", label: pc.yellow(\"Grafana\") + pc.dim(\" \u2014 \" + t(lang, \"source_grafana\")) },\n { value: \"evcontrol\", label: pc.yellow(\"EVControl\") + pc.dim(\" \u2014 \" + t(lang, \"source_evcontrol\")) },\n { value: \"csv\", label: pc.yellow(\"CSV\") + pc.dim(\" \u2014 \" + t(lang, \"source_csv\")) },\n { value: \"demo\", label: pc.green(\"Demo\") + pc.dim(\" \u2014 \" + t(lang, \"source_demo\")) },\n ],\n });\n if (p.isCancel(source)) { p.cancel(\"\"); process.exit(0); }\n\n let url = \"\";\n let apiKey = \"\";\n\n if (source === \"grafana\" || source === \"evcontrol\") {\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" Bien. Necesito la URL del endpoint.\")\n );\n url = await p.text({\n message: t(lang, \"onboard_url\"),\n placeholder: source === \"grafana\" ? \"https://grafana.evcontrol.cl/api\" : \"https://api.evcontrol.cl/v1\",\n });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n\n apiKey = await p.text({\n message: t(lang, \"onboard_key\"),\n placeholder: \"sk-...\",\n });\n if (p.isCancel(apiKey)) { p.cancel(\"\"); process.exit(0); }\n }\n\n if (source === \"csv\") {\n url = await p.text({\n message: lang === \"es\" ? \"Ruta al archivo CSV:\" : \"Path to CSV file:\",\n placeholder: \"./data/sondas.csv\",\n });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n // Sondas count\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_sondas_ask\")))\n );\n const sondas = await p.text({\n message: \"\",\n placeholder: \"45\",\n defaultValue: \"45\",\n validate: (v) => {\n const n = parseInt(v);\n if (isNaN(n) || n < 1) return lang === \"es\" ? \"N\u00FAmero v\u00E1lido por favor\" : \"Valid number please\";\n },\n });\n if (p.isCancel(sondas)) { p.cancel(\"\"); process.exit(0); }\n\n // Zones\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_zones_ask\")))\n );\n const zones = await p.text({\n message: \"\",\n placeholder: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n defaultValue: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n });\n if (p.isCancel(zones)) { p.cancel(\"\"); process.exit(0); }\n\n // Alerts\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_alerts_ask\")))\n );\n const alerts = await p.confirm({\n message: \"\",\n initialValue: true,\n });\n if (p.isCancel(alerts)) { p.cancel(\"\"); process.exit(0); }\n\n let whatsapp = \"\";\n if (alerts) {\n whatsapp = await p.text({\n message: lang === \"es\" ? \"N\u00FAmero WhatsApp:\" : \"WhatsApp number:\",\n placeholder: \"+56 9 XXXX XXXX\",\n });\n if (p.isCancel(whatsapp)) whatsapp = \"\";\n }\n\n // Save config\n const config = {\n version: \"1.0.0\",\n source: source,\n url: url || null,\n apiKey: apiKey || null,\n sondas: parseInt(sondas),\n zones: zones.split(\",\").map((z) => z.trim()),\n alerts: {\n enabled: alerts,\n whatsapp: whatsapp || null,\n },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n // Done\n console.log(\"\");\n await sleep(600);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.green(t(lang, \"natural_done\")))\n );\n console.log(\"\");\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.dim(t(lang, \"natural_next\"))\n );\n console.log(\"\");\n\n printDoctrine();\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// CODE MODE \u2014 Directo, m\u00EDnimo, modo experto\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function onboardCode(lang, quickstart) {\n const s = p.spinner();\n\n if (quickstart) {\n // --yes flag: accept all defaults\n s.start(t(lang, \"onboard_start\"));\n\n const config = {\n version: \"1.0.0\",\n source: \"demo\",\n url: null,\n apiKey: null,\n sondas: 45,\n zones: [\"silo-mts\", \"pila-2\", \"correa-01a\", \"edificio-f3\", \"edificio-e4\"],\n alerts: { enabled: false, whatsapp: null },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n await sleep(1200);\n s.stop(pc.green(\"\u2713 \") + t(lang, \"onboard_complete\"));\n console.log(\"\");\n console.log(pc.dim(\" \" + t(lang, \"onboard_ready\")));\n console.log(\"\");\n console.log(pc.dim(\" nerhia status \u2192 Estado en vivo\"));\n console.log(pc.dim(\" nerhia dashboard \u2192 Panel web\"));\n console.log(pc.dim(\" nerhia watch \u2192 Vigilancia terminal\"));\n console.log(\"\");\n return;\n }\n\n // Code mode interactive but terse\n const source = await p.select({\n message: t(lang, \"onboard_source\"),\n options: [\n { value: \"grafana\", label: t(lang, \"source_grafana\") },\n { value: \"evcontrol\", label: t(lang, \"source_evcontrol\") },\n { value: \"csv\", label: t(lang, \"source_csv\") },\n { value: \"demo\", label: t(lang, \"source_demo\") },\n ],\n });\n if (p.isCancel(source)) { p.cancel(\"\"); process.exit(0); }\n\n let url = null;\n let apiKey = null;\n\n if (source === \"grafana\" || source === \"evcontrol\") {\n url = await p.text({ message: t(lang, \"onboard_url\") });\n apiKey = await p.text({ message: t(lang, \"onboard_key\") });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n if (source === \"csv\") {\n url = await p.text({ message: \"CSV path:\", placeholder: \"./data/sondas.csv\" });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n const sondas = await p.text({\n message: t(lang, \"onboard_sondas\"),\n defaultValue: \"45\",\n });\n\n const zones = await p.text({\n message: t(lang, \"onboard_zones\"),\n defaultValue: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n });\n\n s.start(t(lang, \"onboard_start\"));\n\n const config = {\n version: \"1.0.0\",\n source,\n url: url || null,\n apiKey: apiKey || null,\n sondas: parseInt(sondas) || 45,\n zones: (zones || \"\").split(\",\").map((z) => z.trim()).filter(Boolean),\n alerts: { enabled: false, whatsapp: null },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n await sleep(800);\n s.stop(pc.green(\"\u2713 \") + t(lang, \"onboard_complete\"));\n console.log(pc.dim(\" \" + t(lang, \"onboard_ready\")));\n console.log(\"\");\n}\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 ASCII Banner\n// Reemplaza Paperclip banner con identidad NERHIA\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\n\nconst NERHIA_ART = [\n \"\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \",\n \"\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\",\n \"\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\",\n \"\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\",\n \"\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\",\n \"\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\",\n];\n\nconst TAGLINE_ES = \"Supresi\u00F3n cognitiva de polvo \u00B7 Mining Intelligence\";\nconst TAGLINE_EN = \"Cognitive dust suppression \u00B7 Mining Intelligence\";\nconst DOCTRINE = \"Incompletitud din\u00E1mica activada\";\n\nexport function printNerhiaBanner(lang = \"es\") {\n const tagline = lang === \"es\" ? TAGLINE_ES : TAGLINE_EN;\n const lines = [\n \"\",\n ...NERHIA_ART.map((line) => pc.yellow(line)),\n pc.dim(pc.yellow(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\")),\n \" \" + pc.bold(pc.white(\"\u25C8 \" + tagline)),\n \" \" + pc.dim(pc.magenta(DOCTRINE)),\n \"\",\n ];\n console.log(lines.join(\"\\n\"));\n}\n\nexport function printMiniStatus(sondas, lang = \"es\") {\n const dot = pc.green(\"\u25CF\");\n const warn = pc.yellow(\"\u25CF\");\n const crit = pc.red(\"\u25CF\");\n\n console.log(\"\");\n console.log(\n pc.dim(\" \u25C8 NERHIA MINING\") +\n pc.dim(\" \u00B7 \") +\n pc.green(sondas + \" sondas\") +\n pc.dim(\" \u00B7 \") +\n dot +\n pc.dim(\" sistema activo\")\n );\n console.log(\"\");\n}\n\nexport function printDoctrine() {\n const lines = [\n \"\",\n pc.dim(\" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Incompletitud din\u00E1mica activada. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Sensibilidad a lo emergente. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Adaptaci\u00F3n como estado natural. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + \" \" + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.white(\" El sistema no busca el estado perfecto. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.white(\" Busca el siguiente estado correcto. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\"),\n \"\",\n ];\n console.log(lines.join(\"\\n\"));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Internationalization\n// Idioma primordial: Espa\u00F1ol\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const LANGS = [\"es\", \"en\", \"ja\", \"de\", \"ko\", \"zh\"];\nexport const DEFAULT_LANG = \"es\";\n\nexport const T = {\n es: {\n welcome: \"Bienvenido a NERHIA Mining Intelligence\",\n tagline: \"No medimos polvo. Lo eliminamos.\",\n doctrine: \"Incompletitud din\u00E1mica activada. Sensibilidad a lo emergente. Adaptaci\u00F3n como estado natural.\",\n ask_mode: \"\u00BFAvanzar en lenguaje natural?\",\n mode_y: \"NERHIA te gu\u00EDa conversacionalmente\",\n mode_n: \"NERHIA avanza en modo c\u00F3digo directo\",\n onboard_start: \"Iniciando configuraci\u00F3n...\",\n onboard_source: \"\u00BFDe d\u00F3nde vienen los datos de las sondas?\",\n source_grafana: \"Grafana (API existente)\",\n source_evcontrol: \"EVControl (directo)\",\n source_csv: \"Archivo CSV local\",\n source_demo: \"Modo demo (datos simulados)\",\n onboard_url: \"URL del endpoint de datos:\",\n onboard_key: \"API key (si aplica):\",\n onboard_sondas: \"\u00BFCu\u00E1ntas sondas tiene la instalaci\u00F3n?\",\n onboard_zones: \"Nombre de las zonas de monitoreo (separadas por coma):\",\n onboard_alerts: \"\u00BFConfigurar alertas WhatsApp?\",\n onboard_complete: \"NERHIA Mining Intelligence configurado correctamente.\",\n onboard_ready: \"Sistema listo. Las sondas est\u00E1n siendo observadas.\",\n status_header: \"NERHIA MINING \u00B7 ESTADO EN VIVO\",\n status_sondas: \"SONDAS\",\n status_connected: \"conectadas\",\n status_online: \"online\",\n status_pm_max: \"PM-10 MAX\",\n status_pm_avg: \"PM-10 PROM\",\n status_suppress: \"SUPRESI\u00D3N\",\n status_zones_active: \"zonas activas\",\n status_ledger: \"LEDGER\",\n status_events_today: \"eventos hoy\",\n status_last_action: \"\u00DALTIMA ACCI\u00D3N\",\n status_ago: \"hace\",\n status_seconds: \"segundos\",\n status_ok: \"OK\",\n status_warning: \"ALERTA\",\n status_critical: \"CR\u00CDTICO\",\n dashboard_opening: \"Abriendo dashboard...\",\n dashboard_url: \"Dashboard disponible en:\",\n suppress_triggered: \"Supresi\u00F3n activada\",\n suppress_zone: \"Zona\",\n suppress_intensity: \"Intensidad\",\n events_header: \"LEDGER DE EVENTOS\",\n doctor_checking: \"Diagnosticando sistema...\",\n doctor_ok: \"Sistema operativo. Sin anomal\u00EDas.\",\n doctor_warn: \"Anomal\u00EDas detectadas. Ver detalles arriba.\",\n watch_mode: \"Modo vigilancia activo. Ctrl+C para salir.\",\n error_no_config: \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\",\n error_connection: \"Error de conexi\u00F3n con la fuente de datos.\",\n natural_intro: \"Hola. Soy NERHIA. Voy a configurar el sistema de supresi\u00F3n cognitiva contigo.\",\n natural_source_ask: \"Primero necesito saber de d\u00F3nde vienen los datos. \u00BFTienes Grafana, EVControl, o quieres arrancar con datos de demo?\",\n natural_sondas_ask: \"\u00BFCu\u00E1ntas sondas est\u00E1n instaladas en el sitio?\",\n natural_zones_ask: \"Nombra las zonas de monitoreo. Por ejemplo: silo, correa, pila, edificio.\",\n natural_alerts_ask: \"\u00BFQuieres que te avise por WhatsApp cuando haya un evento cr\u00EDtico?\",\n natural_done: \"Listo. El sistema est\u00E1 observando. Cada 30 segundos leo las sondas, analizo la tendencia, y si algo se mueve mal, act\u00FAo antes de que el polvo llegue a respirarse.\",\n natural_next: \"Escribe 'nerhia status' para ver el estado en vivo, o 'nerhia dashboard' para abrir el panel.\",\n },\n en: {\n welcome: \"Welcome to NERHIA Mining Intelligence\",\n tagline: \"We don't measure dust. We eliminate it.\",\n doctrine: \"Dynamic incompleteness activated. Sensitivity to the emergent. Adaptation as natural state.\",\n ask_mode: \"Proceed in natural language?\",\n mode_y: \"NERHIA guides you conversationally\",\n mode_n: \"NERHIA advances in direct code mode\",\n onboard_start: \"Starting configuration...\",\n onboard_source: \"Where does the probe data come from?\",\n source_grafana: \"Grafana (existing API)\",\n source_evcontrol: \"EVControl (direct)\",\n source_csv: \"Local CSV file\",\n source_demo: \"Demo mode (simulated data)\",\n onboard_url: \"Data endpoint URL:\",\n onboard_key: \"API key (if applicable):\",\n onboard_sondas: \"How many probes are installed?\",\n onboard_zones: \"Monitoring zone names (comma separated):\",\n onboard_alerts: \"Configure WhatsApp alerts?\",\n onboard_complete: \"NERHIA Mining Intelligence configured successfully.\",\n onboard_ready: \"System ready. Probes are being observed.\",\n status_header: \"NERHIA MINING \u00B7 LIVE STATUS\",\n status_sondas: \"PROBES\",\n status_connected: \"connected\",\n status_online: \"online\",\n status_pm_max: \"PM-10 MAX\",\n status_pm_avg: \"PM-10 AVG\",\n status_suppress: \"SUPPRESSION\",\n status_zones_active: \"active zones\",\n status_ledger: \"LEDGER\",\n status_events_today: \"events today\",\n status_last_action: \"LAST ACTION\",\n status_ago: \"ago\",\n status_seconds: \"seconds\",\n status_ok: \"OK\",\n status_warning: \"WARNING\",\n status_critical: \"CRITICAL\",\n dashboard_opening: \"Opening dashboard...\",\n dashboard_url: \"Dashboard available at:\",\n suppress_triggered: \"Suppression triggered\",\n suppress_zone: \"Zone\",\n suppress_intensity: \"Intensity\",\n events_header: \"EVENT LEDGER\",\n doctor_checking: \"Diagnosing system...\",\n doctor_ok: \"System operational. No anomalies.\",\n doctor_warn: \"Anomalies detected. See details above.\",\n watch_mode: \"Watch mode active. Ctrl+C to exit.\",\n error_no_config: \"No configuration found. Run: nerhia onboard\",\n error_connection: \"Connection error with data source.\",\n natural_intro: \"Hello. I'm NERHIA. I'll configure the cognitive suppression system with you.\",\n natural_source_ask: \"First I need to know where the data comes from. Do you have Grafana, EVControl, or want to start with demo data?\",\n natural_sondas_ask: \"How many probes are installed at the site?\",\n natural_zones_ask: \"Name the monitoring zones. For example: silo, conveyor, pile, building.\",\n natural_alerts_ask: \"Want me to alert you via WhatsApp when there's a critical event?\",\n natural_done: \"Done. The system is observing. Every 30 seconds I read the probes, analyze the trend, and if something moves wrong, I act before the dust reaches breathing level.\",\n natural_next: \"Type 'nerhia status' to see live state, or 'nerhia dashboard' to open the panel.\",\n },\n ja: {\n welcome: \"NERHIA Mining Intelligence \u3078\u3088\u3046\u3053\u305D\",\n tagline: \"\u7C89\u5875\u3092\u6E2C\u5B9A\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u3001\u9664\u53BB\u3057\u307E\u3059\u3002\",\n doctrine: \"\u52D5\u7684\u4E0D\u5B8C\u5168\u6027\u304C\u6709\u52B9\u3002\u65B0\u8208\u3078\u306E\u611F\u53D7\u6027\u3002\u9069\u5FDC\u304C\u81EA\u7136\u306A\u72B6\u614B\u3002\",\n ask_mode: \"\u81EA\u7136\u8A00\u8A9E\u3067\u9032\u3081\u307E\u3059\u304B\uFF1F\",\n mode_y: \"NERHIA\u304C\u4F1A\u8A71\u5F62\u5F0F\u3067\u30AC\u30A4\u30C9\u3057\u307E\u3059\",\n mode_n: \"NERHIA\u304C\u30B3\u30FC\u30C9\u30E2\u30FC\u30C9\u3067\u76F4\u63A5\u9032\u884C\u3057\u307E\u3059\",\n onboard_start: \"\u8A2D\u5B9A\u3092\u958B\u59CB\u3057\u3066\u3044\u307E\u3059...\",\n onboard_source: \"\u30BB\u30F3\u30B5\u30FC\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u5143\u306F\uFF1F\",\n source_grafana: \"Grafana\uFF08\u65E2\u5B58API\uFF09\",\n source_evcontrol: \"EVControl\uFF08\u76F4\u63A5\u63A5\u7D9A\uFF09\",\n source_csv: \"\u30ED\u30FC\u30AB\u30EBCSV\u30D5\u30A1\u30A4\u30EB\",\n source_demo: \"\u30C7\u30E2\u30E2\u30FC\u30C9\uFF08\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u30C7\u30FC\u30BF\uFF09\",\n status_header: \"NERHIA MINING \u00B7 \u30E9\u30A4\u30D6\u30B9\u30C6\u30FC\u30BF\u30B9\",\n status_ok: \"\u6B63\u5E38\",\n status_warning: \"\u8B66\u544A\",\n status_critical: \"\u5371\u967A\",\n natural_intro: \"\u3053\u3093\u306B\u3061\u306F\u3002NERHIA\u3067\u3059\u3002\u8A8D\u77E5\u6291\u5236\u30B7\u30B9\u30C6\u30E0\u3092\u4E00\u7DD2\u306B\u8A2D\u5B9A\u3057\u307E\u3057\u3087\u3046\u3002\",\n },\n de: {\n welcome: \"Willkommen bei NERHIA Mining Intelligence\",\n tagline: \"Wir messen keinen Staub. Wir eliminieren ihn.\",\n doctrine: \"Dynamische Unvollst\u00E4ndigkeit aktiviert. Empfindlichkeit f\u00FCr das Emergente. Anpassung als nat\u00FCrlicher Zustand.\",\n ask_mode: \"In nat\u00FCrlicher Sprache fortfahren?\",\n mode_y: \"NERHIA f\u00FChrt Sie im Gespr\u00E4ch\",\n mode_n: \"NERHIA f\u00E4hrt im direkten Code-Modus fort\",\n onboard_start: \"Konfiguration wird gestartet...\",\n status_header: \"NERHIA MINING \u00B7 LIVE-STATUS\",\n status_ok: \"OK\",\n status_warning: \"WARNUNG\",\n status_critical: \"KRITISCH\",\n natural_intro: \"Hallo. Ich bin NERHIA. Ich werde das kognitive Unterdr\u00FCckungssystem mit Ihnen konfigurieren.\",\n },\n ko: {\n welcome: \"NERHIA Mining Intelligence\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4\",\n tagline: \"\uBA3C\uC9C0\uB97C \uCE21\uC815\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC81C\uAC70\uD569\uB2C8\uB2E4.\",\n doctrine: \"\uB3D9\uC801 \uBD88\uC644\uC804\uC131 \uD65C\uC131\uD654. \uC2E0\uD765\uC5D0 \uB300\uD55C \uBBFC\uAC10\uC131. \uC801\uC751\uC774 \uC790\uC5F0 \uC0C1\uD0DC.\",\n ask_mode: \"\uC790\uC5F0\uC5B4\uB85C \uC9C4\uD589\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\",\n mode_y: \"NERHIA\uAC00 \uB300\uD654 \uD615\uC2DD\uC73C\uB85C \uC548\uB0B4\uD569\uB2C8\uB2E4\",\n mode_n: \"NERHIA\uAC00 \uCF54\uB4DC \uBAA8\uB4DC\uB85C \uC9C1\uC811 \uC9C4\uD589\uD569\uB2C8\uB2E4\",\n status_header: \"NERHIA MINING \u00B7 \uC2E4\uC2DC\uAC04 \uC0C1\uD0DC\",\n status_ok: \"\uC815\uC0C1\",\n status_warning: \"\uACBD\uACE0\",\n status_critical: \"\uC704\uD5D8\",\n natural_intro: \"\uC548\uB155\uD558\uC138\uC694. NERHIA\uC785\uB2C8\uB2E4. \uC778\uC9C0 \uC5B5\uC81C \uC2DC\uC2A4\uD15C\uC744 \uD568\uAED8 \uAD6C\uC131\uD558\uACA0\uC2B5\uB2C8\uB2E4.\",\n },\n zh: {\n welcome: \"\u6B22\u8FCE\u4F7F\u7528 NERHIA Mining Intelligence\",\n tagline: \"\u6211\u4EEC\u4E0D\u6D4B\u91CF\u7070\u5C18\u3002\u6211\u4EEC\u6D88\u9664\u5B83\u3002\",\n doctrine: \"\u52A8\u6001\u4E0D\u5B8C\u5907\u6027\u5DF2\u6FC0\u6D3B\u3002\u5BF9\u65B0\u5174\u4E8B\u7269\u7684\u654F\u611F\u6027\u3002\u9002\u5E94\u4F5C\u4E3A\u81EA\u7136\u72B6\u6001\u3002\",\n ask_mode: \"\u4F7F\u7528\u81EA\u7136\u8BED\u8A00\u7EE7\u7EED\uFF1F\",\n mode_y: \"NERHIA \u4EE5\u5BF9\u8BDD\u65B9\u5F0F\u5F15\u5BFC\u60A8\",\n mode_n: \"NERHIA \u4EE5\u4EE3\u7801\u6A21\u5F0F\u76F4\u63A5\u63A8\u8FDB\",\n status_header: \"NERHIA MINING \u00B7 \u5B9E\u65F6\u72B6\u6001\",\n status_ok: \"\u6B63\u5E38\",\n status_warning: \"\u8B66\u544A\",\n status_critical: \"\u5371\u9669\",\n natural_intro: \"\u4F60\u597D\u3002\u6211\u662F NERHIA\u3002\u6211\u5C06\u4E0E\u60A8\u4E00\u8D77\u914D\u7F6E\u8BA4\u77E5\u6291\u5236\u7CFB\u7EDF\u3002\",\n },\n};\n\nexport function t(lang, key) {\n const dict = T[lang] || T[DEFAULT_LANG];\n return dict[key] || T[DEFAULT_LANG][key] || key;\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Config Store\n// Almacena en ~/.nerhia/config.json\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { appendFileSync } from \"node:fs\";\n\nconst NERHIA_DIR = join(homedir(), \".nerhia\");\nconst CONFIG_PATH = join(NERHIA_DIR, \"config.json\");\nconst LEDGER_PATH = join(NERHIA_DIR, \"ledger.jsonl\");\n\nexport function ensureDir() {\n if (!existsSync(NERHIA_DIR)) {\n mkdirSync(NERHIA_DIR, { recursive: true });\n }\n}\n\nexport function configExists() {\n return existsSync(CONFIG_PATH);\n}\n\nexport function readConfig() {\n if (!configExists()) return null;\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nexport function writeConfig(config) {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\nexport function appendLedger(event) {\n ensureDir();\n const entry = {\n ...event,\n timestamp: new Date().toISOString(),\n };\n const line = JSON.stringify(entry) + \"\\n\";\n try {\n appendFileSync(LEDGER_PATH, line, \"utf-8\");\n } catch {\n writeFileSync(LEDGER_PATH, line, { flag: \"a\", encoding: \"utf-8\" });\n }\n}\n\nexport function readLedger(filter = {}) {\n if (!existsSync(LEDGER_PATH)) return [];\n try {\n const lines = readFileSync(LEDGER_PATH, \"utf-8\").trim().split(\"\\n\").filter(Boolean);\n let events = lines.map((l) => JSON.parse(l));\n\n if (filter.sonda) {\n events = events.filter((e) => e.sonda === filter.sonda);\n }\n if (filter.from) {\n events = events.filter((e) => e.timestamp >= filter.from);\n }\n if (filter.to) {\n events = events.filter((e) => e.timestamp <= filter.to);\n }\n if (filter.last) {\n const now = Date.now();\n const ms = parseDuration(filter.last);\n events = events.filter((e) => now - new Date(e.timestamp).getTime() < ms);\n }\n\n return events;\n } catch {\n return [];\n }\n}\n\nfunction parseDuration(str) {\n const match = str.match(/^(\\d+)(h|d|m|s)$/);\n if (!match) return 24 * 60 * 60 * 1000; // default 24h\n const n = parseInt(match[1]);\n const unit = match[2];\n const multipliers = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return n * (multipliers[unit] || 3600000);\n}\n\nexport const paths = {\n dir: NERHIA_DIR,\n config: CONFIG_PATH,\n ledger: LEDGER_PATH,\n};\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Status Command\n// npx nerhia status\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\nimport { fetchLizaRealtime } from \"../services/liza.js\";\nimport { fetchCoreHealth, fetchCoreAirContext } from \"../services/core.js\";\n\nvar SONDAS_DEMO = [\n { id: \"correa-01a\", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: \"ok\", zone: \"transporte\" },\n { id: \"edificio-f3\",pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: \"ok\", zone: \"edificio\" },\n { id: \"edificio-e4\",pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: \"ok\", zone: \"edificio\" },\n { id: \"pila-2\", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: \"critical\", zone: \"chancado\" },\n { id: \"silo-mts\", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: \"critical\", zone: \"chancado\" },\n];\n\nexport async function status(opts) {\n var config = readConfig();\n if (!config) {\n console.log(pc.red(\" \\u2717 \") + \"No hay configuraci\\u00f3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n var lang = config.lang || \"es\";\n var sondas = addJitter(SONDAS_DEMO);\n var maxPM = Math.max.apply(null, sondas.map(function(s) { return s.pm10; }));\n var avgPM = Math.round(sondas.reduce(function(a, s) { return a + s.pm10; }, 0) / sondas.length);\n var critCount = sondas.filter(function(s) { return s.status === \"critical\"; }).length;\n\n // \u2500\u2500 Fuentes externas (paralelo, sin bloquear si fallan) \u2500\u2500\n var liza = null;\n var coreHealth = null;\n var coreAir = null;\n\n var [lizaResult, coreHealthResult, coreAirResult] = await Promise.allSettled([\n fetchLizaRealtime(),\n fetchCoreHealth(),\n fetchCoreAirContext(),\n ]);\n\n if (lizaResult.status === \"fulfilled\" && lizaResult.value?.ok) liza = lizaResult.value;\n if (coreHealthResult.status === \"fulfilled\" && coreHealthResult.value?.ok) coreHealth = coreHealthResult.value;\n if (coreAirResult.status === \"fulfilled\" && coreAirResult.value?.ok) coreAir = coreAirResult.value;\n\n // \u2500\u2500 JSON mode \u2500\u2500\n if (opts.json) {\n console.log(JSON.stringify({\n timestamp: new Date().toISOString(),\n sondas_total: config.sondas,\n sondas_data: sondas,\n pm10_max: maxPM,\n pm10_avg: avgPM,\n critical_zones: critCount,\n liza: liza,\n core: coreHealth,\n core_air: coreAir,\n system: \"operational\",\n }, null, 2));\n return;\n }\n\n // \u2500\u2500 Header \u2500\u2500\n console.log(\"\");\n console.log(pc.yellow(\" \\u25c8 \") + pc.bold(pc.white(t(lang, \"status_header\"))));\n console.log(pc.dim(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\"));\n console.log(\"\");\n\n var maxSonda = sondas.reduce(function(a, b) { return a.pm10 > b.pm10 ? a : b; });\n var maxColor = maxPM > 300 ? pc.red : maxPM > 150 ? pc.yellow : pc.green;\n var avgColor = avgPM > 200 ? pc.red : avgPM > 100 ? pc.yellow : pc.green;\n\n row(\" \" + t(lang, \"status_sondas\"), config.sondas + \" \" + t(lang, \"status_connected\"), pc.green(\"\\u25cf \" + t(lang, \"status_online\")));\n row(\" \" + t(lang, \"status_pm_max\"), maxColor(maxPM + \" \\u00b5g/m\\u00b3\"), pc.dim(maxSonda.id) + \" \" + dot(maxSonda.status, lang));\n row(\" \" + t(lang, \"status_pm_avg\"), avgColor(avgPM + \" \\u00b5g/m\\u00b3\"), pc.dim(\"flota\") + \" \" + (avgPM > 150 ? dot(\"warning\", lang) : dot(\"ok\", lang)));\n row(\" \" + t(lang, \"status_suppress\"), critCount + \" \" + t(lang, \"status_zones_active\"), \"\");\n row(\" \" + t(lang, \"status_ledger\"), \"1,247 \" + t(lang, \"status_events_today\"), \"\");\n row(\" \" + t(lang, \"status_last_action\"),t(lang, \"status_ago\") + \" 12 \" + t(lang, \"status_seconds\"), \"\");\n\n // \u2500\u2500 LIZA/SINCA \u2500\u2500\n if (liza) {\n var lizaColor = liza.alerta === \"CR\\u00cdTICO\" ? pc.red : liza.alerta === \"ALERTA\" ? pc.yellow : pc.green;\n row(\" \\U0001f310 LIZA/SINCA\", \"PM10: \" + liza.pm10 + \" | PM2.5: \" + liza.pm25, lizaColor(\"\\u25cf \" + liza.alerta));\n console.log(pc.dim(\" Fuente: \" + liza.source));\n } else {\n row(\" \\U0001f310 LIZA/SINCA\", \"sin conexi\\u00f3n\", pc.dim(\"\\u25cf offline\"));\n }\n\n // \u2500\u2500 VIBRAALTO CORE \u2500\u2500\n if (coreHealth) {\n row(\" \\U0001f9e0 VIBRAALTO CORE\", \"conectado\", pc.green(\"\\u25cf online\"));\n if (coreAir) {\n var coreColor = coreAir.recommendation === \"CRITICO\" ? pc.red : coreAir.recommendation === \"ALERTA\" ? pc.yellow : pc.green;\n console.log(pc.dim(\" Core: PM10 ref \" + coreAir.pm10_reference + \" | PM2.5 ref \" + coreAir.pm25_reference + \" \" + coreAir.recommendation));\n }\n } else {\n row(\" \\U0001f9e0 VIBRAALTO CORE\", \"no disponible\", pc.dim(\"\\u25cf offline\"));\n }\n\n // \u2500\u2500 Tabla sondas \u2500\u2500\n console.log(\"\");\n console.log(pc.dim(\" \\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\\u2500\"));\n\n sondas.forEach(function(s) {\n var pmColor = s.pm10 > 300 ? pc.red : s.pm10 > 80 ? pc.yellow : pc.green;\n var varSign = s.varPct > 0 ? \"\\u2191\" : \"\\u2193\";\n var varColor = s.varPct > 0 ? pc.red : pc.green;\n console.log(\n pc.dim((\" \" + s.id).padEnd(20)) +\n pmColor((s.pm10 + \" \\u00b5g/m\\u00b3\").padEnd(14)) +\n varColor((varSign + Math.abs(s.varPct) + \"%\").padEnd(10)) +\n dot(s.status, lang)\n );\n });\n\n console.log(\"\");\n\n if (opts.watch) {\n console.log(pc.dim(\" Actualizando cada 5s... Ctrl+C para salir\"));\n setInterval(function() {\n process.stdout.write(\"\\x1B[\" + (sondas.length + 20) + \"A\");\n status({ json: false, watch: false });\n }, 5000);\n }\n}\n\nfunction row(label, value, extra) {\n console.log(label.padEnd(22) + pc.bold(pc.white(value)) + (extra ? \" \" + extra : \"\"));\n}\n\nfunction dot(st, lang) {\n if (st === \"critical\") return pc.red(\"\\u25cf \" + t(lang, \"status_critical\"));\n if (st === \"warning\") return pc.yellow(\"\\u25cf \" + t(lang, \"status_warning\"));\n return pc.green(\"\\u25cf \" + t(lang, \"status_ok\"));\n}\n\nfunction addJitter(sondas) {\n return sondas.map(function(s) {\n var j = 0.9 + Math.random() * 0.2;\n return Object.assign({}, s, { pm10: Math.round(s.pm10 * j), pm25: Math.round(s.pm25 * j) });\n });\n}\n", "async function fetchLizaRealtime() {\n const res = await fetch(\n 'https://api.openaq.org/v3/locations/25/latest',\n { headers: { 'X-API-Key': '8401ef9a7ba8c1c7af76cc82869201b6213905b9224ce18f7639aa221a3336b9' }}\n );\n \n const data = await res.json();\n \n const ahora = new Date();\n const recientes = data.results.filter((r) => {\n const fecha = new Date(r.datetime.utc);\n return (ahora.getTime() - fecha.getTime()) < 24 * 60 * 60 * 1000;\n });\n \n const pm10 = recientes.find((r) => r.sensorsId === 1047)?.value || 0;\n const pm25 = recientes.find((r) => r.sensorsId === 1044)?.value || 0;\n \n return {\n pm10,\n pm25,\n timestamp: new Date().toLocaleTimeString('es-CL'),\n alerta: pm10 > 150 ? 'CRITICO' : pm10 > 100 ? 'ALERTA' : 'NORMAL',\n source: 'LIZA/SINCA - Parque OHiggins'\n };\n}\n\nexport { fetchLizaRealtime };\n", "// NERHIA \u00B7 Servicio VibraAlto Core\n// VIBRAALTO_CORE_URL=http://localhost:5001/vibraaltoai-11f55/us-central1/vmc\n\nvar CORE_BASE = (typeof process !== \"undefined\" && process.env.VIBRAALTO_CORE_URL)\n || \"https://us-central1-vibraaltoai-11f55.cloudfunctions.net/api\";\n\nexport async function fetchCoreHealth() {\n try {\n var res = await fetch(CORE_BASE + \"/core/health\", { signal: AbortSignal.timeout(3000) });\n if (!res.ok) return { ok: false, error: \"http_\" + res.status };\n return await res.json();\n } catch { return { ok: false, error: \"offline\" }; }\n}\n\nexport async function fetchCoreAirContext() {\n try {\n var res = await fetch(CORE_BASE + \"/core/air-context\", { signal: AbortSignal.timeout(3000) });\n if (!res.ok) return { ok: false, error: \"http_\" + res.status };\n return await res.json();\n } catch { return { ok: false, error: \"offline\" }; }\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Dashboard Command\n// npx nerhia dashboard\n// Sirve el dashboard web y conecta con el ecosistema VibraOS\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\nimport { createServer } from \"node:http\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nvar ECOSYSTEM = {\n nerhia_urban: { name: \"NERHIA Urban\", url: \"https://vibraalto.cl/nerhia\", icon: \"\uD83C\uDF10\" },\n nerhia_core: { name: \"NERHIA Core\", url: \"https://vibraalto.cl/nerhia/core.html\", icon: \"\uD83E\uDDE0\" },\n satellite: { name: \"Vibraalto Satellite\", url: \"https://vibraalto-satellite.onrender.com\", icon: \"\uD83D\uDEF0\" },\n nexus: { name: \"Nexus Ops\", url: \"https://vibraalto.cl/nexus/autopilot.html\", icon: \"\u2B21\" },\n vbc: { name: \"VBC Protocol\", url: \"https://github.com/leoncanales23/vbc-protocol\", icon: \"\uD83D\uDCAA\" },\n vibraworld: { name: \"VibraWorld\", url: \"https://github.com/leoncanales23/vw.vibraworld\", icon: \"\uD83C\uDF0D\" },\n refineria: { name: \"Refiner\u00EDa Digital\", url: \"https://github.com/leoncanales23/refactored-waffle\", icon: \"\uD83C\uDFAC\" },\n};\n\nvar SONDAS_DEMO = [\n { id: \"correa-01a\", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: \"ok\", zone: \"transporte\", nh3: 164 },\n { id: \"edificio-f3\", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: \"ok\", zone: \"edificio\", nh3: 232 },\n { id: \"edificio-e4\", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: \"ok\", zone: \"edificio\", nh3: 101 },\n { id: \"pila-2\", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: \"critical\", zone: \"chancado\", nh3: 100 },\n { id: \"silo-mts\", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: \"critical\", zone: \"chancado\", nh3: 116 },\n];\n\nexport async function dashboard(opts) {\n var config = readConfig();\n if (!config) {\n console.log(pc.red(\" \u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n var port = parseInt(opts.port) || config.dashboard?.port || 3101;\n var lang = config.lang || \"es\";\n\n if (opts.remote) {\n console.log(pc.yellow(\" \u25C8 \") + \"Conectando a servidor remoto: \" + pc.cyan(opts.remote));\n // TODO: proxy to remote\n return;\n }\n\n var server = createServer(function(req, res) {\n var url = req.url.split(\"?\")[0];\n\n // API endpoints\n if (url === \"/api/v1/sondas\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n var data = SONDAS_DEMO.map(function(s) {\n var j = 0.9 + Math.random() * 0.2;\n return Object.assign({}, s, {\n pm10_live: Math.round(s.pm10 * j),\n pm25_live: Math.round(s.pm25 * j),\n timestamp: new Date().toISOString(),\n nerhia_status: s.status === \"ok\" ? \"monitoring\" : \"suppressing\",\n });\n });\n res.end(JSON.stringify({ ok: true, count: data.length, data: data, timestamp: new Date().toISOString() }));\n return;\n }\n\n if (url === \"/api/v1/ecosystem\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(JSON.stringify({ ok: true, nodes: ECOSYSTEM }));\n return;\n }\n\n if (url === \"/api/v1/nerhia/status\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Access-Control-Allow-Origin\": \"*\" });\n res.end(JSON.stringify({\n system: \"NERHIA Mining Intelligence\",\n version: \"1.0.0\",\n status: \"operational\",\n sondas_connected: config.sondas || 45,\n suppression_engine: \"cognitive\",\n incompletitud_dinamica: \"activada\",\n ecosystem: Object.keys(ECOSYSTEM),\n }));\n return;\n }\n\n if (url === \"/health\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"healthy\", service: \"nerhia-mining-dashboard\" }));\n return;\n }\n\n // Serve dashboard HTML\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(generateDashboardHTML(config));\n });\n\n server.listen(port, function() {\n console.log(\"\");\n console.log(pc.yellow(\" \u25C8 \") + pc.bold(pc.white(\"NERHIA Mining Dashboard\")));\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n console.log(\" \" + t(lang, \"dashboard_url\") + \" \" + pc.cyan(\"http://localhost:\" + port));\n console.log(\"\");\n console.log(pc.dim(\" API endpoints:\"));\n console.log(pc.dim(\" /api/v1/sondas \u2192 Datos de sondas en vivo\"));\n console.log(pc.dim(\" /api/v1/ecosystem \u2192 Nodos del ecosistema VibraOS\"));\n console.log(pc.dim(\" /api/v1/nerhia/status \u2192 Estado del motor cognitivo\"));\n console.log(\"\");\n console.log(pc.dim(\" Ecosistema conectado:\"));\n Object.values(ECOSYSTEM).forEach(function(node) {\n console.log(pc.dim(\" \" + node.icon + \" \" + node.name));\n });\n console.log(\"\");\n console.log(pc.dim(\" Ctrl+C para detener\"));\n console.log(\"\");\n\n // Auto-open browser\n if (opts.open !== false) {\n import(\"open\").then(function(mod) {\n mod.default(\"http://localhost:\" + port);\n }).catch(function() {});\n }\n });\n}\n\nfunction generateDashboardHTML(config) {\n return '<!DOCTYPE html>\\n<html lang=\"es\">\\n<head>\\n<meta charset=\"UTF-8\">\\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\\n<title>NERHIA \u00B7 Mining Dashboard</title>\\n<link href=\"https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Syne:wght@400;600;800&display=swap\" rel=\"stylesheet\">\\n<style>\\n:root{--bg:#03060f;--bg2:#060a18;--amber:#ff9f1c;--green:#00e87a;--red:#ff3d3d;--cyan:#00f5ff;--purple:#a78bfa;--text:rgba(230,245,255,.92);--muted:rgba(180,210,230,.55);--border:rgba(255,159,28,.12);--mono:\"Space Mono\",monospace;--sans:\"Syne\",sans-serif}\\n*{margin:0;padding:0;box-sizing:border-box}\\nbody{background:var(--bg);color:var(--text);font-family:var(--sans);min-height:100vh}\\nbody::after{content:\"\";position:fixed;inset:0;pointer-events:none;z-index:3000;background-image:url(\"data:image/svg+xml,%3Csvg viewBox=\\'0 0 200 200\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Cfilter id=\\'n\\'%3E%3CfeTurbulence type=\\'fractalNoise\\' baseFrequency=\\'0.85\\' numOctaves=\\'4\\' stitchTiles=\\'stitch\\'/%3E%3C/filter%3E%3Crect width=\\'100%25\\' height=\\'100%25\\' filter=\\'url(%23n)\\' opacity=\\'0.03\\'/%3E%3C/svg%3E\");opacity:.2}\\n.top{display:flex;align-items:center;gap:10px;padding:14px 24px;border-bottom:1px solid var(--border);background:rgba(3,6,15,.95)}\\n.dot{width:7px;height:7px;border-radius:50%;background:var(--amber);box-shadow:0 0 8px var(--amber);animation:p 2s ease-in-out infinite}\\n@keyframes p{0%,100%{opacity:1}50%{opacity:.2}}\\n.brand{font-family:var(--mono);font-size:12px;color:var(--amber);letter-spacing:3px}\\n.live{margin-left:auto;display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;color:var(--green)}\\n.ldot{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 6px var(--green);animation:p 1.5s ease-in-out infinite}\\n.grid{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:rgba(255,255,255,.04);margin:20px}\\n.sonda{background:var(--bg2);padding:20px;text-align:center;transition:background .3s}\\n.sonda:hover{background:rgba(255,159,28,.03)}\\n.sid{font-family:var(--mono);font-size:9px;color:var(--muted);letter-spacing:1.5px;margin-bottom:8px;text-transform:uppercase}\\n.spm{font-family:var(--sans);font-size:36px;font-weight:800;line-height:1;margin-bottom:4px}\\n.sunit{font-family:var(--mono);font-size:8px;color:var(--muted)}\\n.svar{font-family:var(--mono);font-size:11px;font-weight:700;margin-top:8px;padding:2px 6px;display:inline-block}\\n.ok .spm{color:var(--green)}.critical .spm{color:var(--red)}.warning .spm{color:var(--amber)}\\n.vdown{color:var(--green);background:rgba(0,232,122,.08);border:1px solid rgba(0,232,122,.15)}\\n.vup{color:var(--red);background:rgba(255,61,61,.08);border:1px solid rgba(255,61,61,.15)}\\n.eco{padding:20px 24px}\\n.eco-title{font-family:var(--mono);font-size:9px;letter-spacing:2px;color:var(--amber);margin-bottom:12px;text-transform:uppercase}\\n.eco-grid{display:flex;gap:8px;flex-wrap:wrap}\\n.eco-node{font-family:var(--mono);font-size:10px;padding:6px 12px;border:1px solid var(--border);color:var(--muted);text-decoration:none;transition:.2s}\\n.eco-node:hover{border-color:rgba(255,159,28,.4);color:var(--text);background:rgba(255,159,28,.04)}\\n.doctrine{text-align:center;padding:32px 20px;border-top:1px solid var(--border);margin-top:20px}\\n.doctrine p{font-family:var(--mono);font-size:11px;color:var(--amber);opacity:.6;line-height:1.8}\\n</style>\\n</head>\\n<body>\\n<div class=\"top\"><div class=\"dot\"></div><span class=\"brand\">NERHIA \u00B7 MINING DASHBOARD</span><div class=\"live\"><div class=\"ldot\"></div>' + (config.sondas || 45) + ' SONDAS \u00B7 STREAMING</div></div>\\n<div class=\"grid\" id=\"g\"></div>\\n<div class=\"eco\"><div class=\"eco-title\">Ecosistema VibraOS conectado</div><div class=\"eco-grid\" id=\"eco\"></div></div>\\n<div class=\"doctrine\"><p>Incompletitud din\u00E1mica activada \u00B7 Sensibilidad a lo emergente \u00B7 Adaptaci\u00F3n como estado natural</p></div>\\n<script>\\nvar g=document.getElementById(\"g\");\\nfunction render(data){\\n g.innerHTML=\"\";\\n data.forEach(function(s){\\n var cls=s.pm10_live>300?\"critical\":s.pm10_live>80?\"warning\":\"ok\";\\n var vcls=s.varPct>0?\"vup\":\"vdown\";\\n var sign=s.varPct>0?\"+\":\"\";\\n var d=document.createElement(\"div\");\\n d.className=\"sonda \"+cls;\\n d.innerHTML=\\'<div class=\"sid\">\\'+s.id+\\'</div><div class=\"spm\">\\'+s.pm10_live+\\'</div><div class=\"sunit\">PM-10 \u00B5g/m\u00B3</div><div class=\"svar \\'+vcls+\\'\">\\'+sign+s.varPct+\\'%</div>\\';\\n g.appendChild(d);\\n });\\n}\\nfunction fetchSondas(){\\n fetch(\"/api/v1/sondas\").then(function(r){return r.json()}).then(function(d){\\n if(d.ok) render(d.data);\\n }).catch(function(){});\\n}\\nfetchSondas();\\nsetInterval(fetchSondas,3000);\\nfetch(\"/api/v1/ecosystem\").then(function(r){return r.json()}).then(function(d){\\n if(!d.ok) return;\\n var eco=document.getElementById(\"eco\");\\n Object.values(d.nodes).forEach(function(n){\\n var a=document.createElement(\"a\");\\n a.className=\"eco-node\";\\n a.href=n.url;\\n a.target=\"_blank\";\\n a.textContent=n.icon+\" \"+n.name;\\n eco.appendChild(a);\\n });\\n}).catch(function(){});\\n</script>\\n</body>\\n</html>'\n}\n", "// NERHIA \u00B7 doctor command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function doctor(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 doctor\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "// NERHIA \u00B7 suppress command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function suppress(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 suppress\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "import { Command } from \"commander\";\nimport { readJSON, writeJSON, PATHS } from \"../utils/fileStore.js\";\nimport { intro, outro, select, text, confirm } from \"@clack/prompts\";\nimport pc from \"picocolors\";\n\nexport const eventsCommand = new Command(\"events\")\n .description(\"Ver y exportar event ledger\")\n .option(\"-l, --list\", \"Listar todos los eventos\")\n .option(\"-a, --add\", \"Agregar nuevo evento\")\n .option(\"-e, --export <format>\", \"Exportar a formato (json|csv)\")\n .action(async (options) => {\n intro(pc.bgCyan(\" NERHIA EVENTS \u2014 Gesti\u00F3n de Eventos de Particulado \"));\n \n const eventsData = readJSON(PATHS.events) || { events: [] };\n \n if (options.list || (!options.add && !options.export)) {\n console.log(pc.cyan(`\\n\uD83D\uDCCA Total de eventos: ${eventsData.events.length}`));\n \n if (eventsData.events.length === 0) {\n console.log(pc.yellow(\"No hay eventos registrados.\"));\n } else {\n eventsData.events.slice(-10).forEach(evt => {\n const color = evt.severity === 'high' ? pc.red : evt.severity === 'medium' ? pc.yellow : pc.green;\n console.log(color(`\\n [${evt.id}] ${evt.type}`));\n console.log(` \uD83D\uDCCD ${evt.location} | \uD83D\uDCC5 ${evt.timestamp}`);\n console.log(` \uD83D\uDCC8 Valor: ${evt.value} ${evt.unit} | Estado: ${evt.status}`);\n });\n }\n }\n \n if (options.add) {\n const type = await select({\n message: \"Tipo de evento:\",\n options: [\n { value: \"PM10_THRESHOLD\", label: \"PM10 Umbral Superado\" },\n { value: \"PM25_THRESHOLD\", label: \"PM2.5 Umbral Superado\" },\n { value: \"SUPPRESS_ACTIVATED\", label: \"Supresi\u00F3n Activada\" },\n { value: \"SENSOR_OFFLINE\", label: \"Sensor Desconectado\" }\n ]\n });\n \n const location = await text({\n message: \"Ubicaci\u00F3n:\",\n placeholder: \"mina-norte\"\n });\n \n const value = await text({\n message: \"Valor medido:\",\n placeholder: \"150\"\n });\n \n const newEvent = {\n id: `evt-${String(eventsData.events.length + 1).padStart(3, '0')}`,\n timestamp: new Date().toISOString(),\n type,\n location,\n value: parseFloat(value),\n unit: type.includes('PM10') ? '\u00B5g/m\u00B3' : 'activaciones',\n severity: 'medium',\n status: 'active'\n };\n \n eventsData.events.push(newEvent);\n eventsData.lastUpdated = new Date().toISOString();\n \n if (writeJSON(PATHS.events, eventsData)) {\n outro(pc.green(`\u2705 Evento ${newEvent.id} registrado exitosamente`));\n } else {\n outro(pc.red(\"\u274C Error al guardar el evento\"));\n }\n }\n \n if (options.export) {\n const format = options.export;\n const timestamp = new Date().toISOString().split('T')[0];\n const filename = `report-${timestamp}.${format}`;\n \n if (format === 'json') {\n writeJSON(PATHS.reports + '/' + filename, eventsData);\n outro(pc.green(`\uD83D\uDCC4 Exportado a reports/${filename}`));\n } else if (format === 'csv') {\n // Simple CSV conversion\n const headers = \"id,timestamp,type,location,value,unit,severity,status\\n\";\n const rows = eventsData.events.map(e => \n `${e.id},${e.timestamp},${e.type},${e.location},${e.value},${e.unit},${e.severity},${e.status}`\n ).join('\\n');\n writeFileSync(PATHS.reports + '/' + filename, headers + rows);\n outro(pc.green(`\uD83D\uDCC4 Exportado a reports/${filename}`));\n }\n }\n });\n\nexport { eventsCommand as events };\n", "import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst ROOT_DIR = join(__dirname, '..', '..', '..');\n\nexport const PATHS = {\n events: join(ROOT_DIR, 'data', 'events.json'),\n sensors: join(ROOT_DIR, 'data', 'sensors.json'),\n suppression: join(ROOT_DIR, 'data', 'suppression-log.json'),\n training: join(ROOT_DIR, 'data', 'training-data.json'),\n config: join(ROOT_DIR, 'config', 'sensors.json'),\n reports: join(ROOT_DIR, 'reports')\n};\n\nexport function readJSON(filepath) {\n if (!existsSync(filepath)) {\n return null;\n }\n try {\n const data = readFileSync(filepath, 'utf8');\n return JSON.parse(data);\n } catch (err) {\n console.error(`Error leyendo ${filepath}:`, err.message);\n return null;\n }\n}\n\nexport function writeJSON(filepath, data) {\n try {\n const dir = dirname(filepath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filepath, JSON.stringify(data, null, 2), 'utf8');\n return true;\n } catch (err) {\n console.error(`Error escribiendo ${filepath}:`, err.message);\n return false;\n }\n}\n\nexport function ensureDataDir() {\n const dirs = ['data', 'reports', 'config', 'models'];\n dirs.forEach(dir => {\n const path = join(ROOT_DIR, dir);\n if (!existsSync(path)) {\n mkdirSync(path, { recursive: true });\n }\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Watch Command\n// npx nerhia watch --verbose\n// Modo vigilancia continua en terminal\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nvar SONDAS = [\n { id: \"correa-01a\", pm10: 8, status: \"ok\" },\n { id: \"edificio-f3\", pm10: 22, status: \"ok\" },\n { id: \"edificio-e4\", pm10: 3, status: \"ok\" },\n { id: \"pila-2\", pm10: 282, status: \"critical\" },\n { id: \"silo-mts\", pm10: 483, status: \"critical\" },\n];\n\nexport async function watch(opts) {\n var config = readConfig();\n if (!config) {\n console.log(pc.red(\" \u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n var lang = config.lang || \"es\";\n var interval = parseInt(opts.interval) || 30;\n var verbose = opts.verbose || false;\n var cycle = 0;\n\n console.log(\"\");\n console.log(pc.yellow(\" \u25C8 \") + pc.bold(pc.white(\"NERHIA MINING \u00B7 WATCH MODE\")));\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n console.log(pc.dim(\" Intervalo: \" + interval + \"s \u00B7 Verbose: \" + (verbose ? \"s\u00ED\" : \"no\")));\n console.log(pc.dim(\" \" + t(lang, \"watch_mode\")));\n console.log(\"\");\n\n function tick() {\n cycle++;\n var now = new Date().toTimeString().split(\" \")[0];\n var sondas = SONDAS.map(function(s) {\n var j = 0.85 + Math.random() * 0.3;\n var pm = Math.round(s.pm10 * j);\n var st = pm > 300 ? \"critical\" : pm > 80 ? \"warning\" : \"ok\";\n return { id: s.id, pm10: pm, status: st };\n });\n\n var max = sondas.reduce(function(a, b) { return a.pm10 > b.pm10 ? a : b; });\n var maxC = max.pm10 > 300 ? pc.red : max.pm10 > 150 ? pc.yellow : pc.green;\n var dotC = max.pm10 > 300 ? pc.red(\"\u25CF\") : max.pm10 > 150 ? pc.yellow(\"\u25CF\") : pc.green(\"\u25CF\");\n\n console.log(\n pc.dim(\" [\" + now + \"]\") + \" \" +\n dotC + \" \" +\n pc.dim(\"ciclo \" + cycle) + \" \u00B7 \" +\n pc.dim(\"max=\") + maxC(max.pm10 + \"\") + pc.dim(\" \u00B5g/m\u00B3 (\" + max.id + \")\")\n );\n\n if (verbose) {\n sondas.forEach(function(s) {\n var c = s.pm10 > 300 ? pc.red : s.pm10 > 80 ? pc.yellow : pc.green;\n console.log(pc.dim(\" \u21B3 \" + s.id.padEnd(16)) + c(s.pm10 + \" \u00B5g/m\u00B3\"));\n });\n }\n\n // Cognitive analysis\n if (max.pm10 > 300) {\n console.log(pc.red(\" \u26A1 NERHIA: spike detectado en \" + max.id + \" \u2192 supresi\u00F3n activada \u00B7 caudal AUTO\"));\n } else if (max.pm10 > 200) {\n console.log(pc.yellow(\" \u25C8 NERHIA: tendencia ascendente en \" + max.id + \" \u2192 pre-alerta activa\"));\n }\n }\n\n tick();\n setInterval(tick, interval * 1000);\n}\n", "// NERHIA \u00B7 connect command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function connect(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 connect\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "// NERHIA \u00B7 train command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function train(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 train\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n", "// NERHIA \u00B7 report command stub\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nexport async function report(opts) {\n const config = readConfig();\n if (!config) {\n console.log(pc.red(\"\u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n console.log(pc.yellow(\"\u25C8 \") + pc.dim(\"NERHIA \u00B7 report\"));\n console.log(pc.dim(\" Implementaci\u00F3n en progreso...\"));\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Command", "pc", "writeFileSync", "writeFileSync", "pc", "config", "pc", "pc", "pc", "SONDAS_DEMO", "pc", "pc", "pc", "pc", "pc", "readFileSync", "writeFileSync", "existsSync", "mkdirSync", "join", "select", "text", "confirm", "pc", "pc", "pc", "pc", "pc", "pc", "pc", "pc", "pc", "Command"]
|
|
7
7
|
}
|