* feat(a2a): add watsonx Orchestrate agent provider
Bridge A2A message/send to WXO runs API (CP4D and IBM Cloud IAM auth),
with dashboard agent type metadata and unit tests for transformations.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(a2a): use shared httpx client and cache WXO auth tokens
Route WXO streaming through get_async_httpx_client (TLS verification
enabled). Cache bearer tokens with TTL buffer. Extract A2A reply text via
a dedicated helper instead of hard-coded JSON paths.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(a2a): treat CP4D token expiration as absolute Unix time
CP4D /authorize returns expiration as epoch seconds, not TTL. Compute
remaining lifetime against wall clock so cached tokens refresh before expiry.
Co-authored-by: Cursor <cursoragent@cursor.com>
* style(a2a): black-format watsonx orchestrate handler for CI py312
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix watsonx orchestrate edge cases
* Fix WXO streaming fallback error handling
* Fix watsonx orchestrate run completion handling
* fix(a2a): make WXO username optional in agent create UI
Username is only required for cp4d auth; ibm_cloud uses api_key alone.
Backend still validates username when auth_mode is cp4d.
Co-authored-by: Cursor <cursoragent@cursor.com>
* test(a2a): align WXO dashboard field test with optional username
Username is not required in agent_create_fields.json; backend validates
for cp4d auth_mode only.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(a2a): send Accept header on WXO streaming run request
* fix(a2a/wxo): scope streaming transport fallback to initial POST only
Narrow the httpx.TransportError fallback in handle_streaming so it only
covers the initial POST /runs/stream. Errors during polling or SSE
consumption now propagate instead of triggering handle_non_streaming,
which would have submitted a duplicate WXO run for the same request.
* refactor(a2a/wxo): type run-param extraction and use text response_type
Return a typed WXORequestParams NamedTuple from _extract_litellm_params
instead of a positional tuple so call sites read params by name, and send
the user message with response_type 'text' so the run body is valid across
all WXO agent configurations rather than the search-specific type.
* fix(a2a/wxo): evict expired token cache entries and raise asyncio.TimeoutError on poll timeout
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>