| 474 | 474 | } |
| 475 | 475 | |
| 476 | 476 | /** |
| 477 | + * Returns a deep clone of the manifest for the given extension name. |
| 478 | + * Accepts either the short name (e.g. `SillyTavern-MyExtension`) or the full internal key |
| 479 | + * (e.g. `third-party/SillyTavern-MyExtension`). Returns null if the extension is not found. |
| 480 | + * @param {string} name - Extension name or internal key |
| 481 | + * @returns {object|null} Cloned manifest object, or null if not found |
| 482 | + */ |
| 483 | +export function getExtensionManifest(name) { |
| 484 | + const found = extensionNames.find(extName => |
| 485 | + equalsIgnoreCaseAndAccents(extName, name) || equalsIgnoreCaseAndAccents(extName, `third-party/${name}`), |
| 486 | + ); |
| 487 | + const manifest = found ? manifests[found] : null; |
| 488 | + return manifest ? structuredClone(manifest) : null; |
| 489 | +} |
| 490 | + |
| 491 | +/** |
| 477 | 492 | * Loads manifest.json files for extensions. |
| 478 | 493 | * @param {string[]} names Array of extension names |
| 479 | 494 | * @returns {Promise<Record<string, object>>} Object with extension names as keys and their manifests as values |