lorebase-store 0.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. lorebase_store/__init__.py +1 -0
  2. lorebase_store/_migrations/env.py +106 -0
  3. lorebase_store/_migrations/script.py.mako +27 -0
  4. lorebase_store/_migrations/versions/0001_initial_schema.py +1071 -0
  5. lorebase_store/_migrations/versions/0002_merge_attempt_details.py +74 -0
  6. lorebase_store/_migrations/versions/0003_webhooks.py +127 -0
  7. lorebase_store/_migrations/versions/0004_defer_revision_references.py +38 -0
  8. lorebase_store/_migrations/versions/0005_security_definer_reads.py +396 -0
  9. lorebase_store/_migrations/versions/0006_api_key_usage.py +48 -0
  10. lorebase_store/_migrations/versions/0007_document_extraction.py +154 -0
  11. lorebase_store/_migrations/versions/0008_definer_argument_checks.py +178 -0
  12. lorebase_store/_migrations/versions/0009_api_key_networks.py +33 -0
  13. lorebase_store/_migrations/versions/0010_overlay_branches.py +582 -0
  14. lorebase_store/_migrations/versions/0011_branch_scoped_search_index.py +229 -0
  15. lorebase_store/_migrations/versions/0012_overlay_neighborhood_lookups.py +185 -0
  16. lorebase_store/_migrations/versions/0013_web_sessions.py +72 -0
  17. lorebase_store/_migrations/versions/0014_embedding_jobs.py +70 -0
  18. lorebase_store/_migrations/versions/0015_append_only_audit_log.py +83 -0
  19. lorebase_store/_migrations/versions/0016_sealed_webhook_keys.py +55 -0
  20. lorebase_store/_migrations/versions/0017_background_branch_copies.py +77 -0
  21. lorebase_store/_migrations/versions/0018_search_lexicon.py +477 -0
  22. lorebase_store/_migrations/versions/0019_vault_bindings.py +56 -0
  23. lorebase_store/_migrations/versions/0020_outbox_consumers.py +150 -0
  24. lorebase_store/_migrations/versions/0021_schema_suggestions.py +114 -0
  25. lorebase_store/_migrations/versions/0022_read_audit_and_shared_rate_limits.py +133 -0
  26. lorebase_store/_migrations/versions/0023_agent_trace.py +96 -0
  27. lorebase_store/_migrations/versions/0024_embedding_template_keys.py +205 -0
  28. lorebase_store/_migrations/versions/0025_snapshot_refs.py +35 -0
  29. lorebase_store/_migrations/versions/0026_plain_reverse_link_index.py +112 -0
  30. lorebase_store/_migrations/versions/0027_vault_rotation_and_tombstones.py +145 -0
  31. lorebase_store/_migrations/versions/0028_operation_deferred_events.py +71 -0
  32. lorebase_store/_migrations/versions/0029_agent_trace_sessions.py +108 -0
  33. lorebase_store/_migrations/versions/0030_path_fanout.py +31 -0
  34. lorebase_store/_migrations/versions/0031_branch_builds.py +91 -0
  35. lorebase_store/_migrations/versions/0032_lineage_revisions.py +35 -0
  36. lorebase_store/_migrations/versions/0033_vault_moved_tokens.py +30 -0
  37. lorebase_store/_migrations/versions/0034_inference_endpoint_modes.py +73 -0
  38. lorebase_store/_migrations/versions/0035_search_truncation.py +104 -0
  39. lorebase_store/_migrations/versions/0036_lineage_maps.py +325 -0
  40. lorebase_store/_migrations/versions/0037_bm25_search.py +346 -0
  41. lorebase_store/auth/__init__.py +52 -0
  42. lorebase_store/auth/api_keys.py +161 -0
  43. lorebase_store/auth/audit.py +382 -0
  44. lorebase_store/auth/checkpoints.py +185 -0
  45. lorebase_store/auth/grants.py +161 -0
  46. lorebase_store/auth/principals.py +158 -0
  47. lorebase_store/auth/scope.py +70 -0
  48. lorebase_store/auth/sessions.py +153 -0
  49. lorebase_store/auth/unit.py +53 -0
  50. lorebase_store/auth/usage.py +70 -0
  51. lorebase_store/blobs.py +73 -0
  52. lorebase_store/bm25.py +346 -0
  53. lorebase_store/bulk.py +147 -0
  54. lorebase_store/bundle.py +1830 -0
  55. lorebase_store/changefeed.py +261 -0
  56. lorebase_store/commit/__init__.py +42 -0
  57. lorebase_store/commit/changes.py +67 -0
  58. lorebase_store/commit/errors.py +60 -0
  59. lorebase_store/commit/migrations.py +335 -0
  60. lorebase_store/commit/pipeline.py +754 -0
  61. lorebase_store/commit/schema.py +123 -0
  62. lorebase_store/db.py +58 -0
  63. lorebase_store/definer.py +50 -0
  64. lorebase_store/digests.py +99 -0
  65. lorebase_store/embeddings.py +444 -0
  66. lorebase_store/endpoint_modes.py +59 -0
  67. lorebase_store/extraction/__init__.py +61 -0
  68. lorebase_store/extraction/items.py +187 -0
  69. lorebase_store/extraction/materialize.py +364 -0
  70. lorebase_store/extraction/proposal.py +65 -0
  71. lorebase_store/extraction/review.py +168 -0
  72. lorebase_store/gc.py +970 -0
  73. lorebase_store/indexes.py +1033 -0
  74. lorebase_store/jobs.py +651 -0
  75. lorebase_store/keyring.py +72 -0
  76. lorebase_store/layout.py +335 -0
  77. lorebase_store/materialize/__init__.py +103 -0
  78. lorebase_store/materialize/apply.py +436 -0
  79. lorebase_store/materialize/background.py +1184 -0
  80. lorebase_store/materialize/branch.py +268 -0
  81. lorebase_store/materialize/build.py +536 -0
  82. lorebase_store/materialize/derived.py +540 -0
  83. lorebase_store/materialize/lineage_backfill.py +502 -0
  84. lorebase_store/materialize/links.py +266 -0
  85. lorebase_store/materialize/overlay.py +292 -0
  86. lorebase_store/materialize/paths.py +315 -0
  87. lorebase_store/materialize/rebuild.py +326 -0
  88. lorebase_store/materialize/rows.py +153 -0
  89. lorebase_store/materialize/sensitivity.py +66 -0
  90. lorebase_store/materialize/snapshot.py +205 -0
  91. lorebase_store/materialize/stale.py +444 -0
  92. lorebase_store/materialize/verify.py +321 -0
  93. lorebase_store/merging/__init__.py +39 -0
  94. lorebase_store/merging/attempts.py +334 -0
  95. lorebase_store/merging/lineage.py +123 -0
  96. lorebase_store/merging/service.py +652 -0
  97. lorebase_store/migrations.py +133 -0
  98. lorebase_store/models/__init__.py +136 -0
  99. lorebase_store/models/base.py +64 -0
  100. lorebase_store/models/enums.py +132 -0
  101. lorebase_store/models/governance.py +268 -0
  102. lorebase_store/models/ingestion.py +288 -0
  103. lorebase_store/models/materialized.py +277 -0
  104. lorebase_store/models/proposals.py +195 -0
  105. lorebase_store/models/queues.py +87 -0
  106. lorebase_store/models/tracing.py +116 -0
  107. lorebase_store/models/versioning.py +222 -0
  108. lorebase_store/models/webhooks.py +96 -0
  109. lorebase_store/nodestore.py +384 -0
  110. lorebase_store/objectstore.py +162 -0
  111. lorebase_store/outbox_events.py +166 -0
  112. lorebase_store/profiling/__init__.py +58 -0
  113. lorebase_store/profiling/delimited.py +109 -0
  114. lorebase_store/profiling/postgres.py +211 -0
  115. lorebase_store/profiling/record_files.py +127 -0
  116. lorebase_store/profiling/records.py +92 -0
  117. lorebase_store/profiling/sql_databases.py +298 -0
  118. lorebase_store/ratelimit.py +129 -0
  119. lorebase_store/reads.py +1491 -0
  120. lorebase_store/replicas.py +434 -0
  121. lorebase_store/repositories/__init__.py +152 -0
  122. lorebase_store/repositories/changesets.py +59 -0
  123. lorebase_store/repositories/deferred_events.py +142 -0
  124. lorebase_store/repositories/documents.py +305 -0
  125. lorebase_store/repositories/domains.py +97 -0
  126. lorebase_store/repositories/events.py +205 -0
  127. lorebase_store/repositories/index_view.py +489 -0
  128. lorebase_store/repositories/invocations.py +68 -0
  129. lorebase_store/repositories/materializations.py +276 -0
  130. lorebase_store/repositories/materialized.py +1129 -0
  131. lorebase_store/repositories/merges.py +417 -0
  132. lorebase_store/repositories/proposal_items.py +199 -0
  133. lorebase_store/repositories/proposals.py +184 -0
  134. lorebase_store/repositories/provenance.py +77 -0
  135. lorebase_store/repositories/refs.py +452 -0
  136. lorebase_store/repositories/revisions.py +273 -0
  137. lorebase_store/repositories/scope.py +33 -0
  138. lorebase_store/repositories/source_runs.py +123 -0
  139. lorebase_store/repositories/suggestions.py +638 -0
  140. lorebase_store/runtime.py +87 -0
  141. lorebase_store/schema_cache.py +50 -0
  142. lorebase_store/settings.py +879 -0
  143. lorebase_store/storage.py +1478 -0
  144. lorebase_store/telemetry.py +142 -0
  145. lorebase_store/testing.py +108 -0
  146. lorebase_store/tracing.py +505 -0
  147. lorebase_store/traverse.py +578 -0
  148. lorebase_store/vault/__init__.py +50 -0
  149. lorebase_store/vault/keys.py +216 -0
  150. lorebase_store/vault/quotes.py +133 -0
  151. lorebase_store/vault/rotation.py +209 -0
  152. lorebase_store/vault/settings.py +152 -0
  153. lorebase_store/vault/store.py +987 -0
  154. lorebase_store/vault/transfer.py +558 -0
  155. lorebase_store/webhooks/__init__.py +24 -0
  156. lorebase_store/webhooks/delivery.py +637 -0
  157. lorebase_store/webhooks/keys.py +126 -0
  158. lorebase_store/webhooks/repository.py +142 -0
  159. lorebase_store/webhooks/settings.py +138 -0
  160. lorebase_store/webhooks/signing.py +50 -0
  161. lorebase_store-0.2.3.dist-info/METADATA +13 -0
  162. lorebase_store-0.2.3.dist-info/RECORD +163 -0
  163. lorebase_store-0.2.3.dist-info/WHEEL +4 -0
