Changelog
All notable changes to the @firetell/firetell-client-sdk package are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.2.4] - 2026-09-09​
Added​
- Camera Mute/Unmute (Toggle Camera):
- Added
call.muteVideo(),call.unmuteVideo(), andcall.toggleCamera()methods onCall. - Added
call.isCameraOff: booleanproperty tracking local camera state. - Added
ECallEventName.CAMERA("camera") event emitted locally and on remote camera state updates via signaling.
- Added
- Native Screen Sharing (
getDisplayMedia+replaceTrack):- Added
call.startScreenShare(),call.stopScreenShare(), andcall.toggleScreenShare()onCall. - Seamlessly replaces video track on the active
RTCRtpSenderwithout SDP renegotiation or call interruption. - Automatically restores the original camera video track when the user stops sharing screen.
- Added
call.isScreenSharing: booleanproperty tracking active screen share state. - Added
ECallEventName.SCREEN_SHARE("screenShare") event emitted locally and on remote screen share updates.
- Added
- SDP Video Auto-Detection in
call.offer&accept():Call.handleWsMessage: Automatically falls back to inspecting the remote SDP offer for active video media sections (/m=video [1-9]/) if the explicitis_videoboolean flag is omitted in thecall.offerpayload, ensuringcall.isVideois reliably set on the callee side.Call.accept(): Evaluatesthis.remoteDescription.sdpto guaranteethis.isVideois true before setting up local media, prompting the browser for both Camera and Microphone permissions ({ video: true, audio: true }).
- Resilient Remote Stream Track Assembly:
- Improved
RTCPeerConnection.ontrackin_setupWebrtcMedia: Automatically creates aMediaStreamand attaches tracks incrementally ifevent.streams[0]is missing, ensuring both remote audio and video tracks are emitted viaECallEventName.REMOTE_STREAM.
- Improved
- Caller Metadata Continuity:
- Added support for
from_avatarandtransfer_reasonfields incall.offerevent processing so callee avatar and transfer context remain intact through WebRTC session negotiation.
- Added support for
Fixed​
- Callee Video Negotiation:
- Fixed an issue where incoming video calls defaulted to audio-only on the callee side due to missing
is_videoflag in signaling WebSocket payloads.
- Fixed an issue where incoming video calls defaulted to audio-only on the callee side due to missing
- Example Demo Web App:
- Fixed
hideIncomingBannerreference error on call dismissal. - Added dynamic
updateVideoUI()helper to automatically bind and display local/remote video elements when tracks arrive.
- Fixed
[1.2.3] - 2026-09-04​
Changed​
call.transfer()simplified (Breaking):- Signature changed from
transfer(targetUsername, teamId?, reason?)totransfer(target, reason?). targetnow accepts: agent username, extension number (e.g."100"), team ID (te_...), or SIP account ID (si_...).- Removed
teamIdparameter — target type is auto-resolved server-side via prefix-based resolution.
- Signature changed from
FiretellClient.sendTransfer()simplified (Breaking):- Signature changed from
sendTransfer(callId, targetUsername, teamId?, reason?)tosendTransfer(callId, target, reason?). - HTTP fallback body changed from
{ target_username, team_id, reason }to{ target, reason }.
- Signature changed from
- Per-call WebSocket payloads cleaned up:
- Removed redundant
call_idfrom all WS event payloads (call.hangup,call.answer,call.reject,call.transfer,call.dtmf,call.mute,call.hold,call.unhold). The per-call WS connection inherently binds the socket to a specific call, makingcall_idunnecessary. call.transferpayload field renamed fromtototargetfor consistency with the HTTP API.
- Removed redundant
[1.2.2] - 2026-09-03​
Added​
getPhoneNumbers()REST API onFiretellClient:- Added
public async getPhoneNumbers(options?: { page?: number; limit?: number }): Promise<IClientPhoneNumbersResponse>to query phone numbers (DIDs) accessible by the authenticated agent and their shared teams. - Automatically sends the agent's JWT to
GET /api/v1/call-center/phone-numbers. - Added
API_ENDPOINTS.PHONE_NUMBERS("/api/v1/call-center/phone-numbers"). - Added
IClientPhoneNumberandIClientPhoneNumbersResponseinterfaces exporting phone number details (id,number,title,country_code,dial_code,status,capabilities,enable_outbound,shared_teams_id).
- Added
- Static & Named SDK Version Exports:
- Added static
FiretellClient.VERSIONproperty on the class for direct, synchronous version access without instantiation. - Exported
SDK_VERSIONconstant directly from package root (import { SDK_VERSION } from '@firetell/firetell-client-sdk'). - Added
"./package.json": "./package.json"to the packageexportsmap for direct version inspection by package managers and bundlers.
- Added static
[1.2.1] - 2026-08-22​
Added​
transfer_reasonincall.ringEvent &CallInstance:- Added
transfer_reason?: stringtoICallRingParamspayload in thecall.ringSSE event. - Exposed
call.transferReason?: stringon theCallinstance when a transferred call session is initialized. - Allows frontends, Webphones, and Console agents to display the contextual transfer reason provided by Voice AI agents or human agents during ringing.
- Added
[1.2.0] - 2026-08-20​
Added​
- Dedicated Per-Call SSE Event Stream (
Call.connectCallEventStream):- Automatically establishes a dedicated SSE connection (
/stream?call_id=<callId>) for each active call session (call.start(),call.accept(),call.joinSession(), andclient.createCallSession()). - Subscribes to the Per-Call channel for real-time speech-to-text transcriptions and recording events without flooding the global workspace event stream.
- Automatically disconnects and cleans up the stream upon call termination (
call.destroy()).
- Automatically establishes a dedicated SSE connection (
- Call-Scoped Real-Time Transcription Events & APIs:
- Added
ECallEventName.TRANSCRIPTION,TRANSCRIPTION_STARTED,TRANSCRIPTION_DIALOGUE, andTRANSCRIPTION_COMPLETED. - Added ergonomic helper listener methods on
Call:call.onDialogue((dialogue) => ...)andcall.onTranscription((event) => ...). - Exported TypeScript interfaces:
ITranscriptionStartedEvent,ITranscriptionDialogueEvent,ITranscriptionCompletedEvent, andTranscriptionEvent.
- Added
- Call-Scoped Real-Time Recording Events & APIs:
- Added
ECallEventName.RECORDING,RECORDING_STARTED,RECORDING_COMPLETED, andRECORDING_READY. - Added ergonomic helper listener method on
Call:call.onRecording((event) => ...). - Exported TypeScript interfaces:
ICallRecordingStartedEvent,ICallRecordingCompletedEvent,ICallRecordingReadyEvent, andCallRecordingEvent.
- Added
- Public Getters on
FiretellClient:- Added
client.getBaseUrl()andclient.getJwt()getters.
- Added
Changed & Improved​
- Strict Single-Emission & Call-Scoped Event Architecture:
- Removed duplicate event emissions across
FiretellClient._initEventStream()andCall._handleSseMessage(). - Decoupled per-call transcription events from
client.events, strictly routing all live subtitles, chunks, and summaries directly to the owningCallinstance (call.on(...)).
- Removed duplicate event emissions across
[1.1.7] - 2026-08-17​
Added​
FiretellClient.stopSupervision(): Added helper method to terminate an ongoing call supervision session (cleans up WebRTC call session and calls REST APIDELETE /v1/call-center/calls/:id/supervision).- Call State Monotonicity Guard: Added automatic state ranking guard in
FiretellClientto prevent late/out-of-ordercall.createdevents from overriding or regressing active call state machine.
[1.1.6] - 2026-08-17​
Added​
SseStreamClient(Header-Based SSE Streaming): Integrated lightweight, zero-dependency SSE stream client withAuthorization: Bearer <jwt>HTTP header support viafetchandReadableStream, completely eliminating JWT token exposure in SSE stream URLs and server access logs.- SSE Stream Exports: Exported
SseStreamClient,SseMessageEvent, andSseStreamConfigfrom SDK entry point.
[1.1.5] - 2026-08-17​
Added​
FiretellClient.startSupervision(): Added high-level helper method to initiate call supervision (listen,whisper,barge) and automatically establish WebRTC audio session in one call.Call.joinSession(): Added method to connect signaling and send WebRTC offer using pre-generatedcall_tokenandws_url.ISupervisionResponse.ws_url: Added requiredws_urlfield toISupervisionResponseinterface to support dedicated per-call WebSocket connections.
[1.1.4] - 2026-08-15​
Fixed​
- Call Creation: Renamed
_createCallSessiontocreateCallSession.
[1.1.3] - 2026-08-14​
Added​
- Real-Time Call Lifecycle Event Enums: Added
EClientEventName.CALL_CREATED,EClientEventName.CALL_STARTED, andEClientEventName.CALL_ANSWERED. - Active Call State Synchronization: Added automatic transition of active calls to
ECallState.ACTIVE/ANSWEREDwhen receivingcall.answeredover the SSE stream.
[1.1.2] - 2026-08-14​
Added​
- Client Event Enum Values (
CALL_ENDED&CALL_CANCELED): AddedEClientEventName.CALL_ENDEDandEClientEventName.CALL_CANCELED. - SSE Stream Listeners for Early Call Cancellation: Automatically cleans up
Callinstances and dismisses incoming call ringing UI modals when calls are answered by another agent or canceled before WebSocket connection completion.
[1.1.1] - 2026-08-12​
Fixed​
- Inbound Call DTLS Setup Role Validation: Fixed
Answerer must use either active or passive value for setup attributeerror during callee-initiated unhold (Call.unhold()). - Optimized Full ICE Gathering: Reduced hard safety timeout to 6s, and implemented a 3s fallback timer verifying presence of STUN Public IP (
typ srflx) or Relay (typ relay) candidates.
[1.1.0] - 2026-08-12​
Fixed​
- DTLS SSL Role Preservation on Renegotiation: Preserves established DTLS
a=setuprole (active/passive) insetRemoteDescription()across renegotiation answers from Media Server. - Incoming Call Accept Error Safety: Added
try...catchblock aroundCall.accept()to guarantee proper media cleanup andECallState.ERRORstate emission if microphone access or WebRTC answer creation fails.
[1.0.9] - 2026-08-12​
Fixed​
- Call Unhold Event Signaling: Fixed WS event name emitted during
Call.unhold()from"call.hold"to"call.unhold". - WebRTC Remote SDP Parsing: Added
extractSdpInit()helper inCall.tsto safely parse SDP payloads received in WebSocket messages. - ICE Server Fallback: Configured
DEFAULT_ICE_SERVERS(Google STUN + Cloudflare STUN) as default fallback.
[1.0.0] - 2026-01-01​
Added​
- Initial release of
@firetell/firetell-client-sdk. - WebRTC audio/video calls via native per-call WebSocket signaling.
- JWT-based session authentication (
session.connect). - Outbound call support (
Call.start()) and incoming call handling (Call.accept(),Call.reject()). - Call controls: hold/unhold, mute/unmute, DTMF, transfer.
- Auto-reconnect with exponential backoff.
- Agent presence notifications (
workspace.agent.state). - Full ICE gathering (non-Trickle) for Media Server compatibility.
- Multi-format builds: CJS, ESM, IIFE with TypeScript declarations.