Session: agent-ab8b29-subagent-ab8b291c — 2026-06-01

records-ui · Claude · branch main · claude-haiku-4-5-20251001 · 2026-06-01 08:14 · 1 msgs · 20 tools · 13 min read · updated today

Explore the codebase at `/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui`...

tools: Bash, Read
← records-ui Download .md .txt .json
Tool calls
Read Read: 18 calls (90.0%) 18 Bash Bash: 2 calls (10.0%) 2
Token usage3.9M total
Input162
Cache creation372.5K
Cache read3.6M
Output5.7K
Cache hit ratio91%· healthy

Project: records-ui · Branch: main · Mode: ` · **Model:**claude-haiku-4-5-20251001`

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

Conversation

Turn 1 — User

Explore the codebase at /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui thoroughly. I need to understand:

  1. The overall directory and file structure — list all files and directories
  2. The key abstractions, modules, and their interfaces (React components, hooks, utilities, types, API calls)
  3. Where there are shallow modules (interfaces nearly as complex as the implementation)
  4. Where understanding one concept requires bouncing between many small modules
  5. Where tightly-coupled modules leak across their seams
  6. Which parts are hard to test through their current interface
  7. Any domain vocabulary visible in file/component names

For each major area, note: - What files are involved - What they do - What friction you observe (complexity leaks, shallow abstractions, coupling)

Be thorough — read the actual file contents of the key files (components, hooks, types, API clients). Don't just list filenames.

Turn 1 — Assistant

I'll conduct a thorough exploration of this codebase. Let me start by understanding the directory structure and then dive into key files.

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -type f -name "*.json" -o -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" | head -100

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/rsbuild.config.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/i18n.json /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/package.json /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tsconfig.build.json /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/tsconfig. …(truncated, 11117 more chars)

Let me get a clearer view of the source directory structure:

Tools used:

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

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/tests/index.test.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/builders/clinicalDrive.test.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/builders/clinicalDrive.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createMoreActi …(truncated, 24364 more chars)

Now let me read the key files to understand the architecture. Let me start with the main entry points and types:

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/index.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/types.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/package.json

Tool results:

