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.
- lorebase_store/__init__.py +1 -0
- lorebase_store/_migrations/env.py +106 -0
- lorebase_store/_migrations/script.py.mako +27 -0
- lorebase_store/_migrations/versions/0001_initial_schema.py +1071 -0
- lorebase_store/_migrations/versions/0002_merge_attempt_details.py +74 -0
- lorebase_store/_migrations/versions/0003_webhooks.py +127 -0
- lorebase_store/_migrations/versions/0004_defer_revision_references.py +38 -0
- lorebase_store/_migrations/versions/0005_security_definer_reads.py +396 -0
- lorebase_store/_migrations/versions/0006_api_key_usage.py +48 -0
- lorebase_store/_migrations/versions/0007_document_extraction.py +154 -0
- lorebase_store/_migrations/versions/0008_definer_argument_checks.py +178 -0
- lorebase_store/_migrations/versions/0009_api_key_networks.py +33 -0
- lorebase_store/_migrations/versions/0010_overlay_branches.py +582 -0
- lorebase_store/_migrations/versions/0011_branch_scoped_search_index.py +229 -0
- lorebase_store/_migrations/versions/0012_overlay_neighborhood_lookups.py +185 -0
- lorebase_store/_migrations/versions/0013_web_sessions.py +72 -0
- lorebase_store/_migrations/versions/0014_embedding_jobs.py +70 -0
- lorebase_store/_migrations/versions/0015_append_only_audit_log.py +83 -0
- lorebase_store/_migrations/versions/0016_sealed_webhook_keys.py +55 -0
- lorebase_store/_migrations/versions/0017_background_branch_copies.py +77 -0
- lorebase_store/_migrations/versions/0018_search_lexicon.py +477 -0
- lorebase_store/_migrations/versions/0019_vault_bindings.py +56 -0
- lorebase_store/_migrations/versions/0020_outbox_consumers.py +150 -0
- lorebase_store/_migrations/versions/0021_schema_suggestions.py +114 -0
- lorebase_store/_migrations/versions/0022_read_audit_and_shared_rate_limits.py +133 -0
- lorebase_store/_migrations/versions/0023_agent_trace.py +96 -0
- lorebase_store/_migrations/versions/0024_embedding_template_keys.py +205 -0
- lorebase_store/_migrations/versions/0025_snapshot_refs.py +35 -0
- lorebase_store/_migrations/versions/0026_plain_reverse_link_index.py +112 -0
- lorebase_store/_migrations/versions/0027_vault_rotation_and_tombstones.py +145 -0
- lorebase_store/_migrations/versions/0028_operation_deferred_events.py +71 -0
- lorebase_store/_migrations/versions/0029_agent_trace_sessions.py +108 -0
- lorebase_store/_migrations/versions/0030_path_fanout.py +31 -0
- lorebase_store/_migrations/versions/0031_branch_builds.py +91 -0
- lorebase_store/_migrations/versions/0032_lineage_revisions.py +35 -0
- lorebase_store/_migrations/versions/0033_vault_moved_tokens.py +30 -0
- lorebase_store/_migrations/versions/0034_inference_endpoint_modes.py +73 -0
- lorebase_store/_migrations/versions/0035_search_truncation.py +104 -0
- lorebase_store/_migrations/versions/0036_lineage_maps.py +325 -0
- lorebase_store/_migrations/versions/0037_bm25_search.py +346 -0
- lorebase_store/auth/__init__.py +52 -0
- lorebase_store/auth/api_keys.py +161 -0
- lorebase_store/auth/audit.py +382 -0
- lorebase_store/auth/checkpoints.py +185 -0
- lorebase_store/auth/grants.py +161 -0
- lorebase_store/auth/principals.py +158 -0
- lorebase_store/auth/scope.py +70 -0
- lorebase_store/auth/sessions.py +153 -0
- lorebase_store/auth/unit.py +53 -0
- lorebase_store/auth/usage.py +70 -0
- lorebase_store/blobs.py +73 -0
- lorebase_store/bm25.py +346 -0
- lorebase_store/bulk.py +147 -0
- lorebase_store/bundle.py +1830 -0
- lorebase_store/changefeed.py +261 -0
- lorebase_store/commit/__init__.py +42 -0
- lorebase_store/commit/changes.py +67 -0
- lorebase_store/commit/errors.py +60 -0
- lorebase_store/commit/migrations.py +335 -0
- lorebase_store/commit/pipeline.py +754 -0
- lorebase_store/commit/schema.py +123 -0
- lorebase_store/db.py +58 -0
- lorebase_store/definer.py +50 -0
- lorebase_store/digests.py +99 -0
- lorebase_store/embeddings.py +444 -0
- lorebase_store/endpoint_modes.py +59 -0
- lorebase_store/extraction/__init__.py +61 -0
- lorebase_store/extraction/items.py +187 -0
- lorebase_store/extraction/materialize.py +364 -0
- lorebase_store/extraction/proposal.py +65 -0
- lorebase_store/extraction/review.py +168 -0
- lorebase_store/gc.py +970 -0
- lorebase_store/indexes.py +1033 -0
- lorebase_store/jobs.py +651 -0
- lorebase_store/keyring.py +72 -0
- lorebase_store/layout.py +335 -0
- lorebase_store/materialize/__init__.py +103 -0
- lorebase_store/materialize/apply.py +436 -0
- lorebase_store/materialize/background.py +1184 -0
- lorebase_store/materialize/branch.py +268 -0
- lorebase_store/materialize/build.py +536 -0
- lorebase_store/materialize/derived.py +540 -0
- lorebase_store/materialize/lineage_backfill.py +502 -0
- lorebase_store/materialize/links.py +266 -0
- lorebase_store/materialize/overlay.py +292 -0
- lorebase_store/materialize/paths.py +315 -0
- lorebase_store/materialize/rebuild.py +326 -0
- lorebase_store/materialize/rows.py +153 -0
- lorebase_store/materialize/sensitivity.py +66 -0
- lorebase_store/materialize/snapshot.py +205 -0
- lorebase_store/materialize/stale.py +444 -0
- lorebase_store/materialize/verify.py +321 -0
- lorebase_store/merging/__init__.py +39 -0
- lorebase_store/merging/attempts.py +334 -0
- lorebase_store/merging/lineage.py +123 -0
- lorebase_store/merging/service.py +652 -0
- lorebase_store/migrations.py +133 -0
- lorebase_store/models/__init__.py +136 -0
- lorebase_store/models/base.py +64 -0
- lorebase_store/models/enums.py +132 -0
- lorebase_store/models/governance.py +268 -0
- lorebase_store/models/ingestion.py +288 -0
- lorebase_store/models/materialized.py +277 -0
- lorebase_store/models/proposals.py +195 -0
- lorebase_store/models/queues.py +87 -0
- lorebase_store/models/tracing.py +116 -0
- lorebase_store/models/versioning.py +222 -0
- lorebase_store/models/webhooks.py +96 -0
- lorebase_store/nodestore.py +384 -0
- lorebase_store/objectstore.py +162 -0
- lorebase_store/outbox_events.py +166 -0
- lorebase_store/profiling/__init__.py +58 -0
- lorebase_store/profiling/delimited.py +109 -0
- lorebase_store/profiling/postgres.py +211 -0
- lorebase_store/profiling/record_files.py +127 -0
- lorebase_store/profiling/records.py +92 -0
- lorebase_store/profiling/sql_databases.py +298 -0
- lorebase_store/ratelimit.py +129 -0
- lorebase_store/reads.py +1491 -0
- lorebase_store/replicas.py +434 -0
- lorebase_store/repositories/__init__.py +152 -0
- lorebase_store/repositories/changesets.py +59 -0
- lorebase_store/repositories/deferred_events.py +142 -0
- lorebase_store/repositories/documents.py +305 -0
- lorebase_store/repositories/domains.py +97 -0
- lorebase_store/repositories/events.py +205 -0
- lorebase_store/repositories/index_view.py +489 -0
- lorebase_store/repositories/invocations.py +68 -0
- lorebase_store/repositories/materializations.py +276 -0
- lorebase_store/repositories/materialized.py +1129 -0
- lorebase_store/repositories/merges.py +417 -0
- lorebase_store/repositories/proposal_items.py +199 -0
- lorebase_store/repositories/proposals.py +184 -0
- lorebase_store/repositories/provenance.py +77 -0
- lorebase_store/repositories/refs.py +452 -0
- lorebase_store/repositories/revisions.py +273 -0
- lorebase_store/repositories/scope.py +33 -0
- lorebase_store/repositories/source_runs.py +123 -0
- lorebase_store/repositories/suggestions.py +638 -0
- lorebase_store/runtime.py +87 -0
- lorebase_store/schema_cache.py +50 -0
- lorebase_store/settings.py +879 -0
- lorebase_store/storage.py +1478 -0
- lorebase_store/telemetry.py +142 -0
- lorebase_store/testing.py +108 -0
- lorebase_store/tracing.py +505 -0
- lorebase_store/traverse.py +578 -0
- lorebase_store/vault/__init__.py +50 -0
- lorebase_store/vault/keys.py +216 -0
- lorebase_store/vault/quotes.py +133 -0
- lorebase_store/vault/rotation.py +209 -0
- lorebase_store/vault/settings.py +152 -0
- lorebase_store/vault/store.py +987 -0
- lorebase_store/vault/transfer.py +558 -0
- lorebase_store/webhooks/__init__.py +24 -0
- lorebase_store/webhooks/delivery.py +637 -0
- lorebase_store/webhooks/keys.py +126 -0
- lorebase_store/webhooks/repository.py +142 -0
- lorebase_store/webhooks/settings.py +138 -0
- lorebase_store/webhooks/signing.py +50 -0
- lorebase_store-0.2.3.dist-info/METADATA +13 -0
- lorebase_store-0.2.3.dist-info/RECORD +163 -0
- 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)
|