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.
- package/dist/apps/evo-chat/channel/zod-schemas.d.ts +273 -0
- package/dist/apps/evo-chat/channel/zod-schemas.js +17 -1
- package/dist/apps/evo-chat/channel/zod-schemas.ts +19 -0
- package/dist/apps/evo-chat/thread-message/zod-schemas.d.ts +24 -0
- package/dist/apps/evo-chat/thread-message/zod-schemas.js +2 -0
- package/dist/apps/evo-chat/thread-message/zod-schemas.ts +2 -0
- package/dist/apps/evo-chat/waba-template/zod-schemas.d.ts +6 -0
- package/dist/apps/evo-chat/waba-template/zod-schemas.js +2 -0
- package/dist/apps/evo-chat/waba-template/zod-schemas.ts +2 -0
- package/dist/apps/evo-med/calendar/zod-schemas.d.ts +3996 -1572
- package/dist/apps/evo-med/calendar/zod-schemas.js +9 -0
- package/dist/apps/evo-med/calendar/zod-schemas.ts +9 -0
- package/dist/apps/evo-notifications/zod-schemas.d.ts +110 -0
- package/dist/apps/evo-notifications/zod-schemas.js +8 -1
- package/dist/apps/evo-notifications/zod-schemas.ts +9 -0
- package/dist/apps/evo-telemedicine/zod-schemas.d.ts +30 -4
- package/dist/apps/evo-telemedicine/zod-schemas.js +25 -2
- package/dist/apps/evo-telemedicine/zod-schemas.ts +25 -0
- package/dist/types/evo-chat/channel/index.d.ts +19 -0
- package/dist/types/evo-chat/channel/index.ts +24 -0
- package/dist/types/evo-chat/thread-message/index.d.ts +4 -0
- package/dist/types/evo-chat/thread-message/index.ts +4 -0
- package/dist/types/evo-chat/waba-template/index.d.ts +6 -0
- package/dist/types/evo-chat/waba-template/index.js +3 -1
- package/dist/types/evo-chat/waba-template/index.ts +7 -0
- package/dist/types/evo-med/calendar/index.d.ts +26 -1
- package/dist/types/evo-med/calendar/index.ts +27 -1
- package/dist/types/evo-notifications/index.d.ts +11 -0
- package/dist/types/evo-notifications/index.ts +13 -0
- package/dist/types/evo-telemedicine/index.d.ts +168 -0
- package/dist/types/evo-telemedicine/index.js +43 -1
- package/dist/types/evo-telemedicine/index.ts +196 -1
- 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: {
|
|
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 {
|