topos-node 1.3.38__tar.gz → 1.3.39__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 (762) hide show
  1. {topos_node-1.3.38/topos_node.egg-info → topos_node-1.3.39}/PKG-INFO +3 -3
  2. {topos_node-1.3.38 → topos_node-1.3.39}/README.md +2 -2
  3. {topos_node-1.3.38 → topos_node-1.3.39}/pyproject.toml +3 -3
  4. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_active_database_binding.py +2 -1
  5. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_profile_hygiene.py +2 -1
  6. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_profiles.py +4 -3
  7. {topos_node-1.3.38 → topos_node-1.3.39}/topos/__version__.py +2 -2
  8. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/commands.py +3 -2
  9. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/profile_cmd.py +2 -1
  10. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/ingest.py +3 -0
  11. topos_node-1.3.39/topos/defaults.py +9 -0
  12. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/entities_job.py +3 -1
  13. topos_node-1.3.39/topos/features/entities/chatgpt_declared.py +256 -0
  14. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/declared_mappings.py +48 -3
  15. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/ingest_helpers.py +10 -2
  16. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/manager.py +8 -1
  17. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parser.py +43 -15
  18. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +10 -2
  19. topos_node-1.3.39/topos/ingestion/parsers/chatgpt_export.py +652 -0
  20. topos_node-1.3.39/topos/ingestion/triggers/file_trigger.py +56 -0
  21. {topos_node-1.3.38 → topos_node-1.3.39}/topos/mcp_stdio_proxy.py +7 -5
  22. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/job_runner.py +5 -0
  23. {topos_node-1.3.38 → topos_node-1.3.39}/topos/profiles.py +4 -3
  24. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/ai_chat/canonicalizer.py +20 -1
  25. {topos_node-1.3.38 → topos_node-1.3.39}/topos/upgrades/manifests.json +10 -0
  26. {topos_node-1.3.38 → topos_node-1.3.39/topos_node.egg-info}/PKG-INFO +3 -3
  27. {topos_node-1.3.38 → topos_node-1.3.39}/topos_node.egg-info/SOURCES.txt +3 -0
  28. topos_node-1.3.38/topos/ingestion/triggers/file_trigger.py +0 -36
  29. {topos_node-1.3.38 → topos_node-1.3.39}/LICENSE +0 -0
  30. {topos_node-1.3.38 → topos_node-1.3.39}/MANIFEST.in +0 -0
  31. {topos_node-1.3.38 → topos_node-1.3.39}/setup.cfg +0 -0
  32. {topos_node-1.3.38 → topos_node-1.3.39}/shared/__init__.py +0 -0
  33. {topos_node-1.3.38 → topos_node-1.3.39}/shared/filtering.py +0 -0
  34. {topos_node-1.3.38 → topos_node-1.3.39}/shared/schema_registry.py +0 -0
  35. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_active_ingestion_binding.py +0 -0
  36. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_extensions.py +0 -0
  37. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_gate_leg_hermeticity.py +0 -0
  38. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_llm_integrations_storage.py +0 -0
  39. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_local_gate_composition.py +0 -0
  40. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_owner_database_hermeticity.py +0 -0
  41. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_prewarm_first_run.py +0 -0
  42. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_protocol_handled_types.py +0 -0
  43. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_query_field_contract.py +0 -0
  44. {topos_node-1.3.38 → topos_node-1.3.39}/tests/test_system_computer_name.py +0 -0
  45. {topos_node-1.3.38 → topos_node-1.3.39}/topos/__init__.py +0 -0
  46. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/__init__.py +0 -0
  47. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/dataset_resolution.py +0 -0
  48. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/duckdb_adapter.py +0 -0
  49. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/luck_surface.py +0 -0
  50. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/messenger_communities.py +0 -0
  51. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/messenger_directed.py +0 -0
  52. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/messenger_graph.py +0 -0
  53. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/messenger_labels.py +0 -0
  54. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/person_graph.py +0 -0
  55. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/person_overlay.py +0 -0
  56. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/profiles.py +0 -0
  57. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/query_engine.py +0 -0
  58. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/raw_queries.py +0 -0
  59. {topos_node-1.3.38 → topos_node-1.3.39}/topos/analytics/relationship_reads.py +0 -0
  60. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/__init__.py +0 -0
  61. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/analytics.py +0 -0
  62. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/app_registry.py +0 -0
  63. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/backup.py +0 -0
  64. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/community_naming_config.py +0 -0
  65. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/compute_remote.py +0 -0
  66. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/connected_apps.py +0 -0
  67. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/conversation_context.py +0 -0
  68. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/data_commit.py +0 -0
  69. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/data_explorer_table_prefs.py +0 -0
  70. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/database_explorer.py +0 -0
  71. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/db.py +0 -0
  72. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/device.py +0 -0
  73. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/disk_space_config.py +0 -0
  74. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/engine_run.py +0 -0
  75. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/enrichment.py +0 -0
  76. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/enrichment_lab.py +0 -0
  77. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/facts_llm_config.py +0 -0
  78. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/filter_lab.py +0 -0
  79. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/health.py +0 -0
  80. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/home_chat.py +0 -0
  81. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/ingestion_api.py +0 -0
  82. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/ingestion_compat.py +0 -0
  83. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/ingestion_sources.py +0 -0
  84. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/intelligence_lifecycle.py +0 -0
  85. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/llm.py +0 -0
  86. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/local_mcp.py +0 -0
  87. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/messenger_analytics.py +0 -0
  88. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/privacy_disclose.py +0 -0
  89. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/query_api.py +0 -0
  90. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/runtime_bootstrap.py +0 -0
  91. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/sanitization_ollama_config.py +0 -0
  92. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/shell.py +0 -0
  93. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/signal.py +0 -0
  94. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/signal_extraction_config.py +0 -0
  95. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/source_install.py +0 -0
  96. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/source_scrub.py +0 -0
  97. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/sources.py +0 -0
  98. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/sources_overview.py +0 -0
  99. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/sync.py +0 -0
  100. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/tool_index.py +0 -0
  101. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/ui_config.py +0 -0
  102. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/uma_data.py +0 -0
  103. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/upgrades.py +0 -0
  104. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/usage.py +0 -0
  105. {topos_node-1.3.38 → topos_node-1.3.39}/topos/api/user_identity.py +0 -0
  106. {topos_node-1.3.38 → topos_node-1.3.39}/topos/app.py +0 -0
  107. {topos_node-1.3.38 → topos_node-1.3.39}/topos/auth.py +0 -0
  108. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/__init__.py +0 -0
  109. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/declared_field_map.py +0 -0
  110. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/__init__.py +0 -0
  111. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/base.py +0 -0
  112. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
  113. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
  114. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/demo_mappers.py +0 -0
  115. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/documents_mapper.py +0 -0
  116. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
  117. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
  118. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/grok_mapper.py +0 -0
  119. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
  120. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/models.py +0 -0
  121. {topos_node-1.3.38 → topos_node-1.3.39}/topos/canonicalization/resolver.py +0 -0
  122. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/__init__.py +0 -0
  123. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/__main__.py +0 -0
  124. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/assets/topos_blk_rounded.png +0 -0
  125. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/assets/topos_white.png +0 -0
  126. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/reprocess_cmd.py +0 -0
  127. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/setup_models_cmd.py +0 -0
  128. {topos_node-1.3.38 → topos_node-1.3.39}/topos/cli/tray.py +0 -0
  129. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/__init__.py +0 -0
  130. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/conversation_context_llm.py +0 -0
  131. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/facts_llm.py +0 -0
  132. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/local_model_builds.py +0 -0
  133. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/model_packs.py +0 -0
  134. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/node_function_providers.py +0 -0
  135. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/sanitization_ollama.py +0 -0
  136. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/settings.py +0 -0
  137. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/signal_extraction.py +0 -0
  138. {topos_node-1.3.38 → topos_node-1.3.39}/topos/config/uvicorn_logging.json +0 -0
  139. {topos_node-1.3.38 → topos_node-1.3.39}/topos/contacts/__init__.py +0 -0
  140. {topos_node-1.3.38 → topos_node-1.3.39}/topos/contacts/identity.py +0 -0
  141. {topos_node-1.3.38 → topos_node-1.3.39}/topos/control_plane_client.py +0 -0
  142. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/__init__.py +0 -0
  143. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/api_models.py +0 -0
  144. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/connection_resilience.py +0 -0
  145. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/db_health.py +0 -0
  146. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/device_helpers.py +0 -0
  147. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/errors.py +0 -0
  148. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/events.py +0 -0
  149. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/__init__.py +0 -0
  150. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/common.py +0 -0
  151. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/complexity.py +0 -0
  152. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/config.py +0 -0
  153. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/contacts_import.py +0 -0
  154. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/database_explorer.py +0 -0
  155. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/derivation.py +0 -0
  156. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/device.py +0 -0
  157. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/enrichment.py +0 -0
  158. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/enrichment_lab.py +0 -0
  159. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/filter_lab.py +0 -0
  160. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/graph_query.py +0 -0
  161. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/home_chat.py +0 -0
  162. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/mcp_client_elevations.py +0 -0
  163. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/mcp_clients.py +0 -0
  164. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/messages.py +0 -0
  165. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/messenger_analytics.py +0 -0
  166. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/query.py +0 -0
  167. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/registry.py +0 -0
  168. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/routines.py +0 -0
  169. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/signal_features.py +0 -0
  170. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/sources.py +0 -0
  171. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/timeline_daily.py +0 -0
  172. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/tool_index.py +0 -0
  173. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/handlers/uma.py +0 -0
  174. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/logging.py +0 -0
  175. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/metrics.py +0 -0
  176. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/routine_access.py +0 -0
  177. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/startup_banner.py +0 -0
  178. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/state.py +0 -0
  179. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/table_layers.py +0 -0
  180. {topos_node-1.3.38 → topos_node-1.3.39}/topos/core/types.py +0 -0
  181. {topos_node-1.3.38 → topos_node-1.3.39}/topos/data_explorer_row_delete.py +0 -0
  182. {topos_node-1.3.38 → topos_node-1.3.39}/topos/data_explorer_table_prefs.py +0 -0
  183. {topos_node-1.3.38 → topos_node-1.3.39}/topos/data_explorer_tables.py +0 -0
  184. {topos_node-1.3.38 → topos_node-1.3.39}/topos/disclosure/__init__.py +0 -0
  185. {topos_node-1.3.38 → topos_node-1.3.39}/topos/disclosure/canonical_writer.py +0 -0
  186. {topos_node-1.3.38 → topos_node-1.3.39}/topos/disclosure/content_policy.py +0 -0
  187. {topos_node-1.3.38 → topos_node-1.3.39}/topos/disclosure/field_registry.py +0 -0
  188. {topos_node-1.3.38 → topos_node-1.3.39}/topos/disclosure/privacy_layer.py +0 -0
  189. {topos_node-1.3.38 → topos_node-1.3.39}/topos/disclosure/tier.py +0 -0
  190. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/__init__.py +0 -0
  191. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/__init__.py +0 -0
  192. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/base.py +0 -0
  193. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/generative_prompts.py +0 -0
  194. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/generative_response.py +0 -0
  195. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/huggingface.py +0 -0
  196. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/ollama.py +0 -0
  197. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/openai.py +0 -0
  198. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/openai_compatible.py +0 -0
  199. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/redpill.py +0 -0
  200. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/backends/stub.py +0 -0
  201. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/client.py +0 -0
  202. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/disk_space.py +0 -0
  203. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/engine.py +0 -0
  204. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/hosted_llm_wallet.py +0 -0
  205. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/intake.py +0 -0
  206. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/memory_utils.py +0 -0
  207. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/model_cache.py +0 -0
  208. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/model_manager.py +0 -0
  209. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/ollama_install.py +0 -0
  210. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/ollama_pull.py +0 -0
  211. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/ollama_runtime.py +0 -0
  212. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/ollama_setup_guidance.py +0 -0
  213. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/pipeline_memory.py +0 -0
  214. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/queue_manager.py +0 -0
  215. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/registration.py +0 -0
  216. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/result_formatter.py +0 -0
  217. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/router.py +0 -0
  218. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/scoped_token.py +0 -0
  219. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/tasks.py +0 -0
  220. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/torch_runtime.py +0 -0
  221. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/transport.py +0 -0
  222. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/usage_guard.py +0 -0
  223. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/usage_observation.py +0 -0
  224. {topos_node-1.3.38 → topos_node-1.3.39}/topos/engine/validator.py +0 -0
  225. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/__init__.py +0 -0
  226. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/catalog.py +0 -0
  227. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/derivation_recovery.py +0 -0
  228. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/derived_tables.py +0 -0
  229. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/job_readiness.py +0 -0
  230. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/job_writer.py +0 -0
  231. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/__init__.py +0 -0
  232. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/base.py +0 -0
  233. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/__init__.py +0 -0
  234. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
  235. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
  236. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
  237. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
  238. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
  239. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
  240. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
  241. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
  242. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
  243. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
  244. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
  245. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
  246. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
  247. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
  248. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
  249. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
  250. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
  251. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
  252. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
  253. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
  254. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/raw/__init__.py +0 -0
  255. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
  256. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/raw/language_job.py +0 -0
  257. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
  258. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
  259. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/model_overrides.py +0 -0
  260. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/models/__init__.py +0 -0
  261. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/models/manager.py +0 -0
  262. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/models/mvp_defaults.py +0 -0
  263. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/models/registry.py +0 -0
  264. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/models/versioning.py +0 -0
  265. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/orchestrator.py +0 -0
  266. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/pipeline_activity.py +0 -0
  267. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/processor.py +0 -0
  268. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/progress_bar.py +0 -0
  269. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/record_progress.py +0 -0
  270. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/registry_contract.py +0 -0
  271. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/signal_derivation_config.json +0 -0
  272. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment/source_overrides.py +0 -0
  273. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/__init__.py +0 -0
  274. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/bundles.py +0 -0
  275. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/model_resolve.py +0 -0
  276. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/schema.py +0 -0
  277. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/service.py +0 -0
  278. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/store.py +0 -0
  279. {topos_node-1.3.38 → topos_node-1.3.39}/topos/enrichment_lab/worker.py +0 -0
  280. {topos_node-1.3.38 → topos_node-1.3.39}/topos/evals/__init__.py +0 -0
  281. {topos_node-1.3.38 → topos_node-1.3.39}/topos/evals/enrichment_eval.py +0 -0
  282. {topos_node-1.3.38 → topos_node-1.3.39}/topos/extensions.py +0 -0
  283. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/__init__.py +0 -0
  284. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/canonical.py +0 -0
  285. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/engine.py +0 -0
  286. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/entropy.py +0 -0
  287. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/focus.py +0 -0
  288. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/graph_metrics.py +0 -0
  289. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/influence.py +0 -0
  290. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/projection.py +0 -0
  291. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/snapshots.py +0 -0
  292. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/store.py +0 -0
  293. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/topic_merge.py +0 -0
  294. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/topics.py +0 -0
  295. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/topics_daily.py +0 -0
  296. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/complexity/volatility.py +0 -0
  297. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/__init__.py +0 -0
  298. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
  299. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
  300. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
  301. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
  302. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
  303. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
  304. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
  305. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
  306. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
  307. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
  308. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
  309. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
  310. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
  311. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
  312. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
  313. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
  314. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
  315. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
  316. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
  317. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
  318. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
  319. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
  320. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
  321. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
  322. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
  323. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
  324. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
  325. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
  326. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
  327. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
  328. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
  329. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
  330. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
  331. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
  332. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
  333. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
  334. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/candidates.py +0 -0
  335. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/guard.py +0 -0
  336. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/kernels.py +0 -0
  337. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/net_subject_policy.py +0 -0
  338. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/packs.py +0 -0
  339. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/person_bridge.py +0 -0
  340. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/prefilter.py +0 -0
  341. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/registry.py +0 -0
  342. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/report_card.py +0 -0
  343. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/router.py +0 -0
  344. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/social_bench.py +0 -0
  345. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/social_kernels.py +0 -0
  346. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/surfaces.py +0 -0
  347. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/synthesize.py +0 -0
  348. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/template.py +0 -0
  349. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/verify.py +0 -0
  350. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/derivation/writer.py +0 -0
  351. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/__init__.py +0 -0
  352. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/affinity.py +0 -0
  353. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/affinity_owner.py +0 -0
  354. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/affinity_quality.py +0 -0
  355. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/community_names.py +0 -0
  356. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/community_naming.py +0 -0
  357. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/consolidation.py +0 -0
  358. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/context_vectors.py +0 -0
  359. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/cypher.py +0 -0
  360. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/dossier.py +0 -0
  361. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/edges.py +0 -0
  362. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/fact_materializer.py +0 -0
  363. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/graph_enrichers.py +0 -0
  364. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/graph_refresh.py +0 -0
  365. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/graph_search.py +0 -0
  366. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/linking.py +0 -0
  367. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/maintenance.py +0 -0
  368. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/owner.py +0 -0
  369. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/reads.py +0 -0
  370. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/rebuild_subprocess.py +0 -0
  371. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/resolver.py +0 -0
  372. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/entities/structured_fields.py +0 -0
  373. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/facts/__init__.py +0 -0
  374. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/facts/extract.py +0 -0
  375. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/facts/llm_extract.py +0 -0
  376. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/facts/reads.py +0 -0
  377. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/facts/store.py +0 -0
  378. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/facts/verdicts.py +0 -0
  379. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/fit/evaluator.py +0 -0
  380. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/fit/opportunity_types.json +0 -0
  381. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/__init__.py +0 -0
  382. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/blackhole.py +0 -0
  383. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/blackhole_guard.py +0 -0
  384. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/blackhole_llm.py +0 -0
  385. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
  386. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/derived_scrub.py +0 -0
  387. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/exclusions.py +0 -0
  388. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/lifecycle/gc.py +0 -0
  389. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/provenance/__init__.py +0 -0
  390. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/provenance/posture.py +0 -0
  391. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/provenance/roles.py +0 -0
  392. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/__init__.py +0 -0
  393. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/brief_canonical_loader.py +0 -0
  394. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/brief_ontology.py +0 -0
  395. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/brief_renderer.py +0 -0
  396. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/brief_schemas.py +0 -0
  397. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/chunking.py +0 -0
  398. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/cluster_labels.py +0 -0
  399. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/conversation_context.py +0 -0
  400. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/data_health.py +0 -0
  401. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/brief_ontologies.json +0 -0
  402. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/intentions.json +0 -0
  403. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/interests.json +0 -0
  404. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/memory.json +0 -0
  405. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/places.json +0 -0
  406. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/profile.json +0 -0
  407. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/relationships.json +0 -0
  408. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/resources.json +0 -0
  409. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
  410. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/time.json +0 -0
  411. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/wellbeing.json +0 -0
  412. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/definitions/work.json +0 -0
  413. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/derived_index.py +0 -0
  414. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/derived_spec.py +0 -0
  415. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/dimension_briefs.py +0 -0
  416. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/dimension_definition_loader.py +0 -0
  417. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/dimension_profiles.py +0 -0
  418. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/dimension_registry.py +0 -0
  419. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/embed_context.py +0 -0
  420. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/extraction/artifact_router.py +0 -0
  421. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/extraction/artifact_store.py +0 -0
  422. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/extraction/rule_extractors.py +0 -0
  423. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/graph_sanitize.py +0 -0
  424. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/hybrid_search.py +0 -0
  425. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/incremental_clustering.py +0 -0
  426. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/model_recommendations.py +0 -0
  427. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/query_embed_cache.py +0 -0
  428. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/schemas.py +0 -0
  429. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/service.py +0 -0
  430. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/signal_object_store.py +0 -0
  431. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/source_hydration.py +0 -0
  432. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/structured_signal.py +0 -0
  433. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/tool_index.py +0 -0
  434. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/topic_clustering.py +0 -0
  435. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/typed_stores/aggregates.py +0 -0
  436. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/typed_stores/commitments.py +0 -0
  437. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/typed_stores/rhythm.py +0 -0
  438. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
  439. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/vector_codec.py +0 -0
  440. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/vector_math.py +0 -0
  441. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/signal/vector_settings.py +0 -0
  442. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/stats/__init__.py +0 -0
  443. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/stats/definitions.py +0 -0
  444. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/stats/engine.py +0 -0
  445. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/stats/fold.py +0 -0
  446. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/stats/insights.py +0 -0
  447. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/timeline_projection.py +0 -0
  448. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/timeline_rollup.py +0 -0
  449. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/__init__.py +0 -0
  450. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/badges.py +0 -0
  451. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/daily.py +0 -0
  452. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/dashboard.py +0 -0
  453. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/instruments.py +0 -0
  454. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/intents.py +0 -0
  455. {topos_node-1.3.38 → topos_node-1.3.39}/topos/features/triage/readiness.py +0 -0
  456. {topos_node-1.3.38 → topos_node-1.3.39}/topos/filter_lab/__init__.py +0 -0
  457. {topos_node-1.3.38 → topos_node-1.3.39}/topos/filter_lab/bundles.py +0 -0
  458. {topos_node-1.3.38 → topos_node-1.3.39}/topos/filter_lab/schema.py +0 -0
  459. {topos_node-1.3.38 → topos_node-1.3.39}/topos/filter_lab/service.py +0 -0
  460. {topos_node-1.3.38 → topos_node-1.3.39}/topos/filter_lab/store.py +0 -0
  461. {topos_node-1.3.38 → topos_node-1.3.39}/topos/filter_lab/worker.py +0 -0
  462. {topos_node-1.3.38 → topos_node-1.3.39}/topos/home_chat/__init__.py +0 -0
  463. {topos_node-1.3.38 → topos_node-1.3.39}/topos/home_chat/schema.py +0 -0
  464. {topos_node-1.3.38 → topos_node-1.3.39}/topos/home_chat/store.py +0 -0
  465. {topos_node-1.3.38 → topos_node-1.3.39}/topos/hosted_pool_lease.py +0 -0
  466. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/__init__.py +0 -0
  467. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/canonical_pipeline.py +0 -0
  468. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/checkpoints/__init__.py +0 -0
  469. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
  470. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
  471. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/inbox_crypto.py +0 -0
  472. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/inbox_drain.py +0 -0
  473. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/jobs.py +0 -0
  474. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/journal_location_fanout.py +0 -0
  475. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/journal_time_log_normalize.py +0 -0
  476. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/local_sync.py +0 -0
  477. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/log_preview.py +0 -0
  478. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/__init__.py +0 -0
  479. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/base.py +0 -0
  480. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/browser_parser.py +0 -0
  481. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/calendar_parser.py +0 -0
  482. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
  483. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
  484. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/documents_parser.py +0 -0
  485. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/github_activity_parser.py +0 -0
  486. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
  487. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/grok_parser.py +0 -0
  488. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/messenger_parser.py +0 -0
  489. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/parsers/voxterm_parser.py +0 -0
  490. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/progress.py +0 -0
  491. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/reprocess.py +0 -0
  492. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/__init__.py +0 -0
  493. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/base.py +0 -0
  494. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/calendar.py +0 -0
  495. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/chatgpt.py +0 -0
  496. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/contact_importers.py +0 -0
  497. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/grok.py +0 -0
  498. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/imessage_reader.py +0 -0
  499. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/signal_export_parser.py +0 -0
  500. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/sources/signal_reader.py +0 -0
  501. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/state_machine.py +0 -0
  502. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/triggers/__init__.py +0 -0
  503. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
  504. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/usage_inbox_dedupe.py +0 -0
  505. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/validation/__init__.py +0 -0
  506. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/validation/base.py +0 -0
  507. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/validation/schema_registry.py +0 -0
  508. {topos_node-1.3.38 → topos_node-1.3.39}/topos/ingestion/validation/schema_validator.py +0 -0
  509. {topos_node-1.3.38 → topos_node-1.3.39}/topos/lineage/__init__.py +0 -0
  510. {topos_node-1.3.38 → topos_node-1.3.39}/topos/lineage/provenance.py +0 -0
  511. {topos_node-1.3.38 → topos_node-1.3.39}/topos/lineage/tracker.py +0 -0
  512. {topos_node-1.3.38 → topos_node-1.3.39}/topos/llm_integrations_storage.py +0 -0
  513. {topos_node-1.3.38 → topos_node-1.3.39}/topos/mcp_clients.py +0 -0
  514. {topos_node-1.3.38 → topos_node-1.3.39}/topos/observability/__init__.py +0 -0
  515. {topos_node-1.3.38 → topos_node-1.3.39}/topos/observability/alerts.py +0 -0
  516. {topos_node-1.3.38 → topos_node-1.3.39}/topos/observability/metrics.py +0 -0
  517. {topos_node-1.3.38 → topos_node-1.3.39}/topos/observability/tracing.py +0 -0
  518. {topos_node-1.3.38 → topos_node-1.3.39}/topos/openai_client.py +0 -0
  519. {topos_node-1.3.38 → topos_node-1.3.39}/topos/owner_key.py +0 -0
  520. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/__init__.py +0 -0
  521. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/audit.py +0 -0
  522. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/envelope.py +0 -0
  523. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/job_store.py +0 -0
  524. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/stages.py +0 -0
  525. {topos_node-1.3.38 → topos_node-1.3.39}/topos/pipeline/stub_enqueue.py +0 -0
  526. {topos_node-1.3.38 → topos_node-1.3.39}/topos/principal.py +0 -0
  527. {topos_node-1.3.38 → topos_node-1.3.39}/topos/projections/__init__.py +0 -0
  528. {topos_node-1.3.38 → topos_node-1.3.39}/topos/projections/vector_index/__init__.py +0 -0
  529. {topos_node-1.3.38 → topos_node-1.3.39}/topos/projections/vector_index/base.py +0 -0
  530. {topos_node-1.3.38 → topos_node-1.3.39}/topos/projections/vector_index/builders.py +0 -0
  531. {topos_node-1.3.38 → topos_node-1.3.39}/topos/projections/vector_index/health_checks.py +0 -0
  532. {topos_node-1.3.38 → topos_node-1.3.39}/topos/protocol/__init__.py +0 -0
  533. {topos_node-1.3.38 → topos_node-1.3.39}/topos/protocol/handled_message_types.json +0 -0
  534. {topos_node-1.3.38 → topos_node-1.3.39}/topos/protocol/narrowing_vocabulary.json +0 -0
  535. {topos_node-1.3.38 → topos_node-1.3.39}/topos/protocol/query_field_contract.json +0 -0
  536. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/__init__.py +0 -0
  537. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/audit.py +0 -0
  538. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/closeness.py +0 -0
  539. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/cohort_resolvers.py +0 -0
  540. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/collaborators.py +0 -0
  541. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/ddr.py +0 -0
  542. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/disclosure.py +0 -0
  543. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/entity_window.py +0 -0
  544. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/exclusion.py +0 -0
  545. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/facts_direct.py +0 -0
  546. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/fingerprint.py +0 -0
  547. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/game_layer.py +0 -0
  548. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/grant_cache.py +0 -0
  549. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/inference.py +0 -0
  550. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/intent.py +0 -0
  551. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/manifest.py +0 -0
  552. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/manifest_validation.py +0 -0
  553. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/minimizer.py +0 -0
  554. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/narrowing.py +0 -0
  555. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/negotiation.py +0 -0
  556. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/packet_resolution.py +0 -0
  557. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/pipeline.py +0 -0
  558. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/planner.py +0 -0
  559. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/retrieval.py +0 -0
  560. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/runtime.py +0 -0
  561. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/scope_arbiter.py +0 -0
  562. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/scope_classifier.py +0 -0
  563. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/scope_head.py +0 -0
  564. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/scope_registry.json +0 -0
  565. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/scope_registry_loader.py +0 -0
  566. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/scope_shadow.py +0 -0
  567. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/session.py +0 -0
  568. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/session_utils.py +0 -0
  569. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/source_generation.py +0 -0
  570. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/truth_facts.py +0 -0
  571. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/truth_prompts.py +0 -0
  572. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/turn_classifier.py +0 -0
  573. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/types.py +0 -0
  574. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/verify.py +0 -0
  575. {topos_node-1.3.38 → topos_node-1.3.39}/topos/query/verify_modes.py +0 -0
  576. {topos_node-1.3.38 → topos_node-1.3.39}/topos/rate_limit.py +0 -0
  577. {topos_node-1.3.38 → topos_node-1.3.39}/topos/relay_stamp.py +0 -0
  578. {topos_node-1.3.38 → topos_node-1.3.39}/topos/routines/__init__.py +0 -0
  579. {topos_node-1.3.38 → topos_node-1.3.39}/topos/routines/schema.py +0 -0
  580. {topos_node-1.3.38 → topos_node-1.3.39}/topos/routines/store.py +0 -0
  581. {topos_node-1.3.38 → topos_node-1.3.39}/topos/runtime_housekeeping.py +0 -0
  582. {topos_node-1.3.38 → topos_node-1.3.39}/topos/runtime_shutdown.py +0 -0
  583. {topos_node-1.3.38 → topos_node-1.3.39}/topos/runtime_update.py +0 -0
  584. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sanitization/__init__.py +0 -0
  585. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sanitization/nsfw_classifier.py +0 -0
  586. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sanitization/ollama_transforms.py +0 -0
  587. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sanitization/prewarm.py +0 -0
  588. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sanitization/privacy_filter.py +0 -0
  589. {topos_node-1.3.38 → topos_node-1.3.39}/topos/scope_resolution.py +0 -0
  590. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/__init__.py +0 -0
  591. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/container.py +0 -0
  592. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/embeddings/__init__.py +0 -0
  593. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/embeddings/base.py +0 -0
  594. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/embeddings/local.py +0 -0
  595. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/embeddings/remote.py +0 -0
  596. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/interfaces.py +0 -0
  597. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/llm/__init__.py +0 -0
  598. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/llm/base.py +0 -0
  599. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/llm/openai.py +0 -0
  600. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/local.py +0 -0
  601. {topos_node-1.3.38 → topos_node-1.3.39}/topos/services/postgres.py +0 -0
  602. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/__init__.py +0 -0
  603. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/bundled_canonical_triples.py +0 -0
  604. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/canonical_signal_defaults.py +0 -0
  605. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/declared_field_map_spec.py +0 -0
  606. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/definitions.py +0 -0
  607. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/install_service.py +0 -0
  608. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/registry.py +0 -0
  609. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/runtime_install.py +0 -0
  610. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/scrub_attribution.py +0 -0
  611. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sources/scrub_service.py +0 -0
  612. {topos_node-1.3.38 → topos_node-1.3.39}/topos/startup_banner.py +0 -0
  613. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/__init__.py +0 -0
  614. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/__init__.py +0 -0
  615. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/factory.py +0 -0
  616. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/fakes.py +0 -0
  617. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/postgres/stores.py +0 -0
  618. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/protocols.py +0 -0
  619. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/sqlite/__init__.py +0 -0
  620. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/sqlite/stores.py +0 -0
  621. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/adapters/sqlite/vector_search.py +0 -0
  622. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/__init__.py +0 -0
  623. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/activity_tables.py +0 -0
  624. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/ai_chat/__init__.py +0 -0
  625. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/ai_chat/mapper.py +0 -0
  626. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/ai_chat/model.py +0 -0
  627. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/ai_chat/tables.py +0 -0
  628. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
  629. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/canonical_store.py +0 -0
  630. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/conversations_tables.py +0 -0
  631. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/journal_repair.py +0 -0
  632. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/mapping_store.py +0 -0
  633. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/canonical/postgres.py +0 -0
  634. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/__init__.py +0 -0
  635. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/client.py +0 -0
  636. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/connection_tuning.py +0 -0
  637. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/__init__.py +0 -0
  638. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
  639. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/actor_role_v1.py +0 -0
  640. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
  641. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
  642. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
  643. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/backup.py +0 -0
  644. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/backup_custody.py +0 -0
  645. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
  646. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
  647. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
  648. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
  649. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/community_names_v1.py +0 -0
  650. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/complexity_v1.py +0 -0
  651. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
  652. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
  653. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
  654. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
  655. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
  656. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
  657. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/documents_v1.py +0 -0
  658. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
  659. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
  660. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
  661. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
  662. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
  663. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
  664. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
  665. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
  666. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
  667. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
  668. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
  669. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/episodes_v1.py +0 -0
  670. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
  671. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
  672. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
  673. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
  674. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
  675. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
  676. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
  677. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
  678. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
  679. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
  680. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
  681. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
  682. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
  683. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
  684. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
  685. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/registry.py +0 -0
  686. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/registry_checksums.json +0 -0
  687. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/remediation_person_model.py +0 -0
  688. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
  689. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/scope_source_generation.py +0 -0
  690. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
  691. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
  692. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/signal_objects.py +0 -0
  693. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
  694. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
  695. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
  696. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
  697. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
  698. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
  699. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
  700. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
  701. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
  702. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
  703. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
  704. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
  705. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
  706. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
  707. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
  708. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
  709. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
  710. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
  711. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
  712. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
  713. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
  714. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
  715. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/paths.py +0 -0
  716. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/postgres.py +0 -0
  717. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/schema.py +0 -0
  718. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/schema_probe.py +0 -0
  719. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/storage_breakdown.py +0 -0
  720. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/db/write_gate.py +0 -0
  721. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/derived_row_identity.py +0 -0
  722. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/enrichment/__init__.py +0 -0
  723. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
  724. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
  725. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/normalized/__init__.py +0 -0
  726. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/normalized/normalized_store.py +0 -0
  727. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/oplog/__init__.py +0 -0
  728. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/oplog/decision.py +0 -0
  729. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/oplog/oplog_store.py +0 -0
  730. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/oplog/postgres.py +0 -0
  731. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/person/identity_resolver.py +0 -0
  732. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/projections/__init__.py +0 -0
  733. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/projections/index_ops_store.py +0 -0
  734. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/projections/vector_index_store.py +0 -0
  735. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/raw/__init__.py +0 -0
  736. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/raw/browser_flat_tables.py +0 -0
  737. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/raw/file_store.py +0 -0
  738. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/raw/raw_store.py +0 -0
  739. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/raw/raw_tables_manager.py +0 -0
  740. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/raw/sqlite_raw_store.py +0 -0
  741. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/security/encryption.py +0 -0
  742. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/signal_identity.py +0 -0
  743. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/source_settings.py +0 -0
  744. {topos_node-1.3.38 → topos_node-1.3.39}/topos/storage/user_identity.py +0 -0
  745. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sync/__init__.py +0 -0
  746. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sync/client.py +0 -0
  747. {topos_node-1.3.38 → topos_node-1.3.39}/topos/sync_handlers.py +0 -0
  748. {topos_node-1.3.38 → topos_node-1.3.39}/topos/testing/__init__.py +0 -0
  749. {topos_node-1.3.38 → topos_node-1.3.39}/topos/testing/lifespan.py +0 -0
  750. {topos_node-1.3.38 → topos_node-1.3.39}/topos/uds.py +0 -0
  751. {topos_node-1.3.38 → topos_node-1.3.39}/topos/uma_contact_enrichment.py +0 -0
  752. {topos_node-1.3.38 → topos_node-1.3.39}/topos/uma_filters.py +0 -0
  753. {topos_node-1.3.38 → topos_node-1.3.39}/topos/uma_resource_id.py +0 -0
  754. {topos_node-1.3.38 → topos_node-1.3.39}/topos/uma_rpt.py +0 -0
  755. {topos_node-1.3.38 → topos_node-1.3.39}/topos/upgrades/__init__.py +0 -0
  756. {topos_node-1.3.38 → topos_node-1.3.39}/topos/upgrades/runner.py +0 -0
  757. {topos_node-1.3.38 → topos_node-1.3.39}/topos/utils/base_object.py +0 -0
  758. {topos_node-1.3.38 → topos_node-1.3.39}/topos/websocket_client.py +0 -0
  759. {topos_node-1.3.38 → topos_node-1.3.39}/topos_node.egg-info/dependency_links.txt +0 -0
  760. {topos_node-1.3.38 → topos_node-1.3.39}/topos_node.egg-info/entry_points.txt +0 -0
  761. {topos_node-1.3.38 → topos_node-1.3.39}/topos_node.egg-info/requires.txt +0 -0
  762. {topos_node-1.3.38 → topos_node-1.3.39}/topos_node.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: topos-node
