Positional arguments (client → daemon), GIR / C order.
Empty list is omitted on the bin socket. Current callers that only set param never send this property. Direction is not on the wire — the handler or typelib knows the signature.
Gee.ArrayList cannot store GLib.Value (a struct). valac requires a boxed element type. That is boxing, not optional or null arguments. An empty list means no positional args.
var text = GLib.Value(typeof(string));
text.set_string("hi");
req.values.add(text);