contracts.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from __future__ import annotations
  2. from collections.abc import Mapping
  3. from dataclasses import dataclass, field
  4. from typing import Any
  5. @dataclass(frozen=True)
  6. class KnowledgePointDraft:
  7. point_key: str
  8. semantic_path: str
  9. content: str
  10. content_hash: str
  11. metadata: Mapping[str, Any]
  12. metadata_hash: str
  13. permission_scope: Mapping[str, Any]
  14. permission_hash: str
  15. @dataclass(frozen=True)
  16. class KnowledgeDependencyDraft:
  17. from_point_key: str
  18. to_point_key: str
  19. relation_type: str
  20. source: str
  21. @dataclass(frozen=True)
  22. class KnowledgeSnapshot:
  23. source_type: str
  24. source_uid: str
  25. source_revision: int
  26. source_snapshot_hash: str
  27. point_set_hash: str
  28. permission_scope: Mapping[str, Any]
  29. points: tuple[KnowledgePointDraft, ...]
  30. dependencies: tuple[KnowledgeDependencyDraft, ...] = ()
  31. source_updated_at: str | None = None
  32. @dataclass(frozen=True)
  33. class PointChange:
  34. point_key: str
  35. change_kind: str
  36. old: KnowledgePointDraft | None = None
  37. new: KnowledgePointDraft | None = None
  38. permission_changed: bool = False
  39. @dataclass(frozen=True)
  40. class SnapshotDiff:
  41. added: tuple[PointChange, ...] = ()
  42. modified: tuple[PointChange, ...] = ()
  43. deleted: tuple[PointChange, ...] = ()
  44. unchanged: tuple[PointChange, ...] = ()
  45. @property
  46. def changed_point_keys(self) -> frozenset[str]:
  47. return frozenset(
  48. change.point_key
  49. for group in (self.added, self.modified, self.deleted)
  50. for change in group
  51. )
  52. @dataclass(frozen=True)
  53. class ImpactResult:
  54. impacted_point_keys: frozenset[str]
  55. paths: Mapping[str, tuple[str, ...]] = field(default_factory=dict)
  56. truncated: bool = False
  57. @dataclass(frozen=True)
  58. class KnowledgeChunkDraft:
  59. chunk_key: str
  60. chunk_kind: str
  61. section_path: str
  62. content: str
  63. content_hash: str
  64. lexical_text: str
  65. primary_point_key: str
  66. point_keys: tuple[str, ...]
  67. point_set_hash: str
  68. metadata: Mapping[str, Any]
  69. @dataclass(frozen=True)
  70. class PreparedPublication:
  71. snapshot: KnowledgeSnapshot
  72. diff: SnapshotDiff
  73. chunks: tuple[KnowledgeChunkDraft, ...]
  74. embeddings: Mapping[str, tuple[float, ...]]
  75. status: str
  76. @dataclass(frozen=True)
  77. class SyncResult:
  78. status: str
  79. source_type: str
  80. source_uid: str
  81. source_revision: int
  82. diff_counts: Mapping[str, int]
  83. embedded_chunk_count: int
  84. reused_embedding_count: int