@@ -0,0 +1,87 @@
1
+ """Process-wide store state: the `store` and `schema` settings, the tree node cache and the
2
+ schema cache."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from dataclasses import dataclass, field
7
+
8
+ from lorebase_platform.settings import Settings, load_settings
9
+ from lorebase_store.digests import DigestKeys
10
+ from lorebase_store.nodestore import NodeCache
11
+ from lorebase_store.schema_cache import SchemaCache
12
+ from lorebase_store.settings import (
13
+ DatabaseSettings,
14
+ SchemaSettings,
15
+ StoreSettings,
16
+ database_settings,
17
+ schema_settings,
18
+ store_settings,
19
+ )
20
+ from lorebase_store.vault.keys import VaultKeys
21
+ from lorebase_store.vault.settings import VaultSettings, vault_settings
22
+
23
+
24
+ @dataclass(frozen=True, slots=True)
25
+ class StoreRuntime:
26
+ """Settings and caches shared by the commits and reads of one process.
27
+
28
+ `vault` holds the keys of the personal data vault (`vault` settings), None when it is not
29
+ configured; `vault_settings` the whole section; `digests` the keys of the keyed digests
30
+ (`lorebase_store.digests`). `index_maintenance` is true when `database.maintenance_dsn` is
31
+ set: commits by a role that does not own `mat_records` then queue their per-Attribute index
32
+ changes for the job worker, which runs them as the maintenance role
33
+ (`lorebase_store.indexes`).
34
+ """
35
+
36
+ settings: StoreSettings
37
+ node_cache: NodeCache
38
+ schema_cache: SchemaCache
39
+ schema: SchemaSettings = field(default_factory=SchemaSettings)
40
+ index_maintenance: bool = False
41
+ vault: VaultKeys | None = None
42
+ vault_settings: VaultSettings = field(default_factory=VaultSettings)
43
+ digests: DigestKeys = field(default_factory=DigestKeys)
44
+
45
+ @classmethod
46
+ def from_settings(
47
+ cls,
48
+ settings: StoreSettings,
49
+ schema: SchemaSettings | None = None,
50
+ *,
51
+ database: DatabaseSettings | None = None,
52
+ vault: VaultSettings | None = None,
53
+ ) -> StoreRuntime:
54
+ keys = None if vault is None else VaultKeys.from_settings(vault)
55
+ vault = vault or VaultSettings()
56
+ return cls(
57
+ settings=settings,
58
+ node_cache=NodeCache.from_settings(settings.nodes),
59
+ schema_cache=SchemaCache(settings.reads.schema_cache_entries),
60
+ schema=schema or SchemaSettings(),
61
+ index_maintenance=database is not None and database.maintenance_dsn is not None,
62
+ vault=keys,
63
+ vault_settings=vault,
64
+ digests=DigestKeys.from_settings(vault, keys),
65
+ )
66
+
67
+ @classmethod
68
+ def from_loaded(cls, settings: Settings) -> StoreRuntime:
69
+ """Runtime of loaded settings: the `store`, `schema`, `database` and `vault`
70
+ sections."""
71
+ return cls.from_settings(
72
+ store_settings(settings),
73
+ schema_settings(settings),
74
+ database=database_settings(settings),
75
+ vault=vault_settings(settings),
76
+ )
77
+
78
+
79
+ _default: StoreRuntime | None = None
80
+
81
+
82
+ def default_runtime() -> StoreRuntime:
83
+ """Runtime built once from the loaded configuration (`load_settings()`)."""
84
+ global _default
85
+ if _default is None:
86
+ _default = StoreRuntime.from_loaded(load_settings())
87
+ return _default
@@ -0,0 +1,50 @@
1
+ """Per-process LRU of compiled schemas keyed by Domain and head Revision id.
2
+
3
+ A Revision is immutable, and so is the schema at it: an entry can never be stale, so the cache
4
+ needs no invalidation. Readers look up the branch head first (one indexed read) and only load
5
+ the compiled schema on a miss.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections import OrderedDict
11
+
12
+ from lorebase_core.model import Schema
13
+
14
+
15
+ class SchemaCache:
16
+ """Bounded LRU mapping `(domain_id, revision_id)` to the schema at that Revision.
17
+
18
+ Keys are Revision ids only (never schema hashes): callers look a branch head's schema up
19
+ by its head Revision (`reads.head_schema`). The same object comes back for the same
20
+ Revision, which keeps caches keyed by schema identity (Keeper's effective sensitivity
21
+ tags) effective.
22
+ """
23
+
24
+ def __init__(self, entries: int) -> None:
25
+ self._entries = entries
26
+ self._items: OrderedDict[tuple[str, bytes], Schema] = OrderedDict()
27
+ self.hits = 0
28
+ self.misses = 0
29
+
30
+ def get(self, domain_id: str, revision_id: bytes) -> Schema | None:
31
+ key = (domain_id, revision_id)
32
+ found = self._items.get(key)
33
+ if found is None:
34
+ self.misses += 1
35
+ return None
36
+ self.hits += 1
37
+ self._items.move_to_end(key)
38
+ return found
39
+
40
+ def put(self, domain_id: str, revision_id: bytes, schema: Schema) -> None:
41
+ if self._entries == 0:
42
+ return
43
+ key = (domain_id, revision_id)
44
+ self._items[key] = schema
45
+ self._items.move_to_end(key)
46
+ while len(self._items) > self._entries:
47
+ self._items.popitem(last=False)
48
+
49
+ def __len__(self) -> int:
50
+ return len(self._items)