3
- Version: 1.3.38
3
+ Version: 1.3.39
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
@@ -163,13 +163,13 @@ Optional:
163
163
  ### 3) Run
164
164
 
165
165
  ```bash
166
- topos-node --host 0.0.0.0 --port 9000
166
+ topos-node --host 0.0.0.0 --port 8676
167
167
  ```
168
168
 
169
169
  ### 4) Verify
170
170
 
171
171
  ```bash
172
- curl http://localhost:9000/health
172
+ curl http://localhost:8676/health
173
173
  ```
174
174
 
175
175
  ## Common Commands
@@ -96,13 +96,13 @@ Optional:
96
96
  ### 3) Run
97
97
 
98
98
  ```bash
99
- topos-node --host 0.0.0.0 --port 9000
99
+ topos-node --host 0.0.0.0 --port 8676
100
100
  ```
101
101
 
102
102
  ### 4) Verify
103
103
 
104
104
  ```bash
105
- curl http://localhost:9000/health
105
+ curl http://localhost:8676/health
106
106
  ```
107
107
 
108
108
  ## Common Commands
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "topos-node"
7
- version = "1.3.38"
7
+ version = "1.3.39"
8
8
  description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -112,7 +112,7 @@ tmp_path_retention_count = 1
112
112
  tmp_path_retention_policy = "failed"
113
113
  # The DEFAULT lane is hermetic. Without this, a plain `pytest tests/` selects
114
114
  # every marker, and the three lanes below are the ones that read and WRITE the
115
- # developer's own ~/.topos/database.db or drive the node running on :9000 —
115
+ # developer's own ~/.topos/database.db or drive the node running on :8676 —
116
116
  # `tests/conftest.py::_no_live_db_guard` waives its protection for exactly these
117
117
  # markers, which only makes sense if the ordinary gate never selects them.
118
118
  # On 2026-08-19 it did: one `pytest tests/ -q` run inserted 71 rows into the
@@ -137,7 +137,7 @@ markers = [
137
137
  "public: public-safe test lane for OSS CI",
138
138
  "private: internal architecture or fixtures; excluded from public CI",
139
139
  "e2e: end-to-end tests (live Keycloak + Control Plane; require config and running CP)",
140
- "live: requires a running local engine (localhost:9000) and a real TOPOS_KEY; excluded from deterministic lanes",
140
+ "live: requires a running local engine (localhost:8676) and a real TOPOS_KEY; excluded from deterministic lanes",
141
141
  "release_pressure: iteration-4 live pressure smoke; run explicitly before releases",
142
142
  "p0: priority marker on release pressure tests",
143
143
  "retrieval_eval: dense-intelligence retrieval eval (loads local embedding model; run explicitly)",
@@ -20,6 +20,7 @@ from pathlib import Path
20
20
 
21
21
  import pytest
22
22
 
23
+ from topos.defaults import DEFAULT_NODE_PORT
23
24
  from topos.storage.db import paths
24
25
 
25
26
  pytestmark = [pytest.mark.public]
@@ -381,7 +382,7 @@ class TestSwitchPreflight:
381
382
  def _no_running_node(self, monkeypatch):
382
383
  from topos import profiles
383
384
 
384
- monkeypatch.setattr(profiles, "node_is_running", lambda port=9000: False)
385
+ monkeypatch.setattr(profiles, "node_is_running", lambda port=DEFAULT_NODE_PORT: False)
385
386
 
386
387
  def test_refuses_a_topos_from_a_newer_engine(self, tmp_path):
387
388
  from topos import profiles
@@ -22,6 +22,7 @@ from pathlib import Path
22
22
  import pytest
23
23
 
24
24
  from topos import profiles
25
+ from topos.defaults import DEFAULT_NODE_PORT
25
26
  from topos.storage.db.migrations import backup as backup_mod
26
27
 
27
28
  pytestmark = [pytest.mark.public]
@@ -70,7 +71,7 @@ def _seed_active(base: Path, *, key: str = "KEYAAA", real_db: bool = True) -> No
70
71
 
71
72
  @pytest.fixture(autouse=True)
72
73
  def _no_running_node(monkeypatch):
73
- monkeypatch.setattr(profiles, "node_is_running", lambda port=9000: False)
74
+ monkeypatch.setattr(profiles, "node_is_running", lambda port=DEFAULT_NODE_PORT: False)
74
75
 
75
76
 
76
77
  class TestArchiveIsSelfContained:
@@ -17,6 +17,7 @@ from click.testing import CliRunner
17
17
 
18
18
  from topos import profiles
19
19
  from topos.cli.profile_cmd import profile_group
20
+ from topos.defaults import DEFAULT_NODE_PORT
20
21
 
21
22
  pytestmark = [pytest.mark.public]
22
23
 
@@ -45,7 +46,7 @@ def _seed_profile(base: Path, slug: str, *, name: str | None = None, key: str =
45
46
 
46
47
  @pytest.fixture(autouse=True)
47
48
  def _no_running_node(monkeypatch):
48
- monkeypatch.setattr(profiles, "node_is_running", lambda port=9000: False)
49
+ monkeypatch.setattr(profiles, "node_is_running", lambda port=DEFAULT_NODE_PORT: False)
49
50
 
50
51
 
51
52
  class TestNewProfile:
@@ -128,7 +129,7 @@ class TestSwitchProfile:
128
129
  def test_refuses_while_node_running(self, tmp_path, monkeypatch):
129
130
  _seed_active(tmp_path)
130
131
  _seed_profile(tmp_path, "work")
131
- monkeypatch.setattr(profiles, "node_is_running", lambda port=9000: True)
132
+ monkeypatch.setattr(profiles, "node_is_running", lambda port=DEFAULT_NODE_PORT: True)
132
133
  with pytest.raises(profiles.ProfileError, match="running"):
133
134
  profiles.switch_profile("work", tmp_path)
134
135
  # Nothing moved.
@@ -328,7 +329,7 @@ class TestRemoveProfile:
328
329
  def test_does_not_require_the_node_to_be_stopped(self, tmp_path, monkeypatch):
329
330
  # An archived Topos is not the one a running engine has open, so unlike
330
331
  # new/switch this must work without asking anyone to quit Topos.
331
- monkeypatch.setattr(profiles, "node_is_running", lambda port=9000: True)
332
+ monkeypatch.setattr(profiles, "node_is_running", lambda port=DEFAULT_NODE_PORT: True)
332
333
  _seed_profile(tmp_path, "work")
333
334
 
334
335
  profiles.remove_profile("work", tmp_path)
@@ -1,6 +1,6 @@
1
1
  """Topos Control Plane Version Information."""
2
2
 
3
- __version__ = "1.3.38"
4
- __version_info__ = (1, 3, 38)
3
+ __version__ = "1.3.39"
4
+ __version_info__ = (1, 3, 39)
5
5
 
6
6
  __all__ = ["__version__", "__version_info__"]
@@ -12,6 +12,7 @@ import uvicorn
12
12
  # Add parent directory to path for imports
13
13
  sys.path.insert(0, str(Path(__file__).parent.parent.parent))
14
14
 
15
+ from topos.defaults import DEFAULT_NODE_PORT
15
16
  from topos.runtime_update import (
16
17
  DEFAULT_PACKAGE_NAME,
17
18
  apply_package_update,
@@ -232,8 +233,8 @@ def _maybe_offer_self_update(
232
233
  )
233
234
  @click.option(
234
235
  "--port",
235
- default=9000,
236
- help="Server port (default: 9000)",
236
+ default=DEFAULT_NODE_PORT,
237
+ help=f"Server port (default: {DEFAULT_NODE_PORT})",
237
238
  )
238
239
  @click.option(
239
240
  "--host",
@@ -17,6 +17,7 @@ from typing import Optional
17
17
  import click
18
18
 
19
19
  from topos import profiles
20
+ from topos.defaults import DEFAULT_NODE_PORT
20
21
 
21
22
 
22
23
  def _echo(payload: dict, as_json: bool, human: str) -> None:
@@ -41,7 +42,7 @@ _BASE_OPTION = click.option(
41
42
  )
42
43
  _JSON_OPTION = click.option("--json", "as_json", is_flag=True, help="Machine-readable output.")
43
44
  _PORT_OPTION = click.option(
44
- "--port", default=9000, show_default=True, help="Port probed for a running node."
45
+ "--port", default=DEFAULT_NODE_PORT, show_default=True, help="Port probed for a running node."
45
46
  )
46
47
 
47
48
 
@@ -408,10 +408,13 @@ async def handle_start_ingestion(message: Dict[str, Any]) -> Optional[Dict[str,
408
408
  "payload": {"job_id": job_id, "status": "completed", "deduplicated": True},
409
409
  }
410
410
 
411
+ # Import-time policy chosen in the UI (date window, inclusion flags).
412
+ ingest_options = payload.get("ingest_options")
411
413
  job_payload: Dict[str, Any] = {
412
414
  "dataset_id": dataset_id or "",
413
415
  "schema_id": schema_id,
414
416
  "file_format": file_format,
417
+ "ingest_options": ingest_options if isinstance(ingest_options, dict) else None,
415
418
  "job_id": job_id,
416
419
  "source_id": source_id,
417
420
  "source_definition": source_definition,
@@ -0,0 +1,9 @@
1
+ """Stable defaults for a local Topos node.
2
+
3
+ 8676 is TOPO on a phone keypad. Keep this the only Python source of the
4
+ listen port so CLI, probes, and the local MCP proxy cannot drift.
5
+ """
6
+
7
+ DEFAULT_NODE_PORT = 8676
8
+ DEFAULT_NODE_HTTP_URL = f"http://127.0.0.1:{DEFAULT_NODE_PORT}"
9
+ DEFAULT_NODE_LOCALHOST_URL = f"http://localhost:{DEFAULT_NODE_PORT}"
@@ -266,7 +266,9 @@ class EntitiesJob(BaseEnrichmentJob):
266
266
  resolver.record_mention(
267
267
  entity_id,
268
268
  record_id=record_id,
269
- surface_text=surface,
269
+ # A declared row may resolve on one string and be evidenced by
270
+ # another: a cited host is the node, the full URL is the proof.
271
+ surface_text=str(rec.get("surface_detail") or surface),
270
272
  source_id=rec.get("source_id"),
271
273
  canonical_table=rec.get("canonical_table"),
272
274
  confidence=confidence,
@@ -0,0 +1,256 @@
1
+ """Declared entity minting for ChatGPT turns (PLAN_CHATGPT_IMPORT.md Sprint 4).
2
+
3
+ A ChatGPT turn carries more than its text. The export declares, per message,
4
+ which pages were cited, which searches were run, which canvas document was being
5
+ written and which files were attached — and the reader already lifts all of it
6
+ onto ``ai_chat_messages.metadata_json``. Until now none of it became a node, so
7
+ the graph could not answer "what sources inform me" even though the answer was
8
+ sitting in a column.
9
+
10
+ This is the same class the 1.3.36 density pass ranked strongest: read from a
11
+ structured column, no model, no confidence to discount.
12
+
13
+ Three judgements are encoded here, and each one is a decision not a detail:
14
+
15
+ **Hosts, not URLs.** 1,359 distinct URLs would mint 1,359 leaf nodes that
16
+ connect to nothing and say nothing. The *host* is the source — ``docs.python.org``
17
+ is a thing you read repeatedly — so hosts are minted and the full URL is kept as
18
+ the mention's surface text. Subdomains stay distinct: reading Google Cloud's
19
+ docs is not reading google.com.
20
+
21
+ **Search queries are not minted.** They are declared, and they are read — they
22
+ ride on the exposure edge and on the mention that the search produced — but a
23
+ sentence is not an entity. Minting "Google Cloud roles/compute.instanceAdmin.v1
24
+ permissions create start stop delete VM instances" as a node would add a row, not
25
+ density. The entities *inside* a query reach the graph through the citations the
26
+ query returned.
27
+
28
+ **Attachments must be named by a human.** A ChatGPT export names half its
29
+ attachments with a UUID. ``proposal-v3.pdf`` is a document; ``bb2b7a54-d935-4ac1
30
+ -82d2-af0ff5df204c.png`` is a filename the system made up, and minting it would
31
+ put a hash in the graph.
32
+
33
+ Pure stdlib. The registry in ``declared_mappings`` dispatches to this.
34
+ """
35
+
36
+ from __future__ import annotations
37
+
38
+ import json
39
+ import re
40
+ from typing import Any, Dict, Iterable, List, Optional
41
+ from urllib.parse import urlsplit
42
+
43
+ # Spine entity types minted here. Both are new to the vocabulary in
44
+ # ``resolver._NER_TYPE_MAP``; declared rows keep their type verbatim, so no
45
+ # mapping is needed, but a UI that switches on entity_type should learn them.
46
+ TYPE_WEB_SOURCE = "web_source"
47
+ TYPE_DOCUMENT = "document"
48
+
49
+ # Owner edges. Exposure is not authorship: a page the assistant fetched and
50
+ # showed is something the owner was exposed to, and the provenance layer must
51
+ # never read it as something they said.
52
+ EDGE_EXPOSED_TO = "exposed_to"
53
+ EDGE_AUTHORED = "authored"
54
+
55
+ # Hosts that identify no source: loopback, bare addresses, and the redirectors
56
+ # a search tool leaves behind.
57
+ _HOST_DENYLIST = frozenset({"localhost", "127.0.0.1", "0.0.0.0", "example.com"})
58
+ _IPV4 = re.compile(r"^\d{1,3}(\.\d{1,3}){3}$")
59
+
60
+ # A filename a person chose, versus one a system generated.
61
+ _UUID_NAME = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.IGNORECASE)
62
+ _HEX_NAME = re.compile(r"^[0-9a-f]{16,}$", re.IGNORECASE)
63
+ _MIN_DOCUMENT_NAME = 3
64
+
65
+
66
+ def host_of(url: str) -> str:
67
+ """The source a URL names: hostname, lowercased, without ``www.``.
68
+
69
+ Returns "" for anything that does not identify a readable source.
70
+ """
71
+ text = str(url or "").strip()
72
+ if not text:
73
+ return ""
74
+ if "//" not in text:
75
+ text = "//" + text
76
+ try:
77
+ host = (urlsplit(text).hostname or "").lower()
78
+ except ValueError:
79
+ return ""
80
+ host = host.removeprefix("www.")
81
+ if not host or "." not in host or host in _HOST_DENYLIST or _IPV4.match(host):
82
+ return ""
83
+ return host
84
+
85
+
86
+ def is_named_by_a_human(filename: str) -> bool:
87
+ """Did a person choose this filename, or did a machine?"""
88
+ name = str(filename or "").strip()
89
+ if len(name) < _MIN_DOCUMENT_NAME:
90
+ return False
91
+ stem = name.rsplit(".", 1)[0] if "." in name else name
92
+ if _UUID_NAME.match(stem) or _HEX_NAME.match(stem):
93
+ return False
94
+ # "file_00000000abc" and friends: no letters a person would have typed.
95
+ return bool(re.search(r"[A-Za-z]{3,}", stem))
96
+
97
+
98
+ def _metadata(record: Dict[str, Any]) -> Dict[str, Any]:
99
+ """``metadata_json`` arrives as a dict at map time and a string from SQL."""
100
+ value = record.get("metadata_json")
101
+ if value is None:
102
+ value = record.get("metadata")
103
+ if isinstance(value, str):
104
+ try:
105
+ value = json.loads(value)
106
+ except (TypeError, ValueError):
107
+ return {}
108
+ return value if isinstance(value, dict) else {}
109
+
110
+
111
+ def _row(
112
+ surface: str,
113
+ entity_type: str,
114
+ *,
115
+ record: Dict[str, Any],
116
+ record_id: str,
117
+ event_at: Optional[str],
118
+ self_edge: Optional[str] = None,
119
+ surface_detail: Optional[str] = None,
120
+ ) -> Dict[str, Any]:
121
+ row: Dict[str, Any] = {
122
+ "message_id": record_id,
123
+ "record_id": record_id,
124
+ "source_id": record.get("source_id"),
125
+ "event_at": event_at,
126
+ "canonical_table": record.get("_table") or record.get("canonical_table") or "ai_chat_messages",
127
+ "entity_text": surface,
128
+ "entity_type": entity_type,
129
+ "confidence": 1.0,
130
+ "provider": "declared",
131
+ "model": None,
132
+ }
133
+ if self_edge:
134
+ row["self_edge"] = self_edge
135
+ if surface_detail:
136
+ # What the graph shows is the host; what the evidence says is the URL.
137
+ row["surface_detail"] = surface_detail
138
+ return row
139
+
140
+
141
+ def _citation_urls(metadata: Dict[str, Any]) -> List[str]:
142
+ urls: List[str] = []
143
+ for citation in metadata.get("citation_urls") or []:
144
+ if isinstance(citation, str) and citation.strip():
145
+ urls.append(citation.strip())
146
+ return urls
147
+
148
+
149
+ def _canvas_title(metadata: Dict[str, Any]) -> str:
150
+ canvas = metadata.get("canvas")
151
+ if not isinstance(canvas, dict):
152
+ return ""
153
+ title = canvas.get("title")
154
+ if isinstance(title, str) and title.strip():
155
+ return title.strip()
156
+ return ""
157
+
158
+
159
+ def _attachment_names(metadata: Dict[str, Any]) -> Iterable[str]:
160
+ for item in metadata.get("attachments") or []:
161
+ if isinstance(item, dict):
162
+ name = item.get("name")
163
+ if isinstance(name, str) and is_named_by_a_human(name):
164
+ yield name.strip()
165
+
166
+
167
+ def declared_rows(
168
+ record: Dict[str, Any],
169
+ *,
170
+ record_id: str,
171
+ event_at: Optional[str] = None,
172
+ ) -> List[Dict[str, Any]]:
173
+ """NER-result-shaped rows minted from one turn's declared metadata.
174
+
175
+ Shape matches ``declared_mappings.extract_declared_entities`` exactly, so the
176
+ entities job resolves these through the same declared path — at declared
177
+ confidence, with the type kept verbatim.
178
+ """
179
+ if not record_id:
180
+ return []
181
+ metadata = _metadata(record)
182
+ if not metadata:
183
+ return []
184
+
185
+ rows: List[Dict[str, Any]] = []
186
+ seen: set = set()
187
+
188
+ # Which search produced this message's citations, if any. Carried on the
189
+ # mention rather than minted: it is evidence, not an entity.
190
+ queries = [q for q in (metadata.get("search_queries") or []) if isinstance(q, str) and q.strip()]
191
+ query_note = queries[0].strip() if queries else ""
192
+
193
+ for url in _citation_urls(metadata):
194
+ host = host_of(url)
195
+ if not host:
196
+ continue
197
+ key = (host, TYPE_WEB_SOURCE)
198
+ if key in seen:
199
+ continue
200
+ seen.add(key)
201
+ detail = f"{url} — searched: {query_note}" if query_note else url
202
+ rows.append(_row(host, TYPE_WEB_SOURCE, record=record, record_id=record_id,
203
+ event_at=event_at, self_edge=EDGE_EXPOSED_TO, surface_detail=detail))
204
+
205
+ canvas = _canvas_title(metadata)
206
+ if canvas:
207
+ key = (canvas.lower(), TYPE_DOCUMENT)
208
+ if key not in seen:
209
+ seen.add(key)
210
+ rows.append(_row(canvas, TYPE_DOCUMENT, record=record, record_id=record_id,
211
+ event_at=event_at, self_edge=EDGE_AUTHORED))
212
+
213
+ for name in _attachment_names(metadata):
214
+ key = (name.lower(), TYPE_DOCUMENT)
215
+ if key in seen:
216
+ continue
217
+ seen.add(key)
218
+ rows.append(_row(name, TYPE_DOCUMENT, record=record, record_id=record_id,
219
+ event_at=event_at, self_edge=EDGE_AUTHORED))
220
+
221
+ return rows
222
+
223
+
224
+ def coverage(records: Iterable[Dict[str, Any]]) -> Dict[str, int]:
225
+ """What this lane would mint over a batch — the Sprint 4 measurement."""
226
+ hosts: set = set()
227
+ documents: set = set()
228
+ urls = 0
229
+ queries = 0
230
+ skipped_machine_names = 0
231
+ for record in records:
232
+ metadata = _metadata(record)
233
+ if not metadata:
234
+ continue
235
+ for url in _citation_urls(metadata):
236
+ urls += 1
237
+ host = host_of(url)
238
+ if host:
239
+ hosts.add(host)
240
+ queries += len([q for q in (metadata.get("search_queries") or []) if isinstance(q, str) and q.strip()])
241
+ title = _canvas_title(metadata)
242
+ if title:
243
+ documents.add(title.lower())
244
+ for item in metadata.get("attachments") or []:
245
+ if isinstance(item, dict) and isinstance(item.get("name"), str):
246
+ if is_named_by_a_human(item["name"]):
247
+ documents.add(item["name"].strip().lower())
248
+ else:
249
+ skipped_machine_names += 1
250
+ return {
251
+ "citation_urls": urls,
252
+ "web_sources": len(hosts),
253
+ "documents": len(documents),
254
+ "search_queries_read": queries,
255
+ "attachments_skipped_machine_named": skipped_machine_names,
256
+ }
@@ -183,6 +183,44 @@ def mapping_for(source_id: Optional[str]) -> Optional[Dict[str, Any]]:
183
183
  return DECLARED_ENTITY_MAPPINGS.get(str(source_id or "").strip())
184
184
 
185
185
 
186
+ # Sources whose declared entities need code, not a path-and-transform rule: a
187
+ # ChatGPT turn declares a *list* of cited URLs and a filename that has to be
188
+ # judged before it is minted. The declaration DSL maps one path to one surface,
189
+ # so these register a producer with the same output shape instead of bending it.
190
+ def _chatgpt_declared(record, *, record_id, event_at):
191
+ from .chatgpt_declared import declared_rows
192
+
193
+ return declared_rows(record, record_id=record_id, event_at=event_at)
194
+
195
+
196
+ DECLARED_ROW_PRODUCERS: Dict[str, Any] = {
197
+ "chatgpt_file_ingestion": _chatgpt_declared,
198
+ "chatgpt_ui_conversation": _chatgpt_declared,
199
+ }
200
+
201
+
202
+ def declared_producers_enabled() -> bool:
203
+ """``TOPOS_DECLARED_PRODUCERS=off`` turns the code-backed declared lanes off.
204
+
205
+ Exists so a before/after measurement is one variable on one build, instead of
206
+ two builds someone has to trust are otherwise identical.
207
+ """
208
+ import os
209
+
210
+ return os.environ.get("TOPOS_DECLARED_PRODUCERS", "on").strip().lower() not in (
211
+ "0",
212
+ "off",
213
+ "false",
214
+ "no",
215
+ )
216
+
217
+
218
+ def producer_for(source_id: Optional[str]):
219
+ if not declared_producers_enabled():
220
+ return None
221
+ return DECLARED_ROW_PRODUCERS.get(str(source_id or "").strip())
222
+
223
+
186
224
  def ner_suppressed_source_ids() -> set:
187
225
  return {sid for sid, m in DECLARED_ENTITY_MAPPINGS.items() if m.get("suppress_ner")}
188
226
 
@@ -234,7 +272,8 @@ def extract_declared_entities(
234
272
  should pass record_id/event_at explicitly so the two never drift.
235
273
  """
236
274
  mapping = mapping_for(record.get("source_id"))
237
- if not mapping:
275
+ producer = producer_for(record.get("source_id"))
276
+ if not mapping and not producer:
238
277
  return []
239
278
  if record_id is None:
240
279
  record_id = str(
@@ -255,6 +294,12 @@ def extract_declared_entities(
255
294
  )
256
295
  if not record_id:
257
296
  return []
297
+ if producer is not None:
298
+ rows = list(producer(record, record_id=record_id, event_at=event_at))
299
+ if not mapping:
300
+ return rows
301
+ else:
302
+ rows = []
258
303
  # Keyed on the TRANSFORMED surface, because that is what the entity rows below
259
304
  # carry. Without this the two halves agree only while every self-edge target
260
305
  # happens to be untransformed — true of github, and silently false the moment
@@ -266,8 +311,8 @@ def extract_declared_entities(
266
311
  for rule in mapping.get("self_edges", [])
267
312
  }
268
313
  edge_targets.pop("", None)
269
- out: List[Dict[str, Any]] = []
270
- seen: set = set()
314
+ out: List[Dict[str, Any]] = list(rows)
315
+ seen: set = {(str(r.get("entity_text") or "").lower(), str(r.get("entity_type") or "")) for r in out}
271
316
  for rule in mapping.get("entities", []):
272
317
  raw = _field(record, str(rule.get("path") or ""))
273
318
  surface = _transform(raw, rule.get("transform"))
@@ -65,6 +65,7 @@ async def ingest_file_payload(
65
65
  source_definition: Optional[Dict[str, Any]] = None,
66
66
  progress_api_url: Optional[str] = None,
67
67
  progress_api_key: Optional[str] = None,
68
+ ingest_options: Optional[Dict[str, Any]] = None,
68
69
  ) -> dict:
69
70
  if not dataset_id:
70
71
  return {"status": "error", "error": "dataset_id required"}
@@ -112,10 +113,17 @@ async def ingest_file_payload(
112
113
  len(file_bytes) if file_bytes else None,
113
114
  )
114
115
  if file_path:
115
- job = trigger.create_job(job_id, dataset_id, schema_id, file_path, file_format=file_format)
116
+ job = trigger.create_job(
117
+ job_id, dataset_id, schema_id, file_path, file_format=file_format, ingest_options=ingest_options
118
+ )
116
119
  else:
117
120
  job = trigger.create_job_from_bytes(
118
- job_id, dataset_id, schema_id, file_bytes or b"", file_format=file_format
121
+ job_id,
122
+ dataset_id,
123
+ schema_id,
124
+ file_bytes or b"",
125
+ file_format=file_format,
126
+ ingest_options=ingest_options,
119
127
  )
120
128
  manager = IngestionManager(file_store=file_store)
121
129
  result = await manager.process_job(
@@ -797,7 +797,14 @@ class IngestionManager(BaseObject):
797
797
  pbar = ProgressBar(total=1000, desc=f"{self}: Parsing") # Placeholder, will adjust
798
798
 
799
799
  try:
800
- async for raw_payload in parse_file(_read_file_bytes(file_path), job.metadata.get("file_format", "jsonl")):
800
+ # Import-time policy (date window, inclusion flags) travels on the
801
+ # job so a re-run of the same job reproduces the same corpus.
802
+ ingest_options = job.metadata.get("ingest_options")
803
+ async for raw_payload in parse_file(
804
+ _read_file_bytes(file_path),
805
+ job.metadata.get("file_format", "jsonl"),
806
+ ingest_options if isinstance(ingest_options, dict) else None,
807
+ ):
801
808
  expanded_payloads = _expand_file_records(raw_payload, source_def)
802
809
  if not expanded_payloads:
803
810
  expanded_payloads = [raw_payload] if isinstance(raw_payload, dict) else []