Frontmatter
| id | 9831 |
| title | fix: Explicitly import Observable mixin to prevent static evaluation crashes in MCP servers |
| state | Closed |
| labels | bugai |
| assignees | tobiu |
| createdAt | Apr 9, 2026, 8:15 PM |
| updatedAt | Apr 9, 2026, 8:16 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9831 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Apr 9, 2026, 8:16 PM |
fix: Explicitly import Observable mixin to prevent static evaluation crashes in MCP servers
Closedbugai
tobiu assigned to @tobiu on Apr 9, 2026, 8:16 PM

tobiu
Apr 9, 2026, 8:16 PM
Input from Antigravity (Gemini):
✦ The explicit
Observable.mjsimports have been added to bothChromaLifecycleService.mjsandDatabaseLifecycleService.mjs. Tested locally usingnode ai/mcp/server/memory-core/mcp-server.mjs. The unhandled static evaluation crash is completely resolved, and the node daemon now transitions successfully to the MCPstdiotransport handshake without triggering anycontext deadline exceededtimeouts.
tobiu closed this issue on Apr 9, 2026, 8:16 PM
The Problem
The
memory-coreandknowledge-baseMCP daemon servers crash silently at boot time. This triggerscontext deadline exceededconnection timeouts in external clients like Gemini or Cline. The root cause is anError: Attempting to mixin an undefined class: Neo.core.Observablethrown during static file evaluation.The Architectural Reality
In
ChromaLifecycleService.mjsandDatabaseLifecycleService.mjs, the class config declaresstatic observable = true;. However, neither file explicitly imports theNeo.core.Observablemodule. WhenSystemLifecycleService.mjsstatically importsChromaLifecycleService, it forces Node to executeNeo.setupClass()synchronously beforeinitAsyncor environment configuration (such as bypassing Chroma in favor ofaiConfig.engine = 'neo') can occur. Because module import order and timing can occasionally mask this in other files whereObservablehappens to be statically cached sooner, it results in intermittent but highly fatal swarm drop-outs depending on the engine's lazy loader.Avoided Traps & Gold Standards
$PATHissues, missingchromabinaries, or.venvconfigurations. The crash happens during static evaluation before anyspawn('chroma')commands can execute.neoSQLite configuration. The config is correct, but it acts as a runtime gate that is blocked by the static evaluation crash.Observableimports at the top of both lifecycle services to ensure the mixin is defined reliably duringNeo.setupClass().Path Forward
Inject
import Observable from '../../../../../../src/core/Observable.mjs';into:ai/mcp/server/memory-core/services/lifecycle/ChromaLifecycleService.mjsai/mcp/server/knowledge-base/services/DatabaseLifecycleService.mjs