topos-node 1.0.0__tar.gz → 1.0.2__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 (406) hide show
  1. {topos_node-1.0.0 → topos_node-1.0.2}/PKG-INFO +12 -12
  2. {topos_node-1.0.0 → topos_node-1.0.2}/README.md +1 -1
  3. {topos_node-1.0.0 → topos_node-1.0.2}/pyproject.toml +13 -14
  4. {topos_node-1.0.0 → topos_node-1.0.2}/topos/__version__.py +2 -2
  5. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/enrichment.py +3 -3
  6. {topos_node-1.0.0 → topos_node-1.0.2}/topos/config/settings.py +3 -0
  7. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/handlers.py +18 -18
  8. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/logging.py +56 -2
  9. {topos_node-1.0.0 → topos_node-1.0.2}/topos/disclosure/privacy_layer.py +3 -3
  10. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/huggingface.py +6 -1
  11. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/topic_clusters_job.py +2 -2
  12. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/orchestrator.py +8 -8
  13. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/canonical_pipeline.py +1 -1
  14. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/ingest_helpers.py +7 -7
  15. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/manager.py +5 -5
  16. {topos_node-1.0.0 → topos_node-1.0.2}/topos/pipeline/envelope.py +1 -1
  17. {topos_node-1.0.0 → topos_node-1.0.2}/topos/pipeline/stub_enqueue.py +1 -1
  18. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/scrub_service.py +1 -1
  19. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/raw/browser_flat_tables.py +3 -3
  20. {topos_node-1.0.0 → topos_node-1.0.2}/topos_node.egg-info/PKG-INFO +12 -12
  21. {topos_node-1.0.0 → topos_node-1.0.2}/LICENSE +0 -0
  22. {topos_node-1.0.0 → topos_node-1.0.2}/setup.cfg +0 -0
  23. {topos_node-1.0.0 → topos_node-1.0.2}/shared/__init__.py +0 -0
  24. {topos_node-1.0.0 → topos_node-1.0.2}/shared/filtering.py +0 -0
  25. {topos_node-1.0.0 → topos_node-1.0.2}/shared/schema_registry.py +0 -0
  26. {topos_node-1.0.0 → topos_node-1.0.2}/tests/test_llm_integrations_storage.py +0 -0
  27. {topos_node-1.0.0 → topos_node-1.0.2}/topos/__init__.py +0 -0
  28. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/__init__.py +0 -0
  29. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/duckdb_adapter.py +0 -0
  30. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/messenger_communities.py +0 -0
  31. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/messenger_graph.py +0 -0
  32. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/messenger_labels.py +0 -0
  33. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/profiles.py +0 -0
  34. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/query_engine.py +0 -0
  35. {topos_node-1.0.0 → topos_node-1.0.2}/topos/analytics/raw_queries.py +0 -0
  36. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/__init__.py +0 -0
  37. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/analytics.py +0 -0
  38. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/app_registry.py +0 -0
  39. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/backup.py +0 -0
  40. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/compute_remote.py +0 -0
  41. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/data_commit.py +0 -0
  42. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/data_explorer_table_prefs.py +0 -0
  43. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/database_explorer.py +0 -0
  44. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/db.py +0 -0
  45. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/device.py +0 -0
  46. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/filter_lab.py +0 -0
  47. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/health.py +0 -0
  48. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/home_chat.py +0 -0
  49. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/ingestion_api.py +0 -0
  50. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/ingestion_compat.py +0 -0
  51. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/ingestion_sources.py +0 -0
  52. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/llm.py +0 -0
  53. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/local_mcp.py +0 -0
  54. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/messenger_analytics.py +0 -0
  55. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/privacy_disclose.py +0 -0
  56. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/query_api.py +0 -0
  57. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/runtime_bootstrap.py +0 -0
  58. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/sanitization_ollama_config.py +0 -0
  59. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/signal.py +0 -0
  60. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/signal_extraction_config.py +0 -0
  61. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/source_install.py +0 -0
  62. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/source_scrub.py +0 -0
  63. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/sources.py +0 -0
  64. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/sources_overview.py +0 -0
  65. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/sync.py +0 -0
  66. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/ui_config.py +0 -0
  67. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/uma_data.py +0 -0
  68. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/usage.py +0 -0
  69. {topos_node-1.0.0 → topos_node-1.0.2}/topos/api/user_identity.py +0 -0
  70. {topos_node-1.0.0 → topos_node-1.0.2}/topos/app.py +0 -0
  71. {topos_node-1.0.0 → topos_node-1.0.2}/topos/auth.py +0 -0
  72. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/__init__.py +0 -0
  73. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/__init__.py +0 -0
  74. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/base.py +0 -0
  75. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  76. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  77. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  78. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  79. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  80. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/models.py +0 -0
  81. {topos_node-1.0.0 → topos_node-1.0.2}/topos/canonicalization/resolver.py +0 -0
  82. {topos_node-1.0.0 → topos_node-1.0.2}/topos/cli/__init__.py +0 -0
  83. {topos_node-1.0.0 → topos_node-1.0.2}/topos/cli/__main__.py +0 -0
  84. {topos_node-1.0.0 → topos_node-1.0.2}/topos/cli/commands.py +0 -0
  85. {topos_node-1.0.0 → topos_node-1.0.2}/topos/config/__init__.py +0 -0
  86. {topos_node-1.0.0 → topos_node-1.0.2}/topos/config/sanitization_ollama.py +0 -0
  87. {topos_node-1.0.0 → topos_node-1.0.2}/topos/config/signal_extraction.py +0 -0
  88. {topos_node-1.0.0 → topos_node-1.0.2}/topos/contacts/__init__.py +0 -0
  89. {topos_node-1.0.0 → topos_node-1.0.2}/topos/contacts/identity.py +0 -0
  90. {topos_node-1.0.0 → topos_node-1.0.2}/topos/control_plane_client.py +0 -0
  91. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/__init__.py +0 -0
  92. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/api_models.py +0 -0
  93. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/connection_resilience.py +0 -0
  94. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/device_helpers.py +0 -0
  95. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/errors.py +0 -0
  96. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/events.py +0 -0
  97. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/metrics.py +0 -0
  98. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/routine_access.py +0 -0
  99. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/startup_banner.py +0 -0
  100. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/state.py +0 -0
  101. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/table_layers.py +0 -0
  102. {topos_node-1.0.0 → topos_node-1.0.2}/topos/core/types.py +0 -0
  103. {topos_node-1.0.0 → topos_node-1.0.2}/topos/data_explorer_row_delete.py +0 -0
  104. {topos_node-1.0.0 → topos_node-1.0.2}/topos/data_explorer_table_prefs.py +0 -0
  105. {topos_node-1.0.0 → topos_node-1.0.2}/topos/data_explorer_tables.py +0 -0
  106. {topos_node-1.0.0 → topos_node-1.0.2}/topos/disclosure/__init__.py +0 -0
  107. {topos_node-1.0.0 → topos_node-1.0.2}/topos/disclosure/canonical_writer.py +0 -0
  108. {topos_node-1.0.0 → topos_node-1.0.2}/topos/disclosure/content_policy.py +0 -0
  109. {topos_node-1.0.0 → topos_node-1.0.2}/topos/disclosure/field_registry.py +0 -0
  110. {topos_node-1.0.0 → topos_node-1.0.2}/topos/disclosure/tier.py +0 -0
  111. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/__init__.py +0 -0
  112. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/__init__.py +0 -0
  113. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/base.py +0 -0
  114. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/generative_prompts.py +0 -0
  115. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/generative_response.py +0 -0
  116. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/ollama.py +0 -0
  117. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/openai.py +0 -0
  118. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/openai_compatible.py +0 -0
  119. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/redpill.py +0 -0
  120. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/backends/stub.py +0 -0
  121. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/engine.py +0 -0
  122. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/intake.py +0 -0
  123. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/queue_manager.py +0 -0
  124. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/registration.py +0 -0
  125. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/result_formatter.py +0 -0
  126. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/router.py +0 -0
  127. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/scoped_token.py +0 -0
  128. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/tasks.py +0 -0
  129. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/transport.py +0 -0
  130. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/usage_guard.py +0 -0
  131. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/usage_observation.py +0 -0
  132. {topos_node-1.0.0 → topos_node-1.0.2}/topos/engine/validator.py +0 -0
  133. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/__init__.py +0 -0
  134. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/derived_tables.py +0 -0
  135. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/job_writer.py +0 -0
  136. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/__init__.py +0 -0
  137. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/base.py +0 -0
  138. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  139. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  140. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  141. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  142. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  143. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  144. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  145. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  146. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  147. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  148. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  149. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  150. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  151. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  152. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/url_classification_core.py +0 -0
  153. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/url_classification_enrichment_job.py +0 -0
  154. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/canonical/url_classification_signal_job.py +0 -0
  155. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
  156. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  157. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
  158. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  159. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  160. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/models/__init__.py +0 -0
  161. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/models/manager.py +0 -0
  162. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/models/mvp_defaults.py +0 -0
  163. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/models/registry.py +0 -0
  164. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/models/versioning.py +0 -0
  165. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/processor.py +0 -0
  166. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/progress_bar.py +0 -0
  167. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/registry_contract.py +0 -0
  168. {topos_node-1.0.0 → topos_node-1.0.2}/topos/enrichment/website_classifier.py +0 -0
  169. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/fit/evaluator.py +0 -0
  170. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/__init__.py +0 -0
  171. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/brief_canonical_loader.py +0 -0
  172. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/brief_ontology.py +0 -0
  173. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/brief_renderer.py +0 -0
  174. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/brief_schemas.py +0 -0
  175. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/chunking.py +0 -0
  176. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/data_health.py +0 -0
  177. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/dimension_briefs.py +0 -0
  178. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/dimension_definition_loader.py +0 -0
  179. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/dimension_profiles.py +0 -0
  180. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/dimension_registry.py +0 -0
  181. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/extraction/artifact_router.py +0 -0
  182. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/extraction/artifact_store.py +0 -0
  183. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/extraction/rule_extractors.py +0 -0
  184. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/graph_sanitize.py +0 -0
  185. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/hybrid_search.py +0 -0
  186. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/query_embed_cache.py +0 -0
  187. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/schemas.py +0 -0
  188. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/service.py +0 -0
  189. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/signal_object_store.py +0 -0
  190. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/source_hydration.py +0 -0
  191. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/structured_signal.py +0 -0
  192. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/topic_clustering.py +0 -0
  193. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/typed_stores/aggregates.py +0 -0
  194. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  195. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/vector_codec.py +0 -0
  196. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/vector_math.py +0 -0
  197. {topos_node-1.0.0 → topos_node-1.0.2}/topos/features/signal/vector_settings.py +0 -0
  198. {topos_node-1.0.0 → topos_node-1.0.2}/topos/filter_lab/__init__.py +0 -0
  199. {topos_node-1.0.0 → topos_node-1.0.2}/topos/filter_lab/bundles.py +0 -0
  200. {topos_node-1.0.0 → topos_node-1.0.2}/topos/filter_lab/schema.py +0 -0
  201. {topos_node-1.0.0 → topos_node-1.0.2}/topos/filter_lab/service.py +0 -0
  202. {topos_node-1.0.0 → topos_node-1.0.2}/topos/filter_lab/store.py +0 -0
  203. {topos_node-1.0.0 → topos_node-1.0.2}/topos/filter_lab/worker.py +0 -0
  204. {topos_node-1.0.0 → topos_node-1.0.2}/topos/home_chat/__init__.py +0 -0
  205. {topos_node-1.0.0 → topos_node-1.0.2}/topos/home_chat/schema.py +0 -0
  206. {topos_node-1.0.0 → topos_node-1.0.2}/topos/home_chat/store.py +0 -0
  207. {topos_node-1.0.0 → topos_node-1.0.2}/topos/hosted_pool_lease.py +0 -0
  208. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/__init__.py +0 -0
  209. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/checkpoints/__init__.py +0 -0
  210. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  211. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  212. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/inbox_crypto.py +0 -0
  213. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/inbox_drain.py +0 -0
  214. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/jobs.py +0 -0
  215. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/journal_location_fanout.py +0 -0
  216. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/journal_time_log_normalize.py +0 -0
  217. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/local_sync.py +0 -0
  218. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/log_preview.py +0 -0
  219. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parser.py +0 -0
  220. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/__init__.py +0 -0
  221. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/base.py +0 -0
  222. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/browser_parser.py +0 -0
  223. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
  224. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  225. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  226. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  227. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/grok_parser.py +0 -0
  228. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
  229. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  230. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/progress.py +0 -0
  231. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/reprocess.py +0 -0
  232. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/__init__.py +0 -0
  233. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/base.py +0 -0
  234. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/calendar.py +0 -0
  235. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/chatgpt.py +0 -0
  236. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/contact_importers.py +0 -0
  237. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/grok.py +0 -0
  238. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/imessage_reader.py +0 -0
  239. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
  240. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/sources/signal_reader.py +0 -0
  241. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/state_machine.py +0 -0
  242. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/triggers/__init__.py +0 -0
  243. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/triggers/file_trigger.py +0 -0
  244. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  245. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  246. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/validation/__init__.py +0 -0
  247. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/validation/base.py +0 -0
  248. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/validation/schema_registry.py +0 -0
  249. {topos_node-1.0.0 → topos_node-1.0.2}/topos/ingestion/validation/schema_validator.py +0 -0
  250. {topos_node-1.0.0 → topos_node-1.0.2}/topos/lineage/__init__.py +0 -0
  251. {topos_node-1.0.0 → topos_node-1.0.2}/topos/lineage/provenance.py +0 -0
  252. {topos_node-1.0.0 → topos_node-1.0.2}/topos/lineage/tracker.py +0 -0
  253. {topos_node-1.0.0 → topos_node-1.0.2}/topos/llm_integrations_storage.py +0 -0
  254. {topos_node-1.0.0 → topos_node-1.0.2}/topos/mcp_stdio_proxy.py +0 -0
  255. {topos_node-1.0.0 → topos_node-1.0.2}/topos/observability/__init__.py +0 -0
  256. {topos_node-1.0.0 → topos_node-1.0.2}/topos/observability/alerts.py +0 -0
  257. {topos_node-1.0.0 → topos_node-1.0.2}/topos/observability/metrics.py +0 -0
  258. {topos_node-1.0.0 → topos_node-1.0.2}/topos/observability/tracing.py +0 -0
  259. {topos_node-1.0.0 → topos_node-1.0.2}/topos/openai_client.py +0 -0
  260. {topos_node-1.0.0 → topos_node-1.0.2}/topos/pipeline/__init__.py +0 -0
  261. {topos_node-1.0.0 → topos_node-1.0.2}/topos/pipeline/audit.py +0 -0
  262. {topos_node-1.0.0 → topos_node-1.0.2}/topos/pipeline/stages.py +0 -0
  263. {topos_node-1.0.0 → topos_node-1.0.2}/topos/projections/__init__.py +0 -0
  264. {topos_node-1.0.0 → topos_node-1.0.2}/topos/projections/vector_index/__init__.py +0 -0
  265. {topos_node-1.0.0 → topos_node-1.0.2}/topos/projections/vector_index/base.py +0 -0
  266. {topos_node-1.0.0 → topos_node-1.0.2}/topos/projections/vector_index/builders.py +0 -0
  267. {topos_node-1.0.0 → topos_node-1.0.2}/topos/projections/vector_index/health_checks.py +0 -0
  268. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/__init__.py +0 -0
  269. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/audit.py +0 -0
  270. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/disclosure.py +0 -0
  271. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/fingerprint.py +0 -0
  272. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/game_layer.py +0 -0
  273. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/inference.py +0 -0
  274. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/intent.py +0 -0
  275. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/manifest.py +0 -0
  276. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/manifest_validation.py +0 -0
  277. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/pipeline.py +0 -0
  278. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/retrieval.py +0 -0
  279. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/runtime.py +0 -0
  280. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/scope_registry_loader.py +0 -0
  281. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/session.py +0 -0
  282. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/session_utils.py +0 -0
  283. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/source_generation.py +0 -0
  284. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/turn_classifier.py +0 -0
  285. {topos_node-1.0.0 → topos_node-1.0.2}/topos/query/types.py +0 -0
  286. {topos_node-1.0.0 → topos_node-1.0.2}/topos/rate_limit.py +0 -0
  287. {topos_node-1.0.0 → topos_node-1.0.2}/topos/routines/__init__.py +0 -0
  288. {topos_node-1.0.0 → topos_node-1.0.2}/topos/routines/schema.py +0 -0
  289. {topos_node-1.0.0 → topos_node-1.0.2}/topos/routines/store.py +0 -0
  290. {topos_node-1.0.0 → topos_node-1.0.2}/topos/runtime_update.py +0 -0
  291. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sanitization/__init__.py +0 -0
  292. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sanitization/nsfw_classifier.py +0 -0
  293. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sanitization/ollama_transforms.py +0 -0
  294. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sanitization/privacy_filter.py +0 -0
  295. {topos_node-1.0.0 → topos_node-1.0.2}/topos/scope_resolution.py +0 -0
  296. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/__init__.py +0 -0
  297. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/container.py +0 -0
  298. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/embeddings/__init__.py +0 -0
  299. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/embeddings/base.py +0 -0
  300. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/embeddings/local.py +0 -0
  301. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/embeddings/remote.py +0 -0
  302. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/interfaces.py +0 -0
  303. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/llm/__init__.py +0 -0
  304. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/llm/base.py +0 -0
  305. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/llm/openai.py +0 -0
  306. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/local.py +0 -0
  307. {topos_node-1.0.0 → topos_node-1.0.2}/topos/services/postgres.py +0 -0
  308. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/__init__.py +0 -0
  309. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/bundled_canonical_triples.py +0 -0
  310. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/canonical_signal_defaults.py +0 -0
  311. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/definitions.py +0 -0
  312. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/install_service.py +0 -0
  313. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/registry.py +0 -0
  314. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/runtime_install.py +0 -0
  315. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sources/scrub_attribution.py +0 -0
  316. {topos_node-1.0.0 → topos_node-1.0.2}/topos/startup_banner.py +0 -0
  317. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/__init__.py +0 -0
  318. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/__init__.py +0 -0
  319. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/factory.py +0 -0
  320. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/fakes.py +0 -0
  321. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/postgres/stores.py +0 -0
  322. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/protocols.py +0 -0
  323. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/sqlite/__init__.py +0 -0
  324. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/sqlite/stores.py +0 -0
  325. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  326. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/__init__.py +0 -0
  327. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/activity_tables.py +0 -0
  328. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  329. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  330. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  331. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/model.py +0 -0
  332. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
  333. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  334. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/canonical_store.py +0 -0
  335. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/conversations_tables.py +0 -0
  336. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/mapping_store.py +0 -0
  337. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/canonical/postgres.py +0 -0
  338. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/__init__.py +0 -0
  339. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/client.py +0 -0
  340. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/__init__.py +0 -0
  341. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  342. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  343. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  344. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  345. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  346. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  347. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  348. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  349. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  350. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  351. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  352. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/signal_objects.py +0 -0
  353. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  354. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  355. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  356. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  357. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  358. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  359. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  360. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  361. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  362. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  363. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  364. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  365. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/paths.py +0 -0
  366. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/postgres.py +0 -0
  367. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/schema.py +0 -0
  368. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/db/storage_breakdown.py +0 -0
  369. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/enrichment/__init__.py +0 -0
  370. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  371. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  372. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/normalized/__init__.py +0 -0
  373. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/normalized/normalized_store.py +0 -0
  374. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/oplog/__init__.py +0 -0
  375. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/oplog/decision.py +0 -0
  376. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/oplog/oplog_store.py +0 -0
  377. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/oplog/postgres.py +0 -0
  378. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/person/identity_resolver.py +0 -0
  379. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/projections/__init__.py +0 -0
  380. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/projections/index_ops_store.py +0 -0
  381. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/projections/vector_index_store.py +0 -0
  382. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/raw/__init__.py +0 -0
  383. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/raw/file_store.py +0 -0
  384. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/raw/raw_store.py +0 -0
  385. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/raw/raw_tables_manager.py +0 -0
  386. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
  387. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/security/encryption.py +0 -0
  388. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/signal_identity.py +0 -0
  389. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/source_settings.py +0 -0
  390. {topos_node-1.0.0 → topos_node-1.0.2}/topos/storage/user_identity.py +0 -0
  391. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sync/__init__.py +0 -0
  392. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sync/client.py +0 -0
  393. {topos_node-1.0.0 → topos_node-1.0.2}/topos/sync_handlers.py +0 -0
  394. {topos_node-1.0.0 → topos_node-1.0.2}/topos/testing/__init__.py +0 -0
  395. {topos_node-1.0.0 → topos_node-1.0.2}/topos/testing/lifespan.py +0 -0
  396. {topos_node-1.0.0 → topos_node-1.0.2}/topos/uma_contact_enrichment.py +0 -0
  397. {topos_node-1.0.0 → topos_node-1.0.2}/topos/uma_filters.py +0 -0
  398. {topos_node-1.0.0 → topos_node-1.0.2}/topos/uma_resource_id.py +0 -0
  399. {topos_node-1.0.0 → topos_node-1.0.2}/topos/uma_rpt.py +0 -0
  400. {topos_node-1.0.0 → topos_node-1.0.2}/topos/utils/base_object.py +0 -0
  401. {topos_node-1.0.0 → topos_node-1.0.2}/topos/websocket_client.py +0 -0
  402. {topos_node-1.0.0 → topos_node-1.0.2}/topos_node.egg-info/SOURCES.txt +0 -0
  403. {topos_node-1.0.0 → topos_node-1.0.2}/topos_node.egg-info/dependency_links.txt +0 -0
  404. {topos_node-1.0.0 → topos_node-1.0.2}/topos_node.egg-info/entry_points.txt +0 -0
  405. {topos_node-1.0.0 → topos_node-1.0.2}/topos_node.egg-info/requires.txt +10 -10
  406. {topos_node-1.0.0 → topos_node-1.0.2}/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: 1.0.0
