topos-node 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.
- shared/__init__.py +59 -0
- shared/filtering.py +640 -0
- shared/schema_registry.py +229 -0
- topos/__init__.py +5 -0
- topos/__version__.py +6 -0
- topos/analytics/__init__.py +15 -0
- topos/analytics/duckdb_adapter.py +48 -0
- topos/analytics/messenger_communities.py +349 -0
- topos/analytics/messenger_graph.py +522 -0
- topos/analytics/messenger_labels.py +321 -0
- topos/analytics/profiles.py +22 -0
- topos/analytics/query_engine.py +64 -0
- topos/analytics/raw_queries.py +174 -0
- topos/api/__init__.py +1 -0
- topos/api/analytics.py +52 -0
- topos/api/app_registry.py +31 -0
- topos/api/backup.py +15 -0
- topos/api/compute_remote.py +175 -0
- topos/api/data_commit.py +158 -0
- topos/api/data_explorer_table_prefs.py +81 -0
- topos/api/db.py +10 -0
- topos/api/device.py +25 -0
- topos/api/enrichment.py +959 -0
- topos/api/filter_lab.py +195 -0
- topos/api/health.py +61 -0
- topos/api/ingestion_api.py +37 -0
- topos/api/ingestion_compat.py +21 -0
- topos/api/ingestion_sources.py +600 -0
- topos/api/llm.py +76 -0
- topos/api/local_mcp.py +46 -0
- topos/api/messenger_analytics.py +385 -0
- topos/api/query_api.py +13 -0
- topos/api/sanitization_ollama_config.py +64 -0
- topos/api/source_install.py +324 -0
- topos/api/sources.py +13 -0
- topos/api/sync.py +10 -0
- topos/api/ui_config.py +83 -0
- topos/api/uma_data.py +311 -0
- topos/api/usage.py +49 -0
- topos/api/user_identity.py +46 -0
- topos/app.py +239 -0
- topos/auth.py +17 -0
- topos/canonicalization/__init__.py +1 -0
- topos/canonicalization/mappers/__init__.py +22 -0
- topos/canonicalization/mappers/base.py +26 -0
- topos/canonicalization/mappers/chatgpt_mapper.py +40 -0
- topos/canonicalization/mappers/grok_mapper.py +17 -0
- topos/canonicalization/mappers/messenger_mapper.py +58 -0
- topos/canonicalization/models.py +31 -0
- topos/canonicalization/resolver.py +23 -0
- topos/cli/__init__.py +1 -0
- topos/cli/__main__.py +6 -0
- topos/cli/commands.py +132 -0
- topos/config/__init__.py +1 -0
- topos/config/sanitization_ollama.py +189 -0
- topos/config/settings.py +310 -0
- topos/contacts/__init__.py +5 -0
- topos/contacts/identity.py +24 -0
- topos/control_plane_client.py +300 -0
- topos/core/__init__.py +1 -0
- topos/core/api_models.py +128 -0
- topos/core/connection_resilience.py +99 -0
- topos/core/device_helpers.py +8 -0
- topos/core/errors.py +13 -0
- topos/core/events.py +12 -0
- topos/core/handlers.py +5625 -0
- topos/core/logging.py +175 -0
- topos/core/metrics.py +21 -0
- topos/core/startup_banner.py +62 -0
- topos/core/state.py +682 -0
- topos/core/table_layers.py +45 -0
- topos/core/types.py +13 -0
- topos/data_explorer_table_prefs.py +150 -0
- topos/engine/__init__.py +29 -0
- topos/engine/backends/__init__.py +50 -0
- topos/engine/backends/base.py +21 -0
- topos/engine/backends/huggingface.py +151 -0
- topos/engine/backends/ollama.py +181 -0
- topos/engine/backends/stub.py +22 -0
- topos/engine/engine.py +165 -0
- topos/engine/intake.py +32 -0
- topos/engine/queue_manager.py +112 -0
- topos/engine/registration.py +126 -0
- topos/engine/result_formatter.py +38 -0
- topos/engine/router.py +19 -0
- topos/engine/scoped_token.py +82 -0
- topos/engine/tasks.py +154 -0
- topos/engine/transport.py +44 -0
- topos/engine/usage_guard.py +100 -0
- topos/engine/usage_observation.py +129 -0
- topos/engine/validator.py +23 -0
- topos/enrichment/__init__.py +1 -0
- topos/enrichment/derived_tables.py +214 -0
- topos/enrichment/jobs/__init__.py +30 -0
- topos/enrichment/jobs/base.py +54 -0
- topos/enrichment/jobs/canonical/__init__.py +1 -0
- topos/enrichment/jobs/canonical/embeddings_job.py +27 -0
- topos/enrichment/jobs/canonical/emo_27_job.py +97 -0
- topos/enrichment/jobs/canonical/entities_job.py +27 -0
- topos/enrichment/jobs/canonical/sentiment_job.py +27 -0
- topos/enrichment/jobs/canonical/topics_job.py +27 -0
- topos/enrichment/jobs/raw/__init__.py +1 -0
- topos/enrichment/jobs/raw/attachments_job.py +12 -0
- topos/enrichment/jobs/raw/language_job.py +12 -0
- topos/enrichment/jobs/raw/time_normalization_job.py +12 -0
- topos/enrichment/jobs/raw/tool_calls_job.py +12 -0
- topos/enrichment/models/__init__.py +1 -0
- topos/enrichment/models/manager.py +8 -0
- topos/enrichment/models/registry.py +71 -0
- topos/enrichment/models/versioning.py +8 -0
- topos/enrichment/orchestrator.py +177 -0
- topos/enrichment/processor.py +17 -0
- topos/enrichment/progress_bar.py +122 -0
- topos/enrichment/website_classifier.py +31 -0
- topos/filter_lab/__init__.py +1 -0
- topos/filter_lab/bundles.py +300 -0
- topos/filter_lab/schema.py +86 -0
- topos/filter_lab/service.py +167 -0
- topos/filter_lab/store.py +374 -0
- topos/filter_lab/worker.py +250 -0
- topos/hosted_pool_lease.py +153 -0
- topos/ingestion/__init__.py +1 -0
- topos/ingestion/checkpoints/__init__.py +6 -0
- topos/ingestion/checkpoints/checkpoint_store.py +24 -0
- topos/ingestion/checkpoints/sqlite_checkpoint_store.py +82 -0
- topos/ingestion/ingest_helpers.py +504 -0
- topos/ingestion/jobs.py +91 -0
- topos/ingestion/local_sync.py +823 -0
- topos/ingestion/log_preview.py +21 -0
- topos/ingestion/manager.py +1100 -0
- topos/ingestion/parser.py +174 -0
- topos/ingestion/parsers/__init__.py +32 -0
- topos/ingestion/parsers/base.py +24 -0
- topos/ingestion/parsers/browser_parser.py +171 -0
- topos/ingestion/parsers/calendar_parser.py +21 -0
- topos/ingestion/parsers/chatgpt_conversation_flattener.py +266 -0
- topos/ingestion/parsers/chatgpt_parser.py +67 -0
- topos/ingestion/parsers/grok_parser.py +21 -0
- topos/ingestion/parsers/messenger_parser.py +97 -0
- topos/ingestion/progress.py +54 -0
- topos/ingestion/sources/__init__.py +20 -0
- topos/ingestion/sources/base.py +39 -0
- topos/ingestion/sources/calendar.py +29 -0
- topos/ingestion/sources/chatgpt.py +29 -0
- topos/ingestion/sources/contact_importers.py +274 -0
- topos/ingestion/sources/grok.py +29 -0
- topos/ingestion/sources/imessage_reader.py +479 -0
- topos/ingestion/sources/signal_export_parser.py +132 -0
- topos/ingestion/sources/signal_reader.py +491 -0
- topos/ingestion/state_machine.py +70 -0
- topos/ingestion/triggers/__init__.py +1 -0
- topos/ingestion/triggers/file_trigger.py +36 -0
- topos/ingestion/triggers/sqlite_trigger.py +18 -0
- topos/ingestion/validation/__init__.py +1 -0
- topos/ingestion/validation/base.py +27 -0
- topos/ingestion/validation/schema_registry.py +111 -0
- topos/ingestion/validation/schema_validator.py +13 -0
- topos/lineage/__init__.py +1 -0
- topos/lineage/provenance.py +9 -0
- topos/lineage/tracker.py +9 -0
- topos/mcp_stdio_proxy.py +83 -0
- topos/observability/__init__.py +1 -0
- topos/observability/alerts.py +7 -0
- topos/observability/metrics.py +25 -0
- topos/observability/tracing.py +18 -0
- topos/openai_client.py +69 -0
- topos/projections/__init__.py +1 -0
- topos/projections/vector_index/__init__.py +1 -0
- topos/projections/vector_index/base.py +21 -0
- topos/projections/vector_index/builders.py +11 -0
- topos/projections/vector_index/health_checks.py +5 -0
- topos/rate_limit.py +43 -0
- topos/sanitization/__init__.py +16 -0
- topos/sanitization/ollama_transforms.py +276 -0
- topos/scope_resolution.py +89 -0
- topos/services/__init__.py +1 -0
- topos/services/container.py +46 -0
- topos/services/embeddings/__init__.py +1 -0
- topos/services/embeddings/base.py +7 -0
- topos/services/embeddings/local.py +9 -0
- topos/services/embeddings/remote.py +9 -0
- topos/services/interfaces.py +40 -0
- topos/services/llm/__init__.py +1 -0
- topos/services/llm/base.py +7 -0
- topos/services/llm/openai.py +126 -0
- topos/services/local.py +123 -0
- topos/services/postgres.py +385 -0
- topos/sources/__init__.py +6 -0
- topos/sources/definitions.py +114 -0
- topos/sources/install_service.py +836 -0
- topos/sources/registry.py +263 -0
- topos/sources/runtime_install.py +427 -0
- topos/storage/__init__.py +1 -0
- topos/storage/canonical/__init__.py +18 -0
- topos/storage/canonical/ai_chat/__init__.py +22 -0
- topos/storage/canonical/ai_chat/canonicalizer.py +147 -0
- topos/storage/canonical/ai_chat/mapper.py +168 -0
- topos/storage/canonical/ai_chat/model.py +87 -0
- topos/storage/canonical/ai_chat/tables.py +179 -0
- topos/storage/canonical/canonical_store.py +24 -0
- topos/storage/canonical/conversations_tables.py +1020 -0
- topos/storage/canonical/mapping_store.py +30 -0
- topos/storage/canonical/postgres.py +10 -0
- topos/storage/db/__init__.py +1 -0
- topos/storage/db/client.py +8 -0
- topos/storage/db/migrations/__init__.py +1 -0
- topos/storage/db/migrations/stage9_column_renames.py +78 -0
- topos/storage/db/paths.py +122 -0
- topos/storage/db/postgres.py +240 -0
- topos/storage/db/schema.py +6 -0
- topos/storage/enrichment/__init__.py +1 -0
- topos/storage/enrichment/canonical_enrichment_store.py +7 -0
- topos/storage/enrichment/raw_enrichment_store.py +18 -0
- topos/storage/normalized/__init__.py +1 -0
- topos/storage/normalized/normalized_store.py +24 -0
- topos/storage/oplog/__init__.py +1 -0
- topos/storage/oplog/decision.py +6 -0
- topos/storage/oplog/oplog_store.py +17 -0
- topos/storage/oplog/postgres.py +10 -0
- topos/storage/projections/__init__.py +1 -0
- topos/storage/projections/index_ops_store.py +6 -0
- topos/storage/projections/vector_index_store.py +6 -0
- topos/storage/raw/__init__.py +1 -0
- topos/storage/raw/browser_flat_tables.py +303 -0
- topos/storage/raw/file_store.py +100 -0
- topos/storage/raw/raw_store.py +29 -0
- topos/storage/raw/raw_tables_manager.py +295 -0
- topos/storage/raw/sqlite_raw_store.py +17 -0
- topos/storage/security/encryption.py +21 -0
- topos/storage/signal_identity.py +71 -0
- topos/storage/source_settings.py +116 -0
- topos/storage/user_identity.py +69 -0
- topos/sync/__init__.py +5 -0
- topos/sync/client.py +272 -0
- topos/sync_handlers.py +70 -0
- topos/testing/__init__.py +1 -0
- topos/testing/lifespan.py +7 -0
- topos/uma_contact_enrichment.py +1032 -0
- topos/uma_filters.py +669 -0
- topos/uma_resource_id.py +24 -0
- topos/uma_rpt.py +69 -0
- topos/utils/base_object.py +61 -0
- topos/websocket_client.py +21 -0
- topos_node-0.1.0.dist-info/METADATA +199 -0
- topos_node-0.1.0.dist-info/RECORD +249 -0
- topos_node-0.1.0.dist-info/WHEEL +5 -0
- topos_node-0.1.0.dist-info/entry_points.txt +2 -0
- topos_node-0.1.0.dist-info/licenses/LICENSE +201 -0
- topos_node-0.1.0.dist-info/top_level.txt +2 -0
topos/uma_rpt.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Topos UMA RPT validation: call Control Plane introspect_for_resource
|
|
2
|
+
# US-3.7: RPT validation for topos.cli (engine deprecated)
|
|
3
|
+
# See: control_plane/uma/uma_sprints/SPRINT_3_USER_SHARING.md
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Any, Dict, Optional
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
|
|
12
|
+
from .config.settings import settings
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger("topos.uma_rpt")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_control_plane_http_base() -> Optional[str]:
|
|
18
|
+
"""Control Plane HTTP base URL for REST (introspect). Derives from TOPOS_CONTROL_PLANE_URL if ws/wss."""
|
|
19
|
+
base = settings.topos_control_plane_url
|
|
20
|
+
if not base:
|
|
21
|
+
return None
|
|
22
|
+
base = base.strip()
|
|
23
|
+
if base.startswith("wss://"):
|
|
24
|
+
base = base.replace("wss://", "https://", 1)
|
|
25
|
+
elif base.startswith("ws://"):
|
|
26
|
+
base = base.replace("ws://", "http://", 1)
|
|
27
|
+
if "/ws/" in base:
|
|
28
|
+
base = base.split("/ws/")[0]
|
|
29
|
+
return base.rstrip("/") or None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
async def introspect_for_resource(
|
|
33
|
+
resource_id: str,
|
|
34
|
+
token: str,
|
|
35
|
+
*,
|
|
36
|
+
control_plane_base: Optional[str] = None,
|
|
37
|
+
timeout: float = 10.0,
|
|
38
|
+
) -> Dict[str, Any]:
|
|
39
|
+
"""
|
|
40
|
+
Call Control Plane POST /v1/uma/introspect_for_resource. Returns enriched
|
|
41
|
+
introspection (allowed_scopes, filters) or raises.
|
|
42
|
+
"""
|
|
43
|
+
base = control_plane_base or get_control_plane_http_base()
|
|
44
|
+
if not base:
|
|
45
|
+
raise ValueError("Control Plane URL not configured; set TOPOS_CONTROL_PLANE_URL")
|
|
46
|
+
url = f"{base}/v1/uma/introspect_for_resource"
|
|
47
|
+
payload = {"token": token, "resource_id": resource_id}
|
|
48
|
+
async with httpx.AsyncClient(timeout=timeout) as client:
|
|
49
|
+
resp = await client.post(url, json=payload)
|
|
50
|
+
if resp.status_code == 401:
|
|
51
|
+
raise RPTValidationError("Token inactive or expired", status_code=401)
|
|
52
|
+
if resp.status_code == 403:
|
|
53
|
+
raise RPTValidationError("RPT does not grant access to this resource", status_code=403)
|
|
54
|
+
if resp.status_code == 404:
|
|
55
|
+
raise RPTValidationError("Resource not found", status_code=404)
|
|
56
|
+
if resp.status_code >= 400:
|
|
57
|
+
raise RPTValidationError(
|
|
58
|
+
resp.text or f"Introspection failed: {resp.status_code}",
|
|
59
|
+
status_code=resp.status_code,
|
|
60
|
+
)
|
|
61
|
+
return resp.json()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class RPTValidationError(Exception):
|
|
65
|
+
"""RPT validation failed (introspect_for_resource returned error)."""
|
|
66
|
+
|
|
67
|
+
def __init__(self, message: str, status_code: int = 401):
|
|
68
|
+
super().__init__(message)
|
|
69
|
+
self.status_code = status_code
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Base object with auto-generated instance names for better logging.
|
|
2
|
+
|
|
3
|
+
Inspired by Pipecat's BaseObject pattern, which provides automatic
|
|
4
|
+
instance naming like `ClassName#N` for cleaner logs.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections import defaultdict
|
|
10
|
+
from itertools import count
|
|
11
|
+
from threading import Lock
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
_class_counters: dict[type, count] = defaultdict(lambda: count(1))
|
|
15
|
+
_lock = Lock()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _next_instance_number(cls: type) -> int:
|
|
19
|
+
"""Get the next instance number for a class (thread-safe)."""
|
|
20
|
+
with _lock:
|
|
21
|
+
return next(_class_counters[cls])
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class BaseObject:
|
|
25
|
+
"""Base class that provides auto-generated instance names.
|
|
26
|
+
|
|
27
|
+
Each instance gets a unique name like `ClassName#N` which is used
|
|
28
|
+
in `__str__` for cleaner logging. This allows logs like:
|
|
29
|
+
|
|
30
|
+
logger.debug(f"{self}: processing messages")
|
|
31
|
+
# Output: "EnrichmentOrchestrator#1: processing messages"
|
|
32
|
+
|
|
33
|
+
You can optionally provide a custom name:
|
|
34
|
+
|
|
35
|
+
obj = MyClass(name="custom-name")
|
|
36
|
+
str(obj) # "custom-name"
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, *, name: Optional[str] = None) -> None:
|
|
40
|
+
"""Initialize with optional custom name.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
name: Optional custom name. If None, auto-generates `ClassName#N`
|
|
44
|
+
"""
|
|
45
|
+
if name is None:
|
|
46
|
+
n = _next_instance_number(self.__class__)
|
|
47
|
+
name = f"{self.__class__.__name__}#{n}"
|
|
48
|
+
self._name = name
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def name(self) -> str:
|
|
52
|
+
"""Get the instance name."""
|
|
53
|
+
return self._name
|
|
54
|
+
|
|
55
|
+
def __str__(self) -> str:
|
|
56
|
+
"""Return the instance name for logging."""
|
|
57
|
+
return self.name
|
|
58
|
+
|
|
59
|
+
def __repr__(self) -> str:
|
|
60
|
+
"""Return a representation including the name."""
|
|
61
|
+
return f"<{self.__class__.__name__}(name={self.name!r})>"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger("topos.websocket_client")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CloudWebSocketClient:
|
|
11
|
+
def __init__(self, api_key: Optional[str] = None):
|
|
12
|
+
self.api_key = api_key
|
|
13
|
+
self._task: Optional[asyncio.Task] = None
|
|
14
|
+
|
|
15
|
+
def start(self) -> None:
|
|
16
|
+
if self._task and not self._task.done():
|
|
17
|
+
return
|
|
18
|
+
self._task = asyncio.create_task(self._run())
|
|
19
|
+
|
|
20
|
+
async def _run(self) -> None:
|
|
21
|
+
await asyncio.sleep(0)
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: topos-node
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
Project-URL: Homepage, https://topos.dialogues.ai
|
|
7
|
+
Project-URL: Source, https://dialogues.ai
|
|
8
|
+
Requires-Python: >=3.10
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: fastapi>=0.110
|
|
12
|
+
Requires-Dist: uvicorn[standard]>=0.29
|
|
13
|
+
Requires-Dist: httpx>=0.27
|
|
14
|
+
Requires-Dist: pydantic>=2.8
|
|
15
|
+
Requires-Dist: pydantic-settings>=2.2
|
|
16
|
+
Requires-Dist: websockets>=12.0
|
|
17
|
+
Requires-Dist: certifi>=2024.2.2
|
|
18
|
+
Requires-Dist: cryptography>=42.0.0
|
|
19
|
+
Requires-Dist: python-multipart>=0.0.6
|
|
20
|
+
Requires-Dist: click>=8.1.0
|
|
21
|
+
Requires-Dist: packaging>=23.0
|
|
22
|
+
Requires-Dist: mcp>=1.0
|
|
23
|
+
Requires-Dist: google-cloud-storage>=3.8.0
|
|
24
|
+
Requires-Dist: google-cloud-run>=0.14.0
|
|
25
|
+
Requires-Dist: networkx>=3.2.1
|
|
26
|
+
Requires-Dist: python-louvain>=0.16
|
|
27
|
+
Requires-Dist: asgi-lifespan>=2.1
|
|
28
|
+
Provides-Extra: engine
|
|
29
|
+
Requires-Dist: duckdb>=1.0.0; extra == "engine"
|
|
30
|
+
Requires-Dist: torch>=2.8.0; extra == "engine"
|
|
31
|
+
Requires-Dist: transformers>=4.57.6; extra == "engine"
|
|
32
|
+
Requires-Dist: psycopg[binary]>=3.2.0; extra == "engine"
|
|
33
|
+
Provides-Extra: signal
|
|
34
|
+
Requires-Dist: pysqlcipher3>=1.0.0; extra == "signal"
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: pytest>=8.3; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
38
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
|
|
41
|
+
# Topos Node
|
|
42
|
+
|
|
43
|
+
<p align="center">
|
|
44
|
+
<img src="https://dialogues.ai/static/images/topos_logo.png" alt="Topos Logo" width="170" />
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
Topos Node is your personal AI node that runs on your own device.
|
|
48
|
+
It helps you process and organize your data locally, then connect to Topos and 3rd-party services with explicit user-controlled access.
|
|
49
|
+
|
|
50
|
+
- Product: [topos.dialogues.ai](https://topos.dialogues.ai)
|
|
51
|
+
- Company: [dialogues.ai](https://dialogues.ai)
|
|
52
|
+
- Topos Apps/Sources: [sheaf.dialogues.ai](https://sheaf.dialogues.ai)
|
|
53
|
+
|
|
54
|
+
## Why Topos Node
|
|
55
|
+
|
|
56
|
+
- Runs locally on your machine
|
|
57
|
+
- Keeps your node data under your control
|
|
58
|
+
- Supports source ingestion, local processing, and controlled sharing flows
|
|
59
|
+
- Installs as a single command-line tool via `uv`
|
|
60
|
+
|
|
61
|
+
## How Topos Works (in product terms)
|
|
62
|
+
|
|
63
|
+
Topos Node has two core parts that work together to give you control:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
Your Apps/Data -> Topos Database -> Topos Engine -> Safe Responses
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| Part | What it is | What it does for you |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| 🗂️ **Topos Database** | Your private memory layer on your device | Stores your records, keeps your history, and makes your personal context searchable |
|
|
72
|
+
| 🧠 **Topos Engine** | Your decision and processing layer | Understands requests, runs AI workflows, and returns the right answer based on your permissions |
|
|
73
|
+
|
|
74
|
+
### 🛡️ Cognitive Firewall (user control first)
|
|
75
|
+
|
|
76
|
+
The **Topos Engine** acts as a Cognitive Firewall: it helps ensure only the right information is used and shared.
|
|
77
|
+
|
|
78
|
+
| Cognitive Firewall principle | What that means in practice |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| 🔒 Permission-aware | Requests are evaluated against your access rules before data is returned |
|
|
81
|
+
| 🎯 Precision over data dumps | The engine is designed to return only what is needed, not your entire history |
|
|
82
|
+
| 👁️ Transparent behavior | Boundaries and limits are explicit so sharing stays understandable and controllable |
|
|
83
|
+
|
|
84
|
+
### 🤖 Core ML tools in the Engine
|
|
85
|
+
|
|
86
|
+
Topos Engine uses both local and model-hub paths so users can choose flexibility and control:
|
|
87
|
+
|
|
88
|
+
| ML tool | Role in the workflow | User-facing benefit |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| 🦙 **Ollama** | Local model execution path | Keep more processing on-device and reduce external dependency |
|
|
91
|
+
| 🤗 **Hugging Face** | Model and backend integration path | Access broad model capabilities for enrichment and analysis tasks |
|
|
92
|
+
|
|
93
|
+
### Why this split matters
|
|
94
|
+
|
|
95
|
+
- 🏠 Your data lives in one durable place (Database)
|
|
96
|
+
- ⚙️ Intelligence and policy decisions happen in a separate runtime (Engine)
|
|
97
|
+
- 🛡️ The Cognitive Firewall model helps protect context while still enabling useful AI actions
|
|
98
|
+
- 🔄 You can evolve processing/model strategy without changing your core stored memory
|
|
99
|
+
|
|
100
|
+
### Shared runtime contracts
|
|
101
|
+
|
|
102
|
+
The `shared/` package in this repo is part of the node runtime contract. It contains common schema and filtering definitions used by both API and engine paths.
|
|
103
|
+
|
|
104
|
+
## Quick Start
|
|
105
|
+
|
|
106
|
+
### 1) Install
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
uv tool install topos-node
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 2) Configure
|
|
113
|
+
|
|
114
|
+
Topos Node requires a `TOPOS_KEY`.
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
topos-node --set-topos-key "<YOUR_TOPOS_KEY>"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
This stores your key in:
|
|
121
|
+
|
|
122
|
+
- `~/.topos/.env`
|
|
123
|
+
|
|
124
|
+
Optional:
|
|
125
|
+
|
|
126
|
+
- `TOPOS_CONTROL_PLANE_URL` if you need a non-default endpoint
|
|
127
|
+
|
|
128
|
+
### 3) Run
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
topos-node --host 0.0.0.0 --port 9000
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 4) Verify
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
curl http://localhost:9000/health
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Common Commands
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Start node
|
|
144
|
+
topos-node
|
|
145
|
+
|
|
146
|
+
# Save your TOPOS_KEY for future runs
|
|
147
|
+
topos-node --set-topos-key "<YOUR_TOPOS_KEY>"
|
|
148
|
+
|
|
149
|
+
# Discover available local databases and exit
|
|
150
|
+
topos-node --discover
|
|
151
|
+
|
|
152
|
+
# Use custom database path
|
|
153
|
+
topos-node --db-path /path/to/topos.sqlite
|
|
154
|
+
|
|
155
|
+
# Bind custom host and port
|
|
156
|
+
topos-node --host 127.0.0.1 --port 9100
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Upgrade or Uninstall
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Upgrade to latest
|
|
163
|
+
uv tool upgrade topos-node
|
|
164
|
+
|
|
165
|
+
# Remove
|
|
166
|
+
uv tool uninstall topos-node
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Security and Privacy Notes
|
|
170
|
+
|
|
171
|
+
- Do not commit `topos/.env` or any real credentials.
|
|
172
|
+
- Keep your `TOPOS_KEY` private.
|
|
173
|
+
- Review `env.example` for available configuration options.
|
|
174
|
+
|
|
175
|
+
## Developing Locally
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
uv sync --extra engine
|
|
179
|
+
just run
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Run tests:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
pip install -e ".[dev,engine]"
|
|
186
|
+
pytest tests -m "public and not e2e" -q
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Contributing
|
|
190
|
+
|
|
191
|
+
See `CONTRIBUTING.md` for:
|
|
192
|
+
|
|
193
|
+
- public vs private test lanes
|
|
194
|
+
- where deployment scripts now live
|
|
195
|
+
- contribution scope and security expectations
|
|
196
|
+
|
|
197
|
+
## License
|
|
198
|
+
|
|
199
|
+
Apache License 2.0. See `LICENSE`.
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
shared/__init__.py,sha256=sd46Oivc2qd4gENPJJNho9_5Kh5sf68dBp_eg1Okl-E,1489
|
|
2
|
+
shared/filtering.py,sha256=2QMUxA-CFenq3P0PNbb43VRKLCyxDFvZvRQflJwK3r0,26190
|
|
3
|
+
shared/schema_registry.py,sha256=__pzmFiZH7iiQ1iY4yrAYY9eEKoxiLF_huOQ7IiLv_E,14635
|
|
4
|
+
topos/__init__.py,sha256=fGB2OfJjJXLptZONn1_ZwX7iEi2j9v_tJWo1EGZoSsU,143
|
|
5
|
+
topos/__version__.py,sha256=5knk02u6BGdmLRCvfm6v_nHeZtqa0K2sPqGKuSXwwjU,146
|
|
6
|
+
topos/app.py,sha256=-7fK0EIQ_3MozJZR8APB-0aQ_nooJLTaR9QxYQZHv_A,10290
|
|
7
|
+
topos/auth.py,sha256=6WgAGddOUqfIumeZ_j1n3GWlCi23mYL7Wx267mmAX3Q,850
|
|
8
|
+
topos/control_plane_client.py,sha256=AN-xlhLa2CZ7Hu1B9l0uOB3yzbzFzvcl9VQoh3hnJnk,12157
|
|
9
|
+
topos/data_explorer_table_prefs.py,sha256=8TZNGLh7wUU4J-5Tx3A9XPBfmEERLaYtdyamwxMMf38,4604
|
|
10
|
+
topos/hosted_pool_lease.py,sha256=QnbKRyn7eHg9CBg5jzp_-p1cEwZyxcgFyMwWjGBVvng,6141
|
|
11
|
+
topos/mcp_stdio_proxy.py,sha256=5G8qK67DsmJ-70hR-BDOn57zrb6QtKMZ8uj9nW-9w-0,2843
|
|
12
|
+
topos/openai_client.py,sha256=8p78SFktq7VTodyiFInjBFzQatmToYXCjyOrtPNXGFA,2269
|
|
13
|
+
topos/rate_limit.py,sha256=vabGs118NwurmmeAUNx1qTEW9xDhKEHs8HTStVZSMck,1287
|
|
14
|
+
topos/scope_resolution.py,sha256=1qmBBPVrQjQt8-ZYBf5xrrUIR1fJM0UURSuobHzRyf8,3193
|
|
15
|
+
topos/sync_handlers.py,sha256=RNU4LQ5LNZGiIbqdFnqWZ0i7f-6p2BenP-EtXm5mwjw,2651
|
|
16
|
+
topos/uma_contact_enrichment.py,sha256=ou29va7ARESzVLmuxs4vx81S-PGNCA7bY22ReGROSjc,36458
|
|
17
|
+
topos/uma_filters.py,sha256=uLKbxxeiau8IbfpL46nLKecQb1xuKiWHb3qSP3nl_qE,26993
|
|
18
|
+
topos/uma_resource_id.py,sha256=YtTlELaP2S0uSPa18kFuGLf3qaEOnFP5z3oS5nrJWXA,855
|
|
19
|
+
topos/uma_rpt.py,sha256=n-RVeXZe1zBXOAcmnE4766Ng7aEbGz-YYmSN9jTrndI,2439
|
|
20
|
+
topos/websocket_client.py,sha256=YP1E-jXxfqOR6aqqjE4Nh_2fxQD5BbyGSFzFQ3MaFDg,532
|
|
21
|
+
topos/analytics/__init__.py,sha256=NQhMvKVIEr3eZ5NVbgPOViZ2XNKqmqen8lDAsVDDT0s,426
|
|
22
|
+
topos/analytics/duckdb_adapter.py,sha256=hNk8GHKbBnNd-Q6cwMMsxKyCARBID45XKAwLKNWOPDE,1699
|
|
23
|
+
topos/analytics/messenger_communities.py,sha256=fZHbbDZmpiK5mKvCX6A5nm9bc1ozMDYZht8GjPEFfGk,11522
|
|
24
|
+
topos/analytics/messenger_graph.py,sha256=-37piK677EnSbPUI_4vKS_6NWNO8ArbizLB3rV3BTbg,19011
|
|
25
|
+
topos/analytics/messenger_labels.py,sha256=E_mwFgb9oasMiM-ZYSwi2pX4bYj3Z3VBmX8ZRjrkEKY,13674
|
|
26
|
+
topos/analytics/profiles.py,sha256=ZzqkVc4jlwXo4N4tYSSUF9bFl2dXZTmkhp3hvV6pNNQ,588
|
|
27
|
+
topos/analytics/query_engine.py,sha256=3fFHsrXoYpZGP2FpZOqzbQt2Uj8oVOk3xs5w3AAZFvA,2422
|
|
28
|
+
topos/analytics/raw_queries.py,sha256=7wK2Q217kyCzghwKhUl89PWoh3yahysLZi6YjcP8Jvk,6339
|
|
29
|
+
topos/api/__init__.py,sha256=NQmpLYLkV92pNEumyExNl2Mc0MN1Y4KEyAuuGD9yKrU,29
|
|
30
|
+
topos/api/analytics.py,sha256=ScaFLtD_fxsrlsDmuO6osR1K5__VuQFR2xv35CL8kGM,2220
|
|
31
|
+
topos/api/app_registry.py,sha256=LuLFBv2QZGGp1038pOUgNYW9W-dgn08z22JZG73ASHc,993
|
|
32
|
+
topos/api/backup.py,sha256=1wKo4LiPTHtPnEkl3JioXKdieRcg7wd_bKbpyhh-Br4,276
|
|
33
|
+
topos/api/compute_remote.py,sha256=j5FMrwyVUfmhjp_0_Og1V6YpW7spbkzl3-yhlN6E2ic,6050
|
|
34
|
+
topos/api/data_commit.py,sha256=aRG8XJhrMkRFja6O7zPc3KGFi1gHyNrQw0qmbFnKzrE,5509
|
|
35
|
+
topos/api/data_explorer_table_prefs.py,sha256=b3pPxE71RzYiNltjAVgy00j4GscoeQHBeu9BMBy9S7c,3245
|
|
36
|
+
topos/api/db.py,sha256=-ekISykbotSKENTRFLvJBIvKQdDOrlSidGZ8uIyqHIg,200
|
|
37
|
+
topos/api/device.py,sha256=jxE_bUWF4klAIcaJXvPszHkQbYEBaj5O0EpLZGT-JWk,1010
|
|
38
|
+
topos/api/enrichment.py,sha256=ATLNDgNqtVRjxv13q7p3qaEmzClSxTEU_QOaKgDiYSA,36981
|
|
39
|
+
topos/api/filter_lab.py,sha256=VW-Z0DrCZKk9T9rU6pfaaZQi1_BBmn4EaxoPNZ0rRgk,8107
|
|
40
|
+
topos/api/health.py,sha256=ST1zSruiHqrMAFRy8P_HF7htrww3Sy-JJbRaHBMnqGA,1834
|
|
41
|
+
topos/api/ingestion_api.py,sha256=SAd8gWWzmSsxFBXS2J_FudzJtH97jn1DjeMwRYMRR08,1038
|
|
42
|
+
topos/api/ingestion_compat.py,sha256=XM__3NoHvHZkM50LvPV_OqtVyweoNYADBglwJt-nE4A,557
|
|
43
|
+
topos/api/ingestion_sources.py,sha256=1zMsOWmYf5fbBxCxWne-V80IfVFM35_2i7XDnnVPiRs,25458
|
|
44
|
+
topos/api/llm.py,sha256=0pbDcAE2pKiBsYC__URTLFxD7y0ky0AxSdpxzzNRvCw,2845
|
|
45
|
+
topos/api/local_mcp.py,sha256=PmDZKi96dGMKHF84MqO-MsJMaHsr4s954GD0Nh7XzxI,1865
|
|
46
|
+
topos/api/messenger_analytics.py,sha256=xGpBsW7V6zvauDuZrMN9ljtMiVjMoJqYu4yKGEdt6tg,13297
|
|
47
|
+
topos/api/query_api.py,sha256=BmlGRHOWxWvt1eCG9Brw2WY_S9aMITLr3ZIXqEvql_M,250
|
|
48
|
+
topos/api/sanitization_ollama_config.py,sha256=unFmMrGpntDyG2TPtx_aKhpnDO8A54WkF8EbJKkNBG4,2859
|
|
49
|
+
topos/api/source_install.py,sha256=a9co9iaw_SUYfld8yt0VmndTa3U0v6TOtE28KKkF4IA,13702
|
|
50
|
+
topos/api/sources.py,sha256=5xSsjQKns900UCCPdtW-flS2RlMXspcfr9_Ir40-rCc,349
|
|
51
|
+
topos/api/sync.py,sha256=oeYnuV2_hCQzDqTHHLNrox5V1fTusdqf4BSvB6EbRVw,176
|
|
52
|
+
topos/api/ui_config.py,sha256=ohUnwpr2Ans-GFcqO69U6LcG0c8-V4GxxGTkVQB6LHY,2474
|
|
53
|
+
topos/api/uma_data.py,sha256=GtTlQKkppz6ovxg3LiqXSHsIXToTPD38gFSSgvO9CXg,12413
|
|
54
|
+
topos/api/usage.py,sha256=n3hJr0oSokc-tPm-DlC3XUThlqhsX7cI0XpjuOmHFuY,1735
|
|
55
|
+
topos/api/user_identity.py,sha256=DAazDP2VhUmiRn5k1nNDoF8zd0rKpcSlFRebKj6GFEE,1898
|
|
56
|
+
topos/canonicalization/__init__.py,sha256=4-DQyB7CpSwHDXeD4l1YisIjjNmdAPVdyQDsCxexbS4,40
|
|
57
|
+
topos/canonicalization/models.py,sha256=7CB41sFfmbuL5dWxlV__4Asgz0KdtJYLtr7Swn203-Q,603
|
|
58
|
+
topos/canonicalization/resolver.py,sha256=aoo73nWE_4xF7XyU65wUh-Ge4CEBy7J6jOhq6J-0Lt4,716
|
|
59
|
+
topos/canonicalization/mappers/__init__.py,sha256=wI3n9hV7cEDHEN7dvWS0b_18OEnxjbvwPheyJCac8-A,636
|
|
60
|
+
topos/canonicalization/mappers/base.py,sha256=v4Q5zRpA8utsFP3lj4gWfcineNvw6QoqinhXWQgTPms,582
|
|
61
|
+
topos/canonicalization/mappers/chatgpt_mapper.py,sha256=rJ7UXTgtQUuUKMbAoZ_EGg_CzI-aHPH7NciWAO9ve1I,1546
|
|
62
|
+
topos/canonicalization/mappers/grok_mapper.py,sha256=PzumoiHXyRN-b57I30Rl4YspZJRFzlr5gbVyYEMbvIg,596
|
|
63
|
+
topos/canonicalization/mappers/messenger_mapper.py,sha256=jOasaBD6M7UNXpbu7lUnzVdBqAQV4ImwivaiSo2wWLg,2455
|
|
64
|
+
topos/cli/__init__.py,sha256=KTj1aiFHl-kjhMNCw0LMVqyipsumGXu3Sl9wwiOp00I,29
|
|
65
|
+
topos/cli/__main__.py,sha256=6Cs8NbdSk22o-8xvlWYwzPj6TiVs81tY9q_-5uJsVpU,102
|
|
66
|
+
topos/cli/commands.py,sha256=f-HnP_7GvCoM8_zPI0FNHYciNiYydCAT3HdW67k6EUI,3621
|
|
67
|
+
topos/config/__init__.py,sha256=qUktmzzKy_oxEfAVu8BtfkEtEqeED2GGDbNYJ_r0O_U,39
|
|
68
|
+
topos/config/sanitization_ollama.py,sha256=zvzJBazhi6EQ3Gd-GY-A8KKScoQbP77Tkgxuad8GHGk,7559
|
|
69
|
+
topos/config/settings.py,sha256=DooxUGVV0IlqBqJwiDHL8VNY1YnbcrGRjwvBfeEVUaI,13275
|
|
70
|
+
topos/contacts/__init__.py,sha256=kgiE62jaCWVODVyj54rv6zI-kDhmCfPHlyCc7QMxCSs,159
|
|
71
|
+
topos/contacts/identity.py,sha256=5et4Ah-BXR7Qvc1dGYdK7AQZNkyXkb3gSDG46bDbmpA,679
|
|
72
|
+
topos/core/__init__.py,sha256=Cjlc2L2rN04Fjrkb37UIZdeFaQznLkZembpcuC9U44o,32
|
|
73
|
+
topos/core/api_models.py,sha256=LLiNTP0-C-d0TQmNhVZhylZ3zh7r-pOtIiRJPP2LT3s,3129
|
|
74
|
+
topos/core/connection_resilience.py,sha256=ZrtdJ8fTnDgchmIRUZCHdQk7Ym5pi-BRfqPSVLjgy9c,3195
|
|
75
|
+
topos/core/device_helpers.py,sha256=--G1mKgIr__9RcraalIghx5F8ooNwDtYwfYxH_dFIP4,171
|
|
76
|
+
topos/core/errors.py,sha256=leLiUkrC9XGRBOWizRzL4QDHeAPGDXM0uiu5mxrMdvE,303
|
|
77
|
+
topos/core/events.py,sha256=NPiSoySfUCfmTfXqC7WbISC-4YXy72H2xIu4KBLe15w,211
|
|
78
|
+
topos/core/handlers.py,sha256=_E39SEcPEhLztdfHP0hhsZjrMi5iVVFd_NWAdsII9E4,275275
|
|
79
|
+
topos/core/logging.py,sha256=_Nz42DDV6ITkqKwD74pHo8xJuq71wuHBEu18L3wWSDg,7063
|
|
80
|
+
topos/core/metrics.py,sha256=W6qVddHzEgyV5C_0OJvDaNAoOIpGprc0kIZz2oYKKLY,608
|
|
81
|
+
topos/core/startup_banner.py,sha256=ZdjBumKntb5reS1yPLswohlDcXLrHX1vEH20asiwZ6I,2819
|
|
82
|
+
topos/core/state.py,sha256=2SZr9i40BNBXWO1MZlP2GkIfWTv1SWgAB2up33qgsIE,26360
|
|
83
|
+
topos/core/table_layers.py,sha256=UfXbj7m467ZnvAHGaK1bukvFQfFcNubiTjGQWPbrW30,1307
|
|
84
|
+
topos/core/types.py,sha256=Qn0ZCqBZAbUHzADi6GeYyljBV-USocY_OD-u2cmz-pE,232
|
|
85
|
+
topos/engine/__init__.py,sha256=Q326R7B8GHr8-rkz8ad_LPspKmDJ6X7GvN3sEALT0hk,597
|
|
86
|
+
topos/engine/engine.py,sha256=nDEnvWxpAGEszSnUp9PD8Bp8uaC9_d7jcmkEga5rkCU,7013
|
|
87
|
+
topos/engine/intake.py,sha256=DFNUpxfdScQKTSj9T57h_DfYEqqK9y78lq38iCCfoPo,1215
|
|
88
|
+
topos/engine/queue_manager.py,sha256=0qUERwrHmjl3E0G3hNfztaOX9YWPXzfMEqrW7y-xIp8,3866
|
|
89
|
+
topos/engine/registration.py,sha256=cbQYWzQgmnZnLNsfw6WkHkNA5wXP8AS7yAuXNqjLQdA,4042
|
|
90
|
+
topos/engine/result_formatter.py,sha256=C0V56jhfqI2jy77aGeNEembmX4CNlmp2NJONKsl3s04,1200
|
|
91
|
+
topos/engine/router.py,sha256=tllW9Do6VA9AhdeIsbTwgYPeUvA-bozVt39o87ekMiY,707
|
|
92
|
+
topos/engine/scoped_token.py,sha256=9ku6r9LSpr84ZvI1ln4I023ph36U7GsXJcNjhozYBFQ,3283
|
|
93
|
+
topos/engine/tasks.py,sha256=mTAlHHiwWyN-n1H1DmoTUqpWi73NnhCiuGlIshssLT0,4841
|
|
94
|
+
topos/engine/transport.py,sha256=WXZPT852hYmZuj0AvEzuU2mQs35AhpFXvs9Gw0fZhL4,1300
|
|
95
|
+
topos/engine/usage_guard.py,sha256=WAl5tQRy-4W_qya62tCx-u9ZuOuW2ETytILhplV8ABE,3904
|
|
96
|
+
topos/engine/usage_observation.py,sha256=xmeb-STiEr7q1BZ2Pb_Exq5142oGAFPV21bUJHkAYf4,3903
|
|
97
|
+
topos/engine/validator.py,sha256=AmoWhyrVaf-LCodBX4hGvCsH43kyHLB9Hg6HcF8OrQE,816
|
|
98
|
+
topos/engine/backends/__init__.py,sha256=gi2Rhyld1SIcjRuJauPG25iX-DDh9yaCFJ4KWf8qQhY,1476
|
|
99
|
+
topos/engine/backends/base.py,sha256=syZs3zBHKZONXTgSgnwQWcHEN5K8X-GrFMUgtAJSKOg,760
|
|
100
|
+
topos/engine/backends/huggingface.py,sha256=4zXoQrF3gM49R0kEcHw1k1SdVkK4zmaciWODPX1XsuU,7044
|
|
101
|
+
topos/engine/backends/ollama.py,sha256=3fMOIpRQNGxsnvjpAHmxl-XwZ_Xh40n2mSuQS2JVo3Y,8506
|
|
102
|
+
topos/engine/backends/stub.py,sha256=xAvOQ9AtNHbZPW9nvjeYydQ39Hrnf4p07LL-9Je7Zcw,706
|
|
103
|
+
topos/enrichment/__init__.py,sha256=j4nlCBCO6OfsPqF-GxFleurIwDaH_QopiYCsdDwEsMo,34
|
|
104
|
+
topos/enrichment/derived_tables.py,sha256=dgHpk7HviH8qqcqHIvcyqIrFwSuONXpAMqUZ3JKRFjc,8091
|
|
105
|
+
topos/enrichment/orchestrator.py,sha256=6eIhK9MjP-Gi7aR9frjsNWM_LixFgMWINrQ2bmVAo40,8487
|
|
106
|
+
topos/enrichment/processor.py,sha256=RO4Z8_3aIAcz7UiiLAvK9M-q0Wq9kNKfBmW2NQjc55Y,562
|
|
107
|
+
topos/enrichment/progress_bar.py,sha256=YyZ-37ePsYWd0Tn3nJXsrgOaSsJp8FzDub1i2zqxlek,3884
|
|
108
|
+
topos/enrichment/website_classifier.py,sha256=ANPL1AwzsqFMIh7zMvpLuTveo7y98Ng0b1UX0EGV_qk,1082
|
|
109
|
+
topos/enrichment/jobs/__init__.py,sha256=_qDqoK8c5aRXmMqlPZCmoXSVcsCzt8c06yn9oU7457Y,938
|
|
110
|
+
topos/enrichment/jobs/base.py,sha256=07NQnBIcw0GoHyiwddWRBc75JhYpYLaF90ZDGNTLNZg,1544
|
|
111
|
+
topos/enrichment/jobs/canonical/__init__.py,sha256=su54ZVqD77lEBUuNzqB-MJsul46-TxI4qwrAo8p9iRM,33
|
|
112
|
+
topos/enrichment/jobs/canonical/embeddings_job.py,sha256=z0okjacW8QOmhzp0k2AfYom6R_yPh9GC47A0yQUsjEE,895
|
|
113
|
+
topos/enrichment/jobs/canonical/emo_27_job.py,sha256=gi85iLX5Ad62Sf-IVZ7ZrJGrd_wJI972_TNDTG62Ovo,3970
|
|
114
|
+
topos/enrichment/jobs/canonical/entities_job.py,sha256=Gd7VhHvEW9VAjjo1mdwHgPopwX_hin11xaY2IBax044,885
|
|
115
|
+
topos/enrichment/jobs/canonical/sentiment_job.py,sha256=Ppvff6ZlokkK237TUzKxVJGii5UWcTZA6XaDGhbt7mI,890
|
|
116
|
+
topos/enrichment/jobs/canonical/topics_job.py,sha256=I3PJ2GHLJW7bl1K488ww2lQAdH3HHW9vIUgRsFDOsjY,875
|
|
117
|
+
topos/enrichment/jobs/raw/__init__.py,sha256=etjOuTWbH3Gsmk4Xeoxnis77zG5vl2QiIUWN9oMEG78,27
|
|
118
|
+
topos/enrichment/jobs/raw/attachments_job.py,sha256=VpXYBy6Llz9lJJTdy-ZUeASHFtk3mvByM8MACOrdxGw,286
|
|
119
|
+
topos/enrichment/jobs/raw/language_job.py,sha256=Ucm80zuKQtEcBM8_j9xWjhX8UXGzgV2oy1upc8WlxgY,280
|
|
120
|
+
topos/enrichment/jobs/raw/time_normalization_job.py,sha256=kXVKaO-Kee0VUqr37QBOyiMbJYOycURjG7_C-aiQ_XY,299
|
|
121
|
+
topos/enrichment/jobs/raw/tool_calls_job.py,sha256=KW9T1E0EryIt-5d_oiuU2kZpRPw9yeQmgMyMpWgnp2I,283
|
|
122
|
+
topos/enrichment/models/__init__.py,sha256=ytkgmnSCbh-muZbV9eGJ2yj5XhthKAlI0rzV1qhYwaE,45
|
|
123
|
+
topos/enrichment/models/manager.py,sha256=ALBmnyW45ZJWsWre7Pmv89qbb-4HGF6JqgFT6N5so3o,160
|
|
124
|
+
topos/enrichment/models/registry.py,sha256=Ywmw_ujKjKMpu7hzvsmx0d7PQAdVQZn0r36Ktos4msY,2601
|
|
125
|
+
topos/enrichment/models/versioning.py,sha256=z2XpzAXjwUitP-f34YL4qb6Xc0AZ7TXReGwZVVJJybs,165
|
|
126
|
+
topos/filter_lab/__init__.py,sha256=u78gbTCTaxvdKbsJ91mEVoEe9R2ou9-DdZuZs28fMnU,82
|
|
127
|
+
topos/filter_lab/bundles.py,sha256=dg-y1zh5QI9tWtwpStMKwA6oa2PBwzxQ_09eLFeAGLY,11993
|
|
128
|
+
topos/filter_lab/schema.py,sha256=KB9AcNA2euGL3uZkmG0zoVtvaE4GPXksC2Aslk11m9U,3195
|
|
129
|
+
topos/filter_lab/service.py,sha256=NWpxFD9cPmRZNL89JfFgo2i_4_Hc9SNgjofGsXZhF34,5899
|
|
130
|
+
topos/filter_lab/store.py,sha256=zjX32N1ohDtQCz9JabEWenkhpK-Ng6NZdbG92DKCbI8,11344
|
|
131
|
+
topos/filter_lab/worker.py,sha256=xJbF9XUD830l5WQr6vWvzXBe9lOh0efk3B_YxF-uf7s,8780
|
|
132
|
+
topos/ingestion/__init__.py,sha256=Ah_u0Db4rgedp3Tw-6Em6elUfvyrVaBvneps2WSn8K0,33
|
|
133
|
+
topos/ingestion/ingest_helpers.py,sha256=qx8wCyhGGY8Hnw9sDcIsj6-CJsCq-s3zxC5AMb-9zjA,20130
|
|
134
|
+
topos/ingestion/jobs.py,sha256=Nmt6QNzhEbqmKrlLrK_3yKm6pdKGTuP0_QOfybmtzfE,2847
|
|
135
|
+
topos/ingestion/local_sync.py,sha256=ioO0ZrqrOP2lYjLrHcotBbWiGYAPN3p2WlK5Ksjqv88,32847
|
|
136
|
+
topos/ingestion/log_preview.py,sha256=baI5xA2H-ms9twoASP3miHZC_KnNcGjgoyLUpwcWk8I,595
|
|
137
|
+
topos/ingestion/manager.py,sha256=CGoGJh0b3-yvEtWdv5EIlj86wAskc2qdvXTdhKWtRog,48865
|
|
138
|
+
topos/ingestion/parser.py,sha256=8uzGtXgbxXmROi5Y8CApSCWBxCyqcEUCBuPZnX2Nx3E,6107
|
|
139
|
+
topos/ingestion/progress.py,sha256=UC8zg-WasH5MP-Kv9aQBIR6y-8AIwXHDT_d4vUgMxDE,1943
|
|
140
|
+
topos/ingestion/state_machine.py,sha256=RPn3QX3FML_iCEZSbQE2PuXbcpzq9SAaciI3-QztMeo,2374
|
|
141
|
+
topos/ingestion/checkpoints/__init__.py,sha256=nFzg5ytPpl6nvu0tqpwBkSvFSYcMJjxYrw6Toe9ppQE,275
|
|
142
|
+
topos/ingestion/checkpoints/checkpoint_store.py,sha256=lv2wTJ-ByZJz5GhMtcQwxRacrwCvHxuvLjPaN06SOrs,614
|
|
143
|
+
topos/ingestion/checkpoints/sqlite_checkpoint_store.py,sha256=-O1T6XNAnRGGY0aEN_gB0coCdjHyVzcIEeti-F8LfM8,2826
|
|
144
|
+
topos/ingestion/parsers/__init__.py,sha256=S9yQNfcizU_G-_bPssA_1ewZOQEU9eGxwg8_l7i1FIw,1121
|
|
145
|
+
topos/ingestion/parsers/base.py,sha256=UTyjGuT-elx4aURSy4F-G5PPktSTXhTB1eZrOhNrLGs,553
|
|
146
|
+
topos/ingestion/parsers/browser_parser.py,sha256=dJMejqVofp0f-SfsRzRDh-eFLrTwOUWRoYDxj-jEQqw,6536
|
|
147
|
+
topos/ingestion/parsers/calendar_parser.py,sha256=70ZeBOI-z08Pc7_u1PwOaBV1iVOVEcVq3t2tGvNUO68,601
|
|
148
|
+
topos/ingestion/parsers/chatgpt_conversation_flattener.py,sha256=olWMlfAaH2Y-Ct7qet9SFTNURVAbJzaVExfU8UcOVmQ,9532
|
|
149
|
+
topos/ingestion/parsers/chatgpt_parser.py,sha256=yKU7vBQ8KEpMwStpWqdXmtAJ20Tv_eOtb3BD_dWhooE,2524
|
|
150
|
+
topos/ingestion/parsers/grok_parser.py,sha256=BNFUbw_JhErpjvQDcqeKFQOKsmWfQXTn72qLsnGUi2o,599
|
|
151
|
+
topos/ingestion/parsers/messenger_parser.py,sha256=dbYlgcGeNAXrJdK44PFmPTotxfSt30LLygtI6Zewb4U,4064
|
|
152
|
+
topos/ingestion/sources/__init__.py,sha256=iAgjrH4rN1w2pgrgc8eb4RldNw2cHAyuUppFGuKwVk8,481
|
|
153
|
+
topos/ingestion/sources/base.py,sha256=dV3oix8hdDqG_59SOkPOgsnCDzln5dVOE4bWwzfSALw,816
|
|
154
|
+
topos/ingestion/sources/calendar.py,sha256=U-fmn34RnwAx1Q9Rz2t-52gts3-c3UzYrZD2J59SDHw,828
|
|
155
|
+
topos/ingestion/sources/chatgpt.py,sha256=gC2AuCgrsr056A4FZ9pDAb2e0-hs1Do_rj5ULcNRG8c,834
|
|
156
|
+
topos/ingestion/sources/contact_importers.py,sha256=2CMaYcthV-OsP5pFUNAJUWiMOMcAs77qsauDouHFpNI,10062
|
|
157
|
+
topos/ingestion/sources/grok.py,sha256=EirHSSJRy4Dz5z5BCYhqBMdrxsmVcIn8u9LXRtgLo9U,820
|
|
158
|
+
topos/ingestion/sources/imessage_reader.py,sha256=EnVc6RMBV5A7GuEfEkRT6tEPc-EG9FTbEXSW4inh-N4,17972
|
|
159
|
+
topos/ingestion/sources/signal_export_parser.py,sha256=HE0keW5qa1aT8UHBb3m2XJB_qmNtAsDEBv7cfPkOH-8,5416
|
|
160
|
+
topos/ingestion/sources/signal_reader.py,sha256=pz7K6OlU1Ldk34_lwU1-bdh_1vxGS7i1CIS6-kWSUTA,18466
|
|
161
|
+
topos/ingestion/triggers/__init__.py,sha256=F6bfLfs9y2KdH49RVgFDpjT1rJ5n7fShGDrzBG8m0PI,26
|
|
162
|
+
topos/ingestion/triggers/file_trigger.py,sha256=M-dmbLt7YIzO3hoNmdZEZX9UlN1Z6pjMHOIbQh7wMJE,1158
|
|
163
|
+
topos/ingestion/triggers/sqlite_trigger.py,sha256=_vTxmj4sl6pNSmA-EspLj8sZjMqw4MnR38aL57JMVwA,408
|
|
164
|
+
topos/ingestion/validation/__init__.py,sha256=HwPfDiAvWCW8IRXejKOj8jEXWahXz8Hez0SfMN8pFm4,42
|
|
165
|
+
topos/ingestion/validation/base.py,sha256=ZX5X_vFzreHscSer5kxxMskYusJaGm428Z7JgRUELR0,622
|
|
166
|
+
topos/ingestion/validation/schema_registry.py,sha256=qFFBk0feTjTS2yP05l5r-DOU7fiSH5rmAb23gqb57Z0,3988
|
|
167
|
+
topos/ingestion/validation/schema_validator.py,sha256=_8WwicpwPtQ0c2oUY_YG_3HssGuKlHVInVLWW3fLK6M,456
|
|
168
|
+
topos/lineage/__init__.py,sha256=Mhim_EC6Di9mrOYtuVW2x6_m3t4ujjQwDHXHwsEusJM,49
|
|
169
|
+
topos/lineage/provenance.py,sha256=UKz0yUFlQyzUqzpIDacbOvDtniXNRKCKaSDeB4wcmrw,169
|
|
170
|
+
topos/lineage/tracker.py,sha256=4aMIOHmqfSqszrZeycHRdSS5AHoZTE1eEv3OtICARPQ,162
|
|
171
|
+
topos/observability/__init__.py,sha256=31DRYcs2QkNduhneruAqso5cEGOmumY5VS-Heo2ps8M,41
|
|
172
|
+
topos/observability/alerts.py,sha256=x7lx2u-yma94LrGDRnlNwBX-KOQ_yw8f_lVzB4pNmts,124
|
|
173
|
+
topos/observability/metrics.py,sha256=QaUu6VTcq2Bc7k8rE5wz1-PD28FhDhBgtsrANJr8wkQ,512
|
|
174
|
+
topos/observability/tracing.py,sha256=u3SJVTcuymXH6WmwrqUOuRi6ZbcHI3PiG0BVWE5e2lk,322
|
|
175
|
+
topos/projections/__init__.py,sha256=Ub-A5-96oGqLYJQWjhRzr5eKMVy6jCFsA0PlCiFfmDo,37
|
|
176
|
+
topos/projections/vector_index/__init__.py,sha256=uL99i0BKkC18gE_xR7pxOPai4DUzT3ltDlprYaWX5XU,44
|
|
177
|
+
topos/projections/vector_index/base.py,sha256=KGftqgEe9htQiUHT3RpkeV6TOs1xve2xNjkoeoqV-pI,412
|
|
178
|
+
topos/projections/vector_index/builders.py,sha256=llYFbsMEBt-U8sAWeLBC1QRjnmXSfoeWPWy2krvUswE,360
|
|
179
|
+
topos/projections/vector_index/health_checks.py,sha256=TQftu18YITIynu3mBAffEJH90UN_vZCPgadMhGE3gfE,101
|
|
180
|
+
topos/sanitization/__init__.py,sha256=oHiQyA3fyBui_wF-3_wiziE6Yb0Hs18OYuvsCyqirmA,455
|
|
181
|
+
topos/sanitization/ollama_transforms.py,sha256=Gz0k9lTkFAylrIDe6aapif1Qs7CvnuWIRT9xn_gKNsM,9627
|
|
182
|
+
topos/services/__init__.py,sha256=C-okXGFIGd-zpLNEg0x6lzNHJqstKvUIfnQJLnNqL1c,49
|
|
183
|
+
topos/services/container.py,sha256=F_VOgRI8mp82BwqT_BjWnnlBfjv4DNi2evaDgftoIwg,1435
|
|
184
|
+
topos/services/interfaces.py,sha256=ZbawgfR3nrd_DGZJELYTY-8oMPezgbEahebYlY_ZCko,1602
|
|
185
|
+
topos/services/local.py,sha256=y4ruB34bBUrEm7rHiJqmQ4EIzw9aCurhzg_s1VUMGEI,5178
|
|
186
|
+
topos/services/postgres.py,sha256=r552INtxoZ7x3sKs9M4YCg4HOlrHQwE_llj9XWkxvSY,15548
|
|
187
|
+
topos/services/embeddings/__init__.py,sha256=Gx_2FCl6BCU1NlQqM0GH3VADCGyo064lA3kHoS6P0_Y,35
|
|
188
|
+
topos/services/embeddings/base.py,sha256=dsL3LA1LWjuMfPicZImVgRsgLGN6dNOeK-VZq1FU0Wk,177
|
|
189
|
+
topos/services/embeddings/local.py,sha256=UcZT-mQHK8Ub1Q71Qm8idyyYxVsNVzMrcDKqjI3sV9w,250
|
|
190
|
+
topos/services/embeddings/remote.py,sha256=CrtWkJBPbf-CxeT3AqUhOZWUiUP5vFnv7zRYU44NQR4,252
|
|
191
|
+
topos/services/llm/__init__.py,sha256=YN-dIOzm_cBkxhYIa5P92_XcNhJuwO1L3crcRetUjG4,28
|
|
192
|
+
topos/services/llm/base.py,sha256=mbAinayCEgV9p8qXTYeVteoMgkxTQ5fo5WGkpEkcKXU,177
|
|
193
|
+
topos/services/llm/openai.py,sha256=tOrF2A1NJMtrsLqXWtyTMh-SsQJR-YVHUS95908Y0kY,5022
|
|
194
|
+
topos/sources/__init__.py,sha256=GaH1A-qHHZNxC5MR9HVircrR4njNkWhtfy7-SpVzgqk,184
|
|
195
|
+
topos/sources/definitions.py,sha256=LV72Xvo6WNMXrozlcTQDLxvpztPKwIs8p2WfEs9pyY8,6188
|
|
196
|
+
topos/sources/install_service.py,sha256=JdMaSC0hHZuH1WeHimZX5jm7ySzPMPcVP3jPRJevkTw,32749
|
|
197
|
+
topos/sources/registry.py,sha256=uVH3ZDDL5v2_JkCDaMdciA475n47P4sDpL_o6DOYBrU,11585
|
|
198
|
+
topos/sources/runtime_install.py,sha256=cXG6Fgr3eeGEoD0sNnl0VRgbuqgy6qvTXEvHruqhs5o,18361
|
|
199
|
+
topos/storage/__init__.py,sha256=VfoswAVsNyGWDWXaqRRncOG9gKNwSqTZZEke_vULFso,31
|
|
200
|
+
topos/storage/signal_identity.py,sha256=b0FguEJZppjw6FGpFVQQtiQm-UaVtUTR9hIizvBNlZQ,2300
|
|
201
|
+
topos/storage/source_settings.py,sha256=pVR01ixURo5-9hw8rNYyqZNoCmuHWB2nd6SdSHLY9ts,4128
|
|
202
|
+
topos/storage/user_identity.py,sha256=vGiuxM7e17Qn02EApzC4xj7b1SYfTBX52T7NzOWdELw,1987
|
|
203
|
+
topos/storage/canonical/__init__.py,sha256=MO0h018l5R4xTnFOnKCkzpnFc0mMxAFfaQVq4ZE7VhI,464
|
|
204
|
+
topos/storage/canonical/canonical_store.py,sha256=aa-rfO8YAL2guHACdBXuw5jNsJ3kT8Vo_OKPmmYAz0M,637
|
|
205
|
+
topos/storage/canonical/conversations_tables.py,sha256=-xYqTg6IFQ4T20SwfMCkKP-N1WWwQ7gEM3vuUQkEgAk,40658
|
|
206
|
+
topos/storage/canonical/mapping_store.py,sha256=TwpILQWBs7hUFRXvmMwhLbhWur15HFaqwKbloBRgiHU,884
|
|
207
|
+
topos/storage/canonical/postgres.py,sha256=msWv-aQMtPcS1s8X0xCDx-WXzOy0bCATkLBNwo0bES4,252
|
|
208
|
+
topos/storage/canonical/ai_chat/__init__.py,sha256=7SNEHWpMIGsds8wZwHK9ml_IdLth1V8mf5bo1mSQXqU,761
|
|
209
|
+
topos/storage/canonical/ai_chat/canonicalizer.py,sha256=p9m2LJ5OPLfJTscVjRKFsM0ak66-iHwWcgaMycjlbFk,5507
|
|
210
|
+
topos/storage/canonical/ai_chat/mapper.py,sha256=G9dpEhAmXk3yjqaB5ATO2nq2XfMOOoOBtFvkojHTmoI,5800
|
|
211
|
+
topos/storage/canonical/ai_chat/model.py,sha256=c_-ypAuYxOjKFgmHX1eJ-ZeaKyFS3UHeM7hA_jagl28,2883
|
|
212
|
+
topos/storage/canonical/ai_chat/tables.py,sha256=5hX_yxBcyCFhHYPqhnlSWqUF_jJEJ9xRJZpI15WuL-k,6969
|
|
213
|
+
topos/storage/db/__init__.py,sha256=I9hbmwOZeoiH7nC4pFkehVXXLGY9KmzBBl1V-7tFTuw,42
|
|
214
|
+
topos/storage/db/client.py,sha256=lnRpjB7R1pOxx-Cgz6c0mhMD2H1a2lnLRqzdEckDsd0,148
|
|
215
|
+
topos/storage/db/paths.py,sha256=hd8B4xturQiNpt9AydXqHi6aG5Ck8BRB6jIXwv9VrsA,3918
|
|
216
|
+
topos/storage/db/postgres.py,sha256=lsXL2C_-ZHnVv5AwT3uBQo43nL2jgjG45PK-s7tEhPM,7414
|
|
217
|
+
topos/storage/db/schema.py,sha256=l4ZjLqGqQPnEZrE1nPcH9IOoYhXM-lwGlwnPZ3bZzdc,125
|
|
218
|
+
topos/storage/db/migrations/__init__.py,sha256=jZZpQtkkhdbRi4xYdFVU9sWAWA3NAY1IIUadlcWIjOU,37
|
|
219
|
+
topos/storage/db/migrations/stage9_column_renames.py,sha256=mgIEXxOW55AGtw3VaoBZUp7f4Odg1qNwXehcANOvuTA,2961
|
|
220
|
+
topos/storage/enrichment/__init__.py,sha256=DB_qTyl16d2o94QVBIybQJ_d0v3wlYqI394CaTc4KvU,39
|
|
221
|
+
topos/storage/enrichment/canonical_enrichment_store.py,sha256=1O3a1dOByEJrFY7SngHGs1hricibK7_wPMlvlFn2ijo,187
|
|
222
|
+
topos/storage/enrichment/raw_enrichment_store.py,sha256=pfZcrCX7xKFDZQvFMq8A-8eDWdZmj32fHngEGhyQffI,370
|
|
223
|
+
topos/storage/normalized/__init__.py,sha256=CaZd5_eyqot0raX46BJLYugTib2VLNp_-ykHgOexkJk,39
|
|
224
|
+
topos/storage/normalized/normalized_store.py,sha256=O9tOaNcKGq1k1AAQKBtXQzEqByqJHBlWHoiPUMGWjUE,642
|
|
225
|
+
topos/storage/oplog/__init__.py,sha256=WEvsPJ74dijqTvO5bhLTbT9H-_an1OOJgy8Ig9RGOxY,34
|
|
226
|
+
topos/storage/oplog/decision.py,sha256=rdRogWVL1zgOPLc6ikzb8eyIq_-4BPIMfcmHw9BnaRU,176
|
|
227
|
+
topos/storage/oplog/oplog_store.py,sha256=50W_tlh_jjih2b8ZWZ5x68sAZGJhMfXuvqWsG98cdXg,321
|
|
228
|
+
topos/storage/oplog/postgres.py,sha256=Z_DYtO2aZGtNHUrdUP7JQooPIxKK8ZxvPNUbd3kopKY,242
|
|
229
|
+
topos/storage/projections/__init__.py,sha256=eflp4jQURy-CafXejn5j-Qc4R2Ox4xqKTOc8qO6ejUw,39
|
|
230
|
+
topos/storage/projections/index_ops_store.py,sha256=n_Y4iN6KW6sL8g8zK2t-Ipowhsy9ayQIloEW6Xzio1M,128
|
|
231
|
+
topos/storage/projections/vector_index_store.py,sha256=bh8Zk3DzdLOZ9gok76aFSVVcoY1xZ6-IZP1qrKX6kDI,132
|
|
232
|
+
topos/storage/raw/__init__.py,sha256=kZyYGuFTeit_MGubn2T7PDOPQpYhJz45k4eDPq5kKSA,32
|
|
233
|
+
topos/storage/raw/browser_flat_tables.py,sha256=4kyG1rnMohs_1iSNZh0cyMm6iK783qlwdNLM-KIQ5cQ,12079
|
|
234
|
+
topos/storage/raw/file_store.py,sha256=gXcE30PTdQhRbW87ogUJ36SoaofAVYPB3bZtCSazGzI,4283
|
|
235
|
+
topos/storage/raw/raw_store.py,sha256=kPwAkKfPb991-gPIEW6A15Bh9Go6X8MCDo00Cv5tskU,538
|
|
236
|
+
topos/storage/raw/raw_tables_manager.py,sha256=DsUlovcna_kxAecxxxZt2siyR3Rlmr8idqkZnVGS3os,13585
|
|
237
|
+
topos/storage/raw/sqlite_raw_store.py,sha256=QcpJ72tFe9l-pjxgS7c9x3yHNUCAtEwOlMQCkzehGsw,484
|
|
238
|
+
topos/storage/security/encryption.py,sha256=0U3hUrxtR27IYHIiSdtnMWMXZCXQM96wm240pD-DmuM,619
|
|
239
|
+
topos/sync/__init__.py,sha256=wBAkoaIvVG9JM2EzTTf9Qdb8J9TvmOqec-UTzzXXn6c,86
|
|
240
|
+
topos/sync/client.py,sha256=LkYfcgW5E4wHEOu_x1JIDH2FUZ_x9hL2hOG6YFu4GiA,10372
|
|
241
|
+
topos/testing/__init__.py,sha256=x-OQvF9ghuxSjxnhkmHpoLHLwTUXobqLDjDGbEn737E,33
|
|
242
|
+
topos/testing/lifespan.py,sha256=0SlATCYnt8Sf_82zWm8Gvdc-NM8ytiZAtYosH4taJQI,199
|
|
243
|
+
topos/utils/base_object.py,sha256=-Iur0yR3Z1wP2L-WXi90a6sviiE5KQAQD-fXE7I_UGw,1856
|
|
244
|
+
topos_node-0.1.0.dist-info/licenses/LICENSE,sha256=1uVklCdXk2ErSay_eH82MMkQIh63awV__lwxOVtaiq8,11356
|
|
245
|
+
topos_node-0.1.0.dist-info/METADATA,sha256=32O-YftWVzsb_aF6eBu1cSD6l7oNto-P8hIGhlBAY5Q,5764
|
|
246
|
+
topos_node-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
247
|
+
topos_node-0.1.0.dist-info/entry_points.txt,sha256=jAd1XQ1M1LzFWCcNy7-Vqru-pvLMfDRvXbiY0R26_5o,55
|
|
248
|
+
topos_node-0.1.0.dist-info/top_level.txt,sha256=mVGn9G1HTkGuG2offKuk2xfj58O9tP6HU7VYYmXdBHg,13
|
|
249
|
+
topos_node-0.1.0.dist-info/RECORD,,
|