Skip to main content

SDK Competitor Gap Audit

Current as of 2026-07-09. This audit compares n3Plugins' live SDK/API surface with public JavaDocs for DreamBot, Inubot/RSPeer, Storm, and Twilite. It is a planning artifact only: live source remains authoritative, and every proposed helper still needs RuneLite-revision validation before being treated as runtime-proven.

Sources Reviewed

  • n3Plugins live source under src/main/java/com/n3plugins/sdk and src/main/java/com/n3plugins/InteractionApi.
  • n3Plugins current-state references: N3PLUGINS_SOURCE_OF_TRUTH.md, docs/agent-handbook.md, and focused SDK docs.
  • DreamBot JavaDocs: https://dreambot.org/javadocs/, especially all-classes and index pages for Bank, Inventory, Walking, GameObjects, NPCs, Dialogues, GrandExchange, ItemProcessing, LivePrices, Mouse, Keyboard, script frameworks, events, quests, diaries, and random solvers.
  • Inubot/RSPeer JavaDocs: https://javadocs.inubot.com/, especially the all-classes/index pages for scene projection/field-of-view, query/loadout, cutscene, world, and game-state helpers.
  • Storm JavaDocs: https://stormjavadocs.z6.web.core.windows.net/, especially package/class hierarchy and index pages for net.storm.sdk.*, query results, MenuFactory, BankWornItems, Friends, Minigames, Production, Prices, Worlds, WorldMap, TransportLoader, item info, plugin task APIs, blocking events, and event models.
  • Twilite JavaDocs: https://twilite.dev/javadocs/, especially package/class hierarchy for dev.twilite.game.facade, dev.twilite.game.stream, dev.twilite.game.loadout, dev.twilite.game.simulation, generated IDs, interaction scopes, menu options, prices, TOTP, and tick assumptions.

Executive Summary

n3Plugins is already strong in result-aware interactions, RuneLite-native packet dispatch, pathfinding ownership, ID-map-assisted queries, workflow builders, loadouts, and local Agent Server documentation. Since the original audit, the highest-leverage SDK gap-fill surfaces have landed: typed query snapshots, item metadata and price facades, bank worn-equipment helpers, bank state reads, world/world-map reads, menu snapshots, social snapshots, and line-of-sight helpers.

The next competitor gaps are now mostly domain breadth and ergonomics beyond the newly landed quest/diary progress reads, passive event snapshots, and caller-owned runtime loop helper. The same n3 invariants still apply: automation writes go through InteractionApi.actions.* and return InteractionResult; raw reads stay in sdk.*; long-running ownership remains with PacketUtils, ActionPacer, and Walker. Passing source tests does not prove live RuneLite parity; widget, world-map, menu, social, client-backed LOS, diary mapping, and passive event helpers remain live-verification pending until observed in-client.

Current n3 Baseline

Arean3 coverage todayGap posture
Result-aware actionsBroad InteractionApi.actions.* coverage for bank, bank worn-equipment deposit, inventory, NPCs, objects, players, widgets, GE, trade, shop, magic, prayer, movement, production, minigames, sailing, blocking events, and utility events.Strong; keep this as the public automation surface.
QueriesInventory, bank, equipment, deposit box, GE, shop, trade, NPC, player, tile object, tile item, widget, and quick-prayer query classes, plus immutable QueryResults<T> snapshots exposed through results().Stronger parity with Storm/Inubot-style APIs; continue adding shared filters only when repeated plugin code proves the need.
Widgets/itemsWidget, inventory, bank, bank state, bank worn equipment, equipment, dialogue, shop, GE inventory, rune pouch, combat, prayer, item metadata, and price helpers.Strong for core gameplay; live verification remains pending for revision-sensitive widget-backed reads.
MovementShared walker, shortest-path data, route options, transports, requirements, reachability, navigation actions, banked route planning, and WalkerResourceApi transport/route category descriptors.Strong; add discoverability and additional route-result introspection rather than new tick owners.
WorkflowTask pipeline, automation state machine, combat/production/banking/enchanting builders, inventory plan, loadouts.Good base; competitors expose more script/task lifecycle ergonomics.
Client/game stateClient bridge, game vars, delays, screenshots, hint arrows, world-point/area utilities, worlds/world-map reads, menu entries, social snapshots, and line-of-sight helpers.Camera reads, event snapshots, and script/runtime ergonomics are the main remaining gaps.
Developer Tooling / TestingSession-only command console (Code Console), developer inspection panel (DevTools), and live-client action probe runner (API Tester).Strong developer and diagnostic support; keep tests structured in the harness rather than ad-hoc.
Documentation/discoveryAgent Server generated SDK index plus docs/examples.Strong; competitor mapping should become a tracked backlog.

Implemented Since Audit

SurfaceStatusNotes
QueryResults<T> and query results() adaptersImplementedImmutable snapshots now cover item, equipment, NPC, player, tile item, tile object, and widget query flows while preserving legacy result() compatibility.
ItemInfoApi, ItemInfo, PricesApi, PriceQuoteImplementedRead-only metadata and price facades are backed by existing item-definition and market data sources; Market Alcher strategy remains plugin-local. Reference: Item Info And Prices.
BankWornEquipmentApi, BankWornEquipmentItem, BankWornEquipmentActionsImplemented / live-pendingRev239 live pass on 2026-07-09 saw the worn-equipment bank view expose visible deposit-capable item widgets under 983044, but n3_get_bank_status//api/v1/bank/status reported open=false after switching to that view; typed loadout/worn-state reads hit class lp declares multiple JSON fields named hr. Source now maps inventory/equipment entries to plain agent JSON and omits raw backing widgets; patched client reload/live retest is still pending.
BankStateApi, BankStateSnapshotImplemented / live-pendingRev239 live pass on 2026-07-09 confirmed the main bank open read (open=true), bank item snapshot (Coins at index 0 on widget 786444), search widget action (786474 with Search), default quantity widget action (786465 with Default quantity: 10), and varbits 3958=0, 3959=0, 6590=0; placeholder/rearrange/search toggles still need explicit UI-state changes before this row leaves live-pending.
ProductionApi, ProductionProduct, ProductionQuantityButtonImplemented / live-pendingMake-X and legacy Smithing read helpers expose visible products, action descriptions, selected-state heuristics, quantity buttons, and an adapter hook for custom quantity; the live default currently returns empty when no stable client source is exposed.
MinigamesApi, MinigamesSnapshot, MinigameTeleportOptionImplemented / live-pendingRev239 live pass on 2026-07-09 found a mismatch: with the visible grouping/minigame panel showing Pest Control (62324748, text Pest Control<br><col=ff0000>Requires combat level 40), both n3_get_minigames and n3_read_sdk minigames.state returned open=false, all configured destination widgets hidden, canTeleport=true, cooldownValue=0, and lastTeleportUsage=0. Source now resolves current grouping widgets by visible destination text under group 951 and routes teleport actions through that resolved widget; patched client reload/live retest is still pending.
WorldsApi, WorldSnapshot, WorldMapApiImplemented / live-pendingRev239 live pass on 2026-07-09 confirmed visible world-map detection through n3_get_world_map and n3_read_sdk world-map.state: open=true, center 3209,3220, zoom 3; coordinate conversion still needs an explicit live probe before this row leaves live-pending. Reference: World SDK.
MenuEntriesApi, MenuEntrySnapshotImplemented / live-validatedRev239 live pass on 2026-07-09 confirmed NPC hover/right-click snapshot parity for Man (level-2) (Examine, Pickpocket, Talk-to, Attack, identifier 2813), object parity for Bed (EXAMINE_OBJECT, identifier 424, params 27,46), inventory-item parity for Bronze pickaxe (itemId=1265, widget 9764864, slot param 1, Examine/Drop/Use/Wield ordering), ground-item parity for Bronze axe (EXAMINE_ITEM_GROUND/GROUND_ITEM_THIRD_OPTION, identifier 1351, params 25,46), and widget parity for the Prayer tab (CC_OP, identifiers 2 and 1, param0=-1, widget 35913797); n3_get_menu_entries preserved colored targets and n3_read_sdk menu.entries normalized target text. Reference: Menu Entries.
FriendsApi, ClanApi, ChatApi and social snapshotsImplemented / live-pendingFriends chat, clan, and recent chat message reads exist for overlays and coordination. Reference: Social Snapshots.
CameraApi, CameraSnapshotImplemented / live-validatedRev239 live pass on 2026-07-09 confirmed n3_get_camera and n3_read_sdk camera.snapshot parity: yaw/target 12060, pitch/target 3064, camera position 5280,7290,-2630, zoom 413, viewport 512x334, offset 4,4.
LineOfSightApiImplemented / live-pendingRev239 live pass on 2026-07-09 confirmed same-tile and clear-path reads from 3206,3224,2: same tile and probes to 3207,3224,2, 3206,3225,2, 3205,3224,2, 3206,3230,2, 3212,3224,2, 3200,3224,2, 3206,3218,2, 3210,3228,2, and 3202,3220,2 all returned visible=true; blocked-path behavior still needs a known obstacle/false case before this row leaves live-pending.
ThreatMapApiImplemented / live-pendingRead-only tile-threat helpers cover projectile targets, graphics-object hazards, and aggressive NPC line-of-sight checks; live behavior remains pending.
QuestProgressApi, DiaryProgressApi, and progress snapshotsImplemented / live-validatedRev239 logged-in live pass on 2026-07-09 confirmed n3_get_progress, n3_read_sdk progress.quests, and n3_read_sdk progress.diaries return ok without must be called on client thread; the account reported Learning the Ropes as FINISHED and diary snapshots returned explicit mapped varbit task rows. Reference: Progress APIs.
SdkEvents and passive event snapshotsImplemented / live-pendingRev239 live pass on 2026-07-09 confirmed n3_get_recent_events and n3_read_sdk events.recent parity for buffered inventory deltas (containerId=93, item deltas including 1351, 558, 556, 321), XP gained (COOKING +30, FISHING +3170), NPC spawns/despawns with world/local locations, and animation changes with actor name, animation id, world/local location, tick, and timestamp; projectile movement remained empty and still needs a live projectile scenario. Reference: Event Snapshots.
AutomationLoop, AutomationLoopConfig, AutomationLoopContext, LoopPulseResultImplementedCaller-owned loop helper provides same-tick dedupe, optional PacketUtils bootstrap gating, break-gate callbacks, status/error text, and adapters for TaskPipeline and AutomationStateMachine.
InventoryDropPattern, InventoryDropActionsImplementedComparator-backed row/column/custom drop patterns and result-aware dropNext(...) issue at most one "Drop" interaction per call.
WalkerResourceApi, WalkerRouteCategoryDescriptor, WalkerCuratedTransportNetwork, WalkerTransportResourceDescriptorImplementedExposes immutable route category, shortest-path transport resource, and curated transport network descriptors to improve routing discoverability and metadata introspection.
ApiTesterPlugin and TestRegistryImplementedDeveloper/QoL live-client harness runs individual InteractionApi action probes, collates pass/fail results, and safeguards against destructive actions with warning gates. Reference: API Tester.

Priority Gap Backlog

Current Status

StatusGapCurrent n3 stateNext action
ImplementedTyped query result collectionsQueryResults<T> and query results() methods exist.Add only proven specialized adapters later; do not change legacy result() returns.
ImplementedShared item metadata and price facadesdk.items.ItemInfoApi, ItemInfo, PricesApi, and PriceQuote exist; see Item Info And Prices.Keep Market Alcher strategy and budgeting outside the shared SDK.
Implemented / live-pendingBank worn-items panelBankWornEquipmentApi reads and BankWornEquipmentActions.depositAllWornEquipment() exist.Live-validate bank panel reads/deposit behavior on the target RuneLite revision.
Implemented / live-pendingBank state detailsBankStateApi and BankStateSnapshot exist.Live-validate mode/search/placeholder/widget state reads.
Implemented / live-pendingWorld and world-map facadeWorldsApi, WorldSnapshot, and WorldMapApi exist; see World SDK.Live-validate world-map state and coordinate conversion helpers.
ImplementedWalker resource metadataWalkerResourceApi and descriptors exist.Provide route and category metadata introspection to plugins without exposing planner internals.
Implemented / live-pendingMenu introspectionMenuEntriesApi and MenuEntrySnapshot exist; see Menu Entries.Connect failed InteractionResult diagnostics to candidate menu entries only if repeated callers need it.
Implemented / live-pendingSocial/friends/clan facadeFriendsApi, ClanApi, ChatApi, and snapshot records exist; see Social Snapshots.Live-validate friends chat, clan, and recent chat snapshots.
Implemented / live-pendingField-of-view / line-of-sight helpersLineOfSightApi exists under sdk.client.Live-validate collision and viewport behavior.
Implemented / live-pendingProduction/make-X facade breadthProductionApi read helpers now expose visible products, action descriptions, quantity buttons, selected-state heuristics, and custom quantity availability; writes stay in ProductionActions.Live-validate Make-X and Smithing child IDs and selected-state markers on the target RuneLite revision.
Implemented / live-pendingMinigame/grouping facadeMinigamesApi exposes grouping tab state, selected-destination heuristic, cooldown/status, last-usage varplayer, and destination availability; writes stay in MinigameTeleportActions.Live-validate selected-state marker and destination widget visibility on the target RuneLite revision.
Implemented / live-pendingQuest/diary requirementsQuestProgressApi, DiaryProgressApi, QuestRequirement adapters, Quest Helper snapshots, and GameVars exist; see Progress APIs.Extend diary mappings only when stable varbit or varplayer coverage is identified; do not infer unknown tasks.
Implemented / live-pendingCamera facadeCameraApi exposes read-only yaw, pitch, zoom, camera position, targets, viewport bounds, and viewport visibility helpers.Live-validate zoom source and world-point projection behavior on the target RuneLite revision before adding writes.
ImplementedInventory drop patternsInventoryDropPattern and InventoryDropActions.dropNext(...) exist.Use only one drop call per tick/workflow step; add plugin wrappers only where reuse is proven.
DocumentedInput keyboard/mouse ergonomicsCanvasInput, KeyboardHelper, and InputLockBypass exist, with usage documented in docs/input-lock.md and docs/client-utilities.md.Add small typed-text/key-chord/mouse-position wrappers only when repeated callers prove the need.
ImplementedInteractive testing harnessApiTesterPlugin and TestRegistry exist; see API Tester.Keep tests modular and safe; avoid background loops or bootstrap gates in harness tests.
Implemented / live-pendingEvent observation modelSdkEvents exposes bounded passive snapshots backed by PacketUtils event-bus registration; see Event Snapshots.Live-validate event coverage and add event kinds only when repeated callers need them.
ImplementedScript/runtime ergonomicsAutomationLoop adapts plain loop bodies, TaskPipeline, and AutomationStateMachine while remaining caller-owned.Keep examples current; do not promote this to a suite-level tick owner.

Live-Validation Checklist

Use this checklist before moving any Implemented / live-pending surface to validated. Capture the account state, target RuneLite revision, setup steps, raw observed API result, mismatch if any, source patch if needed, and the docs/Javadoc/SOT update that follows. Java tests can support a source fix, but they do not replace the in-client observation.

SurfaceExpected state to validateIn-client setupObserved API resultMismatch handlingDocs disposition
BankWornEquipmentApi / BankWornEquipmentActionsWorn-equipment panel open/read state and deposit-all behavior match visible bank UI.Open a bank with worn items equipped, open the bank equipment panel, then run read helpers and depositAllWornEquipment().2026-07-09 live MCP: bank closed, n3_get_bank_status returned open=false; bank item snapshot returned empty. Panel read/deposit behavior not yet exercised.Patch only proven widget ID, visibility, slot, or action mismatch.Keep live-pending until bank panel is captured.
BankStateApi / BankStateSnapshotBank mode reads match withdraw item/note, search state, placeholders, rearrange mode, requested quantity, selected tab, and core BankWidget visibility.Open bank, toggle each bank control, use search, change quantity and tabs, then snapshot after each state.2026-07-09 live MCP: bank closed, open=false; no mode/search/quantity state captured.Patch only confirmed varbit/varplayer, sprite, widget, or selected-state mismatch.Keep live-pending until open-bank state is captured.
WorldMapApiOpen state, map point, surface conversion, overview/minimap conversion, position, and zoom match the visible world map.Open the world map in known locations and compare map outputs against local/world coordinates.2026-07-09 live MCP: closed-state read returned open=false, position (2272,1183), zoom 3.0; open map and conversion behavior not yet exercised.Patch only confirmed coordinate conversion, zoom source, or open-state mismatch.Keep live-pending until open-map conversion is captured.
MenuEntriesApiCurrent menu-entry snapshots preserve visible option/target/type/identifier/param ordering for diagnostics.Hover or right-click known NPC, object, item, widget, and ground item targets, then inspect snapshots before action dispatch.2026-07-09 live MCP: menu read returned one normalized Cancel entry. Target-specific option ordering not yet exercised.Patch normalization only when a visible menu entry is missing or fields are wrong.Keep live-pending until target menus are captured.
FriendsApi, ClanApi, ChatApiFriends-chat, clan, guest-clan, and recent-chat snapshots match live social panels and received messages.Join/leave friends chat and clan contexts, receive public/private/system messages, then inspect snapshots.2026-07-09 live MCP: social read returned an empty recent-message snapshot in the current setup. Friends/clan/member fields not yet exercised.Patch null handling, rank/name/member normalization, or message-field mapping only when disproven live.Keep live-pending until social state is captured.
LineOfSightApiTile and actor line-of-sight checks match collision-blocked and clear paths; viewport helpers do not imply reachability.Compare clear, wall-blocked, door, object, and out-of-viewport targets from fixed tiles.2026-07-09 live MCP: same-tile checks at (3215,3211,0) and (3209,3220,2) returned visible=true; broader blocked-path checks still pending.Patch only confirmed collision-map, world-view, or projection mismatch.Keep live-pending until blocked and clear path cases are captured.
ProductionApiMake-X products, selected product, selected quantity, Smithing group 312 child IDs, quantity buttons, and custom quantity behavior match visible widgets.Open common Make-X interfaces and Smithing, change product/quantity selections, then inspect products and quantity reads.2026-07-09 live MCP: closed-state read returned open=false, enterInputOpen=false, no products, and hidden quantity buttons for ONE/FIVE/TEN/ALL/X. Open Make-X behavior not yet exercised.Patch only confirmed widget ID, selected-state heuristic, product parsing, or quantity-source mismatch.Keep live-pending until open production widgets are captured.
MinigamesApiGrouping-tab open state, destination visibility, selected destination, cooldown/status, and last usage match the grouping panel.Open the grouping tab, select multiple destinations, check cooldown/availability before and after a teleport.2026-07-09 live MCP: closed-state read returned open=false, canTeleport=true, cooldown 0, last usage 0, and 12 hidden destination descriptors. Open-tab selected/visibility behavior not yet exercised.Patch only confirmed destination widget, selected marker, or varplayer mapping mismatch.Keep live-pending until open grouping-tab state is captured.
QuestProgressApiQuest state and lookup helpers match RuneLite quest states for complete, started, not-started, and unknown quests.Inspect accounts with known quest states and compare helper output to the RuneLite quest panel.2026-07-09 live MCP: n3_get_progress and n3_read_sdk progress.quests failed with must be called on client thread; source patched to bridge these reads through ClientThreadBridge, pending reload/live retest.Patch only confirmed lookup/state adapter mismatch.Keep live-pending until the patched client-thread bridge is live-retested.
DiaryProgressApiExplicitly mapped diary tasks match known diary task completion; unmapped tasks remain absent rather than guessed.Inspect accounts with known diary completions and compare only mapped varbit/varplayer tasks.2026-07-09 live MCP: n3_read_sdk progress.diaries failed with must be called on client thread; source patched to bridge these reads through ClientThreadBridge, pending reload/live retest.Add or patch mappings only from stable verified varbit or varplayer data.Keep live-pending until the patched client-thread bridge is live-retested.
CameraApiYaw, pitch, zoom, camera position, targets, viewport bounds, and world-point viewport projection match the live client.Rotate, zoom, and move around known world points, then compare snapshot and projection outputs.2026-07-09 live MCP: camera snapshot returned yaw 3604, pitch 3064, targets 3604/3064, position (3542,4995,-2636), zoom 476, viewport 512x334 offset (4,4). Projection-specific behavior not yet exercised.Patch only confirmed zoom source, camera target, viewport bound, or projection mismatch.Keep live-pending until projection cases are captured.
SdkEventsXP, item-container, NPC lifecycle, animation, and projectile snapshots include expected fields and bounded history behavior.Trigger XP gain, inventory/bank deltas, NPC spawn/despawn, animation change, and projectile movement while PacketUtils is active.2026-07-09 live MCP: recent events contained NPC spawn/despawn and animation snapshots with tick, timestamp, world/local locations; XP, inventory deltas, and projectile movement were empty in the current setup.Patch only confirmed snapshot field, ordering, capacity, or registration mismatch.Keep live-pending until XP, inventory, and projectile events are captured.
ThreatMapApiProjectile target tiles, graphics-object hazard tiles, and aggressive NPC line-of-sight semantics match visible threats.Observe targeted projectiles, ground graphics hazards, and aggressive NPCs across clear and blocked paths.2026-07-09 live MCP: no direct threat-map runtime read exists yet; nearby NPC snapshots and LOS reads were available, but projectile/hazard/NPC threat aggregation was not exercised.Patch only confirmed projectile target, graphics tile, NPC reachability, or LOS mismatch.Keep live-pending until direct threat-map or equivalent live probe output is captured.

P1 - Domain Helpers That Improve Feature Parity

GapSeen in competitorsn3 mappingProposed n3 additionNotes
Production/make-X facade breadthDreamBot has ItemProcessing; Storm has Production; Twilite has MakeX.n3 has ProductionApi, ProductionActions, ProductionWorkflowBuilder, and docs.Implemented read helpers for selected product, quantity mode, available product widgets, action descriptions, and stored Make-X quantity when exposed. Also handles legacy Smithing interface (Group 312). Avoid new write overloads until callers need chosen product metadata returned with InteractionResult.Validate against live widgets; production interfaces vary.
Minigame/grouping facadeDreamBot has MinigameTeleports; Storm has Minigames; n3 has MinigameTeleportActions.MinigamesApi read coverage and MinigameTeleportActions write coverage exist.Use MinigamesApi for grouping tab state, selected destination, cooldown/status, last-usage varplayer, and destination availability.Keep teleport writes in action class; selected marker remains live-pending.
Quest/diary requirementsDreamBot exposes quests, miniquests, diaries, and requirement classes; Storm has quest requirements; Twilite has quests and generated var IDs.n3 has QuestProgressApi, DiaryProgressApi, QuestActions, QuestRequirement, Quest Helper snapshot, and GameVars.Use read-only progress helpers for eligibility checks; extend diary mappings only after stable mappings exist.Useful for route and plugin eligibility checks.
Camera facadeDreamBot has Camera APIs; Storm/Twilite expose input/mouse utilities and coordinate transforms.n3 has CameraApi reads and humanizer gesture scheduling.Use read-only yaw, pitch, zoom, viewport, and visibility helpers first. Consider result-aware camera writes only if plugins need them.Camera writes can affect anti-ban behavior; keep opt-in.
Inventory drop patternsDreamBot exposes DropPattern; n3 plugins implement one-item-per-tick policies locally.n3 has InventoryActions, InventoryDropPattern, and InventoryDropActions.Use comparator-backed row/column/custom patterns with dropNext(pattern, predicate) returning InteractionResult.Preserves pacing; never bulk-clicks in a single tick.
Input keyboard/mouse helpersDreamBot, Storm, and Twilite expose keyboard/mouse APIs.n3 has documented CanvasInput, KeyboardHelper, and input-lock bypass.Keep existing helper docs as the public guidance; add small typed-text/key-chord/mouse-position wrappers only when reusable callers appear.Keep under input-lock rules and avoid broad public low-level automation.

P2 - Strategic/Experimental Areas

GapSeen in competitorsn3 mappingRecommendation
Script framework ergonomicsDreamBot has tree/branch/leaf frameworks and scheduled scripts; Storm has looped/task plugins; Twilite has behavior/tick plugins and tick results.n3 has RuneLite plugins, AutomationLoop, TaskPipeline, and AutomationStateMachine.Keep AutomationLoop caller-owned and example-driven; do not add a suite-level scheduler.
Event observation modelCompetitors expose event classes for animation, spawn/despawn, inventory changes, XP gained, projectiles, etc.SdkEvents caches XP gained, inventory delta, NPC lifecycle, animation, and projectile snapshots.Add event kinds only for repeated needs. Do not wrap every RuneLite event prematurely.
Simulation/threat modelingTwilite exposes simulation rules, threat models, rollout search, line preferences, moving threats.n3 has combat awareness, pathfinding, and read-only ThreatMapApi tile-threat helpers.Keep ThreatMapApi narrow and live-validate projectile, hazard, and NPC semantics before broadening into a generic simulation layer.
Generated ID facadesTwilite exposes generated ItemId, NpcId, ObjectId, InterfaceId, VarbitId, VarpId, etc.n3 uses RuneLite IDs, local widget parity, and ID maps.Continue current parity approach; consider generated aliases only if docs/Agent Server need stable searchable IDs. Avoid committing huge generated surfaces without maintenance automation.
Random solver / login solver equivalentsDreamBot has random solvers/login utilities; Storm has blocking events.n3 PacketUtils handles bootstrap and blocking event actions; Profiles handles login credential storage.Keep scoped. Add explicit docs/examples for welcome screen, death, bank PIN, login/bootstrap gaps before adding solver framework.
Restocking automationTwilite has Restocker; n3 Market Alcher has domain-specific GE restocking and loadout depletion listener.Loadouts know depletion; GE actions exist.Add generic restocking only after at least two plugins need it. Start with a pure plan object that computes missing supplies and expected costs.

Suggested API Shape

Query Results

WorldPoint anchor = client.getLocalPlayer().getWorldLocation();

NPCs.search()
.withMappedName("Banker")
.results()
.nearestTo(anchor)
.map(npc -> NPCActions.interact(npc, "Bank"));

Rules:

  • result() remains source-compatible.
  • results() returns an immutable wrapper around the current query result list.
  • QueryResults.nearestTo(anchor) uses straight-line tile distance; use query-specific helpers such as nearestByPath() when reachability matters.

Item Metadata And Prices

Optional<ItemInfo> natureRune = ItemInfoApi.get(ItemID.NATURE_RUNE);
OptionalInt gePrice = natureRune.map(ItemInfo::getGePrice).orElse(OptionalInt.empty());
OptionalInt highAlch = ItemInfoApi.get(ItemID.RUNE_FULL_HELM)
.map(ItemInfo::getHighAlchPrice)
.orElse(OptionalInt.empty());
Optional<PriceQuote> quote = PricesApi.fetchFiveMinutePrice(ItemID.NATURE_RUNE);

Rules:

  • Read-only and cache-backed.
  • Return absent/unknown rather than magic sentinel values.
  • Keep Market Alcher's strategy and budget logic outside the generic SDK.

Production Reads

ProductionApi.products()
.stream()
.filter(product -> product.getName().equalsIgnoreCase("Shortbow"))
.findFirst();

Optional<ProductionQuantity> selected = ProductionApi.selectedQuantity();

Rules:

  • Reads belong in sdk.widgets.ProductionApi; production writes stay in ProductionActions.
  • Product names refer to the item/widget shown by the Make-X interface, which may differ from the produced item name on some interfaces.
  • Selected product and quantity are widget-state heuristics until live-validated on the target RuneLite revision.

Minigame Reads

if (MinigamesApi.canTeleport()) {
MinigamesApi.destination(MinigameTeleport.PEST_CONTROL)
.filter(MinigameTeleportOption::isVisible);
}