3
+ Version: 1.0.2
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
@@ -23,6 +23,16 @@ Requires-Dist: mcp~=1.27.0
23
23
  Requires-Dist: google-cloud-storage~=3.10.1
24
24
  Requires-Dist: google-cloud-run~=0.16.0
25
25
  Requires-Dist: asgi-lifespan~=2.1.0
26
+ Requires-Dist: psycopg[binary]~=3.3.3
27
+ Requires-Dist: duckdb~=1.5.2
28
+ Requires-Dist: torch<3,>=2.8.0
29
+ Requires-Dist: transformers~=5.10.2
30
+ Requires-Dist: huggingface-hub~=1.18.0
31
+ Requires-Dist: tqdm~=4.67.3
32
+ Requires-Dist: hf-xet~=1.5.1
33
+ Requires-Dist: sentence-transformers~=5.6.0
34
+ Requires-Dist: networkx<3.7,>=3.2.1
35
+ Requires-Dist: python-louvain<0.17,>=0.16
26
36
  Provides-Extra: database
27
37
  Requires-Dist: psycopg[binary]~=3.3.3; extra == "database"
28
38
  Provides-Extra: engine
@@ -36,16 +46,6 @@ Requires-Dist: sentence-transformers~=5.6.0; extra == "engine"
36
46
  Requires-Dist: networkx<3.7,>=3.2.1; extra == "engine"
