topos-node 1.3.31__tar.gz → 1.3.32__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 (720) hide show
  1. {topos_node-1.3.31/topos_node.egg-info → topos_node-1.3.32}/PKG-INFO +1 -1
  2. {topos_node-1.3.31 → topos_node-1.3.32}/pyproject.toml +1 -1
  3. {topos_node-1.3.31 → topos_node-1.3.32}/topos/__version__.py +2 -2
  4. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/writer.py +51 -0
  5. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/fact_materializer.py +1 -1
  6. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/linking.py +1 -1
  7. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/reads.py +7 -1
  8. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/store.py +8 -1
  9. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/derived_scrub.py +14 -1
  10. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/facts_direct.py +61 -4
  11. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/game_layer.py +30 -2
  12. {topos_node-1.3.31 → topos_node-1.3.32}/topos/upgrades/manifests.json +6 -0
  13. {topos_node-1.3.31 → topos_node-1.3.32/topos_node.egg-info}/PKG-INFO +1 -1
  14. {topos_node-1.3.31 → topos_node-1.3.32}/LICENSE +0 -0
  15. {topos_node-1.3.31 → topos_node-1.3.32}/MANIFEST.in +0 -0
  16. {topos_node-1.3.31 → topos_node-1.3.32}/README.md +0 -0
  17. {topos_node-1.3.31 → topos_node-1.3.32}/setup.cfg +0 -0
  18. {topos_node-1.3.31 → topos_node-1.3.32}/shared/__init__.py +0 -0
  19. {topos_node-1.3.31 → topos_node-1.3.32}/shared/filtering.py +0 -0
  20. {topos_node-1.3.31 → topos_node-1.3.32}/shared/schema_registry.py +0 -0
  21. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_active_database_binding.py +0 -0
  22. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_active_ingestion_binding.py +0 -0
  23. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_extensions.py +0 -0
  24. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_gate_leg_hermeticity.py +0 -0
  25. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_llm_integrations_storage.py +0 -0
  26. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_local_gate_composition.py +0 -0
  27. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_owner_database_hermeticity.py +0 -0
  28. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_prewarm_first_run.py +0 -0
  29. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_profile_hygiene.py +0 -0
  30. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_profiles.py +0 -0
  31. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_protocol_handled_types.py +0 -0
  32. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_query_field_contract.py +0 -0
  33. {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_system_computer_name.py +0 -0
  34. {topos_node-1.3.31 → topos_node-1.3.32}/topos/__init__.py +0 -0
  35. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/__init__.py +0 -0
  36. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/duckdb_adapter.py +0 -0
  37. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/messenger_communities.py +0 -0
  38. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/messenger_graph.py +0 -0
  39. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/messenger_labels.py +0 -0
  40. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/profiles.py +0 -0
  41. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/query_engine.py +0 -0
  42. {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/raw_queries.py +0 -0
  43. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/__init__.py +0 -0
  44. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/analytics.py +0 -0
  45. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/app_registry.py +0 -0
  46. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/backup.py +0 -0
  47. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/community_naming_config.py +0 -0
  48. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/compute_remote.py +0 -0
  49. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/conversation_context.py +0 -0
  50. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/data_commit.py +0 -0
  51. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/data_explorer_table_prefs.py +0 -0
  52. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/database_explorer.py +0 -0
  53. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/db.py +0 -0
  54. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/device.py +0 -0
  55. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/engine_run.py +0 -0
  56. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/enrichment.py +0 -0
  57. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/enrichment_lab.py +0 -0
  58. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/facts_llm_config.py +0 -0
  59. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/filter_lab.py +0 -0
  60. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/health.py +0 -0
  61. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/home_chat.py +0 -0
  62. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ingestion_api.py +0 -0
  63. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ingestion_compat.py +0 -0
  64. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ingestion_sources.py +0 -0
  65. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/intelligence_lifecycle.py +0 -0
  66. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/llm.py +0 -0
  67. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/local_mcp.py +0 -0
  68. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/messenger_analytics.py +0 -0
  69. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/privacy_disclose.py +0 -0
  70. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/query_api.py +0 -0
  71. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/runtime_bootstrap.py +0 -0
  72. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sanitization_ollama_config.py +0 -0
  73. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/shell.py +0 -0
  74. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/signal.py +0 -0
  75. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/signal_extraction_config.py +0 -0
  76. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/source_install.py +0 -0
  77. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/source_scrub.py +0 -0
  78. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sources.py +0 -0
  79. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sources_overview.py +0 -0
  80. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sync.py +0 -0
  81. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/tool_index.py +0 -0
  82. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ui_config.py +0 -0
  83. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/uma_data.py +0 -0
  84. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/upgrades.py +0 -0
  85. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/usage.py +0 -0
  86. {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/user_identity.py +0 -0
  87. {topos_node-1.3.31 → topos_node-1.3.32}/topos/app.py +0 -0
  88. {topos_node-1.3.31 → topos_node-1.3.32}/topos/auth.py +0 -0
  89. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/__init__.py +0 -0
  90. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/declared_field_map.py +0 -0
  91. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/__init__.py +0 -0
  92. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/base.py +0 -0
  93. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  94. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  95. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  96. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  97. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  98. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  99. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  100. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  101. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/models.py +0 -0
  102. {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/resolver.py +0 -0
  103. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/__init__.py +0 -0
  104. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/__main__.py +0 -0
  105. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/assets/topos_blk_rounded.png +0 -0
  106. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/assets/topos_white.png +0 -0
  107. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/commands.py +0 -0
  108. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/profile_cmd.py +0 -0
  109. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/reprocess_cmd.py +0 -0
  110. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/setup_models_cmd.py +0 -0
  111. {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/tray.py +0 -0
  112. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/__init__.py +0 -0
  113. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/conversation_context_llm.py +0 -0
  114. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/facts_llm.py +0 -0
  115. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/local_model_builds.py +0 -0
  116. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/model_packs.py +0 -0
  117. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/node_function_providers.py +0 -0
  118. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/sanitization_ollama.py +0 -0
  119. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/settings.py +0 -0
  120. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/signal_extraction.py +0 -0
  121. {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/uvicorn_logging.json +0 -0
  122. {topos_node-1.3.31 → topos_node-1.3.32}/topos/contacts/__init__.py +0 -0
  123. {topos_node-1.3.31 → topos_node-1.3.32}/topos/contacts/identity.py +0 -0
  124. {topos_node-1.3.31 → topos_node-1.3.32}/topos/control_plane_client.py +0 -0
  125. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/__init__.py +0 -0
  126. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/api_models.py +0 -0
  127. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/connection_resilience.py +0 -0
  128. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/db_health.py +0 -0
  129. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/device_helpers.py +0 -0
  130. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/errors.py +0 -0
  131. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/events.py +0 -0
  132. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/__init__.py +0 -0
  133. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/common.py +0 -0
  134. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/complexity.py +0 -0
  135. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/config.py +0 -0
  136. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/contacts_import.py +0 -0
  137. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/database_explorer.py +0 -0
  138. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/derivation.py +0 -0
  139. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/device.py +0 -0
  140. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/enrichment.py +0 -0
  141. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/enrichment_lab.py +0 -0
  142. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/filter_lab.py +0 -0
  143. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/graph_query.py +0 -0
  144. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/home_chat.py +0 -0
  145. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/ingest.py +0 -0
  146. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/messages.py +0 -0
  147. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/messenger_analytics.py +0 -0
  148. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/query.py +0 -0
  149. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/registry.py +0 -0
  150. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/routines.py +0 -0
  151. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/signal_features.py +0 -0
  152. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/sources.py +0 -0
  153. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/timeline_daily.py +0 -0
  154. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/tool_index.py +0 -0
  155. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/uma.py +0 -0
  156. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/logging.py +0 -0
  157. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/metrics.py +0 -0
  158. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/routine_access.py +0 -0
  159. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/startup_banner.py +0 -0
  160. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/state.py +0 -0
  161. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/table_layers.py +0 -0
  162. {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/types.py +0 -0
  163. {topos_node-1.3.31 → topos_node-1.3.32}/topos/data_explorer_row_delete.py +0 -0
  164. {topos_node-1.3.31 → topos_node-1.3.32}/topos/data_explorer_table_prefs.py +0 -0
  165. {topos_node-1.3.31 → topos_node-1.3.32}/topos/data_explorer_tables.py +0 -0
  166. {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/__init__.py +0 -0
  167. {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/canonical_writer.py +0 -0
  168. {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/content_policy.py +0 -0
  169. {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/field_registry.py +0 -0
  170. {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/privacy_layer.py +0 -0
  171. {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/tier.py +0 -0
  172. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/__init__.py +0 -0
  173. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/__init__.py +0 -0
  174. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/base.py +0 -0
  175. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/generative_prompts.py +0 -0
  176. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/generative_response.py +0 -0
  177. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/huggingface.py +0 -0
  178. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/ollama.py +0 -0
  179. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/openai.py +0 -0
  180. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/openai_compatible.py +0 -0
  181. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/redpill.py +0 -0
  182. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/stub.py +0 -0
  183. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/client.py +0 -0
  184. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/disk_space.py +0 -0
  185. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/engine.py +0 -0
  186. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/intake.py +0 -0
  187. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/memory_utils.py +0 -0
  188. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/model_cache.py +0 -0
  189. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/ollama_install.py +0 -0
  190. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/ollama_pull.py +0 -0
  191. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/ollama_setup_guidance.py +0 -0
  192. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/pipeline_memory.py +0 -0
  193. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/queue_manager.py +0 -0
  194. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/registration.py +0 -0
  195. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/result_formatter.py +0 -0
  196. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/router.py +0 -0
  197. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/scoped_token.py +0 -0
  198. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/tasks.py +0 -0
  199. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/torch_runtime.py +0 -0
  200. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/transport.py +0 -0
  201. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/usage_guard.py +0 -0
  202. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/usage_observation.py +0 -0
  203. {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/validator.py +0 -0
  204. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/__init__.py +0 -0
  205. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/catalog.py +0 -0
  206. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/derivation_recovery.py +0 -0
  207. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/derived_tables.py +0 -0
  208. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/job_readiness.py +0 -0
  209. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/job_writer.py +0 -0
  210. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/__init__.py +0 -0
  211. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/base.py +0 -0
  212. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  213. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  214. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  215. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  216. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  217. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  218. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  219. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  220. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  221. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  222. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  223. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  224. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  225. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  226. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  227. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  228. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  229. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  230. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  231. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  232. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  233. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/__init__.py +0 -0
  234. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  235. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/language_job.py +0 -0
  236. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  237. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  238. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/model_overrides.py +0 -0
  239. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/__init__.py +0 -0
  240. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/manager.py +0 -0
  241. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/mvp_defaults.py +0 -0
  242. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/registry.py +0 -0
  243. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/versioning.py +0 -0
  244. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/orchestrator.py +0 -0
  245. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/pipeline_activity.py +0 -0
  246. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/processor.py +0 -0
  247. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/progress_bar.py +0 -0
  248. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/registry_contract.py +0 -0
  249. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/signal_derivation_config.json +0 -0
  250. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/source_overrides.py +0 -0
  251. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/__init__.py +0 -0
  252. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/bundles.py +0 -0
  253. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/model_resolve.py +0 -0
  254. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/schema.py +0 -0
  255. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/service.py +0 -0
  256. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/store.py +0 -0
  257. {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/worker.py +0 -0
  258. {topos_node-1.3.31 → topos_node-1.3.32}/topos/evals/__init__.py +0 -0
  259. {topos_node-1.3.31 → topos_node-1.3.32}/topos/evals/enrichment_eval.py +0 -0
  260. {topos_node-1.3.31 → topos_node-1.3.32}/topos/extensions.py +0 -0
  261. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/__init__.py +0 -0
  262. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/canonical.py +0 -0
  263. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/engine.py +0 -0
  264. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/entropy.py +0 -0
  265. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/focus.py +0 -0
  266. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/graph_metrics.py +0 -0
  267. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/influence.py +0 -0
  268. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/projection.py +0 -0
  269. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/snapshots.py +0 -0
  270. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/store.py +0 -0
  271. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/topic_merge.py +0 -0
  272. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/topics.py +0 -0
  273. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/topics_daily.py +0 -0
  274. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/volatility.py +0 -0
  275. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/__init__.py +0 -0
  276. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  277. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  278. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  279. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  280. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  281. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  282. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  283. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  284. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  285. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  286. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  287. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  288. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  289. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  290. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  291. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  292. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  293. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  294. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  295. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  296. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  297. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  298. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  299. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  300. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  301. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  302. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  303. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  304. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  305. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  306. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  307. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  308. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  309. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  310. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/candidates.py +0 -0
  311. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/guard.py +0 -0
  312. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/packs.py +0 -0
  313. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/prefilter.py +0 -0
  314. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/registry.py +0 -0
  315. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/report_card.py +0 -0
  316. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/router.py +0 -0
  317. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/surfaces.py +0 -0
  318. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/synthesize.py +0 -0
  319. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/template.py +0 -0
  320. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/verify.py +0 -0
  321. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/__init__.py +0 -0
  322. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/affinity.py +0 -0
  323. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/affinity_owner.py +0 -0
  324. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/affinity_quality.py +0 -0
  325. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/community_names.py +0 -0
  326. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/community_naming.py +0 -0
  327. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/consolidation.py +0 -0
  328. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/context_vectors.py +0 -0
  329. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/cypher.py +0 -0
  330. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/declared_mappings.py +0 -0
  331. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/dossier.py +0 -0
  332. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/edges.py +0 -0
  333. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/graph_enrichers.py +0 -0
  334. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/graph_refresh.py +0 -0
  335. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/graph_search.py +0 -0
  336. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/maintenance.py +0 -0
  337. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/reads.py +0 -0
  338. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/rebuild_subprocess.py +0 -0
  339. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/resolver.py +0 -0
  340. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/__init__.py +0 -0
  341. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/extract.py +0 -0
  342. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/llm_extract.py +0 -0
  343. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/verdicts.py +0 -0
  344. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/fit/evaluator.py +0 -0
  345. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/fit/opportunity_types.json +0 -0
  346. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/__init__.py +0 -0
  347. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole.py +0 -0
  348. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_guard.py +0 -0
  349. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_llm.py +0 -0
  350. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  351. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/exclusions.py +0 -0
  352. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/gc.py +0 -0
  353. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/provenance/__init__.py +0 -0
  354. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/provenance/posture.py +0 -0
  355. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/provenance/roles.py +0 -0
  356. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/__init__.py +0 -0
  357. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_canonical_loader.py +0 -0
  358. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_ontology.py +0 -0
  359. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_renderer.py +0 -0
  360. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_schemas.py +0 -0
  361. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/chunking.py +0 -0
  362. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/cluster_labels.py +0 -0
  363. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/conversation_context.py +0 -0
  364. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/data_health.py +0 -0
  365. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  366. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/intentions.json +0 -0
  367. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/interests.json +0 -0
  368. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/memory.json +0 -0
  369. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/places.json +0 -0
  370. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/profile.json +0 -0
  371. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/relationships.json +0 -0
  372. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/resources.json +0 -0
  373. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  374. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/time.json +0 -0
  375. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/wellbeing.json +0 -0
  376. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/work.json +0 -0
  377. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/derived_spec.py +0 -0
  378. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_briefs.py +0 -0
  379. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_definition_loader.py +0 -0
  380. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_profiles.py +0 -0
  381. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_registry.py +0 -0
  382. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/embed_context.py +0 -0
  383. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_router.py +0 -0
  384. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_store.py +0 -0
  385. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/extraction/rule_extractors.py +0 -0
  386. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/graph_sanitize.py +0 -0
  387. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/hybrid_search.py +0 -0
  388. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/incremental_clustering.py +0 -0
  389. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/model_recommendations.py +0 -0
  390. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/query_embed_cache.py +0 -0
  391. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/schemas.py +0 -0
  392. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/service.py +0 -0
  393. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/signal_object_store.py +0 -0
  394. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/source_hydration.py +0 -0
  395. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/structured_signal.py +0 -0
  396. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/tool_index.py +0 -0
  397. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/topic_clustering.py +0 -0
  398. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/aggregates.py +0 -0
  399. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/commitments.py +0 -0
  400. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/rhythm.py +0 -0
  401. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  402. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/vector_codec.py +0 -0
  403. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/vector_math.py +0 -0
  404. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/vector_settings.py +0 -0
  405. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/__init__.py +0 -0
  406. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/definitions.py +0 -0
  407. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/engine.py +0 -0
  408. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/fold.py +0 -0
  409. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/insights.py +0 -0
  410. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/timeline_projection.py +0 -0
  411. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/timeline_rollup.py +0 -0
  412. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/__init__.py +0 -0
  413. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/badges.py +0 -0
  414. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/daily.py +0 -0
  415. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/dashboard.py +0 -0
  416. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/instruments.py +0 -0
  417. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/intents.py +0 -0
  418. {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/readiness.py +0 -0
  419. {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/__init__.py +0 -0
  420. {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/bundles.py +0 -0
  421. {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/schema.py +0 -0
  422. {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/service.py +0 -0
  423. {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/store.py +0 -0
  424. {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/worker.py +0 -0
  425. {topos_node-1.3.31 → topos_node-1.3.32}/topos/home_chat/__init__.py +0 -0
  426. {topos_node-1.3.31 → topos_node-1.3.32}/topos/home_chat/schema.py +0 -0
  427. {topos_node-1.3.31 → topos_node-1.3.32}/topos/home_chat/store.py +0 -0
  428. {topos_node-1.3.31 → topos_node-1.3.32}/topos/hosted_pool_lease.py +0 -0
  429. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/__init__.py +0 -0
  430. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/canonical_pipeline.py +0 -0
  431. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/checkpoints/__init__.py +0 -0
  432. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  433. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  434. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/inbox_crypto.py +0 -0
  435. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/inbox_drain.py +0 -0
  436. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/ingest_helpers.py +0 -0
  437. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/jobs.py +0 -0
  438. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/journal_location_fanout.py +0 -0
  439. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/journal_time_log_normalize.py +0 -0
  440. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/local_sync.py +0 -0
  441. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/log_preview.py +0 -0
  442. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/manager.py +0 -0
  443. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parser.py +0 -0
  444. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/__init__.py +0 -0
  445. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/base.py +0 -0
  446. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/browser_parser.py +0 -0
  447. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/calendar_parser.py +0 -0
  448. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  449. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  450. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  451. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/documents_parser.py +0 -0
  452. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  453. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  454. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/grok_parser.py +0 -0
  455. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/messenger_parser.py +0 -0
  456. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  457. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/progress.py +0 -0
  458. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/reprocess.py +0 -0
  459. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/__init__.py +0 -0
  460. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/base.py +0 -0
  461. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/calendar.py +0 -0
  462. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/chatgpt.py +0 -0
  463. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/contact_importers.py +0 -0
  464. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/grok.py +0 -0
  465. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/imessage_reader.py +0 -0
  466. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/signal_export_parser.py +0 -0
  467. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/signal_reader.py +0 -0
  468. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/state_machine.py +0 -0
  469. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/triggers/__init__.py +0 -0
  470. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/triggers/file_trigger.py +0 -0
  471. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  472. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  473. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/__init__.py +0 -0
  474. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/base.py +0 -0
  475. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/schema_registry.py +0 -0
  476. {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/schema_validator.py +0 -0
  477. {topos_node-1.3.31 → topos_node-1.3.32}/topos/lineage/__init__.py +0 -0
  478. {topos_node-1.3.31 → topos_node-1.3.32}/topos/lineage/provenance.py +0 -0
  479. {topos_node-1.3.31 → topos_node-1.3.32}/topos/lineage/tracker.py +0 -0
  480. {topos_node-1.3.31 → topos_node-1.3.32}/topos/llm_integrations_storage.py +0 -0
  481. {topos_node-1.3.31 → topos_node-1.3.32}/topos/mcp_stdio_proxy.py +0 -0
  482. {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/__init__.py +0 -0
  483. {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/alerts.py +0 -0
  484. {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/metrics.py +0 -0
  485. {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/tracing.py +0 -0
  486. {topos_node-1.3.31 → topos_node-1.3.32}/topos/openai_client.py +0 -0
  487. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/__init__.py +0 -0
  488. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/audit.py +0 -0
  489. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/envelope.py +0 -0
  490. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/job_runner.py +0 -0
  491. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/job_store.py +0 -0
  492. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/stages.py +0 -0
  493. {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/stub_enqueue.py +0 -0
  494. {topos_node-1.3.31 → topos_node-1.3.32}/topos/profiles.py +0 -0
  495. {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/__init__.py +0 -0
  496. {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/__init__.py +0 -0
  497. {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/base.py +0 -0
  498. {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/builders.py +0 -0
  499. {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/health_checks.py +0 -0
  500. {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/__init__.py +0 -0
  501. {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/handled_message_types.json +0 -0
  502. {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/narrowing_vocabulary.json +0 -0
  503. {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/query_field_contract.json +0 -0
  504. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/__init__.py +0 -0
  505. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/audit.py +0 -0
  506. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/cohort_resolvers.py +0 -0
  507. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/ddr.py +0 -0
  508. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/disclosure.py +0 -0
  509. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/entity_window.py +0 -0
  510. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/exclusion.py +0 -0
  511. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/fingerprint.py +0 -0
  512. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/grant_cache.py +0 -0
  513. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/inference.py +0 -0
  514. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/intent.py +0 -0
  515. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/manifest.py +0 -0
  516. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/manifest_validation.py +0 -0
  517. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/minimizer.py +0 -0
  518. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/narrowing.py +0 -0
  519. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/negotiation.py +0 -0
  520. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/packet_resolution.py +0 -0
  521. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/pipeline.py +0 -0
  522. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/planner.py +0 -0
  523. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/retrieval.py +0 -0
  524. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/runtime.py +0 -0
  525. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_arbiter.py +0 -0
  526. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_classifier.py +0 -0
  527. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_head.py +0 -0
  528. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_registry.json +0 -0
  529. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_registry_loader.py +0 -0
  530. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_shadow.py +0 -0
  531. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/session.py +0 -0
  532. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/session_utils.py +0 -0
  533. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/source_generation.py +0 -0
  534. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/truth_facts.py +0 -0
  535. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/truth_prompts.py +0 -0
  536. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/turn_classifier.py +0 -0
  537. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/types.py +0 -0
  538. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/verify.py +0 -0
  539. {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/verify_modes.py +0 -0
  540. {topos_node-1.3.31 → topos_node-1.3.32}/topos/rate_limit.py +0 -0
  541. {topos_node-1.3.31 → topos_node-1.3.32}/topos/routines/__init__.py +0 -0
  542. {topos_node-1.3.31 → topos_node-1.3.32}/topos/routines/schema.py +0 -0
  543. {topos_node-1.3.31 → topos_node-1.3.32}/topos/routines/store.py +0 -0
  544. {topos_node-1.3.31 → topos_node-1.3.32}/topos/runtime_housekeeping.py +0 -0
  545. {topos_node-1.3.31 → topos_node-1.3.32}/topos/runtime_shutdown.py +0 -0
  546. {topos_node-1.3.31 → topos_node-1.3.32}/topos/runtime_update.py +0 -0
  547. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/__init__.py +0 -0
  548. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/nsfw_classifier.py +0 -0
  549. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/ollama_transforms.py +0 -0
  550. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/prewarm.py +0 -0
  551. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/privacy_filter.py +0 -0
  552. {topos_node-1.3.31 → topos_node-1.3.32}/topos/scope_resolution.py +0 -0
  553. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/__init__.py +0 -0
  554. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/container.py +0 -0
  555. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/__init__.py +0 -0
  556. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/base.py +0 -0
  557. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/local.py +0 -0
  558. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/remote.py +0 -0
  559. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/interfaces.py +0 -0
  560. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/llm/__init__.py +0 -0
  561. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/llm/base.py +0 -0
  562. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/llm/openai.py +0 -0
  563. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/local.py +0 -0
  564. {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/postgres.py +0 -0
  565. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/__init__.py +0 -0
  566. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/bundled_canonical_triples.py +0 -0
  567. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/canonical_signal_defaults.py +0 -0
  568. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/declared_field_map_spec.py +0 -0
  569. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/definitions.py +0 -0
  570. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/install_service.py +0 -0
  571. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/registry.py +0 -0
  572. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/runtime_install.py +0 -0
  573. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/scrub_attribution.py +0 -0
  574. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/scrub_service.py +0 -0
  575. {topos_node-1.3.31 → topos_node-1.3.32}/topos/startup_banner.py +0 -0
  576. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/__init__.py +0 -0
  577. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/__init__.py +0 -0
  578. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/factory.py +0 -0
  579. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/fakes.py +0 -0
  580. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/postgres/stores.py +0 -0
  581. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/protocols.py +0 -0
  582. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/sqlite/__init__.py +0 -0
  583. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/sqlite/stores.py +0 -0
  584. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  585. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/__init__.py +0 -0
  586. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/activity_tables.py +0 -0
  587. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  588. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  589. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  590. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/model.py +0 -0
  591. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/tables.py +0 -0
  592. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  593. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/canonical_store.py +0 -0
  594. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/conversations_tables.py +0 -0
  595. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/journal_repair.py +0 -0
  596. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/mapping_store.py +0 -0
  597. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/postgres.py +0 -0
  598. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/__init__.py +0 -0
  599. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/client.py +0 -0
  600. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/connection_tuning.py +0 -0
  601. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/__init__.py +0 -0
  602. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  603. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  604. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  605. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  606. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  607. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/backup.py +0 -0
  608. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  609. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  610. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  611. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  612. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/community_names_v1.py +0 -0
  613. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/complexity_v1.py +0 -0
  614. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  615. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  616. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  617. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  618. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  619. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/documents_v1.py +0 -0
  620. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  621. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  622. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  623. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  624. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  625. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  626. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  627. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  628. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  629. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  630. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  631. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/episodes_v1.py +0 -0
  632. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  633. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  634. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  635. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  636. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  637. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  638. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  639. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  640. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  641. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  642. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  643. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  644. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/registry.py +0 -0
  645. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/registry_checksums.json +0 -0
  646. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  647. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  648. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  649. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  650. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  651. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects.py +0 -0
  652. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  653. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  654. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  655. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  656. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  657. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  658. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  659. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  660. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  661. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  662. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  663. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  664. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  665. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  666. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  667. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  668. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  669. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  670. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  671. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  672. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  673. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  674. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/paths.py +0 -0
  675. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/postgres.py +0 -0
  676. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/schema.py +0 -0
  677. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/schema_probe.py +0 -0
  678. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/storage_breakdown.py +0 -0
  679. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/write_gate.py +0 -0
  680. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/enrichment/__init__.py +0 -0
  681. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  682. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  683. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/normalized/__init__.py +0 -0
  684. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/normalized/normalized_store.py +0 -0
  685. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/__init__.py +0 -0
  686. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/decision.py +0 -0
  687. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/oplog_store.py +0 -0
  688. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/postgres.py +0 -0
  689. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/person/identity_resolver.py +0 -0
  690. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/projections/__init__.py +0 -0
  691. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/projections/index_ops_store.py +0 -0
  692. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/projections/vector_index_store.py +0 -0
  693. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/__init__.py +0 -0
  694. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/browser_flat_tables.py +0 -0
  695. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/file_store.py +0 -0
  696. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/raw_store.py +0 -0
  697. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/raw_tables_manager.py +0 -0
  698. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/sqlite_raw_store.py +0 -0
  699. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/security/encryption.py +0 -0
  700. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/signal_identity.py +0 -0
  701. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/source_settings.py +0 -0
  702. {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/user_identity.py +0 -0
  703. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sync/__init__.py +0 -0
  704. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sync/client.py +0 -0
  705. {topos_node-1.3.31 → topos_node-1.3.32}/topos/sync_handlers.py +0 -0
  706. {topos_node-1.3.31 → topos_node-1.3.32}/topos/testing/__init__.py +0 -0
  707. {topos_node-1.3.31 → topos_node-1.3.32}/topos/testing/lifespan.py +0 -0
  708. {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_contact_enrichment.py +0 -0
  709. {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_filters.py +0 -0
  710. {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_resource_id.py +0 -0
  711. {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_rpt.py +0 -0
  712. {topos_node-1.3.31 → topos_node-1.3.32}/topos/upgrades/__init__.py +0 -0
  713. {topos_node-1.3.31 → topos_node-1.3.32}/topos/upgrades/runner.py +0 -0
  714. {topos_node-1.3.31 → topos_node-1.3.32}/topos/utils/base_object.py +0 -0
  715. {topos_node-1.3.31 → topos_node-1.3.32}/topos/websocket_client.py +0 -0
  716. {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/SOURCES.txt +0 -0
  717. {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/dependency_links.txt +0 -0
  718. {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/entry_points.txt +0 -0
  719. {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/requires.txt +0 -0
  720. {topos_node-1.3.31 → topos_node-1.3.32}/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.31
3
+ Version: 1.3.32
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "topos-node"
7
- version = "1.3.31"
7
+ version = "1.3.32"
8
8
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.3.31"
4
- __version_info__ = (1, 3, 31)
3
+ __version__ = "1.3.32"
4
+ __version_info__ = (1, 3, 32)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -23,9 +23,23 @@ import uuid
23
23
  from datetime import datetime, timezone, timedelta
24
24
  from typing import Any, Dict, List, Optional
25
25
 
26
+ import os
27
+
26
28
  from topos.features.facts.store import FactStore, normalize_predicate, CONFLICT_CONFIDENCE_MARGIN
27
29
  from .guard import find_identifiers
28
30
  from .packs import Pack, Predicate
31
+
32
+ #: Whether a resolved `about=other:<name>` assertion may be WRITTEN to that person's
33
+ #: dossier. Default OFF, and it must stay off until a net-subject policy plane exists
34
+ #: (per-subject opt-in defaulting to off, a write-time BlackholeStore consult, and
35
+ #: pack-level `net_subject: allow|deny`). With it off, every outward assertion is
36
+ #: quarantined with reason `net_subject_disabled:<name>` and waits for a human.
37
+ #:
38
+ #: The env override exists so the policy work can be developed and tested against the
39
+ #: real path without editing the module. It is NOT a supported production setting: any
40
+ #: node that sets it is writing durable facts about people who never consented and
41
+ #: cannot, with no gate in front of the write.
42
+ NET_SUBJECT_WRITES_ENABLED = os.environ.get("TOPOS_NET_SUBJECT_WRITES") == "1"
29
43
  # extractor provenance must track the PROMPT actually used — a local copy of this
30
44
  # constant stamped every shadow-2..6 fact "shadow-1" (caught in W1.3 grading)
31
45
  from .template import TEMPLATE_VERSION
@@ -206,6 +220,43 @@ class DerivationWriter:
206
220
  # --- A3 (attribution ladder): route by subject BEFORE any owner-assert ---
207
221
  about = (about or "owner").strip()
208
222
  if about != "owner":
223
+ # --- net-subject kill switch (temporary; remove when the policy plane lands) ---
224
+ #
225
+ # Below this line, `about=other:<name>` that RESOLVES is written as a durable
226
+ # fact onto that person's dossier. There is currently no consent plane to
227
+ # authorise that: `net_subject` / `subject_axis` appear ZERO times in this
228
+ # engine, the control plane, the front end, or any of the 25 pack YAMLs; the
229
+ # Pack/Predicate dataclasses carry no subject field, so a pack can neither
230
+ # declare nor refuse an outward subject; `pack.disclosure_default` is stored
231
+ # on every registry row and never read; and BlackholeGuard is consulted only
232
+ # at READ time, so a blackholed person can still ACCRUE facts.
233
+ #
234
+ # Nothing has been written so far only because `_resolve_person` is an exact
235
+ # match on `entities.normalized_name` and fails on every third-party first
236
+ # name — 624 of 1,505 person entities are keyed on a phone number and only 36
237
+ # carry aliases. That is an accident of an unbuilt person spine, not a policy.
238
+ # The planned L0 (person spine) exists precisely to make that resolution
239
+ # succeed, which would silently switch automatic third-party dossier writing
240
+ # ON. The owner's standing decision is "off until asked".
241
+ #
242
+ # So: quarantine EVERY outward assertion, resolvable or not. Quarantine is
243
+ # already the reviewed path — the rows carry full provenance and the fact
244
+ # editor promotes them — so nothing is lost, only deferred to a human.
245
+ #
246
+ # REMOVE THIS BLOCK when the net-subject policy plane exists (plan L4-4:
247
+ # per-subject opt-in defaulting to off, a write-time BlackholeStore consult,
248
+ # and pack-level `net_subject: allow|deny`). Replace it with that lookup —
249
+ # do not simply delete it.
250
+ if about.startswith("other:") and not NET_SUBJECT_WRITES_ENABLED:
251
+ # Its own reason, deliberately: these are POLICY holds, not failures to
252
+ # identify a subject. Collapsing them into `about_unclear` would make a
253
+ # withheld-by-policy row indistinguishable from one the verifier could
254
+ # not attribute, and the review queue's whole value is that distinction.
255
+ self._quarantine(subject_entity_id, predicate, value, confidence,
256
+ reason=f"net_subject_disabled:{about[6:][:40]}",
257
+ pack=pack, source_refs=source_refs, quote=quote, about=about)
258
+ self.stats["net_subject_withheld"] = self.stats.get("net_subject_withheld", 0) + 1
259
+ return {"outcome": "quarantined", "reason": "net-subject writes disabled"}
209
260
  if about.startswith("other:"):
210
261
  other = self._resolve_person(about[6:])
211
262
  if other:
@@ -360,7 +360,7 @@ def _display_value(raw) -> str:
360
360
  return hv.strip()
361
361
  # NO fallback to arbitrary fields: a description/free-text value is
362
362
  # narrative, not identity — minting it produced sentence-named nodes
363
- # ("rode with albi on the way to…"). A structured value with no
363
+ # ("rode with a friend on the way to…"). A structured value with no
364
364
  # identity key mints nothing; the fact itself still exists.
365
365
  return ""
366
366
  return str(v or "").strip()
@@ -43,7 +43,7 @@ _LINK_STOPWORDS = frozenset(
43
43
 
44
44
  def _linkable_candidate(cand: str) -> bool:
45
45
  """A candidate name is linkable only if it carries at least one real word:
46
- ≥3 chars and not a function word. 'Luc' links; 'IS', 'Go', 'The One' do not."""
46
+ ≥3 chars and not a function word. 'Leo' links; 'IS', 'Go', 'The One' do not."""
47
47
  words = [w for w in cand.split() if w]
48
48
  if not words:
49
49
  return False
@@ -136,7 +136,13 @@ def list_facts(
136
136
  "period_start": payload.get("period_start"),
137
137
  "period_end": payload.get("period_end"),
138
138
  "confidence": payload.get("confidence", fact["confidence"]),
139
- "disclosure": payload.get("disclosure", "scoped"),
139
+ # Fail closed, and match the sibling reader 74 lines below, which
140
+ # already defaults to owner_only. A payload with no disclosure is
141
+ # a row nobody classified; reading it as shareable is the wrong
142
+ # direction to guess in, and the two readers disagreeing meant the
143
+ # same unclassified row was shareable on one path and private on
144
+ # the other.
145
+ "disclosure": payload.get("disclosure", "owner_only"),
140
146
  # Attribution: who asserted this claim (owner | contact:<id> |
141
147
  # assistant | page-author | …). Powers the person→ambient badge.
142
148
  "asserted_by": payload.get("asserted_by", "owner"),
@@ -110,7 +110,14 @@ class FactStore:
110
110
  confidence: float = 0.7,
111
111
  source_refs: Optional[List[Dict[str, Any]]] = None,
112
112
  valid_from: Optional[str] = None,
113
- disclosure: str = "scoped",
113
+ # Fail closed. Every in-tree caller passes this explicitly (verdicts.py,
114
+ # llm_extract.py, extract.py x2, truth_facts.py), so the default is only
115
+ # ever reached by a caller that forgot — and the safe thing to do with a
116
+ # claim about a person when nobody said how far it may travel is to keep
117
+ # it. This is the second fact write path: DerivationWriter pins owner_only
118
+ # by construction, and this one did not, so "facts are owner_only" was
119
+ # true of one lane and merely conventional in the other.
120
+ disclosure: str = "owner_only",
114
121
  period_start: Optional[str] = None,
115
122
  period_end: Optional[str] = None,
116
123
  asserted_by: str = "owner",
@@ -524,9 +524,22 @@ def sweep_orphans(conn: sqlite3.Connection) -> Dict[str, int]:
524
524
  """
525
525
  )
526
526
  out["embedding_entities"] = int(cursor.rowcount or 0)
527
+ # A conflict row is an orphan when the fact it CHALLENGES is gone. A3
528
+ # quarantine rows have no incumbent by design — an unroutable or withheld
529
+ # assertion is not challenging anything — so they carry the synthetic
530
+ # sentinel `quarantine:<reason>` (writer.py::_quarantine). That sentinel is
531
+ # never a signal_objects.object_id, so the orphan predicate matched every
532
+ # one of them: measured on the live node 2026-08-26, all 13 pending rows
533
+ # would be deleted by this sweep, and it fires on the owner's ordinary
534
+ # per-record exclusion flow. That queue is the human review path for
535
+ # third-party assertions — including health.condition about people who
536
+ # never consented — so deleting it silently discards exactly the decisions
537
+ # a person is supposed to make.
527
538
  cursor = conn.execute(
528
539
  """
529
- DELETE FROM fact_conflicts WHERE incumbent_object_id NOT IN (
540
+ DELETE FROM fact_conflicts
541
+ WHERE incumbent_object_id NOT LIKE 'quarantine:%'
542
+ AND incumbent_object_id NOT IN (
530
543
  SELECT object_id FROM signal_objects WHERE object_type='fact'
531
544
  )
532
545
  """
@@ -38,7 +38,8 @@ _ALIASES: List[tuple] = [
38
38
  (r"\b(career|fired|hired|promoted|laid off)\b", ["work.career_event"], False),
39
39
  (r"\bfamily member|my (family|relatives|parents|siblings|kids|children)\b",
40
40
  ["rel.relationship"], False),
41
- (r"\b(closest|inner circle|best friend)s?\b", ["rel.closeness_tier", "rel.relationship"], False),
41
+ (r"\b(closest|inner circle|close circle|close friend|best friend)s?\b",
42
+ ["rel.closeness_tier", "rel.relationship"], False),
42
43
  (r"\bchronotype|night owl|early bird\b", ["behavior.chronotype"], False),
43
44
  ]
44
45
 
@@ -66,19 +67,43 @@ def fetch_direct_facts(
66
67
  return None
67
68
  if special and packet_resolution != "facts_all":
68
69
  return None
69
- owner = conn.execute("SELECT entity_id FROM entities WHERE is_self=1").fetchone()
70
+ # `is_self` is not unique: live 2026-08-26 three entities carried it —
71
+ # ent_e73ff33ae330422b ("Owner", 178 facts) plus two "self" rows created that
72
+ # morning holding none. An unordered fetchone() picked the fact-bearing row by
73
+ # rowid luck; a vacuum or a rewrite of that row would have silently blanked
74
+ # every known-item answer. Prefer the self-entity that actually owns facts,
75
+ # entity_id as the tiebreak, so the choice is stable across rewrites. (No
76
+ # created_at in the ORDER BY: the query fixtures build a minimal `entities`
77
+ # table without it.)
78
+ owner = conn.execute(
79
+ """SELECT e.entity_id
80
+ FROM entities e
81
+ WHERE e.is_self=1
82
+ ORDER BY (SELECT COUNT(*) FROM signal_objects o
83
+ WHERE o.object_type='fact'
84
+ AND o.object_key LIKE 'fact:' || e.entity_id || ':%') DESC,
85
+ e.entity_id ASC
86
+ LIMIT 1"""
87
+ ).fetchone()
70
88
  if not owner:
71
89
  return None
72
90
  out: List[Dict[str, Any]] = []
73
91
  for pred in predicates:
92
+ # Delimiter-aware: a bare `{pred}%` prefix also swept sibling predicates.
93
+ # "Who's in my family?" asks for rel.relationship and was handed the 23
94
+ # rel.relationship_event rows too, so the answer listed people the owner
95
+ # merely met (live 2026-08-26: Vitalik Buterin returned as family). Match
96
+ # the exact key or the key plus its ':value' segment, nothing else.
97
+ # `_` is a LIKE wildcard and predicates contain it, so escape it.
98
+ like_pred = pred.replace("\\", "\\\\").replace("_", "\\_").replace("%", "\\%")
74
99
  rows = conn.execute(
75
100
  """SELECT object_key, payload_json, confidence, valid_from, valid_to,
76
101
  ontology_id, altitude
77
102
  FROM signal_objects
78
103
  WHERE object_type='fact' AND valid_to IS NULL
79
- AND object_key LIKE ?
104
+ AND (object_key = ? OR object_key LIKE ? ESCAPE '\\')
80
105
  ORDER BY valid_from DESC LIMIT 40""",
81
- (f"fact:{owner[0]}:{pred}%",),
106
+ (f"fact:{owner[0]}:{pred}", f"fact:{owner[0]}:{like_pred}:%"),
82
107
  ).fetchall()
83
108
  for key, payload_json, conf, vf, vt, pack, altitude in rows:
84
109
  try:
@@ -125,6 +150,37 @@ def _fmt_value(v: Any) -> str:
125
150
  return str(v)
126
151
 
127
152
 
153
+ def _fact_labels(facts: List[Dict[str, Any]]) -> List[str]:
154
+ """Subject labels for `items`.
155
+
156
+ The game layer fills `items` speculatively from graph/score text before this
157
+ lane runs, and pipeline's `payload.update(direct)` only overwrites the keys
158
+ this lane returns. Leaving `items` behind shipped a correct `answer` next to a
159
+ contradicting list: live 2026-08-26 "Who's in my family?" carried Mom, Dad,
160
+ brother and grandma in `answer` while `items` held NER debris ("U", "AI",
161
+ "##os", "NAME"), and the local synthesis model answered from the debris.
162
+ """
163
+ out: List[str] = []
164
+ seen: set[str] = set()
165
+ for f in facts:
166
+ value = f.get("value")
167
+ if isinstance(value, str):
168
+ try:
169
+ value = json.loads(value)
170
+ except (json.JSONDecodeError, TypeError):
171
+ value = None
172
+ label = None
173
+ if isinstance(value, dict):
174
+ label = value.get("person") or value.get("name") or value.get("value")
175
+ if not label:
176
+ label = _fmt_value(f.get("value"))
177
+ label = str(label).strip()
178
+ if label and label not in seen:
179
+ seen.add(label)
180
+ out.append(label)
181
+ return out[:20]
182
+
183
+
128
184
  def compose_facts_answer(facts: List[Dict[str, Any]]) -> str:
129
185
  lines = []
130
186
  for f in facts[:20]:
@@ -158,5 +214,6 @@ def try_facts_direct(
158
214
  "answer_type": "facts",
159
215
  "answer": compose_facts_answer(facts),
160
216
  "facts": facts[:20],
217
+ "items": _fact_labels(facts),
161
218
  "facts_direct": True,
162
219
  }
@@ -55,6 +55,34 @@ def _extract_inference_evidence(context_packet: Dict[str, Any], *, limit: int =
55
55
  return evidence
56
56
 
57
57
 
58
+ #: Redaction writes these placeholders into stored text, and the NER pass then
59
+ #: extracts them as if they were names.
60
+ _REDACTION_PLACEHOLDERS = {"NAME", "ADDRESS", "DATE", "EMAIL", "PHONE", "URL", "LOCATION"}
61
+
62
+
63
+ def _looks_like_entity_label(value: str) -> bool:
64
+ """Reject debris that is not a name.
65
+
66
+ `graph.nodes` and `scores` carry raw NER output, which includes WordPiece
67
+ continuation tokens ("Topos" tokenizes to "Top" + "##os", and both are stored
68
+ as separate entities), redaction placeholders, and serialized fact blobs. Live
69
+ 2026-08-26 the answer to "Who's in my close circle?" was
70
+ ["U", "AI", "UMA", "Sara", "Marcus", "NAME", "Top", "##os", "VoxTerm A"].
71
+ """
72
+ v = value.strip()
73
+ if len(v) < 2 or len(v) > 60:
74
+ return False
75
+ if v.startswith("##"): # WordPiece continuation, never a standalone name
76
+ return False
77
+ if "{" in v or "}" in v: # serialized fact payload, not a label
78
+ return False
79
+ if v.upper() in _REDACTION_PLACEHOLDERS:
80
+ return False
81
+ if v.isupper() and len(v) <= 3: # bare acronym (U, AI, UMA), not a person here
82
+ return False
83
+ return True
84
+
85
+
58
86
  def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
59
87
  labels: List[str] = []
60
88
  seen: set[str] = set()
@@ -64,7 +92,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
64
92
  continue
65
93
  for key in ("label", "name", "node_id", "entity_text"):
66
94
  value = node.get(key)
67
- if value and str(value) not in seen:
95
+ if value and str(value) not in seen and _looks_like_entity_label(str(value)):
68
96
  seen.add(str(value))
69
97
  labels.append(str(value))
70
98
  for score in context_packet.get("scores") or []:
@@ -72,7 +100,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
72
100
  continue
73
101
  for key in ("entity_text", "label", "topic", "summary_text"):
74
102
  value = score.get(key)
75
- if value and str(value) not in seen:
103
+ if value and str(value) not in seen and _looks_like_entity_label(str(value)):
76
104
  seen.add(str(value))
77
105
  labels.append(str(value))
78
106
  return labels[:10]
@@ -611,6 +611,12 @@
611
611
  "steps": [],
612
612
  "notes": []
613
613
  },
614
+ {
615
+ "version": "1.3.32",
616
+ "summary": "Release 1.3.32.",
617
+ "steps": [],
618
+ "notes": []
619
+ },
614
620
  {
615
621
  "version": "unreleased",
616
622
  "summary": "Staging entry for in-flight PRs. cut_release.py stamps this with the next version at release cut. Never executed by steps_between.",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.3.31
3
+ Version: 1.3.32
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes