nerhia 1.0.3 → 1.0.4
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 +167 -58
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,44 @@
|
|
|
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
|
+
});
|
|
2
42
|
|
|
3
43
|
// src/index.js
|
|
4
44
|
import { Command as Command2 } from "commander";
|
|
@@ -556,8 +596,77 @@ function sleep(ms) {
|
|
|
556
596
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
557
597
|
}
|
|
558
598
|
|
|
559
|
-
// src/commands/
|
|
599
|
+
// src/commands/status.js
|
|
560
600
|
import pc3 from "picocolors";
|
|
601
|
+
var SONDAS_DEMO = [
|
|
602
|
+
{ id: "correa-01a", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: "ok", zone: "transporte" },
|
|
603
|
+
{ id: "edificio-f3", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: "ok", zone: "edificio" },
|
|
604
|
+
{ id: "edificio-e4", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: "ok", zone: "edificio" },
|
|
605
|
+
{ id: "pila-2", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: "critical", zone: "chancado" },
|
|
606
|
+
{ id: "silo-mts", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: "critical", zone: "chancado" }
|
|
607
|
+
];
|
|
608
|
+
async function status(opts) {
|
|
609
|
+
const config = readConfig();
|
|
610
|
+
if (!config) {
|
|
611
|
+
console.log(pc3.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
612
|
+
process.exit(1);
|
|
613
|
+
}
|
|
614
|
+
const lang = config.lang || "es";
|
|
615
|
+
const sondas = addJitter(SONDAS_DEMO);
|
|
616
|
+
const maxPM = Math.max(...sondas.map((s) => s.pm10));
|
|
617
|
+
const avgPM = Math.round(sondas.reduce((a, s) => a + s.pm10, 0) / sondas.length);
|
|
618
|
+
const critCount = sondas.filter((s) => s.status === "critical").length;
|
|
619
|
+
console.log("");
|
|
620
|
+
console.log(pc3.yellow(" \u25C8 ") + pc3.bold(pc3.white(t(lang, "status_header"))));
|
|
621
|
+
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
|
+
console.log("");
|
|
623
|
+
const maxSonda = sondas.reduce((a, b) => a.pm10 > b.pm10 ? a : b);
|
|
624
|
+
const maxColor = maxPM > 300 ? pc3.red : maxPM > 150 ? pc3.yellow : pc3.green;
|
|
625
|
+
const avgColor = avgPM > 200 ? pc3.red : avgPM > 100 ? pc3.yellow : pc3.green;
|
|
626
|
+
row(" " + t(lang, "status_sondas"), config.sondas + " " + t(lang, "status_connected"), pc3.green("\u25CF " + t(lang, "status_online")));
|
|
627
|
+
row(" " + t(lang, "status_pm_max"), maxColor(maxPM + " \xB5g/m\xB3"), pc3.dim(maxSonda.id) + " " + dot(maxSonda.status, lang));
|
|
628
|
+
row(" " + t(lang, "status_pm_avg"), avgColor(avgPM + " \xB5g/m\xB3"), pc3.dim("flota") + " " + (avgPM > 150 ? dot("warning", lang) : dot("ok", lang)));
|
|
629
|
+
row(" " + t(lang, "status_suppress"), critCount + " " + t(lang, "status_zones_active"), "");
|
|
630
|
+
row(" " + t(lang, "status_ledger"), "1,247 " + t(lang, "status_events_today"), "");
|
|
631
|
+
row(" " + t(lang, "status_last_action"), t(lang, "status_ago") + " 12 " + t(lang, "status_seconds"), "");
|
|
632
|
+
try {
|
|
633
|
+
const { fetchLizaRealtime: fetchLizaRealtime2 } = await Promise.resolve().then(() => (init_liza(), liza_exports));
|
|
634
|
+
const liza = await fetchLizaRealtime2();
|
|
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);
|
|
637
|
+
console.log(pc3.dim(" Fuente: " + liza.source));
|
|
638
|
+
} catch (e) {
|
|
639
|
+
row(" \u{1F310} LIZA/SINCA", pc3.yellow("\u26A0\uFE0F Sin conexi\xF3n"), "");
|
|
640
|
+
}
|
|
641
|
+
console.log("");
|
|
642
|
+
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"));
|
|
643
|
+
sondas.forEach((s) => {
|
|
644
|
+
const pmColor = s.pm10 > 300 ? pc3.red : s.pm10 > 80 ? pc3.yellow : pc3.green;
|
|
645
|
+
const varSign = s.varPct > 0 ? "\u2191" : "\u2193";
|
|
646
|
+
const varColor = s.varPct > 0 ? pc3.red : pc3.green;
|
|
647
|
+
console.log(
|
|
648
|
+
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)
|
|
649
|
+
);
|
|
650
|
+
});
|
|
651
|
+
console.log("");
|
|
652
|
+
}
|
|
653
|
+
function row(label, value, extra) {
|
|
654
|
+
console.log(label.padEnd(22) + pc3.bold(pc3.white(value)) + (extra ? " " + extra : ""));
|
|
655
|
+
}
|
|
656
|
+
function dot(st, lang) {
|
|
657
|
+
if (st === "critical") return pc3.red("\u25CF " + t(lang, "status_critical"));
|
|
658
|
+
if (st === "warning") return pc3.yellow("\u25CF " + t(lang, "status_warning"));
|
|
659
|
+
return pc3.green("\u25CF " + t(lang, "status_ok"));
|
|
660
|
+
}
|
|
661
|
+
function addJitter(sondas) {
|
|
662
|
+
return sondas.map((s) => {
|
|
663
|
+
const j = 0.9 + Math.random() * 0.2;
|
|
664
|
+
return { ...s, pm10: Math.round(s.pm10 * j), pm25: Math.round(s.pm25 * j) };
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// src/commands/dashboard.js
|
|
669
|
+
import pc4 from "picocolors";
|
|
561
670
|
import { createServer } from "node:http";
|
|
562
671
|
var ECOSYSTEM = {
|
|
563
672
|
nerhia_urban: { name: "NERHIA Urban", url: "https://vibraalto.cl/nerhia", icon: "\u{1F310}" },
|
|
@@ -568,7 +677,7 @@ var ECOSYSTEM = {
|
|
|
568
677
|
vibraworld: { name: "VibraWorld", url: "https://github.com/leoncanales23/vw.vibraworld", icon: "\u{1F30D}" },
|
|
569
678
|
refineria: { name: "Refiner\xEDa Digital", url: "https://github.com/leoncanales23/refactored-waffle", icon: "\u{1F3AC}" }
|
|
570
679
|
};
|
|
571
|
-
var
|
|
680
|
+
var SONDAS_DEMO2 = [
|
|
572
681
|
{ id: "correa-01a", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: "ok", zone: "transporte", nh3: 164 },
|
|
573
682
|
{ id: "edificio-f3", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: "ok", zone: "edificio", nh3: 232 },
|
|
574
683
|
{ id: "edificio-e4", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: "ok", zone: "edificio", nh3: 101 },
|
|
@@ -578,20 +687,20 @@ var SONDAS_DEMO = [
|
|
|
578
687
|
async function dashboard(opts) {
|
|
579
688
|
var config = readConfig();
|
|
580
689
|
if (!config) {
|
|
581
|
-
console.log(
|
|
690
|
+
console.log(pc4.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
582
691
|
process.exit(1);
|
|
583
692
|
}
|
|
584
693
|
var port = parseInt(opts.port) || config.dashboard?.port || 3100;
|
|
585
694
|
var lang = config.lang || "es";
|
|
586
695
|
if (opts.remote) {
|
|
587
|
-
console.log(
|
|
696
|
+
console.log(pc4.yellow(" \u25C8 ") + "Conectando a servidor remoto: " + pc4.cyan(opts.remote));
|
|
588
697
|
return;
|
|
589
698
|
}
|
|
590
699
|
var server = createServer(function(req, res) {
|
|
591
700
|
var url = req.url.split("?")[0];
|
|
592
701
|
if (url === "/api/v1/sondas") {
|
|
593
702
|
res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
|
|
594
|
-
var data =
|
|
703
|
+
var data = SONDAS_DEMO2.map(function(s) {
|
|
595
704
|
var j = 0.9 + Math.random() * 0.2;
|
|
596
705
|
return Object.assign({}, s, {
|
|
597
706
|
pm10_live: Math.round(s.pm10 * j),
|
|
@@ -631,21 +740,21 @@ async function dashboard(opts) {
|
|
|
631
740
|
});
|
|
632
741
|
server.listen(port, function() {
|
|
633
742
|
console.log("");
|
|
634
|
-
console.log(
|
|
635
|
-
console.log(
|
|
636
|
-
console.log(" " + t(lang, "dashboard_url") + " " +
|
|
743
|
+
console.log(pc4.yellow(" \u25C8 ") + pc4.bold(pc4.white("NERHIA Mining Dashboard")));
|
|
744
|
+
console.log(pc4.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"));
|
|
745
|
+
console.log(" " + t(lang, "dashboard_url") + " " + pc4.cyan("http://localhost:" + port));
|
|
637
746
|
console.log("");
|
|
638
|
-
console.log(
|
|
639
|
-
console.log(
|
|
640
|
-
console.log(
|
|
641
|
-
console.log(
|
|
747
|
+
console.log(pc4.dim(" API endpoints:"));
|
|
748
|
+
console.log(pc4.dim(" /api/v1/sondas \u2192 Datos de sondas en vivo"));
|
|
749
|
+
console.log(pc4.dim(" /api/v1/ecosystem \u2192 Nodos del ecosistema VibraOS"));
|
|
750
|
+
console.log(pc4.dim(" /api/v1/nerhia/status \u2192 Estado del motor cognitivo"));
|
|
642
751
|
console.log("");
|
|
643
|
-
console.log(
|
|
752
|
+
console.log(pc4.dim(" Ecosistema conectado:"));
|
|
644
753
|
Object.values(ECOSYSTEM).forEach(function(node) {
|
|
645
|
-
console.log(
|
|
754
|
+
console.log(pc4.dim(" " + node.icon + " " + node.name));
|
|
646
755
|
});
|
|
647
756
|
console.log("");
|
|
648
|
-
console.log(
|
|
757
|
+
console.log(pc4.dim(" Ctrl+C para detener"));
|
|
649
758
|
console.log("");
|
|
650
759
|
if (opts.open !== false) {
|
|
651
760
|
import("open").then(function(mod) {
|
|
@@ -737,27 +846,27 @@ fetch("/api/v1/ecosystem").then(function(r){return r.json()}).then(function(d){
|
|
|
737
846
|
}
|
|
738
847
|
|
|
739
848
|
// src/commands/doctor.js
|
|
740
|
-
import
|
|
849
|
+
import pc5 from "picocolors";
|
|
741
850
|
async function doctor(opts) {
|
|
742
851
|
const config = readConfig();
|
|
743
852
|
if (!config) {
|
|
744
|
-
console.log(
|
|
853
|
+
console.log(pc5.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
745
854
|
process.exit(1);
|
|
746
855
|
}
|
|
747
|
-
console.log(
|
|
748
|
-
console.log(
|
|
856
|
+
console.log(pc5.yellow("\u25C8 ") + pc5.dim("NERHIA \xB7 doctor"));
|
|
857
|
+
console.log(pc5.dim(" Implementaci\xF3n en progreso..."));
|
|
749
858
|
}
|
|
750
859
|
|
|
751
860
|
// src/commands/suppress.js
|
|
752
|
-
import
|
|
861
|
+
import pc6 from "picocolors";
|
|
753
862
|
async function suppress(opts) {
|
|
754
863
|
const config = readConfig();
|
|
755
864
|
if (!config) {
|
|
756
|
-
console.log(
|
|
865
|
+
console.log(pc6.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
757
866
|
process.exit(1);
|
|
758
867
|
}
|
|
759
|
-
console.log(
|
|
760
|
-
console.log(
|
|
868
|
+
console.log(pc6.yellow("\u25C8 ") + pc6.dim("NERHIA \xB7 suppress"));
|
|
869
|
+
console.log(pc6.dim(" Implementaci\xF3n en progreso..."));
|
|
761
870
|
}
|
|
762
871
|
|
|
763
872
|
// src/commands/events.js
|
|
@@ -805,18 +914,18 @@ function writeJSON(filepath, data) {
|
|
|
805
914
|
|
|
806
915
|
// src/commands/events.js
|
|
807
916
|
import { intro, outro, select as select2, text as text2, confirm as confirm2 } from "@clack/prompts";
|
|
808
|
-
import
|
|
917
|
+
import pc7 from "picocolors";
|
|
809
918
|
var eventsCommand = new Command("events").description("Ver y exportar event ledger").option("-l, --list", "Listar todos los eventos").option("-a, --add", "Agregar nuevo evento").option("-e, --export <format>", "Exportar a formato (json|csv)").action(async (options) => {
|
|
810
|
-
intro(
|
|
919
|
+
intro(pc7.bgCyan(" NERHIA EVENTS \u2014 Gesti\xF3n de Eventos de Particulado "));
|
|
811
920
|
const eventsData = readJSON(PATHS.events) || { events: [] };
|
|
812
921
|
if (options.list || !options.add && !options.export) {
|
|
813
|
-
console.log(
|
|
922
|
+
console.log(pc7.cyan(`
|
|
814
923
|
\u{1F4CA} Total de eventos: ${eventsData.events.length}`));
|
|
815
924
|
if (eventsData.events.length === 0) {
|
|
816
|
-
console.log(
|
|
925
|
+
console.log(pc7.yellow("No hay eventos registrados."));
|
|
817
926
|
} else {
|
|
818
927
|
eventsData.events.slice(-10).forEach((evt) => {
|
|
819
|
-
const color = evt.severity === "high" ?
|
|
928
|
+
const color = evt.severity === "high" ? pc7.red : evt.severity === "medium" ? pc7.yellow : pc7.green;
|
|
820
929
|
console.log(color(`
|
|
821
930
|
[${evt.id}] ${evt.type}`));
|
|
822
931
|
console.log(` \u{1F4CD} ${evt.location} | \u{1F4C5} ${evt.timestamp}`);
|
|
@@ -855,9 +964,9 @@ var eventsCommand = new Command("events").description("Ver y exportar event ledg
|
|
|
855
964
|
eventsData.events.push(newEvent);
|
|
856
965
|
eventsData.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
857
966
|
if (writeJSON(PATHS.events, eventsData)) {
|
|
858
|
-
outro(
|
|
967
|
+
outro(pc7.green(`\u2705 Evento ${newEvent.id} registrado exitosamente`));
|
|
859
968
|
} else {
|
|
860
|
-
outro(
|
|
969
|
+
outro(pc7.red("\u274C Error al guardar el evento"));
|
|
861
970
|
}
|
|
862
971
|
}
|
|
863
972
|
if (options.export) {
|
|
@@ -866,20 +975,20 @@ var eventsCommand = new Command("events").description("Ver y exportar event ledg
|
|
|
866
975
|
const filename = `report-${timestamp}.${format}`;
|
|
867
976
|
if (format === "json") {
|
|
868
977
|
writeJSON(PATHS.reports + "/" + filename, eventsData);
|
|
869
|
-
outro(
|
|
978
|
+
outro(pc7.green(`\u{1F4C4} Exportado a reports/${filename}`));
|
|
870
979
|
} else if (format === "csv") {
|
|
871
980
|
const headers = "id,timestamp,type,location,value,unit,severity,status\n";
|
|
872
981
|
const rows = eventsData.events.map(
|
|
873
982
|
(e) => `${e.id},${e.timestamp},${e.type},${e.location},${e.value},${e.unit},${e.severity},${e.status}`
|
|
874
983
|
).join("\n");
|
|
875
984
|
writeFileSync(PATHS.reports + "/" + filename, headers + rows);
|
|
876
|
-
outro(
|
|
985
|
+
outro(pc7.green(`\u{1F4C4} Exportado a reports/${filename}`));
|
|
877
986
|
}
|
|
878
987
|
}
|
|
879
988
|
});
|
|
880
989
|
|
|
881
990
|
// src/commands/watch.js
|
|
882
|
-
import
|
|
991
|
+
import pc8 from "picocolors";
|
|
883
992
|
var SONDAS = [
|
|
884
993
|
{ id: "correa-01a", pm10: 8, status: "ok" },
|
|
885
994
|
{ id: "edificio-f3", pm10: 22, status: "ok" },
|
|
@@ -890,7 +999,7 @@ var SONDAS = [
|
|
|
890
999
|
async function watch(opts) {
|
|
891
1000
|
var config = readConfig();
|
|
892
1001
|
if (!config) {
|
|
893
|
-
console.log(
|
|
1002
|
+
console.log(pc8.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
894
1003
|
process.exit(1);
|
|
895
1004
|
}
|
|
896
1005
|
var lang = config.lang || "es";
|
|
@@ -898,10 +1007,10 @@ async function watch(opts) {
|
|
|
898
1007
|
var verbose = opts.verbose || false;
|
|
899
1008
|
var cycle = 0;
|
|
900
1009
|
console.log("");
|
|
901
|
-
console.log(
|
|
902
|
-
console.log(
|
|
903
|
-
console.log(
|
|
904
|
-
console.log(
|
|
1010
|
+
console.log(pc8.yellow(" \u25C8 ") + pc8.bold(pc8.white("NERHIA MINING \xB7 WATCH MODE")));
|
|
1011
|
+
console.log(pc8.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"));
|
|
1012
|
+
console.log(pc8.dim(" Intervalo: " + interval + "s \xB7 Verbose: " + (verbose ? "s\xED" : "no")));
|
|
1013
|
+
console.log(pc8.dim(" " + t(lang, "watch_mode")));
|
|
905
1014
|
console.log("");
|
|
906
1015
|
function tick() {
|
|
907
1016
|
cycle++;
|
|
@@ -915,21 +1024,21 @@ async function watch(opts) {
|
|
|
915
1024
|
var max = sondas.reduce(function(a, b) {
|
|
916
1025
|
return a.pm10 > b.pm10 ? a : b;
|
|
917
1026
|
});
|
|
918
|
-
var maxC = max.pm10 > 300 ?
|
|
919
|
-
var dotC = max.pm10 > 300 ?
|
|
1027
|
+
var maxC = max.pm10 > 300 ? pc8.red : max.pm10 > 150 ? pc8.yellow : pc8.green;
|
|
1028
|
+
var dotC = max.pm10 > 300 ? pc8.red("\u25CF") : max.pm10 > 150 ? pc8.yellow("\u25CF") : pc8.green("\u25CF");
|
|
920
1029
|
console.log(
|
|
921
|
-
|
|
1030
|
+
pc8.dim(" [" + now + "]") + " " + dotC + " " + pc8.dim("ciclo " + cycle) + " \xB7 " + pc8.dim("max=") + maxC(max.pm10 + "") + pc8.dim(" \xB5g/m\xB3 (" + max.id + ")")
|
|
922
1031
|
);
|
|
923
1032
|
if (verbose) {
|
|
924
1033
|
sondas.forEach(function(s) {
|
|
925
|
-
var c = s.pm10 > 300 ?
|
|
926
|
-
console.log(
|
|
1034
|
+
var c = s.pm10 > 300 ? pc8.red : s.pm10 > 80 ? pc8.yellow : pc8.green;
|
|
1035
|
+
console.log(pc8.dim(" \u21B3 " + s.id.padEnd(16)) + c(s.pm10 + " \xB5g/m\xB3"));
|
|
927
1036
|
});
|
|
928
1037
|
}
|
|
929
1038
|
if (max.pm10 > 300) {
|
|
930
|
-
console.log(
|
|
1039
|
+
console.log(pc8.red(" \u26A1 NERHIA: spike detectado en " + max.id + " \u2192 supresi\xF3n activada \xB7 caudal AUTO"));
|
|
931
1040
|
} else if (max.pm10 > 200) {
|
|
932
|
-
console.log(
|
|
1041
|
+
console.log(pc8.yellow(" \u25C8 NERHIA: tendencia ascendente en " + max.id + " \u2192 pre-alerta activa"));
|
|
933
1042
|
}
|
|
934
1043
|
}
|
|
935
1044
|
tick();
|
|
@@ -937,39 +1046,39 @@ async function watch(opts) {
|
|
|
937
1046
|
}
|
|
938
1047
|
|
|
939
1048
|
// src/commands/connect.js
|
|
940
|
-
import
|
|
1049
|
+
import pc9 from "picocolors";
|
|
941
1050
|
async function connect(opts) {
|
|
942
1051
|
const config = readConfig();
|
|
943
1052
|
if (!config) {
|
|
944
|
-
console.log(
|
|
1053
|
+
console.log(pc9.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
945
1054
|
process.exit(1);
|
|
946
1055
|
}
|
|
947
|
-
console.log(
|
|
948
|
-
console.log(
|
|
1056
|
+
console.log(pc9.yellow("\u25C8 ") + pc9.dim("NERHIA \xB7 connect"));
|
|
1057
|
+
console.log(pc9.dim(" Implementaci\xF3n en progreso..."));
|
|
949
1058
|
}
|
|
950
1059
|
|
|
951
1060
|
// src/commands/train.js
|
|
952
|
-
import
|
|
1061
|
+
import pc10 from "picocolors";
|
|
953
1062
|
async function train(opts) {
|
|
954
1063
|
const config = readConfig();
|
|
955
1064
|
if (!config) {
|
|
956
|
-
console.log(
|
|
1065
|
+
console.log(pc10.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
957
1066
|
process.exit(1);
|
|
958
1067
|
}
|
|
959
|
-
console.log(
|
|
960
|
-
console.log(
|
|
1068
|
+
console.log(pc10.yellow("\u25C8 ") + pc10.dim("NERHIA \xB7 train"));
|
|
1069
|
+
console.log(pc10.dim(" Implementaci\xF3n en progreso..."));
|
|
961
1070
|
}
|
|
962
1071
|
|
|
963
1072
|
// src/commands/report.js
|
|
964
|
-
import
|
|
1073
|
+
import pc11 from "picocolors";
|
|
965
1074
|
async function report(opts) {
|
|
966
1075
|
const config = readConfig();
|
|
967
1076
|
if (!config) {
|
|
968
|
-
console.log(
|
|
1077
|
+
console.log(pc11.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
969
1078
|
process.exit(1);
|
|
970
1079
|
}
|
|
971
|
-
console.log(
|
|
972
|
-
console.log(
|
|
1080
|
+
console.log(pc11.yellow("\u25C8 ") + pc11.dim("NERHIA \xB7 report"));
|
|
1081
|
+
console.log(pc11.dim(" Implementaci\xF3n en progreso..."));
|
|
973
1082
|
}
|
|
974
1083
|
|
|
975
1084
|
// src/index.js
|
|
@@ -984,7 +1093,7 @@ program.option(
|
|
|
984
1093
|
);
|
|
985
1094
|
program.option("-c, --config <path>", "Ruta al archivo de configuraci\xF3n");
|
|
986
1095
|
program.command("onboard").description("Asistente de primera configuraci\xF3n \xB7 Setup wizard").option("-y, --yes", "Aceptar defaults (quickstart)", false).option("--lang <code>", `Idioma (${LANGS.join(", ")})`, DEFAULT_LANG).option("--run", "Iniciar vigilancia inmediatamente despu\xE9s de configurar", false).action(onboard);
|
|
987
|
-
program.command("status").description("Estado en vivo de todas las sondas").option("--json", "Salida en formato JSON", false).option("--watch", "Actualizar cada 5 segundos", false).action(
|
|
1096
|
+
program.command("status").description("Estado en vivo de todas las sondas").option("--json", "Salida en formato JSON", false).option("--watch", "Actualizar cada 5 segundos", false).action(status);
|
|
988
1097
|
program.command("dashboard").description("Abrir dashboard web conectado al ecosistema VibraOS").option("-p, --port <number>", "Puerto del servidor web", "3100").option("--remote <url>", "Conectar a servidor remoto").option("--no-open", "No abrir navegador autom\xE1ticamente").action(dashboard);
|
|
989
1098
|
program.command("connect").description("Conectar fuente de datos (Grafana, EVControl, CSV)").option("--source <type>", "Tipo: grafana, evcontrol, csv, demo").option("--url <endpoint>", "URL del endpoint").option("--api-key <key>", "API key").option("--file <path>", "Ruta al archivo CSV").option("--server <url>", "Conectar a servidor NERHIA remoto").action(connect);
|
|
990
1099
|
program.command("suppress").description("Activar supresi\xF3n manual o por zona").option("--zone <name>", "Zona espec\xEDfica (ej: silo-mts)").option("--all", "Todas las zonas", false).option("--intensity <level>", "Intensidad: low, medium, high, auto", "auto").action(suppress);
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.js", "../src/commands/onboard.js", "../src/utils/banner.js", "../src/i18n/translations.js", "../src/config/store.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 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", "pc", "pc", "pc", "pc", "readFileSync", "writeFileSync", "existsSync", "mkdirSync", "join", "select", "text", "confirm", "pc", "pc", "pc", "pc", "pc", "pc", "pc", "pc", "pc", "Command"]
|
|
3
|
+
"sources": ["../src/services/liza.ts", "../src/index.js", "../src/commands/onboard.js", "../src/utils/banner.js", "../src/i18n/translations.js", "../src/config/store.js", "../src/commands/status.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": ["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\";\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 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", "fetchLizaRealtime", "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
|
}
|