Tanmay Deep Sharma
1bcc25f95c
fix(voice): guard audio attachment after_create_commit hooks on file presence
...
Both enqueue_audio_transcription and broadcast_message_update_for_audio
fired immediately after Attachment#save without checking whether a file
was actually attached. The broadcast path then walked through
Message#push_event_data → Attachment#audio_metadata → file.metadata,
which is nil when no file is attached, raising NoMethodError on
file.metadata[:width].
This was visible to:
- Captain::OpenAiMessageBuilderService specs that build audio attachments
without a file (intentional — those specs test attachment_parts logic,
not file storage). 4 specs failing, all crashing inside the broadcast
callback rather than in the code under test.
- Any future callsite that creates an audio attachment shell before
attaching the blob (we don't have one in production today, but the
callbacks should be defensive).
Add `return unless file.attached?` to both. The transcription job has
nothing to transcribe without a file; the broadcast carries no useful
audio info before the file lands. The callbacks fire again — correctly —
once the blob is attached and committed in a subsequent transaction.
2026-05-04 14:15:38 +07:00
Tanmay Deep Sharma
442631102c
fix(voice): stub Channel::Voice for legacy inbox rows after DropChannelVoice migration
2026-05-02 16:06:36 +07:00
Tanmay Deep Sharma
78c615fe42
chore(voice): align whatsapp_spec to incoming-pipeline (specs go to specs PR)
2026-05-02 14:49:21 +07:00
Tanmay Deep Sharma
907011e280
chore(voice): split spec changes out to feat/whatsapp-call-specs (sibling PR)
2026-05-02 14:48:41 +07:00
Tanmay Deep Sharma
a766ebf642
chore(voice): align FE files to incoming-pipeline base (UI changes consolidated to PR #14346 )
2026-05-02 14:40:06 +07:00
Tanmay Deep Sharma
0e0e0868d7
chore(voice): split FE changes out to feat/whatsapp-call-ui (PR #14346 )
2026-05-02 14:31:13 +07:00
Tanmay Deep Sharma
d9077c64d3
fix(voice): robust accept-with-fetch + remote-end recording race + single-duration bubble + audio playback signals
2026-05-01 18:29:54 +07:00
Tanmay Deep Sharma
1abb51992b
fix(voice): fall back to content_attributes.data for duration when call payload lacks it
2026-05-01 17:50:02 +07:00
Tanmay Deep Sharma
0282156821
fix(audio): allow audio attachments to serve inline so <audio> can play call recordings
2026-05-01 17:47:04 +07:00
Tanmay Deep Sharma
257a9129d7
fix(voice): create missed-call record when terminate webhook arrives before connect
2026-05-01 17:33:05 +07:00
Tanmay Deep Sharma
1ce316efc7
ui(voice): use ButtonV4 for header WhatsApp call button to match action toolbar styling
2026-05-01 17:27:57 +07:00
Tanmay Deep Sharma
ba94d8c2b0
fix(transcription): drop Whisper temperature to 0 to suppress hallucinations
2026-05-01 16:31:48 +07:00
Tanmay Deep Sharma
6e11bebeae
fix(audio): resolve real duration for MediaRecorder WebM blobs via end-seek trick
2026-05-01 11:16:55 +07:00
Tanmay Deep Sharma
069f25f88a
fix(voice): await remote-end upload before store removeCall to prevent sync cleanup race
2026-05-01 11:15:09 +07:00
Tanmay Deep Sharma
63c193358c
fix(voice): render audio + transcript + duration on call bubble; upload recording on remote-end too
2026-05-01 11:06:53 +07:00
Tanmay Deep Sharma
7663e2ac30
fix(voice): merge call store entries so cable + message.created races don't drop provider/sdp/caller
2026-05-01 10:54:47 +07:00
Tanmay Deep Sharma
0567655840
fix(voice): outbound STUN, mute toggle, skip voice_call bubble in send pipeline
2026-04-30 20:43:35 +07:00
Tanmay Deep Sharma
c25ed094fa
fix(voice): pipe Meta's remote audio to a hidden audio element so the agent hears the contact
2026-04-30 20:17:19 +07:00
Tanmay Deep Sharma
112a8f9e9e
feat(voice): branch contact-panel call button on inbox provider for WhatsApp
2026-04-30 20:14:21 +07:00
Tanmay Deep Sharma
723d416ce3
fix(voice): bump WhatsApp Cloud Calling endpoints to v22 (OSS phone_id_path is locked at v13)
2026-04-30 19:54:31 +07:00
Tanmay Deep Sharma
f3df486ce6
feat(voice): add WhatsApp calling enable toggle to inbox configuration
2026-04-30 19:39:19 +07:00
Tanmay Deep Sharma
c7b6a87e77
feat(voice): wire WhatsApp call UI on top of existing Twilio session flow
2026-04-30 19:30:43 +07:00
Tanmay Deep Sharma
19d91e47f1
fix(voice): rescue transport errors during permission_request send
2026-04-30 19:11:14 +07:00
Tanmay Deep Sharma
1c945899c7
fix(whatsapp): restrict voice_enabled? to embedded-signup whatsapp_cloud channels
2026-04-30 19:10:06 +07:00
Tanmay Deep Sharma
2c025755e2
fix(voice): wrap Meta transport errors during accept as CallFailed
2026-04-30 18:52:51 +07:00
Tanmay Deep Sharma
0618e6e229
fix(voice): close lock-window gaps in accept, throttle, and call_attributes_changed?
2026-04-30 18:46:09 +07:00
Tanmay Deep Sharma
cbef2d4e66
refactor(voice): memoize provider_service accessor in whatsapp calls controller
2026-04-30 18:26:43 +07:00
Tanmay Deep Sharma
cb93aba55c
refactor(voice): split call validations into single-purpose before_actions
2026-04-30 18:14:29 +07:00
Tanmay Deep Sharma
beef43f2bf
refactor(voice): hoist validations to before_action and centralize call-error rendering
2026-04-30 18:04:25 +07:00
Tanmay Deep Sharma
cbd3f759b5
fix(voice): order accept guards correctly and validate contact phone upstream
2026-04-30 17:46:24 +07:00
Tanmay Deep Sharma
a7fdc45977
fix(voice): bail on Meta failures and restrict initiate to WhatsApp inboxes
2026-04-30 17:26:01 +07:00
Tanmay Deep Sharma
41e3ea0d87
fix(voice): record permission_request wamid for context-based reply matching
2026-04-30 17:11:55 +07:00
Tanmay Deep Sharma
fd22017292
Merge feat/whatsapp-call-incoming-pipeline into feature/pla-150
2026-04-30 17:10:45 +07:00
Tanmay Deep Sharma
555894793e
fix(voice): match permission reply to originating conversation via context.id
2026-04-30 17:10:34 +07:00
Tanmay Deep Sharma
7c87d3d150
fix(voice): lock call state transitions, branch terminate on connection state, atomic recording upload, rescue CallFailed in initiate
2026-04-30 16:54:47 +07:00
Tanmay Deep Sharma
c37d1b1d6b
Merge feat/whatsapp-call-incoming-pipeline into feature/pla-150
2026-04-30 16:51:42 +07:00
Tanmay Deep Sharma
e5a03d08ea
fix(voice): resolve contact via source_id and i18n call message bubble
2026-04-30 16:51:29 +07:00
Tanmay Deep Sharma
bc80985f55
refactor(voice): align WhatsappCallsController with Chatwoot jbuilder + concern conventions
2026-04-30 16:38:08 +07:00
Tanmay Deep Sharma
83cd568ca2
feat(voice): add WhatsApp Cloud Calling agent service, controller and routes
2026-04-30 16:24:39 +07:00
Tanmay Deep Sharma
f32a7b3f77
refactor(voice): drop redundant CallMessageBuilder.update_status! class delegate
2026-04-30 16:13:53 +07:00
Tanmay Deep Sharma
ba0fcbfc7f
refactor(voice): tighten WhatsApp call pipeline and broadcast hyphenated terminate status
2026-04-30 16:04:39 +07:00
Tanmay Deep Sharma
546193de2a
refactor(voice): tighten predicate and trim STUN comment
2026-04-30 15:35:58 +07:00
Tanmay Deep Sharma
67b522c433
refactor(voice): expose voice_enabled? on Channel::Whatsapp for duck-typed checks
2026-04-30 15:34:08 +07:00
Tanmay Deep Sharma
f5eca9d1d0
refactor(voice): inline single-use helpers in WhatsApp call services
2026-04-30 15:28:41 +07:00
Tanmay Deep Sharma
5c4db3a6bc
refactor(voice): extract finalize_status! helper to DRY incoming call lifecycle
2026-04-30 15:19:21 +07:00
Tanmay Deep Sharma
792dc359d4
fix(voice): tighten WhatsApp call lifecycle handling and per-call locking
2026-04-30 15:07:51 +07:00
Tanmay Deep Sharma
2b0aaa237f
feat(voice): add WhatsApp inbound call webhook pipeline
2026-04-30 14:59:46 +07:00
Tanmay Deep Sharma
48022833ea
refactor(voice): address review feedback on WhatsApp Cloud Calling provider methods
2026-04-30 14:43:44 +07:00
Tanmay Deep Sharma
e2b3965a08
refactor(voice): raise typed Voice::CallErrors::CallFailed instead of StandardError
2026-04-30 14:43:44 +07:00
Tanmay Deep Sharma
17e25fa3c4
test(voice): cover WhatsApp Cloud Calling provider methods
2026-04-30 14:43:44 +07:00