from __future__ import annotations from django.db import models from control_plane.common import TimestampedModel class KnowledgeNode(TimestampedModel): project = models.ForeignKey("projects.Project", on_delete=models.CASCADE, related_name="knowledge_nodes") node_type = models.CharField(max_length=80) external_id = models.CharField(max_length=500) title = models.CharField(max_length=500, blank=True) properties = models.JSONField(default=dict, blank=True) class Meta: constraints = [models.UniqueConstraint(fields=["project", "node_type", "external_id"], name="unique_knowledge_node")] class KnowledgeEdge(TimestampedModel): project = models.ForeignKey("projects.Project", on_delete=models.CASCADE, related_name="knowledge_edges") source = models.ForeignKey(KnowledgeNode, on_delete=models.CASCADE, related_name="outgoing_edges") target = models.ForeignKey(KnowledgeNode, on_delete=models.CASCADE, related_name="incoming_edges") edge_type = models.CharField(max_length=80) evidence = models.JSONField(default=list, blank=True) class Meta: constraints = [models.UniqueConstraint(fields=["source", "target", "edge_type"], name="unique_knowledge_edge")]