Rules:

  • Reads belong in sdk.widgets.MinigamesApi; teleport writes stay in MinigameTeleportActions.
  • Cooldown and last usage are exposed as raw client values so callers can decide their own timing policy.
  • Selected destination is a widget-state heuristic until live-validated on the target RuneLite revision.

Camera Reads

CameraSnapshot camera = CameraApi.snapshot();
boolean visible = CameraApi.isWorldPointInViewport(targetPoint);

Rules:

  • Reads belong in sdk.client.CameraApi; camera writes should only be added later as result-aware, opt-in actions.
  • Viewport helpers answer projection/viewport inclusion, not path reachability or line-of-sight.
  • Zoom source and world-point projection remain live-pending until verified in-client.

Bank Worn Equipment

if (BankActions.isOpen() && BankWornEquipmentApi.isOpen()) {
InteractionResult result = BankWornEquipmentActions.depositAllWornEquipment();
}

Rules:

  • Reads belong in sdk.widgets or sdk.query.
  • Writes belong in InteractionApi.actions and return InteractionResult.
  • Per-slot worn-equipment deposits remain a future gap until backed by stable widget IDs and parity tests.
  • Rev239 live pass on 2026-07-09 observed the worn-equipment bank view with deposit-capable visible item widgets under 983044; the same view made n3_get_bank_status and /api/v1/bank/status report open=false.
  • Typed loadout/worn-state reads hit class lp declares multiple JSON fields named hr; source now serializes plain item maps instead of raw RuneLite widgets, so per-slot worn-equipment read parity is pending patched client reload/live retest.
MenuEntriesApi.firstMatching("Bank", "Banker");

Rules:

  • Prefer diagnostics and action-resolution explanations over public raw packet builders.
  • Link failed InteractionResult details to candidate menu entries where possible.
  • Live menu snapshot behavior remains pending until verified in-client.

Integration Sequence

  1. Live-validate every Implemented / live-pending surface in the checklist before adding new parity APIs.
  2. Patch source behavior only when live validation proves a mismatch.
  3. Keep this audit synchronized with N3PLUGINS_SOURCE_OF_TRUTH.md as SDK gap-fill work lands.
  4. Add one small SDK surface at a time, starting with read-only helpers that do not affect pacing or runtime ownership.
  5. For each new public SDK/API type, add source Javadocs and run ApiJavadocCoverageTest.
  6. Promote helper methods into InteractionApi.actions.* only when they perform gameplay writes and can return InteractionResult.
  7. Update N3PLUGINS_SOURCE_OF_TRUTH.md when a new package, action class, workflow convention, or canonical SDK surface lands.
  8. Add focused tests around pure parsing/filtering/selection logic; mark live-client widget/client behavior pending until observed.

Completed Implementation Tickets

  1. Quest/diary progress reads - implemented as read-only quest snapshots, walker QuestRequirement adapters, and explicitly mapped diary varbit/varplayer task reads.
  2. Event snapshots - implemented as PacketUtils-registered sdk.events caches for XP gained, inventory delta, spawn/despawn, animation, and projectile movement.
  3. Script/runtime ergonomics - implemented as caller-owned AutomationLoop with TaskPipeline and AutomationStateMachine adapters.

Deferred Ergonomic Follow-Ups

  • Menu diagnostics on failed InteractionResult.
  • Additional diary mappings beyond explicitly verified varbit or varplayer tasks.
  • Typed text, key-chord, or mouse-position wrappers around the documented input helpers.
  • Additional SdkEvents snapshot kinds.
  • Result-aware camera writes.
  • Generic restocking or broader threat simulation helpers.

Add these only after repeated caller need or a validation finding proves the current surface is insufficient.

Non-Goals

  • Do not clone competitor APIs verbatim or import their naming where it conflicts with n3 conventions.
  • Do not add a second walker, pacer, script loop owner, or broad raw packet builder.
  • Do not move plugin-specific strategy into the shared SDK until at least two callers need the same abstraction.
  • Do not claim live widget/interaction parity from JavaDocs alone; every new write helper needs RuneLite client validation.