topos-node 1.3.55__tar.gz → 1.3.57__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 (782) hide show
  1. {topos_node-1.3.55/topos_node.egg-info → topos_node-1.3.57}/PKG-INFO +1 -1
  2. {topos_node-1.3.55 → topos_node-1.3.57}/pyproject.toml +1 -1
  3. {topos_node-1.3.55 → topos_node-1.3.57}/topos/__version__.py +2 -2
  4. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/uma_data.py +61 -137
  5. {topos_node-1.3.55 → topos_node-1.3.57}/topos/app.py +39 -0
  6. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/tray.py +19 -1
  7. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/settings.py +1 -1
  8. {topos_node-1.3.55 → topos_node-1.3.57}/topos/control_plane_client.py +10 -1
  9. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/device.py +40 -4
  10. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/uma.py +88 -218
  11. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/graph_enrichers.py +123 -21
  12. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/maintenance.py +21 -4
  13. topos_node-1.3.57/topos/features/entities/rebuild_subprocess.py +524 -0
  14. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/canonical_pipeline.py +14 -0
  15. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/job_runner.py +67 -0
  16. {topos_node-1.3.55 → topos_node-1.3.57}/topos/runtime_shutdown.py +60 -2
  17. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/llm/openai.py +84 -4
  18. topos_node-1.3.57/topos/uma_authority.py +134 -0
  19. {topos_node-1.3.55 → topos_node-1.3.57}/topos/upgrades/manifests.json +12 -0
  20. {topos_node-1.3.55 → topos_node-1.3.57}/topos/upgrades/runner.py +13 -0
  21. {topos_node-1.3.55 → topos_node-1.3.57/topos_node.egg-info}/PKG-INFO +1 -1
  22. {topos_node-1.3.55 → topos_node-1.3.57}/topos_node.egg-info/SOURCES.txt +1 -0
  23. topos_node-1.3.55/topos/features/entities/rebuild_subprocess.py +0 -260
  24. {topos_node-1.3.55 → topos_node-1.3.57}/LICENSE +0 -0
  25. {topos_node-1.3.55 → topos_node-1.3.57}/MANIFEST.in +0 -0
  26. {topos_node-1.3.55 → topos_node-1.3.57}/README.md +0 -0
  27. {topos_node-1.3.55 → topos_node-1.3.57}/setup.cfg +0 -0
  28. {topos_node-1.3.55 → topos_node-1.3.57}/shared/__init__.py +0 -0
  29. {topos_node-1.3.55 → topos_node-1.3.57}/shared/filtering.py +0 -0
  30. {topos_node-1.3.55 → topos_node-1.3.57}/shared/schema_registry.py +0 -0
  31. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_active_database_binding.py +0 -0
  32. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_active_ingestion_binding.py +0 -0
  33. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_extensions.py +0 -0
  34. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_gate_leg_hermeticity.py +0 -0
  35. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_llm_integrations_storage.py +0 -0
  36. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_local_gate_composition.py +0 -0
  37. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_owner_database_hermeticity.py +0 -0
  38. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_prewarm_first_run.py +0 -0
  39. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_profile_hygiene.py +0 -0
  40. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_profiles.py +0 -0
  41. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_protocol_handled_types.py +0 -0
  42. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_query_field_contract.py +0 -0
  43. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_sync_dep_pins.py +0 -0
  44. {topos_node-1.3.55 → topos_node-1.3.57}/tests/test_system_computer_name.py +0 -0
  45. {topos_node-1.3.55 → topos_node-1.3.57}/topos/__init__.py +0 -0
  46. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/__init__.py +0 -0
  47. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/dataset_resolution.py +0 -0
  48. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/duckdb_adapter.py +0 -0
  49. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/luck_surface.py +0 -0
  50. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/messenger_communities.py +0 -0
  51. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/messenger_directed.py +0 -0
  52. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/messenger_graph.py +0 -0
  53. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/messenger_labels.py +0 -0
  54. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/person_graph.py +0 -0
  55. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/person_overlay.py +0 -0
  56. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/profiles.py +0 -0
  57. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/query_engine.py +0 -0
  58. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/raw_queries.py +0 -0
  59. {topos_node-1.3.55 → topos_node-1.3.57}/topos/analytics/relationship_reads.py +0 -0
  60. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/__init__.py +0 -0
  61. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/analytics.py +0 -0
  62. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/app_registry.py +0 -0
  63. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/backup.py +0 -0
  64. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/community_naming_config.py +0 -0
  65. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/compute_remote.py +0 -0
  66. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/connected_apps.py +0 -0
  67. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/conversation_context.py +0 -0
  68. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/data_commit.py +0 -0
  69. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/data_explorer_table_prefs.py +0 -0
  70. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/database_explorer.py +0 -0
  71. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/db.py +0 -0
  72. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/device.py +0 -0
  73. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/disk_space_config.py +0 -0
  74. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/engine_run.py +0 -0
  75. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/enrichment.py +0 -0
  76. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/enrichment_lab.py +0 -0
  77. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/facts_llm_config.py +0 -0
  78. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/filter_lab.py +0 -0
  79. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/health.py +0 -0
  80. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/home_chat.py +0 -0
  81. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/ingestion_api.py +0 -0
  82. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/ingestion_compat.py +0 -0
  83. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/ingestion_sources.py +0 -0
  84. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/intelligence_lifecycle.py +0 -0
  85. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/llm.py +0 -0
  86. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/local_mcp.py +0 -0
  87. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/messenger_analytics.py +0 -0
  88. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/privacy_disclose.py +0 -0
  89. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/query_api.py +0 -0
  90. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/runtime_bootstrap.py +0 -0
  91. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/sanitization_ollama_config.py +0 -0
  92. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/shell.py +0 -0
  93. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/signal.py +0 -0
  94. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/signal_extraction_config.py +0 -0
  95. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/source_install.py +0 -0
  96. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/source_scrub.py +0 -0
  97. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/sources.py +0 -0
  98. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/sources_overview.py +0 -0
  99. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/sync.py +0 -0
  100. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/tool_index.py +0 -0
  101. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/ui_config.py +0 -0
  102. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/upgrades.py +0 -0
  103. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/usage.py +0 -0
  104. {topos_node-1.3.55 → topos_node-1.3.57}/topos/api/user_identity.py +0 -0
  105. {topos_node-1.3.55 → topos_node-1.3.57}/topos/auth.py +0 -0
  106. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/__init__.py +0 -0
  107. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/declared_field_map.py +0 -0
  108. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/__init__.py +0 -0
  109. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/base.py +0 -0
  110. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  111. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  112. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  113. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  114. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  115. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  116. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  117. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  118. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
  119. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/models.py +0 -0
  120. {topos_node-1.3.55 → topos_node-1.3.57}/topos/canonicalization/resolver.py +0 -0
  121. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/__init__.py +0 -0
  122. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/__main__.py +0 -0
  123. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/assets/topos_black.png +0 -0
  124. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/assets/topos_blk_rounded.png +0 -0
  125. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/assets/topos_white.png +0 -0
  126. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/commands.py +0 -0
  127. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/profile_cmd.py +0 -0
  128. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/reprocess_cmd.py +0 -0
  129. {topos_node-1.3.55 → topos_node-1.3.57}/topos/cli/setup_models_cmd.py +0 -0
  130. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/__init__.py +0 -0
  131. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/conversation_context_llm.py +0 -0
  132. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/facts_llm.py +0 -0
  133. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/local_model_builds.py +0 -0
  134. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/model_packs.py +0 -0
  135. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/node_function_providers.py +0 -0
  136. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/sanitization_ollama.py +0 -0
  137. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/signal_extraction.py +0 -0
  138. {topos_node-1.3.55 → topos_node-1.3.57}/topos/config/uvicorn_logging.json +0 -0
  139. {topos_node-1.3.55 → topos_node-1.3.57}/topos/contacts/__init__.py +0 -0
  140. {topos_node-1.3.55 → topos_node-1.3.57}/topos/contacts/identity.py +0 -0
  141. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/__init__.py +0 -0
  142. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/api_models.py +0 -0
  143. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/connection_resilience.py +0 -0
  144. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/db_health.py +0 -0
  145. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/device_helpers.py +0 -0
  146. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/errors.py +0 -0
  147. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/events.py +0 -0
  148. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/__init__.py +0 -0
  149. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/aggregate.py +0 -0
  150. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/common.py +0 -0
  151. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/complexity.py +0 -0
  152. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/config.py +0 -0
  153. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/contacts_import.py +0 -0
  154. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/database_explorer.py +0 -0
  155. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/derivation.py +0 -0
  156. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/enrichment.py +0 -0
  157. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/enrichment_lab.py +0 -0
  158. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/filter_lab.py +0 -0
  159. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/graph_query.py +0 -0
  160. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/graph_summary.py +0 -0
  161. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/home_chat.py +0 -0
  162. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/ingest.py +0 -0
  163. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/mcp_client_elevations.py +0 -0
  164. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/mcp_clients.py +0 -0
  165. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/messages.py +0 -0
  166. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/messenger_analytics.py +0 -0
  167. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/query.py +0 -0
  168. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/registry.py +0 -0
  169. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/routines.py +0 -0
  170. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/signal_features.py +0 -0
  171. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/sources.py +0 -0
  172. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/timeline_daily.py +0 -0
  173. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/handlers/tool_index.py +0 -0
  174. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/logging.py +0 -0
  175. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/metrics.py +0 -0
  176. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/routine_access.py +0 -0
  177. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/startup_banner.py +0 -0
  178. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/state.py +0 -0
  179. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/table_layers.py +0 -0
  180. {topos_node-1.3.55 → topos_node-1.3.57}/topos/core/types.py +0 -0
  181. {topos_node-1.3.55 → topos_node-1.3.57}/topos/data_explorer_row_delete.py +0 -0
  182. {topos_node-1.3.55 → topos_node-1.3.57}/topos/data_explorer_table_prefs.py +0 -0
  183. {topos_node-1.3.55 → topos_node-1.3.57}/topos/data_explorer_tables.py +0 -0
  184. {topos_node-1.3.55 → topos_node-1.3.57}/topos/defaults.py +0 -0
  185. {topos_node-1.3.55 → topos_node-1.3.57}/topos/disclosure/__init__.py +0 -0
  186. {topos_node-1.3.55 → topos_node-1.3.57}/topos/disclosure/canonical_writer.py +0 -0
  187. {topos_node-1.3.55 → topos_node-1.3.57}/topos/disclosure/content_policy.py +0 -0
  188. {topos_node-1.3.55 → topos_node-1.3.57}/topos/disclosure/field_registry.py +0 -0
  189. {topos_node-1.3.55 → topos_node-1.3.57}/topos/disclosure/privacy_layer.py +0 -0
  190. {topos_node-1.3.55 → topos_node-1.3.57}/topos/disclosure/tier.py +0 -0
  191. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/__init__.py +0 -0
  192. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/__init__.py +0 -0
  193. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/base.py +0 -0
  194. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/generative_prompts.py +0 -0
  195. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/generative_response.py +0 -0
  196. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/huggingface.py +0 -0
  197. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/ollama.py +0 -0
  198. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/openai.py +0 -0
  199. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/openai_compatible.py +0 -0
  200. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/redpill.py +0 -0
  201. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/backends/stub.py +0 -0
  202. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/client.py +0 -0
  203. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/disk_space.py +0 -0
  204. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/engine.py +0 -0
  205. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/hosted_llm_wallet.py +0 -0
  206. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/intake.py +0 -0
  207. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/memory_utils.py +0 -0
  208. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/model_cache.py +0 -0
  209. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/model_manager.py +0 -0
  210. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/ollama_install.py +0 -0
  211. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/ollama_pull.py +0 -0
  212. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/ollama_runtime.py +0 -0
  213. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/ollama_setup_guidance.py +0 -0
  214. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/pipeline_memory.py +0 -0
  215. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/queue_manager.py +0 -0
  216. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/registration.py +0 -0
  217. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/result_formatter.py +0 -0
  218. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/router.py +0 -0
  219. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/scoped_token.py +0 -0
  220. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/tasks.py +0 -0
  221. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/torch_runtime.py +0 -0
  222. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/transport.py +0 -0
  223. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/usage_guard.py +0 -0
  224. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/usage_observation.py +0 -0
  225. {topos_node-1.3.55 → topos_node-1.3.57}/topos/engine/validator.py +0 -0
  226. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/__init__.py +0 -0
  227. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/catalog.py +0 -0
  228. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/derivation_recovery.py +0 -0
  229. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/derived_tables.py +0 -0
  230. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/job_readiness.py +0 -0
  231. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/job_writer.py +0 -0
  232. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/__init__.py +0 -0
  233. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/base.py +0 -0
  234. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  235. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  236. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  237. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  238. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  239. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  240. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  241. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  242. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  243. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  244. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  245. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  246. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  247. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  248. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  249. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  250. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  251. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  252. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  253. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  254. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  255. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  256. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/raw/__init__.py +0 -0
  257. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  258. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/raw/language_job.py +0 -0
  259. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  260. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  261. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/model_overrides.py +0 -0
  262. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/models/__init__.py +0 -0
  263. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/models/manager.py +0 -0
  264. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/models/mvp_defaults.py +0 -0
  265. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/models/registry.py +0 -0
  266. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/models/versioning.py +0 -0
  267. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/orchestrator.py +0 -0
  268. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/pipeline_activity.py +0 -0
  269. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/processor.py +0 -0
  270. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/progress_bar.py +0 -0
  271. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/record_progress.py +0 -0
  272. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/registry_contract.py +0 -0
  273. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/signal_derivation_config.json +0 -0
  274. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment/source_overrides.py +0 -0
  275. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/__init__.py +0 -0
  276. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/bundles.py +0 -0
  277. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/model_resolve.py +0 -0
  278. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/schema.py +0 -0
  279. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/service.py +0 -0
  280. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/store.py +0 -0
  281. {topos_node-1.3.55 → topos_node-1.3.57}/topos/enrichment_lab/worker.py +0 -0
  282. {topos_node-1.3.55 → topos_node-1.3.57}/topos/evals/__init__.py +0 -0
  283. {topos_node-1.3.55 → topos_node-1.3.57}/topos/evals/enrichment_eval.py +0 -0
  284. {topos_node-1.3.55 → topos_node-1.3.57}/topos/extensions.py +0 -0
  285. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/__init__.py +0 -0
  286. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/canonical.py +0 -0
  287. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/engine.py +0 -0
  288. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/entropy.py +0 -0
  289. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/focus.py +0 -0
  290. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/graph_metrics.py +0 -0
  291. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/influence.py +0 -0
  292. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/projection.py +0 -0
  293. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/snapshots.py +0 -0
  294. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/store.py +0 -0
  295. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/topic_merge.py +0 -0
  296. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/topics.py +0 -0
  297. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/topics_daily.py +0 -0
  298. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/complexity/volatility.py +0 -0
  299. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/__init__.py +0 -0
  300. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  301. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  302. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  303. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  304. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  305. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  306. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  307. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  308. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  309. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  310. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  311. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  312. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  313. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  314. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  315. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  316. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  317. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  318. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  319. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  320. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  321. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
  322. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  323. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  324. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  325. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  326. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  327. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  328. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  329. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  330. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  331. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  332. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  333. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  334. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  335. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  336. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  337. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/candidates.py +0 -0
  338. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/commitments.py +0 -0
  339. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/guard.py +0 -0
  340. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/kernels.py +0 -0
  341. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/net_subject_policy.py +0 -0
  342. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/packs.py +0 -0
  343. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/person_bridge.py +0 -0
  344. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/person_reading.py +0 -0
  345. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/prefilter.py +0 -0
  346. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/registry.py +0 -0
  347. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/report_card.py +0 -0
  348. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/router.py +0 -0
  349. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/social_bench.py +0 -0
  350. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/social_kernels.py +0 -0
  351. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/surfaces.py +0 -0
  352. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/synthesize.py +0 -0
  353. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/template.py +0 -0
  354. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/verify.py +0 -0
  355. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/derivation/writer.py +0 -0
  356. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/__init__.py +0 -0
  357. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/affinity.py +0 -0
  358. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/affinity_owner.py +0 -0
  359. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/affinity_quality.py +0 -0
  360. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/chatgpt_declared.py +0 -0
  361. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/community_names.py +0 -0
  362. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/community_naming.py +0 -0
  363. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/consolidation.py +0 -0
  364. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/context_vectors.py +0 -0
  365. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/cypher.py +0 -0
  366. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/declared_mappings.py +0 -0
  367. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/discourse_graph.py +0 -0
  368. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/dossier.py +0 -0
  369. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/edges.py +0 -0
  370. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/fact_materializer.py +0 -0
  371. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/graph_refresh.py +0 -0
  372. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/graph_search.py +0 -0
  373. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/linking.py +0 -0
  374. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/owner.py +0 -0
  375. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/reads.py +0 -0
  376. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/resolver.py +0 -0
  377. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/entities/structured_fields.py +0 -0
  378. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/facts/__init__.py +0 -0
  379. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/facts/extract.py +0 -0
  380. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/facts/llm_extract.py +0 -0
  381. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/facts/reads.py +0 -0
  382. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/facts/store.py +0 -0
  383. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/facts/verdicts.py +0 -0
  384. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/fit/evaluator.py +0 -0
  385. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/fit/opportunity_types.json +0 -0
  386. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/__init__.py +0 -0
  387. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/blackhole.py +0 -0
  388. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/blackhole_guard.py +0 -0
  389. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/blackhole_llm.py +0 -0
  390. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  391. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/derived_scrub.py +0 -0
  392. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/exclusions.py +0 -0
  393. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/lifecycle/gc.py +0 -0
  394. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/provenance/__init__.py +0 -0
  395. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/provenance/posture.py +0 -0
  396. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/provenance/roles.py +0 -0
  397. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/__init__.py +0 -0
  398. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/brief_canonical_loader.py +0 -0
  399. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/brief_ontology.py +0 -0
  400. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/brief_renderer.py +0 -0
  401. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/brief_schemas.py +0 -0
  402. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/chunking.py +0 -0
  403. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/cluster_labels.py +0 -0
  404. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/conversation_context.py +0 -0
  405. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/conversation_windows.py +0 -0
  406. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/data_health.py +0 -0
  407. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  408. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/intentions.json +0 -0
  409. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/interests.json +0 -0
  410. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/memory.json +0 -0
  411. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/places.json +0 -0
  412. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/profile.json +0 -0
  413. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/relationships.json +0 -0
  414. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/resources.json +0 -0
  415. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  416. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/time.json +0 -0
  417. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/wellbeing.json +0 -0
  418. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/definitions/work.json +0 -0
  419. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/derived_index.py +0 -0
  420. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/derived_spec.py +0 -0
  421. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/dimension_briefs.py +0 -0
  422. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/dimension_definition_loader.py +0 -0
  423. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/dimension_profiles.py +0 -0
  424. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/dimension_registry.py +0 -0
  425. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/embed_context.py +0 -0
  426. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/extraction/artifact_router.py +0 -0
  427. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/extraction/artifact_store.py +0 -0
  428. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/extraction/rule_extractors.py +0 -0
  429. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/graph_sanitize.py +0 -0
  430. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/hybrid_search.py +0 -0
  431. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/incremental_clustering.py +0 -0
  432. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/model_recommendations.py +0 -0
  433. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/query_embed_cache.py +0 -0
  434. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/schemas.py +0 -0
  435. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/service.py +0 -0
  436. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/signal_object_store.py +0 -0
  437. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/source_hydration.py +0 -0
  438. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/structured_signal.py +0 -0
  439. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/tool_index.py +0 -0
  440. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/topic_clustering.py +0 -0
  441. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/typed_stores/aggregates.py +0 -0
  442. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/typed_stores/commitments.py +0 -0
  443. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/typed_stores/rhythm.py +0 -0
  444. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  445. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/vector_codec.py +0 -0
  446. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/vector_math.py +0 -0
  447. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/signal/vector_settings.py +0 -0
  448. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/stats/__init__.py +0 -0
  449. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/stats/definitions.py +0 -0
  450. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/stats/engine.py +0 -0
  451. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/stats/fold.py +0 -0
  452. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/stats/insights.py +0 -0
  453. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/timeline_projection.py +0 -0
  454. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/timeline_rollup.py +0 -0
  455. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/__init__.py +0 -0
  456. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/badges.py +0 -0
  457. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/daily.py +0 -0
  458. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/dashboard.py +0 -0
  459. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/instruments.py +0 -0
  460. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/intents.py +0 -0
  461. {topos_node-1.3.55 → topos_node-1.3.57}/topos/features/triage/readiness.py +0 -0
  462. {topos_node-1.3.55 → topos_node-1.3.57}/topos/filter_lab/__init__.py +0 -0
  463. {topos_node-1.3.55 → topos_node-1.3.57}/topos/filter_lab/bundles.py +0 -0
  464. {topos_node-1.3.55 → topos_node-1.3.57}/topos/filter_lab/schema.py +0 -0
  465. {topos_node-1.3.55 → topos_node-1.3.57}/topos/filter_lab/service.py +0 -0
  466. {topos_node-1.3.55 → topos_node-1.3.57}/topos/filter_lab/store.py +0 -0
  467. {topos_node-1.3.55 → topos_node-1.3.57}/topos/filter_lab/worker.py +0 -0
  468. {topos_node-1.3.55 → topos_node-1.3.57}/topos/home_chat/__init__.py +0 -0
  469. {topos_node-1.3.55 → topos_node-1.3.57}/topos/home_chat/schema.py +0 -0
  470. {topos_node-1.3.55 → topos_node-1.3.57}/topos/home_chat/store.py +0 -0
  471. {topos_node-1.3.55 → topos_node-1.3.57}/topos/hosted_pool_lease.py +0 -0
  472. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/__init__.py +0 -0
  473. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/checkpoints/__init__.py +0 -0
  474. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  475. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  476. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/inbox_crypto.py +0 -0
  477. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/inbox_drain.py +0 -0
  478. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/ingest_helpers.py +0 -0
  479. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/jobs.py +0 -0
  480. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/journal_location_fanout.py +0 -0
  481. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/journal_time_log_normalize.py +0 -0
  482. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/local_exports.py +0 -0
  483. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/local_sync.py +0 -0
  484. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/local_sync_jobs.py +0 -0
  485. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/log_preview.py +0 -0
  486. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/manager.py +0 -0
  487. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parser.py +0 -0
  488. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/__init__.py +0 -0
  489. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/base.py +0 -0
  490. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/browser_parser.py +0 -0
  491. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/calendar_parser.py +0 -0
  492. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  493. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  494. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  495. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  496. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/documents_parser.py +0 -0
  497. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  498. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  499. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/grok_parser.py +0 -0
  500. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/messenger_parser.py +0 -0
  501. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/transcript_parser.py +0 -0
  502. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  503. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/progress.py +0 -0
  504. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/reprocess.py +0 -0
  505. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/__init__.py +0 -0
  506. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/base.py +0 -0
  507. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/calendar.py +0 -0
  508. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/chatgpt.py +0 -0
  509. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/contact_importers.py +0 -0
  510. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/grok.py +0 -0
  511. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/imessage_reader.py +0 -0
  512. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/signal_export_parser.py +0 -0
  513. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/sources/signal_reader.py +0 -0
  514. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/state_machine.py +0 -0
  515. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/triggers/__init__.py +0 -0
  516. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/triggers/file_trigger.py +0 -0
  517. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  518. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  519. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/validation/__init__.py +0 -0
  520. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/validation/base.py +0 -0
  521. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/validation/schema_registry.py +0 -0
  522. {topos_node-1.3.55 → topos_node-1.3.57}/topos/ingestion/validation/schema_validator.py +0 -0
  523. {topos_node-1.3.55 → topos_node-1.3.57}/topos/lineage/__init__.py +0 -0
  524. {topos_node-1.3.55 → topos_node-1.3.57}/topos/lineage/provenance.py +0 -0
  525. {topos_node-1.3.55 → topos_node-1.3.57}/topos/lineage/tracker.py +0 -0
  526. {topos_node-1.3.55 → topos_node-1.3.57}/topos/llm_integrations_storage.py +0 -0
  527. {topos_node-1.3.55 → topos_node-1.3.57}/topos/mcp_clients.py +0 -0
  528. {topos_node-1.3.55 → topos_node-1.3.57}/topos/mcp_stdio_proxy.py +0 -0
  529. {topos_node-1.3.55 → topos_node-1.3.57}/topos/observability/__init__.py +0 -0
  530. {topos_node-1.3.55 → topos_node-1.3.57}/topos/observability/alerts.py +0 -0
  531. {topos_node-1.3.55 → topos_node-1.3.57}/topos/observability/metrics.py +0 -0
  532. {topos_node-1.3.55 → topos_node-1.3.57}/topos/observability/tracing.py +0 -0
  533. {topos_node-1.3.55 → topos_node-1.3.57}/topos/openai_client.py +0 -0
  534. {topos_node-1.3.55 → topos_node-1.3.57}/topos/owner_key.py +0 -0
  535. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/__init__.py +0 -0
  536. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/audit.py +0 -0
  537. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/envelope.py +0 -0
  538. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/job_store.py +0 -0
  539. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/stages.py +0 -0
  540. {topos_node-1.3.55 → topos_node-1.3.57}/topos/pipeline/stub_enqueue.py +0 -0
  541. {topos_node-1.3.55 → topos_node-1.3.57}/topos/principal.py +0 -0
  542. {topos_node-1.3.55 → topos_node-1.3.57}/topos/profiles.py +0 -0
  543. {topos_node-1.3.55 → topos_node-1.3.57}/topos/projections/__init__.py +0 -0
  544. {topos_node-1.3.55 → topos_node-1.3.57}/topos/projections/vector_index/__init__.py +0 -0
  545. {topos_node-1.3.55 → topos_node-1.3.57}/topos/projections/vector_index/base.py +0 -0
  546. {topos_node-1.3.55 → topos_node-1.3.57}/topos/projections/vector_index/builders.py +0 -0
  547. {topos_node-1.3.55 → topos_node-1.3.57}/topos/projections/vector_index/health_checks.py +0 -0
  548. {topos_node-1.3.55 → topos_node-1.3.57}/topos/protocol/__init__.py +0 -0
  549. {topos_node-1.3.55 → topos_node-1.3.57}/topos/protocol/handled_message_types.json +0 -0
  550. {topos_node-1.3.55 → topos_node-1.3.57}/topos/protocol/narrowing_vocabulary.json +0 -0
  551. {topos_node-1.3.55 → topos_node-1.3.57}/topos/protocol/query_field_contract.json +0 -0
  552. {topos_node-1.3.55 → topos_node-1.3.57}/topos/protocol/retrieval_text_contract.json +0 -0
  553. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/__init__.py +0 -0
  554. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/aggregate.py +0 -0
  555. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/audit.py +0 -0
  556. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/closeness.py +0 -0
  557. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/cohort_resolvers.py +0 -0
  558. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/collaborators.py +0 -0
  559. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/ddr.py +0 -0
  560. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/disclosure.py +0 -0
  561. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/entity_window.py +0 -0
  562. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/exclusion.py +0 -0
  563. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/facts_direct.py +0 -0
  564. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/fingerprint.py +0 -0
  565. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/game_layer.py +0 -0
  566. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/grant_cache.py +0 -0
  567. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/graph_lane.py +0 -0
  568. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/inference.py +0 -0
  569. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/intent.py +0 -0
  570. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/journal_event_lane.py +0 -0
  571. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/manifest.py +0 -0
  572. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/manifest_validation.py +0 -0
  573. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/minimizer.py +0 -0
  574. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/narrowing.py +0 -0
  575. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/negotiation.py +0 -0
  576. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/overheard.py +0 -0
  577. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/packet_resolution.py +0 -0
  578. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/pipeline.py +0 -0
  579. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/planner.py +0 -0
  580. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/retrieval.py +0 -0
  581. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/runtime.py +0 -0
  582. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/scope_arbiter.py +0 -0
  583. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/scope_classifier.py +0 -0
  584. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/scope_head.py +0 -0
  585. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/scope_registry.json +0 -0
  586. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/scope_registry_loader.py +0 -0
  587. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/scope_shadow.py +0 -0
  588. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/session.py +0 -0
  589. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/session_utils.py +0 -0
  590. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/source_generation.py +0 -0
  591. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/truth_facts.py +0 -0
  592. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/truth_prompts.py +0 -0
  593. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/turn_classifier.py +0 -0
  594. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/types.py +0 -0
  595. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/verify.py +0 -0
  596. {topos_node-1.3.55 → topos_node-1.3.57}/topos/query/verify_modes.py +0 -0
  597. {topos_node-1.3.55 → topos_node-1.3.57}/topos/rate_limit.py +0 -0
  598. {topos_node-1.3.55 → topos_node-1.3.57}/topos/relay_stamp.py +0 -0
  599. {topos_node-1.3.55 → topos_node-1.3.57}/topos/routines/__init__.py +0 -0
  600. {topos_node-1.3.55 → topos_node-1.3.57}/topos/routines/schema.py +0 -0
  601. {topos_node-1.3.55 → topos_node-1.3.57}/topos/routines/store.py +0 -0
  602. {topos_node-1.3.55 → topos_node-1.3.57}/topos/runtime_housekeeping.py +0 -0
  603. {topos_node-1.3.55 → topos_node-1.3.57}/topos/runtime_update.py +0 -0
  604. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sanitization/__init__.py +0 -0
  605. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sanitization/nsfw_classifier.py +0 -0
  606. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sanitization/ollama_transforms.py +0 -0
  607. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sanitization/prewarm.py +0 -0
  608. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sanitization/privacy_filter.py +0 -0
  609. {topos_node-1.3.55 → topos_node-1.3.57}/topos/scope_resolution.py +0 -0
  610. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/__init__.py +0 -0
  611. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/container.py +0 -0
  612. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/embeddings/__init__.py +0 -0
  613. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/embeddings/base.py +0 -0
  614. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/embeddings/local.py +0 -0
  615. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/embeddings/remote.py +0 -0
  616. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/interfaces.py +0 -0
  617. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/llm/__init__.py +0 -0
  618. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/llm/base.py +0 -0
  619. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/local.py +0 -0
  620. {topos_node-1.3.55 → topos_node-1.3.57}/topos/services/postgres.py +0 -0
  621. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/__init__.py +0 -0
  622. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/bundled_canonical_triples.py +0 -0
  623. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/canonical_signal_defaults.py +0 -0
  624. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/declared_field_map_spec.py +0 -0
  625. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/definitions.py +0 -0
  626. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/install_service.py +0 -0
  627. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/registry.py +0 -0
  628. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/runtime_install.py +0 -0
  629. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/scrub_attribution.py +0 -0
  630. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sources/scrub_service.py +0 -0
  631. {topos_node-1.3.55 → topos_node-1.3.57}/topos/startup_banner.py +0 -0
  632. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/__init__.py +0 -0
  633. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/__init__.py +0 -0
  634. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/factory.py +0 -0
  635. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/fakes.py +0 -0
  636. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/postgres/stores.py +0 -0
  637. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/protocols.py +0 -0
  638. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/sqlite/__init__.py +0 -0
  639. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/sqlite/stores.py +0 -0
  640. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  641. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/__init__.py +0 -0
  642. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/activity_tables.py +0 -0
  643. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  644. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  645. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  646. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/ai_chat/model.py +0 -0
  647. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/ai_chat/tables.py +0 -0
  648. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  649. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/canonical_store.py +0 -0
  650. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/conversations_tables.py +0 -0
  651. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/journal_repair.py +0 -0
  652. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/mapping_store.py +0 -0
  653. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/canonical/postgres.py +0 -0
  654. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/__init__.py +0 -0
  655. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/client.py +0 -0
  656. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/connection_tuning.py +0 -0
  657. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/__init__.py +0 -0
  658. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  659. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  660. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  661. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  662. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  663. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/backup.py +0 -0
  664. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/backup_custody.py +0 -0
  665. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  666. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  667. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  668. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  669. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/community_names_v1.py +0 -0
  670. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/complexity_v1.py +0 -0
  671. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  672. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  673. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  674. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  675. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  676. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  677. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/documents_v1.py +0 -0
  678. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  679. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  680. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  681. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  682. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  683. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  684. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  685. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  686. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  687. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  688. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  689. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/episodes_v1.py +0 -0
  690. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  691. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  692. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  693. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  694. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  695. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  696. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  697. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  698. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  699. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  700. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  701. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  702. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  703. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  704. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  705. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/registry.py +0 -0
  706. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/registry_checksums.json +0 -0
  707. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  708. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  709. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  710. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  711. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  712. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/signal_objects.py +0 -0
  713. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  714. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  715. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  716. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  717. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/transcripts_v1.py +0 -0
  718. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  719. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  720. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  721. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  722. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  723. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  724. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  725. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  726. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  727. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  728. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  729. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  730. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  731. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  732. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  733. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  734. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  735. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  736. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/paths.py +0 -0
  737. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/postgres.py +0 -0
  738. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/schema.py +0 -0
  739. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/schema_probe.py +0 -0
  740. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/storage_breakdown.py +0 -0
  741. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/db/write_gate.py +0 -0
  742. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/derived_row_identity.py +0 -0
  743. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/enrichment/__init__.py +0 -0
  744. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  745. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  746. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/normalized/__init__.py +0 -0
  747. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/normalized/normalized_store.py +0 -0
  748. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/oplog/__init__.py +0 -0
  749. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/oplog/decision.py +0 -0
  750. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/oplog/oplog_store.py +0 -0
  751. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/oplog/postgres.py +0 -0
  752. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/person/identity_resolver.py +0 -0
  753. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/projections/__init__.py +0 -0
  754. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/projections/index_ops_store.py +0 -0
  755. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/projections/vector_index_store.py +0 -0
  756. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/raw/__init__.py +0 -0
  757. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/raw/browser_flat_tables.py +0 -0
  758. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/raw/file_store.py +0 -0
  759. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/raw/raw_store.py +0 -0
  760. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/raw/raw_tables_manager.py +0 -0
  761. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/raw/sqlite_raw_store.py +0 -0
  762. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/security/encryption.py +0 -0
  763. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/signal_identity.py +0 -0
  764. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/source_settings.py +0 -0
  765. {topos_node-1.3.55 → topos_node-1.3.57}/topos/storage/user_identity.py +0 -0
  766. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sync/__init__.py +0 -0
  767. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sync/client.py +0 -0
  768. {topos_node-1.3.55 → topos_node-1.3.57}/topos/sync_handlers.py +0 -0
  769. {topos_node-1.3.55 → topos_node-1.3.57}/topos/testing/__init__.py +0 -0
  770. {topos_node-1.3.55 → topos_node-1.3.57}/topos/testing/lifespan.py +0 -0
  771. {topos_node-1.3.55 → topos_node-1.3.57}/topos/uds.py +0 -0
  772. {topos_node-1.3.55 → topos_node-1.3.57}/topos/uma_contact_enrichment.py +0 -0
  773. {topos_node-1.3.55 → topos_node-1.3.57}/topos/uma_filters.py +0 -0
  774. {topos_node-1.3.55 → topos_node-1.3.57}/topos/uma_resource_id.py +0 -0
  775. {topos_node-1.3.55 → topos_node-1.3.57}/topos/uma_rpt.py +0 -0
  776. {topos_node-1.3.55 → topos_node-1.3.57}/topos/upgrades/__init__.py +0 -0
  777. {topos_node-1.3.55 → topos_node-1.3.57}/topos/utils/base_object.py +0 -0
  778. {topos_node-1.3.55 → topos_node-1.3.57}/topos/websocket_client.py +0 -0
  779. {topos_node-1.3.55 → topos_node-1.3.57}/topos_node.egg-info/dependency_links.txt +0 -0
  780. {topos_node-1.3.55 → topos_node-1.3.57}/topos_node.egg-info/entry_points.txt +0 -0
  781. {topos_node-1.3.55 → topos_node-1.3.57}/topos_node.egg-info/requires.txt +0 -0
  782. {topos_node-1.3.55 → topos_node-1.3.57}/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.55
