evo360-types 1.3.574 → 1.3.578

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.
@@ -171,6 +171,18 @@ export declare const AccessGrantKindEnum: {
171
171
  readonly LaunchCode: "launch_code";
172
172
  /** Sessão do browser (cookie `__session`), 15 min, rotativa. */
173
173
  readonly BrowserSession: "browser_session";
174
+ /**
175
+ * feat-160 F7 — `kind` de uma ENTRADA A MAIS no `grant-index`, apontando
176
+ * para o MESMO grant `qr_capability`, para o link do calendário (ICS)
177
+ * resolver o caminho da teleconsulta (T56/P1).
178
+ *
179
+ * ⚠️ NENHUM grant tem este kind: `ITeleconsultationAccessGrant.kind` nunca
180
+ * vale `ics_capability`. O poder de entrar continua amarrado ao
181
+ * `secret_hash` do grant, que é o HMAC do `cap` e não do `ics_cap`. Está no
182
+ * mesmo enum porque é o `kind` do índice e o índice é endereçado pelo mesmo
183
+ * espaço de nomes — não para virar um grant.
184
+ */
185
+ readonly IcsCapability: "ics_capability";
174
186
  };
175
187
  export type AccessGrantKind = (typeof AccessGrantKindEnum)[keyof typeof AccessGrantKindEnum];
