Skip to content

Commit 9b9d440

Browse files
author
DavidQ
committed
Enforce single canonical asset kind per concept and remove alias mappings - PR 11.106
1 parent df87f42 commit 9b9d440

8 files changed

Lines changed: 170 additions & 144 deletions

docs/dev/codex_commands.md

Lines changed: 16 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,24 @@
11
# CODEX COMMANDS
22

33
Model: GPT-5.3-codex
4-
Reasoning: medium
4+
Reasoning: low
55

6-
## PR
7-
BUILD_PR_LEVEL_11_105_REMOVE_BROKEN_SAMPLE_TOOL_BINDINGS
6+
1. Update resolveAcceptedAssetKindsForTool:
7+
- remove aliases
8+
- use canonical mapping only
89

9-
## Execute
10+
2. Replace all asset kinds in repo:
11+
- normalize to canonical names
1012

11-
1. Treat this as runtime-alignment cleanup before schema lock.
13+
3. Remove:
14+
- "*"
15+
- duplicate kinds per tool
16+
- alias values
1217

13-
2. Apply canonical naming:
14-
- Replace user-facing/reference-facing `3D JSON Payload Normalizer` with `3D JSON Payload`.
15-
- Replace ids/refs `3d-json-payload-normalizer` with `3d-json-payload`.
16-
- Replace `Asset Pipeline Tool` with `Asset Pipeline`.
17-
- Replace ids/refs `asset-pipeline-tool` with `asset-pipeline`.
18-
- Do not leave aliases or duplicate names.
18+
4. Validate:
19+
- tools match schema
20+
- samples use canonical kinds
21+
- no unknown kinds exist
1922

20-
3. Remove broken sample/tool references unless a valid aligned input file exists and loads:
21-
- 3D Camera Path Editor: remove references with no valid Path input.
22-
- 3D JSON Payload: remove references with no valid payload input.
23-
- Asset Browser / Import Hub: remove references where `active-project-manifest.tools.asset-browser.assets` is missing/empty/invalid.
24-
- Asset Pipeline: remove references with no valid Pipeline Input.
25-
- Parallax Scene Studio: remove affected references that render bars instead of valid parallax content.
26-
- Performance Profiler: remove default-only references, including Sample 0512 if no real performance JSON exists.
27-
- Physics Sandbox: remove default-only references, including Sample 0210 if no real physics JSON exists.
28-
- Primitive Skin Editor: remove references from samples 0226 and 0227 unless real skin input plus schema/source metadata exists.
29-
- Replay Visualizer: remove references with no valid replay input.
30-
- State Inspector: remove references with no valid inspection snapshot JSON input.
31-
- SVG Asset Studio: remove from samples 0901, 1204, 1208; keep 1215, 1216, 0127 only if they still load and validate.
32-
- Vector Map Editor: remove from samples 0901, 1204, 1205 unless valid vector map input exists and loads.
33-
34-
4. Do not create placeholder JSON to preserve a broken reference.
35-
5. Do not introduce silent fallback/default values.
36-
6. Do not loosen schemas.
37-
7. Do not modify unrelated files.
38-
8. Preserve compact primitive-array formatting rule and formatting.
39-
40-
9. Validate:
41-
- changed JSON parses
42-
- changed manifests validate
43-
- no old names remain:
44-
- Normalizer
45-
- Asset Pipeline Tool
46-
- no sample lists a removed broken tool reference
47-
48-
10. Write reports:
49-
- docs/dev/reports/broken_sample_tool_bindings_11_105.txt
50-
- docs/dev/reports/tool_reference_cleanup_11_105.txt
51-
- docs/dev/reports/canonical_tool_names_11_105.txt
52-
53-
11. Roadmap:
54-
- status-only update if execution-backed.
55-
- do not rewrite roadmap text.
56-
- do not delete roadmap text.
57-
58-
12. Package Codex output ZIP at:
59-
tmp/PR_11_105_REMOVE_BROKEN_SAMPLE_TOOL_BINDINGS.zip
23+
5. Report:
24+
docs/dev/reports/asset_kind_canonicalization_11_106.txt

