topos-node 1.3.5__tar.gz → 1.3.7__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 (631) hide show
  1. {topos_node-1.3.5/topos_node.egg-info → topos_node-1.3.7}/PKG-INFO +1 -1
  2. {topos_node-1.3.5 → topos_node-1.3.7}/pyproject.toml +1 -1
  3. topos_node-1.3.7/tests/test_prewarm_first_run.py +61 -0
  4. topos_node-1.3.7/tests/test_system_computer_name.py +113 -0
  5. {topos_node-1.3.5 → topos_node-1.3.7}/topos/__version__.py +2 -2
  6. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/messenger_communities.py +66 -57
  7. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/compute_remote.py +71 -65
  8. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/conversation_context.py +8 -6
  9. topos_node-1.3.7/topos/api/data_commit.py +166 -0
  10. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/enrichment.py +49 -20
  11. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/enrichment_lab.py +4 -2
  12. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/filter_lab.py +14 -11
  13. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/shell.py +7 -0
  14. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/signal.py +27 -2
  15. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/upgrades.py +7 -1
  16. {topos_node-1.3.5 → topos_node-1.3.7}/topos/app.py +118 -28
  17. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/tray.py +121 -7
  18. {topos_node-1.3.5 → topos_node-1.3.7}/topos/control_plane_client.py +197 -25
  19. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/config.py +19 -8
  20. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/database_explorer.py +114 -98
  21. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/enrichment.py +30 -20
  22. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/enrichment_lab.py +4 -2
  23. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/filter_lab.py +14 -11
  24. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/ingest.py +37 -17
  25. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/state.py +302 -172
  26. {topos_node-1.3.5 → topos_node-1.3.7}/topos/data_explorer_row_delete.py +72 -59
  27. {topos_node-1.3.5 → topos_node-1.3.7}/topos/data_explorer_table_prefs.py +4 -2
  28. {topos_node-1.3.5 → topos_node-1.3.7}/topos/disclosure/privacy_layer.py +30 -21
  29. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/memory_utils.py +7 -1
  30. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/model_cache.py +35 -6
  31. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/usage_observation.py +30 -18
  32. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/derivation_recovery.py +5 -2
  33. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/derived_tables.py +236 -236
  34. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/entities_job.py +93 -88
  35. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/pii_redaction_job.py +18 -10
  36. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/statistics_job.py +12 -10
  37. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/topic_clusters_job.py +16 -0
  38. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/orchestrator.py +72 -24
  39. topos_node-1.3.7/topos/enrichment_lab/schema.py +73 -0
  40. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment_lab/store.py +53 -47
  41. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/store.py +41 -38
  42. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/affinity_owner.py +6 -3
  43. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/consolidation.py +121 -103
  44. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/declared_mappings.py +5 -2
  45. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/dossier.py +17 -5
  46. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/edges.py +34 -7
  47. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/graph_enrichers.py +124 -110
  48. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/graph_refresh.py +65 -17
  49. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/maintenance.py +192 -75
  50. topos_node-1.3.7/topos/features/entities/rebuild_subprocess.py +260 -0
  51. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/resolver.py +60 -54
  52. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/facts/extract.py +4 -2
  53. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/facts/store.py +72 -65
  54. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/facts/verdicts.py +11 -9
  55. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/blackhole.py +112 -102
  56. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/blackhole_rebuild.py +8 -7
  57. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/derived_scrub.py +117 -101
  58. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/exclusions.py +69 -63
  59. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/gc.py +73 -55
  60. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/conversation_context.py +16 -9
  61. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/dimension_briefs.py +82 -79
  62. topos_node-1.3.7/topos/features/signal/dimension_profiles.py +62 -0
  63. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/extraction/artifact_store.py +33 -29
  64. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/incremental_clustering.py +51 -48
  65. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/signal_object_store.py +52 -45
  66. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/tool_index.py +31 -26
  67. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/topic_clustering.py +28 -4
  68. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/stats/definitions.py +30 -29
  69. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/stats/engine.py +24 -19
  70. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/timeline_projection.py +93 -86
  71. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/daily.py +33 -31
  72. topos_node-1.3.7/topos/filter_lab/schema.py +95 -0
  73. {topos_node-1.3.5 → topos_node-1.3.7}/topos/filter_lab/store.py +65 -57
  74. topos_node-1.3.7/topos/home_chat/schema.py +56 -0
  75. {topos_node-1.3.5 → topos_node-1.3.7}/topos/home_chat/store.py +39 -36
  76. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/canonical_pipeline.py +72 -64
  77. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +23 -19
  78. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/local_sync.py +19 -11
  79. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/manager.py +127 -118
  80. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/usage_inbox_dedupe.py +32 -28
  81. {topos_node-1.3.5 → topos_node-1.3.7}/topos/llm_integrations_storage.py +81 -47
  82. {topos_node-1.3.5 → topos_node-1.3.7}/topos/pipeline/audit.py +23 -21
  83. topos_node-1.3.7/topos/pipeline/job_runner.py +420 -0
  84. {topos_node-1.3.5 → topos_node-1.3.7}/topos/pipeline/job_store.py +54 -2
  85. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/source_generation.py +14 -12
  86. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/truth_facts.py +4 -1
  87. topos_node-1.3.7/topos/routines/schema.py +84 -0
  88. {topos_node-1.3.5 → topos_node-1.3.7}/topos/routines/store.py +88 -81
  89. topos_node-1.3.7/topos/sanitization/prewarm.py +212 -0
  90. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/install_service.py +127 -106
  91. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/scrub_service.py +11 -7
  92. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/sqlite/stores.py +295 -276
  93. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/ai_chat/tables.py +56 -52
  94. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/canonical_store.py +19 -7
  95. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/conversations_tables.py +338 -305
  96. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/mapping_store.py +17 -18
  97. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/__init__.py +13 -3
  98. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/pipeline_jobs_v1.py +11 -1
  99. topos_node-1.3.7/topos/storage/db/write_gate.py +336 -0
  100. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/person/identity_resolver.py +29 -23
  101. topos_node-1.3.7/topos/storage/raw/browser_flat_tables.py +317 -0
  102. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/raw/raw_tables_manager.py +91 -81
  103. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/signal_identity.py +22 -17
  104. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/source_settings.py +69 -63
  105. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/user_identity.py +22 -17
  106. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sync_handlers.py +22 -20
  107. topos_node-1.3.7/topos/testing/lifespan.py +22 -0
  108. {topos_node-1.3.5 → topos_node-1.3.7}/topos/upgrades/manifests.json +32 -0
  109. {topos_node-1.3.5 → topos_node-1.3.7}/topos/upgrades/runner.py +71 -29
  110. {topos_node-1.3.5 → topos_node-1.3.7/topos_node.egg-info}/PKG-INFO +1 -1
  111. {topos_node-1.3.5 → topos_node-1.3.7}/topos_node.egg-info/SOURCES.txt +3 -0
  112. topos_node-1.3.5/topos/api/data_commit.py +0 -158
  113. topos_node-1.3.5/topos/enrichment_lab/schema.py +0 -68
  114. topos_node-1.3.5/topos/features/signal/dimension_profiles.py +0 -60
  115. topos_node-1.3.5/topos/filter_lab/schema.py +0 -86
  116. topos_node-1.3.5/topos/home_chat/schema.py +0 -51
  117. topos_node-1.3.5/topos/pipeline/job_runner.py +0 -307
  118. topos_node-1.3.5/topos/routines/schema.py +0 -75
  119. topos_node-1.3.5/topos/sanitization/prewarm.py +0 -32
  120. topos_node-1.3.5/topos/storage/db/write_gate.py +0 -203
  121. topos_node-1.3.5/topos/storage/raw/browser_flat_tables.py +0 -303
  122. topos_node-1.3.5/topos/testing/lifespan.py +0 -7
  123. {topos_node-1.3.5 → topos_node-1.3.7}/LICENSE +0 -0
  124. {topos_node-1.3.5 → topos_node-1.3.7}/MANIFEST.in +0 -0
  125. {topos_node-1.3.5 → topos_node-1.3.7}/README.md +0 -0
  126. {topos_node-1.3.5 → topos_node-1.3.7}/setup.cfg +0 -0
  127. {topos_node-1.3.5 → topos_node-1.3.7}/shared/__init__.py +0 -0
  128. {topos_node-1.3.5 → topos_node-1.3.7}/shared/filtering.py +0 -0
  129. {topos_node-1.3.5 → topos_node-1.3.7}/shared/schema_registry.py +0 -0
  130. {topos_node-1.3.5 → topos_node-1.3.7}/tests/test_extensions.py +0 -0
  131. {topos_node-1.3.5 → topos_node-1.3.7}/tests/test_llm_integrations_storage.py +0 -0
  132. {topos_node-1.3.5 → topos_node-1.3.7}/tests/test_protocol_handled_types.py +0 -0
  133. {topos_node-1.3.5 → topos_node-1.3.7}/topos/__init__.py +0 -0
  134. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/__init__.py +0 -0
  135. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/duckdb_adapter.py +0 -0
  136. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/messenger_graph.py +0 -0
  137. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/messenger_labels.py +0 -0
  138. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/profiles.py +0 -0
  139. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/query_engine.py +0 -0
  140. {topos_node-1.3.5 → topos_node-1.3.7}/topos/analytics/raw_queries.py +0 -0
  141. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/__init__.py +0 -0
  142. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/analytics.py +0 -0
  143. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/app_registry.py +0 -0
  144. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/backup.py +0 -0
  145. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/data_explorer_table_prefs.py +0 -0
  146. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/database_explorer.py +0 -0
  147. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/db.py +0 -0
  148. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/device.py +0 -0
  149. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/engine_run.py +0 -0
  150. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/facts_llm_config.py +0 -0
  151. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/health.py +0 -0
  152. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/home_chat.py +0 -0
  153. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/ingestion_api.py +0 -0
  154. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/ingestion_compat.py +0 -0
  155. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/ingestion_sources.py +0 -0
  156. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/intelligence_lifecycle.py +0 -0
  157. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/llm.py +0 -0
  158. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/local_mcp.py +0 -0
  159. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/messenger_analytics.py +0 -0
  160. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/privacy_disclose.py +0 -0
  161. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/query_api.py +0 -0
  162. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/runtime_bootstrap.py +0 -0
  163. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/sanitization_ollama_config.py +0 -0
  164. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/signal_extraction_config.py +0 -0
  165. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/source_install.py +0 -0
  166. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/source_scrub.py +0 -0
  167. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/sources.py +0 -0
  168. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/sources_overview.py +0 -0
  169. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/sync.py +0 -0
  170. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/tool_index.py +0 -0
  171. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/ui_config.py +0 -0
  172. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/uma_data.py +0 -0
  173. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/usage.py +0 -0
  174. {topos_node-1.3.5 → topos_node-1.3.7}/topos/api/user_identity.py +0 -0
  175. {topos_node-1.3.5 → topos_node-1.3.7}/topos/auth.py +0 -0
  176. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/__init__.py +0 -0
  177. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/__init__.py +0 -0
  178. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/base.py +0 -0
  179. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  180. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  181. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  182. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  183. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  184. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  185. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  186. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  187. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/models.py +0 -0
  188. {topos_node-1.3.5 → topos_node-1.3.7}/topos/canonicalization/resolver.py +0 -0
  189. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/__init__.py +0 -0
  190. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/__main__.py +0 -0
  191. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/assets/topos_blk_rounded.png +0 -0
  192. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/assets/topos_white.png +0 -0
  193. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/commands.py +0 -0
  194. {topos_node-1.3.5 → topos_node-1.3.7}/topos/cli/reprocess_cmd.py +0 -0
  195. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/__init__.py +0 -0
  196. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/conversation_context_llm.py +0 -0
  197. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/facts_llm.py +0 -0
  198. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/model_packs.py +0 -0
  199. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/sanitization_ollama.py +0 -0
  200. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/settings.py +0 -0
  201. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/signal_extraction.py +0 -0
  202. {topos_node-1.3.5 → topos_node-1.3.7}/topos/config/uvicorn_logging.json +0 -0
  203. {topos_node-1.3.5 → topos_node-1.3.7}/topos/contacts/__init__.py +0 -0
  204. {topos_node-1.3.5 → topos_node-1.3.7}/topos/contacts/identity.py +0 -0
  205. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/__init__.py +0 -0
  206. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/api_models.py +0 -0
  207. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/connection_resilience.py +0 -0
  208. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/device_helpers.py +0 -0
  209. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/errors.py +0 -0
  210. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/events.py +0 -0
  211. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/__init__.py +0 -0
  212. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/common.py +0 -0
  213. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/complexity.py +0 -0
  214. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/contacts_import.py +0 -0
  215. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/device.py +0 -0
  216. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/graph_query.py +0 -0
  217. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/home_chat.py +0 -0
  218. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/messages.py +0 -0
  219. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/messenger_analytics.py +0 -0
  220. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/query.py +0 -0
  221. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/registry.py +0 -0
  222. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/routines.py +0 -0
  223. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/signal_features.py +0 -0
  224. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/sources.py +0 -0
  225. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/timeline_daily.py +0 -0
  226. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/tool_index.py +0 -0
  227. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/handlers/uma.py +0 -0
  228. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/logging.py +0 -0
  229. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/metrics.py +0 -0
  230. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/routine_access.py +0 -0
  231. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/startup_banner.py +0 -0
  232. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/table_layers.py +0 -0
  233. {topos_node-1.3.5 → topos_node-1.3.7}/topos/core/types.py +0 -0
  234. {topos_node-1.3.5 → topos_node-1.3.7}/topos/data_explorer_tables.py +0 -0
  235. {topos_node-1.3.5 → topos_node-1.3.7}/topos/disclosure/__init__.py +0 -0
  236. {topos_node-1.3.5 → topos_node-1.3.7}/topos/disclosure/canonical_writer.py +0 -0
  237. {topos_node-1.3.5 → topos_node-1.3.7}/topos/disclosure/content_policy.py +0 -0
  238. {topos_node-1.3.5 → topos_node-1.3.7}/topos/disclosure/field_registry.py +0 -0
  239. {topos_node-1.3.5 → topos_node-1.3.7}/topos/disclosure/tier.py +0 -0
  240. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/__init__.py +0 -0
  241. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/__init__.py +0 -0
  242. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/base.py +0 -0
  243. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/generative_prompts.py +0 -0
  244. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/generative_response.py +0 -0
  245. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/huggingface.py +0 -0
  246. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/ollama.py +0 -0
  247. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/openai.py +0 -0
  248. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/openai_compatible.py +0 -0
  249. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/redpill.py +0 -0
  250. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/backends/stub.py +0 -0
  251. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/client.py +0 -0
  252. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/engine.py +0 -0
  253. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/intake.py +0 -0
  254. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/pipeline_memory.py +0 -0
  255. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/queue_manager.py +0 -0
  256. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/registration.py +0 -0
  257. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/result_formatter.py +0 -0
  258. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/router.py +0 -0
  259. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/scoped_token.py +0 -0
  260. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/tasks.py +0 -0
  261. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/transport.py +0 -0
  262. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/usage_guard.py +0 -0
  263. {topos_node-1.3.5 → topos_node-1.3.7}/topos/engine/validator.py +0 -0
  264. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/__init__.py +0 -0
  265. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/catalog.py +0 -0
  266. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/job_writer.py +0 -0
  267. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/__init__.py +0 -0
  268. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/base.py +0 -0
  269. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  270. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  271. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  272. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  273. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  274. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  275. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  276. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  277. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  278. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  279. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  280. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  281. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  282. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  283. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  284. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  285. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/url_classification_core.py +0 -0
  286. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/url_classification_enrichment_job.py +0 -0
  287. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/canonical/url_classification_signal_job.py +0 -0
  288. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/raw/__init__.py +0 -0
  289. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  290. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/raw/language_job.py +0 -0
  291. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  292. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  293. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/model_overrides.py +0 -0
  294. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/models/__init__.py +0 -0
  295. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/models/manager.py +0 -0
  296. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/models/mvp_defaults.py +0 -0
  297. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/models/registry.py +0 -0
  298. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/models/versioning.py +0 -0
  299. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/pipeline_activity.py +0 -0
  300. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/processor.py +0 -0
  301. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/progress_bar.py +0 -0
  302. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/registry_contract.py +0 -0
  303. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/signal_derivation_config.json +0 -0
  304. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/source_overrides.py +0 -0
  305. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment/website_classifier.py +0 -0
  306. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment_lab/__init__.py +0 -0
  307. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment_lab/bundles.py +0 -0
  308. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment_lab/model_resolve.py +0 -0
  309. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment_lab/service.py +0 -0
  310. {topos_node-1.3.5 → topos_node-1.3.7}/topos/enrichment_lab/worker.py +0 -0
  311. {topos_node-1.3.5 → topos_node-1.3.7}/topos/evals/__init__.py +0 -0
  312. {topos_node-1.3.5 → topos_node-1.3.7}/topos/evals/enrichment_eval.py +0 -0
  313. {topos_node-1.3.5 → topos_node-1.3.7}/topos/extensions.py +0 -0
  314. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/__init__.py +0 -0
  315. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/canonical.py +0 -0
  316. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/engine.py +0 -0
  317. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/entropy.py +0 -0
  318. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/focus.py +0 -0
  319. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/graph_metrics.py +0 -0
  320. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/influence.py +0 -0
  321. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/projection.py +0 -0
  322. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/snapshots.py +0 -0
  323. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/topic_merge.py +0 -0
  324. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/topics.py +0 -0
  325. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/topics_daily.py +0 -0
  326. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/complexity/volatility.py +0 -0
  327. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/__init__.py +0 -0
  328. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/affinity.py +0 -0
  329. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/affinity_quality.py +0 -0
  330. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/context_vectors.py +0 -0
  331. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/cypher.py +0 -0
  332. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/fact_materializer.py +0 -0
  333. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/graph_search.py +0 -0
  334. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/linking.py +0 -0
  335. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/entities/reads.py +0 -0
  336. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/facts/__init__.py +0 -0
  337. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/facts/llm_extract.py +0 -0
  338. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/facts/reads.py +0 -0
  339. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/fit/evaluator.py +0 -0
  340. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/fit/opportunity_types.json +0 -0
  341. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/__init__.py +0 -0
  342. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/blackhole_guard.py +0 -0
  343. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/lifecycle/blackhole_llm.py +0 -0
  344. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/provenance/__init__.py +0 -0
  345. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/provenance/posture.py +0 -0
  346. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/provenance/roles.py +0 -0
  347. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/__init__.py +0 -0
  348. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/brief_canonical_loader.py +0 -0
  349. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/brief_ontology.py +0 -0
  350. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/brief_renderer.py +0 -0
  351. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/brief_schemas.py +0 -0
  352. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/chunking.py +0 -0
  353. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/cluster_labels.py +0 -0
  354. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/data_health.py +0 -0
  355. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  356. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/intentions.json +0 -0
  357. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/profile.json +0 -0
  358. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/relationships.json +0 -0
  359. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  360. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/time.json +0 -0
  361. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/definitions/work.json +0 -0
  362. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/derived_spec.py +0 -0
  363. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/dimension_definition_loader.py +0 -0
  364. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/dimension_registry.py +0 -0
  365. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/embed_context.py +0 -0
  366. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/extraction/artifact_router.py +0 -0
  367. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/extraction/rule_extractors.py +0 -0
  368. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/graph_sanitize.py +0 -0
  369. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/hybrid_search.py +0 -0
  370. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/model_recommendations.py +0 -0
  371. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/query_embed_cache.py +0 -0
  372. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/schemas.py +0 -0
  373. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/service.py +0 -0
  374. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/source_hydration.py +0 -0
  375. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/structured_signal.py +0 -0
  376. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/typed_stores/aggregates.py +0 -0
  377. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/typed_stores/commitments.py +0 -0
  378. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/typed_stores/rhythm.py +0 -0
  379. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  380. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/vector_codec.py +0 -0
  381. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/vector_math.py +0 -0
  382. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/signal/vector_settings.py +0 -0
  383. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/stats/__init__.py +0 -0
  384. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/stats/fold.py +0 -0
  385. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/stats/insights.py +0 -0
  386. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/timeline_rollup.py +0 -0
  387. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/__init__.py +0 -0
  388. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/badges.py +0 -0
  389. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/dashboard.py +0 -0
  390. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/instruments.py +0 -0
  391. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/intents.py +0 -0
  392. {topos_node-1.3.5 → topos_node-1.3.7}/topos/features/triage/readiness.py +0 -0
  393. {topos_node-1.3.5 → topos_node-1.3.7}/topos/filter_lab/__init__.py +0 -0
  394. {topos_node-1.3.5 → topos_node-1.3.7}/topos/filter_lab/bundles.py +0 -0
  395. {topos_node-1.3.5 → topos_node-1.3.7}/topos/filter_lab/service.py +0 -0
  396. {topos_node-1.3.5 → topos_node-1.3.7}/topos/filter_lab/worker.py +0 -0
  397. {topos_node-1.3.5 → topos_node-1.3.7}/topos/home_chat/__init__.py +0 -0
  398. {topos_node-1.3.5 → topos_node-1.3.7}/topos/hosted_pool_lease.py +0 -0
  399. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/__init__.py +0 -0
  400. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/checkpoints/__init__.py +0 -0
  401. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  402. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/inbox_crypto.py +0 -0
  403. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/inbox_drain.py +0 -0
  404. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/ingest_helpers.py +0 -0
  405. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/jobs.py +0 -0
  406. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/journal_location_fanout.py +0 -0
  407. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/journal_time_log_normalize.py +0 -0
  408. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/log_preview.py +0 -0
  409. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parser.py +0 -0
  410. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/__init__.py +0 -0
  411. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/base.py +0 -0
  412. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/browser_parser.py +0 -0
  413. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/calendar_parser.py +0 -0
  414. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  415. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  416. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  417. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/documents_parser.py +0 -0
  418. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  419. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  420. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/grok_parser.py +0 -0
  421. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/messenger_parser.py +0 -0
  422. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  423. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/progress.py +0 -0
  424. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/reprocess.py +0 -0
  425. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/__init__.py +0 -0
  426. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/base.py +0 -0
  427. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/calendar.py +0 -0
  428. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/chatgpt.py +0 -0
  429. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/contact_importers.py +0 -0
  430. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/grok.py +0 -0
  431. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/imessage_reader.py +0 -0
  432. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/signal_export_parser.py +0 -0
  433. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/sources/signal_reader.py +0 -0
  434. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/state_machine.py +0 -0
  435. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/triggers/__init__.py +0 -0
  436. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/triggers/file_trigger.py +0 -0
  437. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  438. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/validation/__init__.py +0 -0
  439. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/validation/base.py +0 -0
  440. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/validation/schema_registry.py +0 -0
  441. {topos_node-1.3.5 → topos_node-1.3.7}/topos/ingestion/validation/schema_validator.py +0 -0
  442. {topos_node-1.3.5 → topos_node-1.3.7}/topos/lineage/__init__.py +0 -0
  443. {topos_node-1.3.5 → topos_node-1.3.7}/topos/lineage/provenance.py +0 -0
  444. {topos_node-1.3.5 → topos_node-1.3.7}/topos/lineage/tracker.py +0 -0
  445. {topos_node-1.3.5 → topos_node-1.3.7}/topos/mcp_stdio_proxy.py +0 -0
  446. {topos_node-1.3.5 → topos_node-1.3.7}/topos/observability/__init__.py +0 -0
  447. {topos_node-1.3.5 → topos_node-1.3.7}/topos/observability/alerts.py +0 -0
  448. {topos_node-1.3.5 → topos_node-1.3.7}/topos/observability/metrics.py +0 -0
  449. {topos_node-1.3.5 → topos_node-1.3.7}/topos/observability/tracing.py +0 -0
  450. {topos_node-1.3.5 → topos_node-1.3.7}/topos/openai_client.py +0 -0
  451. {topos_node-1.3.5 → topos_node-1.3.7}/topos/pipeline/__init__.py +0 -0
  452. {topos_node-1.3.5 → topos_node-1.3.7}/topos/pipeline/envelope.py +0 -0
  453. {topos_node-1.3.5 → topos_node-1.3.7}/topos/pipeline/stages.py +0 -0
  454. {topos_node-1.3.5 → topos_node-1.3.7}/topos/pipeline/stub_enqueue.py +0 -0
  455. {topos_node-1.3.5 → topos_node-1.3.7}/topos/projections/__init__.py +0 -0
  456. {topos_node-1.3.5 → topos_node-1.3.7}/topos/projections/vector_index/__init__.py +0 -0
  457. {topos_node-1.3.5 → topos_node-1.3.7}/topos/projections/vector_index/base.py +0 -0
  458. {topos_node-1.3.5 → topos_node-1.3.7}/topos/projections/vector_index/builders.py +0 -0
  459. {topos_node-1.3.5 → topos_node-1.3.7}/topos/projections/vector_index/health_checks.py +0 -0
  460. {topos_node-1.3.5 → topos_node-1.3.7}/topos/protocol/__init__.py +0 -0
  461. {topos_node-1.3.5 → topos_node-1.3.7}/topos/protocol/handled_message_types.json +0 -0
  462. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/__init__.py +0 -0
  463. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/audit.py +0 -0
  464. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/cohort_resolvers.py +0 -0
  465. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/ddr.py +0 -0
  466. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/disclosure.py +0 -0
  467. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/fingerprint.py +0 -0
  468. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/game_layer.py +0 -0
  469. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/grant_cache.py +0 -0
  470. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/inference.py +0 -0
  471. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/intent.py +0 -0
  472. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/manifest.py +0 -0
  473. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/manifest_validation.py +0 -0
  474. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/minimizer.py +0 -0
  475. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/negotiation.py +0 -0
  476. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/pipeline.py +0 -0
  477. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/planner.py +0 -0
  478. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/retrieval.py +0 -0
  479. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/runtime.py +0 -0
  480. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/scope_registry.json +0 -0
  481. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/scope_registry_loader.py +0 -0
  482. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/session.py +0 -0
  483. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/session_utils.py +0 -0
  484. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/truth_prompts.py +0 -0
  485. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/turn_classifier.py +0 -0
  486. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/types.py +0 -0
  487. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/verify.py +0 -0
  488. {topos_node-1.3.5 → topos_node-1.3.7}/topos/query/verify_modes.py +0 -0
  489. {topos_node-1.3.5 → topos_node-1.3.7}/topos/rate_limit.py +0 -0
  490. {topos_node-1.3.5 → topos_node-1.3.7}/topos/routines/__init__.py +0 -0
  491. {topos_node-1.3.5 → topos_node-1.3.7}/topos/runtime_housekeeping.py +0 -0
  492. {topos_node-1.3.5 → topos_node-1.3.7}/topos/runtime_shutdown.py +0 -0
  493. {topos_node-1.3.5 → topos_node-1.3.7}/topos/runtime_update.py +0 -0
  494. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sanitization/__init__.py +0 -0
  495. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sanitization/nsfw_classifier.py +0 -0
  496. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sanitization/ollama_transforms.py +0 -0
  497. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sanitization/privacy_filter.py +0 -0
  498. {topos_node-1.3.5 → topos_node-1.3.7}/topos/scope_resolution.py +0 -0
  499. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/__init__.py +0 -0
  500. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/container.py +0 -0
  501. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/embeddings/__init__.py +0 -0
  502. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/embeddings/base.py +0 -0
  503. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/embeddings/local.py +0 -0
  504. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/embeddings/remote.py +0 -0
  505. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/interfaces.py +0 -0
  506. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/llm/__init__.py +0 -0
  507. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/llm/base.py +0 -0
  508. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/llm/openai.py +0 -0
  509. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/local.py +0 -0
  510. {topos_node-1.3.5 → topos_node-1.3.7}/topos/services/postgres.py +0 -0
  511. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/__init__.py +0 -0
  512. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/bundled_canonical_triples.py +0 -0
  513. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/canonical_signal_defaults.py +0 -0
  514. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/definitions.py +0 -0
  515. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/registry.py +0 -0
  516. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/runtime_install.py +0 -0
  517. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sources/scrub_attribution.py +0 -0
  518. {topos_node-1.3.5 → topos_node-1.3.7}/topos/startup_banner.py +0 -0
  519. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/__init__.py +0 -0
  520. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/__init__.py +0 -0
  521. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/factory.py +0 -0
  522. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/fakes.py +0 -0
  523. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/postgres/stores.py +0 -0
  524. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/protocols.py +0 -0
  525. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/sqlite/__init__.py +0 -0
  526. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  527. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/__init__.py +0 -0
  528. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/activity_tables.py +0 -0
  529. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  530. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  531. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  532. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/ai_chat/model.py +0 -0
  533. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  534. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/canonical/postgres.py +0 -0
  535. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/__init__.py +0 -0
  536. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/client.py +0 -0
  537. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/connection_tuning.py +0 -0
  538. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  539. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  540. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  541. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  542. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  543. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/backup.py +0 -0
  544. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  545. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  546. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  547. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  548. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/complexity_v1.py +0 -0
  549. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  550. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  551. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/documents_v1.py +0 -0
  552. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  553. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  554. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  555. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  556. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  557. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  558. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  559. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/episodes_v1.py +0 -0
  560. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  561. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  562. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  563. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  564. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  565. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  566. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  567. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  568. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/registry.py +0 -0
  569. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/registry_checksums.json +0 -0
  570. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  571. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  572. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  573. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  574. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/signal_objects.py +0 -0
  575. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  576. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  577. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  578. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  579. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  580. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  581. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  582. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  583. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  584. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  585. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  586. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  587. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  588. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  589. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  590. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  591. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  592. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  593. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  594. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  595. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  596. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  597. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/paths.py +0 -0
  598. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/postgres.py +0 -0
  599. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/schema.py +0 -0
  600. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/db/storage_breakdown.py +0 -0
  601. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/enrichment/__init__.py +0 -0
  602. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  603. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  604. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/normalized/__init__.py +0 -0
  605. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/normalized/normalized_store.py +0 -0
  606. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/oplog/__init__.py +0 -0
  607. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/oplog/decision.py +0 -0
  608. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/oplog/oplog_store.py +0 -0
  609. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/oplog/postgres.py +0 -0
  610. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/projections/__init__.py +0 -0
  611. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/projections/index_ops_store.py +0 -0
  612. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/projections/vector_index_store.py +0 -0
  613. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/raw/__init__.py +0 -0
  614. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/raw/file_store.py +0 -0
  615. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/raw/raw_store.py +0 -0
  616. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/raw/sqlite_raw_store.py +0 -0
  617. {topos_node-1.3.5 → topos_node-1.3.7}/topos/storage/security/encryption.py +0 -0
  618. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sync/__init__.py +0 -0
  619. {topos_node-1.3.5 → topos_node-1.3.7}/topos/sync/client.py +0 -0
  620. {topos_node-1.3.5 → topos_node-1.3.7}/topos/testing/__init__.py +0 -0
  621. {topos_node-1.3.5 → topos_node-1.3.7}/topos/uma_contact_enrichment.py +0 -0
  622. {topos_node-1.3.5 → topos_node-1.3.7}/topos/uma_filters.py +0 -0
  623. {topos_node-1.3.5 → topos_node-1.3.7}/topos/uma_resource_id.py +0 -0
  624. {topos_node-1.3.5 → topos_node-1.3.7}/topos/uma_rpt.py +0 -0
  625. {topos_node-1.3.5 → topos_node-1.3.7}/topos/upgrades/__init__.py +0 -0
  626. {topos_node-1.3.5 → topos_node-1.3.7}/topos/utils/base_object.py +0 -0
  627. {topos_node-1.3.5 → topos_node-1.3.7}/topos/websocket_client.py +0 -0
  628. {topos_node-1.3.5 → topos_node-1.3.7}/topos_node.egg-info/dependency_links.txt +0 -0
  629. {topos_node-1.3.5 → topos_node-1.3.7}/topos_node.egg-info/entry_points.txt +0 -0
  630. {topos_node-1.3.5 → topos_node-1.3.7}/topos_node.egg-info/requires.txt +0 -0
  631. {topos_node-1.3.5 → topos_node-1.3.7}/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.3.5
