topos-node 1.4.2__tar.gz → 1.4.3__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 (926) hide show
  1. {topos_node-1.4.2/topos_node.egg-info → topos_node-1.4.3}/PKG-INFO +1 -1
  2. {topos_node-1.4.2 → topos_node-1.4.3}/pyproject.toml +1 -1
  3. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_hub_pipeline_offline_first.py +4 -16
  4. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_lane_shards.py +3 -0
  5. {topos_node-1.4.2 → topos_node-1.4.3}/topos/__version__.py +2 -2
  6. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/person_graph.py +36 -6
  7. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/home_chat.py +4 -1
  8. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/ingestion_sources.py +91 -12
  9. topos_node-1.4.3/topos/api/nsfw_maintenance.py +106 -0
  10. topos_node-1.4.3/topos/api/permissions_ai_chat_capture.py +106 -0
  11. topos_node-1.4.3/topos/api/permissions_capture_receipts.py +74 -0
  12. topos_node-1.4.3/topos/api/permissions_native_probe.py +307 -0
  13. topos_node-1.4.3/topos/api/permissions_search_maintenance.py +90 -0
  14. topos_node-1.4.3/topos/api/permissions_source_installs.py +94 -0
  15. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/source_install.py +27 -9
  16. topos_node-1.4.3/topos/api/source_retention.py +157 -0
  17. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/source_scrub.py +2 -2
  18. {topos_node-1.4.2 → topos_node-1.4.3}/topos/app.py +60 -4
  19. {topos_node-1.4.2 → topos_node-1.4.3}/topos/auth.py +16 -0
  20. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/declared_field_map.py +6 -1
  21. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/settings.py +2 -3
  22. {topos_node-1.4.2 → topos_node-1.4.3}/topos/control_plane_client.py +5 -0
  23. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/__init__.py +15 -0
  24. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/enrichment.py +6 -1
  25. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/home_chat.py +22 -3
  26. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/ingest.py +38 -0
  27. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/permissions_v2.py +143 -3
  28. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/permissions_v2_release.py +6 -0
  29. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/sources.py +122 -10
  30. {topos_node-1.4.2 → topos_node-1.4.3}/topos/disclosure/canonical_writer.py +0 -18
  31. topos_node-1.4.3/topos/disclosure/disclosure_sweep.py +380 -0
  32. topos_node-1.4.3/topos/disclosure/nsfw_tags.py +456 -0
  33. {topos_node-1.4.2 → topos_node-1.4.3}/topos/disclosure/privacy_layer.py +132 -153
  34. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/huggingface.py +3 -5
  35. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/model_cache.py +1 -2
  36. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/registration.py +12 -0
  37. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/brief_fallback.py +9 -4
  38. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/derivation_job.py +127 -17
  39. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/pii_redaction_job.py +4 -2
  40. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/person_reading.py +5 -3
  41. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/surfaces.py +91 -30
  42. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/writer.py +40 -9
  43. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/graph_enrichers.py +91 -10
  44. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/graph_refresh.py +33 -1
  45. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/owner.py +16 -0
  46. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/extract.py +25 -3
  47. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/blackhole_rebuild.py +65 -18
  48. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/provenance/roles.py +31 -3
  49. topos_node-1.4.3/topos/features/provenance/writer_class.py +132 -0
  50. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/brief_canonical_loader.py +22 -3
  51. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/signal_object_store.py +8 -4
  52. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/temporal/records.py +42 -0
  53. {topos_node-1.4.2 → topos_node-1.4.3}/topos/home_chat/store.py +83 -11
  54. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/canonical_pipeline.py +246 -20
  55. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/chatgpt_owner_snapshot.py +10 -0
  56. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/imessage_attributed_text.py +29 -2
  57. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/ingest_helpers.py +107 -23
  58. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/local_sync.py +606 -39
  59. topos_node-1.4.3/topos/ingestion/local_sync_jobs.py +175 -0
  60. topos_node-1.4.3/topos/ingestion/local_sync_schedule.py +705 -0
  61. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/manager.py +93 -0
  62. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/owner_snapshot.py +91 -13
  63. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/imessage_reader.py +144 -30
  64. topos_node-1.4.3/topos/permissions_v2/ai_chat_capture.py +416 -0
  65. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/automatic_message_review.py +117 -17
  66. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/automatic_review_worker.py +71 -13
  67. topos_node-1.4.3/topos/permissions_v2/capture_receipts.py +711 -0
  68. topos_node-1.4.3/topos/permissions_v2/english_short_words.py +332 -0
  69. topos_node-1.4.3/topos/permissions_v2/entailment_grounding.py +928 -0
  70. topos_node-1.4.3/topos/permissions_v2/entity_boundary.py +957 -0
  71. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/evidence.py +211 -22
  72. topos_node-1.4.3/topos/permissions_v2/evidence_families.py +110 -0
  73. topos_node-1.4.3/topos/permissions_v2/evidence_time.py +117 -0
  74. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/identity.py +14 -0
  75. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/imessage_reconciliation.py +85 -16
  76. topos_node-1.4.3/topos/permissions_v2/imessage_standing.py +580 -0
  77. topos_node-1.4.3/topos/permissions_v2/inferred_facts.py +495 -0
  78. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/ingest_provenance.py +20 -6
  79. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/ingest_snapshot_facts.py +2 -6
  80. topos_node-1.4.3/topos/permissions_v2/interest_family.py +1002 -0
  81. topos_node-1.4.3/topos/permissions_v2/interest_index.py +327 -0
  82. topos_node-1.4.3/topos/permissions_v2/interest_relabel.py +338 -0
  83. topos_node-1.4.3/topos/permissions_v2/interest_review.py +286 -0
  84. topos_node-1.4.3/topos/permissions_v2/journal_goal_field.py +1056 -0
  85. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/knowledge_contract.py +43 -8
  86. topos_node-1.4.3/topos/permissions_v2/knowledge_projections.py +602 -0
  87. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/ledger.py +49 -0
  88. topos_node-1.4.3/topos/permissions_v2/message_evidence.py +664 -0
  89. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/message_review_contract.py +42 -0
  90. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/native_claim_grounding.py +5 -0
  91. topos_node-1.4.3/topos/permissions_v2/native_imessage_probe.py +443 -0
  92. topos_node-1.4.3/topos/permissions_v2/permitted_derivation.py +785 -0
  93. topos_node-1.4.3/topos/permissions_v2/predicate_classes.py +116 -0
  94. topos_node-1.4.3/topos/permissions_v2/protection_doorbell.py +128 -0
  95. topos_node-1.4.3/topos/permissions_v2/reconciliation_provenance.py +587 -0
  96. topos_node-1.4.3/topos/permissions_v2/refresh_loop.py +1401 -0
  97. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/release.py +5 -0
  98. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/runtime.py +32 -15
  99. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/search_index.py +581 -41
  100. topos_node-1.4.3/topos/permissions_v2/search_release.py +771 -0
  101. topos_node-1.4.3/topos/permissions_v2/search_timing.py +404 -0
  102. topos_node-1.4.3/topos/permissions_v2/search_transport.py +362 -0
  103. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/job_runner.py +105 -18
  104. {topos_node-1.4.2 → topos_node-1.4.3}/topos/protocol/handled_message_types.json +5 -0
  105. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/facts_direct.py +40 -11
  106. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/retrieval.py +288 -32
  107. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/scope_registry.json +36 -1
  108. topos_node-1.4.3/topos/sanitization/explicit_wording.py +902 -0
  109. topos_node-1.4.3/topos/sanitization/nsfw_classifier.py +71 -0
  110. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sanitization/prewarm.py +9 -22
  111. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/definitions.py +15 -0
  112. topos_node-1.4.3/topos/sources/install_authority.py +99 -0
  113. topos_node-1.4.3/topos/sources/install_maintenance.py +228 -0
  114. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/install_service.py +82 -0
  115. topos_node-1.4.3/topos/sources/retention.py +1224 -0
  116. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/sqlite/stores.py +56 -0
  117. topos_node-1.4.3/topos/storage/canonical/activity_tables.py +46 -0
  118. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/ai_chat/canonicalizer.py +38 -0
  119. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/ai_chat/model.py +10 -0
  120. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/ai_chat/tables.py +28 -1
  121. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/canonical_store.py +372 -9
  122. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/conversations_tables.py +41 -1
  123. topos_node-1.4.3/topos/storage/db/migrations/activity_writer_columns_v1.py +69 -0
  124. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/actor_role_v1.py +30 -0
  125. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_mentions_authored_v1.py +40 -0
  126. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/registry.py +8 -0
  127. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/temporal_fields_v1.py +5 -0
  128. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/raw/raw_tables_manager.py +56 -0
  129. {topos_node-1.4.2 → topos_node-1.4.3}/topos/upgrades/manifests.json +23 -0
  130. {topos_node-1.4.2 → topos_node-1.4.3/topos_node.egg-info}/PKG-INFO +1 -1
  131. {topos_node-1.4.2 → topos_node-1.4.3}/topos_node.egg-info/SOURCES.txt +32 -0
  132. topos_node-1.4.2/topos/api/permissions_native_probe.py +0 -150
  133. topos_node-1.4.2/topos/api/permissions_search_maintenance.py +0 -44
  134. topos_node-1.4.2/topos/ingestion/local_sync_jobs.py +0 -139
  135. topos_node-1.4.2/topos/permissions_v2/entity_boundary.py +0 -415
  136. topos_node-1.4.2/topos/permissions_v2/knowledge_projections.py +0 -263
  137. topos_node-1.4.2/topos/permissions_v2/message_evidence.py +0 -287
  138. topos_node-1.4.2/topos/permissions_v2/native_imessage_probe.py +0 -218
  139. topos_node-1.4.2/topos/permissions_v2/reconciliation_provenance.py +0 -136
  140. topos_node-1.4.2/topos/permissions_v2/search_release.py +0 -411
  141. topos_node-1.4.2/topos/permissions_v2/search_transport.py +0 -115
  142. topos_node-1.4.2/topos/sanitization/nsfw_classifier.py +0 -152
  143. topos_node-1.4.2/topos/storage/canonical/activity_tables.py +0 -27
  144. {topos_node-1.4.2 → topos_node-1.4.3}/LICENSE +0 -0
  145. {topos_node-1.4.2 → topos_node-1.4.3}/MANIFEST.in +0 -0
  146. {topos_node-1.4.2 → topos_node-1.4.3}/README.md +0 -0
  147. {topos_node-1.4.2 → topos_node-1.4.3}/setup.cfg +0 -0
  148. {topos_node-1.4.2 → topos_node-1.4.3}/shared/__init__.py +0 -0
  149. {topos_node-1.4.2 → topos_node-1.4.3}/shared/filtering.py +0 -0
  150. {topos_node-1.4.2 → topos_node-1.4.3}/shared/schema_registry.py +0 -0
  151. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_active_database_binding.py +0 -0
  152. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_active_ingestion_binding.py +0 -0
  153. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_extensions.py +0 -0
  154. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_gate_leg_hermeticity.py +0 -0
  155. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_llm_integrations_storage.py +0 -0
  156. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_local_gate_composition.py +0 -0
  157. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_owner_database_hermeticity.py +0 -0
  158. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_prewarm_first_run.py +0 -0
  159. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_profile_hygiene.py +0 -0
  160. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_profiles.py +0 -0
  161. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_protocol_handled_types.py +0 -0
  162. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_query_field_contract.py +0 -0
  163. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_sync_dep_pins.py +0 -0
  164. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_system_computer_name.py +0 -0
  165. {topos_node-1.4.2 → topos_node-1.4.3}/tests/test_topos_home_hermeticity.py +0 -0
  166. {topos_node-1.4.2 → topos_node-1.4.3}/topos/__init__.py +0 -0
  167. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/__init__.py +0 -0
  168. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/dataset_resolution.py +0 -0
  169. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/duckdb_adapter.py +0 -0
  170. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/luck_surface.py +0 -0
  171. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/messenger_communities.py +0 -0
  172. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/messenger_directed.py +0 -0
  173. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/messenger_graph.py +0 -0
  174. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/messenger_labels.py +0 -0
  175. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/person_overlay.py +0 -0
  176. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/profiles.py +0 -0
  177. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/query_engine.py +0 -0
  178. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/raw_queries.py +0 -0
  179. {topos_node-1.4.2 → topos_node-1.4.3}/topos/analytics/relationship_reads.py +0 -0
  180. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/__init__.py +0 -0
  181. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/analytics.py +0 -0
  182. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/app_registry.py +0 -0
  183. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/backup.py +0 -0
  184. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/community_naming_config.py +0 -0
  185. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/compute_remote.py +0 -0
  186. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/connected_apps.py +0 -0
  187. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/conversation_context.py +0 -0
  188. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/data_commit.py +0 -0
  189. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/data_explorer_table_prefs.py +0 -0
  190. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/database_explorer.py +0 -0
  191. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/db.py +0 -0
  192. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/device.py +0 -0
  193. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/disk_space_config.py +0 -0
  194. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/engine_run.py +0 -0
  195. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/enrichment.py +0 -0
  196. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/enrichment_lab.py +0 -0
  197. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/facts_llm_config.py +0 -0
  198. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/filter_lab.py +0 -0
  199. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/health.py +0 -0
  200. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/ingestion_api.py +0 -0
  201. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/ingestion_compat.py +0 -0
  202. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/intelligence_lifecycle.py +0 -0
  203. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/llm.py +0 -0
  204. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/local_mcp.py +0 -0
  205. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/messenger_analytics.py +0 -0
  206. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/permissions_identity.py +0 -0
  207. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/permissions_ingestion.py +0 -0
  208. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/privacy_disclose.py +0 -0
  209. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/query_api.py +0 -0
  210. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/runtime_bootstrap.py +0 -0
  211. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/sanitization_ollama_config.py +0 -0
  212. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/shell.py +0 -0
  213. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/signal.py +0 -0
  214. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/signal_extraction_config.py +0 -0
  215. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/sources.py +0 -0
  216. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/sources_overview.py +0 -0
  217. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/sync.py +0 -0
  218. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/tool_index.py +0 -0
  219. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/ui_config.py +0 -0
  220. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/uma_data.py +0 -0
  221. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/upgrades.py +0 -0
  222. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/usage.py +0 -0
  223. {topos_node-1.4.2 → topos_node-1.4.3}/topos/api/user_identity.py +0 -0
  224. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/__init__.py +0 -0
  225. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/__init__.py +0 -0
  226. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/base.py +0 -0
  227. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  228. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  229. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  230. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  231. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  232. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  233. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  234. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  235. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
  236. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/models.py +0 -0
  237. {topos_node-1.4.2 → topos_node-1.4.3}/topos/canonicalization/resolver.py +0 -0
  238. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/__init__.py +0 -0
  239. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/__main__.py +0 -0
  240. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/assets/topos_black.png +0 -0
  241. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/assets/topos_blk_rounded.png +0 -0
  242. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/assets/topos_white.png +0 -0
  243. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/commands.py +0 -0
  244. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/profile_cmd.py +0 -0
  245. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/reprocess_cmd.py +0 -0
  246. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/setup_models_cmd.py +0 -0
  247. {topos_node-1.4.2 → topos_node-1.4.3}/topos/cli/tray.py +0 -0
  248. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/__init__.py +0 -0
  249. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/conversation_context_llm.py +0 -0
  250. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/facts_llm.py +0 -0
  251. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/local_model_builds.py +0 -0
  252. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/model_packs.py +0 -0
  253. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/node_function_providers.py +0 -0
  254. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/sanitization_ollama.py +0 -0
  255. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/signal_extraction.py +0 -0
  256. {topos_node-1.4.2 → topos_node-1.4.3}/topos/config/uvicorn_logging.json +0 -0
  257. {topos_node-1.4.2 → topos_node-1.4.3}/topos/contacts/__init__.py +0 -0
  258. {topos_node-1.4.2 → topos_node-1.4.3}/topos/contacts/identity.py +0 -0
  259. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/__init__.py +0 -0
  260. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/api_models.py +0 -0
  261. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/connection_resilience.py +0 -0
  262. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/db_health.py +0 -0
  263. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/device_helpers.py +0 -0
  264. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/errors.py +0 -0
  265. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/events.py +0 -0
  266. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/aggregate.py +0 -0
  267. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/common.py +0 -0
  268. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/complexity.py +0 -0
  269. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/config.py +0 -0
  270. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/contacts_import.py +0 -0
  271. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/database_explorer.py +0 -0
  272. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/derivation.py +0 -0
  273. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/device.py +0 -0
  274. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/enrichment_lab.py +0 -0
  275. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/filter_lab.py +0 -0
  276. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/graph_query.py +0 -0
  277. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/graph_summary.py +0 -0
  278. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/mcp_client_elevations.py +0 -0
  279. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/mcp_clients.py +0 -0
  280. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/messages.py +0 -0
  281. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/messenger_analytics.py +0 -0
  282. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/permissions_v2_identity.py +0 -0
  283. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
  284. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/query.py +0 -0
  285. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/registry.py +0 -0
  286. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/routines.py +0 -0
  287. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/shadow_rescore.py +0 -0
  288. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/signal_features.py +0 -0
  289. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/timeline_daily.py +0 -0
  290. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/tool_index.py +0 -0
  291. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/handlers/uma.py +0 -0
  292. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/logging.py +0 -0
  293. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/metrics.py +0 -0
  294. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/routine_access.py +0 -0
  295. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/startup_banner.py +0 -0
  296. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/state.py +0 -0
  297. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/table_layers.py +0 -0
  298. {topos_node-1.4.2 → topos_node-1.4.3}/topos/core/types.py +0 -0
  299. {topos_node-1.4.2 → topos_node-1.4.3}/topos/data_explorer_row_delete.py +0 -0
  300. {topos_node-1.4.2 → topos_node-1.4.3}/topos/data_explorer_table_prefs.py +0 -0
  301. {topos_node-1.4.2 → topos_node-1.4.3}/topos/data_explorer_tables.py +0 -0
  302. {topos_node-1.4.2 → topos_node-1.4.3}/topos/defaults.py +0 -0
  303. {topos_node-1.4.2 → topos_node-1.4.3}/topos/disclosure/__init__.py +0 -0
  304. {topos_node-1.4.2 → topos_node-1.4.3}/topos/disclosure/content_policy.py +0 -0
  305. {topos_node-1.4.2 → topos_node-1.4.3}/topos/disclosure/field_registry.py +0 -0
  306. {topos_node-1.4.2 → topos_node-1.4.3}/topos/disclosure/tier.py +0 -0
  307. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/__init__.py +0 -0
  308. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/__init__.py +0 -0
  309. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/base.py +0 -0
  310. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/generative_prompts.py +0 -0
  311. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/generative_response.py +0 -0
  312. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/ollama.py +0 -0
  313. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/openai.py +0 -0
  314. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/openai_compatible.py +0 -0
  315. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/redpill.py +0 -0
  316. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/backends/stub.py +0 -0
  317. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/client.py +0 -0
  318. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/disk_space.py +0 -0
  319. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/engine.py +0 -0
  320. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/hosted_llm_wallet.py +0 -0
  321. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/intake.py +0 -0
  322. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/memory_utils.py +0 -0
  323. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/model_manager.py +0 -0
  324. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/ollama_install.py +0 -0
  325. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/ollama_pull.py +0 -0
  326. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/ollama_runtime.py +0 -0
  327. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/ollama_setup_guidance.py +0 -0
  328. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/pipeline_memory.py +0 -0
  329. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/queue_manager.py +0 -0
  330. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/result_formatter.py +0 -0
  331. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/router.py +0 -0
  332. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/scoped_token.py +0 -0
  333. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/tasks.py +0 -0
  334. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/torch_runtime.py +0 -0
  335. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/transport.py +0 -0
  336. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/usage_guard.py +0 -0
  337. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/usage_observation.py +0 -0
  338. {topos_node-1.4.2 → topos_node-1.4.3}/topos/engine/validator.py +0 -0
  339. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/__init__.py +0 -0
  340. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/catalog.py +0 -0
  341. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/derivation_recovery.py +0 -0
  342. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/derived_tables.py +0 -0
  343. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/job_readiness.py +0 -0
  344. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/job_writer.py +0 -0
  345. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/__init__.py +0 -0
  346. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/base.py +0 -0
  347. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  348. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  349. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  350. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  351. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  352. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  353. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  354. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  355. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  356. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  357. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
  358. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  359. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  360. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  361. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  362. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  363. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  364. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  365. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  366. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/raw/__init__.py +0 -0
  367. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  368. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/raw/language_job.py +0 -0
  369. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  370. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  371. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/model_overrides.py +0 -0
  372. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/models/__init__.py +0 -0
  373. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/models/manager.py +0 -0
  374. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/models/mvp_defaults.py +0 -0
  375. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/models/registry.py +0 -0
  376. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/models/versioning.py +0 -0
  377. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/orchestrator.py +0 -0
  378. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/pipeline_activity.py +0 -0
  379. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/processor.py +0 -0
  380. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/progress_bar.py +0 -0
  381. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/record_progress.py +0 -0
  382. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/registry_contract.py +0 -0
  383. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/signal_derivation_config.json +0 -0
  384. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment/source_overrides.py +0 -0
  385. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/__init__.py +0 -0
  386. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/bundles.py +0 -0
  387. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/model_resolve.py +0 -0
  388. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/schema.py +0 -0
  389. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/service.py +0 -0
  390. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/store.py +0 -0
  391. {topos_node-1.4.2 → topos_node-1.4.3}/topos/enrichment_lab/worker.py +0 -0
  392. {topos_node-1.4.2 → topos_node-1.4.3}/topos/evals/__init__.py +0 -0
  393. {topos_node-1.4.2 → topos_node-1.4.3}/topos/evals/enrichment_eval.py +0 -0
  394. {topos_node-1.4.2 → topos_node-1.4.3}/topos/extensions.py +0 -0
  395. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/__init__.py +0 -0
  396. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/canonical.py +0 -0
  397. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/engine.py +0 -0
  398. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/entropy.py +0 -0
  399. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/focus.py +0 -0
  400. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/graph_metrics.py +0 -0
  401. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/influence.py +0 -0
  402. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/projection.py +0 -0
  403. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/snapshots.py +0 -0
  404. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/store.py +0 -0
  405. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/topic_merge.py +0 -0
  406. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/topics.py +0 -0
  407. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/topics_daily.py +0 -0
  408. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/complexity/volatility.py +0 -0
  409. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/__init__.py +0 -0
  410. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  411. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  412. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  413. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  414. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  415. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  416. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  417. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  418. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  419. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  420. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  421. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  422. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  423. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  424. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  425. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  426. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  427. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  428. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  429. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  430. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  431. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
  432. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  433. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  434. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  435. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  436. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  437. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  438. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  439. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  440. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  441. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  442. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  443. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  444. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  445. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  446. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  447. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/candidates.py +0 -0
  448. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/commitments.py +0 -0
  449. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/guard.py +0 -0
  450. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/kernels.py +0 -0
  451. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/net_subject_policy.py +0 -0
  452. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/packs.py +0 -0
  453. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/person_bridge.py +0 -0
  454. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/prefilter.py +0 -0
  455. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/registry.py +0 -0
  456. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/report_card.py +0 -0
  457. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/router.py +0 -0
  458. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/social_bench.py +0 -0
  459. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/social_kernels.py +0 -0
  460. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/synthesize.py +0 -0
  461. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/template.py +0 -0
  462. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/derivation/verify.py +0 -0
  463. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/__init__.py +0 -0
  464. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/affinity.py +0 -0
  465. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/affinity_owner.py +0 -0
  466. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/affinity_quality.py +0 -0
  467. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/chatgpt_declared.py +0 -0
  468. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/community_names.py +0 -0
  469. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/community_naming.py +0 -0
  470. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/consolidation.py +0 -0
  471. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/context_vectors.py +0 -0
  472. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/cypher.py +0 -0
  473. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/declared_mappings.py +0 -0
  474. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/discourse_graph.py +0 -0
  475. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/dossier.py +0 -0
  476. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/edges.py +0 -0
  477. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/fact_materializer.py +0 -0
  478. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/graph_search.py +0 -0
  479. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/linking.py +0 -0
  480. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/maintenance.py +0 -0
  481. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/mention_lineage.py +0 -0
  482. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/mention_lineage_lane.py +0 -0
  483. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/reads.py +0 -0
  484. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/rebuild_subprocess.py +0 -0
  485. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/resolver.py +0 -0
  486. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/entities/structured_fields.py +0 -0
  487. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/__init__.py +0 -0
  488. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/evidence_time.py +0 -0
  489. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/llm_extract.py +0 -0
  490. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/reactions.py +0 -0
  491. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/reads.py +0 -0
  492. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/store.py +0 -0
  493. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/facts/verdicts.py +0 -0
  494. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/fit/evaluator.py +0 -0
  495. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/fit/opportunity_types.json +0 -0
  496. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/__init__.py +0 -0
  497. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/blackhole.py +0 -0
  498. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/blackhole_guard.py +0 -0
  499. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/blackhole_llm.py +0 -0
  500. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/derived_scrub.py +0 -0
  501. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/exclusions.py +0 -0
  502. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/gc.py +0 -0
  503. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/lifecycle/record_protection.py +0 -0
  504. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/provenance/__init__.py +0 -0
  505. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/provenance/posture.py +0 -0
  506. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/__init__.py +0 -0
  507. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/brief_ontology.py +0 -0
  508. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/brief_renderer.py +0 -0
  509. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/brief_schemas.py +0 -0
  510. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/chunking.py +0 -0
  511. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/cluster_labels.py +0 -0
  512. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/conversation_context.py +0 -0
  513. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/conversation_windows.py +0 -0
  514. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/data_health.py +0 -0
  515. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  516. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/intentions.json +0 -0
  517. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/interests.json +0 -0
  518. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/memory.json +0 -0
  519. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/places.json +0 -0
  520. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/profile.json +0 -0
  521. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/relationships.json +0 -0
  522. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/resources.json +0 -0
  523. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  524. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/time.json +0 -0
  525. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/wellbeing.json +0 -0
  526. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/definitions/work.json +0 -0
  527. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/derived_index.py +0 -0
  528. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/derived_spec.py +0 -0
  529. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/dimension_briefs.py +0 -0
  530. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/dimension_definition_loader.py +0 -0
  531. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/dimension_profiles.py +0 -0
  532. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/dimension_registry.py +0 -0
  533. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/embed_context.py +0 -0
  534. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/extraction/artifact_router.py +0 -0
  535. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/extraction/artifact_store.py +0 -0
  536. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/extraction/rule_extractors.py +0 -0
  537. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/graph_sanitize.py +0 -0
  538. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/hybrid_search.py +0 -0
  539. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/incremental_clustering.py +0 -0
  540. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/model_recommendations.py +0 -0
  541. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/query_embed_cache.py +0 -0
  542. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/schemas.py +0 -0
  543. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/service.py +0 -0
  544. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/source_hydration.py +0 -0
  545. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/structured_signal.py +0 -0
  546. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/tool_index.py +0 -0
  547. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/topic_clustering.py +0 -0
  548. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/typed_stores/aggregates.py +0 -0
  549. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/typed_stores/commitments.py +0 -0
  550. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/typed_stores/rhythm.py +0 -0
  551. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  552. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/vector_codec.py +0 -0
  553. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/vector_math.py +0 -0
  554. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/signal/vector_settings.py +0 -0
  555. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/stats/__init__.py +0 -0
  556. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/stats/definitions.py +0 -0
  557. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/stats/engine.py +0 -0
  558. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/stats/fold.py +0 -0
  559. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/stats/insights.py +0 -0
  560. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/temporal/__init__.py +0 -0
  561. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/temporal/points.py +0 -0
  562. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/timeline_projection.py +0 -0
  563. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/timeline_rollup.py +0 -0
  564. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/__init__.py +0 -0
  565. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/badges.py +0 -0
  566. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/daily.py +0 -0
  567. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/dashboard.py +0 -0
  568. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/instruments.py +0 -0
  569. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/intents.py +0 -0
  570. {topos_node-1.4.2 → topos_node-1.4.3}/topos/features/triage/readiness.py +0 -0
  571. {topos_node-1.4.2 → topos_node-1.4.3}/topos/filter_lab/__init__.py +0 -0
  572. {topos_node-1.4.2 → topos_node-1.4.3}/topos/filter_lab/bundles.py +0 -0
  573. {topos_node-1.4.2 → topos_node-1.4.3}/topos/filter_lab/schema.py +0 -0
  574. {topos_node-1.4.2 → topos_node-1.4.3}/topos/filter_lab/service.py +0 -0
  575. {topos_node-1.4.2 → topos_node-1.4.3}/topos/filter_lab/store.py +0 -0
  576. {topos_node-1.4.2 → topos_node-1.4.3}/topos/filter_lab/worker.py +0 -0
  577. {topos_node-1.4.2 → topos_node-1.4.3}/topos/home_chat/__init__.py +0 -0
  578. {topos_node-1.4.2 → topos_node-1.4.3}/topos/home_chat/schema.py +0 -0
  579. {topos_node-1.4.2 → topos_node-1.4.3}/topos/hosted_pool_lease.py +0 -0
  580. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/__init__.py +0 -0
  581. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/checkpoints/__init__.py +0 -0
  582. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  583. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  584. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/inbox_crypto.py +0 -0
  585. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/inbox_drain.py +0 -0
  586. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/jobs.py +0 -0
  587. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/journal_location_fanout.py +0 -0
  588. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/journal_time_log_normalize.py +0 -0
  589. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/local_exports.py +0 -0
  590. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/log_preview.py +0 -0
  591. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parser.py +0 -0
  592. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/__init__.py +0 -0
  593. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/base.py +0 -0
  594. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/browser_parser.py +0 -0
  595. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/calendar_parser.py +0 -0
  596. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
  597. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/chatgpt_export.py +0 -0
  598. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  599. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  600. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/documents_parser.py +0 -0
  601. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  602. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  603. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/grok_parser.py +0 -0
  604. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/messenger_parser.py +0 -0
  605. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/transcript_parser.py +0 -0
  606. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  607. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/progress.py +0 -0
  608. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/reprocess.py +0 -0
  609. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/__init__.py +0 -0
  610. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/base.py +0 -0
  611. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/calendar.py +0 -0
  612. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/chatgpt.py +0 -0
  613. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/contact_importers.py +0 -0
  614. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/grok.py +0 -0
  615. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/signal_export_parser.py +0 -0
  616. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/sources/signal_reader.py +0 -0
  617. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/state_machine.py +0 -0
  618. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/triggers/__init__.py +0 -0
  619. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/triggers/file_trigger.py +0 -0
  620. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  621. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  622. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/validation/__init__.py +0 -0
  623. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/validation/base.py +0 -0
  624. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/validation/schema_registry.py +0 -0
  625. {topos_node-1.4.2 → topos_node-1.4.3}/topos/ingestion/validation/schema_validator.py +0 -0
  626. {topos_node-1.4.2 → topos_node-1.4.3}/topos/lineage/__init__.py +0 -0
  627. {topos_node-1.4.2 → topos_node-1.4.3}/topos/lineage/provenance.py +0 -0
  628. {topos_node-1.4.2 → topos_node-1.4.3}/topos/lineage/tracker.py +0 -0
  629. {topos_node-1.4.2 → topos_node-1.4.3}/topos/llm_integrations_storage.py +0 -0
  630. {topos_node-1.4.2 → topos_node-1.4.3}/topos/mcp_clients.py +0 -0
  631. {topos_node-1.4.2 → topos_node-1.4.3}/topos/mcp_stdio_proxy.py +0 -0
  632. {topos_node-1.4.2 → topos_node-1.4.3}/topos/observability/__init__.py +0 -0
  633. {topos_node-1.4.2 → topos_node-1.4.3}/topos/observability/alerts.py +0 -0
  634. {topos_node-1.4.2 → topos_node-1.4.3}/topos/observability/metrics.py +0 -0
  635. {topos_node-1.4.2 → topos_node-1.4.3}/topos/observability/tracing.py +0 -0
  636. {topos_node-1.4.2 → topos_node-1.4.3}/topos/openai_client.py +0 -0
  637. {topos_node-1.4.2 → topos_node-1.4.3}/topos/owner_key.py +0 -0
  638. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/__init__.py +0 -0
  639. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/canonical.py +0 -0
  640. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/canonical_floor.py +0 -0
  641. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/chatgpt_coverage.py +0 -0
  642. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/contract.py +0 -0
  643. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/evidence_review_runtime.py +0 -0
  644. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/evidence_reviews.py +0 -0
  645. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/exclusion_floor.py +0 -0
  646. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/__init__.py +0 -0
  647. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/__main__.py +0 -0
  648. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/evaluators.py +0 -0
  649. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/fact_bridge.py +0 -0
  650. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/harness.py +0 -0
  651. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/models.py +0 -0
  652. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/retention.py +0 -0
  653. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/scoring.py +0 -0
  654. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/source_bridge.py +0 -0
  655. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/experiments/synthetic.py +0 -0
  656. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/fact_contract.py +0 -0
  657. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/fact_eligibility.py +0 -0
  658. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/fact_policy.py +0 -0
  659. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/fact_projection.py +0 -0
  660. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/fact_release.py +0 -0
  661. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/fact_release_transport.py +0 -0
  662. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/forwarding.py +0 -0
  663. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/identity_attestation.py +0 -0
  664. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/identity_dispatch.py +0 -0
  665. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/identity_protocol.py +0 -0
  666. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/ingest_dispatch.py +0 -0
  667. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/ingest_protocol.py +0 -0
  668. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/ledger_retention.py +0 -0
  669. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/node_protocol.py +0 -0
  670. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/opaque_ids.py +0 -0
  671. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/projection_review_runtime.py +0 -0
  672. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/projection_reviews.py +0 -0
  673. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/protection_clock.py +0 -0
  674. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/protocol.py +0 -0
  675. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/reconciliation_facts.py +0 -0
  676. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/registry.py +0 -0
  677. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/release_transport.py +0 -0
  678. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/search_contract.py +0 -0
  679. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/search_lanes.py +0 -0
  680. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/shadow_index.py +0 -0
  681. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/shadow_labeler_local.py +0 -0
  682. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/shadow_labelers.py +0 -0
  683. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/shadow_rescore.py +0 -0
  684. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
  685. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/signing.py +0 -0
  686. {topos_node-1.4.2 → topos_node-1.4.3}/topos/permissions_v2/snapshot_message_facts.py +0 -0
  687. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/__init__.py +0 -0
  688. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/audit.py +0 -0
  689. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/envelope.py +0 -0
  690. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/job_secrets.py +0 -0
  691. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/job_store.py +0 -0
  692. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/stages.py +0 -0
  693. {topos_node-1.4.2 → topos_node-1.4.3}/topos/pipeline/stub_enqueue.py +0 -0
  694. {topos_node-1.4.2 → topos_node-1.4.3}/topos/principal.py +0 -0
  695. {topos_node-1.4.2 → topos_node-1.4.3}/topos/profiles.py +0 -0
  696. {topos_node-1.4.2 → topos_node-1.4.3}/topos/projections/__init__.py +0 -0
  697. {topos_node-1.4.2 → topos_node-1.4.3}/topos/projections/vector_index/__init__.py +0 -0
  698. {topos_node-1.4.2 → topos_node-1.4.3}/topos/projections/vector_index/base.py +0 -0
  699. {topos_node-1.4.2 → topos_node-1.4.3}/topos/projections/vector_index/builders.py +0 -0
  700. {topos_node-1.4.2 → topos_node-1.4.3}/topos/projections/vector_index/health_checks.py +0 -0
  701. {topos_node-1.4.2 → topos_node-1.4.3}/topos/protocol/__init__.py +0 -0
  702. {topos_node-1.4.2 → topos_node-1.4.3}/topos/protocol/narrowing_vocabulary.json +0 -0
  703. {topos_node-1.4.2 → topos_node-1.4.3}/topos/protocol/query_field_contract.json +0 -0
  704. {topos_node-1.4.2 → topos_node-1.4.3}/topos/protocol/retrieval_text_contract.json +0 -0
  705. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/__init__.py +0 -0
  706. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/aggregate.py +0 -0
  707. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/audit.py +0 -0
  708. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/closeness.py +0 -0
  709. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/cohort_resolvers.py +0 -0
  710. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/collaborators.py +0 -0
  711. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/ddr.py +0 -0
  712. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/disclosure.py +0 -0
  713. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/entity_window.py +0 -0
  714. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/exclusion.py +0 -0
  715. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/fingerprint.py +0 -0
  716. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/game_layer.py +0 -0
  717. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/grant_cache.py +0 -0
  718. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/graph_lane.py +0 -0
  719. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/inference.py +0 -0
  720. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/intent.py +0 -0
  721. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/journal_event_lane.py +0 -0
  722. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/manifest.py +0 -0
  723. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/manifest_validation.py +0 -0
  724. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/minimizer.py +0 -0
  725. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/narrowing.py +0 -0
  726. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/negotiation.py +0 -0
  727. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/overheard.py +0 -0
  728. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/packet_resolution.py +0 -0
  729. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/pipeline.py +0 -0
  730. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/planner.py +0 -0
  731. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/runtime.py +0 -0
  732. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/scope_arbiter.py +0 -0
  733. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/scope_classifier.py +0 -0
  734. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/scope_head.py +0 -0
  735. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/scope_registry_loader.py +0 -0
  736. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/scope_shadow.py +0 -0
  737. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/session.py +0 -0
  738. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/session_utils.py +0 -0
  739. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/source_generation.py +0 -0
  740. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/truth_door.py +0 -0
  741. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/truth_facts.py +0 -0
  742. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/truth_prompts.py +0 -0
  743. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/turn_classifier.py +0 -0
  744. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/types.py +0 -0
  745. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/verify.py +0 -0
  746. {topos_node-1.4.2 → topos_node-1.4.3}/topos/query/verify_modes.py +0 -0
  747. {topos_node-1.4.2 → topos_node-1.4.3}/topos/rate_limit.py +0 -0
  748. {topos_node-1.4.2 → topos_node-1.4.3}/topos/relay_stamp.py +0 -0
  749. {topos_node-1.4.2 → topos_node-1.4.3}/topos/routines/__init__.py +0 -0
  750. {topos_node-1.4.2 → topos_node-1.4.3}/topos/routines/schema.py +0 -0
  751. {topos_node-1.4.2 → topos_node-1.4.3}/topos/routines/store.py +0 -0
  752. {topos_node-1.4.2 → topos_node-1.4.3}/topos/runtime_housekeeping.py +0 -0
  753. {topos_node-1.4.2 → topos_node-1.4.3}/topos/runtime_shutdown.py +0 -0
  754. {topos_node-1.4.2 → topos_node-1.4.3}/topos/runtime_update.py +0 -0
  755. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sanitization/__init__.py +0 -0
  756. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sanitization/hub_pipeline.py +0 -0
  757. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sanitization/ollama_transforms.py +0 -0
  758. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sanitization/privacy_filter.py +0 -0
  759. {topos_node-1.4.2 → topos_node-1.4.3}/topos/scope_resolution.py +0 -0
  760. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/__init__.py +0 -0
  761. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/container.py +0 -0
  762. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/embeddings/__init__.py +0 -0
  763. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/embeddings/base.py +0 -0
  764. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/embeddings/local.py +0 -0
  765. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/embeddings/remote.py +0 -0
  766. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/interfaces.py +0 -0
  767. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/llm/__init__.py +0 -0
  768. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/llm/base.py +0 -0
  769. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/llm/openai.py +0 -0
  770. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/local.py +0 -0
  771. {topos_node-1.4.2 → topos_node-1.4.3}/topos/services/postgres.py +0 -0
  772. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/__init__.py +0 -0
  773. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/bundled_canonical_triples.py +0 -0
  774. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/canonical_signal_defaults.py +0 -0
  775. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/declared_field_map_spec.py +0 -0
  776. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/registry.py +0 -0
  777. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/runtime_install.py +0 -0
  778. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/scrub_attribution.py +0 -0
  779. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sources/scrub_service.py +0 -0
  780. {topos_node-1.4.2 → topos_node-1.4.3}/topos/startup_banner.py +0 -0
  781. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/__init__.py +0 -0
  782. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/__init__.py +0 -0
  783. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/factory.py +0 -0
  784. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/fakes.py +0 -0
  785. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/postgres/stores.py +0 -0
  786. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/protocols.py +0 -0
  787. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/sqlite/__init__.py +0 -0
  788. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  789. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/__init__.py +0 -0
  790. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  791. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  792. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  793. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/journal_repair.py +0 -0
  794. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/mapping_store.py +0 -0
  795. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/canonical/postgres.py +0 -0
  796. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/__init__.py +0 -0
  797. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/client.py +0 -0
  798. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/connection_tuning.py +0 -0
  799. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/__init__.py +0 -0
  800. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  801. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  802. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  803. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  804. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/backup.py +0 -0
  805. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/backup_custody.py +0 -0
  806. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  807. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  808. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  809. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  810. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/community_names_v1.py +0 -0
  811. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/complexity_v1.py +0 -0
  812. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  813. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  814. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  815. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  816. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  817. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  818. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/documents_v1.py +0 -0
  819. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  820. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  821. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  822. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  823. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  824. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  825. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  826. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  827. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  828. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  829. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/episodes_v1.py +0 -0
  830. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  831. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  832. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  833. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  834. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  835. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  836. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  837. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  838. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  839. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  840. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  841. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  842. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
  843. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  844. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
  845. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
  846. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
  847. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  848. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  849. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/registry_checksums.json +0 -0
  850. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  851. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  852. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  853. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  854. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  855. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/signal_objects.py +0 -0
  856. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  857. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  858. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  859. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  860. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/transcripts_v1.py +0 -0
  861. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  862. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  863. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  864. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  865. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  866. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  867. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  868. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  869. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  870. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  871. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  872. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  873. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  874. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  875. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  876. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  877. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  878. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  879. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/paths.py +0 -0
  880. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/postgres.py +0 -0
  881. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/schema.py +0 -0
  882. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/schema_probe.py +0 -0
  883. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/storage_breakdown.py +0 -0
  884. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/db/write_gate.py +0 -0
  885. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/derived_row_identity.py +0 -0
  886. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/enrichment/__init__.py +0 -0
  887. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  888. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  889. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/normalized/__init__.py +0 -0
  890. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/normalized/normalized_store.py +0 -0
  891. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/oplog/__init__.py +0 -0
  892. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/oplog/decision.py +0 -0
  893. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/oplog/oplog_store.py +0 -0
  894. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/oplog/postgres.py +0 -0
  895. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/person/identity_resolver.py +0 -0
  896. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/projections/__init__.py +0 -0
  897. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/projections/index_ops_store.py +0 -0
  898. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/projections/vector_index_store.py +0 -0
  899. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/raw/__init__.py +0 -0
  900. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/raw/browser_flat_tables.py +0 -0
  901. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/raw/file_store.py +0 -0
  902. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/raw/raw_store.py +0 -0
  903. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/raw/sqlite_raw_store.py +0 -0
  904. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/security/encryption.py +0 -0
  905. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/signal_identity.py +0 -0
  906. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/source_settings.py +0 -0
  907. {topos_node-1.4.2 → topos_node-1.4.3}/topos/storage/user_identity.py +0 -0
  908. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sync/__init__.py +0 -0
  909. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sync/client.py +0 -0
  910. {topos_node-1.4.2 → topos_node-1.4.3}/topos/sync_handlers.py +0 -0
  911. {topos_node-1.4.2 → topos_node-1.4.3}/topos/testing/__init__.py +0 -0
  912. {topos_node-1.4.2 → topos_node-1.4.3}/topos/testing/lifespan.py +0 -0
  913. {topos_node-1.4.2 → topos_node-1.4.3}/topos/uds.py +0 -0
  914. {topos_node-1.4.2 → topos_node-1.4.3}/topos/uma_authority.py +0 -0
  915. {topos_node-1.4.2 → topos_node-1.4.3}/topos/uma_contact_enrichment.py +0 -0
  916. {topos_node-1.4.2 → topos_node-1.4.3}/topos/uma_filters.py +0 -0
  917. {topos_node-1.4.2 → topos_node-1.4.3}/topos/uma_resource_id.py +0 -0
  918. {topos_node-1.4.2 → topos_node-1.4.3}/topos/uma_rpt.py +0 -0
  919. {topos_node-1.4.2 → topos_node-1.4.3}/topos/upgrades/__init__.py +0 -0
  920. {topos_node-1.4.2 → topos_node-1.4.3}/topos/upgrades/runner.py +0 -0
  921. {topos_node-1.4.2 → topos_node-1.4.3}/topos/utils/base_object.py +0 -0
  922. {topos_node-1.4.2 → topos_node-1.4.3}/topos/websocket_client.py +0 -0
  923. {topos_node-1.4.2 → topos_node-1.4.3}/topos_node.egg-info/dependency_links.txt +0 -0
  924. {topos_node-1.4.2 → topos_node-1.4.3}/topos_node.egg-info/entry_points.txt +0 -0
  925. {topos_node-1.4.2 → topos_node-1.4.3}/topos_node.egg-info/requires.txt +0 -0
  926. {topos_node-1.4.2 → topos_node-1.4.3}/topos_node.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.4.2
3
+ Version: 1.4.3
4
4
  Summary: Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Homepage, https://topos.dialogues.ai
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "topos-node"
12
- version = "1.4.2"
12
+ version = "1.4.3"
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"
@@ -181,26 +181,14 @@ def test_the_privacy_filter_loads_through_the_cache_first(calls, monkeypatch):
181
181
  assert kwargs == {"tokenizer": ("AutoTokenizer", repo), "device": "cpu"}
182
182
 
183
183
 
184
- def test_the_nsfw_classifier_loads_through_the_cache_first_and_keeps_every_label(
185
- calls, monkeypatch
186
- ):
184
+ def test_the_nsfw_tag_loads_nothing(calls, monkeypatch):
185
+ """The NSFW tag is a rule now: no Hub call, no cache slot, no pipeline, whatever the text."""
187
186
  from topos.engine import model_cache
188
187
  from topos.sanitization import nsfw_classifier
189
188
 
190
- repo = nsfw_classifier.DEFAULT_NSFW_CLASSIFIER_MODEL
191
189
  monkeypatch.setattr(model_cache, "get_model_cache", lambda: _PassThroughCache())
192
-
193
- nsfw_classifier._get_pipeline(repo)
194
-
195
- assert [(name, kw) for name, _repo, kw in calls.from_pretrained] == [
196
- ("AutoTokenizer", {"local_files_only": True}),
197
- ("AutoModelForSequenceClassification", {"local_files_only": True}),
198
- ]
199
- ((task, model, kwargs),) = calls.pipeline
200
- assert task == "text-classification"
201
- assert model == ("AutoModelForSequenceClassification", repo)
202
- # top_k=None is what makes the classifier return both labels, not only the top one.
203
- assert kwargs == {"tokenizer": ("AutoTokenizer", repo), "top_k": None}
190
+ assert nsfw_classifier.classify_nsfw_text("a pornographic film")[0] is True
191
+ assert calls.from_pretrained == [] and calls.pipeline == []
204
192
 
205
193
 
206
194
  def test_settings_switch_off_the_safetensors_conversion_probe():
@@ -137,6 +137,9 @@ def test_no_prefix_is_claimed_twice() -> None:
137
137
  ("tests/permissions_v2/test_evidence.py::test_x", "permissions_v2"),
138
138
  # the longer prefix wins over tests/permissions_v2/
139
139
  ("tests/permissions_v2/test_message_search_index.py::test_x", "message_search_gap"),
140
+ ("tests/permissions_v2/test_journal_family.py::test_x", "permissions_v2_families"),
141
+ # test_message_search_* stays with message_search_gap; test_search_* is the families slice
142
+ ("tests/permissions_v2/test_search_send_token.py::test_x", "permissions_v2_families"),
140
143
  ("tests/gap/p3/engine/test_x.py::TestY::test_z[a-b]", "message_search_gap"),
141
144
  ("tests/features/test_x.py::test_y", "features_topos_core"),
142
145
  ("tests/topos/test_x.py::test_y", "features_topos_core"),
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.4.2"
4
- __version_info__ = (1, 4, 2)
3
+ __version__ = "1.4.3"
4
+ __version_info__ = (1, 4, 3)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -403,6 +403,15 @@ BAND_DISCUSSED = "discussed"
403
403
  BAND_AMBIENT = "ambient"
404
404
  BAND_ORDER = (BAND_CORE, BAND_NAMED, BAND_DISCUSSED, BAND_AMBIENT)
405
405
 
406
+ #: How often a name has to come up before it belongs on the default graph.
407
+ #:
408
+ #: Same count as the reading lane (`person_reading.MIN_OWNER_ROWS`). A local model
409
+ #: and a node on the picture are the same decision: people you message, and people
410
+ #: named often in conversations you take part in. A name that merely appears in two
411
+ #: connectors is exposure, not a relationship — that rule is what filled the graph
412
+ #: with everybody a data source had ever mentioned.
413
+ FREQUENT_MENTIONS = 5
414
+
406
415
  #: Sources whose rows are exposure rather than expression. Read from the SOURCE CONTRACT
407
416
  #: (`sources.registry.effective_posture`), never from a list of connector names — the first
408
417
  #: draft of this model ranked grow_journal > imessage > browser_visits, which is three
@@ -441,17 +450,38 @@ def classify_band(*, messaged: bool, owner_authored: int, distinct_sources: int,
441
450
 
442
451
  The reason is not decoration. "Seen once, on a page you visited" is falsifiable and the
443
452
  owner can correct it; a rank cannot be argued with.
453
+
454
+ Default-visible bands are core and named. Discussed and ambient stay in the
455
+ data and off the picture until the owner asks for them.
456
+
457
+ * core — you exchanged messages with them
458
+ * named — you wrote their name often, or it comes up often in conversations
459
+ you took part in (`FREQUENT_MENTIONS`, the reading lane's bar)
460
+ * discussed — a real mention, but not often enough to feature
461
+ * ambient — passing sightings, including a name that only shows up because
462
+ two different data sources both extracted it
444
463
  """
445
464
  if messaged:
446
465
  return BAND_CORE, "you exchange messages with them"
466
+ if owner_authored >= FREQUENT_MENTIONS:
467
+ times = "time" if owner_authored == 1 else "times"
468
+ return BAND_NAMED, f"you wrote their name {owner_authored} {times}"
469
+ if non_ambient_mentions >= FREQUENT_MENTIONS:
470
+ return BAND_NAMED, (
471
+ f"mentioned {non_ambient_mentions} times in things you took part in"
472
+ )
447
473
  if owner_authored > 0:
448
- return BAND_NAMED, "you wrote their name down yourself"
449
- if distinct_sources >= 2:
450
- return BAND_NAMED, f"they turn up in {distinct_sources} different places"
451
- if non_ambient_mentions > 0 and mention_count >= 2:
452
- return BAND_DISCUSSED, f"mentioned {mention_count} times in things you took part in"
474
+ times = "time" if owner_authored == 1 else "times"
475
+ return BAND_DISCUSSED, f"you wrote their name {owner_authored} {times}"
453
476
  if non_ambient_mentions > 0:
454
- return BAND_AMBIENT, "mentioned once, in something you took part in"
477
+ times = "time" if mention_count == 1 else "times"
478
+ return BAND_DISCUSSED, (
479
+ f"mentioned {mention_count} {times} in things you took part in"
480
+ )
481
+ if distinct_sources >= 2:
482
+ return BAND_AMBIENT, (
483
+ f"named in {distinct_sources} places, but you have not talked with them"
484
+ )
455
485
  return BAND_AMBIENT, ("seen once in passing" if mention_count <= 1
456
486
  else f"seen {mention_count} times in passing, never discussed")
457
487
 
@@ -57,7 +57,10 @@ async def get_home_chat_session(
57
57
  user_id: str = Query(..., min_length=1),
58
58
  ) -> Dict[str, Any]:
59
59
  conn = _get_conn()
60
- row = home_chat_store.get_session(conn, user_id=user_id.strip(), session_id=session_id.strip())
60
+ try:
61
+ row = home_chat_store.get_session(conn, user_id=user_id.strip(), session_id=session_id.strip())
62
+ except ValueError as exc:
63
+ raise _map_store_error(exc) from exc
61
64
  if not row:
62
65
  raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Session not found")
63
66
  return row
@@ -7,8 +7,9 @@ from datetime import datetime, timezone
7
7
  from typing import Optional
8
8
 
9
9
  from fastapi import APIRouter, Body, Depends, Query, Request # noqa: F401 Body used in put_signal_settings
10
+ from fastapi.security import HTTPAuthorizationCredentials
10
11
 
11
- from ..auth import require_api_key, require_owner_unless_legacy
12
+ from ..auth import bearer_scheme, require_api_key, require_owner_unless_legacy, resolve_request_principal
12
13
  from ..core.state import get_db_connection
13
14
  from ..ingestion.ingest_helpers import ingest_file_payload, ingest_ui_payload, resolve_file_format
14
15
  from ..ingestion.local_sync import run_signal_upload
@@ -57,8 +58,14 @@ async def ingest_source(
57
58
  source = REGISTRY.get(source_id)
58
59
  if not source:
59
60
  return {"status": "error", "error": "unknown source_id"}
61
+ # The door that wrote these rows, from the credential, never the body
62
+ # (features/provenance/writer_class.py). This route has no principal
63
+ # contextvar of its own, so the helpers are told explicitly.
64
+ from ..auth import resolve_request_writer_class
65
+ from ..features.provenance.writer_class import WRITER_OWNER_IMPORT
60
66
 
61
67
  if is_file_delivery(source):
68
+ writer_class = await resolve_request_writer_class(request, owner_class=WRITER_OWNER_IMPORT)
62
69
  file = None
63
70
  if request.headers.get("content-type", "").startswith("multipart/"):
64
71
  form = await request.form()
@@ -91,6 +98,7 @@ async def ingest_source(
91
98
  file_path=file_path,
92
99
  source_id=source_id,
93
100
  file_format=resolve_file_format(source_definition=source, file_path=file_path),
101
+ writer_class=writer_class,
94
102
  )
95
103
  payload_bytes = await file.read()
96
104
  guard = await submit_usage_guard_check(
@@ -109,6 +117,7 @@ async def ingest_source(
109
117
  file_bytes=payload_bytes,
110
118
  source_id=source_id,
111
119
  file_format=resolve_file_format(source_definition=source),
120
+ writer_class=writer_class,
112
121
  )
113
122
 
114
123
  if accepts_app_ingest(source):
@@ -124,6 +133,7 @@ async def ingest_source(
124
133
  schema_id=source.schema_id,
125
134
  payload=payload,
126
135
  source_id=source_id, # Pass source_id to enable direct processing
136
+ writer_class=await resolve_request_writer_class(request),
127
137
  )
128
138
 
129
139
  if source.delivery == DELIVERY_LOCAL_SYNC:
@@ -136,10 +146,26 @@ async def ingest_source(
136
146
  return {"status": "error", "error": "unsupported source type"}
137
147
 
138
148
 
149
+ async def _proof_standing_as(principal, action: str, body) -> dict:
150
+ """The owner's standing iMessage attestation through this door, as the websocket door runs it
151
+ (``core.handlers.sources._proof_standing``), under the request's own principal. ``imessage_standing``
152
+ refuses anyone but the owner on the owner's channels (``owner_authority_required``)."""
153
+ from ..core.handlers.sources import _proof_standing
154
+ from ..principal import reset_principal, set_principal
155
+
156
+ token = set_principal(principal)
157
+ try:
158
+ return await asyncio.to_thread(_proof_standing, action, body)
159
+ finally:
160
+ reset_principal(token)
161
+
162
+
139
163
  @router.get("/sources/{source_id}/settings", dependencies=[Depends(require_api_key)])
140
164
  async def get_source_settings_endpoint(
141
165
  source_id: str,
166
+ request: Request,
142
167
  dataset_id: Optional[str] = Query(default=None),
168
+ credentials: Optional[HTTPAuthorizationCredentials] = Depends(bearer_scheme),
143
169
  ):
144
170
  """Get source settings: enabled, last_sync_at, last_error (for local_sync: imessage, signal)."""
145
171
  source = REGISTRY.get(source_id)
@@ -151,16 +177,43 @@ async def get_source_settings_endpoint(
151
177
  if not conn:
152
178
  return {"status": "error", "error": "Database not available"}
153
179
  settings = get_source_settings(conn, dataset_id, source_id)
154
- return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings}
180
+ sync_settings = await asyncio.to_thread(_sync_settings_in_worker, dataset_id, source_id)
181
+ if source_id == "imessage":
182
+ # The standing attestation's state is the owner's to see (the websocket door's rule).
183
+ principal = resolve_request_principal(request, credentials)
184
+ if principal is not None and principal.cls == "owner_app":
185
+ sync_settings["proof_standing"] = await _proof_standing_as(principal, "status", None)
186
+ return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings, **sync_settings}
187
+
188
+
189
+ def _sync_settings_in_worker(dataset_id: str, source_id: str, changes: Optional[dict] = None) -> dict:
190
+ """Save (when ``changes``) and describe the sync schedule, on this thread's own connection.
191
+
192
+ The same fields the websocket door returns, so the two doors cannot drift.
193
+ """
194
+ from ..ingestion.local_sync_schedule import describe_sync_settings, put_schedule
195
+
196
+ own = get_db_connection()
197
+ if own is None:
198
+ return {}
199
+ if changes is not None:
200
+ put_schedule(own, dataset_id, source_id, changes)
201
+ return describe_sync_settings(own, dataset_id, source_id)
155
202
 
156
203
 
157
204
  @router.put("/sources/{source_id}/settings", dependencies=[Depends(require_api_key)])
158
205
  async def put_source_settings_endpoint(
159
206
  source_id: str,
207
+ request: Request,
160
208
  dataset_id: Optional[str] = Query(default=None),
161
209
  body: Optional[dict] = Body(default=None),
210
+ credentials: Optional[HTTPAuthorizationCredentials] = Depends(bearer_scheme),
162
211
  ):
163
- """Set source settings (e.g. enabled, exclude_spam). Valid for local_sync sources (imessage, signal)."""
212
+ """Set source settings (e.g. enabled, exclude_spam, sync_schedule). Valid for local_sync sources (imessage, signal).
213
+
214
+ ``sync_schedule`` is owner-only, under the same rule as the sync route: it
215
+ makes the node sync on its own clock.
216
+ """
164
217
  source = REGISTRY.get(source_id)
165
218
  if not source:
166
219
  return {"status": "error", "error": "unknown source_id"}
@@ -173,22 +226,44 @@ async def put_source_settings_endpoint(
173
226
  enabled = body.get("enabled")
174
227
  posture_provided = "posture" in body
175
228
  exclude_spam_provided = "exclude_spam" in body
176
- if enabled is None and not posture_provided and not exclude_spam_provided:
177
- return {"status": "error", "error": "enabled, posture, or exclude_spam required in body"}
229
+ schedule_provided = "sync_schedule" in body
230
+ # The owner's standing iMessage attestation (owner decision 1), as on the websocket door.
231
+ standing_provided = "proof_standing" in body
232
+ if standing_provided and source_id != "imessage":
233
+ return {"status": "error", "error": "proof_standing only applies to imessage"}
234
+ if (enabled is None and not posture_provided and not exclude_spam_provided and not schedule_provided
235
+ and not standing_provided):
236
+ return {"status": "error", "error": "enabled, posture, exclude_spam, sync_schedule, or proof_standing required in body"}
237
+ if schedule_provided or standing_provided:
238
+ # Raises 403 owner_mode_required for any principal but the owner's.
239
+ require_owner_unless_legacy(request, credentials)
240
+ standing_request = body.get("proof_standing") if isinstance(body.get("proof_standing"), dict) else {}
241
+ if standing_provided and standing_request.get("action") not in ("status", "preview", "arm", "disarm"):
242
+ return {"status": "error", "error": "proof_standing.action must be status, preview, arm or disarm"}
178
243
  conn = get_db_connection()
179
244
  if not conn:
180
245
  return {"status": "error", "error": "Database not available"}
181
- put_kwargs: dict = {"enabled": enabled}
182
- if posture_provided:
183
- put_kwargs["posture"] = body.get("posture")
184
- if exclude_spam_provided:
185
- put_kwargs["exclude_spam"] = bool(body.get("exclude_spam"))
186
246
  try:
187
- put_source_settings(conn, dataset_id, source_id, **put_kwargs)
247
+ if enabled is not None or posture_provided or exclude_spam_provided:
248
+ put_kwargs: dict = {"enabled": enabled}
249
+ if posture_provided:
250
+ put_kwargs["posture"] = body.get("posture")
251
+ if exclude_spam_provided:
252
+ put_kwargs["exclude_spam"] = bool(body.get("exclude_spam"))
253
+ put_source_settings(conn, dataset_id, source_id, **put_kwargs)
254
+ sync_settings = await asyncio.to_thread(
255
+ _sync_settings_in_worker,
256
+ dataset_id,
257
+ source_id,
258
+ body.get("sync_schedule") if schedule_provided else None,
259
+ )
188
260
  except ValueError as exc:
189
261
  return {"status": "error", "error": str(exc)}
262
+ if standing_provided:
263
+ sync_settings["proof_standing"] = await _proof_standing_as(
264
+ resolve_request_principal(request, credentials), standing_request["action"], standing_request)
190
265
  settings = get_source_settings(conn, dataset_id, source_id) or {}
191
- return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings}
266
+ return {"status": "ok", "dataset_id": dataset_id, "source_id": source_id, **settings, **sync_settings}
192
267
 
193
268
 
194
269
  @router.post("/sources/{source_id}/sync", dependencies=[Depends(require_owner_unless_legacy)])
@@ -291,12 +366,16 @@ async def upload_signal_export(
291
366
  file_bytes = await f.read()
292
367
  if not file_bytes:
293
368
  return {"status": "error", "error": "file required (multipart/form-data)"}
369
+ from ..auth import resolve_request_writer_class
370
+ from ..features.provenance.writer_class import WRITER_OWNER_IMPORT
371
+
294
372
  result = await asyncio.to_thread(
295
373
  run_signal_upload,
296
374
  dataset_id,
297
375
  file_bytes,
298
376
  my_phone_number=my_phone_number,
299
377
  owner_user_id=owner_user_id,
378
+ writer_class=await resolve_request_writer_class(request, owner_class=WRITER_OWNER_IMPORT),
300
379
  )
301
380
  return result
302
381
 
@@ -0,0 +1,106 @@
1
+ """Owner socket maintenance of the NSFW tags: the explicit-wording sweep, by hand, with counts.
2
+
3
+ ``POST /v1/privacy/nsfw-recheck`` on the node's owner socket only (the 0600 UDS; no bearer, no relay). Body, all
4
+ optional: ``{"dry_run": true|false, "tables": [<table>, ...]}``. ``dry_run`` defaults to true: a bare POST
5
+ evaluates every row of the three tables with the rule and answers what a write run would change, writing nothing.
6
+ ``"dry_run": false`` runs the same sweep the node runs for itself at startup (``topos.disclosure.nsfw_tags``),
7
+ over every row, now. ``tables`` limits either to some of ``journal_entries``, ``conversation_messages`` and
8
+ ``ai_chat_messages``. The answer is counts (``nsfw_tags.COUNTS`` per table and in total); no id, text or
9
+ matched word.
10
+
11
+ ``POST /v1/privacy/disclosure-check`` on the same socket counts the PII disclosure backlog the node's own sweep is
12
+ working through (``topos.disclosure.disclosure_sweep``), and never writes.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import asyncio
18
+ from typing import Any, Optional
19
+
20
+ from fastapi import APIRouter, Body, Depends, HTTPException
21
+ from fastapi.responses import JSONResponse
22
+
23
+ from topos.auth import resolve_request_principal
24
+
25
+ router = APIRouter(prefix="/v1/privacy", tags=["privacy-owner-maintenance"])
26
+
27
+ _NO_STORE = {"Cache-Control": "no-store"}
28
+ _FIELDS = frozenset({"dry_run", "tables"})
29
+
30
+
31
+ def _invalid() -> HTTPException:
32
+ return HTTPException(400, "nsfw_recheck_payload_invalid", headers=_NO_STORE)
33
+
34
+
35
+ def _valid_tables(value: Any) -> bool:
36
+ from topos.disclosure.nsfw_tags import TABLES
37
+
38
+ return (type(value) is list and bool(value) and all(type(item) is str for item in value)
39
+ and len(set(value)) == len(value) and set(value) <= set(TABLES))
40
+
41
+
42
+ @router.post("/nsfw-recheck")
43
+ async def nsfw_recheck(payload: Optional[dict] = Body(None), principal=Depends(resolve_request_principal)):
44
+ from topos.principal import OWNER_APP
45
+
46
+ if principal is None or principal.cls != OWNER_APP or principal.channel != "uds":
47
+ raise HTTPException(403, "owner_socket_required", headers=_NO_STORE)
48
+ body = {} if payload is None else payload
49
+ if not isinstance(body, dict) or not set(body) <= _FIELDS:
50
+ raise _invalid()
51
+ dry_run = body.get("dry_run", True)
52
+ tables = body.get("tables")
53
+ if type(dry_run) is not bool or (tables is not None and not _valid_tables(tables)):
54
+ raise _invalid()
55
+
56
+ def apply():
57
+ from topos.core.state import get_db_connection
58
+ from topos.disclosure.nsfw_tags import run_sweep
59
+ from topos.runtime_shutdown import is_shutdown_requested
60
+
61
+ return run_sweep(get_db_connection, dry_run=dry_run, tables=tables, stop=is_shutdown_requested,
62
+ full=not dry_run)
63
+
64
+ try:
65
+ result = await asyncio.to_thread(apply)
66
+ except Exception: # noqa: BLE001 -- no path, row or exception text leaves the node
67
+ raise HTTPException(503, "nsfw_recheck_unavailable", headers=_NO_STORE) from None
68
+ return JSONResponse(result, headers=_NO_STORE)
69
+
70
+
71
+ _DISCLOSURE_FIELDS = frozenset({"tables", "mode"})
72
+
73
+
74
+ @router.post("/disclosure-check")
75
+ async def disclosure_check(payload: Optional[dict] = Body(None), principal=Depends(resolve_request_principal)):
76
+ """Counts of the PII disclosure backlog, on the owner socket only; never writes.
77
+
78
+ Body, all optional: ``{"tables": [<table>, ...], "mode": "verify"|"pending"}``. ``verify`` (the default) reads
79
+ every row of the disclosed tables and checks each field's hash against its text, as the node's own sweep does
80
+ (``topos.disclosure.disclosure_sweep``); ``pending`` counts only fields with no disclosure at all. The answer is
81
+ counts per table and in total (``missing`` and ``stale`` are what the sweep still has to redact); no id or text.
82
+ The sweep itself needs no command: it runs at startup and on its intervals.
83
+ """
84
+ from topos.principal import OWNER_APP
85
+
86
+ if principal is None or principal.cls != OWNER_APP or principal.channel != "uds":
87
+ raise HTTPException(403, "owner_socket_required", headers=_NO_STORE)
88
+ body = {} if payload is None else payload
89
+ if not isinstance(body, dict) or not set(body) <= _DISCLOSURE_FIELDS:
90
+ raise HTTPException(400, "disclosure_check_payload_invalid", headers=_NO_STORE)
91
+ from topos.disclosure.disclosure_sweep import MODES, run_sweep
92
+ from topos.disclosure.field_registry import PII_DISCLOSURE_FIELDS
93
+
94
+ tables = body.get("tables")
95
+ mode = body.get("mode", "verify")
96
+ if mode not in MODES or (tables is not None and not (
97
+ type(tables) is list and tables and all(type(t) is str for t in tables)
98
+ and len(set(tables)) == len(tables) and set(tables) <= set(PII_DISCLOSURE_FIELDS))):
99
+ raise HTTPException(400, "disclosure_check_payload_invalid", headers=_NO_STORE)
100
+ from topos.core.state import get_db_connection
101
+
102
+ try:
103
+ result = await run_sweep(get_db_connection, mode=mode, dry_run=True, tables=tables)
104
+ except Exception: # noqa: BLE001 -- no path, row or exception text leaves the node
105
+ raise HTTPException(503, "disclosure_check_unavailable", headers=_NO_STORE) from None
106
+ return JSONResponse(result, headers=_NO_STORE)
@@ -0,0 +1,106 @@
1
+ """Owner socket: attest that pre-stamp AI-chat rows came from the owner's own capture app (OD-39).
2
+
3
+ Rows the owner's capture app wrote before the node recorded writer classes carry
4
+ no writer, so nothing on the row can tell them from a grantee's. The owner says
5
+ so once, explicitly, and the node keeps the statement as an auditable receipt
6
+ (``topos/permissions_v2/ai_chat_capture.py``); the rows themselves are never
7
+ re-labelled. Two steps: ``preview`` returns counts and a digest of exactly the
8
+ rows it would cover (no ids, no content); ``attest`` records a receipt only for
9
+ that digest, with ``confirm: true``. ``revoke`` withdraws a receipt. Only the
10
+ owner's socket may call any of them: an owner key over TCP, a relay message and a
11
+ third party are refused.
12
+ """
13
+ import asyncio
14
+ import sqlite3
15
+
16
+ from fastapi import APIRouter, Depends, HTTPException
17
+ from fastapi.responses import JSONResponse
18
+
19
+ from topos.auth import resolve_request_principal
20
+ from topos.permissions_v2.canonical import PolicyError
21
+
22
+ router = APIRouter(prefix="/v1/permissions-beta/v2/ai-chat/capture-attestation",
23
+ tags=["permissions-owner-ai-chat-capture"])
24
+
25
+ _NO_STORE = {"Cache-Control": "no-store"}
26
+ _CONFLICT = {"capture_attestation_preview_stale", "capture_receipt_revoked"}
27
+ _INVALID = {"capture_attestation_invalid", "capture_attestation_unconfirmed", "capture_receipt_unknown",
28
+ # The generalised receipts' named dataset (permissions_capture_receipts.py): not one install's to name.
29
+ "capture_attestation_dataset_unknown", "capture_attestation_dataset_not_this_node",
30
+ "capture_attestation_dataset_posture_unknown"}
31
+
32
+
33
+ def _require_owner_socket(principal) -> None:
34
+ from topos.principal import OWNER_APP
35
+ if principal is None or principal.cls != OWNER_APP or principal.channel != "uds":
36
+ raise HTTPException(403, "owner_socket_required", headers=_NO_STORE)
37
+
38
+
39
+ def _run(operation, *, write: bool):
40
+ """(owner_id, conn) -> result, on the served canonical database under the write gate."""
41
+ from topos.permissions_v2.runtime import get_runtime
42
+ from topos.storage.db.write_gate import with_db_write
43
+
44
+ runtime = get_runtime()
45
+ owner_id = runtime.protocol.ledger.identity.owner_id
46
+ path = runtime.protocol.canonical_database
47
+ with with_db_write():
48
+ conn = sqlite3.connect(path.as_uri() + ("?mode=rw" if write else "?mode=ro"), uri=True, timeout=30)
49
+ try:
50
+ conn.execute("BEGIN IMMEDIATE" if write else "BEGIN")
51
+ result = operation(owner_id, conn)
52
+ conn.commit() if write else conn.rollback()
53
+ return result
54
+ except BaseException:
55
+ conn.rollback()
56
+ raise
57
+ finally:
58
+ conn.close()
59
+
60
+
61
+ async def _respond(operation, *, write: bool):
62
+ try:
63
+ result = await asyncio.to_thread(_run, operation, write=write)
64
+ except PolicyError as exc:
65
+ if exc.code in {"permissions_v2_disabled", "beta_configuration_required"}:
66
+ raise HTTPException(404, "permissions_v2_disabled", headers=_NO_STORE) from None
67
+ code = 409 if exc.code in _CONFLICT else 400 if exc.code in _INVALID else 403
68
+ raise HTTPException(code, exc.code, headers=_NO_STORE) from None
69
+ except HTTPException:
70
+ raise
71
+ except Exception:
72
+ raise HTTPException(503, "capture_attestation_unavailable", headers=_NO_STORE) from None
73
+ return JSONResponse(result, headers=_NO_STORE)
74
+
75
+
76
+ @router.post("/preview")
77
+ async def preview(payload: dict, principal=Depends(resolve_request_principal)):
78
+ from topos.permissions_v2 import ai_chat_capture
79
+ _require_owner_socket(principal)
80
+ return await _respond(lambda owner_id, conn: ai_chat_capture.preview(
81
+ conn, owner_id=owner_id, source_id=payload.get("source_id"), app_id=payload.get("app_id")), write=False)
82
+
83
+
84
+ @router.post("/attest")
85
+ async def attest(payload: dict, principal=Depends(resolve_request_principal)):
86
+ from topos.permissions_v2 import ai_chat_capture
87
+ _require_owner_socket(principal)
88
+ return await _respond(lambda owner_id, conn: ai_chat_capture.attest(
89
+ conn, owner_id=owner_id, source_id=payload.get("source_id"), app_id=payload.get("app_id"),
90
+ preview_digest=payload.get("preview_digest"), confirm=payload.get("confirm")), write=True)
91
+
92
+
93
+ @router.post("/revoke")
94
+ async def revoke(payload: dict, principal=Depends(resolve_request_principal)):
95
+ from topos.permissions_v2 import ai_chat_capture
96
+ _require_owner_socket(principal)
97
+ return await _respond(lambda owner_id, conn: ai_chat_capture.revoke(
98
+ conn, owner_id=owner_id, receipt_id=payload.get("receipt_id")), write=True)
99
+
100
+
101
+ @router.get("/receipts")
102
+ async def receipts(principal=Depends(resolve_request_principal)):
103
+ from topos.permissions_v2 import ai_chat_capture
104
+ _require_owner_socket(principal)
105
+ return await _respond(lambda owner_id, conn: {"receipts": ai_chat_capture.receipts(conn, owner_id=owner_id)},
106
+ write=False)
@@ -0,0 +1,74 @@
1
+ """Owner socket: attest that rows of a canonical table other than AI chat are the owner's own (OD-50, OD-52).
2
+
3
+ The journal table's rows carry no owner and, before September 2026, no writer, so
4
+ nothing on a row can tell the owner's entry from one another writer sent to the
5
+ same source. The owner says so once, explicitly, and the node keeps the
6
+ statement as an auditable receipt (``topos/permissions_v2/capture_receipts.py``);
7
+ the rows themselves are never re-labelled. The flow is OD-39's
8
+ (``permissions_ai_chat_capture.py``) with the table named: ``preview`` returns
9
+ counts and a digest of exactly the rows it would cover (no ids, no content);
10
+ ``attest`` records a receipt only for that digest, with ``confirm: true``;
11
+ ``revoke`` withdraws one. Only the owner's socket may call any of them.
12
+
13
+ For the AI-chat export import (``table: ai_chat_messages``) both ``preview`` and
14
+ ``attest`` take an optional ``dataset_id``: the dataset of the one install of the
15
+ source the owner names as the one the import came through (a source with two live
16
+ installs certifies none by elimination). ``preview`` lists the source's candidate
17
+ installs (id, date, dataset, declared posture, whether it may be named, rows a
18
+ receipt naming it would cover); a dataset that is not one install's this owner may
19
+ name is refused (``capture_attestation_dataset_unknown``), and so is one whose
20
+ install is scoped to another node's topos than this node's own
21
+ (``capture_attestation_dataset_not_this_node``) or declares no posture
22
+ (``capture_attestation_dataset_posture_unknown``). Nothing here writes an install
23
+ row.
24
+ """
25
+ from fastapi import APIRouter, Depends
26
+
27
+ from topos.auth import resolve_request_principal
28
+
29
+ from .permissions_ai_chat_capture import _require_owner_socket, _respond
30
+
31
+ router = APIRouter(prefix="/v1/permissions-beta/v2/capture-attestation", tags=["permissions-owner-capture"])
32
+
33
+
34
+ def _node_resource_id():
35
+ """This node's own topos (its ledger identity's resource id): the only one a named install may be scoped to."""
36
+ from topos.permissions_v2.runtime import get_runtime
37
+ return getattr(get_runtime().protocol.ledger.identity, "resource_id", None)
38
+
39
+
40
+ @router.post("/preview")
41
+ async def preview(payload: dict, principal=Depends(resolve_request_principal)):
42
+ from topos.permissions_v2 import capture_receipts
43
+ _require_owner_socket(principal)
44
+ return await _respond(lambda owner_id, conn: capture_receipts.preview(
45
+ conn, owner_id=owner_id, table=payload.get("table"), source_id=payload.get("source_id"),
46
+ app_id=payload.get("app_id"), dataset_id=payload.get("dataset_id"), resource_id=_node_resource_id()),
47
+ write=False)
48
+
49
+
50
+ @router.post("/attest")
51
+ async def attest(payload: dict, principal=Depends(resolve_request_principal)):
52
+ from topos.permissions_v2 import capture_receipts
53
+ _require_owner_socket(principal)
54
+ return await _respond(lambda owner_id, conn: capture_receipts.attest(
55
+ conn, owner_id=owner_id, table=payload.get("table"), source_id=payload.get("source_id"),
56
+ app_id=payload.get("app_id"), preview_digest=payload.get("preview_digest"),
57
+ confirm=payload.get("confirm"), dataset_id=payload.get("dataset_id"), resource_id=_node_resource_id()),
58
+ write=True)
59
+
60
+
61
+ @router.post("/revoke")
62
+ async def revoke(payload: dict, principal=Depends(resolve_request_principal)):
63
+ from topos.permissions_v2 import capture_receipts
64
+ _require_owner_socket(principal)
65
+ return await _respond(lambda owner_id, conn: capture_receipts.revoke(
66
+ conn, owner_id=owner_id, receipt_id=payload.get("receipt_id")), write=True)
67
+
68
+
69
+ @router.get("/receipts")
70
+ async def receipts(principal=Depends(resolve_request_principal)):
71
+ from topos.permissions_v2 import capture_receipts
72
+ _require_owner_socket(principal)
73
+ return await _respond(lambda owner_id, conn: {"receipts": capture_receipts.receipts(conn, owner_id=owner_id)},
74
+ write=False)