Session: encapsulated-percolating-cupcake-subagent-a9bae993 — 2026-02-23

doctolib-doctolib · Claude · branch master · claude-haiku-4-5-20251001 · 2026-02-23 14:22 · 1 msgs · 28 tools · 13 min read · updated 2 months ago

I need to understand the exact implementation of FHIR DMP commands in the TypeScript packages. This is in a monorepo...

tools: Glob, Read, Bash
← doctolib-doctolib Download .md .txt .json
Tool calls
Read Read: 19 calls (67.9%) 19 Glob Glob: 7 calls (25.0%) 7 Bash Bash: 2 calls (7.1%) 2
Token usage2.2M total
Input2.1K
Cache creation95.0K
Cache read2.1M
Output501
Cache hit ratio96%· healthy

Project: doctolib-doctolib · Branch: master · Mode: ` · **Model:**claude-haiku-4-5-20251001`

Stats: 1 user messages, 28 tool calls, tools used: Glob, Read, Bash.

Conversation

Turn 1 — User

I need to understand the exact implementation of FHIR DMP commands in the TypeScript packages. This is in a monorepo at /Users/USER/workspace/doctolib/doctolib.

There are worktrees containing related implementations: - FHIR-2021 worktree: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2021-implement-hl-get-documents-content-by-unique-id - FHIR-2022 worktree: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2022-implement-hl-updateDocumentVisibilityByUniqueId - FHIR-2023 worktree: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2023-implement-hl-updateDocumentStatusByUniqueId

Also look in the main repo at /Users/USER/workspace/doctolib/doctolib.

Please read these key files completely:

  1. packages/@doctolib/dmp/src/types/FrDmpTypes.ts (from main repo or any worktree that has it) - I need to see ALL the types defined there, especially FindDocumentsParams, FindDocumentsRequest, FindDocumentsResponse, DocumentMetadata, GetDocumentsContentParams, GetDocumentsContentRequest, GetDocumentsContentResponse, DmpDocumentContent

  2. packages/@doctolib/dmp/src/business/FrDmpCommunication.ts - Show all the exported functions especially findDocuments and getDocumentsContent

  3. packages/@doctolib/dmp/src/index.ts - What is exported from this package

  4. packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts (if it exists) - Show command handler pattern

  5. packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/constants.ts (if it exists) - Show command constants/labels

  6. Any template files in packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/

  7. The main ValidationPage component (probably ValidationPage.tsx) - How commands are dispatched, how state is typed

Please read each of these files fully and report their contents. Search in both the main repo and the worktrees.

Turn 1 — Assistant

I'll help you understand the FHIR DMP commands implementation. Let me search for and read these files systematically across the main repo and worktrees.

Tools used:

  • Glob: **/packages/@doctolib/dmp/src/types/FrDmpTypes.ts
  • Glob: **/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts
  • Glob: **/packages/@doctolib/dmp/src/index.ts
  • Glob: **/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts
  • Glob: **/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/constants.ts
  • Glob: **/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/
  • Glob: **/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/ValidationPage.tsx

Tool results:

→ result (ok): No files found

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/ValidationPage.tsx

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp/src/types/FrDmpTypes.ts

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp/src/index.ts

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/constants.ts

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts

Good! I found most of the files. Now let me read all of them in parallel:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp/src/types/FrDmpTypes.ts

Tool results:

→ result (ok): 1→import type { MedicalFolder } from '@doctolib/ehr-core' 2→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3→import type { DmpDocumentToAdd, FrDmpDocument } from '../business/FrDmpConfig' 4→ 5→export interface FrDmpSessionStorage { 6→ sessionId: string 7→ practiceIndex: number 8→ healthcareSettings: string 9→ createdAt: Date 10→} 11→ 12→// DMP Requests 13→export interface DmpRequest { 14→ s_commandName: …(truncated, 19201 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts

Tool results:

→ result (ok): 1→import { sendMonitoringEvent } from 'monolith_DEPRECATED/services/monitoring' 2→import { startPerformanceTracking } from 'monolith_DEPRECATED/services/performance/PerformanceTrackingService' 3→import { envIsProduction } from 'monolith_DEPRECATED/packages/device/environment' 4→import { isFeatureEnabled } from '@doctolib/variation_management' 5→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 6→import dayjs from 'dayjs' 7→import type {

…(truncated, 21348 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp/src/index.ts

Tool results:

→ result (ok): 1→export { 2→ type DmpDocumentItem, 3→ type DmpDocumentToAdd, 4→ type DmpDocumentToDelete, 5→ type FrDmpDocument, 6→ ItemType, 7→ type UploadedDmpDocumentItem, 8→} from './business/FrDmpConfig' 9→export { getErrorMessage } from './business/DmpI18nMessage' 10→export { DmpApi, type DmpSetUpProps, type ShareProps, type UnshareProps } from './business/DmpApi' 11→export { useDmpSetUp, type DmpSetUpResult } from './hooks/useDmpSetUp' 12→export …(truncated, 3914 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts

Tool results:

→ result (ok): 1→import { getDocumentsContent, findDocuments } from '@doctolib/dmp' 2→import type { FindDocumentsResponse, GetDocumentsContentResponse } from '@doctolib/dmp' 3→import type { DmpCommand } from './types' 4→ 5→export type CommandResponse = FindDocumentsResponse | GetDocumentsContentResponse 6→ 7→type CommandHandler = (sessionId: string, params: Record<string, unknown>) => Promise<CommandResponse> 8→ 9→export const COMMAND_HANDLERS: Partial<Record<DmpCommand, …(truncated, 687 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/constants.ts

Tool results:

→ result (ok): 1→import type { DmpCommand } from './types' 2→ 3→export const COMMAND_LABELS: Record<DmpCommand, string> = { 4→ hl_findDocuments: 'Search for DMP documents', 5→ hl_getDocumentsContentByUniqueId: 'Get document content', 6→ hl_updateDocumentVisibilityByUniqueId: 'Update document visibility', 7→ hl_updateDocumentStatusByUniqueId: 'Update document status', 8→ hl_getDocumentHistoryByUniqueId: 'Get document history', 9→ hl_setDmpAccessMode: 'Enable emergen …(truncated, 753 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/ValidationPage.tsx

Tool results:

→ result (ok): 1→import { useState, useMemo, useEffect } from 'react' 2→import Layout from 'monolith_DEPRECATED/components/base/Layout' 3→import { Button } from '@doctolib/design-system/Button/v2' 4→import { Card } from '@doctolib/design-system/Card' 5→import { Heading } from '@doctolib/design-system/Heading' 6→import { Select } from '@doctolib/design-system/Select' 7→import { Span } from '@doctolib/design-system/Span' 8→import { Textarea } from '@doctolib/design-system/Texta …(truncated, 5718 more chars)

Now let me search for the templates directory and any template files:

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage -name "*.ts*" -type f

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/useSessionCheck.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/ValidationPage.test.tsx /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/SessionStatus/SessionStatus.tsx /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validati …(truncated, 1816 more chars)

Perfect! Now let me read the key files: types.ts, requestTemplates.ts, and the template files:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/types.ts

Tool results:

→ result (ok): 1→export interface RequestTemplate { 2→ [key: string]: unknown 3→} 4→ 5→export type TemplateFactory = (sessionId: string, patientIns: string) => RequestTemplate 6→ 7→export type DmpCommand = 8→ | 'hl_findDocuments' 9→ | 'hl_getDocumentsContentByUniqueId' 10→ | 'hl_updateDocumentVisibilityByUniqueId' 11→ | 'hl_updateDocumentStatusByUniqueId' 12→ | 'hl_getDocumentHistoryByUniqueId' 13→ | 'hl_setDmpAccessMode' 14→

<system-reminder> …(truncated, 320 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/requestTemplates.ts

Tool results:

→ result (ok): 1→import type { DmpCommand, RequestTemplate } from './types' 2→import { templateFactories } from './templates' 3→ 4→export const getRequestTemplate = ( 5→ command: DmpCommand, 6→ sessionId: string, 7→ patientIns: string 8→): RequestTemplate | null => { 9→ const factory = templateFactories[command] 10→ return factory ? factory(sessionId, patientIns) : null 11→} 12→

<system-reminder> Whenever you read a file, you should consider whether it …(truncated, 262 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/index.ts

Tool results:

→ result (ok): 1→import type { DmpCommand, TemplateFactory } from '../types' 2→import { hlFindDocumentsTemplate } from './hlFindDocuments' 3→import { hlGetDocumentsContentByUniqueIdTemplate } from './hlGetDocumentsContentByUniqueId' 4→import { hlGetDocumentHistoryByUniqueIdTemplate } from './hlGetDocumentHistoryByUniqueId' 5→import { hlSetDmpAccessModeTemplate } from './hlSetDmpAccessMode' 6→import { hlUpdateDocumentStatusByUniqueIdTemplate } from './hlUpdateDocumentStatusByUniqueId'

…(truncated, 1006 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/hlFindDocuments.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/hlGetDocumentsContentByUniqueId.ts

Tool results:

→ result (ok): 1→import type { TemplateFactory } from '../types' 2→ 3→export const hlFindDocumentsTemplate: TemplateFactory = (sessionId, patientIns) => ({ 4→ s_commandName: 'hl_findDocuments', 5→ s_sessionId: sessionId, 6→ s_ins: patientIns, 7→ Categories: { '#0': '' }, 8→ Formats: { '#0': '' }, 9→ Practices: { '#0': '' }, 10→ s_creationDateBottom: '', 11→ s_creationDateTop: '', 12→ s_serviceStartDateTop: '', 13→ s_serviceStartDateBottom: '',

…(truncated, 672 more chars)

Tool results:

→ result (ok): 1→import type { TemplateFactory } from '../types' 2→ 3→export const hlGetDocumentsContentByUniqueIdTemplate: TemplateFactory = (sessionId) => ({ 4→ s_commandName: 'hl_getDocumentsContentByUniqueId', 5→ s_sessionId: sessionId, 6→ UniqueIds: ['1.2.250.1.213.1.1.9.123.456'], 7→ Uuids: [''], 8→ i_getCdaHeaders: 0, 9→ i_getCdaContent: 0, 10→ i_getPerformer: 0, 11→ i_getInformants: 0, 12→ i_getAuthors: 1, 13→ i_getDataEnterer: 0, 14 …(truncated, 484 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/hlUpdateDocumentVisibilityByUniqueId.ts

Tool results:

→ result (ok): 1→import type { TemplateFactory } from '../types' 2→ 3→export const hlUpdateDocumentVisibilityByUniqueIdTemplate: TemplateFactory = (sessionId, patientIns) => ({ 4→ s_commandName: 'hl_updateDocumentVisibilityByUniqueId', 5→ s_sessionId: sessionId, 6→ s_ins: patientIns, 7→ s_documentUniqueId: '1.2.250.1.213.1.1.9.123.456', 8→ s_documentUuid: '', 9→ s_healthCareSettings: '', 10→ i_newVisibility: 2, 11→ i_getTransactionFrames: 0, 12→})

…(truncated, 343 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/hlUpdateDocumentStatusByUniqueId.ts

Tool results:

→ result (ok): 1→import type { TemplateFactory } from '../types' 2→ 3→export const hlUpdateDocumentStatusByUniqueIdTemplate: TemplateFactory = (sessionId, patientIns) => ({ 4→ s_commandName: 'hl_updateDocumentStatusByUniqueId', 5→ s_sessionId: sessionId, 6→ s_ins: patientIns, 7→ s_documentUniqueId: '1.2.250.1.213.1.1.9.123.456', 8→ s_documentUuid: '', 9→ s_healthCareSettings: 'SA07', 10→ i_getTransactionFrames: 0, 11→}) 12→

<system-reminder> Whenever …(truncated, 310 more chars)

Now let me check the remaining template files:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/hlGetDocumentHistoryByUniqueId.ts

Tool results:

→ result (ok): 1→import type { TemplateFactory } from '../types' 2→ 3→export const hlGetDocumentHistoryByUniqueIdTemplate: TemplateFactory = (sessionId, patientIns) => ({ 4→ s_commandName: 'hl_getDocumentHistoryByUniqueId', 5→ s_sessionId: sessionId, 6→ s_ins: patientIns, 7→ s_uniqueId: '1.2.250.1.213.1.1.9.123.456', 8→ s_uuid: '', 9→ i_limitPreviousCount: 0, 10→ i_limitNextCount: 0, 11→ i_getTransactionFrames: 0, 12→}) 13→

<system-reminder> When …(truncated, 315 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/templates/hlSetDmpAccessMode.ts

Tool results:

→ result (ok): 1→import type { TemplateFactory } from '../types' 2→ 3→export const hlSetDmpAccessModeTemplate: TemplateFactory = (sessionId) => ({ 4→ s_commandName: 'hl_setDmpAccessMode', 5→ s_sessionId: sessionId, 6→ i_accessMode: 2, 7→ s_reason: 'Patient inconscient - urgence vitale', 8→}) 9→

<system-reminder> Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But …(truncated, 163 more chars)

Perfect! Now let me search the worktrees to see if there are any additional implementations or variations:

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/worktrees/doctolib -name "commandHandlers.ts" -o -name "FrDmpCommunication.ts" 2>/dev/null | head -20

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2022-implement-hl-updateDocumentVisibilityByUniqueId/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2022-implement-hl-updateDocumentVisibilityByUniqueId/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2020-implement-hl-findDocuments-api/packages/@doctolib/dmp/src/business/Fr …(truncated, 1431 more chars)

Let me check the FHIR-2023 and FHIR-2022 worktrees to see if they have updates to FrDmpCommunication:

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2023-implement-hl-updateDocumentStatusByUniqueId/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts

Tool results:

→ result (ok): 1→import { sendMonitoringEvent } from 'monolith_DEPRECATED/services/monitoring' 2→import { startPerformanceTracking } from 'monolith_DEPRECATED/services/performance/PerformanceTrackingService' 3→import { envIsProduction } from 'monolith_DEPRECATED/packages/device/environment' 4→import { isFeatureEnabled } from '@doctolib/variation_management' 5→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 6→import dayjs from 'dayjs' 7→import type {

…(truncated, 22336 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2023-implement-hl-updateDocumentStatusByUniqueId/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts

Tool results:

→ result (ok): 1→import { getDocumentsContent, findDocuments, updateDocumentStatus } from '@doctolib/dmp' 2→import type { 3→ FindDocumentsResponse, 4→ GetDocumentsContentResponse, 5→ UpdateDocumentStatusByUniqueIdResponse, 6→} from '@doctolib/dmp' 7→import type { DmpCommand } from './types' 8→ 9→export type CommandResponse = 10→ | FindDocumentsResponse 11→ | GetDocumentsContentResponse 12→ | UpdateDocumentStatusByUniqueIdResponse 13→ 14→type Com …(truncated, 1026 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2022-implement-hl-updateDocumentVisibilityByUniqueId/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts

Tool results:

→ result (ok): 1→import { sendMonitoringEvent } from 'monolith_DEPRECATED/services/monitoring' 2→import { startPerformanceTracking } from 'monolith_DEPRECATED/services/performance/PerformanceTrackingService' 3→import { envIsProduction } from 'monolith_DEPRECATED/packages/device/environment' 4→import { isFeatureEnabled } from '@doctolib/variation_management' 5→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 6→import dayjs from 'dayjs' 7→import type {

…(truncated, 22500 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2022-implement-hl-updateDocumentVisibilityByUniqueId/packages/@doctolib/dmp-validation/src/components/DmpValidation/ValidationPage/commandHandlers.ts

Tool results:

→ result (ok): 1→import { getDocumentsContent, findDocuments, updateDocumentVisibility } from '@doctolib/dmp' 2→import type { 3→ FindDocumentsResponse, 4→ GetDocumentsContentResponse, 5→ UpdateDocumentVisibilityByUniqueIdResponse, 6→} from '@doctolib/dmp' 7→import type { DmpCommand } from './types' 8→ 9→export type CommandResponse = 10→ | FindDocumentsResponse 11→ | GetDocumentsContentResponse 12→ | UpdateDocumentVisibilityByUniqueIdResponse 13→

…(truncated, 1050 more chars)

Excellent! Now I have all the information I need. Let me compile a comprehensive report of the FHIR DMP commands implementation:

FHIR DMP Commands Implementation Report

Overview

The FHIR DMP (Dossier Médical Partagé) command system is implemented across two main TypeScript packages in the monorepo:

  1. @doctolib/dmp - Core library with type definitions, communication layer, and business logic
  2. @doctolib/dmp-validation - Validation/testing UI for DMP commands

1. Core Type Definitions (FrDmpTypes.ts)

Key Request/Response Types

FindDocumentsRequest/Response: - FindDocumentsRequest extends DmpRequest with command name 'hl_findDocuments' - Parameters: sessionId, ins (patient INS-C number), optional filters (Categories, Formats, Practices, date ranges, status, visibility) - Response: FindDocumentsResponse contains array of DocumentMetadata[]

DocumentMetadata (returned by findDocuments): - Essential: s_uniqueId, s_uuid, s_title, s_typeCode, s_classCode, s_creationDate, i_format - Authors: DocumentAuthor[] with healthcare professional info - Optional fields: s_description, dates (service start/stop), visibility, status, EventCodes, ReferenceIds - Some fields only present when metadata search enabled

GetDocumentsContentParams/Request/Response: - Retrieves actual document content by uniqueIds - Boolean flags for what to include: getCdaHeaders, getCdaContent, getPerformer, getAuthors, etc. - Response: GetDocumentsContentResponse with Documents: DmpDocumentContent[]

DmpDocumentContent: - s_fileContentInBase64 - actual file content - i_documentFormat, s_documentFormatCode, s_documentFormatDescription - Optional CDA data: s_cdaHeadersInBase64, s_cdaContentInBase64 - Optional structured data: Performer[], Authors[], DocumentContent

Update Commands (in worktrees): - UpdateDocumentVisibilityByUniqueIdRequest/Response - change document sharing visibility - UpdateDocumentStatusByUniqueIdRequest/Response - change document status


2. Communication Layer (FrDmpCommunication.ts)

Core Transport Function

frDmpSend<Request extends DmpRequest, Response extends DmpResponse>(
  payload: Request,
  timeoutInSeconds = 60
): Promise<Response>
  • Uses window.dmpConnectJsonApi.sendJsonCommand() to send to DMP native bridge
  • Includes performance tracking and error monitoring via NewRelic
  • Supports debug mode via dmp_visualize_payloads_and_trames feature flag

Exported Functions

Search Commands: - findDocuments(params: FindDocumentsParams) - Search document metadata with filtering - getDocumentsContent(params: GetDocumentsContentParams) - Retrieve document content by uniqueIds

Update Commands (in worktrees): - updateDocumentVisibility(params: UpdateDocumentVisibilityByUniqueIdParams) - FHIR-2022 - updateDocumentStatus(params: UpdateDocumentStatusByUniqueIdParams) - FHIR-2023

Session Management: - openSession() - Create DMP session with dcParameters (prod vs dev) - getDmpMajorityAge(sessionId) - Check patient age status - getSessionState(sessionId) - Poll session status - readCpxCard(sessionId, pin) - Read CPS card with PIN - getCpxStatus(sessionId) - Card reader status - getPcscReaders(sessionId) - List available readers - getCpxCard(sessionId, readerName) - Get card from reader - getAuthentificationDmpStatusForPatient(workflow) - Check patient DMP availability

Document Operations: - sendDocument({...}) - Upload document to DMP with sharing settings - deleteDocument({...}) - Remove document from DMP

Utility: - getPatientInsForDMP(patient) - Format INS with test suffix for dev/prod


3. Package Exports (index.ts)

The @doctolib/dmp package exports: - All communication functions: findDocuments, getDocumentsContent, findDocuments, deleteDocument, etc. - All type definitions from FrDmpTypes - Constants: DOCUMENT_STATUS, DOCUMENT_VISIBILITY, FR_DMP_DOCUMENT_FORMAT, etc. - Helper functions for DMP setup and utilities


4. Validation Page UI Architecture

Command Handler Pattern

commandHandlers.ts - Maps commands to business logic:

export type CommandResponse = FindDocumentsResponse | GetDocumentsContentResponse | UpdateDocumentStatusByUniqueIdResponse

export const COMMAND_HANDLERS: Partial<Record<DmpCommand, CommandHandler>> = {
  hl_findDocuments: (sessionId, params) => findDocuments({ sessionId, ...params }),
  hl_getDocumentsContentByUniqueId: (sessionId, params) => getDocumentsContent({ sessionId, ...params }),
  hl_updateDocumentStatusByUniqueId: (sessionId, params) => updateDocumentStatus({ sessionId, ...params }),  // FHIR-2023
  hl_updateDocumentVisibilityByUniqueId: (sessionId, params) => updateDocumentVisibility({ sessionId, ...params })  // FHIR-2022
}

Types

export type DmpCommand = 
  | 'hl_findDocuments'
  | 'hl_getDocumentsContentByUniqueId'
  | 'hl_updateDocumentVisibilityByUniqueId'  // FHIR-2022
  | 'hl_updateDocumentStatusByUniqueId'      // FHIR-2023
  | 'hl_getDocumentHistoryByUniqueId'
  | 'hl_setDmpAccessMode'

Constants & Labels

COMMAND_LABELS: Record<DmpCommand, string> = {
  hl_findDocuments: 'Search for DMP documents',
  hl_getDocumentsContentByUniqueId: 'Get document content',
  hl_updateDocumentVisibilityByUniqueId: 'Update document visibility',
  hl_updateDocumentStatusByUniqueId: 'Update document status',
  hl_getDocumentHistoryByUniqueId: 'Get document history',
  hl_setDmpAccessMode: 'Enable emergency access mode',
}

PATIENT_INS = '188102B17295165T'  // Test patient (note T suffix for dev)

5. Request Templates (Template Factory Pattern)

Each command has a factory function that generates request templates:

hlFindDocuments.ts

{
  s_commandName: 'hl_findDocuments',
  s_sessionId: sessionId,
  s_ins: patientIns,
  Categories: { '#0': '' },
  Formats: { '#0': '' },
  Practices: { '#0': '' },
  s_creationDateBottom: '',
  s_creationDateTop: '',
  // ... all date filters
  i_status: 0,
  i_visibility: 0,
  i_disableMetadataSearch: 0,
  ReferenceIds: [],
  EventCodes: [],
  i_getTransactionFrames: 0,
}

hlGetDocumentsContentByUniqueId.ts

{
  s_commandName: 'hl_getDocumentsContentByUniqueId',
  s_sessionId: sessionId,
  UniqueIds: ['1.2.250.1.213.1.1.9.123.456'],
  Uuids: [''],
  i_getCdaHeaders: 0,
  i_getCdaContent: 0,
  i_getPerformer: 0,
  i_getInformants: 0,
  i_getAuthors: 1,
  i_getDataEnterer: 0,
  i_getParticipants: 0,
  i_getAuthenticators: 0,
  i_getDocumentContent: 1,
  i_getTransactionFrames: 0,
}

hlUpdateDocumentVisibilityByUniqueId.ts (FHIR-2022)

{
  s_commandName: 'hl_updateDocumentVisibilityByUniqueId',
  s_sessionId: sessionId,
  s_ins: patientIns,
  s_documentUniqueId: '1.2.250.1.213.1.1.9.123.456',
  s_documentUuid: '',
  s_healthCareSettings: '',
  i_newVisibility: 2,
  i_getTransactionFrames: 0,
}

hlUpdateDocumentStatusByUniqueId.ts (FHIR-2023)

{
  s_commandName: 'hl_updateDocumentStatusByUniqueId',
  s_sessionId: sessionId,
  s_ins: patientIns,
  s_documentUniqueId: '1.2.250.1.213.1.1.9.123.456',
  s_documentUuid: '',
  s_healthCareSettings: 'SA07',
  i_getTransactionFrames: 0,
}

hlGetDocumentHistoryByUniqueId.ts

{
  s_commandName: 'hl_getDocumentHistoryByUniqueId',
  s_sessionId: sessionId,
  s_ins: patientIns,
  s_uniqueId: '1.2.250.1.213.1.1.9.123.456',
  s_uuid: '',
  i_limitPreviousCount: 0,
  i_limitNextCount: 0,
  i_getTransactionFrames: 0,
}

hlSetDmpAccessMode.ts

{
  s_commandName: 'hl_setDmpAccessMode',
  s_sessionId: sessionId,
  i_accessMode: 2,
  s_reason: 'Patient inconscient - urgence vitale',
}

6. ValidationPage Component (ValidationPage.tsx)

State Management

const [selectedCommand, setSelected

…(truncated, 2863 more chars)

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date