3
+ Version: 1.3.7
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 = "1.3.5"
7
+ version = "1.3.7"
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"
@@ -0,0 +1,61 @@
1
+ """first_run decides whether the UI says "downloading" or "preparing".
2
+
3
+ Getting it wrong is a lie in the copy: a node that reports first_run=False shows
4
+ "preparing its language models… should only take a moment" while it fetches 2.9GB.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import os
10
+
11
+ import pytest
12
+
13
+ from topos.sanitization import prewarm
14
+
15
+
16
+ @pytest.fixture
17
+ def cache_root(tmp_path, monkeypatch):
18
+ monkeypatch.setattr(prewarm, "_hf_cache_root", lambda: str(tmp_path))
19
+ return tmp_path
20
+
21
+
22
+ def _write_blobs(cache_root, repo_id: str, names: list[str]) -> None:
23
+ blobs = os.path.join(prewarm._repo_dir(str(cache_root), repo_id), "blobs")
24
+ os.makedirs(blobs, exist_ok=True)
25
+ for name in names:
26
+ open(os.path.join(blobs, name), "w").close()
27
+
28
+
29
+ REPO = prewarm.PRIVACY_FILTER_REPO
30
+
31
+
32
+ def test_absent_repo_is_not_present(cache_root):
33
+ assert prewarm._repo_present(REPO) is False
34
+
35
+
36
+ def test_started_but_empty_is_not_present(cache_root):
37
+ """The first instant of a first download — the directory exists, nothing is in it."""
38
+ _write_blobs(cache_root, REPO, [])
39
+ assert prewarm._repo_present(REPO) is False
40
+
41
+
42
+ def test_interrupted_download_is_not_present(cache_root):
43
+ """The case that made this a bug: a killed first run leaves .incomplete blobs
44
+ behind, and directory-existence alone would call that done."""
45
+ _write_blobs(cache_root, REPO, ["abc123.incomplete"])
46
+ assert prewarm._repo_present(REPO) is False
47
+
48
+
49
+ def test_partially_resumed_download_is_not_present(cache_root):
50
+ _write_blobs(cache_root, REPO, ["abc123", "def456.incomplete"])
51
+ assert prewarm._repo_present(REPO) is False
52
+
53
+
54
+ def test_complete_download_is_present(cache_root):
55
+ _write_blobs(cache_root, REPO, ["abc123", "def456"])
56
+ assert prewarm._repo_present(REPO) is True
57
+
58
+
59
+ def test_no_cache_root_is_not_present(monkeypatch):
60
+ monkeypatch.setattr(prewarm, "_hf_cache_root", lambda: None)
61
+ assert prewarm._repo_present(REPO) is False
@@ -0,0 +1,113 @@
1
+ """The machine name a Mac owner recognises, reported alongside the hostname.
2
+
3
+ `platform.node()` returns the network hostname, which on macOS is either a
4
+ mangled form of the computer name ("jonnys-macbook-pro.local") or something
5
+ meaningless from DHCP ("mac.lan" on the machine this was written on). The
6
+ frontend names a new self-hosted Topos after this, so a bad answer here shows up
7
+ as a Topos called "mac.lan".
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import subprocess
13
+
14
+ import pytest
15
+
16
+ from topos.core import state
17
+
18
+
19
+ @pytest.fixture(autouse=True)
20
+ def _clear_cache():
21
+ state._computer_name_cache = state._UNRESOLVED
22
+ yield
23
+ state._computer_name_cache = state._UNRESOLVED
24
+
25
+
26
+ def _fake_run(stdout: str):
27
+ def run(_cmd, **_kwargs):
28
+ return subprocess.CompletedProcess(args=_cmd, returncode=0, stdout=stdout, stderr="")
29
+
30
+ return run
31
+
32
+
33
+ def test_reports_the_computer_name_on_macos(monkeypatch):
34
+ monkeypatch.setattr(state.platform, "system", lambda: "Darwin")
35
+ monkeypatch.setattr(state.subprocess, "run", _fake_run("Jonny's MacBook Pro\n"))
36
+
37
+ assert state._macos_computer_name() == "Jonny's MacBook Pro"
38
+
39
+
40
+ def test_absent_off_macos(monkeypatch):
41
+ monkeypatch.setattr(state.platform, "system", lambda: "Linux")
42
+
43
+ def explode(*_a, **_k): # pragma: no cover - must never be reached
44
+ raise AssertionError("scutil is macOS-only and must not be spawned elsewhere")
45
+
46
+ monkeypatch.setattr(state.subprocess, "run", explode)
47
+ assert state._macos_computer_name() is None
48
+
49
+
50
+ @pytest.mark.parametrize("stdout", ["", " \n"])
51
+ def test_blank_output_is_no_name(monkeypatch, stdout):
52
+ monkeypatch.setattr(state.platform, "system", lambda: "Darwin")
53
+ monkeypatch.setattr(state.subprocess, "run", _fake_run(stdout))
54
+
55
+ assert state._macos_computer_name() is None
56
+
57
+
58
+ def test_failure_is_swallowed_and_never_retried(monkeypatch):
59
+ """A nicer label is never worth a startup failure — nor a stall on every request.
60
+
61
+ get_system_info runs inside async handlers, so an uncached spawn blocks the
62
+ event loop for the full timeout. On a Mac with no ComputerName that would be
63
+ a permanent per-request stall, so a miss is cached exactly like a hit and the
64
+ node falls back to the hostname for the rest of its life.
65
+ """
66
+ monkeypatch.setattr(state.platform, "system", lambda: "Darwin")
67
+ calls = {"n": 0}
68
+
69
+ def always_times_out(_cmd, **_kwargs):
70
+ calls["n"] += 1
71
+ raise subprocess.TimeoutExpired(cmd=_cmd, timeout=2.0)
72
+
73
+ monkeypatch.setattr(state.subprocess, "run", always_times_out)
74
+
75
+ assert state._macos_computer_name() is None
76
+ assert state._macos_computer_name() is None
77
+ assert state._macos_computer_name() is None
78
+ assert calls["n"] == 1
79
+
80
+
81
+ def test_non_macos_never_spawns_twice(monkeypatch):
82
+ monkeypatch.setattr(state.platform, "system", lambda: "Linux")
83
+ assert state._macos_computer_name() is None
84
+ # Cached, so a Linux node does not re-check platform on every request either.
85
+ assert state._computer_name_cache is None
86
+
87
+
88
+ def test_spawns_once_per_process(monkeypatch):
89
+ """get_device_info calls get_system_info twice, and the CP hits it on every connect."""
90
+ monkeypatch.setattr(state.platform, "system", lambda: "Darwin")
91
+ calls = {"n": 0}
92
+
93
+ def counting(_cmd, **_kwargs):
94
+ calls["n"] += 1
95
+ return subprocess.CompletedProcess(args=_cmd, returncode=0, stdout="q4\n", stderr="")
96
+
97
+ monkeypatch.setattr(state.subprocess, "run", counting)
98
+
99
+ for _ in range(5):
100
+ state._macos_computer_name()
101
+
102
+ assert calls["n"] == 1
103
+
104
+
105
+ def test_system_info_carries_computer_name_beside_hostname(monkeypatch):
106
+ """The dict is free-form and the control plane forwards it verbatim, so this
107
+ key is the entire wire contract — it lands as system_info.computer_name."""
108
+ monkeypatch.setattr(state, "_macos_computer_name", lambda: "Jonny's MacBook Pro")
109
+
110
+ info = state.get_system_info()
111
+
112
+ assert info["computer_name"] == "Jonny's MacBook Pro"
113
+ assert "hostname" in info
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.3.5"
4
- __version_info__ = (1, 3, 5)
3
+ __version__ = "1.3.7"
4
+ __version_info__ = (1, 3, 7)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -9,6 +9,7 @@ from typing import Any, Dict, List, Optional, Sequence
9
9
  import networkx as nx
