hermes-agent/tests/plugins
Kevin (OpenClaw Bot) 41c406e1ab feat(a2a): v1.0 upgrade + full code review fixes
Fable 5 pass: 40 turns, $13.56, 109k output tokens.

## A2A v1.0 upgrade
- SCREAMING_SNAKE task states (TASK_STATE_COMPLETED etc)
- ROLE_USER/ROLE_AGENT message roles
- Unified Parts (no kind field, member-presence discrimination)
- Agent Card: supportedInterfaces[], provider, capabilities.extendedAgentCard
- SSE: member-discriminated statusUpdate/artifactUpdate, closure=terminal
- contextId inside Message (not top-level params)
- ISO 8601 millisecond timestamps, createdAt/lastModified on Task
- New operations: tasks/list, tasks/subscribe
- input-required state reachable via [INPUT_REQUIRED] hint

## Security & correctness (all must-fix from review)
- Slash-command bypass removed — remote peers can't invoke operator commands
- Per-peer token auth (A2A_PEER_TOKENS) replaces self-asserted params.peer
- _pending_replies keyed by task_id with per-context FIFO (no cross-talk)
- Timeout returns TASK_STATE_FAILED, not completed
- reset_turns uses task's context from store (was silent no-op)
- Error codes: spec codes only for spec semantics, custom -32050..-32052
- Real latency metric (was fake 0.0)

## Dead features wired
- Push notifications: inline configuration.taskPushNotificationConfig in
  message/send + tasks/pushNotificationConfig/create. HMAC-signed e2e.
- Dynamic Agent Cards: skills from live tools.registry, A2A_ADVERTISED_TOOLSETS
- Persistence: new a2a_history(context_id) tool recalls conversations
- Dead helpers cut: rate_limit_status, is_open_mode, verify_push_signature,
  turn_count, check_bearer

## Architecture
- TurnTracker/RateLimiter/TaskStore on adapter instance (was module-global)
- Handler class at module level (was untestable closure)
- on_processing_complete for failure/cancel paths
- SSE hang fix: keepalive header no longer prevents socket closure

## a2a_orchestrate kept per user instruction
- best mode: only successful replies considered (long error can't win)
- all-error case: explicit 'All peers failed' listing
- Client paths deduped into _send_task helper

## Tests
- inspect.getsource() tests replaced with behavioral coverage
- 133 total: 118 unit + 15 integration
- v1.0 spec compliance, peer-token auth, FIFO replies, timeout→FAILED,
  tasks/get-after-complete, streaming SSE parse, subscribe replay,
  anti-loop rejection, 429s, push e2e, input-required e2e, orchestrate

## Docs
- DESIGN.md out-of-scope synced with reality
- README and plugin.yaml updated

Still TODO (in DESIGN.md): file/data Parts, push-config get/list/delete,
tenant, gRPC/HTTP+JSON bindings, true mid-turn task abort.
2026-08-02 15:10:15 -07:00
..
browser
…
dashboard_auth
…
image_gen
…
memory fix(memory/hindsight): evict timed-out retain ops + coarser status polls 2026-08-02 22:33:43 +05:30
model_providers
…
platforms
…
transcription
…
tts
…
video_gen
…
web
…
__init__.py
…
test_a2a_phase23.py feat(a2a): v1.0 upgrade + full code review fixes 2026-08-02 15:10:15 -07:00
test_a2a_plugin.py feat(a2a): v1.0 upgrade + full code review fixes 2026-08-02 15:10:15 -07:00
test_achievements_plugin.py
…
test_chronos_cron.py
…
test_chronos_verify.py
…
test_discord_runtime_failure.py
…
test_disk_cleanup_plugin.py
…
test_google_meet_audio.py
…
test_google_meet_node.py
…
test_google_meet_plugin.py
…
test_google_meet_realtime.py
…
test_hindsight_health_grace_timeout.py
…
test_hindsight_root_guard.py
…
test_holographic_vector_storage.py fix(memory): resolve dim=1 float32/float64 blob ambiguity 2026-08-02 22:33:13 +05:30
test_kanban_attachments.py
…
test_kanban_board_project_api.py
…
test_kanban_dashboard_plugin.py
…
test_kanban_estimate.py
…
test_kanban_model_override.py
…
test_kanban_worker_runs.py
…
test_langfuse_plugin.py
…
test_nemo_relay_plugin.py
…
test_plugin_dashboard_auth_contract.py
…
test_raft_check_fn_silent.py
…
test_retaindb_plugin.py
…
test_security_guidance_plugin.py
…
test_teams_pipeline_plugin.py
…