{"record":{"id":"2759a9cf12d71e2c","repo":"BabylonJS/Babylon.js","slug":"path-path-is-invalid-2759a9","errorCode":null,"errorMessage":"Path ${path} is invalid","messagePattern":"Path (.+?) is invalid","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/loaders/src/glTF/2.0/Extensions/interactivityAssetPathToObjectConverter.ts","lineNumber":93,"sourceCode":"     * by this loader\r\n     */\r\n    public constructor(\r\n        private _gltf: IGLTF,\r\n        private _isExtensionEnabled: (name: string) => boolean\r\n    ) {}\r\n\r\n    /**\r\n     * @param path the JSON Pointer to resolve\r\n     * @returns an object accessor for the addressed capability\r\n     * @throws if the path does not address a known capability, which `pointer/get` surfaces as `isValid = false`\r\n     */\r\n    public convert(path: string): IObjectInfo<IObjectAccessor> {\r\n        const normalized = path.endsWith(\"/\") ? path.slice(0, -1) : path;\r\n\r\n        if (normalized.startsWith(InteractivityLimitsPrefix)) {\r\n            const limit = RuntimeLimits[normalized.substring(InteractivityLimitsPrefix.length)];\r\n            if (limit === undefined) {\r\n                throw new Error(`Path ${path} is invalid`);\r\n            }\r\n            return this._createAccessor(\"number\", () => limit);\r\n        }\r\n\r\n        const capability = normalized.substring(InteractivityAssetCapabilitiesPrefix.length);\r\n        if (capability === \"majorVersion\" || capability === \"minorVersion\") {\r\n            return this._createAccessor(\"number\", () => GetEffectiveGltfVersion(this._gltf.asset?.version)[capability === \"majorVersion\" ? \"major\" : \"minor\"]);\r\n        }\r\n\r\n        // `extensions/<EXTENSION_NAME>/enabled`. The extension name itself may not contain a slash.\r\n        const segments = capability.split(\"/\");\r\n        if (segments.length === 3 && segments[0] === \"extensions\" && segments[2] === \"enabled\") {\r\n            const extensionName = segments[1];\r\n            return this._createAccessor(\"boolean\", () => this._isExtensionEnabled(extensionName));\r\n        }\r\n\r\n        throw new Error(`Path ${path} is invalid`);\r\n    }\r","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/loaders/src/glTF/2.0/Extensions/interactivityAssetPathToObjectConverter.ts#L75-L111","documentation":"InteractivityAssetPathToObjectConverter resolves virtual KHR_interactivity pointers for asset capabilities and runtime limits. For `/extensions/KHR_interactivity/limits/<NAME>`, the name must be one of the RuntimeLimits keys (maxActiveAnimations, maxActiveDelays, maxActivePropertyInterpolations, maxActiveVariableInterpolations). An unknown limit name is rejected with this error.","triggerScenarios":"A behavior graph reads a runtime-limit pointer whose name is not in the RuntimeLimits table, e.g. `/extensions/KHR_interactivity/limits/maxBones` or a misspelled `/extensions/KHR_interactivity/limits/maxActiveAnimation`.","commonSituations":"Asset authored against another implementation's limit names; typo in the limit pointer; spec revision adding limits this Babylon version doesn't know.","solutions":["Use one of the supported limit names: maxActiveAnimations, maxActiveDelays, maxActivePropertyInterpolations, maxActiveVariableInterpolations","Fix typos in the limit pointer inside the interactivity JSON","Check the KHR_interactivity spec §4.2 and confirm Babylon supports that limit; upgrade Babylon.js if it is newer","Note trailing `/` is tolerated (normalized away), so the issue is the limit name itself"],"exampleFix":"// before\npointer = \"/extensions/KHR_interactivity/limits/maxNodes\";\n// after\npointer = \"/extensions/KHR_interactivity/limits/maxActiveAnimations\";","handlingStrategy":"validation","validationCode":"const KNOWN_LIMITS = [\"maxActiveAnimations\", \"maxActiveDelays\", \"maxActivePropertyInterpolations\", \"maxActiveVariableInterpolations\"];\nfunction isKnownLimitPointer(path: string): boolean {\n    const prefix = \"/extensions/KHR_interactivity/limits/\";\n    return path.startsWith(prefix) && KNOWN_LIMITS.includes(path.slice(prefix.length).replace(/\\/$/, \"\"));\n}","typeGuard":"function isSupportedRuntimeLimit(name: string): name is \"maxActiveAnimations\" | \"maxActiveDelays\" | \"maxActivePropertyInterpolations\" | \"maxActiveVariableInterpolations\" {\n    return [\"maxActiveAnimations\", \"maxActiveDelays\", \"maxActivePropertyInterpolations\", \"maxActiveVariableInterpolations\"].includes(name);\n}","tryCatchPattern":"try {\n    accessor = interactivityConverter.convert(path);\n} catch (e) {\n    if (String(e.message).includes(\"is invalid\")) {\n        accessor = interactivityConverter.convert(\"/extensions/KHR_interactivity/limits/maxActiveAnimations\"); // conservative default\n    } else throw e;\n}","preventionTips":["Only reference runtime limits listed in KHR_interactivity spec §4.2 that Babylon implements","Sanitize limit names generated by asset exporters","Treat unknown limits as 'unlimited' (2147483647) in your own tooling","Check Babylon release notes when the spec adds new limit names"],"tags":["gltf","khr-interactivity","json-pointer","runtime-limits"],"backgroundTag":"invalid-gltf-pointer","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}