gea-program 0.43.0__tar.gz → 0.45.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 (337) hide show
  1. {gea_program-0.43.0 → gea_program-0.45.0}/PKG-INFO +30 -1
  2. {gea_program-0.43.0 → gea_program-0.45.0}/README.md +29 -0
  3. {gea_program-0.43.0 → gea_program-0.45.0}/gea/__init__.py +1 -1
  4. {gea_program-0.43.0 → gea_program-0.45.0}/gea/__main__.py +113 -0
  5. {gea_program-0.43.0 → gea_program-0.45.0}/gea/acceptance_tests.py +497 -1
  6. gea_program-0.45.0/gea/alerts.py +177 -0
  7. {gea_program-0.43.0 → gea_program-0.45.0}/gea/client_reports.py +15 -1
  8. {gea_program-0.43.0 → gea_program-0.45.0}/gea/dossier.py +134 -17
  9. {gea_program-0.43.0 → gea_program-0.45.0}/gea/dossier_verify.py +49 -2
  10. gea_program-0.45.0/gea/help/alerts.md +17 -0
  11. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/dossier.md +3 -1
  12. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/notifications.md +1 -1
  13. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/opseis.md +4 -2
  14. gea_program-0.45.0/gea/help/pad-summary.md +13 -0
  15. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/report-history.md +2 -0
  16. {gea_program-0.43.0 → gea_program-0.45.0}/gea/helplib.py +2 -0
  17. {gea_program-0.43.0 → gea_program-0.45.0}/gea/notify.py +27 -2
  18. {gea_program-0.43.0 → gea_program-0.45.0}/gea/op_seismicity.py +116 -5
  19. gea_program-0.45.0/gea/pad_summary.py +305 -0
  20. gea_program-0.45.0/gea/pdf_report.py +532 -0
  21. gea_program-0.45.0/gea/seismic_watch.py +341 -0
  22. {gea_program-0.43.0 → gea_program-0.45.0}/gea/service.py +42 -0
  23. {gea_program-0.43.0 → gea_program-0.45.0}/gea/web/app.html +38 -4
  24. {gea_program-0.43.0 → gea_program-0.45.0}/gea_program.egg-info/PKG-INFO +30 -1
  25. {gea_program-0.43.0 → gea_program-0.45.0}/gea_program.egg-info/SOURCES.txt +6 -0
  26. {gea_program-0.43.0 → gea_program-0.45.0}/pyproject.toml +1 -1
  27. {gea_program-0.43.0 → gea_program-0.45.0}/LICENSE +0 -0
  28. {gea_program-0.43.0 → gea_program-0.45.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  29. {gea_program-0.43.0 → gea_program-0.45.0}/gea/accuracy_statement.py +0 -0
  30. {gea_program-0.43.0 → gea_program-0.45.0}/gea/alarm_engine.py +0 -0
  31. {gea_program-0.43.0 → gea_program-0.45.0}/gea/backup.py +0 -0
  32. {gea_program-0.43.0 → gea_program-0.45.0}/gea/bench.py +0 -0
  33. {gea_program-0.43.0 → gea_program-0.45.0}/gea/blind_harness.py +0 -0
  34. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  35. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  36. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  37. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  38. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  39. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  40. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  41. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  42. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  43. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  44. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  45. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  46. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  47. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  48. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  49. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  50. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  51. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  52. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  53. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  54. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  55. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  56. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  57. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  58. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  59. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  60. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  61. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  62. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  63. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  64. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  65. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  66. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  67. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  68. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  69. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  70. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  71. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  72. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  73. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  74. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  75. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  76. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  77. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  78. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  79. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  80. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  81. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  82. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  83. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  84. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  85. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  86. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  87. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  88. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  89. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  90. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  91. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  92. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  93. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  94. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  95. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  96. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  97. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  98. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  99. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  100. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  101. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/med_160_sapropels.txt +0 -0
  102. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  103. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  104. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  105. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  106. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  107. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  108. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  109. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  110. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  111. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  112. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  113. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  114. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  115. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  116. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  117. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  118. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  119. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  120. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  121. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  122. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  123. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  124. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  125. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  126. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  127. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  128. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  129. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  130. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  131. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  132. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  133. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  134. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  135. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  136. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  137. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  138. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog_map.py +0 -0
  139. {gea_program-0.43.0 → gea_program-0.45.0}/gea/catalog_register.py +0 -0
  140. {gea_program-0.43.0 → gea_program-0.45.0}/gea/certificates.py +0 -0
  141. {gea_program-0.43.0 → gea_program-0.45.0}/gea/cli.py +0 -0
  142. {gea_program-0.43.0 → gea_program-0.45.0}/gea/config_versioning.py +0 -0
  143. {gea_program-0.43.0 → gea_program-0.45.0}/gea/conformance.py +0 -0
  144. {gea_program-0.43.0 → gea_program-0.45.0}/gea/control_room.py +0 -0
  145. {gea_program-0.43.0 → gea_program-0.45.0}/gea/correlation.py +0 -0
  146. {gea_program-0.43.0 → gea_program-0.45.0}/gea/dashboard.py +0 -0
  147. {gea_program-0.43.0 → gea_program-0.45.0}/gea/declarations.py +0 -0
  148. {gea_program-0.43.0 → gea_program-0.45.0}/gea/deviation.py +0 -0
  149. {gea_program-0.43.0 → gea_program-0.45.0}/gea/dlis.py +0 -0
  150. {gea_program-0.43.0 → gea_program-0.45.0}/gea/dnp3.py +0 -0
  151. {gea_program-0.43.0 → gea_program-0.45.0}/gea/doctor.py +0 -0
  152. {gea_program-0.43.0 → gea_program-0.45.0}/gea/downhole_engine.py +0 -0
  153. {gea_program-0.43.0 → gea_program-0.45.0}/gea/drift_monitor.py +0 -0
  154. {gea_program-0.43.0 → gea_program-0.45.0}/gea/drill_string.py +0 -0
  155. {gea_program-0.43.0 → gea_program-0.45.0}/gea/earth_model.py +0 -0
  156. {gea_program-0.43.0 → gea_program-0.45.0}/gea/economics.py +0 -0
  157. {gea_program-0.43.0 → gea_program-0.45.0}/gea/ed25519.py +0 -0
  158. {gea_program-0.43.0 → gea_program-0.45.0}/gea/edr.py +0 -0
  159. {gea_program-0.43.0 → gea_program-0.45.0}/gea/elevation.py +0 -0
  160. {gea_program-0.43.0 → gea_program-0.45.0}/gea/etp.py +0 -0
  161. {gea_program-0.43.0 → gea_program-0.45.0}/gea/etp12_schemas.json +0 -0
  162. {gea_program-0.43.0 → gea_program-0.45.0}/gea/example_register_map.json +0 -0
  163. {gea_program-0.43.0 → gea_program-0.45.0}/gea/fat_sat.py +0 -0
  164. {gea_program-0.43.0 → gea_program-0.45.0}/gea/files.py +0 -0
  165. {gea_program-0.43.0 → gea_program-0.45.0}/gea/fixtures/README.md +0 -0
  166. {gea_program-0.43.0 → gea_program-0.45.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  167. {gea_program-0.43.0 → gea_program-0.45.0}/gea/fixtures/comcat_mahoning_1990-2026.txt +0 -0
  168. {gea_program-0.43.0 → gea_program-0.45.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  169. {gea_program-0.43.0 → gea_program-0.45.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  170. {gea_program-0.43.0 → gea_program-0.45.0}/gea/follower.py +0 -0
  171. {gea_program-0.43.0 → gea_program-0.45.0}/gea/forward_model.py +0 -0
  172. {gea_program-0.43.0 → gea_program-0.45.0}/gea/friction_priors.py +0 -0
  173. {gea_program-0.43.0 → gea_program-0.45.0}/gea/gamma.py +0 -0
  174. {gea_program-0.43.0 → gea_program-0.45.0}/gea/gauge_aging.py +0 -0
  175. {gea_program-0.43.0 → gea_program-0.45.0}/gea/gauge_specs.py +0 -0
  176. {gea_program-0.43.0 → gea_program-0.45.0}/gea/geodesy.py +0 -0
  177. {gea_program-0.43.0 → gea_program-0.45.0}/gea/gravity_reference.py +0 -0
  178. {gea_program-0.43.0 → gea_program-0.45.0}/gea/hartip.py +0 -0
  179. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/TESTER_GUIDE.md +0 -0
  180. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/alarms.md +0 -0
  181. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/audit-update.md +0 -0
  182. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/backup.md +0 -0
  183. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/catalog.md +0 -0
  184. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/charts.md +0 -0
  185. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/conformance.md +0 -0
  186. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/control-room.md +0 -0
  187. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/data-in.md +0 -0
  188. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/declare.md +0 -0
  189. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/dlis.md +0 -0
  190. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/doctor.md +0 -0
  191. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/drift.md +0 -0
  192. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/drillstring.md +0 -0
  193. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/economics.md +0 -0
  194. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/edr.md +0 -0
  195. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/etp.md +0 -0
  196. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/field-ports.md +0 -0
  197. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/files.md +0 -0
  198. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/historian.md +0 -0
  199. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/instruments.md +0 -0
  200. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/interval.md +0 -0
  201. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/map.md +0 -0
  202. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/month-end.md +0 -0
  203. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/osdu.md +0 -0
  204. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/patches.md +0 -0
  205. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/penetrator.md +0 -0
  206. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/ppdm.md +0 -0
  207. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/quakeml.md +0 -0
  208. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/quality.md +0 -0
  209. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/seedlink.md +0 -0
  210. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/seismic.md +0 -0
  211. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/setup.md +0 -0
  212. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/simulation.md +0 -0
  213. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/site.md +0 -0
  214. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/sites.md +0 -0
  215. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/slip.md +0 -0
  216. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/soak.md +0 -0
  217. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/sra.md +0 -0
  218. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/start.md +0 -0
  219. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/structure.md +0 -0
  220. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/tools.md +0 -0
  221. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/transients.md +0 -0
  222. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/upkeep.md +0 -0
  223. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/vibration.md +0 -0
  224. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/well-report.md +0 -0
  225. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/well-tests.md +0 -0
  226. {gea_program-0.43.0 → gea_program-0.45.0}/gea/help/well3d.md +0 -0
  227. {gea_program-0.43.0 → gea_program-0.45.0}/gea/housekeeping.py +0 -0
  228. {gea_program-0.43.0 → gea_program-0.45.0}/gea/interval.py +0 -0
  229. {gea_program-0.43.0 → gea_program-0.45.0}/gea/inverse_engine.py +0 -0
  230. {gea_program-0.43.0 → gea_program-0.45.0}/gea/jobs.py +0 -0
  231. {gea_program-0.43.0 → gea_program-0.45.0}/gea/live_ports.py +0 -0
  232. {gea_program-0.43.0 → gea_program-0.45.0}/gea/loadtest.py +0 -0
  233. {gea_program-0.43.0 → gea_program-0.45.0}/gea/matplotlib_demo.py +0 -0
  234. {gea_program-0.43.0 → gea_program-0.45.0}/gea/modbus.py +0 -0
  235. {gea_program-0.43.0 → gea_program-0.45.0}/gea/modbus_rtu.py +0 -0
  236. {gea_program-0.43.0 → gea_program-0.45.0}/gea/model_card.py +0 -0
  237. {gea_program-0.43.0 → gea_program-0.45.0}/gea/month_end.py +0 -0
  238. {gea_program-0.43.0 → gea_program-0.45.0}/gea/mqtt_port.py +0 -0
  239. {gea_program-0.43.0 → gea_program-0.45.0}/gea/opcua_port.py +0 -0
  240. {gea_program-0.43.0 → gea_program-0.45.0}/gea/operator_app.py +0 -0
  241. {gea_program-0.43.0 → gea_program-0.45.0}/gea/osdu.py +0 -0
  242. {gea_program-0.43.0 → gea_program-0.45.0}/gea/patches.py +0 -0
  243. {gea_program-0.43.0 → gea_program-0.45.0}/gea/penetrator.py +0 -0
  244. {gea_program-0.43.0 → gea_program-0.45.0}/gea/permits.py +0 -0
  245. {gea_program-0.43.0 → gea_program-0.45.0}/gea/piwebapi.py +0 -0
  246. {gea_program-0.43.0 → gea_program-0.45.0}/gea/ports.py +0 -0
  247. {gea_program-0.43.0 → gea_program-0.45.0}/gea/ppdm.py +0 -0
  248. {gea_program-0.43.0 → gea_program-0.45.0}/gea/profile_catalog.py +0 -0
  249. {gea_program-0.43.0 → gea_program-0.45.0}/gea/project.py +0 -0
  250. {gea_program-0.43.0 → gea_program-0.45.0}/gea/qt6_downhole_app.py +0 -0
  251. {gea_program-0.43.0 → gea_program-0.45.0}/gea/quakeml.py +0 -0
  252. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reconciler.py +0 -0
  253. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  254. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  255. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/eia_henry_hub_daily.csv.gz +0 -0
  256. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/eia_prices.provenance.json +0 -0
  257. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/eia_wti_daily.csv.gz +0 -0
  258. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  259. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  260. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  261. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  262. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/mahoning_example.json +0 -0
  263. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/mud_motor_specs.json +0 -0
  264. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/penetrator_ratings.json +0 -0
  265. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/seismicity_protocols.json +0 -0
  266. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/tool_sources.json +0 -0
  267. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/us_outline.json +0 -0
  268. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/us_outline.provenance.json +0 -0
  269. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_3d.provenance.json +0 -0
  270. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_f4_interpretation.las.gz +0 -0
  271. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_f4_logs.provenance.json +0 -0
  272. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_f4_lwd.las.gz +0 -0
  273. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_surfaces.json.gz +0 -0
  274. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_traj_F-10.xml.gz +0 -0
  275. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_traj_F-4.xml.gz +0 -0
  276. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
  277. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
  278. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
  279. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
  280. {gea_program-0.43.0 → gea_program-0.45.0}/gea/reference/volve_well_picks.csv.gz +0 -0
  281. {gea_program-0.43.0 → gea_program-0.45.0}/gea/report_history.py +0 -0
  282. {gea_program-0.43.0 → gea_program-0.45.0}/gea/rock_inventory.py +0 -0
  283. {gea_program-0.43.0 → gea_program-0.45.0}/gea/sample_record.py +0 -0
  284. {gea_program-0.43.0 → gea_program-0.45.0}/gea/sample_well_profile.csv +0 -0
  285. {gea_program-0.43.0 → gea_program-0.45.0}/gea/sbom.py +0 -0
  286. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seedlink.py +0 -0
  287. {gea_program-0.43.0 → gea_program-0.45.0}/gea/segy.py +0 -0
  288. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic.py +0 -0
  289. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_array.py +0 -0
  290. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_assoc.py +0 -0
  291. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_detect.py +0 -0
  292. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_film.py +0 -0
  293. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_harmonic.py +0 -0
  294. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_qc.py +0 -0
  295. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_response.py +0 -0
  296. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_signature.py +0 -0
  297. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_track.py +0 -0
  298. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_uncertainty.py +0 -0
  299. {gea_program-0.43.0 → gea_program-0.45.0}/gea/seismic_unlisted.py +0 -0
  300. {gea_program-0.43.0 → gea_program-0.45.0}/gea/sensor_swap.py +0 -0
  301. {gea_program-0.43.0 → gea_program-0.45.0}/gea/series_cache.py +0 -0
  302. {gea_program-0.43.0 → gea_program-0.45.0}/gea/service_life.py +0 -0
  303. {gea_program-0.43.0 → gea_program-0.45.0}/gea/setup_checklist.py +0 -0
  304. {gea_program-0.43.0 → gea_program-0.45.0}/gea/shapefile.py +0 -0
  305. {gea_program-0.43.0 → gea_program-0.45.0}/gea/shell.py +0 -0
  306. {gea_program-0.43.0 → gea_program-0.45.0}/gea/shut_in.py +0 -0
  307. {gea_program-0.43.0 → gea_program-0.45.0}/gea/simulation.py +0 -0
  308. {gea_program-0.43.0 → gea_program-0.45.0}/gea/site_map.py +0 -0
  309. {gea_program-0.43.0 → gea_program-0.45.0}/gea/sla_report.py +0 -0
  310. {gea_program-0.43.0 → gea_program-0.45.0}/gea/slip.py +0 -0
  311. {gea_program-0.43.0 → gea_program-0.45.0}/gea/soak.py +0 -0
  312. {gea_program-0.43.0 → gea_program-0.45.0}/gea/sra.py +0 -0
  313. {gea_program-0.43.0 → gea_program-0.45.0}/gea/store_forward.py +0 -0
  314. {gea_program-0.43.0 → gea_program-0.45.0}/gea/strata_join.py +0 -0
  315. {gea_program-0.43.0 → gea_program-0.45.0}/gea/structure.py +0 -0
  316. {gea_program-0.43.0 → gea_program-0.45.0}/gea/supervisor.py +0 -0
  317. {gea_program-0.43.0 → gea_program-0.45.0}/gea/survey_cmd.py +0 -0
  318. {gea_program-0.43.0 → gea_program-0.45.0}/gea/survey_view.py +0 -0
  319. {gea_program-0.43.0 → gea_program-0.45.0}/gea/telemetry.py +0 -0
  320. {gea_program-0.43.0 → gea_program-0.45.0}/gea/tool_catalog.py +0 -0
  321. {gea_program-0.43.0 → gea_program-0.45.0}/gea/tool_library.py +0 -0
  322. {gea_program-0.43.0 → gea_program-0.45.0}/gea/tool_taxonomy.py +0 -0
  323. {gea_program-0.43.0 → gea_program-0.45.0}/gea/transient.py +0 -0
  324. {gea_program-0.43.0 → gea_program-0.45.0}/gea/vibration.py +0 -0
  325. {gea_program-0.43.0 → gea_program-0.45.0}/gea/well3d.py +0 -0
  326. {gea_program-0.43.0 → gea_program-0.45.0}/gea/well_assembler.py +0 -0
  327. {gea_program-0.43.0 → gea_program-0.45.0}/gea/well_report.py +0 -0
  328. {gea_program-0.43.0 → gea_program-0.45.0}/gea/well_test_validation.py +0 -0
  329. {gea_program-0.43.0 → gea_program-0.45.0}/gea/wits0.py +0 -0
  330. {gea_program-0.43.0 → gea_program-0.45.0}/gea/witsml.py +0 -0
  331. {gea_program-0.43.0 → gea_program-0.45.0}/gea/workspace.py +0 -0
  332. {gea_program-0.43.0 → gea_program-0.45.0}/gea_program.egg-info/dependency_links.txt +0 -0
  333. {gea_program-0.43.0 → gea_program-0.45.0}/gea_program.egg-info/entry_points.txt +0 -0
  334. {gea_program-0.43.0 → gea_program-0.45.0}/gea_program.egg-info/requires.txt +0 -0
  335. {gea_program-0.43.0 → gea_program-0.45.0}/gea_program.egg-info/top_level.txt +0 -0
  336. {gea_program-0.43.0 → gea_program-0.45.0}/setup.cfg +0 -0
  337. {gea_program-0.43.0 → gea_program-0.45.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.43.0
3
+ Version: 0.45.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,35 @@ 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 lateral, the printable reports, the daily summary and the key
652
+
653
+ An earthquake near a well with a directional survey is measured from the
654
+ nearest point of its lateral, not from the pad - with the measured depth
655
+ there and the distance to the hypocentre - so a protocol radius is read
656
+ against the well bore a regulator means. Every client report is also
657
+ written as a PDF beside its HTML (the drawings redrawn, long tables
658
+ continued across pages) and kept in report history. Each morning the
659
+ program writes a one-page pad summary - what changed, what is due, what is
660
+ still missing - and sends it through the notification rules (`gea
661
+ pad-summary`). The dossier signing key can be retired and replaced: the old
662
+ key signs the hand-over, earlier dossiers still check out, and later ones
663
+ carry the rotation so a client can follow it (`gea dossier --rotate-key`).
664
+ `gea help pad-summary`.
665
+
666
+ ### The earthquake watch and the alerts
667
+
668
+ While a well operates, the program reads the USGS earthquake catalogue
669
+ every few minutes from the site's machine - the real-time feed USGS asks
670
+ automated programs to use, and the catalogue service for any gap - and
671
+ raises an alert when an earthquake near the well reaches the chosen
672
+ regulator's protocol level; a revision to a higher level is a new alert,
673
+ and a watch that cannot reach the catalogue says so. The same alerts cover
674
+ what nobody watches by hand: a component's service interval used up, a
675
+ penetrator check outside its rating, a signed dossier the workspace no
676
+ longer matches. Every alert is listed on the Alarms tab and sent through
677
+ the notification rules (email or a webhook). `gea seismicity --watch-once`,
678
+ `gea alerts`, `gea help alerts`.
679
+
651
680
  ### Report history and the signed dossier
652
681
 
653
682
  Every client report a workspace writes is kept, version by version, under
@@ -609,6 +609,35 @@ 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 lateral, the printable reports, the daily summary and the key
613
+
614
+ An earthquake near a well with a directional survey is measured from the
615
+ nearest point of its lateral, not from the pad - with the measured depth
616
+ there and the distance to the hypocentre - so a protocol radius is read
617
+ against the well bore a regulator means. Every client report is also
618
+ written as a PDF beside its HTML (the drawings redrawn, long tables
619
+ continued across pages) and kept in report history. Each morning the
620
+ program writes a one-page pad summary - what changed, what is due, what is
621
+ still missing - and sends it through the notification rules (`gea
622
+ pad-summary`). The dossier signing key can be retired and replaced: the old
623
+ key signs the hand-over, earlier dossiers still check out, and later ones
624
+ carry the rotation so a client can follow it (`gea dossier --rotate-key`).
625
+ `gea help pad-summary`.
626
+
627
+ ### The earthquake watch and the alerts
628
+
629
+ While a well operates, the program reads the USGS earthquake catalogue
630
+ every few minutes from the site's machine - the real-time feed USGS asks
631
+ automated programs to use, and the catalogue service for any gap - and
632
+ raises an alert when an earthquake near the well reaches the chosen
633
+ regulator's protocol level; a revision to a higher level is a new alert,
634
+ and a watch that cannot reach the catalogue says so. The same alerts cover
635
+ what nobody watches by hand: a component's service interval used up, a
636
+ penetrator check outside its rating, a signed dossier the workspace no
637
+ longer matches. Every alert is listed on the Alarms tab and sent through
638
+ the notification rules (email or a webhook). `gea seismicity --watch-once`,
639
+ `gea alerts`, `gea help alerts`.
640
+
612
641
  ### Report history and the signed dossier
613
642
 
614
643
  Every client report a workspace writes is kept, version by version, under
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.43.0"
126
+ __version__ = "0.45.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -563,9 +563,19 @@ 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
+
569
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")
570
580
  p_dz.add_argument("--workspace", type=str, default=None)
571
581
  p_dz.add_argument("--well", type=str, default=None, help="a well; without it, the pad (every well and the site reports)")
@@ -574,9 +584,21 @@ def main(argv=None) -> int:
574
584
  p_dz.add_argument("--sources", type=str, default="", help="with --verify: a folder holding the source records to check against their hashes")
575
585
  p_dz.add_argument("--key", action="store_true", help="print this site's signing key fingerprint")
576
586
  p_dz.add_argument("--list", action="store_true", help="list the dossiers this site has signed")
587
+ p_dz.add_argument("--rotate-key", action="store_true", help="retire this site's signing key and start a new one, signed over by the old (give --reason)")
588
+ p_dz.add_argument("--reason", type=str, default="", help="with --rotate-key: why the key is retired")
589
+ p_dz.add_argument("--key-history", action="store_true", help="the site's keys, current and retired, and the rotations between them")
577
590
  p_dz.add_argument("--actor", type=str, default="cli")
578
591
  p_dz.add_argument("--json", action="store_true")
579
592
 
593
+ p_ps = sub.add_parser("pad-summary", help="the daily pad summary: what changed since the last one, what is due, what is still missing - one page, kept in report history; the service writes it each day and sends it through the notification rules")
594
+ p_ps.add_argument("--workspace", type=str, required=True)
595
+ p_ps.add_argument("--send", action="store_true", help="also hand it to the notification rules (the event pad.summary)")
596
+ p_ps.add_argument("--at", type=str, default=None, help="the daily time the service writes it, HH:MM UTC")
597
+ p_ps.add_argument("--on", action="store_true", help="the service writes it each day")
598
+ p_ps.add_argument("--off", action="store_true", help="the service does not")
599
+ p_ps.add_argument("--actor", type=str, default="cli")
600
+ p_ps.add_argument("--json", action="store_true")
601
+
580
602
  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")
581
603
  p_rh.add_argument("--workspace", type=str, required=True)
582
604
  p_rh.add_argument("--family", type=str, default=None, help="e.g. wells/Well-1/well_report or pad_report")
@@ -2225,6 +2247,26 @@ def main(argv=None) -> int:
2225
2247
  return 0
2226
2248
  if a.remove_op:
2227
2249
  _OS.remove_operation(ws, a.actor, a.remove_op); print(f"removed {a.remove_op}"); return 0
2250
+ if a.watch or a.watch_every is not None or a.watch_mode or a.watch_once:
2251
+ from . import seismic_watch as _SW
2252
+ if ws is None:
2253
+ raise SystemExit("seismicity: the watch needs --workspace")
2254
+ if a.watch or a.watch_every is not None or a.watch_mode:
2255
+ _SW.set_settings(ws, a.actor, None if a.watch is None else a.watch == "on", a.watch_mode, a.watch_every)
2256
+ if a.watch_once:
2257
+ from .notify import Notifier
2258
+ n_ = Notifier(ws.path); n_.reload()
2259
+ r_ = _SW.poll(ws, n_, force=True)
2260
+ if r_.get("ok"):
2261
+ print(f"reached the catalogue ({r_['how']}): {r_['in_circle']} earthquake(s) in the watch circle, {r_['new']} new; {len(r_['alerts'])} alert(s)")
2262
+ for al_ in r_["alerts"]:
2263
+ print(f" {al_['event']}: {al_.get('detail', '')}")
2264
+ else:
2265
+ print(f"did not reach the catalogue: {r_.get('error') or r_.get('why')}")
2266
+ st_ = _SW.status(ws)
2267
+ print(f"watch: {st_['state']} - every {st_['settings']['every_min']:g} min, {st_['settings']['mode']}; last good poll {st_['last_ok_utc'] or 'never'}"
2268
+ + (f"; last error {st_['last_error']}" if st_.get('last_error') else ""))
2269
+ return 0 if (not a.watch_once or r_.get("ok")) else 1
2228
2270
  if a.remove_catalog:
2229
2271
  _OS.remove_catalog(ws, a.actor, a.remove_catalog); print(f"removed {a.remove_catalog}"); return 0
2230
2272
  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}
@@ -2267,6 +2309,23 @@ def main(argv=None) -> int:
2267
2309
  k = _DZ.key_info(ws)
2268
2310
  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")
2269
2311
  return 0
2312
+ if a.rotate_key:
2313
+ try:
2314
+ r_ = _DZ.rotate_key(ws, a.actor, a.reason)
2315
+ except ValueError as ex:
2316
+ raise SystemExit(f"dossier: {ex}")
2317
+ print(f"retired {r_['old']['fingerprint']}; the new key is {r_['new']['fingerprint']}")
2318
+ print(" the rotation is signed by both keys and rides in every later dossier; give the new fingerprint to your clients")
2319
+ return 0
2320
+ if a.key_history:
2321
+ h_ = _DZ.key_history(ws)
2322
+ if a.json:
2323
+ print(_json.dumps(h_, default=str)); return 0
2324
+ for k in h_["keys"]:
2325
+ print(f"{k['fingerprint']} made {k.get('created_utc') or '?'} " + (f"retired {k['retired_utc']} ({k.get('reason', '')}) -> {k.get('successor')}" if k.get("retired_utc") else "CURRENT"))
2326
+ if not h_["keys"]:
2327
+ print("no key history yet")
2328
+ return 0
2270
2329
  if a.list:
2271
2330
  for e in reversed(_DZ.ledger(ws)):
2272
2331
  print(f"{e['utc']} {e['dossier_id']} {e['display']:<24} {e['n_files']:>4} files {e['path']}")
@@ -2279,6 +2338,36 @@ def main(argv=None) -> int:
2279
2338
  print(f" {os.path.join(ws.reports_dir, e['path'])}")
2280
2339
  print(f" key fingerprint {e['fingerprint']}")
2281
2340
  return 0
2341
+ elif a.cmd == "pad-summary":
2342
+ import json as _json
2343
+ from . import pad_summary as _PS
2344
+ from .cli import _safe_stdout
2345
+ from .notify import Notifier
2346
+ from .workspace import Workspace, WorkspaceError
2347
+ _safe_stdout()
2348
+ try:
2349
+ ws = Workspace(a.workspace)
2350
+ except WorkspaceError as e:
2351
+ raise SystemExit(f"pad-summary: {e}")
2352
+ if a.at or a.on or a.off:
2353
+ try:
2354
+ s_ = _PS.set_settings(ws, a.actor, enabled=(True if a.on else False if a.off else None), at=a.at)
2355
+ except ValueError as e:
2356
+ raise SystemExit(f"pad-summary: {e}")
2357
+ print(f"daily pad summary {'on' if s_['enabled'] else 'off'} at {s_['at']} UTC, sent through the notification rules: {'yes' if s_['send'] else 'no'}")
2358
+ return 0
2359
+ n_ = None
2360
+ if a.send:
2361
+ n_ = Notifier(ws.path); n_.reload()
2362
+ r = _PS.write(ws, __version__, a.actor, n_, send=bool(a.send))
2363
+ if a.json:
2364
+ print(_json.dumps(r, default=str)); return 0
2365
+ print(f"wrote {r['report_id']} (since {r['since']}): {r['paths']['html']}")
2366
+ if r['paths'].get('pdf'):
2367
+ print(f" printable: {r['paths']['pdf']}")
2368
+ if a.send:
2369
+ print(f" sent: {', '.join(str(d['channel']) + (' ok' if d['ok'] else ' FAILED') for d in r['delivered']) or 'no notification rule for pad.summary'}")
2370
+ return 0
2282
2371
  elif a.cmd == "reports-history":
2283
2372
  import json as _json
2284
2373
  from . import report_history as _RH
@@ -2306,6 +2395,30 @@ def main(argv=None) -> int:
2306
2395
  for v in f_["versions"][: (50 if a.family else 3)]:
2307
2396
  print(f" {v['utc']} {v.get('report_id') or ''} reports/{v['dir']}")
2308
2397
  return 0
2398
+ elif a.cmd == "alerts":
2399
+ import json as _json
2400
+ from . import alerts as _AL
2401
+ from .cli import _safe_stdout
2402
+ from .notify import Notifier
2403
+ from .workspace import Workspace, WorkspaceError
2404
+ _safe_stdout()
2405
+ try:
2406
+ ws = Workspace(a.workspace)
2407
+ except WorkspaceError as e:
2408
+ raise SystemExit(f"alerts: {e}")
2409
+ if a.check:
2410
+ n_ = Notifier(ws.path); n_.reload()
2411
+ r_ = _AL.check_conditions(ws, n_, force=True)
2412
+ print(f"checked: {len(r_)} alert(s) raised or cleared")
2413
+ rows = _AL.recent(ws, a.n)
2414
+ if a.json:
2415
+ print(_json.dumps(rows, default=str)); return 0
2416
+ for r in rows:
2417
+ sent = ", ".join(f"{d['channel']}{'' if d['ok'] else ' (failed)'}" for d in r.get("delivered") or []) or "no channel set up"
2418
+ print(f"{r['utc']} {r['event']:<20} {r.get('well') or '':<16} {r.get('detail', '')} [{sent}]")
2419
+ if not rows:
2420
+ print("no alerts yet")
2421
+ return 0
2309
2422
  elif a.cmd == "simulation":
2310
2423
  import json as _json
2311
2424
  from . import simulation as _SIM