10
10
 
11
11
  from .messenger_graph import extract_messenger_graph
12
+ from ..storage.db.write_gate import batched_writes, commit_connection, with_db_write
12
13
 
13
14
  MESSENGER_SOCIAL_EDGES_TABLE = "messenger_social_edges"
14
15
  MESSENGER_PARTICIPANT_IMPORTANCE_TABLE = "messenger_participant_importance"
@@ -28,6 +29,14 @@ def _source_scope(source_ids: Optional[Sequence[str]]) -> str:
28
29
 
29
30
  def ensure_messenger_analytics_tables(conn: Any) -> None:
30
31
  """Create Sprint 02 derived messenger analytics tables."""
32
+ # DDL takes SQLite's write lock at execute time — gate it with the commit
33
+ # (write_gate lock-order inversion).
34
+ with with_db_write():
35
+ _create_messenger_analytics_tables(conn)
36
+ commit_connection(conn)
37
+
38
+
39
+ def _create_messenger_analytics_tables(conn: Any) -> None:
31
40
  conn.execute(
32
41
  f"""
33
42
  CREATE TABLE IF NOT EXISTS {MESSENGER_SOCIAL_EDGES_TABLE} (
@@ -94,7 +103,6 @@ def ensure_messenger_analytics_tables(conn: Any) -> None:
94
103
  ON {MESSENGER_COMMUNITIES_TABLE}(dataset_id, period_key, source_scope)
95
104
  """
96
105
  )
