v0.7.5

thevoiceguy/siphon-aiv0.7.5Jun 17, 2026by thevoiceguy

Upgrading?

AI Summary

This release extends bot-initiated hold and resume functionality to outbound originated calls, closing a gap from the previous inbound-only implementation.

Key Highlights

  • Outbound originated calls now support `hold` and `resume` commands via the WebSocket server.
  • The system retains the SDP offer (`OutboundAccepted.offer_sdp`) to build re-INVITEs for hold/resume.
  • Reuses the shared `[media].moh_file` for gap music during holds.
  • SIPp regression tests verify the outbound hold functionality.

New Features

  • Bot-initiated hold/resume for outbound originated calls

Full Release Notes

Follow-up to **0.7.2** (bot-initiated hold/resume), which shipped **inbound-only**. The hold/resume re-INVITE offers were built from the inbound side's cached *answer* SDP, which the outbound originate path didn't retain. This closes that gap — a call placed via `POST /admin/v1/calls` can now be held/resumed by the WS server exactly like an inbound call. No protocol or CDR change; hold stays always-available (no flag).

### Changed
- **Outbound originated calls support `hold` / `resume`.** `apply_answer` retains the SDP **offer** we sent (`OutboundAccepted.offer_sdp`); the outbound controller builds a `HoldContext` from it (direction-flipped to `sendonly`/`sendrecv`) using the same `DialogControl` as outbound transfer (the directly-held dialog, re-INVITE via the gateway UAC). Gap music reuses the shared `[media].moh_file`.
- SIPp **outbound_bot_hold** regression phase (`outbound_bot_hold_uas.xml` + echo-ws `--auto-hold`), asserting `holds_total{result="ok"}` reads 2.

Verified live: `originate=202` → echo `hold`→`resume`→`hangup` → "call held / resumed (bot-initiated)" on the outbound Direct dialog → `sipp rc=0`.

**Both bot-hold and WS reconnect now work on inbound and outbound legs.**

Related Repositories