moeru-ai/airi · error · Error
Extension \` \` does not support runtime \` \`.
Error message
Extension \`${manifest.id}\` does not support runtime \`${runtime}\`. What it means
The plugin host's assertManifestCompatibility checks that an extension manifest declares the current PluginRuntime (e.g. 'electron', 'node') in manifest.engines.runtimes before starting it. If the runtime is not listed, the extension is considered platform-incompatible and startExtension/start aborts. This prevents loading extensions whose entrypoints were not built for the host runtime.
Solutions
- Add the host runtime to manifest.engines.runtimes (e.g. "runtimes": ["electron"]) and rebuild/reinstall the extension.
- Verify the runtime string spelling matches the PluginRuntime union exactly (case-sensitive).
- Pass the correct options.runtime to startExtension so it matches a runtime the manifest declares.
- Use an extension build/manifest variant that targets the running host.
Example fix
// before
"engines": { "runtimes": ["node"], "airi": ">=1.0.0" }
// after
"engines": { "runtimes": ["node", "electron"], "airi": ">=1.0.0" } Defensive patterns
Strategy: validation
Validate before calling
if (!manifest.engines.runtimes.includes(currentRuntime)) {
throw new Error(`Extension ${manifest.id} unsupported on ${currentRuntime}`)
} Try / catch
try {
await host.startExtension(extension, { manifest })
} catch (e) {
if (e.message.includes('does not support runtime')) showIncompatibleExtensionNotice(manifest.id)
else throw e
} Prevention
- Keep engines.runtimes in the manifest generated from the build target so it cannot drift.
- Add a CI check that validates manifest runtimes against the build matrix.
- Test extensions in each runtime the product supports before publishing.
When it happens
Trigger: Calling startExtension(extension, { manifest, runtime }) or start() where manifest.engines.runtimes does not include the resolved runtime (options.runtime ?? host runtime).
Common situations: An extension authored only for the browser runtime is installed into the Electron host; a manifest forgot to add the runtime string after a rename; passing an explicit runtime option that differs from the manifest's declared list.
Understand the failure class
Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.
Related errors
- Extension entrypoint id \
- Extension \` \` does not support runtime \` \`.
- Extension entrypoint escapes the package folder
- Extension entrypoint is required for runtime \
- Extension manifest does not exist
AI-assisted analysis of moeru-ai/airi@438a067dde (2026-09-17).
Data as JSON: /api/errors/642581361a2ac853.
Report an issue: GitHub.
Appendix: source
Thrown at packages/plugin-sdk/src/plugin-host/core.ts:244
this.loader = new FileSystemLoader()
this.runtime = options.runtime ?? 'electron'
if (options.airiVersion && !semver.valid(options.airiVersion)) {
throw new Error(`AIRI version must be a valid semantic version: ${options.airiVersion}`)
}
this.airiVersion = options.airiVersion
this.permissionResolver = options.permissionResolver
this.resources.setValue(protocolListProvidersEventName, [] as Array<{ name: string }>)
this.markCapabilityReady(protocolListProvidersEventName, { source: 'plugin-host' })
this.installContext = this.createInstallContext()
for (const contribution of options.contributions ?? []) {
this.installContribution(contribution)
}
}
private assertManifestCompatibility(manifest: ExtensionManifestV2, runtime: PluginRuntime) {
if (!manifest.engines.runtimes.includes(runtime)) {
throw new Error(`Extension \`${manifest.id}\` does not support runtime \`${runtime}\`.`)
}
if (this.airiVersion && !semver.satisfies(this.airiVersion, manifest.engines.airi, { includePrerelease: true })) {
throw new Error(
`Extension \`${manifest.id}\` requires AIRI \`${manifest.engines.airi}\`, but the running version is \`${this.airiVersion}\`.`,
)
}
}
async startExtension(
extension: Extension,
options: { manifest: ExtensionManifestV2, cwd?: string, runtime?: PluginRuntime },
) {
const runtime = options.runtime ?? this.runtime
this.assertManifestCompatibility(options.manifest, runtime)
if (extension.id !== options.manifest.id) {
throw new Error(`Extension entrypoint id \`${extension.id}\` must match manifest id \`${options.manifest.id}\`.`)
}View on GitHub (pinned to 438a067dde)