evo360-types 1.3.578 → 1.3.581

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 (33) hide show
  1. package/dist/apps/evo-chat/channel/zod-schemas.d.ts +273 -0
  2. package/dist/apps/evo-chat/channel/zod-schemas.js +17 -1
  3. package/dist/apps/evo-chat/channel/zod-schemas.ts +19 -0
  4. package/dist/apps/evo-chat/thread-message/zod-schemas.d.ts +24 -0
  5. package/dist/apps/evo-chat/thread-message/zod-schemas.js +2 -0
  6. package/dist/apps/evo-chat/thread-message/zod-schemas.ts +2 -0
  7. package/dist/apps/evo-chat/waba-template/zod-schemas.d.ts +6 -0
  8. package/dist/apps/evo-chat/waba-template/zod-schemas.js +2 -0
  9. package/dist/apps/evo-chat/waba-template/zod-schemas.ts +2 -0
  10. package/dist/apps/evo-med/calendar/zod-schemas.d.ts +3996 -1572
  11. package/dist/apps/evo-med/calendar/zod-schemas.js +9 -0
  12. package/dist/apps/evo-med/calendar/zod-schemas.ts +9 -0
  13. package/dist/apps/evo-notifications/zod-schemas.d.ts +110 -0
  14. package/dist/apps/evo-notifications/zod-schemas.js +8 -1
  15. package/dist/apps/evo-notifications/zod-schemas.ts +9 -0
  16. package/dist/apps/evo-telemedicine/zod-schemas.d.ts +30 -4
  17. package/dist/apps/evo-telemedicine/zod-schemas.js +25 -2
  18. package/dist/apps/evo-telemedicine/zod-schemas.ts +25 -0
  19. package/dist/types/evo-chat/channel/index.d.ts +19 -0
  20. package/dist/types/evo-chat/channel/index.ts +24 -0
  21. package/dist/types/evo-chat/thread-message/index.d.ts +4 -0
  22. package/dist/types/evo-chat/thread-message/index.ts +4 -0
  23. package/dist/types/evo-chat/waba-template/index.d.ts +6 -0
  24. package/dist/types/evo-chat/waba-template/index.js +3 -1
  25. package/dist/types/evo-chat/waba-template/index.ts +7 -0
  26. package/dist/types/evo-med/calendar/index.d.ts +26 -1
  27. package/dist/types/evo-med/calendar/index.ts +27 -1
  28. package/dist/types/evo-notifications/index.d.ts +11 -0
  29. package/dist/types/evo-notifications/index.ts +13 -0
  30. package/dist/types/evo-telemedicine/index.d.ts +168 -0
  31. package/dist/types/evo-telemedicine/index.js +43 -1
  32. package/dist/types/evo-telemedicine/index.ts +196 -1
  33. package/package.json +1 -1
@@ -1,6 +1,9 @@
1
1
  export * from "./fb_collections";
2
2
  import type { IFireDoc, IFireGlobalDoc } from "../shared";
3
3
  import type { ITenantModuleEntitlement } from "../evo-tenant";
4
+ // feat-160 F15/F16 — a política da sala é projeção do `calendar.virtual_care`:
5
+ // o MODO de gravação é o mesmo tipo dos dois lados, de propósito.
6
+ import type { VirtualCareRecordingMode } from "../evo-med/calendar";
4
7
 
5
8
  // ======================================================
6
9
  // evo-telemedicine (feat-160 — Telemedicina integrada)
