messagefoundry 0.3.0__tar.gz → 0.3.2__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.
- messagefoundry-0.3.2/.gitignore +156 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/CHANGELOG.md +144 -13
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/PKG-INFO +6 -5
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/__init__.py +49 -32
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/__main__.py +1118 -100
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/__init__.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/leak.py +7 -7
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/surrogates.py +106 -17
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/_ui_seam.py +66 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/app.py +2316 -140
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/approvals.py +18 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/auth_models.py +7 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/auth_routes.py +72 -32
- messagefoundry-0.3.2/messagefoundry/api/client_networks.py +287 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/field_authz.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/metrics.py +62 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/models.py +429 -6
- messagefoundry-0.3.2/messagefoundry/api/multipart.py +127 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/security.py +283 -66
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/tls.py +10 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/apiclient/client.py +4 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/identity.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/ldap.py +37 -7
- messagefoundry-0.3.2/messagefoundry/auth/oidc/__init__.py +72 -0
- messagefoundry-0.3.2/messagefoundry/auth/oidc/claims.py +286 -0
- messagefoundry-0.3.2/messagefoundry/auth/oidc/flow.py +283 -0
- messagefoundry-0.3.2/messagefoundry/auth/oidc/jwks.py +225 -0
- messagefoundry-0.3.2/messagefoundry/auth/oidc_http.py +132 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/permissions.py +27 -2
- messagefoundry-0.3.2/messagefoundry/auth/reconcile.py +220 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/service.py +882 -52
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/totp.py +6 -0
- messagefoundry-0.3.2/messagefoundry/auth/trust_anchors.py +357 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/webauthn.py +23 -1
- messagefoundry-0.3.2/messagefoundry/checks.py +1419 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/ai_policy.py +34 -7
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/alerts_edit.py +29 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/code_sets.py +10 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/codeset_edit.py +52 -14
- messagefoundry-0.3.2/messagefoundry/config/connection_schema.py +297 -0
- messagefoundry-0.3.2/messagefoundry/config/connections_edit.py +381 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/connections_file.py +38 -6
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/graph.py +8 -8
- messagefoundry-0.3.2/messagefoundry/config/memory_encryption.py +248 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/models.py +71 -8
- messagefoundry-0.3.2/messagefoundry/config/security_edit.py +110 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/settings.py +1458 -85
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/tls_policy.py +55 -29
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/wiring.py +660 -72
- messagefoundry-0.3.2/messagefoundry/corepoint_import.py +2065 -0
- messagefoundry-0.3.2/messagefoundry/crashdump.py +165 -0
- messagefoundry-0.3.2/messagefoundry/generators/all_types.py +26 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/documents.py +3 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/hl7schema.py +2 -2
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/hl7structures.py +3 -2
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/integrity.py +3 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/lens.py +534 -7
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/logging_setup.py +67 -0
- messagefoundry-0.3.2/messagefoundry/netaddr.py +108 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/__init__.py +29 -10
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/_backend.py +5 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/_builtin_hl7.py +196 -9
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/binary.py +4 -5
- messagefoundry-0.3.2/messagefoundry/parsing/compression.py +219 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/__init__.py +2 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/_deps.py +2 -1
- messagefoundry-0.3.2/messagefoundry/parsing/dicom/_inflate.py +164 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/dataset.py +7 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/errors.py +9 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/hl7_map.py +3 -2
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/peek.py +6 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/_deps.py +2 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/message.py +41 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/peek.py +60 -1
- messagefoundry-0.3.2/messagefoundry/parsing/sniff.py +203 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/tree.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/delimiters.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/validate.py +3 -2
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/__init__.py +14 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/errors.py +17 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/harden.py +31 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/message.py +2 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/schema.py +24 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/signature.py +0 -1
- messagefoundry-0.3.2/messagefoundry/parsing/xml/wsdl.py +345 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/_sandbox_worker.py +1 -1
- messagefoundry-0.3.2/messagefoundry/pipeline/alert_sinks.py +1153 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/alerts.py +137 -8
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/cert_expiry.py +80 -15
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/cluster.py +40 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/cluster_sqlserver.py +28 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/config_convergence.py +3 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dr.py +26 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dr_backup.py +106 -12
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dryrun.py +77 -18
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/dryrun_trace.py +19 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/engine.py +234 -24
- messagefoundry-0.3.2/messagefoundry/pipeline/gcm_invocations.py +187 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/leader_tasks.py +3 -3
- messagefoundry-0.3.2/messagefoundry/pipeline/phase_timing.py +429 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/reference_sync.py +35 -5
- messagefoundry-0.3.2/messagefoundry/pipeline/retention.py +1010 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/sandbox.py +5 -5
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/saturation.py +1 -1
- messagefoundry-0.3.2/messagefoundry/pipeline/secret_rotation.py +449 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/sharding.py +11 -2
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/stage_dispatcher.py +190 -19
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/state_convergence.py +3 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/supervisor.py +4 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/update_check.py +3 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/wiring_runner.py +969 -87
- messagefoundry-0.3.2/messagefoundry/pki.py +162 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/scaffold.py +4 -1
- messagefoundry-0.3.2/messagefoundry/security/__init__.py +26 -0
- messagefoundry-0.3.2/messagefoundry/security/semgrep/handler-security.yml +163 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/service.py +126 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/service_status.py +1 -1
- messagefoundry-0.3.2/messagefoundry/spreadsheet.py +79 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/__init__.py +4 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/audit_tee.py +10 -2
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/backup_codec.py +39 -14
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/base.py +257 -15
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/content_search.py +3 -3
- messagefoundry-0.3.2/messagefoundry/store/crypto.py +842 -0
- messagefoundry-0.3.2/messagefoundry/store/crypto_transit.py +214 -0
- messagefoundry-0.3.2/messagefoundry/store/gcm_bound.py +115 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/pool_metrics.py +18 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/postgres.py +1710 -1002
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/sqlserver.py +2517 -408
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/store.py +1584 -223
- messagefoundry-0.3.2/messagefoundry/transports/ai_broker.py +238 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/base.py +98 -42
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/database.py +84 -9
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/dicom.py +74 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/dicomweb.py +18 -3
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/email.py +50 -14
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/fhir.py +56 -10
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/file.py +339 -52
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/framing.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/http_auth.py +32 -6
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/http_listener.py +5 -5
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/loopback.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/mllp.py +204 -26
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/passthrough.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/remotefile.py +117 -18
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/rest.py +410 -20
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/signing.py +115 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/smart.py +33 -7
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/soap.py +171 -12
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/tcp.py +210 -14
- messagefoundry-0.3.2/messagefoundry/transports/timer.py +341 -0
- messagefoundry-0.3.2/messagefoundry/transports/wincred.py +253 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/x12.py +247 -21
- messagefoundry-0.3.2/messagefoundry/tray/__init__.py +28 -0
- messagefoundry-0.3.2/messagefoundry/tray/__main__.py +82 -0
- messagefoundry-0.3.2/messagefoundry/tray/actions.py +102 -0
- messagefoundry-0.3.2/messagefoundry/tray/app.py +154 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/foreign_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/foreign_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/not_installed_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/not_installed_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/running_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/running_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/running_unmanaged_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/running_unmanaged_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/starting_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/starting_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/stopped_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/stopped_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/stopping_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/stopping_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/unknown_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/unknown_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/wedged_dark.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/assets/wedged_light.ico +0 -0
- messagefoundry-0.3.2/messagefoundry/tray/autostart.py +64 -0
- messagefoundry-0.3.2/messagefoundry/tray/branding.py +354 -0
- messagefoundry-0.3.2/messagefoundry/tray/config.py +416 -0
- messagefoundry-0.3.2/messagefoundry/tray/control.py +48 -0
- messagefoundry-0.3.2/messagefoundry/tray/iconset.py +30 -0
- messagefoundry-0.3.2/messagefoundry/tray/instance.py +42 -0
- messagefoundry-0.3.2/messagefoundry/tray/menu.py +170 -0
- messagefoundry-0.3.2/messagefoundry/tray/poller.py +207 -0
- messagefoundry-0.3.2/messagefoundry/tray/probe.py +137 -0
- messagefoundry-0.3.2/messagefoundry/tray/state.py +217 -0
- messagefoundry-0.3.2/messagefoundry/tray/theme.py +47 -0
- messagefoundry-0.3.2/messagefoundry/tray/winshell.py +459 -0
- messagefoundry-0.3.2/messagefoundry/tray/winsvc.py +138 -0
- messagefoundry-0.3.2/messagefoundry/uploads.py +606 -0
- messagefoundry-0.3.2/messagefoundry/verify/federation.py +432 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/model.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/report.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/runner.py +79 -11
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/smoke.py +12 -4
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/pyproject.toml +72 -10
- messagefoundry-0.3.0/.gitignore +0 -91
- messagefoundry-0.3.0/messagefoundry/checks.py +0 -713
- messagefoundry-0.3.0/messagefoundry/config/connections_edit.py +0 -201
- messagefoundry-0.3.0/messagefoundry/corepoint_import.py +0 -590
- messagefoundry-0.3.0/messagefoundry/generators/all_types.py +0 -24
- messagefoundry-0.3.0/messagefoundry/pipeline/alert_sinks.py +0 -691
- messagefoundry-0.3.0/messagefoundry/pipeline/phase_timing.py +0 -222
- messagefoundry-0.3.0/messagefoundry/pipeline/retention.py +0 -563
- messagefoundry-0.3.0/messagefoundry/pipeline/secret_rotation.py +0 -210
- messagefoundry-0.3.0/messagefoundry/store/crypto.py +0 -484
- messagefoundry-0.3.0/messagefoundry/transports/timer.py +0 -146
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/LICENSE +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/NOTICE +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/README.md +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/actions.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/adr_analyze.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/_pools.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/hl7.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/keying.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/anon/rules.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/api/tls_client_cert.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/apiclient/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/data/common_passwords.NOTICE +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/data/common_passwords.txt +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/notifications.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/passwords.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/policy.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/ratelimit.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/auth/tokens.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/active_environment.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/anchor.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/db_lookup.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/environments.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/fhir_lookup.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/fingerprint.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/impact.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/ingest_time.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/reachability.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/reference.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/response.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/run_context.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/secretprovider.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/secretprovider_vault.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/send_snapshot.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/config/state.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/diagnostics.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/README.md +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/_core.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/_hl7data.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/adt.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/bar.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/dft.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/mdm.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/mfn.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/oml.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/orl.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/orm.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/oru.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/ras.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/rde.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/siu.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/generators/vxu.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/last_resort.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/consistency.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/dicom/_util.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/errors.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/peek.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/fhir/resource.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/groups.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/split.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/summary.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/validate.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/_deps.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/errors.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/interchange.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/message.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/x12/peek.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/parsing/xml/_deps.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/connscale_shim.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/pipeline/security_notify.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/py.typed +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/redaction.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/secrets_dpapi.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/document_strip.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/keyprovider.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/keyprovider_vault.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/store/metadata.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/support/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/support/bundle.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/support/redact.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/timezone.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/transports/direct.py +1 -1
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/__init__.py +0 -0
- {messagefoundry-0.3.0 → messagefoundry-0.3.2}/messagefoundry/verify/checks.py +0 -0
|
@@ -0,0 +1,156 @@
|
|
|
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
|
+
# CI-only quality artifacts (generated by .github/workflows/quality-advisory.yml, and by anyone
|
|
63
|
+
# reproducing those jobs locally). None of these were ignored before, which mattered: the C901 delta
|
|
64
|
+
# inputs are ruff JSON carrying ABSOLUTE local paths, so a local `git add -A` would stage a home
|
|
65
|
+
# directory path straight into a commit -- exactly what scripts/security/scan_forbidden.py fires on.
|
|
66
|
+
coverage.xml
|
|
67
|
+
.coverage
|
|
68
|
+
diff-cover.md
|
|
69
|
+
jscpd-report/
|
|
70
|
+
.mutmut-cache
|
|
71
|
+
mutants/
|
|
72
|
+
mutmut-run.txt
|
|
73
|
+
mutmut-results.txt
|
|
74
|
+
c901-head.json
|
|
75
|
+
c901-base.json
|
|
76
|
+
base-tree/
|
|
77
|
+
|
|
78
|
+
# Claude Code: settings.json is shared/tracked; settings.local.json is machine-local (never commit)
|
|
79
|
+
.claude/settings.local.json
|
|
80
|
+
|
|
81
|
+
# Local reference notes pointing at machine-specific Claude Code transcript paths — never commit
|
|
82
|
+
TRANSCRIPTS.md
|
|
83
|
+
|
|
84
|
+
# Local planning/marketing/security working docs — keep out of the repo
|
|
85
|
+
# (docs/DUAL_LICENSING_PLAN.md is now a committed artifact — see ADR 0017 / #13 licensing)
|
|
86
|
+
/docs/marketing/
|
|
87
|
+
/docs/security/CISO-REVIEW.md
|
|
88
|
+
/docs/security/DEPENDENCY-POSTURE-REVIEW.md
|
|
89
|
+
/docs/security/DEPENDENCY-RESPONSE-PLAN.md
|
|
90
|
+
/docs/security/DEPENDENCY-CUSTOMER-OFFERINGS.md
|
|
91
|
+
/docs/security/DEPENDENCY-RESPONSE-HANDOFF.md
|
|
92
|
+
/docs/security/DEPENDENCY-RESPONSE-A3-HANDOFF.md
|
|
93
|
+
/docs/security/DEPENDENCY-RESPONSE-A4-HANDOFF.md
|
|
94
|
+
# vuln_metrics.py local CSV output (the CI run uploads it as an artifact; not committed)
|
|
95
|
+
/docs/security/metrics/
|
|
96
|
+
|
|
97
|
+
# Operator-local load/throughput profiles — tuned to a specific deployment's volume; kept OUT of the
|
|
98
|
+
# OSS repo + public mirror (the plan itself lives on the operator share, WIN2025-LOAD-THROUGHPUT-MATRIX.md).
|
|
99
|
+
# Still usable by name (they sit in PROFILES_DIR) and copy-on to the test box.
|
|
100
|
+
/harness/load/profiles/hospital-baseline.toml
|
|
101
|
+
/harness/load/profiles/soak-12h.toml
|
|
102
|
+
# Deep-research survey of alternative OSS DB backends for the shared-DB commit-wall — local working
|
|
103
|
+
# note, not a committed artifact (the conclusion is carried in the throughput ADRs / AI memory).
|
|
104
|
+
/docs/research/db-commit-wall-backend-survey.md
|
|
105
|
+
|
|
106
|
+
# --- MessageFoundry ---
|
|
107
|
+
.mefor/
|
|
108
|
+
*.db*
|
|
109
|
+
.DS_Store
|
|
110
|
+
Thumbs.db
|
|
111
|
+
|
|
112
|
+
# Agent/web-fetch debris dropped in the repo ROOT (e.g. blog.html, contest.txt, free.html) — never
|
|
113
|
+
# commit. Anchored to root (leading /) so tracked *.html/*.txt UNDER subdirs (docs/, samples/,
|
|
114
|
+
# scripts/, packaging/, messagefoundry/auth/data/…) are unaffected; no *.html/*.txt is legitimately
|
|
115
|
+
# tracked at the repo root, so an anchored catch-all is safe. Force-add (git add -f) if one ever is.
|
|
116
|
+
/*.html
|
|
117
|
+
/*.txt
|
|
118
|
+
/*.yml
|
|
119
|
+
|
|
120
|
+
# The real customer/vendor token list consumed by scripts/security/scan_forbidden.py at
|
|
121
|
+
# commit time. Only the SYNTHETIC scan-tokens.local.txt.example is ever committed.
|
|
122
|
+
#
|
|
123
|
+
# Deliberately unconditional, and listed ahead of the scanner it serves: an operator creates
|
|
124
|
+
# this file before the tooling that references it exists, so ignoring the path up front
|
|
125
|
+
# removes any window in which a real token list sits un-ignored in a working tree.
|
|
126
|
+
scripts/security/scan-tokens.local.txt
|
|
127
|
+
|
|
128
|
+
# --- Private-only paths (formerly enforced by scripts/publish/publish-denylist.txt) ---------------
|
|
129
|
+
# The cutover RETIRES the publish deny-list. On the private repo these were TRACKED and stripped from
|
|
130
|
+
# the mirror at publish time; with the deny-list gone and development happening directly on the public
|
|
131
|
+
# repo, a gitignore rule is now the ONLY thing keeping them out of a commit -- and the cutover runbook
|
|
132
|
+
# runs `git add -A`. Same failure shape as the leak-scanner token file, different files.
|
|
133
|
+
#
|
|
134
|
+
# DELIBERATELY NOT LISTED: tests/test_scan_forbidden.py, tests/test_anon_core.py and
|
|
135
|
+
# .github/dependabot.yml. Those were deny-listed too, but this change set publishes synthetic/public
|
|
136
|
+
# versions of them -- ignoring them here would silently drop content that is meant to ship.
|
|
137
|
+
# PUBLISHED by this change (removed from the list above): CLAUDE.md, docs/BACKLOG.md and
|
|
138
|
+
# docs/WORKTREES.md. All three were scanned and carry no customer/estate tokens (BACKLOG.md needed a
|
|
139
|
+
# two-line redaction). CLAUDE.md in particular MUST be tracked: it is gitignored-by-default's worst
|
|
140
|
+
# case here, because `git worktree add` cannot deliver an untracked file, so every worktree silently
|
|
141
|
+
# came up with ZERO project conventions loaded.
|
|
142
|
+
/.claude/
|
|
143
|
+
/TRANSCRIPTS.md
|
|
144
|
+
/docs/security/
|
|
145
|
+
/docs/reviews/
|
|
146
|
+
/docs/marketing/
|
|
147
|
+
# Deliberately still private, each for a different reason:
|
|
148
|
+
# docs/security/ — 32 files of posture/risk-register detail; an attacker roadmap.
|
|
149
|
+
# docs/reviews/ — review findings, same reason.
|
|
150
|
+
# docs/CI-TOPOLOGY.md — STALE: it documents the retired private-repo/public-mirror split and
|
|
151
|
+
# scripts/publish/, which the cutover deleted. Publishing it would actively
|
|
152
|
+
# mislead. Rewrite for the post-cutover topology or delete it.
|
|
153
|
+
# docs/Secure_Development_Standards.md — scans clean, but it was deliberately pulled from the public
|
|
154
|
+
# PyPI sdist (#1020); reversing that is an owner call, not a side effect.
|
|
155
|
+
/docs/CI-TOPOLOGY.md
|
|
156
|
+
/docs/Secure_Development_Standards.md
|
|
@@ -6,6 +6,129 @@ All notable changes to MessageFoundry are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.2] — 2026-07-28 — Early Access
|
|
10
|
+
|
|
11
|
+
A patch release for one adopter-facing defect shipped in 0.3.1, plus two gates that were passing
|
|
12
|
+
without being able to fail.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- **The scaffolded supply-chain gate named a repository adopters cannot read.** `messagefoundry init`
|
|
16
|
+
writes a fail-closed CI gate that runs `gh attestation verify --repo …` on the pinned engine wheel
|
|
17
|
+
before installing it. It named the retired private development vault rather than the public
|
|
18
|
+
repository that actually mints the attestations, so **every project scaffolded by 0.3.1 shipped a
|
|
19
|
+
provenance gate that fails on its owner's first CI run.** If you scaffolded against 0.3.1, either
|
|
20
|
+
re-run `messagefoundry init`, or edit that one `--repo` argument in
|
|
21
|
+
`.github/workflows/check.yml` to `MEFORORG/MessageFoundry`; setting the repository variable
|
|
22
|
+
`MEFOR_VERIFY_ENGINE=off` skips the job entirely as a stopgap. The scaffold test had pinned the
|
|
23
|
+
wrong value, so the defect was being actively enforced; it now also pins the negative.
|
|
24
|
+
- **The weekly vulnerability-metrics job measured an empty window instead of failing.**
|
|
25
|
+
`vuln-metrics.yml` invokes `scripts/security/vuln_metrics.py` with no `--repo`, so the argparse
|
|
26
|
+
default silently decided what was measured — and it named the same retired vault, whose Dependabot
|
|
27
|
+
PRs a public token cannot read. All seven KPIs were computed over zero pull requests rather than
|
|
28
|
+
erroring. The default is now `$GITHUB_REPOSITORY`, so the job measures the repository it runs in.
|
|
29
|
+
- **A partially-failed release could not be retried.** The GitHub release step failed when the tag or
|
|
30
|
+
release already existed, so a publish that died midway (as 0.3.0's did) left no clean path forward.
|
|
31
|
+
It is now idempotent.
|
|
32
|
+
- **The load harness's no-loss reconcile false-failed a demonstrably zero-loss run.** It excuses a
|
|
33
|
+
send left unconfirmed at connection teardown, capped so a dead ACK path cannot pass as zero-loss —
|
|
34
|
+
but the cap modelled legitimate stranding as "~one in-flight frame per connection". The sender
|
|
35
|
+
keeps an unbounded in-flight window and paces open-loop sends by offered rate, so real stranding
|
|
36
|
+
scales with rate × ACK-latency instead. A run that stranded 14 of 90 sends while the engine read
|
|
37
|
+
and delivered every one of the rest was reported as message loss. The cap is now
|
|
38
|
+
`max(connections, half the run)`, which keeps `read >= sent // 2` always required.
|
|
39
|
+
|
|
40
|
+
## [0.3.1] — 2026-07-27 — Early Access
|
|
41
|
+
|
|
42
|
+
### Security
|
|
43
|
+
- **BREAKING — multi-factor authentication is now an ACCESS gate, not only a step-up gate**
|
|
44
|
+
(ASVS 6.3.3). An MFA-pending session is refused on **every** authorized route with `403` +
|
|
45
|
+
`X-MFA-Required: 1`; a browser session is confined to the new `/ui/mfa` page until it verifies.
|
|
46
|
+
Previously the second factor was demanded only at the step-up (sensitive-action) boundary, so a
|
|
47
|
+
password-only session could read the whole estate.
|
|
48
|
+
**`[security].require_mfa_scope`** (new, default **`every_local_account`**) widens who must enrol
|
|
49
|
+
from the Administrator role to every local account; set it to `administrators` to keep the previous
|
|
50
|
+
posture. It is reported as a loosening on `GET /security/posture` but never refuses to boot.
|
|
51
|
+
**Who is affected on upgrade:**
|
|
52
|
+
- **Existing sessions are unaffected until they expire** — they were minted MFA-satisfied and the
|
|
53
|
+
stamp is honoured. The change bites at the next sign-in.
|
|
54
|
+
- **Every un-enrolled local account must now enrol a factor before it can do anything else.** The
|
|
55
|
+
escape path is reachable from the pending session itself (`/me/reauth` → `/me/mfa/enroll` →
|
|
56
|
+
`/me/mfa/confirm`, or `/ui/account` in the browser), and confirming satisfies that same session.
|
|
57
|
+
Note the consequence: for an un-enrolled account, whoever holds the password can self-enrol the
|
|
58
|
+
second factor. The out-of-band `MFA_ENABLED` notification is the compensating control.
|
|
59
|
+
- **Non-interactive local service accounts using bearer tokens will start failing** with
|
|
60
|
+
`X-MFA-Required` and cannot enrol unattended. Move them to mTLS (`require_service_cert` is exempt
|
|
61
|
+
by design) or to AD, or set `require_mfa_scope = "administrators"`.
|
|
62
|
+
- **The PySide6 test harness** needs an enrolled account or `require_mfa_scope = "administrators"`:
|
|
63
|
+
its API client only retries an `X-MFA-Required` refusal when an MFA handler is registered, and
|
|
64
|
+
none is wired today.
|
|
65
|
+
- **Caveat on factor strength:** a WebAuthn passkey is asserted at `user_verification=preferred`,
|
|
66
|
+
so for a passkey-only account the second factor may be **device possession alone**. This is the
|
|
67
|
+
owner-signed L3 relaxation, recorded in `docs/SECURITY.md`, not an oversight.
|
|
68
|
+
- **BREAKING (federated deployments only) — a directory session is no longer minted MFA-satisfied
|
|
69
|
+
unconditionally** (ASVS 6.3.4). `_complete_ad_login` now takes the grant per mechanism: AD
|
|
70
|
+
simple-bind and Kerberos still pass it under the owner-signed **delegated-directory-MFA
|
|
71
|
+
relaxation** (the engine learns nothing about directory-side strength from a bind or a ticket),
|
|
72
|
+
while the **federated (OIDC) leg passes `[auth].oidc_require_mfa_claim`** — the one directory
|
|
73
|
+
signal the engine actually verifies. With the claim gate on (the default) nothing changes: a token
|
|
74
|
+
carrying no configured `amr`/`acr` was already refused at claims validation. **With
|
|
75
|
+
`oidc_require_mfa_claim = false`, federated sessions are now minted un-verified and refused** —
|
|
76
|
+
turn the claim gate on, move those users to AD, or set `[security].require_mfa = false`, which
|
|
77
|
+
remains the global off-switch.
|
|
78
|
+
Also fail-closed: the directory exemption is now an **allow-list** (`provider == "ad"`) rather than
|
|
79
|
+
a denylist (`!= "local"`), so an unrecognized provider value requires a second factor instead of
|
|
80
|
+
silently skipping one.
|
|
81
|
+
- **New `auth.mfa_denied` audit event.** The MFA gate sits above the permission loop, so
|
|
82
|
+
`auth.permission_denied` never fires for a pending session; without its own row a stolen
|
|
83
|
+
password-only token could enumerate the entire authenticated surface leaving no trace.
|
|
84
|
+
- `ENGINE_UI_SEAM` 13 → 14 — `api.security.require()` gained an `mfa_gate` keyword, and the console
|
|
85
|
+
imports it directly. A console wheel older than this engine refuses to mount, as designed.
|
|
86
|
+
- **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),
|
|
87
|
+
ASVS 11.7.1). An **exposed** PHI instance (a non-loopback bind **or** a declared
|
|
88
|
+
`[api].tls_terminated_upstream`, which includes the recommended loopback-behind-proxy topology) that has
|
|
89
|
+
not set **`[security].memory_encryption_operator_declared = true`** — the operator's declaration that the
|
|
90
|
+
host provides hardware memory encryption (AMD SEV-SNP / Intel TDX) — now **warns at every start**.
|
|
91
|
+
**Not a breaking change: nothing that boots today stops booting.** The refusal is opt-in via the new
|
|
92
|
+
`[security].require_memory_encryption_declaration` (default `false`), because this is a **host**
|
|
93
|
+
property that no operator can satisfy on Windows (where the platform read-out is always `null`) — the
|
|
94
|
+
same scoping rule as `[security].allowed_client_networks`' companion refusal (ADR 0151). Loopback and
|
|
95
|
+
synthetic instances are byte-identical. See
|
|
96
|
+
[OFF-LOOPBACK-DEPLOYMENT.md](docs/security/OFF-LOOPBACK-DEPLOYMENT.md) ladder row 12 and
|
|
97
|
+
[SYSTEM-REQUIREMENTS.md](docs/SYSTEM-REQUIREMENTS.md).
|
|
98
|
+
- **Report-only platform memory-encryption read-out on `GET /security/posture`** (ADR 0152 rung 1;
|
|
99
|
+
`ENGINE_UI_SEAM` 12 → 13) — `memory_encryption_self_reported_capability` / `..._self_reported_active` /
|
|
100
|
+
`..._self_reported_mechanism` / `memory_encryption_readout_source`, plus
|
|
101
|
+
`memory_encryption_operator_declared`, the tri-state
|
|
102
|
+
`memory_encryption_readout_contradicts_declaration` (`null` = nothing was measured that could
|
|
103
|
+
contradict anything) and `memory_encryption_note`, the disclaimer carried **in the response body** so it
|
|
104
|
+
travels with any copy of the artifact. Linux reads `/proc/cpuinfo` flags (capability) and
|
|
105
|
+
`/dev/sev-guest` / `/dev/tdx_guest` **character devices** (activation) as **separate** facts; everywhere
|
|
106
|
+
else every field is `null`. **No value of any of these satisfies ASVS 11.7.1** — they are what the host
|
|
107
|
+
says about itself, and cryptographic attestation (rung 3) is **not built**. The read-out is never
|
|
108
|
+
accepted as a substitute for the declaration, in either direction.
|
|
109
|
+
- **Windows crash dumps of the engine process are suppressed** — a WER dump is a full PHI disclosure
|
|
110
|
+
written to disk. `serve` applies the process-local half itself (`SetErrorMode` OR-ed into the inherited
|
|
111
|
+
mode, `WerSetFlags(NOHEAP | NO_UI | DISABLE_SNAPSHOT_*)`); the machine-policy half no process can reach
|
|
112
|
+
is opt-in via `install-service.ps1 -SuppressCrashDumps` (WER `ExcludedApplications`, registered for both
|
|
113
|
+
`messagefoundry.exe` and the venv `python.exe`, plus a **narrowing-only** `LocalDumps` override that is
|
|
114
|
+
written only where LocalDumps is already configured — creating that key would switch dump collection
|
|
115
|
+
ON). Residuals in [SERVICE.md](docs/SERVICE.md).
|
|
116
|
+
|
|
117
|
+
### Fixed
|
|
118
|
+
- **The harness message list could livelock and stop updating entirely.** `MessagesPanel._apply` cleared
|
|
119
|
+
its in-flight guard, re-fired any refresh latched during the read, then returned *before* rendering —
|
|
120
|
+
discarding the snapshot as superseded. Whenever refreshes arrive faster than a read completes there is
|
|
121
|
+
always a latch waiting when the read lands, so every snapshot was discarded and the table never
|
|
122
|
+
updated: permanently stuck, not merely slow (measured: 391 reads served, 0 rendered). It now renders
|
|
123
|
+
first and drains afterwards, costing at most one read of staleness while still converging on the
|
|
124
|
+
latest filter. This surfaced as an intermittent CI failure that no timeout or retry could fix, because
|
|
125
|
+
neither addresses a livelock.
|
|
126
|
+
- **Two config blocks in the off-loopback runbook aborted at load** — `[diagnostics].audit_all_authz` and
|
|
127
|
+
`[ai].data_class` had been relocated by ADR 0118, so an operator copy-pasting either block got an
|
|
128
|
+
immediate start failure. Corrected to `[security].audit_all_authorization_decisions` and
|
|
129
|
+
`[security].handles_real_patient_data`, and every fenced `toml` block in that runbook is now pinned by a
|
|
130
|
+
test that loads it and fails on a silently-ignored key.
|
|
131
|
+
|
|
9
132
|
## [0.3.0] — 2026-07-13 — Early Access
|
|
10
133
|
|
|
11
134
|
Highlights since 0.2.15 — streaming attachments end-to-end, a copy-on-Send message model, richer
|
|
@@ -872,16 +995,24 @@ tests, but the external code review + penetration test (the bar for a security-c
|
|
|
872
995
|
- Releases are built, SBOM'd (CycloneDX), and signed with [Sigstore](https://www.sigstore.dev/) — see the
|
|
873
996
|
`release` workflow.
|
|
874
997
|
|
|
875
|
-
[Unreleased]: https://github.com/
|
|
876
|
-
[0.2
|
|
877
|
-
[0.
|
|
878
|
-
[0.
|
|
879
|
-
[0.2.
|
|
880
|
-
[0.2.
|
|
881
|
-
[0.2.
|
|
882
|
-
[0.2.
|
|
883
|
-
[0.2.
|
|
884
|
-
[0.2.
|
|
885
|
-
[0.2.
|
|
886
|
-
[0.2.
|
|
887
|
-
[0.
|
|
998
|
+
[Unreleased]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.2...HEAD
|
|
999
|
+
[0.3.2]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.1...v0.3.2
|
|
1000
|
+
[0.3.1]: https://github.com/MEFORORG/MessageFoundry/compare/v0.3.0...v0.3.1
|
|
1001
|
+
[0.3.0]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.15...v0.3.0
|
|
1002
|
+
[0.2.15]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.14...v0.2.15
|
|
1003
|
+
[0.2.14]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.13...v0.2.14
|
|
1004
|
+
[0.2.13]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.12...v0.2.13
|
|
1005
|
+
[0.2.12]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.11...v0.2.12
|
|
1006
|
+
[0.2.11]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.10...v0.2.11
|
|
1007
|
+
[0.2.10]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.9...v0.2.10
|
|
1008
|
+
[0.2.9]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.8...v0.2.9
|
|
1009
|
+
[0.2.8]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.7...v0.2.8
|
|
1010
|
+
[0.2.7]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.6...v0.2.7
|
|
1011
|
+
[0.2.6]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.5...v0.2.6
|
|
1012
|
+
[0.2.5]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.4...v0.2.5
|
|
1013
|
+
[0.2.4]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.3...v0.2.4
|
|
1014
|
+
[0.2.3]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.2...v0.2.3
|
|
1015
|
+
[0.2.2]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.1...v0.2.2
|
|
1016
|
+
[0.2.1]: https://github.com/MEFORORG/MessageFoundry/compare/v0.2.0...v0.2.1
|
|
1017
|
+
[0.2.0]: https://github.com/MEFORORG/MessageFoundry/compare/v0.1.0...v0.2.0
|
|
1018
|
+
[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.
|
|
3
|
+
Version: 0.3.2
|
|
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
|
|
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
|
-
|
|
69
|
+
MessageTypeError,
|
|
50
70
|
PassThrough,
|
|
51
71
|
Reference,
|
|
52
72
|
Rest,
|
|
53
|
-
|
|
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.
|
|
110
|
+
__version__ = "0.3.2"
|
|
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
|
]
|