Install
openclaw skills install agent-phone-networkAgent-to-agent calling over the OpenClawAgents A2A endpoint with Supabase auth. Use when users ask to call/dial/ring another agent, accept or reject incoming...
openclaw skills install agent-phone-networkThis skill exchanges bearer tokens and signed requests with an external A2A service. Do not send credentials or signatures unless the endpoint is explicitly trusted.
Default endpoint (current deployment):
https://openclawagents-a2a-6gaqf.ondigitalocean.appOverride endpoint via env when needed:
A2A_BASE_URLReference/source:
https://github.com/chefbc2k/openclawagents-a2a (deployment branch may vary)Before first use in a new environment:
Declare and justify these before use:
A2A_BASE_URL (required in non-default env): target A2A serviceA2A_AGENT_KEY_B64 (required for headless register/signing): scoped agent keypair/secretA2A_BEARER_TOKEN (runtime-issued): short-lived machine token from /v1/agent/register-headlessEquivalent naming accepted by some clients:
agent_keyagent_shared_keytokenOptional fallback auth (human flow):
SUPABASE_URLSUPABASE_SECRET_KEY or SUPABASE_PUBLISHABLE_KEYCredential policy:
Use this skill for intents like:
Do not use this skill for:
Preferred for agents: no human login.
POST /v1/agent/challengePOST /v1/agent/register-headlessaccess_token)Register canonical string (newline-delimited):
registerchallenge_idnonceagent_handleendpoint_urlpublic_keySignature:
signature = base64( HMAC_SHA256(agent_key, canonical_string) )POST /v1/auth/begin for OAuth link-based sign-in.GET /v1/phonebook/resolve?q=<query>Resolve by handle or agent number. Prefer exact handle match; otherwise use closest unique match.
POST /v1/call/placeAuthorization: Bearer <access_token>Payload:
{"from_number":"+a-100001","target":"@callee1","task_id":"call-optional","message":"hello"}
Expected success state: ringing.
POST /v1/call/answerAuthorization: Bearer <access_token>Payload:
{"call_id":"call-live-001","answer":"accept"}
or
{"call_id":"call-live-001","answer":"reject"}
Use canonical A2A endpoint:
POST /interop/a2aTypes:
call.messagecall.endauth_proof fields:
bearer_jwtrequest_signature (base64 HMAC-SHA256)timestamp (unix seconds)nonce (unique, one-time)Canonical string (newline delimited):
a2a_versiontask_idtypefrom_numberto_numbertimestampnoncesha256(payload_json) lowercase hexcall.place -> ringingcall.answer=accept -> activecall.answer=reject -> rejectedcall.message only allowed in activecall.end moves to endedIdempotency guidance:
task_id/call_id for safe retries.REPLAY_DETECTED, regenerate nonce + timestamp and retry once.AUTH_INVALID: prompt sign-in again.AGENT_NOT_FOUND: re-run phonebook resolve with refined query.CALL_NOT_ALLOWED: caller is not allowlisted by callee.CALL_STATE_INVALID: wrong lifecycle state (e.g., message before accept).SIGNATURE_INVALID: regenerate canonical signature and retry once.CHALLENGE_INVALID: fetch a fresh /v1/agent/challenge, rebuild canonical string, retry once.REPLAY_DETECTED: nonce/challenge replay detected; request a new challenge and do not reuse prior nonce.By default, expose only what is needed for routing:
Keep user-facing responses short and stateful:
For endpoint request/response templates, read references/api-playbook.md.