Session: you-are-a-senior-indexed-petal-subagent-a5fbc7bf — 2026-05-05

doctolib-doctolib · Claude · branch .invalid · claude-haiku-4-5-20251001 · 2026-05-05 13:57 · 1 msgs · 25 tools · 13 min read · updated 2 days ago

Explore the adapter layer for National Health Records at /Users/USER/workspace/doctolib/doctolib/packages/@docto...

tools: Bash, Read
← doctolib-doctolib Download .md .txt .json
Tool calls
Read Read: 19 calls (76.0%) 19 Bash Bash: 6 calls (24.0%) 6
Token usage3.7M total
Input171
Cache creation253.8K
Cache read3.4M
Output2.0K
Cache hit ratio93%· healthy

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

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

Conversation

Turn 1 — User

Explore the adapter layer for National Health Records at /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/

I need to understand: 1. All files and their structure (list directories and key files) 2. The DmpNhrAdapter - read its full content 3. Any existing interfaces (NhrAdapter, NhrService) defined here 4. What actions/methods are exposed by this adapter 5. How it interfaces with the DMP layer (imports, method signatures) 6. Any existing observability or monitoring code in this package 7. The package.json to understand dependencies

Be thorough - read all source files in this package. This is for planning an observability strategy.

Turn 1 — Assistant

I'll explore the National Health Records adapter layer thoroughly. Let me start by understanding the directory structure and then read all the source files.

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src -type f -name "*.ts" -o -name "*.tsx" -o -name "*.json" | head -50

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/index.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/filterMockedDocuments.test.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/filterMockedDocuments.ts /Users/USER/workspace/doctolib/doctolib/packag …(truncated, 5619 more chars)

Let me get the package.json and then read the DmpNhrAdapter and related interface files:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/package.json

Tool results:

→ result (ok): 1 { 2 "name": "@doctolib/national-health-records", 3 "version": "1.0.0", 4 "publishConfig": { 5 "registry": "https://doctolib-580698825394.d.codeartifact.eu-west-1.amazonaws.com/npm/npm-internal/" 6 }, 7 "repository": { 8 "type": "git", 9 "url": "git+https://github.com/doctolib/doctolib.git" 10 }, 11 "keywords": [ 12 "upfront", 13 "modular frontend", 14 "in-monolith-package" 15 ], 16 "engines": { 17 "node": ">= 24.8.0", 18 "npm": ">= 11.6.0" 19
…(truncated, 1260 more chars)

Now let me read the key adapter and interface files:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.ts

Tool results:

→ result (ok): 1 DmpApi, 2 DmpAuthor, 3 DmpDocument, 4 DmpDocumentContent, 5 SearchProps, 6 SearchResult as DmpSearchResult, 7 } from '@doctolib/dmp' 8 import { DmpApiError, DOCUMENT_STATUS, DOCUMENT_VISIBILITY, getPatientInsForDMP } from '@doctolib/dmp' 9 import { isUnstructured } from '@doctolib/cda/types/UnstructuredBody' 10 import { isStructured } from '@doctolib/cda/types/StructuredBody' 11 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 12 import type { 13 NhrAdapt …(truncated, 9700 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/index.ts

Tool results:

→ result (ok): 1 export { useNationalHealthRecords, type UseNhrOperations } from './hooks/useNationalHealthRecords' 2 export { useDmpNhr } from './hooks/useDmpNhr' 3 export { useNhrDocumentListVariant } from './variants/useNhrDocumentListVariant' 4 export type { DocumentSearchOptions, NhrDocumentListVariant } from './variants/types' 5 export { actionsBuilder, type NhrActionsBuilder } from './business/builders/actionsBuilder' 6 export { useGetDocumentsContent } from './hooks/useGetDocumentsContent' 7 export { u …(truncated, 650 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useDmpNhr.ts

Tool results:

→ result (ok): 1 import { useMemo } from 'react' 2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3 import { DmpApiImpl as DmpApi, useDmpSetUp } from '@doctolib/dmp' 4 import { createNhrService } from '@doctolib/tpf-national-health-records' 5 import { useDocumentCategorizationFacetsIndex } from 'engines/document_categorization/queries/document_categorization/facets' 6 import { DmpNhrAdapter } from '../business/adapters/DmpNhrAdapter' 7 import type { UseNhrOperations } from './useNa …(truncated, 812 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/types/nhrDocumentActions.ts

Tool results:

→ result (ok): 1 export type NhrActionModalConfig = { 2 title: string 3 body: string 4 confirmLabel: string 5 } 6

Now let me read more related files to understand the complete structure:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useNationalHealthRecords.ts

Tool results:

→ result (ok): 1 import type { 2 NhrDocumentSearchProps, 3 NhrDocumentSearchResult, 4 NhrGetDocumentsContentProps, 5 NhrDocumentContentResult, 6 NhrDocumentMetadataUpdateProps, 7 NhrDocumentMetadataUpdateResult, 8 } from '@doctolib/tpf-national-health-records' 9 import { useProductLineVariation, ProductLineKey } from '@doctolib/variation_management' 10 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 11 import { useDmpNhr } from './useDmpNhr' 12
13 export type UseNhrOper …(truncated, 966 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/builders/actionsBuilder.ts

Tool results:

→ result (ok): 1 import { 2 createMoreActionsAction as moreActionsActionFactory, 3 createViewDocumentAction as viewDocumentActionFactory, 4 type ActionConfig, 5 type DropdownActionOption, 6 } from '@doctolib/tpf-national-health-records-ui' 7 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 8
9 export type NhrActionsBuilder = { 10 createViewDocumentAction: (onDocumentSelected: (document: NhrDocument) => Promise<void>) => NhrActionsBuilder 11 createMoreActionsAction: (options …(truncated, 563 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useGetDocumentsContent.ts

Tool results:

→ result (ok): 1 import { useState, useCallback } from 'react' 2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3 import type { NhrDocumentContentResult } from '@doctolib/tpf-national-health-records' 4 import type { GetDocumentsContent } from '../variants/types' 5 import { useNationalHealthRecords } from './useNationalHealthRecords' 6
7 export const useGetDocumentsContent = ({ 8 patient, 9 }: { 10 patient: Patient 11 }): { getDocumentsContent: GetDocumentsContent; documentsCon …(truncated, 1064 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useNhrDocumentStatusActions.ts

Tool results:

→ result (ok): 1 import { useCallback, useMemo, useState } from 'react' 2 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 3 import type { DropdownActionOption } from '@doctolib/tpf-national-health-records-ui' 4 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 5 import i18n from 'monolith_DEPRECATED/services/i18n' 6 import { isActive, isArchived } from '../variants/dmp/mappers/dmpDocumentHelpers' 7 import { toNhrPatientInformation } from '../business/mappers/t …(truncated, 3536 more chars)

Now let me read more files for completeness:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.ts

Tool results:

→ result (ok): 1 import { useQueryClient } from '@tanstack/react-query-v5' 2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3 import { isFeatureEnabled } from '@doctolib/variation_management' 4 import i18n from 'monolith_DEPRECATED/services/i18n' 5 import type { NhrDocumentListVariant, MapFiltersToSearchDocumentsParams, ServerFilters } from '../variants/types' 6 import { useNationalHealthRecords } from './useNationalHealthRecords' 7 import { generateNhrDocuments } from '../mocks/ge …(truncated, 2635 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useInvalidateNhrDocuments.ts

Tool results:

→ result (ok): 1 import { useQueryClient } from '@tanstack/react-query-v5' 2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3
4 export const useInvalidateNhrDocuments = (patient: Patient) => { 5 const queryClient = useQueryClient() 6 // Prefix key intentionally busts all filter variants cached for this patient 7 return () => queryClient.invalidateQueries({ queryKey: ['dmp-documents', patient.ins] }) 8 } 9

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/utils/findFacetForCDAType.ts

Tool results:

→ result (ok): 1 import type { 2 DocumentCategorizationConcept, 3 DocumentCategorizationFacet, 4 DocumentCategorizationGroup, 5 } from '@doctolib/documents-ui/types/Document' 6 import { CDA_TYPE_CODE_TO_FACET_NAME } from '../constants/cdaTypeCodeToFacetName' 7
8 function isDocumentCategorizationConcept( 9 facetsData: DocumentCategorizationGroup | DocumentCategorizationConcept 10 ): facetsData is DocumentCategorizationConcept { 11 return 'concept' in facetsData 12 } 13
14 export function findFacetBy …(truncated, 807 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters/parseHl7DateToIso.ts

Tool results:

→ result (ok): 1 // DMP API returns dates in HL7 DTM format (YYYYMMDDHHMMSS or YYYYMMDD), always UTC. 2 // JavaScript's Date constructor requires ISO 8601 — parse before storing. 3 // 14-char form gets a Z suffix so JS treats it as UTC, not local time. 4 export function parseHl7DateToIso(hl7Date: string | undefined): string | undefined { 5 if (!hl7Date) return undefined 6
7 if (/^\d{14}$/.test(hl7Date)) { 8 return `${hl7Date.slice(0, 4)}-${hl7Date.slice(4, 6)}-${hl7Date.slice(6, 8)}T${hl7Date.slice( 9 …(truncated, 256 more chars)

Let me read a few more files to complete the picture:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/types.ts

Tool results:

→ result (ok): 1 import type { ColumnConfig, FilterConfig, SearchDocumentsResult } from '@doctolib/tpf-national-health-records-ui' 2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3 import type { NhrDocumentSearchParams } from '@doctolib/tpf-national-health-records' 4
5 export type { SearchDocumentsResult } 6
7 export type NhrDocumentListVariant = { 8 columns: ColumnConfig[] 9 filters: FilterConfig[] 10 searchDocuments: (appliedFilters?: Record<string, unknown>) => Promise< …(truncated, 820 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/mappers/toNhrPatientInformation.ts

Tool results:

→ result (ok): 1 import type { NhrPatientInformation } from '@doctolib/tpf-national-health-records' 2
3 export function toNhrPatientInformation(ins: string): NhrPatientInformation { 4 return { 5 nationalHealthIdentifier: ins, 6 } 7 } 8

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/constants/cdaTypeCodeToFacetName.ts

Tool results:

→ result (ok): 1 export const CDA_TYPE_CODE_TO_FACET_NAME: Record<string, string> = { 2 'ATTEST-ASS-COMPL': 'Carte de Tiers payant', 3 'ATTEST-HEBGT': 'Autre', 4 '59284-0': 'Consentement du patient', 5 'ATTEST-DROITS-AM': 'Autre', 6 'ATTEST-RESID': 'Autre', 7 '86531-1': 'Autre', 8 'AUTORIS-SOINS': 'Consentement du patient', 9 EXPPAT_2: 'Autre', 10 '28617-9': 'Compte-rendu de Consultation', 11 '68817-6': 'Compte-rendu de Consultation', 12 '56445-0': 'Autre', 13 '34120-6': 'Autre', 14 ' …(truncated, 3502 more chars)

Now let me check the directory structure more comprehensively:

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src -type d | sort

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/builders /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/constants / …(truncated, 1408 more chars)

Let me also check for any monitoring, logging, or tracing code:

Tools used:

  • Bash: grep -r "console\|logger\|log\|monitor\|trace\|span\|metric\|observ\|telemetry\|sentry\|datadog" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src --include=" …(truncated, 34 more chars)

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/index.ts:export { NhrDocumentActionDialog } from './components/NhrDocumentActionDialog/NhrDocumentActionDialog' /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.ts: 'Cardiology consultation', /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.ts: 'Neurology EEG interpretation', /Use …(truncated, 4545 more chars)

Let me do a more focused search for observability code:

Tools used:

  • Bash: grep -r "console\." /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src --include="*.ts" --include="*.tsx"

Tool results:

→ result (ok): (Bash completed with no output)

Tools used:

  • Bash: grep -r "import.*logger\|import.*monitor\|import.*trace\|import.*metric" /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src --include="*.ts" --include="*.tsx"

Tool results:

→ result (ok): (Bash completed with no output)

Perfect. Now let me get a complete list of all source files to ensure comprehensive coverage:

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src -type f \( -name "*.ts" -o -name "*.tsx" \) | grep -v test | grep -v ".test" | sort

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters/parseHl7DateToIso.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/builders/actionsBuilder.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/constants/cdaTypeCodeToFacetName. …(truncated, 3034 more chars)

Let me read a few more key files:

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/useNhrDocumentListVariant.ts

Tool results:

→ result (ok): 1 import { useProductLineVariation, ProductLineKey } from '@doctolib/variation_management' 2 import type { DocumentSearchOptions, NhrDocumentListVariant } from './types' 3 import { useDmpDocumentListVariant } from './dmp' 4
5 export const useNhrDocumentListVariant = (patient: DocumentSearchOptions['patient']): NhrDocumentListVariant | null => { 6 const dmpVariant = useDmpDocumentListVariant(patient) 7
8 return useProductLineVariation<NhrDocumentListVariant>({ 9 variants: { 10 [Pr …(truncated, 389 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/useDmpDocumentListVariant.ts

Tool results:

→ result (ok): 1 import { columnsFactory } from './factories/columnsFactory' 2 import { filtersFactory } from './factories/filtersFactory' 3 import type { NhrDocumentListVariant, DocumentSearchOptions } from '../types' 4 import { useSearchDocuments } from '../../hooks/useSearchDocuments' 5 import { mapFiltersToSearchDocumentsParams } from './mappers/mapFiltersToSearchDocumentsParams' 6
7 export const useDmpDocumentListVariant = (patient: DocumentSearchOptions['patient']): NhrDocumentListVariant => { 8 const …(truncated, 205 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/components/NhrDocumentActionDialog/NhrDocumentActionDialog.tsx

Tool results:

→ result (ok): 1 import { Alert } from '@doctolib/design-system/Alert' 2 import { Dialog } from '@doctolib/design-system/Dialog' 3 import i18n from 'monolith_DEPRECATED/services/i18n' 4 import type { NhrActionModalConfig } from '../../types/nhrDocumentActions' 5
6 type Props = { 7 isOpen: boolean 8 config: NhrActionModalConfig | null 9 isLoading: boolean 10 error: string | null 11 onConfirm: () => void 12 onDismiss: () => void 13 } 14
15 export const NhrDocumentActionDialog = ({ isOpen, config, i …(truncated, 503 more chars)

Perfect! Now I have a comprehensive understanding. Let me create a summary document.

Comprehensive Exploration of National Health Records Adapter Layer

I've thoroughly explored the National Health Records adapter package. Here's what I found:

1. Directory Structure

/src
├── business/
│   ├── adapters/
│   │   ├── DmpNhrAdapter.ts          (Main adapter class)
│   │   └── parseHl7DateToIso.ts      (Date parsing utility)
│   ├── builders/
│   │   └── actionsBuilder.ts         (Action configuration builder)
│   ├── constants/
│   │   └── cdaTypeCodeToFacetName.ts (Document type mappings)
│   ├── mappers/
│   │   └── toNhrPatientInformation.ts
│   └── utils/
│       └── findFacetForCDAType.ts    (Document categorization logic)
├── components/
│   └── NhrDocumentActionDialog/      (React dialog component)
├── hooks/
│   ├── useDmpNhr.ts                  (Core DMP-NHR hook)
│   ├── useNationalHealthRecords.ts   (Variant selection wrapper)
│   ├── useGetDocumentsContent.ts     (Content fetching hook)
│   ├── useSearchDocuments.ts         (Search implementation)
│   ├── useNhrDocumentStatusActions.ts (Document status updates)
│   └── useInvalidateNhrDocuments.ts  (Cache invalidation)
├── variants/
│   ├── useNhrDocumentListVariant.ts
│   ├── types.ts
│   └── dmp/
│       ├── useDmpDocumentListVariant.ts
│       ├── constants.ts
│       ├── factories/               (UI configuration factories)
│       └── mappers/                (Filter/search param mapping)
├── types/
│   └── nhrDocumentActions.ts
├── mocks/                           (Test data generation)
├── locales/                         (i18n translations)
└── index.ts                         (Public exports)

2. The DmpNhrAdapter Class (Core Adapter)

Location: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.ts

Implements Interface: NhrAdapter (from @doctolib/tpf-national-health-records)

Three Main Methods:

  1. searchDocuments(props: NhrDocumentSearchProps): Promise<NhrDocumentSearchResult> - Converts NHR search parameters to DMP API format - Validates patient has nationalHealthIdentifier - Calls dmpApi.search() internally - Returns documents or error status - Maps DMP status/visibility enums - Indexes categories and formats as #0, #1, etc.

  2. getDocumentsContent(props: NhrGetDocumentsContentProps): Promise<NhrDocumentContentResult[]> - Fetches full CDA document content by unique ID and UUID - Handles both unstructured (PDF/text in nonXMLBody) and structured (full CDA XML) documents - Extracts base64-encoded content - Maps document type codes to document categorization facets - Returns files + metadata (CDA document without component)

  3. updateDocumentMetadata(props: NhrDocumentMetadataUpdateProps): Promise<NhrDocumentMetadataUpdateResult> - Updates document status (archive/unarchive via dmpApi.updateDocumentStatus()) - Returns partial success/full error/success status - Skips unsupported properties (visibility) with warning message - Handles multiple payload updates with individual error tracking

Internal Helper Functions (all private to adapter): - toStatus() / toVisibility() - Enum conversion - toEnvIns() - Patient health identifier to DMP environment INS - toIndexedRecord() - Array to indexed object mapping - toSearchProps() - Parameter transformation - toAuthor() - DmpAuthor to NhrDocumentAuthor - toClassification() - Document classification builder - toNhrDocument() - Full document mapping - toDocumentSearchResult() - Search result transformation - toNhrDocumentContentResult() - Content extraction and mapping - buildUpdateResult() - Aggregates payload results into final status

3. Existing Interfaces

NhrAdapter (imported from @doctolib/tpf-national-health-records) - Defines contract for three async methods - Implemented by DmpNhrAdapter

NhrService (created by createNhrService() from @doctolib/tpf-national-health-records) - Wrapper around adapter providing localization - Instantiated in useDmpNhr() hook with language code 'fr'

Related Types: - NhrDocumentSearchProps - Search request parameters - NhrDocumentSearchResult - Search response with status - NhrGetDocumentsContentProps - Content request - NhrDocumentContentResult - Content response - NhrDocumentMetadataUpdateProps - Update request - NhrDocumentMetadataUpdateResult - Update response - NhrResultStatus - 'success' | 'error' | 'partial success' | 'skipped'

4. Actions/Methods Exposed

Public API via exports: - DmpNhrAdapter class - useDmpNhr() hook - Returns UseNhrOperations with 3 core methods - useNationalHealthRecords() hook - Variant wrapper returning same interface - useGetDocumentsContent() - Hook for fetching document content - useNhrDocumentStatusActions() - Hook for archive/unarchive modal UI - useSearchDocuments() - Hook for document search with mocking support - useInvalidateNhrDocuments() - Cache invalidation utility - actionsBuilder - Builder for configurable document actions - NhrDocumentActionDialog - React component for status action confirmations

Query Caching (using TanStack React Query): - Cache key pattern: ['dmp-documents', ins, appliedFilters] - Stale time: 5 minutes - Retry strategy: max 3 retries, but fails immediately on DMPAccessDeniedByExcededThreshold

5. DMP Layer Integration

Dependencies on DMP: - Imports DmpApiImpl, useDmpSetUp from @doctolib/dmp - Uses DmpApi instance passed to adapter - Maps to/from DMP types: - DmpDocumentNhrDocument - DmpDocumentContentNhrDocumentContentResult - SearchProps (DMP) ← NhrDocumentSearchProps (NHR) - Leverages DMP error handling (DmpApiError, DmpApiError.message) - Uses DMP status/visibility constants (DOCUMENT_STATUS, DOCUMENT_VISIBILITY) - Uses getPatientInsForDMP() for INS resolution

Method Signatures:

dmpApi.search(searchProps: SearchProps): Promise<{ documents: DmpDocument[] } | { error: any }>
dmpApi.getDocumentsContentByUniqueId({
  ins: string
  uniqueIds: string[]
  uuids: string[]
  getCdaContent: boolean
  getAuthors: boolean
}): Promise<DmpDocumentContent[]>
dmpApi.updateDocumentStatus({
  ins: string
  documentUniqueId: string
  uuid: string
}): Promise<{ success: boolean; error?: any }>

6. Observability & Monitoring

Current Status: NO OBSERVABILITY CODE FOUND

  • No console.log/warn/error statements
  • No logger imports
  • No tracing/spans
  • No metrics collection
  • No error tracking (Sentry, Datadog, etc.)
  • No performance monitoring
  • No structured logging

What IS observable: - Error handling via DmpApiError (error codes returned in results) - Status fields in responses ('success' | 'error' | 'partial success' | 'skipped') - React Query integration provides hooks for query state - Component error states displayed in UI via NhrDocumentActionDialog

Missing observability: - No adapter method call tracking - No DMP API latency measurement - No cache hit/miss tracking - No error/exception logging - No user action audit trails - No performance metrics - No health checks or status endpoints

7. Package Dependencies

Production Dependencies:

{
  "@doctolib/cda": "^1.0.0",
  "@doctolib/design-system": "^2.32.0",
  "@doctolib/design-system-icons": "^2.24.0",
  "@doctolib/dmp": "^1.0.0",
  "@doctolib/documents-ui": "^1.0.0",
  "@doctolib/tpf-national-health-records": "^7.1.0",
  "@doctolib/tpf-national-health-records-ui": "^16.1.2",
  "@doctolib/variation_management": "^1.0.0",
  "@tanstack/react-query-v5": "npm:@tanstack/react-query@^5.51.15",
  "react": "^18.3.1",
  "react-dom": "^18.3.1"
}

Key Observations: - Heavy reliance on internal Doctolib packages - Using React Query v5 for data fetching & caching - No observability librarie …(truncated, 1003 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