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.
- rememberstack/__init__.py +9 -0
- rememberstack/adapters/__init__.py +42 -0
- rememberstack/adapters/codex_writer.py +221 -0
- rememberstack/adapters/markitdown_converter.py +42 -0
- rememberstack/adapters/openrouter.py +136 -0
- rememberstack/adapters/selfhost/__init__.py +54 -0
- rememberstack/adapters/selfhost/forget.py +66 -0
- rememberstack/adapters/selfhost/git.py +374 -0
- rememberstack/adapters/selfhost/lance.py +328 -0
- rememberstack/adapters/selfhost/minio.py +279 -0
- rememberstack/adapters/selfhost/mounts.py +249 -0
- rememberstack/adapters/selfhost/object_store.py +130 -0
- rememberstack/adapters/selfhost/projection.py +80 -0
- rememberstack/adapters/selfhost/queue.py +137 -0
- rememberstack/adapters/selfhost/telemetry.py +45 -0
- rememberstack/adapters/selfhost/watcher.py +70 -0
- rememberstack/adapters/testing/__init__.py +15 -0
- rememberstack/adapters/testing/cost_meter.py +13 -0
- rememberstack/adapters/testing/model_provider.py +83 -0
- rememberstack/adapters/testing/queue.py +43 -0
- rememberstack/adapters/testing/telemetry.py +22 -0
- rememberstack/client.py +19 -0
- rememberstack/core/__init__.py +127 -0
- rememberstack/core/blockizer.py +189 -0
- rememberstack/core/chunker.py +216 -0
- rememberstack/core/consumption_skill.py +275 -0
- rememberstack/core/conversion.py +76 -0
- rememberstack/core/core_manifest.py +598 -0
- rememberstack/core/extension_packs.py +124 -0
- rememberstack/core/forget.py +17 -0
- rememberstack/core/knowledge_authored.py +276 -0
- rememberstack/core/knowledge_compile.py +215 -0
- rememberstack/core/knowledge_fact_sheet.py +210 -0
- rememberstack/core/knowledge_hashing.py +68 -0
- rememberstack/core/knowledge_planner.py +64 -0
- rememberstack/core/knowledge_writer.py +175 -0
- rememberstack/core/ranking.py +200 -0
- rememberstack/core/recipe_linter.py +149 -0
- rememberstack/core/section_snap.py +209 -0
- rememberstack/core/storage_routing.py +27 -0
- rememberstack/eval/__init__.py +53 -0
- rememberstack/eval/consumption.py +141 -0
- rememberstack/eval/contradiction.py +184 -0
- rememberstack/eval/harness.py +136 -0
- rememberstack/eval/lifecycle.py +400 -0
- rememberstack/eval/operational_scale.py +49 -0
- rememberstack/eval/resolution.py +255 -0
- rememberstack/eval/retrieval_spikes.py +50 -0
- rememberstack/eval/skeleton.py +231 -0
- rememberstack/llm/__init__.py +1 -0
- rememberstack/model/__init__.py +589 -0
- rememberstack/model/adjudication.py +100 -0
- rememberstack/model/auth.py +27 -0
- rememberstack/model/blocks.py +30 -0
- rememberstack/model/chunks.py +190 -0
- rememberstack/model/claims.py +162 -0
- rememberstack/model/client.py +98 -0
- rememberstack/model/clustering.py +54 -0
- rememberstack/model/component_version.py +124 -0
- rememberstack/model/consumption.py +88 -0
- rememberstack/model/conversion.py +31 -0
- rememberstack/model/deployment.py +53 -0
- rememberstack/model/documents.py +168 -0
- rememberstack/model/envelope.py +513 -0
- rememberstack/model/evaluation.py +72 -0
- rememberstack/model/forget.py +143 -0
- rememberstack/model/git.py +13 -0
- rememberstack/model/knowledge.py +840 -0
- rememberstack/model/knowledge_authored.py +325 -0
- rememberstack/model/knowledge_planner.py +431 -0
- rememberstack/model/lifecycle.py +42 -0
- rememberstack/model/model_provider.py +78 -0
- rememberstack/model/mounts.py +24 -0
- rememberstack/model/object_store.py +21 -0
- rememberstack/model/operational_scale.py +59 -0
- rememberstack/model/operations.py +153 -0
- rememberstack/model/processing.py +228 -0
- rememberstack/model/queue.py +73 -0
- rememberstack/model/recipes.py +83 -0
- rememberstack/model/relations.py +79 -0
- rememberstack/model/resolution.py +83 -0
- rememberstack/model/retrieval_spikes.py +62 -0
- rememberstack/model/sections.py +120 -0
- rememberstack/model/telemetry.py +30 -0
- rememberstack/ports/__init__.py +29 -0
- rememberstack/ports/auth.py +16 -0
- rememberstack/ports/connector.py +23 -0
- rememberstack/ports/cost_meter.py +17 -0
- rememberstack/ports/forget.py +20 -0
- rememberstack/ports/git.py +20 -0
- rememberstack/ports/model_provider.py +28 -0
- rememberstack/ports/mounts.py +16 -0
- rememberstack/ports/object_store.py +27 -0
- rememberstack/ports/p1_index.py +92 -0
- rememberstack/ports/purge.py +93 -0
- rememberstack/ports/queue.py +23 -0
- rememberstack/ports/telemetry.py +21 -0
- rememberstack/profiles/__init__.py +22 -0
- rememberstack/profiles/selfhost.py +324 -0
- rememberstack/profiles/selfhost_forget.py +158 -0
- rememberstack/profiles/selfhost_operations.py +95 -0
- rememberstack/py.typed +1 -0
- rememberstack/spine/__init__.py +93 -0
- rememberstack/spine/admission.py +26 -0
- rememberstack/spine/backfill.py +168 -0
- rememberstack/spine/catalog_contract.py +742 -0
- rememberstack/spine/chunk_catalog.py +237 -0
- rememberstack/spine/claim_catalog.py +298 -0
- rememberstack/spine/clustering.py +740 -0
- rememberstack/spine/component_versions.py +208 -0
- rememberstack/spine/consumption.py +81 -0
- rememberstack/spine/deployment_bootstrap.py +445 -0
- rememberstack/spine/document_catalog.py +621 -0
- rememberstack/spine/entity_registry.py +205 -0
- rememberstack/spine/extension_packs.py +220 -0
- rememberstack/spine/fact_catalog.py +571 -0
- rememberstack/spine/forget.py +1753 -0
- rememberstack/spine/knowledge.py +5467 -0
- rememberstack/spine/lifecycle.py +1071 -0
- rememberstack/spine/migrations/__init__.py +1 -0
- rememberstack/spine/migrations/_helpers.py +153 -0
- rememberstack/spine/migrations/env.py +58 -0
- rememberstack/spine/migrations/script.py.mako +27 -0
- rememberstack/spine/migrations/versions/__init__.py +1 -0
- rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py +189 -0
- rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py +321 -0
- rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py +631 -0
- rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py +411 -0
- rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py +391 -0
- rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py +158 -0
- rememberstack/spine/migrations/versions/p2_06_0007_invalidated_outcome.py +26 -0
- rememberstack/spine/migrations/versions/p3_01_0008_document_version_target.py +58 -0
- rememberstack/spine/migrations/versions/p3_05_0009_reconcile_stage.py +27 -0
- rememberstack/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py +25 -0
- rememberstack/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py +57 -0
- rememberstack/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py +58 -0
- rememberstack/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py +46 -0
- rememberstack/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py +217 -0
- rememberstack/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py +38 -0
- rememberstack/spine/migrations/versions/p7_02_0016_operational_eval_suite.py +19 -0
- rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py +55 -0
- rememberstack/spine/observation_adjudication.py +778 -0
- rememberstack/spine/operations.py +298 -0
- rememberstack/spine/projection.py +662 -0
- rememberstack/spine/recipes.py +276 -0
- rememberstack/spine/resolver.py +763 -0
- rememberstack/spine/review.py +650 -0
- rememberstack/spine/settings.py +22 -0
- rememberstack/spine/supersession.py +510 -0
- rememberstack/spine/sync.py +128 -0
- rememberstack/spine/work_ledger.py +816 -0
- rememberstack/surfaces/__init__.py +110 -0
- rememberstack/surfaces/cli.py +447 -0
- rememberstack/surfaces/consumption_skill.py +87 -0
- rememberstack/surfaces/graph_queries.py +698 -0
- rememberstack/surfaces/http_api.py +377 -0
- rememberstack/surfaces/mcp.py +67 -0
- rememberstack/surfaces/query_engine.py +1591 -0
- rememberstack/surfaces/recipe_executor.py +185 -0
- rememberstack/surfaces/recipe_surface.py +219 -0
- rememberstack/surfaces/remote_mcp.py +133 -0
- rememberstack/surfaces/sdk.py +324 -0
- rememberstack/workers/__init__.py +155 -0
- rememberstack/workers/base.py +312 -0
- rememberstack/workers/e0.py +577 -0
- rememberstack/workers/e1.py +425 -0
- rememberstack/workers/e2.py +525 -0
- rememberstack/workers/e3.py +434 -0
- rememberstack/workers/forget.py +299 -0
- rememberstack/workers/knowledge_authored.py +146 -0
- rememberstack/workers/knowledge_driver.py +735 -0
- rememberstack/workers/knowledge_fact_sheet.py +123 -0
- rememberstack/workers/knowledge_planner.py +325 -0
- rememberstack/workers/knowledge_writer.py +393 -0
- rememberstack/workers/operations.py +42 -0
- rememberstack/workers/p1.py +234 -0
- rememberstack/workers/p2.py +513 -0
- rememberstack/workers/p2_analytics.py +276 -0
- rememberstack/workers/p3.py +673 -0
- rememberstack/workers/reconcile.py +485 -0
- rememberstack/workers/sync.py +168 -0
- rememberstack-0.1.0.dist-info/METADATA +213 -0
- rememberstack-0.1.0.dist-info/RECORD +186 -0
- rememberstack-0.1.0.dist-info/WHEEL +4 -0
- rememberstack-0.1.0.dist-info/entry_points.txt +2 -0
- 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
|
+
)
|