messagefoundry 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- messagefoundry-0.1.0/.claude/settings.json +81 -0
- messagefoundry-0.1.0/.gitattributes +4 -0
- messagefoundry-0.1.0/.github/CODEOWNERS +19 -0
- messagefoundry-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
- messagefoundry-0.1.0/.github/ISSUE_TEMPLATE/config.yml +7 -0
- messagefoundry-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- messagefoundry-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- messagefoundry-0.1.0/.github/SECURITY.md +50 -0
- messagefoundry-0.1.0/.github/dependabot.yml +17 -0
- messagefoundry-0.1.0/.github/workflows/benchmark.yml +217 -0
- messagefoundry-0.1.0/.github/workflows/ci.yml +670 -0
- messagefoundry-0.1.0/.github/workflows/cla.yml +47 -0
- messagefoundry-0.1.0/.github/workflows/release.yml +153 -0
- messagefoundry-0.1.0/.github/workflows/security.yml +172 -0
- messagefoundry-0.1.0/.gitignore +64 -0
- messagefoundry-0.1.0/.gitleaks.toml +14 -0
- messagefoundry-0.1.0/.pre-commit-config.yaml +49 -0
- messagefoundry-0.1.0/.semgrep/messagefoundry.yml +52 -0
- messagefoundry-0.1.0/CHANGELOG.md +50 -0
- messagefoundry-0.1.0/CLA.md +74 -0
- messagefoundry-0.1.0/CLAUDE.md +397 -0
- messagefoundry-0.1.0/CODE_OF_CONDUCT.md +42 -0
- messagefoundry-0.1.0/COMMERCIAL-LICENSE.md +67 -0
- messagefoundry-0.1.0/CONTRIBUTING.md +83 -0
- messagefoundry-0.1.0/GOVERNANCE.md +73 -0
- messagefoundry-0.1.0/LICENSE +662 -0
- messagefoundry-0.1.0/MAINTAINERS.md +32 -0
- messagefoundry-0.1.0/NOTICE +27 -0
- messagefoundry-0.1.0/PKG-INFO +212 -0
- messagefoundry-0.1.0/README.md +174 -0
- messagefoundry-0.1.0/docs/AI.md +220 -0
- messagefoundry-0.1.0/docs/ARCHITECTURE.md +333 -0
- messagefoundry-0.1.0/docs/BACKLOG.md +1172 -0
- messagefoundry-0.1.0/docs/CLUSTERING.md +272 -0
- messagefoundry-0.1.0/docs/CONFIGURATION.md +756 -0
- messagefoundry-0.1.0/docs/CONNECTIONS.md +821 -0
- messagefoundry-0.1.0/docs/CONTRIBUTOR-FIRST-ISSUES.md +73 -0
- messagefoundry-0.1.0/docs/CONTRIBUTOR-PROGRAM-PLAN.md +282 -0
- messagefoundry-0.1.0/docs/DEPLOY-SERVER-DB.md +103 -0
- messagefoundry-0.1.0/docs/DEPLOYMENT.md +218 -0
- messagefoundry-0.1.0/docs/DUAL_LICENSING_PLAN.md +67 -0
- messagefoundry-0.1.0/docs/EARLY-ADOPTER-GUIDE.md +766 -0
- messagefoundry-0.1.0/docs/FEATURE-MAP.md +201 -0
- messagefoundry-0.1.0/docs/HL7-VALIDATION.md +115 -0
- messagefoundry-0.1.0/docs/INSTALL-GUIDE.md +307 -0
- messagefoundry-0.1.0/docs/LOAD-TESTING.md +261 -0
- messagefoundry-0.1.0/docs/PHI.md +539 -0
- messagefoundry-0.1.0/docs/SECURITY.md +539 -0
- messagefoundry-0.1.0/docs/SERVICE.md +256 -0
- messagefoundry-0.1.0/docs/SYSTEM-REQUIREMENTS.md +149 -0
- messagefoundry-0.1.0/docs/Secure_AI_Development_Standards.md +552 -0
- messagefoundry-0.1.0/docs/Secure_Development_Standards.md +403 -0
- messagefoundry-0.1.0/docs/TEE-RELAY.md +126 -0
- messagefoundry-0.1.0/docs/THROUGHPUT-IMPROVEMENTS.md +143 -0
- messagefoundry-0.1.0/docs/WORKTREES.md +97 -0
- messagefoundry-0.1.0/docs/adr/0001-staged-pipeline-architecture.md +227 -0
- messagefoundry-0.1.0/docs/adr/0002-phase2-transport-security-and-strong-auth.md +270 -0
- messagefoundry-0.1.0/docs/adr/0003-non-hl7-transports-database-rest-soap.md +185 -0
- messagefoundry-0.1.0/docs/adr/0004-payload-agnostic-ingress.md +156 -0
- messagefoundry-0.1.0/docs/adr/0005-transform-accessible-state.md +170 -0
- messagefoundry-0.1.0/docs/adr/0006-external-data-lookups.md +208 -0
- messagefoundry-0.1.0/docs/adr/0007-gui-manageable-connections-toml.md +160 -0
- messagefoundry-0.1.0/docs/adr/0008-cluster-observability-api.md +125 -0
- messagefoundry-0.1.0/docs/adr/0009-run-scoped-context-providers.md +91 -0
- messagefoundry-0.1.0/docs/adr/0010-handler-callable-db-lookup.md +90 -0
- messagefoundry-0.1.0/docs/adr/0011-timer-scheduled-source.md +116 -0
- messagefoundry-0.1.0/docs/adr/0012-x12-edi-codec.md +308 -0
- messagefoundry-0.1.0/docs/adr/0013-increment-2-reingress-design.md +927 -0
- messagefoundry-0.1.0/docs/adr/0013-query-response-orchestration.md +490 -0
- messagefoundry-0.1.0/docs/adr/0014-alerting-rules-engine.md +126 -0
- messagefoundry-0.1.0/docs/adr/0015-ws-soap-outbound-mtls-wssecurity.md +445 -0
- messagefoundry-0.1.0/docs/adr/0016-synchronous-x12-request-response.md +500 -0
- messagefoundry-0.1.0/docs/adr/0017-consumer-deployment-model.md +217 -0
- messagefoundry-0.1.0/docs/adr/0018-per-message-signatures-accepted-risk.md +130 -0
- messagefoundry-0.1.0/docs/adr/0019-pluggable-keyprovider-hsm-kms-vault.md +418 -0
- messagefoundry-0.1.0/docs/adr/0020-protocol-diagnostic-capture.md +90 -0
- messagefoundry-0.1.0/docs/adr/0021-inbound-ack-nak-capture-response-sent.md +86 -0
- messagefoundry-0.1.0/docs/adr/README.md +32 -0
- messagefoundry-0.1.0/docs/architecture-components.png +0 -0
- messagefoundry-0.1.0/docs/architecture-components.svg +1 -0
- messagefoundry-0.1.0/docs/architecture-config-graph.png +0 -0
- messagefoundry-0.1.0/docs/architecture-config-graph.svg +1 -0
- messagefoundry-0.1.0/docs/architecture-diagram.md +269 -0
- messagefoundry-0.1.0/docs/architecture-message-flow.png +0 -0
- messagefoundry-0.1.0/docs/architecture-message-flow.svg +1 -0
- messagefoundry-0.1.0/docs/architecture-topology.png +0 -0
- messagefoundry-0.1.0/docs/architecture-topology.svg +1 -0
- messagefoundry-0.1.0/docs/benchmarks/TUNING-BASELINE.md +164 -0
- messagefoundry-0.1.0/docs/benchmarks/results/2026-06-16-ci-linux/environment.txt +14 -0
- messagefoundry-0.1.0/docs/benchmarks/results/2026-06-16-ci-linux/failover-postgres.json +83 -0
- messagefoundry-0.1.0/docs/benchmarks/results/2026-06-16-ci-linux/failover-sqlserver.json +83 -0
- messagefoundry-0.1.0/docs/benchmarks/results/2026-06-16-ci-linux/reference-postgres.json +235 -0
- messagefoundry-0.1.0/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlite.json +235 -0
- messagefoundry-0.1.0/docs/benchmarks/results/2026-06-16-ci-linux/reference-sqlserver.json +235 -0
- messagefoundry-0.1.0/docs/benchmarks/step-b-write-amplification.md +62 -0
- messagefoundry-0.1.0/docs/hl7-message-ordering-reference.md +86 -0
- messagefoundry-0.1.0/docs/message-ordering-design.md +209 -0
- messagefoundry-0.1.0/docs/releases/ASVS-OPTION-A-MULTISESSION-PLAN.md +284 -0
- messagefoundry-0.1.0/docs/releases/ASVS-PARTIALS-SWEEP-MULTISESSION-PLAN.md +373 -0
- messagefoundry-0.1.0/docs/releases/MULTISESSION-PLAN.md +275 -0
- messagefoundry-0.1.0/docs/releases/v0.1-EXECUTION-PLAN.md +336 -0
- messagefoundry-0.1.0/docs/releases/v0.1-PLAN.md +493 -0
- messagefoundry-0.1.0/docs/releases/v0.1.0-PRETAG-CHECKLIST.md +55 -0
- messagefoundry-0.1.0/docs/reviews/FULL-REVIEW-2026-06-10.md +271 -0
- messagefoundry-0.1.0/docs/security/ASVS-FAILS-REMEDIATION-PLAN.md +887 -0
- messagefoundry-0.1.0/docs/security/ASVS-L2-PHASE0-CHANGES.md +189 -0
- messagefoundry-0.1.0/docs/security/ASVS-L2-REMEDIATION-PLAN.md +256 -0
- messagefoundry-0.1.0/docs/security/ASVS-L3-ASSESSMENT.md +942 -0
- messagefoundry-0.1.0/docs/security/ASVS-L3-REMEDIATION-PLAN.md +514 -0
- messagefoundry-0.1.0/docs/security/ASVS-L3-STATUS.md +131 -0
- messagefoundry-0.1.0/docs/security/BEYOND-ASVS-L3-ONEPAGE.md +23 -0
- messagefoundry-0.1.0/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN-ONEPAGE.md +31 -0
- messagefoundry-0.1.0/docs/security/BEYOND-ASVS-L3-REMEDIATION-PLAN.md +930 -0
- messagefoundry-0.1.0/docs/security/BEYOND-ASVS-L3.md +133 -0
- messagefoundry-0.1.0/docs/security/PHASE-8C-RBAC.md +111 -0
- messagefoundry-0.1.0/docs/security/PUBLISHING.md +126 -0
- messagefoundry-0.1.0/docs/security/RCA-TEMPLATE.md +60 -0
- messagefoundry-0.1.0/docs/security/RELEASE-GATE.md +90 -0
- messagefoundry-0.1.0/docs/security/REMEDIATION-PLAN.md +172 -0
- messagefoundry-0.1.0/docs/security/REVIEW-2026-06-07.md +521 -0
- messagefoundry-0.1.0/docs/security/SDS-CONFORMANCE-REVIEW-2026-06-12.md +228 -0
- messagefoundry-0.1.0/docs/security/SDS-REMEDIATION-PLAN.md +93 -0
- messagefoundry-0.1.0/docs/security/THREAT-MODEL.md +152 -0
- messagefoundry-0.1.0/environments/dev.toml +23 -0
- messagefoundry-0.1.0/environments/prod.toml +24 -0
- messagefoundry-0.1.0/harness/README.md +101 -0
- messagefoundry-0.1.0/harness/__main__.py +293 -0
- messagefoundry-0.1.0/harness/compose.py +225 -0
- messagefoundry-0.1.0/harness/config/coverage.py +80 -0
- messagefoundry-0.1.0/harness/config/load/_shape.py +134 -0
- messagefoundry-0.1.0/harness/config/load/graph.py +90 -0
- messagefoundry-0.1.0/harness/file_panel.py +250 -0
- messagefoundry-0.1.0/harness/file_transport.py +165 -0
- messagefoundry-0.1.0/harness/load/__init__.py +17 -0
- messagefoundry-0.1.0/harness/load/corpus.py +146 -0
- messagefoundry-0.1.0/harness/load/correlator.py +73 -0
- messagefoundry-0.1.0/harness/load/enginepoll.py +162 -0
- messagefoundry-0.1.0/harness/load/failover.py +780 -0
- messagefoundry-0.1.0/harness/load/failover_track.py +106 -0
- messagefoundry-0.1.0/harness/load/governor.py +109 -0
- messagefoundry-0.1.0/harness/load/ids.py +42 -0
- messagefoundry-0.1.0/harness/load/metrics.py +219 -0
- messagefoundry-0.1.0/harness/load/profile.py +629 -0
- messagefoundry-0.1.0/harness/load/profiles/README.md +29 -0
- messagefoundry-0.1.0/harness/load/profiles/closed-loop.toml +100 -0
- messagefoundry-0.1.0/harness/load/profiles/failover.toml +55 -0
- messagefoundry-0.1.0/harness/load/profiles/fanout-baseline.toml +92 -0
- messagefoundry-0.1.0/harness/load/profiles/reference.toml +100 -0
- messagefoundry-0.1.0/harness/load/profiles/smoke-sqlserver.toml +42 -0
- messagefoundry-0.1.0/harness/load/profiles/smoke.toml +36 -0
- messagefoundry-0.1.0/harness/load/profiles/soak.toml +45 -0
- messagefoundry-0.1.0/harness/load/report.py +582 -0
- messagefoundry-0.1.0/harness/load/runner.py +166 -0
- messagefoundry-0.1.0/harness/load/sender.py +322 -0
- messagefoundry-0.1.0/harness/load/sink.py +136 -0
- messagefoundry-0.1.0/harness/mllp.py +271 -0
- messagefoundry-0.1.0/harness/monitor.py +547 -0
- messagefoundry-0.1.0/harness/receive.py +137 -0
- messagefoundry-0.1.0/harness/reconcile/__init__.py +49 -0
- messagefoundry-0.1.0/harness/reconcile/__main__.py +149 -0
- messagefoundry-0.1.0/harness/reconcile/capture.py +134 -0
- messagefoundry-0.1.0/harness/reconcile/compare.py +179 -0
- messagefoundry-0.1.0/harness/reconcile/normalize.py +234 -0
- messagefoundry-0.1.0/harness/reconcile/report.py +73 -0
- messagefoundry-0.1.0/harness/scenarios.py +195 -0
- messagefoundry-0.1.0/harness/send.py +175 -0
- messagefoundry-0.1.0/harness/window.py +52 -0
- messagefoundry-0.1.0/ide/.gitignore +5 -0
- messagefoundry-0.1.0/ide/.vscodeignore +8 -0
- messagefoundry-0.1.0/ide/README.md +135 -0
- messagefoundry-0.1.0/ide/esbuild.js +28 -0
- messagefoundry-0.1.0/ide/media/hl7schema.json +1 -0
- messagefoundry-0.1.0/ide/media/icon.png +0 -0
- messagefoundry-0.1.0/ide/media/icon.svg +6 -0
- messagefoundry-0.1.0/ide/package-lock.json +2234 -0
- messagefoundry-0.1.0/ide/package.json +268 -0
- messagefoundry-0.1.0/ide/snippets/messagefoundry.code-snippets +37 -0
- messagefoundry-0.1.0/ide/src/aiPolicy.ts +99 -0
- messagefoundry-0.1.0/ide/src/auth.ts +126 -0
- messagefoundry-0.1.0/ide/src/chat.ts +115 -0
- messagefoundry-0.1.0/ide/src/cli.ts +110 -0
- messagefoundry-0.1.0/ide/src/completion.ts +157 -0
- messagefoundry-0.1.0/ide/src/connectionEditor.ts +402 -0
- messagefoundry-0.1.0/ide/src/engineClient.ts +143 -0
- messagefoundry-0.1.0/ide/src/extension.ts +155 -0
- messagefoundry-0.1.0/ide/src/generate.ts +99 -0
- messagefoundry-0.1.0/ide/src/git.ts +70 -0
- messagefoundry-0.1.0/ide/src/graphTree.ts +215 -0
- messagefoundry-0.1.0/ide/src/home.ts +110 -0
- messagefoundry-0.1.0/ide/src/newRoute.ts +327 -0
- messagefoundry-0.1.0/ide/src/promote.ts +154 -0
- messagefoundry-0.1.0/ide/src/sourceControl.ts +352 -0
- messagefoundry-0.1.0/ide/src/test/runTest.ts +22 -0
- messagefoundry-0.1.0/ide/src/test/suite/extension.test.ts +54 -0
- messagefoundry-0.1.0/ide/src/test/suite/index.ts +31 -0
- messagefoundry-0.1.0/ide/src/testBench.ts +302 -0
- messagefoundry-0.1.0/ide/src/validate.ts +54 -0
- messagefoundry-0.1.0/ide/tsconfig.json +13 -0
- messagefoundry-0.1.0/ide/tsconfig.test.json +12 -0
- messagefoundry-0.1.0/mefor.code-workspace +6 -0
- messagefoundry-0.1.0/messagefoundry/__init__.py +108 -0
- messagefoundry-0.1.0/messagefoundry/__main__.py +1155 -0
- messagefoundry-0.1.0/messagefoundry/api/__init__.py +27 -0
- messagefoundry-0.1.0/messagefoundry/api/app.py +1581 -0
- messagefoundry-0.1.0/messagefoundry/api/approvals.py +184 -0
- messagefoundry-0.1.0/messagefoundry/api/auth_models.py +211 -0
- messagefoundry-0.1.0/messagefoundry/api/auth_routes.py +655 -0
- messagefoundry-0.1.0/messagefoundry/api/field_authz.py +96 -0
- messagefoundry-0.1.0/messagefoundry/api/models.py +374 -0
- messagefoundry-0.1.0/messagefoundry/api/security.py +247 -0
- messagefoundry-0.1.0/messagefoundry/api/tls.py +47 -0
- messagefoundry-0.1.0/messagefoundry/auth/__init__.py +39 -0
- messagefoundry-0.1.0/messagefoundry/auth/data/common_passwords.NOTICE +13 -0
- messagefoundry-0.1.0/messagefoundry/auth/data/common_passwords.txt +10000 -0
- messagefoundry-0.1.0/messagefoundry/auth/identity.py +71 -0
- messagefoundry-0.1.0/messagefoundry/auth/ldap.py +264 -0
- messagefoundry-0.1.0/messagefoundry/auth/notifications.py +68 -0
- messagefoundry-0.1.0/messagefoundry/auth/passwords.py +53 -0
- messagefoundry-0.1.0/messagefoundry/auth/permissions.py +120 -0
- messagefoundry-0.1.0/messagefoundry/auth/policy.py +153 -0
- messagefoundry-0.1.0/messagefoundry/auth/ratelimit.py +55 -0
- messagefoundry-0.1.0/messagefoundry/auth/service.py +1323 -0
- messagefoundry-0.1.0/messagefoundry/auth/tokens.py +26 -0
- messagefoundry-0.1.0/messagefoundry/auth/totp.py +174 -0
- messagefoundry-0.1.0/messagefoundry/checks.py +174 -0
- messagefoundry-0.1.0/messagefoundry/config/__init__.py +30 -0
- messagefoundry-0.1.0/messagefoundry/config/active_environment.py +80 -0
- messagefoundry-0.1.0/messagefoundry/config/ai_policy.py +140 -0
- messagefoundry-0.1.0/messagefoundry/config/code_sets.py +260 -0
- messagefoundry-0.1.0/messagefoundry/config/connections_edit.py +200 -0
- messagefoundry-0.1.0/messagefoundry/config/connections_file.py +287 -0
- messagefoundry-0.1.0/messagefoundry/config/db_lookup.py +117 -0
- messagefoundry-0.1.0/messagefoundry/config/environments.py +116 -0
- messagefoundry-0.1.0/messagefoundry/config/ingest_time.py +83 -0
- messagefoundry-0.1.0/messagefoundry/config/models.py +240 -0
- messagefoundry-0.1.0/messagefoundry/config/reference.py +158 -0
- messagefoundry-0.1.0/messagefoundry/config/response.py +83 -0
- messagefoundry-0.1.0/messagefoundry/config/run_context.py +153 -0
- messagefoundry-0.1.0/messagefoundry/config/settings.py +1311 -0
- messagefoundry-0.1.0/messagefoundry/config/state.py +99 -0
- messagefoundry-0.1.0/messagefoundry/config/tls_policy.py +110 -0
- messagefoundry-0.1.0/messagefoundry/config/wiring.py +1918 -0
- messagefoundry-0.1.0/messagefoundry/console/__init__.py +20 -0
- messagefoundry-0.1.0/messagefoundry/console/__main__.py +274 -0
- messagefoundry-0.1.0/messagefoundry/console/_async.py +107 -0
- messagefoundry-0.1.0/messagefoundry/console/change_password.py +111 -0
- messagefoundry-0.1.0/messagefoundry/console/client.py +552 -0
- messagefoundry-0.1.0/messagefoundry/console/connections.py +324 -0
- messagefoundry-0.1.0/messagefoundry/console/login.py +107 -0
- messagefoundry-0.1.0/messagefoundry/console/mfa.py +205 -0
- messagefoundry-0.1.0/messagefoundry/console/reauth.py +94 -0
- messagefoundry-0.1.0/messagefoundry/console/search.py +57 -0
- messagefoundry-0.1.0/messagefoundry/console/service_control.py +137 -0
- messagefoundry-0.1.0/messagefoundry/console/sessions.py +122 -0
- messagefoundry-0.1.0/messagefoundry/console/shell.py +410 -0
- messagefoundry-0.1.0/messagefoundry/console/status.py +377 -0
- messagefoundry-0.1.0/messagefoundry/console/users_page.py +282 -0
- messagefoundry-0.1.0/messagefoundry/console/widgets.py +553 -0
- messagefoundry-0.1.0/messagefoundry/generators/README.md +27 -0
- messagefoundry-0.1.0/messagefoundry/generators/__init__.py +15 -0
- messagefoundry-0.1.0/messagefoundry/generators/_core.py +589 -0
- messagefoundry-0.1.0/messagefoundry/generators/_hl7data.py +428 -0
- messagefoundry-0.1.0/messagefoundry/generators/adt.py +286 -0
- messagefoundry-0.1.0/messagefoundry/generators/all_types.py +24 -0
- messagefoundry-0.1.0/messagefoundry/generators/bar.py +28 -0
- messagefoundry-0.1.0/messagefoundry/generators/dft.py +20 -0
- messagefoundry-0.1.0/messagefoundry/generators/mdm.py +39 -0
- messagefoundry-0.1.0/messagefoundry/generators/mfn.py +46 -0
- messagefoundry-0.1.0/messagefoundry/generators/oml.py +32 -0
- messagefoundry-0.1.0/messagefoundry/generators/orl.py +30 -0
- messagefoundry-0.1.0/messagefoundry/generators/orm.py +23 -0
- messagefoundry-0.1.0/messagefoundry/generators/oru.py +21 -0
- messagefoundry-0.1.0/messagefoundry/generators/ras.py +20 -0
- messagefoundry-0.1.0/messagefoundry/generators/rde.py +54 -0
- messagefoundry-0.1.0/messagefoundry/generators/siu.py +64 -0
- messagefoundry-0.1.0/messagefoundry/generators/vxu.py +20 -0
- messagefoundry-0.1.0/messagefoundry/hl7schema.py +75 -0
- messagefoundry-0.1.0/messagefoundry/last_resort.py +55 -0
- messagefoundry-0.1.0/messagefoundry/logging_setup.py +332 -0
- messagefoundry-0.1.0/messagefoundry/parsing/__init__.py +64 -0
- messagefoundry-0.1.0/messagefoundry/parsing/consistency.py +166 -0
- messagefoundry-0.1.0/messagefoundry/parsing/groups.py +228 -0
- messagefoundry-0.1.0/messagefoundry/parsing/message.py +453 -0
- messagefoundry-0.1.0/messagefoundry/parsing/peek.py +237 -0
- messagefoundry-0.1.0/messagefoundry/parsing/split.py +120 -0
- messagefoundry-0.1.0/messagefoundry/parsing/summary.py +46 -0
- messagefoundry-0.1.0/messagefoundry/parsing/tree.py +128 -0
- messagefoundry-0.1.0/messagefoundry/parsing/validate.py +95 -0
- messagefoundry-0.1.0/messagefoundry/parsing/x12/__init__.py +46 -0
- messagefoundry-0.1.0/messagefoundry/parsing/x12/delimiters.py +140 -0
- messagefoundry-0.1.0/messagefoundry/parsing/x12/errors.py +30 -0
- messagefoundry-0.1.0/messagefoundry/parsing/x12/interchange.py +232 -0
- messagefoundry-0.1.0/messagefoundry/parsing/x12/message.py +200 -0
- messagefoundry-0.1.0/messagefoundry/parsing/x12/peek.py +207 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/__init__.py +21 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/alert_sinks.py +486 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/alerts.py +100 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/cert_expiry.py +219 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/cluster.py +955 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/cluster_sqlserver.py +444 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/config_convergence.py +137 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/dryrun.py +450 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/engine.py +756 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/leader_tasks.py +158 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/reference_sync.py +369 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/retention.py +289 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/security_notify.py +168 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/state_convergence.py +143 -0
- messagefoundry-0.1.0/messagefoundry/pipeline/wiring_runner.py +1722 -0
- messagefoundry-0.1.0/messagefoundry/py.typed +0 -0
- messagefoundry-0.1.0/messagefoundry/redaction.py +71 -0
- messagefoundry-0.1.0/messagefoundry/scaffold.py +321 -0
- messagefoundry-0.1.0/messagefoundry/secrets_dpapi.py +129 -0
- messagefoundry-0.1.0/messagefoundry/store/__init__.py +46 -0
- messagefoundry-0.1.0/messagefoundry/store/audit_tee.py +67 -0
- messagefoundry-0.1.0/messagefoundry/store/base.py +758 -0
- messagefoundry-0.1.0/messagefoundry/store/crypto.py +166 -0
- messagefoundry-0.1.0/messagefoundry/store/keyprovider.py +192 -0
- messagefoundry-0.1.0/messagefoundry/store/postgres.py +3447 -0
- messagefoundry-0.1.0/messagefoundry/store/sqlserver.py +3014 -0
- messagefoundry-0.1.0/messagefoundry/store/store.py +3790 -0
- messagefoundry-0.1.0/messagefoundry/timezone.py +207 -0
- messagefoundry-0.1.0/messagefoundry/transports/__init__.py +50 -0
- messagefoundry-0.1.0/messagefoundry/transports/base.py +269 -0
- messagefoundry-0.1.0/messagefoundry/transports/database.py +693 -0
- messagefoundry-0.1.0/messagefoundry/transports/file.py +551 -0
- messagefoundry-0.1.0/messagefoundry/transports/framing.py +164 -0
- messagefoundry-0.1.0/messagefoundry/transports/loopback.py +53 -0
- messagefoundry-0.1.0/messagefoundry/transports/mllp.py +644 -0
- messagefoundry-0.1.0/messagefoundry/transports/remotefile.py +664 -0
- messagefoundry-0.1.0/messagefoundry/transports/rest.py +281 -0
- messagefoundry-0.1.0/messagefoundry/transports/signing.py +321 -0
- messagefoundry-0.1.0/messagefoundry/transports/soap.py +507 -0
- messagefoundry-0.1.0/messagefoundry/transports/tcp.py +307 -0
- messagefoundry-0.1.0/messagefoundry/transports/timer.py +146 -0
- messagefoundry-0.1.0/messagefoundry/transports/x12.py +323 -0
- messagefoundry-0.1.0/pyproject.toml +85 -0
- messagefoundry-0.1.0/requirements.lock +1125 -0
- messagefoundry-0.1.0/samples/config/IB_ACME_ADT.py +29 -0
- messagefoundry-0.1.0/samples/config/IB_IMMUNIZATION_VXU.py +63 -0
- messagefoundry-0.1.0/samples/config/IB_PARTNER_X12.py +47 -0
- messagefoundry-0.1.0/samples/config/IB_RTE_ELIGIBILITY.py +87 -0
- messagefoundry-0.1.0/samples/config/adt.py +53 -0
- messagefoundry-0.1.0/samples/config/codesets/event_labels.csv +4 -0
- messagefoundry-0.1.0/samples/config/codesets/facility_mnemonics.toml +4 -0
- messagefoundry-0.1.0/samples/config/connections.toml +28 -0
- messagefoundry-0.1.0/samples/consistency/validated_adt.py +62 -0
- messagefoundry-0.1.0/samples/messages/adt_a01.hl7 +4 -0
- messagefoundry-0.1.0/samples/messages/adt_batch.hl7 +18 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/.gitattributes +5 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/README.md +39 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/adt_a01.txt +1 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/adt_a03.txt +5 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/batch_18_messages.txt +133 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/erp_z99_v231.hl7 +7 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/omd_o03.txt +1 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/omd_o03_rep.txt +1 -0
- messagefoundry-0.1.0/samples/messages/hapi-hl7v2/oml_o21.hl7 +1 -0
- messagefoundry-0.1.0/samples/messages/x12_270_eligibility.edi +1 -0
- messagefoundry-0.1.0/samples/results_relay/README.md +44 -0
- messagefoundry-0.1.0/samples/results_relay/codesets/test_codes.csv +4 -0
- messagefoundry-0.1.0/samples/results_relay/messages/oru_all_cancelled.hl7 +4 -0
- messagefoundry-0.1.0/samples/results_relay/messages/oru_results.hl7 +7 -0
- messagefoundry-0.1.0/samples/results_relay/results_relay.py +124 -0
- messagefoundry-0.1.0/samples/send_mllp.py +61 -0
- messagefoundry-0.1.0/scripts/dev/postgres.ps1 +60 -0
- messagefoundry-0.1.0/scripts/dev/sqlserver-docker.ps1 +184 -0
- messagefoundry-0.1.0/scripts/dev/sqlserver.ps1 +80 -0
- messagefoundry-0.1.0/scripts/hooks/block-blanket-git-stage.ps1 +53 -0
- messagefoundry-0.1.0/scripts/publish/publish-denylist.txt +33 -0
- messagefoundry-0.1.0/scripts/publish/publish.ps1 +232 -0
- messagefoundry-0.1.0/scripts/publish/scan_forbidden.py +234 -0
- messagefoundry-0.1.0/scripts/security/crypto_inventory_check.py +145 -0
- messagefoundry-0.1.0/scripts/service/install-service.ps1 +249 -0
- messagefoundry-0.1.0/scripts/service/uninstall-service.ps1 +55 -0
- messagefoundry-0.1.0/scripts/soak/store_soak.py +92 -0
- messagefoundry-0.1.0/scripts/trace_icon.py +128 -0
- messagefoundry-0.1.0/scripts/worktree/new.ps1 +131 -0
- messagefoundry-0.1.0/scripts/worktree/remove.ps1 +52 -0
- messagefoundry-0.1.0/scripts/worktree/session-context.ps1 +49 -0
- messagefoundry-0.1.0/scripts/worktree/spawn.ps1 +51 -0
- messagefoundry-0.1.0/tee/__init__.py +20 -0
- messagefoundry-0.1.0/tee/__main__.py +472 -0
- messagefoundry-0.1.0/tee/compare.py +152 -0
- messagefoundry-0.1.0/tee/correlate.py +286 -0
- messagefoundry-0.1.0/tee/hl7_fields.py +95 -0
- messagefoundry-0.1.0/tee/mefor_api.py +111 -0
- messagefoundry-0.1.0/tee/mllp.py +181 -0
- messagefoundry-0.1.0/tee/relay.py +503 -0
- messagefoundry-0.1.0/tee/report.py +80 -0
- messagefoundry-0.1.0/tee/store.py +382 -0
- messagefoundry-0.1.0/tests/_failover_load_support.py +126 -0
- messagefoundry-0.1.0/tests/conftest.py +41 -0
- messagefoundry-0.1.0/tests/test_active_environment.py +103 -0
- messagefoundry-0.1.0/tests/test_ad_group_scope.py +148 -0
- messagefoundry-0.1.0/tests/test_admin_new_ip.py +333 -0
- messagefoundry-0.1.0/tests/test_ai_policy.py +400 -0
- messagefoundry-0.1.0/tests/test_alert_rules.py +299 -0
- messagefoundry-0.1.0/tests/test_alert_sinks.py +216 -0
- messagefoundry-0.1.0/tests/test_api.py +681 -0
- messagefoundry-0.1.0/tests/test_api_auth.py +660 -0
- messagefoundry-0.1.0/tests/test_api_reload.py +198 -0
- messagefoundry-0.1.0/tests/test_api_tls.py +211 -0
- messagefoundry-0.1.0/tests/test_approvals.py +179 -0
- messagefoundry-0.1.0/tests/test_asvs_phase0.py +242 -0
- messagefoundry-0.1.0/tests/test_audit_integrity.py +104 -0
- messagefoundry-0.1.0/tests/test_audit_offbox_tee.py +176 -0
- messagefoundry-0.1.0/tests/test_auth_core.py +153 -0
- messagefoundry-0.1.0/tests/test_auth_entry_hardening.py +104 -0
- messagefoundry-0.1.0/tests/test_auth_hardening.py +524 -0
- messagefoundry-0.1.0/tests/test_auth_service.py +475 -0
- messagefoundry-0.1.0/tests/test_auth_session_lifecycle.py +190 -0
- messagefoundry-0.1.0/tests/test_auth_store.py +136 -0
- messagefoundry-0.1.0/tests/test_cert_expiry.py +254 -0
- messagefoundry-0.1.0/tests/test_channel_rbac.py +211 -0
- messagefoundry-0.1.0/tests/test_checks.py +274 -0
- messagefoundry-0.1.0/tests/test_cli.py +551 -0
- messagefoundry-0.1.0/tests/test_cluster.py +1051 -0
- messagefoundry-0.1.0/tests/test_cluster_failover_postgres.py +176 -0
- messagefoundry-0.1.0/tests/test_cluster_failover_sqlserver.py +176 -0
- messagefoundry-0.1.0/tests/test_cluster_graph_gating.py +292 -0
- messagefoundry-0.1.0/tests/test_cluster_lease.py +248 -0
- messagefoundry-0.1.0/tests/test_code_sets.py +306 -0
- messagefoundry-0.1.0/tests/test_connection_api.py +368 -0
- messagefoundry-0.1.0/tests/test_connections_cli.py +228 -0
- messagefoundry-0.1.0/tests/test_connections_file.py +311 -0
- messagefoundry-0.1.0/tests/test_consistency.py +125 -0
- messagefoundry-0.1.0/tests/test_console_auth.py +144 -0
- messagefoundry-0.1.0/tests/test_console_client.py +246 -0
- messagefoundry-0.1.0/tests/test_console_hardening.py +84 -0
- messagefoundry-0.1.0/tests/test_console_password.py +419 -0
- messagefoundry-0.1.0/tests/test_console_sessions.py +167 -0
- messagefoundry-0.1.0/tests/test_console_status.py +306 -0
- messagefoundry-0.1.0/tests/test_console_step_up.py +193 -0
- messagefoundry-0.1.0/tests/test_console_users.py +191 -0
- messagefoundry-0.1.0/tests/test_console_widgets.py +896 -0
- messagefoundry-0.1.0/tests/test_database_connector_integration.py +138 -0
- messagefoundry-0.1.0/tests/test_database_transport.py +646 -0
- messagefoundry-0.1.0/tests/test_db_lookup.py +250 -0
- messagefoundry-0.1.0/tests/test_delivery_settings.py +162 -0
- messagefoundry-0.1.0/tests/test_dependency_boundaries.py +54 -0
- messagefoundry-0.1.0/tests/test_dryrun.py +232 -0
- messagefoundry-0.1.0/tests/test_egress_allowlist.py +160 -0
- messagefoundry-0.1.0/tests/test_environments.py +326 -0
- messagefoundry-0.1.0/tests/test_field_authz.py +167 -0
- messagefoundry-0.1.0/tests/test_fifo_ordering.py +100 -0
- messagefoundry-0.1.0/tests/test_generate_cli.py +78 -0
- messagefoundry-0.1.0/tests/test_generated_adt.py +177 -0
- messagefoundry-0.1.0/tests/test_generators_core.py +57 -0
- messagefoundry-0.1.0/tests/test_generators_types.py +42 -0
- messagefoundry-0.1.0/tests/test_groups.py +267 -0
- messagefoundry-0.1.0/tests/test_harness.py +145 -0
- messagefoundry-0.1.0/tests/test_harness_compose.py +130 -0
- messagefoundry-0.1.0/tests/test_harness_config.py +72 -0
- messagefoundry-0.1.0/tests/test_harness_faults.py +113 -0
- messagefoundry-0.1.0/tests/test_harness_file.py +77 -0
- messagefoundry-0.1.0/tests/test_harness_monitor.py +172 -0
- messagefoundry-0.1.0/tests/test_harness_scenarios.py +177 -0
- messagefoundry-0.1.0/tests/test_hl7schema.py +48 -0
- messagefoundry-0.1.0/tests/test_inbound_bind.py +110 -0
- messagefoundry-0.1.0/tests/test_ingest_time.py +103 -0
- messagefoundry-0.1.0/tests/test_keyprovider.py +274 -0
- messagefoundry-0.1.0/tests/test_last_resort.py +104 -0
- messagefoundry-0.1.0/tests/test_leader_tasks.py +238 -0
- messagefoundry-0.1.0/tests/test_load_config.py +182 -0
- messagefoundry-0.1.0/tests/test_load_corpus.py +91 -0
- messagefoundry-0.1.0/tests/test_load_failover_postgres.py +74 -0
- messagefoundry-0.1.0/tests/test_load_failover_sqlserver.py +72 -0
- messagefoundry-0.1.0/tests/test_load_failover_unit.py +391 -0
- messagefoundry-0.1.0/tests/test_load_metrics.py +124 -0
- messagefoundry-0.1.0/tests/test_load_profile.py +202 -0
- messagefoundry-0.1.0/tests/test_load_report.py +240 -0
- messagefoundry-0.1.0/tests/test_load_runner.py +197 -0
- messagefoundry-0.1.0/tests/test_load_sender.py +130 -0
- messagefoundry-0.1.0/tests/test_load_sink.py +158 -0
- messagefoundry-0.1.0/tests/test_logging.py +421 -0
- messagefoundry-0.1.0/tests/test_message.py +363 -0
- messagefoundry-0.1.0/tests/test_message_split.py +316 -0
- messagefoundry-0.1.0/tests/test_mfa.py +281 -0
- messagefoundry-0.1.0/tests/test_mllp_encoding_override.py +240 -0
- messagefoundry-0.1.0/tests/test_mllp_tls.py +229 -0
- messagefoundry-0.1.0/tests/test_operability_config.py +382 -0
- messagefoundry-0.1.0/tests/test_outbound_signing.py +387 -0
- messagefoundry-0.1.0/tests/test_outbound_simulate.py +355 -0
- messagefoundry-0.1.0/tests/test_packaging.py +23 -0
- messagefoundry-0.1.0/tests/test_parse_tree.py +73 -0
- messagefoundry-0.1.0/tests/test_parsing.py +202 -0
- messagefoundry-0.1.0/tests/test_payload_agnostic_ingress.py +202 -0
- messagefoundry-0.1.0/tests/test_postgres_store.py +1550 -0
- messagefoundry-0.1.0/tests/test_reconcile_capture.py +118 -0
- messagefoundry-0.1.0/tests/test_reconcile_compare.py +102 -0
- messagefoundry-0.1.0/tests/test_reconcile_harness.py +128 -0
- messagefoundry-0.1.0/tests/test_redaction.py +72 -0
- messagefoundry-0.1.0/tests/test_reference_sets.py +538 -0
- messagefoundry-0.1.0/tests/test_reingress.py +510 -0
- messagefoundry-0.1.0/tests/test_remotefile_transport.py +702 -0
- messagefoundry-0.1.0/tests/test_response_capture.py +518 -0
- messagefoundry-0.1.0/tests/test_rest_transport.py +209 -0
- messagefoundry-0.1.0/tests/test_retention.py +395 -0
- messagefoundry-0.1.0/tests/test_run_context.py +103 -0
- messagefoundry-0.1.0/tests/test_scaffold.py +119 -0
- messagefoundry-0.1.0/tests/test_scan_forbidden.py +141 -0
- messagefoundry-0.1.0/tests/test_secrets_dpapi.py +101 -0
- messagefoundry-0.1.0/tests/test_security_notify.py +88 -0
- messagefoundry-0.1.0/tests/test_security_static.py +136 -0
- messagefoundry-0.1.0/tests/test_service_control.py +29 -0
- messagefoundry-0.1.0/tests/test_settings.py +567 -0
- messagefoundry-0.1.0/tests/test_soap_transport.py +206 -0
- messagefoundry-0.1.0/tests/test_soap_wssecurity.py +330 -0
- messagefoundry-0.1.0/tests/test_sqlserver_coordinator.py +180 -0
- messagefoundry-0.1.0/tests/test_sqlserver_store.py +961 -0
- messagefoundry-0.1.0/tests/test_staged_pipeline.py +968 -0
- messagefoundry-0.1.0/tests/test_step_up.py +206 -0
- messagefoundry-0.1.0/tests/test_store.py +566 -0
- messagefoundry-0.1.0/tests/test_store_backend.py +103 -0
- messagefoundry-0.1.0/tests/test_store_encryption.py +331 -0
- messagefoundry-0.1.0/tests/test_store_file_hardening.py +94 -0
- messagefoundry-0.1.0/tests/test_store_read_pool.py +145 -0
- messagefoundry-0.1.0/tests/test_summary.py +33 -0
- messagefoundry-0.1.0/tests/test_task_resilience.py +148 -0
- messagefoundry-0.1.0/tests/test_tcp_transport.py +341 -0
- messagefoundry-0.1.0/tests/test_tee_cli.py +203 -0
- messagefoundry-0.1.0/tests/test_tee_compare.py +78 -0
- messagefoundry-0.1.0/tests/test_tee_correlate.py +226 -0
- messagefoundry-0.1.0/tests/test_tee_hl7_fields.py +84 -0
- messagefoundry-0.1.0/tests/test_tee_mefor_api.py +107 -0
- messagefoundry-0.1.0/tests/test_tee_mllp.py +98 -0
- messagefoundry-0.1.0/tests/test_tee_relay.py +523 -0
- messagefoundry-0.1.0/tests/test_tee_report.py +86 -0
- messagefoundry-0.1.0/tests/test_tee_store.py +220 -0
- messagefoundry-0.1.0/tests/test_timer_source.py +285 -0
- messagefoundry-0.1.0/tests/test_timezone.py +140 -0
- messagefoundry-0.1.0/tests/test_tls_policy.py +101 -0
- messagefoundry-0.1.0/tests/test_totp.py +93 -0
- messagefoundry-0.1.0/tests/test_transform_state.py +528 -0
- messagefoundry-0.1.0/tests/test_transports.py +952 -0
- messagefoundry-0.1.0/tests/test_version.py +33 -0
- messagefoundry-0.1.0/tests/test_wiring.py +303 -0
- messagefoundry-0.1.0/tests/test_wiring_engine.py +1066 -0
- messagefoundry-0.1.0/tests/test_wiring_reload.py +516 -0
- messagefoundry-0.1.0/tests/test_wiring_serve.py +102 -0
- messagefoundry-0.1.0/tests/test_x12_parsing.py +462 -0
- messagefoundry-0.1.0/tests/test_x12_rte.py +212 -0
- messagefoundry-0.1.0/tests/test_x12_transport.py +379 -0
- messagefoundry-0.1.0/uv.lock +1664 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"PowerShell($env:QT_QPA_PLATFORM=\"offscreen\"; .venv\\\\Scripts\\\\python.exe -m pytest -q 2>&1 | Select-Object -Last 10)",
|
|
5
|
+
"PowerShell(git checkout main 2>&1)",
|
|
6
|
+
"PowerShell(git pull --ff-only 2>&1)",
|
|
7
|
+
"PowerShell(git switch -c logsearch-columns 2>&1)",
|
|
8
|
+
"PowerShell(.venv\\\\Scripts\\\\ruff.exe format messagefoundry tests 2>&1)",
|
|
9
|
+
"PowerShell(.venv\\\\Scripts\\\\ruff.exe check messagefoundry tests 2>&1)",
|
|
10
|
+
"PowerShell(.venv\\\\Scripts\\\\mypy.exe messagefoundry 2>&1)",
|
|
11
|
+
"PowerShell(\"--- check ---\")",
|
|
12
|
+
"PowerShell(\"--- mypy ---\")",
|
|
13
|
+
"PowerShell($env:QT_QPA_PLATFORM=\"offscreen\"; .venv\\\\Scripts\\\\python.exe -m pytest -q 2>&1 | Select-Object -Last 8)",
|
|
14
|
+
"PowerShell($env:QT_QPA_PLATFORM=\"offscreen\"; .venv\\\\Scripts\\\\ruff.exe format messagefoundry tests 2>&1 | Select-Object -Last 1; .venv\\\\Scripts\\\\ruff.exe check messagefoundry tests 2>&1 | Select-Object -Last 2; .venv\\\\Scripts\\\\mypy.exe messagefoundry 2>&1 | Select-Object -Last 2; .venv\\\\Scripts\\\\python.exe -m pytest -q 2>&1 | Select-Object -Last 4)"
|
|
15
|
+
],
|
|
16
|
+
"deny": [
|
|
17
|
+
"Read(./.env)",
|
|
18
|
+
"Read(./.env.*)",
|
|
19
|
+
"Read(./secrets/**)",
|
|
20
|
+
"Read(./*.key)",
|
|
21
|
+
"Read(./*.pem)",
|
|
22
|
+
"Read(./*.pfx)",
|
|
23
|
+
"Read(./*.db)",
|
|
24
|
+
"Read(./*.db-wal)",
|
|
25
|
+
"Read(./*.db-shm)",
|
|
26
|
+
"Read(./bootstrap-admin.txt)",
|
|
27
|
+
"Edit(./.env)",
|
|
28
|
+
"Edit(./.env.*)",
|
|
29
|
+
"Edit(./secrets/**)",
|
|
30
|
+
"Edit(./*.db)",
|
|
31
|
+
"Write(./.env)",
|
|
32
|
+
"Write(./secrets/**)",
|
|
33
|
+
"Bash(rm -rf:*)",
|
|
34
|
+
"Bash(git push --force:*)",
|
|
35
|
+
"Bash(git push -f:*)",
|
|
36
|
+
"Bash(git reset --hard:*)",
|
|
37
|
+
"PowerShell(Remove-Item -Recurse -Force:*)",
|
|
38
|
+
"PowerShell(git push --force:*)",
|
|
39
|
+
"PowerShell(git push -f:*)",
|
|
40
|
+
"PowerShell(git reset --hard:*)"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"hooks": {
|
|
44
|
+
"PreToolUse": [
|
|
45
|
+
{
|
|
46
|
+
"matcher": "Bash",
|
|
47
|
+
"hooks": [
|
|
48
|
+
{
|
|
49
|
+
"type": "command",
|
|
50
|
+
"if": "Bash(git *)",
|
|
51
|
+
"command": "pwsh -NoProfile -File scripts/hooks/block-blanket-git-stage.ps1",
|
|
52
|
+
"timeout": 20,
|
|
53
|
+
"statusMessage": "Checking git staging"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"matcher": "PowerShell",
|
|
59
|
+
"hooks": [
|
|
60
|
+
{
|
|
61
|
+
"type": "command",
|
|
62
|
+
"if": "PowerShell(git *)",
|
|
63
|
+
"command": "pwsh -NoProfile -File scripts/hooks/block-blanket-git-stage.ps1",
|
|
64
|
+
"timeout": 20,
|
|
65
|
+
"statusMessage": "Checking git staging"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"SessionStart": [
|
|
71
|
+
{
|
|
72
|
+
"hooks": [
|
|
73
|
+
{
|
|
74
|
+
"type": "command",
|
|
75
|
+
"command": "pwsh -NoProfile -File scripts/worktree/session-context.ps1"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Code owners for MessageFoundry.
|
|
2
|
+
# Listed owners are auto-requested for review when matching paths change.
|
|
3
|
+
# See GOVERNANCE.md and MAINTAINERS.md for the roles behind these assignments.
|
|
4
|
+
|
|
5
|
+
# Default owner for everything in the repo.
|
|
6
|
+
* @wshallwshall
|
|
7
|
+
|
|
8
|
+
# --- Sensitive subsystems: steward review required even after more maintainers join ---
|
|
9
|
+
/messagefoundry/auth/ @wshallwshall
|
|
10
|
+
/messagefoundry/store/ @wshallwshall
|
|
11
|
+
/messagefoundry/transports/ @wshallwshall
|
|
12
|
+
/messagefoundry/api/security.py @wshallwshall
|
|
13
|
+
|
|
14
|
+
# Security, licensing, and the public-mirror publish/scan tooling.
|
|
15
|
+
/docs/SECURITY.md @wshallwshall
|
|
16
|
+
/docs/Secure_Development_Standards.md @wshallwshall
|
|
17
|
+
/scripts/publish/ @wshallwshall
|
|
18
|
+
/CLA.md @wshallwshall
|
|
19
|
+
/LICENSE @wshallwshall
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a problem with the MessageFoundry engine, console, or IDE tooling
|
|
4
|
+
title: ''
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
> ⚠️ **Never paste real PHI / patient data.** MessageFoundry processes HL7 in real
|
|
10
|
+
> deployments — use **synthetic** messages only (`messagefoundry generate ...`) and redact
|
|
11
|
+
> any IPs, hostnames, partner names, or message bodies before sharing. Security
|
|
12
|
+
> vulnerabilities should be reported privately, not here — see
|
|
13
|
+
> [SECURITY.md](../SECURITY.md).
|
|
14
|
+
|
|
15
|
+
**Describe the bug**
|
|
16
|
+
A clear and concise description of what the bug is.
|
|
17
|
+
|
|
18
|
+
**To reproduce**
|
|
19
|
+
Steps to reproduce the behavior — include the relevant config (Connection/Router/Handler) and a
|
|
20
|
+
**synthetic** sample message where applicable:
|
|
21
|
+
1. Configure '...'
|
|
22
|
+
2. Send / poll '...'
|
|
23
|
+
3. Observe '...'
|
|
24
|
+
|
|
25
|
+
**Expected behavior**
|
|
26
|
+
What you expected to happen.
|
|
27
|
+
|
|
28
|
+
**Actual behavior / logs**
|
|
29
|
+
What happened instead. Include the relevant log lines or stack trace (redact PHI and any
|
|
30
|
+
host/partner identifiers).
|
|
31
|
+
|
|
32
|
+
**Environment**
|
|
33
|
+
- MessageFoundry version: <!-- `messagefoundry --version` -->
|
|
34
|
+
- OS: <!-- e.g. Windows Server 2022 / Ubuntu 24.04 -->
|
|
35
|
+
- Python version: <!-- `python --version` -->
|
|
36
|
+
- Store backend: <!-- SQLite (default) / SQL Server (experimental) -->
|
|
37
|
+
- Component: <!-- engine / console / IDE extension -->
|
|
38
|
+
- Transport(s) involved: <!-- MLLP / file / database / REST / SOAP -->
|
|
39
|
+
|
|
40
|
+
**Additional context**
|
|
41
|
+
Anything else that helps — message type/trigger, whether it's reproducible, recent changes, etc.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Report a security vulnerability
|
|
4
|
+
url: https://github.com/wshallwshall/MessageFoundry/security/advisories/new
|
|
5
|
+
about: >-
|
|
6
|
+
Please report security issues PRIVATELY via a GitHub security advisory, not as a
|
|
7
|
+
public issue. See SECURITY.md for the disclosure policy and response timeline.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea or enhancement for MessageFoundry
|
|
4
|
+
title: ''
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
**Is your feature request related to a problem? Please describe.**
|
|
10
|
+
A clear and concise description of the problem. Ex. "When migrating from <engine> I need [...]"
|
|
11
|
+
|
|
12
|
+
**Describe the solution you'd like**
|
|
13
|
+
What you want to happen. If it's a new connector/transport, transform capability, or console/IDE
|
|
14
|
+
feature, say so.
|
|
15
|
+
|
|
16
|
+
**Area**
|
|
17
|
+
Which part of the system does this touch?
|
|
18
|
+
<!-- Connection/transport · Router/Handler · message store · API · console · IDE extension · docs -->
|
|
19
|
+
|
|
20
|
+
**Describe alternatives you've considered**
|
|
21
|
+
Any alternative solutions or workarounds you've considered.
|
|
22
|
+
|
|
23
|
+
**Additional context**
|
|
24
|
+
Add any other context, examples, or references (e.g. how Mirth/Corepoint/Rhapsody handle it).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<!-- Thanks for contributing to MessageFoundry! Please read CONTRIBUTING.md and GOVERNANCE.md first. -->
|
|
2
|
+
|
|
3
|
+
## What this changes
|
|
4
|
+
|
|
5
|
+
<!-- A short description of the change and the motivation. Link any related issue or ADR. -->
|
|
6
|
+
|
|
7
|
+
Closes #
|
|
8
|
+
|
|
9
|
+
## Type of change
|
|
10
|
+
|
|
11
|
+
- [ ] Bug fix (a test reproducing the bug is included)
|
|
12
|
+
- [ ] New Connection/transport or example Router/Handler
|
|
13
|
+
- [ ] Documentation
|
|
14
|
+
- [ ] Refactor / internal change
|
|
15
|
+
- [ ] Architecture change (an ADR under `docs/adr/` is included or linked)
|
|
16
|
+
|
|
17
|
+
## Checklist
|
|
18
|
+
|
|
19
|
+
- [ ] I have read [CONTRIBUTING.md](../CONTRIBUTING.md) and will agree to the [CLA](../CLA.md) (the bot records it).
|
|
20
|
+
- [ ] If this touches the reliability invariants, store/queue, staged pipeline, auth/RBAC, or the
|
|
21
|
+
code-first graph model, I **discussed it first** via an issue/ADR (see [GOVERNANCE.md](../GOVERNANCE.md)).
|
|
22
|
+
- [ ] **No real PHI or customer data** anywhere in the diff, tests, fixtures, screenshots, or commit
|
|
23
|
+
messages — synthetic HL7 only (`python -m messagefoundry generate`).
|
|
24
|
+
- [ ] Tests added/updated for new behavior.
|
|
25
|
+
- [ ] Gates pass locally: `ruff check .`, `ruff format --check .`, `mypy messagefoundry`, and
|
|
26
|
+
`pytest -q` (`QT_QPA_PLATFORM=offscreen` for console tests). `python -m messagefoundry check` is green.
|
|
27
|
+
- [ ] Uses **Connection / Router / Handler** vocabulary; no new declarative "channel" element; no
|
|
28
|
+
GUI/web-framework imports in the engine packages; no Black.
|
|
29
|
+
- [ ] Docs updated if behavior or configuration changed.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
MessageFoundry is an HL7 v2.x integration engine that handles **PHI**. We take security
|
|
4
|
+
reports seriously and appreciate responsible disclosure.
|
|
5
|
+
|
|
6
|
+
## Supported versions
|
|
7
|
+
|
|
8
|
+
The project is pre-1.0 and evolving rapidly; only the latest `main` is supported. Please
|
|
9
|
+
verify a report against current `main` before filing.
|
|
10
|
+
|
|
11
|
+
## Reporting a vulnerability
|
|
12
|
+
|
|
13
|
+
**Do not open a public issue for a vulnerability.** Instead, report it privately:
|
|
14
|
+
|
|
15
|
+
- Preferred: open a [GitHub private security advisory](https://github.com/wshallwshall/MessageFoundry/security/advisories/new)
|
|
16
|
+
("Report a vulnerability"), or
|
|
17
|
+
- Email the maintainer at the address on the GitHub profile.
|
|
18
|
+
|
|
19
|
+
Please include: affected component (e.g. MLLP/file transport, store, API/auth, console),
|
|
20
|
+
a description and impact, and reproduction steps or a proof of concept. Do **not** include
|
|
21
|
+
real PHI — use synthetic HL7 (the `messagefoundry generate` corpus is ideal).
|
|
22
|
+
|
|
23
|
+
We aim to acknowledge within a few business days and credit reporters who wish to be named once a
|
|
24
|
+
fix is released.
|
|
25
|
+
|
|
26
|
+
## Response & remediation timeline
|
|
27
|
+
|
|
28
|
+
After we acknowledge a report, we triage it by severity and target these remediation windows
|
|
29
|
+
(measured from triage; fixes are verified before a report is closed):
|
|
30
|
+
|
|
31
|
+
| Severity | Target to remediate |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Critical | ≤ 7 days |
|
|
34
|
+
| High | ≤ 30 days |
|
|
35
|
+
| Medium | ≤ 90 days |
|
|
36
|
+
| Low | Best-effort |
|
|
37
|
+
|
|
38
|
+
**Coordinated disclosure.** We practice coordinated disclosure: we ask that you give us a reasonable
|
|
39
|
+
window to ship a fix before any public detail, and we publish details (and credit, if wanted) **once
|
|
40
|
+
a fix is available**. We'll keep you updated on progress and agree the disclosure timing with you.
|
|
41
|
+
These windows trace to the project's Secure Development Standards (§4.4 RV.2, Appendix A.5).
|
|
42
|
+
|
|
43
|
+
## Scope notes
|
|
44
|
+
|
|
45
|
+
- The engine binds `127.0.0.1` by default and requires authentication; the documented threat
|
|
46
|
+
model and current posture live in [`docs/SECURITY.md`](../docs/SECURITY.md). Findings are
|
|
47
|
+
rated both for today's localhost posture and for a future network-exposed deployment.
|
|
48
|
+
- Configuration is **executed Python** (Routers/Handlers) from an admin-owned config directory;
|
|
49
|
+
the ability of a config author to run code in-process is by design, not a vulnerability — see
|
|
50
|
+
`docs/SECURITY.md` and `docs/SERVICE.md` for the trust boundary and required directory ACLs.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Dependabot: surface vulnerable / outdated dependencies and CI actions as PRs (CI-1 / DEP-1).
|
|
2
|
+
# Until a committed lockfile lands, this is the primary signal for a known-CVE dependency.
|
|
3
|
+
version: 2
|
|
4
|
+
updates:
|
|
5
|
+
- package-ecosystem: "pip"
|
|
6
|
+
directory: "/"
|
|
7
|
+
schedule:
|
|
8
|
+
interval: "weekly"
|
|
9
|
+
open-pull-requests-limit: 10
|
|
10
|
+
groups:
|
|
11
|
+
python-deps:
|
|
12
|
+
patterns: ["*"]
|
|
13
|
+
|
|
14
|
+
- package-ecosystem: "github-actions"
|
|
15
|
+
directory: "/"
|
|
16
|
+
schedule:
|
|
17
|
+
interval: "weekly"
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Throughput baseline (Gate #3 / WS-D) — on-demand only. Runs the reference sustainable-rate steps (the
|
|
2
|
+
# open-loop end-to-end throughput finder) on each store backend, plus the active-passive failover profile on
|
|
3
|
+
# the server-DB backends, on CI Linux + Docker PG/SQL Server containers (the reference config the
|
|
4
|
+
# TUNING-BASELINE doc names). Each job uploads its METRICS-ONLY report JSON (no message bodies / control
|
|
5
|
+
# ids — passes the publish forbidden-content guard); the numbers are transcribed into
|
|
6
|
+
# docs/benchmarks/TUNING-BASELINE.md + committed under docs/benchmarks/results/.
|
|
7
|
+
#
|
|
8
|
+
# Manual: `gh workflow run benchmark.yml --ref <branch>` (heavy + container-bound, so never on push/PR).
|
|
9
|
+
name: throughput-baseline
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
env:
|
|
18
|
+
# A modest, documented fan-out for the reference run (each inbound → a couple of outbound deliveries),
|
|
19
|
+
# so the run characterizes a fan-out estate without the co-located DB container being swamped (the
|
|
20
|
+
# delivery path — a fresh connection per delivery + a server-DB round-trip per stage — is the ceiling).
|
|
21
|
+
MEFOR_LOAD_FANOUT: "2"
|
|
22
|
+
MEFOR_LOAD_RESULTS_FANOUT: "1"
|
|
23
|
+
MEFOR_LOAD_TRANSFORM: edit
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
baseline-sqlite:
|
|
27
|
+
name: baseline (sqlite)
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
|
|
31
|
+
- name: Set up Python
|
|
32
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
33
|
+
with:
|
|
34
|
+
python-version: "3.13"
|
|
35
|
+
- name: Install project (dev)
|
|
36
|
+
run: |
|
|
37
|
+
python -m pip install --upgrade pip
|
|
38
|
+
pip install -e ".[dev]"
|
|
39
|
+
- name: Environment stamp
|
|
40
|
+
run: |
|
|
41
|
+
mkdir -p out/load
|
|
42
|
+
{ echo "## sqlite"; uname -a; python --version; python -c "import sqlite3,sys; print('sqlite', sqlite3.sqlite_version)"; git rev-parse HEAD; } | tee out/load/env-sqlite.txt
|
|
43
|
+
- name: Serve (SQLite) + reference rate-steps
|
|
44
|
+
env:
|
|
45
|
+
MEFOR_AUTH_ENABLED: "false"
|
|
46
|
+
MEFOR_LOAD_SINK_PORT: "2700"
|
|
47
|
+
run: |
|
|
48
|
+
set -o pipefail
|
|
49
|
+
python -m messagefoundry serve --config harness/config/load --env dev --db ./bench.db \
|
|
50
|
+
--host 127.0.0.1 --port 8765 > engine.log 2>&1 &
|
|
51
|
+
engine_pid=$!
|
|
52
|
+
for _ in $(seq 1 60); do curl -sf http://127.0.0.1:8765/health > /dev/null && break || sleep 0.5; done
|
|
53
|
+
set +e
|
|
54
|
+
python -m harness --load reference --engine http://127.0.0.1:8765 --sink-port 2700 \
|
|
55
|
+
--db-backend sqlite --report-json out/load/reference-sqlite.json --report-csv out/load/reference-sqlite.csv
|
|
56
|
+
set -e
|
|
57
|
+
kill "$engine_pid" 2>/dev/null || true
|
|
58
|
+
echo "===== engine log (tail) ====="; tail -40 engine.log || true
|
|
59
|
+
- name: Upload baseline report
|
|
60
|
+
if: always()
|
|
61
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
62
|
+
with:
|
|
63
|
+
name: baseline-sqlite
|
|
64
|
+
path: out/load/
|
|
65
|
+
if-no-files-found: ignore
|
|
66
|
+
|
|
67
|
+
baseline-postgres:
|
|
68
|
+
name: baseline (postgres)
|
|
69
|
+
runs-on: ubuntu-latest
|
|
70
|
+
services:
|
|
71
|
+
postgres:
|
|
72
|
+
image: postgres:16
|
|
73
|
+
env:
|
|
74
|
+
POSTGRES_PASSWORD: mefor
|
|
75
|
+
POSTGRES_DB: messagefoundry
|
|
76
|
+
ports:
|
|
77
|
+
- 5432:5432
|
|
78
|
+
options: >-
|
|
79
|
+
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
80
|
+
env:
|
|
81
|
+
MEFOR_STORE_BACKEND: postgres
|
|
82
|
+
MEFOR_STORE_SERVER: localhost
|
|
83
|
+
MEFOR_STORE_PORT: "5432"
|
|
84
|
+
MEFOR_STORE_DATABASE: messagefoundry
|
|
85
|
+
MEFOR_STORE_USERNAME: postgres
|
|
86
|
+
MEFOR_STORE_PASSWORD: mefor
|
|
87
|
+
MEFOR_STORE_POOL_SIZE: "5"
|
|
88
|
+
MEFOR_STORE_ENCRYPT: "false" # plaintext to the container; the TLS-hardening guard needs the escape
|
|
89
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
|
|
92
|
+
- name: Set up Python
|
|
93
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
94
|
+
with:
|
|
95
|
+
python-version: "3.13"
|
|
96
|
+
- name: Install project (dev + postgres)
|
|
97
|
+
run: |
|
|
98
|
+
python -m pip install --upgrade pip
|
|
99
|
+
pip install -e ".[dev,postgres]"
|
|
100
|
+
- name: Environment stamp
|
|
101
|
+
run: |
|
|
102
|
+
mkdir -p out/load
|
|
103
|
+
{ echo "## postgres"; uname -a; python --version; psql --version 2>/dev/null || echo "psql n/a"; git rev-parse HEAD; } | tee out/load/env-postgres.txt
|
|
104
|
+
- name: Serve (Postgres) + reference rate-steps
|
|
105
|
+
env:
|
|
106
|
+
MEFOR_AUTH_ENABLED: "false"
|
|
107
|
+
MEFOR_LOAD_SINK_PORT: "2700"
|
|
108
|
+
run: |
|
|
109
|
+
set -o pipefail
|
|
110
|
+
python -m messagefoundry serve --config harness/config/load --env dev \
|
|
111
|
+
--host 127.0.0.1 --port 8765 > engine.log 2>&1 &
|
|
112
|
+
engine_pid=$!
|
|
113
|
+
for _ in $(seq 1 60); do curl -sf http://127.0.0.1:8765/health > /dev/null && break || sleep 0.5; done
|
|
114
|
+
set +e
|
|
115
|
+
python -m harness --load reference --engine http://127.0.0.1:8765 --sink-port 2700 \
|
|
116
|
+
--db-backend postgres --report-json out/load/reference-postgres.json --report-csv out/load/reference-postgres.csv
|
|
117
|
+
set -e
|
|
118
|
+
kill "$engine_pid" 2>/dev/null || true
|
|
119
|
+
echo "===== engine log (tail) ====="; tail -40 engine.log || true
|
|
120
|
+
- name: Failover profile (two nodes, kill primary mid-load)
|
|
121
|
+
run: |
|
|
122
|
+
set +e
|
|
123
|
+
python -m harness --failover failover --db-backend postgres \
|
|
124
|
+
--report-json out/load/failover-postgres.json
|
|
125
|
+
echo "failover exit: $?"
|
|
126
|
+
set -e
|
|
127
|
+
- name: Upload baseline report
|
|
128
|
+
if: always()
|
|
129
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
130
|
+
with:
|
|
131
|
+
name: baseline-postgres
|
|
132
|
+
path: out/load/
|
|
133
|
+
if-no-files-found: ignore
|
|
134
|
+
|
|
135
|
+
baseline-sqlserver:
|
|
136
|
+
name: baseline (sqlserver)
|
|
137
|
+
runs-on: ubuntu-latest
|
|
138
|
+
services:
|
|
139
|
+
mssql:
|
|
140
|
+
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
141
|
+
env:
|
|
142
|
+
ACCEPT_EULA: "Y"
|
|
143
|
+
MSSQL_SA_PASSWORD: "Str0ng_P@ssw0rd!"
|
|
144
|
+
ports:
|
|
145
|
+
- 1433:1433
|
|
146
|
+
env:
|
|
147
|
+
MEFOR_STORE_BACKEND: sqlserver
|
|
148
|
+
MEFOR_STORE_SERVER: localhost
|
|
149
|
+
MEFOR_STORE_PORT: "1433"
|
|
150
|
+
MEFOR_STORE_DATABASE: MessageFoundry
|
|
151
|
+
MEFOR_STORE_AUTH: sql
|
|
152
|
+
MEFOR_STORE_USERNAME: sa
|
|
153
|
+
MEFOR_STORE_PASSWORD: "Str0ng_P@ssw0rd!"
|
|
154
|
+
MEFOR_STORE_POOL_SIZE: "5"
|
|
155
|
+
MEFOR_STORE_TRUST_SERVER_CERTIFICATE: "true"
|
|
156
|
+
MEFOR_ALLOW_INSECURE_TLS: "1"
|
|
157
|
+
steps:
|
|
158
|
+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
|
|
159
|
+
- name: Set up Python
|
|
160
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
161
|
+
with:
|
|
162
|
+
python-version: "3.13"
|
|
163
|
+
- name: Install Microsoft ODBC Driver 18 + sqlcmd
|
|
164
|
+
run: |
|
|
165
|
+
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc \
|
|
166
|
+
| sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
|
|
167
|
+
curl -fsSL "https://packages.microsoft.com/config/ubuntu/$(. /etc/os-release; echo "$VERSION_ID")/prod.list" \
|
|
168
|
+
| sudo tee /etc/apt/sources.list.d/mssql-release.list > /dev/null
|
|
169
|
+
sudo apt-get update
|
|
170
|
+
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 mssql-tools18 unixodbc-dev
|
|
171
|
+
- name: Wait for SQL Server and create the database (RCSI on)
|
|
172
|
+
run: |
|
|
173
|
+
sqlcmd=/opt/mssql-tools18/bin/sqlcmd
|
|
174
|
+
for i in $(seq 1 40); do
|
|
175
|
+
if "$sqlcmd" -S localhost -U sa -P 'Str0ng_P@ssw0rd!' -C -Q "SELECT 1" > /dev/null 2>&1; then echo "up"; break; fi
|
|
176
|
+
echo "waiting ($i)"; sleep 2
|
|
177
|
+
done
|
|
178
|
+
"$sqlcmd" -S localhost -U sa -P 'Str0ng_P@ssw0rd!' -C \
|
|
179
|
+
-Q "IF DB_ID('MessageFoundry') IS NULL CREATE DATABASE MessageFoundry; ALTER DATABASE MessageFoundry SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;"
|
|
180
|
+
- name: Install project (dev + sqlserver)
|
|
181
|
+
run: |
|
|
182
|
+
python -m pip install --upgrade pip
|
|
183
|
+
pip install -e ".[dev,sqlserver]"
|
|
184
|
+
- name: Environment stamp
|
|
185
|
+
run: |
|
|
186
|
+
mkdir -p out/load
|
|
187
|
+
{ echo "## sqlserver"; uname -a; python --version; git rev-parse HEAD; } | tee out/load/env-sqlserver.txt
|
|
188
|
+
- name: Serve (SQL Server) + reference rate-steps
|
|
189
|
+
env:
|
|
190
|
+
MEFOR_AUTH_ENABLED: "false"
|
|
191
|
+
MEFOR_LOAD_SINK_PORT: "2700"
|
|
192
|
+
run: |
|
|
193
|
+
set -o pipefail
|
|
194
|
+
python -m messagefoundry serve --config harness/config/load --env dev \
|
|
195
|
+
--host 127.0.0.1 --port 8765 > engine.log 2>&1 &
|
|
196
|
+
engine_pid=$!
|
|
197
|
+
for _ in $(seq 1 60); do curl -sf http://127.0.0.1:8765/health > /dev/null && break || sleep 0.5; done
|
|
198
|
+
set +e
|
|
199
|
+
python -m harness --load reference --engine http://127.0.0.1:8765 --sink-port 2700 \
|
|
200
|
+
--db-backend sqlserver --report-json out/load/reference-sqlserver.json --report-csv out/load/reference-sqlserver.csv
|
|
201
|
+
set -e
|
|
202
|
+
kill "$engine_pid" 2>/dev/null || true
|
|
203
|
+
echo "===== engine log (tail) ====="; tail -40 engine.log || true
|
|
204
|
+
- name: Failover profile (two nodes, kill primary mid-load)
|
|
205
|
+
run: |
|
|
206
|
+
set +e
|
|
207
|
+
python -m harness --failover failover --db-backend sqlserver \
|
|
208
|
+
--report-json out/load/failover-sqlserver.json
|
|
209
|
+
echo "failover exit: $?"
|
|
210
|
+
set -e
|
|
211
|
+
- name: Upload baseline report
|
|
212
|
+
if: always()
|
|
213
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
214
|
+
with:
|
|
215
|
+
name: baseline-sqlserver
|
|
216
|
+
path: out/load/
|
|
217
|
+
if-no-files-found: ignore
|