{"record":{"id":"b1a3a69c07c7e9e2","repo":"BabylonJS/Babylon.js","slug":"overridemanager-unknown-manager-state","errorCode":null,"errorMessage":"OverrideManager: Unknown manager state.","messagePattern":"OverrideManager: Unknown manager state\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/sharedUiComponents/src/projects/overrideManager.ts","lineNumber":452,"sourceCode":"        internal.sceneDisposeObserver = null;\r\n    }\r\n\r\n    internal.overrides.length = 0;\r\n    internal.originalValues.clear();\r\n\r\n    manager.onChangedObservable.clear();\r\n\r\n    if (manager.scene.metadata) {\r\n        delete manager.scene.metadata[OverrideManagerKey];\r\n    }\r\n}\r\n\r\n// ── Private ──\r\n\r\nfunction GetOverrideInternals(manager: OverrideManager): OverrideManagerInternals {\r\n    const internal = OverrideManagerInternals.get(manager);\r\n    if (!internal) {\r\n        throw new Error(\"OverrideManager: Unknown manager state.\");\r\n    }\r\n    return internal;\r\n}\r\n\r\n/**\r\n * Applies a single override entry to its target, capturing the original value\r\n * on the first application so {@link RemoveOverride} can restore it later.\r\n * @param manager - The override manager owning the entry.\r\n * @param internal - The manager's internal state.\r\n * @param entry - The override to apply.\r\n */\r\nfunction ApplyOverrideEntry(manager: OverrideManager, internal: OverrideManagerInternals, entry: IOverrideEntry): void {\r\n    const target = ResolveTarget(manager.scene, entry.targetType, entry.targetName, entry.targetIndex);\r\n    if (!target) {\r\n        Logger.Warn(`OverrideManager: target not found for type=\"${entry.targetType}\" name=\"${entry.targetName}\" index=${entry.targetIndex} prop=\"${entry.propertyPath}\"`);\r\n        return; // Target not loaded yet — override will be applied on next ApplyAllOverrides\r\n    }\r\n\r","sourceCodeStart":434,"sourceCodeEnd":470,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/sharedUiComponents/src/projects/overrideManager.ts#L434-L470","documentation":"GetOverrideInternals looks up per-manager hidden state in a WeakMap (OverrideManagerInternals); if the manager instance has no entry, the manager was never initialized (or was constructed outside the library's init path). Since WeakMap entries vanish when the manager is garbage-collected, a stale reference can also trigger this.","triggerScenarios":"Calling GetOverrides or other public OverrideManager APIs on an instance not created via the library's constructor/init; passing a different object than the real manager; using a manager after its internals were cleared; calling GetOverrideInternals before initialization completed.","commonSituations":"Constructing OverrideManager via Object.create or a framework deserializer bypassing the real constructor; manager recreated by a framework (e.g. hot reload) while callers keep the old reference; initialization step forgotten in a custom setup.","solutions":["Create the manager through the library's constructor so internals are registered.","Hold the live manager instance; discard stale references after reload/reinit.","Ensure initialization finished before calling GetOverrides or other public methods.","Don't clone/deserialize manager objects; re-create them in the target context."],"exampleFix":"// before\nconst mgr = Object.create(OverrideManager.prototype); // no internals\nGetOverrides(mgr); // throws: Unknown manager state\n// after\nconst mgr = new OverrideManager(scene); // registers internals\nGetOverrides(mgr);","handlingStrategy":"try-catch","validationCode":"// Only call public APIs on instances obtained from the library constructor\n// const mgr = new OverrideManager(scene);\n// if (!(mgr instanceof OverrideManager)) throw new Error(\"stale manager reference\");","typeGuard":"function isLiveManager(m: unknown): m is OverrideManager {\n  return m instanceof OverrideManager;\n}","tryCatchPattern":"// try {\n//   return GetOverrides(manager);\n// } catch (e) {\n//   if (String(e.message).includes(\"Unknown manager state\")) {\n//     manager = new OverrideManager(scene); // re-init stale/recreated manager\n//     return GetOverrides(manager);\n//   }\n//   throw e;\n// }","preventionTips":["Always construct OverrideManager via its constructor; never Object.create or clone it.","Re-acquire the manager reference after hot reload or framework re-render.","Initialize before first use; don't split construction from init across async boundaries."],"tags":["state","initialization","weakmap"],"backgroundTag":"uninitialized-manager-state","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}