37
47
  Requires-Dist: python-louvain<0.17,>=0.16; extra == "engine"
38
48
  Provides-Extra: local
39
- Requires-Dist: psycopg[binary]~=3.3.3; extra == "local"
40
- Requires-Dist: duckdb~=1.5.2; extra == "local"
41
- Requires-Dist: torch<3,>=2.8.0; extra == "local"
42
- Requires-Dist: transformers~=5.10.2; extra == "local"
43
- Requires-Dist: huggingface-hub~=1.18.0; extra == "local"
44
- Requires-Dist: tqdm~=4.67.3; extra == "local"
45
- Requires-Dist: hf-xet~=1.5.1; extra == "local"
46
- Requires-Dist: sentence-transformers~=5.6.0; extra == "local"
47
- Requires-Dist: networkx<3.7,>=3.2.1; extra == "local"
48
- Requires-Dist: python-louvain<0.17,>=0.16; extra == "local"
49
49
  Provides-Extra: signal
50
50
  Requires-Dist: pysqlcipher3~=1.2.0; extra == "signal"
51
51
  Provides-Extra: dev
@@ -122,7 +122,7 @@ The `shared/` package in this repo is part of the node runtime contract. It cont
122
122
  ### 1) Install
123
123
 
124
124
  ```bash
125
- uv tool install 'topos-node[local]'
125
+ uv tool install topos-node
126
126
  ```
127
127
 
128
128
  ### 2) Configure
@@ -66,7 +66,7 @@ The `shared/` package in this repo is part of the node runtime contract. It cont
66
66
  ### 1) Install
67
67
 
68
68
  ```bash
69
- uv tool install 'topos-node[local]'
69
+ uv tool install topos-node
70
70
  ```
71
71
 
72
72
  ### 2) Configure
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "topos-node"
7
- version = "1.0.0"
7
+ version = "1.0.2"
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"
@@ -25,6 +25,16 @@ dependencies = [
25
25
  "google-cloud-storage~=3.10.1",
26
26
  "google-cloud-run~=0.16.0",
27
27
  "asgi-lifespan~=2.1.0",
28
+ "psycopg[binary]~=3.3.3",
29
+ "duckdb~=1.5.2",
30
+ "torch>=2.8.0,<3",
31
+ "transformers~=5.10.2",
32
+ "huggingface-hub~=1.18.0",
33
+ "tqdm~=4.67.3",
34
+ "hf-xet~=1.5.1",
35
+ "sentence-transformers~=5.6.0",
36
+ "networkx>=3.2.1,<3.7",
37
+ "python-louvain>=0.16,<0.17",
28
38
  ]
29
39
 
30
40
  [project.urls]
@@ -48,19 +58,8 @@ engine = [
48
58
  "networkx>=3.2.1,<3.7",
49
59
  "python-louvain>=0.16,<0.17",
50
60
  ]
51
- # Colocated local node (database + engine on one device). Default for PyPI / uv tool install.
52
- local = [
53
- "psycopg[binary]~=3.3.3",
54
- "duckdb~=1.5.2",
55
- "torch>=2.8.0,<3",
56
- "transformers~=5.10.2",
57
- "huggingface-hub~=1.18.0",
58
- "tqdm~=4.67.3",
59
- "hf-xet~=1.5.1",
60
- "sentence-transformers~=5.6.0",
61
- "networkx>=3.2.1,<3.7",
62
- "python-louvain>=0.16,<0.17",
63
- ]
61
+ # Backward-compatible alias; local runtime deps are in core dependencies.
62
+ local = []
64
63
  signal = [
65
64
  "pysqlcipher3~=1.2.0",
66
65
  ]
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.0.0"
4
- __version_info__ = (1, 0, 0)
3
+ __version__ = "1.0.2"
4
+ __version_info__ = (1, 0, 2)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -94,7 +94,7 @@ async def _backfill_browser_visits_url_classification(
94
94
  )
95
95
  from ..sources.registry import BROWSER_VISITS
96
96
 
97
- logger.info(
97
+ logger.debug(
98
98
  "[PIPELINE:SIGNAL_DERIVE] Browser visits backfill from activity_events only_missing=%s limit=%s",
99
99
  only_missing,
100
100
  limit,
@@ -175,7 +175,7 @@ async def _backfill_browser_visits_url_classification(
175
175
  "rows_failed": failed,
176
176
  "errors": (derive_result.get("errors") or [])[:100],
177
177
  }
178
- logger.info(
178
+ logger.debug(
179
179
  "[PIPELINE:SIGNAL_DERIVE] Browser visits backfill complete: scanned=%d processed=%d skipped=%d failed=%d",
180
180
  summary["rows_scanned"],
181
181
  summary["rows_processed"],
@@ -549,7 +549,7 @@ async def _process_enrichment_core(
549
549
  tables_manager = DerivedTablesManager(conn=db_conn)
550
550
  orchestrator = EnrichmentOrchestrator(tables_manager=tables_manager)
551
551
 
552
- logger.info(
552
+ logger.debug(
553
553
  "[PIPELINE:ENRICHMENT] %s: Manual enrichment triggered: source_id=%s, messages=%d, jobs=%s",
554
554
  orchestrator,
555
555
  source_id,
@@ -8,6 +8,9 @@ from typing import List, Optional
8
8
  from pydantic import Field, model_validator
9
9
  from pydantic_settings import BaseSettings, SettingsConfigDict
10
10
 
11
+ # Set before any huggingface_hub import during app/route loading.
12
+ os.environ.setdefault("HF_HUB_DISABLE_PROGRESS_BARS", "1")
13
+
11
14
 
12
15
  DEFAULT_TOPOS_CONTROL_PLANE_URL = "wss://cp.logu3s.com/ws/engine"
13
16
 
@@ -171,7 +171,7 @@ def _uma_transform_progress_hook(req_id: str, stage_label: str):
171
171
  return
172
172
  state["bucket"] = bucket
173
173
  filter_text = f" filter={current_filter}" if current_filter else ""
174
- logger.info(
174
+ logger.debug(
175
175
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=%s%s %s %s%% (%s/%s)",
176
176
  req_id,
177
177
  stage_label,
@@ -2118,7 +2118,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
2118
2118
  if not existing_user_id:
2119
2119
  # Engine started but no user_id yet - link to authenticated user
2120
2120
  store_user_id(conn, auth_user_id)
2121
- logger.info(
2121
+ logger.debug(
2122
2122
  "[PIPELINE:CONNECTION] Engine had no user_id. Stored auth user_id=%s from control plane. "
2123
2123
  "Engine is now linked to authenticated user.",
2124
2124
  auth_user_id[:8] if auth_user_id else None,
@@ -4178,7 +4178,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
4178
4178
  if not enrichment_name:
4179
4179
  return {"id": req_id, "status": "error", "error": "enrichment_name required"}
4180
4180
  try:
4181
- logger.info(
4181
+ logger.debug(
4182
4182
  "[PIPELINE:ENRICHMENT] source_enrichment_backfill received: source_id=%s enrichment=%s only_missing=%s limit=%s",
4183
4183
  source_id,
4184
4184
  enrichment_name,
@@ -4193,7 +4193,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
4193
4193
  only_missing=bool(only_missing),
4194
4194
  limit=limit,
4195
4195
  )
4196
- logger.info(
4196
+ logger.debug(
4197
4197
  "[PIPELINE:ENRICHMENT] source_enrichment_backfill complete: source_id=%s enrichment=%s rows_scanned=%s rows_processed=%s rows_failed=%s",
4198
4198
  source_id,
4199
4199
  enrichment_name,
@@ -4215,7 +4215,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
4215
4215
  if not enrichment_name:
4216
4216
  return {"id": req_id, "status": "error", "error": "enrichment_name required"}
4217
4217
  try:
4218
- logger.info(
4218
+ logger.debug(
4219
4219
  "[PIPELINE:ENRICHMENT] source_enrichment_test received: source_id=%s enrichment=%s",
4220
4220
  source_id,
4221
4221
  enrichment_name,
@@ -5359,7 +5359,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5359
5359
  requesting_app_id = (payload.get("requesting_app_id") or "").strip() or None
5360
5360
  requesting_app_name = (payload.get("requesting_app_name") or "").strip() or None
5361
5361
  app_display = requesting_app_name or requesting_app_id or "(unknown app)"
5362
- logger.info(
5362
+ logger.debug(
5363
5363
  "[PIPELINE:UMA] uma_get_messages: message_stream=%s, resource_id=%s, dataset_id=%s, limit=%s, offset=%s, requesting_user_email=%s, requesting_app=%s",
5364
5364
  message_stream,
5365
5365
  resource_id[:50] if resource_id else None,
@@ -5502,12 +5502,12 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5502
5502
  pre_name_rows = sum(1 for row in after_contact if row.get("sender_display_name"))
5503
5503
  manifest_for_generic = strip_contact_runtime_filters(filter_manifest)
5504
5504
  transform_diag: Dict[str, Any] = {}
5505
- logger.info(
5505
+ logger.debug(
5506
5506
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=conversation_messages start rows=%s",
5507
5507
  req_id,
5508
5508
  len(after_contact),
5509
5509
  )
5510
- logger.info(
5510
+ logger.debug(
5511
5511
  "[PIPELINE:UMA] contact names: contacts_resolve=%s names_effective=%s "
5512
5512
  "sender_display_name_rows_after_pipeline=%s allowed_scopes=%s",
5513
5513
  contacts_resolve,
@@ -5523,7 +5523,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5523
5523
  diagnostics=transform_diag,
5524
5524
  progress_hook=_uma_transform_progress_hook(req_id, "conversation_messages"),
5525
5525
  )
5526
- logger.info(
5526
+ logger.debug(
5527
5527
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=conversation_messages done applied=%s skipped=%s reasons=%s",
5528
5528
  req_id,
5529
5529
  transform_diag.get("applied_count", 0),
@@ -5532,7 +5532,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5532
5532
  )
5533
5533
  _skip_reasons = transform_diag.get("skip_reasons") or {}
5534
5534
  if _skip_reasons.get("table_mismatch"):
5535
- logger.info(
5535
+ logger.debug(
5536
5536
  "[PIPELINE:UMA] req=%s table_mismatch skips=%s are expected when field_transforms "
5537
5537
  "include other tables (browser_visits, etc.) while processing conversation_messages.",
5538
5538
  req_id,
@@ -5707,7 +5707,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5707
5707
  pre_contact_len,
5708
5708
  )
5709
5709
  transform_diag = {}
5710
- logger.info(
5710
+ logger.debug(
5711
5711
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages start rows=%s",
5712
5712
  req_id,
5713
5713
  len(messages),
@@ -5720,7 +5720,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5720
5720
  diagnostics=transform_diag,
5721
5721
  progress_hook=_uma_transform_progress_hook(req_id, "ai_chat_messages"),
5722
5722
  )
5723
- logger.info(
5723
+ logger.debug(
5724
5724
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages done applied=%s skipped=%s reasons=%s",
5725
5725
  req_id,
5726
5726
  transform_diag.get("applied_count", 0),
@@ -5764,7 +5764,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5764
5764
  pre_contact_len,
5765
5765
  )
5766
5766
  transform_diag = {}
5767
- logger.info(
5767
+ logger.debug(
5768
5768
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages_jsonl start rows=%s",
5769
5769
  req_id,
5770
5770
  len(messages),
@@ -5777,7 +5777,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5777
5777
  diagnostics=transform_diag,
5778
5778
  progress_hook=_uma_transform_progress_hook(req_id, "ai_chat_messages_jsonl"),
5779
5779
  )
5780
- logger.info(
5780
+ logger.debug(
5781
5781
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=ai_chat_messages_jsonl done applied=%s skipped=%s reasons=%s",
5782
5782
  req_id,
5783
5783
  transform_diag.get("applied_count", 0),
@@ -5951,7 +5951,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5951
5951
  rows = all_rows[:limit]
5952
5952
  try:
5953
5953
  transform_diag = {}
5954
- logger.info(
5954
+ logger.debug(
5955
5955
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=rows:%s start rows=%s",
5956
5956
  req_id,
5957
5957
  table_name,
@@ -5965,7 +5965,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
5965
5965
  diagnostics=transform_diag,
5966
5966
  progress_hook=_uma_transform_progress_hook(req_id, f"rows:{table_name}"),
5967
5967
  )
5968
- logger.info(
5968
+ logger.debug(
5969
5969
  "[PIPELINE:UMA][TRANSFORM] req=%s stage=rows:%s done applied=%s skipped=%s reasons=%s",
5970
5970
  req_id,
5971
5971
  table_name,
@@ -6840,7 +6840,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
6840
6840
  sync_options = payload.get("sync_options")
6841
6841
  if source_id == "imessage" and not sync_options:
6842
6842
  sync_options = {"mode": "3m"}
6843
- logger.info(
6843
+ logger.debug(
6844
6844
  "[PIPELINE:SYNC] Engine received source_sync request: source_id=%s dataset_id=%s sync_options=%s (req_id=%s)",
6845
6845
  source_id,
6846
6846
  dataset_id[:24] + "..." if dataset_id and len(dataset_id) > 24 else dataset_id,
@@ -6870,7 +6870,7 @@ async def handle_control_plane_request(message: Dict[str, Any]) -> Optional[Dict
6870
6870
  error,
6871
6871
  exc_info=False,
6872
6872
  )
6873
- logger.info("[PIPELINE:SYNC] source_sync completed: source_id=%s status=%s", source_id, status)
6873
+ logger.debug("[PIPELINE:SYNC] source_sync completed: source_id=%s status=%s", source_id, status)
6874
6874
  if conn and status == "ok":
6875
6875
  update_sync_result(conn, dataset_id, source_id, success=True, last_sync_at=datetime.now(timezone.utc).isoformat())
6876
6876
  elif conn and status == "error":
@@ -1,5 +1,7 @@
1
1
  import json
2
2
  import logging
3
+ import os
4
+ import re
3
5
  import sys
4
6
  from datetime import datetime
5
7
  from time import time
@@ -9,6 +11,26 @@ from ..runtime_update import is_update_available
9
11
 
10
12
  _LOG_FORMAT: str | None = None
11
13
 
14
+ # Before huggingface_hub/transformers import, suppress download/load tqdm bars.
15
+ os.environ.setdefault("HF_HUB_DISABLE_PROGRESS_BARS", "1")
16
+
17
+
18
+ def suppress_ml_progress_bars() -> None:
19
+ """Hide Hugging Face / transformers tqdm progress bars; keep app INFO load logs."""
20
+ os.environ.setdefault("HF_HUB_DISABLE_PROGRESS_BARS", "1")
21
+ try:
22
+ from huggingface_hub.utils import disable_progress_bars
23
+
24
+ disable_progress_bars()
25
+ except Exception:
26
+ pass
27
+ try:
28
+ from transformers.utils.logging import disable_progress_bar
29
+
30
+ disable_progress_bar()
31
+ except Exception:
32
+ pass
33
+
12
34
  # Route uvicorn loggers through the root handler configured by configure_logging().
13
35
  UVICORN_LOG_CONFIG: dict[str, object] = {
14
36
  "version": 1,
@@ -37,6 +59,7 @@ def align_uvicorn_loggers() -> None:
37
59
 
38
60
  def configure_logging() -> None:
39
61
  """Configure logging to stdout based on environment/log settings."""
62
+ suppress_ml_progress_bars()
40
63
  handler = logging.StreamHandler(sys.stdout)
41
64
 
42
65
  def resolve_format() -> str:
@@ -145,12 +168,42 @@ class ColorFormatter(logging.Formatter):
145
168
 
146
169
  # Message text: Same blue as DEBUG
147
170
  _MESSAGE_COLOR = "\x1b[38;5;26m" # Light blue (same as DEBUG)
171
+
172
+ # source / source_id values: bold magenta — easy to scan in pipeline logs
173
+ _SOURCE_IDENTITY_VALUE_COLOR = "\x1b[1;38;5;213m" # Bold bright magenta
148
174
 
149
175
  # Logger name (module path): Same teal/cyan as class names
150
176
  _LOGGER_NAME_COLOR = "\x1b[38;5;75m" # Teal/cyan blue-green
151
177
 
152
178
  _ARROW_COLOR = "\x1b[38;5;244m" # Gray for arrows
153
179
 
180
+ _SOURCE_KV_PATTERN = re.compile(
181
+ r"(?<![?&/])" # skip URL query/path fragments like ...&source=editors
182
+ r"\b(?P<key>source_id|source)="
183
+ r"(?:"
184
+ r"(?P<q>['\"])(?P<qval>[^'\"]+)(?P=q)|"
185
+ r"(?P<uval>[^\s,;)\]&]+)"
186
+ r")"
187
+ )
188
+
189
+ _SOURCE_VALUE_SKIP = frozenset({"%s", "%d", "%i", "%f", "?"})
190
+
191
+ def _highlight_source_identities(self, message: str) -> str:
192
+ """Bold magenta on source / source_id values (keys stay default message color)."""
193
+
194
+ def repl(match: re.Match[str]) -> str:
195
+ value = match.group("qval") or match.group("uval") or ""
196
+ if value in self._SOURCE_VALUE_SKIP or value.startswith("excluded."):
197
+ return match.group(0)
198
+ key = match.group("key")
199
+ quote = match.group("q") or ""
200
+ colored_value = (
201
+ f"{self._SOURCE_IDENTITY_VALUE_COLOR}{value}{self._RESET}{self._MESSAGE_COLOR}"
202
+ )
203
+ return f"{key}={quote}{colored_value}{quote}"
204
+
205
+ return self._SOURCE_KV_PATTERN.sub(repl, message)
206
+
154
207
  def format(self, record: logging.LogRecord) -> str: # noqa: D401
155
208
  # Format timestamp: YYYY-MM-DD HH:MM:SS.ms (green)
156
209
  timestamp_str = datetime.fromtimestamp(record.created).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
@@ -171,8 +224,7 @@ class ColorFormatter(logging.Formatter):
171
224
 
172
225
  # Get message and extract pipeline tag if present
173
226
  message = record.getMessage()
174
- import re
175
-
227
+
176
228
  # Extract pipeline stage tag from message if it exists
177
229
  pipeline_tag_pattern = r'\[PIPELINE:[A-Z_]+\]'
178
230
  pipeline_tag_match = re.search(pipeline_tag_pattern, message)
@@ -204,6 +256,8 @@ class ColorFormatter(logging.Formatter):
204
256
  f"{self._ARROW_COLOR}\\1{self._RESET}{self._MESSAGE_COLOR}",
205
257
  message_colored
206
258
  )
259
+
260
+ message_colored = self._highlight_source_identities(message_colored)
207
261
 
208
262
  # Format: TIMESTAMP | LEVEL | [PIPELINE:TAG] | LOGGER: MESSAGE
209
263
  separator = f"{self._SEPARATOR_COLOR}|{self._RESET}"
@@ -184,11 +184,11 @@ async def run_privacy_disclosure_layer(
184
184
  apply_canonical_nsfw_v1_up(conn)
185
185
 
186
186
  if not getattr(settings, "platform_privacy_via_engine", True):
187
- logger.info("[PIPELINE:PRIVACY] skipped: platform_privacy_via_engine=false")
187
+ logger.debug("[PIPELINE:PRIVACY] skipped: platform_privacy_via_engine=false")
188
188
  return {"records_updated": 0, "skipped": True}
189
189
 
190
190
  if nsfw_only and not getattr(settings, "nsfw_classifier_enabled", True):
191
- logger.info("[PIPELINE:PRIVACY] nsfw-only backfill skipped: nsfw_classifier_enabled=false")
191
+ logger.debug("[PIPELINE:PRIVACY] nsfw-only backfill skipped: nsfw_classifier_enabled=false")
192
192
  return {"records_updated": 0, "nsfw_tagged": 0, "skipped": True}
193
193
 
194
194
  if not canonical_messages:
@@ -353,7 +353,7 @@ async def run_privacy_disclosure_layer(
353
353
  conn.commit()
354
354
 
355
355
  duration_ms = int((time.perf_counter() - started) * 1000)
356
- logger.info(
356
+ logger.debug(
357
357
  "[PIPELINE:PRIVACY] platform_privacy_layer disclosure_updated=%d nsfw_tagged=%d "
358
358
  "failed_batches=%d nsfw_failed_batches=%d duration_ms=%d version=%s",
359
359
  updated,
@@ -278,7 +278,12 @@ class HuggingFaceAdapter:
278
278
  vectors: List[List[float]] = []
279
279
  for i in range(0, len(texts), batch_size):
280
280
  batch = texts[i : i + batch_size]
281
- encoded = embedder.encode(batch, convert_to_numpy=True, normalize_embeddings=normalize)
281
+ encoded = embedder.encode(
282
+ batch,
283
+ convert_to_numpy=True,
284
+ normalize_embeddings=normalize,
285
+ show_progress_bar=False,
286
+ )
282
287
  for row in encoded:
283
288
  vectors.append([float(x) for x in row.tolist()])
284
289
  dims = len(vectors[0]) if vectors else 0
@@ -41,7 +41,7 @@ class TopicClusterJob(BaseEnrichmentJob):
41
41
  # does not wipe cross-source memory_topic_map rollups.
42
42
  scope_ids = list(_resolved_topic_cluster_source_ids())
43
43
  if source_ids:
44
- logger.info(
44
+ logger.debug(
45
45
  "[PIPELINE:TOPIC_CLUSTERS] batch sources=%s; clustering scope=%s",
46
46
  sorted(source_ids),
47
47
  scope_ids,
@@ -57,7 +57,7 @@ class TopicClusterJob(BaseEnrichmentJob):
57
57
  min_records=3,
58
58
  )
59
59
  if result.get("status") == "skipped":
60
- logger.info("[PIPELINE:TOPIC_CLUSTERS] skipped: %s", result.get("reason"))
60
+ logger.debug("[PIPELINE:TOPIC_CLUSTERS] skipped: %s", result.get("reason"))
61
61
  if progress_callback:
62
62
  progress_callback(1, 1)
63
63
  return []
@@ -58,7 +58,7 @@ class EnrichmentOrchestrator(BaseObject):
58
58
 
59
59
  total_messages = len(canonical_messages)
60
60
  total_jobs = len(jobs_to_run)
61
- logger.info(
61
+ logger.debug(
62
62
  "[PIPELINE:ENRICHMENT] %s: Starting enrichment: %d messages, %d jobs to run",
63
63
  self,
64
64
  total_messages,
@@ -75,7 +75,7 @@ class EnrichmentOrchestrator(BaseObject):
75
75
  continue
76
76
  try:
77
77
  job_name = job.get_job_name()
78
- logger.info(
78
+ logger.debug(
79
79
  "[PIPELINE:ENRICHMENT] %s: Running job %d/%d: %s (%d messages, %.1f%% of jobs complete)",
80
80
  self,
81
81
  job_idx,
@@ -115,7 +115,7 @@ class EnrichmentOrchestrator(BaseObject):
115
115
  records, derived_table
116
116
  )
117
117
  results["records_created"][derived_table] = records_written
118
- logger.info(
118
+ logger.debug(
119
119
  "[PIPELINE:ENRICHMENT] %s → %s: %d records written to %s (job %d/%d, %.1f%% complete)",
120
120
  self,
121
121
  job,
@@ -132,7 +132,7 @@ class EnrichmentOrchestrator(BaseObject):
132
132
  results["records_created"]["canonical_disclosure"] = (
133
133
  int(results["records_created"].get("canonical_disclosure") or 0) + updated
134
134
  )
135
- logger.info(
135
+ logger.debug(
136
136
  "[PIPELINE:ENRICHMENT] %s → %s: %d canonical disclosure rows updated (job %d/%d)",
137
137
  self,
138
138
  job,
@@ -143,7 +143,7 @@ class EnrichmentOrchestrator(BaseObject):
143
143
  else:
144
144
  table_name = derived_table or job.get_job_name()
145
145
  results["records_created"][table_name] = 0
146
- logger.info(
146
+ logger.debug(
147
147
  "[PIPELINE:ENRICHMENT] %s → %s: completed with 0 records (job %d/%d, %.1f%% complete)",
148
148
  self,
149
149
  job,
@@ -181,7 +181,7 @@ class EnrichmentOrchestrator(BaseObject):
181
181
  # Mark job as 100% complete (even if failed, we've moved past it)
182
182
  progress_callback(messages_processed_so_far, total_messages, job.get_job_name(), job_progress_percent, 100.0)
183
183
 
184
- logger.info(
184
+ logger.debug(
185
185
  "[PIPELINE:ENRICHMENT] %s: Enrichment complete: %d jobs run, %d total records created",
186
186
  self,
187
187
  results["jobs_run"],
@@ -275,7 +275,7 @@ class SignalDerivationOrchestrator(EnrichmentOrchestrator):
275
275
  }
276
276
  jobs_to_run = [self._signal_jobs[name] for name in resolved if name in self._signal_jobs]
277
277
  total_jobs = len(jobs_to_run)
278
- logger.info(
278
+ logger.debug(
279
279
  "[PIPELINE:SIGNAL_DERIVE] source_id=%s batch_id=%s jobs=%s messages=%d",
280
280
  source_id,
281
281
  sync_batch_id,
@@ -343,7 +343,7 @@ class SignalDerivationOrchestrator(EnrichmentOrchestrator):
343
343
  except Exception as exc:
344
344
  logger.debug("[PIPELINE:SIGNAL_DERIVE] dimension profile update skipped: %s", exc)
345
345
 
346
- logger.info(
346
+ logger.debug(
347
347
  "[PIPELINE:SIGNAL_DERIVE] complete source_id=%s batch_id=%s jobs_run=%d deferred=%s",
348
348
  source_id,
349
349
  sync_batch_id,
@@ -683,7 +683,7 @@ async def run_post_canonical_pipeline(
683
683
  logger.error("[PIPELINE:ENRICHMENT] post-canonical failed: %s", exc, exc_info=True)
684
684
  outcome["canonical_enrichment"] = {"errors": [str(exc)]}
685
685
  elif canonical_jobs and enrichment_trigger == "manual":
686
- logger.info(
686
+ logger.debug(
687
687
  "[PIPELINE:ENRICHMENT] Skipping canonical enrichment (manual trigger): source_id=%s records=%d",
688
688
  source_id,
689
689
  len(canonical_records),
@@ -86,7 +86,7 @@ async def ingest_file_payload(
86
86
  for source in REGISTRY.values():
87
87
  if source.schema_id == schema_id and source.source_type == "file":
88
88
  source_id = source.source_id
89
- logger.debug(
89
+ logger.info(
90
90
  "[PIPELINE:RAW] Found source_id=%s for schema_id=%s (file type)",
91
91
  source_id,
92
92
  schema_id,
@@ -101,7 +101,7 @@ async def ingest_file_payload(
101
101
  file_store = RawFileStore()
102
102
  trigger = FileTrigger(file_store=file_store)
103
103
  job_id = job_id or str(uuid.uuid4())
104
- logger.debug(
104
+ logger.info(
105
105
  "[PIPELINE:RAW] Creating file ingestion job: job_id=%s, dataset_id=%s, schema_id=%s, source_id=%s, file_path=%s, file_size=%s",
106
106
  job_id,
107
107
  dataset_id,
@@ -123,7 +123,7 @@ async def ingest_file_payload(
123
123
  progress_api_url=progress_api_url,
124
124
  progress_api_key=progress_api_key,
125
125
  )
126
- logger.debug(
126
+ logger.info(
127
127
  "[PIPELINE:RAW] %s: File ingestion complete: job_id=%s, records_processed=%s, errors=%s",
128
128
  manager,
129
129
  job_id,
@@ -201,7 +201,7 @@ async def ingest_ui_payload(
201
201
  "content": content,
202
202
  "created_at": created_at,
203
203
  }
204
- logger.debug(
204
+ logger.info(
205
205
  "[PIPELINE:RAW] Appending UI message to raw store: job_id=%s, dataset_id=%s, message_id=%s, content_preview=%s",
206
206
  job_id,
207
207
  dataset_id,
@@ -216,10 +216,10 @@ async def ingest_ui_payload(
216
216
  schema_id,
217
217
  file_store.get_file_path(dataset_id, schema_id).as_posix(),
218
218
  )
219
- logger.debug("[PIPELINE:RAW] Starting ingestion job: job_id=%s, dataset_id=%s, schema_id=%s", job_id, dataset_id, schema_id)
219
+ logger.info("[PIPELINE:RAW] Starting ingestion job: job_id=%s, dataset_id=%s, schema_id=%s", job_id, dataset_id, schema_id)
220
220
  manager = IngestionManager(file_store=file_store)
221
221
  result = await manager.process_job(job)
222
- logger.debug(
222
+ logger.info(
223
223
  "[PIPELINE:RAW] %s: UI ingestion complete: job_id=%s, records_processed=%s, errors=%s",
224
224
  manager,
225
225
  job_id,
@@ -389,7 +389,7 @@ async def _ingest_ui_payload_direct(
389
389
  payload=raw_payload,
390
390
  source_type=raw_source_type,
391
391
  )
392
- logger.debug(
392
+ logger.info(
393
393
  "[PIPELINE:RAW] Stored raw payload: source=%s, record_id=%s",
394
394
  source_id,
395
395
  record_id[:8] if record_id else None,
@@ -587,7 +587,7 @@ async def _try_install_runtime_source_definition_from_control_plane(
587
587
  install_source_definition(row)
588
588
  installed = REGISTRY.get(row_source_id)
589
589
  if installed:
590
- logger.info(
590
+ logger.debug(
591
591
  "[PIPELINE:MANAGER] Installed runtime source definition from control-plane: source_id=%s schema_id=%s",
592
592
  row_source_id,
593
593
  row_schema_id,
@@ -690,7 +690,7 @@ class IngestionManager(BaseObject):
690
690
  if source_id:
691
691
  source_def = REGISTRY.get(source_id)
692
692
  if source_def:
693
- logger.info(
693
+ logger.debug(
694
694
  "[PIPELINE:MANAGER] %s: Using source from source_id=%s: %s (enrichment_trigger=%s)",
695
695
  self,
696
696
  source_id,
@@ -745,7 +745,7 @@ class IngestionManager(BaseObject):
745
745
  # Keep first match as fallback
746
746
  source_def = source
747
747
  if source_def:
748
- logger.info(
748
+ logger.debug(
749
749
  "[PIPELINE:MANAGER] %s: Found source by schema_id: source_id=%s, source_type=%s, enrichment_trigger=%s",
750
750
  self,
751
751
  source_def.source_id,
@@ -1009,7 +1009,7 @@ class IngestionManager(BaseObject):
1009
1009
  and enrichment_trigger == "automatic"
1010
1010
  and tables_manager
1011
1011
  ):
1012
- logger.info(
1012
+ logger.debug(
1013
1013
  "[PIPELINE:ENRICHMENT] %s: Enrichment trigger check: source_id=%s, enrichment_trigger=%s, canonical_messages=%d, jobs=%s",
1014
1014
  self,
1015
1015
  source_def.source_id,
@@ -1031,7 +1031,7 @@ class IngestionManager(BaseObject):
1031
1031
  len(canonical_messages),
1032
1032
  )
1033
1033
  elif source_def.canonical_enrichment_jobs and enrichment_trigger == "manual":
1034
- logger.info(
1034
+ logger.debug(
1035
1035
  "[PIPELINE:ENRICHMENT] %s: Skipping enrichment (manual trigger): %d canonical messages will be enriched later via POST /v1/enrichment/process",
1036
1036
  self,
1037
1037
  len(canonical_messages),