topos-node 1.5.0__tar.gz → 1.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (913) hide show
  1. {topos_node-1.5.0/topos_node.egg-info → topos_node-1.5.2}/PKG-INFO +1 -1
  2. {topos_node-1.5.0 → topos_node-1.5.2}/pyproject.toml +1 -1
  3. {topos_node-1.5.0 → topos_node-1.5.2}/topos/__version__.py +2 -2
  4. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole.py +92 -7
  5. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole_guard.py +39 -7
  6. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole_llm.py +56 -6
  7. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_checks.py +96 -9
  8. topos_node-1.5.2/topos/permissions_v2/answer_gate.py +48 -0
  9. topos_node-1.5.2/topos/permissions_v2/answer_generation.py +423 -0
  10. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_release.py +40 -15
  11. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/automatic_message_review.py +57 -16
  12. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/entity_boundary.py +88 -7
  13. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/index_rebuilds.py +116 -9
  14. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_relabel.py +3 -0
  15. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_review.py +3 -0
  16. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/message_evidence.py +58 -9
  17. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/refresh_loop.py +9 -1
  18. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_release.py +22 -2
  19. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/pipeline.py +4 -0
  20. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/retrieval.py +65 -16
  21. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/turn_classifier.py +24 -2
  22. {topos_node-1.5.0 → topos_node-1.5.2}/topos/upgrades/manifests.json +18 -0
  23. {topos_node-1.5.0 → topos_node-1.5.2/topos_node.egg-info}/PKG-INFO +1 -1
  24. {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/SOURCES.txt +1 -0
  25. topos_node-1.5.0/topos/permissions_v2/answer_generation.py +0 -184
  26. {topos_node-1.5.0 → topos_node-1.5.2}/LICENSE +0 -0
  27. {topos_node-1.5.0 → topos_node-1.5.2}/MANIFEST.in +0 -0
  28. {topos_node-1.5.0 → topos_node-1.5.2}/README.md +0 -0
  29. {topos_node-1.5.0 → topos_node-1.5.2}/setup.cfg +0 -0
  30. {topos_node-1.5.0 → topos_node-1.5.2}/shared/__init__.py +0 -0
  31. {topos_node-1.5.0 → topos_node-1.5.2}/shared/filtering.py +0 -0
  32. {topos_node-1.5.0 → topos_node-1.5.2}/shared/schema_registry.py +0 -0
  33. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_active_database_binding.py +0 -0
  34. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_active_ingestion_binding.py +0 -0
  35. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_app_relay_wiring.py +0 -0
  36. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_extensions.py +0 -0
  37. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_gate_leg_hermeticity.py +0 -0
  38. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_hub_pipeline_offline_first.py +0 -0
  39. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_lane_shards.py +0 -0
  40. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_llm_integrations_storage.py +0 -0
  41. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_local_gate_composition.py +0 -0
  42. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_owner_database_hermeticity.py +0 -0
  43. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_prewarm_first_run.py +0 -0
  44. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_profile_hygiene.py +0 -0
  45. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_profiles.py +0 -0
  46. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_protocol_handled_types.py +0 -0
  47. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_query_field_contract.py +0 -0
  48. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_sync_dep_pins.py +0 -0
  49. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_system_computer_name.py +0 -0
  50. {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_topos_home_hermeticity.py +0 -0
  51. {topos_node-1.5.0 → topos_node-1.5.2}/topos/__init__.py +0 -0
  52. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/__init__.py +0 -0
  53. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/dataset_resolution.py +0 -0
  54. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/duckdb_adapter.py +0 -0
  55. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/luck_surface.py +0 -0
  56. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_communities.py +0 -0
  57. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_directed.py +0 -0
  58. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_graph.py +0 -0
  59. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_labels.py +0 -0
  60. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/person_graph.py +0 -0
  61. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/person_overlay.py +0 -0
  62. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/profiles.py +0 -0
  63. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/query_engine.py +0 -0
  64. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/raw_queries.py +0 -0
  65. {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/relationship_reads.py +0 -0
  66. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/__init__.py +0 -0
  67. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/analytics.py +0 -0
  68. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/app_registry.py +0 -0
  69. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/backup.py +0 -0
  70. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/community_naming_config.py +0 -0
  71. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/compute_remote.py +0 -0
  72. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/connected_apps.py +0 -0
  73. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/conversation_context.py +0 -0
  74. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/data_commit.py +0 -0
  75. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/data_explorer_table_prefs.py +0 -0
  76. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/database_explorer.py +0 -0
  77. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/db.py +0 -0
  78. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/device.py +0 -0
  79. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/disk_space_config.py +0 -0
  80. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/engine_run.py +0 -0
  81. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/enrichment.py +0 -0
  82. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/enrichment_lab.py +0 -0
  83. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/facts_llm_config.py +0 -0
  84. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/filter_lab.py +0 -0
  85. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/health.py +0 -0
  86. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/home_chat.py +0 -0
  87. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ingestion_api.py +0 -0
  88. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ingestion_compat.py +0 -0
  89. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ingestion_sources.py +0 -0
  90. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/intelligence_lifecycle.py +0 -0
  91. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/llm.py +0 -0
  92. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/local_mcp.py +0 -0
  93. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/messenger_analytics.py +0 -0
  94. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/nsfw_maintenance.py +0 -0
  95. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_ai_chat_capture.py +0 -0
  96. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_capture_receipts.py +0 -0
  97. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_identity.py +0 -0
  98. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_ingestion.py +0 -0
  99. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_native_probe.py +0 -0
  100. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_search_maintenance.py +0 -0
  101. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_source_installs.py +0 -0
  102. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/privacy_disclose.py +0 -0
  103. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/query_api.py +0 -0
  104. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/runtime_bootstrap.py +0 -0
  105. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sanitization_ollama_config.py +0 -0
  106. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/shell.py +0 -0
  107. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/signal.py +0 -0
  108. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/signal_extraction_config.py +0 -0
  109. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/source_install.py +0 -0
  110. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/source_retention.py +0 -0
  111. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/source_scrub.py +0 -0
  112. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sources.py +0 -0
  113. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sources_overview.py +0 -0
  114. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sync.py +0 -0
  115. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/tool_index.py +0 -0
  116. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ui_config.py +0 -0
  117. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/upgrades.py +0 -0
  118. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/usage.py +0 -0
  119. {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/user_identity.py +0 -0
  120. {topos_node-1.5.0 → topos_node-1.5.2}/topos/app.py +0 -0
  121. {topos_node-1.5.0 → topos_node-1.5.2}/topos/auth.py +0 -0
  122. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/__init__.py +0 -0
  123. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/declared_field_map.py +0 -0
  124. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/__init__.py +0 -0
  125. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/base.py +0 -0
  126. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  127. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  128. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  129. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  130. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  131. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  132. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  133. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  134. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
  135. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/models.py +0 -0
  136. {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/resolver.py +0 -0
  137. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/__init__.py +0 -0
  138. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/__main__.py +0 -0
  139. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/assets/topos_black.png +0 -0
  140. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/assets/topos_blk_rounded.png +0 -0
  141. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/assets/topos_white.png +0 -0
  142. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/commands.py +0 -0
  143. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/profile_cmd.py +0 -0
  144. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/reprocess_cmd.py +0 -0
  145. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/setup_models_cmd.py +0 -0
  146. {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/tray.py +0 -0
  147. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/__init__.py +0 -0
  148. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/conversation_context_llm.py +0 -0
  149. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/facts_llm.py +0 -0
  150. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/local_model_builds.py +0 -0
  151. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/model_packs.py +0 -0
  152. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/node_function_providers.py +0 -0
  153. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/sanitization_ollama.py +0 -0
  154. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/settings.py +0 -0
  155. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/signal_extraction.py +0 -0
  156. {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/uvicorn_logging.json +0 -0
  157. {topos_node-1.5.0 → topos_node-1.5.2}/topos/contacts/__init__.py +0 -0
  158. {topos_node-1.5.0 → topos_node-1.5.2}/topos/contacts/identity.py +0 -0
  159. {topos_node-1.5.0 → topos_node-1.5.2}/topos/control_plane_client.py +0 -0
  160. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/__init__.py +0 -0
  161. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/api_models.py +0 -0
  162. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/connection_resilience.py +0 -0
  163. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/db_health.py +0 -0
  164. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/device_helpers.py +0 -0
  165. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/errors.py +0 -0
  166. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/events.py +0 -0
  167. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/__init__.py +0 -0
  168. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/aggregate.py +0 -0
  169. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/common.py +0 -0
  170. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/complexity.py +0 -0
  171. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/config.py +0 -0
  172. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/contacts_import.py +0 -0
  173. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/database_explorer.py +0 -0
  174. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/derivation.py +0 -0
  175. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/device.py +0 -0
  176. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/enrichment.py +0 -0
  177. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/enrichment_lab.py +0 -0
  178. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/filter_lab.py +0 -0
  179. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/graph_query.py +0 -0
  180. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/graph_summary.py +0 -0
  181. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/home_chat.py +0 -0
  182. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/ingest.py +0 -0
  183. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/mcp_client_elevations.py +0 -0
  184. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/mcp_clients.py +0 -0
  185. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/messages.py +0 -0
  186. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/messenger_analytics.py +0 -0
  187. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2.py +0 -0
  188. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_bind.py +0 -0
  189. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_identity.py +0 -0
  190. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
  191. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_owner.py +0 -0
  192. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_release.py +0 -0
  193. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/query.py +0 -0
  194. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/registry.py +0 -0
  195. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/routines.py +0 -0
  196. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/signal_features.py +0 -0
  197. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/sources.py +0 -0
  198. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/timeline_daily.py +0 -0
  199. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/tool_index.py +0 -0
  200. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/logging.py +0 -0
  201. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/metrics.py +0 -0
  202. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/routine_access.py +0 -0
  203. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/startup_banner.py +0 -0
  204. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/state.py +0 -0
  205. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/table_layers.py +0 -0
  206. {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/types.py +0 -0
  207. {topos_node-1.5.0 → topos_node-1.5.2}/topos/data_explorer_row_delete.py +0 -0
  208. {topos_node-1.5.0 → topos_node-1.5.2}/topos/data_explorer_table_prefs.py +0 -0
  209. {topos_node-1.5.0 → topos_node-1.5.2}/topos/data_explorer_tables.py +0 -0
  210. {topos_node-1.5.0 → topos_node-1.5.2}/topos/defaults.py +0 -0
  211. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/__init__.py +0 -0
  212. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/canonical_writer.py +0 -0
  213. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/content_policy.py +0 -0
  214. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/disclosure_sweep.py +0 -0
  215. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/field_registry.py +0 -0
  216. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/nsfw_tags.py +0 -0
  217. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/privacy_layer.py +0 -0
  218. {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/tier.py +0 -0
  219. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/__init__.py +0 -0
  220. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/__init__.py +0 -0
  221. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/base.py +0 -0
  222. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/generative_prompts.py +0 -0
  223. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/generative_response.py +0 -0
  224. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/huggingface.py +0 -0
  225. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/ollama.py +0 -0
  226. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/openai.py +0 -0
  227. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/openai_compatible.py +0 -0
  228. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/redpill.py +0 -0
  229. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/stub.py +0 -0
  230. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/client.py +0 -0
  231. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/disk_space.py +0 -0
  232. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/engine.py +0 -0
  233. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/hosted_llm_wallet.py +0 -0
  234. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/intake.py +0 -0
  235. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/memory_utils.py +0 -0
  236. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/model_cache.py +0 -0
  237. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/model_manager.py +0 -0
  238. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_install.py +0 -0
  239. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_pull.py +0 -0
  240. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_runtime.py +0 -0
  241. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_setup_guidance.py +0 -0
  242. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/pipeline_memory.py +0 -0
  243. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/queue_manager.py +0 -0
  244. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/registration.py +0 -0
  245. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/result_formatter.py +0 -0
  246. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/router.py +0 -0
  247. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/scoped_token.py +0 -0
  248. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/tasks.py +0 -0
  249. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/torch_runtime.py +0 -0
  250. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/transport.py +0 -0
  251. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/usage_guard.py +0 -0
  252. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/usage_observation.py +0 -0
  253. {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/validator.py +0 -0
  254. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/__init__.py +0 -0
  255. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/catalog.py +0 -0
  256. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/derivation_recovery.py +0 -0
  257. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/derived_tables.py +0 -0
  258. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/job_readiness.py +0 -0
  259. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/job_writer.py +0 -0
  260. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/__init__.py +0 -0
  261. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/base.py +0 -0
  262. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  263. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  264. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  265. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  266. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  267. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  268. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  269. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  270. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  271. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  272. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  273. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  274. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  275. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  276. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  277. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  278. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  279. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  280. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  281. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  282. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  283. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  284. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
  285. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  286. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
  287. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  288. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  289. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/model_overrides.py +0 -0
  290. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/__init__.py +0 -0
  291. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/manager.py +0 -0
  292. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/mvp_defaults.py +0 -0
  293. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/registry.py +0 -0
  294. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/versioning.py +0 -0
  295. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/orchestrator.py +0 -0
  296. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/pipeline_activity.py +0 -0
  297. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/processor.py +0 -0
  298. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/progress_bar.py +0 -0
  299. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/record_progress.py +0 -0
  300. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/registry_contract.py +0 -0
  301. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/signal_derivation_config.json +0 -0
  302. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/source_overrides.py +0 -0
  303. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/__init__.py +0 -0
  304. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/bundles.py +0 -0
  305. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/model_resolve.py +0 -0
  306. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/schema.py +0 -0
  307. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/service.py +0 -0
  308. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/store.py +0 -0
  309. {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/worker.py +0 -0
  310. {topos_node-1.5.0 → topos_node-1.5.2}/topos/evals/__init__.py +0 -0
  311. {topos_node-1.5.0 → topos_node-1.5.2}/topos/evals/enrichment_eval.py +0 -0
  312. {topos_node-1.5.0 → topos_node-1.5.2}/topos/extensions.py +0 -0
  313. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/__init__.py +0 -0
  314. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/canonical.py +0 -0
  315. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/engine.py +0 -0
  316. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/entropy.py +0 -0
  317. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/focus.py +0 -0
  318. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/graph_metrics.py +0 -0
  319. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/influence.py +0 -0
  320. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/projection.py +0 -0
  321. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/snapshots.py +0 -0
  322. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/store.py +0 -0
  323. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/topic_merge.py +0 -0
  324. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/topics.py +0 -0
  325. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/topics_daily.py +0 -0
  326. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/volatility.py +0 -0
  327. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/__init__.py +0 -0
  328. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  329. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  330. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  331. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  332. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  333. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  334. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  335. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  336. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  337. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  338. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  339. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  340. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  341. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  342. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  343. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  344. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  345. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  346. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  347. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  348. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  349. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
  350. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  351. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  352. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  353. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  354. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  355. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  356. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  357. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  358. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  359. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  360. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  361. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  362. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  363. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  364. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  365. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/candidates.py +0 -0
  366. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/commitments.py +0 -0
  367. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/guard.py +0 -0
  368. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/kernels.py +0 -0
  369. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/net_subject_policy.py +0 -0
  370. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/packs.py +0 -0
  371. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/person_bridge.py +0 -0
  372. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/person_reading.py +0 -0
  373. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/prefilter.py +0 -0
  374. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/registry.py +0 -0
  375. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/report_card.py +0 -0
  376. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/router.py +0 -0
  377. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/social_bench.py +0 -0
  378. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/social_kernels.py +0 -0
  379. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/surfaces.py +0 -0
  380. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/synthesize.py +0 -0
  381. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/template.py +0 -0
  382. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/verify.py +0 -0
  383. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/writer.py +0 -0
  384. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/__init__.py +0 -0
  385. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/affinity.py +0 -0
  386. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/affinity_owner.py +0 -0
  387. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/affinity_quality.py +0 -0
  388. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/chatgpt_declared.py +0 -0
  389. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/community_names.py +0 -0
  390. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/community_naming.py +0 -0
  391. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/consolidation.py +0 -0
  392. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/context_vectors.py +0 -0
  393. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/cypher.py +0 -0
  394. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/declared_mappings.py +0 -0
  395. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/discourse_graph.py +0 -0
  396. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/dossier.py +0 -0
  397. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/edges.py +0 -0
  398. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/fact_materializer.py +0 -0
  399. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_enrichers.py +0 -0
  400. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_inputs.py +0 -0
  401. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_refresh.py +0 -0
  402. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_search.py +0 -0
  403. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/linking.py +0 -0
  404. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/maintenance.py +0 -0
  405. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/mention_lineage.py +0 -0
  406. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/mention_lineage_lane.py +0 -0
  407. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/owner.py +0 -0
  408. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/reads.py +0 -0
  409. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/rebuild_subprocess.py +0 -0
  410. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/resolver.py +0 -0
  411. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/structured_fields.py +0 -0
  412. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/__init__.py +0 -0
  413. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/evidence_time.py +0 -0
  414. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/extract.py +0 -0
  415. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/llm_extract.py +0 -0
  416. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/reactions.py +0 -0
  417. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/reads.py +0 -0
  418. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/store.py +0 -0
  419. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/verdicts.py +0 -0
  420. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/fit/evaluator.py +0 -0
  421. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/fit/opportunity_types.json +0 -0
  422. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/__init__.py +0 -0
  423. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  424. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/carry_diagnosis.py +0 -0
  425. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/contact_excludes.py +0 -0
  426. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/derived_scrub.py +0 -0
  427. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/exclusions.py +0 -0
  428. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/gc.py +0 -0
  429. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/off_limits_list.py +0 -0
  430. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/off_limits_view.py +0 -0
  431. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/record_protection.py +0 -0
  432. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/__init__.py +0 -0
  433. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/posture.py +0 -0
  434. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/roles.py +0 -0
  435. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/writer_class.py +0 -0
  436. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/__init__.py +0 -0
  437. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_canonical_loader.py +0 -0
  438. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_ontology.py +0 -0
  439. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_renderer.py +0 -0
  440. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_schemas.py +0 -0
  441. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/chunking.py +0 -0
  442. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/cluster_labels.py +0 -0
  443. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/conversation_context.py +0 -0
  444. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/conversation_windows.py +0 -0
  445. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/data_health.py +0 -0
  446. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  447. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/intentions.json +0 -0
  448. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/interests.json +0 -0
  449. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/memory.json +0 -0
  450. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/places.json +0 -0
  451. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/profile.json +0 -0
  452. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/relationships.json +0 -0
  453. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/resources.json +0 -0
  454. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  455. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/time.json +0 -0
  456. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/wellbeing.json +0 -0
  457. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/work.json +0 -0
  458. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/derived_index.py +0 -0
  459. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/derived_spec.py +0 -0
  460. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_briefs.py +0 -0
  461. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_definition_loader.py +0 -0
  462. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_profiles.py +0 -0
  463. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_registry.py +0 -0
  464. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/embed_context.py +0 -0
  465. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/extraction/artifact_router.py +0 -0
  466. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/extraction/artifact_store.py +0 -0
  467. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/extraction/rule_extractors.py +0 -0
  468. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/graph_sanitize.py +0 -0
  469. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/hybrid_search.py +0 -0
  470. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/incremental_clustering.py +0 -0
  471. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/model_recommendations.py +0 -0
  472. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/query_embed_cache.py +0 -0
  473. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/schemas.py +0 -0
  474. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/service.py +0 -0
  475. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/signal_object_store.py +0 -0
  476. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/source_hydration.py +0 -0
  477. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/structured_signal.py +0 -0
  478. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/tool_index.py +0 -0
  479. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/topic_clustering.py +0 -0
  480. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/aggregates.py +0 -0
  481. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/commitments.py +0 -0
  482. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/rhythm.py +0 -0
  483. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  484. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/vector_codec.py +0 -0
  485. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/vector_math.py +0 -0
  486. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/vector_settings.py +0 -0
  487. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/__init__.py +0 -0
  488. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/definitions.py +0 -0
  489. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/engine.py +0 -0
  490. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/fold.py +0 -0
  491. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/insights.py +0 -0
  492. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/temporal/__init__.py +0 -0
  493. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/temporal/points.py +0 -0
  494. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/temporal/records.py +0 -0
  495. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/timeline_projection.py +0 -0
  496. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/timeline_rollup.py +0 -0
  497. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/__init__.py +0 -0
  498. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/badges.py +0 -0
  499. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/daily.py +0 -0
  500. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/dashboard.py +0 -0
  501. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/instruments.py +0 -0
  502. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/intents.py +0 -0
  503. {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/readiness.py +0 -0
  504. {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/__init__.py +0 -0
  505. {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/bundles.py +0 -0
  506. {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/schema.py +0 -0
  507. {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/service.py +0 -0
  508. {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/store.py +0 -0
  509. {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/worker.py +0 -0
  510. {topos_node-1.5.0 → topos_node-1.5.2}/topos/home_chat/__init__.py +0 -0
  511. {topos_node-1.5.0 → topos_node-1.5.2}/topos/home_chat/schema.py +0 -0
  512. {topos_node-1.5.0 → topos_node-1.5.2}/topos/home_chat/store.py +0 -0
  513. {topos_node-1.5.0 → topos_node-1.5.2}/topos/hosted_pool_lease.py +0 -0
  514. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/__init__.py +0 -0
  515. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/canonical_pipeline.py +0 -0
  516. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/chatgpt_owner_snapshot.py +0 -0
  517. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/checkpoints/__init__.py +0 -0
  518. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  519. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  520. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/imessage_attributed_text.py +0 -0
  521. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/inbox_crypto.py +0 -0
  522. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/inbox_drain.py +0 -0
  523. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/ingest_helpers.py +0 -0
  524. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/jobs.py +0 -0
  525. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/journal_location_fanout.py +0 -0
  526. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/journal_time_log_normalize.py +0 -0
  527. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_exports.py +0 -0
  528. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_sync.py +0 -0
  529. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_sync_jobs.py +0 -0
  530. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_sync_schedule.py +0 -0
  531. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/log_preview.py +0 -0
  532. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/manager.py +0 -0
  533. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/owner_snapshot.py +0 -0
  534. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parser.py +0 -0
  535. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/__init__.py +0 -0
  536. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/base.py +0 -0
  537. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/browser_parser.py +0 -0
  538. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
  539. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  540. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  541. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  542. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  543. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/documents_parser.py +0 -0
  544. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  545. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  546. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/grok_parser.py +0 -0
  547. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
  548. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/transcript_parser.py +0 -0
  549. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  550. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/progress.py +0 -0
  551. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/reprocess.py +0 -0
  552. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/__init__.py +0 -0
  553. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/base.py +0 -0
  554. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/calendar.py +0 -0
  555. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/chatgpt.py +0 -0
  556. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/contact_importers.py +0 -0
  557. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/grok.py +0 -0
  558. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/imessage_reader.py +0 -0
  559. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
  560. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/signal_reader.py +0 -0
  561. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/state_machine.py +0 -0
  562. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/triggers/__init__.py +0 -0
  563. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/triggers/file_trigger.py +0 -0
  564. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  565. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  566. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/__init__.py +0 -0
  567. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/base.py +0 -0
  568. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/schema_registry.py +0 -0
  569. {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/schema_validator.py +0 -0
  570. {topos_node-1.5.0 → topos_node-1.5.2}/topos/lineage/__init__.py +0 -0
  571. {topos_node-1.5.0 → topos_node-1.5.2}/topos/lineage/provenance.py +0 -0
  572. {topos_node-1.5.0 → topos_node-1.5.2}/topos/lineage/tracker.py +0 -0
  573. {topos_node-1.5.0 → topos_node-1.5.2}/topos/llm_integrations_storage.py +0 -0
  574. {topos_node-1.5.0 → topos_node-1.5.2}/topos/mcp_clients.py +0 -0
  575. {topos_node-1.5.0 → topos_node-1.5.2}/topos/mcp_stdio_proxy.py +0 -0
  576. {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/__init__.py +0 -0
  577. {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/alerts.py +0 -0
  578. {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/metrics.py +0 -0
  579. {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/tracing.py +0 -0
  580. {topos_node-1.5.0 → topos_node-1.5.2}/topos/openai_client.py +0 -0
  581. {topos_node-1.5.0 → topos_node-1.5.2}/topos/owner_key.py +0 -0
  582. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/__init__.py +0 -0
  583. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ai_chat_capture.py +0 -0
  584. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_protocol.py +0 -0
  585. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_transport.py +0 -0
  586. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/automatic_review_worker.py +0 -0
  587. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/bind_protocol.py +0 -0
  588. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/canonical.py +0 -0
  589. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/canonical_floor.py +0 -0
  590. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/capture_receipts.py +0 -0
  591. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/chatgpt_coverage.py +0 -0
  592. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/checking_model.py +0 -0
  593. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/contract.py +0 -0
  594. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/english_short_words.py +0 -0
  595. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/entailment_grounding.py +0 -0
  596. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence.py +0 -0
  597. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_families.py +0 -0
  598. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_review_runtime.py +0 -0
  599. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_reviews.py +0 -0
  600. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_time.py +0 -0
  601. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/exclusion_floor.py +0 -0
  602. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_contract.py +0 -0
  603. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_eligibility.py +0 -0
  604. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_policy.py +0 -0
  605. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_projection.py +0 -0
  606. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/forwarding.py +0 -0
  607. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity.py +0 -0
  608. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity_attestation.py +0 -0
  609. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity_dispatch.py +0 -0
  610. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity_protocol.py +0 -0
  611. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/imessage_reconciliation.py +0 -0
  612. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/imessage_standing.py +0 -0
  613. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/inferred_facts.py +0 -0
  614. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_dispatch.py +0 -0
  615. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_protocol.py +0 -0
  616. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_provenance.py +0 -0
  617. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_snapshot_facts.py +0 -0
  618. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_family.py +0 -0
  619. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_index.py +0 -0
  620. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/journal_goal_field.py +0 -0
  621. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/knowledge_contract.py +0 -0
  622. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/knowledge_projections.py +0 -0
  623. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ledger.py +0 -0
  624. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ledger_retention.py +0 -0
  625. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/message_review_contract.py +0 -0
  626. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/native_claim_grounding.py +0 -0
  627. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/native_imessage_probe.py +0 -0
  628. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/node_protocol.py +0 -0
  629. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/opaque_ids.py +0 -0
  630. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ownership.py +0 -0
  631. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/permitted_derivation.py +0 -0
  632. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/predicate_classes.py +0 -0
  633. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/projection_review_runtime.py +0 -0
  634. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/projection_reviews.py +0 -0
  635. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/protection_clock.py +0 -0
  636. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/protection_doorbell.py +0 -0
  637. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/protocol.py +0 -0
  638. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/reconciliation_facts.py +0 -0
  639. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/reconciliation_provenance.py +0 -0
  640. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/registry.py +0 -0
  641. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/release.py +0 -0
  642. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/runtime.py +0 -0
  643. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_contract.py +0 -0
  644. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_index.py +0 -0
  645. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_lanes.py +0 -0
  646. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_timing.py +0 -0
  647. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_transport.py +0 -0
  648. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/self_bind.py +0 -0
  649. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/shadow_labeler_local.py +0 -0
  650. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
  651. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_catalog.py +0 -0
  652. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_counts.py +0 -0
  653. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_kinds.py +0 -0
  654. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_week.py +0 -0
  655. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/signing.py +0 -0
  656. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/snapshot_message_facts.py +0 -0
  657. {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/switches.py +0 -0
  658. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/__init__.py +0 -0
  659. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/audit.py +0 -0
  660. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/envelope.py +0 -0
  661. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/job_runner.py +0 -0
  662. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/job_secrets.py +0 -0
  663. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/job_store.py +0 -0
  664. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/stages.py +0 -0
  665. {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/stub_enqueue.py +0 -0
  666. {topos_node-1.5.0 → topos_node-1.5.2}/topos/principal.py +0 -0
  667. {topos_node-1.5.0 → topos_node-1.5.2}/topos/profiles.py +0 -0
  668. {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/__init__.py +0 -0
  669. {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/__init__.py +0 -0
  670. {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/base.py +0 -0
  671. {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/builders.py +0 -0
  672. {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/health_checks.py +0 -0
  673. {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/__init__.py +0 -0
  674. {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/handled_message_types.json +0 -0
  675. {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/narrowing_vocabulary.json +0 -0
  676. {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/query_field_contract.json +0 -0
  677. {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/retrieval_text_contract.json +0 -0
  678. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/__init__.py +0 -0
  679. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/aggregate.py +0 -0
  680. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/audit.py +0 -0
  681. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/closeness.py +0 -0
  682. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/collaborators.py +0 -0
  683. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/ddr.py +0 -0
  684. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/disclosure.py +0 -0
  685. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/entity_window.py +0 -0
  686. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/exclusion.py +0 -0
  687. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/facts_direct.py +0 -0
  688. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/fingerprint.py +0 -0
  689. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/game_layer.py +0 -0
  690. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/graph_lane.py +0 -0
  691. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/inference.py +0 -0
  692. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/intent.py +0 -0
  693. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/journal_event_lane.py +0 -0
  694. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/manifest.py +0 -0
  695. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/manifest_validation.py +0 -0
  696. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/narrowing.py +0 -0
  697. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/overheard.py +0 -0
  698. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/packet_resolution.py +0 -0
  699. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/planner.py +0 -0
  700. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/runtime.py +0 -0
  701. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_arbiter.py +0 -0
  702. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_classifier.py +0 -0
  703. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_head.py +0 -0
  704. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_registry.json +0 -0
  705. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_registry_loader.py +0 -0
  706. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_shadow.py +0 -0
  707. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/session.py +0 -0
  708. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/session_utils.py +0 -0
  709. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/source_generation.py +0 -0
  710. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/truth_door.py +0 -0
  711. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/truth_facts.py +0 -0
  712. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/truth_prompts.py +0 -0
  713. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/types.py +0 -0
  714. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/verify.py +0 -0
  715. {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/verify_modes.py +0 -0
  716. {topos_node-1.5.0 → topos_node-1.5.2}/topos/rate_limit.py +0 -0
  717. {topos_node-1.5.0 → topos_node-1.5.2}/topos/relay_stamp.py +0 -0
  718. {topos_node-1.5.0 → topos_node-1.5.2}/topos/routines/__init__.py +0 -0
  719. {topos_node-1.5.0 → topos_node-1.5.2}/topos/routines/schema.py +0 -0
  720. {topos_node-1.5.0 → topos_node-1.5.2}/topos/routines/store.py +0 -0
  721. {topos_node-1.5.0 → topos_node-1.5.2}/topos/runtime_housekeeping.py +0 -0
  722. {topos_node-1.5.0 → topos_node-1.5.2}/topos/runtime_shutdown.py +0 -0
  723. {topos_node-1.5.0 → topos_node-1.5.2}/topos/runtime_update.py +0 -0
  724. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/__init__.py +0 -0
  725. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/explicit_wording.py +0 -0
  726. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/hub_pipeline.py +0 -0
  727. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/nsfw_classifier.py +0 -0
  728. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/ollama_transforms.py +0 -0
  729. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/prewarm.py +0 -0
  730. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/privacy_filter.py +0 -0
  731. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/__init__.py +0 -0
  732. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/container.py +0 -0
  733. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/__init__.py +0 -0
  734. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/base.py +0 -0
  735. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/local.py +0 -0
  736. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/remote.py +0 -0
  737. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/interfaces.py +0 -0
  738. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/llm/__init__.py +0 -0
  739. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/llm/base.py +0 -0
  740. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/llm/openai.py +0 -0
  741. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/local.py +0 -0
  742. {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/postgres.py +0 -0
  743. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/__init__.py +0 -0
  744. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/bundled_canonical_triples.py +0 -0
  745. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/canonical_signal_defaults.py +0 -0
  746. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/declared_field_map_spec.py +0 -0
  747. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/definitions.py +0 -0
  748. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/install_authority.py +0 -0
  749. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/install_maintenance.py +0 -0
  750. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/install_service.py +0 -0
  751. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/registry.py +0 -0
  752. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/retention.py +0 -0
  753. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/runtime_install.py +0 -0
  754. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/scrub_attribution.py +0 -0
  755. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/scrub_service.py +0 -0
  756. {topos_node-1.5.0 → topos_node-1.5.2}/topos/startup_banner.py +0 -0
  757. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/__init__.py +0 -0
  758. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/__init__.py +0 -0
  759. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/factory.py +0 -0
  760. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/fakes.py +0 -0
  761. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/postgres/stores.py +0 -0
  762. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/protocols.py +0 -0
  763. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/sqlite/__init__.py +0 -0
  764. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/sqlite/stores.py +0 -0
  765. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  766. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/__init__.py +0 -0
  767. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/activity_tables.py +0 -0
  768. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  769. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  770. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  771. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/model.py +0 -0
  772. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
  773. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  774. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/canonical_store.py +0 -0
  775. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/conversations_tables.py +0 -0
  776. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/journal_repair.py +0 -0
  777. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/mapping_store.py +0 -0
  778. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/postgres.py +0 -0
  779. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/__init__.py +0 -0
  780. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/client.py +0 -0
  781. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/connection_tuning.py +0 -0
  782. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/__init__.py +0 -0
  783. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  784. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/activity_writer_columns_v1.py +0 -0
  785. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  786. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  787. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  788. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  789. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/backup.py +0 -0
  790. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/backup_custody.py +0 -0
  791. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  792. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  793. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  794. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  795. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/community_names_v1.py +0 -0
  796. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/complexity_v1.py +0 -0
  797. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  798. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  799. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  800. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  801. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  802. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  803. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/documents_v1.py +0 -0
  804. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  805. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  806. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  807. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  808. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  809. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  810. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  811. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  812. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  813. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  814. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  815. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/episodes_v1.py +0 -0
  816. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  817. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  818. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  819. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  820. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  821. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  822. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  823. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  824. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  825. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  826. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  827. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  828. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/off_limits_carried_waiting_v1.py +0 -0
  829. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
  830. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  831. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
  832. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
  833. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
  834. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  835. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  836. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/registry.py +0 -0
  837. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/registry_checksums.json +0 -0
  838. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  839. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  840. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  841. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  842. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  843. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_objects.py +0 -0
  844. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  845. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  846. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  847. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  848. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
  849. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/transcripts_v1.py +0 -0
  850. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  851. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  852. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  853. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  854. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  855. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  856. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  857. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  858. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  859. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  860. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  861. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  862. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  863. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  864. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  865. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  866. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  867. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  868. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/paths.py +0 -0
  869. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/postgres.py +0 -0
  870. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/schema.py +0 -0
  871. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/schema_probe.py +0 -0
  872. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/storage_breakdown.py +0 -0
  873. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/write_gate.py +0 -0
  874. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/derived_row_identity.py +0 -0
  875. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/enrichment/__init__.py +0 -0
  876. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  877. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  878. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/normalized/__init__.py +0 -0
  879. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/normalized/normalized_store.py +0 -0
  880. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/__init__.py +0 -0
  881. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/decision.py +0 -0
  882. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/oplog_store.py +0 -0
  883. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/postgres.py +0 -0
  884. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/person/identity_resolver.py +0 -0
  885. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/projections/__init__.py +0 -0
  886. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/projections/index_ops_store.py +0 -0
  887. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/projections/vector_index_store.py +0 -0
  888. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/__init__.py +0 -0
  889. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/browser_flat_tables.py +0 -0
  890. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/file_store.py +0 -0
  891. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/raw_store.py +0 -0
  892. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/raw_tables_manager.py +0 -0
  893. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
  894. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/security/encryption.py +0 -0
  895. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/signal_identity.py +0 -0
  896. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/source_settings.py +0 -0
  897. {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/user_identity.py +0 -0
  898. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sync/__init__.py +0 -0
  899. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sync/client.py +0 -0
  900. {topos_node-1.5.0 → topos_node-1.5.2}/topos/sync_handlers.py +0 -0
  901. {topos_node-1.5.0 → topos_node-1.5.2}/topos/testing/__init__.py +0 -0
  902. {topos_node-1.5.0 → topos_node-1.5.2}/topos/testing/lifespan.py +0 -0
  903. {topos_node-1.5.0 → topos_node-1.5.2}/topos/uds.py +0 -0
  904. {topos_node-1.5.0 → topos_node-1.5.2}/topos/uma_contact_enrichment.py +0 -0
  905. {topos_node-1.5.0 → topos_node-1.5.2}/topos/uma_filters.py +0 -0
  906. {topos_node-1.5.0 → topos_node-1.5.2}/topos/upgrades/__init__.py +0 -0
  907. {topos_node-1.5.0 → topos_node-1.5.2}/topos/upgrades/runner.py +0 -0
  908. {topos_node-1.5.0 → topos_node-1.5.2}/topos/utils/base_object.py +0 -0
  909. {topos_node-1.5.0 → topos_node-1.5.2}/topos/websocket_client.py +0 -0
  910. {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/dependency_links.txt +0 -0
  911. {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/entry_points.txt +0 -0
  912. {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/requires.txt +0 -0
  913. {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.5.0
3
+ Version: 1.5.2
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "topos-node"
12
- version = "1.5.0"
12
+ version = "1.5.2"
13
13
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
14
14
  readme = "README.md"
15
15
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.5.0"
4
- __version_info__ = (1, 5, 0)
3
+ __version__ = "1.5.2"
4
+ __version_info__ = (1, 5, 2)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -273,12 +273,72 @@ def _identifier_pattern(identifiers: frozenset) -> Optional["re.Pattern[str]"]:
273
273
  return re.compile(rf"(?<![^\W_])(?:{body})(?![^\W_])")
274
274
 
275
275
 
276
+ #: A name of this many letters or more is also found with an "s" glued on: a plural, or a possessive written with no
277
+ #: apostrophe ("sams" for "Sam's"; with the apostrophe the normalisation already took the "'s" off). Shorter names
278
+ #: are not, so "ed" is never found in "eds", nor "j" in "js".
279
+ NAME_PLURAL_MIN_CHARS = 3
280
+
281
+
282
+ #: Arabic and Hebrew: "and", "to", "with" are written joined to the FRONT of a name (و ل ب, ו ל ש), so a short name
283
+ #: is rarely a whole word in running text (review R-N1-151 R2 N1). WS0's ruling: in these scripts a name is read
284
+ #: anywhere at read time, whatever its length, as 1.5.0 read every name.
285
+ _CLITIC_SCRIPTS = re.compile("[\u0590-\u05ff\u0600-\u06ff\u0750-\u077f\u08a0-\u08ff\ufb1d-\ufdff\ufe70-\ufeff]")
286
+
287
+
288
+ def clitic_script(term: str) -> bool:
289
+ """Whether this name has a letter of the Arabic or Hebrew script (`_CLITIC_SCRIPTS`)."""
290
+ return bool(_CLITIC_SCRIPTS.search(term))
291
+
292
+
293
+ def _long_name(term: str) -> bool:
294
+ """WS0's ruling on BL-112 (review R-N1-151 H2): the whole-word reading is for names under the share boundary's
295
+ short-term length (``entity_boundary.SHORT_TERM_CHARS``, 4), counted as the boundary counts it (its skeleton:
296
+ NFKD letters and digits, so a Hangul name counts its jamo). The owner's over-match concern was short names ("Ed",
297
+ "J"). A name of 4 or more is read as before and as the boundary reads a long term: anywhere in the text, so a
298
+ possessive with any apostrophe letter, a particle glued on (Korean), a digit glued on, an inflection and an alias
299
+ run into the next word are found."""
300
+ from ...permissions_v2.entity_boundary import SHORT_TERM_CHARS, skeleton
301
+
302
+ return len(skeleton(term)) >= SHORT_TERM_CHARS
303
+
304
+
305
+ #: The apostrophes that are letters (U+02BC, U+02BB, U+02B9 …): the share boundary's own list. The normalisation
306
+ #: keeps them inside a word, so "Samʼs" stays one token; a short name followed by one of them and "s" is the name.
307
+ def _apostrophe_letters() -> str:
308
+ from ...permissions_v2.entity_boundary import APOSTROPHE_LETTERS
309
+
310
+ return "".join(sorted(APOSTROPHE_LETTERS))
311
+
312
+
313
+ @functools.lru_cache(maxsize=256)
314
+ def _name_pattern(names: frozenset) -> Optional["re.Pattern[str]"]:
315
+ """One pattern for the names that are matched as whole words (BL-112, the owner's ruling of 8 Oct 2026): each
316
+ stands where no letter or digit touches either end of it, with an "s" after it allowed from
317
+ ``NAME_PLURAL_MIN_CHARS`` letters, its own words apart by whitespace as written. "sam" is found in "sam", "sam's"
318
+ (normalised to "sam") and "sams", never in "same", "samples" or "balsam"; "al" never in "also" or "retrieval"."""
319
+ if not names:
320
+ return None
321
+ ordered = sorted(names, key=lambda term: (-len(term), term))
322
+ body = "|".join(r"\s+".join(re.escape(word) for word in term.split()) + ("s?" if len(term) >= NAME_PLURAL_MIN_CHARS
323
+ else "")
324
+ for term in ordered)
325
+ possessive = rf"(?:[{re.escape(_apostrophe_letters())}]s)?"
326
+ return re.compile(rf"(?<![^\W_])(?:{body}){possessive}(?![^\W_])")
327
+
328
+
276
329
  class OffLimitsTerms:
277
330
  """The names and the identifiers of the Off-limits entries one reader sees, and how each is looked for in text
278
331
  that was normalised with ``normalize_entity_name``.
279
332
 
280
- A NAME is looked for as it always was by these read-time scans: anywhere in the text, inside a longer word too.
281
- That scan is the deliberate second net behind the id join, and this round does not narrow it.
333
+ A NAME of an entry the owner made, or of a carried entry he has made fully Off-limits, that is SHORT (under the
334
+ share boundary's 4: ``_long_name``) is looked for as whole words (BL-112, the owner's ruling of 8 Oct 2026, and
335
+ WS0's of 9 Oct on its reach, ``_name_pattern``): found anywhere it hid a great deal ("Ed" dropped 42% of the
336
+ outside client's query results). Its plural or possessive with no apostrophe ("sams"), and its possessive with an
337
+ apostrophe letter ("Samʼs", U+02BC, U+02BB, U+02B9 …), are found too. It is looked for in the text and in
338
+ ``values`` both, so a name that a serialisation glued to an escape ("\\nSam") is still found. A name of 4 or more
339
+ is looked for anywhere in the text, as before and as the boundary reads a long term; so is a name that is carried
340
+ and WAITING (``loose``: the whole entry, or a name the upgrade added to a full one), and one written in a script
341
+ with no spaces. A caller that names no ``loose`` set gets every name read anywhere, as before.
282
342
 
283
343
  An IDENTIFIER (a handle, a username, a contact id, an address, a number: ``IDENTIFIERS_COLUMN``) matches only as
284
344
  itself, by the owner's decision of 7 Oct 2026: one with a digit or an ``@`` keeps the same reading as a name
@@ -294,11 +354,16 @@ class OffLimitsTerms:
294
354
  such a term the same way (``_in_a_run``).
295
355
  """
296
356
 
297
- __slots__ = ("names", "identifiers", "_anywhere", "_whole")
357
+ __slots__ = ("names", "identifiers", "_loose", "_named", "_anywhere", "_whole")
298
358
 
299
- def __init__(self, names: Set[str] = frozenset(), identifiers: Set[str] = frozenset()) -> None:
359
+ def __init__(self, names: Set[str] = frozenset(), identifiers: Set[str] = frozenset(), *,
360
+ loose: Optional[Set[str]] = None) -> None:
300
361
  self.names = frozenset(term for term in names if term)
301
362
  self.identifiers = frozenset(term for term in identifiers if term) - self.names
363
+ # The names found anywhere, inside a longer word too: carried and waiting, or written with no spaces.
364
+ self._loose = (self.names if loose is None else frozenset(term for term in loose if term) & self.names) | \
365
+ frozenset(term for term in self.names if _in_a_run(term) or _long_name(term) or clitic_script(term))
366
+ self._named = _name_pattern(self.names - self._loose)
302
367
  self._anywhere = frozenset(term for term in self.identifiers
303
368
  if "@" in term or any(ch.isdigit() for ch in term) or _in_a_run(term))
304
369
  self._whole = _identifier_pattern(self.identifiers - self._anywhere)
@@ -322,9 +387,14 @@ class OffLimitsTerms:
322
387
  if not text and not values:
323
388
  return None
324
389
  text = text or ""
325
- for term in self.names:
390
+ for term in self._loose:
326
391
  if term in text:
327
392
  return term
393
+ if self._named is not None:
394
+ for named in (text,) if values is None or values == text else (text, values):
395
+ hit = self._named.search(named)
396
+ if hit is not None:
397
+ return hit.group(0)
328
398
  scanned = text if values is None else values
329
399
  if not scanned:
330
400
  return None
@@ -340,6 +410,15 @@ class OffLimitsTerms:
340
410
  def found_in(self, text: Optional[str], *, values: Optional[str] = None) -> bool:
341
411
  return self.found(text, values=values) is not None
342
412
 
413
+ def identifiers_found(self, text: Optional[str]) -> Optional[str]:
414
+ """The first IDENTIFIER found in this normalised text of values (no keys), as `found` reads identifiers."""
415
+ return OffLimitsTerms(identifiers=self.identifiers).found(text, values=text) if self.identifiers else None
416
+
417
+ @property
418
+ def loose(self) -> frozenset:
419
+ """The names looked for anywhere in the text (carried and waiting, or written with no spaces)."""
420
+ return self._loose
421
+
343
422
 
344
423
  def terms_of(record: Dict[str, Any]) -> OffLimitsTerms:
345
424
  """The names and identifiers of ONE entry as the store returns it (``BlackholeStore.list``): its stored name, a
@@ -350,7 +429,11 @@ def terms_of(record: Dict[str, Any]) -> OffLimitsTerms:
350
429
  fresh = normalize_entity_name(str(record.get("canonical_name") or ""))
351
430
  if fresh and not (record.get("normalized_name") in identifiers):
352
431
  names.add(fresh)
353
- return OffLimitsTerms(names - identifiers - {""}, identifiers)
432
+ names -= identifiers | {""}
433
+ # Carried and waiting (BL-112 left them as they were): the whole entry, or the names the upgrade added to one
434
+ # the owner made. Only the entries the owner made, and carried ones he made fully Off-limits, read whole words.
435
+ loose = names if record.get("carried_waiting") else names & set(record.get("carried_waiting_aliases") or [])
436
+ return OffLimitsTerms(names, identifiers, loose=loose)
354
437
 
355
438
 
356
439
  class BlackholeStore:
@@ -482,11 +565,13 @@ class BlackholeStore:
482
565
  """Every name and identifier this view sees, for a reader that scans text (``OffLimitsTerms``)."""
483
566
  names: Set[str] = set()
484
567
  identifiers: Set[str] = set()
568
+ loose: Set[str] = set()
485
569
  for record in self.list(view=view):
486
570
  one = terms_of(record)
487
571
  names |= one.names
488
572
  identifiers |= one.identifiers
489
- return OffLimitsTerms(names, identifiers)
573
+ loose |= one.loose
574
+ return OffLimitsTerms(names, identifiers, loose=loose)
490
575
 
491
576
  @staticmethod
492
577
  def _row_to_dict(row: Sequence[Any]) -> Dict[str, Any]:
@@ -350,19 +350,27 @@ class BlackholeGuard:
350
350
  # ------------------------------------------------- free-text egress scan
351
351
 
352
352
  def text_mentions_blackholed(self, text: Optional[str]) -> bool:
353
- """Substring scan for any protected name or alias.
353
+ """Scan for any protected name or alias.
354
354
 
355
355
  The belt to the id-join's suspenders: a mention the resolver never bound
356
356
  (a new nickname, a misspelling it did not fuzzy-match) carries no
357
357
  entity_id to filter on, so high-stakes egress — routine email, grantee
358
358
  answers — scans the rendered text as well.
359
359
 
360
- A name is looked for anywhere in the text, as it always was. A handle, a
361
- username or an id is looked for only as itself (`OffLimitsTerms`).
360
+ A name as `OffLimitsTerms` reads it (BL-112: a name under 4 characters as
361
+ whole words, a longer one anywhere); a handle, a username or an id only as
362
+ itself. A value that is not a string (a dict, a list) is read by its string
363
+ VALUES joined, never by its `str()` (review R-N1-151 L6: that turns a
364
+ newline into the letters "\\n" glued to the next word).
362
365
  """
363
366
  if self.sees_everything or not text:
364
367
  return False
365
- haystack = normalize_entity_name(str(text))
368
+ if not isinstance(text, str):
369
+ from .blackhole_llm import text_of
370
+
371
+ # Values only, not keys (review R-N1-151 R2 N5): no caller passes a dict keyed by a person's name today.
372
+ text = text_of(text)
373
+ haystack = normalize_entity_name(text)
366
374
  if not haystack:
367
375
  return False
368
376
  return self._blocked_terms().found_in(haystack)
@@ -433,23 +441,27 @@ class CarriedItems:
433
441
  taken on the word of a catalog read inside a read. A caller that is itself inside a transaction, and a
434
442
  database with no file, are read through the caller's own connection. `close()` ends the read."""
435
443
 
436
- def __init__(self, conn: sqlite3.Connection) -> None:
444
+ def __init__(self, conn: sqlite3.Connection, *, waiting: Any = None) -> None:
445
+ """`waiting` is the boundary's own (`EntityBoundary(waiting=...)`): the entries that are carried and waiting
446
+ (the default, ONLY_WAITING), every entry (True), or the entries as the owner's own client reads them (False);
447
+ the last two are the query pipeline's rule for the entries one request reads (BL-112, `entries_items`)."""
437
448
  from urllib.parse import quote
438
449
 
439
450
  from ...permissions_v2.entity_boundary import ONLY_WAITING, EntityBoundary
440
451
 
452
+ waiting = ONLY_WAITING if waiting is None else waiting
441
453
  self._own: Optional[sqlite3.Connection] = None
442
454
  path = conn.execute("PRAGMA database_list").fetchone()[2]
443
455
  if path and not conn.in_transaction:
444
456
  self._own = sqlite3.connect("file:" + quote(path, safe="/") + "?mode=ro", uri=True)
445
457
  try:
446
458
  self._own.execute("BEGIN")
447
- self._boundary = EntityBoundary(self._own, waiting=ONLY_WAITING)
459
+ self._boundary = EntityBoundary(self._own, waiting=waiting)
448
460
  except BaseException:
449
461
  self.close()
450
462
  raise
451
463
  else:
452
- self._boundary = EntityBoundary(conn, waiting=ONLY_WAITING)
464
+ self._boundary = EntityBoundary(conn, waiting=waiting)
453
465
 
454
466
  def close(self) -> None:
455
467
  """End this rule's own read. Safe to call twice; a rule that read through its caller's connection has
@@ -583,6 +595,26 @@ def carried_items_for_routine(conn: Optional[sqlite3.Connection], principal: Any
583
595
  return carried
584
596
 
585
597
 
598
+ def entries_items(conn: Optional[sqlite3.Connection], view: str) -> Optional[CarriedItems]:
599
+ """The query pipeline's rule for the Off-limits entries one request reads, applied to EACH ITEM of its answer
600
+ (BL-112 (2), the owner's ruling of 8 Oct 2026: an entry hides its items and releases the rest). Until then any
601
+ entry the owner made closed the derived modes to every caller but his app: his outside AI client and his
602
+ routines got no summaries at all. Built on the share boundary itself, as the routine lane's rule for what is
603
+ carried (`CarriedItems`): by the ids an item carries and the records the person is mentioned in, and in its text
604
+ the way the boundary reads names; an item it cannot judge is withheld.
605
+
606
+ The entries are those of `view`: the owner's own client reads them without what is carried and waiting (OWNER),
607
+ every other reader reads every entry. None when there is none. RAISES when there is one and the boundary over it
608
+ cannot be built: every caller treats that as the floor, never as "nothing is Off-limits"."""
609
+ if conn is None:
610
+ return None
611
+ rule = CarriedItems(conn, waiting=view != OWNER)
612
+ if not rule.active:
613
+ rule.close()
614
+ return None
615
+ return rule
616
+
617
+
586
618
  def guard_for(
587
619
  conn: sqlite3.Connection,
588
620
  *,
@@ -15,7 +15,8 @@ own data — the protected entity's records would silently rot while every other
15
15
  record improved. Refusal is reserved for the case where no secure provider can
16
16
  serve the task at all.
17
17
 
18
- **Taint is a substring scan, and that is a floor, not a ceiling.** Structured
18
+ **Taint is a text scan, and that is a floor, not a ceiling.** (Names as the share boundary reads them: a
19
+ short name as a whole token with its forms, a long one anywhere; BL-112.) Structured
19
20
  taint (record ids joined through `entity_mentions`) is exact and belongs at the
20
21
  call sites that have ids to hand; this module catches the rest — free text
21
22
  assembled from who-knows-where. A scan cannot see a paraphrase or a nickname the
@@ -96,6 +97,35 @@ def _blackhole_rows(conn: sqlite3.Connection):
96
97
  return BlackholeStore(conn).list(view=for_own_processing())
97
98
 
98
99
 
100
+ def _boundary_names_hit(names, raw_text: str) -> bool:
101
+ """Whether the share boundary's own matcher (`entity_boundary.text_hits`) finds any of these names in this raw
102
+ text, in ONE pass over all of them (review R-N1-151 R2 N3: one pass per name cost 0.80 s on a 115 KB payload with
103
+ 24 names). Any text the boundary cannot read is a hit (its own rule: fail closed)."""
104
+ if not names or not raw_text:
105
+ return False
106
+ from ...permissions_v2.entity_boundary import skeleton, split_terms, text_hits
107
+
108
+ keys = {skeleton(name) for name in names} - {""}
109
+ if not keys:
110
+ return False
111
+ short, long_terms = split_terms(keys)
112
+ try:
113
+ return bool(text_hits(raw_text, short, long_terms))
114
+ except Exception: # noqa: BLE001 -- a text the boundary cannot read is treated as protected
115
+ return True
116
+
117
+
118
+ def _names_hit(terms, raw_text: str, haystack: str) -> bool:
119
+ """One entry's names at the gate: as the share boundary reads them, and (WS0's ruling on N1) a name in the Arabic
120
+ or Hebrew script also anywhere, as 1.5.0 read it (a clitic is written joined to the front of a name)."""
121
+ from .blackhole import OffLimitsTerms, clitic_script
122
+
123
+ clitic = {name for name in terms.names if clitic_script(name)}
124
+ if clitic and OffLimitsTerms(names=clitic).found(haystack) is not None:
125
+ return True
126
+ return _boundary_names_hit(terms.names, raw_text)
127
+
128
+
99
129
  def evaluate(
100
130
  conn: Optional[sqlite3.Connection],
101
131
  payload: Any,
@@ -120,7 +150,8 @@ def evaluate(
120
150
  if not rows and not record_floor:
121
151
  return EgressVerdict(False, frozenset(), (), provider=configured)
122
152
 
123
- haystack = normalize_entity_name(text_of(payload))
153
+ raw_text = text_of(payload)
154
+ haystack = normalize_entity_name(raw_text)
124
155
  if not haystack and not record_floor:
125
156
  return EgressVerdict(False, frozenset(), (), provider=configured)
126
157
 
@@ -132,10 +163,25 @@ def evaluate(
132
163
  allowed: Optional[Set[str]] = set(LOCAL_PROVIDERS) if record_floor else None
133
164
  from .blackhole import terms_of
134
165
 
135
- for row in rows:
136
- # A name anywhere in the text, as before; a handle, a username or an id only as itself. The text is the
137
- # payload's values (`text_of`): it has no keys to leave out.
138
- hit = terms_of(row).found(haystack, values=haystack)
166
+ # A NAME as the share boundary itself reads one (WS0's rulings on BL-112, review R-N1-151 H2 and R2 N1-N3): a term
167
+ # under 4 characters as a whole token with its forms, a longer one anywhere separator-free, a name in the Arabic or
168
+ # Hebrew script anywhere; a handle, a username or an id only as itself (`OffLimitsTerms`). First ONE pass over every
169
+ # entry's names together, as a fast "no" (N3); per entry only on a hit, to take the strictest tier.
170
+ every = [(row, terms_of(row)) for row in rows]
171
+ names = {name for _row, terms in every for name in terms.names}
172
+ any_hit = (_boundary_names_hit(names, raw_text)
173
+ or any(_names_hit(terms, "", haystack) for _row, terms in every)
174
+ or any(terms.identifiers_found(haystack) for _row, terms in every))
175
+ tiers = {row["processing_tier"] for row in rows}
176
+ if any_hit and len(tiers) == 1:
177
+ # Every entry has the one tier: which entry hit changes nothing, so no pass per entry.
178
+ matched.append("off_limits_name")
179
+ tier = TIER_PROVIDERS.get(next(iter(tiers)), TIER_PROVIDERS["local_only"])
180
+ allowed = set(tier) if allowed is None else (allowed & set(tier))
181
+ any_hit = False
182
+ for row, terms in every if any_hit else ():
183
+ hit = (next(iter(sorted(terms.names)), None) if terms.names and _names_hit(terms, raw_text, haystack)
184
+ else terms.identifiers_found(haystack))
139
185
  if hit is None:
140
186
  continue
141
187
  matched.append(hit)
@@ -143,6 +189,10 @@ def evaluate(
143
189
  # Several protected entities in one payload means the strictest wins:
144
190
  # the intersection, never the union.
145
191
  allowed = set(tier) if allowed is None else (allowed & set(tier))
192
+ # Not read here (WS0's ruling on review R-N1-151 R2 N2): the boundary's closure (an entry's name parts, linked
193
+ # aliases and learned spellings, contacts and their handles). `EntityBoundary.mentions_protected` once per call cost
194
+ # 0.107 s on a 115 KB payload with 24 entries, over the gate's 0.12 s budget with the names' pass (0.024 s). As in
195
+ # 1.5.0, a payload naming the person only by a first name or a surname goes to the configured provider.
146
196
 
147
197
  if not matched:
148
198
  return EgressVerdict(False, frozenset(), (), provider=configured)
@@ -9,7 +9,7 @@ import re
9
9
  import unicodedata
10
10
  from dataclasses import dataclass
11
11
 
12
- TEMPLATE_VERSION = "topos-answer-template/v3"
12
+ TEMPLATE_VERSION = "topos-answer-template/v6"
13
13
  _CITATION = re.compile(r"\[(\d+(?:\s*[,;]\s*\d+)*)\]")
14
14
  _SENTENCE_END = re.compile(r'''[.!?]+["'”’)]*(?:\s*\[\d+(?:\s*[,;]\s*\d+)*\])*(?=\s|$)''')
15
15
  _BULLET = re.compile(r"^([-*•]|\d+[.)])\s+")
@@ -22,6 +22,35 @@ _NSFW_TOKENS = ("nsfw", "xxx")
22
22
  _QUESTION_SCAFFOLD = frozenset({"happened", "anything", "according", "available", "describe", "discussed",
23
23
  "explain", "information", "mentioned", "meaning", "reference", "references", "regarding", "remember",
24
24
  "specific", "something", "summarize", "summary", "updated", "updates", "yesterday", "tomorrow"})
25
+ # BL-146 (A2A-4 amendment 4): request words of the recipients' question shapes (the eval catalog's) that never name a
26
+ # subject an item could carry. Each was a subject before, so every such question abstained or dropped every sentence:
27
+ # - whose share it is: every item a share releases is its owner's own, written in the first person, so no item says
28
+ # "owner" (the reason "shared" is a question word); nor a pronoun for the owner (round 2; the shorter pronouns,
29
+ # "she", "him", "they", are never subjects at all, being under five letters). The owner's own names are per node:
30
+ # answer_generation.owner_party_words;
31
+ # - the share's own record forms: a message, chat, record or entry is what every item is, not what it is about;
32
+ # - how to answer: "Cite the supporting evidence", "described", "mentioned", "discussed", "written", and
33
+ # "question(s)" ("Quick question: ..."; round 4 add-on, WS0);
34
+ # - when: "lately", "recently"; the share's window already bounds every item's time.
35
+ # A subject word stays one: "trips", "glass", "Olympics", "holidays", "relationships", "projects", "career",
36
+ # "statements". Both rules read this list after the fold: the anchor rule (8 letters or more) and the subject check.
37
+ FORM_WORDS = frozenset({"owner", "owners", "herself", "himself", "theirs", "themself", "themselves",
38
+ "message", "messages", "chat", "chats", "record", "records", "entry", "entries",
39
+ "cite", "evidence", "support", "supporting", "supported", "describe", "described", "mention", "mentioned",
40
+ "discuss", "discussed", "written", "question", "questions",
41
+ "lately", "recent", "recently"})
42
+ # A2A-4 amendment 5 (AR152 class I, 1.5.2): the catalog templates' own instruction words, a second closed list read
43
+ # exactly like FORM_WORDS by the anchor rule (`_SCAFFOLD_FOLDS`) and the subject check
44
+ # (answer_generation._GENERIC_QUESTION_TERMS), after the fold. They say how to answer ("Separate stated facts from
45
+ # inference", "Only report what the messages state", "Do not connect unrelated messages or infer chronology", "Name
46
+ # topics only, never pages", "going by their browsing"), never what an item is about; a supported sentence for every
47
+ # fact, goal, relationship and interest template, and the goals, home and family questions, was dropped for want of
48
+ # one. It only stops requiring words no item can carry: names still bind, an unknown word still echoes, every other
49
+ # subject word still binds. Not in it, by WS0's ruling: "relationships", "people", "spend", "goal", "topic"
50
+ # (singular). Pinned by an exact-set test; adding a word is an amendment.
51
+ INSTRUCTION_WORDS = frozenset({"stated", "state", "states", "report", "guess", "inference", "infer", "separate",
52
+ "statement", "statements", "explicit", "explicitly", "connect", "unrelated", "chronology", "establish",
53
+ "establishes", "around", "pursue", "going", "browsing", "browse", "topics", "never", "pages", "page"})
25
54
 
26
55
 
27
56
  def _redact_phone(match: re.Match[str]) -> str:
@@ -109,13 +138,24 @@ _UNDOUBLED = frozenset("bdgmnprt")
109
138
 
110
139
 
111
140
  def _vowel(word: str, i: int) -> bool:
112
- """A vowel letter: "y" after a consonant is one ("story"), "u" after "q" is not ("quite")."""
141
+ """A vowel letter: "y" after a consonant is one ("story"), "u" after "q" is not ("quite").
142
+
143
+ A run of "y" alternates (consonant, vowel, consonant…) from the letter before it, counted without recursion, so
144
+ a long run in a question folds like any word instead of ending the answer as `model_error` (BL-144)."""
113
145
  letter = word[i]
114
146
  if letter in "aeio":
115
147
  return True
116
148
  if letter == "u":
117
149
  return i == 0 or word[i - 1] != "q"
118
- return letter == "y" and i > 0 and not _vowel(word, i - 1)
150
+ if letter != "y":
151
+ return False
152
+ start = i
153
+ while start > 0 and word[start - 1] == "y":
154
+ start -= 1
155
+ # word[start] is the run's first "y": a vowel when a consonant comes before it, a consonant at the start or after
156
+ # a vowel. Each later "y" in the run is the opposite of the one before it.
157
+ first = start > 0 and not _vowel(word, start - 1)
158
+ return first if (i - start) % 2 == 0 else not first
119
159
 
120
160
 
121
161
  def _measure(stem: str) -> int:
@@ -176,31 +216,78 @@ def _stem(word: str) -> str:
176
216
 
177
217
 
178
218
  # A word is scaffold when its fold is the fold of a scaffold word ("explained" is "explain", "happening" "happen").
179
- _SCAFFOLD_FOLDS = frozenset(_stem(word) for word in _QUESTION_SCAFFOLD)
219
+ _SCAFFOLD_FOLDS = frozenset(_stem(word) for word in _QUESTION_SCAFFOLD | FORM_WORDS | INSTRUCTION_WORDS)
180
220
 
181
221
 
182
222
  def question_anchors(question: str) -> frozenset[str]:
183
223
  return frozenset(word for word in _tokens(question) if len(word) >= 8 and _stem(word) not in _SCAFFOLD_FOLDS)
184
224
 
185
225
 
226
+ def _suffix_step(word: str) -> str:
227
+ """One suffix off: the fold's first step, with "-es" after a hiss taken as one suffix ("lunches" to "lunch",
228
+ "classes" to "class"), never two ("cannings" to "canning", never "can")."""
229
+ step = _fold_once(word)
230
+ if word.endswith("es") and step == word[:-1] and (after := _fold_once(step)) == step[:-1]:
231
+ return after
232
+ return step
233
+
234
+
235
+ def _forms_within_one_suffix(words) -> set[str]:
236
+ """Each word as written and with one suffix off."""
237
+ return {form for word in words for form in (word, _suffix_step(word))}
238
+
239
+
240
+ def _within_one_suffix(word: str, forms: set[str]) -> bool:
241
+ """`word` and some word of `forms` (built by `_forms_within_one_suffix`) are at most one suffix apart each:
242
+ "meetings" and "meeting", "compilers" and "compiler", "stories" and "story", "updating" and "update"."""
243
+ return word in forms or _suffix_step(word) in forms
244
+
245
+
186
246
  def question_only_anchors(question: str, raw_texts: tuple[str, ...]) -> frozenset[str]:
187
247
  """Distinctive question words absent, in every form, from every item the model may see.
188
248
 
189
249
  An invented or protected word supplied by the asker is not evidence that
190
250
  the share contains it. A short common question word is not an anchor. A
191
- word is present when its fold is the fold of an item's word ("meetings"
192
- and "meeting").
251
+ word is present when it and an item's word are at most one suffix apart
252
+ ("meetings" and "meeting"). The whole fold is not enough (BL-144): it takes
253
+ two suffixes off a name shaped as a word plus "-ings" ("cannings" to "can",
254
+ "herrings" to "her"), so a supplied name no item carries would count as
255
+ present wherever an item says the short word, the model would run on it,
256
+ and its echo of the name would be kept.
193
257
  """
194
- item_words = {_stem(word) for raw in raw_texts for word in _tokens(raw)}
195
- return frozenset(word for word in question_anchors(question) if _stem(word) not in item_words)
258
+ item_forms = _forms_within_one_suffix(word for raw in raw_texts for word in _tokens(raw))
259
+ return frozenset(word for word in question_anchors(question) if not _within_one_suffix(word, item_forms))
196
260
 
197
261
 
198
262
  def echoes_question_only_word(sentence: str, echoes: frozenset[str]) -> bool:
199
- """The sentence uses a question-only anchor in any of its forms."""
263
+ """The sentence uses a question-only anchor in any of its forms (the whole fold: the safe side drops more)."""
200
264
  folds = {_stem(word) for word in echoes}
201
265
  return any(_stem(word) in folds for word in _tokens(sentence))
202
266
 
203
267
 
268
+ def protected_question_words(question: str, raw_texts: tuple[str, ...], boundary) -> frozenset[str]:
269
+ """The forms of the asker's own words that name someone Off-limits where the boundary does not read them.
270
+
271
+ The answer pass refuses a question the boundary reads as protected before the model runs. A name written in lower
272
+ case, or as an "-ies" plural of a "-y" name, is not read there (a part that is a word in lower case is a word),
273
+ and when no item carries it as written it can come back in the model's sentence first, in lower case, or in the
274
+ same plural, where the boundary does not read it either (BL-144). For each question word no item carries as
275
+ written, this returns the word as written and with one suffix off ("cherries", "cherry") wherever the boundary
276
+ reads that form, written as a name, as protected."""
277
+ item_words = {word for raw in raw_texts for word in _tokens(raw)}
278
+ forms = {form for word in _tokens(question) if len(word) >= 3 and word not in item_words
279
+ for form in (word, _suffix_step(word))}
280
+ if not forms or not boundary.mentions_protected("\n".join(sorted(form.capitalize() for form in forms))):
281
+ return frozenset()
282
+ return frozenset(form for form in forms if boundary.mentions_protected(form.capitalize()))
283
+
284
+
285
+ def echoes_protected_word(sentence: str, forms: frozenset[str]) -> bool:
286
+ """The sentence uses one of `forms` (from `protected_question_words`) as written or with one suffix more, in any
287
+ case: "cherries" or "Cherry" for "cherry"; "fielding" or "Fieldings" for "fieldings"."""
288
+ return bool(forms) and any(word in forms or _suffix_step(word) in forms for word in _tokens(sentence))
289
+
290
+
204
291
  def _runs(tokens: list[str], n: int) -> set[tuple[str, ...]]:
205
292
  return {tuple(tokens[i:i+n]) for i in range(len(tokens) - n + 1)}
206
293
 
@@ -0,0 +1,48 @@
1
+ """The answer model is also the labelling model (A2A-4 Q4): background assessments yield to answers.
2
+
3
+ An answers-mode ask is one call of the pinned local model with a person waiting for it. The node's background
4
+ assessments (the catch-up's message labels, the browsing-interest labels and their second tries) call the same
5
+ model on the same host, back to back, so an ask queues behind them on the host (BL-147: 17 s p50 live, about 3 s of
6
+ it the model's own work). Q4's rule, which 1.5.0 counted but never applied: no assessment call starts while an
7
+ answer job is queued or running; a call already running is not interrupted.
8
+
9
+ This module only counts and waits. It imports nothing of the node, so any model caller may use it. The wait is
10
+ bounded by an answer's own deadline (`answer_release.MAX_END_SECONDS`), so a count that never came down cannot
11
+ stop the labelling for good. Waiting changes when an assessment runs, never what it decides or what is shared.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import asyncio
16
+ import threading
17
+ import time
18
+
19
+ # An answer job ends, with or without a body, by its deadline (answer_release.MAX_END_SECONDS, 110 s from acceptance).
20
+ LIMIT_SECONDS = 110.0
21
+ POLL_SECONDS = 0.25
22
+
23
+ _lock = threading.Lock()
24
+ _active = 0
25
+
26
+
27
+ def active() -> bool:
28
+ """An answer job is queued or running in this process."""
29
+ with _lock:
30
+ return _active > 0
31
+
32
+
33
+ def delta(change: int) -> None:
34
+ global _active
35
+ with _lock:
36
+ _active += change
37
+
38
+
39
+ async def yield_to_answers(*, limit: float = LIMIT_SECONDS, poll: float = POLL_SECONDS, clock=time.monotonic) -> float:
40
+ """Wait, before an assessment call starts, until no answer job is queued or running, or `limit` seconds passed.
41
+
42
+ Returns the seconds waited (0.0 when no answer was in hand)."""
43
+ if not active():
44
+ return 0.0
45
+ started = clock()
46
+ while active() and clock() - started < limit:
47
+ await asyncio.sleep(poll)
48
+ return clock() - started