* Resolve an issue with direct socket connections using the wrong event data.
* Resolve the formatting issus in the provider file
* chore: fix import ordering with ruff
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Nir Simionovich <nirs@cloudonix.io>
Co-authored-by: Abhishek Kumar <abhishek@a6k.me>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(ari): pre-register ext channel id and defer bridge to its StasisStart
Two race conditions in the inbound ARI flow could leave a call silent:
1. Bridging both channels immediately after creating the ext media leg
raced against the ext channel entering the Stasis application; slow
chan_websocket handshakes produced "Channel not in Stasis application"
422 errors on addChannel.
2. Asterisk could fire StasisStart for the ext channel before the
externalMedia POST response returned, so _is_ext_channel returned
False and the event was dropped as an unknown outbound call.
Fixes:
- Generate the ext channel id as dograh-ext-<uuid> client-side and pass
it to Asterisk via the channelId query param. Mark the ext channel,
set its channel->run mapping, register the pending bridge entry, and
persist gathered_context.ext_channel_id all before the POST.
- Defer the bridge to a new _complete_bridge_after_ext_ready handler
triggered by the ext channel's own StasisStart. Both channels are
guaranteed in Stasis by then, so addChannel cannot 422.
- On POST failure or channelId mismatch, roll back the pending entry
and ERROR loudly.
* fix: replace in-memory dict with redis storage
* feat: configurable ElevenLabs base URL for Data Residency (#269)
Adds a `base_url` field to `ElevenlabsTTSConfiguration` so users on an
ElevenLabs Data Residency plan (EU, etc.) can point Dograh at the
regional endpoint instead of the hardcoded global one. Defaults to
`https://api.elevenlabs.io`, preserving existing behaviour. The
service factory rewrites the HTTP scheme to WSS when constructing the
WebSocket TTS service.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: fix drift
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: inline rename of workflow on the editor page
Add a pencil icon next to the workflow name in
WorkflowEditorHeader.tsx. Clicking it swaps the <h1> for an inline
<Input> that saves on Enter or Blur, cancels on Esc, validates
empty/whitespace input, skips no-op renames, rolls back on API
error, and guards against double-submit. Reuses
saveWorkflowConfigurations (the existing rename path used by the
Settings page) — no parallel API call.
Closes https://github.com/dograh-hq/dograh/issues/252.
* refactor: collapse rename state and remove silent config fallback
- WorkflowEditorHeader: replace (isEditingName, nameDraft, nameError,
isRenaming) with a single discriminated-union state. Error and saving
were mutually exclusive and both meaningless in display mode; the
union makes the bad combinations unrepresentable and structurally
prevents the Enter -> disable-input -> blur -> re-fire race that the
original code only guarded against by convention.
- RenderWorkflow: drop the `?? DEFAULT_WORKFLOW_CONFIGURATIONS` fallback
in renameWorkflow. In normal flow the store is initialized before the
header renders, but if it ever weren't, the fallback would silently
overwrite the server-side config with defaults. Throw instead so the
header's existing catch surfaces a toast.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Abhishek Kumar <abhishek@a6k.me>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Conference-based transfer for Telnyx with a two-step flow:
- transfer_call dials the destination with a per-transfer webhook URL.
- On call.answered, the webhook seeds a conference with the destination's
live call_control_id and publishes DESTINATION_ANSWERED.
- TelnyxConferenceStrategy joins the caller into the conference on
pipeline teardown (EndTaskReason.TRANSFER_CALL).
- On post-answer destination hangup, the webhook hangs up the caller —
Telnyx's create_conference doesn't accept end_conference_on_exit on
the seed leg, so we tear down the bridge ourselves.
TransferContext gains optional workflow_run_id (for webhook→provider
resolution in multi-config orgs) and conference_id (set on answer,
rd by the strategy).
Also fixes the transfer tool's provider lookup to go through
get_telephony_provider_for_run instead of the deprecated org-default
shim, which was returning the wrong provider in multi-config orgs.
* filter out local sdp candidates on non local environment
* feat: add FORCE_TURN_RELAY variable
* add FORCE_TURN_RELAY option in docker-compose
* fix: fix github workflow
If there are multiple telephony configurations, the form number should be initialized from the campaigns given telephonic configuration rather than the organization default telephonic configuration.
* feat: add headless widget for deployment
* feat: call callbacks at the right time
* feat: add onCallConnected & onCallDisconnected callback
* feat: add a button with text for floating widget
* feat: add headless widget for deployment
* feat: call callbacks at the right time
* feat: add onCallConnected & onCallDisconnected callback
* feat: add a button with text for floating widget
* docs: web widget
* fix: format issue in pre-pr drift check
* fix: fix CD to rely on pipecat dev dependey
* chore: update message
---------
Co-authored-by: Abhishek Kumar <abhishek@a6k.me>