topos-node 1.3.41__tar.gz → 1.3.42__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 (764) hide show
  1. {topos_node-1.3.41/topos_node.egg-info → topos_node-1.3.42}/PKG-INFO +1 -1
  2. {topos_node-1.3.41 → topos_node-1.3.42}/pyproject.toml +1 -1
  3. {topos_node-1.3.41 → topos_node-1.3.42}/topos/__version__.py +2 -2
  4. {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/narrowing_vocabulary.json +2 -1
  5. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/game_layer.py +69 -0
  6. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/narrowing.py +1 -0
  7. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/pipeline.py +22 -2
  8. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_registry.json +129 -0
  9. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/bundled_canonical_triples.py +37 -0
  10. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/install_service.py +86 -4
  11. {topos_node-1.3.41 → topos_node-1.3.42}/topos/upgrades/manifests.json +6 -0
  12. {topos_node-1.3.41 → topos_node-1.3.42/topos_node.egg-info}/PKG-INFO +1 -1
  13. {topos_node-1.3.41 → topos_node-1.3.42}/LICENSE +0 -0
  14. {topos_node-1.3.41 → topos_node-1.3.42}/MANIFEST.in +0 -0
  15. {topos_node-1.3.41 → topos_node-1.3.42}/README.md +0 -0
  16. {topos_node-1.3.41 → topos_node-1.3.42}/setup.cfg +0 -0
  17. {topos_node-1.3.41 → topos_node-1.3.42}/shared/__init__.py +0 -0
  18. {topos_node-1.3.41 → topos_node-1.3.42}/shared/filtering.py +0 -0
  19. {topos_node-1.3.41 → topos_node-1.3.42}/shared/schema_registry.py +0 -0
  20. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_active_database_binding.py +0 -0
  21. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_active_ingestion_binding.py +0 -0
  22. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_extensions.py +0 -0
  23. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_gate_leg_hermeticity.py +0 -0
  24. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_llm_integrations_storage.py +0 -0
  25. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_local_gate_composition.py +0 -0
  26. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_owner_database_hermeticity.py +0 -0
  27. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_prewarm_first_run.py +0 -0
  28. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_profile_hygiene.py +0 -0
  29. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_profiles.py +0 -0
  30. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_protocol_handled_types.py +0 -0
  31. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_query_field_contract.py +0 -0
  32. {topos_node-1.3.41 → topos_node-1.3.42}/tests/test_system_computer_name.py +0 -0
  33. {topos_node-1.3.41 → topos_node-1.3.42}/topos/__init__.py +0 -0
  34. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/__init__.py +0 -0
  35. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/dataset_resolution.py +0 -0
  36. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/duckdb_adapter.py +0 -0
  37. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/luck_surface.py +0 -0
  38. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_communities.py +0 -0
  39. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_directed.py +0 -0
  40. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_graph.py +0 -0
  41. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/messenger_labels.py +0 -0
  42. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/person_graph.py +0 -0
  43. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/person_overlay.py +0 -0
  44. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/profiles.py +0 -0
  45. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/query_engine.py +0 -0
  46. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/raw_queries.py +0 -0
  47. {topos_node-1.3.41 → topos_node-1.3.42}/topos/analytics/relationship_reads.py +0 -0
  48. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/__init__.py +0 -0
  49. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/analytics.py +0 -0
  50. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/app_registry.py +0 -0
  51. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/backup.py +0 -0
  52. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/community_naming_config.py +0 -0
  53. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/compute_remote.py +0 -0
  54. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/connected_apps.py +0 -0
  55. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/conversation_context.py +0 -0
  56. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/data_commit.py +0 -0
  57. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/data_explorer_table_prefs.py +0 -0
  58. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/database_explorer.py +0 -0
  59. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/db.py +0 -0
  60. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/device.py +0 -0
  61. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/disk_space_config.py +0 -0
  62. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/engine_run.py +0 -0
  63. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/enrichment.py +0 -0
  64. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/enrichment_lab.py +0 -0
  65. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/facts_llm_config.py +0 -0
  66. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/filter_lab.py +0 -0
  67. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/health.py +0 -0
  68. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/home_chat.py +0 -0
  69. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ingestion_api.py +0 -0
  70. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ingestion_compat.py +0 -0
  71. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ingestion_sources.py +0 -0
  72. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/intelligence_lifecycle.py +0 -0
  73. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/llm.py +0 -0
  74. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/local_mcp.py +0 -0
  75. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/messenger_analytics.py +0 -0
  76. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/privacy_disclose.py +0 -0
  77. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/query_api.py +0 -0
  78. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/runtime_bootstrap.py +0 -0
  79. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sanitization_ollama_config.py +0 -0
  80. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/shell.py +0 -0
  81. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/signal.py +0 -0
  82. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/signal_extraction_config.py +0 -0
  83. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/source_install.py +0 -0
  84. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/source_scrub.py +0 -0
  85. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sources.py +0 -0
  86. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sources_overview.py +0 -0
  87. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/sync.py +0 -0
  88. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/tool_index.py +0 -0
  89. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/ui_config.py +0 -0
  90. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/uma_data.py +0 -0
  91. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/upgrades.py +0 -0
  92. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/usage.py +0 -0
  93. {topos_node-1.3.41 → topos_node-1.3.42}/topos/api/user_identity.py +0 -0
  94. {topos_node-1.3.41 → topos_node-1.3.42}/topos/app.py +0 -0
  95. {topos_node-1.3.41 → topos_node-1.3.42}/topos/auth.py +0 -0
  96. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/__init__.py +0 -0
  97. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/declared_field_map.py +0 -0
  98. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/__init__.py +0 -0
  99. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/base.py +0 -0
  100. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  101. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  102. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  103. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  104. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  105. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  106. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  107. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  108. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/models.py +0 -0
  109. {topos_node-1.3.41 → topos_node-1.3.42}/topos/canonicalization/resolver.py +0 -0
  110. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/__init__.py +0 -0
  111. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/__main__.py +0 -0
  112. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/assets/topos_blk_rounded.png +0 -0
  113. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/assets/topos_white.png +0 -0
  114. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/commands.py +0 -0
  115. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/profile_cmd.py +0 -0
  116. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/reprocess_cmd.py +0 -0
  117. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/setup_models_cmd.py +0 -0
  118. {topos_node-1.3.41 → topos_node-1.3.42}/topos/cli/tray.py +0 -0
  119. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/__init__.py +0 -0
  120. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/conversation_context_llm.py +0 -0
  121. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/facts_llm.py +0 -0
  122. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/local_model_builds.py +0 -0
  123. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/model_packs.py +0 -0
  124. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/node_function_providers.py +0 -0
  125. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/sanitization_ollama.py +0 -0
  126. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/settings.py +0 -0
  127. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/signal_extraction.py +0 -0
  128. {topos_node-1.3.41 → topos_node-1.3.42}/topos/config/uvicorn_logging.json +0 -0
  129. {topos_node-1.3.41 → topos_node-1.3.42}/topos/contacts/__init__.py +0 -0
  130. {topos_node-1.3.41 → topos_node-1.3.42}/topos/contacts/identity.py +0 -0
  131. {topos_node-1.3.41 → topos_node-1.3.42}/topos/control_plane_client.py +0 -0
  132. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/__init__.py +0 -0
  133. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/api_models.py +0 -0
  134. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/connection_resilience.py +0 -0
  135. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/db_health.py +0 -0
  136. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/device_helpers.py +0 -0
  137. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/errors.py +0 -0
  138. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/events.py +0 -0
  139. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/__init__.py +0 -0
  140. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/common.py +0 -0
  141. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/complexity.py +0 -0
  142. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/config.py +0 -0
  143. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/contacts_import.py +0 -0
  144. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/database_explorer.py +0 -0
  145. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/derivation.py +0 -0
  146. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/device.py +0 -0
  147. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/enrichment.py +0 -0
  148. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/enrichment_lab.py +0 -0
  149. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/filter_lab.py +0 -0
  150. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/graph_query.py +0 -0
  151. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/graph_summary.py +0 -0
  152. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/home_chat.py +0 -0
  153. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/ingest.py +0 -0
  154. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/mcp_client_elevations.py +0 -0
  155. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/mcp_clients.py +0 -0
  156. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/messages.py +0 -0
  157. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/messenger_analytics.py +0 -0
  158. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/query.py +0 -0
  159. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/registry.py +0 -0
  160. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/routines.py +0 -0
  161. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/signal_features.py +0 -0
  162. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/sources.py +0 -0
  163. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/timeline_daily.py +0 -0
  164. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/tool_index.py +0 -0
  165. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/handlers/uma.py +0 -0
  166. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/logging.py +0 -0
  167. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/metrics.py +0 -0
  168. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/routine_access.py +0 -0
  169. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/startup_banner.py +0 -0
  170. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/state.py +0 -0
  171. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/table_layers.py +0 -0
  172. {topos_node-1.3.41 → topos_node-1.3.42}/topos/core/types.py +0 -0
  173. {topos_node-1.3.41 → topos_node-1.3.42}/topos/data_explorer_row_delete.py +0 -0
  174. {topos_node-1.3.41 → topos_node-1.3.42}/topos/data_explorer_table_prefs.py +0 -0
  175. {topos_node-1.3.41 → topos_node-1.3.42}/topos/data_explorer_tables.py +0 -0
  176. {topos_node-1.3.41 → topos_node-1.3.42}/topos/defaults.py +0 -0
  177. {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/__init__.py +0 -0
  178. {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/canonical_writer.py +0 -0
  179. {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/content_policy.py +0 -0
  180. {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/field_registry.py +0 -0
  181. {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/privacy_layer.py +0 -0
  182. {topos_node-1.3.41 → topos_node-1.3.42}/topos/disclosure/tier.py +0 -0
  183. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/__init__.py +0 -0
  184. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/__init__.py +0 -0
  185. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/base.py +0 -0
  186. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/generative_prompts.py +0 -0
  187. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/generative_response.py +0 -0
  188. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/huggingface.py +0 -0
  189. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/ollama.py +0 -0
  190. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/openai.py +0 -0
  191. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/openai_compatible.py +0 -0
  192. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/redpill.py +0 -0
  193. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/backends/stub.py +0 -0
  194. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/client.py +0 -0
  195. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/disk_space.py +0 -0
  196. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/engine.py +0 -0
  197. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/hosted_llm_wallet.py +0 -0
  198. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/intake.py +0 -0
  199. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/memory_utils.py +0 -0
  200. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/model_cache.py +0 -0
  201. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/model_manager.py +0 -0
  202. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_install.py +0 -0
  203. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_pull.py +0 -0
  204. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_runtime.py +0 -0
  205. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/ollama_setup_guidance.py +0 -0
  206. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/pipeline_memory.py +0 -0
  207. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/queue_manager.py +0 -0
  208. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/registration.py +0 -0
  209. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/result_formatter.py +0 -0
  210. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/router.py +0 -0
  211. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/scoped_token.py +0 -0
  212. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/tasks.py +0 -0
  213. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/torch_runtime.py +0 -0
  214. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/transport.py +0 -0
  215. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/usage_guard.py +0 -0
  216. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/usage_observation.py +0 -0
  217. {topos_node-1.3.41 → topos_node-1.3.42}/topos/engine/validator.py +0 -0
  218. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/__init__.py +0 -0
  219. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/catalog.py +0 -0
  220. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/derivation_recovery.py +0 -0
  221. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/derived_tables.py +0 -0
  222. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/job_readiness.py +0 -0
  223. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/job_writer.py +0 -0
  224. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/__init__.py +0 -0
  225. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/base.py +0 -0
  226. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  227. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  228. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  229. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  230. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  231. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  232. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  233. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  234. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  235. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  236. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  237. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  238. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  239. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  240. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  241. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  242. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  243. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  244. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  245. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  246. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  247. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  248. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/__init__.py +0 -0
  249. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  250. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/language_job.py +0 -0
  251. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  252. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  253. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/model_overrides.py +0 -0
  254. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/__init__.py +0 -0
  255. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/manager.py +0 -0
  256. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/mvp_defaults.py +0 -0
  257. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/registry.py +0 -0
  258. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/models/versioning.py +0 -0
  259. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/orchestrator.py +0 -0
  260. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/pipeline_activity.py +0 -0
  261. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/processor.py +0 -0
  262. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/progress_bar.py +0 -0
  263. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/record_progress.py +0 -0
  264. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/registry_contract.py +0 -0
  265. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/signal_derivation_config.json +0 -0
  266. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment/source_overrides.py +0 -0
  267. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/__init__.py +0 -0
  268. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/bundles.py +0 -0
  269. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/model_resolve.py +0 -0
  270. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/schema.py +0 -0
  271. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/service.py +0 -0
  272. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/store.py +0 -0
  273. {topos_node-1.3.41 → topos_node-1.3.42}/topos/enrichment_lab/worker.py +0 -0
  274. {topos_node-1.3.41 → topos_node-1.3.42}/topos/evals/__init__.py +0 -0
  275. {topos_node-1.3.41 → topos_node-1.3.42}/topos/evals/enrichment_eval.py +0 -0
  276. {topos_node-1.3.41 → topos_node-1.3.42}/topos/extensions.py +0 -0
  277. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/__init__.py +0 -0
  278. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/canonical.py +0 -0
  279. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/engine.py +0 -0
  280. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/entropy.py +0 -0
  281. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/focus.py +0 -0
  282. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/graph_metrics.py +0 -0
  283. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/influence.py +0 -0
  284. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/projection.py +0 -0
  285. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/snapshots.py +0 -0
  286. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/store.py +0 -0
  287. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/topic_merge.py +0 -0
  288. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/topics.py +0 -0
  289. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/topics_daily.py +0 -0
  290. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/complexity/volatility.py +0 -0
  291. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/__init__.py +0 -0
  292. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  293. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  294. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  295. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  296. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  297. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  298. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  299. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  300. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  301. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  302. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  303. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  304. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  305. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  306. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  307. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  308. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  309. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  310. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  311. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  312. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  313. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  314. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  315. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  316. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  317. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  318. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  319. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  320. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  321. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  322. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  323. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  324. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  325. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  326. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  327. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  328. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/candidates.py +0 -0
  329. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/guard.py +0 -0
  330. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/kernels.py +0 -0
  331. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/net_subject_policy.py +0 -0
  332. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/packs.py +0 -0
  333. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/person_bridge.py +0 -0
  334. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/prefilter.py +0 -0
  335. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/registry.py +0 -0
  336. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/report_card.py +0 -0
  337. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/router.py +0 -0
  338. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/social_bench.py +0 -0
  339. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/social_kernels.py +0 -0
  340. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/surfaces.py +0 -0
  341. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/synthesize.py +0 -0
  342. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/template.py +0 -0
  343. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/verify.py +0 -0
  344. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/derivation/writer.py +0 -0
  345. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/__init__.py +0 -0
  346. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/affinity.py +0 -0
  347. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/affinity_owner.py +0 -0
  348. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/affinity_quality.py +0 -0
  349. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/chatgpt_declared.py +0 -0
  350. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/community_names.py +0 -0
  351. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/community_naming.py +0 -0
  352. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/consolidation.py +0 -0
  353. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/context_vectors.py +0 -0
  354. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/cypher.py +0 -0
  355. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/declared_mappings.py +0 -0
  356. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/dossier.py +0 -0
  357. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/edges.py +0 -0
  358. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/fact_materializer.py +0 -0
  359. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/graph_enrichers.py +0 -0
  360. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/graph_refresh.py +0 -0
  361. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/graph_search.py +0 -0
  362. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/linking.py +0 -0
  363. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/maintenance.py +0 -0
  364. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/owner.py +0 -0
  365. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/reads.py +0 -0
  366. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/rebuild_subprocess.py +0 -0
  367. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/resolver.py +0 -0
  368. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/entities/structured_fields.py +0 -0
  369. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/__init__.py +0 -0
  370. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/extract.py +0 -0
  371. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/llm_extract.py +0 -0
  372. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/reads.py +0 -0
  373. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/store.py +0 -0
  374. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/facts/verdicts.py +0 -0
  375. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/fit/evaluator.py +0 -0
  376. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/fit/opportunity_types.json +0 -0
  377. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/__init__.py +0 -0
  378. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole.py +0 -0
  379. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_guard.py +0 -0
  380. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_llm.py +0 -0
  381. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  382. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/derived_scrub.py +0 -0
  383. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/exclusions.py +0 -0
  384. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/lifecycle/gc.py +0 -0
  385. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/provenance/__init__.py +0 -0
  386. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/provenance/posture.py +0 -0
  387. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/provenance/roles.py +0 -0
  388. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/__init__.py +0 -0
  389. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_canonical_loader.py +0 -0
  390. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_ontology.py +0 -0
  391. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_renderer.py +0 -0
  392. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/brief_schemas.py +0 -0
  393. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/chunking.py +0 -0
  394. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/cluster_labels.py +0 -0
  395. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/conversation_context.py +0 -0
  396. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/conversation_windows.py +0 -0
  397. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/data_health.py +0 -0
  398. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  399. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/intentions.json +0 -0
  400. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/interests.json +0 -0
  401. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/memory.json +0 -0
  402. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/places.json +0 -0
  403. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/profile.json +0 -0
  404. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/relationships.json +0 -0
  405. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/resources.json +0 -0
  406. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  407. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/time.json +0 -0
  408. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/wellbeing.json +0 -0
  409. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/definitions/work.json +0 -0
  410. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/derived_index.py +0 -0
  411. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/derived_spec.py +0 -0
  412. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_briefs.py +0 -0
  413. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_definition_loader.py +0 -0
  414. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_profiles.py +0 -0
  415. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/dimension_registry.py +0 -0
  416. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/embed_context.py +0 -0
  417. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_router.py +0 -0
  418. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/extraction/artifact_store.py +0 -0
  419. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/extraction/rule_extractors.py +0 -0
  420. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/graph_sanitize.py +0 -0
  421. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/hybrid_search.py +0 -0
  422. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/incremental_clustering.py +0 -0
  423. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/model_recommendations.py +0 -0
  424. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/query_embed_cache.py +0 -0
  425. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/schemas.py +0 -0
  426. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/service.py +0 -0
  427. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/signal_object_store.py +0 -0
  428. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/source_hydration.py +0 -0
  429. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/structured_signal.py +0 -0
  430. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/tool_index.py +0 -0
  431. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/topic_clustering.py +0 -0
  432. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/aggregates.py +0 -0
  433. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/commitments.py +0 -0
  434. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/rhythm.py +0 -0
  435. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  436. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/vector_codec.py +0 -0
  437. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/vector_math.py +0 -0
  438. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/signal/vector_settings.py +0 -0
  439. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/__init__.py +0 -0
  440. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/definitions.py +0 -0
  441. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/engine.py +0 -0
  442. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/fold.py +0 -0
  443. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/stats/insights.py +0 -0
  444. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/timeline_projection.py +0 -0
  445. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/timeline_rollup.py +0 -0
  446. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/__init__.py +0 -0
  447. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/badges.py +0 -0
  448. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/daily.py +0 -0
  449. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/dashboard.py +0 -0
  450. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/instruments.py +0 -0
  451. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/intents.py +0 -0
  452. {topos_node-1.3.41 → topos_node-1.3.42}/topos/features/triage/readiness.py +0 -0
  453. {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/__init__.py +0 -0
  454. {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/bundles.py +0 -0
  455. {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/schema.py +0 -0
  456. {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/service.py +0 -0
  457. {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/store.py +0 -0
  458. {topos_node-1.3.41 → topos_node-1.3.42}/topos/filter_lab/worker.py +0 -0
  459. {topos_node-1.3.41 → topos_node-1.3.42}/topos/home_chat/__init__.py +0 -0
  460. {topos_node-1.3.41 → topos_node-1.3.42}/topos/home_chat/schema.py +0 -0
  461. {topos_node-1.3.41 → topos_node-1.3.42}/topos/home_chat/store.py +0 -0
  462. {topos_node-1.3.41 → topos_node-1.3.42}/topos/hosted_pool_lease.py +0 -0
  463. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/__init__.py +0 -0
  464. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/canonical_pipeline.py +0 -0
  465. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/checkpoints/__init__.py +0 -0
  466. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  467. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  468. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/inbox_crypto.py +0 -0
  469. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/inbox_drain.py +0 -0
  470. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/ingest_helpers.py +0 -0
  471. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/jobs.py +0 -0
  472. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/journal_location_fanout.py +0 -0
  473. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/journal_time_log_normalize.py +0 -0
  474. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/local_exports.py +0 -0
  475. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/local_sync.py +0 -0
  476. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/log_preview.py +0 -0
  477. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/manager.py +0 -0
  478. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parser.py +0 -0
  479. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/__init__.py +0 -0
  480. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/base.py +0 -0
  481. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/browser_parser.py +0 -0
  482. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/calendar_parser.py +0 -0
  483. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  484. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  485. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  486. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  487. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/documents_parser.py +0 -0
  488. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  489. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  490. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/grok_parser.py +0 -0
  491. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/messenger_parser.py +0 -0
  492. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  493. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/progress.py +0 -0
  494. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/reprocess.py +0 -0
  495. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/__init__.py +0 -0
  496. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/base.py +0 -0
  497. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/calendar.py +0 -0
  498. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/chatgpt.py +0 -0
  499. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/contact_importers.py +0 -0
  500. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/grok.py +0 -0
  501. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/imessage_reader.py +0 -0
  502. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/signal_export_parser.py +0 -0
  503. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/sources/signal_reader.py +0 -0
  504. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/state_machine.py +0 -0
  505. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/triggers/__init__.py +0 -0
  506. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/triggers/file_trigger.py +0 -0
  507. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  508. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  509. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/__init__.py +0 -0
  510. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/base.py +0 -0
  511. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/schema_registry.py +0 -0
  512. {topos_node-1.3.41 → topos_node-1.3.42}/topos/ingestion/validation/schema_validator.py +0 -0
  513. {topos_node-1.3.41 → topos_node-1.3.42}/topos/lineage/__init__.py +0 -0
  514. {topos_node-1.3.41 → topos_node-1.3.42}/topos/lineage/provenance.py +0 -0
  515. {topos_node-1.3.41 → topos_node-1.3.42}/topos/lineage/tracker.py +0 -0
  516. {topos_node-1.3.41 → topos_node-1.3.42}/topos/llm_integrations_storage.py +0 -0
  517. {topos_node-1.3.41 → topos_node-1.3.42}/topos/mcp_clients.py +0 -0
  518. {topos_node-1.3.41 → topos_node-1.3.42}/topos/mcp_stdio_proxy.py +0 -0
  519. {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/__init__.py +0 -0
  520. {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/alerts.py +0 -0
  521. {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/metrics.py +0 -0
  522. {topos_node-1.3.41 → topos_node-1.3.42}/topos/observability/tracing.py +0 -0
  523. {topos_node-1.3.41 → topos_node-1.3.42}/topos/openai_client.py +0 -0
  524. {topos_node-1.3.41 → topos_node-1.3.42}/topos/owner_key.py +0 -0
  525. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/__init__.py +0 -0
  526. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/audit.py +0 -0
  527. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/envelope.py +0 -0
  528. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/job_runner.py +0 -0
  529. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/job_store.py +0 -0
  530. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/stages.py +0 -0
  531. {topos_node-1.3.41 → topos_node-1.3.42}/topos/pipeline/stub_enqueue.py +0 -0
  532. {topos_node-1.3.41 → topos_node-1.3.42}/topos/principal.py +0 -0
  533. {topos_node-1.3.41 → topos_node-1.3.42}/topos/profiles.py +0 -0
  534. {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/__init__.py +0 -0
  535. {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/__init__.py +0 -0
  536. {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/base.py +0 -0
  537. {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/builders.py +0 -0
  538. {topos_node-1.3.41 → topos_node-1.3.42}/topos/projections/vector_index/health_checks.py +0 -0
  539. {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/__init__.py +0 -0
  540. {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/handled_message_types.json +0 -0
  541. {topos_node-1.3.41 → topos_node-1.3.42}/topos/protocol/query_field_contract.json +0 -0
  542. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/__init__.py +0 -0
  543. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/audit.py +0 -0
  544. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/closeness.py +0 -0
  545. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/cohort_resolvers.py +0 -0
  546. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/collaborators.py +0 -0
  547. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/ddr.py +0 -0
  548. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/disclosure.py +0 -0
  549. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/entity_window.py +0 -0
  550. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/exclusion.py +0 -0
  551. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/facts_direct.py +0 -0
  552. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/fingerprint.py +0 -0
  553. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/grant_cache.py +0 -0
  554. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/inference.py +0 -0
  555. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/intent.py +0 -0
  556. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/manifest.py +0 -0
  557. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/manifest_validation.py +0 -0
  558. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/minimizer.py +0 -0
  559. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/negotiation.py +0 -0
  560. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/packet_resolution.py +0 -0
  561. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/planner.py +0 -0
  562. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/retrieval.py +0 -0
  563. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/runtime.py +0 -0
  564. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_arbiter.py +0 -0
  565. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_classifier.py +0 -0
  566. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_head.py +0 -0
  567. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_registry_loader.py +0 -0
  568. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/scope_shadow.py +0 -0
  569. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/session.py +0 -0
  570. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/session_utils.py +0 -0
  571. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/source_generation.py +0 -0
  572. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/truth_facts.py +0 -0
  573. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/truth_prompts.py +0 -0
  574. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/turn_classifier.py +0 -0
  575. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/types.py +0 -0
  576. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/verify.py +0 -0
  577. {topos_node-1.3.41 → topos_node-1.3.42}/topos/query/verify_modes.py +0 -0
  578. {topos_node-1.3.41 → topos_node-1.3.42}/topos/rate_limit.py +0 -0
  579. {topos_node-1.3.41 → topos_node-1.3.42}/topos/relay_stamp.py +0 -0
  580. {topos_node-1.3.41 → topos_node-1.3.42}/topos/routines/__init__.py +0 -0
  581. {topos_node-1.3.41 → topos_node-1.3.42}/topos/routines/schema.py +0 -0
  582. {topos_node-1.3.41 → topos_node-1.3.42}/topos/routines/store.py +0 -0
  583. {topos_node-1.3.41 → topos_node-1.3.42}/topos/runtime_housekeeping.py +0 -0
  584. {topos_node-1.3.41 → topos_node-1.3.42}/topos/runtime_shutdown.py +0 -0
  585. {topos_node-1.3.41 → topos_node-1.3.42}/topos/runtime_update.py +0 -0
  586. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/__init__.py +0 -0
  587. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/nsfw_classifier.py +0 -0
  588. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/ollama_transforms.py +0 -0
  589. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/prewarm.py +0 -0
  590. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sanitization/privacy_filter.py +0 -0
  591. {topos_node-1.3.41 → topos_node-1.3.42}/topos/scope_resolution.py +0 -0
  592. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/__init__.py +0 -0
  593. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/container.py +0 -0
  594. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/__init__.py +0 -0
  595. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/base.py +0 -0
  596. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/local.py +0 -0
  597. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/embeddings/remote.py +0 -0
  598. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/interfaces.py +0 -0
  599. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/llm/__init__.py +0 -0
  600. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/llm/base.py +0 -0
  601. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/llm/openai.py +0 -0
  602. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/local.py +0 -0
  603. {topos_node-1.3.41 → topos_node-1.3.42}/topos/services/postgres.py +0 -0
  604. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/__init__.py +0 -0
  605. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/canonical_signal_defaults.py +0 -0
  606. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/declared_field_map_spec.py +0 -0
  607. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/definitions.py +0 -0
  608. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/registry.py +0 -0
  609. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/runtime_install.py +0 -0
  610. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/scrub_attribution.py +0 -0
  611. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sources/scrub_service.py +0 -0
  612. {topos_node-1.3.41 → topos_node-1.3.42}/topos/startup_banner.py +0 -0
  613. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/__init__.py +0 -0
  614. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/__init__.py +0 -0
  615. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/factory.py +0 -0
  616. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/fakes.py +0 -0
  617. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/postgres/stores.py +0 -0
  618. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/protocols.py +0 -0
  619. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/sqlite/__init__.py +0 -0
  620. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/sqlite/stores.py +0 -0
  621. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  622. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/__init__.py +0 -0
  623. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/activity_tables.py +0 -0
  624. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  625. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  626. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  627. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/model.py +0 -0
  628. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/ai_chat/tables.py +0 -0
  629. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  630. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/canonical_store.py +0 -0
  631. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/conversations_tables.py +0 -0
  632. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/journal_repair.py +0 -0
  633. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/mapping_store.py +0 -0
  634. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/canonical/postgres.py +0 -0
  635. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/__init__.py +0 -0
  636. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/client.py +0 -0
  637. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/connection_tuning.py +0 -0
  638. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/__init__.py +0 -0
  639. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  640. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  641. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  642. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  643. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  644. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/backup.py +0 -0
  645. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/backup_custody.py +0 -0
  646. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  647. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  648. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  649. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  650. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/community_names_v1.py +0 -0
  651. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/complexity_v1.py +0 -0
  652. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  653. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  654. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  655. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  656. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  657. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  658. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/documents_v1.py +0 -0
  659. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  660. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  661. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  662. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  663. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  664. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  665. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  666. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  667. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  668. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  669. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  670. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/episodes_v1.py +0 -0
  671. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  672. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  673. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  674. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  675. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  676. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  677. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  678. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  679. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  680. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  681. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  682. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  683. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  684. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  685. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  686. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/registry.py +0 -0
  687. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/registry_checksums.json +0 -0
  688. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  689. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  690. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  691. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  692. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  693. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects.py +0 -0
  694. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  695. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  696. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  697. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  698. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  699. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  700. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  701. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  702. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  703. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  704. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  705. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  706. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  707. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  708. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  709. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  710. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  711. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  712. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  713. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  714. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  715. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  716. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/paths.py +0 -0
  717. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/postgres.py +0 -0
  718. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/schema.py +0 -0
  719. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/schema_probe.py +0 -0
  720. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/storage_breakdown.py +0 -0
  721. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/db/write_gate.py +0 -0
  722. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/derived_row_identity.py +0 -0
  723. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/enrichment/__init__.py +0 -0
  724. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  725. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  726. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/normalized/__init__.py +0 -0
  727. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/normalized/normalized_store.py +0 -0
  728. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/__init__.py +0 -0
  729. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/decision.py +0 -0
  730. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/oplog_store.py +0 -0
  731. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/oplog/postgres.py +0 -0
  732. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/person/identity_resolver.py +0 -0
  733. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/projections/__init__.py +0 -0
  734. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/projections/index_ops_store.py +0 -0
  735. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/projections/vector_index_store.py +0 -0
  736. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/__init__.py +0 -0
  737. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/browser_flat_tables.py +0 -0
  738. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/file_store.py +0 -0
  739. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/raw_store.py +0 -0
  740. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/raw_tables_manager.py +0 -0
  741. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/raw/sqlite_raw_store.py +0 -0
  742. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/security/encryption.py +0 -0
  743. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/signal_identity.py +0 -0
  744. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/source_settings.py +0 -0
  745. {topos_node-1.3.41 → topos_node-1.3.42}/topos/storage/user_identity.py +0 -0
  746. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sync/__init__.py +0 -0
  747. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sync/client.py +0 -0
  748. {topos_node-1.3.41 → topos_node-1.3.42}/topos/sync_handlers.py +0 -0
  749. {topos_node-1.3.41 → topos_node-1.3.42}/topos/testing/__init__.py +0 -0
  750. {topos_node-1.3.41 → topos_node-1.3.42}/topos/testing/lifespan.py +0 -0
  751. {topos_node-1.3.41 → topos_node-1.3.42}/topos/uds.py +0 -0
  752. {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_contact_enrichment.py +0 -0
  753. {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_filters.py +0 -0
  754. {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_resource_id.py +0 -0
  755. {topos_node-1.3.41 → topos_node-1.3.42}/topos/uma_rpt.py +0 -0
  756. {topos_node-1.3.41 → topos_node-1.3.42}/topos/upgrades/__init__.py +0 -0
  757. {topos_node-1.3.41 → topos_node-1.3.42}/topos/upgrades/runner.py +0 -0
  758. {topos_node-1.3.41 → topos_node-1.3.42}/topos/utils/base_object.py +0 -0
  759. {topos_node-1.3.41 → topos_node-1.3.42}/topos/websocket_client.py +0 -0
  760. {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/SOURCES.txt +0 -0
  761. {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/dependency_links.txt +0 -0
  762. {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/entry_points.txt +0 -0
  763. {topos_node-1.3.41 → topos_node-1.3.42}/topos_node.egg-info/requires.txt +0 -0
  764. {topos_node-1.3.41 → topos_node-1.3.42}/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.41
3
+ Version: 1.3.42
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.41"
7
+ version = "1.3.42"
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.41"
4
- __version_info__ = (1, 3, 41)
3
+ __version__ = "1.3.42"
4
+ __version_info__ = (1, 3, 42)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -154,7 +154,8 @@
154
154
  "topic_thread_single_store",
155
155
  "unknown_scope",
156
156
  "unmatched_route",
157
- "unrecognized"
157
+ "unrecognized",
158
+ "world_knowledge_no_retrieval"
158
159
  ],
159
160
  "empty_causes": [
160
161
  "gate_vetoed",
@@ -106,6 +106,75 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
106
106
  return labels[:10]
107
107
 
108
108
 
109
+ #: availability:read licenses free/busy ONLY. The three sets below are the
110
+ #: ENTIRE licensed vocabulary of an availability inference answer — a person
111
+ #: name or a meeting title has no slot in it, so enforcement is a closed-set
112
+ #: membership check, never a redaction pattern that has to recognize names.
113
+ _AVAILABILITY_ANSWERS = frozenset({"yes", "conditional", "no", "unknown"})
114
+ _AVAILABILITY_BANDS = frozenset(
115
+ {"overlap_found", "negotiable_overlap", "no_overlap", "unknown"}
116
+ )
117
+ #: Free text can only leave through a key, so unknown keys are dropped rather
118
+ #: than inspected. Everything listed is either closed-set or pipeline-stamped
119
+ #: metadata (exclusion/truncated/empty_cause carry slugs and integers only).
120
+ _AVAILABILITY_ALLOWED_KEYS = frozenset(
121
+ {
122
+ "access_mode",
123
+ "scope_id",
124
+ "answer_type",
125
+ "band",
126
+ "answer",
127
+ "confidence",
128
+ "items",
129
+ "deferred",
130
+ "redaction",
131
+ "exclusion",
132
+ "truncated",
133
+ "empty_cause",
134
+ "packet_resolution",
135
+ "packet_resolution_reason",
136
+ "principal_cls",
137
+ }
138
+ )
139
+
140
+
141
+ def is_availability_scope(scope_id: str) -> bool:
142
+ return "availability" in (scope_id or "")
143
+
144
+
145
+ def enforce_availability_inference_contract(payload: Dict[str, Any]) -> Dict[str, Any]:
146
+ """Free/busy-only egress gate for availability inference payloads.
147
+
148
+ The branches in ``DefaultGameLayer.apply`` already emit only closed-set
149
+ values for this scope — but the pipeline lanes that run AFTER the game
150
+ layer ``update()`` the payload in place, and any of them can re-open what
151
+ the game layer refused. Live 2026-09-02 the LLM inference lane did exactly
152
+ that: the who-guard's ``answer: "unknown"`` left the engine as a contact's
153
+ full name at confidence 1. This function is the last owner of the payload
154
+ before it is serialized, so a violation here is scrubbed to "unknown"
155
+ rather than trusted, and the scrub is declared via ``redaction`` (a
156
+ closed-set slug) instead of happening silently.
157
+ """
158
+ out = {k: v for k, v in payload.items() if k in _AVAILABILITY_ALLOWED_KEYS}
159
+ scrubbed = len(out) != len(payload)
160
+ if out.get("answer_type") not in ("band", "list"):
161
+ out["answer_type"] = "band"
162
+ scrubbed = True
163
+ if str(out.get("band") or "unknown") not in _AVAILABILITY_BANDS:
164
+ out.pop("band", None)
165
+ scrubbed = True
166
+ if str(out.get("answer")) not in _AVAILABILITY_ANSWERS:
167
+ out["answer"] = "unknown"
168
+ out["confidence"] = 0.0
169
+ scrubbed = True
170
+ if out.get("items"):
171
+ out["items"] = []
172
+ scrubbed = True
173
+ if scrubbed:
174
+ out["redaction"] = "availability_free_busy_only"
175
+ return out
176
+
177
+
109
178
  class DefaultGameLayer:
110
179
  reveal_strategy: RevealStrategy = RevealStrategy.DIRECT
111
180
 
@@ -299,6 +299,7 @@ REASONS = frozenset(
299
299
  "source_has_live_tools",
300
300
  "source_ref",
301
301
  "summary_enrichment",
302
+ "world_knowledge_no_retrieval",
302
303
  # --- control plane: refusals that never reach the node. The human-readable
303
304
  # sentence stays on the response's own `deny_reason`; the ledger carries the code.
304
305
  "access_mode_above_ceiling",
@@ -16,7 +16,11 @@ from .ddr import StageTimings, build_disclosure_decision_record, now_ms
16
16
  from .disclosure import DisclosureFilterPipeline
17
17
  from .fingerprint import compute_retrieval_fingerprint
18
18
  from .packet_resolution import effective_packet_resolution
19
- from .game_layer import DefaultGameLayer
19
+ from .game_layer import (
20
+ DefaultGameLayer,
21
+ enforce_availability_inference_contract,
22
+ is_availability_scope,
23
+ )
20
24
  from .inference import run_query_inference
21
25
  from .intent import compute_intent_hash
22
26
  from .manifest import ScopeResolutionManifest
@@ -779,7 +783,17 @@ class QueryPipelineOrchestrator:
779
783
  query_text=query_text,
780
784
  )
781
785
  timings.game_layer_ms = now_ms() - _t0
782
- if access_mode == "inference" and public.payload.get("answer_type") != "band":
786
+ # availability:read licenses free/busy only, so the game layer's output
787
+ # (band, or the who-guard's refusal) is FINAL for this scope — same
788
+ # contract as `band`/`facts` below: deterministic answer_types are
789
+ # final. The lanes below `update()` the payload in place, and on
790
+ # 2026-09-02 the LLM lane overwrote the who-guard's "unknown" with a
791
+ # contact's full name at confidence 1 — the refusal has answer_type
792
+ # "list", which both lanes treated as an invitation.
793
+ availability_final = access_mode == "inference" and is_availability_scope(scope_id)
794
+ if (access_mode == "inference"
795
+ and not availability_final
796
+ and public.payload.get("answer_type") != "band"):
783
797
  # C7 facts-direct (W3.1): a known-item ask with live facts gets its
784
798
  # exact values, validity dates and evidence counts with ZERO LLM —
785
799
  # same contract as `band`: deterministic answer_types are final.
@@ -820,6 +834,7 @@ class QueryPipelineOrchestrator:
820
834
  if direct is not None:
821
835
  public.payload.update(direct)
822
836
  if (access_mode == "inference"
837
+ and not availability_final
823
838
  and public.payload.get("answer_type") not in ("band", "facts")):
824
839
  _t0 = now_ms()
825
840
  inf = await asyncio.to_thread(
@@ -831,6 +846,11 @@ class QueryPipelineOrchestrator:
831
846
  )
832
847
  public.payload.update(inf)
833
848
  timings.inference_ms = now_ms() - _t0
849
+ if availability_final:
850
+ # Closed-set egress scrub, applied even though the lanes above are
851
+ # gated off: the payload has one last owner before serialization,
852
+ # and a lane added later must hit this wall, not the wire.
853
+ public.payload = enforce_availability_inference_contract(public.payload)
834
854
 
835
855
  public_dict = public.to_dict()
836
856
  # Declared, never silent: every turn says what resolution actually applied and
@@ -186,6 +186,110 @@
186
186
  "canonical_address_book"
187
187
  ]
188
188
  },
189
+ {
190
+ "scope_id": "facts:read",
191
+ "description": "Derived facts about the owner from standard packs (work, interests, preferences, places, behavior): predicate/value pairs with validity windows. Excludes special-class packs \u2014 health, inner-state and finances live behind facts_sensitive:read.",
192
+ "example_questions": [
193
+ "What do the derivation packs know about my work?",
194
+ "Which projects am I recorded as pursuing?",
195
+ "What are my stated preferences?"
196
+ ],
197
+ "primary_dimensions": [
198
+ "Profile"
199
+ ],
200
+ "raw_tables": [],
201
+ "canonical_tables": [],
202
+ "signal_objects": [
203
+ "fact"
204
+ ],
205
+ "summary_objects": [
206
+ "fact"
207
+ ],
208
+ "inference_objects": [
209
+ "fact"
210
+ ],
211
+ "default_mode_ceiling": "inference",
212
+ "implementation_status": "stub",
213
+ "fact_classes": [
214
+ "standard"
215
+ ]
216
+ },
217
+ {
218
+ "scope_id": "facts_sensitive:read",
219
+ "description": "Derived facts from special-class packs: health, inner state (mind.*), and finances (money.*). Split from facts:read so a grant can carry everyday facts without carrying these; mirrors the engine's facts vs facts_all packet distinction.",
220
+ "example_questions": [
221
+ "What medications am I recorded as taking?",
222
+ "What does the pack record about my reported state?"
223
+ ],
224
+ "primary_dimensions": [
225
+ "Profile"
226
+ ],
227
+ "raw_tables": [],
228
+ "canonical_tables": [],
229
+ "signal_objects": [
230
+ "fact"
231
+ ],
232
+ "summary_objects": [
233
+ "fact"
234
+ ],
235
+ "inference_objects": [
236
+ "fact"
237
+ ],
238
+ "default_mode_ceiling": "inference",
239
+ "implementation_status": "stub",
240
+ "fact_classes": [
241
+ "special"
242
+ ]
243
+ },
244
+ {
245
+ "scope_id": "goals:read",
246
+ "description": "Stated and derived goals: the user_goals store and Goal signal objects, with their dates and status. Aspirations are sensitive; answers are summaries and bands, not raw dumps.",
247
+ "example_questions": [
248
+ "What goals have I set this quarter?",
249
+ "Which goals went quiet?"
250
+ ],
251
+ "primary_dimensions": [
252
+ "Profile"
253
+ ],
254
+ "raw_tables": [],
255
+ "canonical_tables": [
256
+ "user_goals"
257
+ ],
258
+ "signal_objects": [
259
+ "Goal",
260
+ "user_goals"
261
+ ],
262
+ "summary_objects": [
263
+ "Goal"
264
+ ],
265
+ "inference_objects": [
266
+ "Goal"
267
+ ],
268
+ "default_mode_ceiling": "inference",
269
+ "implementation_status": "stub"
270
+ },
271
+ {
272
+ "scope_id": "graph:read",
273
+ "description": "The entity graph: people, projects, places and topics as nodes, and the derived relations between them (communicates_with, co_occurrence, pursues, participates_in, located_at). Structure and strength, resolved through aliases; not message text.",
274
+ "example_questions": [
275
+ "Who is connected to this project?",
276
+ "What links me to this person?",
277
+ "Which people bridge my communities?"
278
+ ],
279
+ "primary_dimensions": [
280
+ "Relationships"
281
+ ],
282
+ "raw_tables": [
283
+ "entities",
284
+ "entity_edges"
285
+ ],
286
+ "canonical_tables": [],
287
+ "signal_objects": [],
288
+ "summary_objects": [],
289
+ "inference_objects": [],
290
+ "default_mode_ceiling": "raw",
291
+ "implementation_status": "stub"
292
+ },
189
293
  {
190
294
  "scope_id": "health:read",
191
295
  "description": "Wellbeing signals from journal entries and role-filtered message emotions: moods, wellness summaries, and wellness scores.",
@@ -381,6 +485,31 @@
381
485
  "calendar_stub"
382
486
  ]
383
487
  },
488
+ {
489
+ "scope_id": "topics:read",
490
+ "description": "Derived topic clusters and their membership: what themes the owner's activity organizes into, by dimension. Labels and counts; member pointers stay on the node.",
491
+ "example_questions": [
492
+ "What themes does my work cluster into?",
493
+ "How big is each interest cluster?"
494
+ ],
495
+ "primary_dimensions": [
496
+ "Interests"
497
+ ],
498
+ "raw_tables": [],
499
+ "canonical_tables": [
500
+ "topic_clusters",
501
+ "topic_cluster_members"
502
+ ],
503
+ "signal_objects": [
504
+ "message_topics"
505
+ ],
506
+ "summary_objects": [
507
+ "message_topics"
508
+ ],
509
+ "inference_objects": [],
510
+ "default_mode_ceiling": "summary",
511
+ "implementation_status": "stub"
512
+ },
384
513
  {
385
514
  "scope_id": "work_context:read",
386
515
  "description": "Work goals and context: roles, skills and employment history from profile records, plus goals extracted from AI conversations and owner journals.",
@@ -32,6 +32,17 @@ BUNDLED_CANONICAL_TRIPLES: Dict[str, Tuple[str, str]] = {
32
32
  "gcal.events.v1": ("google_calendar", "schedule"),
33
33
  }
34
34
 
35
+ # Known drift variants of bundled schema ids, seen in the wild: a 2026-07
36
+ # operator install template invented "gdrive.files.v1" (the bundled id is
37
+ # "gdrive.file.v1"). Deliberately NOT keys of BUNDLED_CANONICAL_TRIPLES: an
38
+ # exact key makes normalize_canonical_source_payload raise and rehydrate
39
+ # demote, and the live drive_files install carries this schema with no bundled
40
+ # replacement to fall back to — enforcement would orphan a working connector.
41
+ # Callers use bundled_schema_drift() and decide per source_id.
42
+ BUNDLED_SCHEMA_ALIASES: Dict[str, str] = {
43
+ "gdrive.files.v1": "gdrive.file.v1",
44
+ }
45
+
35
46
  VALID_CANONICAL_GROUP_IDS = frozenset(
36
47
  {
37
48
  "ai_messages",
@@ -97,6 +108,32 @@ def bundled_lane_conflict(payload: Dict[str, Any]) -> Optional[str]:
97
108
  )
98
109
 
99
110
 
111
+ def bundled_schema_drift(payload: Dict[str, Any]) -> Optional[str]:
112
+ """Reason when the payload's schema is a drift variant of a bundled id and
113
+ its declared lane contradicts the bundled triple, else None.
114
+
115
+ Advisory, unlike bundled_lane_conflict: the caller decides whether the row
116
+ can be retired (its source_id has a bundled replacement) or only reported.
117
+ """
118
+ group_id = str(payload.get("canonical_group_id") or "").strip()
119
+ if not group_id:
120
+ return None
121
+ for key in (
122
+ str(payload.get("schema_id") or "").strip(),
123
+ str(payload.get("parser_id") or "").strip(),
124
+ ):
125
+ bundled_key = BUNDLED_SCHEMA_ALIASES.get(key)
126
+ if not bundled_key:
127
+ continue
128
+ _, bundled_lane = BUNDLED_CANONICAL_TRIPLES[bundled_key]
129
+ if group_id != bundled_lane:
130
+ return (
131
+ f"schema {key!r} is a drift variant of bundled {bundled_key!r} and "
132
+ f"canonical_group_id {group_id!r} contradicts bundled lane {bundled_lane!r}"
133
+ )
134
+ return None
135
+
136
+
100
137
  def normalize_canonical_source_payload(payload: Dict[str, Any]) -> Dict[str, Any]:
101
138
  """
102
139
  Fill bundled canonical_mapper_id from schema/parser; drop deprecated connected flag.
@@ -8,7 +8,7 @@ import uuid
8
8
  from contextlib import contextmanager
9
9
  from dataclasses import dataclass
10
10
  from datetime import datetime, timezone
11
- from typing import Any, Dict, Iterator, List, Optional, Tuple
11
+ from typing import Any, Dict, Iterator, List, Optional, Set, Tuple
12
12
 
13
13
  from ..config.settings import settings
14
14
  from ..core.state import get_db_connection
@@ -16,7 +16,7 @@ from ..enrichment.jobs import CANONICAL_JOBS, RAW_JOBS
16
16
  from ..ingestion.parsers import PARSER_REGISTRY
17
17
  from ..storage.db.postgres import connect_postgres, execute_query, fetch_all, fetch_one
18
18
  from ..storage.db.write_gate import commit_connection, with_db_write
19
- from .bundled_canonical_triples import bundled_lane_conflict
19
+ from .bundled_canonical_triples import bundled_lane_conflict, bundled_schema_drift
20
20
  from .runtime_install import RuntimeInstallHandle, install_source_definition
21
21
  from .scrub_attribution import scrub_attributed_rows
22
22
 
@@ -924,6 +924,68 @@ def _is_rehydratable_source_definition(source_def: Dict[str, Any]) -> bool:
924
924
  return source_kind_from_payload(source_def) == SOURCE_KIND_INGESTION
925
925
 
926
926
 
927
+ # drive_files is gdrive_files republished under a new source id — the runtime
928
+ # definitions are identical except source_id — so an active drive_files install
929
+ # proves a legacy-scope gdrive_files row is retired, not merely missing.
930
+ _LEGACY_SOURCE_SUCCESSORS: Dict[str, str] = {"gdrive_files": "drive_files"}
931
+
932
+ _LEGACY_DATASET_SEGMENT = "default"
933
+ _CANONICAL_DATASET_SEGMENT = "topos"
934
+
935
+
936
+ def _dataset_scope_segment(scope: Dict[str, str]) -> str:
937
+ parts = str(scope.get("dataset_id") or "").split(":")
938
+ return parts[1] if len(parts) == 3 else ""
939
+
940
+
941
+ def _canonical_active_index(records: List[InstallRecord]) -> Set[Tuple[str, str, str]]:
942
+ """(user_id, topos_id, source_id) for active installs under the canonical
943
+ {owner}:topos:{topos_id} dataset scope."""
944
+ index: Set[Tuple[str, str, str]] = set()
945
+ for rec in records:
946
+ scope = _normalize_scope(rec.scope)
947
+ if _dataset_scope_segment(scope) != _CANONICAL_DATASET_SEGMENT:
948
+ continue
949
+ if scope["user_id"] == "*" or scope["topos_id"] == "*":
950
+ continue
951
+ index.add((scope["user_id"], scope["topos_id"], rec.source_id))
952
+ return index
953
+
954
+
955
+ def _has_bundled_replacement(source_id: str) -> bool:
956
+ """True when the engine ships a bundled definition for this source_id, so
957
+ retiring its runtime install row leaves the source available."""
958
+ from .registry import BUNDLED_REGISTRY
959
+
960
+ return str(source_id or "").strip() in BUNDLED_REGISTRY
961
+
962
+
963
+ def _legacy_scope_superseded_reason(
964
+ rec: InstallRecord, canonical_active: Set[Tuple[str, str, str]]
965
+ ) -> Optional[str]:
966
+ """Reason to retire an active legacy {owner}:default:{key-hash} scope row, or None.
967
+
968
+ Readers query the canonical {owner}:topos:{topos_id} scope only, so a legacy
969
+ row duplicated there is dead weight — and poison for any reader that ever
970
+ matches the legacy scope, which would see a partial install list. Demote only
971
+ when an active canonical row proves the same install is live for the same
972
+ user+topos, under the same source_id or its declared successor.
973
+ """
974
+ scope = _normalize_scope(rec.scope)
975
+ if _dataset_scope_segment(scope) != _LEGACY_DATASET_SEGMENT:
976
+ return None
977
+ if scope["user_id"] == "*" or scope["topos_id"] == "*":
978
+ return None
979
+ candidates = [rec.source_id]
980
+ successor = _LEGACY_SOURCE_SUCCESSORS.get(rec.source_id)
981
+ if successor:
982
+ candidates.append(successor)
983
+ for sid in candidates:
984
+ if (scope["user_id"], scope["topos_id"], sid) in canonical_active:
985
+ return f"legacy dataset scope superseded by active canonical-scope install source_id={sid}"
986
+ return None
987
+
988
+
927
989
  def _supersede_install(*, scope_key: str, source_id: str, reason: str) -> None:
928
990
  """Retire an active install row that can never install again.
929
991
 
@@ -955,12 +1017,22 @@ def rehydrate_active_installs_runtime(*, source_id: Optional[str] = None) -> Dic
955
1017
  """
956
1018
  ensure_install_schema()
957
1019
  records = [rec for rec in list_installs(source_id=source_id) if rec.is_active]
1020
+ # Successor demotion (gdrive_files -> drive_files) must see peers that a
1021
+ # source_id-filtered listing excludes.
1022
+ peers = records if source_id is None else [rec for rec in list_installs() if rec.is_active]
1023
+ canonical_active = _canonical_active_index(peers)
958
1024
  rehydrated = 0
959
1025
  failed = 0
960
1026
  # (scope_key, source_id, reason) for rows retired after the locked pass.
961
1027
  superseded: List[Tuple[str, str, str]] = []
962
1028
  with _LOCK:
963
1029
  for rec in records:
1030
+ # Before contract checks: a legacy-scope duplicate retires even if
1031
+ # its stored definition is stale or incomplete.
1032
+ legacy_reason = _legacy_scope_superseded_reason(rec, canonical_active)
1033
+ if legacy_reason:
1034
+ superseded.append((_scope_key(rec.scope), rec.source_id, legacy_reason))
1035
+ continue
964
1036
  source_def = rec.source_definition_json if isinstance(rec.source_definition_json, dict) else {}
965
1037
  if not source_def:
966
1038
  continue
@@ -974,9 +1046,13 @@ def rehydrate_active_installs_runtime(*, source_id: Optional[str] = None) -> Dic
974
1046
  # A runtime install predating the bundled source keeps a lane the
975
1047
  # bundled triple contradicts. Retrying it warns on every sources
976
1048
  # list; the bundled definition wins, so retire the row instead.
1049
+ # A drift-variant schema (BUNDLED_SCHEMA_ALIASES) retires the same
1050
+ # way only when the engine bundles a replacement for the source_id;
1051
+ # otherwise retiring would orphan a live connector.
977
1052
  conflict = bundled_lane_conflict(source_def)
978
- if conflict:
979
- superseded.append((_scope_key(rec.scope), rec.source_id, conflict))
1053
+ drift = None if conflict else bundled_schema_drift(source_def)
1054
+ if conflict or (drift and _has_bundled_replacement(rec.source_id)):
1055
+ superseded.append((_scope_key(rec.scope), rec.source_id, conflict or drift))
980
1056
  continue
981
1057
  try:
982
1058
  scope_key = _scope_key(rec.scope)
@@ -992,6 +1068,12 @@ def rehydrate_active_installs_runtime(*, source_id: Optional[str] = None) -> Dic
992
1068
  runtime_missing = runtime_key not in _ACTIVE_HANDLES or any(parser_id not in PARSER_REGISTRY for parser_id in parser_ids)
993
1069
  if not runtime_missing:
994
1070
  continue
1071
+ if drift:
1072
+ logger.warning(
1073
+ "Tolerating bundled-schema drift on active install (no bundled replacement): source_id=%s %s",
1074
+ rec.source_id,
1075
+ drift,
1076
+ )
995
1077
  _ACTIVE_HANDLES[runtime_key] = install_source_definition(source_def)
996
1078
  rehydrated += 1
997
1079
  except Exception as exc: # noqa: BLE001
@@ -757,6 +757,12 @@
757
757
  "steps": [],
758
758
  "notes": []
759
759
  },
760
+ {
761
+ "version": "1.3.42",
762
+ "summary": "Release 1.3.42.",
763
+ "steps": [],
764
+ "notes": []
765
+ },
760
766
  {
761
767
  "version": "unreleased",
762
768
  "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.41
3
+ Version: 1.3.42
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