176
188
  export declare const AccessGrantStateEnum: {
@@ -218,6 +230,12 @@ export declare const TeleconsultationEventTypeEnum: {
218
230
  /** Alteração tardia na agenda com consulta já iniciada — tratamento operacional, não apaga o encontro. */
219
231
  readonly TeleconsultationDiverged: "teleconsultation.diverged";
220
232
  readonly AccessCreated: "access.created";
233
+ /**
234
+ * feat-160 F13/D31 — alguém REVELOU/copiou o link do paciente no painel. Um
235
+ * evento por revelação (é o ato do usuário que fica registrado, não a
236
+ * abertura da tela). Distinto de `access.created`, que é a emissão do grant.
237
+ */
238
+ readonly AccessLinkRevealed: "access.link_revealed";
221
239
  readonly AccessRevoked: "access.revoked";
222
240
  readonly AccessExchanged: "access.exchanged";
223
241
  readonly AccessVerificationFailed: "access.verification_failed";
@@ -325,7 +343,33 @@ export interface ITeleconsultation extends IFireDoc {
325
343
  provider_meeting_id?: string;
326
344
  active_provider_session_id?: string;
327
345
  recording_status: RecordingStatus;
346
+ /**
347
+ * Gravação — campos de OPERAÇÃO escritos por F8 e lidos pelo `GET /session`
348
+ * (feat-160). Nenhum id do provedor entra aqui: o id da gravação no
349
+ * provedor vive em `private/provider.active_provider_recording_id` (T52).
350
+ */
351
+ recording_request_id?: string;
352
+ /** Versão do texto legal `recording` referenciada na solicitação (D21). */
353
+ recording_terms_version?: string;
354
+ recording_requested_at?: Date | null;
355
+ /** `userId` do médico que solicitou. */
356
+ recording_requested_by?: string;
357
+ recording_started_at?: Date | null;
358
+ recording_stopped_at?: Date | null;
359
+ /** Código estável, sem PII, quando `recording_status === 'failed'`. */
360
+ recording_failure_code?: string | null;
361
+ /** Segmento corrente (1..n) — mais de uma sessão física = vários segmentos. */
362
+ recording_segment?: number;
328
363
  transcription_status: TranscriptionStatus;
364
+ /**
365
+ * feat-160 F10 — desmonte do meeting no provedor ainda pendente; o sweep lê e
366
+ * limpa. Escrito FORA do comando transacional de propósito: não é estado
367
+ * clínico e um `version + 1` por housekeeping faria o `expected_version` que
368
+ * o painel acabou de ler virar 409.
369
+ */
370
+ provider_teardown_pending?: boolean;
371
+ /** feat-160 F10 — até quando o metadado sensível sobrevive à retenção. */
372
+ metadata_retention_until?: Date | null;
329
373
  entitlement_snapshot: ITeleconsultationEntitlementSnapshot;
330
374
  /**
331
375
  * Geração no `appointment-index`: incrementa quando o appointment volta a ser
@@ -337,11 +381,63 @@ export interface ITeleconsultation extends IFireDoc {
337
381
  /** Última versão/data do appointment aplicada — descarta evento de reconciliação antigo. */
338
382
  last_reconciled_appointment_version?: number | string | null;
339
383
  last_reconciled_at?: Date | null;
384
+ /**
385
+ * feat-160 F18 — quando a passada de bilhetagem do sweep pode contar esta
386
+ * consulta. Carimbado por `endForAll` (`ended_at + 15 min`): o `ready` das
387
+ * gravações só chega pelo webhook DEPOIS do fim, então contar no `end`
388
+ * classificaria toda consulta gravada como "sem gravação".
389
+ */
390
+ usage_metering_due_at?: Date | null;
391
+ /**
392
+ * Quando o evento de uso foi emitido. Presente = já contada; é o que torna a
393
+ * bilhetagem idempotente no doc (a dedup em BigQuery, por `target.entityId`,
394
+ * é a segunda camada) e a trilha para reconciliar contra o BigQuery — o
395
+ * publish é best-effort e pode se perder.
396
+ */
397
+ usage_metered_at?: Date | null;
340
398
  /** Concorrência otimista: todo comando de estado é transação + `version`. */
341
399
  version: number;
342
400
  created_at: Date;
343
401
  updated_at: Date;
344
402
  }
403
+ /**
404
+ * `.../teleconsultations/{teleconsultationId}/private/provider` (data-model §7;
405
+ * threat model P1/T52).
406
+ *
407
+ * Tudo o que identifica o encontro NO PROVEDOR mora aqui, e só aqui: o subdoc
408
+ * `private/**` é negado a todo mundo nas rules, inclusive super admin, enquanto
409
+ * `teleconsultations/{id}` e `participants/{id}` são legíveis pelo FE com
410
+ * `evo_telemedicine_read`. Um id de provedor na mão do browser é exatamente o
411
+ * que T52 proíbe — e `runTeleconsultationCommand` LANÇA se um patch do doc
412
+ * principal carregar `provider_meeting_id`/`active_provider_session_id`, para
413
+ * que o invariante não dependa de alguém lembrar em cada PR.
414
+ */
415
+ export interface ITeleconsultationPrivateProvider {
416
+ readonly id: string;
417
+ tenant: string;
418
+ teleconsultation_id: string;
419
+ provider: TeleconsultationProvider;
420
+ /** Id do meeting no provider — nunca sai deste doc para o FE nem para o SPA. */
421
+ provider_meeting_id?: string;
422
+ active_provider_session_id?: string;
423
+ /** Sessões físicas já vistas (mais de uma = segmentos do mesmo encontro). */
424
+ provider_session_ids?: string[];
425
+ /** Id do participante no provider, por id LÓGICO (`doctor`/`patient`). */
426
+ provider_participant_ids?: Record<string, string>;
427
+ /**
428
+ * Gravação ativa no provedor. O artefato guarda o mesmo valor em
429
+ * `provider_artifact_id` (é por ele que o webhook casa), mas o `stop` precisa
430
+ * do id sem depender de qual segmento é o corrente.
431
+ */
432
+ active_provider_recording_id?: string | null;
433
+ created_at?: Date | null;
434
+ updated_at?: Date | null;
435
+ }
436
+ /**
437
+ * Campos que o doc PRINCIPAL da teleconsulta jamais carrega — a asserção do
438
+ * `runTeleconsultationCommand` e do teste de sanidade itera esta lista.
439
+ */
440
+ export declare const TELECONSULTATION_PROVIDER_ONLY_FIELDS: readonly ["provider_meeting_id", "active_provider_session_id"];
345
441
  /** `.../participants/{participantId}` (data-model §2). Id lógico estável; reconexão reutiliza o mesmo participante. */
346
442
  export interface ITeleconsultationParticipant extends IFireDoc {
347
443
  teleconsultation_id: string;
@@ -404,6 +500,11 @@ export interface ITeleconsultationArtifact extends IFireDoc {
404
500
  ended_at?: Date | null;
405
501
  /** Retenção: o sweep deleta o objeto e só então marca `deleted` (auditoria preservada). */
406
502
  expires_at?: Date | null;
503
+ /**
504
+ * feat-160 F10 — quando o CONTEÚDO foi apagado. O doc sobrevive (status
505
+ * `deleted`) porque a auditoria da deleção é preservada (D13).
506
+ */
507
+ deleted_at?: Date | null;
407
508
  error_code?: string;
408
509
  created_at: Date;
409
510
  updated_at: Date;
@@ -491,6 +592,21 @@ export interface ITelemedicineAppointmentIndex extends IFireDoc {
491
592
  active_teleconsultation_id: string | null;
492
593
  generation: number;
493
594
  last_reconciled_appointment_version?: number | string | null;
595
+ /**
596
+ * feat-160 F3 — instante do write do appointment já aplicado. A marca d'água
597
+ * mora AQUI, e não só na teleconsulta, porque o índice sobrevive ao que ela
598
+ * precisa cobrir: um `denied` não cria doc nenhum e um terminal deixa de ser
599
+ * a teleconsulta ativa. Sem isto, um evento antigo redelivered depois de um
600
+ * `denied` seria reavaliado como novo.
601
+ */
602
+ last_reconciled_at?: Date | null;
603
+ /**
604
+ * Última teleconsulta deste appointment, ativa ou não. Gravada quando o
605
+ * índice é liberado (terminal) para o painel continuar mostrando a
606
+ * teleconsulta expirada/encerrada em vez de "não tem teleconsulta". NÃO é
607
+ * fonte de verdade de ativo — isso é `active_teleconsultation_id`.
608
+ */
609
+ last_teleconsultation_id?: string | null;
494
610
  updated_at: Date;
495
611
  }
496
612
  /**
@@ -539,6 +655,12 @@ export interface ITelemedicineGrantIndex extends IFireGlobalDoc {
539
655
  tenant: string;
540
656
  teleconsultation_id: string;
541
657
  grant_id: string;
658
+ /**
659
+ * Qual segredo esta entrada resolve. Ausente = a capability do `/qr`
660
+ * (comportamento original); `ics_capability` = o segredo derivado do link do
661
+ * calendário, que aponta para o MESMO grant `qr_capability` (F7).
662
+ */
663
+ kind?: AccessGrantKind;
542
664
  /** TTL nativo. */
543
665
  expires_at: Date;
544
666
  }
@@ -696,6 +818,23 @@ export interface IRoomConsentRefDto {
696
818
  subject: ConsentSubject;
697
819
  terms_version: string;
698
820
  }
821
+ /**
822
+ * Projeção SANITIZADA do estado de gravação no `GET /session` (feat-160 F8).
823
+ * Nunca traz id do provider, path do objeto no GCS nem URL assinada — só o que
824
+ * a UI dos dois papéis precisa.
825
+ */
826
+ export interface IRoomRecordingStateDto {
827
+ /** Mesma origem do `recording_status` do DTO da sessão. */
828
+ status: RecordingStatus;
829
+ /** Início do segmento ativo — única origem do cronômetro; `null` fora de gravação. */
830
+ started_at: string | null;
831
+ /** Idempotência do comando e vínculo do consentimento (T19). */
832
+ recording_request_id?: string;
833
+ /** Versão do texto legal `recording` referenciada na solicitação (D21). */
834
+ terms_version?: string;
835
+ /** Código estável, sem PII, quando `status === 'failed'`. */
836
+ failure_code?: string;
837
+ }
699
838
  /**
700
839
  * `GET /api/room/v1/session` — estado SANITIZADO: sem tenant id, sem ids do
701
840
  * provider; nome do profissional/clínica só depois da verificação.
@@ -712,13 +851,50 @@ export interface IRoomSessionDto {
712
851
  identity_level: IdentityLevel;
713
852
  /** Paciente precisa passar por `POST /identity/verify` antes do join. */
714
853
  identity_required: boolean;
854
+ /**
855
+ * Quais campos o formulário de identidade deve pedir (spec §8.3): a data de
856
+ * nascimento só é pedida quando EXISTE no cadastro. Para o médico vem sempre
857
+ * `{ birth_date: false }`.
858
+ */
859
+ identity_required_fields: {
860
+ birth_date: boolean;
861
+ };
862
+ /**
863
+ * Contador do lockout, lido do GRANT raiz — e a ÚNICA fonte dele: o erro do
864
+ * `POST /identity/verify` é neutro e não devolve tentativas nem prazo. Por
865
+ * isso a UI relê a sessão depois de cada falha.
866
+ */
867
+ identity_attempts: {
868
+ remaining: number;
869
+ blocked_until: string | null;
870
+ };
715
871
  recording_status: RecordingStatus;
872
+ recording: IRoomRecordingStateDto;
716
873
  transcription_status: TranscriptionStatus;
717
874
  /** Textos vigentes que ainda precisam de aceite antes do join. */
718
875
  required_consents: IRoomConsentRefDto[];
719
876
  accepted_consents: IRoomConsentRefDto[];
720
877
  /** Capabilities efetivas para esta sessão (entitlement AND rollout AND papel). */
721
878
  capabilities: Record<string, boolean>;
879
+ /** Presença do médico; `null` quando não há participante. Atalho de `participants`. */
880
+ doctor_presence: ParticipantState | null;
881
+ /** Presença do paciente. Atalho de `participants`. */
882
+ patient_presence: ParticipantState | null;
883
+ /** Os dois papéis, com `state`/`disconnected_at`/`reconnect_count`. */
884
+ participants: ITeleconsultationParticipantDto[];
885
+ /**
886
+ * Pacientes em `state === 'waiting'`, e a ponte OBRIGATÓRIA do `POST /admit`:
887
+ * o `participant_id` de domínio é o literal `'patient'`, enquanto o
888
+ * `custom_participant_id` devolvido no `POST /join` é hash opaco que nunca
889
+ * casaria com ele.
890
+ */
891
+ waiting_participants: ITeleconsultationParticipantDto[];
892
+ /**
893
+ * Máscara "Maria A. d. S." do titular do agendamento. SÓ na sessão do
894
+ * MÉDICO — o backend nunca a manda ao paciente (T01), e é por isso que é o
895
+ * único destes campos legitimamente opcional.
896
+ */
897
+ patient_display_masked?: string;
722
898
  professional_display_name?: string;
723
899
  clinic_display_name?: string;
724
900
  /** Expiração do access da sessão (15 min, rotativo via `/session/refresh`). */
@@ -792,6 +968,13 @@ export interface ITelemedicineLegalTextDto {
792
968
  content_html: string;
793
969
  content_hash: string;
794
970
  effective_at?: string | null;
971
+ /**
972
+ * VALORES dos placeholders já resolvidos e filtrados pela allowlist do
973
+ * próprio doc (`ITelemedicineLegalText.placeholders`, que guarda os NOMES
974
+ * permitidos). ux-flows §3 exige "usada para {finalidade} e ficará
975
+ * disponível por {prazo}", e D21 proíbe hardcode disso no bundle.
976
+ */
977
+ placeholders?: Record<string, string>;
795
978
  }
796
979
  /** `GET /api/room/v1/legal-texts`. */
797
980
  export interface ILegalTextsResponseDto {
@@ -803,17 +986,61 @@ export interface IIdentityVerifyResponseDto {
803
986
  ok: true;
804
987
  identity_level: IdentityLevel;
805
988
  }
806
- /** `POST /v1/teleconsultations/:id/access/send`. */
989
+ /**
990
+ * `POST /api/room/v1/exchange` e `POST /api/room/v1/session/refresh`.
991
+ *
992
+ * O corpo NÃO repete o `sid` (está no cookie `__session`, `HttpOnly`,
993
+ * `Path=/api`) nem o tenant; traz o papel, que é o que permite ao SPA escolher
994
+ * a tela sem um `GET /session` extra.
995
+ */
996
+ export interface IExchangeResponseDto {
997
+ ok: true;
998
+ role: ParticipantRole;
999
+ session_expires_at: string;
1000
+ }
1001
+ /** `POST /api/room/v1/participant-token/refresh` — token novo, MESMO participante lógico. */
1002
+ export interface IParticipantTokenRefreshDto {
1003
+ ok: true;
1004
+ provider_token: string;
1005
+ /** Nome do preset no provider (`hm_doctor`, `hm_patient_waiting`, ...). */
1006
+ preset: string;
1007
+ token_expires_at?: string;
1008
+ }
1009
+ /**
1010
+ * `POST /v1/teleconsultations/:id/access/send` (feat-160 F7).
1011
+ *
1012
+ * É RECIBO DE TASK, não confirmação de envio: a rota publica a mesma task fina
1013
+ * que a rotina publicaria (`telemedicine_join_reminder`) e responde antes de
1014
+ * existir grant — o executor é quem resolve template, canal e elegibilidade e
1015
+ * emite a capability, uma por perna do fan-out. Por isso NÃO há `grant_id` nem
1016
+ * `expires_at` aqui: forjá-los era mentir para a recepção sobre um acesso que
1017
+ * ainda não existia.
1018
+ */
807
1019
  export interface IAccessSendResponseDto {
808
1020
  ok: true;
809
- grant_id: string;
1021
+ task_id: string;
1022
+ /** `true` quando a chave de idempotência colapsou num envio já pedido. */
1023
+ reused: boolean;
810
1024
  channel_kind: AccessSendChannelKind;
1025
+ /** Eco do pedido: revogar a capability anterior antes de emitir a nova. */
1026
+ resend: boolean;
1027
+ /** Destinatário mascarado do canal pedido; ausente em `manual`. */
811
1028
  recipient_masked?: string;
1029
+ }
1030
+ /**
1031
+ * `POST /v1/teleconsultations/:id/access/link` (feat-160 F13; D31).
1032
+ *
1033
+ * **A `url` é CREDENCIAL** (capability de 128 bits do `/qr`), não um
1034
+ * identificador: não tem lugar em store, log, analytics nem storage do
1035
+ * navegador (T01/T04). Nasce nesta resposta, vai para a área de transferência e
1036
+ * morre com o diálogo. Cada revelação é uma chamada nova, de propósito — o que
1037
+ * fica registrado em `access.link_revealed` é o ato do usuário.
1038
+ */
1039
+ export interface IAccessLinkResultDto {
1040
+ ok: true;
1041
+ url: string;
1042
+ grant_id: string;
812
1043
  expires_at: string;
813
- /** Só para `channel_kind = manual` (smoke): URL mascarada, nunca a capability inteira. */
814
- url_masked?: string;
815
- /** Id da task `telemedicine_join.send` criada, quando houver canal. */
816
- task_id?: string;
817
1044
  }
818
1045
  export interface IWaitingPolicyCommand {
819
1046
  waiting_policy: WaitingPolicy;
@@ -853,6 +1080,26 @@ export interface IConsentCommand {
853
1080
  terms_version: string;
854
1081
  decision: Extract<ConsentDecision, "accepted" | "declined">;
855
1082
  }
1083
+ /**
1084
+ * `POST /api/room/v1/join` — intenção de mídia do preflight ("Entrar somente
1085
+ * com áudio"). Os dois campos são opcionais porque o backend só os REGISTRA
1086
+ * (escolha de preset e `audio_only_allowed`) e ignora o que não vier.
1087
+ */
1088
+ export interface IJoinCommand {
1089
+ audio?: boolean;
1090
+ video?: boolean;
1091
+ }
1092
+ /**
1093
+ * `POST /api/room/v1/leave` — saída TEMPORÁRIA (D10); nunca encerra a consulta.
1094
+ *
1095
+ * `reason` é string aberta e o backend só distingue UM valor: `'temporary'` é
1096
+ * saída explícita (`left`), qualquer outro é tratado como queda de rede
1097
+ * (`disconnected`). Ausente = `'temporary'`. Chega pelo `pagehide` com
1098
+ * `fetch(keepalive)`, então pode vir sem `Content-Type`.
1099
+ */
1100
+ export interface ILeaveCommand {
1101
+ reason?: string;
1102
+ }
856
1103
  /** `POST /api/room/v1/presence`. */
857
1104
  export interface IPresenceCommand {
858
1105
  state: PresenceState;
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.TelemedicineErrorCode = exports.EntitlementAuditActionEnum = exports.TranscriptionProviderEnum = exports.LegalTextStatusEnum = exports.WebhookEventStatusEnum = exports.TeleconsultationEventTypeEnum = exports.TeleconsultationEventSourceEnum = exports.TeleconsultationEventActorTypeEnum = exports.EndedByTypeEnum = exports.AccessSendChannelKindEnum = exports.AccessGrantStateEnum = exports.AccessGrantKindEnum = exports.ArtifactStatusEnum = exports.ArtifactTypeEnum = exports.ConsentActorTypeEnum = exports.ConsentDecisionEnum = exports.ConsentSubjectEnum = exports.TranscriptionStatusEnum = exports.RecordingStatusEnum = exports.IdentityLevelEnum = exports.PresenceStateEnum = exports.ParticipantStateEnum = exports.ParticipantRoleEnum = exports.TeleconsultationProviderEnum = exports.TeleconsultationModeEnum = exports.WaitingPolicyEnum = exports.TELECONSULTATION_TERMINAL_STATUSES = exports.TeleconsultationStatusEnum = exports.TELEMEDICINE_WINDOW_DEFAULTS = exports.TELEMEDICINE_JOIN_REMINDER_HANDLER = exports.TELEMEDICINE_JOIN_ACTION_TYPE = exports.EvoTelemedicinePermissions = void 0;
17
+ exports.TelemedicineErrorCode = exports.EntitlementAuditActionEnum = exports.TELECONSULTATION_PROVIDER_ONLY_FIELDS = exports.TranscriptionProviderEnum = exports.LegalTextStatusEnum = exports.WebhookEventStatusEnum = exports.TeleconsultationEventTypeEnum = exports.TeleconsultationEventSourceEnum = exports.TeleconsultationEventActorTypeEnum = exports.EndedByTypeEnum = exports.AccessSendChannelKindEnum = exports.AccessGrantStateEnum = exports.AccessGrantKindEnum = exports.ArtifactStatusEnum = exports.ArtifactTypeEnum = exports.ConsentActorTypeEnum = exports.ConsentDecisionEnum = exports.ConsentSubjectEnum = exports.TranscriptionStatusEnum = exports.RecordingStatusEnum = exports.IdentityLevelEnum = exports.PresenceStateEnum = exports.ParticipantStateEnum = exports.ParticipantRoleEnum = exports.TeleconsultationProviderEnum = exports.TeleconsultationModeEnum = exports.WaitingPolicyEnum = exports.TELECONSULTATION_TERMINAL_STATUSES = exports.TeleconsultationStatusEnum = exports.TELEMEDICINE_WINDOW_DEFAULTS = exports.TELEMEDICINE_JOIN_REMINDER_HANDLER = exports.TELEMEDICINE_JOIN_ACTION_TYPE = exports.EvoTelemedicinePermissions = void 0;
18
18
  __exportStar(require("./fb_collections"), exports);
19
19
  // ======================================================
20
20
  // evo-telemedicine (feat-160 — Telemedicina integrada)
@@ -195,6 +195,18 @@ exports.AccessGrantKindEnum = {
195
195
  LaunchCode: "launch_code",
196
196
  /** Sessão do browser (cookie `__session`), 15 min, rotativa. */
197
197
  BrowserSession: "browser_session",
198
+ /**
199
+ * feat-160 F7 — `kind` de uma ENTRADA A MAIS no `grant-index`, apontando
200
+ * para o MESMO grant `qr_capability`, para o link do calendário (ICS)
201
+ * resolver o caminho da teleconsulta (T56/P1).
202
+ *
203
+ * ⚠️ NENHUM grant tem este kind: `ITeleconsultationAccessGrant.kind` nunca
204
+ * vale `ics_capability`. O poder de entrar continua amarrado ao
205
+ * `secret_hash` do grant, que é o HMAC do `cap` e não do `ics_cap`. Está no
206
+ * mesmo enum porque é o `kind` do índice e o índice é endereçado pelo mesmo
207
+ * espaço de nomes — não para virar um grant.
208
+ */
209
+ IcsCapability: "ics_capability",
198
210
  };
199
211
  exports.AccessGrantStateEnum = {
200
212
  Active: "active",
@@ -236,6 +248,12 @@ exports.TeleconsultationEventTypeEnum = {
236
248
  /** Alteração tardia na agenda com consulta já iniciada — tratamento operacional, não apaga o encontro. */
237
249
  TeleconsultationDiverged: "teleconsultation.diverged",
238
250
  AccessCreated: "access.created",
251
+ /**
252
+ * feat-160 F13/D31 — alguém REVELOU/copiou o link do paciente no painel. Um
253
+ * evento por revelação (é o ato do usuário que fica registrado, não a
254
+ * abertura da tela). Distinto de `access.created`, que é a emissão do grant.
255
+ */
256
+ AccessLinkRevealed: "access.link_revealed",
239
257
  AccessRevoked: "access.revoked",
240
258
  AccessExchanged: "access.exchanged",
241
259
  AccessVerificationFailed: "access.verification_failed",
@@ -294,6 +312,14 @@ exports.TranscriptionProviderEnum = {
294
312
  None: "none",
295
313
  RealtimeKit: "realtimekit",
296
314
  };
315
+ /**
316
+ * Campos que o doc PRINCIPAL da teleconsulta jamais carrega — a asserção do
317
+ * `runTeleconsultationCommand` e do teste de sanidade itera esta lista.
318
+ */
319
+ exports.TELECONSULTATION_PROVIDER_ONLY_FIELDS = [
320
+ "provider_meeting_id",
321
+ "active_provider_session_id",
322
+ ];
297
323
  // ======================================================
298
324
  // Auditoria de entitlement (`.../entitlement-audit/{id}`, data-model §8)
299
325
  // ======================================================