97
- conn.commit()
98
106
 
99
107
 
100
108
  def build_networkx_graph(period_payload: Dict[str, Any]) -> nx.Graph:
@@ -165,28 +173,6 @@ def _persist_period_results(
165
173
  communities: Dict[str, int],
166
174
  ) -> Dict[str, int]:
167
175
  now = _utc_now()
168
- conn.execute(
169
- f"""
170
- DELETE FROM {MESSENGER_SOCIAL_EDGES_TABLE}
171
- WHERE dataset_id = ? AND period_key = ? AND source_scope = ?
172
- """,
173
- (dataset_id, period_key, source_scope),
174
- )
175
- conn.execute(
176
- f"""
177
- DELETE FROM {MESSENGER_PARTICIPANT_IMPORTANCE_TABLE}
178
- WHERE dataset_id = ? AND period_key = ? AND source_scope = ?
179
- """,
180
- (dataset_id, period_key, source_scope),
181
- )
182
- conn.execute(
183
- f"""
184
- DELETE FROM {MESSENGER_COMMUNITIES_TABLE}
185
- WHERE dataset_id = ? AND period_key = ? AND source_scope = ?
186
- """,
187
- (dataset_id, period_key, source_scope),
188
- )
189
-
190
176
  edge_rows = []
191
177
  for edge in period_payload.get("edges", []):
192
178
  source_id = str(edge.get("source") or "").strip()
@@ -207,18 +193,6 @@ def _persist_period_results(
207
193
  now,
208
194
  )
209
195
  )
210
- if edge_rows:
211
- conn.executemany(
212
- f"""
213
- INSERT INTO {MESSENGER_SOCIAL_EDGES_TABLE}
214
- (
215
- dataset_id, period_key, source_scope, source_id, target_id,
216
- weight, edge_type, edge_type_counts_json, created_at, updated_at
217
- )
218
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
219
- """,
220
- edge_rows,
221
- )
222
196
 
223
197
  importance_rows = []
224
198
  for participant_id, metrics in importance.items():
@@ -234,18 +208,6 @@ def _persist_period_results(
234
208
  now,
235
209
  )
236
210
  )
237
- if importance_rows:
238
- conn.executemany(
239
- f"""
240
- INSERT INTO {MESSENGER_PARTICIPANT_IMPORTANCE_TABLE}
241
- (
242
- dataset_id, period_key, source_scope, participant_id,
243
- centrality_degree, centrality_betweenness, created_at, updated_at
244
- )
245
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
246
- """,
247
- importance_rows,
248
- )
249
211
 
250
212
  community_rows = []
251
213
  for participant_id, community_id in communities.items():
