gea-program 0.42.0__tar.gz → 0.44.0__tar.gz

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.
Files changed (334) hide show
  1. {gea_program-0.42.0 → gea_program-0.44.0}/PKG-INFO +28 -1
  2. {gea_program-0.42.0 → gea_program-0.44.0}/README.md +27 -0
  3. {gea_program-0.42.0 → gea_program-0.44.0}/gea/__init__.py +1 -1
  4. {gea_program-0.42.0 → gea_program-0.44.0}/gea/__main__.py +134 -0
  5. {gea_program-0.42.0 → gea_program-0.44.0}/gea/acceptance_tests.py +423 -0
  6. gea_program-0.44.0/gea/alerts.py +177 -0
  7. {gea_program-0.42.0 → gea_program-0.44.0}/gea/client_reports.py +5 -0
  8. gea_program-0.44.0/gea/dossier.py +369 -0
  9. gea_program-0.44.0/gea/dossier_verify.py +136 -0
  10. gea_program-0.44.0/gea/ed25519.py +131 -0
  11. {gea_program-0.42.0 → gea_program-0.44.0}/gea/files.py +3 -1
  12. gea_program-0.44.0/gea/help/alerts.md +17 -0
  13. gea_program-0.44.0/gea/help/dossier.md +15 -0
  14. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/notifications.md +1 -1
  15. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/opseis.md +2 -0
  16. gea_program-0.44.0/gea/help/report-history.md +11 -0
  17. {gea_program-0.42.0 → gea_program-0.44.0}/gea/helplib.py +3 -0
  18. {gea_program-0.42.0 → gea_program-0.44.0}/gea/notify.py +22 -2
  19. {gea_program-0.42.0 → gea_program-0.44.0}/gea/op_seismicity.py +7 -0
  20. gea_program-0.44.0/gea/report_history.py +148 -0
  21. gea_program-0.44.0/gea/seismic_watch.py +336 -0
  22. {gea_program-0.42.0 → gea_program-0.44.0}/gea/service.py +55 -0
  23. {gea_program-0.42.0 → gea_program-0.44.0}/gea/web/app.html +54 -1
  24. {gea_program-0.42.0 → gea_program-0.44.0}/gea_program.egg-info/PKG-INFO +28 -1
  25. {gea_program-0.42.0 → gea_program-0.44.0}/gea_program.egg-info/SOURCES.txt +9 -0
  26. {gea_program-0.42.0 → gea_program-0.44.0}/pyproject.toml +1 -1
  27. {gea_program-0.42.0 → gea_program-0.44.0}/LICENSE +0 -0
  28. {gea_program-0.42.0 → gea_program-0.44.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  29. {gea_program-0.42.0 → gea_program-0.44.0}/gea/accuracy_statement.py +0 -0
  30. {gea_program-0.42.0 → gea_program-0.44.0}/gea/alarm_engine.py +0 -0
  31. {gea_program-0.42.0 → gea_program-0.44.0}/gea/backup.py +0 -0
  32. {gea_program-0.42.0 → gea_program-0.44.0}/gea/bench.py +0 -0
  33. {gea_program-0.42.0 → gea_program-0.44.0}/gea/blind_harness.py +0 -0
  34. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  35. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  36. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  37. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  38. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  39. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  40. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  41. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  42. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  43. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  44. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  45. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  46. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  47. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  48. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  49. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  50. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  51. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  52. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  53. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  54. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  55. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  56. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  57. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  58. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  59. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  60. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  61. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  62. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  63. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  64. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  65. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  66. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  67. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  68. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  69. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  70. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  71. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  72. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  73. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  74. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  75. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  76. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  77. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  78. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  79. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  80. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  81. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  82. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  83. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  84. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  85. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  86. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  87. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  88. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  89. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  90. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  91. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  92. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  93. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  94. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  95. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  96. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  97. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  98. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  99. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  100. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  101. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/med_160_sapropels.txt +0 -0
  102. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  103. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  104. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  105. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  106. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  107. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  108. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  109. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  110. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  111. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  112. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  113. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  114. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  115. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  116. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  117. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  118. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  119. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  120. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  121. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  122. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  123. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  124. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  125. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  126. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  127. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  128. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  129. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  130. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  131. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  132. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  133. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  134. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  135. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  136. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  137. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  138. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog_map.py +0 -0
  139. {gea_program-0.42.0 → gea_program-0.44.0}/gea/catalog_register.py +0 -0
  140. {gea_program-0.42.0 → gea_program-0.44.0}/gea/certificates.py +0 -0
  141. {gea_program-0.42.0 → gea_program-0.44.0}/gea/cli.py +0 -0
  142. {gea_program-0.42.0 → gea_program-0.44.0}/gea/config_versioning.py +0 -0
  143. {gea_program-0.42.0 → gea_program-0.44.0}/gea/conformance.py +0 -0
  144. {gea_program-0.42.0 → gea_program-0.44.0}/gea/control_room.py +0 -0
  145. {gea_program-0.42.0 → gea_program-0.44.0}/gea/correlation.py +0 -0
  146. {gea_program-0.42.0 → gea_program-0.44.0}/gea/dashboard.py +0 -0
  147. {gea_program-0.42.0 → gea_program-0.44.0}/gea/declarations.py +0 -0
  148. {gea_program-0.42.0 → gea_program-0.44.0}/gea/deviation.py +0 -0
  149. {gea_program-0.42.0 → gea_program-0.44.0}/gea/dlis.py +0 -0
  150. {gea_program-0.42.0 → gea_program-0.44.0}/gea/dnp3.py +0 -0
  151. {gea_program-0.42.0 → gea_program-0.44.0}/gea/doctor.py +0 -0
  152. {gea_program-0.42.0 → gea_program-0.44.0}/gea/downhole_engine.py +0 -0
  153. {gea_program-0.42.0 → gea_program-0.44.0}/gea/drift_monitor.py +0 -0
  154. {gea_program-0.42.0 → gea_program-0.44.0}/gea/drill_string.py +0 -0
  155. {gea_program-0.42.0 → gea_program-0.44.0}/gea/earth_model.py +0 -0
  156. {gea_program-0.42.0 → gea_program-0.44.0}/gea/economics.py +0 -0
  157. {gea_program-0.42.0 → gea_program-0.44.0}/gea/edr.py +0 -0
  158. {gea_program-0.42.0 → gea_program-0.44.0}/gea/elevation.py +0 -0
  159. {gea_program-0.42.0 → gea_program-0.44.0}/gea/etp.py +0 -0
  160. {gea_program-0.42.0 → gea_program-0.44.0}/gea/etp12_schemas.json +0 -0
  161. {gea_program-0.42.0 → gea_program-0.44.0}/gea/example_register_map.json +0 -0
  162. {gea_program-0.42.0 → gea_program-0.44.0}/gea/fat_sat.py +0 -0
  163. {gea_program-0.42.0 → gea_program-0.44.0}/gea/fixtures/README.md +0 -0
  164. {gea_program-0.42.0 → gea_program-0.44.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  165. {gea_program-0.42.0 → gea_program-0.44.0}/gea/fixtures/comcat_mahoning_1990-2026.txt +0 -0
  166. {gea_program-0.42.0 → gea_program-0.44.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  167. {gea_program-0.42.0 → gea_program-0.44.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  168. {gea_program-0.42.0 → gea_program-0.44.0}/gea/follower.py +0 -0
  169. {gea_program-0.42.0 → gea_program-0.44.0}/gea/forward_model.py +0 -0
  170. {gea_program-0.42.0 → gea_program-0.44.0}/gea/friction_priors.py +0 -0
  171. {gea_program-0.42.0 → gea_program-0.44.0}/gea/gamma.py +0 -0
  172. {gea_program-0.42.0 → gea_program-0.44.0}/gea/gauge_aging.py +0 -0
  173. {gea_program-0.42.0 → gea_program-0.44.0}/gea/gauge_specs.py +0 -0
  174. {gea_program-0.42.0 → gea_program-0.44.0}/gea/geodesy.py +0 -0
  175. {gea_program-0.42.0 → gea_program-0.44.0}/gea/gravity_reference.py +0 -0
  176. {gea_program-0.42.0 → gea_program-0.44.0}/gea/hartip.py +0 -0
  177. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/TESTER_GUIDE.md +0 -0
  178. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/alarms.md +0 -0
  179. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/audit-update.md +0 -0
  180. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/backup.md +0 -0
  181. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/catalog.md +0 -0
  182. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/charts.md +0 -0
  183. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/conformance.md +0 -0
  184. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/control-room.md +0 -0
  185. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/data-in.md +0 -0
  186. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/declare.md +0 -0
  187. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/dlis.md +0 -0
  188. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/doctor.md +0 -0
  189. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/drift.md +0 -0
  190. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/drillstring.md +0 -0
  191. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/economics.md +0 -0
  192. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/edr.md +0 -0
  193. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/etp.md +0 -0
  194. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/field-ports.md +0 -0
  195. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/files.md +0 -0
  196. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/historian.md +0 -0
  197. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/instruments.md +0 -0
  198. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/interval.md +0 -0
  199. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/map.md +0 -0
  200. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/month-end.md +0 -0
  201. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/osdu.md +0 -0
  202. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/patches.md +0 -0
  203. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/penetrator.md +0 -0
  204. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/ppdm.md +0 -0
  205. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/quakeml.md +0 -0
  206. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/quality.md +0 -0
  207. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/seedlink.md +0 -0
  208. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/seismic.md +0 -0
  209. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/setup.md +0 -0
  210. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/simulation.md +0 -0
  211. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/site.md +0 -0
  212. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/sites.md +0 -0
  213. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/slip.md +0 -0
  214. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/soak.md +0 -0
  215. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/sra.md +0 -0
  216. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/start.md +0 -0
  217. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/structure.md +0 -0
  218. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/tools.md +0 -0
  219. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/transients.md +0 -0
  220. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/upkeep.md +0 -0
  221. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/vibration.md +0 -0
  222. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/well-report.md +0 -0
  223. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/well-tests.md +0 -0
  224. {gea_program-0.42.0 → gea_program-0.44.0}/gea/help/well3d.md +0 -0
  225. {gea_program-0.42.0 → gea_program-0.44.0}/gea/housekeeping.py +0 -0
  226. {gea_program-0.42.0 → gea_program-0.44.0}/gea/interval.py +0 -0
  227. {gea_program-0.42.0 → gea_program-0.44.0}/gea/inverse_engine.py +0 -0
  228. {gea_program-0.42.0 → gea_program-0.44.0}/gea/jobs.py +0 -0
  229. {gea_program-0.42.0 → gea_program-0.44.0}/gea/live_ports.py +0 -0
  230. {gea_program-0.42.0 → gea_program-0.44.0}/gea/loadtest.py +0 -0
  231. {gea_program-0.42.0 → gea_program-0.44.0}/gea/matplotlib_demo.py +0 -0
  232. {gea_program-0.42.0 → gea_program-0.44.0}/gea/modbus.py +0 -0
  233. {gea_program-0.42.0 → gea_program-0.44.0}/gea/modbus_rtu.py +0 -0
  234. {gea_program-0.42.0 → gea_program-0.44.0}/gea/model_card.py +0 -0
  235. {gea_program-0.42.0 → gea_program-0.44.0}/gea/month_end.py +0 -0
  236. {gea_program-0.42.0 → gea_program-0.44.0}/gea/mqtt_port.py +0 -0
  237. {gea_program-0.42.0 → gea_program-0.44.0}/gea/opcua_port.py +0 -0
  238. {gea_program-0.42.0 → gea_program-0.44.0}/gea/operator_app.py +0 -0
  239. {gea_program-0.42.0 → gea_program-0.44.0}/gea/osdu.py +0 -0
  240. {gea_program-0.42.0 → gea_program-0.44.0}/gea/patches.py +0 -0
  241. {gea_program-0.42.0 → gea_program-0.44.0}/gea/penetrator.py +0 -0
  242. {gea_program-0.42.0 → gea_program-0.44.0}/gea/permits.py +0 -0
  243. {gea_program-0.42.0 → gea_program-0.44.0}/gea/piwebapi.py +0 -0
  244. {gea_program-0.42.0 → gea_program-0.44.0}/gea/ports.py +0 -0
  245. {gea_program-0.42.0 → gea_program-0.44.0}/gea/ppdm.py +0 -0
  246. {gea_program-0.42.0 → gea_program-0.44.0}/gea/profile_catalog.py +0 -0
  247. {gea_program-0.42.0 → gea_program-0.44.0}/gea/project.py +0 -0
  248. {gea_program-0.42.0 → gea_program-0.44.0}/gea/qt6_downhole_app.py +0 -0
  249. {gea_program-0.42.0 → gea_program-0.44.0}/gea/quakeml.py +0 -0
  250. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reconciler.py +0 -0
  251. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  252. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  253. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/eia_henry_hub_daily.csv.gz +0 -0
  254. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/eia_prices.provenance.json +0 -0
  255. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/eia_wti_daily.csv.gz +0 -0
  256. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  257. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  258. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  259. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  260. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/mahoning_example.json +0 -0
  261. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/mud_motor_specs.json +0 -0
  262. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/penetrator_ratings.json +0 -0
  263. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/seismicity_protocols.json +0 -0
  264. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/tool_sources.json +0 -0
  265. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/us_outline.json +0 -0
  266. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/us_outline.provenance.json +0 -0
  267. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_3d.provenance.json +0 -0
  268. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_f4_interpretation.las.gz +0 -0
  269. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_f4_logs.provenance.json +0 -0
  270. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_f4_lwd.las.gz +0 -0
  271. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_surfaces.json.gz +0 -0
  272. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_traj_F-10.xml.gz +0 -0
  273. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_traj_F-4.xml.gz +0 -0
  274. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
  275. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
  276. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
  277. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
  278. {gea_program-0.42.0 → gea_program-0.44.0}/gea/reference/volve_well_picks.csv.gz +0 -0
  279. {gea_program-0.42.0 → gea_program-0.44.0}/gea/rock_inventory.py +0 -0
  280. {gea_program-0.42.0 → gea_program-0.44.0}/gea/sample_record.py +0 -0
  281. {gea_program-0.42.0 → gea_program-0.44.0}/gea/sample_well_profile.csv +0 -0
  282. {gea_program-0.42.0 → gea_program-0.44.0}/gea/sbom.py +0 -0
  283. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seedlink.py +0 -0
  284. {gea_program-0.42.0 → gea_program-0.44.0}/gea/segy.py +0 -0
  285. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic.py +0 -0
  286. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_array.py +0 -0
  287. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_assoc.py +0 -0
  288. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_detect.py +0 -0
  289. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_film.py +0 -0
  290. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_harmonic.py +0 -0
  291. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_qc.py +0 -0
  292. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_response.py +0 -0
  293. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_signature.py +0 -0
  294. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_track.py +0 -0
  295. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_uncertainty.py +0 -0
  296. {gea_program-0.42.0 → gea_program-0.44.0}/gea/seismic_unlisted.py +0 -0
  297. {gea_program-0.42.0 → gea_program-0.44.0}/gea/sensor_swap.py +0 -0
  298. {gea_program-0.42.0 → gea_program-0.44.0}/gea/series_cache.py +0 -0
  299. {gea_program-0.42.0 → gea_program-0.44.0}/gea/service_life.py +0 -0
  300. {gea_program-0.42.0 → gea_program-0.44.0}/gea/setup_checklist.py +0 -0
  301. {gea_program-0.42.0 → gea_program-0.44.0}/gea/shapefile.py +0 -0
  302. {gea_program-0.42.0 → gea_program-0.44.0}/gea/shell.py +0 -0
  303. {gea_program-0.42.0 → gea_program-0.44.0}/gea/shut_in.py +0 -0
  304. {gea_program-0.42.0 → gea_program-0.44.0}/gea/simulation.py +0 -0
  305. {gea_program-0.42.0 → gea_program-0.44.0}/gea/site_map.py +0 -0
  306. {gea_program-0.42.0 → gea_program-0.44.0}/gea/sla_report.py +0 -0
  307. {gea_program-0.42.0 → gea_program-0.44.0}/gea/slip.py +0 -0
  308. {gea_program-0.42.0 → gea_program-0.44.0}/gea/soak.py +0 -0
  309. {gea_program-0.42.0 → gea_program-0.44.0}/gea/sra.py +0 -0
  310. {gea_program-0.42.0 → gea_program-0.44.0}/gea/store_forward.py +0 -0
  311. {gea_program-0.42.0 → gea_program-0.44.0}/gea/strata_join.py +0 -0
  312. {gea_program-0.42.0 → gea_program-0.44.0}/gea/structure.py +0 -0
  313. {gea_program-0.42.0 → gea_program-0.44.0}/gea/supervisor.py +0 -0
  314. {gea_program-0.42.0 → gea_program-0.44.0}/gea/survey_cmd.py +0 -0
  315. {gea_program-0.42.0 → gea_program-0.44.0}/gea/survey_view.py +0 -0
  316. {gea_program-0.42.0 → gea_program-0.44.0}/gea/telemetry.py +0 -0
  317. {gea_program-0.42.0 → gea_program-0.44.0}/gea/tool_catalog.py +0 -0
  318. {gea_program-0.42.0 → gea_program-0.44.0}/gea/tool_library.py +0 -0
  319. {gea_program-0.42.0 → gea_program-0.44.0}/gea/tool_taxonomy.py +0 -0
  320. {gea_program-0.42.0 → gea_program-0.44.0}/gea/transient.py +0 -0
  321. {gea_program-0.42.0 → gea_program-0.44.0}/gea/vibration.py +0 -0
  322. {gea_program-0.42.0 → gea_program-0.44.0}/gea/well3d.py +0 -0
  323. {gea_program-0.42.0 → gea_program-0.44.0}/gea/well_assembler.py +0 -0
  324. {gea_program-0.42.0 → gea_program-0.44.0}/gea/well_report.py +0 -0
  325. {gea_program-0.42.0 → gea_program-0.44.0}/gea/well_test_validation.py +0 -0
  326. {gea_program-0.42.0 → gea_program-0.44.0}/gea/wits0.py +0 -0
  327. {gea_program-0.42.0 → gea_program-0.44.0}/gea/witsml.py +0 -0
  328. {gea_program-0.42.0 → gea_program-0.44.0}/gea/workspace.py +0 -0
  329. {gea_program-0.42.0 → gea_program-0.44.0}/gea_program.egg-info/dependency_links.txt +0 -0
  330. {gea_program-0.42.0 → gea_program-0.44.0}/gea_program.egg-info/entry_points.txt +0 -0
  331. {gea_program-0.42.0 → gea_program-0.44.0}/gea_program.egg-info/requires.txt +0 -0
  332. {gea_program-0.42.0 → gea_program-0.44.0}/gea_program.egg-info/top_level.txt +0 -0
  333. {gea_program-0.42.0 → gea_program-0.44.0}/setup.cfg +0 -0
  334. {gea_program-0.42.0 → gea_program-0.44.0}/tests/test_acceptance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gea-program
3
- Version: 0.42.0
3
+ Version: 0.44.0
4
4
  Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
5
5
  Author: Daniel T. Murphy
6
6
  License: MPL-2.0
@@ -648,6 +648,33 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
648
648
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
649
649
  `rtserve.iris.washington.edu:18000`, network `TX`.
650
650
 
651
+ ### The earthquake watch and the alerts
652
+
653
+ While a well operates, the program reads the USGS earthquake catalogue
654
+ every few minutes from the site's machine - the real-time feed USGS asks
655
+ automated programs to use, and the catalogue service for any gap - and
656
+ raises an alert when an earthquake near the well reaches the chosen
657
+ regulator's protocol level; a revision to a higher level is a new alert,
658
+ and a watch that cannot reach the catalogue says so. The same alerts cover
659
+ what nobody watches by hand: a component's service interval used up, a
660
+ penetrator check outside its rating, a signed dossier the workspace no
661
+ longer matches. Every alert is listed on the Alarms tab and sent through
662
+ the notification rules (email or a webhook). `gea seismicity --watch-once`,
663
+ `gea alerts`, `gea help alerts`.
664
+
665
+ ### Report history and the signed dossier
666
+
667
+ Every client report a workspace writes is kept, version by version, under
668
+ `reports\history\` with each file's SHA-256, so pressing a report button
669
+ again no longer loses the last one; the Reports tab lists every version.
670
+ The signed dossier puts a well's - or the pad's - reports, declarations,
671
+ audit log and source-record hashes in one zip, signed with the site's own
672
+ Ed25519 key (made on the site's machine, never sent anywhere), with a
673
+ checker inside that anyone can run with plain Python: VALID when the
674
+ signature and every file's hash hold, and inside the workspace a check that
675
+ the source records and the audit log still match what was signed.
676
+ `gea dossier`, `gea reports-history`, `gea help dossier`.
677
+
651
678
  ### Operations and seismicity
652
679
 
653
680
  The Operations & Seismicity tab sets each well's drilling, completion and
@@ -609,6 +609,33 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
609
609
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
610
610
  `rtserve.iris.washington.edu:18000`, network `TX`.
611
611
 
612
+ ### The earthquake watch and the alerts
613
+
614
+ While a well operates, the program reads the USGS earthquake catalogue
615
+ every few minutes from the site's machine - the real-time feed USGS asks
616
+ automated programs to use, and the catalogue service for any gap - and
617
+ raises an alert when an earthquake near the well reaches the chosen
618
+ regulator's protocol level; a revision to a higher level is a new alert,
619
+ and a watch that cannot reach the catalogue says so. The same alerts cover
620
+ what nobody watches by hand: a component's service interval used up, a
621
+ penetrator check outside its rating, a signed dossier the workspace no
622
+ longer matches. Every alert is listed on the Alarms tab and sent through
623
+ the notification rules (email or a webhook). `gea seismicity --watch-once`,
624
+ `gea alerts`, `gea help alerts`.
625
+
626
+ ### Report history and the signed dossier
627
+
628
+ Every client report a workspace writes is kept, version by version, under
629
+ `reports\history\` with each file's SHA-256, so pressing a report button
630
+ again no longer loses the last one; the Reports tab lists every version.
631
+ The signed dossier puts a well's - or the pad's - reports, declarations,
632
+ audit log and source-record hashes in one zip, signed with the site's own
633
+ Ed25519 key (made on the site's machine, never sent anywhere), with a
634
+ checker inside that anyone can run with plain Python: VALID when the
635
+ signature and every file's hash hold, and inside the workspace a check that
636
+ the source records and the audit log still match what was signed.
637
+ `gea dossier`, `gea reports-history`, `gea help dossier`.
638
+
612
639
  ### Operations and seismicity
613
640
 
614
641
  The Operations & Seismicity tab sets each well's drilling, completion and
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.42.0"
126
+ __version__ = "0.44.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -563,9 +563,38 @@ def main(argv=None) -> int:
563
563
  p_os.add_argument("--kind", type=str, default=None, choices=("drilling", "completion", "disposal", "injection", "other"))
564
564
  p_os.add_argument("--remove-op", type=str, default=None)
565
565
  p_os.add_argument("--remove-catalog", type=str, default=None)
566
+ p_os.add_argument("--watch", type=str, default=None, choices=("on", "off"), help="turn the live earthquake watch on or off")
567
+ p_os.add_argument("--watch-every", type=float, default=None, help="the watch's interval in minutes (default 5)")
568
+ p_os.add_argument("--watch-mode", type=str, default=None, choices=("operations", "always"), help="poll only while an operation is under way (default), or always")
569
+ p_os.add_argument("--watch-once", action="store_true", help="poll the USGS catalogue now, from this machine, and say what came back")
566
570
  p_os.add_argument("--actor", type=str, default="cli")
567
571
  p_os.add_argument("--json", action="store_true")
568
572
 
573
+ p_al = sub.add_parser("alerts", help="the program's alerts: earthquakes near operating wells and the protocol levels they reach, the earthquake watch going quiet, components due for service, penetrator checks outside their ratings, dossiers the workspace no longer matches")
574
+ p_al.add_argument("--workspace", type=str, required=True)
575
+ p_al.add_argument("--check", action="store_true", help="check the motors, penetrators and dossiers now, sending what began or cleared through the notification rules")
576
+ p_al.add_argument("-n", type=int, default=30)
577
+ p_al.add_argument("--json", action="store_true")
578
+
579
+ p_dz = sub.add_parser("dossier", help="the signed dossier: a well's (or the pad's) reports, declarations, audit log and source hashes in one zip, signed with the site's Ed25519 key, with a checker anyone can run without this program")
580
+ p_dz.add_argument("--workspace", type=str, default=None)
581
+ p_dz.add_argument("--well", type=str, default=None, help="a well; without it, the pad (every well and the site reports)")
582
+ p_dz.add_argument("--include-sources", action="store_true", help="embed the source records (by default they are listed by hash)")
583
+ p_dz.add_argument("--verify", type=str, default=None, help="a dossier to check (with --workspace, also against this site)")
584
+ p_dz.add_argument("--sources", type=str, default="", help="with --verify: a folder holding the source records to check against their hashes")
585
+ p_dz.add_argument("--key", action="store_true", help="print this site's signing key fingerprint")
586
+ p_dz.add_argument("--list", action="store_true", help="list the dossiers this site has signed")
587
+ p_dz.add_argument("--actor", type=str, default="cli")
588
+ p_dz.add_argument("--json", action="store_true")
589
+
590
+ p_rh = sub.add_parser("reports-history", help="every version of every client report this workspace has written, kept under reports/history; --prune keeps the newest N")
591
+ p_rh.add_argument("--workspace", type=str, required=True)
592
+ p_rh.add_argument("--family", type=str, default=None, help="e.g. wells/Well-1/well_report or pad_report")
593
+ p_rh.add_argument("--prune", action="store_true")
594
+ p_rh.add_argument("--keep", type=int, default=0)
595
+ p_rh.add_argument("--apply", action="store_true", help="with --prune: remove (without it, list what would go)")
596
+ p_rh.add_argument("--json", action="store_true")
597
+
569
598
  p_sm = sub.add_parser("simulation", help="the simulation in words: the scenes (Volve 15/9-F-4 with its logs and interpretation, Volve F-5 and F-10 on the survey clock, every drilling-recorder well), and what the record says at a depth (the Simulation tab replays it)")
570
599
  p_sm.add_argument("--workspace", type=str, default=None)
571
600
  p_sm.add_argument("--scene", type=str, default=None, help="e.g. volve-f4, or well:Well-30636033")
@@ -2206,6 +2235,26 @@ def main(argv=None) -> int:
2206
2235
  return 0
2207
2236
  if a.remove_op:
2208
2237
  _OS.remove_operation(ws, a.actor, a.remove_op); print(f"removed {a.remove_op}"); return 0
2238
+ if a.watch or a.watch_every is not None or a.watch_mode or a.watch_once:
2239
+ from . import seismic_watch as _SW
2240
+ if ws is None:
2241
+ raise SystemExit("seismicity: the watch needs --workspace")
2242
+ if a.watch or a.watch_every is not None or a.watch_mode:
2243
+ _SW.set_settings(ws, a.actor, None if a.watch is None else a.watch == "on", a.watch_mode, a.watch_every)
2244
+ if a.watch_once:
2245
+ from .notify import Notifier
2246
+ n_ = Notifier(ws.path); n_.reload()
2247
+ r_ = _SW.poll(ws, n_, force=True)
2248
+ if r_.get("ok"):
2249
+ print(f"reached the catalogue ({r_['how']}): {r_['in_circle']} earthquake(s) in the watch circle, {r_['new']} new; {len(r_['alerts'])} alert(s)")
2250
+ for al_ in r_["alerts"]:
2251
+ print(f" {al_['event']}: {al_.get('detail', '')}")
2252
+ else:
2253
+ print(f"did not reach the catalogue: {r_.get('error') or r_.get('why')}")
2254
+ st_ = _SW.status(ws)
2255
+ print(f"watch: {st_['state']} - every {st_['settings']['every_min']:g} min, {st_['settings']['mode']}; last good poll {st_['last_ok_utc'] or 'never'}"
2256
+ + (f"; last error {st_['last_error']}" if st_.get('last_error') else ""))
2257
+ return 0 if (not a.watch_once or r_.get("ok")) else 1
2209
2258
  if a.remove_catalog:
2210
2259
  _OS.remove_catalog(ws, a.actor, a.remove_catalog); print(f"removed {a.remove_catalog}"); return 0
2211
2260
  over = {k: v for k, v in (("protocol", a.protocol), ("radius_km", a.radius_km), ("screen_km", a.screen_km), ("post_days", a.post_days), ("mc", a.mc)) if v is not None}
@@ -2226,6 +2275,91 @@ def main(argv=None) -> int:
2226
2275
  return 0
2227
2276
  print(_json.dumps(r, default=str) if a.json else _OS.text(r))
2228
2277
  return 0
2278
+ elif a.cmd == "dossier":
2279
+ import json as _json
2280
+ from . import dossier as _DZ
2281
+ from .cli import _safe_stdout
2282
+ from .workspace import Workspace, WorkspaceError
2283
+ _safe_stdout()
2284
+ ws = None
2285
+ if a.workspace:
2286
+ try:
2287
+ ws = Workspace(a.workspace)
2288
+ except WorkspaceError as e:
2289
+ raise SystemExit(f"dossier: {e}")
2290
+ if a.verify:
2291
+ r = _DZ.verify(a.verify, ws, a.sources)
2292
+ print(_json.dumps(r, default=str) if a.json else _DZ.text(r))
2293
+ return 0 if r["status"] == "VALID" else 1
2294
+ if ws is None:
2295
+ raise SystemExit("dossier: give --workspace (or --verify FILE)")
2296
+ if a.key:
2297
+ k = _DZ.key_info(ws)
2298
+ print(f"Ed25519 {k['fingerprint']} (public key {k['public_key']}, made {k['created_utc']})" if k else "no signing key yet: the first dossier makes one")
2299
+ return 0
2300
+ if a.list:
2301
+ for e in reversed(_DZ.ledger(ws)):
2302
+ print(f"{e['utc']} {e['dossier_id']} {e['display']:<24} {e['n_files']:>4} files {e['path']}")
2303
+ return 0
2304
+ try:
2305
+ e = _DZ.build(ws, a.actor, __version__, a.well, a.include_sources)
2306
+ except (KeyError, ValueError) as ex:
2307
+ raise SystemExit(f"dossier: {ex.args[0] if ex.args else ex}")
2308
+ print(f"signed {e['dossier_id']}: {e['display']}, {e['n_files']} file(s), {e['n_sources']} source record(s) {'embedded' if e['sources_embedded'] else 'by hash'}")
2309
+ print(f" {os.path.join(ws.reports_dir, e['path'])}")
2310
+ print(f" key fingerprint {e['fingerprint']}")
2311
+ return 0
2312
+ elif a.cmd == "reports-history":
2313
+ import json as _json
2314
+ from . import report_history as _RH
2315
+ from .cli import _safe_stdout
2316
+ from .workspace import Workspace, WorkspaceError
2317
+ _safe_stdout()
2318
+ try:
2319
+ ws = Workspace(a.workspace)
2320
+ except WorkspaceError as e:
2321
+ raise SystemExit(f"reports-history: {e}")
2322
+ if a.prune:
2323
+ if a.keep < 1:
2324
+ raise SystemExit("reports-history: --prune needs --keep N (at least 1)")
2325
+ r = _RH.prune(ws.reports_dir, a.keep, a.family, a.apply)
2326
+ print(f"{'removed' if r['applied'] else 'would remove'} {len(r['removed'])} version(s), {r['bytes_freed']:,} bytes" + ("" if r['applied'] else " - add --apply to remove them"))
2327
+ return 0
2328
+ sm = _RH.summary(ws.reports_dir)
2329
+ if a.json:
2330
+ print(_json.dumps(sm, default=str)); return 0
2331
+ print(f"{sm['n_versions']} version(s) of {len(sm['families'])} report(s), {sm['bytes']:,} bytes under {os.path.join(ws.reports_dir, 'history')}")
2332
+ for f_ in sm["families"]:
2333
+ if a.family and f_["family"] != a.family:
2334
+ continue
2335
+ print(f" {f_['family']}: {f_['n']} version(s)")
2336
+ for v in f_["versions"][: (50 if a.family else 3)]:
2337
+ print(f" {v['utc']} {v.get('report_id') or ''} reports/{v['dir']}")
2338
+ return 0
2339
+ elif a.cmd == "alerts":
2340
+ import json as _json
2341
+ from . import alerts as _AL
2342
+ from .cli import _safe_stdout
2343
+ from .notify import Notifier
2344
+ from .workspace import Workspace, WorkspaceError
2345
+ _safe_stdout()
2346
+ try:
2347
+ ws = Workspace(a.workspace)
2348
+ except WorkspaceError as e:
2349
+ raise SystemExit(f"alerts: {e}")
2350
+ if a.check:
2351
+ n_ = Notifier(ws.path); n_.reload()
2352
+ r_ = _AL.check_conditions(ws, n_, force=True)
2353
+ print(f"checked: {len(r_)} alert(s) raised or cleared")
2354
+ rows = _AL.recent(ws, a.n)
2355
+ if a.json:
2356
+ print(_json.dumps(rows, default=str)); return 0
2357
+ for r in rows:
2358
+ sent = ", ".join(f"{d['channel']}{'' if d['ok'] else ' (failed)'}" for d in r.get("delivered") or []) or "no channel set up"
2359
+ print(f"{r['utc']} {r['event']:<20} {r.get('well') or '':<16} {r.get('detail', '')} [{sent}]")
2360
+ if not rows:
2361
+ print("no alerts yet")
2362
+ return 0
2229
2363
  elif a.cmd == "simulation":
2230
2364
  import json as _json
2231
2365
  from . import simulation as _SIM