Files
Dario LipicarandClaude Opus 5 43cd059608 feat(proxy): answer name()/version() for a provider that does not (#61)
Module identity should be total: every module answers name() and version(),
whatever built it. A module generated through the LIDL frontend now has both in
its own dispatch, but that leaves the rest -- already-built .lgx packages, ui /
ui_qml plugins, any provider whose dispatch does not answer -- reporting
nothing.

Every provider already knows both, through the providerName() /
providerVersion() vtable slots LogosProviderObject has always had. ModuleProxy
answers from those, so those modules gain identity with no edit to any of them.

Two placement decisions do the work:

  * the dispatch fallback runs AFTER m_provider->callMethod. An invalid
    QVariant is that slot's "unknown method" answer, so a provider that DOES
    implement name() keeps its own result -- nothing existing changes
    behaviour. It is also gated on an empty argument list, so a module with its
    own name(which) reaches its dispatch exactly as before.
  * getPluginInterface() advertises the same two methods when the provider does
    not list them. Without this a module would ANSWER a method it claimed not
    to have: present to whoever already knew to ask, invisible to `lm` and to
    every untyped caller. Additive only -- an entry the provider already lists
    wins, keeping its description and parameters.

Identity is a method, not introspection, so it stays behind the auth gate. The
three getPlugin* calls are ungated on purpose (they precede the token
exchange); these are not.

This is the one place both transports converge -- the plain transport publishes
a ModuleProxy and reaches it through QMetaObject::invokeMethod -- so one change
covers qt_remote and plain alike.

475/475 tests pass, 6 new.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 14:50:26 -03:00
..