@@ -260,19 +222,66 @@ def _persist_period_results(
260
222
  now,
261
223
  )
262
224
  )
263
- if community_rows:
264
- conn.executemany(
225
+ # Rows are built above, outside the hold; only the deletes + inserts (one
226
+ # commit at exit) hold the gate.
227
+ with batched_writes(conn):
228
+ conn.execute(
265
229
  f"""
266
- INSERT INTO {MESSENGER_COMMUNITIES_TABLE}
267
- (
268
- dataset_id, period_key, source_scope, participant_id,
269
- community_id, created_at, updated_at
270
- )
271
- VALUES (?, ?, ?, ?, ?, ?, ?)
230
+ DELETE FROM {MESSENGER_SOCIAL_EDGES_TABLE}
231
+ WHERE dataset_id = ? AND period_key = ? AND source_scope = ?
232
+ """,
233
+ (dataset_id, period_key, source_scope),
234
+ )
235
+ conn.execute(
236
+ f"""
237
+ DELETE FROM {MESSENGER_PARTICIPANT_IMPORTANCE_TABLE}
238
+ WHERE dataset_id = ? AND period_key = ? AND source_scope = ?
239
+ """,
240
+ (dataset_id, period_key, source_scope),
241
+ )
242
+ conn.execute(
243
+ f"""
244
+ DELETE FROM {MESSENGER_COMMUNITIES_TABLE}
245
+ WHERE dataset_id = ? AND period_key = ? AND source_scope = ?
272
246
  """,
273
- community_rows,
247
+ (dataset_id, period_key, source_scope),
274
248
  )
275
- conn.commit()
249
+ if edge_rows:
250
+ conn.executemany(
251
+ f"""
252
+ INSERT INTO {MESSENGER_SOCIAL_EDGES_TABLE}
253
+ (
254
+ dataset_id, period_key, source_scope, source_id, target_id,
255
+ weight, edge_type, edge_type_counts_json, created_at, updated_at
256
+ )
257
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
258
+ """,
259
+ edge_rows,
260
+ )
261
+ if importance_rows:
262
+ conn.executemany(
263
+ f"""
264
+ INSERT INTO {MESSENGER_PARTICIPANT_IMPORTANCE_TABLE}
265
+ (
266
+ dataset_id, period_key, source_scope, participant_id,
267
+ centrality_degree, centrality_betweenness, created_at, updated_at
268
+ )
269
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
270
+ """,
271
+ importance_rows,
272
+ )
273
+ if community_rows:
274
+ conn.executemany(
275
+ f"""
276
+ INSERT INTO {MESSENGER_COMMUNITIES_TABLE}
277
+ (
278
+ dataset_id, period_key, source_scope, participant_id,
279
+ community_id, created_at, updated_at
280
+ )
281
+ VALUES (?, ?, ?, ?, ?, ?, ?)
282
+ """,
283
+ community_rows,
284
+ )
276
285
  return {
277
286
  "edges_written": len(edge_rows),
278
287
  "importance_written": len(importance_rows),
@@ -14,6 +14,7 @@ from ..auth import require_api_key
14
14
  from ..core.state import get_db_connection
15
15
  from ..engine.engine import Engine
16
16
  from ..engine.tasks import ModelRequest, ProcessingTask
17
+ from ..storage.db.write_gate import commit_connection, with_db_write
17
18
 
18
19
  router = APIRouter(tags=["compute-remote"])
19
20
 
@@ -23,32 +24,35 @@ def _now_iso() -> str:
23
24
 
24
25
 
25
26
  def _ensure_tables(conn) -> None:
26
- conn.execute(
27
- """
28
- CREATE TABLE IF NOT EXISTS remote_compute_results (
29
- idempotency_key TEXT PRIMARY KEY,
30
- compute_task_id TEXT NOT NULL,
31
- response_json TEXT NOT NULL,
32
- requested_tier TEXT NOT NULL,
33
- correlation_id TEXT,
34
- created_at TEXT NOT NULL
27
+ # DDL takes SQLite's write lock at execute time — gate it with the commit
28
+ # (write_gate lock-order inversion).
29
+ with with_db_write():
30
+ conn.execute(
31
+ """
32
+ CREATE TABLE IF NOT EXISTS remote_compute_results (
33
+ idempotency_key TEXT PRIMARY KEY,
34
+ compute_task_id TEXT NOT NULL,
35
+ response_json TEXT NOT NULL,
36
+ requested_tier TEXT NOT NULL,
37
+ correlation_id TEXT,
38
+ created_at TEXT NOT NULL
39
+ )
40
+ """
35
41
  )
36
- """
37
- )
38
- conn.execute(
39
- """
40
- CREATE TABLE IF NOT EXISTS remote_compute_audit (
41
- audit_id TEXT PRIMARY KEY,
42
- compute_task_id TEXT NOT NULL,
43
- idempotency_key TEXT,
44
- principal TEXT NOT NULL,
45
- requested_tier TEXT NOT NULL,
46
- outcome TEXT NOT NULL,
47
- created_at TEXT NOT NULL
42
+ conn.execute(
43
+ """
44
+ CREATE TABLE IF NOT EXISTS remote_compute_audit (
45
+ audit_id TEXT PRIMARY KEY,
46
+ compute_task_id TEXT NOT NULL,
47
+ idempotency_key TEXT,
48
+ principal TEXT NOT NULL,
49
+ requested_tier TEXT NOT NULL,
50
+ outcome TEXT NOT NULL,
51
+ created_at TEXT NOT NULL
52
+ )
53
+ """
48
54
  )
49
- """
50
- )
51
- conn.commit()
55
+ commit_connection(conn)
52
56
 
53
57
 
54
58
  class RemoteComputeTaskRequest(BaseModel):
@@ -76,23 +80,24 @@ async def remote_compute_run(body: RemoteComputeTaskRequest) -> Dict[str, Any]:
76
80
  ).fetchone()
77
81
  if row:
78
82
  cached = json.loads(str(row["response_json"]))
79
- conn.execute(
80
- """
81
- INSERT INTO remote_compute_audit
82
- (audit_id, compute_task_id, idempotency_key, principal, requested_tier, outcome, created_at)
83
- VALUES (?, ?, ?, ?, ?, ?, ?)
84
- """,
85
- (
86
- f"rca_{uuid.uuid4().hex}",
87
- body.compute_task_id,
88
- body.idempotency_key,
89
- principal,
90
- body.requested_tier,
91
- "idempotent_replay",
92
- _now_iso(),
93
- ),
94
- )
95
- conn.commit()
83
+ with with_db_write():
84
+ conn.execute(
85
+ """
86
+ INSERT INTO remote_compute_audit
87
+ (audit_id, compute_task_id, idempotency_key, principal, requested_tier, outcome, created_at)
88
+ VALUES (?, ?, ?, ?, ?, ?, ?)
89
+ """,
90
+ (
91
+ f"rca_{uuid.uuid4().hex}",
92
+ body.compute_task_id,
93
+ body.idempotency_key,
94
+ principal,
95
+ body.requested_tier,
96
+ "idempotent_replay",
97
+ _now_iso(),
98
+ ),
99
+ )
100
+ commit_connection(conn)
96
101
  cached["idempotent_replay"] = True
97
102
  return cached
98
103
 
@@ -139,37 +144,38 @@ async def remote_compute_run(body: RemoteComputeTaskRequest) -> Dict[str, Any]:
139
144
  "idempotent_replay": False,
140
145
  }
