feat: add agent lifecycle events in widget (#226)

* feat: add agent lifecycle events in widget

* fix: remove container id
This commit is contained in:
Sabiha Khan 2026-04-08 17:43:47 +05:30 committed by GitHub
parent be04fa0d1b
commit f5fa9ce717
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -29,6 +29,7 @@
connectionStatus: 'idle', // idle, connecting, connected, failed
audioElement: null,
turnCredentials: null, // TURN server credentials
callStartedAt: null, // Timestamp when call connected (for duration tracking)
callbacks: {
onReady: null,
onCallStart: null,
@ -761,6 +762,8 @@
if (state.pc.iceConnectionState === 'connected' || state.pc.iceConnectionState === 'completed') {
updateStatus('connected', 'Connected', 'Your voice call is now active');
state.callStartedAt = Date.now();
emitMessage('dograh:call_started', {});
} else if (state.pc.iceConnectionState === 'failed' || state.pc.iceConnectionState === 'disconnected') {
updateStatus('failed', 'Connection lost', 'The call has been disconnected');
stopCall();
@ -893,6 +896,13 @@
* Stop voice call
*/
function stopCall() {
// Emit end message before clearing state so identifiers are still available
const durationSeconds = state.callStartedAt
? Math.round((Date.now() - state.callStartedAt) / 1000)
: 0;
emitMessage('dograh:call_ended', { durationSeconds });
state.callStartedAt = null;
updateStatus('idle', 'Call ended', 'Click below to start a new call');
// Trigger call end callback
@ -932,6 +942,22 @@
setTimeout(() => startCall(), 500);
}
/**
* Emit a postMessage event to the host window
* Allows the embedding website to listen for agent lifecycle events via:
* window.addEventListener('message', (event) => { ... })
*/
function emitMessage(eventType, detail) {
const message = {
type: eventType,
agentId: state.config.workflowId || null,
token: state.config.token || null,
workflowRunId: state.workflowRunId || null,
...detail
};
window.postMessage(message, '*');
}
/**
* Generate unique peer ID
*/