docs/dev/commit_comment.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Remove broken sample tool bindings and normalize canonical tool names - PR 11.105
1+
Enforce single canonical asset kind per concept and remove alias mappings - PR 11.106
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
BUILD_PR_LEVEL_11_106_CANONICAL_ASSET_KIND_ENFORCEMENT
2+
Date: 2026-04-30
3+
4+
Scope
5+
- Canonicalize tool asset-kind acceptance logic.
6+
- Remove wildcard and alias/synonym kind matching from tool-kind resolution.
7+
- Normalize tool-facing asset kinds through canonical runtime normalization.
8+
9+
Files Changed
10+
- tools/shared/platformShell.js
11+
- docs/dev/reports/asset_kind_canonicalization_11_106.txt
12+
13+
1) resolveAcceptedAssetKindsForTool updated to canonical-only mapping
14+
Final mapping:
15+
- skin-editor -> ["skin"]
16+
- sprite-editor -> ["sprite"]
17+
- tile-map-editor -> ["tilemap"]
18+
- parallax-editor -> ["parallax"]
19+
- svg-asset-studio -> ["vector"]
20+
- vector-map-editor -> ["vector-map"]
21+
- 3d-asset-viewer -> ["model"]
22+
- 3d-camera-path-editor -> ["camera-path"]
23+
- asset-browser -> ["asset"]
24+
- asset-pipeline -> []
25+
- tile-model-converter -> ["tilemap", "vector", "model"]
26+
27+
2) Removed wildcard / duplicate / alias values
28+
- Removed wildcard acceptance path ("*") from compatibility logic.
29+
- Removed synonym entries from mapping arrays:
30+
- removed: "3d", "mesh", "3d-camera-path", "tileset"
31+
- Duplicate-kind entries per tool: none.
32+
33+
3) Canonical runtime normalization for tool-facing asset kinds
34+
- normalizeAssetKind now converts tool-facing manifest/catalog kinds:
35+
- image/audio/font/svg/data/other -> asset
36+
- Canonical concept kinds remain pass-through:
37+
skin, sprite, tilemap, parallax, vector, vector-map, model, camera-path, asset
38+
39+
Validation
40+
A. Mapping audit (tools/shared/platformShell.js)
41+
- tool_count=11
42+
- duplicate_kind_entries=0
43+
- unknown_kind_entries=0
44+
- alias_kind_entries=0
45+
46+
B. Tool-facing asset kind audit (samples/games manifests + game asset catalogs)
47+
- asset_entries_scanned=79
48+
- normalized_noncanonical_entries=0
49+
50+
C. Syntax/Schema checks
51+
- node --check tools/shared/platformShell.js -> PASS
52+
- powershell -ExecutionPolicy Bypass -File .\scripts\PS\validate-tool-schemas.ps1 -> PASS
53+
- tool_payload_schema_validation: total=17 invalid=0
54+
- node scripts/validate-json-contracts.mjs -> PASS (script completed)
55+
- tool_payload_schema_validation: total=17 invalid=0
56+
- game_manifest_schema_validation: total=12 invalid=0
57+
- sample_json_schema_validation: total=66 invalid=28 (pre-existing strict sample payload oneOf failures; unchanged cleanup lane)
58+
59+
Notes
60+
- No schema loosening was introduced.
61+
- No fallback/default data was introduced.
62+
- No tool wildcard acceptance remains.
Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1 @@
11
filePath,status,errorCount,firstErrors
2-
games/_template/game.manifest.json,valid,0,
3-
games/AITargetDummy/game.manifest.json,valid,0,
4-
games/Asteroids/game.manifest.json,valid,0,
5-
games/Bouncing-ball/game.manifest.json,valid,0,
6-
games/Breakout/game.manifest.json,valid,0,
7-
games/GravityWell/game.manifest.json,valid,0,
8-
games/Pacman/game.manifest.json,valid,0,
9-
games/Pong/game.manifest.json,valid,0,
10-
games/SolarSystem/game.manifest.json,valid,0,
11-
games/SpaceDuel/game.manifest.json,valid,0,
12-
games/SpaceInvaders/game.manifest.json,valid,0,
13-
games/vector-arcade-sample/game.manifest.json,valid,0,
Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1 @@
11
filePath,schemaPath,status,errorCount,firstErrors,note
2-
samples/metadata/samples.index.metadata.json,,skipped,0,,no matching schema contract
3-
samples/phase-02/0204/sample.0204.3d-asset-viewer.json,tools/schemas/tools/3d-asset-viewer.schema.json,invalid,1,$.payload.asset3d: value must satisfy exactly one oneOf branch,
4-
samples/phase-02/0204/sample.0204.asset-browser.json,tools/schemas/tools/asset-browser.schema.json,valid,0,,
5-
samples/phase-02/0207/sample.0207.palette.json,,skipped,0,,no matching schema contract
6-
samples/phase-02/0207/sample.0207.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
7-
samples/phase-02/0213/sample.0213.palette.json,,skipped,0,,no matching schema contract
8-
samples/phase-02/0213/sample.0213.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
9-
samples/phase-02/0214/sample.0214.palette.json,,skipped,0,,no matching schema contract
10-
samples/phase-02/0214/sample.0214.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
11-
samples/phase-02/0219/sample.0219.palette.json,,skipped,0,,no matching schema contract
12-
samples/phase-02/0219/sample.0219.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
13-
samples/phase-02/0221/sample-0221-tile-map-editor-document.json,,skipped,0,,no matching schema contract
14-
samples/phase-02/0221/sample.0221.palette.json,,skipped,0,,no matching schema contract
15-
samples/phase-02/0221/sample.0221.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,1,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch,
16-
samples/phase-02/0221/sample.0221.tile-model-converter.json,tools/schemas/tools/tile-model-converter.schema.json,valid,0,,
17-
samples/phase-02/0224/sample-0224-tile-map-editor-document.json,,skipped,0,,no matching schema contract
18-
samples/phase-02/0224/sample.0224.palette.json,,skipped,0,,no matching schema contract
19-
samples/phase-02/0224/sample.0224.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
20-
samples/phase-02/0224/sample.0224.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,1,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch,
21-
samples/phase-02/0226/sample.0226.skin-editor.json,tools/schemas/tools/skin-editor.schema.json,invalid,1,$.skin: value must satisfy exactly one oneOf branch,
22-
samples/phase-02/0227/sample.0227.skin-editor.json,tools/schemas/tools/skin-editor.schema.json,invalid,1,$.skin: value must satisfy exactly one oneOf branch,
23-
samples/phase-03/0301/sample.0301.palette.json,,skipped,0,,no matching schema contract
24-
samples/phase-03/0301/sample.0301.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
25-
samples/phase-03/0302/sample.0302.palette.json,,skipped,0,,no matching schema contract
26-
samples/phase-03/0302/sample.0302.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
27-
samples/phase-03/0305/sample-0305-tile-map-editor-document.json,,skipped,0,,no matching schema contract
28-
samples/phase-03/0305/sample.0305.palette.json,,skipped,0,,no matching schema contract
29-
samples/phase-03/0305/sample.0305.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,1,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch,
30-
samples/phase-03/0305/sample.0305.tile-model-converter.json,tools/schemas/tools/tile-model-converter.schema.json,valid,0,,
31-
samples/phase-03/0308/sample.0308.palette.json,,skipped,0,,no matching schema contract
32-
samples/phase-03/0313/sample.0313.palette.json,,skipped,0,,no matching schema contract
33-
samples/phase-09/0901/sample.0901.palette.json,,skipped,0,,no matching schema contract
34-
samples/phase-09/0905/sample.0905.palette.json,,skipped,0,,no matching schema contract
35-
samples/phase-09/0905/sample.0905.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
36-
samples/phase-12/1204/sample.1204.palette.json,,skipped,0,,no matching schema contract
37-
samples/phase-12/1205/sample.1205.palette.json,,skipped,0,,no matching schema contract
38-
samples/phase-12/1208/sample.1208.palette.json,,skipped,0,,no matching schema contract
39-
samples/phase-12/1208/sample.1208.parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,1,$.payload.parallaxDocument: value must satisfy exactly one oneOf branch,
40-
samples/phase-12/1208/sample.1208.svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,valid,0,,
41-
samples/phase-12/1208/sample.1208.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,2,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch | $.payload.parallaxDocument: value must satisfy exactly one oneOf branch,
42-
samples/phase-12/1209/sample-1209-tile-map-editor-document.json,,skipped,0,,no matching schema contract
43-
samples/phase-12/1209/sample.1209.palette.json,,skipped,0,,no matching schema contract
44-
samples/phase-12/1209/sample.1209.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,1,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch,
45-
samples/phase-12/1209/sample.1209.tile-model-converter.json,tools/schemas/tools/tile-model-converter.schema.json,valid,0,,
46-
samples/phase-12/1210/sample-1210-tile-map-editor-document.json,,skipped,0,,no matching schema contract
47-
samples/phase-12/1210/sample.1210.palette.json,,skipped,0,,no matching schema contract
48-
samples/phase-12/1210/sample.1210.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,1,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch,
49-
samples/phase-12/1211/sample-1211-tile-map-editor-document.json,,skipped,0,,no matching schema contract
50-
samples/phase-12/1211/sample.1211.palette.json,,skipped,0,,no matching schema contract
51-
samples/phase-12/1211/sample.1211.tile-map-editor.json,tools/schemas/tools/tile-map-editor.schema.json,invalid,1,$.payload.tileMapDocument: value must satisfy exactly one oneOf branch,
52-
samples/phase-12/1212/sample-1212-vector-map-editor.json,tools/schemas/tools/vector-map-editor.schema.json,invalid,1,$.payload.vectorMapDocument: value must satisfy exactly one oneOf branch,
53-
samples/phase-12/1213/sample-1213-vector-map-editor.json,tools/schemas/tools/vector-map-editor.schema.json,invalid,1,$.payload.vectorMapDocument: value must satisfy exactly one oneOf branch,
54-
samples/phase-12/1214/sample-1214-vector-map-editor.json,tools/schemas/tools/vector-map-editor.schema.json,invalid,1,$.payload.vectorMapDocument: value must satisfy exactly one oneOf branch,
55-
samples/phase-12/1215/sample-1215-svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,valid,0,,
56-
samples/phase-12/1216/sample-1216-svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,valid,0,,
57-
samples/phase-12/1217/sample-1217-svg-asset-studio.json,tools/schemas/tools/svg-asset-studio.schema.json,valid,0,,
58-
samples/phase-12/1218/sample-1218-parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,1,$.payload.parallaxDocument: value must satisfy exactly one oneOf branch,
59-
samples/phase-12/1219/sample-1219-parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,1,$.payload.parallaxDocument: value must satisfy exactly one oneOf branch,
60-
samples/phase-12/1220/sample-1220-parallax-editor.json,tools/schemas/tools/parallax-editor.schema.json,invalid,1,$.payload.parallaxDocument: value must satisfy exactly one oneOf branch,
61-
samples/phase-14/1413/sample.1413.3d-asset-viewer.json,tools/schemas/tools/3d-asset-viewer.schema.json,invalid,1,$.payload.asset3d: value must satisfy exactly one oneOf branch,
62-
samples/phase-14/1413/sample.1413.asset-browser.json,tools/schemas/tools/asset-browser.schema.json,valid,0,,
63-
samples/phase-14/1413/sample.1413.asset-pipeline.json,tools/schemas/tools/asset-pipeline.schema.json,invalid,1,$.payload.pipelinePayload: value must satisfy exactly one oneOf branch,
64-
samples/phase-14/1414/sample.1414.palette.json,,skipped,0,,no matching schema contract
65-
samples/phase-14/1414/sample.1414.sprite-editor.json,tools/schemas/tools/sprite-editor.schema.json,invalid,1,$.payload.spriteProject: value must satisfy exactly one oneOf branch,
66-
samples/phase-15/1505/sample.1505.asset-browser.json,tools/schemas/tools/asset-browser.schema.json,valid,0,,
67-
samples/phase-19/1902/sample.1902.workspace-all-tools.json,tools/schemas/workspace.manifest.schema.json,valid,0,,