141
146
 
142
- if body.idempotency_key:
147
+ with with_db_write():
148
+ if body.idempotency_key:
149
+ conn.execute(
150
+ """
151
+ INSERT OR REPLACE INTO remote_compute_results
152
+ (idempotency_key, compute_task_id, response_json, requested_tier, correlation_id, created_at)
153
+ VALUES (?, ?, ?, ?, ?, ?)
154
+ """,
155
+ (
156
+ body.idempotency_key,
157
+ body.compute_task_id,
158
+ json.dumps(response),
159
+ body.requested_tier,
160
+ body.correlation_id,
161
+ _now_iso(),
162
+ ),
163
+ )
143
164
  conn.execute(
144
165
  """
145
- INSERT OR REPLACE INTO remote_compute_results
146
- (idempotency_key, compute_task_id, response_json, requested_tier, correlation_id, created_at)
147
- VALUES (?, ?, ?, ?, ?, ?)
166
+ INSERT INTO remote_compute_audit
167
+ (audit_id, compute_task_id, idempotency_key, principal, requested_tier, outcome, created_at)
168
+ VALUES (?, ?, ?, ?, ?, ?, ?)
148
169
  """,
149
170
  (
150
- body.idempotency_key,
171
+ f"rca_{uuid.uuid4().hex}",
151
172
  body.compute_task_id,
152
- json.dumps(response),
173
+ body.idempotency_key,
174
+ principal,
153
175
  body.requested_tier,
154
- body.correlation_id,
176
+ str(response.get("status") or "unknown"),
155
177
  _now_iso(),
156
178
  ),
157
179
  )
