topos-node 0.1.0__tar.gz → 0.1.1__tar.gz

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 (255) hide show
  1. {topos_node-0.1.0/topos_node.egg-info → topos_node-0.1.1}/PKG-INFO +1 -1
  2. {topos_node-0.1.0 → topos_node-0.1.1}/pyproject.toml +1 -1
  3. {topos_node-0.1.0 → topos_node-0.1.1}/topos/__version__.py +2 -2
  4. topos_node-0.1.1/topos/cli/commands.py +243 -0
  5. {topos_node-0.1.0 → topos_node-0.1.1/topos_node.egg-info}/PKG-INFO +1 -1
  6. topos_node-0.1.0/topos/cli/commands.py +0 -132
  7. {topos_node-0.1.0 → topos_node-0.1.1}/LICENSE +0 -0
  8. {topos_node-0.1.0 → topos_node-0.1.1}/README.md +0 -0
  9. {topos_node-0.1.0 → topos_node-0.1.1}/setup.cfg +0 -0
  10. {topos_node-0.1.0 → topos_node-0.1.1}/shared/__init__.py +0 -0
  11. {topos_node-0.1.0 → topos_node-0.1.1}/shared/filtering.py +0 -0
  12. {topos_node-0.1.0 → topos_node-0.1.1}/shared/schema_registry.py +0 -0
  13. {topos_node-0.1.0 → topos_node-0.1.1}/topos/__init__.py +0 -0
  14. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/__init__.py +0 -0
  15. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/duckdb_adapter.py +0 -0
  16. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/messenger_communities.py +0 -0
  17. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/messenger_graph.py +0 -0
  18. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/messenger_labels.py +0 -0
  19. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/profiles.py +0 -0
  20. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/query_engine.py +0 -0
  21. {topos_node-0.1.0 → topos_node-0.1.1}/topos/analytics/raw_queries.py +0 -0
  22. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/__init__.py +0 -0
  23. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/analytics.py +0 -0
  24. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/app_registry.py +0 -0
  25. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/backup.py +0 -0
  26. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/compute_remote.py +0 -0
  27. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/data_commit.py +0 -0
  28. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/data_explorer_table_prefs.py +0 -0
  29. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/db.py +0 -0
  30. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/device.py +0 -0
  31. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/enrichment.py +0 -0
  32. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/filter_lab.py +0 -0
  33. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/health.py +0 -0
  34. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/ingestion_api.py +0 -0
  35. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/ingestion_compat.py +0 -0
  36. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/ingestion_sources.py +0 -0
  37. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/llm.py +0 -0
  38. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/local_mcp.py +0 -0
  39. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/messenger_analytics.py +0 -0
  40. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/query_api.py +0 -0
  41. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/sanitization_ollama_config.py +0 -0
  42. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/source_install.py +0 -0
  43. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/sources.py +0 -0
  44. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/sync.py +0 -0
  45. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/ui_config.py +0 -0
  46. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/uma_data.py +0 -0
  47. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/usage.py +0 -0
  48. {topos_node-0.1.0 → topos_node-0.1.1}/topos/api/user_identity.py +0 -0
  49. {topos_node-0.1.0 → topos_node-0.1.1}/topos/app.py +0 -0
  50. {topos_node-0.1.0 → topos_node-0.1.1}/topos/auth.py +0 -0
  51. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/__init__.py +0 -0
  52. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/mappers/__init__.py +0 -0
  53. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/mappers/base.py +0 -0
  54. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  55. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  56. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  57. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/models.py +0 -0
  58. {topos_node-0.1.0 → topos_node-0.1.1}/topos/canonicalization/resolver.py +0 -0
  59. {topos_node-0.1.0 → topos_node-0.1.1}/topos/cli/__init__.py +0 -0
  60. {topos_node-0.1.0 → topos_node-0.1.1}/topos/cli/__main__.py +0 -0
  61. {topos_node-0.1.0 → topos_node-0.1.1}/topos/config/__init__.py +0 -0
  62. {topos_node-0.1.0 → topos_node-0.1.1}/topos/config/sanitization_ollama.py +0 -0
  63. {topos_node-0.1.0 → topos_node-0.1.1}/topos/config/settings.py +0 -0
  64. {topos_node-0.1.0 → topos_node-0.1.1}/topos/contacts/__init__.py +0 -0
  65. {topos_node-0.1.0 → topos_node-0.1.1}/topos/contacts/identity.py +0 -0
  66. {topos_node-0.1.0 → topos_node-0.1.1}/topos/control_plane_client.py +0 -0
  67. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/__init__.py +0 -0
  68. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/api_models.py +0 -0
  69. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/connection_resilience.py +0 -0
  70. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/device_helpers.py +0 -0
  71. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/errors.py +0 -0
  72. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/events.py +0 -0
  73. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/handlers.py +0 -0
  74. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/logging.py +0 -0
  75. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/metrics.py +0 -0
  76. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/startup_banner.py +0 -0
  77. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/state.py +0 -0
  78. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/table_layers.py +0 -0
  79. {topos_node-0.1.0 → topos_node-0.1.1}/topos/core/types.py +0 -0
  80. {topos_node-0.1.0 → topos_node-0.1.1}/topos/data_explorer_table_prefs.py +0 -0
  81. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/__init__.py +0 -0
  82. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/backends/__init__.py +0 -0
  83. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/backends/base.py +0 -0
  84. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/backends/huggingface.py +0 -0
  85. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/backends/ollama.py +0 -0
  86. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/backends/stub.py +0 -0
  87. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/engine.py +0 -0
  88. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/intake.py +0 -0
  89. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/queue_manager.py +0 -0
  90. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/registration.py +0 -0
  91. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/result_formatter.py +0 -0
  92. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/router.py +0 -0
  93. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/scoped_token.py +0 -0
  94. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/tasks.py +0 -0
  95. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/transport.py +0 -0
  96. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/usage_guard.py +0 -0
  97. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/usage_observation.py +0 -0
  98. {topos_node-0.1.0 → topos_node-0.1.1}/topos/engine/validator.py +0 -0
  99. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/__init__.py +0 -0
  100. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/derived_tables.py +0 -0
  101. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/__init__.py +0 -0
  102. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/base.py +0 -0
  103. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  104. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  105. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  106. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  107. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  108. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  109. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/raw/__init__.py +0 -0
  110. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  111. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/raw/language_job.py +0 -0
  112. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  113. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  114. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/models/__init__.py +0 -0
  115. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/models/manager.py +0 -0
  116. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/models/registry.py +0 -0
  117. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/models/versioning.py +0 -0
  118. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/orchestrator.py +0 -0
  119. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/processor.py +0 -0
  120. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/progress_bar.py +0 -0
  121. {topos_node-0.1.0 → topos_node-0.1.1}/topos/enrichment/website_classifier.py +0 -0
  122. {topos_node-0.1.0 → topos_node-0.1.1}/topos/filter_lab/__init__.py +0 -0
  123. {topos_node-0.1.0 → topos_node-0.1.1}/topos/filter_lab/bundles.py +0 -0
  124. {topos_node-0.1.0 → topos_node-0.1.1}/topos/filter_lab/schema.py +0 -0
  125. {topos_node-0.1.0 → topos_node-0.1.1}/topos/filter_lab/service.py +0 -0
  126. {topos_node-0.1.0 → topos_node-0.1.1}/topos/filter_lab/store.py +0 -0
  127. {topos_node-0.1.0 → topos_node-0.1.1}/topos/filter_lab/worker.py +0 -0
  128. {topos_node-0.1.0 → topos_node-0.1.1}/topos/hosted_pool_lease.py +0 -0
  129. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/__init__.py +0 -0
  130. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/checkpoints/__init__.py +0 -0
  131. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  132. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  133. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/ingest_helpers.py +0 -0
  134. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/jobs.py +0 -0
  135. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/local_sync.py +0 -0
  136. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/log_preview.py +0 -0
  137. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/manager.py +0 -0
  138. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parser.py +0 -0
  139. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/__init__.py +0 -0
  140. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/base.py +0 -0
  141. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/browser_parser.py +0 -0
  142. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/calendar_parser.py +0 -0
  143. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  144. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  145. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/grok_parser.py +0 -0
  146. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/parsers/messenger_parser.py +0 -0
  147. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/progress.py +0 -0
  148. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/__init__.py +0 -0
  149. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/base.py +0 -0
  150. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/calendar.py +0 -0
  151. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/chatgpt.py +0 -0
  152. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/contact_importers.py +0 -0
  153. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/grok.py +0 -0
  154. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/imessage_reader.py +0 -0
  155. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/signal_export_parser.py +0 -0
  156. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/sources/signal_reader.py +0 -0
  157. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/state_machine.py +0 -0
  158. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/triggers/__init__.py +0 -0
  159. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/triggers/file_trigger.py +0 -0
  160. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  161. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/validation/__init__.py +0 -0
  162. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/validation/base.py +0 -0
  163. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/validation/schema_registry.py +0 -0
  164. {topos_node-0.1.0 → topos_node-0.1.1}/topos/ingestion/validation/schema_validator.py +0 -0
  165. {topos_node-0.1.0 → topos_node-0.1.1}/topos/lineage/__init__.py +0 -0
  166. {topos_node-0.1.0 → topos_node-0.1.1}/topos/lineage/provenance.py +0 -0
  167. {topos_node-0.1.0 → topos_node-0.1.1}/topos/lineage/tracker.py +0 -0
  168. {topos_node-0.1.0 → topos_node-0.1.1}/topos/mcp_stdio_proxy.py +0 -0
  169. {topos_node-0.1.0 → topos_node-0.1.1}/topos/observability/__init__.py +0 -0
  170. {topos_node-0.1.0 → topos_node-0.1.1}/topos/observability/alerts.py +0 -0
  171. {topos_node-0.1.0 → topos_node-0.1.1}/topos/observability/metrics.py +0 -0
  172. {topos_node-0.1.0 → topos_node-0.1.1}/topos/observability/tracing.py +0 -0
  173. {topos_node-0.1.0 → topos_node-0.1.1}/topos/openai_client.py +0 -0
  174. {topos_node-0.1.0 → topos_node-0.1.1}/topos/projections/__init__.py +0 -0
  175. {topos_node-0.1.0 → topos_node-0.1.1}/topos/projections/vector_index/__init__.py +0 -0
  176. {topos_node-0.1.0 → topos_node-0.1.1}/topos/projections/vector_index/base.py +0 -0
  177. {topos_node-0.1.0 → topos_node-0.1.1}/topos/projections/vector_index/builders.py +0 -0
  178. {topos_node-0.1.0 → topos_node-0.1.1}/topos/projections/vector_index/health_checks.py +0 -0
  179. {topos_node-0.1.0 → topos_node-0.1.1}/topos/rate_limit.py +0 -0
  180. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sanitization/__init__.py +0 -0
  181. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sanitization/ollama_transforms.py +0 -0
  182. {topos_node-0.1.0 → topos_node-0.1.1}/topos/scope_resolution.py +0 -0
  183. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/__init__.py +0 -0
  184. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/container.py +0 -0
  185. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/embeddings/__init__.py +0 -0
  186. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/embeddings/base.py +0 -0
  187. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/embeddings/local.py +0 -0
  188. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/embeddings/remote.py +0 -0
  189. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/interfaces.py +0 -0
  190. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/llm/__init__.py +0 -0
  191. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/llm/base.py +0 -0
  192. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/llm/openai.py +0 -0
  193. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/local.py +0 -0
  194. {topos_node-0.1.0 → topos_node-0.1.1}/topos/services/postgres.py +0 -0
  195. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sources/__init__.py +0 -0
  196. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sources/definitions.py +0 -0
  197. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sources/install_service.py +0 -0
  198. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sources/registry.py +0 -0
  199. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sources/runtime_install.py +0 -0
  200. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/__init__.py +0 -0
  201. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/__init__.py +0 -0
  202. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  203. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  204. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  205. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/ai_chat/model.py +0 -0
  206. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/ai_chat/tables.py +0 -0
  207. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/canonical_store.py +0 -0
  208. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/conversations_tables.py +0 -0
  209. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/mapping_store.py +0 -0
  210. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/canonical/postgres.py +0 -0
  211. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/__init__.py +0 -0
  212. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/client.py +0 -0
  213. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/migrations/__init__.py +0 -0
  214. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  215. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/paths.py +0 -0
  216. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/postgres.py +0 -0
  217. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/db/schema.py +0 -0
  218. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/enrichment/__init__.py +0 -0
  219. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  220. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  221. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/normalized/__init__.py +0 -0
  222. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/normalized/normalized_store.py +0 -0
  223. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/oplog/__init__.py +0 -0
  224. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/oplog/decision.py +0 -0
  225. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/oplog/oplog_store.py +0 -0
  226. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/oplog/postgres.py +0 -0
  227. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/projections/__init__.py +0 -0
  228. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/projections/index_ops_store.py +0 -0
  229. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/projections/vector_index_store.py +0 -0
  230. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/raw/__init__.py +0 -0
  231. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/raw/browser_flat_tables.py +0 -0
  232. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/raw/file_store.py +0 -0
  233. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/raw/raw_store.py +0 -0
  234. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/raw/raw_tables_manager.py +0 -0
  235. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/raw/sqlite_raw_store.py +0 -0
  236. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/security/encryption.py +0 -0
  237. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/signal_identity.py +0 -0
  238. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/source_settings.py +0 -0
  239. {topos_node-0.1.0 → topos_node-0.1.1}/topos/storage/user_identity.py +0 -0
  240. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sync/__init__.py +0 -0
  241. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sync/client.py +0 -0
  242. {topos_node-0.1.0 → topos_node-0.1.1}/topos/sync_handlers.py +0 -0
  243. {topos_node-0.1.0 → topos_node-0.1.1}/topos/testing/__init__.py +0 -0
  244. {topos_node-0.1.0 → topos_node-0.1.1}/topos/testing/lifespan.py +0 -0
  245. {topos_node-0.1.0 → topos_node-0.1.1}/topos/uma_contact_enrichment.py +0 -0
  246. {topos_node-0.1.0 → topos_node-0.1.1}/topos/uma_filters.py +0 -0
  247. {topos_node-0.1.0 → topos_node-0.1.1}/topos/uma_resource_id.py +0 -0
  248. {topos_node-0.1.0 → topos_node-0.1.1}/topos/uma_rpt.py +0 -0
  249. {topos_node-0.1.0 → topos_node-0.1.1}/topos/utils/base_object.py +0 -0
  250. {topos_node-0.1.0 → topos_node-0.1.1}/topos/websocket_client.py +0 -0
  251. {topos_node-0.1.0 → topos_node-0.1.1}/topos_node.egg-info/SOURCES.txt +0 -0
  252. {topos_node-0.1.0 → topos_node-0.1.1}/topos_node.egg-info/dependency_links.txt +0 -0
  253. {topos_node-0.1.0 → topos_node-0.1.1}/topos_node.egg-info/entry_points.txt +0 -0
  254. {topos_node-0.1.0 → topos_node-0.1.1}/topos_node.egg-info/requires.txt +0 -0
  255. {topos_node-0.1.0 → topos_node-0.1.1}/topos_node.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "topos-node"
