class_name KeetGraph
extends Node
## Local graph computation client — requests MI-computed clusters from daemon.
signal graph_computed(result: Dictionary)
signal clusters_loaded(clusters: Array)
signal edges_loaded(edges: Array)
signal error_occurred(message: String)
var client: KeetUdsClient
var last_clusters: Array = [] ## Cached clusters from last compute — read directly, no RPC
## Compute full graph (cached 60s, use force=true to recompute).
## Result: { clusters: Array, edges: Array, suggestions: Array }
## algo: optional Dictionary with {features, threshold, minSize} for MI clustering.
func compute(force: bool = false, algo: Dictionary = {}, callback: Callable = Callable()) -> void:
_require_client()
var params: Dictionary = {"force": force}
if not algo.is_empty():
params["algo"] = algo
client.call_rpc("graph.compute", params, func(result, err):
if err != null:
error_occurred.emit("compute: %s" % str(err))
return
var r: Dictionary = result if result is Dictionary else {}
# Cache clusters locally so other panels can read without RPC
var clusters: Array = r.get("clusters", []) if r is Dictionary else []
if clusters is Array:
last_clusters = clusters
graph_computed.emit(r)
clusters_loaded.emit(last_clusters)
if callback.is_valid():
callback.call(r)
)
## Get clusters from last computation (uses cache).
func get_clusters(algo: Dictionary = {}, callback: Callable = Callable()) -> void:
_require_client()
var params: Dictionary = {}
if not algo.is_empty():
params["algo"] = algo
client.call_rpc("graph.clusters", params, func(result, err):
if err != null:
error_occurred.emit("get_clusters: %s" % str(err))
return
var clusters: Array = result if result is Array else []
clusters_loaded.emit(clusters)
if callback.is_valid():
callback.call(clusters)
)
## Get MI edges from last computation (uses cache).
func get_edges(algo: Dictionary = {}, callback: Callable = Callable()) -> void:
_require_client()
var params: Dictionary = {}
if not algo.is_empty():
params["algo"] = algo
client.call_rpc("graph.edges", params, func(result, err):
if err != null:
error_occurred.emit("get_edges: %s" % str(err))
return
var edges: Array = result if result is Array else []
edges_loaded.emit(edges)
if callback.is_valid():
callback.call(edges)
)
func _require_client() -> void:
if client == null:
push_error("KeetGraph: client not set")