Implement native inventory manager workflows (#62)
All checks were successful
Native code generation / deterministic (push) Successful in 13m14s
Imaging and meshing gate / native (push) Successful in 4m13s
Native Rust workspace compile / compile (push) Successful in 4m19s

This commit is contained in:
2026-08-10 06:00:28 +00:00
parent eb7be428c6
commit 61d6721287
15 changed files with 5564 additions and 576 deletions

View File

@@ -36,3 +36,36 @@ The focused compatibility suites are
`inventory_store_semantics` and `misclassified_link_semantics`; native unit
tests additionally cover concrete cache round trips, permissions, corruption,
unknown versions, system-folder sorting, and callback re-entry.
## UDP inventory manager
`InventoryManager` now owns the live inventory protocol boundary. Login installs
the agent and library skeletons in the transport-free store, while validated
`UpdateCreateInventoryItem`, `BulkUpdateInventory`, `FetchInventoryReply`, and
`InventoryDescendents` replies populate or reconcile it. Create and copy callback
IDs, item fetches, task replies, and inventory offers are correlated independently;
cancelling one waiter removes only that waiter. A cleanup worker bounds abandoned
requests to one minute, and the manager rejects more than 4,096 pending operations.
Outbound create, update, move, copy, remove, give, rez/derez, script-state, and
task-inventory operations build the generated protocol packet types. Generated
multi-block packets use the packet codec's `encode_multiple` path, so large batches
are split according to the UDP transport bounds while retaining the same agent,
session, transaction, callback, owner, and permission data. Capability-backed
inventory fetch and folder-content responses are parsed before becoming visible in
the store. Asset, material, script, notecard, and thumbnail upload bodies remain a
separate asset-pipeline concern.
Legacy task inventory uses a correlated `ReplyTaskInventory` filename followed by
a `RequestXfer` transfer. The implementation confirms packets, handles duplicate
or out-of-order packet numbers deterministically, aborts cancelled transfers, and
rejects announced or accumulated data above 16 MiB. Task text parsing is capped at
100,000 entries and accepts both plain asset IDs and the reference shadow-ID XOR
encoding. The capability path applies the same byte and entry limits.
No store lock is held across an await, a packet send, or an observer callback.
Reply data is decoded and validated before store mutation, and event registries
snapshot subscribers before invoking them. Focused coverage lives in
`inventory_manager_semantics`, `task_inventory_semantics`, and the native
`inventory_manager::tests` fake-packet cases for callback isolation, bulk-copy
completion, stale folder versions, offers, capability events, and bounded Xfer.