7
- version = "0.1.0"
7
+ version = "0.1.1"
8
8
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "0.0.0"
4
- __version_info__ = (0, 0, 0)
3
+ __version__ = "0.1.1"
4
+ __version_info__ = (0, 1, 1)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -0,0 +1,243 @@
1
+ """CLI entry points for Topos."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import os
7
+ import subprocess
8
+ import sys
9
+ from importlib.metadata import PackageNotFoundError, version as package_version
10
+ from pathlib import Path
11
+ from urllib.error import URLError
12
+ from urllib.request import urlopen
13
+
14
+ import click
15
+ import uvicorn
16
+ from packaging.version import InvalidVersion, Version
17
+
18
+ # Add parent directory to path for imports
19
+ sys.path.insert(0, str(Path(__file__).parent.parent.parent))
20
+
21
+ from topos.storage.db.paths import discover_databases
22
+
23
+ USER_ENV_PATH = Path.home() / ".topos" / ".env"
24
+ LEGACY_ENV_PATH = Path(__file__).resolve().parent.parent / ".env"
25
+
26
+
27
+ def _load_env_file(env_path: Path) -> None:
28
+ if not env_path.exists():
29
+ return
30
+ for line in env_path.read_text(encoding="utf-8").splitlines():
31
+ stripped = line.strip()
32
+ if not stripped or stripped.startswith("#") or "=" not in stripped:
33
+ continue
34
+ key, value = stripped.split("=", 1)
35
+ key = key.strip()
36
+ value = value.strip().strip('"').strip("'")
37
+ if key and key not in os.environ:
38
+ os.environ[key] = value
39
+
40
+
41
+ def _save_topos_key(topos_key: str, env_path: Path = USER_ENV_PATH) -> Path:
42
+ env_path.parent.mkdir(parents=True, exist_ok=True)
43
+ lines: list[str] = []
44
+ if env_path.exists():
45
+ lines = env_path.read_text(encoding="utf-8").splitlines()
46
+
47
+ updated = False
48
+ new_lines: list[str] = []
49
+ for line in lines:
50
+ stripped = line.strip()
51
+ if stripped.startswith("TOPOS_KEY="):
52
+ new_lines.append(f"TOPOS_KEY={topos_key}")
53
+ updated = True
54
+ else:
55
+ new_lines.append(line)
56
+
57
+ if not updated:
58
+ if new_lines and new_lines[-1].strip():
59
+ new_lines.append("")
60
+ new_lines.append(f"TOPOS_KEY={topos_key}")
61
+
62
+ env_path.write_text("\n".join(new_lines) + "\n", encoding="utf-8")
63
+ try:
64
+ env_path.chmod(0o600)
65
+ except OSError:
66
+ # Best-effort permissions (e.g. may fail on some filesystems).
67
+ pass
68
+ return env_path
69
+
70
+
71
+ def _can_prompt_for_input() -> bool:
72
+ return sys.stdin.isatty() and sys.stdout.isatty()
73
+
74
+
75
+ def _prompt_for_topos_key() -> str:
76
+ click.echo("TOPOS_KEY is required to connect Topos Node.")
77
+ click.echo("Enter your TOPOS_KEY to save it locally and continue.")
78
+ while True:
79
+ key = click.prompt("TOPOS_KEY", hide_input=True).strip()
80
+ if key:
81
+ return key
82
+ click.echo("TOPOS_KEY cannot be empty. Please try again.")
83
+
84
+
85
+ def _resolve_topos_key(cli_topos_key: str | None, env_path: Path = USER_ENV_PATH) -> str:
86
+ if cli_topos_key:
87
+ os.environ["TOPOS_KEY"] = cli_topos_key
88
+ return cli_topos_key
89
+
90
+ existing_key = (os.getenv("TOPOS_KEY") or "").strip()
91
+ if existing_key:
92
+ os.environ["TOPOS_KEY"] = existing_key
93
+ return existing_key
94
+
95
+ if _can_prompt_for_input():
96
+ prompted_key = _prompt_for_topos_key()
97
+ saved_path = _save_topos_key(prompted_key, env_path=env_path)
98
+ os.environ["TOPOS_KEY"] = prompted_key
99
+ click.echo(f"Saved TOPOS_KEY to {saved_path}")
100
+ click.echo("Connecting with saved TOPOS_KEY...")
101
+ return prompted_key
102
+
103
+ raise click.ClickException(
104
+ "TOPOS_KEY is not configured. Run `topos-node --set-topos-key <YOUR_TOPOS_KEY>` "
105
+ "or provide `--topos-key` for this run."
106
+ )
107
+
108
+
109
+ def _get_installed_package_version(package_name: str) -> str | None:
110
+ try:
111
+ return package_version(package_name)
112
+ except PackageNotFoundError:
113
+ return None
114
+
115
+
116
+ def _get_latest_pypi_version(package_name: str, timeout_seconds: float = 2.0) -> str | None:
117
+ url = f"https://pypi.org/pypi/{package_name}/json"
118
+ try:
119
+ with urlopen(url, timeout=timeout_seconds) as response:
120
+ payload = json.loads(response.read().decode("utf-8"))
121
+ except (OSError, URLError, ValueError):
122
+ return None
123
+ return str(payload.get("info", {}).get("version") or "").strip() or None
124
+
125
+
126
+ def _should_skip_update_check(skip_update_check: bool) -> bool:
127
+ if skip_update_check:
128
+ return True
129
+ env_value = (os.getenv("TOPOS_SKIP_UPDATE_CHECK") or "").strip().lower()
130
+ return env_value in {"1", "true", "yes", "on"}
131
+
132
+
133
+ def _maybe_offer_self_update(
134
+ skip_update_check: bool,
135
+ package_name: str = "topos-node",
136
+ ) -> bool:
137
+ if _should_skip_update_check(skip_update_check):
138
+ return False
139
+
140
+ installed = _get_installed_package_version(package_name)
141
+ if not installed:
142
+ return False
143
+
144
+ latest = _get_latest_pypi_version(package_name)
145
+ if not latest:
146
+ return False
147
+
148
+ try:
149
+ if Version(latest) <= Version(installed):
150
+ return False
151
+ except InvalidVersion:
152
+ return False
153
+
154
+ click.echo(f"Update available for {package_name}: {installed} -> {latest}")
155
+ if not _can_prompt_for_input():
156
+ click.echo(f"Run `uv tool upgrade {package_name}` to update.")
157
+ return False
158
+
159
+ if not click.confirm("Install the latest version now?", default=True):
160
+ return False
161
+
162
+ click.echo(f"Updating {package_name}...")
163
+ result = subprocess.run(["uv", "tool", "upgrade", package_name], check=False)
164
+ if result.returncode != 0:
165
+ click.echo("Update failed. Continuing with current version.")
166
+ return False
167
+
168
+ click.echo("Update installed. Please re-run `topos-node` to use the latest version.")
169
+ return True
170
+
171
+
172
+ @click.command()
173
+ @click.option(
174
+ "--db-path",
175
+ help="Database file path (SQLite). If not specified, uses auto-discovery.",
176
+ )
177
+ @click.option(
178
+ "--topos-key",
179
+ help="Topos key for this run (overrides saved key).",
180
+ )
181
+ @click.option(
182
+ "--set-topos-key",
183
+ metavar="KEY",
184
+ help="Save TOPOS_KEY to ~/.topos/.env and exit.",
185
+ )
186
+ @click.option(
187
+ "--discover",
188
+ is_flag=True,
189
+ help="Show discovered databases and exit",
190
+ )
191
+ @click.option(
192
+ "--port",
193
+ default=9000,
194
+ help="Server port (default: 9000)",
195
+ )
196
+ @click.option(
197
+ "--host",
198
+ default="0.0.0.0",
199
+ help="Host to bind to (default: 0.0.0.0)",
200
+ )
201
+ @click.option(
202
+ "--skip-update-check",
203
+ is_flag=True,
204
+ help="Skip checking PyPI for a newer topos-node version.",
205
+ )
206
+ def main(db_path, topos_key, set_topos_key, discover, port, host, skip_update_check) -> None:
207
+ """Topos Control Plane API entry point."""
208
+ if set_topos_key:
209
+ env_path = _save_topos_key(set_topos_key)
210
+ click.echo(f"Saved TOPOS_KEY to {env_path}")
211
+ click.echo("You can now run: topos-node")
212
+ return
213
+
214
+ if discover:
215
+ databases = discover_databases()
216
+ if databases:
217
+ click.echo("Discovered databases:")
218
+ for db in databases:
219
+ click.echo(f" - {db}")
220
+ else:
221
+ click.echo("No existing databases found")
222
+ return
223
+
224
+ if _maybe_offer_self_update(skip_update_check=skip_update_check):
225
+ return
226
+
227
+ _load_env_file(USER_ENV_PATH)
228
+ _load_env_file(LEGACY_ENV_PATH)
229
+
230
+ _resolve_topos_key(topos_key)
231
+
232
+ from topos.app import app
233
+
234
+ if db_path:
235
+ os.environ["TOPOS_DATABASE_PATH"] = db_path
236
+ click.echo(f"Database path: {db_path}")
237
+
238
+ click.echo(f"Starting topos API on {host}:{port}")
239
+ uvicorn.run(app, host=host, port=port)
240
+
241
+
242
+ if __name__ == "__main__":
243
+ main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -1,132 +0,0 @@
1
- """CLI entry points for Topos."""
2
-
3
- from __future__ import annotations
4
-
5
- import os
6
- import sys
7
- from pathlib import Path
8
-
9
- import click
10
- import uvicorn
11
-
12
- # Add parent directory to path for imports
13
- sys.path.insert(0, str(Path(__file__).parent.parent.parent))
14
-
15
- from topos.storage.db.paths import discover_databases
16
-
17
- USER_ENV_PATH = Path.home() / ".topos" / ".env"
18
- LEGACY_ENV_PATH = Path(__file__).resolve().parent.parent / ".env"
19
-
20
-
21
- def _load_env_file(env_path: Path) -> None:
22
- if not env_path.exists():
23
- return
24
- for line in env_path.read_text(encoding="utf-8").splitlines():
25
- stripped = line.strip()
26
- if not stripped or stripped.startswith("#") or "=" not in stripped:
27
- continue
28
- key, value = stripped.split("=", 1)
29
- key = key.strip()
30
- value = value.strip().strip('"').strip("'")
31
- if key and key not in os.environ:
32
- os.environ[key] = value
33
-
34
-
35
- def _save_topos_key(topos_key: str, env_path: Path = USER_ENV_PATH) -> Path:
36
- env_path.parent.mkdir(parents=True, exist_ok=True)
37
- lines: list[str] = []
38
- if env_path.exists():
39
- lines = env_path.read_text(encoding="utf-8").splitlines()
40
-
41
- updated = False
42
- new_lines: list[str] = []
43
- for line in lines:
44
- stripped = line.strip()
45
- if stripped.startswith("TOPOS_KEY="):
46
- new_lines.append(f"TOPOS_KEY={topos_key}")
47
- updated = True
48
- else:
49
- new_lines.append(line)
50
-
51
- if not updated:
52
- if new_lines and new_lines[-1].strip():
53
- new_lines.append("")
54
- new_lines.append(f"TOPOS_KEY={topos_key}")
55
-
56
- env_path.write_text("\n".join(new_lines) + "\n", encoding="utf-8")
57
- try:
58
- env_path.chmod(0o600)
59
- except OSError:
60
- # Best-effort permissions (e.g. may fail on some filesystems).
61
- pass
62
- return env_path
63
-
64
-
65
- @click.command()
66
- @click.option(
67
- "--db-path",
68
- help="Database file path (SQLite). If not specified, uses auto-discovery.",
69
- )
70
- @click.option(
71
- "--topos-key",
72
- help="Topos key for this run (overrides saved key).",
73
- )
74
- @click.option(
75
- "--set-topos-key",
76
- metavar="KEY",
77
- help="Save TOPOS_KEY to ~/.topos/.env and exit.",
78
- )
79
- @click.option(
80
- "--discover",
81
- is_flag=True,
82
- help="Show discovered databases and exit",
83
- )
84
- @click.option(
85
- "--port",
86
- default=9000,
87
- help="Server port (default: 9000)",
88
- )
89
- @click.option(
90
- "--host",
91
- default="0.0.0.0",
92
- help="Host to bind to (default: 0.0.0.0)",
93
- )
94
- def main(db_path, topos_key, set_topos_key, discover, port, host) -> None:
95
- """Topos Control Plane API entry point."""
96
- if set_topos_key:
97
- env_path = _save_topos_key(set_topos_key)
98
- click.echo(f"Saved TOPOS_KEY to {env_path}")
99
- click.echo("You can now run: topos-node")
100
- return
101
-
102
- if discover:
103
- databases = discover_databases()
104
- if databases:
105
- click.echo("Discovered databases:")
106
- for db in databases:
107
- click.echo(f" - {db}")
108
- else:
109
- click.echo("No existing databases found")
110
- return
111
-
112
- _load_env_file(USER_ENV_PATH)
113
- _load_env_file(LEGACY_ENV_PATH)
114
-
115
- if topos_key:
116
- os.environ["TOPOS_KEY"] = topos_key
117
- elif not os.getenv("TOPOS_KEY"):
118
- os.environ["TOPOS_KEY"] = "dev-key"
119
- click.echo("TOPOS_KEY not set; using local dev key")
120
-
121
- from topos.app import app
122
-
123
- if db_path:
124
- os.environ["TOPOS_DATABASE_PATH"] = db_path
125
- click.echo(f"Database path: {db_path}")
126
-
127
- click.echo(f"Starting topos API on {host}:{port}")
128
- uvicorn.run(app, host=host, port=port)
129
-
130
-
131
- if __name__ == "__main__":
132
- main()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes