Developer Tools API and SDK Audit
Audit date: 2026-07-29. Scope: the Packet Utils-owned, packaged n3DevTools runtime and the synthetic-mouse controls embedded beside it. This audit compares the live utility implementations with shared code under Api and sdk. It ignores a standalone RuneLite Developer Tools plugin.
Executive findings
The package exposes 36 DevToolsButton controls, five direct test-harness buttons, Logger filter controls, and five synthetic-mouse actions. The strongest n3 integrations exist in Widget Inspector, Logger, OSRS-TCG Event Spoofer, and synthetic mouse tooling. Most visual overlays read RuneLite Client state directly. Direct reads serve a diagnostic tool well, but the panel omits the normalized snapshots, query results, or failure semantics that feature plugins consume.
Prioritize these changes:
- Add an SDK diagnostics view rather than replacing raw views. Retain raw RuneLite values for revision diagnosis, then show the corresponding n3 query or snapshot beside them. Differences provide useful evidence instead of hidden implementation drift.
- Variable metadata now belongs to the SDK.
GameVarsRegistryowns the revision-pinned varbit identifiers and immutable identifier-to-name metadata.RunePouch, pouch workflows, and Var Inspector consume that shared registry, so SDK code no longer importsn3DevTools.data.Varbits. - Use
SdkEventsfor Inventory Inspector and animation/projectile history. The shared tracker owns bounded inventory deltas, animation changes, projectile movement, and player-item snapshots. Developer Tools maintains a second event interpretation for the same data. - Harden session and login boundaries. Several overlays dereference the local player or world map before checking availability. Widget Picker assumes it can find a fallback root. Developer Tools starts with Packet Utils, so these paths can execute outside
LOGGED_IN. - Separate destructive harness actions from observation controls. Clear Infobox removes every infobox, while Disconnect and command handlers mutate client state. Label them as test actions, add confirmation where impact crosses n3 ownership, and report completion or rejection.
Repair status
The first repair pass completed the immediate safety work found during this audit. Overlays stop rendering when player, world-view, or world-map state drops offline. Widget Picker skips creation when no visible root exists. Clear Infobox removes only counters created by Developer Tools. Cancel Mouse Path cancels only the Developer Tools preview owner. Command handlers reject missing, malformed, out-of-range, or login-dependent arguments without leaking an event-bus exception.
The variable-metadata migration is also complete. GameVarsRegistry now owns the former DevTools varbit catalog and its canonical-name lookup, Var Inspector consumes the immutable SDK registry, and rune-pouch SDK/workflow code no longer depends on the DevTools package. The remaining normalized event views and SDK-versus-raw comparison enhancements below are still planned.
Utility audit
Priority meanings: P0 prevents crashes or cross-plugin damage; P1 removes dependency drift or makes diagnostics represent shared runtime behavior; P2 adds useful diagnostic depth; Keep requires no API alignment change.
Entities and scene overlays
| Utility | Current behavior | API/SDK alignment opportunity | Priority |
|---|---|---|---|
| Players | Renders raw players from the top-level and local-player world views. | Keep the raw worldview pass, then add an optional Players.search() result count and filters. Mark entities omitted by the SDK query cache so instance or cache drift shows clearly. | P2 |
| NPCs | Renders IDs, names, animations, models, health, and spot animations from both world views. | Add NPCs.search() membership and the normalized animation/head-icon values from N3Client as secondary fields. Preserve raw composition data needed for revision work. | P2 |
| Ground Items | Walks scene tiles and renders each TileItem. | Compare the raw set with TileItems.search() and show ownership/reachability fields used by TileItemActions. This diagnoses why a visible item lacks actionability. | P1 |
| Ground Objects | Renders a tile's ground object. | Add TileObjects.search() membership and the resolved SpatialActionTargets target. Keep the object subtype label. | P2 |
| Game Objects | Renders all game objects on each tile. | Add action names and the target chosen by ObjectActions/SpatialActionTargets; flag duplicate IDs at one coordinate. | P1 |
| Graphics Objects | Renders raw graphics objects. | Add a bounded history from the SDK event surface when graphics-object tracking exists. Until then, show whether GraphicsObjectActions can resolve the displayed object. Avoid creating another cache in Developer Tools. | P2 |
| Walls | Renders wall objects from scene tiles. | Include TileObjects.search() membership and collision-edge interpretation so the view explains walker and reachability decisions. | P1 |
| Decorations | Renders decorative objects from scene tiles. | Add object actions and query membership. Keep raw decoration offsets because the shared action API skips them. | P2 |
| Projectiles | Renders active projectiles from the client. | Add recent SdkEvents.projectileMovements() entries and whether ProjectileActions resolves the same projectile. The live overlay and event history answer different questions. | P1 |
| World Entities | Renders world-view bounds and identifiers. | Show which world view each n3 entity query used. This quickly exposes top-level versus instanced-world mismatches. | P1 |
| Animation Ids | Draws current player and NPC animation IDs. | Add the last SdkEvents.animationChanges() record, timestamp/tick, and SDK-normalized NPC animation. Preserve the live raw ID. | P1 |
Coordinates, camera, collision, and movement
| Utility | Current behavior | API/SDK alignment opportunity | Priority |
|---|---|---|---|
| Location | Shows local, world, scene, base, instance chunks, and map regions. Skips rendering when player or world-view state drops. | Add N3Client.playerPosition() and WorldPointUtility conversions beside raw values, with an explicit mismatch marker. | P1 |
| World Map Location | Draws the map center, crosshair, and region grid, with missing-map guards on both overlays. | Display WorldMapApi.isOpen(), mapPosition(), zoom(), and round-trip conversions so plugins can diagnose the shared facade. | P1 |
| Tile Location | Adds coordinate and movement data to hovered scene tiles. | Reuse the Location coordinate formatter, and add the matching WorldPointUtility result. A copy action yields new WorldPoint(x, y, plane). | P2 |
| Camera Position | Shows raw camera coordinates, pitch, yaw, and scale. | Display CameraApi.snapshot() fields beside raw values and add viewport checks for the selected Widget Inspector widget or hovered tile. | P1 |
| Zone Borders | Draws scene zone boundaries. | Keep raw rendering. Add zone IDs and copyable bounds; no shared API currently models zones. | P2 |
| Map Squares | Draws map-square boundaries and labels. | Keep the raw utility. Add region IDs and loaded-map-region membership from the Location snapshot. | P2 |
| Loading Lines | Draws scene loading boundaries. | Keep as a client renderer diagnostic. Add the current scene/base revision context, but skip forcing it through the walker API. | Keep |
| Line Of Sight | Colors tiles visible from the player. | Route the normalized result through LineOfSightApi.hasLineOfSight() and show raw WorldArea disagreement. The shared API powers automation. | P1 |
| Valid Movement | Colors tiles reachable by one directional step. | Compare RuneLite canTravelInDirection with ReachabilityActions and the walker's current collision interpretation. Show the blocking reason where available. | P1 |
| Movement Flags | Displays raw collision flags for hovered tiles. | Decode flags using the walker collision layer vocabulary and link each bit to the movement direction it blocks. Preserve the hexadecimal raw value. | P1 |
| Interacting | Draws actor interaction links. | Add Players.search()/NPCs.search() membership and the combat target selected by shared combat actions. Keep raw actor links. | P2 |
| Tile flags | Renders bridge/tile-setting flags across planes. | Label the effect each flag has on plane selection and collision. Feed the same decoder into walker diagnostics instead of duplicating bit meanings. | P1 |
Inspectors and identifiers
| Utility | Current behavior | API/SDK alignment opportunity | Priority |
|---|---|---|---|
| Examine | Appends raw NPC, object, and item IDs to examine menu targets. | Add resolved SDK query identity and copy actions. For objects, include world point and the ObjectActions target form. | P2 |
| Widget Inspector | Browses live widget trees, edits fields, picks widgets, and shows WidgetCatalog metadata. Picker creation stops safely when no visible root exists. | Add WidgetDescriptor.toSummary(), matching WidgetExplorer results, Widgets address resolution, and WidgetInteractionResolver dispatch details. Add copy buttons for canonical name, packed ID, WidgetAddress, and an Api.actions.WidgetActions snippet. | P1 |
| Var Inspector | Tracks varbits using SDK-owned GameVarsRegistry metadata; varplayers and diagnostic-only varcs retain their existing catalogs. RunePouch and pouch workflows use the same registry. | Add side-by-side GameVars reads and SdkEventTracker change envelopes while retaining raw VarbitChanged events. | P1 (metadata migration complete) |
| Script Inspector | Captures pre/post script events, arguments, stacks, nesting, and allow/block lists. | Keep raw script tracing because no n3 facade models client scripts. Add widget-catalog resolution for widget IDs found in script arguments and export selected traces as structured JSON. | P2 |
| Inventory Inspector | Stores item-container snapshots and computes its own deltas. | Replace duplicate delta interpretation with SdkEvents.inventoryDeltas() and playerItemState(). Use ItemInfoApi for normalized item metadata, retain a raw-container tab, and identify Inventory/Equipment/Bank container ownership. | P1 |
| Inventory Ids | Draws item IDs on Inventory widget children. | Use Inventory/Inventory.search() for the normalized list and Widgets for the resolved inventory address. Highlight raw widget items absent from the SDK query. | P1 |
| Id Menu Option | Adds clipboard entries for widget, item, NPC, and object IDs. | Resolve widget IDs through WidgetCatalog; add world coordinates and generated query/action snippets for NPCs, objects, and items. Avoid presenting an item ID as a widget ID when container parents change. | P1 |
Runtime observation and test harnesses
| Utility | Current behavior | API/SDK alignment opportunity | Priority |
|---|---|---|---|
| Sound Effects | Shows recent global and area sound events with range coloring. | Keep as a raw event diagnostic. Add copy buttons and tick/time fields. No shared gameplay API requires sound state today. | Keep |
| Menus | Injects 100 synthetic menu entries and submenus each client tick while active. | Label it Menu Stress Test, bound injection to a one-shot action, and show MenuEntriesApi.diagnostics() after insertion. Continuous injection obscures real menu diagnostics. | P1 |
| Detached Camera | Toggles raw camera mode and speed. | Move the mutation behind a small diagnostic camera controller with capture/restore semantics. Show CameraApi.snapshot() before and after; restore the prior mode on shutdown. | P1 |
| Shell | Opens RuneLite's client shell when the injected dependency exists. | Add ready-made bindings for read-only SDK facades and Api.actions; print InteractionResult rather than hiding it. Keep unrestricted execution explicit because Shell bypasses normal plugin boundaries. | P2 |
| Swing Defaults | Opens the FlatLaf UI defaults inspector bundled with the distributed suite. Live-confirmed functional on 2026-08-16. | Keep. Preserve packaging coverage for both inspector entrypoints and improve unavailable-state feedback after LinkageError. | P2 |
| Logger | Mounts a session console for logback, packet traces, and native action/menu traces. Minimum-level, Logback, Packets, Actions / Menus, Auto-scroll, and Clear Logger controls filter or reset the view. | Keep the current shared buffers. Add SuiteRuntimeStatus.snapshot(), action-pacer state, revision-health failures, and export with source/tick filters. | P1 |
| OSRS-TCG Event Spoofer | Dispatches preset Game Chat, Boss KC, Raid completion, and Clue Scroll events onto EventBus and visibly renders in the local chatbox. | See OSRS-TCG Event Spoofer Guide for full usage and preset catalog. | Keep |
| Notification | Schedules a RuneLite notification after three seconds. | Label it Notification Test, expose pending/cancel state, and avoid scheduling duplicates. No n3 SDK replacement exists. | P2 |
| Infobox | Adds a test counter owned by Packet Utils. | Track the infoboxes created by this utility and expose their IDs/count. No shared SDK alignment exists. | P2 |
| Clear Infobox | Removes only identity-tracked test counters created by Developer Tools and clears them during panel reset. | Keep the ownership boundary. Add a created-counter count if the harness needs more feedback. | Keep |
| Disconnect | Forces CONNECTION_LOST on the client thread. | Label it Simulate Disconnect, require confirmation, and report the observed game-state transition through an event/result. Keep it out of generic observation rows. | P1 |
Synthetic mouse controls
| Utility | Current behavior | API/SDK alignment opportunity | Priority |
|---|---|---|---|
| Record Mouse | Starts or stops mouse-only JSONL capture with optional menu metadata. | Keep MouseRecorder and Packet Utils service ownership. Show output path, duration, event count, and the exact I/O failure. Disable analysis until asynchronous stop completes. | P1 |
| Analyze Mouse | Analyzes the latest recording into a MouseMotionProfile. | Show the source file, accepted/rejected sample counts, and each MouseMetricDistribution. Retain the exact analysis failure rather than a generic label. | P2 |
| Save Mouse Profile | Saves the last derived profile under the configured profile name. | Add an existing-profile chooser, overwrite confirmation, and the normalized MouseMotionProfileRepository.profileId. Keep raw recordings separate. | P2 |
| Preview Mouse Path | Plans a movement path to the live widget selected in Widget Inspector. | Resolve the widget through Widgets, show its catalog address and chosen landing bounds, and preview the landing distribution. Report service rejection/cancellation reasons. | P1 |
| Cancel Mouse Path | Cancels only PREVIEW_OWNER, leaving paths owned by other Packet Utils consumers untouched. | Keep the owner-scoped cancellation and show whether a preview was active. | Keep |
Command console audit
DevToolsPlugin.onCommandExecuted exposes hidden utilities through chat commands. They require the same separation between observation and mutation.
| Commands | Recommendation | Priority |
|---|---|---|
logger, getvarp, getvarb, getconf, modicons | Argument counts, parsing failures, and index failures return a chat error. Route variable reads through GameVars where the facade supports them. | P1 |
setvarp, setvarb, addxp, setstat | Put local-state mutation and synthetic event publication behind StateFixtureService/StateTransaction. This gives tests rollback and explicit DispatchResult semantics. | P1 |
anim, gfx, transform, wear, tex, alpha, zsort, sound, msg | Login-dependent commands reject missing local-player state and malformed arguments. Group them under a local fixture namespace and publish structured results. | P1 |
setconf | Add confirmation for protected n3 groups, redact secrets, and report typed conversion failures. Keep ConfigManager as the configuration authority. | P1 |
Recommended delivery sequence
- Fix login/null guards, command validation, Widget Picker fallback, and Clear Infobox ownership. These changes reduce crash and collateral-state risk without changing SDK contracts.
- Add an SDK diagnostics section to the panel with
SuiteRuntimeStatus, revision health, action-pacer status, query counts, and current walker state. - Complete: Introduce the SDK variable metadata registry and migrate the reversed
RunePouch -> n3DevTools.data.Varbitsdependency. - Rebase Inventory Inspector and event-history overlays on
SdkEvents, retaining raw tabs for comparison. - Add shared-versus-raw comparison modes for widgets, line of sight, movement, entities, camera, and world map state.
Validation boundary
This report resulted from static inspection of the packaged source and shared API contracts. No RuneLite client existed in the cloud workspace, so render behavior, panel layout, fixture mutation, and live shared-versus-raw comparisons remain pending. Each implementation slice should add focused unit coverage and a short live-client acceptance pass for the utility it changes.
Live client verification: pending.