pub struct VoiceCallRecord {Show 18 fields
pub source_id: String,
pub account_id: String,
pub direction: VoiceCallDirection,
pub party: String,
pub ring_at: String,
pub answer_at: Option<String>,
pub end_at: String,
pub duration_ms: Option<i64>,
pub disposition: VoiceCallDisposition,
pub end_reason: VoiceCallEndReason,
pub error: Option<String>,
pub share_visibility: Option<ShareVisibility>,
pub transfer_target: Option<String>,
pub codec: Option<VoiceCallCodec>,
pub flow_id: Option<String>,
pub flow_name: Option<String>,
pub flow_outcome: Option<VoiceCallFlowOutcome>,
pub envelope: SyncEnvelope,
}Expand description
One historical call as it crosses the wire from the daemon up to the platform.
Mirrors the daemon’s local CallRecord (see
wavekat-voice/crates/wavekat-voice/src/db.rs) with one rename:
the daemon’s local primary key (id) is shipped as source_id
because the platform allocates its own row id and treats the
daemon-side UUID as the idempotency key.
Fields§
§source_id: StringDaemon-generated UUID. The platform’s (user_id, source_id)
upsert key — re-syncing the same id is a no-op.
account_id: StringSIP account UUID on the daemon side. Opaque to the platform.
direction: VoiceCallDirection§party: StringSIP From: (inbound) or To: (outbound). Free text — caller
IDs, display names, and SIP URIs all land here.
ring_at: StringRFC 3339. First ring (inbound) or first dial-out (outbound).
answer_at: Option<String>RFC 3339. Present only when the call reached the answered state.
end_at: StringRFC 3339. Terminal timestamp; the platform uses this as the list cursor.
duration_ms: Option<i64>answer_at → end_at in milliseconds. None for calls that
were never answered.
disposition: VoiceCallDisposition§end_reason: VoiceCallEndReason§error: Option<String>Free-text error, populated only when disposition == Failed.
Visibility tier of any active (not revoked / expired) share on this
call’s recording, or None when it isn’t shared. Read-only: the
platform sets it on list (GET /api/voice/calls) and detail responses
so a consumer can badge the row “Public” / “Invited only”; it is
skipped on serialize, so syncing a call never sends it. Private never
appears here — an unshared call is None.
transfer_target: Option<String>Where a transferred call was sent — the number or SIP address the
far end was asked to call (RFC 3515 Refer-To). Set only when
end_reason == TransferredLocal; None for every other call.
Unlike share_visibility this is daemon-owned data, so it is
sent on sync (serialized when present) and echoed back on read.
codec: Option<VoiceCallCodec>The negotiated audio codec, present when the call reached the
audio-flowing state on a daemon new enough to record it; None
for never-answered calls and rows synced by older daemons. Like
transfer_target this is daemon-owned data, so it is sent on
sync (serialized when present) and echoed back on read.
flow_id: Option<String>Which call flow (“receptionist”) answered this call, when one
did: the platform flow id the daemon held at answer time, and
the flow’s display name at that moment. The name is shipped
verbatim rather than resolved from the flow on read, so a later
rename or delete doesn’t rewrite what history says happened.
Both None for calls the user answered themselves. Daemon-owned
data like codec, so both are sent on sync and echoed on read.
flow_name: Option<String>§flow_outcome: Option<VoiceCallFlowOutcome>How the flow’s run ended. None when no flow answered, and for
runs with no terminal step (the caller hung up mid-flow) — there
VoiceCallRecord::end_reason is already the honest story.
envelope: SyncEnvelopeVersion + forward-compat fields shared by every sync record.
Flattened so schemaVersion and extras sit at the top of
the JSON object alongside the other columns. See
SyncEnvelope and doc 21 §“Versioning and forward
compatibility”.
Trait Implementations§
Source§impl Clone for VoiceCallRecord
impl Clone for VoiceCallRecord
Source§fn clone(&self) -> VoiceCallRecord
fn clone(&self) -> VoiceCallRecord
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more