@zanii/health 0.1.2 → 0.1.3
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.
- package/README.md +2 -0
- package/dist/clinical.d.ts +269 -0
- package/dist/clinical.d.ts.map +1 -0
- package/dist/clinical.js +130 -0
- package/dist/clinical.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/src/clinical.ts +145 -0
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -111,6 +111,8 @@ enforce — we make **ignoring it undeniable**. A regulator can *require* review
|
|
|
111
111
|
signed — never that the treatment was *right*.
|
|
112
112
|
|
|
113
113
|
## Changelog
|
|
114
|
+
|
|
115
|
+
- **0.1.3** — FHIR `toFhirAuditEvent` export (no clinical content), AI medical-device change logs against the change-control plan (`deviceChange` / `changeControlReport`), clinical-trial `trialAuditTrail`, consent to AI-assisted care with `aiUseWithoutConsent`, `secondOpinion`, prescriptions with pharmacist checks, device-signed readings, `claimEvidence` for insurers, outbreak counts that hide each facility's number (on `@zanii/zk`) and secondary-use permits.
|
|
114
116
|
- **0.1.2** — now depends on `@zanii/core` 0.5 (protocol 1.2), so it shares one core with `@zanii/sdk` 0.5 instead of pulling in a second, older copy. No API change.
|
|
115
117
|
- **0.1.0** — initial release: `episodeSeed`/`episodeTag`/`episodeTags` (unlinkable per-episode identity), `buildAccessReceipt`, `buildRecommendation` (protocol required), `buildClinicianConfirmation`, `buildBreakGlass` + `pendingBreakGlass`/`markReviewed`, `protocolTrail` (**not** `ruleConsistency`), `fetchEpisodes`.
|
|
116
118
|
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* More clinical accountability: FHIR AuditEvent export, change logs for AI medical devices
|
|
3
|
+
* against their predetermined change-control plan, clinical-trial audit trails, consent to
|
|
4
|
+
* AI-assisted care, second opinions, prescription checks, device-signed readings, claim
|
|
5
|
+
* evidence without clinical content, outbreak counts that hide each facility's number, and
|
|
6
|
+
* secondary-use permits.
|
|
7
|
+
*
|
|
8
|
+
* Nothing here holds clinical content: episodes are pseudonymous tags and content stays as
|
|
9
|
+
* salted commitments. Regulatory names (FDA PCCP, ICH E6, EHDS) describe what each record
|
|
10
|
+
* supports, not a certification.
|
|
11
|
+
*/
|
|
12
|
+
import { type SignedObject } from '@zanii/core';
|
|
13
|
+
import { type Commitment } from '@zanii/zk';
|
|
14
|
+
type Payload = Record<string, unknown>;
|
|
15
|
+
/** A health payload as a FHIR AuditEvent resource (R4/R5 core fields) for an EHR's audit repository. */
|
|
16
|
+
export declare function toFhirAuditEvent(payload: Payload, episodeTag: string): {
|
|
17
|
+
extension: {
|
|
18
|
+
url: string;
|
|
19
|
+
valueString: string;
|
|
20
|
+
}[];
|
|
21
|
+
purposeOfEvent?: {
|
|
22
|
+
text: string;
|
|
23
|
+
}[] | undefined;
|
|
24
|
+
resourceType: string;
|
|
25
|
+
type: {
|
|
26
|
+
system: string;
|
|
27
|
+
code: string;
|
|
28
|
+
display: string;
|
|
29
|
+
};
|
|
30
|
+
action: string;
|
|
31
|
+
recorded: unknown;
|
|
32
|
+
agent: {
|
|
33
|
+
who: {
|
|
34
|
+
identifier: {
|
|
35
|
+
value: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
requestor: boolean;
|
|
39
|
+
}[];
|
|
40
|
+
source: {
|
|
41
|
+
observer: {
|
|
42
|
+
display: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
entity: {
|
|
46
|
+
what: {
|
|
47
|
+
identifier: {
|
|
48
|
+
value: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
description: string;
|
|
52
|
+
}[];
|
|
53
|
+
};
|
|
54
|
+
/** A change to an AI medical device, declared as inside or outside its predetermined change-control plan. */
|
|
55
|
+
export declare function deviceChange(input: {
|
|
56
|
+
device: string;
|
|
57
|
+
fromVersion: string;
|
|
58
|
+
toVersion: string;
|
|
59
|
+
description: string;
|
|
60
|
+
validationHash: string;
|
|
61
|
+
withinPlan: boolean;
|
|
62
|
+
ts: string;
|
|
63
|
+
}): {
|
|
64
|
+
target: string;
|
|
65
|
+
payload: {
|
|
66
|
+
device: string;
|
|
67
|
+
fromVersion: string;
|
|
68
|
+
toVersion: string;
|
|
69
|
+
description: string;
|
|
70
|
+
validationHash: string;
|
|
71
|
+
withinPlan: boolean;
|
|
72
|
+
ts: string;
|
|
73
|
+
_zr_kind: string;
|
|
74
|
+
_zr_domain: string;
|
|
75
|
+
v: number;
|
|
76
|
+
kind: string;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
/** Changes made outside the plan (which need their own submission) and changes with no validation evidence. */
|
|
80
|
+
export declare function changeControlReport(payloads: Payload[]): {
|
|
81
|
+
changes: number;
|
|
82
|
+
outsidePlan: unknown[];
|
|
83
|
+
unvalidated: unknown[];
|
|
84
|
+
};
|
|
85
|
+
/** A clinical-trial event for a pseudonymous participant (enrolment, dosing, adverse event, withdrawal). */
|
|
86
|
+
export declare function trialEvent(input: {
|
|
87
|
+
trial: string;
|
|
88
|
+
participantTag: string;
|
|
89
|
+
event: 'enrolment' | 'consent' | 'dose' | 'assessment' | 'adverse-event' | 'withdrawal';
|
|
90
|
+
detailsHash: string;
|
|
91
|
+
ts: string;
|
|
92
|
+
}): {
|
|
93
|
+
target: string;
|
|
94
|
+
subjectTag: string;
|
|
95
|
+
payload: {
|
|
96
|
+
trial: string;
|
|
97
|
+
participantTag: string;
|
|
98
|
+
event: "enrolment" | "consent" | "dose" | "assessment" | "adverse-event" | "withdrawal";
|
|
99
|
+
detailsHash: string;
|
|
100
|
+
ts: string;
|
|
101
|
+
_zr_kind: string;
|
|
102
|
+
v: number;
|
|
103
|
+
kind: string;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
/** Audit-trail checks per participant: consent before enrolment, nothing before enrolment, nothing after withdrawal. */
|
|
107
|
+
export declare function trialAuditTrail(payloads: Payload[]): {
|
|
108
|
+
participants: number;
|
|
109
|
+
ok: boolean;
|
|
110
|
+
issues: string[];
|
|
111
|
+
};
|
|
112
|
+
/** The patient's consent (or refusal) to AI-assisted care in an episode. */
|
|
113
|
+
export declare function aiCareConsent(input: {
|
|
114
|
+
episodeTag: string;
|
|
115
|
+
granted: boolean;
|
|
116
|
+
scope: string[];
|
|
117
|
+
ts: string;
|
|
118
|
+
}): {
|
|
119
|
+
target: string;
|
|
120
|
+
subjectTag: string;
|
|
121
|
+
payload: {
|
|
122
|
+
episodeTag: string;
|
|
123
|
+
granted: boolean;
|
|
124
|
+
scope: string[];
|
|
125
|
+
ts: string;
|
|
126
|
+
_zr_kind: string;
|
|
127
|
+
v: number;
|
|
128
|
+
kind: string;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
/** Were recommendations in an episode made only while AI consent was in force? */
|
|
132
|
+
export declare function aiUseWithoutConsent(payloads: Payload[], episodeTag: string): string[];
|
|
133
|
+
/** Two models (or a model and a clinician) on the same question: whether they agreed, with both commitments. */
|
|
134
|
+
export declare function secondOpinion(input: {
|
|
135
|
+
episodeTag: string;
|
|
136
|
+
first: {
|
|
137
|
+
by: string;
|
|
138
|
+
commitment: string;
|
|
139
|
+
};
|
|
140
|
+
second: {
|
|
141
|
+
by: string;
|
|
142
|
+
commitment: string;
|
|
143
|
+
};
|
|
144
|
+
agree: boolean;
|
|
145
|
+
ts: string;
|
|
146
|
+
}): {
|
|
147
|
+
target: string;
|
|
148
|
+
subjectTag: string;
|
|
149
|
+
risk: "medium" | "high";
|
|
150
|
+
payload: {
|
|
151
|
+
episodeTag: string;
|
|
152
|
+
first: {
|
|
153
|
+
by: string;
|
|
154
|
+
commitment: string;
|
|
155
|
+
};
|
|
156
|
+
second: {
|
|
157
|
+
by: string;
|
|
158
|
+
commitment: string;
|
|
159
|
+
};
|
|
160
|
+
agree: boolean;
|
|
161
|
+
ts: string;
|
|
162
|
+
_zr_kind: string;
|
|
163
|
+
v: number;
|
|
164
|
+
kind: string;
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
/** A prescription, marked when an AI suggested it, and the pharmacist's check. */
|
|
168
|
+
export declare function prescription(input: {
|
|
169
|
+
episodeTag: string;
|
|
170
|
+
rxId: string;
|
|
171
|
+
drugCode: string;
|
|
172
|
+
prescriber: string;
|
|
173
|
+
aiSuggested: boolean;
|
|
174
|
+
ts: string;
|
|
175
|
+
}): {
|
|
176
|
+
target: string;
|
|
177
|
+
subjectTag: string;
|
|
178
|
+
payload: {
|
|
179
|
+
episodeTag: string;
|
|
180
|
+
rxId: string;
|
|
181
|
+
drugCode: string;
|
|
182
|
+
prescriber: string;
|
|
183
|
+
aiSuggested: boolean;
|
|
184
|
+
ts: string;
|
|
185
|
+
_zr_kind: string;
|
|
186
|
+
v: number;
|
|
187
|
+
kind: string;
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
export declare function pharmacistCheck(input: {
|
|
191
|
+
episodeTag: string;
|
|
192
|
+
rxId: string;
|
|
193
|
+
pharmacist: string;
|
|
194
|
+
outcome: 'dispensed' | 'queried' | 'refused';
|
|
195
|
+
ts: string;
|
|
196
|
+
}): {
|
|
197
|
+
target: string;
|
|
198
|
+
subjectTag: string;
|
|
199
|
+
payload: {
|
|
200
|
+
episodeTag: string;
|
|
201
|
+
rxId: string;
|
|
202
|
+
pharmacist: string;
|
|
203
|
+
outcome: "dispensed" | "queried" | "refused";
|
|
204
|
+
ts: string;
|
|
205
|
+
_zr_kind: string;
|
|
206
|
+
v: number;
|
|
207
|
+
kind: string;
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
/** AI-suggested prescriptions that no pharmacist has checked. */
|
|
211
|
+
export declare function uncheckedAiPrescriptions(payloads: Payload[]): unknown[];
|
|
212
|
+
export type DeviceReading = SignedObject<{
|
|
213
|
+
v: 1;
|
|
214
|
+
type: 'health.device_reading';
|
|
215
|
+
episodeTag: string;
|
|
216
|
+
metric: string;
|
|
217
|
+
value: number;
|
|
218
|
+
unit: string;
|
|
219
|
+
ts: string;
|
|
220
|
+
}>;
|
|
221
|
+
/** A wearable or bedside device signs its own reading (the device key is the trust root). */
|
|
222
|
+
export declare function deviceReading(input: {
|
|
223
|
+
episodeTag: string;
|
|
224
|
+
metric: string;
|
|
225
|
+
value: number;
|
|
226
|
+
unit: string;
|
|
227
|
+
ts: string;
|
|
228
|
+
}, devicePrivateKey: Uint8Array): DeviceReading;
|
|
229
|
+
export declare function verifyDeviceReading(r: DeviceReading, trustedDevices: string[]): boolean;
|
|
230
|
+
/** For an insurer: what kind of care events happened in an episode, under which protocols. No clinical content. */
|
|
231
|
+
export declare function claimEvidence(payloads: Payload[]): {
|
|
232
|
+
events: number;
|
|
233
|
+
counts: Record<string, number>;
|
|
234
|
+
protocols: string[];
|
|
235
|
+
confirmedByClinician: boolean;
|
|
236
|
+
};
|
|
237
|
+
/** Each facility commits to its case count; the ministry learns the regional total, not any facility's number. */
|
|
238
|
+
export declare function facilityCaseCount(count: number): Commitment;
|
|
239
|
+
export declare function regionalTotal(commitments: string[], openings: Commitment['opening'][]): {
|
|
240
|
+
total: number;
|
|
241
|
+
verified: boolean;
|
|
242
|
+
};
|
|
243
|
+
export type SecondaryUsePermit = SignedObject<{
|
|
244
|
+
v: 1;
|
|
245
|
+
type: 'health.permit';
|
|
246
|
+
permit: string;
|
|
247
|
+
dataUser: string;
|
|
248
|
+
purposes: string[];
|
|
249
|
+
datasets: string[];
|
|
250
|
+
exp: string;
|
|
251
|
+
ts: string;
|
|
252
|
+
}>;
|
|
253
|
+
/** A data-access permit for secondary use (research, policy), issued by the health-data access body. */
|
|
254
|
+
export declare function secondaryUsePermit(input: {
|
|
255
|
+
permit: string;
|
|
256
|
+
dataUser: string;
|
|
257
|
+
purposes: string[];
|
|
258
|
+
datasets: string[];
|
|
259
|
+
exp: string;
|
|
260
|
+
ts?: string;
|
|
261
|
+
}, bodyPrivateKey: Uint8Array): SecondaryUsePermit;
|
|
262
|
+
export declare function secondaryUseAllowed(p: SecondaryUsePermit, access: {
|
|
263
|
+
dataUser: string;
|
|
264
|
+
purpose: string;
|
|
265
|
+
dataset: string;
|
|
266
|
+
ts: string;
|
|
267
|
+
}, trustedBodies: string[]): boolean;
|
|
268
|
+
export {};
|
|
269
|
+
//# sourceMappingURL=clinical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clinical.d.ts","sourceRoot":"","sources":["../src/clinical.ts"],"names":[],"mappings":"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"}
|
package/dist/clinical.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* More clinical accountability: FHIR AuditEvent export, change logs for AI medical devices
|
|
3
|
+
* against their predetermined change-control plan, clinical-trial audit trails, consent to
|
|
4
|
+
* AI-assisted care, second opinions, prescription checks, device-signed readings, claim
|
|
5
|
+
* evidence without clinical content, outbreak counts that hide each facility's number, and
|
|
6
|
+
* secondary-use permits.
|
|
7
|
+
*
|
|
8
|
+
* Nothing here holds clinical content: episodes are pseudonymous tags and content stays as
|
|
9
|
+
* salted commitments. Regulatory names (FDA PCCP, ICH E6, EHDS) describe what each record
|
|
10
|
+
* supports, not a certification.
|
|
11
|
+
*/
|
|
12
|
+
import { jcsHash, signObject, verifySignedObject } from '@zanii/core';
|
|
13
|
+
import { commit, sumOpenings, verifyAggregate } from '@zanii/zk';
|
|
14
|
+
/** A health payload as a FHIR AuditEvent resource (R4/R5 core fields) for an EHR's audit repository. */
|
|
15
|
+
export function toFhirAuditEvent(payload, episodeTag) {
|
|
16
|
+
const access = payload.kind === 'access' || payload.kind === 'break-glass';
|
|
17
|
+
return {
|
|
18
|
+
resourceType: 'AuditEvent',
|
|
19
|
+
type: { system: 'http://terminology.hl7.org/CodeSystem/audit-event-type', code: 'rest', display: 'RESTful Operation' },
|
|
20
|
+
action: access ? 'R' : 'E',
|
|
21
|
+
recorded: payload.ts,
|
|
22
|
+
agent: [{ who: { identifier: { value: String(payload.actor ?? payload.model_id ?? payload.clinician ?? 'unknown') } }, requestor: true }],
|
|
23
|
+
source: { observer: { display: 'Zanii transparency log' } },
|
|
24
|
+
entity: [{ what: { identifier: { value: episodeTag } }, description: String(payload.kind) }],
|
|
25
|
+
...(payload.purpose ? { purposeOfEvent: [{ text: String(payload.purpose) }] } : {}),
|
|
26
|
+
extension: [{ url: 'https://ledger.zanii.agency/fhir/receipt-payload', valueString: jcsHash(payload) }],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** A change to an AI medical device, declared as inside or outside its predetermined change-control plan. */
|
|
30
|
+
export function deviceChange(input) {
|
|
31
|
+
return { target: 'health.device.change', payload: { _zr_kind: 'health', _zr_domain: 'health', v: 1, kind: 'device-change', ...input } };
|
|
32
|
+
}
|
|
33
|
+
/** Changes made outside the plan (which need their own submission) and changes with no validation evidence. */
|
|
34
|
+
export function changeControlReport(payloads) {
|
|
35
|
+
const changes = payloads.filter((p) => p.kind === 'device-change');
|
|
36
|
+
return { changes: changes.length, outsidePlan: changes.filter((c) => !c.withinPlan).map((c) => c.toVersion), unvalidated: changes.filter((c) => !c.validationHash).map((c) => c.toVersion) };
|
|
37
|
+
}
|
|
38
|
+
/** A clinical-trial event for a pseudonymous participant (enrolment, dosing, adverse event, withdrawal). */
|
|
39
|
+
export function trialEvent(input) {
|
|
40
|
+
return { target: `health.trial.${input.event}`, subjectTag: input.participantTag, payload: { _zr_kind: 'health', v: 1, kind: 'trial', ...input } };
|
|
41
|
+
}
|
|
42
|
+
/** Audit-trail checks per participant: consent before enrolment, nothing before enrolment, nothing after withdrawal. */
|
|
43
|
+
export function trialAuditTrail(payloads) {
|
|
44
|
+
const issues = [];
|
|
45
|
+
const by = new Map();
|
|
46
|
+
for (const p of payloads.filter((x) => x.kind === 'trial'))
|
|
47
|
+
by.set(String(p.participantTag), [...(by.get(String(p.participantTag)) ?? []), p]);
|
|
48
|
+
for (const [tag, list] of by) {
|
|
49
|
+
const e = [...list].sort((a, b) => String(a.ts).localeCompare(String(b.ts)));
|
|
50
|
+
const at = (ev) => e.find((x) => x.event === ev)?.ts;
|
|
51
|
+
const consent = at('consent');
|
|
52
|
+
const enrol = at('enrolment');
|
|
53
|
+
const withdraw = at('withdrawal');
|
|
54
|
+
if (!consent || (enrol && consent > enrol))
|
|
55
|
+
issues.push(`${tag}: no consent before enrolment`);
|
|
56
|
+
for (const x of e) {
|
|
57
|
+
if (enrol && x.event !== 'consent' && x.event !== 'enrolment' && String(x.ts) < enrol)
|
|
58
|
+
issues.push(`${tag}: ${x.event} before enrolment`);
|
|
59
|
+
if (withdraw && x.event !== 'withdrawal' && String(x.ts) > withdraw)
|
|
60
|
+
issues.push(`${tag}: ${x.event} after withdrawal`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { participants: by.size, ok: issues.length === 0, issues };
|
|
64
|
+
}
|
|
65
|
+
/** The patient's consent (or refusal) to AI-assisted care in an episode. */
|
|
66
|
+
export function aiCareConsent(input) {
|
|
67
|
+
return { target: input.granted ? 'health.consent.ai.grant' : 'health.consent.ai.refuse', subjectTag: input.episodeTag, payload: { _zr_kind: 'health', v: 1, kind: 'ai-consent', ...input } };
|
|
68
|
+
}
|
|
69
|
+
/** Were recommendations in an episode made only while AI consent was in force? */
|
|
70
|
+
export function aiUseWithoutConsent(payloads, episodeTag) {
|
|
71
|
+
const events = payloads.filter((p) => (p.kind === 'ai-consent' && p.episodeTag === episodeTag) || p.kind === 'recommendation').sort((a, b) => String(a.ts).localeCompare(String(b.ts)));
|
|
72
|
+
let consent = false;
|
|
73
|
+
const bad = [];
|
|
74
|
+
for (const e of events) {
|
|
75
|
+
if (e.kind === 'ai-consent')
|
|
76
|
+
consent = !!e.granted;
|
|
77
|
+
else if (!consent)
|
|
78
|
+
bad.push(String(e.ts));
|
|
79
|
+
}
|
|
80
|
+
return bad;
|
|
81
|
+
}
|
|
82
|
+
/** Two models (or a model and a clinician) on the same question: whether they agreed, with both commitments. */
|
|
83
|
+
export function secondOpinion(input) {
|
|
84
|
+
return { target: 'health.second-opinion', subjectTag: input.episodeTag, risk: input.agree ? 'medium' : 'high', payload: { _zr_kind: 'health', v: 1, kind: 'second-opinion', ...input } };
|
|
85
|
+
}
|
|
86
|
+
/** A prescription, marked when an AI suggested it, and the pharmacist's check. */
|
|
87
|
+
export function prescription(input) {
|
|
88
|
+
return { target: 'health.rx.issue', subjectTag: input.episodeTag, payload: { _zr_kind: 'health', v: 1, kind: 'rx', ...input } };
|
|
89
|
+
}
|
|
90
|
+
export function pharmacistCheck(input) {
|
|
91
|
+
return { target: 'health.rx.check', subjectTag: input.episodeTag, payload: { _zr_kind: 'health', v: 1, kind: 'rx-check', ...input } };
|
|
92
|
+
}
|
|
93
|
+
/** AI-suggested prescriptions that no pharmacist has checked. */
|
|
94
|
+
export function uncheckedAiPrescriptions(payloads) {
|
|
95
|
+
const checked = new Set(payloads.filter((p) => p.kind === 'rx-check').map((p) => p.rxId));
|
|
96
|
+
return payloads.filter((p) => p.kind === 'rx' && p.aiSuggested && !checked.has(p.rxId)).map((p) => p.rxId);
|
|
97
|
+
}
|
|
98
|
+
/** A wearable or bedside device signs its own reading (the device key is the trust root). */
|
|
99
|
+
export function deviceReading(input, devicePrivateKey) {
|
|
100
|
+
if (!Number.isFinite(input.value))
|
|
101
|
+
throw new Error('health: reading must be finite');
|
|
102
|
+
return signObject({ v: 1, type: 'health.device_reading', ...input }, devicePrivateKey);
|
|
103
|
+
}
|
|
104
|
+
export function verifyDeviceReading(r, trustedDevices) {
|
|
105
|
+
return verifySignedObject(r) && trustedDevices.includes(r.signer);
|
|
106
|
+
}
|
|
107
|
+
/** For an insurer: what kind of care events happened in an episode, under which protocols. No clinical content. */
|
|
108
|
+
export function claimEvidence(payloads) {
|
|
109
|
+
const counts = {};
|
|
110
|
+
for (const p of payloads)
|
|
111
|
+
counts[String(p.kind)] = (counts[String(p.kind)] ?? 0) + 1;
|
|
112
|
+
const protocols = [...new Set(payloads.filter((p) => p.manifest_hash).map((p) => String(p.manifest_hash)))];
|
|
113
|
+
return { events: payloads.length, counts, protocols, confirmedByClinician: payloads.some((p) => p.kind === 'clinician-confirmation') };
|
|
114
|
+
}
|
|
115
|
+
/** Each facility commits to its case count; the ministry learns the regional total, not any facility's number. */
|
|
116
|
+
export function facilityCaseCount(count) {
|
|
117
|
+
return commit(count);
|
|
118
|
+
}
|
|
119
|
+
export function regionalTotal(commitments, openings) {
|
|
120
|
+
const total = sumOpenings(openings);
|
|
121
|
+
return { total: Number(total.value), verified: verifyAggregate(commitments, total) };
|
|
122
|
+
}
|
|
123
|
+
/** A data-access permit for secondary use (research, policy), issued by the health-data access body. */
|
|
124
|
+
export function secondaryUsePermit(input, bodyPrivateKey) {
|
|
125
|
+
return signObject({ v: 1, type: 'health.permit', ...input, ts: input.ts ?? new Date().toISOString() }, bodyPrivateKey);
|
|
126
|
+
}
|
|
127
|
+
export function secondaryUseAllowed(p, access, trustedBodies) {
|
|
128
|
+
return verifySignedObject(p) && trustedBodies.includes(p.signer) && p.dataUser === access.dataUser && p.purposes.includes(access.purpose) && p.datasets.includes(access.dataset) && access.ts <= p.exp;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=clinical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clinical.js","sourceRoot":"","sources":["../src/clinical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAmB,MAAM,WAAW,CAAC;AAIlF,wGAAwG;AACxG,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,UAAkB;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC;IAC3E,OAAO;QACL,YAAY,EAAE,YAAY;QAC1B,IAAI,EAAE,EAAE,MAAM,EAAE,wDAAwD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE;QACtH,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QAC1B,QAAQ,EAAE,OAAO,CAAC,EAAE;QACpB,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACzI,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,EAAE;QAC3D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,kDAAkD,EAAE,WAAW,EAAE,OAAO,CAAC,OAAgB,CAAC,EAAE,CAAC;KACjH,CAAC;AACJ,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,YAAY,CAAC,KAA+I;IAC1K,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AAC1I,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,mBAAmB,CAAC,QAAmB;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IACnE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AAC/L,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,UAAU,CAAC,KAA0K;IACnM,OAAO,EAAE,MAAM,EAAE,gBAAgB,KAAK,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AACrJ,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,eAAe,CAAC,QAAmB;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAI,GAAG,EAAqB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;QAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/I,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,EAAE,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,EAAwB,CAAC;QACnF,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,+BAA+B,CAAC,CAAC;QAC/F,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC;YAC1I,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,mBAAmB,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,KAA4E;IACxG,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,0BAA0B,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AAC/L,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,QAAmB,EAAE,UAAkB;IACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxL,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;aAC9C,IAAI,CAAC,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,aAAa,CAAC,KAAgJ;IAC5K,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,MAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AACjN,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,KAAmH;IAC9I,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AAClI,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAyH;IACvJ,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;AACxI,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,wBAAwB,CAAC,QAAmB;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1F,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7G,CAAC;AAID,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,KAAsF,EAAE,gBAA4B;IAChJ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACrF,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,CAAU,EAAE,IAAI,EAAE,uBAAgC,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAgB,EAAE,cAAwB;IAC5E,OAAO,kBAAkB,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,aAAa,CAAC,QAAmB;IAC/C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,EAAE,CAAC;AACzI,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAqB,EAAE,QAAiC;IACpF,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;AACvF,CAAC;AAID,wGAAwG;AACxG,MAAM,UAAU,kBAAkB,CAAC,KAA6G,EAAE,cAA0B;IAC1K,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,CAAU,EAAE,IAAI,EAAE,eAAwB,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC;AAC3I,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAqB,EAAE,MAA0E,EAAE,aAAuB;IAC5J,OAAO,kBAAkB,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;AACzM,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAsE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE1H,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAMjF;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,CAAC,CAAC;IACL,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAI3D;AAWD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAIjF;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,0FAA0F;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAepE;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG,aAAa,CAoB7E;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACpG,mBAAmB,EAAE,UAAU,GAC9B,aAAa,GAAG;IAAE,YAAY,EAAE,kBAAkB,CAAA;CAAE,CAkBtD;AAED,4EAA4E;AAC5E,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAIjG;AAED,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,mBAAmB,EAAE,UAAU,GAC9B,aAAa,GAAG;IAAE,YAAY,EAAE,kBAAkB,CAAA;CAAE,CAkBtD;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEpH;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAE1G;AAMD,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,wGAAwG;IACxG,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,CA0BrF;AAMD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IACtF,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAChF,OAAO,CAAC,cAAc,CAAC,CA2BzB;AACD,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zanii/health",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Medical audit trails without leaking the pattern: per-episode unlinkable tags (the patient supplies the tag, never the seed), plus who accessed the record, which model recommended what under which protocol, and which named clinician took responsibility. Break-glass is loud, not impossible.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://ledger.zanii.agency",
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"vitest": "^3.0.9"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@zanii/core": "^0.5.
|
|
34
|
+
"@zanii/core": "^0.5.4",
|
|
35
|
+
"@zanii/zk": "^0.1.0",
|
|
35
36
|
"@zanii/subject": "^0.1.2"
|
|
36
37
|
},
|
|
37
38
|
"scripts": {
|
package/src/clinical.ts
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* More clinical accountability: FHIR AuditEvent export, change logs for AI medical devices
|
|
3
|
+
* against their predetermined change-control plan, clinical-trial audit trails, consent to
|
|
4
|
+
* AI-assisted care, second opinions, prescription checks, device-signed readings, claim
|
|
5
|
+
* evidence without clinical content, outbreak counts that hide each facility's number, and
|
|
6
|
+
* secondary-use permits.
|
|
7
|
+
*
|
|
8
|
+
* Nothing here holds clinical content: episodes are pseudonymous tags and content stays as
|
|
9
|
+
* salted commitments. Regulatory names (FDA PCCP, ICH E6, EHDS) describe what each record
|
|
10
|
+
* supports, not a certification.
|
|
11
|
+
*/
|
|
12
|
+
import { jcsHash, signObject, verifySignedObject, type SignedObject } from '@zanii/core';
|
|
13
|
+
import { commit, sumOpenings, verifyAggregate, type Commitment } from '@zanii/zk';
|
|
14
|
+
|
|
15
|
+
type Payload = Record<string, unknown>;
|
|
16
|
+
|
|
17
|
+
/** A health payload as a FHIR AuditEvent resource (R4/R5 core fields) for an EHR's audit repository. */
|
|
18
|
+
export function toFhirAuditEvent(payload: Payload, episodeTag: string) {
|
|
19
|
+
const access = payload.kind === 'access' || payload.kind === 'break-glass';
|
|
20
|
+
return {
|
|
21
|
+
resourceType: 'AuditEvent',
|
|
22
|
+
type: { system: 'http://terminology.hl7.org/CodeSystem/audit-event-type', code: 'rest', display: 'RESTful Operation' },
|
|
23
|
+
action: access ? 'R' : 'E',
|
|
24
|
+
recorded: payload.ts,
|
|
25
|
+
agent: [{ who: { identifier: { value: String(payload.actor ?? payload.model_id ?? payload.clinician ?? 'unknown') } }, requestor: true }],
|
|
26
|
+
source: { observer: { display: 'Zanii transparency log' } },
|
|
27
|
+
entity: [{ what: { identifier: { value: episodeTag } }, description: String(payload.kind) }],
|
|
28
|
+
...(payload.purpose ? { purposeOfEvent: [{ text: String(payload.purpose) }] } : {}),
|
|
29
|
+
extension: [{ url: 'https://ledger.zanii.agency/fhir/receipt-payload', valueString: jcsHash(payload as never) }],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** A change to an AI medical device, declared as inside or outside its predetermined change-control plan. */
|
|
34
|
+
export function deviceChange(input: { device: string; fromVersion: string; toVersion: string; description: string; validationHash: string; withinPlan: boolean; ts: string }) {
|
|
35
|
+
return { target: 'health.device.change', payload: { _zr_kind: 'health', _zr_domain: 'health', v: 1, kind: 'device-change', ...input } };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Changes made outside the plan (which need their own submission) and changes with no validation evidence. */
|
|
39
|
+
export function changeControlReport(payloads: Payload[]) {
|
|
40
|
+
const changes = payloads.filter((p) => p.kind === 'device-change');
|
|
41
|
+
return { changes: changes.length, outsidePlan: changes.filter((c) => !c.withinPlan).map((c) => c.toVersion), unvalidated: changes.filter((c) => !c.validationHash).map((c) => c.toVersion) };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** A clinical-trial event for a pseudonymous participant (enrolment, dosing, adverse event, withdrawal). */
|
|
45
|
+
export function trialEvent(input: { trial: string; participantTag: string; event: 'enrolment' | 'consent' | 'dose' | 'assessment' | 'adverse-event' | 'withdrawal'; detailsHash: string; ts: string }) {
|
|
46
|
+
return { target: `health.trial.${input.event}`, subjectTag: input.participantTag, payload: { _zr_kind: 'health', v: 1, kind: 'trial', ...input } };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Audit-trail checks per participant: consent before enrolment, nothing before enrolment, nothing after withdrawal. */
|
|
50
|
+
export function trialAuditTrail(payloads: Payload[]) {
|
|
51
|
+
const issues: string[] = [];
|
|
52
|
+
const by = new Map<string, Payload[]>();
|
|
53
|
+
for (const p of payloads.filter((x) => x.kind === 'trial')) by.set(String(p.participantTag), [...(by.get(String(p.participantTag)) ?? []), p]);
|
|
54
|
+
for (const [tag, list] of by) {
|
|
55
|
+
const e = [...list].sort((a, b) => String(a.ts).localeCompare(String(b.ts)));
|
|
56
|
+
const at = (ev: string) => e.find((x) => x.event === ev)?.ts as string | undefined;
|
|
57
|
+
const consent = at('consent');
|
|
58
|
+
const enrol = at('enrolment');
|
|
59
|
+
const withdraw = at('withdrawal');
|
|
60
|
+
if (!consent || (enrol && consent > enrol)) issues.push(`${tag}: no consent before enrolment`);
|
|
61
|
+
for (const x of e) {
|
|
62
|
+
if (enrol && x.event !== 'consent' && x.event !== 'enrolment' && String(x.ts) < enrol) issues.push(`${tag}: ${x.event} before enrolment`);
|
|
63
|
+
if (withdraw && x.event !== 'withdrawal' && String(x.ts) > withdraw) issues.push(`${tag}: ${x.event} after withdrawal`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { participants: by.size, ok: issues.length === 0, issues };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The patient's consent (or refusal) to AI-assisted care in an episode. */
|
|
70
|
+
export function aiCareConsent(input: { episodeTag: string; granted: boolean; scope: string[]; ts: string }) {
|
|
71
|
+
return { target: input.granted ? 'health.consent.ai.grant' : 'health.consent.ai.refuse', subjectTag: input.episodeTag, payload: { _zr_kind: 'health', v: 1, kind: 'ai-consent', ...input } };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Were recommendations in an episode made only while AI consent was in force? */
|
|
75
|
+
export function aiUseWithoutConsent(payloads: Payload[], episodeTag: string) {
|
|
76
|
+
const events = payloads.filter((p) => (p.kind === 'ai-consent' && p.episodeTag === episodeTag) || p.kind === 'recommendation').sort((a, b) => String(a.ts).localeCompare(String(b.ts)));
|
|
77
|
+
let consent = false;
|
|
78
|
+
const bad: string[] = [];
|
|
79
|
+
for (const e of events) {
|
|
80
|
+
if (e.kind === 'ai-consent') consent = !!e.granted;
|
|
81
|
+
else if (!consent) bad.push(String(e.ts));
|
|
82
|
+
}
|
|
83
|
+
return bad;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Two models (or a model and a clinician) on the same question: whether they agreed, with both commitments. */
|
|
87
|
+
export function secondOpinion(input: { episodeTag: string; first: { by: string; commitment: string }; second: { by: string; commitment: string }; agree: boolean; ts: string }) {
|
|
88
|
+
return { target: 'health.second-opinion', subjectTag: input.episodeTag, risk: input.agree ? ('medium' as const) : ('high' as const), payload: { _zr_kind: 'health', v: 1, kind: 'second-opinion', ...input } };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A prescription, marked when an AI suggested it, and the pharmacist's check. */
|
|
92
|
+
export function prescription(input: { episodeTag: string; rxId: string; drugCode: string; prescriber: string; aiSuggested: boolean; ts: string }) {
|
|
93
|
+
return { target: 'health.rx.issue', subjectTag: input.episodeTag, payload: { _zr_kind: 'health', v: 1, kind: 'rx', ...input } };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function pharmacistCheck(input: { episodeTag: string; rxId: string; pharmacist: string; outcome: 'dispensed' | 'queried' | 'refused'; ts: string }) {
|
|
97
|
+
return { target: 'health.rx.check', subjectTag: input.episodeTag, payload: { _zr_kind: 'health', v: 1, kind: 'rx-check', ...input } };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** AI-suggested prescriptions that no pharmacist has checked. */
|
|
101
|
+
export function uncheckedAiPrescriptions(payloads: Payload[]) {
|
|
102
|
+
const checked = new Set(payloads.filter((p) => p.kind === 'rx-check').map((p) => p.rxId));
|
|
103
|
+
return payloads.filter((p) => p.kind === 'rx' && p.aiSuggested && !checked.has(p.rxId)).map((p) => p.rxId);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type DeviceReading = SignedObject<{ v: 1; type: 'health.device_reading'; episodeTag: string; metric: string; value: number; unit: string; ts: string }>;
|
|
107
|
+
|
|
108
|
+
/** A wearable or bedside device signs its own reading (the device key is the trust root). */
|
|
109
|
+
export function deviceReading(input: { episodeTag: string; metric: string; value: number; unit: string; ts: string }, devicePrivateKey: Uint8Array): DeviceReading {
|
|
110
|
+
if (!Number.isFinite(input.value)) throw new Error('health: reading must be finite');
|
|
111
|
+
return signObject({ v: 1 as const, type: 'health.device_reading' as const, ...input }, devicePrivateKey);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function verifyDeviceReading(r: DeviceReading, trustedDevices: string[]): boolean {
|
|
115
|
+
return verifySignedObject(r) && trustedDevices.includes(r.signer);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** For an insurer: what kind of care events happened in an episode, under which protocols. No clinical content. */
|
|
119
|
+
export function claimEvidence(payloads: Payload[]) {
|
|
120
|
+
const counts: Record<string, number> = {};
|
|
121
|
+
for (const p of payloads) counts[String(p.kind)] = (counts[String(p.kind)] ?? 0) + 1;
|
|
122
|
+
const protocols = [...new Set(payloads.filter((p) => p.manifest_hash).map((p) => String(p.manifest_hash)))];
|
|
123
|
+
return { events: payloads.length, counts, protocols, confirmedByClinician: payloads.some((p) => p.kind === 'clinician-confirmation') };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Each facility commits to its case count; the ministry learns the regional total, not any facility's number. */
|
|
127
|
+
export function facilityCaseCount(count: number): Commitment {
|
|
128
|
+
return commit(count);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function regionalTotal(commitments: string[], openings: Commitment['opening'][]) {
|
|
132
|
+
const total = sumOpenings(openings);
|
|
133
|
+
return { total: Number(total.value), verified: verifyAggregate(commitments, total) };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export type SecondaryUsePermit = SignedObject<{ v: 1; type: 'health.permit'; permit: string; dataUser: string; purposes: string[]; datasets: string[]; exp: string; ts: string }>;
|
|
137
|
+
|
|
138
|
+
/** A data-access permit for secondary use (research, policy), issued by the health-data access body. */
|
|
139
|
+
export function secondaryUsePermit(input: { permit: string; dataUser: string; purposes: string[]; datasets: string[]; exp: string; ts?: string }, bodyPrivateKey: Uint8Array): SecondaryUsePermit {
|
|
140
|
+
return signObject({ v: 1 as const, type: 'health.permit' as const, ...input, ts: input.ts ?? new Date().toISOString() }, bodyPrivateKey);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function secondaryUseAllowed(p: SecondaryUsePermit, access: { dataUser: string; purpose: string; dataset: string; ts: string }, trustedBodies: string[]): boolean {
|
|
144
|
+
return verifySignedObject(p) && trustedBodies.includes(p.signer) && p.dataUser === access.dataUser && p.purposes.includes(access.purpose) && p.datasets.includes(access.dataset) && access.ts <= p.exp;
|
|
145
|
+
}
|
package/src/index.ts
CHANGED