rememberstack 0.1.0__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 (186) hide show
  1. rememberstack/__init__.py +9 -0
  2. rememberstack/adapters/__init__.py +42 -0
  3. rememberstack/adapters/codex_writer.py +221 -0
  4. rememberstack/adapters/markitdown_converter.py +42 -0
  5. rememberstack/adapters/openrouter.py +136 -0
  6. rememberstack/adapters/selfhost/__init__.py +54 -0
  7. rememberstack/adapters/selfhost/forget.py +66 -0
  8. rememberstack/adapters/selfhost/git.py +374 -0
  9. rememberstack/adapters/selfhost/lance.py +328 -0
  10. rememberstack/adapters/selfhost/minio.py +279 -0
  11. rememberstack/adapters/selfhost/mounts.py +249 -0
  12. rememberstack/adapters/selfhost/object_store.py +130 -0
  13. rememberstack/adapters/selfhost/projection.py +80 -0
  14. rememberstack/adapters/selfhost/queue.py +137 -0
  15. rememberstack/adapters/selfhost/telemetry.py +45 -0
  16. rememberstack/adapters/selfhost/watcher.py +70 -0
  17. rememberstack/adapters/testing/__init__.py +15 -0
  18. rememberstack/adapters/testing/cost_meter.py +13 -0
  19. rememberstack/adapters/testing/model_provider.py +83 -0
  20. rememberstack/adapters/testing/queue.py +43 -0
  21. rememberstack/adapters/testing/telemetry.py +22 -0
  22. rememberstack/client.py +19 -0
  23. rememberstack/core/__init__.py +127 -0
  24. rememberstack/core/blockizer.py +189 -0
  25. rememberstack/core/chunker.py +216 -0
  26. rememberstack/core/consumption_skill.py +275 -0
  27. rememberstack/core/conversion.py +76 -0
  28. rememberstack/core/core_manifest.py +598 -0
  29. rememberstack/core/extension_packs.py +124 -0
  30. rememberstack/core/forget.py +17 -0
  31. rememberstack/core/knowledge_authored.py +276 -0
  32. rememberstack/core/knowledge_compile.py +215 -0
  33. rememberstack/core/knowledge_fact_sheet.py +210 -0
  34. rememberstack/core/knowledge_hashing.py +68 -0
  35. rememberstack/core/knowledge_planner.py +64 -0
  36. rememberstack/core/knowledge_writer.py +175 -0
  37. rememberstack/core/ranking.py +200 -0
  38. rememberstack/core/recipe_linter.py +149 -0
  39. rememberstack/core/section_snap.py +209 -0
  40. rememberstack/core/storage_routing.py +27 -0
  41. rememberstack/eval/__init__.py +53 -0
  42. rememberstack/eval/consumption.py +141 -0
  43. rememberstack/eval/contradiction.py +184 -0
  44. rememberstack/eval/harness.py +136 -0
  45. rememberstack/eval/lifecycle.py +400 -0
  46. rememberstack/eval/operational_scale.py +49 -0
  47. rememberstack/eval/resolution.py +255 -0
  48. rememberstack/eval/retrieval_spikes.py +50 -0
  49. rememberstack/eval/skeleton.py +231 -0
  50. rememberstack/llm/__init__.py +1 -0
  51. rememberstack/model/__init__.py +589 -0
  52. rememberstack/model/adjudication.py +100 -0
  53. rememberstack/model/auth.py +27 -0
  54. rememberstack/model/blocks.py +30 -0
  55. rememberstack/model/chunks.py +190 -0
  56. rememberstack/model/claims.py +162 -0
  57. rememberstack/model/client.py +98 -0
  58. rememberstack/model/clustering.py +54 -0
  59. rememberstack/model/component_version.py +124 -0
  60. rememberstack/model/consumption.py +88 -0
  61. rememberstack/model/conversion.py +31 -0
  62. rememberstack/model/deployment.py +53 -0
  63. rememberstack/model/documents.py +168 -0
  64. rememberstack/model/envelope.py +513 -0
  65. rememberstack/model/evaluation.py +72 -0
  66. rememberstack/model/forget.py +143 -0
  67. rememberstack/model/git.py +13 -0
  68. rememberstack/model/knowledge.py +840 -0
  69. rememberstack/model/knowledge_authored.py +325 -0
  70. rememberstack/model/knowledge_planner.py +431 -0
  71. rememberstack/model/lifecycle.py +42 -0
  72. rememberstack/model/model_provider.py +78 -0
  73. rememberstack/model/mounts.py +24 -0
  74. rememberstack/model/object_store.py +21 -0
  75. rememberstack/model/operational_scale.py +59 -0
  76. rememberstack/model/operations.py +153 -0
  77. rememberstack/model/processing.py +228 -0
  78. rememberstack/model/queue.py +73 -0
  79. rememberstack/model/recipes.py +83 -0
  80. rememberstack/model/relations.py +79 -0
  81. rememberstack/model/resolution.py +83 -0
  82. rememberstack/model/retrieval_spikes.py +62 -0
  83. rememberstack/model/sections.py +120 -0
  84. rememberstack/model/telemetry.py +30 -0
  85. rememberstack/ports/__init__.py +29 -0
  86. rememberstack/ports/auth.py +16 -0
  87. rememberstack/ports/connector.py +23 -0
  88. rememberstack/ports/cost_meter.py +17 -0
  89. rememberstack/ports/forget.py +20 -0
  90. rememberstack/ports/git.py +20 -0
  91. rememberstack/ports/model_provider.py +28 -0
  92. rememberstack/ports/mounts.py +16 -0
  93. rememberstack/ports/object_store.py +27 -0
  94. rememberstack/ports/p1_index.py +92 -0
  95. rememberstack/ports/purge.py +93 -0
  96. rememberstack/ports/queue.py +23 -0
  97. rememberstack/ports/telemetry.py +21 -0
  98. rememberstack/profiles/__init__.py +22 -0
  99. rememberstack/profiles/selfhost.py +324 -0
  100. rememberstack/profiles/selfhost_forget.py +158 -0
  101. rememberstack/profiles/selfhost_operations.py +95 -0
  102. rememberstack/py.typed +1 -0
  103. rememberstack/spine/__init__.py +93 -0
  104. rememberstack/spine/admission.py +26 -0
  105. rememberstack/spine/backfill.py +168 -0
  106. rememberstack/spine/catalog_contract.py +742 -0
  107. rememberstack/spine/chunk_catalog.py +237 -0
  108. rememberstack/spine/claim_catalog.py +298 -0
  109. rememberstack/spine/clustering.py +740 -0
  110. rememberstack/spine/component_versions.py +208 -0
  111. rememberstack/spine/consumption.py +81 -0
  112. rememberstack/spine/deployment_bootstrap.py +445 -0
  113. rememberstack/spine/document_catalog.py +621 -0
  114. rememberstack/spine/entity_registry.py +205 -0
  115. rememberstack/spine/extension_packs.py +220 -0
  116. rememberstack/spine/fact_catalog.py +571 -0
  117. rememberstack/spine/forget.py +1753 -0
  118. rememberstack/spine/knowledge.py +5467 -0
  119. rememberstack/spine/lifecycle.py +1071 -0
  120. rememberstack/spine/migrations/__init__.py +1 -0
  121. rememberstack/spine/migrations/_helpers.py +153 -0
  122. rememberstack/spine/migrations/env.py +58 -0
  123. rememberstack/spine/migrations/script.py.mako +27 -0
  124. rememberstack/spine/migrations/versions/__init__.py +1 -0
  125. rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py +189 -0
  126. rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py +321 -0
  127. rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py +631 -0
  128. rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py +411 -0
  129. rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py +391 -0
  130. rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py +158 -0
  131. rememberstack/spine/migrations/versions/p2_06_0007_invalidated_outcome.py +26 -0
  132. rememberstack/spine/migrations/versions/p3_01_0008_document_version_target.py +58 -0
  133. rememberstack/spine/migrations/versions/p3_05_0009_reconcile_stage.py +27 -0
  134. rememberstack/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py +25 -0
  135. rememberstack/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py +57 -0
  136. rememberstack/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py +58 -0
  137. rememberstack/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py +46 -0
  138. rememberstack/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py +217 -0
  139. rememberstack/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py +38 -0
  140. rememberstack/spine/migrations/versions/p7_02_0016_operational_eval_suite.py +19 -0
  141. rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py +55 -0
  142. rememberstack/spine/observation_adjudication.py +778 -0
  143. rememberstack/spine/operations.py +298 -0
  144. rememberstack/spine/projection.py +662 -0
  145. rememberstack/spine/recipes.py +276 -0
  146. rememberstack/spine/resolver.py +763 -0
  147. rememberstack/spine/review.py +650 -0
  148. rememberstack/spine/settings.py +22 -0
  149. rememberstack/spine/supersession.py +510 -0
  150. rememberstack/spine/sync.py +128 -0
  151. rememberstack/spine/work_ledger.py +816 -0
  152. rememberstack/surfaces/__init__.py +110 -0
  153. rememberstack/surfaces/cli.py +447 -0
  154. rememberstack/surfaces/consumption_skill.py +87 -0
  155. rememberstack/surfaces/graph_queries.py +698 -0
  156. rememberstack/surfaces/http_api.py +377 -0
  157. rememberstack/surfaces/mcp.py +67 -0
  158. rememberstack/surfaces/query_engine.py +1591 -0
  159. rememberstack/surfaces/recipe_executor.py +185 -0
  160. rememberstack/surfaces/recipe_surface.py +219 -0
  161. rememberstack/surfaces/remote_mcp.py +133 -0
  162. rememberstack/surfaces/sdk.py +324 -0
  163. rememberstack/workers/__init__.py +155 -0
  164. rememberstack/workers/base.py +312 -0
  165. rememberstack/workers/e0.py +577 -0
  166. rememberstack/workers/e1.py +425 -0
  167. rememberstack/workers/e2.py +525 -0
  168. rememberstack/workers/e3.py +434 -0
  169. rememberstack/workers/forget.py +299 -0
  170. rememberstack/workers/knowledge_authored.py +146 -0
  171. rememberstack/workers/knowledge_driver.py +735 -0
  172. rememberstack/workers/knowledge_fact_sheet.py +123 -0
  173. rememberstack/workers/knowledge_planner.py +325 -0
  174. rememberstack/workers/knowledge_writer.py +393 -0
  175. rememberstack/workers/operations.py +42 -0
  176. rememberstack/workers/p1.py +234 -0
  177. rememberstack/workers/p2.py +513 -0
  178. rememberstack/workers/p2_analytics.py +276 -0
  179. rememberstack/workers/p3.py +673 -0
  180. rememberstack/workers/reconcile.py +485 -0
  181. rememberstack/workers/sync.py +168 -0
  182. rememberstack-0.1.0.dist-info/METADATA +213 -0
  183. rememberstack-0.1.0.dist-info/RECORD +186 -0
  184. rememberstack-0.1.0.dist-info/WHEEL +4 -0
  185. rememberstack-0.1.0.dist-info/entry_points.txt +2 -0
  186. rememberstack-0.1.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,208 @@
