50 lines
2.6 KiB
Markdown
50 lines
2.6 KiB
Markdown
# Agent manager compatibility contract
|
|
|
|
The native `AgentManager` implements LibreMetaverse's non-movement agent
|
|
services over the native network and capability layers. It owns a strong
|
|
network-manager reference until `Dispose`, so UDP and event-queue callbacks do
|
|
not disappear when the weak `GridClient` service cache is the only other
|
|
reference.
|
|
|
|
## Protocol selection and state
|
|
|
|
Chat, instant messages, conferences, gesture activation, animation, viewer
|
|
effects, balance requests, payments, profile updates, interests, picks,
|
|
classifieds, mute changes, and their replies retain the C# LLUDP packet choice
|
|
and wire fields. Capability-backed preferences, experiences, display names,
|
|
offline messages, attachment resources, viewer benefits, render information,
|
|
viewer statistics, postcards, and nav-mesh status use LLSD through the current
|
|
simulator's advertised capability. A missing optional capability produces the
|
|
same empty/`None` result as the reference; caller cancellation remains a typed
|
|
`Error::Cancelled`.
|
|
|
|
Incoming UDP and capability handlers update synchronized state before taking a
|
|
snapshot of the subscriber list. User callbacks therefore run without an
|
|
agent-state lock held. Group-chat membership, signaled animations, balance,
|
|
identity/group data, mute entries, preferences, benefits, and the last nav-mesh
|
|
status are shared between all `GridClient::Self` snapshots.
|
|
`Debug` output exposes only message and binary-payload lengths, never chat/IM
|
|
text, transaction descriptions, or capability URLs.
|
|
|
|
Mute lists are downloaded with the legacy RequestXfer/SendXferPacket protocol.
|
|
The receiver validates the agent, acknowledges ordered chunks, rejects
|
|
oversized or inconsistent transfers, replaces state only after a complete
|
|
download, and then raises `MuteListUpdated`.
|
|
|
|
## Gesture execution
|
|
|
|
Gesture assets use the C# version-2 text format. `PlayGestureAsync` first uses
|
|
`ViewerAsset` and falls back to the LLUDP asset-transfer protocol. It executes
|
|
chat-channel prefixes, animation start/stop, sound triggers, and timed waits in
|
|
sequence. The reference's animation-completion wait remains a no-op. Downloads
|
|
are bounded to 16 MiB, the whole operation is bounded to 30 seconds, and a
|
|
cancelled UDP transfer sends an abort packet.
|
|
|
|
## Verification
|
|
|
|
Unit tests cover UTF-8 chat splitting, identity and animation state, group-chat
|
|
ordering, invitation/display-name events, mute parsing, nav-mesh state, gesture
|
|
format round trips, and malformed assets. The offline fake-grid test performs
|
|
real seed discovery, serves a gesture through `ViewerAsset`, and observes the
|
|
resulting chat, animation, and sound packets on a loopback UDP peer.
|