158
- conn.execute(
159
- """
160
- INSERT INTO remote_compute_audit
161
- (audit_id, compute_task_id, idempotency_key, principal, requested_tier, outcome, created_at)
162
- VALUES (?, ?, ?, ?, ?, ?, ?)
163
- """,
164
- (
165
- f"rca_{uuid.uuid4().hex}",
166
- body.compute_task_id,
167
- body.idempotency_key,
168
- principal,
169
- body.requested_tier,
170
- str(response.get("status") or "unknown"),
171
- _now_iso(),
172
- ),
173
- )
174
- conn.commit()
180
+ commit_connection(conn)
175
181
  return response
@@ -13,6 +13,7 @@ from fastapi import APIRouter, Body, Depends, HTTPException
13
13
  from ..auth import require_api_key
14
14
  from ..core.state import get_db_connection
15
15
  from ..storage.db.migrations.conversation_context_v1 import CONTEXT_TAG_VALUES
16
+ from ..storage.db.write_gate import commit_connection, with_db_write
16
17
 
17
18
  router = APIRouter()
18
19
 
@@ -56,12 +57,13 @@ def write_conversation_context(conn, conversation_id: str, dataset_id: str, raw_
56
57
  raise LookupError("Unknown conversation")
57
58
  # Owner decisions always win: stamped 'owner' even when clearing, so the
58
59
  # auto-classifier never refills a conversation the owner chose to untag.
59
- conn.execute(
60
- "UPDATE conversations SET context_tag=?, context_tag_source='owner', "
61
- "updated_at=datetime('now') WHERE conversation_id=? AND dataset_id=?",
62
- (tag, conversation_id, dataset_id),
63
- )
64
- conn.commit()
60
+ with with_db_write():
61
+ conn.execute(
62
+ "UPDATE conversations SET context_tag=?, context_tag_source='owner', "
63
+ "updated_at=datetime('now') WHERE conversation_id=? AND dataset_id=?",
64
+ (tag, conversation_id, dataset_id),
65
+ )
66
+ commit_connection(conn)
65
67
  return {
66
68
  "status": "ok",
67
69
  "conversation_id": conversation_id,