2026-10-09 12:49:07 +02:00

37 lines
1.8 KiB
GDScript

@tool
extends RefCounted
## Sequences the extension subsystem lifecycle and presents the load_all /
## start_watcher façade the composer binds to.
##
## load_all() runs the one-shot startup discovery and registers the
## extensions.list meta command. start_watcher() creates the live hot-reload
## watcher and hands it the registry + server. This owns wiring, not domain logic:
## discovery, the meta-command wire shape, and the hot-reload diff engine each live
## in their own module (extension_discovery, extension_meta_commands,
## extension_watcher); the shared load/probe/version spine lives in extension_support.
const _Discovery := preload("res://addons/godot_mcp_toolkit/extensions/services/extension_discovery.gd")
const _MetaCommands := preload("res://addons/godot_mcp_toolkit/extensions/services/extension_meta_commands.gd")
const _Watcher := preload("res://addons/godot_mcp_toolkit/extensions/services/extension_watcher.gd")
static func load_all(registry: MCPToolkitCommandRegistry, server: Node) -> int:
# Run the one-shot startup discovery pass — it loads every enabled extension
# candidate into the registry and stores the retained C# instances as a registry
# meta so they outlive this call.
var loaded := _Discovery.discover_and_register(registry, server)
if loaded > 0:
print("[MCPExtensions] Discovered %d extension(s) via reflection" % loaded)
# Register the meta command for bridge discovery.
_MetaCommands.register_list_command(registry)
return loaded
## Create a persistent watcher that monitors EditorFileSystem for extension
## changes and broadcasts "extensions.changed" notifications. The caller
## MUST retain the returned reference (prevents GC).
static func start_watcher(registry: MCPToolkitCommandRegistry, server: Node) -> RefCounted:
var watcher := _Watcher.new()
watcher.setup(registry, server)
return watcher