3
+ Version: 1.3.57
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
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "topos-node"
12
- version = "1.3.55"
12
+ version = "1.3.57"
13
13
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
14
14
  readme = "README.md"
15
15
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.3.55"
4
- __version_info__ = (1, 3, 55)
3
+ __version__ = "1.3.57"
4
+ __version_info__ = (1, 3, 57)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -6,17 +6,17 @@ from __future__ import annotations
6
6
 
7
7
  import hashlib
8
8
 
9
- from typing import Any, Dict, List, Optional, Set, Tuple
9
+ from typing import Any, Dict, List, Optional, Set
10
10
 
11
11
  from fastapi import APIRouter, HTTPException, Query, Request, status
12
12
 
13
13
  from ..core.state import get_db_connection
14
14
  from ..uma_rpt import RPTValidationError, get_control_plane_http_base, introspect_for_resource
15
- from ..uma_filters import UMAFilterError, apply_filter_manifest, apply_filters, extract_field_transforms, extract_filter_manifest, get_limit_cap
16
- from ..scope_resolution import resolve_scopes_to_tables, may_access_table
15
+ from ..uma_filters import UMAFilterError, apply_filter_manifest, extract_field_transforms, extract_filter_manifest, get_limit_cap
17
16
  from ..uma_contact_enrichment import apply_message_contact_pipeline, strip_contact_runtime_filters
