topos-node 1.3.31__tar.gz → 1.3.32__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.
- {topos_node-1.3.31/topos_node.egg-info → topos_node-1.3.32}/PKG-INFO +1 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/pyproject.toml +1 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/__version__.py +2 -2
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/writer.py +51 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/fact_materializer.py +1 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/linking.py +1 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/reads.py +7 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/store.py +8 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/derived_scrub.py +14 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/facts_direct.py +61 -4
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/game_layer.py +30 -2
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/upgrades/manifests.json +6 -0
- {topos_node-1.3.31 → topos_node-1.3.32/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.31 → topos_node-1.3.32}/LICENSE +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/MANIFEST.in +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/README.md +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/setup.cfg +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/shared/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/shared/filtering.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/shared/schema_registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_extensions.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_profiles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/analytics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/backup.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/db.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/device.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/health.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/llm.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/query_api.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/shell.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/signal.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/source_install.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sources.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/sync.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/usage.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/app.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/auth.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/commands.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/cli/tray.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/settings.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/api_models.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/db_health.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/errors.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/events.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/logging.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/metrics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/state.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/core/types.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/client.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/disk_space.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/engine.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/intake.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/registration.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/router.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/transport.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/engine/validator.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/extensions.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/router.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/template.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/edges.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/openai_client.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/profiles.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/audit.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/ddr.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/entity_window.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/exclusion.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/inference.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/intent.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/manifest.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/narrowing.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/pipeline.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/planner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/retrieval.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/runtime.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_head.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_registry.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/session.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/types.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/verify.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/rate_limit.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/routines/schema.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/routines/store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/runtime_update.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/container.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/llm/openai.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/local.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/services/postgres.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/install_service.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/startup_banner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sync/client.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_filters.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/upgrades/runner.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos/websocket_client.py +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.31 → topos_node-1.3.32}/topos_node.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "topos-node"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.32"
|
|
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"
|
|
@@ -23,9 +23,23 @@ import uuid
|
|
|
23
23
|
from datetime import datetime, timezone, timedelta
|
|
24
24
|
from typing import Any, Dict, List, Optional
|
|
25
25
|
|
|
26
|
+
import os
|
|
27
|
+
|
|
26
28
|
from topos.features.facts.store import FactStore, normalize_predicate, CONFLICT_CONFIDENCE_MARGIN
|
|
27
29
|
from .guard import find_identifiers
|
|
28
30
|
from .packs import Pack, Predicate
|
|
31
|
+
|
|
32
|
+
#: Whether a resolved `about=other:<name>` assertion may be WRITTEN to that person's
|
|
33
|
+
#: dossier. Default OFF, and it must stay off until a net-subject policy plane exists
|
|
34
|
+
#: (per-subject opt-in defaulting to off, a write-time BlackholeStore consult, and
|
|
35
|
+
#: pack-level `net_subject: allow|deny`). With it off, every outward assertion is
|
|
36
|
+
#: quarantined with reason `net_subject_disabled:<name>` and waits for a human.
|
|
37
|
+
#:
|
|
38
|
+
#: The env override exists so the policy work can be developed and tested against the
|
|
39
|
+
#: real path without editing the module. It is NOT a supported production setting: any
|
|
40
|
+
#: node that sets it is writing durable facts about people who never consented and
|
|
41
|
+
#: cannot, with no gate in front of the write.
|
|
42
|
+
NET_SUBJECT_WRITES_ENABLED = os.environ.get("TOPOS_NET_SUBJECT_WRITES") == "1"
|
|
29
43
|
# extractor provenance must track the PROMPT actually used — a local copy of this
|
|
30
44
|
# constant stamped every shadow-2..6 fact "shadow-1" (caught in W1.3 grading)
|
|
31
45
|
from .template import TEMPLATE_VERSION
|
|
@@ -206,6 +220,43 @@ class DerivationWriter:
|
|
|
206
220
|
# --- A3 (attribution ladder): route by subject BEFORE any owner-assert ---
|
|
207
221
|
about = (about or "owner").strip()
|
|
208
222
|
if about != "owner":
|
|
223
|
+
# --- net-subject kill switch (temporary; remove when the policy plane lands) ---
|
|
224
|
+
#
|
|
225
|
+
# Below this line, `about=other:<name>` that RESOLVES is written as a durable
|
|
226
|
+
# fact onto that person's dossier. There is currently no consent plane to
|
|
227
|
+
# authorise that: `net_subject` / `subject_axis` appear ZERO times in this
|
|
228
|
+
# engine, the control plane, the front end, or any of the 25 pack YAMLs; the
|
|
229
|
+
# Pack/Predicate dataclasses carry no subject field, so a pack can neither
|
|
230
|
+
# declare nor refuse an outward subject; `pack.disclosure_default` is stored
|
|
231
|
+
# on every registry row and never read; and BlackholeGuard is consulted only
|
|
232
|
+
# at READ time, so a blackholed person can still ACCRUE facts.
|
|
233
|
+
#
|
|
234
|
+
# Nothing has been written so far only because `_resolve_person` is an exact
|
|
235
|
+
# match on `entities.normalized_name` and fails on every third-party first
|
|
236
|
+
# name — 624 of 1,505 person entities are keyed on a phone number and only 36
|
|
237
|
+
# carry aliases. That is an accident of an unbuilt person spine, not a policy.
|
|
238
|
+
# The planned L0 (person spine) exists precisely to make that resolution
|
|
239
|
+
# succeed, which would silently switch automatic third-party dossier writing
|
|
240
|
+
# ON. The owner's standing decision is "off until asked".
|
|
241
|
+
#
|
|
242
|
+
# So: quarantine EVERY outward assertion, resolvable or not. Quarantine is
|
|
243
|
+
# already the reviewed path — the rows carry full provenance and the fact
|
|
244
|
+
# editor promotes them — so nothing is lost, only deferred to a human.
|
|
245
|
+
#
|
|
246
|
+
# REMOVE THIS BLOCK when the net-subject policy plane exists (plan L4-4:
|
|
247
|
+
# per-subject opt-in defaulting to off, a write-time BlackholeStore consult,
|
|
248
|
+
# and pack-level `net_subject: allow|deny`). Replace it with that lookup —
|
|
249
|
+
# do not simply delete it.
|
|
250
|
+
if about.startswith("other:") and not NET_SUBJECT_WRITES_ENABLED:
|
|
251
|
+
# Its own reason, deliberately: these are POLICY holds, not failures to
|
|
252
|
+
# identify a subject. Collapsing them into `about_unclear` would make a
|
|
253
|
+
# withheld-by-policy row indistinguishable from one the verifier could
|
|
254
|
+
# not attribute, and the review queue's whole value is that distinction.
|
|
255
|
+
self._quarantine(subject_entity_id, predicate, value, confidence,
|
|
256
|
+
reason=f"net_subject_disabled:{about[6:][:40]}",
|
|
257
|
+
pack=pack, source_refs=source_refs, quote=quote, about=about)
|
|
258
|
+
self.stats["net_subject_withheld"] = self.stats.get("net_subject_withheld", 0) + 1
|
|
259
|
+
return {"outcome": "quarantined", "reason": "net-subject writes disabled"}
|
|
209
260
|
if about.startswith("other:"):
|
|
210
261
|
other = self._resolve_person(about[6:])
|
|
211
262
|
if other:
|
|
@@ -360,7 +360,7 @@ def _display_value(raw) -> str:
|
|
|
360
360
|
return hv.strip()
|
|
361
361
|
# NO fallback to arbitrary fields: a description/free-text value is
|
|
362
362
|
# narrative, not identity — minting it produced sentence-named nodes
|
|
363
|
-
# ("rode with
|
|
363
|
+
# ("rode with a friend on the way to…"). A structured value with no
|
|
364
364
|
# identity key mints nothing; the fact itself still exists.
|
|
365
365
|
return ""
|
|
366
366
|
return str(v or "").strip()
|
|
@@ -43,7 +43,7 @@ _LINK_STOPWORDS = frozenset(
|
|
|
43
43
|
|
|
44
44
|
def _linkable_candidate(cand: str) -> bool:
|
|
45
45
|
"""A candidate name is linkable only if it carries at least one real word:
|
|
46
|
-
≥3 chars and not a function word. '
|
|
46
|
+
≥3 chars and not a function word. 'Leo' links; 'IS', 'Go', 'The One' do not."""
|
|
47
47
|
words = [w for w in cand.split() if w]
|
|
48
48
|
if not words:
|
|
49
49
|
return False
|
|
@@ -136,7 +136,13 @@ def list_facts(
|
|
|
136
136
|
"period_start": payload.get("period_start"),
|
|
137
137
|
"period_end": payload.get("period_end"),
|
|
138
138
|
"confidence": payload.get("confidence", fact["confidence"]),
|
|
139
|
-
|
|
139
|
+
# Fail closed, and match the sibling reader 74 lines below, which
|
|
140
|
+
# already defaults to owner_only. A payload with no disclosure is
|
|
141
|
+
# a row nobody classified; reading it as shareable is the wrong
|
|
142
|
+
# direction to guess in, and the two readers disagreeing meant the
|
|
143
|
+
# same unclassified row was shareable on one path and private on
|
|
144
|
+
# the other.
|
|
145
|
+
"disclosure": payload.get("disclosure", "owner_only"),
|
|
140
146
|
# Attribution: who asserted this claim (owner | contact:<id> |
|
|
141
147
|
# assistant | page-author | …). Powers the person→ambient badge.
|
|
142
148
|
"asserted_by": payload.get("asserted_by", "owner"),
|
|
@@ -110,7 +110,14 @@ class FactStore:
|
|
|
110
110
|
confidence: float = 0.7,
|
|
111
111
|
source_refs: Optional[List[Dict[str, Any]]] = None,
|
|
112
112
|
valid_from: Optional[str] = None,
|
|
113
|
-
|
|
113
|
+
# Fail closed. Every in-tree caller passes this explicitly (verdicts.py,
|
|
114
|
+
# llm_extract.py, extract.py x2, truth_facts.py), so the default is only
|
|
115
|
+
# ever reached by a caller that forgot — and the safe thing to do with a
|
|
116
|
+
# claim about a person when nobody said how far it may travel is to keep
|
|
117
|
+
# it. This is the second fact write path: DerivationWriter pins owner_only
|
|
118
|
+
# by construction, and this one did not, so "facts are owner_only" was
|
|
119
|
+
# true of one lane and merely conventional in the other.
|
|
120
|
+
disclosure: str = "owner_only",
|
|
114
121
|
period_start: Optional[str] = None,
|
|
115
122
|
period_end: Optional[str] = None,
|
|
116
123
|
asserted_by: str = "owner",
|
|
@@ -524,9 +524,22 @@ def sweep_orphans(conn: sqlite3.Connection) -> Dict[str, int]:
|
|
|
524
524
|
"""
|
|
525
525
|
)
|
|
526
526
|
out["embedding_entities"] = int(cursor.rowcount or 0)
|
|
527
|
+
# A conflict row is an orphan when the fact it CHALLENGES is gone. A3
|
|
528
|
+
# quarantine rows have no incumbent by design — an unroutable or withheld
|
|
529
|
+
# assertion is not challenging anything — so they carry the synthetic
|
|
530
|
+
# sentinel `quarantine:<reason>` (writer.py::_quarantine). That sentinel is
|
|
531
|
+
# never a signal_objects.object_id, so the orphan predicate matched every
|
|
532
|
+
# one of them: measured on the live node 2026-08-26, all 13 pending rows
|
|
533
|
+
# would be deleted by this sweep, and it fires on the owner's ordinary
|
|
534
|
+
# per-record exclusion flow. That queue is the human review path for
|
|
535
|
+
# third-party assertions — including health.condition about people who
|
|
536
|
+
# never consented — so deleting it silently discards exactly the decisions
|
|
537
|
+
# a person is supposed to make.
|
|
527
538
|
cursor = conn.execute(
|
|
528
539
|
"""
|
|
529
|
-
DELETE FROM fact_conflicts
|
|
540
|
+
DELETE FROM fact_conflicts
|
|
541
|
+
WHERE incumbent_object_id NOT LIKE 'quarantine:%'
|
|
542
|
+
AND incumbent_object_id NOT IN (
|
|
530
543
|
SELECT object_id FROM signal_objects WHERE object_type='fact'
|
|
531
544
|
)
|
|
532
545
|
"""
|
|
@@ -38,7 +38,8 @@ _ALIASES: List[tuple] = [
|
|
|
38
38
|
(r"\b(career|fired|hired|promoted|laid off)\b", ["work.career_event"], False),
|
|
39
39
|
(r"\bfamily member|my (family|relatives|parents|siblings|kids|children)\b",
|
|
40
40
|
["rel.relationship"], False),
|
|
41
|
-
(r"\b(closest|inner circle|best friend)s?\b",
|
|
41
|
+
(r"\b(closest|inner circle|close circle|close friend|best friend)s?\b",
|
|
42
|
+
["rel.closeness_tier", "rel.relationship"], False),
|
|
42
43
|
(r"\bchronotype|night owl|early bird\b", ["behavior.chronotype"], False),
|
|
43
44
|
]
|
|
44
45
|
|
|
@@ -66,19 +67,43 @@ def fetch_direct_facts(
|
|
|
66
67
|
return None
|
|
67
68
|
if special and packet_resolution != "facts_all":
|
|
68
69
|
return None
|
|
69
|
-
|
|
70
|
+
# `is_self` is not unique: live 2026-08-26 three entities carried it —
|
|
71
|
+
# ent_e73ff33ae330422b ("Owner", 178 facts) plus two "self" rows created that
|
|
72
|
+
# morning holding none. An unordered fetchone() picked the fact-bearing row by
|
|
73
|
+
# rowid luck; a vacuum or a rewrite of that row would have silently blanked
|
|
74
|
+
# every known-item answer. Prefer the self-entity that actually owns facts,
|
|
75
|
+
# entity_id as the tiebreak, so the choice is stable across rewrites. (No
|
|
76
|
+
# created_at in the ORDER BY: the query fixtures build a minimal `entities`
|
|
77
|
+
# table without it.)
|
|
78
|
+
owner = conn.execute(
|
|
79
|
+
"""SELECT e.entity_id
|
|
80
|
+
FROM entities e
|
|
81
|
+
WHERE e.is_self=1
|
|
82
|
+
ORDER BY (SELECT COUNT(*) FROM signal_objects o
|
|
83
|
+
WHERE o.object_type='fact'
|
|
84
|
+
AND o.object_key LIKE 'fact:' || e.entity_id || ':%') DESC,
|
|
85
|
+
e.entity_id ASC
|
|
86
|
+
LIMIT 1"""
|
|
87
|
+
).fetchone()
|
|
70
88
|
if not owner:
|
|
71
89
|
return None
|
|
72
90
|
out: List[Dict[str, Any]] = []
|
|
73
91
|
for pred in predicates:
|
|
92
|
+
# Delimiter-aware: a bare `{pred}%` prefix also swept sibling predicates.
|
|
93
|
+
# "Who's in my family?" asks for rel.relationship and was handed the 23
|
|
94
|
+
# rel.relationship_event rows too, so the answer listed people the owner
|
|
95
|
+
# merely met (live 2026-08-26: Vitalik Buterin returned as family). Match
|
|
96
|
+
# the exact key or the key plus its ':value' segment, nothing else.
|
|
97
|
+
# `_` is a LIKE wildcard and predicates contain it, so escape it.
|
|
98
|
+
like_pred = pred.replace("\\", "\\\\").replace("_", "\\_").replace("%", "\\%")
|
|
74
99
|
rows = conn.execute(
|
|
75
100
|
"""SELECT object_key, payload_json, confidence, valid_from, valid_to,
|
|
76
101
|
ontology_id, altitude
|
|
77
102
|
FROM signal_objects
|
|
78
103
|
WHERE object_type='fact' AND valid_to IS NULL
|
|
79
|
-
AND object_key LIKE ?
|
|
104
|
+
AND (object_key = ? OR object_key LIKE ? ESCAPE '\\')
|
|
80
105
|
ORDER BY valid_from DESC LIMIT 40""",
|
|
81
|
-
(f"fact:{owner[0]}:{pred}
|
|
106
|
+
(f"fact:{owner[0]}:{pred}", f"fact:{owner[0]}:{like_pred}:%"),
|
|
82
107
|
).fetchall()
|
|
83
108
|
for key, payload_json, conf, vf, vt, pack, altitude in rows:
|
|
84
109
|
try:
|
|
@@ -125,6 +150,37 @@ def _fmt_value(v: Any) -> str:
|
|
|
125
150
|
return str(v)
|
|
126
151
|
|
|
127
152
|
|
|
153
|
+
def _fact_labels(facts: List[Dict[str, Any]]) -> List[str]:
|
|
154
|
+
"""Subject labels for `items`.
|
|
155
|
+
|
|
156
|
+
The game layer fills `items` speculatively from graph/score text before this
|
|
157
|
+
lane runs, and pipeline's `payload.update(direct)` only overwrites the keys
|
|
158
|
+
this lane returns. Leaving `items` behind shipped a correct `answer` next to a
|
|
159
|
+
contradicting list: live 2026-08-26 "Who's in my family?" carried Mom, Dad,
|
|
160
|
+
brother and grandma in `answer` while `items` held NER debris ("U", "AI",
|
|
161
|
+
"##os", "NAME"), and the local synthesis model answered from the debris.
|
|
162
|
+
"""
|
|
163
|
+
out: List[str] = []
|
|
164
|
+
seen: set[str] = set()
|
|
165
|
+
for f in facts:
|
|
166
|
+
value = f.get("value")
|
|
167
|
+
if isinstance(value, str):
|
|
168
|
+
try:
|
|
169
|
+
value = json.loads(value)
|
|
170
|
+
except (json.JSONDecodeError, TypeError):
|
|
171
|
+
value = None
|
|
172
|
+
label = None
|
|
173
|
+
if isinstance(value, dict):
|
|
174
|
+
label = value.get("person") or value.get("name") or value.get("value")
|
|
175
|
+
if not label:
|
|
176
|
+
label = _fmt_value(f.get("value"))
|
|
177
|
+
label = str(label).strip()
|
|
178
|
+
if label and label not in seen:
|
|
179
|
+
seen.add(label)
|
|
180
|
+
out.append(label)
|
|
181
|
+
return out[:20]
|
|
182
|
+
|
|
183
|
+
|
|
128
184
|
def compose_facts_answer(facts: List[Dict[str, Any]]) -> str:
|
|
129
185
|
lines = []
|
|
130
186
|
for f in facts[:20]:
|
|
@@ -158,5 +214,6 @@ def try_facts_direct(
|
|
|
158
214
|
"answer_type": "facts",
|
|
159
215
|
"answer": compose_facts_answer(facts),
|
|
160
216
|
"facts": facts[:20],
|
|
217
|
+
"items": _fact_labels(facts),
|
|
161
218
|
"facts_direct": True,
|
|
162
219
|
}
|
|
@@ -55,6 +55,34 @@ def _extract_inference_evidence(context_packet: Dict[str, Any], *, limit: int =
|
|
|
55
55
|
return evidence
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
#: Redaction writes these placeholders into stored text, and the NER pass then
|
|
59
|
+
#: extracts them as if they were names.
|
|
60
|
+
_REDACTION_PLACEHOLDERS = {"NAME", "ADDRESS", "DATE", "EMAIL", "PHONE", "URL", "LOCATION"}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _looks_like_entity_label(value: str) -> bool:
|
|
64
|
+
"""Reject debris that is not a name.
|
|
65
|
+
|
|
66
|
+
`graph.nodes` and `scores` carry raw NER output, which includes WordPiece
|
|
67
|
+
continuation tokens ("Topos" tokenizes to "Top" + "##os", and both are stored
|
|
68
|
+
as separate entities), redaction placeholders, and serialized fact blobs. Live
|
|
69
|
+
2026-08-26 the answer to "Who's in my close circle?" was
|
|
70
|
+
["U", "AI", "UMA", "Sara", "Marcus", "NAME", "Top", "##os", "VoxTerm A"].
|
|
71
|
+
"""
|
|
72
|
+
v = value.strip()
|
|
73
|
+
if len(v) < 2 or len(v) > 60:
|
|
74
|
+
return False
|
|
75
|
+
if v.startswith("##"): # WordPiece continuation, never a standalone name
|
|
76
|
+
return False
|
|
77
|
+
if "{" in v or "}" in v: # serialized fact payload, not a label
|
|
78
|
+
return False
|
|
79
|
+
if v.upper() in _REDACTION_PLACEHOLDERS:
|
|
80
|
+
return False
|
|
81
|
+
if v.isupper() and len(v) <= 3: # bare acronym (U, AI, UMA), not a person here
|
|
82
|
+
return False
|
|
83
|
+
return True
|
|
84
|
+
|
|
85
|
+
|
|
58
86
|
def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
59
87
|
labels: List[str] = []
|
|
60
88
|
seen: set[str] = set()
|
|
@@ -64,7 +92,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
|
64
92
|
continue
|
|
65
93
|
for key in ("label", "name", "node_id", "entity_text"):
|
|
66
94
|
value = node.get(key)
|
|
67
|
-
if value and str(value) not in seen:
|
|
95
|
+
if value and str(value) not in seen and _looks_like_entity_label(str(value)):
|
|
68
96
|
seen.add(str(value))
|
|
69
97
|
labels.append(str(value))
|
|
70
98
|
for score in context_packet.get("scores") or []:
|
|
@@ -72,7 +100,7 @@ def _extract_entity_labels(context_packet: Dict[str, Any]) -> List[str]:
|
|
|
72
100
|
continue
|
|
73
101
|
for key in ("entity_text", "label", "topic", "summary_text"):
|
|
74
102
|
value = score.get(key)
|
|
75
|
-
if value and str(value) not in seen:
|
|
103
|
+
if value and str(value) not in seen and _looks_like_entity_label(str(value)):
|
|
76
104
|
seen.add(str(value))
|
|
77
105
|
labels.append(str(value))
|
|
78
106
|
return labels[:10]
|
|
@@ -611,6 +611,12 @@
|
|
|
611
611
|
"steps": [],
|
|
612
612
|
"notes": []
|
|
613
613
|
},
|
|
614
|
+
{
|
|
615
|
+
"version": "1.3.32",
|
|
616
|
+
"summary": "Release 1.3.32.",
|
|
617
|
+
"steps": [],
|
|
618
|
+
"notes": []
|
|
619
|
+
},
|
|
614
620
|
{
|
|
615
621
|
"version": "unreleased",
|
|
616
622
|
"summary": "Staging entry for in-flight PRs. cut_release.py stamps this with the next version at release cut. Never executed by steps_between.",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/browser_activity_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/github_activity_mapper.py
RENAMED
|
File without changes
|
{topos_node-1.3.31 → topos_node-1.3.32}/topos/canonicalization/mappers/google_calendar_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|