→ result (ok): 1 export { AlphaFloatingToolbar } from './components/AlphaFloatingToolbar' 2 export type { AlphaFloatingToolbarProps, FloatingToolbarAction } from './components/AlphaFloatingToolbar' 3 export { NhrDocumentList } from './components/NhrDocumentList/NhrDocumentList' 4 export { NhrDocumentListFilterPanel } from './components/NhrDocumentListFilterPanel/NhrDocumentListFilterPanel' 5 export type { 6 ActionConfig, 7 BulkActionConfig, 8 DropdownActionOption, 9 BasicActionConfig, 10 DropdownActi …(truncated, 2625 more chars)

Tool results:

→ result (ok): 1 import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 2 import type { NhrDocument, NhrResultStatus } from '@doctolib/tpf-national-health-records' 3 import type { ReactNode } from 'react' 4
5 export type NhrPatientInfo = { 6 fullName: string 7 gender: 'male' | 'female' | 'other' 8 birthDate: string 9 age: number 10 } 11
12 export type ColumnConfig = { 13 key: string 14 header: string 15 sortable: boolean 16 /** Only required when sortable: true. Return …(truncated, 6042 more chars)

Tool results:

→ result (ok): 1 { 2 "name": "@doctolib/tpf-national-health-records-ui", 3 "version": "18.2.0", 4 "repository": { 5 "type": "git", 6 "url": "git+https://github.com/doctolib/treatment-plan.git" 7 }, 8 "keywords": [ 9 "upfront", 10 "modular frontend", 11 "smaller-scope" 12 ], 13 "author": "@doctolib/fire", 14 "license": "Doctolib", 15 "doctolib": { 16 "upfront-type": "smaller-scope" 17 }, 18 "type": "module", 19 "sideEffects": [ 20 "./src/i18n.ts" 21 ], 22
…(truncated, 3910 more chars)

Now let me examine the main components and data layer:

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/data/clinicalDrive.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.hooks.ts

Tool results:

→ result (ok): 1 import { t } from '#i18n' 2 import { Alert } from '@doctolib/design-system/Alert' 3 import { Modal } from '@doctolib/design-system/Modal' 4 import { ModalBody } from '@doctolib/design-system/ModalBody' 5 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 6 import { type Dispatch, type SetStateAction, useCallback, useEffect, useState } from 'react' 7
8 import { addToast } from '../../business/toast' 9 import type { 10 ActionConfig, 11 BulkActionConfig, 12 ColumnConf …(truncated, 6347 more chars)

Tool results:

→ result (ok): 1 import { useCreateDocument } from '@doctolib/clinical-drive' 2 import type { NhrDocumentContentResult, NhrPatientInformation } from '@doctolib/tpf-national-health-records' 3 import { useCallback } from 'react' 4
5 import { buildClinicalDriveImportPayload } from '../business/builders/clinicalDrive' 6 import type { NhrCdaMetadataRequest, NhrDocumentCategorizationRequest } from '../business/builders/clinicalDrive' 7
8 type UseImportToClinicalDriveProps = { 9 recorderId: number 10 organizati …(truncated, 907 more chars)

Tool results:

→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 2 import { useCallback, useEffect, useMemo, useState } from 'react' 3
4 import { addToast } from '../../business/toast' 5 import type { ActionConfig, ActionOnClick, BulkActionConfig } from '../../types' 6 import type { FloatingToolbarAction } from '../AlphaFloatingToolbar' 7
8 function wrapWithLoading( 9 onClick: ActionOnClick, 10 setIsLoading: (loading: boolean) => void 11 ): (doc: NhrDocument) => Promise<void> { 1 …(truncated, 4588 more chars)

Let me continue reading key business logic and component composition files:

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrDocumentList.tsx

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/builders/clinicalDrive.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/MultiSelectDropdown/MultiSelectDropdown.tsx

Tool results:

→ result (ok): 1 import { getPagedData } from '#utils/nhrPaginationHelpers' 2 import { SpinnerLoader } from '@doctolib/design-system/SpinnerLoader' 3 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 4 import { useMemo, useState } from 'react' 5
6 import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo } from '../../types' 7 import { NhrDocumentListFilterPanel } from '../NhrDocumentListFilterPanel/NhrDocumentListFilterPanel' 8 import { NhrDocumentListHeader } from '../Nhr …(truncated, 4605 more chars)

Tool results:

→ result (ok): 1 import type { CreateDocumentRequest } from '@doctolib/clinical-drive/types' 2 import type { NhrDocumentContentResult, NhrPatientInformation } from '@doctolib/tpf-national-health-records' 3
4 /* 5 * The subset of categorization fields the builder needs to construct a valid FacetRequest. 6 * concept and group come from the surrounding DocumentCategorizationGroupContent in the 7 * monolith's NhrDocumentCategorization. 8 / 9 export type NhrDocumentCategorizationRequest = { 10 facet: { 11
…(truncated, 4664 more chars)

Tool results:

→ result (ok): 1 import type { Option } from '@doctolib/design-system/Option' 2 import { useId, useMemo, useRef, useState } from 'react' 3
4 import { normalize } from './MultiSelectDropdown.helpers' 5 import { useDropdownClose } from './MultiSelectDropdown.hooks' 6 import { MultiSelectDropdownLabel } from './MultiSelectDropdownLabel/MultiSelectDropdownLabel' 7 import { MultiSelectDropdownPopup } from './MultiSelectDropdownPopup/MultiSelectDropdownPopup' 8 import { MultiSelectDropdownTrigger } from './MultiSel …(truncated, 2423 more chars)

Let me check more component files to understand the patterns and shallow abstractions:

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrStatusColumn.tsx

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/filters/createNhrDocumentCategoryFilterConfig.tsx

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListFilterPanel/NhrDocumentListFilterPanel.tsx

Tool results:

→ result (ok): 1 import type { PillColor } from '@doctolib/design-system/Pill' 2 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 3
4 import { NhrStatusCell } from '../../../components/NhrDocumentList/NhrStatusCell' 5 import type { ColumnConfig } from '../../../types' 6
7 / Pill config for a single recognized status token */ 8 export type NhrDocumentStatusConfig = { 9 label: string 10 color?: PillColor 11 } 12
13 export type NhrStatusColumnOptions = { 14 /
Translated column …(truncated, 1764 more chars)

Tool results:

→ result (ok): 1 import { t } from '#i18n' 2 import type { Option } from '@doctolib/design-system/Option' 3
4 import { NhrDocumentCategoryFilter } from '../../../components/NhrDocumentCategoryFilter' 5 import type { FilterConfig } from '../../../types' 6
7 export const createNhrDocumentCategoryFilterConfig = ({ 8 options = [], 9 label = t('tpf_national_health_records_ui.document_list.filter_panel.document_category.label'), 10 placeholder, 11 }: { 12 options?: Option[] 13 label?: string 14 placeho …(truncated, 739 more chars)

Tool results:

→ result (ok): 1 import { t } from '#i18n' 2 import { ArrowRotateLeftRegularIcon } from '@doctolib/design-system-icons/ArrowRotateLeftRegularIcon' 3 import { Button } from '@doctolib/design-system/Button/v2' 4 import { Divider } from '@doctolib/design-system/Divider' 5 import { IconButton } from '@doctolib/design-system/IconButton/v2' 6 import { Paragraph } from '@doctolib/design-system/Paragraph' 7 import { useEffect, useState } from 'react' 8
9 import type { FilterConfig } from '../../types' 10
11 export t …(truncated, 4701 more chars)

Let me read a few more key files to understand the cell patterns and the action factories:

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrStatusCell/NhrStatusCell.tsx

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createViewDocumentAction.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/AlphaFloatingToolbar/AlphaFloatingToolbar.tsx

Tool results:

→ result (ok): 1 import type { PillColor } from '@doctolib/design-system/Pill' 2 import { Pill } from '@doctolib/design-system/Pill' 3
4 type StatusConfig = { 5 label: string 6 color?: PillColor 7 } 8
9 type Props = { 10 rawStatus: string | undefined 11 splitStatus: ((status: string) => string[]) | undefined 12 statusMap: Record<string, StatusConfig> 13 defaultStatus: StatusConfig 14 } 15
16 const resolveStatuses = ( 17 rawStatus: string | undefined, 18 splitStatus: ((status: string) => stri …(truncated, 994 more chars)

Tool results:

→ result (ok): 1 import { t } from '#i18n' 2 import { EyeRegularIcon } from '@doctolib/design-system-icons/EyeRegularIcon' 3
4 import type { ActionOnClick, SimpleActionConfig } from '../../../types' 5
6 export const createViewDocumentAction = (onClick: ActionOnClick): SimpleActionConfig => ({ 7 kind: 'simple', 8 key: 'view', 9 tooltip: t('tpf_national_health_records_ui.document_list.table.row_actions.view_document.tooltip'), 10 iconComponent: EyeRegularIcon, 11 variant: 'transparent', 12 onClick, …(truncated, 9 more chars)

Tool results:

→ result (ok): 1 import { t } from '#i18n' 2 import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 3 import { Button } from '@doctolib/design-system/Button/v2' 4 import { IconButton } from '@doctolib/design-system/IconButton/v2' 5 import { Span } from '@doctolib/design-system/Span' 6 import type { FC } from 'react' 7
8 const classes = { 9 root: 'absolute bottom-32 left-1/2 -translate-x-1/2 z-10', 10 bar: 'flex items-center bg-[var(--oxygen-color-primitive-gray-800)] rounded-[8px] …(truncated, 2744 more chars)

Let me check a few more utility and test-helper files to complete the understanding:

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/utils/nhrPaginationHelpers.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/test-helpers/fixtures/nhrDocumentFixtureBuilder.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.tsx

Tool results:

→ result (ok): 1 export const PAGE_SIZE = 20 2
3 /* 4 * @deprecated Server-side pagination (FHIR-2182) moves slicing to the hook layer. 5 * Remove in the next TPF major release once the monolith hook bump has rolled out. 6 / 7 export const getPagedData = <T>(data: T[] | undefined, currentPage: number): T[] | undefined => 8 data?.slice((currentPage - 1) * PAGE_SIZE, currentPage * PAGE_SIZE) 9

Tool results:

→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 2
3 import { createFixtureBuilder } from './createFixtureBuilder' 4
5 export const nhrDocumentFixtureBuilder = createFixtureBuilder<NhrDocument>({ 6 id: '1', 7 title: 'SOPK test results', 8 creationDate: '2025-01-13', 9 submissionDate: '2025-01-18', 10 status: 'Current', 11 visibility: 'Visible to all', 12 format: 'application/pdf', 13 authors: [{ id: 'doc1', firstName: 'Mario', lastName: 'Casas', role: …(truncated, 120 more chars)

Tool results:

→ result (ok): 1 import { PAGE_SIZE } from '#utils/nhrPaginationHelpers' 2 import { Pagination } from '@doctolib/design-system/Pagination' 3 import { Table } from '@doctolib/design-system/Table' 4 import type { NhrDocument } from '@doctolib/tpf-national-health-records' 5
6 import type { ActionConfig, ColumnConfig } from '../../../types' 7 import { NhrDocumentListTableBody } from './NhrDocumentListTableBody/NhrDocumentListTableBody' 8 import { NhrDocumentListTableHead } from './NhrDocumentListTableHead/NhrDocu …(truncated, 1986 more chars)

Perfect. Now let me create a comprehensive summary report based on my analysis.

Codebase Architecture Report: tpf-national-health-records-ui

1. Overall Structure

Location: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui

Project Type: React/TypeScript library (modular frontend component package)

Key Directories: - src/components/ — React UI components (modal, document list, filters, cells, toolbar) - src/business/ — Business logic (factories for columns/filters/actions, builders, formatters) - src/data/ — Data fetching hooks (Clinical Drive integration) - src/utils/ — Utility functions (pagination, date helpers) - src/locales/ — i18n translations (FR, EN, DE, IT) - src/test-helpers/ — Test fixtures and builders

Package Role: Provides a modular NHR (National Health Records) document list UI for the French health care system, with support for filtering, bulk actions, and document display.


2. Key Abstractions & Interfaces

Main Exported Components

  1. NhrDocumentListModal (the orchestrator) - File: src/components/NhrDocumentListModal/NhrDocumentListModal.tsx - Purpose: Fullscreen modal managing document list with filtering, pagination, and bulk actions - Interface: ```typescript type NhrDocumentListModalProps = { isOpen: boolean onClose: () => void title: string patient: NhrPatientInfo columns: ColumnConfig[] filters: FilterConfig[] searchDocuments: SearchDocumentsFn actions?: ActionConfig[] bulkActions?: [BulkActionConfig, ...BulkActionConfig[]] paginationMode?: 'server' | 'client' }
 - **Responsibilities**: Manages filter state, pagination, loading, bulk selection, and coordinates hooks

2. **`NhrDocumentList`** (middle layer)
 - **File**: `src/components/NhrDocumentList/NhrDocumentList.tsx`
 - **Purpose**: Presentation layer; wraps table, header, and filter panel
 - **Props**: Accepts both controlled and uncontrolled modes for pagination and filtering
 - **Friction**: Acts as a thin pass-through; most state management is in Modal, not here

3. **`NhrDocumentListTable`** (table renderer)
 - **File**: `src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.tsx`
 - **Purpose**: Renders the table with head, body, and pagination control
 - **Responsible for**: Table structure, column rendering, row selection UI

4. **`AlphaFloatingToolbar`** (bulk actions UI)
 - **File**: `src/components/AlphaFloatingToolbar/AlphaFloatingToolbar.tsx`
 - **Purpose**: Floating toolbar showing selected count and bulk action buttons
 - **Tight concern**: Shows/hides based on selection count; renders action buttons with loading state

#### **Domain Type System** (`src/types.ts`)

```typescript
ColumnConfig       // { key, header, sortable, sortAccessor, render, width }
FilterConfig       // { key, render() }
ActionConfig       // SimpleActionConfig | DropdownActionConfig
BulkActionConfig   // { key, label, formatSuccessMessage, formatErrorMessage, handler }
SearchDocumentsFn  // (filters?, page?) => Promise<SearchDocumentsResult>
SearchDocumentsResult // { data, total, status, currentPage }
NhrPatientInfo     // { fullName, gender, birthDate, age }

3. Shallow Abstractions & Complexity Leaks

Problem Areas:

  1. Factory Functions as Shallow Wrappers - Location: src/business/factories/columns/ and src/business/factories/filters/ - Issue: Many factories are 1:1 wrappers with minimal transformation logic - Example (createViewDocumentAction.ts): ```typescript export const createViewDocumentAction = (onClick: ActionOnClick): SimpleActionConfig => ({ kind: 'simple', key: 'view', tooltip: t(...), iconComponent: EyeRegularIcon, variant: 'transparent', onClick, })
   **Friction**: This factory adds only translation and icon lookup; callers could construct the object directly.

 - **Example** (`createNhrDocumentCategoryFilterConfig.tsx`):
   ```typescript
   render: (filters, onChange, _ctx) => {
     const selectedValues = Array.isArray(filters.typeCodes) ? (filters.typeCodes as string[]) : []
     return <NhrDocumentCategoryFilter ... />
   }
 **Friction**: The factory wraps the component but delegates almost all logic to the component. The factory's render function contains runtime type coercion (`Array.isArray`) that should be validated upstream.
  1. Modal State Complexity Spread Across Hooks - Location: NhrDocumentListModal.tsx + NhrDocumentListModal.hooks.ts - Issue: State management is split between the component and hooks, making it hard to see the full lifecycle - Example:

    • Modal manages: rows, total, isLoading, appliedFilters, requestedPage
    • useWrappedActions() manages: isActionLoading
    • useNhrBulkActions() manages: selectedIds, bulkActionError, isBulkActionLoading
    • Friction: To understand the complete loading state, you must hop between 3 locations. The modal's fetchDocuments function is a module-level async function (not a hook), which is unusual and couples it tightly to the component's state setter signature.
  2. Filter Panel State Duplication - Location: NhrDocumentListFilterPanel.tsx - Issue: Maintains both appliedFilters (committed) and pendingFilters (in-flight) - Line 92-97: The component explicitly syncs pending state when opened via useEffect - Friction: If filters are large objects, this creates unnecessary re-renders and state duplication. The pattern is clear but involves manual state reconciliation that could be automated.

  3. Cell Components Receive Rendering Logic as Props - Location: NhrStatusCell.tsx + all other *Cell components - Issue: Components like NhrStatusCell receive complex logic props (splitStatus, statusMap, defaultStatus) - Code: ```typescript export const NhrStatusCell = ({ rawStatus, splitStatus, statusMap, defaultStatus }: Props) => { const toRender = resolveStatuses(rawStatus, splitStatus, statusMap, defaultStatus) return <div>{toRender.map(renderStatus)}</div> }

``` - Friction: The cell is presentational, but callers must pre-compute the entire status resolution logic and pass it in. This couples the cell interface to the resolution strategy.


4. Bouncing Between Modules for Single Concepts

Example: "Document Selection"

To understand how document selection works end-to-end, you must read: 1. NhrDocumentListModal.tsx — calls useNhrBulkActions() 2. NhrDocumentListModal.hooks.ts — defines useNhrBulkActions(), which returns selectedIds, onSelectionChange, onSelectAll 3. NhrDocumentList.tsx — passes selection props to NhrDocumentListTable 4. NhrDocumentListTable.tsx — passes to NhrDocumentListTableHead and NhrDocumentListTableBody 5. NhrDocumentListTableHead.tsx — renders checkbox, computes selection state (all|some|none) 6. NhrDocumentListTableBody.tsx — maps rows, renders checkboxes, calls onSelectionChange

Cost: 6 files to understand one feature.

Example: "Pagination"

  1. Modal's requestedPage state + setRequestedPage
  2. Modal's effectivePage computation (conditional on isServerMode)
  3. NhrDocumentList — receives currentPageProp and onPageChange, uses internal fallback
  4. NhrDocumentListTable — receives computed page, calls onPageChange, passes to Pagination
  5. getPagedData() utility — client-side slicing in NhrDocumentList
  6. Modal's searchDocuments call — server-side in fetchDocuments

Cost: The logic spans 5+ files and switches between controlled/uncontrolled modes mid-chain.


5. Tightly Coupled Modules & Seam Leaks

…(truncated, 7325 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