stablyai/orca · error · Error
Renderer entry ${sourceEntry} executes entry ${dependency}
Error message
Renderer entry ${sourceEntry} executes entry ${dependency} What it means
assertEntryIsolation's core invariant: no Vite entry may import or dynamically import ANOTHER entry. Each entry is meant to be an isolated web-client page; cross-entry execution would bundle the wrong graph when projecting. Detected by checking whether any dependency in the import graph is itself in the entryKeys set.
Source
Thrown at config/scripts/project-renderer-web-client.mjs:44
.map(([key]) => key)
)
for (const sourceEntry of entryKeys) {
const visited = new Set()
const pending = [sourceEntry]
while (pending.length > 0) {
const key = pending.pop()
if (visited.has(key)) {
continue
}
visited.add(key)
const entry = manifest[key]
if (!entry || typeof entry !== 'object') {
throw new Error(`Renderer manifest is missing entry: ${key}`)
}
for (const dependency of [...(entry.imports ?? []), ...(entry.dynamicImports ?? [])]) {
if (entryKeys.has(dependency) && dependency !== sourceEntry) {
throw new Error(`Renderer entry ${sourceEntry} executes entry ${dependency}`)
}
pending.push(dependency)
}
}
}
}
function addOutputPath(outputPath) {
if (
typeof outputPath !== 'string' ||
outputPath.length === 0 ||
outputPath.startsWith('/') ||
/^[A-Za-z]:/.test(outputPath) ||
outputPath.includes('\\') ||
outputPath.split('/').includes('..')
) {
throw new Error(`Invalid renderer output path: ${String(outputPath)}`)
}View on GitHub (pinned to 1136503c6a)
Solutions
- Extract the shared code into a non-entry module that both entries import instead of entry-to-entry
- Move the shared code to a chunk that is not marked isEntry (configure rollupOptions.input or manualChunks)
- Audit src/renderer entry HTML files to confirm each loads a distinct, non-overlapping module graph
- If the cross-entry import is intentional, reconsider whether both should be entries or one should be a dynamic chunk
Defensive patterns
Strategy: validation
Validate before calling
function assertNoEntryCrossImports(manifest) {
const entryKeys = new Set(Object.entries(manifest).filter(([, e]) => e?.isEntry).map(([k]) => k))
for (const k of entryKeys) {
for (const dep of [...(manifest[k].imports ?? []), ...(manifest[k].dynamicImports ?? [])]) {
if (entryKeys.has(dep)) throw new Error(`entry ${k} imports entry ${dep}`)
}
}
} Prevention
- Keep each web-client entry's module graph disjoint; share code via non-entry chunks
- Use manualChunks for shared code rather than entry-to-entry imports
- Audit new index.html entry files against existing entries before adding them
When it happens
Trigger: Two entry points (entry.isEntry === true) where one imports or dynamicImports the other, directly or transitively. Vite emits both as entries (isEntry true), so the dependency appears in entryKeys.
Common situations: Adding a new web-client entry that re-exports from an existing entry; an index.html per page where one page's module imports another page's module; refactoring shared code into a file that Vite then promotes to an entry.
Related errors
- Renderer manifest is missing entry: ${key}
- Unsupported macOS build architecture: ${architecture}
- [plain-node-entry-guard] guarded ${missing.map((name) => `"$
- Unsupported local-build compatibility architecture: ${contex
- Invalid ORCA_ELECTRON_VITE_TARGET: ${target ?? '<unset>'}
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/51fc209c22d605f0.
Report an issue: GitHub.