moeru-ai/airi · error · Error
Extension entrypoint is required for runtime \
Error message
Extension entrypoint is required for runtime \`${runtime}\`. Define \`entrypoints.<runtime>\` or \`entrypoints.default\` in the extension manifest. What it means
resolveEntrypointFor resolves manifest.entrypoints[runtime] ?? manifest.entrypoints.default. If neither exists, there is no executable entry to load for that runtime, so it throws. This is the manifest-shape error as opposed to the compatibility error: the runtime is supported but no entrypoint path was declared.
Solutions
- Add entrypoints.default to the manifest pointing at the built entry file.
- Add an entrypoints.<runtime> key for the specific runtime being loaded.
- Fix key typos in the entrypoints object.
- Regenerate the manifest with the extension build tool so entrypoints are populated.
Example fix
// before
"entrypoints": { "node": "./dist/index.js" } // loading with runtime 'electron'
// after
"entrypoints": { "node": "./dist/index.js", "default": "./dist/index.js" } Defensive patterns
Strategy: validation
Validate before calling
const ep = manifest.entrypoints[runtime] ?? manifest.entrypoints.default
if (!ep) throw new Error(`manifest ${manifest.id} has no entrypoint for ${runtime}`) Try / catch
try {
const entry = await loader.resolveEntrypointFor(manifest)
} catch (e) {
if (e.message.includes('entrypoint is required')) flagBrokenManifest(manifest.id)
else throw e
} Prevention
- Always include entrypoints.default as a fallback in published manifests.
- Lint extension manifests with a schema that requires entrypoints.
- Watch for key typos in entrypoints; generate them from build output paths.
When it happens
Trigger: resolveEntrypointFor with a manifest whose entrypoints object lacks both a key for the resolved runtime and a 'default' key.
Common situations: A manifest declaring runtimes but never filling entrypoints; an entrypoint key typo (e.g. 'electorn'); a manifest generated for a different runtime only; hand-written minimal manifests during development.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- Extension \` \` does not support runtime \` \`.
- Extension entrypoint id \
- Extension entrypoint is required for runtime
- Extension \` \` does not support runtime \` \`.
- Extension \` \` requires AIRI \` \`, but the running…
AI-assisted analysis of moeru-ai/airi@438a067dde (2026-09-17).
Data as JSON: /api/errors/1a82143e32348c92.
Report an issue: GitHub.
Appendix: source
Thrown at packages/plugin-sdk/src/plugin-host/runtimes/node/loaders/fs.ts:64
* Resolve a manifest entrypoint for the requested runtime.
*
* Resolution order:
* 1) `entrypoints.<runtime>`
* 2) `entrypoints.default`
*/
resolveEntrypointFor(manifest: ExtensionManifestV2, options?: ExtensionLoadOptions) {
const runtime = options?.runtime ?? 'electron'
if (!manifest.engines.runtimes.includes(runtime)) {
throw new Error(`Extension \`${manifest.id}\` does not support runtime \`${runtime}\`.`)
}
const root = options?.cwd ?? cwd()
const entrypoint
= manifest.entrypoints[runtime]
?? manifest.entrypoints.default
if (!entrypoint) {
throw new Error(''
+ `Extension entrypoint is required for runtime \`${runtime}\`. `
+ 'Define `entrypoints.<runtime>` or `entrypoints.default` in the extension manifest.',
)
}
return isAbsolute(entrypoint) ? entrypoint : join(root, entrypoint)
}
async loadExtensionFor(manifest: ExtensionManifestV2, options?: ExtensionLoadOptions) {
const entrypoint = this.resolveEntrypointFor(manifest, options)
const extensionModule = await import(entrypoint)
return coerceExtensionFromModule(extensionModule)
}
}
View on GitHub (pinned to 438a067dde)