Implement remaining TestClient service commands (#94)
Some checks failed
Native code generation / deterministic (push) Successful in 18m19s
Imaging and meshing gate / native (push) Failing after 4m28s
Native Rust workspace compile / compile (push) Failing after 12m58s

This commit is contained in:
2026-08-11 13:10:27 +00:00
parent 374d7958f1
commit 21f85a1b58
13 changed files with 3300 additions and 24 deletions

View File

@@ -3,8 +3,26 @@
The `test-client` binary is a native Rust multi-client shell. It does not load
the former C# executable or start a CLR process. The command registry owns the
implemented system, communication, inventory, appearance, asset, movement,
object, parcel, estate, and grid commands, and reports the remaining upstream
targets through `pending_test_client_commands()`.
object, parcel, estate, grid, agent, friends, groups, directory, and statistics
commands. `pending_test_client_commands()` now reports only the two explicitly
owned voice-native adapters (`ParcelVoiceInfo` and `VoiceAcountCommand`).
## Social, directory, and statistics behavior
Directory searches use native correlated, paged result streams and retain the
upstream 20-second response bound. Group cache, member, and role requests are
correlated with their native events and preserve the upstream timeouts. Friend
mapping, UUID/name resolution, event details, and group operations propagate
shell cancellation.
`who` maintains a live coarse-location roster and resolves display names;
`bots` also tracks source UUIDs from decoded viewer-effect packets. Profile
cloning combines the AgentProfile capability with the matching legacy interests
reply to replace profile text, images, URL, interests, and picks before joining
and activating the target's public groups. `play list` exposes all 135 built-in
animations from the pinned source catalog and also accepts arbitrary animation
asset UUIDs. Statistics come from each simulator's thread-safe native counters.
Directory and collection results are bounded at 65,535 entries.
## World command behavior
@@ -39,6 +57,13 @@ terrain download/upload additionally require `--allow-estate-actions`.
Consequently the default invocation cannot move an avatar, alter or create an
object, upload an asset, or invoke an estate-owner action.
Profile cloning, generic messages, animation starts, touches, group activation,
invitations, joins, and leaves use the same two-part mutation gate. Read-only
friend, group, directory, region, uptime, dilation, and statistics commands do
not require a gate. Profile cloning and direct group joins additionally require
`--allow-spending`, because an open group can charge an enrollment fee and the
client cannot safely infer that fee before every UUID-based join.
Output paths reject parent-directory traversal. Timeouts, cancellation, file
limits, result limits, and linkset limits apply equally to live and fake-grid
runs. Passwords and login secrets continue to pass through the shell's common
@@ -52,13 +77,22 @@ Fake scripts can seed the same command layer with `!world-region`,
`!world-agent-location`, `!world-estate`, `!world-asset`, and `!world-syntax`
tab-separated directives. These fixtures never open a network connection.
The service layer additionally accepts `!service-avatar`, `!service-friend`,
`!service-group`, `!service-group-result`, `!service-group-member`,
`!service-group-role`, `!service-person`, `!service-classified`,
`!service-event`, `!service-event-info`, `!service-land`, `!service-place`,
`!service-sim`, `!service-animation`, and `!service-utilization[-row]` fixtures.
Run the issue-focused compatibility gate with:
```text
cargo test -p libremetaverse-programs --test test_client_world_cli
cargo test -p libremetaverse-programs --test test_client_services_cli
```
The gate drives every command owned by the movement/object/land/grid issue,
checks the exact fake backend calls, verifies destructive-operation guards,
round-trips an exported linkset through import, compares two exports byte for
byte, and validates generated terrain, texture, and TGA files.
The world gate drives every command owned by the movement/object/land/grid
issue, checks the exact fake backend calls, round-trips a linkset through
import, and validates generated assets. The services gate drives every one of
the 28 remaining non-voice commands in a single offline session, verifies the
destructive-operation guards, and proves the pending inventory contains only
the two explicitly owned voice adapters.