18
17
  from ..uma_resource_id import parse_dataset_id_from_uma_dataset_resource_id
19
18
  from ..engine.usage_observation import emit_usage_observation
19
+ from ..uma_authority import bound_uma_scope, dataset_scope_predicate, message_stream_granted, local_node_resource_scope, require_local_resource_binding
20
20
 
21
21
  router = APIRouter(prefix="/v1/uma/resources", tags=["uma-data"])
22
22
 
@@ -56,111 +56,42 @@ def _get_messages_from_db(
56
56
  limit: int,
57
57
  offset: int,
58
58
  allowed_tables: Optional[Set[str]] = None,
59
+ owner_user_id: Optional[str] = None,
60
+ *, whole_engine_scope: bool = False,
59
61
  ) -> List[Dict[str, Any]]:
60
- """Query only the message-like tables permitted by the granted scopes."""
61
-
62
- def _fetch_rows(query: str, params: Tuple[int, int]) -> List[Dict[str, Any]]:
63
- cursor = conn.execute(query, params)
64
- columns = [d[0] for d in cursor.description]
65
- return [dict(zip(columns, row)) for row in cursor.fetchall()]
66
-
67
- def _allowed_message_sources() -> List[str]:
68
- if not allowed_tables:
69
- candidates = []
70
- if _table_exists(conn, "conversation_messages"):
71
- candidates.append("conversation_messages")
72
- elif _table_exists(conn, "messages"):
73
- candidates.append("messages")
74
- if _table_exists(conn, "ai_chat_messages"):
75
- candidates.append("ai_chat_messages")
76
- return candidates
77
-
78
- candidates: List[str] = []
79
- if "messages" in allowed_tables:
80
- if _table_exists(conn, "conversation_messages"):
81
- candidates.append("conversation_messages")
82
- elif _table_exists(conn, "messages"):
83
- candidates.append("messages")
84
- if "conversation_messages" in allowed_tables and _table_exists(conn, "conversation_messages"):
85
- if "conversation_messages" not in candidates:
86
- candidates.append("conversation_messages")
87
- if (
88
- {"ai_chat", "ai_messages", "ai_chat_messages"} & set(allowed_tables)
89
- and _table_exists(conn, "ai_chat_messages")
90
- ):
91
- candidates.append("ai_chat_messages")
92
- return candidates
93
-
94
- sources = _allowed_message_sources()
95
- if not sources:
62
+ """Read only explicitly granted message tables, scoped before pagination."""
63
+ if not allowed_tables:
96
64
  return []
97
-
98
- # Keep single-table queries paginated in SQL; when multiple tables are allowed,
99
- # fetch and merge in Python so limit/offset apply to the combined result set.
100
- if sources == ["conversation_messages"]:
101
- oc = _message_time_order_column(conn, "conversation_messages")
102
- return _fetch_rows(
103
- f"SELECT * FROM conversation_messages ORDER BY {oc} DESC LIMIT ? OFFSET ?",
104
- (limit, offset),
105
- )
106
- if sources == ["messages"]:
107
- return _fetch_rows(
108
- "SELECT * FROM messages ORDER BY ts DESC LIMIT ? OFFSET ?",
109
- (limit, offset),
110
- )
111
- if sources == ["ai_chat_messages"]:
112
- oc = _message_time_order_column(conn, "ai_chat_messages")
113
- return _fetch_rows(
114
- f"SELECT * FROM ai_chat_messages ORDER BY {oc} DESC LIMIT ? OFFSET ?",
115
- (limit, offset),
116
- )
117
-
65
+ sources: List[str] = []
66
+ if {"messages", "conversation_messages"} & allowed_tables:
67
+ if _table_exists(conn, "conversation_messages"):
68
+ sources.append("conversation_messages")
69
+ elif _table_exists(conn, "messages"):
70
+ sources.append("messages")
71
+ if {"ai_chat", "ai_messages", "ai_chat_messages"} & allowed_tables and _table_exists(conn, "ai_chat_messages"):
72
+ sources.append("ai_chat_messages")
118
73
  merged: List[Dict[str, Any]] = []