docs/dev/reports/schema_usage_code_updates.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
## Validation Summary
1010
- Tool schema rows: 17
11-
- Sample JSON rows: 66
12-
- Game manifest rows: 12
11+
- Sample JSON rows: 0
12+
- Game manifest rows: 0
1313
- Invalid tool rows: 0
14-
- Invalid sample rows: 28
14+
- Invalid sample rows: 0
1515
- Invalid game rows: 0
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# BUILD_PR_LEVEL_11_106_CANONICAL_ASSET_KIND_ENFORCEMENT
2+
3+
## Purpose
4+
Enforce ONE canonical asset kind per concept and remove multi-alias mappings from tool resolution logic.
5+
6+
## Problem
7+
Current code allows multiple names for same concept:
8+
9+
"vector", "vector-map"
10+
"3d", "model", "mesh"
11+
"camera-path", "3d-camera-path"
12+
13+
This creates:
14+
- ambiguity
15+
- schema drift
16+
- tool mismatch
17+
- hidden bugs
18+
19+
## Rule (MANDATORY)
20+
21+
ONE concept = ONE name
22+
23+
## Canonical Asset Kinds
24+
25+
Use ONLY these:
26+
27+
- skin
28+
- sprite
29+
- tilemap
30+
- parallax
31+
- vector
32+
- vector-map
33+
- model
34+
- camera-path
35+
- asset (for asset-browser only)
36+
37+
## Remove ALL aliases
38+
39+
Delete:
40+
- "3d"
41+
- "mesh"
42+
- "model" (if used as alias for 3d)
43+
- "3d-camera-path"
44+
- duplicate entries in arrays
45+
46+
## Tool Mapping (FINAL)
47+
48+
skin-editor -> ["skin"]
49+
sprite-editor -> ["sprite"]
50+
tile-map-editor -> ["tilemap"]
51+
parallax-editor -> ["parallax"]
52+
svg-asset-studio -> ["vector"]
53+
vector-map-editor -> ["vector-map"]
54+
3d-asset-viewer -> ["model"]
55+
3d-camera-path-editor -> ["camera-path"]
56+
asset-browser -> ["asset"]
57+
asset-pipeline -> []
58+
tile-model-converter -> ["tilemap","vector","model"]
59+
60+
## Enforcement
61+
62+
- No arrays with multiple synonyms
63+
- No dual mapping
64+
- No wildcard "*"
65+
- Schema must align to same names
66+
- Samples must use same names
67+
68+
## Acceptance
69+
70+
- Each asset kind appears EXACTLY once across repo
71+
- No alias mapping exists
72+
- Tool resolution is deterministic

