Warm transfer: transfer_to_number can brief a human before it bridges

The transfer_to_number builtin now takes a mode in its builtin_config, so one tool covers both ways to hand a caller to a person:

builtin_config keyBehaviour
modecold (default) or warm. Absent means cold.
hold_messageWarm only. The line spoken to the caller before they go on hold; {{variable}} tokens are resolved; empty uses the platform default.
allowed_numbersA worker-side fast-reject list of destinations the model may pass, on either mode. Omit to allow any.

cold is unchanged: a SIP REFER on the caller’s own leg. The carrier takes it, the platform drops out, there is no second leg and no marginal cost, and the handoff is terminal — the caller must be on a phone line.

warm dials the destination into a private consult room, reads them an AI-generated summary of the call while the caller holds, and bridges the two only once they accept. It originates a leg the workspace pays for, so it clears the workspace spend gate and carries its own ringing and duration ceilings. It works for a web caller too, because the caller never moves. A no-answer or a decline fails soft — the caller stays with the agent.

mode is operator configuration, not an LLM-visible parameter: the model chooses whether to transfer and to whom, never which mechanism delivers it, because the two differ in who pays for the rest of the call. An agent that needs both mounts two instances under different names.

Nothing you already send changes — a transfer_to_number config with no mode is cold, exactly as before. (An interim transfer_to_human builtin shipped the same day was folded into this one before release; there is no separate builtin.)

Warm transfer on the flow canvas

The transfer_to_number flow node takes the same mode (cold | warm) and hold_message, with the destination baked into the node config rather than supplied by the model. A cold node is terminal. A warm node is not — because warm can fail soft back to the agent, the flow validator requires the node to have an outgoing edge for that path.

See Tools.