nerhia 1.0.2 → 1.0.3
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 +58 -145
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -556,95 +556,8 @@ function sleep(ms) {
|
|
|
556
556
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
557
557
|
}
|
|
558
558
|
|
|
559
|
-
// src/commands/status.js
|
|
560
|
-
import pc3 from "picocolors";
|
|
561
|
-
var SONDAS_DEMO = [
|
|
562
|
-
{ id: "correa-01a", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: "ok", zone: "transporte" },
|
|
563
|
-
{ id: "edificio-f3", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: "ok", zone: "edificio" },
|
|
564
|
-
{ id: "edificio-e4", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: "ok", zone: "edificio" },
|
|
565
|
-
{ id: "pila-2", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: "critical", zone: "chancado" },
|
|
566
|
-
{ id: "silo-mts", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: "critical", zone: "chancado" }
|
|
567
|
-
];
|
|
568
|
-
async function status(opts) {
|
|
569
|
-
var config = readConfig();
|
|
570
|
-
if (!config) {
|
|
571
|
-
console.log(pc3.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
572
|
-
process.exit(1);
|
|
573
|
-
}
|
|
574
|
-
var lang = config.lang || "es";
|
|
575
|
-
var sondas = addJitter(SONDAS_DEMO);
|
|
576
|
-
var maxPM = Math.max.apply(null, sondas.map(function(s) {
|
|
577
|
-
return s.pm10;
|
|
578
|
-
}));
|
|
579
|
-
var avgPM = Math.round(sondas.reduce(function(a, s) {
|
|
580
|
-
return a + s.pm10;
|
|
581
|
-
}, 0) / sondas.length);
|
|
582
|
-
var critCount = sondas.filter(function(s) {
|
|
583
|
-
return s.status === "critical";
|
|
584
|
-
}).length;
|
|
585
|
-
if (opts.json) {
|
|
586
|
-
console.log(JSON.stringify({
|
|
587
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
588
|
-
sondas_total: config.sondas,
|
|
589
|
-
sondas_data: sondas,
|
|
590
|
-
pm10_max: maxPM,
|
|
591
|
-
pm10_avg: avgPM,
|
|
592
|
-
critical_zones: critCount,
|
|
593
|
-
system: "operational"
|
|
594
|
-
}, null, 2));
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
console.log("");
|
|
598
|
-
console.log(pc3.yellow(" \u25C8 ") + pc3.bold(pc3.white(t(lang, "status_header"))));
|
|
599
|
-
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"));
|
|
600
|
-
console.log("");
|
|
601
|
-
var maxSonda = sondas.reduce(function(a, b) {
|
|
602
|
-
return a.pm10 > b.pm10 ? a : b;
|
|
603
|
-
});
|
|
604
|
-
var maxColor = maxPM > 300 ? pc3.red : maxPM > 150 ? pc3.yellow : pc3.green;
|
|
605
|
-
var avgColor = avgPM > 200 ? pc3.red : avgPM > 100 ? pc3.yellow : pc3.green;
|
|
606
|
-
row(" " + t(lang, "status_sondas"), config.sondas + " " + t(lang, "status_connected"), pc3.green("\u25CF " + t(lang, "status_online")));
|
|
607
|
-
row(" " + t(lang, "status_pm_max"), maxColor(maxPM + " \xB5g/m\xB3"), pc3.dim(maxSonda.id) + " " + dot(maxSonda.status, lang));
|
|
608
|
-
row(" " + t(lang, "status_pm_avg"), avgColor(avgPM + " \xB5g/m\xB3"), pc3.dim("flota") + " " + (avgPM > 150 ? dot("warning", lang) : dot("ok", lang)));
|
|
609
|
-
row(" " + t(lang, "status_suppress"), critCount + " " + t(lang, "status_zones_active"), "");
|
|
610
|
-
row(" " + t(lang, "status_ledger"), "1,247 " + t(lang, "status_events_today"), "");
|
|
611
|
-
row(" " + t(lang, "status_last_action"), t(lang, "status_ago") + " 12 " + t(lang, "status_seconds"), "");
|
|
612
|
-
console.log("");
|
|
613
|
-
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"));
|
|
614
|
-
sondas.forEach(function(s) {
|
|
615
|
-
var pmColor = s.pm10 > 300 ? pc3.red : s.pm10 > 80 ? pc3.yellow : pc3.green;
|
|
616
|
-
var varSign = s.varPct > 0 ? "\u2191" : "\u2193";
|
|
617
|
-
var varColor = s.varPct > 0 ? pc3.red : pc3.green;
|
|
618
|
-
console.log(
|
|
619
|
-
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)
|
|
620
|
-
);
|
|
621
|
-
});
|
|
622
|
-
console.log("");
|
|
623
|
-
if (opts.watch) {
|
|
624
|
-
console.log(pc3.dim(" Actualizando cada 5s... Ctrl+C para salir"));
|
|
625
|
-
setInterval(function() {
|
|
626
|
-
process.stdout.write("\x1B[" + (sondas.length + 14) + "A");
|
|
627
|
-
status({ json: false, watch: false });
|
|
628
|
-
}, 5e3);
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
function row(label, value, extra) {
|
|
632
|
-
console.log(label.padEnd(22) + pc3.bold(pc3.white(value)) + (extra ? " " + extra : ""));
|
|
633
|
-
}
|
|
634
|
-
function dot(st, lang) {
|
|
635
|
-
if (st === "critical") return pc3.red("\u25CF " + t(lang, "status_critical"));
|
|
636
|
-
if (st === "warning") return pc3.yellow("\u25CF " + t(lang, "status_warning"));
|
|
637
|
-
return pc3.green("\u25CF " + t(lang, "status_ok"));
|
|
638
|
-
}
|
|
639
|
-
function addJitter(sondas) {
|
|
640
|
-
return sondas.map(function(s) {
|
|
641
|
-
var j = 0.9 + Math.random() * 0.2;
|
|
642
|
-
return Object.assign({}, s, { pm10: Math.round(s.pm10 * j), pm25: Math.round(s.pm25 * j) });
|
|
643
|
-
});
|
|
644
|
-
}
|
|
645
|
-
|
|
646
559
|
// src/commands/dashboard.js
|
|
647
|
-
import
|
|
560
|
+
import pc3 from "picocolors";
|
|
648
561
|
import { createServer } from "node:http";
|
|
649
562
|
var ECOSYSTEM = {
|
|
650
563
|
nerhia_urban: { name: "NERHIA Urban", url: "https://vibraalto.cl/nerhia", icon: "\u{1F310}" },
|
|
@@ -655,7 +568,7 @@ var ECOSYSTEM = {
|
|
|
655
568
|
vibraworld: { name: "VibraWorld", url: "https://github.com/leoncanales23/vw.vibraworld", icon: "\u{1F30D}" },
|
|
656
569
|
refineria: { name: "Refiner\xEDa Digital", url: "https://github.com/leoncanales23/refactored-waffle", icon: "\u{1F3AC}" }
|
|
657
570
|
};
|
|
658
|
-
var
|
|
571
|
+
var SONDAS_DEMO = [
|
|
659
572
|
{ id: "correa-01a", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: "ok", zone: "transporte", nh3: 164 },
|
|
660
573
|
{ id: "edificio-f3", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: "ok", zone: "edificio", nh3: 232 },
|
|
661
574
|
{ id: "edificio-e4", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: "ok", zone: "edificio", nh3: 101 },
|
|
@@ -665,20 +578,20 @@ var SONDAS_DEMO2 = [
|
|
|
665
578
|
async function dashboard(opts) {
|
|
666
579
|
var config = readConfig();
|
|
667
580
|
if (!config) {
|
|
668
|
-
console.log(
|
|
581
|
+
console.log(pc3.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
669
582
|
process.exit(1);
|
|
670
583
|
}
|
|
671
584
|
var port = parseInt(opts.port) || config.dashboard?.port || 3100;
|
|
672
585
|
var lang = config.lang || "es";
|
|
673
586
|
if (opts.remote) {
|
|
674
|
-
console.log(
|
|
587
|
+
console.log(pc3.yellow(" \u25C8 ") + "Conectando a servidor remoto: " + pc3.cyan(opts.remote));
|
|
675
588
|
return;
|
|
676
589
|
}
|
|
677
590
|
var server = createServer(function(req, res) {
|
|
678
591
|
var url = req.url.split("?")[0];
|
|
679
592
|
if (url === "/api/v1/sondas") {
|
|
680
593
|
res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
|
|
681
|
-
var data =
|
|
594
|
+
var data = SONDAS_DEMO.map(function(s) {
|
|
682
595
|
var j = 0.9 + Math.random() * 0.2;
|
|
683
596
|
return Object.assign({}, s, {
|
|
684
597
|
pm10_live: Math.round(s.pm10 * j),
|
|
@@ -718,21 +631,21 @@ async function dashboard(opts) {
|
|
|
718
631
|
});
|
|
719
632
|
server.listen(port, function() {
|
|
720
633
|
console.log("");
|
|
721
|
-
console.log(
|
|
722
|
-
console.log(
|
|
723
|
-
console.log(" " + t(lang, "dashboard_url") + " " +
|
|
634
|
+
console.log(pc3.yellow(" \u25C8 ") + pc3.bold(pc3.white("NERHIA Mining Dashboard")));
|
|
635
|
+
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"));
|
|
636
|
+
console.log(" " + t(lang, "dashboard_url") + " " + pc3.cyan("http://localhost:" + port));
|
|
724
637
|
console.log("");
|
|
725
|
-
console.log(
|
|
726
|
-
console.log(
|
|
727
|
-
console.log(
|
|
728
|
-
console.log(
|
|
638
|
+
console.log(pc3.dim(" API endpoints:"));
|
|
639
|
+
console.log(pc3.dim(" /api/v1/sondas \u2192 Datos de sondas en vivo"));
|
|
640
|
+
console.log(pc3.dim(" /api/v1/ecosystem \u2192 Nodos del ecosistema VibraOS"));
|
|
641
|
+
console.log(pc3.dim(" /api/v1/nerhia/status \u2192 Estado del motor cognitivo"));
|
|
729
642
|
console.log("");
|
|
730
|
-
console.log(
|
|
643
|
+
console.log(pc3.dim(" Ecosistema conectado:"));
|
|
731
644
|
Object.values(ECOSYSTEM).forEach(function(node) {
|
|
732
|
-
console.log(
|
|
645
|
+
console.log(pc3.dim(" " + node.icon + " " + node.name));
|
|
733
646
|
});
|
|
734
647
|
console.log("");
|
|
735
|
-
console.log(
|
|
648
|
+
console.log(pc3.dim(" Ctrl+C para detener"));
|
|
736
649
|
console.log("");
|
|
737
650
|
if (opts.open !== false) {
|
|
738
651
|
import("open").then(function(mod) {
|
|
@@ -824,27 +737,27 @@ fetch("/api/v1/ecosystem").then(function(r){return r.json()}).then(function(d){
|
|
|
824
737
|
}
|
|
825
738
|
|
|
826
739
|
// src/commands/doctor.js
|
|
827
|
-
import
|
|
740
|
+
import pc4 from "picocolors";
|
|
828
741
|
async function doctor(opts) {
|
|
829
742
|
const config = readConfig();
|
|
830
743
|
if (!config) {
|
|
831
|
-
console.log(
|
|
744
|
+
console.log(pc4.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
832
745
|
process.exit(1);
|
|
833
746
|
}
|
|
834
|
-
console.log(
|
|
835
|
-
console.log(
|
|
747
|
+
console.log(pc4.yellow("\u25C8 ") + pc4.dim("NERHIA \xB7 doctor"));
|
|
748
|
+
console.log(pc4.dim(" Implementaci\xF3n en progreso..."));
|
|
836
749
|
}
|
|
837
750
|
|
|
838
751
|
// src/commands/suppress.js
|
|
839
|
-
import
|
|
752
|
+
import pc5 from "picocolors";
|
|
840
753
|
async function suppress(opts) {
|
|
841
754
|
const config = readConfig();
|
|
842
755
|
if (!config) {
|
|
843
|
-
console.log(
|
|
756
|
+
console.log(pc5.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
844
757
|
process.exit(1);
|
|
845
758
|
}
|
|
846
|
-
console.log(
|
|
847
|
-
console.log(
|
|
759
|
+
console.log(pc5.yellow("\u25C8 ") + pc5.dim("NERHIA \xB7 suppress"));
|
|
760
|
+
console.log(pc5.dim(" Implementaci\xF3n en progreso..."));
|
|
848
761
|
}
|
|
849
762
|
|
|
850
763
|
// src/commands/events.js
|
|
@@ -892,18 +805,18 @@ function writeJSON(filepath, data) {
|
|
|
892
805
|
|
|
893
806
|
// src/commands/events.js
|
|
894
807
|
import { intro, outro, select as select2, text as text2, confirm as confirm2 } from "@clack/prompts";
|
|
895
|
-
import
|
|
808
|
+
import pc6 from "picocolors";
|
|
896
809
|
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) => {
|
|
897
|
-
intro(
|
|
810
|
+
intro(pc6.bgCyan(" NERHIA EVENTS \u2014 Gesti\xF3n de Eventos de Particulado "));
|
|
898
811
|
const eventsData = readJSON(PATHS.events) || { events: [] };
|
|
899
812
|
if (options.list || !options.add && !options.export) {
|
|
900
|
-
console.log(
|
|
813
|
+
console.log(pc6.cyan(`
|
|
901
814
|
\u{1F4CA} Total de eventos: ${eventsData.events.length}`));
|
|
902
815
|
if (eventsData.events.length === 0) {
|
|
903
|
-
console.log(
|
|
816
|
+
console.log(pc6.yellow("No hay eventos registrados."));
|
|
904
817
|
} else {
|
|
905
818
|
eventsData.events.slice(-10).forEach((evt) => {
|
|
906
|
-
const color = evt.severity === "high" ?
|
|
819
|
+
const color = evt.severity === "high" ? pc6.red : evt.severity === "medium" ? pc6.yellow : pc6.green;
|
|
907
820
|
console.log(color(`
|
|
908
821
|
[${evt.id}] ${evt.type}`));
|
|
909
822
|
console.log(` \u{1F4CD} ${evt.location} | \u{1F4C5} ${evt.timestamp}`);
|
|
@@ -942,9 +855,9 @@ var eventsCommand = new Command("events").description("Ver y exportar event ledg
|
|
|
942
855
|
eventsData.events.push(newEvent);
|
|
943
856
|
eventsData.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
944
857
|
if (writeJSON(PATHS.events, eventsData)) {
|
|
945
|
-
outro(
|
|
858
|
+
outro(pc6.green(`\u2705 Evento ${newEvent.id} registrado exitosamente`));
|
|
946
859
|
} else {
|
|
947
|
-
outro(
|
|
860
|
+
outro(pc6.red("\u274C Error al guardar el evento"));
|
|
948
861
|
}
|
|
949
862
|
}
|
|
950
863
|
if (options.export) {
|
|
@@ -953,20 +866,20 @@ var eventsCommand = new Command("events").description("Ver y exportar event ledg
|
|
|
953
866
|
const filename = `report-${timestamp}.${format}`;
|
|
954
867
|
if (format === "json") {
|
|
955
868
|
writeJSON(PATHS.reports + "/" + filename, eventsData);
|
|
956
|
-
outro(
|
|
869
|
+
outro(pc6.green(`\u{1F4C4} Exportado a reports/${filename}`));
|
|
957
870
|
} else if (format === "csv") {
|
|
958
871
|
const headers = "id,timestamp,type,location,value,unit,severity,status\n";
|
|
959
872
|
const rows = eventsData.events.map(
|
|
960
873
|
(e) => `${e.id},${e.timestamp},${e.type},${e.location},${e.value},${e.unit},${e.severity},${e.status}`
|
|
961
874
|
).join("\n");
|
|
962
875
|
writeFileSync(PATHS.reports + "/" + filename, headers + rows);
|
|
963
|
-
outro(
|
|
876
|
+
outro(pc6.green(`\u{1F4C4} Exportado a reports/${filename}`));
|
|
964
877
|
}
|
|
965
878
|
}
|
|
966
879
|
});
|
|
967
880
|
|
|
968
881
|
// src/commands/watch.js
|
|
969
|
-
import
|
|
882
|
+
import pc7 from "picocolors";
|
|
970
883
|
var SONDAS = [
|
|
971
884
|
{ id: "correa-01a", pm10: 8, status: "ok" },
|
|
972
885
|
{ id: "edificio-f3", pm10: 22, status: "ok" },
|
|
@@ -977,7 +890,7 @@ var SONDAS = [
|
|
|
977
890
|
async function watch(opts) {
|
|
978
891
|
var config = readConfig();
|
|
979
892
|
if (!config) {
|
|
980
|
-
console.log(
|
|
893
|
+
console.log(pc7.red(" \u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
981
894
|
process.exit(1);
|
|
982
895
|
}
|
|
983
896
|
var lang = config.lang || "es";
|
|
@@ -985,10 +898,10 @@ async function watch(opts) {
|
|
|
985
898
|
var verbose = opts.verbose || false;
|
|
986
899
|
var cycle = 0;
|
|
987
900
|
console.log("");
|
|
988
|
-
console.log(
|
|
989
|
-
console.log(
|
|
990
|
-
console.log(
|
|
991
|
-
console.log(
|
|
901
|
+
console.log(pc7.yellow(" \u25C8 ") + pc7.bold(pc7.white("NERHIA MINING \xB7 WATCH MODE")));
|
|
902
|
+
console.log(pc7.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"));
|
|
903
|
+
console.log(pc7.dim(" Intervalo: " + interval + "s \xB7 Verbose: " + (verbose ? "s\xED" : "no")));
|
|
904
|
+
console.log(pc7.dim(" " + t(lang, "watch_mode")));
|
|
992
905
|
console.log("");
|
|
993
906
|
function tick() {
|
|
994
907
|
cycle++;
|
|
@@ -1002,21 +915,21 @@ async function watch(opts) {
|
|
|
1002
915
|
var max = sondas.reduce(function(a, b) {
|
|
1003
916
|
return a.pm10 > b.pm10 ? a : b;
|
|
1004
917
|
});
|
|
1005
|
-
var maxC = max.pm10 > 300 ?
|
|
1006
|
-
var dotC = max.pm10 > 300 ?
|
|
918
|
+
var maxC = max.pm10 > 300 ? pc7.red : max.pm10 > 150 ? pc7.yellow : pc7.green;
|
|
919
|
+
var dotC = max.pm10 > 300 ? pc7.red("\u25CF") : max.pm10 > 150 ? pc7.yellow("\u25CF") : pc7.green("\u25CF");
|
|
1007
920
|
console.log(
|
|
1008
|
-
|
|
921
|
+
pc7.dim(" [" + now + "]") + " " + dotC + " " + pc7.dim("ciclo " + cycle) + " \xB7 " + pc7.dim("max=") + maxC(max.pm10 + "") + pc7.dim(" \xB5g/m\xB3 (" + max.id + ")")
|
|
1009
922
|
);
|
|
1010
923
|
if (verbose) {
|
|
1011
924
|
sondas.forEach(function(s) {
|
|
1012
|
-
var c = s.pm10 > 300 ?
|
|
1013
|
-
console.log(
|
|
925
|
+
var c = s.pm10 > 300 ? pc7.red : s.pm10 > 80 ? pc7.yellow : pc7.green;
|
|
926
|
+
console.log(pc7.dim(" \u21B3 " + s.id.padEnd(16)) + c(s.pm10 + " \xB5g/m\xB3"));
|
|
1014
927
|
});
|
|
1015
928
|
}
|
|
1016
929
|
if (max.pm10 > 300) {
|
|
1017
|
-
console.log(
|
|
930
|
+
console.log(pc7.red(" \u26A1 NERHIA: spike detectado en " + max.id + " \u2192 supresi\xF3n activada \xB7 caudal AUTO"));
|
|
1018
931
|
} else if (max.pm10 > 200) {
|
|
1019
|
-
console.log(
|
|
932
|
+
console.log(pc7.yellow(" \u25C8 NERHIA: tendencia ascendente en " + max.id + " \u2192 pre-alerta activa"));
|
|
1020
933
|
}
|
|
1021
934
|
}
|
|
1022
935
|
tick();
|
|
@@ -1024,39 +937,39 @@ async function watch(opts) {
|
|
|
1024
937
|
}
|
|
1025
938
|
|
|
1026
939
|
// src/commands/connect.js
|
|
1027
|
-
import
|
|
940
|
+
import pc8 from "picocolors";
|
|
1028
941
|
async function connect(opts) {
|
|
1029
942
|
const config = readConfig();
|
|
1030
943
|
if (!config) {
|
|
1031
|
-
console.log(
|
|
944
|
+
console.log(pc8.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
1032
945
|
process.exit(1);
|
|
1033
946
|
}
|
|
1034
|
-
console.log(
|
|
1035
|
-
console.log(
|
|
947
|
+
console.log(pc8.yellow("\u25C8 ") + pc8.dim("NERHIA \xB7 connect"));
|
|
948
|
+
console.log(pc8.dim(" Implementaci\xF3n en progreso..."));
|
|
1036
949
|
}
|
|
1037
950
|
|
|
1038
951
|
// src/commands/train.js
|
|
1039
|
-
import
|
|
952
|
+
import pc9 from "picocolors";
|
|
1040
953
|
async function train(opts) {
|
|
1041
954
|
const config = readConfig();
|
|
1042
955
|
if (!config) {
|
|
1043
|
-
console.log(
|
|
956
|
+
console.log(pc9.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
1044
957
|
process.exit(1);
|
|
1045
958
|
}
|
|
1046
|
-
console.log(
|
|
1047
|
-
console.log(
|
|
959
|
+
console.log(pc9.yellow("\u25C8 ") + pc9.dim("NERHIA \xB7 train"));
|
|
960
|
+
console.log(pc9.dim(" Implementaci\xF3n en progreso..."));
|
|
1048
961
|
}
|
|
1049
962
|
|
|
1050
963
|
// src/commands/report.js
|
|
1051
|
-
import
|
|
964
|
+
import pc10 from "picocolors";
|
|
1052
965
|
async function report(opts) {
|
|
1053
966
|
const config = readConfig();
|
|
1054
967
|
if (!config) {
|
|
1055
|
-
console.log(
|
|
968
|
+
console.log(pc10.red("\u2717 ") + "No hay configuraci\xF3n. Ejecuta: nerhia onboard");
|
|
1056
969
|
process.exit(1);
|
|
1057
970
|
}
|
|
1058
|
-
console.log(
|
|
1059
|
-
console.log(
|
|
971
|
+
console.log(pc10.yellow("\u25C8 ") + pc10.dim("NERHIA \xB7 report"));
|
|
972
|
+
console.log(pc10.dim(" Implementaci\xF3n en progreso..."));
|
|
1060
973
|
}
|
|
1061
974
|
|
|
1062
975
|
// src/index.js
|
|
@@ -1071,7 +984,7 @@ program.option(
|
|
|
1071
984
|
);
|
|
1072
985
|
program.option("-c, --config <path>", "Ruta al archivo de configuraci\xF3n");
|
|
1073
986
|
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);
|
|
1074
|
-
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(
|
|
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(void 0);
|
|
1075
988
|
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);
|
|
1076
989
|
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);
|
|
1077
990
|
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/
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Mining Intelligence CLI\n// No medimos polvo. Lo eliminamos.\n//\n// Reemplaza: npx paperclipai onboard --yes\n// Con: npx nerhia onboard --yes\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { Command } from \"commander\";\nimport { onboard } from \"./commands/onboard.js\";\nimport { status } from \"./commands/status.js\";\nimport { dashboard } from \"./commands/dashboard.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { suppress } from \"./commands/suppress.js\";\nimport { events } from \"./commands/events.js\";\nimport { watch } from \"./commands/watch.js\";\nimport { connect } from \"./commands/connect.js\";\nimport { train } from \"./commands/train.js\";\nimport { report } from \"./commands/report.js\";\nimport { LANGS, DEFAULT_LANG } from \"./i18n/translations.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"nerhia\")\n .description(\n \"NERHIA Mining Intelligence \u2014 Supresi\u00F3n cognitiva de polvo.\\n\" +\n \"No medimos polvo. Lo eliminamos.\\n\\n\" +\n \"Ecosistema: github.com/leoncanales23/\"\n )\n .version(\"1.0.0\");\n\n// \u2500\u2500 Global options \u2500\u2500\nprogram.option(\n \"--lang <code>\",\n `Idioma: ${LANGS.join(\", \")} (default: ${DEFAULT_LANG})`,\n DEFAULT_LANG\n);\nprogram.option(\"-c, --config <path>\", \"Ruta al archivo de configuraci\u00F3n\");\n\n// \u2500\u2500 ONBOARD \u2500\u2500\nprogram\n .command(\"onboard\")\n .description(\"Asistente de primera configuraci\u00F3n \u00B7 Setup wizard\")\n .option(\"-y, --yes\", \"Aceptar defaults (quickstart)\", false)\n .option(\"--lang <code>\", `Idioma (${LANGS.join(\", \")})`, DEFAULT_LANG)\n .option(\"--run\", \"Iniciar vigilancia inmediatamente despu\u00E9s de configurar\", false)\n .action(onboard);\n\n// \u2500\u2500 STATUS \u2500\u2500\nprogram\n .command(\"status\")\n .description(\"Estado en vivo de todas las sondas\")\n .option(\"--json\", \"Salida en formato JSON\", false)\n .option(\"--watch\", \"Actualizar cada 5 segundos\", false)\n .action(status);\n\n// \u2500\u2500 DASHBOARD \u2500\u2500\nprogram\n .command(\"dashboard\")\n .description(\"Abrir dashboard web conectado al ecosistema VibraOS\")\n .option(\"-p, --port <number>\", \"Puerto del servidor web\", \"3100\")\n .option(\"--remote <url>\", \"Conectar a servidor remoto\")\n .option(\"--no-open\", \"No abrir navegador autom\u00E1ticamente\")\n .action(dashboard);\n\n// \u2500\u2500 CONNECT \u2500\u2500\nprogram\n .command(\"connect\")\n .description(\"Conectar fuente de datos (Grafana, EVControl, CSV)\")\n .option(\"--source <type>\", \"Tipo: grafana, evcontrol, csv, demo\")\n .option(\"--url <endpoint>\", \"URL del endpoint\")\n .option(\"--api-key <key>\", \"API key\")\n .option(\"--file <path>\", \"Ruta al archivo CSV\")\n .option(\"--server <url>\", \"Conectar a servidor NERHIA remoto\")\n .action(connect);\n\n// \u2500\u2500 SUPPRESS \u2500\u2500\nprogram\n .command(\"suppress\")\n .description(\"Activar supresi\u00F3n manual o por zona\")\n .option(\"--zone <name>\", \"Zona espec\u00EDfica (ej: silo-mts)\")\n .option(\"--all\", \"Todas las zonas\", false)\n .option(\"--intensity <level>\", \"Intensidad: low, medium, high, auto\", \"auto\")\n .action(suppress);\n\n// \u2500\u2500 EVENTS \u2500\u2500\nprogram\n .command(\"events\")\n .description(\"Ver y exportar event ledger\")\n .option(\"--last <duration>\", \"\u00DAltimas horas/d\u00EDas (ej: 24h, 7d)\")\n .option(\"--sonda <id>\", \"Filtrar por sonda\")\n .option(\"--from <date>\", \"Desde fecha (YYYY-MM-DD)\")\n .option(\"--to <date>\", \"Hasta fecha (YYYY-MM-DD)\")\n .option(\"--export <format>\", \"Exportar: csv, json\")\n .option(\"--file <path>\", \"Ruta del archivo exportado\")\n .option(\"--live\", \"Modo streaming en vivo\", false)\n .option(\"--follow\", \"Seguir nuevos eventos (como tail -f)\", false)\n .action(events);\n\n// \u2500\u2500 WATCH \u2500\u2500\nprogram\n .command(\"watch\")\n .description(\"Modo vigilancia continua en terminal\")\n .option(\"--verbose\", \"Mostrar cada lectura de sonda\", false)\n .option(\"--interval <seconds>\", \"Intervalo de lectura\", \"30\")\n .action(watch);\n\n// \u2500\u2500 DOCTOR \u2500\u2500\nprogram\n .command(\"doctor\")\n .description(\"Diagn\u00F3stico del sistema\")\n .action(doctor);\n\n// \u2500\u2500 TRAIN \u2500\u2500\nprogram\n .command(\"train\")\n .description(\"Calibraci\u00F3n cognitiva \u2014 14 d\u00EDas de observaci\u00F3n sin acci\u00F3n\")\n .option(\"--days <number>\", \"Duraci\u00F3n del entrenamiento\", \"14\")\n .option(\"--zone <name>\", \"Zona espec\u00EDfica a calibrar\")\n .action(train);\n\n// \u2500\u2500 REPORT \u2500\u2500\nprogram\n .command(\"report\")\n .description(\"Generar reporte para SERNAGEOMIN\")\n .option(\"--format <type>\", \"Formato: pdf, csv, xlsx\", \"pdf\")\n .option(\"--period <range>\", \"Per\u00EDodo: last-month, last-week, custom\")\n .option(\"--output <path>\", \"Ruta de salida\")\n .action(report);\n\n// \u2500\u2500 CONFIG \u2500\u2500\nprogram\n .command(\"config\")\n .description(\"Ver/editar configuraci\u00F3n\")\n .argument(\"[key]\", \"Clave de configuraci\u00F3n\")\n .argument(\"[value]\", \"Nuevo valor\")\n .action((key, value) => {\n if (!key) {\n // Show config\n console.log(\"Configuraci\u00F3n actual:\");\n // TODO: read and show config\n } else if (value) {\n console.log(`Configurando ${key} = ${value}`);\n } else {\n console.log(`Valor de ${key}:`);\n }\n });\n\n// \u2500\u2500 ALERT \u2500\u2500\nprogram\n .command(\"alert\")\n .description(\"Configurar alertas (WhatsApp, email, webhook)\")\n .option(\"--whatsapp <number>\", \"N\u00FAmero WhatsApp (+56...)\")\n .option(\"--email <address>\", \"Email de alerta\")\n .option(\"--webhook <url>\", \"URL webhook\")\n .option(\"--threshold <pm10>\", \"Threshold PM-10 para alerta\", \"150\")\n .action((opts) => {\n console.log(\"Configurando alertas:\", opts);\n });\n\n// \u2500\u2500 SERVE \u2500\u2500\nprogram\n .command(\"serve\")\n .description(\"Iniciar servidor NERHIA (para modo multi-PC)\")\n .option(\"--host <address>\", \"Direcci\u00F3n de escucha\", \"0.0.0.0\")\n .option(\"-p, --port <number>\", \"Puerto\", \"3100\")\n .action((opts) => {\n console.log(`Servidor NERHIA iniciando en ${opts.host}:${opts.port}`);\n });\n\nprogram.parse();\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Onboard Command\n// npx nerhia onboard --yes\n//\n// Two modes:\n// Y (default) \u2192 Natural language guided by NERHIA\n// N \u2192 Code mode, direct config, minimal output\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { printNerhiaBanner, printDoctrine } from \"../utils/banner.js\";\nimport { t, DEFAULT_LANG } from \"../i18n/translations.js\";\nimport { writeConfig, configExists } from \"../config/store.js\";\n\nexport async function onboard(opts) {\n const lang = opts.lang || opts.parent?.opts()?.lang || DEFAULT_LANG;\n const quickstart = opts.yes || false;\n\n // \u2500\u2500 Banner \u2500\u2500\n printNerhiaBanner(lang);\n\n if (configExists() && !quickstart) {\n const overwrite = await p.confirm({\n message: lang === \"es\"\n ? \"Ya existe una configuraci\u00F3n. \u00BFSobrescribir?\"\n : \"Configuration already exists. Overwrite?\",\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(lang === \"es\" ? \"Cancelado.\" : \"Cancelled.\");\n process.exit(0);\n }\n }\n\n // \u2500\u2500 Y/N Mode Selection \u2500\u2500\n let naturalMode = true;\n\n if (!quickstart) {\n console.log(\"\");\n const modeChoice = await p.confirm({\n message: pc.bold(pc.yellow(\"\u25C8 \")) + t(lang, \"ask_mode\"),\n active: pc.green(\"Y\") + pc.dim(\" \u2192 \" + t(lang, \"mode_y\")),\n inactive: pc.blue(\"N\") + pc.dim(\" \u2192 \" + t(lang, \"mode_n\")),\n initialValue: true,\n });\n\n if (p.isCancel(modeChoice)) {\n p.cancel(\"\");\n process.exit(0);\n }\n naturalMode = modeChoice;\n }\n\n // \u2550\u2550\u2550 NATURAL MODE (Y) \u2550\u2550\u2550\n if (naturalMode && !quickstart) {\n return await onboardNatural(lang);\n }\n\n // \u2550\u2550\u2550 CODE MODE (N) or --yes \u2550\u2550\u2550\n return await onboardCode(lang, quickstart);\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// NATURAL MODE \u2014 NERHIA te gu\u00EDa conversacionalmente\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function onboardNatural(lang) {\n console.log(\"\");\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.magenta(t(lang, \"natural_intro\")))\n );\n console.log(\"\");\n\n await sleep(800);\n\n // Source\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_source_ask\")))\n );\n console.log(\"\");\n\n const source = await p.select({\n message: \"\",\n options: [\n { value: \"grafana\", label: pc.yellow(\"Grafana\") + pc.dim(\" \u2014 \" + t(lang, \"source_grafana\")) },\n { value: \"evcontrol\", label: pc.yellow(\"EVControl\") + pc.dim(\" \u2014 \" + t(lang, \"source_evcontrol\")) },\n { value: \"csv\", label: pc.yellow(\"CSV\") + pc.dim(\" \u2014 \" + t(lang, \"source_csv\")) },\n { value: \"demo\", label: pc.green(\"Demo\") + pc.dim(\" \u2014 \" + t(lang, \"source_demo\")) },\n ],\n });\n if (p.isCancel(source)) { p.cancel(\"\"); process.exit(0); }\n\n let url = \"\";\n let apiKey = \"\";\n\n if (source === \"grafana\" || source === \"evcontrol\") {\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" Bien. Necesito la URL del endpoint.\")\n );\n url = await p.text({\n message: t(lang, \"onboard_url\"),\n placeholder: source === \"grafana\" ? \"https://grafana.evcontrol.cl/api\" : \"https://api.evcontrol.cl/v1\",\n });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n\n apiKey = await p.text({\n message: t(lang, \"onboard_key\"),\n placeholder: \"sk-...\",\n });\n if (p.isCancel(apiKey)) { p.cancel(\"\"); process.exit(0); }\n }\n\n if (source === \"csv\") {\n url = await p.text({\n message: lang === \"es\" ? \"Ruta al archivo CSV:\" : \"Path to CSV file:\",\n placeholder: \"./data/sondas.csv\",\n });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n // Sondas count\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_sondas_ask\")))\n );\n const sondas = await p.text({\n message: \"\",\n placeholder: \"45\",\n defaultValue: \"45\",\n validate: (v) => {\n const n = parseInt(v);\n if (isNaN(n) || n < 1) return lang === \"es\" ? \"N\u00FAmero v\u00E1lido por favor\" : \"Valid number please\";\n },\n });\n if (p.isCancel(sondas)) { p.cancel(\"\"); process.exit(0); }\n\n // Zones\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_zones_ask\")))\n );\n const zones = await p.text({\n message: \"\",\n placeholder: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n defaultValue: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n });\n if (p.isCancel(zones)) { p.cancel(\"\"); process.exit(0); }\n\n // Alerts\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.white(t(lang, \"natural_alerts_ask\")))\n );\n const alerts = await p.confirm({\n message: \"\",\n initialValue: true,\n });\n if (p.isCancel(alerts)) { p.cancel(\"\"); process.exit(0); }\n\n let whatsapp = \"\";\n if (alerts) {\n whatsapp = await p.text({\n message: lang === \"es\" ? \"N\u00FAmero WhatsApp:\" : \"WhatsApp number:\",\n placeholder: \"+56 9 XXXX XXXX\",\n });\n if (p.isCancel(whatsapp)) whatsapp = \"\";\n }\n\n // Save config\n const config = {\n version: \"1.0.0\",\n source: source,\n url: url || null,\n apiKey: apiKey || null,\n sondas: parseInt(sondas),\n zones: zones.split(\",\").map((z) => z.trim()),\n alerts: {\n enabled: alerts,\n whatsapp: whatsapp || null,\n },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n // Done\n console.log(\"\");\n await sleep(600);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.italic(pc.green(t(lang, \"natural_done\")))\n );\n console.log(\"\");\n await sleep(400);\n console.log(\n pc.dim(\" \") + pc.magenta(\"\u25C8\") + pc.dim(\" \") + pc.dim(t(lang, \"natural_next\"))\n );\n console.log(\"\");\n\n printDoctrine();\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// CODE MODE \u2014 Directo, m\u00EDnimo, modo experto\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function onboardCode(lang, quickstart) {\n const s = p.spinner();\n\n if (quickstart) {\n // --yes flag: accept all defaults\n s.start(t(lang, \"onboard_start\"));\n\n const config = {\n version: \"1.0.0\",\n source: \"demo\",\n url: null,\n apiKey: null,\n sondas: 45,\n zones: [\"silo-mts\", \"pila-2\", \"correa-01a\", \"edificio-f3\", \"edificio-e4\"],\n alerts: { enabled: false, whatsapp: null },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n await sleep(1200);\n s.stop(pc.green(\"\u2713 \") + t(lang, \"onboard_complete\"));\n console.log(\"\");\n console.log(pc.dim(\" \" + t(lang, \"onboard_ready\")));\n console.log(\"\");\n console.log(pc.dim(\" nerhia status \u2192 Estado en vivo\"));\n console.log(pc.dim(\" nerhia dashboard \u2192 Panel web\"));\n console.log(pc.dim(\" nerhia watch \u2192 Vigilancia terminal\"));\n console.log(\"\");\n return;\n }\n\n // Code mode interactive but terse\n const source = await p.select({\n message: t(lang, \"onboard_source\"),\n options: [\n { value: \"grafana\", label: t(lang, \"source_grafana\") },\n { value: \"evcontrol\", label: t(lang, \"source_evcontrol\") },\n { value: \"csv\", label: t(lang, \"source_csv\") },\n { value: \"demo\", label: t(lang, \"source_demo\") },\n ],\n });\n if (p.isCancel(source)) { p.cancel(\"\"); process.exit(0); }\n\n let url = null;\n let apiKey = null;\n\n if (source === \"grafana\" || source === \"evcontrol\") {\n url = await p.text({ message: t(lang, \"onboard_url\") });\n apiKey = await p.text({ message: t(lang, \"onboard_key\") });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n if (source === \"csv\") {\n url = await p.text({ message: \"CSV path:\", placeholder: \"./data/sondas.csv\" });\n if (p.isCancel(url)) { p.cancel(\"\"); process.exit(0); }\n }\n\n const sondas = await p.text({\n message: t(lang, \"onboard_sondas\"),\n defaultValue: \"45\",\n });\n\n const zones = await p.text({\n message: t(lang, \"onboard_zones\"),\n defaultValue: \"silo-mts, pila-2, correa-01a, edificio-f3, edificio-e4\",\n });\n\n s.start(t(lang, \"onboard_start\"));\n\n const config = {\n version: \"1.0.0\",\n source,\n url: url || null,\n apiKey: apiKey || null,\n sondas: parseInt(sondas) || 45,\n zones: (zones || \"\").split(\",\").map((z) => z.trim()).filter(Boolean),\n alerts: { enabled: false, whatsapp: null },\n suppression: {\n mode: \"cognitive\",\n threshold_pm10: 150,\n threshold_pm25: 65,\n watchdog_interval_s: 30,\n },\n dashboard: {\n port: 3100,\n ecosystem_urls: {\n nerhia_urban: \"https://vibraalto.cl/nerhia\",\n satellite: \"https://vibraalto-satellite.onrender.com\",\n vbc_protocol: \"https://github.com/leoncanales23/vbc-protocol\",\n },\n },\n lang: lang,\n created_at: new Date().toISOString(),\n };\n\n writeConfig(config);\n\n await sleep(800);\n s.stop(pc.green(\"\u2713 \") + t(lang, \"onboard_complete\"));\n console.log(pc.dim(\" \" + t(lang, \"onboard_ready\")));\n console.log(\"\");\n}\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 ASCII Banner\n// Reemplaza Paperclip banner con identidad NERHIA\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\n\nconst NERHIA_ART = [\n \"\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \",\n \"\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\",\n \"\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\",\n \"\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\",\n \"\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\",\n \"\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\",\n];\n\nconst TAGLINE_ES = \"Supresi\u00F3n cognitiva de polvo \u00B7 Mining Intelligence\";\nconst TAGLINE_EN = \"Cognitive dust suppression \u00B7 Mining Intelligence\";\nconst DOCTRINE = \"Incompletitud din\u00E1mica activada\";\n\nexport function printNerhiaBanner(lang = \"es\") {\n const tagline = lang === \"es\" ? TAGLINE_ES : TAGLINE_EN;\n const lines = [\n \"\",\n ...NERHIA_ART.map((line) => pc.yellow(line)),\n pc.dim(pc.yellow(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\")),\n \" \" + pc.bold(pc.white(\"\u25C8 \" + tagline)),\n \" \" + pc.dim(pc.magenta(DOCTRINE)),\n \"\",\n ];\n console.log(lines.join(\"\\n\"));\n}\n\nexport function printMiniStatus(sondas, lang = \"es\") {\n const dot = pc.green(\"\u25CF\");\n const warn = pc.yellow(\"\u25CF\");\n const crit = pc.red(\"\u25CF\");\n\n console.log(\"\");\n console.log(\n pc.dim(\" \u25C8 NERHIA MINING\") +\n pc.dim(\" \u00B7 \") +\n pc.green(sondas + \" sondas\") +\n pc.dim(\" \u00B7 \") +\n dot +\n pc.dim(\" sistema activo\")\n );\n console.log(\"\");\n}\n\nexport function printDoctrine() {\n const lines = [\n \"\",\n pc.dim(\" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Incompletitud din\u00E1mica activada. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Sensibilidad a lo emergente. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.yellow(\" Adaptaci\u00F3n como estado natural. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + \" \" + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.white(\" El sistema no busca el estado perfecto. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2502\") + pc.white(\" Busca el siguiente estado correcto. \") + pc.dim(\"\u2502\"),\n pc.dim(\" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\"),\n \"\",\n ];\n console.log(lines.join(\"\\n\"));\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Internationalization\n// Idioma primordial: Espa\u00F1ol\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const LANGS = [\"es\", \"en\", \"ja\", \"de\", \"ko\", \"zh\"];\nexport const DEFAULT_LANG = \"es\";\n\nexport const T = {\n es: {\n welcome: \"Bienvenido a NERHIA Mining Intelligence\",\n tagline: \"No medimos polvo. Lo eliminamos.\",\n doctrine: \"Incompletitud din\u00E1mica activada. Sensibilidad a lo emergente. Adaptaci\u00F3n como estado natural.\",\n ask_mode: \"\u00BFAvanzar en lenguaje natural?\",\n mode_y: \"NERHIA te gu\u00EDa conversacionalmente\",\n mode_n: \"NERHIA avanza en modo c\u00F3digo directo\",\n onboard_start: \"Iniciando configuraci\u00F3n...\",\n onboard_source: \"\u00BFDe d\u00F3nde vienen los datos de las sondas?\",\n source_grafana: \"Grafana (API existente)\",\n source_evcontrol: \"EVControl (directo)\",\n source_csv: \"Archivo CSV local\",\n source_demo: \"Modo demo (datos simulados)\",\n onboard_url: \"URL del endpoint de datos:\",\n onboard_key: \"API key (si aplica):\",\n onboard_sondas: \"\u00BFCu\u00E1ntas sondas tiene la instalaci\u00F3n?\",\n onboard_zones: \"Nombre de las zonas de monitoreo (separadas por coma):\",\n onboard_alerts: \"\u00BFConfigurar alertas WhatsApp?\",\n onboard_complete: \"NERHIA Mining Intelligence configurado correctamente.\",\n onboard_ready: \"Sistema listo. Las sondas est\u00E1n siendo observadas.\",\n status_header: \"NERHIA MINING \u00B7 ESTADO EN VIVO\",\n status_sondas: \"SONDAS\",\n status_connected: \"conectadas\",\n status_online: \"online\",\n status_pm_max: \"PM-10 MAX\",\n status_pm_avg: \"PM-10 PROM\",\n status_suppress: \"SUPRESI\u00D3N\",\n status_zones_active: \"zonas activas\",\n status_ledger: \"LEDGER\",\n status_events_today: \"eventos hoy\",\n status_last_action: \"\u00DALTIMA ACCI\u00D3N\",\n status_ago: \"hace\",\n status_seconds: \"segundos\",\n status_ok: \"OK\",\n status_warning: \"ALERTA\",\n status_critical: \"CR\u00CDTICO\",\n dashboard_opening: \"Abriendo dashboard...\",\n dashboard_url: \"Dashboard disponible en:\",\n suppress_triggered: \"Supresi\u00F3n activada\",\n suppress_zone: \"Zona\",\n suppress_intensity: \"Intensidad\",\n events_header: \"LEDGER DE EVENTOS\",\n doctor_checking: \"Diagnosticando sistema...\",\n doctor_ok: \"Sistema operativo. Sin anomal\u00EDas.\",\n doctor_warn: \"Anomal\u00EDas detectadas. Ver detalles arriba.\",\n watch_mode: \"Modo vigilancia activo. Ctrl+C para salir.\",\n error_no_config: \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\",\n error_connection: \"Error de conexi\u00F3n con la fuente de datos.\",\n natural_intro: \"Hola. Soy NERHIA. Voy a configurar el sistema de supresi\u00F3n cognitiva contigo.\",\n natural_source_ask: \"Primero necesito saber de d\u00F3nde vienen los datos. \u00BFTienes Grafana, EVControl, o quieres arrancar con datos de demo?\",\n natural_sondas_ask: \"\u00BFCu\u00E1ntas sondas est\u00E1n instaladas en el sitio?\",\n natural_zones_ask: \"Nombra las zonas de monitoreo. Por ejemplo: silo, correa, pila, edificio.\",\n natural_alerts_ask: \"\u00BFQuieres que te avise por WhatsApp cuando haya un evento cr\u00EDtico?\",\n natural_done: \"Listo. El sistema est\u00E1 observando. Cada 30 segundos leo las sondas, analizo la tendencia, y si algo se mueve mal, act\u00FAo antes de que el polvo llegue a respirarse.\",\n natural_next: \"Escribe 'nerhia status' para ver el estado en vivo, o 'nerhia dashboard' para abrir el panel.\",\n },\n en: {\n welcome: \"Welcome to NERHIA Mining Intelligence\",\n tagline: \"We don't measure dust. We eliminate it.\",\n doctrine: \"Dynamic incompleteness activated. Sensitivity to the emergent. Adaptation as natural state.\",\n ask_mode: \"Proceed in natural language?\",\n mode_y: \"NERHIA guides you conversationally\",\n mode_n: \"NERHIA advances in direct code mode\",\n onboard_start: \"Starting configuration...\",\n onboard_source: \"Where does the probe data come from?\",\n source_grafana: \"Grafana (existing API)\",\n source_evcontrol: \"EVControl (direct)\",\n source_csv: \"Local CSV file\",\n source_demo: \"Demo mode (simulated data)\",\n onboard_url: \"Data endpoint URL:\",\n onboard_key: \"API key (if applicable):\",\n onboard_sondas: \"How many probes are installed?\",\n onboard_zones: \"Monitoring zone names (comma separated):\",\n onboard_alerts: \"Configure WhatsApp alerts?\",\n onboard_complete: \"NERHIA Mining Intelligence configured successfully.\",\n onboard_ready: \"System ready. Probes are being observed.\",\n status_header: \"NERHIA MINING \u00B7 LIVE STATUS\",\n status_sondas: \"PROBES\",\n status_connected: \"connected\",\n status_online: \"online\",\n status_pm_max: \"PM-10 MAX\",\n status_pm_avg: \"PM-10 AVG\",\n status_suppress: \"SUPPRESSION\",\n status_zones_active: \"active zones\",\n status_ledger: \"LEDGER\",\n status_events_today: \"events today\",\n status_last_action: \"LAST ACTION\",\n status_ago: \"ago\",\n status_seconds: \"seconds\",\n status_ok: \"OK\",\n status_warning: \"WARNING\",\n status_critical: \"CRITICAL\",\n dashboard_opening: \"Opening dashboard...\",\n dashboard_url: \"Dashboard available at:\",\n suppress_triggered: \"Suppression triggered\",\n suppress_zone: \"Zone\",\n suppress_intensity: \"Intensity\",\n events_header: \"EVENT LEDGER\",\n doctor_checking: \"Diagnosing system...\",\n doctor_ok: \"System operational. No anomalies.\",\n doctor_warn: \"Anomalies detected. See details above.\",\n watch_mode: \"Watch mode active. Ctrl+C to exit.\",\n error_no_config: \"No configuration found. Run: nerhia onboard\",\n error_connection: \"Connection error with data source.\",\n natural_intro: \"Hello. I'm NERHIA. I'll configure the cognitive suppression system with you.\",\n natural_source_ask: \"First I need to know where the data comes from. Do you have Grafana, EVControl, or want to start with demo data?\",\n natural_sondas_ask: \"How many probes are installed at the site?\",\n natural_zones_ask: \"Name the monitoring zones. For example: silo, conveyor, pile, building.\",\n natural_alerts_ask: \"Want me to alert you via WhatsApp when there's a critical event?\",\n natural_done: \"Done. The system is observing. Every 30 seconds I read the probes, analyze the trend, and if something moves wrong, I act before the dust reaches breathing level.\",\n natural_next: \"Type 'nerhia status' to see live state, or 'nerhia dashboard' to open the panel.\",\n },\n ja: {\n welcome: \"NERHIA Mining Intelligence \u3078\u3088\u3046\u3053\u305D\",\n tagline: \"\u7C89\u5875\u3092\u6E2C\u5B9A\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u3001\u9664\u53BB\u3057\u307E\u3059\u3002\",\n doctrine: \"\u52D5\u7684\u4E0D\u5B8C\u5168\u6027\u304C\u6709\u52B9\u3002\u65B0\u8208\u3078\u306E\u611F\u53D7\u6027\u3002\u9069\u5FDC\u304C\u81EA\u7136\u306A\u72B6\u614B\u3002\",\n ask_mode: \"\u81EA\u7136\u8A00\u8A9E\u3067\u9032\u3081\u307E\u3059\u304B\uFF1F\",\n mode_y: \"NERHIA\u304C\u4F1A\u8A71\u5F62\u5F0F\u3067\u30AC\u30A4\u30C9\u3057\u307E\u3059\",\n mode_n: \"NERHIA\u304C\u30B3\u30FC\u30C9\u30E2\u30FC\u30C9\u3067\u76F4\u63A5\u9032\u884C\u3057\u307E\u3059\",\n onboard_start: \"\u8A2D\u5B9A\u3092\u958B\u59CB\u3057\u3066\u3044\u307E\u3059...\",\n onboard_source: \"\u30BB\u30F3\u30B5\u30FC\u30C7\u30FC\u30BF\u306E\u53D6\u5F97\u5143\u306F\uFF1F\",\n source_grafana: \"Grafana\uFF08\u65E2\u5B58API\uFF09\",\n source_evcontrol: \"EVControl\uFF08\u76F4\u63A5\u63A5\u7D9A\uFF09\",\n source_csv: \"\u30ED\u30FC\u30AB\u30EBCSV\u30D5\u30A1\u30A4\u30EB\",\n source_demo: \"\u30C7\u30E2\u30E2\u30FC\u30C9\uFF08\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u30C7\u30FC\u30BF\uFF09\",\n status_header: \"NERHIA MINING \u00B7 \u30E9\u30A4\u30D6\u30B9\u30C6\u30FC\u30BF\u30B9\",\n status_ok: \"\u6B63\u5E38\",\n status_warning: \"\u8B66\u544A\",\n status_critical: \"\u5371\u967A\",\n natural_intro: \"\u3053\u3093\u306B\u3061\u306F\u3002NERHIA\u3067\u3059\u3002\u8A8D\u77E5\u6291\u5236\u30B7\u30B9\u30C6\u30E0\u3092\u4E00\u7DD2\u306B\u8A2D\u5B9A\u3057\u307E\u3057\u3087\u3046\u3002\",\n },\n de: {\n welcome: \"Willkommen bei NERHIA Mining Intelligence\",\n tagline: \"Wir messen keinen Staub. Wir eliminieren ihn.\",\n doctrine: \"Dynamische Unvollst\u00E4ndigkeit aktiviert. Empfindlichkeit f\u00FCr das Emergente. Anpassung als nat\u00FCrlicher Zustand.\",\n ask_mode: \"In nat\u00FCrlicher Sprache fortfahren?\",\n mode_y: \"NERHIA f\u00FChrt Sie im Gespr\u00E4ch\",\n mode_n: \"NERHIA f\u00E4hrt im direkten Code-Modus fort\",\n onboard_start: \"Konfiguration wird gestartet...\",\n status_header: \"NERHIA MINING \u00B7 LIVE-STATUS\",\n status_ok: \"OK\",\n status_warning: \"WARNUNG\",\n status_critical: \"KRITISCH\",\n natural_intro: \"Hallo. Ich bin NERHIA. Ich werde das kognitive Unterdr\u00FCckungssystem mit Ihnen konfigurieren.\",\n },\n ko: {\n welcome: \"NERHIA Mining Intelligence\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4\",\n tagline: \"\uBA3C\uC9C0\uB97C \uCE21\uC815\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC81C\uAC70\uD569\uB2C8\uB2E4.\",\n doctrine: \"\uB3D9\uC801 \uBD88\uC644\uC804\uC131 \uD65C\uC131\uD654. \uC2E0\uD765\uC5D0 \uB300\uD55C \uBBFC\uAC10\uC131. \uC801\uC751\uC774 \uC790\uC5F0 \uC0C1\uD0DC.\",\n ask_mode: \"\uC790\uC5F0\uC5B4\uB85C \uC9C4\uD589\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\",\n mode_y: \"NERHIA\uAC00 \uB300\uD654 \uD615\uC2DD\uC73C\uB85C \uC548\uB0B4\uD569\uB2C8\uB2E4\",\n mode_n: \"NERHIA\uAC00 \uCF54\uB4DC \uBAA8\uB4DC\uB85C \uC9C1\uC811 \uC9C4\uD589\uD569\uB2C8\uB2E4\",\n status_header: \"NERHIA MINING \u00B7 \uC2E4\uC2DC\uAC04 \uC0C1\uD0DC\",\n status_ok: \"\uC815\uC0C1\",\n status_warning: \"\uACBD\uACE0\",\n status_critical: \"\uC704\uD5D8\",\n natural_intro: \"\uC548\uB155\uD558\uC138\uC694. NERHIA\uC785\uB2C8\uB2E4. \uC778\uC9C0 \uC5B5\uC81C \uC2DC\uC2A4\uD15C\uC744 \uD568\uAED8 \uAD6C\uC131\uD558\uACA0\uC2B5\uB2C8\uB2E4.\",\n },\n zh: {\n welcome: \"\u6B22\u8FCE\u4F7F\u7528 NERHIA Mining Intelligence\",\n tagline: \"\u6211\u4EEC\u4E0D\u6D4B\u91CF\u7070\u5C18\u3002\u6211\u4EEC\u6D88\u9664\u5B83\u3002\",\n doctrine: \"\u52A8\u6001\u4E0D\u5B8C\u5907\u6027\u5DF2\u6FC0\u6D3B\u3002\u5BF9\u65B0\u5174\u4E8B\u7269\u7684\u654F\u611F\u6027\u3002\u9002\u5E94\u4F5C\u4E3A\u81EA\u7136\u72B6\u6001\u3002\",\n ask_mode: \"\u4F7F\u7528\u81EA\u7136\u8BED\u8A00\u7EE7\u7EED\uFF1F\",\n mode_y: \"NERHIA \u4EE5\u5BF9\u8BDD\u65B9\u5F0F\u5F15\u5BFC\u60A8\",\n mode_n: \"NERHIA \u4EE5\u4EE3\u7801\u6A21\u5F0F\u76F4\u63A5\u63A8\u8FDB\",\n status_header: \"NERHIA MINING \u00B7 \u5B9E\u65F6\u72B6\u6001\",\n status_ok: \"\u6B63\u5E38\",\n status_warning: \"\u8B66\u544A\",\n status_critical: \"\u5371\u9669\",\n natural_intro: \"\u4F60\u597D\u3002\u6211\u662F NERHIA\u3002\u6211\u5C06\u4E0E\u60A8\u4E00\u8D77\u914D\u7F6E\u8BA4\u77E5\u6291\u5236\u7CFB\u7EDF\u3002\",\n },\n};\n\nexport function t(lang, key) {\n const dict = T[lang] || T[DEFAULT_LANG];\n return dict[key] || T[DEFAULT_LANG][key] || key;\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Config Store\n// Almacena en ~/.nerhia/config.json\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { appendFileSync } from \"node:fs\";\n\nconst NERHIA_DIR = join(homedir(), \".nerhia\");\nconst CONFIG_PATH = join(NERHIA_DIR, \"config.json\");\nconst LEDGER_PATH = join(NERHIA_DIR, \"ledger.jsonl\");\n\nexport function ensureDir() {\n if (!existsSync(NERHIA_DIR)) {\n mkdirSync(NERHIA_DIR, { recursive: true });\n }\n}\n\nexport function configExists() {\n return existsSync(CONFIG_PATH);\n}\n\nexport function readConfig() {\n if (!configExists()) return null;\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nexport function writeConfig(config) {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\nexport function appendLedger(event) {\n ensureDir();\n const entry = {\n ...event,\n timestamp: new Date().toISOString(),\n };\n const line = JSON.stringify(entry) + \"\\n\";\n try {\n appendFileSync(LEDGER_PATH, line, \"utf-8\");\n } catch {\n writeFileSync(LEDGER_PATH, line, { flag: \"a\", encoding: \"utf-8\" });\n }\n}\n\nexport function readLedger(filter = {}) {\n if (!existsSync(LEDGER_PATH)) return [];\n try {\n const lines = readFileSync(LEDGER_PATH, \"utf-8\").trim().split(\"\\n\").filter(Boolean);\n let events = lines.map((l) => JSON.parse(l));\n\n if (filter.sonda) {\n events = events.filter((e) => e.sonda === filter.sonda);\n }\n if (filter.from) {\n events = events.filter((e) => e.timestamp >= filter.from);\n }\n if (filter.to) {\n events = events.filter((e) => e.timestamp <= filter.to);\n }\n if (filter.last) {\n const now = Date.now();\n const ms = parseDuration(filter.last);\n events = events.filter((e) => now - new Date(e.timestamp).getTime() < ms);\n }\n\n return events;\n } catch {\n return [];\n }\n}\n\nfunction parseDuration(str) {\n const match = str.match(/^(\\d+)(h|d|m|s)$/);\n if (!match) return 24 * 60 * 60 * 1000; // default 24h\n const n = parseInt(match[1]);\n const unit = match[2];\n const multipliers = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return n * (multipliers[unit] || 3600000);\n}\n\nexport const paths = {\n dir: NERHIA_DIR,\n config: CONFIG_PATH,\n ledger: LEDGER_PATH,\n};\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// NERHIA \u00B7 Status Command\n// npx nerhia status\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nimport pc from \"picocolors\";\nimport { readConfig } from \"../config/store.js\";\nimport { t } from \"../i18n/translations.js\";\n\nvar SONDAS_DEMO = [\n { id: \"correa-01a\", pm10: 8, pm25: 7, prom: 64, varPct: -65.6, status: \"ok\", zone: \"transporte\" },\n { id: \"edificio-f3\", pm10: 22, pm25: 27, prom: 141, varPct: -84.4, status: \"ok\", zone: \"edificio\" },\n { id: \"edificio-e4\", pm10: 3, pm25: 3, prom: 102, varPct: -97.1, status: \"ok\", zone: \"edificio\" },\n { id: \"pila-2\", pm10: 282, pm25: 224, prom: 77, varPct: 266, status: \"critical\", zone: \"chancado\" },\n { id: \"silo-mts\", pm10: 483, pm25: 410, prom: 304, varPct: 58.9, status: \"critical\", zone: \"chancado\" },\n];\n\nexport async function status(opts) {\n var config = readConfig();\n if (!config) {\n console.log(pc.red(\" \u2717 \") + \"No hay configuraci\u00F3n. Ejecuta: nerhia onboard\");\n process.exit(1);\n }\n\n var lang = config.lang || \"es\";\n var sondas = addJitter(SONDAS_DEMO);\n var maxPM = Math.max.apply(null, sondas.map(function(s) { return s.pm10; }));\n var avgPM = Math.round(sondas.reduce(function(a, s) { return a + s.pm10; }, 0) / sondas.length);\n var critCount = sondas.filter(function(s) { return s.status === \"critical\"; }).length;\n\n if (opts.json) {\n console.log(JSON.stringify({\n timestamp: new Date().toISOString(),\n sondas_total: config.sondas,\n sondas_data: sondas,\n pm10_max: maxPM,\n pm10_avg: avgPM,\n critical_zones: critCount,\n system: \"operational\",\n }, null, 2));\n return;\n }\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 var maxSonda = sondas.reduce(function(a, b) { return a.pm10 > b.pm10 ? a : b; });\n var maxColor = maxPM > 300 ? pc.red : maxPM > 150 ? pc.yellow : pc.green;\n var avgColor = avgPM > 200 ? pc.red : avgPM > 100 ? pc.yellow : pc.green;\n\n row(\" \" + t(lang, \"status_sondas\"), config.sondas + \" \" + t(lang, \"status_connected\"), pc.green(\"\u25CF \" + t(lang, \"status_online\")));\n row(\" \" + t(lang, \"status_pm_max\"), maxColor(maxPM + \" \u00B5g/m\u00B3\"), pc.dim(maxSonda.id) + \" \" + dot(maxSonda.status, lang));\n row(\" \" + t(lang, \"status_pm_avg\"), avgColor(avgPM + \" \u00B5g/m\u00B3\"), pc.dim(\"flota\") + \" \" + (avgPM > 150 ? dot(\"warning\", lang) : dot(\"ok\", lang)));\n row(\" \" + t(lang, \"status_suppress\"), critCount + \" \" + t(lang, \"status_zones_active\"), \"\");\n row(\" \" + t(lang, \"status_ledger\"), \"1,247 \" + t(lang, \"status_events_today\"), \"\");\n row(\" \" + t(lang, \"status_last_action\"), t(lang, \"status_ago\") + \" 12 \" + t(lang, \"status_seconds\"), \"\");\n\n console.log(\"\");\n console.log(pc.dim(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"));\n\n sondas.forEach(function(s) {\n var pmColor = s.pm10 > 300 ? pc.red : s.pm10 > 80 ? pc.yellow : pc.green;\n var varSign = s.varPct > 0 ? \"\u2191\" : \"\u2193\";\n var varColor = s.varPct > 0 ? pc.red : pc.green;\n console.log(\n pc.dim((\" \" + s.id).padEnd(20)) +\n pmColor((s.pm10 + \" \u00B5g/m\u00B3\").padEnd(14)) +\n varColor((varSign + Math.abs(s.varPct) + \"%\").padEnd(10)) +\n dot(s.status, lang)\n );\n });\n\n console.log(\"\");\n\n if (opts.watch) {\n console.log(pc.dim(\" Actualizando cada 5s... Ctrl+C para salir\"));\n setInterval(function() {\n process.stdout.write(\"\\x1B[\" + (sondas.length + 14) + \"A\");\n status({ json: false, watch: false });\n }, 5000);\n }\n}\n\nfunction row(label, value, extra) {\n console.log(label.padEnd(22) + pc.bold(pc.white(value)) + (extra ? \" \" + extra : \"\"));\n}\n\nfunction dot(st, lang) {\n if (st === \"critical\") return pc.red(\"\u25CF \" + t(lang, \"status_critical\"));\n if (st === \"warning\") return pc.yellow(\"\u25CF \" + t(lang, \"status_warning\"));\n return pc.green(\"\u25CF \" + t(lang, \"status_ok\"));\n}\n\nfunction addJitter(sondas) {\n return sondas.map(function(s) {\n var j = 0.9 + Math.random() * 0.2;\n return Object.assign({}, s, { pm10: Math.round(s.pm10 * j), pm25: Math.round(s.pm25 * j) });\n });\n}\n", "// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\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", "
|
|
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"]
|
|
7
7
|
}
|