@hivegpt/hiveai-angular 0.0.457 → 0.0.458

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -104,9 +104,8 @@ export class DailyVoiceClientService {
104
104
  this.speakingSubject.next(!isLocal);
105
105
  });
106
106
  });
107
- // track-started / track-stopped: play remote (bot) audio explicitly and update speaking state.
108
- // Browsers often do not auto-play remote WebRTC audio; attaching to an HTMLAudioElement and
109
- // calling play() ensures the user hears the agent.
107
+ // track-started / track-stopped: set up remote audio playback only.
108
+ // Speaking state is driven by active-speaker-change (actual audio energy), NOT track lifecycle.
110
109
  call.on('track-started', (event) => {
111
110
  this.ngZone.run(() => {
112
111
  var _a, _b, _c, _d;
@@ -114,8 +113,7 @@ export class DailyVoiceClientService {
114
113
  const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
115
114
  const track = event === null || event === void 0 ? void 0 : event.track;
116
115
  if (p && !p.local && type === 'audio') {
117
- console.log(`[VoiceDebug] Got audio track from backend (track-started) — ${new Date().toISOString()}`);
118
- this.speakingSubject.next(true);
116
+ console.log(`[VoiceDebug] Got audio track from backend (track-started) — readyState=${track === null || track === void 0 ? void 0 : track.readyState}, muted=${track === null || track === void 0 ? void 0 : track.muted} — ${new Date().toISOString()}`);
119
117
  const audioTrack = track !== null && track !== void 0 ? track : (_d = (_c = p.tracks) === null || _c === void 0 ? void 0 : _c.audio) === null || _d === void 0 ? void 0 : _d.track;
120
118
  if (audioTrack && typeof audioTrack === 'object') {
121
119
  this.playRemoteTrack(audioTrack);
@@ -129,7 +127,6 @@ export class DailyVoiceClientService {
129
127
  const p = event === null || event === void 0 ? void 0 : event.participant;
130
128
  const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
131
129
  if (p && !p.local && type === 'audio') {
132
- this.speakingSubject.next(false);
133
130
  this.stopRemoteAudio();
134
131
  }
135
132
  });
@@ -152,14 +149,30 @@ export class DailyVoiceClientService {
152
149
  playRemoteTrack(track) {
153
150
  this.stopRemoteAudio();
154
151
  try {
152
+ console.log(`[VoiceDebug] playRemoteTrack called — track.readyState=${track.readyState}, track.muted=${track.muted} — ${new Date().toISOString()}`);
153
+ track.onunmute = () => {
154
+ console.log(`[VoiceDebug] Remote audio track UNMUTED (audio data arriving) — ${new Date().toISOString()}`);
155
+ };
155
156
  const stream = new MediaStream([track]);
156
157
  const audio = new Audio();
157
158
  audio.autoplay = true;
158
159
  audio.srcObject = stream;
159
160
  this.remoteAudioElement = audio;
161
+ audio.onplaying = () => {
162
+ console.log(`[VoiceDebug] Audio element PLAYING (browser started playback) — ${new Date().toISOString()}`);
163
+ };
164
+ let firstTimeUpdate = true;
165
+ audio.ontimeupdate = () => {
166
+ if (firstTimeUpdate) {
167
+ firstTimeUpdate = false;
168
+ console.log(`[VoiceDebug] Audio element first TIMEUPDATE (actual audio output) — ${new Date().toISOString()}`);
169
+ }
170
+ };
160
171
  const p = audio.play();
161
- if (p && typeof p.catch === 'function') {
162
- p.catch((err) => {
172
+ if (p && typeof p.then === 'function') {
173
+ p.then(() => {
174
+ console.log(`[VoiceDebug] audio.play() resolved — ${new Date().toISOString()}`);
175
+ }).catch((err) => {
163
176
  console.warn('DailyVoiceClient: remote audio play failed (may need user gesture)', err);
164
177
  });
165
178
  }
@@ -227,4 +240,4 @@ DailyVoiceClientService.decorators = [
227
240
  DailyVoiceClientService.ctorParameters = () => [
228
241
  { type: NgZone }
229
242
  ];
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBR3ZDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBeUJsQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXhCMUIsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QywwRUFBMEU7UUFDbEUsdUJBQWtCLEdBQTRCLElBQUksQ0FBQztRQUVuRCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3RELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxjQUFTLEdBQXdCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFckUsZ0VBQWdFO1FBQ2hFLGtCQUFhLEdBQXdCLElBQUksQ0FBQyxt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QUUsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLHVEQUF1RDtJQUN6RCxDQUFDOzs7O1lBck5GLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBckJvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBEYWlseSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuaW1wb3J0IHR5cGUgeyBEYWlseUNhbGwsIERhaWx5UGFydGljaXBhbnQgfSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuXG4vKipcbiAqIERhaWx5LmpzIFdlYlJUQyBjbGllbnQgZm9yIHZvaWNlIGFnZW50IGF1ZGlvLlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGFuZCBtYW5hZ2UgRGFpbHkgQ2FsbE9iamVjdFxuICogLSBKb2luIERhaWx5IHJvb20gdXNpbmcgcm9vbV91cmxcbiAqIC0gSGFuZGxlIG1pYyBjYXB0dXJlICsgc3BlYWtlciBwbGF5YmFja1xuICogLSBQcm92aWRlIHJlYWwtdGltZSBzcGVha2luZyBkZXRlY3Rpb24gdmlhIGFjdGl2ZS1zcGVha2VyLWNoYW5nZSAocHJpbWFyeSlcbiAqICAgYW5kIHRyYWNrLXN0YXJ0ZWQvdHJhY2stc3RvcHBlZCAoZmFsbGJhY2sgZm9yIGltbWVkaWF0ZSBmZWVkYmFjaylcbiAqIC0gRXhwb3NlIHNwZWFraW5nJCAoYm90IHNwZWFraW5nKSwgdXNlclNwZWFraW5nJCAodXNlciBzcGVha2luZyksIG1pY011dGVkJFxuICogLSBFeHBvc2UgbG9jYWxTdHJlYW0kIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uIChBdWRpb0FuYWx5emVyU2VydmljZSlcbiAqXG4gKiBTcGVha2luZyBzdGF0ZSBmbGlwcyBpbW1lZGlhdGVseSB3aGVuIGFnZW50IGF1ZGlvIHN0YXJ0cyBwbGF5aW5nLlxuICogSWYgdXNlciBzcGVha3Mgd2hpbGUgYm90IGlzIHRhbGtpbmcsIHN0YXRlIHN3aXRjaGVzIHRvIGxpc3RlbmluZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWxsT2JqZWN0OiBEYWlseUNhbGwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NhbFN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NhbFNlc3Npb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBFeHBsaWNpdCBwbGF5YmFjayBvZiByZW1vdGUgKGJvdCkgYXVkaW87IHJlcXVpcmVkIGluIHNvbWUgYnJvd3NlcnMuICovXG4gIHByaXZhdGUgcmVtb3RlQXVkaW9FbGVtZW50OiBIVE1MQXVkaW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBzcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSB1c2VyU3BlYWtpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbWljTXV0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbG9jYWxTdHJlYW1TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZWRpYVN0cmVhbSB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBUcnVlIHdoZW4gYm90IChyZW1vdGUgcGFydGljaXBhbnQpIGlzIHRoZSBhY3RpdmUgc3BlYWtlci4gKi9cbiAgc3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFRydWUgd2hlbiB1c2VyIChsb2NhbCBwYXJ0aWNpcGFudCkgaXMgdGhlIGFjdGl2ZSBzcGVha2VyLiAqL1xuICB1c2VyU3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBUcnVlIHdoZW4gbWljIGlzIG11dGVkLiAqL1xuICBtaWNNdXRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLm1pY011dGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogRW1pdHMgbG9jYWwgbWljIHN0cmVhbSBmb3Igd2F2ZWZvcm0gdmlzdWFsaXphdGlvbi4gKi9cbiAgbG9jYWxTdHJlYW0kOiBPYnNlcnZhYmxlPE1lZGlhU3RyZWFtIHwgbnVsbD4gPVxuICAgIHRoaXMubG9jYWxTdHJlYW1TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gRGFpbHkgcm9vbS4gQWNxdWlyZXMgbWljIGZpcnN0IGZvciB3YXZlZm9ybSwgdGhlbiBqb2lucyB3aXRoIGF1ZGlvLlxuICAgKiBAcGFyYW0gcm9vbVVybCBEYWlseSByb29tIFVSTCAoZnJvbSByb29tX2NyZWF0ZWQpXG4gICAqIEBwYXJhbSB0b2tlbiBPcHRpb25hbCBtZWV0aW5nIHRva2VuXG4gICAqL1xuICBhc3luYyBjb25uZWN0KHJvb21Vcmw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gR2V0IG1pYyBzdHJlYW0gZm9yIGJvdGggRGFpbHkgYW5kIHdhdmVmb3JtIChzaW5nbGUgY2FwdHVyZSlcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gICAgICBjb25zdCBhdWRpb1RyYWNrID0gc3RyZWFtLmdldEF1ZGlvVHJhY2tzKClbMF07XG4gICAgICBpZiAoIWF1ZGlvVHJhY2spIHtcbiAgICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdWRpbyB0cmFjaycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvY2FsU3RyZWFtID0gc3RyZWFtO1xuICAgICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChzdHJlYW0pO1xuXG4gICAgICAvLyBDcmVhdGUgYXVkaW8tb25seSBjYWxsIG9iamVjdFxuICAgICAgLy8gdmlkZW9Tb3VyY2U6IGZhbHNlID0gbm8gY2FtZXJhLCBhdWRpb1NvdXJjZSA9IG91ciBtaWMgdHJhY2tcbiAgICAgIGNvbnN0IGNhbGxPYmplY3QgPSBEYWlseS5jcmVhdGVDYWxsT2JqZWN0KHtcbiAgICAgICAgdmlkZW9Tb3VyY2U6IGZhbHNlLFxuICAgICAgICBhdWRpb1NvdXJjZTogYXVkaW9UcmFjayxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNhbGxPYmplY3QgPSBjYWxsT2JqZWN0O1xuXG4gICAgICB0aGlzLnNldHVwRXZlbnRIYW5kbGVycyhjYWxsT2JqZWN0KTtcblxuICAgICAgLy8gSm9pbiByb29tOyBEYWlseSBoYW5kbGVzIHBsYXliYWNrIG9mIHJlbW90ZSAoYm90KSBhdWRpbyBhdXRvbWF0aWNhbGx5LlxuICAgICAgLy8gT25seSBwYXNzIHRva2VuIHdoZW4gaXQncyBhIG5vbi1lbXB0eSBzdHJpbmcgKERhaWx5IHJlamVjdHMgdW5kZWZpbmVkL25vbi1zdHJpbmcpLlxuICAgICAgY29uc3Qgam9pbk9wdGlvbnM6IHsgdXJsOiBzdHJpbmc7IHRva2VuPzogc3RyaW5nIH0gPSB7IHVybDogcm9vbVVybCB9O1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgJiYgdG9rZW4udHJpbSgpICE9PSAnJykge1xuICAgICAgICBqb2luT3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2FsbE9iamVjdC5qb2luKGpvaW5PcHRpb25zKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gUm9vbSBjb25uZWN0ZWQgKERhaWx5IGpvaW4gY29tcGxldGUpIOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcblxuICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gY2FsbE9iamVjdC5wYXJ0aWNpcGFudHMoKTtcbiAgICAgIGlmIChwYXJ0aWNpcGFudHM/LmxvY2FsKSB7XG4gICAgICAgIHRoaXMubG9jYWxTZXNzaW9uSWQgPSBwYXJ0aWNpcGFudHMubG9jYWwuc2Vzc2lvbl9pZDtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbCBtdXRlIHN0YXRlOiBEYWlseSBzdGFydHMgd2l0aCBhdWRpbyBvblxuICAgICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dCghY2FsbE9iamVjdC5sb2NhbEF1ZGlvKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50SGFuZGxlcnMoY2FsbDogRGFpbHlDYWxsKTogdm9pZCB7XG4gICAgLy8gYWN0aXZlLXNwZWFrZXItY2hhbmdlOiBwcmltYXJ5IHNvdXJjZSBmb3IgcmVhbC10aW1lIHNwZWFraW5nIGRldGVjdGlvbi5cbiAgICAvLyBFbWl0cyB3aGVuIHRoZSBsb3VkZXN0IHBhcnRpY2lwYW50IGNoYW5nZXM7IGJvdCBzcGVha2luZyA9IHJlbW90ZSBpcyBhY3RpdmUuXG4gICAgY2FsbC5vbignYWN0aXZlLXNwZWFrZXItY2hhbmdlJywgKGV2ZW50OiB7IGFjdGl2ZVNwZWFrZXI/OiB7IHBlZXJJZD86IHN0cmluZyB9IH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlZXJJZCA9IGV2ZW50Py5hY3RpdmVTcGVha2VyPy5wZWVySWQ7XG4gICAgICAgIGlmICghcGVlcklkIHx8ICF0aGlzLmxvY2FsU2Vzc2lvbklkKSB7XG4gICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0xvY2FsID0gcGVlcklkID09PSB0aGlzLmxvY2FsU2Vzc2lvbklkO1xuICAgICAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChpc0xvY2FsKTtcbiAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dCghaXNMb2NhbCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHRyYWNrLXN0YXJ0ZWQgLyB0cmFjay1zdG9wcGVkOiBwbGF5IHJlbW90ZSAoYm90KSBhdWRpbyBleHBsaWNpdGx5IGFuZCB1cGRhdGUgc3BlYWtpbmcgc3RhdGUuXG4gICAgLy8gQnJvd3NlcnMgb2Z0ZW4gZG8gbm90IGF1dG8tcGxheSByZW1vdGUgV2ViUlRDIGF1ZGlvOyBhdHRhY2hpbmcgdG8gYW4gSFRNTEF1ZGlvRWxlbWVudCBhbmRcbiAgICAvLyBjYWxsaW5nIHBsYXkoKSBlbnN1cmVzIHRoZSB1c2VyIGhlYXJzIHRoZSBhZ2VudC5cbiAgICBjYWxsLm9uKCd0cmFjay1zdGFydGVkJywgKGV2ZW50OiB7IHBhcnRpY2lwYW50PzogRGFpbHlQYXJ0aWNpcGFudCB8IG51bGw7IHR5cGU/OiBzdHJpbmc7IHRyYWNrPzogTWVkaWFTdHJlYW1UcmFjayB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gZXZlbnQ/LnBhcnRpY2lwYW50O1xuICAgICAgICBjb25zdCB0eXBlID0gZXZlbnQ/LnR5cGUgPz8gZXZlbnQ/LnRyYWNrPy5raW5kO1xuICAgICAgICBjb25zdCB0cmFjayA9IGV2ZW50Py50cmFjaztcbiAgICAgICAgaWYgKHAgJiYgIXAubG9jYWwgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gR290IGF1ZGlvIHRyYWNrIGZyb20gYmFja2VuZCAodHJhY2stc3RhcnRlZCkg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICAgIHRoaXMuc3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgY29uc3QgYXVkaW9UcmFjayA9IHRyYWNrID8/IChwIGFzIHsgdHJhY2tzPzogeyBhdWRpbz86IHsgdHJhY2s/OiBNZWRpYVN0cmVhbVRyYWNrIH0gfSB9KS50cmFja3M/LmF1ZGlvPy50cmFjaztcbiAgICAgICAgICBpZiAoYXVkaW9UcmFjayAmJiB0eXBlb2YgYXVkaW9UcmFjayA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMucGxheVJlbW90ZVRyYWNrKGF1ZGlvVHJhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjYWxsLm9uKCd0cmFjay1zdG9wcGVkJywgKGV2ZW50OiB7IHBhcnRpY2lwYW50PzogRGFpbHlQYXJ0aWNpcGFudCB8IG51bGw7IHR5cGU/OiBzdHJpbmc7IHRyYWNrPzogTWVkaWFTdHJlYW1UcmFjayB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gZXZlbnQ/LnBhcnRpY2lwYW50O1xuICAgICAgICBjb25zdCB0eXBlID0gZXZlbnQ/LnR5cGUgPz8gZXZlbnQ/LnRyYWNrPy5raW5kO1xuICAgICAgICBpZiAocCAmJiAhcC5sb2NhbCAmJiB0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjYWxsLm9uKCdsZWZ0LW1lZXRpbmcnLCAoKSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5jbGVhbnVwKCkpO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbignZXJyb3InLCAoZXZlbnQ/OiB7IGVycm9yTXNnPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RhaWx5Vm9pY2VDbGllbnQ6IERhaWx5IGVycm9yJywgZXZlbnQ/LmVycm9yTXNnID8/IGV2ZW50KTtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHJlbW90ZSAoYm90KSBhdWRpbyB0cmFjayB2aWEgYSBkZWRpY2F0ZWQgYXVkaW8gZWxlbWVudC5cbiAgICogUmVxdWlyZWQgaW4gbWFueSBicm93c2VycyB3aGVyZSBEYWlseSdzIGludGVybmFsIHBsYXliYWNrIGRvZXMgbm90IG91dHB1dCB0byBzcGVha2Vycy5cbiAgICovXG4gIHByaXZhdGUgcGxheVJlbW90ZVRyYWNrKHRyYWNrOiBNZWRpYVN0cmVhbVRyYWNrKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IE1lZGlhU3RyZWFtKFt0cmFja10pO1xuICAgICAgY29uc3QgYXVkaW8gPSBuZXcgQXVkaW8oKTtcbiAgICAgIGF1ZGlvLmF1dG9wbGF5ID0gdHJ1ZTtcbiAgICAgIGF1ZGlvLnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gYXVkaW87XG4gICAgICBjb25zdCBwID0gYXVkaW8ucGxheSgpO1xuICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdEYWlseVZvaWNlQ2xpZW50OiByZW1vdGUgYXVkaW8gcGxheSBmYWlsZWQgKG1heSBuZWVkIHVzZXIgZ2VzdHVyZSknLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogZmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgYXVkaW8gZWxlbWVudCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlQXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IG1pYyBtdXRlZCBzdGF0ZS4gKi9cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbE9iamVjdC5zZXRMb2NhbEF1ZGlvKCFtdXRlZCk7XG4gICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dChtdXRlZCk7XG4gIH1cblxuICAvKiogRGlzY29ubmVjdCBhbmQgY2xlYW51cC4gKi9cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxPYmplY3QubGVhdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICB0aGlzLmNhbGxPYmplY3QuZGVzdHJveSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBLZWVwIGxhc3QgbWljTXV0ZWQgc3RhdGU7IHdpbGwgcmVzZXQgb24gbmV4dCBjb25uZWN0XG4gIH1cbn1cbiJdfQ==
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBR3ZDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBeUJsQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXhCMUIsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QywwRUFBMEU7UUFDbEUsdUJBQWtCLEdBQTRCLElBQUksQ0FBQztRQUVuRCxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3RELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxjQUFTLEdBQXdCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFckUsZ0VBQWdFO1FBQ2hFLGtCQUFhLEdBQXdCLElBQUksQ0FBQyxt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QUcsSUFBSSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLHVEQUF1RDtJQUN6RCxDQUFDOzs7O1lBdk9GLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBckJvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBEYWlseSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuaW1wb3J0IHR5cGUgeyBEYWlseUNhbGwsIERhaWx5UGFydGljaXBhbnQgfSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuXG4vKipcbiAqIERhaWx5LmpzIFdlYlJUQyBjbGllbnQgZm9yIHZvaWNlIGFnZW50IGF1ZGlvLlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGFuZCBtYW5hZ2UgRGFpbHkgQ2FsbE9iamVjdFxuICogLSBKb2luIERhaWx5IHJvb20gdXNpbmcgcm9vbV91cmxcbiAqIC0gSGFuZGxlIG1pYyBjYXB0dXJlICsgc3BlYWtlciBwbGF5YmFja1xuICogLSBQcm92aWRlIHJlYWwtdGltZSBzcGVha2luZyBkZXRlY3Rpb24gdmlhIGFjdGl2ZS1zcGVha2VyLWNoYW5nZSAocHJpbWFyeSlcbiAqICAgYW5kIHRyYWNrLXN0YXJ0ZWQvdHJhY2stc3RvcHBlZCAoZmFsbGJhY2sgZm9yIGltbWVkaWF0ZSBmZWVkYmFjaylcbiAqIC0gRXhwb3NlIHNwZWFraW5nJCAoYm90IHNwZWFraW5nKSwgdXNlclNwZWFraW5nJCAodXNlciBzcGVha2luZyksIG1pY011dGVkJFxuICogLSBFeHBvc2UgbG9jYWxTdHJlYW0kIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uIChBdWRpb0FuYWx5emVyU2VydmljZSlcbiAqXG4gKiBTcGVha2luZyBzdGF0ZSBmbGlwcyBpbW1lZGlhdGVseSB3aGVuIGFnZW50IGF1ZGlvIHN0YXJ0cyBwbGF5aW5nLlxuICogSWYgdXNlciBzcGVha3Mgd2hpbGUgYm90IGlzIHRhbGtpbmcsIHN0YXRlIHN3aXRjaGVzIHRvIGxpc3RlbmluZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERhaWx5Vm9pY2VDbGllbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWxsT2JqZWN0OiBEYWlseUNhbGwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NhbFN0cmVhbTogTWVkaWFTdHJlYW0gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsb2NhbFNlc3Npb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBFeHBsaWNpdCBwbGF5YmFjayBvZiByZW1vdGUgKGJvdCkgYXVkaW87IHJlcXVpcmVkIGluIHNvbWUgYnJvd3NlcnMuICovXG4gIHByaXZhdGUgcmVtb3RlQXVkaW9FbGVtZW50OiBIVE1MQXVkaW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBzcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSB1c2VyU3BlYWtpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbWljTXV0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbG9jYWxTdHJlYW1TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZWRpYVN0cmVhbSB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBUcnVlIHdoZW4gYm90IChyZW1vdGUgcGFydGljaXBhbnQpIGlzIHRoZSBhY3RpdmUgc3BlYWtlci4gKi9cbiAgc3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFRydWUgd2hlbiB1c2VyIChsb2NhbCBwYXJ0aWNpcGFudCkgaXMgdGhlIGFjdGl2ZSBzcGVha2VyLiAqL1xuICB1c2VyU3BlYWtpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBUcnVlIHdoZW4gbWljIGlzIG11dGVkLiAqL1xuICBtaWNNdXRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLm1pY011dGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogRW1pdHMgbG9jYWwgbWljIHN0cmVhbSBmb3Igd2F2ZWZvcm0gdmlzdWFsaXphdGlvbi4gKi9cbiAgbG9jYWxTdHJlYW0kOiBPYnNlcnZhYmxlPE1lZGlhU3RyZWFtIHwgbnVsbD4gPVxuICAgIHRoaXMubG9jYWxTdHJlYW1TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gRGFpbHkgcm9vbS4gQWNxdWlyZXMgbWljIGZpcnN0IGZvciB3YXZlZm9ybSwgdGhlbiBqb2lucyB3aXRoIGF1ZGlvLlxuICAgKiBAcGFyYW0gcm9vbVVybCBEYWlseSByb29tIFVSTCAoZnJvbSByb29tX2NyZWF0ZWQpXG4gICAqIEBwYXJhbSB0b2tlbiBPcHRpb25hbCBtZWV0aW5nIHRva2VuXG4gICAqL1xuICBhc3luYyBjb25uZWN0KHJvb21Vcmw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gR2V0IG1pYyBzdHJlYW0gZm9yIGJvdGggRGFpbHkgYW5kIHdhdmVmb3JtIChzaW5nbGUgY2FwdHVyZSlcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gICAgICBjb25zdCBhdWRpb1RyYWNrID0gc3RyZWFtLmdldEF1ZGlvVHJhY2tzKClbMF07XG4gICAgICBpZiAoIWF1ZGlvVHJhY2spIHtcbiAgICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdWRpbyB0cmFjaycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvY2FsU3RyZWFtID0gc3RyZWFtO1xuICAgICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChzdHJlYW0pO1xuXG4gICAgICAvLyBDcmVhdGUgYXVkaW8tb25seSBjYWxsIG9iamVjdFxuICAgICAgLy8gdmlkZW9Tb3VyY2U6IGZhbHNlID0gbm8gY2FtZXJhLCBhdWRpb1NvdXJjZSA9IG91ciBtaWMgdHJhY2tcbiAgICAgIGNvbnN0IGNhbGxPYmplY3QgPSBEYWlseS5jcmVhdGVDYWxsT2JqZWN0KHtcbiAgICAgICAgdmlkZW9Tb3VyY2U6IGZhbHNlLFxuICAgICAgICBhdWRpb1NvdXJjZTogYXVkaW9UcmFjayxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNhbGxPYmplY3QgPSBjYWxsT2JqZWN0O1xuXG4gICAgICB0aGlzLnNldHVwRXZlbnRIYW5kbGVycyhjYWxsT2JqZWN0KTtcblxuICAgICAgLy8gSm9pbiByb29tOyBEYWlseSBoYW5kbGVzIHBsYXliYWNrIG9mIHJlbW90ZSAoYm90KSBhdWRpbyBhdXRvbWF0aWNhbGx5LlxuICAgICAgLy8gT25seSBwYXNzIHRva2VuIHdoZW4gaXQncyBhIG5vbi1lbXB0eSBzdHJpbmcgKERhaWx5IHJlamVjdHMgdW5kZWZpbmVkL25vbi1zdHJpbmcpLlxuICAgICAgY29uc3Qgam9pbk9wdGlvbnM6IHsgdXJsOiBzdHJpbmc7IHRva2VuPzogc3RyaW5nIH0gPSB7IHVybDogcm9vbVVybCB9O1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgJiYgdG9rZW4udHJpbSgpICE9PSAnJykge1xuICAgICAgICBqb2luT3B0aW9ucy50b2tlbiA9IHRva2VuO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2FsbE9iamVjdC5qb2luKGpvaW5PcHRpb25zKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gUm9vbSBjb25uZWN0ZWQgKERhaWx5IGpvaW4gY29tcGxldGUpIOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcblxuICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gY2FsbE9iamVjdC5wYXJ0aWNpcGFudHMoKTtcbiAgICAgIGlmIChwYXJ0aWNpcGFudHM/LmxvY2FsKSB7XG4gICAgICAgIHRoaXMubG9jYWxTZXNzaW9uSWQgPSBwYXJ0aWNpcGFudHMubG9jYWwuc2Vzc2lvbl9pZDtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbCBtdXRlIHN0YXRlOiBEYWlseSBzdGFydHMgd2l0aCBhdWRpbyBvblxuICAgICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dCghY2FsbE9iamVjdC5sb2NhbEF1ZGlvKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50SGFuZGxlcnMoY2FsbDogRGFpbHlDYWxsKTogdm9pZCB7XG4gICAgLy8gYWN0aXZlLXNwZWFrZXItY2hhbmdlOiBwcmltYXJ5IHNvdXJjZSBmb3IgcmVhbC10aW1lIHNwZWFraW5nIGRldGVjdGlvbi5cbiAgICAvLyBFbWl0cyB3aGVuIHRoZSBsb3VkZXN0IHBhcnRpY2lwYW50IGNoYW5nZXM7IGJvdCBzcGVha2luZyA9IHJlbW90ZSBpcyBhY3RpdmUuXG4gICAgY2FsbC5vbignYWN0aXZlLXNwZWFrZXItY2hhbmdlJywgKGV2ZW50OiB7IGFjdGl2ZVNwZWFrZXI/OiB7IHBlZXJJZD86IHN0cmluZyB9IH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlZXJJZCA9IGV2ZW50Py5hY3RpdmVTcGVha2VyPy5wZWVySWQ7XG4gICAgICAgIGlmICghcGVlcklkIHx8ICF0aGlzLmxvY2FsU2Vzc2lvbklkKSB7XG4gICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0xvY2FsID0gcGVlcklkID09PSB0aGlzLmxvY2FsU2Vzc2lvbklkO1xuICAgICAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChpc0xvY2FsKTtcbiAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dCghaXNMb2NhbCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHRyYWNrLXN0YXJ0ZWQgLyB0cmFjay1zdG9wcGVkOiBzZXQgdXAgcmVtb3RlIGF1ZGlvIHBsYXliYWNrIG9ubHkuXG4gICAgLy8gU3BlYWtpbmcgc3RhdGUgaXMgZHJpdmVuIGJ5IGFjdGl2ZS1zcGVha2VyLWNoYW5nZSAoYWN0dWFsIGF1ZGlvIGVuZXJneSksIE5PVCB0cmFjayBsaWZlY3ljbGUuXG4gICAgY2FsbC5vbigndHJhY2stc3RhcnRlZCcsIChldmVudDogeyBwYXJ0aWNpcGFudD86IERhaWx5UGFydGljaXBhbnQgfCBudWxsOyB0eXBlPzogc3RyaW5nOyB0cmFjaz86IE1lZGlhU3RyZWFtVHJhY2sgfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IGV2ZW50Py5wYXJ0aWNpcGFudDtcbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50Py50eXBlID8/IGV2ZW50Py50cmFjaz8ua2luZDtcbiAgICAgICAgY29uc3QgdHJhY2sgPSBldmVudD8udHJhY2s7XG4gICAgICAgIGlmIChwICYmICFwLmxvY2FsICYmIHR5cGUgPT09ICdhdWRpbycpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEdvdCBhdWRpbyB0cmFjayBmcm9tIGJhY2tlbmQgKHRyYWNrLXN0YXJ0ZWQpIOKAlCByZWFkeVN0YXRlPSR7dHJhY2s/LnJlYWR5U3RhdGV9LCBtdXRlZD0ke3RyYWNrPy5tdXRlZH0g4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSB0cmFjayA/PyAocCBhcyB7IHRyYWNrcz86IHsgYXVkaW8/OiB7IHRyYWNrPzogTWVkaWFTdHJlYW1UcmFjayB9IH0gfSkudHJhY2tzPy5hdWRpbz8udHJhY2s7XG4gICAgICAgICAgaWYgKGF1ZGlvVHJhY2sgJiYgdHlwZW9mIGF1ZGlvVHJhY2sgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlSZW1vdGVUcmFjayhhdWRpb1RyYWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbigndHJhY2stc3RvcHBlZCcsIChldmVudDogeyBwYXJ0aWNpcGFudD86IERhaWx5UGFydGljaXBhbnQgfCBudWxsOyB0eXBlPzogc3RyaW5nOyB0cmFjaz86IE1lZGlhU3RyZWFtVHJhY2sgfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IGV2ZW50Py5wYXJ0aWNpcGFudDtcbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50Py50eXBlID8/IGV2ZW50Py50cmFjaz8ua2luZDtcbiAgICAgICAgaWYgKHAgJiYgIXAubG9jYWwgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbignbGVmdC1tZWV0aW5nJywgKCkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY2xlYW51cCgpKTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ2Vycm9yJywgKGV2ZW50PzogeyBlcnJvck1zZz86IHN0cmluZyB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdEYWlseVZvaWNlQ2xpZW50OiBEYWlseSBlcnJvcicsIGV2ZW50Py5lcnJvck1zZyA/PyBldmVudCk7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSByZW1vdGUgKGJvdCkgYXVkaW8gdHJhY2sgdmlhIGEgZGVkaWNhdGVkIGF1ZGlvIGVsZW1lbnQuXG4gICAqIFJlcXVpcmVkIGluIG1hbnkgYnJvd3NlcnMgd2hlcmUgRGFpbHkncyBpbnRlcm5hbCBwbGF5YmFjayBkb2VzIG5vdCBvdXRwdXQgdG8gc3BlYWtlcnMuXG4gICAqL1xuICBwcml2YXRlIHBsYXlSZW1vdGVUcmFjayh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gcGxheVJlbW90ZVRyYWNrIGNhbGxlZCDigJQgdHJhY2sucmVhZHlTdGF0ZT0ke3RyYWNrLnJlYWR5U3RhdGV9LCB0cmFjay5tdXRlZD0ke3RyYWNrLm11dGVkfSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG5cbiAgICAgIHRyYWNrLm9udW5tdXRlID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIFJlbW90ZSBhdWRpbyB0cmFjayBVTk1VVEVEIChhdWRpbyBkYXRhIGFycml2aW5nKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgICBjb25zdCBhdWRpbyA9IG5ldyBBdWRpbygpO1xuICAgICAgYXVkaW8uYXV0b3BsYXkgPSB0cnVlO1xuICAgICAgYXVkaW8uc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0VsZW1lbnQgPSBhdWRpbztcblxuICAgICAgYXVkaW8ub25wbGF5aW5nID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEF1ZGlvIGVsZW1lbnQgUExBWUlORyAoYnJvd3NlciBzdGFydGVkIHBsYXliYWNrKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICB9O1xuXG4gICAgICBsZXQgZmlyc3RUaW1lVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGF1ZGlvLm9udGltZXVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGZpcnN0VGltZVVwZGF0ZSkge1xuICAgICAgICAgIGZpcnN0VGltZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gQXVkaW8gZWxlbWVudCBmaXJzdCBUSU1FVVBEQVRFIChhY3R1YWwgYXVkaW8gb3V0cHV0KSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHAgPSBhdWRpby5wbGF5KCk7XG4gICAgICBpZiAocCAmJiB0eXBlb2YgcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBhdWRpby5wbGF5KCkgcmVzb2x2ZWQg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdEYWlseVZvaWNlQ2xpZW50OiByZW1vdGUgYXVkaW8gcGxheSBmYWlsZWQgKG1heSBuZWVkIHVzZXIgZ2VzdHVyZSknLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogZmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgYXVkaW8gZWxlbWVudCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlQXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IG1pYyBtdXRlZCBzdGF0ZS4gKi9cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbE9iamVjdC5zZXRMb2NhbEF1ZGlvKCFtdXRlZCk7XG4gICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dChtdXRlZCk7XG4gIH1cblxuICAvKiogRGlzY29ubmVjdCBhbmQgY2xlYW51cC4gKi9cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxPYmplY3QubGVhdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICB0aGlzLmNhbGxPYmplY3QuZGVzdHJveSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBLZWVwIGxhc3QgbWljTXV0ZWQgc3RhdGU7IHdpbGwgcmVzZXQgb24gbmV4dCBjb25uZWN0XG4gIH1cbn1cbiJdfQ==
@@ -820,9 +820,8 @@ class DailyVoiceClientService {
820
820
  this.speakingSubject.next(!isLocal);
821
821
  });
822
822
  });
823
- // track-started / track-stopped: play remote (bot) audio explicitly and update speaking state.
824
- // Browsers often do not auto-play remote WebRTC audio; attaching to an HTMLAudioElement and
825
- // calling play() ensures the user hears the agent.
823
+ // track-started / track-stopped: set up remote audio playback only.
824
+ // Speaking state is driven by active-speaker-change (actual audio energy), NOT track lifecycle.
826
825
  call.on('track-started', (event) => {
827
826
  this.ngZone.run(() => {
828
827
  var _a, _b, _c, _d;
@@ -830,8 +829,7 @@ class DailyVoiceClientService {
830
829
  const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
831
830
  const track = event === null || event === void 0 ? void 0 : event.track;
832
831
  if (p && !p.local && type === 'audio') {
833
- console.log(`[VoiceDebug] Got audio track from backend (track-started) — ${new Date().toISOString()}`);
834
- this.speakingSubject.next(true);
832
+ console.log(`[VoiceDebug] Got audio track from backend (track-started) — readyState=${track === null || track === void 0 ? void 0 : track.readyState}, muted=${track === null || track === void 0 ? void 0 : track.muted} — ${new Date().toISOString()}`);
835
833
  const audioTrack = track !== null && track !== void 0 ? track : (_d = (_c = p.tracks) === null || _c === void 0 ? void 0 : _c.audio) === null || _d === void 0 ? void 0 : _d.track;
836
834
  if (audioTrack && typeof audioTrack === 'object') {
837
835
  this.playRemoteTrack(audioTrack);
@@ -845,7 +843,6 @@ class DailyVoiceClientService {
845
843
  const p = event === null || event === void 0 ? void 0 : event.participant;
846
844
  const type = (_a = event === null || event === void 0 ? void 0 : event.type) !== null && _a !== void 0 ? _a : (_b = event === null || event === void 0 ? void 0 : event.track) === null || _b === void 0 ? void 0 : _b.kind;
847
845
  if (p && !p.local && type === 'audio') {
848
- this.speakingSubject.next(false);
849
846
  this.stopRemoteAudio();
850
847
  }
851
848
  });
@@ -868,14 +865,30 @@ class DailyVoiceClientService {
868
865
  playRemoteTrack(track) {
869
866
  this.stopRemoteAudio();
870
867
  try {
868
+ console.log(`[VoiceDebug] playRemoteTrack called — track.readyState=${track.readyState}, track.muted=${track.muted} — ${new Date().toISOString()}`);
869
+ track.onunmute = () => {
870
+ console.log(`[VoiceDebug] Remote audio track UNMUTED (audio data arriving) — ${new Date().toISOString()}`);
871
+ };
871
872
  const stream = new MediaStream([track]);
872
873
  const audio = new Audio();
873
874
  audio.autoplay = true;
874
875
  audio.srcObject = stream;
875
876
  this.remoteAudioElement = audio;
877
+ audio.onplaying = () => {
878
+ console.log(`[VoiceDebug] Audio element PLAYING (browser started playback) — ${new Date().toISOString()}`);
879
+ };
880
+ let firstTimeUpdate = true;
881
+ audio.ontimeupdate = () => {
882
+ if (firstTimeUpdate) {
883
+ firstTimeUpdate = false;
884
+ console.log(`[VoiceDebug] Audio element first TIMEUPDATE (actual audio output) — ${new Date().toISOString()}`);
885
+ }
886
+ };
876
887
  const p = audio.play();
877
- if (p && typeof p.catch === 'function') {
878
- p.catch((err) => {
888
+ if (p && typeof p.then === 'function') {
889
+ p.then(() => {
890
+ console.log(`[VoiceDebug] audio.play() resolved — ${new Date().toISOString()}`);
891
+ }).catch((err) => {
879
892
  console.warn('DailyVoiceClient: remote audio play failed (may need user gesture)', err);
880
893
  });
881
894
  }