Module: Insika::Server::A2A::Protocol

Defined in:
lib/insika/server/a2a/protocol.rb

Overview

JSON-RPC 2.0 envelope. PURE — receives the already deserialized Hash (raw JSON parsing belongs to Server::App). NEVER raises.

Constant Summary collapse

VERSION =
"2.0"

Class Method Summary collapse

Class Method Details

.error(id, code, message, data: nil) ⇒ Object

{ jsonrpc:, id:, error: { code:, message:, data? } }



32
33
34
35
36
# File 'lib/insika/server/a2a/protocol.rb', line 32

def self.error(id, code, message, data: nil)
  err = { code: code, message: message }
  err[:data] = data unless data.nil?
  { jsonrpc: VERSION, id: id, error: err }
end

.parse(body) ⇒ Object

-> [:ok, { id:, method:, params: }] | [:error, { id:, code:, message: }]



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/insika/server/a2a/protocol.rb', line 14

def self.parse(body)
  return err(nil, Errors::INVALID_REQUEST, "request must be a JSON-RPC object") unless body.is_a?(Hash)

  id = body["id"] # missing -> nil (we always respond; no notifications in this slice)
  return err(id, Errors::INVALID_REQUEST, "jsonrpc must be '2.0'") unless body["jsonrpc"] == VERSION

  method = body["method"]
  return err(id, Errors::INVALID_REQUEST, "method missing") unless method.is_a?(String) && !method.empty?

  [:ok, { id: id, method: method, params: body["params"] || {} }]
end

.result(id, result) ⇒ Object

{ jsonrpc:, id:, result: }



27
28
29
# File 'lib/insika/server/a2a/protocol.rb', line 27

def self.result(id, result)
  { jsonrpc: VERSION, id: id, result: result }
end