119
- if "conversation_messages" in sources:
120
- oc_cm = _message_time_order_column(conn, "conversation_messages")
121
- merged.extend(
122
- _fetch_rows(
123
- f"SELECT * FROM conversation_messages ORDER BY {oc_cm} DESC LIMIT ? OFFSET ?",
124
- (limit + offset, 0),
125
- )
126
- )
127
- if "messages" in sources:
128
- merged.extend(
129
- _fetch_rows(
130
- "SELECT * FROM messages ORDER BY ts DESC LIMIT ? OFFSET ?",
131
- (limit + offset, 0),
132
- )
74
+ from ..disclosure.tier import apply_disclosure_tier_to_rows
75
+ for table in sources:
76
+ scope, scope_params = dataset_scope_predicate(
77
+ _sqlite_table_columns(conn, table), dataset_id, owner_user_id,
78
+ whole_engine_scope=whole_engine_scope,
133
79
  )
134
- if "ai_chat_messages" in sources:
135
- oc_ac = _message_time_order_column(conn, "ai_chat_messages")
136
- merged.extend(
137
- _fetch_rows(
138
- f"SELECT * FROM ai_chat_messages ORDER BY {oc_ac} DESC LIMIT ? OFFSET ?",
139
- (limit + offset, 0),
140
- )
80
+ order_column = _message_time_order_column(conn, table)
81
+ # Fetch at most the requested prefix from each eligible table; no
82
+ # out-of-dataset row can consume the limit or alter the returned count.
83
+ cursor = conn.execute(
84
+ f'SELECT * FROM "{table}" WHERE {scope} ORDER BY "{order_column}" DESC, message_id DESC LIMIT ?',
85
+ scope_params + (limit + offset,),
141
86
  )
87
+ columns = [column[0] for column in cursor.description]
88
+ rows = [dict(zip(columns, row)) for row in cursor.fetchall()]
89
+ disclosure_table = "conversation_messages" if table == "messages" else table
90
+ merged.extend(apply_disclosure_tier_to_rows(rows, table=disclosure_table, tier="default_disclosure"))
142
91
  merged.sort(key=lambda row: (row.get("event_at") or row.get("ts") or "", row.get("message_id") or ""), reverse=True)
143
92
  return merged[offset:offset + limit]
144
93
 
145
94
 
146
- def _get_oplog_from_db(
147
- conn,
148
- dataset_id: Optional[str],
149
- limit: int,
150
- offset: int,
151
- ) -> List[Dict[str, Any]]:
152
- """Query oplog table if it exists; otherwise return empty list."""
153
- if not _table_exists(conn, "oplog"):
154
- return []
155
- query = "SELECT * FROM oplog ORDER BY hlc_ts LIMIT ? OFFSET ?"
156
- try:
157
- cursor = conn.execute(query, (limit, offset))
158
- columns = [d[0] for d in cursor.description]
159
- return [dict(zip(columns, row)) for row in cursor.fetchall()]
160
- except Exception:
161
- return []
162
-
163
-
164
95
  def _extract_bearer(request: Request) -> Optional[str]:
165
96
  auth = request.headers.get("authorization")
166
97
  if not auth or not auth.startswith("Bearer "):
@@ -216,28 +147,37 @@ async def get_uma_messages(
216
147
  ):
217
148
  """
218
149
  Return messages for the UMA resource, filtered by the permission's filters.
219
- Sprint 05: returns data only if RPT allows messages, ai_messages, or ai_chat scope.
150
+ Exact message-family scopes select the tables; resource authority selects rows.
220
151
  """
221
152
  resource_id = resource_id.strip()
222
153
  payload = await require_uma_rpt(request, resource_id)
154
+ try:
155
+ # Validate both introspected hints and any narrower query hint.
156
+ bound_uma_scope({**payload, "resource_id": resource_id})
157
+ effective_dataset_id, bound_owner = bound_uma_scope({
158
+ **payload, "resource_id": resource_id, "dataset_id": dataset_id,
159
+ })
160
+ except ValueError as exc:
161
+ raise HTTPException(status_code=403, detail=str(exc)) from exc
223
162
  allowed_scopes = payload.get("allowed_scopes") or []
224
- allowed_tables = resolve_scopes_to_tables(allowed_scopes)
163
+ # This endpoint can combine the two streams only when both are granted.
164
+ allowed_tables: Set[str] = set()
165
+ if message_stream_granted(allowed_scopes, "conversation"):
166
+ allowed_tables.update({"conversation_messages", "messages"})
167
+ if message_stream_granted(allowed_scopes, "ai_chat"):
168
+ allowed_tables.add("ai_chat_messages")
225
169
  if not allowed_tables:
226
- return {"messages": [], "count": 0}
227
- if not (
228
- may_access_table(allowed_tables, "messages")
229
- or may_access_table(allowed_tables, "conversation_messages")
230
- or may_access_table(allowed_tables, "ai_chat_messages")
231
- or may_access_table(allowed_tables, "ai_chat")
232
- or may_access_table(allowed_tables, "ai_messages")
233
- ):
234
- return {"messages": [], "count": 0}
170
+ raise HTTPException(status_code=403, detail="message_scope_required")
235
171
  conn = get_db_connection()
236
172
  if not conn:
237
173
  raise HTTPException(
238
174
  status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
239
175
  detail="Database not initialized",
240
176
  )
177
+ try:
178
+ require_local_resource_binding(conn, resource_id, bound_owner)
179
+ except ValueError as exc:
180
+ raise HTTPException(status_code=403, detail=str(exc)) from exc
241
181
  filters = (request.state.uma_introspection or {}).get("filters")
242
182
  manifest = extract_filter_manifest(filters if isinstance(filters, dict) else None)
243
183
  ai_only = bool(
@@ -248,10 +188,14 @@ async def get_uma_messages(
248
188
  )
249
189
  logical_table = "ai_chat_messages" if ai_only else "conversation_messages" if conv_only else None
250
190
  limited = get_limit_cap(limit, manifest, logical_table)
251
- effective_dataset_id = (dataset_id or "").strip() or parse_dataset_id_from_uma_dataset_resource_id(
252
- resource_id
253
- )
254
- items = _get_messages_from_db(conn, effective_dataset_id, limited, offset, allowed_tables=allowed_tables)
191
+ try:
192
+ items = _get_messages_from_db(
193
+ conn, effective_dataset_id, limited, offset,
194
+ allowed_tables=allowed_tables, owner_user_id=bound_owner,
195
+ whole_engine_scope=local_node_resource_scope(conn, resource_id, rpt_validated=True),
196
+ )
197
+ except ValueError as exc:
198
+ raise HTTPException(status_code=403, detail=str(exc)) from exc
255
199
  try:
256
200
  # UMA data proxy = the grantee HTTP lane; filter unconditionally.
257
201
  from ..features.lifecycle.blackhole_guard import BlackholeGuard, CallerClass
@@ -290,26 +234,6 @@ async def get_uma_oplog(
290
234
  offset: int = Query(0, ge=0),
291
235
  dataset_id: Optional[str] = Query(None),
292
236
  ):
293
- """
294
- Return oplog entries for the UMA resource, filtered by the permission's filters.
295
- Sprint 05: returns data only if RPT has at least one allowed scope (any read access).
296
- """
297
- resource_id = resource_id.strip()
298
- payload = await require_uma_rpt(request, resource_id)
299
- allowed_scopes = payload.get("allowed_scopes") or []
300
- allowed_tables = resolve_scopes_to_tables(allowed_scopes)
301
- if not allowed_tables:
302
- return {"ops": [], "count": 0}
303
- conn = get_db_connection()
304
- if not conn:
305
- raise HTTPException(
306
- status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
307
- detail="Database not initialized",
308
- )
309
- items = _get_oplog_from_db(conn, dataset_id, limit, offset)
310
- filters = (request.state.uma_introspection or {}).get("filters")
311
- try:
312
- filtered = apply_filters(items, filters)
313
- except UMAFilterError as exc:
314
- raise HTTPException(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=str(exc)) from exc
315
- return {"ops": filtered, "count": len(filtered)}
237
+ """No safe grantable projection exists for raw operation logs."""
238
+ await require_uma_rpt(request, resource_id.strip())
239
+ raise HTTPException(status_code=403, detail="shared_oplog_unavailable")
@@ -229,6 +229,26 @@ async def _reap_upgrade_runner(timeout_s: float = _UPGRADE_JOIN_TIMEOUT_S) -> No
229
229
  )
230
230
 
231
231
 
232
+ async def _reap_rebuild_children(grace_s: float = 2.0) -> None:
233
+ """Stop any entity-graph rebuild child this process started.
234
+
235
+ The child is a separate process writing the same database, and nothing
236
+ else stops it: the supervisor signals the node's pid only. Left alone it
237
+ ran on after the node exited, holding the rebuild lock (eight node starts
238
+ on 2026-09-08 found one), and a rebuild awaited through asyncio.to_thread
239
+ held this process's exit in asyncio.run until the child finished.
240
+ """
241
+ from .features.entities.rebuild_subprocess import stop_rebuild_children
242
+
243
+ try:
244
+ stopped = await asyncio.to_thread(stop_rebuild_children, grace_s)
245
+ except Exception as exc: # noqa: BLE001 — teardown never raises
246
+ logger.warning("could not stop graph rebuild subprocess at shutdown: %s", exc)
247
+ return
248
+ if stopped:
249
+ logger.info("stopped %d graph rebuild subprocess(es) at shutdown", stopped)
250
+
251
+
232
252
  @app.on_event("startup")
233
253
  async def startup_event() -> None:
234
254
  from .runtime_shutdown import begin_runtime, install_shutdown_signal_hooks
@@ -239,6 +259,18 @@ async def startup_event() -> None:
239
259
  # leaves theirs retired and gives this run its own.
240
260
  begin_runtime("app_startup")
241
261
  install_shutdown_signal_hooks()
262
+ # The last run's shutdown closed the graph-rebuild spawn gate; this run may
263
+ # rebuild again. And a stop request ends rebuild children at the signal,
264
+ # not only in shutdown_event, which an in-flight rebuild request can keep
265
+ # uvicorn from ever reaching (see rebuild_subprocess.signal_rebuild_children).
266
+ from .features.entities.rebuild_subprocess import (
267
+ allow_rebuild_children,
268
+ signal_rebuild_children,
269
+ )
270
+ from .runtime_shutdown import add_shutdown_listener
271
+
272
+ allow_rebuild_children()
273
+ add_shutdown_listener(signal_rebuild_children)
242
274
  # This process holds the database, so its backups are the ones the model
243
275
  # manager may spend before it evicts a model. The disk floor never resolves
244
276
  # that directory for itself — on a split node it runs beside the models, on
@@ -624,6 +656,10 @@ async def shutdown_event() -> None:
624
656
  # Reaped before the network teardown below, because these are the writers.
625
657
  if state.upgrade_runner_stop is not None:
626
658
  state.upgrade_runner_stop.set()
659
+ # First, because it unblocks the rest: a background task awaiting a rebuild
660
+ # through asyncio.to_thread is stuck until the child dies, however it is
661
+ # cancelled.
662
+ await _reap_rebuild_children()
627
663
  await _reap_background_tasks()
628
664
  await stop_pipeline_worker()
629
665
  await _reap_upgrade_runner()
@@ -649,3 +685,6 @@ async def shutdown_event() -> None:
649
685
  state.hosted_pool_lease_client = None
650
686
  if state.sync_client:
651
687
  await state.sync_client.stop()
688
+ # Again, last: a worker drained above could have started a rebuild after the
689
+ # first pass, and one awaited from an executor thread would hold exit open.
690
+ await _reap_rebuild_children()
@@ -617,6 +617,12 @@ def _reexec_topos_node() -> None:
617
617
  PyInstaller bundle on Windows all differ), while the interpreter running
618
618
  us always is.
619
619
  """
620
+ # execv keeps this pid, so a graph rebuild child's parent watch never fires,
621
+ # and the new image starts with an empty child registry: stop it here or it
622
+ # runs on unowned, holding the rebuild lock against the node we become.
623
+ from topos.features.entities.rebuild_subprocess import stop_rebuild_children
624
+
625
+ stop_rebuild_children()
620
626
  os.execv(sys.executable, [sys.executable, "-m", "topos.cli.commands", *sys.argv[1:]])
621
627
 
622
628
 
@@ -697,7 +703,19 @@ def serve_with_tray(
697
703
  server = uvicorn.Server(config)
698
704
 
699
705
  def stop_server() -> None:
700
- server.should_exit = True
706
+ # Every tray exit comes through here (Quit, Select Topos, Ctrl+C). None
707
+ # is a signal the node's shutdown hooks see — uvicorn runs off the main
708
+ # thread here, so they never install — and uvicorn drains an in-flight
709
+ # graph rebuild request before shutdown_event can stop the child. So
710
+ # stop it now; the request then ends and the drain can finish.
711
+ try:
712
+ from topos.features.entities.rebuild_subprocess import signal_rebuild_children
713
+
714
+ signal_rebuild_children()
715
+ except Exception as exc: # noqa: BLE001 — never let this cost the exit itself
716
+ print(f"Could not stop graph rebuild children ({exc}); quitting anyway.")
717
+ finally:
718
+ server.should_exit = True
701
719
 
702
720
  server_thread = threading.Thread(target=server.run, daemon=True)
703
721
  server_thread.start()
@@ -163,7 +163,7 @@ class Settings(BaseSettings):
163
163
  sanitization_ollama_timeout_sec: float = Field(120.0)
164
164
  # llm_generation / routine hops — must cover local thinking models. Do NOT
165
165
  # reuse sanitization_ollama_timeout_sec (120s): that cuts digest synthesis
166
- # mid-flight and surfaces as "Ollama unreachable".
166
+ # mid-flight and surfaces as "Ollama did not answer within 120s".
167
167
  engine_ollama_generate_timeout_sec: float = Field(300.0)
168
168
  ollama_list_timeout_sec: float = Field(10.0)
169
169
  sanitization_ollama_auto_pull: bool = Field(True)
@@ -517,7 +517,16 @@ class ControlPlaneClient:
517
517
  await ws.send(json.dumps(payload))
518
518
  return True
519
519
  except Exception as exc: # noqa: BLE001
520
- logger.error("Failed to send message to control plane: %s", exc)
520
+ # Routing fields only, never the payload: this is the one line that
521
+ # says which request's answer died on a dead socket.
522
+ logger.error(
523
+ "Failed to send message to control plane: id=%s type=%s status=%s exc=%s: %s",
524
+ payload.get("id"),
525
+ payload.get("type"),
526
+ payload.get("status"),
527
+ type(exc).__name__,
528
+ exc,
529
+ )
521
530
  return False
522
531
 
523
532
  def set_device_info_snapshot(self, payload: dict[str, Any] | None) -> None:
@@ -280,13 +280,34 @@ async def handle_llm_generation(message: Dict[str, Any]) -> Optional[Dict[str, A
280
280
  unusable = _unusable_num_ctx(payload)
281
281
  if unusable is not None:
282
282
  return {"id": req_id, "status": "error", "error": unusable, "error_code": 422}
283
+ started, wall_started = time.monotonic(), time.time()
284
+ # Every outcome line carries the id: two routines overlap on the node, and
285
+ # the service-layer lines have none, so pairing by order is ambiguous.
283
286
  logger.info(
284
- "llm_generation request: provider=%r model=%r prompt_chars=%d stream=%s",
287
+ "llm_generation request: id=%s provider=%r model=%r prompt_chars=%d stream=%s",
288
+ req_id,
285
289
  payload.get("provider"),
286
290
  payload.get("model"),
287
291
  len(str(payload.get("prompt") or "")),
288
292
  bool(payload.get("stream")),
289
293
  )
294
+
295
+ def _log_failed(exc: BaseException, code: Any) -> None:
296
+ # Classes and codes only: an error's text can quote an Ollama body.
297
+ # openai.py raises `from exc`, so the cause names the transport error.
298
+ logger.warning(
299
+ "llm_generation failed: id=%s provider=%r model=%r code=%s cause=%s"
300
+ " elapsed_s=%.1f wall_s=%.1f stream=%s",
301
+ req_id,
302
+ payload.get("provider"),
303
+ payload.get("model"),
304
+ code,
305
+ type(exc.__cause__ or exc).__name__,
306
+ time.monotonic() - started,
307
+ time.time() - wall_started,
308
+ bool(payload.get("stream")),
309
+ )
310
+
290
311
  current = asyncio.current_task()
291
312
  if current is not None:
292
313
  _LLM_GENERATION_TASKS[str(req_id)] = current
@@ -335,6 +356,14 @@ async def handle_llm_generation(message: Dict[str, Any]) -> Optional[Dict[str, A
335
356
  result = await get_services().llm.generate(
336
357
  payload, on_delta=on_delta, on_protocol=on_protocol
337
358
  )
359
+ logger.info(
360
+ "llm_generation done: id=%s model=%r output_chars=%d elapsed_s=%.1f wall_s=%.1f",
361
+ req_id,
362
+ payload.get("model"),
363
+ len(str((result or {}).get("output") or "")),
364
+ time.monotonic() - started,
365
+ time.time() - wall_started,
366
+ )
338
367
  return {"id": req_id, "status": "ok", "payload": result}
339
368
  except asyncio.CancelledError:
340
369
  # llm_cancel: answer the original request with a typed 499 so the
@@ -354,10 +383,13 @@ async def handle_llm_generation(message: Dict[str, Any]) -> Optional[Dict[str, A
354
383
  }
355
384
  )
356
385
  )
357
- except Exception: # noqa: BLE001 — reporting must not mask the cancel
358
- pass
386
+ except Exception as e: # noqa: BLE001 — reporting must not mask the cancel
387
+ logger.warning(
388
+ "llm_generation cancel reply not sent: id=%s exc=%s", req_id, type(e).__name__
389
+ )
359
390
  raise
360
391
  except LlmTypedError as exc:
392
+ _log_failed(exc, exc.code)
361
393
  return {
362
394
  "id": req_id,
363
395
  "status": "error",
@@ -365,6 +397,7 @@ async def handle_llm_generation(message: Dict[str, Any]) -> Optional[Dict[str, A
365
397
  "error_code": exc.code,
366
398
  }
367
399
  except HTTPException as exc:
400
+ _log_failed(exc, exc.status_code)
368
401
  detail = exc.detail
369
402
  err_msg = detail if isinstance(detail, str) else str(detail)
370
403
  return {
@@ -374,7 +407,10 @@ async def handle_llm_generation(message: Dict[str, Any]) -> Optional[Dict[str, A
374
407
  "error_code": exc.status_code,
375
408
  }
376
409
  except Exception as exc: # noqa: BLE001
377
- return {"id": req_id, "status": "error", "error": str(exc)}
410
+ _log_failed(exc, None)
411
+ # A bare `ValueError()` has empty text; the control plane would record
412
+ # a failure with no reason at all.
413
+ return {"id": req_id, "status": "error", "error": str(exc) or type(exc).__name__}
378
414
  finally:
379
415
  _LLM_GENERATION_TASKS.pop(str(req_id), None)
380
416