Uh oh!
There was an error while loading. Please reload this page.
feat(inventory): open the 3d embed to sticker, patch, charm, and agent items - #414
Open
ykns3 wants to merge 7 commits into
Open
feat(inventory): open the 3d embed to sticker, patch, charm, and agent items#414ykns3 wants to merge 7 commits into
ykns3 wants to merge 7 commits into
Conversation
…t items The weapons/gloves scope was extension-side gating only — the item kind rides inside the masked inspect hex. Adds an inspect-requested embed event: the sandboxed iframe can't launch steam:// itself, so it forwards the Inspect click and we launch the item's own action link, pattern-pinned end to end.
Steam ships the hex two ways: skins carry it as asset property 6 with a %propid:6% slot in the action link, but stickers embed it literally in the link with no property at all. Inventory links also use steam://run/730// rather than the market rungame form — accept both.
…rowing isAbstractType dereferenced asset.type unconditionally, but Steam ships descriptions without it despite the declared non-optional shape. Guarding the type branch keeps the tag branch reachable, so a tag-identified item is matched rather than lost, and the latent TypeError is gone for every predicate built on it -- isCharm, isAgent, isSticker, isPatch, isCase, isMusicKit and isPin.
getSkinCraftInspect preferred asset property 6 while getSteamInspectUrl preferred the hex embedded in the action link, so an asset carrying both could render one item and launch Steam into another. Splitting the action at the hex slot and rebuilding the link around the resolved hex makes that unrepresentable, and folds the two helpers into one traversal. Also anchors the action pattern to the steam scheme so a lookalike link can no longer shadow the real inspect action, and compares the property slot case-insensitively to match the pattern that captured it.
… on screen Selecting a strip item reassigns activeTarget synchronously but deliberately keeps the previous model on screen while the next one loads, so an Inspect click landing in that window launched the wrong item. Gating on the loaded phase turns that into a no-op, and a warn gives the dropped-click case an evidence trail.
ykns3
marked this pull request as ready for review
August 17, 2026 20:13
Step7750
approved these changes
Aug 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
alongside weapons/gloves. The embed protocol is inspect-based, so this is extension-side
gating only — the item kind rides inside the masked inspect hex.
%propid:6%slot in the action link, or the hex embedded in the link itself. Accepts the inventory
steam://run/730//and marketsteam://rungame/730/<id>/forms. The launch link is rebuiltaround the hex the viewer renders, so the two can't describe different items.
inspect-requestedembed event: the sandboxed iframe can't launchsteam://, so itforwards the click and the extension launches the item on screen. No URL crosses the bridge —
SkinCraftItem.inspectUrlis pattern-pinned at the page → content-script boundary andre-checked before navigation.
isAbstractTypeno longer dereferencesasset.typeunconditionally. This is shared code:isCharm,isAgent,isSticker,isPatch,isCase,isMusicKitandisPinnow match onthe tag branch where a description without
typepreviously threw.Merge order: the SkinCraft embed change must deploy first, or the new 3D tabs fail to load.
Validation
npm testnpm run lintnpm run checkformatnpm run buildNote
Medium Risk
Touches postMessage boundaries,
window.locationnavigation tosteam://, and shared item-type helpers; embed must deploy first or new tabs may fail to load.Overview
Extends the SkinCraft 3D inventory viewer to stickers, patches, charms, and agents (not only weapons/gloves), with inspect hex read from asset property 6 and/or Steam’s masked
Inspect in Gameactions (%propid:6%or inline hex). Items now carry an optionalinspectUrl(steam://…) rebuilt from the rendered hex and validated at the viewer protocol boundary.Adds embed protocol event
inspect-requested: the sandboxed iframe signals inspect clicks and the extension opens the pinnedsteam://link for the currently loaded item (only afterloaded, withSTEAM_INSPECT_URL_PATTERN).isAbstractTypeno longer assumesasset.typeis always present (tag-based matching for half-hydrated Steam descriptions). Devskincraft_embed_originpoints athttps://beta.skincraft.gginstead of localhost.Reviewed by Cursor Bugbot for commit f4d2893. Bugbot is set up for automated code reviews on this repo. Configure here.