clarion-shared-types 1.0.106 → 1.0.108

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.
Files changed (92) hide show
  1. package/dist/cjs/modules/gis/enums/routing.enum.js +30 -0
  2. package/dist/cjs/modules/gis/enums/routing.enum.js.map +1 -0
  3. package/dist/cjs/modules/gis/index.js +3 -0
  4. package/dist/cjs/modules/gis/index.js.map +1 -1
  5. package/dist/cjs/modules/gis/interfaces/routing.js +3 -0
  6. package/dist/cjs/modules/gis/interfaces/routing.js.map +1 -0
  7. package/dist/cjs/modules/gis/interfaces/trip-point.js +3 -0
  8. package/dist/cjs/modules/gis/interfaces/trip-point.js.map +1 -0
  9. package/dist/cjs/modules/incident/enums/incident-origin-type.enum.js +13 -0
  10. package/dist/cjs/modules/incident/enums/incident-origin-type.enum.js.map +1 -0
  11. package/dist/cjs/modules/incident/index.js +1 -0
  12. package/dist/cjs/modules/incident/index.js.map +1 -1
  13. package/dist/cjs/modules/permission/enums/permission-actions.enum.js +10 -0
  14. package/dist/cjs/modules/permission/enums/permission-actions.enum.js.map +1 -1
  15. package/dist/cjs/modules/permission/enums/permissions-moudule.enum.js +1 -0
  16. package/dist/cjs/modules/permission/enums/permissions-moudule.enum.js.map +1 -1
  17. package/dist/cjs/modules/role/constants/safety-roles.js +18 -1
  18. package/dist/cjs/modules/role/constants/safety-roles.js.map +1 -1
  19. package/dist/cjs/modules/safety/constants/follow-me.const.js +51 -0
  20. package/dist/cjs/modules/safety/constants/follow-me.const.js.map +1 -0
  21. package/dist/cjs/modules/safety/enums/follow-me.enums.js +238 -0
  22. package/dist/cjs/modules/safety/enums/follow-me.enums.js.map +1 -0
  23. package/dist/cjs/modules/safety/enums/safety-enums.js +3 -1
  24. package/dist/cjs/modules/safety/enums/safety-enums.js.map +1 -1
  25. package/dist/cjs/modules/safety/index.js +6 -0
  26. package/dist/cjs/modules/safety/index.js.map +1 -1
  27. package/dist/cjs/modules/safety/interfaces/follow-me.dto.js +3 -0
  28. package/dist/cjs/modules/safety/interfaces/follow-me.dto.js.map +1 -0
  29. package/dist/cjs/modules/safety/interfaces/safety-alert-context.js +3 -0
  30. package/dist/cjs/modules/safety/interfaces/safety-alert-context.js.map +1 -0
  31. package/dist/cjs/modules/safety/interfaces/safety-analytics.js +12 -0
  32. package/dist/cjs/modules/safety/interfaces/safety-analytics.js.map +1 -0
  33. package/dist/cjs/modules/safety/utils/follow-me-display.util.js +163 -0
  34. package/dist/cjs/modules/safety/utils/follow-me-display.util.js.map +1 -0
  35. package/dist/cjs/modules/safety/utils/safety-display.util.js +1 -0
  36. package/dist/cjs/modules/safety/utils/safety-display.util.js.map +1 -1
  37. package/dist/esm/modules/gis/enums/routing.enum.js +27 -0
  38. package/dist/esm/modules/gis/enums/routing.enum.js.map +1 -0
  39. package/dist/esm/modules/gis/index.js +3 -0
  40. package/dist/esm/modules/gis/index.js.map +1 -1
  41. package/dist/esm/modules/gis/interfaces/routing.js +2 -0
  42. package/dist/esm/modules/gis/interfaces/routing.js.map +1 -0
  43. package/dist/esm/modules/gis/interfaces/trip-point.js +2 -0
  44. package/dist/esm/modules/gis/interfaces/trip-point.js.map +1 -0
  45. package/dist/esm/modules/incident/enums/incident-origin-type.enum.js +10 -0
  46. package/dist/esm/modules/incident/enums/incident-origin-type.enum.js.map +1 -0
  47. package/dist/esm/modules/incident/index.js +1 -0
  48. package/dist/esm/modules/incident/index.js.map +1 -1
  49. package/dist/esm/modules/permission/enums/permission-actions.enum.js +10 -0
  50. package/dist/esm/modules/permission/enums/permission-actions.enum.js.map +1 -1
  51. package/dist/esm/modules/permission/enums/permissions-moudule.enum.js +1 -0
  52. package/dist/esm/modules/permission/enums/permissions-moudule.enum.js.map +1 -1
  53. package/dist/esm/modules/role/constants/safety-roles.js +17 -0
  54. package/dist/esm/modules/role/constants/safety-roles.js.map +1 -1
  55. package/dist/esm/modules/safety/constants/follow-me.const.js +48 -0
  56. package/dist/esm/modules/safety/constants/follow-me.const.js.map +1 -0
  57. package/dist/esm/modules/safety/enums/follow-me.enums.js +235 -0
  58. package/dist/esm/modules/safety/enums/follow-me.enums.js.map +1 -0
  59. package/dist/esm/modules/safety/enums/safety-enums.js +3 -1
  60. package/dist/esm/modules/safety/enums/safety-enums.js.map +1 -1
  61. package/dist/esm/modules/safety/index.js +6 -0
  62. package/dist/esm/modules/safety/index.js.map +1 -1
  63. package/dist/esm/modules/safety/interfaces/follow-me.dto.js +2 -0
  64. package/dist/esm/modules/safety/interfaces/follow-me.dto.js.map +1 -0
  65. package/dist/esm/modules/safety/interfaces/safety-alert-context.js +2 -0
  66. package/dist/esm/modules/safety/interfaces/safety-alert-context.js.map +1 -0
  67. package/dist/esm/modules/safety/interfaces/safety-analytics.js +11 -0
  68. package/dist/esm/modules/safety/interfaces/safety-analytics.js.map +1 -0
  69. package/dist/esm/modules/safety/utils/follow-me-display.util.js +155 -0
  70. package/dist/esm/modules/safety/utils/follow-me-display.util.js.map +1 -0
  71. package/dist/esm/modules/safety/utils/safety-display.util.js +1 -0
  72. package/dist/esm/modules/safety/utils/safety-display.util.js.map +1 -1
  73. package/dist/types/modules/gis/enums/routing.enum.d.ts +22 -0
  74. package/dist/types/modules/gis/index.d.ts +3 -0
  75. package/dist/types/modules/gis/interfaces/routing.d.ts +43 -0
  76. package/dist/types/modules/gis/interfaces/trip-point.d.ts +16 -0
  77. package/dist/types/modules/incident/enums/incident-origin-type.enum.d.ts +7 -0
  78. package/dist/types/modules/incident/index.d.ts +1 -0
  79. package/dist/types/modules/incident/intefaces/incident.d.ts +8 -0
  80. package/dist/types/modules/permission/enums/permission-actions.enum.d.ts +5 -0
  81. package/dist/types/modules/permission/enums/permissions-moudule.enum.d.ts +2 -1
  82. package/dist/types/modules/role/constants/safety-roles.d.ts +6 -0
  83. package/dist/types/modules/safety/constants/follow-me.const.d.ts +46 -0
  84. package/dist/types/modules/safety/enums/follow-me.enums.d.ts +218 -0
  85. package/dist/types/modules/safety/enums/safety-enums.d.ts +4 -2
  86. package/dist/types/modules/safety/index.d.ts +6 -0
  87. package/dist/types/modules/safety/interfaces/follow-me.dto.d.ts +392 -0
  88. package/dist/types/modules/safety/interfaces/safety-alert-context.d.ts +8 -0
  89. package/dist/types/modules/safety/interfaces/safety-analytics.d.ts +360 -0
  90. package/dist/types/modules/safety/interfaces/safety-check.dto.d.ts +5 -1
  91. package/dist/types/modules/safety/utils/follow-me-display.util.d.ts +27 -0
  92. package/package.json +45 -45
@@ -0,0 +1,392 @@
1
+ import { GuardianAudience } from '../../alert-dispatch/interfaces/guardian-audience';
2
+ import { GisRoutingProvider } from '../../gis/enums/routing.enum';
3
+ import { TripPoint } from '../../gis/interfaces/trip-point';
4
+ import { FollowMeAuditEventType, FollowMeEventType, FollowMeParticipantKind, FollowMeParticipantStatus, FollowMePromptStatus, FollowMeRealtimeEventType, FollowMeRouteKind, FollowMeSafetyEventType, FollowMeSafetyTrigger, FollowMeStatus, FollowMeTrackingHealth, FollowMeTransportMode, FollowMeWaypointKind } from '../enums/follow-me.enums';
5
+ import { SafetyCheckActorType, SafetyCheckSosTrigger } from '../enums/safety-enums';
6
+ import { SafetyCheckTripSummary } from './safety-check.dto';
7
+ /**
8
+ * Coordinates and address are null wherever the viewer may not see location (the
9
+ * admin detail without track access) - the label alone says "Home" or "Work".
10
+ */
11
+ export interface FollowMeWaypointView {
12
+ sequence: number;
13
+ kind: FollowMeWaypointKind;
14
+ label: string;
15
+ address: string | null;
16
+ lat: number | null;
17
+ lng: number | null;
18
+ savedPlaceId: string | null;
19
+ }
20
+ /** A computed route as the session stores it. */
21
+ export interface FollowMeRouteView {
22
+ id: string;
23
+ kind: FollowMeRouteKind;
24
+ provider: GisRoutingProvider;
25
+ transportMode: FollowMeTransportMode;
26
+ /** Null wherever the viewer may not see location. */
27
+ polyline: string | null;
28
+ distanceMeters: number;
29
+ durationSeconds: number;
30
+ staticDurationSeconds: number;
31
+ computedAt: string;
32
+ /** Why it was recalculated (deviation, ETA check...). Null for the original plan. */
33
+ reason: string | null;
34
+ warnings: string[];
35
+ }
36
+ /** The answer to a route preview; start references it by `routeToken`. */
37
+ export interface FollowMeRoutePreview {
38
+ routeToken: string;
39
+ expiresAt: string;
40
+ transportMode: FollowMeTransportMode;
41
+ waypoints: FollowMeWaypointView[];
42
+ provider: GisRoutingProvider;
43
+ polyline: string;
44
+ distanceMeters: number;
45
+ durationSeconds: number;
46
+ staticDurationSeconds: number;
47
+ etaAt: string;
48
+ /** The journey would outlast Follow Me's 24 h maximum. */
49
+ exceedsMaxDuration: boolean;
50
+ /** What the setup screen should pre-select (travel time plus a buffer, capped at 24 h). */
51
+ suggestedDurationMinutes: number;
52
+ warnings: string[];
53
+ }
54
+ export interface FollowMePromptView {
55
+ id: string;
56
+ trigger: FollowMeSafetyTrigger;
57
+ status: FollowMePromptStatus;
58
+ startedAt: string;
59
+ /** When the visible countdown ends. */
60
+ deadlineAt: string;
61
+ countdownSeconds: number;
62
+ respondedAt: string | null;
63
+ /** What the prompt screen says caused it, in plain words. */
64
+ message: string;
65
+ }
66
+ /** A participant as the SESSION OWNER sees them. */
67
+ export interface FollowMeParticipantView {
68
+ id: string;
69
+ kind: FollowMeParticipantKind;
70
+ status: FollowMeParticipantStatus;
71
+ guardianUserId: number | null;
72
+ displayName: string;
73
+ /** External guardians only, masked (+2547******78). */
74
+ maskedPhoneNumber: string | null;
75
+ invitedAt: string;
76
+ respondedAt: string | null;
77
+ /** Looked at the journey in the last minute. */
78
+ watchingNow: boolean;
79
+ }
80
+ /** The session as its OWNER sees it. Timestamps are server time; use serverTime for skew. */
81
+ export interface FollowMeSessionView {
82
+ id: string;
83
+ status: FollowMeStatus;
84
+ reasonId: string | null;
85
+ reasonCode: string | null;
86
+ reasonLabel: string;
87
+ customReason: string | null;
88
+ durationMinutes: number;
89
+ startedAt: string;
90
+ plannedEndAt: string;
91
+ endedAt: string | null;
92
+ arrivedAt: string | null;
93
+ promptCountdownSeconds: number;
94
+ notifyGuardiansOnStartEnd: boolean;
95
+ notifyServiceProviderRequested: boolean;
96
+ notifyServiceProviderAllowed: boolean;
97
+ transportMode: FollowMeTransportMode | null;
98
+ waypoints: FollowMeWaypointView[];
99
+ /** The route being monitored (the latest recalculation, else the plan). */
100
+ currentRoute: FollowMeRouteView | null;
101
+ /** Live estimate; null without a destination. */
102
+ etaAt: string | null;
103
+ distanceRemainingMeters: number | null;
104
+ trackingHealth: FollowMeTrackingHealth;
105
+ lastLocationAt: string | null;
106
+ crashDetectionEnabled: boolean;
107
+ activePrompt: FollowMePromptView | null;
108
+ participants: FollowMeParticipantView[];
109
+ sosTrigger: SafetyCheckSosTrigger | null;
110
+ sosCause: FollowMeSafetyTrigger | null;
111
+ sosTriggeredAt: string | null;
112
+ incidentId: number | null;
113
+ tripId: string | null;
114
+ conversationId: string | null;
115
+ serverTime: string;
116
+ }
117
+ export interface FollowMeCurrentResponse {
118
+ session: FollowMeSessionView | null;
119
+ serverTime: string;
120
+ }
121
+ /**
122
+ * The journey as a FOLLOWER sees it - an app guardian, an external guardian on the
123
+ * web page, or provider staff. Never includes guardians' contact details.
124
+ */
125
+ export interface FollowMeFollowerView {
126
+ sessionId: string;
127
+ status: FollowMeStatus;
128
+ owner: {
129
+ firstName: string;
130
+ userId: number | null;
131
+ };
132
+ reasonLabel: string;
133
+ startedAt: string;
134
+ plannedEndAt: string;
135
+ endedAt: string | null;
136
+ arrivedAt: string | null;
137
+ transportMode: FollowMeTransportMode | null;
138
+ waypoints: FollowMeWaypointView[];
139
+ currentRoute: Pick<FollowMeRouteView, 'polyline' | 'distanceMeters' | 'durationSeconds' | 'provider'> | null;
140
+ etaAt: string | null;
141
+ distanceRemainingMeters: number | null;
142
+ trackingHealth: FollowMeTrackingHealth;
143
+ /** Null once live access has ended, and for a caller who has not accepted. */
144
+ latestLocation: TripPoint | null;
145
+ /** Recent path (oldest first) since the `since` the caller sent; empty without live access. */
146
+ path: TripPoint[];
147
+ /** Pass as `since` next time. */
148
+ pathCursor: string | null;
149
+ /** Other followers: names and states for app guardians, a count on the web page. */
150
+ otherFollowers: {
151
+ displayName: string;
152
+ status: FollowMeParticipantStatus;
153
+ }[] | {
154
+ count: number;
155
+ };
156
+ providerParticipating: boolean;
157
+ activePromptTrigger: FollowMeSafetyTrigger | null;
158
+ incidentId: number | null;
159
+ myParticipation: {
160
+ participantId: string;
161
+ status: FollowMeParticipantStatus;
162
+ } | null;
163
+ /** App guardians who accepted: the session chat. */
164
+ conversationId: string | null;
165
+ serverTime: string;
166
+ }
167
+ /** Pending requests for an app guardian (checked after sign-in, not only on a push). */
168
+ export interface FollowMeRequestSummary {
169
+ sessionId: string;
170
+ participantId: string;
171
+ ownerFirstName: string;
172
+ reasonLabel: string;
173
+ status: FollowMeParticipantStatus;
174
+ invitedAt: string;
175
+ plannedEndAt: string;
176
+ }
177
+ /** What the setup screens need, so client and server agree. */
178
+ export interface FollowMeStartOptions {
179
+ limits: {
180
+ minDurationMinutes: number;
181
+ maxDurationMinutes: number;
182
+ minPromptCountdownSeconds: number;
183
+ maxPromptCountdownSeconds: number;
184
+ maxIntermediateStops: number;
185
+ customReasonMaxLength: number;
186
+ };
187
+ defaults: {
188
+ durationMinutes: number;
189
+ promptCountdownSeconds: number;
190
+ notifyServiceProvider: boolean;
191
+ notifyGuardiansOnStartEnd: boolean;
192
+ transportMode: FollowMeTransportMode;
193
+ };
194
+ tracking: {
195
+ locationIntervalSeconds: number;
196
+ distanceFilterMeters: number;
197
+ uploadIntervalSeconds: number;
198
+ };
199
+ crashDetection: Record<string, number | string | boolean> & {
200
+ enabledTransportModes: FollowMeTransportMode[];
201
+ };
202
+ serviceProvider: {
203
+ available: boolean;
204
+ tier: string | null;
205
+ degraded: boolean;
206
+ };
207
+ serverTime: string;
208
+ }
209
+ export interface FollowMeSafetyEventView {
210
+ id: string;
211
+ type: FollowMeSafetyEventType;
212
+ occurredAt: string;
213
+ promptId: string | null;
214
+ /** Metrics (distances, durations, confidence). Coordinates only for viewers allowed location. */
215
+ evidence: Record<string, unknown> | null;
216
+ }
217
+ export interface FollowMeAuditEntry {
218
+ id: string;
219
+ eventType: FollowMeAuditEventType;
220
+ fromStatus: FollowMeStatus | null;
221
+ toStatus: FollowMeStatus | null;
222
+ actorType: SafetyCheckActorType;
223
+ actorUserId: number | null;
224
+ metadata: Record<string, unknown> | null;
225
+ createdAt: string;
226
+ }
227
+ export interface FollowMeAdminListItem {
228
+ id: string;
229
+ status: FollowMeStatus;
230
+ userId: number;
231
+ userName: string | null;
232
+ organizationId: number;
233
+ controlCentreId: number | null;
234
+ reasonLabel: string;
235
+ durationMinutes: number;
236
+ startedAt: string;
237
+ plannedEndAt: string;
238
+ endedAt: string | null;
239
+ destinationLabel: string | null;
240
+ transportMode: FollowMeTransportMode | null;
241
+ providerParticipation: boolean;
242
+ sosTriggeredAt: string | null;
243
+ incidentId: number | null;
244
+ createdAt: string;
245
+ }
246
+ export interface FollowMeAdminDetail {
247
+ session: FollowMeSessionView & {
248
+ userId: number;
249
+ userName: string | null;
250
+ userPhoneNumber: string | null;
251
+ organizationId: number;
252
+ controlCentreId: number | null;
253
+ appId: string | null;
254
+ countryCode: string | null;
255
+ entitlementTierAtStart: string | null;
256
+ workflowId: string | null;
257
+ workflowStartedAt: string | null;
258
+ trackPointCount: number;
259
+ sosAttempts: number;
260
+ sosFailureReason: string | null;
261
+ createdAt: string;
262
+ updatedAt: string;
263
+ };
264
+ routes: FollowMeRouteView[];
265
+ prompts: FollowMePromptView[];
266
+ safetyEvents: FollowMeSafetyEventView[];
267
+ audit: FollowMeAuditEntry[];
268
+ trip: SafetyCheckTripSummary | null;
269
+ /**
270
+ * Whether this viewer may see where the user was: the session was shared with
271
+ * the provider or became an SOS, AND the gateway vouched for track:follow-me
272
+ * (SAFETY_LOCATION_ACCESS_HEADER). When false every coordinate, address and
273
+ * polyline in this response is null and GET .../tracking answers 403.
274
+ */
275
+ locationAccess: boolean;
276
+ }
277
+ /** GET /safety/admin/follow-me/:id/tracking - track:follow-me, provider-shared or SOS sessions only. */
278
+ export interface FollowMeAdminTracking {
279
+ sessionId: string;
280
+ status: FollowMeStatus;
281
+ waypoints: FollowMeWaypointView[];
282
+ routes: FollowMeRouteView[];
283
+ latestLocation: TripPoint | null;
284
+ /** Oldest first, after `since`; page with pathCursor. */
285
+ path: TripPoint[];
286
+ pathCursor: string | null;
287
+ /** Safety events with the coordinates they were observed at. */
288
+ safetyEvents: FollowMeSafetyEventView[];
289
+ trackingHealth: FollowMeTrackingHealth;
290
+ serverTime: string;
291
+ }
292
+ /** One active session on the staff live map (provider-shared, in the viewer's scope). */
293
+ export interface FollowMeLiveSession {
294
+ sessionId: string;
295
+ status: FollowMeStatus;
296
+ userId: number;
297
+ userName: string | null;
298
+ organizationId: number;
299
+ controlCentreId: number | null;
300
+ reasonLabel: string;
301
+ transportMode: FollowMeTransportMode | null;
302
+ destinationLabel: string | null;
303
+ etaAt: string | null;
304
+ trackingHealth: FollowMeTrackingHealth;
305
+ latestLocation: TripPoint | null;
306
+ activePromptTrigger: FollowMeSafetyTrigger | null;
307
+ startedAt: string;
308
+ }
309
+ /**
310
+ * Kafka payload of every KAFKA_TOPICS.FOLLOW_ME_* topic (outbox, at-least-once,
311
+ * keyed by session id). NO location and NO access token - an external guardian's
312
+ * link is minted by clarion-notification at send time through the internal
313
+ * access-link route.
314
+ */
315
+ export interface FollowMeEvent {
316
+ eventId: string;
317
+ eventType: FollowMeEventType;
318
+ version: 1;
319
+ occurredAt: string;
320
+ correlationId: string | null;
321
+ sessionId: string;
322
+ userId: number;
323
+ organizationId: number;
324
+ controlCentreId: number | null;
325
+ appId: string | null;
326
+ countryCode: string | null;
327
+ status: FollowMeStatus;
328
+ reasonLabel: string;
329
+ startedAt: string;
330
+ plannedEndAt: string;
331
+ endedAt: string | null;
332
+ destinationLabel: string | null;
333
+ etaAt: string | null;
334
+ notifyGuardiansOnStartEnd: boolean;
335
+ providerParticipation: boolean;
336
+ guardianAudience: GuardianAudience;
337
+ /** Everyone asked to follow, for invitations and endings. */
338
+ participants: {
339
+ participantId: string;
340
+ kind: FollowMeParticipantKind;
341
+ status: FollowMeParticipantStatus;
342
+ guardianUserId: number | null;
343
+ /** External guardians only (E.164), for the SMS. */
344
+ phoneNumber: string | null;
345
+ displayName: string;
346
+ }[];
347
+ /** GUARDIAN_RESPONDED: who answered, and how. */
348
+ respondingParticipantId: string | null;
349
+ promptId: string | null;
350
+ promptTrigger: FollowMeSafetyTrigger | null;
351
+ promptDeadlineAt: string | null;
352
+ sosTrigger: SafetyCheckSosTrigger | null;
353
+ sosCause: FollowMeSafetyTrigger | null;
354
+ incidentId: number | null;
355
+ }
356
+ /**
357
+ * What clarion-safety publishes on SAFETY_REALTIME_CHANNEL. `rooms` is decided by
358
+ * clarion-safety from the session's CURRENT audience each time, so a guardian who
359
+ * stops following or a session that ends stops receiving at once. clarion-socket
360
+ * validates the rooms and emits SAFETY_SOCKET_EVENT with the envelope minus rooms.
361
+ */
362
+ export interface FollowMeRealtimeEnvelope {
363
+ eventId: string;
364
+ feature: 'FOLLOW_ME';
365
+ type: FollowMeRealtimeEventType;
366
+ sessionId: string;
367
+ organizationId: number;
368
+ occurredAt: string;
369
+ rooms: string[];
370
+ payload: Record<string, unknown>;
371
+ }
372
+ /** The internal access-link answer (clarion-safety -> clarion-notification only). */
373
+ export interface FollowMeExternalLink {
374
+ url: string;
375
+ expiresAt: string;
376
+ }
377
+ /** Filters for GET /safety/admin/follow-me (mirrors FollowMeAdminQueryDto). */
378
+ export interface FollowMeAdminQuery {
379
+ page?: number;
380
+ limit?: number;
381
+ status?: FollowMeStatus;
382
+ activeOnly?: boolean;
383
+ /** Super-admin only. */
384
+ organizationId?: number;
385
+ userId?: number;
386
+ sosOnly?: boolean;
387
+ providerParticipation?: boolean;
388
+ from?: string;
389
+ to?: string;
390
+ id?: string;
391
+ sortBy?: 'startedAt' | 'createdAt';
392
+ }
@@ -0,0 +1,8 @@
1
+ /** See SafetyAlertContextDto: why a safety feature raised an SOS, as labelled facts. */
2
+ export interface SafetyAlertContext {
3
+ summary: string;
4
+ facts: {
5
+ label: string;
6
+ value: string;
7
+ }[];
8
+ }