# Migrate the Single Call Flow

This is the connector contract for the most common case: one inbound call, accepted, connected, and ended.

| Lifecycle Moment                      | Direction              | What Happens                                                 |
| ------------------------------------- | ---------------------- | ------------------------------------------------------------ |
| Call rings on backend                 | Connector → Salesforce | `publishEvent(CALL_STARTED, { call })` with `state: RINGING` |
| Rep clicks Accept                     | Salesforce → Connector | `acceptCall(call)` → return `Promise<CallResult>`            |
| Framework publishes                   | (auto)                 | Framework publishes `CALL_CONNECTED` from your `CallResult`  |
| Rep clicks Mute                       | Salesforce → Connector | `mute(call)` → return `Promise<MuteToggleResult>`            |
| Rep clicks End Call                   | Salesforce → Connector | `endCall(call)` → return `Promise<HangupResult>`             |
| Framework publishes                   | (auto)                 | Framework publishes `HANGUP` from your `HangupResult`        |
| Customer hangs up first               | Connector → Salesforce | `publishEvent(HANGUP, { calls: [call], reason })`            |
| ACW timer expires or rep ends wrap-up | Salesforce → Connector | `wrapUpCall(call)` → return `Promise<GenericResult>`         |