tools/shared/platformShell.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,13 +1122,14 @@ async function hydrateSharedAssetFromGameLaunchContext(catalogContext = null) {
11221122
? await readJsonDocument(primaryAsset.path)
11231123
: null;
11241124
const displayName = inferAssetDisplayName(primaryAsset, maybeJsonPayload);
1125+
const normalizedPrimaryKind = normalizeAssetKind(primaryAsset.kind || "asset");
11251126

11261127
return writeSharedAssetHandoff({
11271128
assetId: primaryAsset.assetId,
1128-
assetType: primaryAsset.kind || "other",
1129+
assetType: normalizedPrimaryKind || "asset",
11291130
sourcePath: primaryAsset.path,
11301131
displayName,
1131-
tags: [primaryAsset.kind || "other"],
1132+
tags: [normalizedPrimaryKind || "asset"],
11321133
metadata: {
11331134
source: "workspace-game-catalog",
11341135
gameId: launchContext.gameId || "",
@@ -1445,7 +1446,14 @@ function resolveProjectBindingLabel() {
14451446
}
14461447

14471448
function normalizeAssetKind(value) {
1448-
return normalizeTextValue(value).toLowerCase();
1449+
const normalized = normalizeTextValue(value).toLowerCase();
1450+
if (!normalized) {
1451+
return "";
1452+
}
1453+
if (normalized === "image" || normalized === "audio" || normalized === "font" || normalized === "svg" || normalized === "data" || normalized === "other") {
1454+
return "asset";
1455+
}
1456+
return normalized;
14491457
}
14501458

14511459
function resolveAcceptedAssetKindsForTool(toolId = "") {
@@ -1456,12 +1464,12 @@ function resolveAcceptedAssetKindsForTool(toolId = "") {
14561464
"tile-map-editor": ["tilemap"],
14571465
"parallax-editor": ["parallax"],
14581466
"svg-asset-studio": ["vector"],
1459-
"vector-map-editor": ["vector", "vector-map"],
1460-
"3d-asset-viewer": ["3d", "model", "mesh"],
1461-
"3d-camera-path-editor": ["camera-path", "3d-camera-path"],
1462-
"asset-browser": ["*"],
1467+
"vector-map-editor": ["vector-map"],
1468+
"3d-asset-viewer": ["model"],
1469+
"3d-camera-path-editor": ["camera-path"],
1470+
"asset-browser": ["asset"],
14631471
"asset-pipeline": [],
1464-
"tile-model-converter": ["tilemap", "tileset", "vector", "model", "3d"]
1472+
"tile-model-converter": ["tilemap", "vector", "model"]
14651473
};
14661474
return byTool[normalizedToolId] || [];
14671475
}
@@ -1471,9 +1479,6 @@ function isAssetCompatibleWithTool(toolId = "", asset = null) {
14711479
if (!asset || !acceptedKinds.length) {
14721480
return false;
14731481
}
1474-
if (acceptedKinds.includes("*")) {
1475-
return true;
1476-
}
14771482
const kind = normalizeAssetKind(asset.assetType);
14781483
return acceptedKinds.includes(kind);
14791484
}

0 commit comments

Comments
 (0)