2026-06-18
Added
- Meeting mode support (
tortus.meetings.start(...)): Start a meeting recording via the SDK. Two modes are supported:LIVE_RECORDINGcaptures audio in the embedded app (matches the standalone meeting flow). Optionalnotesandtitlemay be supplied as the meeting starts.AUDIO_FILEbypasses the recorder by providingaudio.url(intended for hosts that already have audio captured or handle audio capturing themselves). Transcription begins immediately on the supplied audio.
TortusMeetingobject: Returned bymeetings.start(...)withsetAudio?(audio),setNotes?(notes), andclose()for mid-flight updates and tear-down.- Meeting lifecycle events on the SDK client:
meeting:started,meeting:resumed,meeting:updated,meeting:closed,meeting:cancelled, andmeeting:completed. Themeeting:completedpayload includes the generated meeting note in both Markdown and HTML and the transcription as plain text. disableFinishMeetingButtonconfig option onloadTortus({ config }): whentrue, the embedded meeting view hides the post-generation “Finish meeting” button and exposes the bundled meetings list / “Start new meeting” UI instead. Themeeting:completedevent is not emitted while this flag is set, leaving the host integrator in charge of the meeting’s lifecycle UI.
Deprecated
- Dictation API:
client.dictations.start(), theTortusDictation/DictationOptionstypes, and thedictation:started/dictation:closedevents are deprecated. The host application has never implemented the iframe-side handler for these calls; they always reject withCLIENT_4001: Dictation not yet implemented. References have been removed from the documentation, and the API surface itself will be removed in a future release. Do not use these in new integrations.
2026-04-01
Added
consultation:resumedevent: Fired when an existing in-progress consultation is re-opened (e.g., after a client unmount/remount or when the clinician navigates back to the consultation). Provides aTortusConsultationobject with full consultation data, enabling integrators to track consultation lifecycle across application restarts.completedAtfield onTortusConsultationData: ISO 8601 timestamp indicating when the consultation was completed. Present inconsultation:completedevent payloads.createdAtfield inconsultation:completed: The consultation’s original creation timestamp is now reliably included, even when the client was restarted mid-consultation.
Fixed
- Reliable consultation data after client restart:
consultation:completednow always returns a fully populatedTortusConsultationobject when a consultation is reopened after a client unmount/remount. Previously, restarting the client mid-consultation could result in incomplete consultation data.
2026-03-03
Added
- Transcription artifacts in
consultation:completed: Theresult.artifactsobject now includes atranscriptionsarray containing the consultation transcription as plain text (contentType: 'text/plain'). This follows the same array pattern asmedicalNotesandlettersfor future expansion.
2026-03-03
Added
CUSTOMintegration system: You can now pass{ system: 'CUSTOM', label: 'Your System' }as the integration to display a custom label in the “Approve & Save to …” button. Thelabelfield is required whensystemis'CUSTOM'. The “EHR Connected” badge is not shown for custom integrations.- Optional
labelfor known integration systems: All integration systems (EMIS,SYSTM_ONE,MEDICUS,CERNER) now accept an optionallabelfield that overrides the “Approve & Save to …” button text. When omitted, the default system display name is used. The “EHR Connected” badge always shows the system’s default name. - Branded error screen on initialisation failure: When
loadTortus()fails, the loader is replaced with a user-friendly error screen showing the error code for support, instead of silently failing. EMBED_7007error code: New error code for client-secrets fetch failures, making it easier to identify integrator-side issues.
Changed
- Increased initialisation timeout:
APP_READYtimeout increased from 30 s to 120 s, with improved diagnostic messages when handshake times out.
2026-02-26
Added
customFieldssupport for internal embed client: Integrator-provided custom fields are now persisted to the encounter record and returned inconsultation:startedandconsultation:completedevents.- Custom fields validation: Only organisations with pre-configured fields may use
customFields. EMBED_7006error code: New “Invalid embed configuration” error for embed-specific configuration issues (e.g. unconfigured custom fields).
Fixed
MedicalCodefields now match FHIR conventions: Medical codes inconsultation:completedevents now usecodeanddisplayas primary fields (aligned with FHIR Coding). The previousidanddescriptionfields are still included for backward compatibility but are deprecated; migrate tocode/displayat your convenience.consultation.close()reliability:consultation:closednow fires exactly once regardless of whether the close was initiated by the integrator (viaconsultation.close()) or by the clinician within the app. Previously, client-initiated closes could emit the event multiple times.consultation:closedpayload: The event now includes full consultation data (viatoJSON()) instead of just the reference, matching the shape of other lifecycle events.consultation.close()always available:close()is now a required method on theTortusConsultationinterface. Previously it was typed as optional and could appearundefined.consultation:startedevent carries live object: Theconsultation:startedevent now includes the fullTortusConsultationinstance withclose()andtoJSON()methods. Previously, methods were stripped during serialisation.- Type resolution for external consumers: All type declarations are now self-contained; they no longer reference internal monorepo paths that would resolve as
unknownfor integrators.
Changed
- New
TortusConsultationDatatype: Consultation data in terminal event payloads (consultation:closed,consultation:cancelled,consultation:completed) is now typed asTortusConsultationData(data-only, serialisation-safe) instead ofTortusConsultation. UsetoJSON()on the live consultation object to obtain aTortusConsultationDatasnapshot. - Unused error types removed: Removed unused configuration error types (
CONFIG_MISSING_FIELD,CONFIG_INVALID_VALUE,APPLICATION_CONFIG_CONFLICT) that were declared but never referenced by any error definition.
2026-02-12
Added
text/htmlcontent type: ArtifactcontentTypenow supports'text/markdown' | 'text/html', enabling integrators to receive rich HTML directly from the editor alongside markdown.
Fixed
- Incorrect content type on medical notes and letters: Artifacts were labelled as
text/markdownbut actually contained HTML from the editor. Content type now correctly reflects the actual format (text/htmlfor HTML content,text/markdownfor markdown-converted content). - Consultation serialisation:
consultationobjects in event callbacks (consultation:started,consultation:completed, etc.) are now plain data; they no longer throw “The object cannot be cloned” when usingstructuredClone()orpostMessage(). finish()status handling:finish({ status: 'failed' })andfinish({ status: 'success' })now work correctly. Failed status shows retry UI, success confirms the save (previously ignored and always closed).
Changed
- Default event adapter: The PostMessage adapter is now the default for all consumers. The legacy X-On adapter remains available via explicit opt-in but is no longer used by default.
2025-12-03
Added
- Cerner EHR Integration: Added
CERNERas a supported integration system.- Configure with
integration: { system: 'CERNER' }when starting consultations.
- Configure with
2025-11-11
Fixed
- Medical codes with measurements now properly include
value,unit, andevidenceinconsultation:completedevents.
2025-11-03
Breaking changes
Removed deprecated methodsclient.launch(options): Useclient.display('home')instead.client.startConsultation(consultation): Useclient.consultations.start(consultation, options)instead.
LaunchOptionsinterface: No longer needed, use theScreentype with thedisplay()method.integration.labelproperty: Use only theintegration.systemproperty.onConsultationCompletecallback: Useclient.on('consultation:completed', callback)instead.onErrorcallback: Useclient.on('consultation:error', callback)instead.artifacts.transcriptionfield: Deprecated field removed from consultation output.DictationOutputtype: Removed from public API (dictation completion not yet supported).dictation:completedevent: Removed from public API (dictation completion not yet supported).
artifacts.medicalNoteschanged fromstringtoMedicalNote[](array withcontentandcontentTypefor multi-format support).artifacts.letterchanged toartifacts.lettersas aLetter[]array.- Currently only
contentType: 'text/markdown'is supported; the array structure enables future format support (HTML, JSON, etc.).
- Flattened input structure: the
encounterobject was removed fromStartConsultationInput.consultation.encounter.referencebecomesconsultation.referenceconsultation.encounter.metadatabecomesconsultation.metadataconsultation.encounter.customFieldsbecomesconsultation.customFields
- Output structure simplification: metadata removed from
ConsultationOutput.- All consultation metadata (reference, customFields, metadata, integration, patient, mode) is available in the
consultationobject in events. ConsultationOutputnow contains onlyartifacts(medicalNotes, letters, medicalCodes).
- All consultation metadata (reference, customFields, metadata, integration, patient, mode) is available in the
TortusConsultationenhanced:- Added an
integrationproperty to match all data previously inConsultationOutput. - Now serves as the single source for all consultation metadata.
- Added an
Added
- Enhanced type safety with removal of deprecated optional properties.
- Cleaner API surface with consistent event-driven architecture.
- Improved documentation without deprecated method references.
- Simplified logging; always uses console when debug is enabled (no custom logger needed).
Changed
- Event adapters: Removed deprecated
launch()method implementations. - Validation: Streamlined validation schemas without deprecated fields.
- Tests: Updated all test suites to use modern API patterns.
- Documentation: Removed deprecation notices and updated examples.
- Error codes: Consolidated error codes;
CLIENT_4011(user cancelled) is nowCLIENT_4008(user cancelled operation).
Removed
- All
@deprecatedannotations and associated functionality. - Legacy callback-based error handling patterns.
- Unused imports and type definitions related to deprecated functionality.
- Deprecated test cases and assertions.
- Custom logger option: Removed the
loggerparameter fromLoadTortusConfig(now always uses console when debug is enabled).