Bundled plugins
These core plugins live in the repository under external-plugins/, are loaded from
TypeScript source, and ship inside the API image (they are not published to the
registry). They form the layered clinical foundation the demos build on (see
Architecture for the layering
rationale). Each row of a contributions table is a fact from the plugin's plugin.yaml.
On a running instance, the console's Plugins page shows the events, contributions and
manifest of each loaded plugin (see
Inspect loaded plugins).
@posos/common
The most classic non-clinical building blocks, shared by every business plugin.
| Contribution | Items |
|---|---|
| context kinds | patient, encounter, order, document |
| types | Coding, CodeableConcept, Quantity, Period, Annotation, Reference, ValidationDecision |
| value-sets | decision-outcome |
| dimensions | dimensionless, fraction, mass, volume, time, amount-of-substance, mass-concentration, molar-concentration, pressure, temperature (the common physical dimensions; the core declares none) |
| events | CommunicationReceived (context patient, encounter optional, default filter event.sender != "meridian") |
| nodes | trigger.communication-received (references CommunicationReceived), text.join, transform.list, transform.expression, transform.datetime, human.approve (accept / reject), human.choose (one output per option); both validation nodes designate an optional connection of the validation port |
Everything domain-specific — including these classics and the context kinds themselves — is a plugin contribution; the engine itself holds only primitives and the meta type system.
@posos/clinical
dependsOn: @posos/common
The general-purpose clinical foundation, independent of any specific use case: core
FHIR resources, the classic clinical events and their triggers, and the generic patient-record read/write
and human-validation nodes. It owns the patient and prescription port contracts
(@posos/clinical/ports, typed on the DPI model in @posos/clinical/domain) and ships
their reference in-memory adapters (dev/demo, zero infra, seeded from the instance
config) and their simulation sandboxes. Use-case-specific computations live
elsewhere (e.g. in the example plugins).
| Contribution | Items |
|---|---|
| types | ReferenceRange, Observation, Condition, MedicationStatement, Allergy, Procedure, Prescription, Demographics, DrugAlert, DrugInteraction, AdverseEffect, CalculationResult |
| value-sets | administrative-gender, observation-status, condition-clinical, condition-verification, alert-type, interaction-severity, incidence, allergy-criticality, procedure-status, medication-status, time-horizon |
| dimensions | filtration-rate |
| conversions | Prescription → Annotation |
| adapters | patient:in-memory (declared record port of the patient context kind, record: { contextKind: patient }), prescription:in-memory |
| port sandboxes | patient, prescription |
| events | BioResultReceived, CriticalResultReceived, DischargePrescriptionEdited, MedicationPrescribed, MedicationDiscontinued, MedicationAdministered, ProcedureScheduled, PatientAdmitted, PatientDischarged, PatientTransferred, AllergyRecorded, ConditionRecorded |
triggers (one per event, each referencing it with event:) |
bio-result-received, critical-result-received, discharge-prescription-edited, medication-prescribed, medication-discontinued, medication-administered, procedure-scheduled, patient-admitted, patient-discharged, patient-transferred, allergy-recorded, condition-recorded (discharge-prescription-edited and the three patient-* triggers are declarative, the others coded) |
| record nodes | patient.load-* (demographics, medications, conditions, allergies, procedures, observations), patient.update-demographics, patient.append-* (observation, condition, allergy, procedure, medication), order.load-prescription, order.record-reconciliation |
| human tasks | human.confirm-condition, human.acknowledge-critical |
@posos/fhir
dependsOn: @posos/clinical, @posos/common
Connects an existing FHIR R4 warehouse (tested with Blaze + Synthea) to the patient and
prescription ports. Demonstrates port-adapter contribution: switch the target system
without touching the engine or the workflows.
| Contribution | Items |
|---|---|
| adapters | patient:fhir (declared record port of the patient context kind), prescription:fhir |
| event sources | fhir-poll |
| event bindings | fhir-creatinine, fhir-medication-prescribed, fhir-procedure-scheduled, fhir-patient-admitted, fhir-patient-discharged, fhir-allergy-recorded, fhir-communication-received, fhir-condition-recorded, fhir-validation-decided |
The event bindings produce events that @posos/clinical and @posos/common declare
(fhir-creatinine → BioResultReceived, fhir-communication-received →
CommunicationReceived…); the host checks each against the event's contract at load.
The fhir-validation-decided binding is the resolve-mode binding described in
ADR 0002.
@posos/hl7
Receives and processes HL7 v2 ER7 messages and CDA R2 documents. HTTP and directory reception are provided by the host; the plugin adds MLLP and the protocol-specific identity, parsing, acknowledgement, mapping, and CDA logic.
| Contribution | Items |
|---|---|
| protocols | hl7v2, cda |
| transports | mllp for HL7 v2 (proposed port 2575, hint on acknowledgement modes); host HTTP and directory for both protocols |
| media types | application/hl7-v2, text/plain and an example message for HL7 v2; application/xml, text/xml for CDA R2 |
| triggers | trigger.hl7v2-received, trigger.cda-received |
| HL7 nodes | hl7v2.parse, hl7v2.extract, hl7v2.serialize, hl7v2.map |
| CDA nodes | cda.parse, hl7v2.extract-cda |
| message bindings | ADT admission, discharge and transfer; ORU numeric and critical results; OMP prescriptions and discontinuations; RDE validated prescriptions; RAS administrations |
The CDA parser extracts metadata, narrative sections, embedded PDF attachments, and external references without downloading them. It does not validate XSD or CI-SIS Schematron profiles. See Process a CDA R2 document.
The message bindings produce events that @posos/clinical declares; their require
is checked against those contracts at load. The ORU bindings map known LOINC codes to
analyte keys and convert their values to a reference unit per analyte. Binding options and emission rules are described in
Connect an EAI.
@posos/pn13
Receives and processes PN13 SIPhII XML through host HTTP or directory connections. Its optional XSD profile validates a receipt before any workflow or message binding receives it.
| Contribution | Items |
|---|---|
| protocol | pn13 |
| media types | application/xml, text/xml, and an example message |
| trigger | trigger.pn13-received |
| nodes | pn13.parse, pn13.extract, pn13.map |
| message binding | SIPhII medication prescription → MedicationPrescribed |
| validation profile | pn13-is-4.0.34 |
Rejected XSD receipts stay in the durable inbox with a structured report that contains line and element diagnostics without XML values. See Connect an EAI and Map an HL7 or PN13 message.
@posos/llm
The LLM agent runner (Anthropic + OpenAI-compatible APIs) — an adapter for the
agent port, selected by the instance manifest (ports.agent = { adapter: llm }). Keys
via environment variables.
| Contribution | Items |
|---|---|
| adapters | agent:llm |
@posos/notify
Outbound notification delivery — it owns the notification port contract
(@posos/notify/ports) and ships the notify.send node, its console and webhook
adapters and the simulation sandbox. A channel is an adapter of the port that requires a
connection type; notify.send designates a connection of such a type, else it uses the
port bound by the instance (ports.notification). Distinct from the record trail
(writing a FHIR Communication through the patient port): here we alert humans through a
channel, we do not write clinical data. See
Send notifications.
| Contribution | Items |
|---|---|
| nodes | notify.send (connection by port notification) |
| value-sets | notification-severity |
| connection types | notification-webhook |
| adapters | notification:console, notification:webhook (connection notification-webhook) |
| port sandboxes | notification |
@posos/slack
Slack channel of the notification and validation ports, through the Web API with the
bot token of a Slack app. A validation request is posted with buttons; clicks come back
through a Socket Mode listening connection (see
Decide validations in Slack).
Depends on @posos/notify.
| Contribution | Items |
|---|---|
| connection types | slack (auth bearer, bot token; params defaultChannel, patientContext), slack-app (auth bearer, app-level token), slack-socket (inbound, format validation-decision, connection slack-app) |
| adapters | notification:slack, validation:slack (connection slack) |
@posos/mail
Mail channel of the notification port: sends each notification through an SMTP server
(nodemailer). The smtp connection type accepts smtp:// and smtps:// URLs and gives
its credential to the plugin (exposeCredentials). Depends on @posos/notify.
| Contribution | Items |
|---|---|
| connection types | smtp (auth none, basic; params from, defaultTo, requireTls, patientContext) |
| adapters | notification:mail (connection smtp) |
@posos/decision
Decision models — the Décision intelligente node (decision.ask,
category Agents IA) asks typed questions (yes/no, choice, score) about a state.
It owns the neutral decision port contract (@posos/decision/ports) and
ships its simulation sandbox, which answers without calling a provider; it ships
no adapter. The node designates its connection (connection by port decision), else it
uses the port bound by the instance. The node's configuration and ports are declared in its manifest
(config[].schema, derivedPorts). See
Ask a decision model typed questions.
| Contribution | Items |
|---|---|
| nodes | decision.ask (connection by port decision) |
| port sandboxes | decision |
@posos/typesafe
The typesafe adapter of the decision port (depends on @posos/decision):
POST {baseUrl}/v1/systemone, the System One API of TypeSafe (model Jev), or any
compatible server, through a connection of type typesafe-systemone (one connection per
server). Selected by the instance manifest (ports.decision = { adapter: typesafe }) or
by the connection a decision.ask node designates.
| Contribution | Items |
|---|---|
| connection types | typesafe-systemone (auth bearer, none, header; param defaultModel, default jev-latest) |
| adapters | decision:typesafe (connection typesafe-systemone) |
@posos/snomed
Contributes the terminology resolver for the snomed-ct code system
(Hermes). Selected via the instance manifest
(terminology.snomed-ct = { adapter: hermes }); the resolver reaches the server
through a connection of type hermes (parameter languageRefsetId: display language
by language reference set). See Configure terminology.
| Contribution | Items |
|---|---|
| nodes | snomed.verify-concept, snomed.preferred-term, snomed.subsumes |
| value-sets | snomed-ct (external) |
| adapters | terminology:hermes |
| connection types | hermes |