messagefoundry 0.3.0__tar.gz → 0.3.1__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 (297) hide show
  1. messagefoundry-0.3.1/.gitignore +140 -0
  2. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/CHANGELOG.md +104 -13
  3. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/PKG-INFO +6 -5
  4. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/__init__.py +49 -32
  5. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/__main__.py +1118 -100
  6. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/__init__.py +1 -1
  7. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/leak.py +7 -7
  8. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/surrogates.py +106 -17
  9. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/_ui_seam.py +66 -1
  10. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/app.py +2316 -140
  11. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/approvals.py +18 -3
  12. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/auth_models.py +7 -0
  13. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/auth_routes.py +72 -32
  14. messagefoundry-0.3.1/messagefoundry/api/client_networks.py +287 -0
  15. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/field_authz.py +1 -1
  16. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/metrics.py +62 -4
  17. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/models.py +429 -6
  18. messagefoundry-0.3.1/messagefoundry/api/multipart.py +127 -0
  19. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/security.py +283 -66
  20. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/tls.py +10 -3
  21. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/apiclient/client.py +4 -4
  22. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/identity.py +1 -1
  23. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/ldap.py +37 -7
  24. messagefoundry-0.3.1/messagefoundry/auth/oidc/__init__.py +72 -0
  25. messagefoundry-0.3.1/messagefoundry/auth/oidc/claims.py +286 -0
  26. messagefoundry-0.3.1/messagefoundry/auth/oidc/flow.py +283 -0
  27. messagefoundry-0.3.1/messagefoundry/auth/oidc/jwks.py +225 -0
  28. messagefoundry-0.3.1/messagefoundry/auth/oidc_http.py +132 -0
  29. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/permissions.py +27 -2
  30. messagefoundry-0.3.1/messagefoundry/auth/reconcile.py +220 -0
  31. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/service.py +882 -52
  32. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/totp.py +6 -0
  33. messagefoundry-0.3.1/messagefoundry/auth/trust_anchors.py +357 -0
  34. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/webauthn.py +23 -1
  35. messagefoundry-0.3.1/messagefoundry/checks.py +1419 -0
  36. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/ai_policy.py +34 -7
  37. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/alerts_edit.py +29 -1
  38. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/code_sets.py +10 -1
  39. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/codeset_edit.py +52 -14
  40. messagefoundry-0.3.1/messagefoundry/config/connection_schema.py +297 -0
  41. messagefoundry-0.3.1/messagefoundry/config/connections_edit.py +381 -0
  42. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/connections_file.py +38 -6
  43. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/graph.py +8 -8
  44. messagefoundry-0.3.1/messagefoundry/config/memory_encryption.py +248 -0
  45. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/models.py +71 -8
  46. messagefoundry-0.3.1/messagefoundry/config/security_edit.py +110 -0
  47. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/settings.py +1458 -85
  48. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/tls_policy.py +55 -29
  49. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/wiring.py +660 -72
  50. messagefoundry-0.3.1/messagefoundry/corepoint_import.py +2065 -0
  51. messagefoundry-0.3.1/messagefoundry/crashdump.py +165 -0
  52. messagefoundry-0.3.1/messagefoundry/generators/all_types.py +26 -0
  53. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/documents.py +3 -1
  54. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/hl7schema.py +2 -2
  55. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/hl7structures.py +3 -2
  56. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/integrity.py +3 -3
  57. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/lens.py +534 -7
  58. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/logging_setup.py +67 -0
  59. messagefoundry-0.3.1/messagefoundry/netaddr.py +108 -0
  60. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/__init__.py +29 -10
  61. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/_backend.py +5 -1
  62. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/_builtin_hl7.py +196 -9
  63. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/binary.py +4 -5
  64. messagefoundry-0.3.1/messagefoundry/parsing/compression.py +219 -0
  65. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/__init__.py +2 -1
  66. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/_deps.py +2 -1
  67. messagefoundry-0.3.1/messagefoundry/parsing/dicom/_inflate.py +164 -0
  68. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/dataset.py +7 -1
  69. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/errors.py +9 -1
  70. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/hl7_map.py +3 -2
  71. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/peek.py +6 -0
  72. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/fhir/_deps.py +2 -1
  73. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/message.py +41 -3
  74. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/peek.py +60 -1
  75. messagefoundry-0.3.1/messagefoundry/parsing/sniff.py +203 -0
  76. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/tree.py +1 -1
  77. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/delimiters.py +1 -1
  78. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/validate.py +3 -2
  79. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/__init__.py +14 -0
  80. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/errors.py +17 -0
  81. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/harden.py +31 -1
  82. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/message.py +2 -1
  83. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/schema.py +24 -3
  84. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/signature.py +0 -1
  85. messagefoundry-0.3.1/messagefoundry/parsing/xml/wsdl.py +345 -0
  86. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/_sandbox_worker.py +1 -1
  87. messagefoundry-0.3.1/messagefoundry/pipeline/alert_sinks.py +1153 -0
  88. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/alerts.py +137 -8
  89. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/cert_expiry.py +80 -15
  90. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/cluster.py +40 -4
  91. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/cluster_sqlserver.py +28 -3
  92. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/config_convergence.py +3 -3
  93. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/dr.py +26 -3
  94. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/dr_backup.py +106 -12
  95. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/dryrun.py +77 -18
  96. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/dryrun_trace.py +19 -4
  97. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/engine.py +234 -24
  98. messagefoundry-0.3.1/messagefoundry/pipeline/gcm_invocations.py +187 -0
  99. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/leader_tasks.py +3 -3
  100. messagefoundry-0.3.1/messagefoundry/pipeline/phase_timing.py +429 -0
  101. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/reference_sync.py +35 -5
  102. messagefoundry-0.3.1/messagefoundry/pipeline/retention.py +1010 -0
  103. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/sandbox.py +5 -5
  104. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/saturation.py +1 -1
  105. messagefoundry-0.3.1/messagefoundry/pipeline/secret_rotation.py +449 -0
  106. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/sharding.py +11 -2
  107. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/stage_dispatcher.py +190 -19
  108. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/state_convergence.py +3 -3
  109. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/supervisor.py +4 -4
  110. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/update_check.py +3 -3
  111. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/wiring_runner.py +969 -87
  112. messagefoundry-0.3.1/messagefoundry/pki.py +162 -0
  113. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/scaffold.py +3 -0
  114. messagefoundry-0.3.1/messagefoundry/security/__init__.py +26 -0
  115. messagefoundry-0.3.1/messagefoundry/security/semgrep/handler-security.yml +163 -0
  116. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/service.py +126 -4
  117. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/service_status.py +1 -1
  118. messagefoundry-0.3.1/messagefoundry/spreadsheet.py +79 -0
  119. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/__init__.py +4 -0
  120. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/audit_tee.py +10 -2
  121. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/backup_codec.py +39 -14
  122. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/base.py +257 -15
  123. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/content_search.py +3 -3
  124. messagefoundry-0.3.1/messagefoundry/store/crypto.py +842 -0
  125. messagefoundry-0.3.1/messagefoundry/store/crypto_transit.py +214 -0
  126. messagefoundry-0.3.1/messagefoundry/store/gcm_bound.py +115 -0
  127. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/pool_metrics.py +18 -0
  128. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/postgres.py +1710 -1002
  129. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/sqlserver.py +2517 -408
  130. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/store.py +1584 -223
  131. messagefoundry-0.3.1/messagefoundry/transports/ai_broker.py +238 -0
  132. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/base.py +98 -42
  133. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/database.py +84 -9
  134. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/dicom.py +74 -3
  135. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/dicomweb.py +18 -3
  136. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/email.py +50 -14
  137. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/fhir.py +56 -10
  138. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/file.py +339 -52
  139. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/framing.py +1 -1
  140. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/http_auth.py +32 -6
  141. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/http_listener.py +5 -5
  142. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/loopback.py +1 -1
  143. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/mllp.py +204 -26
  144. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/passthrough.py +1 -1
  145. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/remotefile.py +117 -18
  146. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/rest.py +410 -20
  147. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/signing.py +115 -0
  148. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/smart.py +33 -7
  149. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/soap.py +171 -12
  150. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/tcp.py +210 -14
  151. messagefoundry-0.3.1/messagefoundry/transports/timer.py +341 -0
  152. messagefoundry-0.3.1/messagefoundry/transports/wincred.py +253 -0
  153. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/x12.py +247 -21
  154. messagefoundry-0.3.1/messagefoundry/tray/__init__.py +28 -0
  155. messagefoundry-0.3.1/messagefoundry/tray/__main__.py +82 -0
  156. messagefoundry-0.3.1/messagefoundry/tray/actions.py +102 -0
  157. messagefoundry-0.3.1/messagefoundry/tray/app.py +154 -0
  158. messagefoundry-0.3.1/messagefoundry/tray/assets/foreign_dark.ico +0 -0
  159. messagefoundry-0.3.1/messagefoundry/tray/assets/foreign_light.ico +0 -0
  160. messagefoundry-0.3.1/messagefoundry/tray/assets/not_installed_dark.ico +0 -0
  161. messagefoundry-0.3.1/messagefoundry/tray/assets/not_installed_light.ico +0 -0
  162. messagefoundry-0.3.1/messagefoundry/tray/assets/running_dark.ico +0 -0
  163. messagefoundry-0.3.1/messagefoundry/tray/assets/running_light.ico +0 -0
  164. messagefoundry-0.3.1/messagefoundry/tray/assets/running_unmanaged_dark.ico +0 -0
  165. messagefoundry-0.3.1/messagefoundry/tray/assets/running_unmanaged_light.ico +0 -0
  166. messagefoundry-0.3.1/messagefoundry/tray/assets/starting_dark.ico +0 -0
  167. messagefoundry-0.3.1/messagefoundry/tray/assets/starting_light.ico +0 -0
  168. messagefoundry-0.3.1/messagefoundry/tray/assets/stopped_dark.ico +0 -0
  169. messagefoundry-0.3.1/messagefoundry/tray/assets/stopped_light.ico +0 -0
  170. messagefoundry-0.3.1/messagefoundry/tray/assets/stopping_dark.ico +0 -0
  171. messagefoundry-0.3.1/messagefoundry/tray/assets/stopping_light.ico +0 -0
  172. messagefoundry-0.3.1/messagefoundry/tray/assets/unknown_dark.ico +0 -0
  173. messagefoundry-0.3.1/messagefoundry/tray/assets/unknown_light.ico +0 -0
  174. messagefoundry-0.3.1/messagefoundry/tray/assets/wedged_dark.ico +0 -0
  175. messagefoundry-0.3.1/messagefoundry/tray/assets/wedged_light.ico +0 -0
  176. messagefoundry-0.3.1/messagefoundry/tray/autostart.py +64 -0
  177. messagefoundry-0.3.1/messagefoundry/tray/branding.py +354 -0
  178. messagefoundry-0.3.1/messagefoundry/tray/config.py +416 -0
  179. messagefoundry-0.3.1/messagefoundry/tray/control.py +48 -0
  180. messagefoundry-0.3.1/messagefoundry/tray/iconset.py +30 -0
  181. messagefoundry-0.3.1/messagefoundry/tray/instance.py +42 -0
  182. messagefoundry-0.3.1/messagefoundry/tray/menu.py +170 -0
  183. messagefoundry-0.3.1/messagefoundry/tray/poller.py +207 -0
  184. messagefoundry-0.3.1/messagefoundry/tray/probe.py +137 -0
  185. messagefoundry-0.3.1/messagefoundry/tray/state.py +217 -0
  186. messagefoundry-0.3.1/messagefoundry/tray/theme.py +47 -0
  187. messagefoundry-0.3.1/messagefoundry/tray/winshell.py +459 -0
  188. messagefoundry-0.3.1/messagefoundry/tray/winsvc.py +138 -0
  189. messagefoundry-0.3.1/messagefoundry/uploads.py +606 -0
  190. messagefoundry-0.3.1/messagefoundry/verify/federation.py +432 -0
  191. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/verify/model.py +1 -1
  192. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/verify/report.py +1 -1
  193. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/verify/runner.py +79 -11
  194. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/verify/smoke.py +12 -4
  195. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/pyproject.toml +72 -10
  196. messagefoundry-0.3.0/.gitignore +0 -91
  197. messagefoundry-0.3.0/messagefoundry/checks.py +0 -713
  198. messagefoundry-0.3.0/messagefoundry/config/connections_edit.py +0 -201
  199. messagefoundry-0.3.0/messagefoundry/corepoint_import.py +0 -590
  200. messagefoundry-0.3.0/messagefoundry/generators/all_types.py +0 -24
  201. messagefoundry-0.3.0/messagefoundry/pipeline/alert_sinks.py +0 -691
  202. messagefoundry-0.3.0/messagefoundry/pipeline/phase_timing.py +0 -222
  203. messagefoundry-0.3.0/messagefoundry/pipeline/retention.py +0 -563
  204. messagefoundry-0.3.0/messagefoundry/pipeline/secret_rotation.py +0 -210
  205. messagefoundry-0.3.0/messagefoundry/store/crypto.py +0 -484
  206. messagefoundry-0.3.0/messagefoundry/transports/timer.py +0 -146
  207. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/LICENSE +0 -0
  208. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/NOTICE +0 -0
  209. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/README.md +0 -0
  210. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/actions.py +0 -0
  211. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/adr_analyze.py +0 -0
  212. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/_pools.py +0 -0
  213. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/hl7.py +0 -0
  214. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/keying.py +0 -0
  215. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/anon/rules.py +0 -0
  216. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/__init__.py +0 -0
  217. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/api/tls_client_cert.py +0 -0
  218. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/apiclient/__init__.py +0 -0
  219. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/__init__.py +0 -0
  220. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
  221. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/data/common_passwords.txt +0 -0
  222. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/notifications.py +0 -0
  223. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/passwords.py +0 -0
  224. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/policy.py +0 -0
  225. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/ratelimit.py +0 -0
  226. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/auth/tokens.py +0 -0
  227. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/__init__.py +0 -0
  228. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/active_environment.py +0 -0
  229. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/anchor.py +0 -0
  230. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/db_lookup.py +0 -0
  231. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/environments.py +0 -0
  232. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/fhir_lookup.py +0 -0
  233. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/fingerprint.py +0 -0
  234. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/impact.py +1 -1
  235. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/ingest_time.py +0 -0
  236. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/reachability.py +0 -0
  237. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/reference.py +0 -0
  238. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/response.py +0 -0
  239. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/run_context.py +0 -0
  240. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/secretprovider.py +0 -0
  241. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/secretprovider_vault.py +0 -0
  242. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/send_snapshot.py +0 -0
  243. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/config/state.py +0 -0
  244. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/diagnostics.py +0 -0
  245. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/README.md +0 -0
  246. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/__init__.py +0 -0
  247. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/_core.py +1 -1
  248. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/_hl7data.py +0 -0
  249. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/adt.py +1 -1
  250. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/bar.py +0 -0
  251. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/dft.py +0 -0
  252. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/mdm.py +0 -0
  253. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/mfn.py +0 -0
  254. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/oml.py +0 -0
  255. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/orl.py +0 -0
  256. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/orm.py +0 -0
  257. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/oru.py +0 -0
  258. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/ras.py +0 -0
  259. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/rde.py +1 -1
  260. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/siu.py +0 -0
  261. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/generators/vxu.py +0 -0
  262. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/last_resort.py +0 -0
  263. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/consistency.py +0 -0
  264. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/dicom/_util.py +0 -0
  265. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/fhir/__init__.py +0 -0
  266. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/fhir/errors.py +0 -0
  267. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/fhir/peek.py +0 -0
  268. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/fhir/resource.py +0 -0
  269. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/groups.py +0 -0
  270. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/split.py +0 -0
  271. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/summary.py +0 -0
  272. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/validate.py +0 -0
  273. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/__init__.py +0 -0
  274. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/_deps.py +0 -0
  275. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/errors.py +0 -0
  276. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/interchange.py +0 -0
  277. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/message.py +0 -0
  278. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/x12/peek.py +0 -0
  279. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/parsing/xml/_deps.py +0 -0
  280. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/__init__.py +0 -0
  281. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/connscale_shim.py +0 -0
  282. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/pipeline/security_notify.py +0 -0
  283. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/py.typed +0 -0
  284. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/redaction.py +0 -0
  285. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/secrets_dpapi.py +0 -0
  286. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/document_strip.py +0 -0
  287. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/keyprovider.py +0 -0
  288. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/keyprovider_vault.py +0 -0
  289. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/store/metadata.py +0 -0
  290. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/support/__init__.py +0 -0
  291. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/support/bundle.py +0 -0
  292. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/support/redact.py +0 -0
  293. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/timezone.py +0 -0
  294. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/__init__.py +0 -0
  295. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/transports/direct.py +1 -1
  296. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/verify/__init__.py +0 -0
  297. {messagefoundry-0.3.0 → messagefoundry-0.3.1}/messagefoundry/verify/checks.py +0 -0
