NewEngineRegistry creates a new engine registry with built-in engines. Panics on invalid built-in engine registration.
()
| 479 | // NewEngineRegistry creates a new engine registry with built-in engines. |
| 480 | // Panics on invalid built-in engine registration. |
| 481 | func NewEngineRegistry() *EngineRegistry { |
| 482 | agenticEngineLog.Print("Creating new engine registry") |
| 483 | |
| 484 | registry := &EngineRegistry{ |
| 485 | engines: make(map[string]CodingAgentEngine), |
| 486 | } |
| 487 | |
| 488 | // Register built-in engines |
| 489 | builtins := []CodingAgentEngine{ |
| 490 | NewClaudeEngine(), |
| 491 | NewCodexEngine(), |
| 492 | NewCopilotEngine(), |
| 493 | NewGeminiEngine(), |
| 494 | NewAntigravityEngine(), |
| 495 | NewOpenCodeEngine(), |
| 496 | NewCrushEngine(), |
| 497 | NewPiEngine(), |
| 498 | } |
| 499 | for _, engine := range builtins { |
| 500 | if err := registry.Register(engine); err != nil { |
| 501 | panic(fmt.Sprintf("BUG: failed to register built-in engine: %v", err)) |
| 502 | } |
| 503 | } |
| 504 | |
| 505 | agenticEngineLog.Printf("Registered %d engines", len(registry.engines)) |
| 506 | |
| 507 | // Pre-compute and cache the manifest file/folder lists now that all engines are |
| 508 | // registered. These lists are derived solely from the registered engine set, which |
| 509 | // is fixed after construction. Pre-computing here guarantees thread-safe access: |
| 510 | // callers that read the cached slices later see a fully-initialised, immutable |
| 511 | // value and never trigger concurrent writes. |
| 512 | registry.cachedManifestFolders = registry.computeAllAgentManifestFolders() |
| 513 | registry.cachedManifestFiles = registry.computeAllAgentManifestFiles() |
| 514 | |
| 515 | return registry |
| 516 | } |
| 517 | |
| 518 | // GetGlobalEngineRegistry returns the singleton engine registry |
| 519 | func GetGlobalEngineRegistry() *EngineRegistry { |