topos-node 1.5.4__tar.gz → 1.5.6__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 (918) hide show
  1. {topos_node-1.5.4/topos_node.egg-info → topos_node-1.5.6}/PKG-INFO +1 -1
  2. {topos_node-1.5.4 → topos_node-1.5.6}/pyproject.toml +1 -1
  3. {topos_node-1.5.4 → topos_node-1.5.6}/topos/__version__.py +2 -2
  4. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/shell.py +24 -2
  5. {topos_node-1.5.4 → topos_node-1.5.6}/topos/control_plane_client.py +35 -8
  6. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/config.py +15 -8
  7. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_owner.py +5 -2
  8. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/state.py +9 -0
  9. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_transport.py +11 -2
  10. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/entailment_grounding.py +5 -0
  11. topos_node-1.5.6/topos/permissions_v2/fact_preview.py +62 -0
  12. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/knowledge_contract.py +19 -1
  13. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/knowledge_projections.py +28 -24
  14. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ledger.py +4 -0
  15. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/native_claim_grounding.py +3 -1
  16. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/refresh_loop.py +9 -7
  17. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_index.py +11 -1
  18. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_transport.py +6 -0
  19. topos_node-1.5.6/topos/permissions_v2/selective_facts.py +155 -0
  20. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_catalog.py +4 -1
  21. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_counts.py +17 -3
  22. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_kinds.py +7 -6
  23. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/switches.py +4 -1
  24. topos_node-1.5.6/topos/routines/permissions.py +48 -0
  25. {topos_node-1.5.4 → topos_node-1.5.6}/topos/routines/store.py +4 -2
  26. {topos_node-1.5.4 → topos_node-1.5.6}/topos/runtime_update.py +42 -9
  27. {topos_node-1.5.4 → topos_node-1.5.6}/topos/upgrades/manifests.json +20 -0
  28. {topos_node-1.5.4 → topos_node-1.5.6/topos_node.egg-info}/PKG-INFO +1 -1
  29. {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/SOURCES.txt +3 -0
  30. {topos_node-1.5.4 → topos_node-1.5.6}/LICENSE +0 -0
  31. {topos_node-1.5.4 → topos_node-1.5.6}/MANIFEST.in +0 -0
  32. {topos_node-1.5.4 → topos_node-1.5.6}/README.md +0 -0
  33. {topos_node-1.5.4 → topos_node-1.5.6}/setup.cfg +0 -0
  34. {topos_node-1.5.4 → topos_node-1.5.6}/shared/__init__.py +0 -0
  35. {topos_node-1.5.4 → topos_node-1.5.6}/shared/filtering.py +0 -0
  36. {topos_node-1.5.4 → topos_node-1.5.6}/shared/schema_registry.py +0 -0
  37. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_active_database_binding.py +0 -0
  38. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_active_ingestion_binding.py +0 -0
  39. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_app_relay_wiring.py +0 -0
  40. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_extensions.py +0 -0
  41. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_gate_leg_hermeticity.py +0 -0
  42. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_hub_pipeline_offline_first.py +0 -0
  43. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_lane_shards.py +0 -0
  44. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_llm_integrations_storage.py +0 -0
  45. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_local_gate_composition.py +0 -0
  46. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_owner_database_hermeticity.py +0 -0
  47. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_prewarm_first_run.py +0 -0
  48. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_profile_hygiene.py +0 -0
  49. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_profiles.py +0 -0
  50. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_protocol_handled_types.py +0 -0
  51. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_query_field_contract.py +0 -0
  52. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_sync_dep_pins.py +0 -0
  53. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_system_computer_name.py +0 -0
  54. {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_topos_home_hermeticity.py +0 -0
  55. {topos_node-1.5.4 → topos_node-1.5.6}/topos/__init__.py +0 -0
  56. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/__init__.py +0 -0
  57. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/dataset_resolution.py +0 -0
  58. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/duckdb_adapter.py +0 -0
  59. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/luck_surface.py +0 -0
  60. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_communities.py +0 -0
  61. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_directed.py +0 -0
  62. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_graph.py +0 -0
  63. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_labels.py +0 -0
  64. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/person_graph.py +0 -0
  65. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/person_overlay.py +0 -0
  66. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/profiles.py +0 -0
  67. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/query_engine.py +0 -0
  68. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/raw_queries.py +0 -0
  69. {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/relationship_reads.py +0 -0
  70. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/__init__.py +0 -0
  71. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/analytics.py +0 -0
  72. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/app_registry.py +0 -0
  73. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/backup.py +0 -0
  74. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/community_naming_config.py +0 -0
  75. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/compute_remote.py +0 -0
  76. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/connected_apps.py +0 -0
  77. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/conversation_context.py +0 -0
  78. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/data_commit.py +0 -0
  79. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/data_explorer_table_prefs.py +0 -0
  80. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/database_explorer.py +0 -0
  81. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/db.py +0 -0
  82. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/device.py +0 -0
  83. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/disk_space_config.py +0 -0
  84. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/engine_run.py +0 -0
  85. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/enrichment.py +0 -0
  86. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/enrichment_lab.py +0 -0
  87. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/facts_llm_config.py +0 -0
  88. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/filter_lab.py +0 -0
  89. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/health.py +0 -0
  90. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/home_chat.py +0 -0
  91. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ingestion_api.py +0 -0
  92. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ingestion_compat.py +0 -0
  93. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ingestion_sources.py +0 -0
  94. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/intelligence_lifecycle.py +0 -0
  95. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/llm.py +0 -0
  96. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/local_mcp.py +0 -0
  97. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/messenger_analytics.py +0 -0
  98. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/nsfw_maintenance.py +0 -0
  99. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_ai_chat_capture.py +0 -0
  100. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_capture_receipts.py +0 -0
  101. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_identity.py +0 -0
  102. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_ingestion.py +0 -0
  103. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_native_probe.py +0 -0
  104. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_search_maintenance.py +0 -0
  105. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_source_installs.py +0 -0
  106. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/privacy_disclose.py +0 -0
  107. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/query_api.py +0 -0
  108. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/runtime_bootstrap.py +0 -0
  109. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sanitization_ollama_config.py +0 -0
  110. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/signal.py +0 -0
  111. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/signal_extraction_config.py +0 -0
  112. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/source_install.py +0 -0
  113. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/source_retention.py +0 -0
  114. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/source_scrub.py +0 -0
  115. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sources.py +0 -0
  116. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sources_overview.py +0 -0
  117. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sync.py +0 -0
  118. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/tool_index.py +0 -0
  119. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ui_config.py +0 -0
  120. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/upgrades.py +0 -0
  121. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/usage.py +0 -0
  122. {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/user_identity.py +0 -0
  123. {topos_node-1.5.4 → topos_node-1.5.6}/topos/app.py +0 -0
  124. {topos_node-1.5.4 → topos_node-1.5.6}/topos/auth.py +0 -0
  125. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/__init__.py +0 -0
  126. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/declared_field_map.py +0 -0
  127. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/__init__.py +0 -0
  128. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/base.py +0 -0
  129. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  130. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  131. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  132. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  133. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  134. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  135. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  136. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  137. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
  138. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/models.py +0 -0
  139. {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/resolver.py +0 -0
  140. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/__init__.py +0 -0
  141. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/__main__.py +0 -0
  142. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/assets/topos_black.png +0 -0
  143. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/assets/topos_blk_rounded.png +0 -0
  144. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/assets/topos_white.png +0 -0
  145. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/commands.py +0 -0
  146. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/profile_cmd.py +0 -0
  147. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/reprocess_cmd.py +0 -0
  148. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/setup_models_cmd.py +0 -0
  149. {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/tray.py +0 -0
  150. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/__init__.py +0 -0
  151. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/conversation_context_llm.py +0 -0
  152. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/facts_llm.py +0 -0
  153. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/local_model_builds.py +0 -0
  154. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/model_packs.py +0 -0
  155. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/node_function_providers.py +0 -0
  156. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/sanitization_ollama.py +0 -0
  157. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/settings.py +0 -0
  158. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/signal_extraction.py +0 -0
  159. {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/uvicorn_logging.json +0 -0
  160. {topos_node-1.5.4 → topos_node-1.5.6}/topos/contacts/__init__.py +0 -0
  161. {topos_node-1.5.4 → topos_node-1.5.6}/topos/contacts/identity.py +0 -0
  162. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/__init__.py +0 -0
  163. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/api_models.py +0 -0
  164. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/connection_resilience.py +0 -0
  165. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/db_health.py +0 -0
  166. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/device_helpers.py +0 -0
  167. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/errors.py +0 -0
  168. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/events.py +0 -0
  169. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/__init__.py +0 -0
  170. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/aggregate.py +0 -0
  171. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/common.py +0 -0
  172. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/complexity.py +0 -0
  173. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/contacts_import.py +0 -0
  174. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/database_explorer.py +0 -0
  175. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/derivation.py +0 -0
  176. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/device.py +0 -0
  177. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/enrichment.py +0 -0
  178. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/enrichment_lab.py +0 -0
  179. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/filter_lab.py +0 -0
  180. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/graph_query.py +0 -0
  181. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/graph_summary.py +0 -0
  182. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/home_chat.py +0 -0
  183. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/ingest.py +0 -0
  184. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/mcp_client_elevations.py +0 -0
  185. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/mcp_clients.py +0 -0
  186. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/messages.py +0 -0
  187. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/messenger_analytics.py +0 -0
  188. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2.py +0 -0
  189. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_bind.py +0 -0
  190. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_identity.py +0 -0
  191. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
  192. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_release.py +0 -0
  193. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/query.py +0 -0
  194. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/registry.py +0 -0
  195. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/routines.py +0 -0
  196. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/signal_features.py +0 -0
  197. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/sources.py +0 -0
  198. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/timeline_daily.py +0 -0
  199. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/tool_index.py +0 -0
  200. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/logging.py +0 -0
  201. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/metrics.py +0 -0
  202. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/routine_access.py +0 -0
  203. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/startup_banner.py +0 -0
  204. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/table_layers.py +0 -0
  205. {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/types.py +0 -0
  206. {topos_node-1.5.4 → topos_node-1.5.6}/topos/data_explorer_row_delete.py +0 -0
  207. {topos_node-1.5.4 → topos_node-1.5.6}/topos/data_explorer_table_prefs.py +0 -0
  208. {topos_node-1.5.4 → topos_node-1.5.6}/topos/data_explorer_tables.py +0 -0
  209. {topos_node-1.5.4 → topos_node-1.5.6}/topos/defaults.py +0 -0
  210. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/__init__.py +0 -0
  211. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/canonical_writer.py +0 -0
  212. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/content_policy.py +0 -0
  213. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/disclosure_sweep.py +0 -0
  214. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/field_registry.py +0 -0
  215. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/nsfw_tags.py +0 -0
  216. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/privacy_layer.py +0 -0
  217. {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/tier.py +0 -0
  218. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/__init__.py +0 -0
  219. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/__init__.py +0 -0
  220. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/base.py +0 -0
  221. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/generative_prompts.py +0 -0
  222. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/generative_response.py +0 -0
  223. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/huggingface.py +0 -0
  224. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/ollama.py +0 -0
  225. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/openai.py +0 -0
  226. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/openai_compatible.py +0 -0
  227. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/redpill.py +0 -0
  228. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/stub.py +0 -0
  229. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/client.py +0 -0
  230. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/disk_space.py +0 -0
  231. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/engine.py +0 -0
  232. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/hosted_llm_wallet.py +0 -0
  233. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/intake.py +0 -0
  234. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/memory_utils.py +0 -0
  235. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/model_cache.py +0 -0
  236. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/model_manager.py +0 -0
  237. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_install.py +0 -0
  238. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_pull.py +0 -0
  239. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_runtime.py +0 -0
  240. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_setup_guidance.py +0 -0
  241. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/pipeline_memory.py +0 -0
  242. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/queue_manager.py +0 -0
  243. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/registration.py +0 -0
  244. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/result_formatter.py +0 -0
  245. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/router.py +0 -0
  246. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/scoped_token.py +0 -0
  247. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/tasks.py +0 -0
  248. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/torch_runtime.py +0 -0
  249. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/transport.py +0 -0
  250. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/usage_guard.py +0 -0
  251. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/usage_observation.py +0 -0
  252. {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/validator.py +0 -0
  253. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/__init__.py +0 -0
  254. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/catalog.py +0 -0
  255. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/derivation_recovery.py +0 -0
  256. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/derived_tables.py +0 -0
  257. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/job_readiness.py +0 -0
  258. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/job_writer.py +0 -0
  259. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/__init__.py +0 -0
  260. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/base.py +0 -0
  261. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  262. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  263. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  264. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  265. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  266. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  267. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  268. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  269. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  270. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  271. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  272. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  273. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  274. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  275. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  276. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  277. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  278. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  279. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  280. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  281. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  282. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  283. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/__init__.py +0 -0
  284. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  285. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/language_job.py +0 -0
  286. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  287. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  288. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/model_overrides.py +0 -0
  289. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/__init__.py +0 -0
  290. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/manager.py +0 -0
  291. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/mvp_defaults.py +0 -0
  292. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/registry.py +0 -0
  293. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/versioning.py +0 -0
  294. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/orchestrator.py +0 -0
  295. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/pipeline_activity.py +0 -0
  296. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/processor.py +0 -0
  297. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/progress_bar.py +0 -0
  298. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/record_progress.py +0 -0
  299. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/registry_contract.py +0 -0
  300. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/signal_derivation_config.json +0 -0
  301. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/source_overrides.py +0 -0
  302. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/__init__.py +0 -0
  303. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/bundles.py +0 -0
  304. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/model_resolve.py +0 -0
  305. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/schema.py +0 -0
  306. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/service.py +0 -0
  307. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/store.py +0 -0
  308. {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/worker.py +0 -0
  309. {topos_node-1.5.4 → topos_node-1.5.6}/topos/evals/__init__.py +0 -0
  310. {topos_node-1.5.4 → topos_node-1.5.6}/topos/evals/enrichment_eval.py +0 -0
  311. {topos_node-1.5.4 → topos_node-1.5.6}/topos/extensions.py +0 -0
  312. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/__init__.py +0 -0
  313. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/canonical.py +0 -0
  314. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/engine.py +0 -0
  315. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/entropy.py +0 -0
  316. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/focus.py +0 -0
  317. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/graph_metrics.py +0 -0
  318. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/influence.py +0 -0
  319. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/projection.py +0 -0
  320. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/snapshots.py +0 -0
  321. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/store.py +0 -0
  322. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/topic_merge.py +0 -0
  323. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/topics.py +0 -0
  324. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/topics_daily.py +0 -0
  325. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/volatility.py +0 -0
  326. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/__init__.py +0 -0
  327. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  328. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  329. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  330. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  331. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  332. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  333. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  334. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  335. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  336. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  337. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  338. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  339. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  340. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  341. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  342. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  343. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  344. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  345. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  346. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  347. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  348. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
  349. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  350. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  351. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  352. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  353. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  354. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  355. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  356. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  357. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  358. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  359. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  360. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  361. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  362. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  363. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  364. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/candidates.py +0 -0
  365. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/commitments.py +0 -0
  366. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/guard.py +0 -0
  367. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/kernels.py +0 -0
  368. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/net_subject_policy.py +0 -0
  369. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/packs.py +0 -0
  370. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/person_bridge.py +0 -0
  371. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/person_reading.py +0 -0
  372. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/prefilter.py +0 -0
  373. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/registry.py +0 -0
  374. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/report_card.py +0 -0
  375. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/router.py +0 -0
  376. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/social_bench.py +0 -0
  377. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/social_kernels.py +0 -0
  378. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/surfaces.py +0 -0
  379. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/synthesize.py +0 -0
  380. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/template.py +0 -0
  381. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/verify.py +0 -0
  382. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/writer.py +0 -0
  383. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/__init__.py +0 -0
  384. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/affinity.py +0 -0
  385. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/affinity_owner.py +0 -0
  386. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/affinity_quality.py +0 -0
  387. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/chatgpt_declared.py +0 -0
  388. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/community_names.py +0 -0
  389. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/community_naming.py +0 -0
  390. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/consolidation.py +0 -0
  391. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/context_vectors.py +0 -0
  392. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/cypher.py +0 -0
  393. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/declared_mappings.py +0 -0
  394. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/discourse_graph.py +0 -0
  395. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/dossier.py +0 -0
  396. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/edges.py +0 -0
  397. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/fact_materializer.py +0 -0
  398. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_enrichers.py +0 -0
  399. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_inputs.py +0 -0
  400. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_refresh.py +0 -0
  401. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_search.py +0 -0
  402. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/linking.py +0 -0
  403. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/maintenance.py +0 -0
  404. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/mention_lineage.py +0 -0
  405. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/mention_lineage_lane.py +0 -0
  406. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/owner.py +0 -0
  407. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/reads.py +0 -0
  408. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/rebuild_subprocess.py +0 -0
  409. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/resolver.py +0 -0
  410. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/structured_fields.py +0 -0
  411. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/__init__.py +0 -0
  412. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/evidence_time.py +0 -0
  413. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/extract.py +0 -0
  414. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/llm_extract.py +0 -0
  415. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/reactions.py +0 -0
  416. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/reads.py +0 -0
  417. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/store.py +0 -0
  418. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/verdicts.py +0 -0
  419. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/fit/evaluator.py +0 -0
  420. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/fit/opportunity_types.json +0 -0
  421. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/__init__.py +0 -0
  422. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole.py +0 -0
  423. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole_guard.py +0 -0
  424. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole_llm.py +0 -0
  425. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  426. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/carry_diagnosis.py +0 -0
  427. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/contact_excludes.py +0 -0
  428. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/derived_scrub.py +0 -0
  429. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/exclusions.py +0 -0
  430. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/gc.py +0 -0
  431. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/off_limits_list.py +0 -0
  432. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/off_limits_view.py +0 -0
  433. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/record_protection.py +0 -0
  434. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/__init__.py +0 -0
  435. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/posture.py +0 -0
  436. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/roles.py +0 -0
  437. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/writer_class.py +0 -0
  438. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/__init__.py +0 -0
  439. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_canonical_loader.py +0 -0
  440. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_ontology.py +0 -0
  441. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_renderer.py +0 -0
  442. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_schemas.py +0 -0
  443. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/chunking.py +0 -0
  444. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/cluster_labels.py +0 -0
  445. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/conversation_context.py +0 -0
  446. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/conversation_windows.py +0 -0
  447. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/data_health.py +0 -0
  448. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  449. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/intentions.json +0 -0
  450. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/interests.json +0 -0
  451. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/memory.json +0 -0
  452. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/places.json +0 -0
  453. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/profile.json +0 -0
  454. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/relationships.json +0 -0
  455. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/resources.json +0 -0
  456. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  457. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/time.json +0 -0
  458. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/wellbeing.json +0 -0
  459. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/work.json +0 -0
  460. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/derived_index.py +0 -0
  461. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/derived_spec.py +0 -0
  462. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_briefs.py +0 -0
  463. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_definition_loader.py +0 -0
  464. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_profiles.py +0 -0
  465. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_registry.py +0 -0
  466. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/embed_context.py +0 -0
  467. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/extraction/artifact_router.py +0 -0
  468. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/extraction/artifact_store.py +0 -0
  469. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/extraction/rule_extractors.py +0 -0
  470. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/graph_sanitize.py +0 -0
  471. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/hybrid_search.py +0 -0
  472. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/incremental_clustering.py +0 -0
  473. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/model_recommendations.py +0 -0
  474. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/query_embed_cache.py +0 -0
  475. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/schemas.py +0 -0
  476. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/service.py +0 -0
  477. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/signal_object_store.py +0 -0
  478. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/source_hydration.py +0 -0
  479. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/structured_signal.py +0 -0
  480. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/tool_index.py +0 -0
  481. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/topic_clustering.py +0 -0
  482. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/aggregates.py +0 -0
  483. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/commitments.py +0 -0
  484. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/rhythm.py +0 -0
  485. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  486. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/vector_codec.py +0 -0
  487. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/vector_math.py +0 -0
  488. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/vector_settings.py +0 -0
  489. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/__init__.py +0 -0
  490. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/definitions.py +0 -0
  491. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/engine.py +0 -0
  492. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/fold.py +0 -0
  493. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/insights.py +0 -0
  494. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/temporal/__init__.py +0 -0
  495. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/temporal/points.py +0 -0
  496. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/temporal/records.py +0 -0
  497. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/timeline_projection.py +0 -0
  498. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/timeline_rollup.py +0 -0
  499. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/__init__.py +0 -0
  500. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/badges.py +0 -0
  501. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/daily.py +0 -0
  502. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/dashboard.py +0 -0
  503. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/instruments.py +0 -0
  504. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/intents.py +0 -0
  505. {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/readiness.py +0 -0
  506. {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/__init__.py +0 -0
  507. {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/bundles.py +0 -0
  508. {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/schema.py +0 -0
  509. {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/service.py +0 -0
  510. {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/store.py +0 -0
  511. {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/worker.py +0 -0
  512. {topos_node-1.5.4 → topos_node-1.5.6}/topos/home_chat/__init__.py +0 -0
  513. {topos_node-1.5.4 → topos_node-1.5.6}/topos/home_chat/schema.py +0 -0
  514. {topos_node-1.5.4 → topos_node-1.5.6}/topos/home_chat/store.py +0 -0
  515. {topos_node-1.5.4 → topos_node-1.5.6}/topos/hosted_pool_lease.py +0 -0
  516. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/__init__.py +0 -0
  517. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/canonical_pipeline.py +0 -0
  518. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/chatgpt_owner_snapshot.py +0 -0
  519. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/checkpoints/__init__.py +0 -0
  520. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  521. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  522. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/imessage_attributed_text.py +0 -0
  523. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/inbox_crypto.py +0 -0
  524. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/inbox_drain.py +0 -0
  525. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/ingest_helpers.py +0 -0
  526. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/jobs.py +0 -0
  527. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/journal_location_fanout.py +0 -0
  528. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/journal_time_log_normalize.py +0 -0
  529. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_exports.py +0 -0
  530. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_sync.py +0 -0
  531. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_sync_jobs.py +0 -0
  532. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_sync_schedule.py +0 -0
  533. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/log_preview.py +0 -0
  534. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/manager.py +0 -0
  535. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/owner_snapshot.py +0 -0
  536. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parser.py +0 -0
  537. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/__init__.py +0 -0
  538. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/base.py +0 -0
  539. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/browser_parser.py +0 -0
  540. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/calendar_parser.py +0 -0
  541. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  542. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  543. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  544. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  545. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/documents_parser.py +0 -0
  546. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  547. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  548. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/grok_parser.py +0 -0
  549. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/messenger_parser.py +0 -0
  550. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/transcript_parser.py +0 -0
  551. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  552. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/progress.py +0 -0
  553. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/reprocess.py +0 -0
  554. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/__init__.py +0 -0
  555. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/base.py +0 -0
  556. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/calendar.py +0 -0
  557. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/chatgpt.py +0 -0
  558. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/contact_importers.py +0 -0
  559. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/grok.py +0 -0
  560. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/imessage_reader.py +0 -0
  561. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/signal_export_parser.py +0 -0
  562. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/signal_reader.py +0 -0
  563. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/state_machine.py +0 -0
  564. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/triggers/__init__.py +0 -0
  565. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/triggers/file_trigger.py +0 -0
  566. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  567. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  568. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/__init__.py +0 -0
  569. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/base.py +0 -0
  570. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/schema_registry.py +0 -0
  571. {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/schema_validator.py +0 -0
  572. {topos_node-1.5.4 → topos_node-1.5.6}/topos/lineage/__init__.py +0 -0
  573. {topos_node-1.5.4 → topos_node-1.5.6}/topos/lineage/provenance.py +0 -0
  574. {topos_node-1.5.4 → topos_node-1.5.6}/topos/lineage/tracker.py +0 -0
  575. {topos_node-1.5.4 → topos_node-1.5.6}/topos/llm_integrations_storage.py +0 -0
  576. {topos_node-1.5.4 → topos_node-1.5.6}/topos/mcp_clients.py +0 -0
  577. {topos_node-1.5.4 → topos_node-1.5.6}/topos/mcp_stdio_proxy.py +0 -0
  578. {topos_node-1.5.4 → topos_node-1.5.6}/topos/node_stop.py +0 -0
  579. {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/__init__.py +0 -0
  580. {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/alerts.py +0 -0
  581. {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/metrics.py +0 -0
  582. {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/tracing.py +0 -0
  583. {topos_node-1.5.4 → topos_node-1.5.6}/topos/openai_client.py +0 -0
  584. {topos_node-1.5.4 → topos_node-1.5.6}/topos/owner_key.py +0 -0
  585. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/__init__.py +0 -0
  586. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ai_chat_capture.py +0 -0
  587. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_checks.py +0 -0
  588. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_gate.py +0 -0
  589. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_generation.py +0 -0
  590. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_protocol.py +0 -0
  591. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_release.py +0 -0
  592. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/automatic_message_review.py +0 -0
  593. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/automatic_review_worker.py +0 -0
  594. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/bind_protocol.py +0 -0
  595. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/canonical.py +0 -0
  596. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/canonical_floor.py +0 -0
  597. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/capture_receipts.py +0 -0
  598. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/chatgpt_coverage.py +0 -0
  599. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/checking_model.py +0 -0
  600. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/common_given_names.py +0 -0
  601. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/contract.py +0 -0
  602. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/english_short_words.py +0 -0
  603. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/entity_boundary.py +0 -0
  604. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence.py +0 -0
  605. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_families.py +0 -0
  606. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_review_runtime.py +0 -0
  607. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_reviews.py +0 -0
  608. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_time.py +0 -0
  609. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/exclusion_floor.py +0 -0
  610. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_contract.py +0 -0
  611. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_eligibility.py +0 -0
  612. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_policy.py +0 -0
  613. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_projection.py +0 -0
  614. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/forwarding.py +0 -0
  615. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity.py +0 -0
  616. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity_attestation.py +0 -0
  617. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity_dispatch.py +0 -0
  618. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity_protocol.py +0 -0
  619. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/imessage_reconciliation.py +0 -0
  620. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/imessage_standing.py +0 -0
  621. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/index_rebuilds.py +0 -0
  622. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/index_review_guard.py +0 -0
  623. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/inferred_facts.py +0 -0
  624. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_dispatch.py +0 -0
  625. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_protocol.py +0 -0
  626. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_provenance.py +0 -0
  627. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_snapshot_facts.py +0 -0
  628. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_family.py +0 -0
  629. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_index.py +0 -0
  630. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_relabel.py +0 -0
  631. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_review.py +0 -0
  632. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/journal_goal_field.py +0 -0
  633. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ledger_retention.py +0 -0
  634. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/message_evidence.py +0 -0
  635. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/message_review_contract.py +0 -0
  636. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/native_imessage_probe.py +0 -0
  637. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/node_protocol.py +0 -0
  638. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/opaque_ids.py +0 -0
  639. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ownership.py +0 -0
  640. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/permitted_derivation.py +0 -0
  641. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/predicate_classes.py +0 -0
  642. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/projection_review_runtime.py +0 -0
  643. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/projection_reviews.py +0 -0
  644. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/protection_clock.py +0 -0
  645. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/protection_doorbell.py +0 -0
  646. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/protocol.py +0 -0
  647. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/reconciliation_facts.py +0 -0
  648. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/reconciliation_provenance.py +0 -0
  649. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/registry.py +0 -0
  650. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/release.py +0 -0
  651. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/runtime.py +0 -0
  652. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_contract.py +0 -0
  653. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_lanes.py +0 -0
  654. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_release.py +0 -0
  655. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_timing.py +0 -0
  656. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/self_bind.py +0 -0
  657. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/shadow_labeler_local.py +0 -0
  658. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
  659. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_week.py +0 -0
  660. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/signing.py +0 -0
  661. {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/snapshot_message_facts.py +0 -0
  662. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/__init__.py +0 -0
  663. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/audit.py +0 -0
  664. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/envelope.py +0 -0
  665. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/job_runner.py +0 -0
  666. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/job_secrets.py +0 -0
  667. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/job_store.py +0 -0
  668. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/stages.py +0 -0
  669. {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/stub_enqueue.py +0 -0
  670. {topos_node-1.5.4 → topos_node-1.5.6}/topos/principal.py +0 -0
  671. {topos_node-1.5.4 → topos_node-1.5.6}/topos/profiles.py +0 -0
  672. {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/__init__.py +0 -0
  673. {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/__init__.py +0 -0
  674. {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/base.py +0 -0
  675. {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/builders.py +0 -0
  676. {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/health_checks.py +0 -0
  677. {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/__init__.py +0 -0
  678. {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/handled_message_types.json +0 -0
  679. {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/narrowing_vocabulary.json +0 -0
  680. {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/query_field_contract.json +0 -0
  681. {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/retrieval_text_contract.json +0 -0
  682. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/__init__.py +0 -0
  683. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/aggregate.py +0 -0
  684. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/audit.py +0 -0
  685. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/closeness.py +0 -0
  686. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/collaborators.py +0 -0
  687. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/ddr.py +0 -0
  688. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/disclosure.py +0 -0
  689. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/entity_window.py +0 -0
  690. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/exclusion.py +0 -0
  691. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/facts_direct.py +0 -0
  692. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/fingerprint.py +0 -0
  693. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/game_layer.py +0 -0
  694. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/graph_lane.py +0 -0
  695. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/inference.py +0 -0
  696. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/intent.py +0 -0
  697. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/journal_event_lane.py +0 -0
  698. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/manifest.py +0 -0
  699. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/manifest_validation.py +0 -0
  700. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/narrowing.py +0 -0
  701. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/overheard.py +0 -0
  702. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/packet_resolution.py +0 -0
  703. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/pipeline.py +0 -0
  704. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/planner.py +0 -0
  705. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/retrieval.py +0 -0
  706. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/runtime.py +0 -0
  707. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_arbiter.py +0 -0
  708. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_classifier.py +0 -0
  709. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_head.py +0 -0
  710. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_registry.json +0 -0
  711. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_registry_loader.py +0 -0
  712. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_shadow.py +0 -0
  713. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/session.py +0 -0
  714. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/session_utils.py +0 -0
  715. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/source_generation.py +0 -0
  716. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/truth_door.py +0 -0
  717. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/truth_facts.py +0 -0
  718. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/truth_prompts.py +0 -0
  719. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/turn_classifier.py +0 -0
  720. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/types.py +0 -0
  721. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/verify.py +0 -0
  722. {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/verify_modes.py +0 -0
  723. {topos_node-1.5.4 → topos_node-1.5.6}/topos/rate_limit.py +0 -0
  724. {topos_node-1.5.4 → topos_node-1.5.6}/topos/relay_stamp.py +0 -0
  725. {topos_node-1.5.4 → topos_node-1.5.6}/topos/routines/__init__.py +0 -0
  726. {topos_node-1.5.4 → topos_node-1.5.6}/topos/routines/schema.py +0 -0
  727. {topos_node-1.5.4 → topos_node-1.5.6}/topos/runtime_housekeeping.py +0 -0
  728. {topos_node-1.5.4 → topos_node-1.5.6}/topos/runtime_shutdown.py +0 -0
  729. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/__init__.py +0 -0
  730. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/explicit_wording.py +0 -0
  731. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/hub_pipeline.py +0 -0
  732. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/nsfw_classifier.py +0 -0
  733. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/ollama_transforms.py +0 -0
  734. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/prewarm.py +0 -0
  735. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/privacy_filter.py +0 -0
  736. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/__init__.py +0 -0
  737. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/container.py +0 -0
  738. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/__init__.py +0 -0
  739. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/base.py +0 -0
  740. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/local.py +0 -0
  741. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/remote.py +0 -0
  742. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/interfaces.py +0 -0
  743. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/llm/__init__.py +0 -0
  744. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/llm/base.py +0 -0
  745. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/llm/openai.py +0 -0
  746. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/local.py +0 -0
  747. {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/postgres.py +0 -0
  748. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/__init__.py +0 -0
  749. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/bundled_canonical_triples.py +0 -0
  750. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/canonical_signal_defaults.py +0 -0
  751. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/declared_field_map_spec.py +0 -0
  752. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/definitions.py +0 -0
  753. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/install_authority.py +0 -0
  754. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/install_maintenance.py +0 -0
  755. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/install_service.py +0 -0
  756. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/registry.py +0 -0
  757. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/retention.py +0 -0
  758. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/runtime_install.py +0 -0
  759. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/scrub_attribution.py +0 -0
  760. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/scrub_service.py +0 -0
  761. {topos_node-1.5.4 → topos_node-1.5.6}/topos/startup_banner.py +0 -0
  762. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/__init__.py +0 -0
  763. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/__init__.py +0 -0
  764. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/factory.py +0 -0
  765. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/fakes.py +0 -0
  766. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/postgres/stores.py +0 -0
  767. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/protocols.py +0 -0
  768. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/sqlite/__init__.py +0 -0
  769. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/sqlite/stores.py +0 -0
  770. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  771. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/__init__.py +0 -0
  772. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/activity_tables.py +0 -0
  773. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  774. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  775. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  776. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/model.py +0 -0
  777. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/tables.py +0 -0
  778. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  779. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/canonical_store.py +0 -0
  780. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/conversations_tables.py +0 -0
  781. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/journal_repair.py +0 -0
  782. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/mapping_store.py +0 -0
  783. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/postgres.py +0 -0
  784. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/__init__.py +0 -0
  785. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/client.py +0 -0
  786. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/connection_tuning.py +0 -0
  787. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/__init__.py +0 -0
  788. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  789. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/activity_writer_columns_v1.py +0 -0
  790. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  791. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  792. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  793. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  794. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/backup.py +0 -0
  795. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/backup_custody.py +0 -0
  796. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  797. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  798. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  799. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  800. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/community_names_v1.py +0 -0
  801. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/complexity_v1.py +0 -0
  802. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  803. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  804. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  805. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  806. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  807. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  808. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/documents_v1.py +0 -0
  809. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  810. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  811. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  812. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  813. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  814. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  815. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  816. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  817. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  818. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  819. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  820. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/episodes_v1.py +0 -0
  821. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  822. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  823. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  824. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  825. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  826. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  827. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  828. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  829. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  830. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  831. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  832. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  833. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/off_limits_carried_waiting_v1.py +0 -0
  834. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
  835. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  836. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
  837. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
  838. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
  839. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  840. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  841. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/registry.py +0 -0
  842. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/registry_checksums.json +0 -0
  843. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  844. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  845. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  846. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  847. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  848. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_objects.py +0 -0
  849. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  850. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  851. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  852. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  853. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
  854. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/transcripts_v1.py +0 -0
  855. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  856. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  857. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  858. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  859. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  860. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  861. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  862. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  863. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  864. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  865. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  866. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  867. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  868. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  869. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  870. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  871. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  872. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  873. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/paths.py +0 -0
  874. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/postgres.py +0 -0
  875. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/schema.py +0 -0
  876. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/schema_probe.py +0 -0
  877. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/storage_breakdown.py +0 -0
  878. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/write_gate.py +0 -0
  879. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/derived_row_identity.py +0 -0
  880. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/enrichment/__init__.py +0 -0
  881. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  882. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  883. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/normalized/__init__.py +0 -0
  884. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/normalized/normalized_store.py +0 -0
  885. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/__init__.py +0 -0
  886. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/decision.py +0 -0
  887. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/oplog_store.py +0 -0
  888. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/postgres.py +0 -0
  889. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/person/identity_resolver.py +0 -0
  890. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/projections/__init__.py +0 -0
  891. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/projections/index_ops_store.py +0 -0
  892. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/projections/vector_index_store.py +0 -0
  893. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/__init__.py +0 -0
  894. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/browser_flat_tables.py +0 -0
  895. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/file_store.py +0 -0
  896. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/raw_store.py +0 -0
  897. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/raw_tables_manager.py +0 -0
  898. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/sqlite_raw_store.py +0 -0
  899. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/security/encryption.py +0 -0
  900. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/signal_identity.py +0 -0
  901. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/source_settings.py +0 -0
  902. {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/user_identity.py +0 -0
  903. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sync/__init__.py +0 -0
  904. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sync/client.py +0 -0
  905. {topos_node-1.5.4 → topos_node-1.5.6}/topos/sync_handlers.py +0 -0
  906. {topos_node-1.5.4 → topos_node-1.5.6}/topos/testing/__init__.py +0 -0
  907. {topos_node-1.5.4 → topos_node-1.5.6}/topos/testing/lifespan.py +0 -0
  908. {topos_node-1.5.4 → topos_node-1.5.6}/topos/uds.py +0 -0
  909. {topos_node-1.5.4 → topos_node-1.5.6}/topos/uma_contact_enrichment.py +0 -0
  910. {topos_node-1.5.4 → topos_node-1.5.6}/topos/uma_filters.py +0 -0
  911. {topos_node-1.5.4 → topos_node-1.5.6}/topos/upgrades/__init__.py +0 -0
  912. {topos_node-1.5.4 → topos_node-1.5.6}/topos/upgrades/runner.py +0 -0
  913. {topos_node-1.5.4 → topos_node-1.5.6}/topos/utils/base_object.py +0 -0
  914. {topos_node-1.5.4 → topos_node-1.5.6}/topos/websocket_client.py +0 -0
  915. {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/dependency_links.txt +0 -0
  916. {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/entry_points.txt +0 -0
  917. {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/requires.txt +0 -0
  918. {topos_node-1.5.4 → topos_node-1.5.6}/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.4
3
+ Version: 1.5.6
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.4"
12
+ version = "1.5.6"
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.4"
4
- __version_info__ = (1, 5, 4)
3
+ __version__ = "1.5.6"
4
+ __version_info__ = (1, 5, 6)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -6,12 +6,13 @@ stay dumb renderers: identity + version for attach-don't-double-start, the
6
6
  log file location for a "Show Logs" action, and cached update state with a
7
7
  localhost-only trigger to apply an update.
8
8
 
9
- Update *checking* is not done here — the runtime update monitor started in
10
- app startup keeps ``get_update_info()`` fresh; this router only reads it.
9
+ Polling reads cached state. A manual check explicitly refreshes it from PyPI
10
+ off the event loop, without waiting for the six-hour runtime monitor.
11
11
  """
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
+ import asyncio
15
16
  import os
16
17
  import threading
17
18
  from time import time
@@ -21,7 +22,10 @@ from fastapi import APIRouter, HTTPException, Request
21
22
  from ..core.logging import get_log_file_path
22
23
  from ..runtime_update import (
23
24
  DEFAULT_PACKAGE_NAME,
25
+ UpdateCheckError,
26
+ _set_update_info,
24
27
  apply_package_update,
28
+ check_for_update,
25
29
  get_runtime_version,
26
30
  get_update_info,
27
31
  )
@@ -96,3 +100,21 @@ async def shell_apply_update(request: Request) -> dict:
96
100
 
97
101
  threading.Thread(target=worker, daemon=True, name="topos-shell-update").start()
98
102
  return {"started": True}
103
+
104
+
105
+ @router.post("/update/check")
106
+ async def shell_check_update(request: Request) -> dict:
107
+ if not _client_is_local(request):
108
+ raise HTTPException(status_code=403, detail="Shell update checks can only be triggered from localhost.")
109
+ # Never replace the update state while an install/restart is pending.
110
+ with _apply_lock:
111
+ pending = _apply_state["applying"] or _apply_state["last_result"] == "success"
112
+ if not pending:
113
+ try:
114
+ info = await asyncio.to_thread(check_for_update, DEFAULT_PACKAGE_NAME, strict=True)
115
+ except UpdateCheckError as exc:
116
+ # Keep the last known update; a failed network check is not proof
117
+ # the running node is current.
118
+ raise HTTPException(status_code=503, detail=str(exc)) from exc
119
+ _set_update_info(info)
120
+ return await shell_status()
@@ -149,6 +149,9 @@ class ControlPlaneClient:
149
149
  )
150
150
  self._inbound_semaphore = asyncio.Semaphore(self._inbound_concurrency_limit)
151
151
  self._inbound_tasks: set[asyncio.Task] = set()
152
+ # UI reads get a separate bounded reserve, never an unbounded bypass.
153
+ self._fast_inbound_tasks: set[asyncio.Task] = set()
154
+ self._fast_inbound_max_pending = 32
152
155
  self._inbound_lock = asyncio.Lock()
153
156
  # R-N154 M2: set at the start of a stop; new asks are refused while the ones in hand finish.
154
157
  self._draining = False
@@ -450,21 +453,30 @@ class ControlPlaneClient:
450
453
  if request_id:
451
454
  await self._send_ws_json(ws, {"id": request_id, "status": "error", "error": STOPPING_ERROR})
452
455
  return
456
+ if msg_type == "ping":
457
+ await self._handle_message(ws, data)
458
+ return
453
459
  if msg_type in _FAST_INBOUND_MESSAGE_TYPES:
460
+ if len(self._fast_inbound_tasks) >= self._fast_inbound_max_pending:
461
+ if msg_type == "healthcheck":
462
+ await self._send_ws_json(ws, self._healthcheck_snapshot_response(data.get("id")))
463
+ elif msg_type == "get_device_info" and self._device_info_snapshot_response(data.get("id")):
464
+ await self._send_ws_json(ws, self._device_info_snapshot_response(data.get("id")))
465
+ else:
466
+ await self._send_busy_response(ws, data)
467
+ return
454
468
  task = asyncio.create_task(self._handle_message(ws, data))
455
469
  self._inbound_tasks.add(task)
470
+ self._fast_inbound_tasks.add(task)
456
471
  task.add_done_callback(self._on_inbound_task_done)
457
472
  return
458
473
  async with self._inbound_lock:
459
- pending_count = len(self._inbound_tasks)
474
+ pending_count = len(self._inbound_tasks) - len(self._fast_inbound_tasks)
460
475
  if pending_count >= self._inbound_max_pending:
461
476
  logger.warning("Dropping inbound request due to saturation pending=%d", pending_count)
462
477
  request_id = data.get("id")
463
478
  if request_id:
464
- await self._send_ws_json(
465
- ws,
466
- {"id": request_id, "status": "error", "error": "Engine is busy. Retry shortly."},
467
- )
479
+ await self._send_busy_response(ws, data)
468
480
  return
469
481
  task = asyncio.create_task(self._handle_message_guarded(ws, data))
470
482
  self._inbound_tasks.add(task)
@@ -472,6 +484,15 @@ class ControlPlaneClient:
472
484
 
473
485
  def _on_inbound_task_done(self, task: asyncio.Task) -> None:
474
486
  self._inbound_tasks.discard(task)
487
+ self._fast_inbound_tasks.discard(task)
488
+
489
+ async def _send_busy_response(self, ws, data: Dict[str, Any]) -> None:
490
+ if data.get("id"):
491
+ await self._send_ws_json(ws, {
492
+ "id": data["id"], "type": data.get("type"), "status": "error",
493
+ "error": "Engine is busy. Retry shortly.", "error_code": "engine_busy",
494
+ "retry_after_seconds": 30,
495
+ })
475
496
 
476
497
  async def _handle_message_guarded(self, ws, data: Dict[str, Any]) -> None:
477
498
  async with self._inbound_semaphore:
@@ -591,7 +612,7 @@ class ControlPlaneClient:
591
612
  "id": request_id,
592
613
  "status": "ok",
593
614
  "type": "healthcheck",
594
- "payload": {"ok": True, "db_ok": db_ok, "snapshot_stale": True},
615
+ "payload": {"ok": True, "db_ok": db_ok, "snapshot_stale": True, "accepting_writes": False},
595
616
  }
596
617
 
597
618
  def _echo_request_type(self, resp: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]:
@@ -656,6 +677,11 @@ class ControlPlaneClient:
656
677
  resp = {"id": data.get("id"), "status": "error", "error": str(exc)}
657
678
  if resp is None:
658
679
  return # e.g. connection_info or message without id; CP has no pending request to match
680
+ if msg_type == "healthcheck" and resp.get("status") == "ok":
681
+ resp = {**resp, "payload": {
682
+ **(resp.get("payload") or {}),
683
+ "accepting_writes": not self._draining and len(self._inbound_tasks) - len(self._fast_inbound_tasks) < self._inbound_max_pending,
684
+ }}
659
685
  await self._send_ws_json(ws, self._echo_request_type(resp, data))
660
686
 
661
687
  async def _await_with_device_info_fallback(self, ws, data: Dict[str, Any], handler_future) -> dict[str, Any] | None:
@@ -696,7 +722,8 @@ class ControlPlaneClient:
696
722
  if isinstance(late, dict) and late.get("status") == "ok" and isinstance(late.get("payload"), dict):
697
723
  self.set_device_info_snapshot(late["payload"])
698
724
 
699
- asyncio.create_task(_refresh_from_late_answer())
725
+ # Keep late work in the bounded task set until it actually finishes.
726
+ await _refresh_from_late_answer()
700
727
  return None
701
728
 
702
729
  async def _await_with_healthcheck_fallback(self, ws, data: Dict[str, Any], handler_future) -> dict[str, Any] | None:
@@ -724,7 +751,7 @@ class ControlPlaneClient:
724
751
  if isinstance(late, dict) and late.get("status") == "ok" and isinstance(late.get("payload"), dict):
725
752
  self.set_healthcheck_snapshot(late["payload"])
726
753
 
727
- asyncio.create_task(_refresh_from_late_answer())
754
+ await _refresh_from_late_answer()
728
755
  return None
729
756
 
730
757
  async def send_message(self, message: Dict[str, Any]) -> None:
@@ -38,10 +38,13 @@ async def handle_migrate_browser_plugin_app_id(message: Dict[str, Any]) -> Optio
38
38
  req_id = message.get("id")
39
39
  from ..state import _migrate_legacy_browser_plugin_app_ids
40
40
 
41
- conn = hub.get_db_connection()
42
- if not conn:
41
+ def migrate():
42
+ conn = hub.get_db_connection()
43
+ return _migrate_legacy_browser_plugin_app_ids(conn) if conn else None
44
+
45
+ updated = await asyncio.to_thread(migrate)
46
+ if updated is None:
43
47
  return {"id": req_id, "status": "error", "error": "Database not available"}
44
- updated = _migrate_legacy_browser_plugin_app_ids(conn)
45
48
  return {"id": req_id, "status": "ok", "payload": {"updated_rows": updated}}
46
49
 
47
50
  @handles("get_request_counts")
@@ -51,11 +54,15 @@ async def handle_get_request_counts(message: Dict[str, Any]) -> Optional[Dict[st
51
54
  payload = message.get("payload") or {}
52
55
  owner_user_id = (payload.get("owner_user_id") or "").strip()
53
56
  since_days = min(max(int(payload.get("since_days") or 90), 1), 365)
54
- conn = hub.get_db_connection()
55
- if not owner_user_id and conn:
56
- owner_user_id = get_user_id(conn) or ""
57
- uma = get_uma_request_counts(conn, owner_user_id, since_days) if conn else {"total_read_requests": 0, "total_write_requests": 0, "by_app": []}
58
- mcp = get_mcp_request_counts(conn, since_days) if conn else {"by_source": [], "by_tool": [], "total": 0}
57
+ def counts():
58
+ # Resolve the connection on its worker thread, never pass a loop-owned handle.
59
+ conn = hub.get_db_connection()
60
+ owner = owner_user_id or (get_user_id(conn) if conn else "") or ""
61
+ uma = get_uma_request_counts(conn, owner, since_days) if conn else {"total_read_requests": 0, "total_write_requests": 0, "by_app": []}
62
+ mcp = get_mcp_request_counts(conn, since_days) if conn else {"by_source": [], "by_tool": [], "total": 0}
63
+ return uma, mcp
64
+
65
+ uma, mcp = await asyncio.to_thread(counts)
59
66
  return {"id": req_id, "status": "ok", "payload": {"uma": uma, "mcp": mcp}}
60
67
 
61
68
  @handles("get_ui_config")
@@ -198,7 +198,10 @@ async def handle_permissions_v2_share_counts(message):
198
198
  from ...permissions_v2.share_counts import count
199
199
  owner = _owner_gate(message, bound_only=True, unavailable="counts_unavailable")
200
200
  payload = _keys(owner.payload, {"binding", "request"}, {"binding", "request"})
201
- request = _keys(payload["request"], {"policy"}, {"policy"})
201
+ request = _keys(payload["request"], {"policy", "fact_preview_offset"}, {"policy"})
202
+ offset = request.get("fact_preview_offset", 0)
203
+ if type(offset) is not int or not 0 <= offset <= 100000:
204
+ raise _Refused(400, "payload_invalid")
202
205
  if not isinstance(request["policy"], dict):
203
206
  raise _Refused(400, "policy_invalid")
204
207
  try:
@@ -212,7 +215,7 @@ async def handle_permissions_v2_share_counts(message):
212
215
  if any(getattr(policy.binding, field) != value for field, value in owner.identity.model_dump().items()):
213
216
  raise _Refused(409, "binding_mismatch")
214
217
  service = owner.runtime.evidence_reviews(require_existing=True)
215
- return count(service.resolver, service.reviews, policy, now=int(time.time()))
218
+ return count(service.resolver, service.reviews, policy, now=int(time.time()), fact_preview_offset=offset)
216
219
  return await _respond(message, COUNTS, work, unavailable="counts_unavailable")
217
220
 
218
221
 
@@ -113,6 +113,9 @@ def _aggregate_uma_access_attribution(
113
113
 
114
114
  def _ensure_uma_access_requests_indexes(conn: sqlite3.Connection) -> None:
115
115
  try:
116
+ if conn.execute("SELECT 1 FROM sqlite_master WHERE type='index' AND name=?",
117
+ ("idx_uma_access_requests_owner_created",)).fetchone():
118
+ return
116
119
  # DDL takes SQLite's write lock at execute time — gate it with the
117
120
  # commit like every other writer (write_gate lock-order inversion).
118
121
  with with_db_write():
@@ -127,6 +130,9 @@ def _ensure_uma_access_requests_indexes(conn: sqlite3.Connection) -> None:
127
130
 
128
131
  def _ensure_mcp_request_log_indexes(conn: sqlite3.Connection) -> None:
129
132
  try:
133
+ if conn.execute("SELECT 1 FROM sqlite_master WHERE type='index' AND name=?",
134
+ ("idx_mcp_request_log_requested_at",)).fetchone():
135
+ return
130
136
  with with_db_write():
131
137
  conn.execute(
132
138
  f"CREATE INDEX IF NOT EXISTS idx_mcp_request_log_requested_at "
@@ -914,6 +920,9 @@ def _ensure_uma_access_requests_table(conn: sqlite3.Connection) -> None:
914
920
  def _migrate_legacy_browser_plugin_app_ids(conn: sqlite3.Connection) -> int:
915
921
  """Rewrite engine Activity counts from browser-plugin → browser-history-plugin (idempotent)."""
916
922
  try:
923
+ if not conn.execute(f"SELECT 1 FROM {UMA_ACCESS_REQUESTS_TABLE} WHERE app_id=? LIMIT 1",
924
+ (LEGACY_BROWSER_PLUGIN_APP_ID,)).fetchone():
925
+ return 0
917
926
  with with_db_write():
918
927
  cursor = conn.execute(
919
928
  f"UPDATE {UMA_ACCESS_REQUESTS_TABLE} SET app_id = ? WHERE app_id = ?",
@@ -37,10 +37,16 @@ async def dispatch_answer(ws, message):
37
37
  def work():
38
38
  service = get_runtime().answers()
39
39
  method = service.submit if kind == SUBMIT_TYPE else service.fetch
40
- return method(envelope=payload["envelope"], payload=payload["intent"], request_id=request_id)
40
+ result, output = method(envelope=payload["envelope"], payload=payload["intent"], request_id=request_id)
41
+ selective_answer = False
42
+ if kind == FETCH_TYPE:
43
+ from .signing import parse_envelope
44
+ _authority, policy = service._current(parse_envelope(payload["envelope"]))
45
+ selective_answer = getattr(policy.search, "selective_facts", None) is not None
46
+ return result, output, selective_answer
41
47
 
42
48
  try:
43
- result, output = await asyncio.wait_for(asyncio.to_thread(work), timeout=WAIT_SECONDS)
49
+ result, output, selective_answer = await asyncio.wait_for(asyncio.to_thread(work), timeout=WAIT_SECONDS)
44
50
  except asyncio.TimeoutError:
45
51
  # BL-159, counts-only: which door, never an id. The service's own line follows with its seconds.
46
52
  _log.warning("permissions answer relay: no result within %d s (%s)", WAIT_SECONDS,
@@ -48,6 +54,9 @@ async def dispatch_answer(ws, message):
48
54
  raise
49
55
  finally:
50
56
  reset_principal(token)
57
+ from .selective_facts import require_active_output
58
+ from . import switches
59
+ require_active_output(output, enabled=switches.on(switches.SELECTIVE_FACTS), selective_answer=selective_answer)
51
60
  await ws.send(canonical_bytes({"id": request_id, "type": kind, "status": "ok",
52
61
  "payload": {"result": result, "output": output}}).decode("ascii"))
53
62
  except AnswerBusy:
@@ -663,6 +663,11 @@ def collecting():
663
663
  _PENDING.reset(token)
664
664
 
665
665
 
666
+ def collecting_active() -> bool:
667
+ """Private owner/judge inspection is active; ordinary sharing installs no collector."""
668
+ return _PENDING.get() is not None
669
+
670
+
666
671
  def judge_id() -> str:
667
672
  from .shadow_labeler_local import MODEL, MODEL_REVISION
668
673
  return f"{MODEL}@{MODEL_REVISION}/{PROMPT_VERSION}/{hashlib.sha256(PROMPT.encode()).hexdigest()[:16]}"
@@ -0,0 +1,62 @@
1
+ """Owner-only grant-specific candidates. Release reuses the same qualifier."""
2
+ from .canonical import PolicyError
3
+ from .evidence import _json, _key
4
+ from .knowledge_projections import candidates, fact_projection
5
+ from .predicate_classes import scalar
6
+ from .selective_facts import ontology_of
7
+
8
+ REASONS = {
9
+ "eligible": "Passes this grant's current protections",
10
+ "owner_only": "Kept private by its producer or owner",
11
+ "fact_ontology_unselected": "This ontology is not selected",
12
+ "fact_excluded_from_grant": "Excluded from this grant",
13
+ "fact_ontology_unknown": "Missing or conflicting ontology provenance",
14
+ "fact_ontology_unsupported": "Ontology or predicate is outside this release",
15
+ "fact_not_grounded": "No supported owner-stated source sentence",
16
+ "fact_lineage_unsupported": "Fact dependencies are outside this release",
17
+ "fact_not_owner_stated": "The owner did not state this fact",
18
+ "entity_protected": "Off-limits protection applies",
19
+ "owner_opted_out": "You held this item back globally",
20
+ "evidence_not_permitted": "Supporting evidence fails this grant's choices",
21
+ "selective_facts_disabled": "Fact sharing is disabled",
22
+ "could_not_check": "Could not verify every protection",
23
+ }
24
+
25
+
26
+ def preview(walk, identities):
27
+ items = []
28
+ for table, fid in sorted(set(candidates(walk.conn, identities, ["fact"]))):
29
+ rows = walk.conn.execute("SELECT * FROM signal_objects WHERE object_id=?", (fid,)).fetchmany(2)
30
+ if len(rows) != 1:
31
+ continue
32
+ row = dict(rows[0])
33
+ try:
34
+ payload = _json(row["payload_json"], dict)
35
+ except PolicyError:
36
+ continue
37
+ try:
38
+ oid = ontology_of(row, payload)
39
+ except PolicyError:
40
+ oid = row.get("ontology_id") or "unregistered"
41
+ code, sources, projected = "eligible", [], None
42
+ try:
43
+ cached = walk.projection_results.get((table, fid))
44
+ if cached is not None:
45
+ projected, refusal = cached
46
+ if refusal is not None:
47
+ raise PolicyError(refusal)
48
+ else:
49
+ projected = fact_projection(walk.resolver, walk.conn, walk.floor, walk.frozen, None,
50
+ row, walk.policy, walk.lower_us, walk.upper_us)
51
+ for qualified, native in projected.sources:
52
+ identity = qualified.snapshot.message.identity
53
+ sources.append({"source_id": identity.source_id, "record_id": identity.record_id,
54
+ "excerpt": native[_key(identity)]["content"][:240]})
55
+ except PolicyError as exc:
56
+ code = exc.code if exc.code in REASONS else "could_not_check"
57
+ value = scalar(payload.get("predicate"), payload)
58
+ items.append({"fact_id": fid, "ontology_id": oid, "predicate": payload.get("predicate") or "unknown",
59
+ "statement": projected.content if code == "eligible" else value or "Unsupported structured fact", "assertion": "inferred" if
60
+ payload.get("altitude") in ("inferred", "predicted") or row.get("altitude") in ("inferred", "predicted") else "owner_stated",
61
+ "eligible": code == "eligible", "reason": code, "reason_text": REASONS[code], "sources": sources})
62
+ return items
@@ -8,6 +8,7 @@ from typing import Annotated, Literal
8
8
  from pydantic import Field, StringConstraints, field_validator, model_serializer, model_validator
9
9
 
10
10
  from .contract import Hash, Identifier, Number, StrictModel
11
+ from .selective_facts import SelectiveFacts
11
12
  from .search_contract import (SearchPolicy, SearchDeclaration, SearchOutputForm, SearchRelease,
12
13
  SearchRule, SearchMemberDecision, SearchSetDecision, OpaqueRecordId)
13
14
 
@@ -30,7 +31,7 @@ AnswerMode = Literal["only", "with_sources", "records"]
30
31
  # encoding and a policy signed before this field keeps its bytes.
31
32
  WriterDisclosure = Literal["origin", "provider", "model", "build"]
32
33
  # The declared-or-absent fields of the declaration (the serializer leaves an absent one out of the dump).
33
- DECLARED_OR_ABSENT = ("answers", "writer_disclosure")
34
+ DECLARED_OR_ABSENT = ("answers", "writer_disclosure", "selective_facts")
34
35
 
35
36
 
36
37
  class KnowledgeBinding(StrictModel):
@@ -73,6 +74,13 @@ class KnowledgeDeclaration(SearchDeclaration):
73
74
  time_semantics: Literal["underlying_evidence_time/v1"]
74
75
  answers: AnswerMode | None = None
75
76
  writer_disclosure: WriterDisclosure | None = None
77
+ selective_facts: SelectiveFacts | None = None
78
+
79
+ @model_validator(mode="after")
80
+ def selection_needs_facts(self):
81
+ if self.selective_facts is not None and "fact" not in self.result_types:
82
+ raise ValueError("fact selection without fact output")
83
+ return self
76
84
 
77
85
  @model_validator(mode="before")
78
86
  @classmethod
@@ -151,6 +159,16 @@ class MessageResult(KnowledgeRecord):
151
159
  class FactResult(KnowledgeRecord):
152
160
  kind: Literal["fact"]
153
161
  assertion: Literal["owner_stated", "inferred"]
162
+ ontology_id: Identifier | None = None
163
+ predicate: Identifier | None = None
164
+
165
+ @model_serializer(mode="wrap")
166
+ def omit_legacy_identity(self, handler):
167
+ encoded = handler(self)
168
+ for key in ("ontology_id", "predicate"):
169
+ if encoded.get(key) is None:
170
+ encoded.pop(key, None)
171
+ return encoded
154
172
 
155
173
 
156
174
  class GoalResult(KnowledgeRecord):
@@ -15,10 +15,9 @@ field clears `journal_goal_field.refusal` (Lane H1; `TOPOS_PERMISSIONS_V2_JOURNA
15
15
  off unless the node is bound); every other check above still applies to it. Under a grant that releases
16
16
  that entry itself, whole (`journal_entry_released`, decided per grant where the rule is asked), the field is a
17
17
  paragraph the grant already releases, and the rule's guards on the text's form are set aside; under
18
- any other grant they all apply. A fact citing exactly one journal entry that
19
- the entry does not state releases as `assertion: "inferred"` when its value clears every guard of
20
- `inferred_facts.refusal` (IF-6 v1; `TOPOS_PERMISSIONS_V2_DERIVED_FACTS`, default off, inert without the
21
- journal family); with the flag off it is `fact_not_grounded`, exactly as before.
18
+ any other grant they all apply. Selective facts cite only their authorized statement,
19
+ so their evidence does not require the raw journal output option. No inferred fact
20
+ is released through selective ontology sharing.
22
21
  """
23
22
  from __future__ import annotations
24
23
 
@@ -121,7 +120,7 @@ class Projection:
121
120
  # A journal entry is cited as a record (IF-5 §3): its own opaque id, its whole text, its one source.
122
121
  citations.append(dict(record_id=opaque_record_id(key,grant_id=grant_id,table=identity.table,
123
122
  source_id=source_id,dataset_id=identity.dataset_id,record_id=identity.record_id),
124
- source_id=source_id,content=row['content']))
123
+ source_id=source_id,content=self.content if self.kind == 'fact' else row['content']))
125
124
  times.append(_source_released(identity,row,precision))
126
125
  # Old support cannot gain a fresh date through recent extraction: the earliest source dates the item. A
127
126
  # source that cannot be dated at this precision (a stated day at `second`) dates nothing, so neither does it.
@@ -220,14 +219,14 @@ def _unrestricted(resolver,conn,reviews,review_db,table,record_id,row):
220
219
  return boundary
221
220
 
222
221
 
223
- def _journal_citation(resolver,conn,reviews,review_db,ref,identity,policy):
222
+ def _journal_citation(resolver,conn,reviews,review_db,ref,identity,policy,*,projection_only=False):
224
223
  """What a journal citation needs before its entry is qualified (IF-5 §2, §1.2).
225
224
 
226
225
  The entry is cited as a record, so the grant must sign the "Journal entries" option. When the item names a
227
226
  same-source twin rather than the member, the named row still vetoes: its own NSFW flag, deletion, owner-only
228
227
  mark, exclusion, the owner's opt-out and an Off-limits match over every column. The member is qualified next.
229
228
  """
230
- if 'journal_entry' not in policy.search.result_types:
229
+ if not projection_only and 'journal_entry' not in policy.search.result_types:
231
230
  raise PolicyError('journal_citation_needs_record_option')
232
231
  cited=_journal_entry_id(ref)
233
232
  if cited==identity.record_id:
@@ -275,14 +274,14 @@ def _inside(identity,row,lower_us,upper_us):
275
274
  raise PolicyError('evidence_outside_window')
276
275
 
277
276
 
278
- def _support(resolver,conn,floor,reviews,review_db,refs,policy,lower_us,upper_us,*,extra_domains=(),extra_sensitivity='none'):
277
+ def _support(resolver,conn,floor,reviews,review_db,refs,policy,lower_us,upper_us,*,extra_domains=(),extra_sensitivity='none',projection_only=False):
279
278
  if not isinstance(refs,list) or not 1<=len(refs)<=MAX_SUPPORT:
280
279
  raise PolicyError('lineage_identity_incomplete')
281
280
  result,seen,common=[],set(),None
282
281
  for ref in refs:
283
282
  identity=resolve_reference(resolver,conn,ref)
284
283
  if identity.table==JOURNAL:
285
- _journal_citation(resolver,conn,reviews,review_db,ref,identity,policy)
284
+ _journal_citation(resolver,conn,reviews,review_db,ref,identity,policy,projection_only=projection_only)
286
285
  if _key(identity) in seen: continue
287
286
  seen.add(_key(identity))
288
287
  qualified,rows=qualify_automatic_message(resolver,conn,floor,identity,reviews,review_db)
@@ -312,6 +311,11 @@ def fact_projection(resolver,conn,floor,reviews,review_db,row,policy,lower_us,up
312
311
  if row.get('object_type')!='fact' or row.get('valid_to') is not None:
313
312
  raise PolicyError('fact_not_current')
314
313
  payload=_json(row['payload_json'],dict)
314
+ from . import switches
315
+ from .selective_facts import authorize
316
+ if not switches.on(switches.SELECTIVE_FACTS):
317
+ raise PolicyError('selective_facts_disabled')
318
+ ontology_id = authorize(row, payload, policy)
315
319
  from .evidence import SHAREABLE_DISCLOSURES, implicit_labels
316
320
  if payload.get('disclosure') not in SHAREABLE_DISCLOSURES:
317
321
  raise PolicyError('fact_disclosure_unknown')
@@ -331,25 +335,25 @@ def fact_projection(resolver,conn,floor,reviews,review_db,row,policy,lower_us,up
331
335
  ranks={'none':0,'personal':1,'special':2,'unknown':3}
332
336
  sensitivity=max([sensitivity,*[c.sensitivity for c in checked.classifications]],key=ranks.__getitem__)
333
337
  sources,clause=_support(resolver,conn,floor,reviews,review_db,_json(row['source_refs_json'],list),policy,lower_us,upper_us,
334
- extra_domains=domains,extra_sensitivity=sensitivity)
338
+ extra_domains=domains,extra_sensitivity=sensitivity,projection_only=True)
335
339
  check_lineage(payload,sources)
336
340
  assertion='owner_stated'
337
341
  if not any(explicitly_states_claim(rows[_key(q.snapshot.message.identity)]['content'],predicate,value) for q,rows in sources):
338
- # OD-38, flag default off: one cited message on its own entails the claim (guards + a stored verdict).
339
- from .entailment_grounding import author_of, entailed, fact_claim
340
- claim=fact_claim(predicate,value)
341
- attested=subject in permit_subjects(conn,contract=ATTESTED_CONTRACT)
342
- if not any(entailed(resolver,claim=claim,row=row,identity=q.snapshot.message.identity,
343
- message=rows[_key(q.snapshot.message.identity)]['content'],author_is_owner=author_of(q),
344
- subject_attested=attested,boundary=boundary) for q,rows in sources):
345
- # IF-6 v1 (§2 step 7), flag default off: the extractor's fact on one journal entry, as inferred.
346
- from . import inferred_facts
347
- if not inferred_facts.enabled():
348
- raise PolicyError('fact_not_grounded')
349
- _inferred(conn,reviews,review_db,policy,sources,predicate,value,boundary)
350
- assertion='inferred'
342
+ # The selective release never enables inference or semantic grounding,
343
+ # even when a separate experimental switch is on.
344
+ # Preserve private owner inspection without admitting its verdict to sharing.
345
+ from .entailment_grounding import collecting_active
346
+ if collecting_active():
347
+ from .entailment_grounding import author_of, entailed, fact_claim
348
+ claim = fact_claim(predicate, value)
349
+ attested = subject in permit_subjects(conn, contract=ATTESTED_CONTRACT)
350
+ for qualified, native in sources:
351
+ entailed(resolver, claim=claim, row=row, identity=qualified.snapshot.message.identity,
352
+ message=native[_key(qualified.snapshot.message.identity)]['content'],
353
+ author_is_owner=author_of(qualified), subject_attested=attested, boundary=boundary)
354
+ raise PolicyError('fact_not_grounded')
351
355
  return Projection('signal_objects',row['object_id'],'fact',f'Owner {PREDICATE_TEXT[predicate]} {value}.',
352
- {'assertion':assertion},sources,rows_revision([[row]]),clause)
356
+ {'assertion':assertion, 'ontology_id':ontology_id, 'predicate':predicate},sources,rows_revision([[row]]),clause)
353
357
 
354
358
 
355
359
  def _inferred(conn,reviews,review_db,policy,sources,predicate,value,boundary):
@@ -632,6 +632,10 @@ class PolicyLedger:
632
632
  """Every released record is covered by its own member's permit rule, as p2a's shape check requires per read."""
633
633
  from .knowledge_contract import KnowledgePolicy, KnowledgeMemberBinding, VIEW_KNOWLEDGE
634
634
  if isinstance(policy, KnowledgePolicy):
635
+ from .selective_facts import validate_output, require_active_output
636
+ from . import switches
637
+ validate_output(policy, output)
638
+ require_active_output(output, enabled=switches.on(switches.SELECTIVE_FACTS))
635
639
  if decision.required_projection_id != VIEW_KNOWLEDGE:
636
640
  raise PolicyError("rule_binding")
637
641
  members = [KnowledgeMemberBinding.parse(m if isinstance(m,dict) else m.model_dump()) for m in members]
@@ -12,7 +12,9 @@ _FORMS = {
12
12
  'works_at': (r'I work at {value}', r'I am employed by {value}'),
13
13
  'worked_at': (r'I worked at {value}',),
14
14
  'works_on': (r'I work on {value}', r'I am working on {value} at work',
15
- r"I['’]m working on {value} at work", r'My work project is {value}'),
15
+ r"I['’]m working on {value} at work", r'My work project is {value}',
16
+ r'My current work project is {value}', r'At work, I am working on {value}',
17
+ r"At work, I['’]m working on {value}"),
16
18
  'role_is': (r'My role is {value}',),
17
19
  'certified_in': (r'I am certified in {value}', r"I['’]m certified in {value}"),
18
20
  'studied_at': (r'I studied at {value}',),
@@ -130,13 +130,14 @@ once for the next round, which follows that restore. ``TOPOS_PERMISSIONS_V2_INTE
130
130
  set off turns the second tries off: the refresh is then what it was without them, and its
131
131
  receipt carries none of their counts.
132
132
 
133
- With ``TOPOS_PERMISSIONS_V2_DERIVED_FACTS`` also on (IF-6 §10; inert without the journal family), a fact the
133
+ With ``TOPOS_PERMISSIONS_V2_SELECTIVE_FACTS_ENABLED`` on, or the legacy
134
+ ``TOPOS_PERMISSIONS_V2_DERIVED_FACTS`` experiment on (IF-6 §10; inert without the journal family), a fact the
134
135
  extractor writes after a grant's index was built (the derivation pass lags the ingest, or a re-derivation closes
135
136
  and replaces a fact on an already-indexed entry) moves no index basis and no member row, so no drift would drop
136
137
  the index and the fact would wait for an unrelated rebuild. ``observe`` therefore keeps a cheap digest of the
137
138
  facts (:func:`fact_digest`: their count, the highest rowid, the latest ``valid_from`` and ``valid_to``), kept in
138
139
  the state file so a restart compares with the last one seen; when it moves, the active knowledge grants that could
139
- release an inferred fact (v1: they sign ``journal_entry`` and ``fact``) and have an index here are queued on the
140
+ release a fact (explicit selective consent, or the legacy journal/fact experiment) and have an index here are queued on the
140
141
  restore's own queue, cause ``facts_changed`` (its debounce, interval, deferral and backoff). A grant whose rebuild
141
142
  is running when its facts move again stays queued for one more rebuild, so a fact written behind a build's
142
143
  snapshot is not dropped with the finished entry. With the flag off nothing is read or queued.
@@ -340,7 +341,7 @@ class RefreshSettings:
340
341
  if restore:
341
342
  # The projection's own reading of its flag (and of the journal family it needs), so they never disagree.
342
343
  from .inferred_facts import enabled as derived_facts_enabled
343
- facts = derived_facts_enabled(env)
344
+ facts = derived_facts_enabled(env) or switches.on(switches.SELECTIVE_FACTS, env)
344
345
  return cls(restore=restore, catchup=catchup,
345
346
  min_interval=float(switches.number(switches.INDEX_RESTORE_MIN_INTERVAL, env)),
346
347
  max_assessed=switches.number(switches.ASSESSMENT_CATCHUP_MAX_PER_PASS, env), interests=interests,
@@ -752,7 +753,7 @@ class RefreshLoop:
752
753
  # -- IF-6 §10: facts the extractor wrote after a build -----------------
753
754
 
754
755
  def _observe_facts(self, service) -> None:
755
- """Queue the grants that could release an inferred fact when the facts moved since the last observation
756
+ """Queue the grants that could release a fact when the facts moved since the last observation
756
757
  (the last one recorded in the state file across a restart). The first observation only records."""
757
758
  if not self.settings.facts:
758
759
  return
@@ -784,8 +785,7 @@ class RefreshLoop:
784
785
  return None
785
786
 
786
787
  def _fact_grants(self, now: int) -> list[str]:
787
- """Active knowledge grants that could release an inferred fact (IF-6 v1: they sign `journal_entry` and
788
- `fact`) and have an index here, published or owed. A grant that never had an index is still never built
788
+ """Active knowledge grants with selective fact consent or the legacy journal/fact experiment and have an index here, published or owed. A grant that never had an index is still never built
789
789
  here: the owner hooks build it."""
790
790
  from .search_index import index_path
791
791
  names = {path.name for path in self.root.glob("grant-*.db")}
@@ -793,7 +793,9 @@ class RefreshLoop:
793
793
  owed = set(self._pending)
794
794
  return [grant_id for grant_id, _authority, policy in self._active_grants(now)
795
795
  if policy.versions.capability == CAPABILITY_KNOWLEDGE_SEARCH
796
- and {"journal_entry", "fact"} <= set(policy.search.result_types)
796
+ and "fact" in policy.search.result_types
797
+ and ({"journal_entry", "fact"} <= set(policy.search.result_types)
798
+ or getattr(policy.search, "selective_facts", None) is not None)
797
799
  and (index_path(self.root, grant_id).name in names or grant_id in owed)]
798
800
 
799
801
  def _request_fact_rebuilds(self, now: float) -> int: