nerhia 1.0.3 → 1.0.4

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