@@ -325,8 +328,22 @@ export const TeleconsultationEventTypeEnum = {
325
328
  RecordingConsentRequested: "recording.consent_requested",
326
329
  RecordingConsentAccepted: "recording.consent_accepted",
327
330
  RecordingConsentDeclined: "recording.consent_declined",
331
+ /**
332
+ * feat-160 F15 — o paciente RECUSOU a gravação automática ANTES de entrar.
333
+ * Não é `recording.consent_declined`: aquela é a recusa de uma solicitação
334
+ * feita em sala (a consulta segue sem gravar); esta IMPEDE a entrada, porque
335
+ * em `auto_*` o aceite é condição do join (D21).
336
+ */
337
+ RecordingConsentDeclinedPreJoin: "recording.consent_declined_pre_join",
328
338
  RecordingConsentWithdrawn: "recording.consent_withdrawn",
329
339
  RecordingStarted: "recording.started",
340
+ /**
341
+ * feat-160 F15 — gravação iniciada pela POLÍTICA da agenda (`auto_audio`/
342
+ * `auto_video`), não por comando do médico. Trilha própria porque
343
+ * `recording.started` sem um `recording.consent_requested` antes pareceria
344
+ * gravação sem solicitação na auditoria.
345
+ */
346
+ RecordingAutoStarted: "recording.auto_started",
330
347
  RecordingStopped: "recording.stopped",
331
348
  RecordingFailed: "recording.failed",
332
349
  TranscriptionQueued: "transcription.queued",
@@ -336,6 +353,15 @@ export const TeleconsultationEventTypeEnum = {
336
353
  ConsultationStarted: "consultation.started",
337
354
  ConsultationReconnecting: "consultation.reconnecting",
338
355
  ConsultationEnded: "consultation.ended",
356
+ /**
357
+ * feat-160 F18 — consulta encerrada e MEDIDA como "não contada" (paciente
358
+ * não atendeu, sem gravação elegível, franquia). Existe porque
359
+ * `usage_metered_at` é carimbado nos DOIS casos: sem este evento a
360
+ * reconciliação "quantas `ended` carimbadas × quantas linhas no BigQuery"
361
+ * acusaria diferença em toda consulta não contada, indistinguível de evento
362
+ * perdido.
363
+ */
364
+ UsageSkipped: "teleconsultation.usage_skipped",
339
365
  ArtifactAccessed: "artifact.accessed",
340
366
  ArtifactDeleted: "artifact.deleted",
341
367
  EntitlementDenied: "entitlement.denied",
@@ -965,6 +991,58 @@ export interface IRoomRecordingStateDto {
965
991
  terms_version?: string;
966
992
  /** Código estável, sem PII, quando `status === 'failed'`. */
967
993
  failure_code?: string;
994
+ /** feat-160 F15 — presente só nos modos `auto_*` (aviso pré-join). */
995
+ auto?: IRoomRecordingAutoDto;
996
+ }
997
+
998
+ /**
999
+ * feat-160 F15 — aviso PRÉ-JOIN da gravação automática (`auto_audio`/
1000
+ * `auto_video`). Presente só nesses modos: é o que o SPA usa para explicar o
1001
+ * que vai ser gravado e por quanto tempo ANTES do aceite.
1002
+ */
1003
+ export interface IRoomRecordingAutoDto {
1004
+ /** `auto_audio` ou `auto_video`; os outros modos não têm este bloco. */
1005
+ mode: VirtualCareRecordingMode;
1006
+ /**
1007
+ * `true` em `auto_audio`. Hoje é INTENÇÃO declarada: o `POST /recordings` do
1008
+ * provedor não expõe flag de áudio-only, então o arquivo sai A/V. O SPA usa o
1009
+ * campo para o texto do aviso; quando o provedor ganhar a flag, só o adapter
1010
+ * muda.
1011
+ */
1012
+ audio_only: boolean;
1013
+ /** Retenção que o texto mostrado ao paciente promete (`{{retention}}`, D32). */
1014
+ retention_days: number;
1015
+ /**
1016
+ * Versão vigente do texto `recording` que o `POST /consents` tem de
1017
+ * referenciar. `null` = não há texto publicado ⇒ sem aceite possível (D21) e
1018
+ * a gravação automática NÃO acontece.
1019
+ */
1020
+ terms_version: string | null;
1021
+ }
1022
+
1023
+ /**
1024
+ * feat-160 F16 — política EFETIVA da agenda nesta sessão (`virtual_care` já
1025
+ * com os defaults aplicados). É projeção de decisão, não de config gravada:
1026
+ * agenda sem o bloco devolve os defaults.
1027
+ */
1028
+ export interface IRoomSessionPolicyDto {
1029
+ recording_mode: VirtualCareRecordingMode;
1030
+ auto_admit: boolean;
1031
+ identity: {
1032
+ require_name: boolean;
1033
+ require_birth_date: boolean;
1034
+ skip: boolean;
1035
+ };
1036
+ /**
1037
+ * Prazo duro da consulta. `end_at`/`warning_at` são `null` quando não há
1038
+ * prazo (consulta não iniciada com `allow_late_end`), e `reason` diz qual
1039
+ * limite venceu — o MESMO `reason` com que o sweep encerra.
1040
+ */
1041
+ deadline: {
1042
+ end_at: string | null;
1043
+ warning_at: string | null;
1044
+ reason: "scheduled_end" | "max_duration" | null;
1045
+ };
968
1046
  }
969
1047
 
970
1048
  /**
@@ -988,7 +1066,15 @@ export interface IRoomSessionDto {
988
1066
  * nascimento só é pedida quando EXISTE no cadastro. Para o médico vem sempre
989
1067
  * `{ birth_date: false }`.
990
1068
  */
991
- identity_required_fields: { birth_date: boolean };
1069
+ identity_required_fields: {
1070
+ birth_date: boolean;
1071
+ /**
1072
+ * feat-160 F16 — `virtual_care.identity.require_name`: a agenda pode exigir
1073
+ * o nome também. OPCIONAL no contrato porque SPA anterior à F16 não o
1074
+ * conhece e deve seguir pedindo só a data (comportamento de antes).
1075
+ */
1076
+ name?: boolean;
1077
+ };
992
1078
  /**
993
1079
  * Contador do lockout, lido do GRANT raiz — e a ÚNICA fonte dele: o erro do
994
1080
  * `POST /identity/verify` é neutro e não devolve tentativas nem prazo. Por
@@ -997,6 +1083,12 @@ export interface IRoomSessionDto {
997
1083
  identity_attempts: { remaining: number; blocked_until: string | null };
998
1084
  recording_status: RecordingStatus;
999
1085
  recording: IRoomRecordingStateDto;
1086
+ /**
1087
+ * feat-160 F16 — o que a AGENDA decidiu (`calendar.virtual_care` resolvido
1088
+ * com os defaults). OPCIONAL: aditivo, SPA que não o conheça mantém o
1089
+ * comportamento pré-F16.
1090
+ */
1091
+ policy?: IRoomSessionPolicyDto;
1000
1092
  transcription_status: TranscriptionStatus;
1001
1093
  /** Textos vigentes que ainda precisam de aceite antes do join. */
1002
1094
  required_consents: IRoomConsentRefDto[];
@@ -1067,11 +1159,114 @@ export interface ITeleconsultationArtifactDto {
1067
1159
  created_at: string;
1068
1160
  }
1069
1161
 
1162
+ /**
1163
+ * Modo da URL assinada de um artefato (feat-160 F21; D34).
1164
+ *
1165
+ * `attachment` é o default histórico (F8): o navegador BAIXA o arquivo.
1166
+ * `inline` existe para o `<video>` do painel fazer streaming por `Range` sem
1167
+ * baixar — e a única diferença técnica é NÃO emitir `Content-Disposition`.
1168
+ */
1169
+ export const ArtifactDispositionEnum = {
1170
+ Inline: "inline",
1171
+ Attachment: "attachment",
1172
+ } as const;
1173
+ export type ArtifactDisposition =
1174
+ (typeof ArtifactDispositionEnum)[keyof typeof ArtifactDispositionEnum];
1175
+
1176
+ /**
1177
+ * Teto de validade da URL `inline` (feat-160 F21): 15 min. Playback casa com a
1178
+ * duração de uma consulta; download curto casa com o clique. É TETO, não
1179
+ * default — o use case aplica, e o adapter recusa acima dele.
1180
+ */
1181
+ export const ARTIFACT_INLINE_SIGNED_URL_MAX_SECONDS = 900;
1182
+
1070
1183
  /** `POST /v1/teleconsultations/:id/artifacts/:artifactId/signed-url` — URL ≤ 5 min; evento `artifact.accessed`. */
1071
1184
  export interface ISignedUrlResponseDto {
1072
1185
  ok: true;
1073
1186
  url: string;
1074
1187
  expires_at: string;
1188
+ /** Modo efetivamente aplicado (`attachment` quando o comando omite). */
1189
+ disposition?: ArtifactDisposition;
1190
+ }
1191
+
1192
+ // ----- Transcrição servida ao painel (feat-160 F21 §9.1 b)
1193
+ //
1194
+ // O texto NUNCA vive em doc do Firestore (threat model): a rota lê o objeto do
1195
+ // bucket e devolve ESTE DTO. Tempos em MILISSEGUNDOS porque o player faz
1196
+ // `seekTo` e o `mm:ss` da bolha vem de arredondamento — dois consumidores do
1197
+ // mesmo número, e um `0.1 + 0.2` no meio é ruído garantido.
1198
+
1199
+ export type TranscriptSpeakerRole = "doctor" | "patient" | "unknown";
1200
+
1201
+ export interface ITranscriptSpeakerDto {
1202
+ /** `opaque_custom_participant_id` que amarra a fala ao papel. */
1203
+ key: string;
1204
+ display_name: string;
1205
+ role: TranscriptSpeakerRole;
1206
+ }
1207
+
1208
+ export interface ITranscriptEntryDto {
1209
+ index: number;
1210
+ speaker_key: string;
1211
+ start_ms: number;
1212
+ end_ms: number;
1213
+ text: string;
1214
+ overlapping?: boolean;
1215
+ }
1216
+
1217
+ /** Corpo da transcrição de UM artefato (`segment`). */
1218
+ export interface ITranscriptDto {
1219
+ artifact_id: string;
1220
+ segment: number;
1221
+ language?: string;
1222
+ generated_at?: string;
1223
+ speakers: ITranscriptSpeakerDto[];
1224
+ entries: ITranscriptEntryDto[];
1225
+ }
1226
+
1227
+ /**
1228
+ * `GET /v1/teleconsultations/:id/artifacts/:artifactId/transcript` — envelope
1229
+ * da rota: `{ ok: true, ...ITranscriptDto }` (o DTO é espalhado, não aninhado).
1230
+ */
1231
+ export interface ITranscriptResponseDto extends ITranscriptDto {
1232
+ ok: true;
1233
+ }
1234
+
1235
+ // ----- Badges da lista de agendamentos (feat-160 F21 §9.1 d)
1236
+
1237
+ /**
1238
+ * Um agendamento que TEM teleconsulta, e o que ela produziu. Id ausente do mapa
1239
+ * = "nunca virou teleconsulta" — é essa diferença que impede a tela de
1240
+ * desenhar três ícones apagados em toda linha comum.
1241
+ */
1242
+ export interface ITeleconsultationBadgeDto {
1243
+ teleconsultation_id: string;
1244
+ status: TeleconsultationStatus;
1245
+ recording_audio: boolean;
1246
+ recording_video: boolean;
1247
+ transcript: boolean;
1248
+ }
1249
+
1250
+ /** `GET /v1/appointments/teleconsultation-badges?ids=a,b,c` (máx. 50 ids). */
1251
+ export interface ITeleconsultationBadgesResponseDto {
1252
+ ok: true;
1253
+ /** Keyed por `appointment_id`. */
1254
+ items: Record<string, ITeleconsultationBadgeDto>;
1255
+ }
1256
+
1257
+ /** Teto de ids por chamada; acima disso a rota responde 400. */
1258
+ export const TELECONSULTATION_BADGES_MAX_IDS = 50;
1259
+
1260
+ /**
1261
+ * Corpo do `POST …/artifacts/:artifactId/signed-url` (feat-160 F21). O zod
1262
+ * espelho é `zArtifactSignedUrlCommandSchema`.
1263
+ */
1264
+ export interface IArtifactSignedUrlCommand {
1265
+ disposition?: ArtifactDisposition;
1266
+ /** 30..900; o teto REAL depende do modo e é aplicado pelo backend. */
1267
+ ttl_seconds?: number;
1268
+ /** Renova a URL de um artefato já acessado (evento `artifact.accessed`). */
1269
+ refresh?: boolean;
1075
1270
  }
1076
1271
 
1077
1272
  export interface ITeleconsultationEventDto {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.578",
3
+ "version": "1.3.581",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",