colinislit
4b759c9b3d
feat(cortex): Epic 4 - Nudge MVP (Layer 3) complete
...
Proactive suggestions after successful actions - proof of concept.
E4.S1 - Protocol Rules (lib/cortex/nudge.ts)
- ProtocolRule and ProtocolCondition types
- Condition operators: equals, contains, matches, exists
- 2 hardcoded rules: wondzorg-controle, medicatie-controle
E4.S2 - evaluateNudge Function
- evaluateNudge(input) returns NudgeSuggestion[]
- checkCondition() helper for rule matching
- Priority sorting (high → medium → low)
E4.S3 - NudgeToast Component
- Countdown progress bar with auto-dismiss (5 min)
- Priority-based styling (low/medium/high)
- Accept and dismiss buttons
- Framer Motion animations
E4.S4 - Integration
- NudgeToast rendered in CommandCenter (fixed position)
- Trigger added in DagnotatieBlock after successful save
- Accept opens corresponding artifact with prefilled data
Demo flow:
1. Create dagnotitie with "wond" in content
2. Save → NudgeToast appears
3. Click "Ja, inplannen" → Appointment artifact opens
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 12:42:49 +01:00
colinislit
42d64761ec
feat(cortex): Epic 3 - UI Components complete
...
Epic 3 delivers the visual layer for multi-intent flows and clarification:
E3.S1 - ActionChainCard (3 SP)
- Container for multi-intent chain display
- Header with AI/Local source badge and action count
- Original user input context
- Stacked ActionItems with Framer Motion animations
- Collapsible AI reasoning section
- Status-dependent styling (pending/executing/completed/partial/failed)
E3.S2 - ActionItem (2 SP)
- 6 status icons (pending, confirming, executing, success, failed, skipped)
- Dutch intent labels via shared intent-labels.ts
- Confidence badge with color coding (green ≥90%, amber ≥70%, red <70%)
- Entity summary formatting
- Confirmation buttons for confirming status
- Retry button for failed + recoverable actions
E3.S3 - ClarificationCard (2 SP)
- Amber-themed styling for question context
- Header with HelpCircle icon
- Original user input display
- Responsive options grid (2 cols desktop, 1 col mobile)
- Dismiss button and cancel link
- Framer Motion entry/exit animations
E3.S4 - ProcessingIndicator (1 SP)
- 3 variants: spinner, skeleton, pulse
- 3 sizes: sm, md, lg
- Configurable message
- InlineSpinner export for buttons
Integration in ChatPanel (v4.0):
- V2 store hooks for activeChain, pendingClarification
- Event handlers for confirm/skip/retry/dismiss
- Conditional rendering with AnimatePresence
New files:
- lib/cortex/intent-labels.ts
- components/cortex/chat/action-chain-card.tsx
- components/cortex/chat/action-item.tsx
- components/cortex/chat/clarification-card.tsx
- components/cortex/chat/processing-indicator.tsx
Modified:
- components/cortex/chat/chat-panel.tsx (v3.0 → v4.0)
- docs/intent/bouwplan-cortex-v2.md (v1.2 → v1.3)
Progress: 35/48 SP (73%) - E0, E1, E2, E3 complete
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 12:02:15 +01:00
colinislit
b36df63d03
feat(cortex): Epic 2 - Intent Orchestrator (Layer 2) complete
...
Implements AI-powered multi-intent classification for Cortex V2.
When Reflex Arc (Layer 1) detects complexity, it escalates to
the Orchestrator for intelligent classification using Claude 3.5 Haiku.
E2.S1 - System prompt for Orchestrator
- ORCHESTRATOR_SYSTEM_PROMPT constant with Dutch instructions
- Multi-intent detection (en, daarna, ook, eerst, vervolgens)
- Pronoun resolution rules (hij/zij → active patient)
- JSON-only output format specification
E2.S2 - Context formatting for AI
- formatContextForPrompt() with emoji structure
- Dutch labels for shifts and views
- Graceful null handling, token limiting (max 5 agenda, 3 recent)
E2.S3 - AI classification endpoint
- classifyWithOrchestrator() calling Claude 3.5 Haiku
- Builds IntentChain from AI response
- Tracks tokens used and processing time
E2.S4 - IntentChain parsing with Zod
- parseAIResponse() with Zod schema validation
- Strips markdown code blocks
- Partial extraction for malformed responses
- Graceful fallback to intent: 'unknown'
E2.S5 - POST /api/cortex/classify hybrid endpoint
- Reflex first, escalate to Orchestrator if needed
- Response includes handledBy: 'reflex' | 'orchestrator'
- Auth check, feature flag check, request validation
E2.S6 - Graceful fallback
- buildFallbackChain() with confidence cap (0.6)
- buildChainFromReflex() for simple chains
- classifyWithTimeout() wrapper (5s default)
New files:
- lib/cortex/orchestrator.ts (~780 lines)
- app/api/cortex/classify/route.ts (~180 lines)
Key deliverable: "Zeg Jan af en maak notitie" correctly
parsed into 2 actions in an IntentChain.
Progress: 27 SP / 48 SP (56%) - E0, E1, E2 complete
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-01 11:28:14 +01:00
colinislit
7df92dd2fb
feat(blog): enhance blog functionality and SEO
...
- Added a new '/blog' route to middleware for improved navigation.
- Updated sitemap to dynamically include blog posts and series URLs.
- Enhanced blog page metadata with Open Graph and Twitter card information.
- Implemented structured data for blog posts and series to improve SEO.
- Removed outdated blog post "Week 1: De Kickoff" from content.
- Introduced optional OG image field in blog frontmatter for better sharing visuals.
2026-01-01 10:56:34 +01:00
colinislit
e7294e712f
feat(navigation): add Blog link to Dutch navigation
...
- Introduced a new link for "Blog" in the navigation JSON file, enhancing user access to blog content.
2026-01-01 09:39:30 +01:00
colinislit
c1dc92035b
feat(cortex): Epic 1 - Reflex Arc (Layer 1) classifier
...
Implement fast local intent classification with escalation-aware logic.
Target: <20ms processing time for simple commands.
E1.S1 - Pattern Matching
- New reflex-classifier.ts with 7 intent types
- Top-2 match tracking for ambiguity detection
- Confidence thresholds (0.7) and ambiguity threshold (0.1)
E1.S2 - Escalation Triggers
- Multi-intent detection: "en", "daarna", "eerst", "vervolgens"
- Context-dependent pronouns: "hij", "zij", "hem", "haar", "zijn"
- Relative time expressions: "morgen", "overmorgen", "volgende week"
E1.S3 - Ambiguity Detection
- Top-2 score comparison (delta < 0.1 → escalate)
- secondBestIntent and secondBestConfidence tracking
- Low confidence escalation (< 0.7)
E1.S4 - Unit Tests
- 25 tests covering all scenarios
- Performance test: 100 classifications in <1ms
- Test runner: pnpm tsx (no Jest/Vitest setup required)
New files:
- lib/cortex/reflex-classifier.ts
- lib/cortex/__tests__/reflex-classifier.test.ts
Run tests: pnpm tsx lib/cortex/__tests__/reflex-classifier.test.ts
Progress: 14 SP / 48 SP (29%) - E0 + E1 complete
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 16:24:33 +01:00
colinislit
ccdc425d78
docs(cortex): update Epic 0 status to Done in bouwplan
...
- Epic 0 status: ⏳ To Do → ✅ Done
- All 5 stories (E0.S1-S5) marked as complete
- All done criteria checkboxes marked as checked
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 12:51:42 +01:00
colinislit
0215d7bb92
feat(cortex): update confidence thresholds and API endpoints for Cortex V2
...
- Adjusted confidence threshold for executing simple commands from >0.9 to >=0.7 in architecture documentation and code.
- Updated API endpoint paths from `/api/intent/*` to `/api/cortex/*` for intent classification and execution.
- Modified related tests to reflect the new confidence threshold and endpoint changes.
This update enhances the system's responsiveness to user commands while maintaining clarity in API structure.
2025-12-31 12:49:24 +01:00
colinislit
cf26022583
feat(cortex): Epic 0 - Foundation & Context voor V2 architectuur
...
Implementeert de basis voor de Cortex V2 three-layer architecture.
E0.S1 - CortexContext Types (lib/cortex/types.ts):
- EscalationReason type voor Reflex → Orchestrator
- LocalClassificationResult met ambiguity detection
- CortexContext voor AI classificatie context
- IntentChain en IntentAction voor multi-intent flows
- NudgeSuggestion voor proactieve suggesties
- CONFIDENCE_THRESHOLD (0.7) en AMBIGUITY_THRESHOLD (0.1)
- getCurrentShift() utility (DRY - herbruikbaar)
E0.S2 - Context API (app/api/cortex/context/route.ts):
- GET endpoint voor huidige context
- Haalt agenda vandaag op uit database
- Retourneert CortexContext object
E0.S3 - Feature Flags (lib/config/feature-flags.ts):
- CORTEX_V2_ENABLED, CORTEX_MULTI_INTENT
- CORTEX_NUDGE, CORTEX_LOGGING
- isFeatureEnabled() helper
- Dev mode: default true
E0.S4 - CortexStore V2 (stores/cortex-store.ts):
- Types geïmporteerd uit lib/cortex (DRY)
- ChatEntities type voor AI responses (string-based)
- V2 state: context, activeChain, chainHistory, suggestions
- V2 actions: chain management, nudge management, clarification
E0.S5 - Classification Logging (lib/cortex/logger.ts):
- PII sanitization (BSN, tel, namen, email)
- logClassification(), logEscalation(), logNudge()
- logPerformance() met threshold checks
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-31 12:46:35 +01:00
colinislit
06287d49f4
refactor(login): update interface preference from 'swift' to 'cortex'
...
- Changed default interface preference in LoginForm component from 'klassiek' to 'cortex'.
- Updated redirect path logic to reflect the new 'cortex' preference.
- Modified button label and state management to align with the new interface preference terminology.
- Adjusted type definition for InterfacePreference to include 'cortex' instead of 'swift'.
2025-12-31 10:08:22 +01:00
colinislit
26ed58b7ff
docs(cortex): add PRD, TO and rename swift → cortex
...
New documents:
- prd-cortex-v2.md: Product Requirements Document with MVP scope,
user flows, success criteria, and roadmap
- to-cortex-v2.md: Technical Design with three-layer architecture,
API design, error handling, and logging
Renamed files (swift → cortex):
- architecture-swift-cortex-v2.md → architecture-cortex-v2.md
- fo-swift-intent-system-v2.md → fo-cortex-intent-system-v2.md
- haalbaarheidsanalyse-swift-cortex-v2.md → haalbaarheidsanalyse-cortex-v2.md
- review-swift-cortex-v2.md → review-cortex-v2.md
Updated content:
- All swift references replaced with cortex
- FO: confidence threshold 0.9 → 0.7 (industry standard)
- TO v1.1: Added error handling, input sanitization, improved
suïcidaliteit regex, model version note
- Legacy docs: Added note about swift → cortex rename
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-30 10:22:22 +01:00
colinislit
2170b23348
refactor: rename swift → cortex in code and documentation
...
Complete rename of "swift" terminology to "cortex" across the codebase:
Code Changes:
- Rename directories: lib/swift → lib/cortex, components/swift → components/cortex
- Rename API routes: /api/swift/* → /api/cortex/*
- Rename page routes: /epd/swift → /epd/cortex
- Rename store: swift-store.ts → cortex-store.ts
Type Renames:
- SwiftIntent → CortexIntent
- SwiftStore → CortexStore
- useSwiftStore → useCortexStore
- SwiftContext → CortexContext
- useSwiftVoice → useCortexVoice
Documentation Updates (docs/intent/):
- Safety Net → Nudge (Layer 3 rename)
- SafetySuggestion → NudgeSuggestion
- evaluateSafetyNet → evaluateNudge
- SWIFT_* feature flags → CORTEX_*
- All path references updated to match new structure
Files affected: 47 files, ~700 lines changed
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-30 09:18:06 +01:00
colinislit
c8aaba657e
refactor(swift): update references from Medical Scribe to Swift Assistent
...
- Updated comments and documentation to reflect the new branding of the chat API and related components.
- Renamed functions and variables to align with the Swift Assistent terminology.
- Enhanced UI components with animations using Framer Motion for a smoother user experience.
- Removed outdated architecture documentation related to the Medical Scribe system.
This change is part of the transition to the Swift Assistent branding, ensuring consistency across the application.
2025-12-29 22:40:34 +01:00
colinislit
94aab93f1c
feat: wire agenda artifacts
2025-12-28 14:54:32 +01:00
colinislit
14a9d34337
feat(swift): voeg chat orchestration toe (E5)
...
Epic 5 compleet: Chat orchestration voor Swift Agenda Planning.
Alle agenda intents worden nu correct gerouteerd naar AgendaBlock
met user-friendly error handling en fallback opties.
E5.S1 - Action Routing (2 SP)
- routeIntentToArtifact() functie in action-parser
- Maps agenda intents naar juiste AgendaBlock mode
- Confidence threshold enforcement (< 0.7 → fallback)
- Required entity validation (patient voor create, identifier voor reschedule)
- Command-input gebruikt nieuwe routing ipv legacy openBlock
- Migratie naar modern artifact systeem (openArtifact)
E5.S2 - Chat Prompt Update (2 SP)
- 4 agenda intents toegevoegd aan Swift chat system prompt
- agenda_query: afspraken opvragen op datumrange
- create_appointment: nieuwe afspraak maken (required: patient, datetime)
- cancel_appointment: afspraak annuleren (disambiguation support)
- reschedule_appointment: afspraak verzetten (required: identifier)
- Entity extraction rules gedocumenteerd (dateRange, datetime, identifier)
- 4 complete voorbeelden met JSON action format
- Clarification questions voor incomplete data
- Prompt size: ~325 → ~525 regels (+60%)
E5.S3 - Error States (2 SP)
- AgendaErrorState component voor full-page errors
- AgendaErrorAlert component voor inline form errors
- getUserFriendlyMessage() vertaalt technical → user-friendly Dutch
- Auto-redirect bij auth errors (401 → /login)
- Fallback link naar /epd/agenda in alle error states
- Context-aware messaging (query/create/cancel/reschedule)
- Retry functionaliteit voor recoverable errors
- Dev-only technical details collapsible
Error message mapping:
- 401 → "Je sessie is verlopen. Log opnieuw in." + auto-redirect
- 403 → "Je hebt geen toegang tot deze afspraak."
- 404 → "De gevraagde afspraak kon niet worden gevonden."
- 500 → "Er ging iets mis op de server. Probeer het opnieuw."
- Network → "Geen internetverbinding. Controleer je netwerkverbinding."
- Timeout → "De aanvraag duurde te lang. Probeer het opnieuw."
Components updated:
- command-input: gebruikt routeIntentToArtifact + openArtifact
- agenda-create-form: gebruikt AgendaErrorAlert met fallback link
- chat/route: uitgebreide system prompt met agenda sectie
Nieuwe files:
- lib/swift/action-parser.ts: routeIntentToArtifact() functie
- components/swift/artifacts/blocks/agenda-error-state.tsx (225 regels)
- docs/swift/implementation-e5-s1-action-routing.md
- docs/swift/implementation-e5-s2-chat-prompt.md
- docs/swift/implementation-e5-s3-error-states.md
Documentatie:
- Bouwplan bijgewerkt: Epic 5 → Done
- 3 implementation docs met API specs en testing scenarios
- Error handling best practices gedocumenteerd
Progress: 48 SP / 51 SP (94%) - Epic 6 (QA) remaining
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 22:44:18 +01:00
colinislit
a6b63665e1
feat(swift): implement agenda planning module (Epic 4 UI)
...
- Add AgendaBlock core component with list, create, cancel, reschedule modes
- Implement AgendaListView with patient/type/location details and actions
- Implement AgendaCreateForm with fuzzy patient search and validation
- Implement AgendaCancelView with disambiguation support
- Implement AgendaRescheduleForm with date/time picker
- Integrate with server actions (create, cancel, reschedule)
- Add radio-group UI component
- Update documentation and status
2025-12-27 22:29:11 +01:00
colinislit
0031bd5fd1
feat(swift): voeg date/time parsing toe (E2)
...
Epic 2 compleet: NLP-helpers voor datum en tijd interpretatie.
Implementatie:
- parseRelativeDate(): ondersteunt "vandaag", "morgen", "deze week",
weekdagen (maandag-zondag), en absolute datums (30 december, 28-12-2024)
- parseTime(): ondersteunt "14:00", "14", "half drie", "kwart voor drie",
en natuurlijke taal tijdsaanduidingen
- combineDatetime(): combineert datum + tijd naar ISO string
- isNotInPast(): validatie voor toekomstige datums
- isDateRange(): type guard voor datum ranges
Integratie:
- Entity extractor gebruikt date/time parser voor agenda intents
- Normaliseert ruwe strings ("morgen", "14:00") naar Date objecten
- Ondersteunt Nederlandse tijdsaanduidingen
Tests & validatie:
- Unit tests voor alle parser functies
- Verify script voor handmatige testing
- Review document met bevindingen en suggesties
Story points: 7 SP (E2.S1: 3, E2.S2: 2, E2.S3: 2)
2025-12-27 22:14:22 +01:00
colinislit
d2ffccc22b
feat(swift): voeg agenda backend API's toe (E3)
...
Epic 3 compleet: Backend integratie voor Swift Agenda Planning.
Nieuwe endpoints:
- GET /api/swift/agenda - Query afspraken op datumrange
- POST /api/swift/agenda/create - Nieuwe afspraak aanmaken
- POST /api/swift/agenda/cancel - Afspraak annuleren
- POST /api/swift/agenda/reschedule - Afspraak verzetten
- GET /api/swift/patients/search - Fuzzy patiënt zoeken
Alle endpoints bevatten:
- Supabase authenticatie + resource ownership checks
- Zod validatie met Nederlandse foutmeldingen
- Hergebruik van bestaande agenda server actions
Test documentatie: docs/swift/test-plan-epic3-backend.md
Progress: 3/7 Epics compleet (E0, E1, E2, E3)
Story points: 11 SP (E3.S1: 3, E3.S2: 3, E3.S3: 3, E3.S4: 2)
2025-12-27 22:12:01 +01:00
colinislit
6460b4361f
feat: add agenda intent scaffolding
2025-12-27 21:46:24 +01:00
colinislit
5b27a3b538
docs: complete agenda planning epic 0
2025-12-27 21:13:27 +01:00
colinislit
da76336d83
docs: add swift agenda planning build plan
2025-12-27 21:08:25 +01:00
colinislit
43467f07fa
feat: show patient dashboard artifact on selection
2025-12-27 20:50:39 +01:00
colinislit
eed3c8c80c
fix: point swift backlink to epd clients
2025-12-27 20:02:41 +01:00
colinislit
812c41a042
feat: split swift into standalone module
2025-12-27 19:56:24 +01:00
colinislit
0f7c8f00be
docs(swift): Epic 5 status update - voortgang 87%
...
Bouwplan v3 bijgewerkt met correcte status na Epic 5 completion:
Status Updates:
- Epic 3 header: IN PROGRESS → COMPLEET ✅
- Epic 5 header: toegevoegd COMPLEET status ✅
Voortgang Correcties:
- Stories: 24/31 compleet, 3 geskipt = 27 done (was: 26/31)
- Story Points: 71 SP / 82 SP = 87% (ongewijzigd, correct)
- Geannuleerde SP: 1+3+3 = 7 SP (was: 3 SP)
Epic 5 Samenvatting Toegevoegd:
- Status: 5/5 stories compleet (13 SP)
- Features: AI-filtering psychiater, linked evidence UI, voice input, error handling, polish
- Git commits: c6616d8 , adf6c3f , 1bab375 , 1ecc8f9 , 60afb17
- Files: overdracht.ts, overdracht-prompt.ts, overdracht-block.tsx, linked-evidence.tsx, error-handler.ts, offline-banner.tsx
Huidige Status:
✅ Epics 0-5 compleet (27 stories done, 71 SP)
⏳ Epic 6 te doen (4 stories, 8 SP)
Voortgang: 87% - Ready voor Epic 6 (Testing & Refinement)!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 19:19:15 +01:00
colinislit
60afb175c5
docs(swift): Epic 5 COMPLEET! 🎉 E5.S5 polish & animations (87% total)
...
Bouwplan progress update: 71 SP / 82 SP (87%)
🎉 **EPIC 5 COMPLEET** - AI-Filtering & Polish (13 SP / 13 SP = 100%)
Updates:
- Epic 5 status: 4/5 → 5/5 stories ✅ **COMPLEET**
- Total progress: 26/31 stories (was 25/31)
- Story points: 71/82 SP = 87% (was 70/82 = 85%)
- E5.S5 status: ⏳ → ✅
E5.S5 was al volledig geïmplementeerd verspreid over Epics 2-5:
**Smooth Transitions (14 components):**
- transition-colors, transition-all in alle interactive elements
- Button/input hover + focus states
- artifact-enter animation (200ms ease-out)
- Reduced motion support
**Loading States (6 components):**
- CommandInput: isProcessing met Loader2
- DagnotatieBlock: isSubmitting
- OverdrachtBlock: isLoadingPatients
- ZoekenBlock: isSearching
- ChatPanel: isStreaming
- LinkedEvidence: popover loading
**Toast Confirmations:**
- DagnotatieBlock: "Dagnotitie opgeslagen" + smooth close (500ms)
- Error toasts met getErrorInfo() Nederlandse berichten
- All blocks: safeFetch error handling
**Animations:**
- @keyframes artifact-enter (translateX 100% → 0%)
- @keyframes float (badges)
- Reduced motion: animations → none
- Loader2 animate-spin
Deliverables section toegevoegd met:
- 5 implementation secties gedocumenteerd
- 11 deliverables
- 10 acceptatiecriteria
- Technical details (durations, easing, sizes)
- Status: "AL GEÏMPLEMENTEERD (Epics 2-5)"
🎯 **Epic 5 Samenvatting:**
- E5.S1 (5 SP): AI-filtering psychiater ✅
- E5.S2 (3 SP): Linked evidence UI ✅
- E5.S3 (2 SP): Voice input integratie ✅
- E5.S4 (2 SP): Error states & offline ✅
- E5.S5 (1 SP): Polish & animations ✅
Voortgang: 87% compleet - Alleen Epic 6 (Testing & Refinement) nog te doen!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 19:11:09 +01:00
colinislit
1ecc8f93c1
docs(swift): mark E5.S4 as complete (already implemented in E5.S2)
...
Bouwplan progress update: 70 SP / 82 SP (85%)
Updates:
- Epic 5 status: 3/5 → 4/5 stories (12 SP compleet)
- Total progress: 25/31 stories (was 24/31)
- Story points: 70/82 SP = 85% (was 68/82 = 83%)
- E5.S4 status: ⏳ → ✅
E5.S4 was al volledig geïmplementeerd in E5.S2:
- error-handler.ts (301 regels) met isOffline(), getErrorInfo(), safeFetch(), retryFetch()
- offline-banner.tsx (72 regels) met OfflineBanner component + useOffline hook
- CommandCenter: OfflineBanner integration
- ContextBar: margin fix (marginTop: '40px' when offline)
- ChatPanel: error messages (type: 'error')
- All blocks: safeFetch + getErrorInfo error handling
Deliverables section toegevoegd met:
- Bestaande implementatie details (3 secties)
- 11 deliverables gedocumenteerd
- 10 acceptatiecriteria
- Technical details (timeout, retry logic, event listeners)
- Status: "AL GEÏMPLEMENTEERD IN E5.S2"
Voortgang: 85% compleet - Epic 5 4/5 stories done! Laatste story: E5.S5 (1 SP)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 18:57:22 +01:00
colinislit
1bab37592b
docs(swift): mark E5.S3 as complete (already implemented in E2)
...
Bouwplan progress update: 68 SP / 82 SP (83%)
Updates:
- Epic 5 status: 2/5 → 3/5 stories (10 SP compleet)
- Total progress: 24/31 stories (was 23/31)
- Story points: 68/82 SP = 83% (was 66/82 = 80%)
- E5.S3 status: ⏳ → ✅
E5.S3 was al volledig geïmplementeerd in Epic 2:
- use-swift-voice.ts hook (116 regels)
- CommandInput voice integratie
- Mic button rechts van input
- Live transcript in input field
- Waveform visualization
- Deepgram streaming (nl, nova-2, 2000ms endpointing)
Deliverables section toegevoegd met:
- Bestaande implementatie details
- Code references (regelnu mmers)
- Technical details (base text tracking, interim/final logic)
- 8 acceptatiecriteria gedocumenteerd
- Status: "AL GEÏMPLEMENTEERD IN E2"
Voortgang: 83% compleet - Epic 5 3/5 stories done!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 18:51:51 +01:00
colinislit
41acfabe4b
docs(swift): update bouwplan met E5.S2 completion
...
Bouwplan progress update: 66 SP / 82 SP (80%)
Updates:
- Epic 5 status: 1/5 → 2/5 stories (8 SP compleet)
- Total progress: 23/31 stories (was 22/31)
- Story points: 66/82 SP = 80% (was 63/82 = 77%)
- E5.S2 status: ⏳ → ✅
E5.S2 Deliverables section:
- ✅ Alle implementation details gedocumenteerd
- Git commit hash toegevoegd (adf6c3f )
- Code voorbeelden: LinkedEvidence + enrichWithSourceData
- File change statistics toegevoegd (+231/-4)
- 10 acceptatiecriteria gedocumenteerd
Voortgang: 80% compleet - Epic 5 2/5 stories done!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 18:39:54 +01:00
colinislit
adf6c3fb96
feat(swift): implementeer linked evidence UI voor overdracht (E5.S2)
...
E5.S2 compleet: Bronnotitie links met hover preview in OverdrachtBlock.
Voortgang: 66 SP / 82 SP (80%) - Epic 5 40% compleet!
Implementatie:
- Bronverwijzingen nu klikbaar met hover popover voor volledige content
- Source data enrichment in API response
- Type-specific content display (observaties, rapportages, risico's)
- Visual feedback met icons en kleuren per bron type
Components & Types:
- LinkedEvidence component (160 regels) - Reusable popover voor alle bron types
- Aandachtspunt type extended met optionele sourceData field
- enrichWithSourceData() functie in API route (48 regels)
LinkedEvidence Features:
- Hover popover met volledige bron content
- Type-specific icons: Activity (observatie), FileText (rapportage), AlertTriangle (risico)
- Click/hover trigger met underline-dotted styling
- ExternalLink icon voor visual affordance
- Popover positioning: top-start voor beste UX
Source Data per Type:
- Observaties: value + unit + interpretation (HH/H/N/L/LL) met kleuren
- Rapportages/Verpleegkundig: content + createdBy
- Risico's: riskLevel + rationale met severity kleuren
API Enrichment Logic:
- enrichWithSourceData() lookup in context (vitals, reports, risks)
- Source data toegevoegd aan aandachtspunten vóór response
- Type-safe matching op bron.id en bron.type
- Backwards compatible: werkt met/zonder sourceData
UI/UX Improvements:
- Color-coded interpretations: Red (HH/LL kritiek), Amber (H/L), Teal (N)
- Color-coded risk levels: Red (zeer hoog/hoog), Amber (gemiddeld), Teal (laag)
- Formatted text display met bg-slate-50 border
- Responsive popover met max-width 96 (384px)
- Fallback: geen sourceData = plain text zonder popover
Integration in OverdrachtBlock:
- AandachtspuntItem gebruikt LinkedEvidence component
- Replaced: "bron.label • bron.datum" plain text
- Now: LinkedEvidence met hover preview
Files Changed:
- lib/types/overdracht.ts: +12 lines (sourceData interface)
- app/api/overdracht/generate/route.ts: +58 lines (enrichWithSourceData)
- components/swift/blocks/overdracht-block.tsx: +1/-3 lines (LinkedEvidence import/usage)
- components/swift/shared/linked-evidence.tsx: +160 lines (NEW)
Technical Details:
- Popover from shadcn/ui (@/components/ui/popover)
- Icons from lucide-react (Activity, FileText, AlertTriangle, ExternalLink)
- Type guards voor safe property access (sourceData?.value)
- Underline decoration-dotted cursor-help voor accessibility
Testing:
- Build succesvol (pnpm build)
- /epd/swift: 143 kB (+24 kB door LinkedEvidence component)
- Geen nieuwe type errors
- Popover trigger werkt met keyboard (accessible)
Voortgang: 66 SP / 82 SP (80%) - E5.S2 compleet (3 SP)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 18:38:45 +01:00
colinislit
422b5bd20d
docs(swift): update bouwplan met E5.S1 completion
...
Bouwplan progress update: 63 SP / 82 SP (77%)
Updates:
- Epic 5 status: To Do → In Progress (1/5 stories, 5 SP compleet)
- Total progress: 22/31 stories (was 21/31)
- Story points: 63/82 SP = 77% (was 58/82 = 71%)
- E5.S1 status: ⏳ → ✅
E5.S1 Deliverables section:
- ✅ Alle checkboxes gemarkeerd als compleet
- Git commit hash toegevoegd (c6616d8 )
- File change statistics toegevoegd (+104/-8)
- Implementatie details gedocumenteerd
Voortgang: 77% compleet - Epic 5 in progress!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 17:46:04 +01:00
colinislit
c6616d85b2
feat(swift): implementeer AI-filtering psychiater voor overdracht (E5.S1)
...
E5.S1 compleet: AI filtert op behandelrelevantie voor psychiaters.
Voortgang: 56 SP / 72 SP (78%) - Epic 5 in progress!
Implementatie:
- Twee-staps filtering: Server (include_in_handover=true) → AI (psychiater: behandelrelevant)
- Role toggle UI: Verpleegkundige/Psychiater knoppen in OverdrachtBlock
- buildSystemPrompt(role) functie met psychiater-specifieke filtering regels
- filterForRole parameter toegevoegd aan GenerateOverdrachtSchema
- API route verwerkt role parameter en stuurt door naar Claude AI
Psychiater filtering regels:
✅ WEL RELEVANT:
- Medicatie-issues: weigering, bijwerkingen, dosisaanpassingen
- Stemming/gedrag: veranderingen, afwijkend gedrag, agitatie
- Risico-signalen: suïcidaliteit, automutilatie, agressie
- Psychotische symptomen: wanen, hallucinaties
- Crisis/dwang: separatie, fixatie, dwangmedicatie
- Afwijkende vitals: HH, LL met behandelimpact
❌ FILTER UIT:
- Routine medicatie ("volgens schema", "zonder problemen")
- ADL activiteiten (douchen, eten) tenzij significant afwijkend
- Sociale activiteiten ("groepstherapie", "gesprek gehad")
- Standaard observaties ("rustige dag", "geen bijzonderheden")
- Routine vitals (normaal bereik, N interpretatie)
- Dagstructuur ("dagprogramma gevolgd")
UI/UX verbeteringen:
- Role toggle met 2 knoppen (verpleegkundige/psychiater)
- Visual hints: "Alle gemarkeerde items" vs "Behandelrelevante items"
- Dynamic description tekst onder toggle
- filterRole state + useCallback dependency update
Files Changed:
- lib/types/overdracht.ts: +1 line (filterForRole in schema)
- lib/ai/overdracht-prompt.ts: +52 lines (buildSystemPrompt functie)
- app/api/overdracht/generate/route.ts: +8/-8 lines (role parameter)
- components/swift/blocks/overdracht-block.tsx: +43 lines (UI + logic)
Technische details:
- filterForRole default: 'verpleegkundige'
- Psychiater max: 3 aandachtspunten, 2 actiepunten
- Verpleegkundige max: 5 aandachtspunten, 3 actiepunten
- Role parameter propageert van UI → API → Claude prompt
Testing:
- Build succesvol (pnpm build)
- Geen nieuwe type errors
- UI toggle functioneel
Voortgang: 56 SP / 72 SP (78%) - E5.S1 compleet (5 SP)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 17:44:09 +01:00
colinislit
03f252d162
docs(swift): E5.S1 implementatie details toegevoegd aan bouwplan
...
Epic 5.S1 (AI-filtering psychiater) volledig uitgewerkt met Swift-specifieke implementatie.
Updates:
- Context: OverdrachtBlock is Swift artifact (niet EPD pagina)
- Role toggle UI: Verpleegkundige vs Psychiater selector
- API updates: filterForRole parameter in schema + route
- AI prompt: buildSystemPrompt(role) met psychiater filtering
- Filtering logic: 2-stage (server: include_in_handover, AI: behandelrelevantie)
- Deliverables checklist: 10 items
- Acceptatiecriteria: 7 criteria
Psychiater filtering rules:
✅ WEL: medicatie-issues, gedrag, risico, psychose, crisis, afwijkende vitals
❌ UIT: routine medicatie, ADL, sociale activiteiten, standaard observaties
Technische details:
- lib/types/overdracht.ts: GenerateOverdrachtSchema update
- lib/ai/overdracht-prompt.ts: buildSystemPrompt() functie
- app/api/overdracht/generate/route.ts: callClaudeAPI(context, role)
- components/swift/blocks/overdracht-block.tsx: filterRole state + toggle UI
Output verschil:
- Verpleegkundige: 5 aandachtspunten, 3 actiepunten (volledig)
- Psychiater: 2-3 aandachtspunten, 1-2 actiepunten (behandelrelevant)
Ready voor implementatie E5.S1 (5 SP).
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 17:02:08 +01:00
colinislit
428dbe8515
docs(swift): Epic 4 status en samenvatting bijgewerkt
...
Epic 4 header en samenvatting compleet gemaakt voor consistentie.
Updates:
- Epic 4 header: "✅ COMPLEET" toegevoegd
- Uitgebreide Epic 4 samenvatting toegevoegd
- Overzicht belangrijkste features (tabs, lifecycle, animaties)
- Git commits overzicht (855744c , f6c422b , a10a4c3 )
- Files gewijzigd lijst
- Voortgang status: 58 SP / 82 SP (71%)
Consistent met Epic 3 documentatie stijl.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 16:41:40 +01:00
colinislit
a10a4c3813
feat(swift): implementeer slide-in animaties + Epic 4 compleet (E4.S3)
...
Epic 4 volledig afgerond! Artifact systeem compleet met tabs, lifecycle, en animaties.
Voortgang: 58 SP / 82 SP (71%) - 21/31 stories compleet, 3 geskipt
E4.S3 - Slide-in Animatie (2 SP)
- artifact-enter keyframes in globals.css (200ms ease-out)
- Slide van rechts: translateX(100%) → translateX(0) met opacity fade
- Reduced motion support: animation: none bij prefers-reduced-motion
- ArtifactContainer: artifact-enter class op content wrapper
- Key prop (activeArtifact.id) triggert re-animation bij switch
- Smooth visuele feedback bij artifact opening/switching
- Build succesvol zonder errors
E4.S4 - GESKIPT (Placeholder State)
- Placeholder al volledig geïmplementeerd in E4.S1
- Bevat emoji (📋 ), titel, en voorbeelden zoals gespecificeerd
- 3 SP geannuleerd (totaal nu 82 SP i.p.v. 85 SP)
Epic 4 Samenvatting:
- ✅ E4.S1: ArtifactContainer met tabs (5 SP)
- ✅ E4.S2: Lifecycle management (3 SP)
- ✅ E4.S3: Slide-in animaties (2 SP)
- ❌ E4.S4: Placeholder (geskipt, in E4.S1)
Components Updated:
- app/globals.css: artifact-enter keyframes + reduced motion support
- artifact-container.tsx: animatie class op wrapper met key prop
Documentatie:
- Bouwplan bijgewerkt naar v3.0 (Epic 4 compleet)
- E4.S3 deliverables gedocumenteerd
- E4.S4 skip rationale toegevoegd
- Voortgang: 71% compleet (58/82 SP)
- Epic overzicht: 4/6 epics compleet
Volgende Epic: E5 (AI-Filtering & Polish) - 13 SP
🎉 Epic 4 compleet! Artifact systeem volledig functioneel!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 16:39:46 +01:00
colinislit
f6c422bb14
feat(swift): implementeer artifact lifecycle management (E4.S2)
...
Epic 4 Story 2 compleet: Meerdere artifacts met open/close/switch werken!
E4.S2 - Artifact Lifecycle Management (3 SP)
- Store state: openArtifacts[], activeArtifactId
- Store actions met max 3 artifacts logica
- ArtifactArea refactor naar ArtifactContainer
- CommandCenter integration met nieuwe artifact system
Store Updates (stores/swift-store.ts):
- openArtifacts: Artifact[] — Array van open artifacts
- activeArtifactId: string | null — Currently active artifact
- Initial state: [], null
Store Actions:
```typescript
openArtifact(artifact: Omit<Artifact, 'id' | 'createdAt'>) {
// Auto-generate ID + timestamp
// Max 3 artifacts: remove oldest if at capacity
// Set new artifact as active
}
closeArtifact(id: string) {
// Filter out artifact
// Auto-switch to last remaining if closing active
}
switchArtifact(id: string) {
// Verify artifact exists
// Set activeArtifactId
}
closeAllArtifacts() {
// Clear all artifacts + active ID
}
```
Features:
- Max 3 artifacts enforced (oldest removed at capacity)
- Auto-switch when closing active artifact
- Console logging voor debugging
- ID generation met crypto.randomUUID()
- Timestamp tracking met createdAt
Components Updated:
- components/swift/artifacts/artifact-area.tsx (30 regels)
- Simplified: alleen ArtifactContainer rendering
- Props: openArtifacts, activeArtifactId, switchArtifact, closeArtifact
- components/swift/command-center/command-center.tsx
- openArtifact() i.p.v. openBlock()
- getArtifactTitle() voor dynamic titles
- Escape: closeAllArtifacts() i.p.v. closeBlock()
- Artifact opening met title generation
Integration Flow:
1. Chat: AI genereert action met artifact data
2. ChatPanel: setPendingAction(action)
3. CommandCenter: useEffect detecteert pendingAction
4. CommandCenter: getArtifactTitle(type, prefill)
5. CommandCenter: openArtifact({ type, prefill, title })
6. Store: Auto-generate ID, check max 3, add to array
7. ArtifactArea: Renders ArtifactContainer met artifacts
8. ArtifactContainer: Shows tabs (if >1), renders active block
Console Logging:
- "[Store] Max 3 artifacts reached, removing oldest"
- "[Store] Opening artifact: dagnotitie Dagnotitie - Jan"
- "[Store] Closing artifact: [id] New active: [id]"
- "[Store] Switching to artifact: [id]"
- "[Store] Cannot switch to artifact: [id] (not found)"
Build Status:
- ✅ pnpm build succesvol (geen type errors)
- Alleen bekende warnings (Supabase realtime, useCallback)
Voortgang: 56 SP / 85 SP (66%) - 18/31 stories compleet, 2 geskipt
Next: E4.S3 (Slide-in animatie) - 200ms ease-out transitions
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 16:33:56 +01:00
colinislit
855744c927
feat(swift): implementeer ArtifactContainer met tabs (E4.S1)
...
Epic 4 Story 1 compleet: Basis structuur voor meerdere artifacts met tabs.
E4.S1 - ArtifactContainer Component (5 SP)
- Artifact interface gedefineerd in store
- ArtifactTab component met active state en close button
- ArtifactContainer met conditional tab rendering
- Helper functies voor artifact rendering en titels
Nieuwe Components:
- components/swift/artifacts/artifact-tab.tsx (60 regels)
- Tab UI met title, active state, close button
- Hover effects en opacity animations
- Min/max width, title truncation met tooltip
- Stop propagation op close click
- components/swift/artifacts/artifact-container.tsx (127 regels)
- Props: artifacts[], activeArtifactId, onSelect, onClose
- Tabs alleen bij >1 artifact
- renderArtifactBlock(): switch op artifact type
- getArtifactTitle(): user-friendly titles met patient naam
- Placeholder state wanneer geen artifacts
Artifact Interface:
```typescript
interface Artifact {
id: string;
type: BlockType;
prefill: BlockPrefillData;
title: string;
createdAt: Date;
}
```
Features:
- Tab rendering: alleen bij meerdere artifacts
- Active tab styling: amber-500 border bottom
- Close button: opacity 0 → 100 on hover/active
- Title generation: "Dagnotitie - Jan" voor context
- Block rendering: dagnotitie, zoeken, overdracht, fallback
- Placeholder: "Artifacts verschijnen hier" met voorbeelden
- Responsive: min-w-[140px] max-w-[200px] per tab
Tab Styling:
- Active: bg-white + border-b-2 border-b-amber-500
- Hover: bg-slate-50
- Close button: group-hover:opacity-100
- Text: text-sm font-medium truncate
Build Status:
- ✅ pnpm build succesvol (geen type errors)
- Alleen bekende warnings (Supabase realtime, useCallback)
Note: E4.S1 definieert structuur. E4.S2 voegt store management toe
(openArtifacts[], activeArtifactId, openArtifact(), closeArtifact()).
Voortgang: 53 SP / 85 SP (62%) - 17/31 stories compleet, 2 geskipt
Next: E4.S2 (Artifact lifecycle management) - Store state & actions
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 16:29:01 +01:00
colinislit
3814189934
feat(swift): implementeer artifact opening from chat (E3.S6) 🎉
...
Epic 3 Story 6 compleet: Artifacts openen automatisch vanuit chat!
🎉 EPIC 3 COMPLEET - Medical Scribe Chat werkt end-to-end!
E3.S6 - Artifact Opening from Chat (2 SP)
- PendingAction state triggers artifact opening
- useEffect in CommandCenter luistert naar pendingAction
- Automatische block opening met prefill data
- Visual flow: Chat → AI → Action → Artifact verschijnt rechts
Components Updated:
- components/swift/artifacts/artifact-area.tsx (86 regels)
- Renders DagnotatieBlock, ZoekenBlock, OverdrachtBlock
- Placeholder state wanneer geen block actief
- Conditional rendering based on activeBlock state
- components/swift/command-center/command-center.tsx
- useEffect voor pendingAction handling
- openBlock(type, prefill) aanroep
- setPendingAction(null) cleanup
- Console logging voor debugging
Artifact Opening Flow:
1. User: "Notitie voor Jan: medicatie gegeven"
2. AI response met JSON action (confidence 0.95)
3. ChatPanel: parseActionFromResponse()
4. ChatPanel: setPendingAction(action) if confidence ≥ 0.7
5. CommandCenter: useEffect triggers op pendingAction
6. CommandCenter: openBlock('dagnotitie', { patientName: 'Jan', ... })
7. ArtifactArea: Renders DagnotatieBlock met prefill
8. setPendingAction(null) cleanup
Features:
- Automatische artifact opening bij high confidence (≥0.7)
- Prefill data van AI naar block (patientName, category, content, etc.)
- Console logging voor debugging:
- "[CommandCenter] Processing pending action: {...}"
- "[CommandCenter] Opening artifact: dagnotitie with prefill: {...}"
- Placeholder state met voorbeelden wanneer geen artifact actief
- Overflow-y-auto voor scrollable artifacts
Blocks Supported:
- dagnotitie → DagnotatieBlock
- zoeken → ZoekenBlock
- overdracht → OverdrachtBlock
- fallback → FallbackPicker
Build Status:
- ✅ pnpm build succesvol (geen type errors)
- Alleen bekende warnings (Supabase realtime, useCallback)
Epic 3 Summary (Chat API & Medical Scribe):
- ✅ E3.S1 — Chat API endpoint skeleton (3 SP)
- ✅ E3.S2 — Streaming response logic (5 SP)
- ✅ E3.S3 — Medical scribe system prompt (3 SP)
- ✅ E3.S4 — Intent detection in response (5 SP)
- ❌ E3.S5 — Frontend streaming (GESKIPT - 3 SP)
- ✅ E3.S6 — Artifact opening from chat (2 SP)
Epic 3 Stats: 5/6 stories (18 SP), 1 geskipt (3 SP)
Voortgang: 48 SP / 85 SP (56%) - 16/31 stories compleet, 2 geskipt
Next Epic: E4 (Artifact Area & Tabs) - Meerdere artifacts, tabs, animaties
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 16:23:00 +01:00
colinislit
5b10176a39
docs(swift): skip E3.S5 - streaming logica al in ChatPanel
...
E3.S5 (Frontend streaming handling) geskipt:
- useChatStream hook niet nodig (YAGNI)
- Streaming logica al werkend in ChatPanel (E3.S2)
- Geen andere components gebruiken streaming
- E3.S6 dependencies aangepast: nu E3.S4 i.p.v. E3.S5
Status update:
- Epic 3: 5/6 stories (4 compleet, 1 geskipt, 1 to do)
- Voortgang: 15/31 compleet, 1 geskipt (46 SP / 85 SP = 54%)
- Next: E3.S6 (Artifact opening) - laatste story Epic 3!
2025-12-27 16:19:13 +01:00
colinislit
9b85448a43
feat(swift): implementeer intent detection & action parsing (E3.S4)
...
Epic 3 Story 4 compleet: AI action objects worden geparsed en gevalideerd.
E3.S4 - Intent Detection in Response (5 SP)
- Action parser met JSON extraction uit markdown code blocks
- Zod validatie voor action schema (intent, entities, confidence, artifact)
- Confidence-based artifact opening (≥0.7 threshold)
- Visual feedback met action badges in chat messages
- Console logging voor debugging
Nieuwe Components:
- lib/swift/action-parser.ts (149 regels)
- parseActionFromResponse(): Extract & validate JSON actions
- extractJsonBlock(): Regex matching voor ```json blocks
- removeJsonBlocks(): Clean text zonder JSON
- shouldOpenArtifact(): Confidence check (≥0.7)
- getConfidenceLabel(): "Zeer zeker", "Redelijk zeker", etc.
- validateArtifactType(): Intent/artifact type matching
Components Updated:
- components/swift/chat/chat-panel.tsx
- Action parsing in onDone callback
- setPendingAction voor artifact opening (E3.S6)
- Console logging: "[ChatPanel] Action detected"
- components/swift/chat/chat-message.tsx
- Action badge met Sparkles icon
- Intent label (Dagnotitie, Patiënt zoeken, Overdracht)
- CheckCircle icon voor high confidence (≥0.7)
- Confidence label display
- stores/swift-store.ts
- updateLastMessage(): Optional action parameter
- Type-safe action assignment (null/undefined handling)
Features:
- JSON extraction via regex: /```json\s*\n([\s\S]*?)\n```/
- Zod schema: type, intent, entities, confidence, artifact
- Confidence thresholds: >0.9, 0.7-0.9, 0.5-0.7, <0.5
- Visual feedback: Sparkles + CheckCircle icons
- Cleaned text content (JSON removed from display)
- Action stored in message.action en pendingAction state
Action Schema:
```typescript
{
type: "action",
intent: "dagnotitie" | "zoeken" | "overdracht" | "unknown",
entities: {
patientName?: string,
patientId?: string,
category?: "medicatie" | "adl" | "gedrag" | "incident" | "observatie",
content?: string,
query?: string
},
confidence: number, // 0-1
artifact?: {
type: BlockType,
prefill: Record<string, any>
}
}
```
Build Status:
- ✅ pnpm build succesvol (geen type errors)
- Alleen bekende warnings (Supabase realtime, useCallback)
Voortgang: 46 SP / 85 SP (54%) - E3.S4 compleet
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 16:11:43 +01:00
colinislit
8efac8483f
feat(swift): implementeer medical scribe system prompt (E3.S3)
...
Epic 3 Story 3 compleet: Volledige medical scribe prompt v1.0 geïmplementeerd.
E3.S3 - Medical Scribe System Prompt (3 SP)
- buildMedicalScribePrompt() functie (243 regels)
- Intent detection voor P1 intents: dagnotitie, zoeken, overdracht
- P2 intents: rapportage, agenda
- Confidence thresholds (>0.9, 0.7-0.9, 0.5-0.7, <0.5)
- JSON action object format met artifact prefill
- Context injection (activePatient, shift)
- Verduidelijkingsvragen en error handling
- Nederlands tone of voice (vriendelijk, professioneel, to-the-point)
- 4 voorbeelden: happy path, zoeken, verduidelijking, onduidelijke intent
Key Features:
- Intent herkenning met triggers en entities
- Automatische category detection (medicatie/adl/gedrag/incident/observatie)
- Slim gebruik van context (activePatient als default)
- Follow-up conversatie support
- Error handling met Nederlandse messages
Prompt Structuur:
- Je rol: medical scribe voor Swift GGZ EPD
- Wat je doet: intents herkennen, verduidelijken, actions genereren
- Wat je NIET doet: medisch advies, aannames, lange uitleg
- Context: activePatient, shift injection
- Voorbeelden: 4 concrete user flows
Components Updated:
- app/api/swift/chat/route.ts: buildMedicalScribePrompt() functie
Documentatie:
- docs/swift/e0-medical-scribe-system-prompt.md (519 regels)
- docs/swift/e0-design-tokens-and-components.md (E0.S1 & E0.S2)
- docs/swift/bouwplan-swift-v3.md: E3.S3 ✅ compleet
Build Status:
- ✅ pnpm build succesvol (geen type errors)
- Alleen bekende Supabase realtime warnings
Voortgang: 41 SP / 85 SP (48%) - E3.S3 compleet
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 14:46:26 +01:00
colinislit
a51acf6214
feat(swift): voeg chat API met Claude streaming toe (E3.S1-S2)
...
E3.S1 - Chat API endpoint skeleton (3 SP)
- /api/swift/chat route met SSE setup
- Zod validation (message, messages, context)
- Authentication check (session required)
- Rate limiting (20 requests per minute)
- Request body schema voor chat messages en context
E3.S2 - Streaming response logic (5 SP)
- Claude API integration (Anthropic Sonnet 4)
- Real-time streaming via Server-Sent Events
- Event parsing (content_block_delta, message_stop, error)
- Simple system prompt met context injection
- Error handling voor API failures
API Route Features:
- Model: claude-sonnet-4-20250514
- Max tokens: 2048, Temperature: 0.7
- Conversation history: max 20 messages
- Rate limiting per user (20 req/min)
- Request cancellation support
- Context: activePatient + shift
SSE Event Format:
- content_block_delta → {"type":"content","text":"..."}
- message_stop → {"type":"done"}
- error → {"type":"error","error":"..."}
Client Helper (lib/swift/chat-api.ts):
- sendChatMessage() function voor frontend
- SSE stream parsing met TextDecoder
- Callbacks: onChunk, onDone, onError
- Error handling en retry logic
ChatPanel Integration:
- Real-time streaming met updateLastMessage()
- isStreaming state voor UI feedback
- Context injection (patient, shift)
- Error messages in chat
System Prompt (Simple):
- Nederlandse medische assistent voor Swift GGZ EPD
- Context-aware (patiënt + dienst)
- Vriendelijk en professioneel
- Medical scribe functionaliteit komt in E3.S3
Files Created:
- app/api/swift/chat/route.ts (279 regels)
- lib/swift/chat-api.ts (113 regels)
Files Updated:
- components/swift/chat/chat-panel.tsx (+52 regels) - Streaming integration
Epic 3 Progress: 2/6 stories compleet (8 SP / 21 SP = 38%)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 14:26:16 +01:00
colinislit
b6fccc6e44
docs(swift): update bouwplan v3 - Epic 2 compleet
...
Epic 2 Progress Update:
- Epic 2 status: ⏳ To Do → ✅ Compleet (5/5 stories, 13 SP)
- E2.S1 - E2.S5: Alle stories gemarkeerd als compleet
- Overall progress: 20% → 35% (11/31 stories, 30/85 SP)
Deliverables toegevoegd:
- Store uitbreiding (+87 regels)
- ChatMessage component (76 regels)
- ChatPanel component (148 regels)
- ChatInput component (184 regels)
- Keyboard shortcuts (⌘K, Esc, Enter, Shift+Enter)
- Auto-scroll, scroll-lock, scroll-to-bottom button
- Cross-platform support
Git commits gedocumenteerd:
- e3ff72c (E2.S1 & E2.S2)
- b5e245e (E2.S3)
- 8f6f24f (E2.S4)
- d2931a3 (E2.S5)
Changes:
- Epic overzicht tabel: E2 status updated naar Compleet
- E2 stories table: Alle stories ✅ Compleet
- Totale voortgang: 11/31 stories (35%)
- Deliverables sectie toegevoegd met file details
- E2.S5 technical notes toegevoegd
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 14:16:02 +01:00
colinislit
d2931a36f8
feat(swift): voeg keyboard shortcuts toe aan chat (E2.S5)
...
E2.S5 - Keyboard shortcuts (1 SP)
- ⌘K / Ctrl+K om chat input te focussen (global)
- Escape om input te clearen (local)
- Enter om bericht te versturen (al in E2.S4)
- Shift+Enter voor nieuwe regel (al in E2.S4)
ChatInput Updates:
- forwardRef toegevoegd voor ref support
- useImperativeHandle voor focus() en clear() methods
- ChatInputHandle interface geëxporteerd
- Escape key handler (clears input + resets height)
- Helper text updated: "⌘K focus • Esc clear • Enter versturen"
ChatPanel Updates:
- chatInputRef toegevoegd (ChatInputHandle type)
- Global keyboard event listener voor ⌘K/Ctrl+K
- Cross-platform support (metaKey voor macOS, ctrlKey voor Windows/Linux)
- preventDefault() om browser conflicts te voorkomen
- Cleanup listener bij unmount
Keyboard Shortcuts:
- ⌘K / Ctrl+K: Focus chat input (global window listener)
- Escape: Clear input (local textarea handler)
- Enter: Submit message (E2.S4)
- Shift+Enter: New line (E2.S4)
Cross-platform:
- macOS: ⌘K (e.metaKey)
- Windows/Linux: Ctrl+K (e.ctrlKey)
- Both: Escape, Enter, Shift+Enter
Components Updated:
- components/swift/chat/chat-input.tsx (+17 regels)
- components/swift/chat/chat-panel.tsx (+15 regels)
🎉 Epic 2 Compleet! 5/5 stories (13 SP / 13 SP = 100%)
Epic 2 Deliverables:
- E2.S1: Chat state in store (chatMessages, isStreaming, actions)
- E2.S2: ChatMessage component (4 message types met styling)
- E2.S3: Scrolling (auto-scroll, scroll-lock, scroll-to-bottom button)
- E2.S4: ChatInput (textarea, Enter submit, auto-resize)
- E2.S5: Keyboard shortcuts (⌘K focus, Escape clear)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 14:10:38 +01:00
colinislit
8f6f24f757
feat(swift): voeg chat input met keyboard shortcuts toe (E2.S4)
...
E2.S4 - ChatInput component (2 SP)
- Textarea met multi-line support en auto-resize
- Enter to submit functionaliteit
- Shift+Enter voor nieuwe regel
- Integration met store (addChatMessage)
- Send en Mic buttons (Lucide icons)
- Helper text met keyboard shortcuts
Input Features:
- Auto-resize textarea (max 8 lines / 128px)
- Focus management (auto-focus na submit)
- Disabled state support
- Brand colors voor focus/hover states
- Placeholder: "Typ of spreek wat je wilt doen..."
Keyboard Shortcuts:
- Enter: verstuur bericht (preventDefault als niet Shift)
- Shift+Enter: nieuwe regel (default textarea behavior)
- Auto-clear input na submit
UI Components:
- Send button (rechts, alleen enabled met content)
- Mic button placeholder (voor E5.S3 voice input)
- Helper text met <kbd> tags voor shortcuts
- Smooth transitions en hover effects
ChatPanel Integration:
- ChatInput component vervangen placeholder
- Demo messages verwijderd (nu echte chatMessages uit store)
- Auto-scroll werkt met nieuwe user messages
Components Created:
- components/swift/chat/chat-input.tsx (153 regels)
Components Updated:
- components/swift/chat/chat-panel.tsx (-108 demo messages, +ChatInput)
Epic 2 Progress: 4/5 stories compleet (12 SP / 13 SP = 92%)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 14:06:38 +01:00
colinislit
b5e245e0fb
feat(swift): voeg scrolling functionaliteit toe aan chat (E2.S3)
...
E2.S3 - ChatPanel scrolling (5 SP)
- Scrollable message list met refs (scrollContainerRef, messagesEndRef)
- Auto-scroll naar laatste message bij nieuwe berichten
- Scroll-lock detection (100px threshold)
- "Scroll naar beneden" button tijdens scroll-lock
- Initial scroll to bottom bij mount
Scrolling Logic:
- useRef voor scroll container en messages end tracking
- useState voor isScrolledUp en showScrollButton state
- handleScroll() detecteert wanneer user omhoog scrollt
- scrollToBottom() met smooth/auto behavior support
- Auto-scroll alleen wanneer NIET scrolled up (scroll-lock)
Scroll Button:
- ArrowDown icon (Lucide)
- Positioned absolute bottom-4 right-4
- Shadow + hover effects, smooth transitions
- Verschijnt alleen bij scroll-lock en messages present
- Aria-label voor accessibility
Testing:
- 12 demo messages voor scrolling behavior test
- Conversatie flow: notitie, zoeken, overdracht
- Scroll threshold: 100px vanaf bottom
Components Updated:
- components/swift/chat/chat-panel.tsx (+68 regels)
Epic 2 Progress: 3/5 stories compleet (10 SP / 13 SP = 77%)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 14:00:47 +01:00
colinislit
e3ff72cd9c
feat(swift): voeg chat messages en styling toe (E2.S1-S2)
...
E2.S1 - Store uitbreiding (2 SP)
- ChatMessage, ChatAction, ChatMessageType types toegevoegd
- chatMessages[], isStreaming, pendingAction state
- addChatMessage, updateLastMessage, clearChat, setStreaming actions
E2.S2 - ChatMessage component (3 SP)
- Herbruikbare ChatMessage component met 4 message types
- MESSAGE_STYLES config (user/assistant/system/error)
- User: amber bubble rechts, rounded-tr-sm
- Assistant: slate bubble links, rounded-tl-sm
- System: centered, transparent, italic
- Error: red bubble links
- Optional timestamp support (NL locale)
- Demo messages in ChatPanel voor testing
Components Created:
- components/swift/chat/chat-message.tsx (77 regels)
- components/swift/chat/chat-panel.tsx (102 regels)
Store Updated:
- stores/swift-store.ts (+87 regels) - Chat state en actions
Epic 2 Progress: 2/5 stories compleet (5 SP / 13 SP = 38%)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 13:55:35 +01:00
colinislit
c77f1eb554
redesigdn docs
2025-12-27 13:17:00 +01:00
colinislit
33c6698870
feat(swift): Epic 5 Progress - Error Handling & Keyboard Shortcuts (E5.S2-S3)
...
Epic 5 deels compleet: Error handling en keyboard shortcuts geïmplementeerd.
Voortgang: 62 SP / 72 SP (86%) - Nog 1 story voor MVP compleet!
E5.S2 - Error Handling (2 SP)
- Gecentraliseerde error handler utility (lib/swift/error-handler.ts)
- isOffline(), isNetworkError(), getErrorInfo() functies
- safeFetch() wrapper met 30s timeout en retry logic
- retryFetch() met exponential backoff (max 3 retries)
- User-friendly Nederlandse error messages voor alle HTTP status codes
- OfflineBanner component met online/offline detection
- Alle blocks en CommandInput gebruiken nieuwe error handler
- Context bar margin adjustment voor offline banner
- parseErrorResponse() voor HTML error detection
E5.S3 - Keyboard Shortcuts (2 SP)
- ⌘Enter / Ctrl+Enter quick submit in CommandInput
- ⌘Enter / Ctrl+Enter quick save in DagnotatieBlock
- Visual hints (⌘↵) op submit button in DagnotatieBlock
- Geverifieerd: ⌘K focus, Escape close, 1-3 FallbackPicker
- Cross-platform support (macOS + Windows/Linux)
- preventDefault() voor browser conflict preventie
Components Updated:
- DagnotatieBlock: safeFetch, getErrorInfo, retryFetch, ⌘Enter save
- OverdrachtBlock: safeFetch, retryFetch voor AI generation
- ZoekenBlock: safeFetch, getErrorInfo voor patient search
- CommandInput: safeFetch, getErrorInfo, ⌘Enter submit
- CommandCenter: OfflineBanner integration
- ContextBar: useOffline hook voor margin adjustment
Nieuwe Files:
- lib/swift/error-handler.ts (301 regels) - Error handling utilities
- components/swift/command-center/offline-banner.tsx (72 regels)
- docs/swift/keyboard-shortcuts-reference.md (200+ regels)
- docs/swift/test-plan-e5-s2-error-handling.md (350+ regels)
- docs/swift/test-plan-e5-s3-keyboard-shortcuts.md (350+ regels)
- docs/swift/PROJECT-STATUS-2024-12-27.md (500+ regels) - Status report
Documentatie:
- Bouwplan bijgewerkt naar v2.5
- Epic completion details toegevoegd met progress bars
- Manual test checklist bijgewerkt (17/20 scenarios)
- Risico's sectie bijgewerkt (alle major risks gemitigeerd)
- Sprint planning status: E5 75% compleet (6/8 SP)
Technische verbeteringen:
- Offline detection met visual feedback
- Network error retry met exponential backoff
- HTTP 401/404/500/503 error messages in Nederlands
- Timeout protection (30s) op alle API calls
- Keyboard shortcuts met visual hints
- Cross-platform shortcut support
Testing:
- Error handling test plan met 8 categorieën
- Keyboard shortcuts test plan met 6 categorieën
- 40+ test scenarios gedocumenteerd
- Quick smoke test checklists
Voortgang: 62 SP / 72 SP (86%) - E5.S2 en E5.S3 compleet
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-27 09:27:32 +01:00
colinislit
a9d464357b
test-plan
2025-12-26 13:10:36 +01:00