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.
Files changed (249) hide show
  1. shared/__init__.py +59 -0
  2. shared/filtering.py +640 -0
  3. shared/schema_registry.py +229 -0
  4. topos/__init__.py +5 -0
  5. topos/__version__.py +6 -0
  6. topos/analytics/__init__.py +15 -0
  7. topos/analytics/duckdb_adapter.py +48 -0
  8. topos/analytics/messenger_communities.py +349 -0
  9. topos/analytics/messenger_graph.py +522 -0
  10. topos/analytics/messenger_labels.py +321 -0
  11. topos/analytics/profiles.py +22 -0
  12. topos/analytics/query_engine.py +64 -0
  13. topos/analytics/raw_queries.py +174 -0
  14. topos/api/__init__.py +1 -0
  15. topos/api/analytics.py +52 -0
  16. topos/api/app_registry.py +31 -0
  17. topos/api/backup.py +15 -0
  18. topos/api/compute_remote.py +175 -0
  19. topos/api/data_commit.py +158 -0
  20. topos/api/data_explorer_table_prefs.py +81 -0
  21. topos/api/db.py +10 -0
  22. topos/api/device.py +25 -0
  23. topos/api/enrichment.py +959 -0
  24. topos/api/filter_lab.py +195 -0
  25. topos/api/health.py +61 -0
  26. topos/api/ingestion_api.py +37 -0
  27. topos/api/ingestion_compat.py +21 -0
  28. topos/api/ingestion_sources.py +600 -0
  29. topos/api/llm.py +76 -0
  30. topos/api/local_mcp.py +46 -0
  31. topos/api/messenger_analytics.py +385 -0
  32. topos/api/query_api.py +13 -0
  33. topos/api/sanitization_ollama_config.py +64 -0
  34. topos/api/source_install.py +324 -0
  35. topos/api/sources.py +13 -0
  36. topos/api/sync.py +10 -0
  37. topos/api/ui_config.py +83 -0
  38. topos/api/uma_data.py +311 -0
  39. topos/api/usage.py +49 -0
  40. topos/api/user_identity.py +46 -0
  41. topos/app.py +239 -0
  42. topos/auth.py +17 -0
  43. topos/canonicalization/__init__.py +1 -0
  44. topos/canonicalization/mappers/__init__.py +22 -0
  45. topos/canonicalization/mappers/base.py +26 -0
  46. topos/canonicalization/mappers/chatgpt_mapper.py +40 -0
  47. topos/canonicalization/mappers/grok_mapper.py +17 -0
  48. topos/canonicalization/mappers/messenger_mapper.py +58 -0
  49. topos/canonicalization/models.py +31 -0
  50. topos/canonicalization/resolver.py +23 -0
  51. topos/cli/__init__.py +1 -0
  52. topos/cli/__main__.py +6 -0
  53. topos/cli/commands.py +132 -0
  54. topos/config/__init__.py +1 -0
  55. topos/config/sanitization_ollama.py +189 -0
  56. topos/config/settings.py +310 -0
  57. topos/contacts/__init__.py +5 -0
  58. topos/contacts/identity.py +24 -0
  59. topos/control_plane_client.py +300 -0
  60. topos/core/__init__.py +1 -0
  61. topos/core/api_models.py +128 -0
  62. topos/core/connection_resilience.py +99 -0
  63. topos/core/device_helpers.py +8 -0
  64. topos/core/errors.py +13 -0
  65. topos/core/events.py +12 -0
  66. topos/core/handlers.py +5625 -0
  67. topos/core/logging.py +175 -0
  68. topos/core/metrics.py +21 -0
  69. topos/core/startup_banner.py +62 -0
  70. topos/core/state.py +682 -0
  71. topos/core/table_layers.py +45 -0
  72. topos/core/types.py +13 -0
  73. topos/data_explorer_table_prefs.py +150 -0
  74. topos/engine/__init__.py +29 -0
  75. topos/engine/backends/__init__.py +50 -0
  76. topos/engine/backends/base.py +21 -0
  77. topos/engine/backends/huggingface.py +151 -0
  78. topos/engine/backends/ollama.py +181 -0
  79. topos/engine/backends/stub.py +22 -0
  80. topos/engine/engine.py +165 -0
  81. topos/engine/intake.py +32 -0
  82. topos/engine/queue_manager.py +112 -0
  83. topos/engine/registration.py +126 -0
  84. topos/engine/result_formatter.py +38 -0
  85. topos/engine/router.py +19 -0
  86. topos/engine/scoped_token.py +82 -0
  87. topos/engine/tasks.py +154 -0
  88. topos/engine/transport.py +44 -0
  89. topos/engine/usage_guard.py +100 -0
  90. topos/engine/usage_observation.py +129 -0
  91. topos/engine/validator.py +23 -0
  92. topos/enrichment/__init__.py +1 -0
  93. topos/enrichment/derived_tables.py +214 -0
  94. topos/enrichment/jobs/__init__.py +30 -0
  95. topos/enrichment/jobs/base.py +54 -0
  96. topos/enrichment/jobs/canonical/__init__.py +1 -0
  97. topos/enrichment/jobs/canonical/embeddings_job.py +27 -0
  98. topos/enrichment/jobs/canonical/emo_27_job.py +97 -0
  99. topos/enrichment/jobs/canonical/entities_job.py +27 -0
  100. topos/enrichment/jobs/canonical/sentiment_job.py +27 -0
  101. topos/enrichment/jobs/canonical/topics_job.py +27 -0
  102. topos/enrichment/jobs/raw/__init__.py +1 -0
  103. topos/enrichment/jobs/raw/attachments_job.py +12 -0
  104. topos/enrichment/jobs/raw/language_job.py +12 -0
  105. topos/enrichment/jobs/raw/time_normalization_job.py +12 -0
  106. topos/enrichment/jobs/raw/tool_calls_job.py +12 -0
  107. topos/enrichment/models/__init__.py +1 -0
  108. topos/enrichment/models/manager.py +8 -0
  109. topos/enrichment/models/registry.py +71 -0
  110. topos/enrichment/models/versioning.py +8 -0
  111. topos/enrichment/orchestrator.py +177 -0
  112. topos/enrichment/processor.py +17 -0
  113. topos/enrichment/progress_bar.py +122 -0
  114. topos/enrichment/website_classifier.py +31 -0
  115. topos/filter_lab/__init__.py +1 -0
  116. topos/filter_lab/bundles.py +300 -0
  117. topos/filter_lab/schema.py +86 -0
  118. topos/filter_lab/service.py +167 -0
  119. topos/filter_lab/store.py +374 -0
  120. topos/filter_lab/worker.py +250 -0
  121. topos/hosted_pool_lease.py +153 -0
  122. topos/ingestion/__init__.py +1 -0
  123. topos/ingestion/checkpoints/__init__.py +6 -0
  124. topos/ingestion/checkpoints/checkpoint_store.py +24 -0
  125. topos/ingestion/checkpoints/sqlite_checkpoint_store.py +82 -0
  126. topos/ingestion/ingest_helpers.py +504 -0
  127. topos/ingestion/jobs.py +91 -0
  128. topos/ingestion/local_sync.py +823 -0
  129. topos/ingestion/log_preview.py +21 -0
  130. topos/ingestion/manager.py +1100 -0
  131. topos/ingestion/parser.py +174 -0
  132. topos/ingestion/parsers/__init__.py +32 -0
  133. topos/ingestion/parsers/base.py +24 -0
  134. topos/ingestion/parsers/browser_parser.py +171 -0
  135. topos/ingestion/parsers/calendar_parser.py +21 -0
  136. topos/ingestion/parsers/chatgpt_conversation_flattener.py +266 -0
  137. topos/ingestion/parsers/chatgpt_parser.py +67 -0
  138. topos/ingestion/parsers/grok_parser.py +21 -0
  139. topos/ingestion/parsers/messenger_parser.py +97 -0
  140. topos/ingestion/progress.py +54 -0
  141. topos/ingestion/sources/__init__.py +20 -0
  142. topos/ingestion/sources/base.py +39 -0
  143. topos/ingestion/sources/calendar.py +29 -0
  144. topos/ingestion/sources/chatgpt.py +29 -0
  145. topos/ingestion/sources/contact_importers.py +274 -0
  146. topos/ingestion/sources/grok.py +29 -0
  147. topos/ingestion/sources/imessage_reader.py +479 -0
  148. topos/ingestion/sources/signal_export_parser.py +132 -0
  149. topos/ingestion/sources/signal_reader.py +491 -0
  150. topos/ingestion/state_machine.py +70 -0
  151. topos/ingestion/triggers/__init__.py +1 -0
  152. topos/ingestion/triggers/file_trigger.py +36 -0
  153. topos/ingestion/triggers/sqlite_trigger.py +18 -0
  154. topos/ingestion/validation/__init__.py +1 -0
  155. topos/ingestion/validation/base.py +27 -0
  156. topos/ingestion/validation/schema_registry.py +111 -0
  157. topos/ingestion/validation/schema_validator.py +13 -0
  158. topos/lineage/__init__.py +1 -0
  159. topos/lineage/provenance.py +9 -0
  160. topos/lineage/tracker.py +9 -0
  161. topos/mcp_stdio_proxy.py +83 -0
  162. topos/observability/__init__.py +1 -0
  163. topos/observability/alerts.py +7 -0
  164. topos/observability/metrics.py +25 -0
  165. topos/observability/tracing.py +18 -0
  166. topos/openai_client.py +69 -0
  167. topos/projections/__init__.py +1 -0
  168. topos/projections/vector_index/__init__.py +1 -0
  169. topos/projections/vector_index/base.py +21 -0
  170. topos/projections/vector_index/builders.py +11 -0
  171. topos/projections/vector_index/health_checks.py +5 -0
  172. topos/rate_limit.py +43 -0
  173. topos/sanitization/__init__.py +16 -0
  174. topos/sanitization/ollama_transforms.py +276 -0
  175. topos/scope_resolution.py +89 -0
  176. topos/services/__init__.py +1 -0
  177. topos/services/container.py +46 -0
  178. topos/services/embeddings/__init__.py +1 -0
  179. topos/services/embeddings/base.py +7 -0
  180. topos/services/embeddings/local.py +9 -0
  181. topos/services/embeddings/remote.py +9 -0
  182. topos/services/interfaces.py +40 -0
  183. topos/services/llm/__init__.py +1 -0
  184. topos/services/llm/base.py +7 -0
  185. topos/services/llm/openai.py +126 -0
  186. topos/services/local.py +123 -0
  187. topos/services/postgres.py +385 -0
  188. topos/sources/__init__.py +6 -0
  189. topos/sources/definitions.py +114 -0
  190. topos/sources/install_service.py +836 -0
  191. topos/sources/registry.py +263 -0
  192. topos/sources/runtime_install.py +427 -0
  193. topos/storage/__init__.py +1 -0
  194. topos/storage/canonical/__init__.py +18 -0
  195. topos/storage/canonical/ai_chat/__init__.py +22 -0
  196. topos/storage/canonical/ai_chat/canonicalizer.py +147 -0
  197. topos/storage/canonical/ai_chat/mapper.py +168 -0
  198. topos/storage/canonical/ai_chat/model.py +87 -0
  199. topos/storage/canonical/ai_chat/tables.py +179 -0
  200. topos/storage/canonical/canonical_store.py +24 -0
  201. topos/storage/canonical/conversations_tables.py +1020 -0
  202. topos/storage/canonical/mapping_store.py +30 -0
  203. topos/storage/canonical/postgres.py +10 -0
  204. topos/storage/db/__init__.py +1 -0
  205. topos/storage/db/client.py +8 -0
  206. topos/storage/db/migrations/__init__.py +1 -0
  207. topos/storage/db/migrations/stage9_column_renames.py +78 -0
  208. topos/storage/db/paths.py +122 -0
  209. topos/storage/db/postgres.py +240 -0
  210. topos/storage/db/schema.py +6 -0
  211. topos/storage/enrichment/__init__.py +1 -0
  212. topos/storage/enrichment/canonical_enrichment_store.py +7 -0
  213. topos/storage/enrichment/raw_enrichment_store.py +18 -0
  214. topos/storage/normalized/__init__.py +1 -0
  215. topos/storage/normalized/normalized_store.py +24 -0
  216. topos/storage/oplog/__init__.py +1 -0
  217. topos/storage/oplog/decision.py +6 -0
  218. topos/storage/oplog/oplog_store.py +17 -0
  219. topos/storage/oplog/postgres.py +10 -0
  220. topos/storage/projections/__init__.py +1 -0
  221. topos/storage/projections/index_ops_store.py +6 -0
  222. topos/storage/projections/vector_index_store.py +6 -0
  223. topos/storage/raw/__init__.py +1 -0
  224. topos/storage/raw/browser_flat_tables.py +303 -0
  225. topos/storage/raw/file_store.py +100 -0
  226. topos/storage/raw/raw_store.py +29 -0
  227. topos/storage/raw/raw_tables_manager.py +295 -0
  228. topos/storage/raw/sqlite_raw_store.py +17 -0
  229. topos/storage/security/encryption.py +21 -0
  230. topos/storage/signal_identity.py +71 -0
  231. topos/storage/source_settings.py +116 -0
  232. topos/storage/user_identity.py +69 -0
  233. topos/sync/__init__.py +5 -0
  234. topos/sync/client.py +272 -0
  235. topos/sync_handlers.py +70 -0
  236. topos/testing/__init__.py +1 -0
  237. topos/testing/lifespan.py +7 -0
  238. topos/uma_contact_enrichment.py +1032 -0
  239. topos/uma_filters.py +669 -0
  240. topos/uma_resource_id.py +24 -0
  241. topos/uma_rpt.py +69 -0
  242. topos/utils/base_object.py +61 -0
  243. topos/websocket_client.py +21 -0
  244. topos_node-0.1.0.dist-info/METADATA +199 -0
  245. topos_node-0.1.0.dist-info/RECORD +249 -0
  246. topos_node-0.1.0.dist-info/WHEEL +5 -0
  247. topos_node-0.1.0.dist-info/entry_points.txt +2 -0
  248. topos_node-0.1.0.dist-info/licenses/LICENSE +201 -0
  249. 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,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ topos-node = topos.cli.commands:main