topos-node 1.4.1__tar.gz → 1.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (883) hide show
  1. {topos_node-1.4.1 → topos_node-1.4.2}/MANIFEST.in +3 -0
  2. {topos_node-1.4.1/topos_node.egg-info → topos_node-1.4.2}/PKG-INFO +2 -1
  3. {topos_node-1.4.1 → topos_node-1.4.2}/pyproject.toml +3 -1
  4. {topos_node-1.4.1 → topos_node-1.4.2}/topos/__version__.py +2 -2
  5. topos_node-1.4.2/topos/api/permissions_native_probe.py +150 -0
  6. topos_node-1.4.2/topos/api/permissions_search_maintenance.py +44 -0
  7. {topos_node-1.4.1 → topos_node-1.4.2}/topos/app.py +4 -0
  8. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2.py +120 -10
  9. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/evidence_time.py +32 -13
  10. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/extract.py +5 -1
  11. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole.py +3 -0
  12. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole_guard.py +42 -0
  13. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/chatgpt_owner_snapshot.py +15 -3
  14. topos_node-1.4.2/topos/ingestion/imessage_attributed_text.py +130 -0
  15. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/owner_snapshot.py +37 -3
  16. topos_node-1.4.2/topos/permissions_v2/automatic_message_review.py +259 -0
  17. topos_node-1.4.2/topos/permissions_v2/automatic_review_worker.py +136 -0
  18. topos_node-1.4.2/topos/permissions_v2/chatgpt_coverage.py +99 -0
  19. topos_node-1.4.2/topos/permissions_v2/entity_boundary.py +415 -0
  20. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/evidence.py +267 -37
  21. topos_node-1.4.2/topos/permissions_v2/evidence_reviews.py +422 -0
  22. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/fact_bridge.py +1 -1
  23. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/source_bridge.py +1 -1
  24. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_eligibility.py +3 -0
  25. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity.py +2 -0
  26. topos_node-1.4.2/topos/permissions_v2/imessage_reconciliation.py +229 -0
  27. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_provenance.py +6 -0
  28. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_snapshot_facts.py +30 -11
  29. topos_node-1.4.2/topos/permissions_v2/knowledge_contract.py +156 -0
  30. topos_node-1.4.2/topos/permissions_v2/knowledge_projections.py +263 -0
  31. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ledger.py +31 -7
  32. topos_node-1.4.2/topos/permissions_v2/message_evidence.py +287 -0
  33. topos_node-1.4.2/topos/permissions_v2/message_review_contract.py +103 -0
  34. topos_node-1.4.2/topos/permissions_v2/native_claim_grounding.py +46 -0
  35. topos_node-1.4.2/topos/permissions_v2/native_imessage_probe.py +218 -0
  36. topos_node-1.4.2/topos/permissions_v2/reconciliation_facts.py +181 -0
  37. topos_node-1.4.2/topos/permissions_v2/reconciliation_provenance.py +136 -0
  38. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/registry.py +19 -7
  39. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/release.py +22 -4
  40. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/runtime.py +98 -9
  41. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_contract.py +80 -1
  42. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_index.py +314 -64
  43. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_release.py +92 -26
  44. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_transport.py +9 -3
  45. topos_node-1.4.2/topos/permissions_v2/shadow_rubric.pinned.md +30 -0
  46. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/signing.py +38 -6
  47. topos_node-1.4.2/topos/permissions_v2/snapshot_message_facts.py +46 -0
  48. {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/handled_message_types.json +10 -0
  49. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/retrieval.py +14 -2
  50. topos_node-1.4.2/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +32 -0
  51. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/registry.py +5 -0
  52. {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_contact_enrichment.py +1 -5
  53. {topos_node-1.4.1 → topos_node-1.4.2}/topos/upgrades/manifests.json +8 -0
  54. {topos_node-1.4.1 → topos_node-1.4.2/topos_node.egg-info}/PKG-INFO +2 -1
  55. {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/SOURCES.txt +19 -0
  56. {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/requires.txt +1 -0
  57. topos_node-1.4.1/topos/permissions_v2/evidence_reviews.py +0 -218
  58. {topos_node-1.4.1 → topos_node-1.4.2}/LICENSE +0 -0
  59. {topos_node-1.4.1 → topos_node-1.4.2}/README.md +0 -0
  60. {topos_node-1.4.1 → topos_node-1.4.2}/setup.cfg +0 -0
  61. {topos_node-1.4.1 → topos_node-1.4.2}/shared/__init__.py +0 -0
  62. {topos_node-1.4.1 → topos_node-1.4.2}/shared/filtering.py +0 -0
  63. {topos_node-1.4.1 → topos_node-1.4.2}/shared/schema_registry.py +0 -0
  64. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_active_database_binding.py +0 -0
  65. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_active_ingestion_binding.py +0 -0
  66. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_extensions.py +0 -0
  67. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_gate_leg_hermeticity.py +0 -0
  68. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_hub_pipeline_offline_first.py +0 -0
  69. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_lane_shards.py +0 -0
  70. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_llm_integrations_storage.py +0 -0
  71. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_local_gate_composition.py +0 -0
  72. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_owner_database_hermeticity.py +0 -0
  73. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_prewarm_first_run.py +0 -0
  74. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_profile_hygiene.py +0 -0
  75. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_profiles.py +0 -0
  76. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_protocol_handled_types.py +0 -0
  77. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_query_field_contract.py +0 -0
  78. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_sync_dep_pins.py +0 -0
  79. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_system_computer_name.py +0 -0
  80. {topos_node-1.4.1 → topos_node-1.4.2}/tests/test_topos_home_hermeticity.py +0 -0
  81. {topos_node-1.4.1 → topos_node-1.4.2}/topos/__init__.py +0 -0
  82. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/__init__.py +0 -0
  83. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/dataset_resolution.py +0 -0
  84. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/duckdb_adapter.py +0 -0
  85. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/luck_surface.py +0 -0
  86. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_communities.py +0 -0
  87. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_directed.py +0 -0
  88. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_graph.py +0 -0
  89. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/messenger_labels.py +0 -0
  90. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/person_graph.py +0 -0
  91. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/person_overlay.py +0 -0
  92. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/profiles.py +0 -0
  93. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/query_engine.py +0 -0
  94. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/raw_queries.py +0 -0
  95. {topos_node-1.4.1 → topos_node-1.4.2}/topos/analytics/relationship_reads.py +0 -0
  96. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/__init__.py +0 -0
  97. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/analytics.py +0 -0
  98. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/app_registry.py +0 -0
  99. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/backup.py +0 -0
  100. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/community_naming_config.py +0 -0
  101. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/compute_remote.py +0 -0
  102. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/connected_apps.py +0 -0
  103. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/conversation_context.py +0 -0
  104. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/data_commit.py +0 -0
  105. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/data_explorer_table_prefs.py +0 -0
  106. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/database_explorer.py +0 -0
  107. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/db.py +0 -0
  108. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/device.py +0 -0
  109. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/disk_space_config.py +0 -0
  110. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/engine_run.py +0 -0
  111. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/enrichment.py +0 -0
  112. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/enrichment_lab.py +0 -0
  113. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/facts_llm_config.py +0 -0
  114. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/filter_lab.py +0 -0
  115. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/health.py +0 -0
  116. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/home_chat.py +0 -0
  117. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ingestion_api.py +0 -0
  118. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ingestion_compat.py +0 -0
  119. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ingestion_sources.py +0 -0
  120. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/intelligence_lifecycle.py +0 -0
  121. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/llm.py +0 -0
  122. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/local_mcp.py +0 -0
  123. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/messenger_analytics.py +0 -0
  124. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/permissions_identity.py +0 -0
  125. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/permissions_ingestion.py +0 -0
  126. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/privacy_disclose.py +0 -0
  127. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/query_api.py +0 -0
  128. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/runtime_bootstrap.py +0 -0
  129. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sanitization_ollama_config.py +0 -0
  130. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/shell.py +0 -0
  131. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/signal.py +0 -0
  132. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/signal_extraction_config.py +0 -0
  133. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/source_install.py +0 -0
  134. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/source_scrub.py +0 -0
  135. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sources.py +0 -0
  136. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sources_overview.py +0 -0
  137. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/sync.py +0 -0
  138. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/tool_index.py +0 -0
  139. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/ui_config.py +0 -0
  140. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/uma_data.py +0 -0
  141. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/upgrades.py +0 -0
  142. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/usage.py +0 -0
  143. {topos_node-1.4.1 → topos_node-1.4.2}/topos/api/user_identity.py +0 -0
  144. {topos_node-1.4.1 → topos_node-1.4.2}/topos/auth.py +0 -0
  145. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/__init__.py +0 -0
  146. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/declared_field_map.py +0 -0
  147. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/__init__.py +0 -0
  148. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/base.py +0 -0
  149. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  150. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  151. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  152. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  153. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  154. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  155. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  156. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  157. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
  158. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/models.py +0 -0
  159. {topos_node-1.4.1 → topos_node-1.4.2}/topos/canonicalization/resolver.py +0 -0
  160. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/__init__.py +0 -0
  161. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/__main__.py +0 -0
  162. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/assets/topos_black.png +0 -0
  163. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/assets/topos_blk_rounded.png +0 -0
  164. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/assets/topos_white.png +0 -0
  165. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/commands.py +0 -0
  166. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/profile_cmd.py +0 -0
  167. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/reprocess_cmd.py +0 -0
  168. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/setup_models_cmd.py +0 -0
  169. {topos_node-1.4.1 → topos_node-1.4.2}/topos/cli/tray.py +0 -0
  170. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/__init__.py +0 -0
  171. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/conversation_context_llm.py +0 -0
  172. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/facts_llm.py +0 -0
  173. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/local_model_builds.py +0 -0
  174. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/model_packs.py +0 -0
  175. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/node_function_providers.py +0 -0
  176. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/sanitization_ollama.py +0 -0
  177. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/settings.py +0 -0
  178. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/signal_extraction.py +0 -0
  179. {topos_node-1.4.1 → topos_node-1.4.2}/topos/config/uvicorn_logging.json +0 -0
  180. {topos_node-1.4.1 → topos_node-1.4.2}/topos/contacts/__init__.py +0 -0
  181. {topos_node-1.4.1 → topos_node-1.4.2}/topos/contacts/identity.py +0 -0
  182. {topos_node-1.4.1 → topos_node-1.4.2}/topos/control_plane_client.py +0 -0
  183. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/__init__.py +0 -0
  184. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/api_models.py +0 -0
  185. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/connection_resilience.py +0 -0
  186. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/db_health.py +0 -0
  187. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/device_helpers.py +0 -0
  188. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/errors.py +0 -0
  189. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/events.py +0 -0
  190. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/__init__.py +0 -0
  191. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/aggregate.py +0 -0
  192. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/common.py +0 -0
  193. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/complexity.py +0 -0
  194. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/config.py +0 -0
  195. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/contacts_import.py +0 -0
  196. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/database_explorer.py +0 -0
  197. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/derivation.py +0 -0
  198. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/device.py +0 -0
  199. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/enrichment.py +0 -0
  200. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/enrichment_lab.py +0 -0
  201. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/filter_lab.py +0 -0
  202. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/graph_query.py +0 -0
  203. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/graph_summary.py +0 -0
  204. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/home_chat.py +0 -0
  205. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/ingest.py +0 -0
  206. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/mcp_client_elevations.py +0 -0
  207. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/mcp_clients.py +0 -0
  208. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/messages.py +0 -0
  209. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/messenger_analytics.py +0 -0
  210. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2_identity.py +0 -0
  211. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
  212. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/permissions_v2_release.py +0 -0
  213. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/query.py +0 -0
  214. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/registry.py +0 -0
  215. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/routines.py +0 -0
  216. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/shadow_rescore.py +0 -0
  217. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/signal_features.py +0 -0
  218. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/sources.py +0 -0
  219. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/timeline_daily.py +0 -0
  220. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/tool_index.py +0 -0
  221. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/handlers/uma.py +0 -0
  222. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/logging.py +0 -0
  223. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/metrics.py +0 -0
  224. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/routine_access.py +0 -0
  225. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/startup_banner.py +0 -0
  226. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/state.py +0 -0
  227. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/table_layers.py +0 -0
  228. {topos_node-1.4.1 → topos_node-1.4.2}/topos/core/types.py +0 -0
  229. {topos_node-1.4.1 → topos_node-1.4.2}/topos/data_explorer_row_delete.py +0 -0
  230. {topos_node-1.4.1 → topos_node-1.4.2}/topos/data_explorer_table_prefs.py +0 -0
  231. {topos_node-1.4.1 → topos_node-1.4.2}/topos/data_explorer_tables.py +0 -0
  232. {topos_node-1.4.1 → topos_node-1.4.2}/topos/defaults.py +0 -0
  233. {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/__init__.py +0 -0
  234. {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/canonical_writer.py +0 -0
  235. {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/content_policy.py +0 -0
  236. {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/field_registry.py +0 -0
  237. {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/privacy_layer.py +0 -0
  238. {topos_node-1.4.1 → topos_node-1.4.2}/topos/disclosure/tier.py +0 -0
  239. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/__init__.py +0 -0
  240. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/__init__.py +0 -0
  241. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/base.py +0 -0
  242. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/generative_prompts.py +0 -0
  243. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/generative_response.py +0 -0
  244. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/huggingface.py +0 -0
  245. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/ollama.py +0 -0
  246. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/openai.py +0 -0
  247. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/openai_compatible.py +0 -0
  248. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/redpill.py +0 -0
  249. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/backends/stub.py +0 -0
  250. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/client.py +0 -0
  251. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/disk_space.py +0 -0
  252. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/engine.py +0 -0
  253. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/hosted_llm_wallet.py +0 -0
  254. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/intake.py +0 -0
  255. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/memory_utils.py +0 -0
  256. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/model_cache.py +0 -0
  257. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/model_manager.py +0 -0
  258. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_install.py +0 -0
  259. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_pull.py +0 -0
  260. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_runtime.py +0 -0
  261. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/ollama_setup_guidance.py +0 -0
  262. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/pipeline_memory.py +0 -0
  263. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/queue_manager.py +0 -0
  264. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/registration.py +0 -0
  265. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/result_formatter.py +0 -0
  266. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/router.py +0 -0
  267. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/scoped_token.py +0 -0
  268. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/tasks.py +0 -0
  269. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/torch_runtime.py +0 -0
  270. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/transport.py +0 -0
  271. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/usage_guard.py +0 -0
  272. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/usage_observation.py +0 -0
  273. {topos_node-1.4.1 → topos_node-1.4.2}/topos/engine/validator.py +0 -0
  274. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/__init__.py +0 -0
  275. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/catalog.py +0 -0
  276. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/derivation_recovery.py +0 -0
  277. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/derived_tables.py +0 -0
  278. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/job_readiness.py +0 -0
  279. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/job_writer.py +0 -0
  280. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/__init__.py +0 -0
  281. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/base.py +0 -0
  282. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  283. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  284. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  285. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  286. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  287. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  288. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  289. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  290. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  291. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  292. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  293. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  294. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  295. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  296. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  297. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  298. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  299. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  300. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  301. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  302. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  303. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  304. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
  305. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  306. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
  307. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  308. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  309. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/model_overrides.py +0 -0
  310. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/__init__.py +0 -0
  311. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/manager.py +0 -0
  312. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/mvp_defaults.py +0 -0
  313. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/registry.py +0 -0
  314. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/models/versioning.py +0 -0
  315. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/orchestrator.py +0 -0
  316. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/pipeline_activity.py +0 -0
  317. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/processor.py +0 -0
  318. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/progress_bar.py +0 -0
  319. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/record_progress.py +0 -0
  320. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/registry_contract.py +0 -0
  321. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/signal_derivation_config.json +0 -0
  322. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment/source_overrides.py +0 -0
  323. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/__init__.py +0 -0
  324. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/bundles.py +0 -0
  325. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/model_resolve.py +0 -0
  326. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/schema.py +0 -0
  327. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/service.py +0 -0
  328. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/store.py +0 -0
  329. {topos_node-1.4.1 → topos_node-1.4.2}/topos/enrichment_lab/worker.py +0 -0
  330. {topos_node-1.4.1 → topos_node-1.4.2}/topos/evals/__init__.py +0 -0
  331. {topos_node-1.4.1 → topos_node-1.4.2}/topos/evals/enrichment_eval.py +0 -0
  332. {topos_node-1.4.1 → topos_node-1.4.2}/topos/extensions.py +0 -0
  333. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/__init__.py +0 -0
  334. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/canonical.py +0 -0
  335. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/engine.py +0 -0
  336. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/entropy.py +0 -0
  337. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/focus.py +0 -0
  338. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/graph_metrics.py +0 -0
  339. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/influence.py +0 -0
  340. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/projection.py +0 -0
  341. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/snapshots.py +0 -0
  342. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/store.py +0 -0
  343. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/topic_merge.py +0 -0
  344. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/topics.py +0 -0
  345. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/topics_daily.py +0 -0
  346. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/complexity/volatility.py +0 -0
  347. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/__init__.py +0 -0
  348. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  349. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  350. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  351. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  352. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  353. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  354. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  355. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  356. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  357. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  358. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  359. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  360. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  361. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  362. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  363. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  364. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  365. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  366. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  367. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  368. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  369. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
  370. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  371. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  372. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  373. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  374. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  375. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  376. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  377. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  378. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  379. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  380. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  381. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  382. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  383. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  384. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  385. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/candidates.py +0 -0
  386. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/commitments.py +0 -0
  387. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/guard.py +0 -0
  388. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/kernels.py +0 -0
  389. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/net_subject_policy.py +0 -0
  390. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/packs.py +0 -0
  391. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/person_bridge.py +0 -0
  392. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/person_reading.py +0 -0
  393. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/prefilter.py +0 -0
  394. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/registry.py +0 -0
  395. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/report_card.py +0 -0
  396. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/router.py +0 -0
  397. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/social_bench.py +0 -0
  398. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/social_kernels.py +0 -0
  399. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/surfaces.py +0 -0
  400. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/synthesize.py +0 -0
  401. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/template.py +0 -0
  402. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/verify.py +0 -0
  403. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/derivation/writer.py +0 -0
  404. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/__init__.py +0 -0
  405. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/affinity.py +0 -0
  406. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/affinity_owner.py +0 -0
  407. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/affinity_quality.py +0 -0
  408. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/chatgpt_declared.py +0 -0
  409. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/community_names.py +0 -0
  410. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/community_naming.py +0 -0
  411. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/consolidation.py +0 -0
  412. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/context_vectors.py +0 -0
  413. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/cypher.py +0 -0
  414. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/declared_mappings.py +0 -0
  415. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/discourse_graph.py +0 -0
  416. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/dossier.py +0 -0
  417. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/edges.py +0 -0
  418. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/fact_materializer.py +0 -0
  419. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/graph_enrichers.py +0 -0
  420. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/graph_refresh.py +0 -0
  421. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/graph_search.py +0 -0
  422. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/linking.py +0 -0
  423. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/maintenance.py +0 -0
  424. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/mention_lineage.py +0 -0
  425. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/mention_lineage_lane.py +0 -0
  426. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/owner.py +0 -0
  427. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/reads.py +0 -0
  428. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/rebuild_subprocess.py +0 -0
  429. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/resolver.py +0 -0
  430. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/entities/structured_fields.py +0 -0
  431. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/__init__.py +0 -0
  432. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/llm_extract.py +0 -0
  433. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/reactions.py +0 -0
  434. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/reads.py +0 -0
  435. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/store.py +0 -0
  436. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/facts/verdicts.py +0 -0
  437. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/fit/evaluator.py +0 -0
  438. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/fit/opportunity_types.json +0 -0
  439. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/__init__.py +0 -0
  440. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole_llm.py +0 -0
  441. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  442. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/derived_scrub.py +0 -0
  443. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/exclusions.py +0 -0
  444. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/gc.py +0 -0
  445. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/lifecycle/record_protection.py +0 -0
  446. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/provenance/__init__.py +0 -0
  447. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/provenance/posture.py +0 -0
  448. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/provenance/roles.py +0 -0
  449. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/__init__.py +0 -0
  450. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_canonical_loader.py +0 -0
  451. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_ontology.py +0 -0
  452. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_renderer.py +0 -0
  453. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/brief_schemas.py +0 -0
  454. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/chunking.py +0 -0
  455. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/cluster_labels.py +0 -0
  456. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/conversation_context.py +0 -0
  457. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/conversation_windows.py +0 -0
  458. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/data_health.py +0 -0
  459. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  460. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/intentions.json +0 -0
  461. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/interests.json +0 -0
  462. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/memory.json +0 -0
  463. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/places.json +0 -0
  464. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/profile.json +0 -0
  465. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/relationships.json +0 -0
  466. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/resources.json +0 -0
  467. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  468. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/time.json +0 -0
  469. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/wellbeing.json +0 -0
  470. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/definitions/work.json +0 -0
  471. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/derived_index.py +0 -0
  472. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/derived_spec.py +0 -0
  473. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_briefs.py +0 -0
  474. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_definition_loader.py +0 -0
  475. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_profiles.py +0 -0
  476. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/dimension_registry.py +0 -0
  477. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/embed_context.py +0 -0
  478. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/extraction/artifact_router.py +0 -0
  479. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/extraction/artifact_store.py +0 -0
  480. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/extraction/rule_extractors.py +0 -0
  481. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/graph_sanitize.py +0 -0
  482. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/hybrid_search.py +0 -0
  483. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/incremental_clustering.py +0 -0
  484. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/model_recommendations.py +0 -0
  485. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/query_embed_cache.py +0 -0
  486. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/schemas.py +0 -0
  487. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/service.py +0 -0
  488. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/signal_object_store.py +0 -0
  489. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/source_hydration.py +0 -0
  490. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/structured_signal.py +0 -0
  491. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/tool_index.py +0 -0
  492. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/topic_clustering.py +0 -0
  493. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/aggregates.py +0 -0
  494. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/commitments.py +0 -0
  495. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/rhythm.py +0 -0
  496. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  497. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/vector_codec.py +0 -0
  498. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/vector_math.py +0 -0
  499. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/signal/vector_settings.py +0 -0
  500. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/__init__.py +0 -0
  501. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/definitions.py +0 -0
  502. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/engine.py +0 -0
  503. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/fold.py +0 -0
  504. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/stats/insights.py +0 -0
  505. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/temporal/__init__.py +0 -0
  506. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/temporal/points.py +0 -0
  507. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/temporal/records.py +0 -0
  508. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/timeline_projection.py +0 -0
  509. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/timeline_rollup.py +0 -0
  510. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/__init__.py +0 -0
  511. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/badges.py +0 -0
  512. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/daily.py +0 -0
  513. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/dashboard.py +0 -0
  514. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/instruments.py +0 -0
  515. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/intents.py +0 -0
  516. {topos_node-1.4.1 → topos_node-1.4.2}/topos/features/triage/readiness.py +0 -0
  517. {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/__init__.py +0 -0
  518. {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/bundles.py +0 -0
  519. {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/schema.py +0 -0
  520. {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/service.py +0 -0
  521. {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/store.py +0 -0
  522. {topos_node-1.4.1 → topos_node-1.4.2}/topos/filter_lab/worker.py +0 -0
  523. {topos_node-1.4.1 → topos_node-1.4.2}/topos/home_chat/__init__.py +0 -0
  524. {topos_node-1.4.1 → topos_node-1.4.2}/topos/home_chat/schema.py +0 -0
  525. {topos_node-1.4.1 → topos_node-1.4.2}/topos/home_chat/store.py +0 -0
  526. {topos_node-1.4.1 → topos_node-1.4.2}/topos/hosted_pool_lease.py +0 -0
  527. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/__init__.py +0 -0
  528. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/canonical_pipeline.py +0 -0
  529. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/checkpoints/__init__.py +0 -0
  530. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  531. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  532. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/inbox_crypto.py +0 -0
  533. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/inbox_drain.py +0 -0
  534. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/ingest_helpers.py +0 -0
  535. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/jobs.py +0 -0
  536. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/journal_location_fanout.py +0 -0
  537. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/journal_time_log_normalize.py +0 -0
  538. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/local_exports.py +0 -0
  539. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/local_sync.py +0 -0
  540. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/local_sync_jobs.py +0 -0
  541. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/log_preview.py +0 -0
  542. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/manager.py +0 -0
  543. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parser.py +0 -0
  544. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/__init__.py +0 -0
  545. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/base.py +0 -0
  546. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/browser_parser.py +0 -0
  547. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
  548. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  549. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  550. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  551. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  552. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/documents_parser.py +0 -0
  553. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  554. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  555. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/grok_parser.py +0 -0
  556. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
  557. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/transcript_parser.py +0 -0
  558. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  559. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/progress.py +0 -0
  560. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/reprocess.py +0 -0
  561. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/__init__.py +0 -0
  562. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/base.py +0 -0
  563. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/calendar.py +0 -0
  564. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/chatgpt.py +0 -0
  565. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/contact_importers.py +0 -0
  566. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/grok.py +0 -0
  567. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/imessage_reader.py +0 -0
  568. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
  569. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/sources/signal_reader.py +0 -0
  570. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/state_machine.py +0 -0
  571. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/triggers/__init__.py +0 -0
  572. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/triggers/file_trigger.py +0 -0
  573. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  574. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  575. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/__init__.py +0 -0
  576. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/base.py +0 -0
  577. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/schema_registry.py +0 -0
  578. {topos_node-1.4.1 → topos_node-1.4.2}/topos/ingestion/validation/schema_validator.py +0 -0
  579. {topos_node-1.4.1 → topos_node-1.4.2}/topos/lineage/__init__.py +0 -0
  580. {topos_node-1.4.1 → topos_node-1.4.2}/topos/lineage/provenance.py +0 -0
  581. {topos_node-1.4.1 → topos_node-1.4.2}/topos/lineage/tracker.py +0 -0
  582. {topos_node-1.4.1 → topos_node-1.4.2}/topos/llm_integrations_storage.py +0 -0
  583. {topos_node-1.4.1 → topos_node-1.4.2}/topos/mcp_clients.py +0 -0
  584. {topos_node-1.4.1 → topos_node-1.4.2}/topos/mcp_stdio_proxy.py +0 -0
  585. {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/__init__.py +0 -0
  586. {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/alerts.py +0 -0
  587. {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/metrics.py +0 -0
  588. {topos_node-1.4.1 → topos_node-1.4.2}/topos/observability/tracing.py +0 -0
  589. {topos_node-1.4.1 → topos_node-1.4.2}/topos/openai_client.py +0 -0
  590. {topos_node-1.4.1 → topos_node-1.4.2}/topos/owner_key.py +0 -0
  591. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/__init__.py +0 -0
  592. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/canonical.py +0 -0
  593. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/canonical_floor.py +0 -0
  594. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/contract.py +0 -0
  595. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/evidence_review_runtime.py +0 -0
  596. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/exclusion_floor.py +0 -0
  597. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/__init__.py +0 -0
  598. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/__main__.py +0 -0
  599. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/evaluators.py +0 -0
  600. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/harness.py +0 -0
  601. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/models.py +0 -0
  602. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/retention.py +0 -0
  603. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/scoring.py +0 -0
  604. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/experiments/synthetic.py +0 -0
  605. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_contract.py +0 -0
  606. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_policy.py +0 -0
  607. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_projection.py +0 -0
  608. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_release.py +0 -0
  609. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/fact_release_transport.py +0 -0
  610. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/forwarding.py +0 -0
  611. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity_attestation.py +0 -0
  612. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity_dispatch.py +0 -0
  613. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/identity_protocol.py +0 -0
  614. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_dispatch.py +0 -0
  615. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ingest_protocol.py +0 -0
  616. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/ledger_retention.py +0 -0
  617. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/node_protocol.py +0 -0
  618. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/opaque_ids.py +0 -0
  619. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/projection_review_runtime.py +0 -0
  620. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/projection_reviews.py +0 -0
  621. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/protection_clock.py +0 -0
  622. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/protocol.py +0 -0
  623. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/release_transport.py +0 -0
  624. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/search_lanes.py +0 -0
  625. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_index.py +0 -0
  626. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_labeler_local.py +0 -0
  627. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_labelers.py +0 -0
  628. {topos_node-1.4.1 → topos_node-1.4.2}/topos/permissions_v2/shadow_rescore.py +0 -0
  629. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/__init__.py +0 -0
  630. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/audit.py +0 -0
  631. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/envelope.py +0 -0
  632. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/job_runner.py +0 -0
  633. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/job_secrets.py +0 -0
  634. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/job_store.py +0 -0
  635. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/stages.py +0 -0
  636. {topos_node-1.4.1 → topos_node-1.4.2}/topos/pipeline/stub_enqueue.py +0 -0
  637. {topos_node-1.4.1 → topos_node-1.4.2}/topos/principal.py +0 -0
  638. {topos_node-1.4.1 → topos_node-1.4.2}/topos/profiles.py +0 -0
  639. {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/__init__.py +0 -0
  640. {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/__init__.py +0 -0
  641. {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/base.py +0 -0
  642. {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/builders.py +0 -0
  643. {topos_node-1.4.1 → topos_node-1.4.2}/topos/projections/vector_index/health_checks.py +0 -0
  644. {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/__init__.py +0 -0
  645. {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/narrowing_vocabulary.json +0 -0
  646. {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/query_field_contract.json +0 -0
  647. {topos_node-1.4.1 → topos_node-1.4.2}/topos/protocol/retrieval_text_contract.json +0 -0
  648. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/__init__.py +0 -0
  649. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/aggregate.py +0 -0
  650. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/audit.py +0 -0
  651. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/closeness.py +0 -0
  652. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/cohort_resolvers.py +0 -0
  653. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/collaborators.py +0 -0
  654. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/ddr.py +0 -0
  655. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/disclosure.py +0 -0
  656. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/entity_window.py +0 -0
  657. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/exclusion.py +0 -0
  658. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/facts_direct.py +0 -0
  659. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/fingerprint.py +0 -0
  660. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/game_layer.py +0 -0
  661. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/grant_cache.py +0 -0
  662. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/graph_lane.py +0 -0
  663. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/inference.py +0 -0
  664. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/intent.py +0 -0
  665. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/journal_event_lane.py +0 -0
  666. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/manifest.py +0 -0
  667. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/manifest_validation.py +0 -0
  668. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/minimizer.py +0 -0
  669. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/narrowing.py +0 -0
  670. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/negotiation.py +0 -0
  671. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/overheard.py +0 -0
  672. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/packet_resolution.py +0 -0
  673. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/pipeline.py +0 -0
  674. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/planner.py +0 -0
  675. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/runtime.py +0 -0
  676. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_arbiter.py +0 -0
  677. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_classifier.py +0 -0
  678. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_head.py +0 -0
  679. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_registry.json +0 -0
  680. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_registry_loader.py +0 -0
  681. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/scope_shadow.py +0 -0
  682. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/session.py +0 -0
  683. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/session_utils.py +0 -0
  684. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/source_generation.py +0 -0
  685. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/truth_door.py +0 -0
  686. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/truth_facts.py +0 -0
  687. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/truth_prompts.py +0 -0
  688. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/turn_classifier.py +0 -0
  689. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/types.py +0 -0
  690. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/verify.py +0 -0
  691. {topos_node-1.4.1 → topos_node-1.4.2}/topos/query/verify_modes.py +0 -0
  692. {topos_node-1.4.1 → topos_node-1.4.2}/topos/rate_limit.py +0 -0
  693. {topos_node-1.4.1 → topos_node-1.4.2}/topos/relay_stamp.py +0 -0
  694. {topos_node-1.4.1 → topos_node-1.4.2}/topos/routines/__init__.py +0 -0
  695. {topos_node-1.4.1 → topos_node-1.4.2}/topos/routines/schema.py +0 -0
  696. {topos_node-1.4.1 → topos_node-1.4.2}/topos/routines/store.py +0 -0
  697. {topos_node-1.4.1 → topos_node-1.4.2}/topos/runtime_housekeeping.py +0 -0
  698. {topos_node-1.4.1 → topos_node-1.4.2}/topos/runtime_shutdown.py +0 -0
  699. {topos_node-1.4.1 → topos_node-1.4.2}/topos/runtime_update.py +0 -0
  700. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/__init__.py +0 -0
  701. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/hub_pipeline.py +0 -0
  702. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/nsfw_classifier.py +0 -0
  703. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/ollama_transforms.py +0 -0
  704. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/prewarm.py +0 -0
  705. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sanitization/privacy_filter.py +0 -0
  706. {topos_node-1.4.1 → topos_node-1.4.2}/topos/scope_resolution.py +0 -0
  707. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/__init__.py +0 -0
  708. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/container.py +0 -0
  709. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/__init__.py +0 -0
  710. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/base.py +0 -0
  711. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/local.py +0 -0
  712. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/embeddings/remote.py +0 -0
  713. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/interfaces.py +0 -0
  714. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/llm/__init__.py +0 -0
  715. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/llm/base.py +0 -0
  716. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/llm/openai.py +0 -0
  717. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/local.py +0 -0
  718. {topos_node-1.4.1 → topos_node-1.4.2}/topos/services/postgres.py +0 -0
  719. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/__init__.py +0 -0
  720. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/bundled_canonical_triples.py +0 -0
  721. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/canonical_signal_defaults.py +0 -0
  722. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/declared_field_map_spec.py +0 -0
  723. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/definitions.py +0 -0
  724. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/install_service.py +0 -0
  725. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/registry.py +0 -0
  726. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/runtime_install.py +0 -0
  727. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/scrub_attribution.py +0 -0
  728. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sources/scrub_service.py +0 -0
  729. {topos_node-1.4.1 → topos_node-1.4.2}/topos/startup_banner.py +0 -0
  730. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/__init__.py +0 -0
  731. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/__init__.py +0 -0
  732. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/factory.py +0 -0
  733. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/fakes.py +0 -0
  734. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/postgres/stores.py +0 -0
  735. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/protocols.py +0 -0
  736. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/sqlite/__init__.py +0 -0
  737. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/sqlite/stores.py +0 -0
  738. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  739. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/__init__.py +0 -0
  740. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/activity_tables.py +0 -0
  741. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  742. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
  743. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  744. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/model.py +0 -0
  745. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
  746. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  747. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/canonical_store.py +0 -0
  748. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/conversations_tables.py +0 -0
  749. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/journal_repair.py +0 -0
  750. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/mapping_store.py +0 -0
  751. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/canonical/postgres.py +0 -0
  752. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/__init__.py +0 -0
  753. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/client.py +0 -0
  754. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/connection_tuning.py +0 -0
  755. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/__init__.py +0 -0
  756. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  757. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  758. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  759. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  760. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  761. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/backup.py +0 -0
  762. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/backup_custody.py +0 -0
  763. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  764. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  765. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  766. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  767. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/community_names_v1.py +0 -0
  768. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/complexity_v1.py +0 -0
  769. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  770. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  771. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  772. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  773. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  774. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  775. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/documents_v1.py +0 -0
  776. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  777. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  778. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  779. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  780. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  781. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  782. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  783. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  784. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  785. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  786. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  787. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/episodes_v1.py +0 -0
  788. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  789. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  790. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  791. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  792. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  793. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  794. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  795. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  796. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  797. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  798. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  799. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  800. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
  801. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  802. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
  803. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
  804. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  805. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  806. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/registry_checksums.json +0 -0
  807. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  808. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  809. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  810. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  811. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  812. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_objects.py +0 -0
  813. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  814. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  815. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  816. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  817. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
  818. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/transcripts_v1.py +0 -0
  819. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  820. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  821. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  822. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  823. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  824. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  825. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  826. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  827. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  828. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  829. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  830. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  831. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  832. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  833. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  834. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  835. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  836. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  837. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/paths.py +0 -0
  838. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/postgres.py +0 -0
  839. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/schema.py +0 -0
  840. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/schema_probe.py +0 -0
  841. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/storage_breakdown.py +0 -0
  842. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/db/write_gate.py +0 -0
  843. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/derived_row_identity.py +0 -0
  844. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/enrichment/__init__.py +0 -0
  845. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  846. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  847. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/normalized/__init__.py +0 -0
  848. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/normalized/normalized_store.py +0 -0
  849. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/__init__.py +0 -0
  850. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/decision.py +0 -0
  851. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/oplog_store.py +0 -0
  852. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/oplog/postgres.py +0 -0
  853. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/person/identity_resolver.py +0 -0
  854. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/projections/__init__.py +0 -0
  855. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/projections/index_ops_store.py +0 -0
  856. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/projections/vector_index_store.py +0 -0
  857. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/__init__.py +0 -0
  858. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/browser_flat_tables.py +0 -0
  859. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/file_store.py +0 -0
  860. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/raw_store.py +0 -0
  861. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/raw_tables_manager.py +0 -0
  862. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
  863. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/security/encryption.py +0 -0
  864. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/signal_identity.py +0 -0
  865. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/source_settings.py +0 -0
  866. {topos_node-1.4.1 → topos_node-1.4.2}/topos/storage/user_identity.py +0 -0
  867. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sync/__init__.py +0 -0
  868. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sync/client.py +0 -0
  869. {topos_node-1.4.1 → topos_node-1.4.2}/topos/sync_handlers.py +0 -0
  870. {topos_node-1.4.1 → topos_node-1.4.2}/topos/testing/__init__.py +0 -0
  871. {topos_node-1.4.1 → topos_node-1.4.2}/topos/testing/lifespan.py +0 -0
  872. {topos_node-1.4.1 → topos_node-1.4.2}/topos/uds.py +0 -0
  873. {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_authority.py +0 -0
  874. {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_filters.py +0 -0
  875. {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_resource_id.py +0 -0
  876. {topos_node-1.4.1 → topos_node-1.4.2}/topos/uma_rpt.py +0 -0
  877. {topos_node-1.4.1 → topos_node-1.4.2}/topos/upgrades/__init__.py +0 -0
  878. {topos_node-1.4.1 → topos_node-1.4.2}/topos/upgrades/runner.py +0 -0
  879. {topos_node-1.4.1 → topos_node-1.4.2}/topos/utils/base_object.py +0 -0
  880. {topos_node-1.4.1 → topos_node-1.4.2}/topos/websocket_client.py +0 -0
  881. {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/dependency_links.txt +0 -0
  882. {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/entry_points.txt +0 -0
  883. {topos_node-1.4.1 → topos_node-1.4.2}/topos_node.egg-info/top_level.txt +0 -0
@@ -6,3 +6,6 @@ recursive-include shared *.json
6
6
  # Tray icon glyphs (topos/cli/assets) — without them the tray cannot render.
7
7
  recursive-include topos *.png
8
8
  recursive-include topos/features/derivation/bundled_packs *.yaml
9
+
10
+ # Pinned runtime privacy rubric; absence must fail closed, but must ship.
11
+ include topos/permissions_v2/shadow_rubric.pinned.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -40,6 +40,7 @@ Requires-Dist: scikit-learn<2,>=1.4
40
40
  Requires-Dist: sqlite-vec~=0.1.9
41
41
  Requires-Dist: pystray~=0.19.5
42
42
  Requires-Dist: pillow>=10.0
43
+ Requires-Dist: pytypedstream==0.1.0
43
44
  Provides-Extra: database
44
45
  Requires-Dist: psycopg[binary]~=3.3.3; extra == "database"
45
46
  Provides-Extra: engine
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "topos-node"
12
- version = "1.4.1"
12
+ version = "1.4.2"
13
13
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
14
14
  readme = "README.md"
15
15
  license = "Apache-2.0"
@@ -65,6 +65,8 @@ dependencies = [
65
65
  # only when a GUI session is detected — harmless on headless installs.
66
66
  "pystray~=0.19.5",
67
67
  "pillow>=10.0",
68
+ # Pure-data validation of complete native iMessage archives; no NSUnarchiver.
69
+ "pytypedstream==0.1.0",
68
70
  ]
69
71
 
70
72
  [project.urls]
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.4.1"
4
- __version_info__ = (1, 4, 1)
3
+ __version__ = "1.4.2"
4
+ __version_info__ = (1, 4, 2)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -0,0 +1,150 @@
1
+ """Local-owner-only diagnostic. No native paths, text or release authority on the wire."""
2
+ import asyncio
3
+ from datetime import datetime, timezone
4
+ import sqlite3
5
+
6
+ from fastapi import APIRouter, Depends, HTTPException
7
+ from fastapi.responses import JSONResponse
8
+
9
+ from topos.auth import resolve_request_principal
10
+ from topos.permissions_v2.canonical import PolicyError
11
+ from topos.permissions_v2.contract import Identifier, StrictModel
12
+
13
+ router = APIRouter(prefix='/v1/permissions-beta/v2/imessage', tags=['permissions-owner-maintenance'])
14
+
15
+
16
+ class NativeProbeRequest(StrictModel):
17
+ dataset_id: Identifier
18
+ starts_at: str
19
+ ends_at: str
20
+
21
+
22
+ @router.post('/preflight')
23
+ async def preflight(body: NativeProbeRequest, principal=Depends(resolve_request_principal)):
24
+ from topos.principal import OWNER_APP
25
+ if principal is None or principal.cls != OWNER_APP or principal.channel != 'uds':
26
+ raise HTTPException(403, 'owner_socket_required')
27
+
28
+ def apply():
29
+ from topos.permissions_v2.runtime import get_runtime
30
+ from topos.permissions_v2.native_imessage_probe import probe_native_messages
31
+ runtime = get_runtime()
32
+ identity = runtime.protocol.ledger.identity
33
+ if principal.acting_user and principal.acting_user != identity.owner_id:
34
+ raise PolicyError('owner_binding')
35
+ path = runtime.protocol.canonical_database
36
+ conn = sqlite3.connect(path.as_uri() + '?mode=ro', uri=True, timeout=1)
37
+ try:
38
+ conn.row_factory = sqlite3.Row
39
+ conn.execute('PRAGMA query_only=ON')
40
+ conn.execute('BEGIN')
41
+ return probe_native_messages(conn, dataset_id=body.dataset_id, owner_id=identity.owner_id,
42
+ starts_at=body.starts_at, ends_at=body.ends_at, now=datetime.now(timezone.utc))
43
+ finally:
44
+ conn.close()
45
+ try:
46
+ result = await asyncio.to_thread(apply)
47
+ return JSONResponse(result, headers={'Cache-Control': 'no-store'})
48
+ except PolicyError as exc:
49
+ raise HTTPException(503, exc.code, headers={'Cache-Control': 'no-store'}) from None
50
+ except Exception:
51
+ raise HTTPException(503, 'native_probe_unavailable', headers={'Cache-Control': 'no-store'}) from None
52
+
53
+
54
+ class NativeRecoveryRequest(NativeProbeRequest):
55
+ owner_attestation: str
56
+
57
+
58
+ # Recovery is a bounded maintenance operation, never a sync loop or a recipient
59
+ # API. One run per process avoids duplicate paid/local preparation on retries.
60
+ import threading
61
+ _RECOVERY_LOCK = threading.Lock()
62
+
63
+
64
+ @router.post('/recover')
65
+ async def recover(body: NativeRecoveryRequest, principal=Depends(resolve_request_principal)):
66
+ from topos.principal import OWNER_APP
67
+ from topos.permissions_v2.ingest_provenance import OWNER_ATTESTATION
68
+ if principal is None or principal.cls != OWNER_APP or principal.channel != 'uds':
69
+ raise HTTPException(403, 'owner_socket_required')
70
+ if body.owner_attestation != OWNER_ATTESTATION:
71
+ raise HTTPException(422, 'ingest_owner_attestation_required')
72
+ if not _RECOVERY_LOCK.acquire(blocking=False):
73
+ raise HTTPException(409, 'native_recovery_running')
74
+
75
+ def apply():
76
+ from dataclasses import replace
77
+ from topos.permissions_v2.runtime import get_runtime
78
+ from topos.permissions_v2.native_imessage_probe import capture_matching_snapshot
79
+ from topos.permissions_v2.imessage_reconciliation import ATTRIBUTED_CONTRACT, parse_reconciliation_snapshot
80
+ from topos.permissions_v2.reconciliation_provenance import publish_existing
81
+ from topos.permissions_v2.reconciliation_facts import prepare_facts, derive_prepared
82
+ from topos.permissions_v2.reconciliation_facts import owner_subject
83
+ from topos.principal import set_principal, reset_principal
84
+ runtime = get_runtime()
85
+ identity = runtime.protocol.ledger.identity
86
+ if principal.acting_user and principal.acting_user != identity.owner_id:
87
+ raise PolicyError('owner_binding')
88
+ token = set_principal(replace(principal, acting_user=identity.owner_id))
89
+ db = None
90
+ try:
91
+ service = runtime.ingestion()
92
+ db = runtime.ingestion_connection()
93
+ owner_subject(db)
94
+ if db.execute("SELECT 1 FROM sqlite_master WHERE name='ingest_provenance_enrollments'").fetchone():
95
+ if db.execute('SELECT 1 FROM ingest_provenance_enrollments WHERE dataset_id=?', (body.dataset_id,)).fetchone():
96
+ raise PolicyError('native_recovery_already_enrolled')
97
+ # The configured private directories are installed by the operator,
98
+ # not picked or chmodded from request fields.
99
+ db.execute('PRAGMA query_only=ON')
100
+ db.execute('BEGIN')
101
+ snapshot_id, measured = capture_matching_snapshot(db, snapshot_root=service.root,
102
+ dataset_id=body.dataset_id, owner_id=identity.owner_id, starts_at=body.starts_at,
103
+ ends_at=body.ends_at, now=datetime.now(timezone.utc))
104
+ description, data = service._snapshot(snapshot_id, ATTRIBUTED_CONTRACT)
105
+ records = parse_reconciliation_snapshot(data, now=datetime.now(timezone.utc), reader_contract=ATTRIBUTED_CONTRACT)
106
+ boundary = service.resolver.entity_boundary(db)
107
+ rows = []
108
+ withheld = 0
109
+ for record in records:
110
+ row = dict(db.execute('SELECT * FROM conversation_messages WHERE message_id=?', (record.message_id,)).fetchone())
111
+ try:
112
+ boundary.check(table='conversation_messages', record_id=record.message_id,
113
+ source_id='imessage', dataset_id=body.dataset_id, row=row)
114
+ rows.append(row)
115
+ except PolicyError:
116
+ withheld += 1
117
+ db.rollback()
118
+ db.execute('PRAGMA query_only=OFF')
119
+ # No writer lock or live DB transaction during local inference.
120
+ prepared, stats = asyncio.run(prepare_facts(rows))
121
+ if not prepared:
122
+ return {'authority_created': False, 'counts': measured['counts'], 'preparation': stats,
123
+ 'boundary_withheld': withheld}
124
+ enrollment = service.enroll(db, snapshot_id=snapshot_id, dataset_id=body.dataset_id,
125
+ snapshot_sha256=description['snapshot_sha256'], owner_attestation=body.owner_attestation,
126
+ reader_contract=ATTRIBUTED_CONTRACT)
127
+ derived = {}
128
+ def derive(conn, current):
129
+ derived.update(derive_prepared(conn, current, prepared))
130
+ result = publish_existing(service, db, enrollment_id=enrollment['enrollment_id'], derive=derive,
131
+ classifications={key: item['classification'] for key, item in prepared.items()})
132
+ return {'authority_created': True, 'reconciled': result['reconciled'], 'preparation': stats,
133
+ 'derivation': derived, 'boundary_withheld': withheld}
134
+ finally:
135
+ if db is not None:
136
+ db.close()
137
+ reset_principal(token)
138
+ try:
139
+ # The worker owns the lock until it actually stops, even if HTTP cancels.
140
+ def guarded():
141
+ try:
142
+ return apply()
143
+ finally:
144
+ _RECOVERY_LOCK.release()
145
+ result = await asyncio.to_thread(guarded)
146
+ return JSONResponse(result, headers={'Cache-Control': 'no-store'})
147
+ except PolicyError as exc:
148
+ raise HTTPException(503, exc.code, headers={'Cache-Control': 'no-store'}) from None
149
+ except Exception:
150
+ raise HTTPException(503, 'native_recovery_unavailable', headers={'Cache-Control': 'no-store'}) from None
@@ -0,0 +1,44 @@
1
+ """Owner socket maintenance of existing signed message-search indexes."""
2
+ from fastapi import APIRouter, Depends, HTTPException
3
+
4
+ from topos.auth import resolve_request_principal
5
+ from topos.core.handlers.permissions_v2 import handle_permissions_v2_message_search_rebuild
6
+
7
+ router = APIRouter(prefix="/v1/permissions-beta/v2/message-search", tags=["permissions-owner-maintenance"])
8
+
9
+
10
+ @router.post("/rebuild")
11
+ async def rebuild(principal=Depends(resolve_request_principal)):
12
+ from topos.principal import set_principal, reset_principal
13
+
14
+ token = set_principal(principal)
15
+ try:
16
+ result = await handle_permissions_v2_message_search_rebuild({"id":"owner-search-rebuild"})
17
+ finally:
18
+ reset_principal(token)
19
+ if result.get("status") != "ok":
20
+ raise HTTPException(result.get("code",503), result.get("error","permissions_v2_unavailable"),
21
+ headers={"Cache-Control":"no-store"})
22
+ from fastapi.responses import JSONResponse
23
+ return JSONResponse(result["payload"], headers={"Cache-Control":"no-store"})
24
+
25
+
26
+ @router.post("/message-review")
27
+ async def message_review(payload: dict, principal=Depends(resolve_request_principal)):
28
+ from topos.principal import set_principal, reset_principal
29
+ from topos.core.handlers.permissions_v2 import handle_permissions_v2_message_review
30
+ from fastapi.responses import JSONResponse
31
+ from topos.principal import OWNER_APP
32
+ if principal.cls == OWNER_APP and principal.channel == "uds" and not principal.acting_user:
33
+ from dataclasses import replace
34
+ from topos.permissions_v2.runtime import get_runtime
35
+ principal = replace(principal, acting_user=get_runtime().protocol.ledger.identity.owner_id)
36
+ token = set_principal(principal)
37
+ try:
38
+ result = await handle_permissions_v2_message_review({"id":"owner-message-review","payload":payload})
39
+ finally:
40
+ reset_principal(token)
41
+ if result.get("status") != "ok":
42
+ raise HTTPException(result.get("code",503),result.get("error","message_review_unavailable"),
43
+ headers={"Cache-Control":"no-store"})
44
+ return JSONResponse(result["payload"],headers={"Cache-Control":"no-store"})
@@ -29,6 +29,8 @@ from .api import (
29
29
  ingestion_sources as ingestion_sources_routes,
30
30
  permissions_identity as permissions_identity_routes,
31
31
  permissions_ingestion as permissions_ingestion_routes,
32
+ permissions_search_maintenance as permissions_search_maintenance_routes,
33
+ permissions_native_probe as permissions_native_probe_routes,
32
34
  intelligence_lifecycle as intelligence_lifecycle_routes,
33
35
  local_mcp as local_mcp_routes,
34
36
  llm as llm_routes,
@@ -143,6 +145,8 @@ app.include_router(ingestion_routes.router, prefix="/v1")
143
145
  app.include_router(ingestion_sources_routes.router)
144
146
  app.include_router(permissions_ingestion_routes.router)
145
147
  app.include_router(permissions_identity_routes.router)
148
+ app.include_router(permissions_search_maintenance_routes.router)
149
+ app.include_router(permissions_native_probe_routes.router)
146
150
  app.include_router(query_routes.router, prefix="/v1")
147
151
  app.include_router(messenger_analytics_routes.router, prefix="/v1")
148
152
  app.include_router(uma_data_routes.router)
@@ -87,7 +87,8 @@ async def handle_permissions_v2_status(message):
87
87
  async def _handle_evidence(message, operation, *, projection=False):
88
88
  from ...permissions_v2.canonical import PolicyError
89
89
  from ...permissions_v2.evidence import EvidenceBinding
90
- from ...permissions_v2.evidence_reviews import EvidenceLookup, RecordEvidenceReview, RevokeEvidenceReview
90
+ from ...permissions_v2.evidence_reviews import (EvidenceLookup, FactOptIn, FactOptOut, RecordEvidenceReview,
91
+ ReviewQueueRequest, ReviewTotalsRequest, RevokeEvidenceReview)
91
92
  from ...permissions_v2.fact_contract import FAMILY, OUTPUT_FAMILIES
92
93
  from ...permissions_v2.identity import LEGACY_CONTRACT, SUBJECT_CONTRACTS
93
94
  from ...permissions_v2.projection_reviews import RecordProjectionReview, RevokeProjectionReview
@@ -123,7 +124,9 @@ async def _handle_evidence(message, operation, *, projection=False):
123
124
  binding = EvidenceBinding.parse(payload["binding"])
124
125
  request_type = {"preview":EvidenceLookup, "read":EvidenceLookup,
125
126
  "record":RecordProjectionReview if projection else RecordEvidenceReview,
126
- "revoke":RevokeProjectionReview if projection else RevokeEvidenceReview}[operation]
127
+ "revoke":RevokeProjectionReview if projection else RevokeEvidenceReview,
128
+ # Implicit review's owner surfaces: the queue, the totals, the deselection and its undo.
129
+ "queue":ReviewQueueRequest, "totals":ReviewTotalsRequest, "opt_out":FactOptOut, "opt_in":FactOptIn}[operation]
127
130
  request = request_type.parse(payload["request"])
128
131
  runtime = get_runtime()
129
132
  actual = EvidenceBinding.parse(runtime.protocol.ledger.identity.model_dump())
@@ -146,12 +149,12 @@ async def _handle_evidence(message, operation, *, projection=False):
146
149
  return getattr(service, operation)(request, now=int(time.time()), contract=contract,
147
150
  family=family)
148
151
  service = runtime.evidence_reviews(require_existing=operation in {"record", "revoke"})
149
- if operation == "record":
150
- result = service.record(request, now=int(time.time()))
152
+ if operation in {"record", "opt_out"}:
153
+ result = getattr(service, operation)(request, now=int(time.time()))
151
154
  _refresh_message_search(runtime)
152
155
  return result
153
156
  result = getattr(service, operation)(request)
154
- if operation == "revoke":
157
+ if operation in {"revoke", "opt_in"}:
155
158
  _refresh_message_search(runtime)
156
159
  return result
157
160
 
@@ -201,6 +204,30 @@ async def handle_permissions_v2_evidence_review_revoke(message):
201
204
  return await _handle_evidence(message, "revoke")
202
205
 
203
206
 
207
+ @handles("permissions_v2_evidence_review_queue", owner_only=True)
208
+ async def handle_permissions_v2_evidence_review_queue(message):
209
+ """Owner-only: a page of current facts, least confident first, with labels, standing and source counts."""
210
+ return await _handle_evidence(message, "queue")
211
+
212
+
213
+ @handles("permissions_v2_evidence_totals", owner_only=True)
214
+ async def handle_permissions_v2_evidence_totals(message):
215
+ """Owner-only: qualifying / deselected / withheld counts, overall and per source."""
216
+ return await _handle_evidence(message, "totals")
217
+
218
+
219
+ @handles("permissions_v2_evidence_opt_out", owner_only=True)
220
+ async def handle_permissions_v2_evidence_opt_out(message):
221
+ """Owner-only: deselect one fact; every search index is rebuilt without it."""
222
+ return await _handle_evidence(message, "opt_out")
223
+
224
+
225
+ @handles("permissions_v2_evidence_opt_in", owner_only=True)
226
+ async def handle_permissions_v2_evidence_opt_in(message):
227
+ """Owner-only: reselect one fact; every search index is rebuilt with it."""
228
+ return await _handle_evidence(message, "opt_in")
229
+
230
+
204
231
  @handles("permissions_v2_projection_preview", owner_only=True)
205
232
  async def handle_permissions_v2_projection_preview(message):
206
233
  return await _handle_evidence(message, "preview", projection=True)
@@ -242,17 +269,100 @@ async def handle_permissions_v2_message_search_rebuild(message):
242
269
  return {"id": req_id, "status": "error", "code": 403, "error": "owner_mode_required"}
243
270
 
244
271
  def apply():
245
- with with_db_write():
246
- runtime = get_runtime()
247
- if principal.acting_user != runtime.protocol.ledger.identity.owner_id:
248
- raise PolicyError("owner_binding")
249
- index = runtime.message_search_index()
272
+ from dataclasses import replace
273
+ from ...principal import set_principal, reset_principal
274
+
275
+ token = None
276
+ try:
277
+ with with_db_write():
278
+ runtime = get_runtime()
279
+ owner_id = runtime.protocol.ledger.identity.owner_id
280
+ if (principal.channel == "cp_relay" and principal.acting_user != owner_id
281
+ or principal.channel == "uds" and principal.acting_user and principal.acting_user != owner_id):
282
+ raise PolicyError("owner_binding")
283
+ if principal.channel == "uds":
284
+ # The authenticated local owner transport identifies this
285
+ # paired node. Bind its account from trusted runtime state,
286
+ # never from a request body/header, for deeper owner checks.
287
+ token = set_principal(replace(principal, acting_user=owner_id))
288
+ index = runtime.message_search_index()
289
+ # The index owns its publication/check gates. Fact qualification
290
+ # and embedding must not hold the writer gate for the whole build.
250
291
  index.sweep()
251
292
  states = index.rebuild_all()
252
293
  return {"grants": len(states), "ready": sum(state == "ready" for state in states.values())}
294
+ finally:
295
+ if token is not None:
296
+ reset_principal(token)
253
297
  try:
254
298
  return {"id": req_id, "status": "ok", "payload": await asyncio.to_thread(apply)}
255
299
  except PolicyError as exc:
256
300
  return {"id": req_id, "status": "error", "code": 403 if exc.code == "owner_binding" else 503, "error": exc.code}
257
301
  except Exception:
258
302
  return {"id": req_id, "status": "error", "code": 503, "error": "permissions_v2_unavailable"}
303
+
304
+
305
+ @handles("permissions_v2_message_review", owner_only=True)
306
+ async def handle_permissions_v2_message_review(message):
307
+ from ...permissions_v2.canonical import PolicyError, digest
308
+ from ...permissions_v2.evidence import EvidenceBinding, _owner
309
+ from ...permissions_v2.message_review_contract import (MessageLookup, RecordMessageReview,
310
+ MessageReviewQueue, MessageReviewPreview, MessageOptOutResult, MessageReviewResult,
311
+ AutomaticReviewRequest, AutomaticReviewLookup)
312
+ from ...permissions_v2.message_evidence import (preview_message, record_message_review, queue_messages, message_key)
313
+ from ...permissions_v2.runtime import get_runtime
314
+ from ...storage.db.write_gate import with_db_write
315
+
316
+ req_id, payload = message.get("id"), message.get("payload")
317
+ if not isinstance(payload, dict) or set(payload) != {"binding", "operation", "request"}:
318
+ return {"id":req_id,"status":"error","code":400,"error":"message_review_payload_invalid"}
319
+ def apply():
320
+ with with_db_write():
321
+ runtime = get_runtime()
322
+ actual = EvidenceBinding.parse(runtime.protocol.ledger.identity.model_dump())
323
+ _owner(actual)
324
+ if EvidenceBinding.parse(payload["binding"]) != actual:
325
+ raise PolicyError("evidence_target_binding")
326
+ op = payload["operation"]
327
+ model = {"queue":MessageReviewQueue, "preview":MessageLookup, "record":RecordMessageReview,
328
+ "opt_out":MessageLookup, "opt_in":MessageLookup,
329
+ "automatic_start":AutomaticReviewRequest, "automatic_status":AutomaticReviewLookup,
330
+ "automatic_cancel":AutomaticReviewLookup}.get(op)
331
+ if model is None:
332
+ raise PolicyError("message_review_operation_invalid")
333
+ request = model.parse(payload["request"])
334
+ if op.startswith("automatic_"):
335
+ worker = runtime.automatic_message_reviews()
336
+ if op == "automatic_start":
337
+ return worker.start(request)
338
+ return worker.cancel() if op == "automatic_cancel" else worker.status()
339
+ service = runtime.evidence_reviews(require_existing=True)
340
+ resolver, reviews = service.resolver, service.reviews
341
+ if op == "queue":
342
+ return queue_messages(resolver, reviews, request, now=int(time.time()))
343
+ if op == "record":
344
+ review = record_message_review(resolver, reviews, **request.model_dump(), reviewed_at=int(time.time()))
345
+ result = MessageReviewResult(review=review, review_revision=digest(review.model_dump()))
346
+ else:
347
+ if request.identity.binding != actual or request.identity.table == "signal_objects":
348
+ raise PolicyError("evidence_target_binding")
349
+ if op == "preview":
350
+ return MessageReviewPreview.parse(preview_message(resolver, reviews, request.identity))
351
+ key = message_key(request.identity)
352
+ if op == "opt_out":
353
+ reviews.opt_out(key, now=int(time.time()))
354
+ else:
355
+ reviews.opt_in(key)
356
+ result = MessageOptOutResult(identity=request.identity, opted_out=op == "opt_out")
357
+ _refresh_message_search(runtime)
358
+ return result
359
+ try:
360
+ result = await asyncio.to_thread(apply)
361
+ return {"id":req_id,"status":"ok","payload":result.model_dump()}
362
+ except PolicyError as exc:
363
+ code = (403 if exc.code in {"owner_authority_required", "evidence_target_binding"} else
364
+ 409 if exc.code in {"review_stale", "review_conflict", "review_id_conflict"} else
365
+ 400 if exc.code in {"schema_invalid", "message_review_window_invalid", "message_review_operation_invalid"} else 503)
366
+ return {"id":req_id,"status":"error","code":code,"error":exc.code}
367
+ except Exception:
368
+ return {"id":req_id,"status":"error","code":503,"error":"message_review_unavailable"}
@@ -16,10 +16,12 @@ It is deliberately narrow, because every wrong refusal keeps a stale belief:
16
16
  - Evidence is read when the decision is made, from the rows the facts'
17
17
  current ``source_refs`` name, never from the record frozen at insert. A ref
18
18
  counts only while its row still exists, is not deleted or excluded, and the
19
- ref names that row's source AND dataset. A ref without both (every shared
20
- extractor writes one) cannot say which of several same-id rows it means.
19
+ ref names that row's table and source, plus its dataset for human messages.
20
+ AI-chat rows have no dataset column; the trust must prove their enrollment
21
+ and parent owner/source binding instead.
21
22
  - Only owner statements are ordered, and a ref counts only when its row is the
22
- owner's own (``is_from_self`` 1). A refresh merges refs from any speaker into
23
+ owner's own (``is_from_self`` 1, or an authored user prompt with validated
24
+ native provenance). A refresh merges refs from any speaker into
23
25
  a fact, so the fact's label alone does not show whose message supports it.
24
26
  - A time is "cannot tell" when it could end after the moment its row is known
25
27
  to have existed: the trust's own ceiling for rows it vouches for (for the
@@ -43,6 +45,7 @@ from ..temporal.points import TimePoint, order, parse_point, span, unknown
43
45
  from ..temporal.records import EventTime
44
46
 
45
47
  LEAF_TABLE = "conversation_messages"
48
+ _ORDERED_TABLES = (LEAF_TABLE, "ai_chat_messages")
46
49
  OWNER = "owner"
47
50
  _EVENT_COLUMN = {"conversation_messages": "event_at", "ai_chat_messages": "event_at", "journal_entries": "entry_at"}
48
51
  # SQLite's datetime('now') forms, UTC by definition, with optional fractional seconds.
@@ -104,31 +107,47 @@ def _last(point: TimePoint) -> int:
104
107
 
105
108
 
106
109
  def _owner_row(row: Dict[str, Any]) -> bool:
110
+ if row.get("_table") == "ai_chat_messages":
111
+ # These labels only permit asking the trust. They never replace the
112
+ # durable proof of the row and its parent account identity.
113
+ return row.get("sender_type") in ("human", "user") and row.get("actor_role") == "authored"
107
114
  flag = row.get("is_from_self")
108
115
  return flag is True or (type(flag) is int and flag == 1)
109
116
 
110
117
 
118
+ def _names_row(ref: Dict[str, Any], row: Dict[str, Any]) -> bool:
119
+ if ref.get("source_id") in (None, "") or str(ref["source_id"]) != str(row.get("source_id")):
120
+ return False
121
+ if row["_table"] == "ai_chat_messages":
122
+ return ref.get("dataset_id") is None # the AI leaf contract is datasetless
123
+ return ref.get("dataset_id") not in (None, "") and str(ref["dataset_id"]) == str(row.get("dataset_id"))
124
+
125
+
111
126
  def _points(conn, trust: EvidenceTrust, refs: Iterable[Dict[str, Any]]) -> List[Optional[TimePoint]]:
112
127
  """One entry per ref: the trusted point, or ``None`` when it cannot tell."""
113
128
  refs = [ref for ref in refs or []]
114
- ids = sorted({str(ref.get("record_id")) for ref in refs
115
- if type(ref) is dict and ref.get("table") == LEAF_TABLE and ref.get("record_id")})
116
- rows: Dict[str, Dict[str, Any]] = {}
117
- if ids:
129
+ rows: Dict[tuple, Dict[str, Any]] = {}
130
+ for table in _ORDERED_TABLES:
131
+ ids = sorted({str(ref.get("record_id")) for ref in refs
132
+ if type(ref) is dict and ref.get("table") == table and ref.get("record_id")})
133
+ if not ids:
134
+ continue
118
135
  try:
119
136
  cursor = conn.execute(
120
- f"SELECT * FROM {LEAF_TABLE} WHERE message_id IN ({','.join('?' for _ in ids)})", ids)
137
+ f"SELECT * FROM {table} WHERE message_id IN ({','.join('?' for _ in ids)})", ids)
121
138
  names = [column[0] for column in cursor.description]
122
- rows = {str(values[names.index("message_id")]): dict(zip(names, values)) for values in cursor.fetchall()}
139
+ for values in cursor.fetchall():
140
+ row = {**dict(zip(names, values)), "_table": table}
141
+ rows[(table, str(row["message_id"]))] = row
123
142
  except sqlite3.Error:
124
- rows = {}
143
+ continue
125
144
  excluded = _excluded_ids(conn) if rows else set()
126
145
  out: List[Optional[TimePoint]] = []
127
146
  for ref in refs:
128
- row = rows.get(str(ref.get("record_id"))) if type(ref) is dict and ref.get("table") == LEAF_TABLE else None
147
+ row = (rows.get((ref.get("table"), str(ref.get("record_id"))))
148
+ if type(ref) is dict and ref.get("table") in _ORDERED_TABLES else None)
129
149
  if (row is None or _deleted(row) or str(row.get("message_id")) in excluded or not _owner_row(row)
130
- or not all(ref.get(key) not in (None, "") and str(ref[key]) == str(row.get(key))
131
- for key in ("source_id", "dataset_id"))):
150
+ or not _names_row(ref, row)):
132
151
  out.append(None)
133
152
  continue
134
153
  try:
@@ -467,6 +467,7 @@ def extract_rules_facts(
467
467
  source_ref,
468
468
  temporal_for,
469
469
  accept_value=None,
470
+ message_extractor=None,
470
471
  stats: Optional[Dict[str, int]] = None,
471
472
  ) -> int:
472
473
  """The rules floor alone, for a caller that has already proved its rows.
@@ -476,7 +477,8 @@ def extract_rules_facts(
476
477
  chooses or creates a self entity: the caller supplies the subject, the
477
478
  reference and the temporal record for each row. ``accept_value`` may refuse
478
479
  a value before anything is written; refusals count under
479
- ``value_refused`` in ``stats``.
480
+ ``value_refused`` in ``stats``. ``message_extractor`` is a trusted server
481
+ callback for proved message rows, never a request-selected extractor.
480
482
  """
481
483
  from ..lifecycle.exclusions import excluded_record_ids
482
484
 
@@ -487,6 +489,8 @@ def extract_rules_facts(
487
489
  table = str(row.get("_table") or "")
488
490
  record_id = row.get("record_id") or row.get("message_id") or row.get("id")
489
491
  extractor = _EXTRACTORS.get(table)
492
+ if message_extractor is not None and table in ("conversation_messages", "ai_chat_messages"):
493
+ extractor = lambda item, db: message_extractor(item, db, table=table)
490
494
  if extractor is None or str(record_id or "") in excluded_records:
491
495
  stats["rows_skipped"] = stats.get("rows_skipped", 0) + 1
492
496
  continue
@@ -329,6 +329,9 @@ class BlackholeStore:
329
329
  if existing:
330
330
  # Idempotent: already protected. Refresh the mutable bits, do not
331
331
  # restart a rebuild that may already have completed.
332
+ # A re-flag must not forget owner-saved aliases when the entity was
333
+ # reaped or its current resolver inventory has become narrower.
334
+ aliases_json = json.dumps(sorted(set(existing["aliases"]) | set(_normalized_aliases(aliases_json))))
332
335
  with with_db_write():
333
336
  self._conn.execute(
334
337
  """
@@ -272,6 +272,48 @@ class BlackholeGuard:
272
272
  kept.append(row)
273
273
  return kept
274
274
 
275
+ def filter_observed_canonical_rows(self, rows, *, canonical_table):
276
+ """Veto observed identity/contact/context on legacy canonical reads.
277
+
278
+ The owner retains access. Unsupported or unavailable protection context
279
+ withholds; this never confers a grant or certifies semantic absence.
280
+ A fresh boundary is used for each call, not cached between DB snapshots.
281
+ """
282
+ if self.sees_everything:
283
+ return list(rows)
284
+ from ...permissions_v2.canonical import PolicyError
285
+ from ...permissions_v2.entity_boundary import EntityBoundary
286
+ from contextlib import closing, nullcontext
287
+ from urllib.parse import quote
288
+
289
+ try:
290
+ # Check existing protection state as the old guard did; required
291
+ # entity/record schemas are still checked in the fresh snapshot.
292
+ # Do not trust request-local cached ids at egress.
293
+ _ = self.active
294
+ path = self._conn.execute("PRAGMA database_list").fetchone()[2]
295
+ own_snapshot = bool(path) and not self._conn.in_transaction
296
+ context = (closing(sqlite3.connect("file:" + quote(path, safe="/") + "?mode=ro", uri=True))
297
+ if own_snapshot else nullcontext(self._conn))
298
+ with context as conn:
299
+ if own_snapshot:
300
+ conn.execute("BEGIN")
301
+ boundary = EntityBoundary(conn)
302
+ blocked = {str(row[0]) for row in conn.execute("SELECT record_id FROM owner_only_records")}
303
+ result = []
304
+ for row in rows:
305
+ try:
306
+ if any(str(row.get(key) or "") in blocked for key in
307
+ ("record_id", "message_id", "id", "event_id", "entry_id", "transaction_id", "segment_id", "contact_id")):
308
+ continue
309
+ if not boundary.legacy_veto(canonical_table, row):
310
+ result.append(row)
311
+ except (PolicyError, sqlite3.Error, TypeError, ValueError, RecursionError):
312
+ continue
313
+ return result
314
+ except (PolicyError, sqlite3.Error, TypeError, ValueError, RecursionError):
315
+ return []
316
+
275
317
  # ------------------------------------------------- free-text egress scan
276
318
 
277
319
  def text_mentions_blackholed(self, text: Optional[str]) -> bool: