///|
/// Keep response correlation inside the authenticated blob, not server memory
/// or client-supplied retry parameters. Business state remains opaque to this
/// envelope and is unwrapped unchanged into RequestContext.
fn sealed_input_state(
  state : Json,
  requests : Map[String, @types.InputRequestEntry],
) -> Json {
  let inputs : Map[String, Json] = Map([])
  for key, entry in requests {
    inputs[key] = {
      "method": entry.method_name.to_method(),
      "params": entry.params,
    }
  }
  {
    "mrtrVersion": 1,
    "continuation": state,
    "inputRequests": Json::object(inputs),
  }
}

///|
fn restore_input_state(
  state : Json,
  responses : Map[String, Json],
) -> Json raise @types.MCPError {
  guard state
    is {
      "mrtrVersion": Number(1, ..),
      "continuation": continuation,
      "inputRequests": Object(requests),
      ..
    } else {
    raise @types.InvalidParams("Unsupported MRTR continuation envelope")
  }
  if requests.length() != responses.length() {
    raise @types.InvalidParams(
      "inputResponses must match the requested input keys",
    )
  }
  for key, request in requests {
    guard responses.get(key) is Some(response) else {
      raise @types.InvalidParams("Missing input response: " + key)
    }
    guard request is { "method": String(method_name), "params": params, .. } else {
      raise @types.InternalError("Malformed authenticated input request")
    }
    @validation.check_input_response(method_name, params, response)
  }
  continuation
}