Adds the 9th capability interface (IMethodInvoker) so the OPC UA Client
driver can mirror upstream OPC UA Method nodes into the local address
space and forward Call invocations as Session.CallAsync. Method-bearing
servers (e.g. ProgramStateMachine, Acknowledge / Confirm methods, custom
control surfaces) now show up downstream instead of being silently
filtered out.
- Core.Abstractions: IMethodInvoker + MethodCallResult; default no-op
IAddressSpaceBuilder.RegisterMethodNode + MirroredMethodNodeInfo +
MethodArgumentInfo. Default impls keep tag-based drivers and existing
builders compiling without forced overrides.
- OpcUaClientDriver: BrowseRecursiveAsync now lifts the Method node-class
filter; for each method it walks HasProperty to pick up InputArguments
+ OutputArguments and decodes the Argument extension objects into
MethodArgumentInfo. Status-codes pass through verbatim (cascading
quality), local NodeId-parse + lost-session faults surface as
BadNodeIdInvalid / BadCommunicationError.
- 7 new unit tests cover the capability surface, the DTO shapes, and the
back-compat default no-op for RegisterMethodNode. Suite green at
160/160.
Server-side OnCallMethod dispatch (wiring local MethodNode handlers to
IMethodInvoker.CallMethodAsync inside DriverNodeManager) is deferred to
a follow-up — the driver-side surface + browse mirror ship cleanly here.
Closes#281
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>