1
+ """Transactional component-version registration and resolution."""
2
+
3
+ from collections.abc import Mapping
4
+ from uuid import UUID
5
+
6
+ from sqlalchemy import bindparam
7
+ from sqlalchemy import JSON
8
+ from sqlalchemy import text
9
+ from sqlalchemy.engine import Engine
10
+ from sqlalchemy.engine import RowMapping
11
+ from sqlalchemy.exc import IntegrityError
12
+
13
+ from rememberstack.model import ComponentVersionConflictError
14
+ from rememberstack.model import ComponentVersionError
15
+ from rememberstack.model import ComponentVersionNotFoundError
16
+ from rememberstack.model import ComponentVersionRecord
17
+ from rememberstack.model import PipelineComponent
18
+ from rememberstack.model import RegisterComponentVersionInput
19
+ from rememberstack.model import RegisterComponentVersionResult
20
+
21
+ _INSERT_COMPONENT_VERSION = text(
22
+ """
23
+ INSERT INTO pipeline_component_versions (
24
+ deployment_id,
25
+ component,
26
+ version,
27
+ model_name,
28
+ prompt_hash,
29
+ embedding_dim,
30
+ params,
31
+ notes
32
+ ) VALUES (
33
+ :deployment_id,
34
+ :component,
35
+ :version,
36
+ :model_name,
37
+ :prompt_hash,
38
+ :embedding_dim,
39
+ :params,
40
+ :notes
41
+ )
42
+ ON CONFLICT (deployment_id, component, version) DO NOTHING
43
+ RETURNING deployment_id
44
+ """
45
+ ).bindparams(bindparam("params", type_=JSON))
46
+
47
+ _SELECT_COMPONENT_VERSION = """
48
+ SELECT
49
+ deployment_id,
50
+ component,
51
+ version,
52
+ model_name,
53
+ prompt_hash,
54
+ embedding_dim,
55
+ params,
56
+ notes,
57
+ configured_at
58
+ FROM pipeline_component_versions
59
+ WHERE deployment_id = :deployment_id
60
+ AND component = :component
61
+ AND version = :version
62
+ """
63
+
64
+
65
+ class ComponentVersionRegistrar:
66
+ """Register and resolve immutable component versions through an injected engine."""
67
+
68
+ def __init__(self, *, engine: Engine) -> None:
69
+ """Bind catalog operations to an explicitly composed SQLAlchemy engine."""
70
+ self._engine = engine
71
+
72
+ def register_component_version(
73
+ self, *, component_version_input: RegisterComponentVersionInput
74
+ ) -> RegisterComponentVersionResult:
75
+ """Compare or insert one component definition in one owned transaction."""
76
+ try:
77
+ with self._engine.begin() as connection:
78
+ values = _component_version_values(
79
+ component_version_input=component_version_input
80
+ )
81
+ inserted = connection.execute(
82
+ statement=_INSERT_COMPONENT_VERSION, parameters=values
83
+ ).scalar_one_or_none()
84
+ if inserted is not None:
85
+ return _registration_result(
86
+ component_version_input=component_version_input, created=True
87
+ )
88
+
89
+ existing = (
90
+ connection.execute(
91
+ statement=text(f"{_SELECT_COMPONENT_VERSION} FOR UPDATE"),
92
+ parameters=_component_version_key(
93
+ deployment_id=component_version_input.deployment_id,
94
+ component=component_version_input.component,
95
+ version=component_version_input.version,
96
+ ),
97
+ )
98
+ .mappings()
99
+ .one_or_none()
100
+ )
101
+ if existing is None:
102
+ raise ComponentVersionError(
103
+ "component version disappeared during registration"
104
+ )
105
+ if _stored_definition(row=existing) != _input_definition(
106
+ component_version_input=component_version_input
107
+ ):
108
+ raise ComponentVersionConflictError(
109
+ "component-version definition conflicts with the registered key"
110
+ )
111
+ return _registration_result(
112
+ component_version_input=component_version_input, created=False
113
+ )
114
+ except IntegrityError as error:
115
+ if getattr(error.orig, "sqlstate", None) == "23503":
116
+ raise ComponentVersionError(
117
+ "deployment_id does not reference a registered deployment"
118
+ ) from error
119
+ raise
120
+
121
+ def resolve_component_version(
122
+ self, *, deployment_id: UUID, component: PipelineComponent, version: str
123
+ ) -> ComponentVersionRecord:
124
+ """Resolve one component definition by its complete primary-key triple."""
125
+ with self._engine.connect() as connection:
126
+ row = (
127
+ connection.execute(
128
+ statement=text(_SELECT_COMPONENT_VERSION),
129
+ parameters=_component_version_key(
130
+ deployment_id=deployment_id,
131
+ component=component,
132
+ version=version,
133
+ ),
134
+ )
135
+ .mappings()
136
+ .one_or_none()
137
+ )
138
+ if row is None:
139
+ raise ComponentVersionNotFoundError(
140
+ "component version does not exist for the requested key"
141
+ )
142
+ return ComponentVersionRecord.model_validate(dict(row))
143
+
144
+
145
+ def _component_version_key(
146
+ *, deployment_id: UUID, component: PipelineComponent, version: str
147
+ ) -> dict[str, object]:
148
+ """Map the complete schema primary key to bound SQL values."""
149
+ return {
150
+ "deployment_id": deployment_id,
151
+ "component": component.value,
152
+ "version": version,
153
+ }
154
+
155
+
156
+ def _component_version_values(
157
+ *, component_version_input: RegisterComponentVersionInput
158
+ ) -> dict[str, object]:
159
+ """Map every explicit input to its corresponding catalog column."""
160
+ return {
161
+ **_component_version_key(
162
+ deployment_id=component_version_input.deployment_id,
163
+ component=component_version_input.component,
164
+ version=component_version_input.version,
165
+ ),
166
+ **_input_definition(component_version_input=component_version_input),
167
+ }
168
+
169
+
170
+ def _input_definition(
171
+ *, component_version_input: RegisterComponentVersionInput
172
+ ) -> dict[str, object]:
173
+ """Canonicalize the complete immutable input definition for comparison."""
174
+ return {
175
+ "model_name": component_version_input.model_name,
176
+ "prompt_hash": component_version_input.prompt_hash,
177
+ "embedding_dim": component_version_input.embedding_dim,
178
+ "params": dict(component_version_input.params),
179
+ "notes": component_version_input.notes,
180
+ }
181
+
182
+
183
+ def _stored_definition(*, row: RowMapping) -> dict[str, object]:
184
+ """Canonicalize stored definition fields with semantic JSON-map equality."""
185
+ params = row["params"]
186
+ if not isinstance(params, Mapping):
187
+ raise ComponentVersionError(
188
+ "stored component-version params are not a JSON object"
189
+ )
190
+ return {
191
+ "model_name": row["model_name"],
192
+ "prompt_hash": row["prompt_hash"],
193
+ "embedding_dim": row["embedding_dim"],
194
+ "params": dict(params),
195
+ "notes": row["notes"],
196
+ }
197
+
198
+
199
+ def _registration_result(
200
+ *, component_version_input: RegisterComponentVersionInput, created: bool
201
+ ) -> RegisterComponentVersionResult:
202
+ """Build the exact settled registration result shape."""
203
+ return RegisterComponentVersionResult(
204
+ deployment_id=component_version_input.deployment_id,
205
+ component=component_version_input.component,
206
+ version=component_version_input.version,
207
+ created=created,
208
+ )
@@ -0,0 +1,81 @@
1
+ """Postgres read model for deployment-rendered consumption skills."""
2
+
3
+ from uuid import UUID
4
+
5
+ from sqlalchemy import text
6
+ from sqlalchemy.engine import Engine
7
+
8
+ from rememberstack.model import ConsumptionDeployment
9
+ from rememberstack.model import ConsumptionScope
10
+
11
+
12
+ class ConsumptionDeploymentNotFoundError(LookupError):
13
+ """The requested active deployment does not exist in this spine."""
14
+
15
+
16
+ class ConsumptionCatalog:
17
+ """Read the deployment, scopes, and K availability needed by the skill."""
18
+
19
+ def __init__(self, *, engine: Engine) -> None:
20
+ """Bind the catalog to the Postgres spine."""
21
+ self._engine = engine
22
+
23
+ def deployment(self, *, deployment_id: UUID) -> ConsumptionDeployment:
24
+ """Return one active deployment's complete skill-facing read model."""
25
+ with self._engine.connect() as connection:
26
+ deployment = (
27
+ connection.execute(_SELECT_DEPLOYMENT, {"deployment_id": deployment_id})
28
+ .mappings()
29
+ .one_or_none()
30
+ )
31
+ if deployment is None:
32
+ raise ConsumptionDeploymentNotFoundError(str(deployment_id))
33
+ scopes = tuple(
34
+ ConsumptionScope(
35
+ slug=str(row["slug"]),
36
+ name=str(row["name"]),
37
+ description=row["description"],
38
+ git_path=row["git_path"],
39
+ )
40
+ for row in connection.execute(
41
+ _SELECT_SCOPES, {"deployment_id": deployment_id}
42
+ ).mappings()
43
+ )
44
+ knowledge_page_count = connection.execute(
45
+ _COUNT_KNOWLEDGE_PAGES, {"deployment_id": deployment_id}
46
+ ).scalar_one()
47
+ return ConsumptionDeployment(
48
+ deployment_id=deployment["deployment_id"],
49
+ slug=str(deployment["slug"]),
50
+ name=str(deployment["name"]),
51
+ description=deployment["description"],
52
+ default_language=str(deployment["default_language"]),
53
+ scopes=scopes,
54
+ knowledge_page_count=knowledge_page_count,
55
+ )
56
+
57
+
58
+ _SELECT_DEPLOYMENT = text(
59
+ """
60
+ SELECT deployment_id, slug, name, description, default_language
61
+ FROM deployments
62
+ WHERE deployment_id = :deployment_id AND status = 'active'
63
+ """
64
+ )
65
+
66
+ _SELECT_SCOPES = text(
67
+ """
68
+ SELECT slug, name, description, git_path
69
+ FROM scopes
70
+ WHERE deployment_id = :deployment_id
71
+ ORDER BY slug
72
+ """
73
+ )
74
+
75
+ _COUNT_KNOWLEDGE_PAGES = text(
76
+ """
77
+ SELECT count(*)
78
+ FROM knowledge_artifacts
79
+ WHERE deployment_id = :deployment_id AND status <> 'tombstoned'
80
+ """
81
+ )