@@ -0,0 +1,140 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ .venv/
5
+ venv/
6
+ *.egg-info/
7
+ build/
8
+ dist/
9
+
10
+ # Engine runtime data (PHI may live here — never commit)
11
+ *.db
12
+ *.db-wal
13
+ *.db-shm
14
+ *.pid
15
+ out/
16
+ harness_io/
17
+ *.log
18
+
19
+ # One-time bootstrap admin credential written next to the store (consumed + deleted by the operator) — never commit
20
+ bootstrap-admin.txt
21
+
22
+ # Secrets / credentials — never commit (no such files exist today; these are foot-gun guards)
23
+ .env
24
+ .env.*
25
+ *.key
26
+ *.pem
27
+ *.pfx
28
+ secrets/
29
+
30
+ # Container deployment secrets + TLS material — never commit (the *.example templates ARE tracked)
31
+ /docker/secrets.env
32
+ /docker/tls/
33
+
34
+ # are never committed. Ignore every samples/ subdirectory by DEFAULT rather than naming the partner
35
+ # here — fail-closed, so a new unlisted staging dir cannot reach a public repo just because nobody
36
+ # remembered to add a rule. The shipped example dirs are re-included explicitly.
37
+ /samples/*/
38
+ !/samples/config/
39
+ !/samples/consistency/
40
+ !/samples/dicom/
41
+ !/samples/ech-sidecar/
42
+ !/samples/generators/
43
+ !/samples/messages/
44
+ !/samples/results_relay/
45
+ # Generated, regenerable test corpus (build with: python -m messagefoundry.generators.adt). MUST come
46
+ # after the un-ignores above, or the re-included parent would drag it back in.
47
+ /samples/messages/adt/
48
+ # Workflow agent self-verification temp dirs (an isolated copy of a ported migration module + codesets
49
+ # + fixture for a check/dryrun). Customer-estate-derived — never commit. Delete after a porting batch.
50
+ /_verify_*/
51
+ # exports). Customer data — NEVER commit. `git archive` (the publish path) excludes it by
52
+ # construction; this is the local-only working area.
53
+ /migration-local/
54
+
55
+ # Tooling
56
+ .mypy_cache/
57
+ .ruff_cache/
58
+ .pytest_cache/
59
+ .vscode/
60
+ .idea/
61
+
62
+ # Claude Code: settings.json is shared/tracked; settings.local.json is machine-local (never commit)
63
+ .claude/settings.local.json
64
+
65
+ # Local reference notes pointing at machine-specific Claude Code transcript paths — never commit
66
+ TRANSCRIPTS.md
67
+
68
+ # Local planning/marketing/security working docs — keep out of the repo
69
+ # (docs/DUAL_LICENSING_PLAN.md is now a committed artifact — see ADR 0017 / #13 licensing)
70
+ /docs/marketing/
71
+ /docs/security/CISO-REVIEW.md
72
+ /docs/security/DEPENDENCY-POSTURE-REVIEW.md
73
+ /docs/security/DEPENDENCY-RESPONSE-PLAN.md
74
+ /docs/security/DEPENDENCY-CUSTOMER-OFFERINGS.md
75
+ /docs/security/DEPENDENCY-RESPONSE-HANDOFF.md
76
+ /docs/security/DEPENDENCY-RESPONSE-A3-HANDOFF.md
77
+ /docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
78
+ # vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
79
+ /docs/security/metrics/
80
+
81
+ # Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
82
+ # OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
83
+ # Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
84
+ /harness/load/profiles/hospital-baseline.toml
85
+ /harness/load/profiles/soak-12h.toml
86
+ # Deep-research survey of alternative OSS DB backends for the shared-DB commit-wall — local working
87
+ # note, not a committed artifact (the conclusion is carried in the throughput ADRs / AI memory).
88
+ /docs/research/db-commit-wall-backend-survey.md
89
+
90
+ # --- MessageFoundry ---
91
+ .mefor/
92
+ *.db*
93
+ .DS_Store
94
+ Thumbs.db
95
+
96
+ # Agent/web-fetch debris dropped in the repo ROOT (e.g. blog.html, contest.txt, free.html) — never
97
+ # commit. Anchored to root (leading /) so tracked *.html/*.txt UNDER subdirs (docs/, samples/,
98
+ # scripts/, packaging/, messagefoundry/auth/data/…) are unaffected; no *.html/*.txt is legitimately
99
+ # tracked at the repo root, so an anchored catch-all is safe. Force-add (git add -f) if one ever is.
100
+ /*.html
101
+ /*.txt
102
+ /*.yml
103
+
104
+ # The real customer/vendor token list consumed by scripts/security/scan_forbidden.py at
105
+ # commit time. Only the SYNTHETIC scan-tokens.local.txt.example is ever committed.
106
+ #
107
+ # Deliberately unconditional, and listed ahead of the scanner it serves: an operator creates
108
+ # this file before the tooling that references it exists, so ignoring the path up front
109
+ # removes any window in which a real token list sits un-ignored in a working tree.
110
+ scripts/security/scan-tokens.local.txt
111
+
112
+ # --- Private-only paths (formerly enforced by scripts/publish/publish-denylist.txt) ---------------
113
+ # The cutover RETIRES the publish deny-list. On the private repo these were TRACKED and stripped from
114
+ # the mirror at publish time; with the deny-list gone and development happening directly on the public
115
+ # repo, a gitignore rule is now the ONLY thing keeping them out of a commit -- and the cutover runbook
116
+ # runs `git add -A`. Same failure shape as the leak-scanner token file, different files.
117
+ #
118
+ # DELIBERATELY NOT LISTED: tests/test_scan_forbidden.py, tests/test_anon_core.py and
119
+ # .github/dependabot.yml. Those were deny-listed too, but this change set publishes synthetic/public
120
+ # versions of them -- ignoring them here would silently drop content that is meant to ship.
121
+ # PUBLISHED by this change (removed from the list above): CLAUDE.md, docs/BACKLOG.md and
122
+ # docs/WORKTREES.md. All three were scanned and carry no customer/estate tokens (BACKLOG.md needed a
123
+ # two-line redaction). CLAUDE.md in particular MUST be tracked: it is gitignored-by-default's worst
124
+ # case here, because `git worktree add` cannot deliver an untracked file, so every worktree silently
125
+ # came up with ZERO project conventions loaded.
126
+ /.claude/
127
+ /TRANSCRIPTS.md
128
+ /docs/security/
129
+ /docs/reviews/
130
+ /docs/marketing/
131
+ # Deliberately still private, each for a different reason:
132
+ # docs/security/ — 32 files of posture/risk-register detail; an attacker roadmap.
133
+ # docs/reviews/ — review findings, same reason.
134
+ # docs/CI-TOPOLOGY.md — STALE: it documents the retired private-repo/public-mirror split and
135
+ # scripts/publish/, which the cutover deleted. Publishing it would actively
136
+ # mislead. Rewrite for the post-cutover topology or delete it.
137
+ # docs/Secure_Development_Standards.md — scans clean, but it was deliberately pulled from the public
138
+ # PyPI sdist (#1020); reversing that is an owner call, not a side effect.
139
+ /docs/CI-TOPOLOGY.md
140
+ /docs/Secure_Development_Standards.md
@@ -6,6 +6,90 @@ All notable changes to MessageFoundry are documented here. The format follows
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.1] — 2026-07-27 — Early Access
10
+
11
+ ### Security
12
+ - **BREAKING — multi-factor authentication is now an ACCESS gate, not only a step-up gate**
13
+ (ASVS 6.3.3). An MFA-pending session is refused on **every** authorized route with `403` +
14
+ `X-MFA-Required: 1`; a browser session is confined to the new `/ui/mfa` page until it verifies.
15
+ Previously the second factor was demanded only at the step-up (sensitive-action) boundary, so a
16
+ password-only session could read the whole estate.
17
+ **`[security].require_mfa_scope`** (new, default **`every_local_account`**) widens who must enrol
18
+ from the Administrator role to every local account; set it to `administrators` to keep the previous
19
+ posture. It is reported as a loosening on `GET /security/posture` but never refuses to boot.
20
+ **Who is affected on upgrade:**
21
+ - **Existing sessions are unaffected until they expire** — they were minted MFA-satisfied and the
22
+ stamp is honoured. The change bites at the next sign-in.
23
+ - **Every un-enrolled local account must now enrol a factor before it can do anything else.** The
24
+ escape path is reachable from the pending session itself (`/me/reauth` → `/me/mfa/enroll` →
25
+ `/me/mfa/confirm`, or `/ui/account` in the browser), and confirming satisfies that same session.
26
+ Note the consequence: for an un-enrolled account, whoever holds the password can self-enrol the
27
+ second factor. The out-of-band `MFA_ENABLED` notification is the compensating control.
28
+ - **Non-interactive local service accounts using bearer tokens will start failing** with
29
+ `X-MFA-Required` and cannot enrol unattended. Move them to mTLS (`require_service_cert` is exempt
30
+ by design) or to AD, or set `require_mfa_scope = "administrators"`.
31
+ - **The PySide6 test harness** needs an enrolled account or `require_mfa_scope = "administrators"`:
32
+ its API client only retries an `X-MFA-Required` refusal when an MFA handler is registered, and
33
+ none is wired today.
34
+ - **Caveat on factor strength:** a WebAuthn passkey is asserted at `user_verification=preferred`,
35
+ so for a passkey-only account the second factor may be **device possession alone**. This is the
36
+ owner-signed L3 relaxation, recorded in `docs/SECURITY.md`, not an oversight.
37
+ - **BREAKING (federated deployments only) — a directory session is no longer minted MFA-satisfied
38
+ unconditionally** (ASVS 6.3.4). `_complete_ad_login` now takes the grant per mechanism: AD
39
+ simple-bind and Kerberos still pass it under the owner-signed **delegated-directory-MFA
40
+ relaxation** (the engine learns nothing about directory-side strength from a bind or a ticket),
41
+ while the **federated (OIDC) leg passes `[auth].oidc_require_mfa_claim`** — the one directory
42
+ signal the engine actually verifies. With the claim gate on (the default) nothing changes: a token
43
+ carrying no configured `amr`/`acr` was already refused at claims validation. **With
44
+ `oidc_require_mfa_claim = false`, federated sessions are now minted un-verified and refused** —
45
+ turn the claim gate on, move those users to AD, or set `[security].require_mfa = false`, which
46
+ remains the global off-switch.
47
+ Also fail-closed: the directory exemption is now an **allow-list** (`provider == "ad"`) rather than
48
+ a denylist (`!= "local"`), so an unrecognized provider value requires a second factor instead of
49
+ silently skipping one.
50
+ - **New `auth.mfa_denied` audit event.** The MFA gate sits above the permission loop, so
51
+ `auth.permission_denied` never fires for a pending session; without its own row a stolen
52
+ password-only token could enumerate the entire authenticated surface leaving no trace.
53
+ - `ENGINE_UI_SEAM` 13 → 14 — `api.security.require()` gained an `mfa_gate` keyword, and the console
54
+ imports it directly. A console wheel older than this engine refuses to mount, as designed.
55
+ - **In-use data protection for PHI is now declared and reported** ([ADR 0152](docs/adr/0152-in-use-data-protection-for-phi-platform-memory-encryption-attestation-asvs-11-7-1.md),
56
+ ASVS 11.7.1). An **exposed** PHI instance (a non-loopback bind **or** a declared
57
+ `[api].tls_terminated_upstream`, which includes the recommended loopback-behind-proxy topology) that has
58
+ not set **`[security].memory_encryption_operator_declared = true`** — the operator's declaration that the
59
+ host provides hardware memory encryption (AMD SEV-SNP / Intel TDX) — now **warns at every start**.
60
+ **Not a breaking change: nothing that boots today stops booting.** The refusal is opt-in via the new
61
+ `[security].require_memory_encryption_declaration` (default `false`), because this is a **host**
62
+ property that no operator can satisfy on Windows (where the platform read-out is always `null`) — the
63
+ same scoping rule as `[security].allowed_client_networks`' companion refusal (ADR 0151). Loopback and
64
+ synthetic instances are byte-identical. See
65
+ [OFF-LOOPBACK-DEPLOYMENT.md](docs/security/OFF-LOOPBACK-DEPLOYMENT.md) ladder row 12 and
66
+ [SYSTEM-REQUIREMENTS.md](docs/SYSTEM-REQUIREMENTS.md).
67
+ - **Report-only platform memory-encryption read-out on `GET /security/posture`** (ADR 0152 rung 1;
68
+ `ENGINE_UI_SEAM` 12 → 13) — `memory_encryption_self_reported_capability` / `..._self_reported_active` /
69
+ `..._self_reported_mechanism` / `memory_encryption_readout_source`, plus
70
+ `memory_encryption_operator_declared`, the tri-state
71
+ `memory_encryption_readout_contradicts_declaration` (`null` = nothing was measured that could
72
+ contradict anything) and `memory_encryption_note`, the disclaimer carried **in the response body** so it
73
+ travels with any copy of the artifact. Linux reads `/proc/cpuinfo` flags (capability) and
74
+ `/dev/sev-guest` / `/dev/tdx_guest` **character devices** (activation) as **separate** facts; everywhere
75
+ else every field is `null`. **No value of any of these satisfies ASVS 11.7.1** — they are what the host
76
+ says about itself, and cryptographic attestation (rung 3) is **not built**. The read-out is never
77
+ accepted as a substitute for the declaration, in either direction.
78
+ - **Windows crash dumps of the engine process are suppressed** — a WER dump is a full PHI disclosure
79
+ written to disk. `serve` applies the process-local half itself (`SetErrorMode` OR-ed into the inherited
80
+ mode, `WerSetFlags(NOHEAP | NO_UI | DISABLE_SNAPSHOT_*)`); the machine-policy half no process can reach
81
+ is opt-in via `install-service.ps1 -SuppressCrashDumps` (WER `ExcludedApplications`, registered for both
82
+ `messagefoundry.exe` and the venv `python.exe`, plus a **narrowing-only** `LocalDumps` override that is
83
+ written only where LocalDumps is already configured — creating that key would switch dump collection
84
+ ON). Residuals in [SERVICE.md](docs/SERVICE.md).
85
+
86
+ ### Fixed
87
+ - **Two config blocks in the off-loopback runbook aborted at load** — `[diagnostics].audit_all_authz` and
88
+ `[ai].data_class` had been relocated by ADR 0118, so an operator copy-pasting either block got an
89
+ immediate start failure. Corrected to `[security].audit_all_authorization_decisions` and
90
+ `[security].handles_real_patient_data`, and every fenced `toml` block in that runbook is now pinned by a
91
+ test that loads it and fails on a silently-ignored key.
92
+
9
93
  ## [0.3.0] — 2026-07-13 — Early Access
10
94
 
11
95
  Highlights since 0.2.15 — streaming attachments end-to-end, a copy-on-Send message model, richer
@@ -872,16 +956,23 @@ tests, but the external code review + penetration test (the bar for a security-c
872
956
  - Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
873
957
  `release` workflow.
874
958
 
875
- [Unreleased]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.10...HEAD
876
- [0.2.10]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.9...v0.2.10
877
- [0.2.9]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.8...v0.2.9
878
- [0.2.8]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.7...v0.2.8
879
- [0.2.7]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.6...v0.2.7
880
- [0.2.6]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.5...v0.2.6
881
- [0.2.5]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.4...v0.2.5
882
- [0.2.4]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.3...v0.2.4
883
- [0.2.3]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.2...v0.2.3
884
- [0.2.2]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.1...v0.2.2
885
- [0.2.1]: https://github.com/wshallwshall/MessageFoundry/compare/v0.2.0...v0.2.1
886
- [0.2.0]: https://github.com/wshallwshall/MessageFoundry/compare/v0.1.0...v0.2.0
887
- [0.1.0]: https://github.com/wshallwshall/MessageFoundry/releases/tag/v0.1.0
959
+ [Unreleased]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.1...HEAD
960
+ [0.3.1]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.0...v0.3.1
961
+ [0.3.0]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.15...v0.3.0
962
+ [0.2.15]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.14...v0.2.15
963
+ [0.2.14]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.13...v0.2.14
964
+ [0.2.13]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.12...v0.2.13
965
+ [0.2.12]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.11...v0.2.12
966
+ [0.2.11]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.10...v0.2.11
967
+ [0.2.10]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.9...v0.2.10
968
+ [0.2.9]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.8...v0.2.9
969
+ [0.2.8]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.7...v0.2.8
970
+ [0.2.7]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.6...v0.2.7
971
+ [0.2.6]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.5...v0.2.6
972
+ [0.2.5]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.4...v0.2.5
973
+ [0.2.4]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.3...v0.2.4
974
+ [0.2.3]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.2...v0.2.3
975
+ [0.2.2]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.1...v0.2.2
976
+ [0.2.1]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.0...v0.2.1
977
+ [0.2.0]: https://github.com/MEFORORG/MessageFoundry/compare/v0.1.0...v0.2.0
978
+ [0.1.0]: https://github.com/MEFORORG/MessageFoundry/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: messagefoundry
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Open-source healthcare integration engine — route, transform, and validate messages across many formats and connection types
5
5
  Project-URL: Homepage, https://messagefoundry.org/
6
6
  Project-URL: Documentation, https://messagefoundry.org/
@@ -24,12 +24,14 @@ Classifier: Topic :: System :: Networking
24
24
  Classifier: Typing :: Typed
25
25
  Requires-Python: >=3.14
26
26
  Requires-Dist: aiosqlite>=0.20
27
+ Requires-Dist: annotated-types<0.8
27
28
  Requires-Dist: argon2-cffi>=23.1
28
29
  Requires-Dist: cryptography>=48.0.1
29
30
  Requires-Dist: defusedxml>=0.7.1
30
31
  Requires-Dist: fastapi>=0.137.1
31
32
  Requires-Dist: hl7>=0.4.5
32
33
  Requires-Dist: hl7apy>=1.3
34
+ Requires-Dist: httpx>=0.27
33
35
  Requires-Dist: ldap3>=2.9
34
36
  Requires-Dist: prometheus-client>=0.20
35
37
  Requires-Dist: psutil>=6.0
@@ -37,26 +39,25 @@ Requires-Dist: pydantic>=2.6
37
39
  Requires-Dist: pyspnego>=0.10
38
40
  Requires-Dist: starlette>=1.3.1
39
41
  Requires-Dist: tomlkit>=0.12
42
+ Requires-Dist: truststore>=0.10
40
43
  Requires-Dist: tzdata>=2024.1
41
44
  Requires-Dist: uvicorn[standard]>=0.29
42
45
  Provides-Extra: dev
43
- Requires-Dist: httpx>=0.27; extra == 'dev'
44
46
  Requires-Dist: mypy>=1.10; extra == 'dev'
45
47
  Requires-Dist: pytest-asyncio>=0.26; extra == 'dev'
46
48
  Requires-Dist: pytest-rerunfailures>=16.0; extra == 'dev'
47
49
  Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
48
50
  Requires-Dist: pytest>=9.0.3; extra == 'dev'
49
- Requires-Dist: ruff>=0.4; extra == 'dev'
51
+ Requires-Dist: ruff<0.16,>=0.4; extra == 'dev'
50
52
  Provides-Extra: dicom
51
53
  Requires-Dist: pydicom<4,>=3.0.2; extra == 'dicom'
52
54
  Requires-Dist: pynetdicom<4,>=3.0.4; extra == 'dicom'
53
55
  Provides-Extra: fhir
56
+ Requires-Dist: annotated-types<0.8; extra == 'fhir'
54
57
  Requires-Dist: fhir-resources>=7.1.0; extra == 'fhir'
55
58
  Requires-Dist: fhirpathpy>=2.2.0; extra == 'fhir'
56
59
  Provides-Extra: harness
57
- Requires-Dist: httpx>=0.27; extra == 'harness'
58
60
  Requires-Dist: pyside6>=6.6; extra == 'harness'
59
- Requires-Dist: truststore>=0.10; extra == 'harness'
60
61
  Provides-Extra: otel
61
62
  Requires-Dist: opentelemetry-exporter-otlp>=1.20; extra == 'otel'
62
63
  Requires-Dist: opentelemetry-sdk>=1.20; extra == 'otel'
@@ -11,6 +11,27 @@ Config modules define the message graph against this surface::
11
11
  from messagefoundry import inbound, outbound, router, handler, Send, MLLP, File, Message
12
12
  """
13
13
 
14
+ from messagefoundry.actions import (
15
+ append_to_field,
16
+ arith_field,
17
+ code_lookup,
18
+ convert_case,
19
+ copy_field,
20
+ copy_segment,
21
+ date_diff_field,
22
+ delete_segment,
23
+ format_date,
24
+ pad_field,
25
+ replace_literal,
26
+ set_field,
27
+ split_field,
28
+ substring_field,
29
+ trim_field,
30
+ )
31
+ from messagefoundry.config.active_environment import current_environment
32
+ from messagefoundry.config.db_lookup import DbLookupError, db_lookup
33
+ from messagefoundry.config.fhir_lookup import FhirLookupError, fhir_lookup
34
+ from messagefoundry.config.ingest_time import current_ingest_time
14
35
  from messagefoundry.config.models import (
15
36
  AckMode,
16
37
  BatchConfig,
@@ -22,44 +43,40 @@ from messagefoundry.config.models import (
22
43
  SaturationThreshold,
23
44
  StallThreshold,
24
45
  )
25
- from messagefoundry.config.active_environment import current_environment
26
- from messagefoundry.config.db_lookup import DbLookupError, db_lookup
27
- from messagefoundry.config.fhir_lookup import FhirLookupError, fhir_lookup
28
- from messagefoundry.config.ingest_time import current_ingest_time
29
46
  from messagefoundry.config.reference import reference
30
47
  from messagefoundry.config.response import response_get
31
48
  from messagefoundry.config.state import state_get
32
49
  from messagefoundry.config.wiring import (
50
+ DICOM,
51
+ FHIR,
52
+ MLLP,
53
+ SMTP,
54
+ X12,
33
55
  CodeSet,
34
56
  Database,
35
57
  DatabaseLookup,
36
58
  DatabasePoll,
37
59
  DatabaseRef,
60
+ DICOMweb,
38
61
  Direct,
39
62
  Email,
40
63
  FhirLookup,
41
64
  File,
42
65
  FileRef,
43
66
  Ftp,
44
- FHIR,
45
67
  Http,
46
- DICOM,
47
- DICOMweb,
48
68
  Loopback,
49
- MLLP,
69
+ MessageTypeError,
50
70
  PassThrough,
51
71
  Reference,
52
72
  Rest,
53
- SMTP,
73
+ Send,
74
+ SetMeta,
75
+ SetState,
54
76
  Sftp,
55
77
  Soap,
56
78
  Tcp,
57
79
  Timer,
58
- X12,
59
- Send,
60
- SetMeta,
61
- SetState,
62
- MessageTypeError,
63
80
  code_set,
64
81
  env,
65
82
  handler,
@@ -68,24 +85,16 @@ from messagefoundry.config.wiring import (
68
85
  outbound,
69
86
  router,
70
87
  )
71
- from messagefoundry.actions import (
72
- append_to_field,
73
- arith_field,
74
- code_lookup,
75
- convert_case,
76
- copy_field,
77
- copy_segment,
78
- date_diff_field,
79
- delete_segment,
80
- format_date,
81
- pad_field,
82
- replace_literal,
83
- set_field,
84
- split_field,
85
- substring_field,
86
- trim_field,
87
- )
88
88
  from messagefoundry.diagnostics import checkpoint, log_note
89
+ from messagefoundry.parsing.compression import (
90
+ CompressionError,
91
+ deflate_compress,
92
+ deflate_decompress,
93
+ gzip_compress,
94
+ gzip_decompress,
95
+ zip_compress,
96
+ zip_decompress,
97
+ )
89
98
  from messagefoundry.parsing.groups import SegmentGroup
90
99
  from messagefoundry.parsing.message import Message, RawMessage
91
100
  from messagefoundry.parsing.split import split_by_obr
@@ -98,7 +107,7 @@ from messagefoundry.timezone import (
98
107
  to_zone,
99
108
  )
100
109
 
101
- __version__ = "0.3.0"
110
+ __version__ = "0.3.1"
102
111
 
103
112
  __all__ = [
104
113
  "Message",
@@ -183,5 +192,13 @@ __all__ = [
183
192
  "hl7_now",
184
193
  "age_from_dob",
185
194
  "length_of_stay",
195
+ # Compression codec (ADR 0123) — pure gzip/zlib-deflate/zip for on-demand Handler use.
196
+ "CompressionError",
197
+ "gzip_compress",
198
+ "gzip_decompress",
199
+ "deflate_compress",
200
+ "deflate_decompress",
201
+ "zip_compress",
202
+ "zip_decompress",
186
203
  "__version__",
187
204
  ]