Files
memind/health-event-serialize.mjs
T
john 2baf29b3ae feat(health): complete P0 health channel — baseline engine, page-data, MindSpace UI
Deliver encrypted health zone, observation API, baseline maturity pipeline,
page-data bindings, and H5/WeChat channel integration for health P0.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-09 18:04:57 +08:00

59 lines
1.9 KiB
JavaScript

export function healthEventFingerprint(event = {}) {
return [
event.eventType,
event.ruleId ?? '',
event.metricType ?? '',
event.symptomCode ?? '',
].join('|');
}
export function mapPgHealthEventRow(row, userId) {
const parseJson = (value, fallback = []) => {
if (value == null) return fallback;
if (typeof value === 'object') return value;
try {
return JSON.parse(String(value));
} catch {
return fallback;
}
};
return {
id: Number(row.id),
userId: String(userId),
eventType: row.event_type,
severity: row.severity,
detectedAt: row.detected_at ? new Date(row.detected_at).getTime() : Date.now(),
ruleId: row.rule_id ?? null,
metricsInvolved: parseJson(row.metrics_involved),
evidenceObservationIds: parseJson(row.evidence_observation_ids),
agentSummary: row.agent_summary ?? null,
status: row.status ?? 'open',
message: row.agent_summary ?? null,
metricType: parseJson(row.metrics_involved)[0]?.metricType ?? null,
symptomCode: parseJson(row.metrics_involved)[0]?.symptomCode ?? null,
createdAt: row.created_at ? new Date(row.created_at).getTime() : Date.now(),
};
}
export function mapHealthEventToPgPayload(event, now = Date.now()) {
const metricsInvolved = [];
if (event.metricType) {
metricsInvolved.push({
metricType: event.metricType,
symptomCode: event.symptomCode ?? null,
value: event.value ?? null,
baselineMean: event.baselineMean ?? null,
});
}
return {
event_type: event.eventType,
severity: event.severity,
detected_at: new Date(event.createdAt ?? event.detectedAt ?? now).toISOString(),
rule_id: event.ruleId ?? null,
metrics_involved: JSON.stringify(metricsInvolved),
evidence_observation_ids: JSON.stringify(event.evidenceObservationIds ?? []),
agent_summary: event.message ?? event.agentSummary ?? null,
status: 'open',
};
}