topos-node 1.3.48__tar.gz → 1.3.50__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.48/topos_node.egg-info → topos_node-1.3.50}/PKG-INFO +1 -1
- {topos_node-1.3.48 → topos_node-1.3.50}/pyproject.toml +1 -1
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/__version__.py +2 -2
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/ollama.py +10 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/engine.py +6 -1
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/usage_observation.py +9 -2
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/surfaces.py +21 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/ingest_helpers.py +36 -38
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/protocol/narrowing_vocabulary.json +1 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/narrowing.py +1 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/llm/openai.py +95 -1
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/upgrades/manifests.json +12 -0
- {topos_node-1.3.48 → topos_node-1.3.50/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.3.48 → topos_node-1.3.50}/LICENSE +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/MANIFEST.in +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/README.md +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/setup.cfg +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/shared/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/shared/filtering.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/shared/schema_registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_extensions.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_profiles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/profiles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/analytics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/app_registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/backup.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/compute_remote.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/connected_apps.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/conversation_context.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/data_commit.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/database_explorer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/db.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/device.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/engine_run.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/enrichment.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/filter_lab.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/health.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/home_chat.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/llm.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/local_mcp.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/query_api.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/shell.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/signal.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/source_install.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/source_scrub.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/sources.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/sources_overview.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/sync.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/tool_index.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/ui_config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/uma_data.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/upgrades.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/usage.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/api/user_identity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/app.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/auth.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/models.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/__main__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/commands.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/cli/tray.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/facts_llm.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/model_packs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/settings.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/contacts/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/contacts/identity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/control_plane_client.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/api_models.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/db_health.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/device_helpers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/errors.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/events.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/aggregate.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/common.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/config.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/device.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/query.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/logging.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/metrics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/routine_access.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/startup_banner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/state.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/table_layers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/core/types.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/defaults.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/disclosure/tier.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/client.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/disk_space.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/intake.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/model_cache.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/model_manager.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/registration.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/router.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/tasks.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/transport.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/engine/validator.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/processor.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/evals/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/extensions.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/router.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/template.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/edges.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/linking.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/owner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/reads.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/facts/extract.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/facts/reads.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/facts/store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/service.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/stats/engine.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/stats/fold.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/stats/insights.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/badges.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/daily.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/intents.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/filter_lab/service.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/filter_lab/store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/home_chat/schema.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/home_chat/store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/manager.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/progress.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/lineage/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/lineage/provenance.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/lineage/tracker.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/mcp_clients.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/observability/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/observability/alerts.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/observability/metrics.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/observability/tracing.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/openai_client.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/owner_key.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/audit.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/stages.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/principal.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/profiles.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/projections/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/protocol/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/aggregate.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/audit.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/closeness.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/cohort_resolvers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/collaborators.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/ddr.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/disclosure.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/entity_window.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/exclusion.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/facts_direct.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/fingerprint.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/game_layer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/grant_cache.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/graph_lane.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/inference.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/intent.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/manifest.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/minimizer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/negotiation.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/pipeline.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/planner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/retrieval.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/runtime.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/scope_head.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/scope_registry.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/session.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/session_utils.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/source_generation.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/truth_facts.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/types.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/verify.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/query/verify_modes.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/rate_limit.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/relay_stamp.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/routines/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/routines/schema.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/routines/store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/runtime_update.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/scope_resolution.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/container.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/interfaces.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/llm/base.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/local.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/services/postgres.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/definitions.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/install_service.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/startup_banner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/client.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/paths.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/schema.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/source_settings.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/storage/user_identity.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sync/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sync/client.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/sync_handlers.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/testing/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/testing/lifespan.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/uds.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/uma_filters.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/uma_resource_id.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/uma_rpt.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/upgrades/runner.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/utils/base_object.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos/websocket_client.py +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.3.48 → topos_node-1.3.50}/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.50"
|
|
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"
|
|
@@ -455,13 +455,23 @@ class OllamaAdapter:
|
|
|
455
455
|
prompt_tokens = int(data.get("prompt_eval_count") or 0)
|
|
456
456
|
completion_tokens = int(data.get("eval_count") or 0)
|
|
457
457
|
total_tokens = prompt_tokens + completion_tokens
|
|
458
|
+
# This is the DERIVATION lane, and it had no timing signal at
|
|
459
|
+
# all — no streaming, no heartbeats, no usage rows. It also
|
|
460
|
+
# alternates models with chat, which evicts weights and pays a
|
|
461
|
+
# cold load the chat lane then blames on itself. Capture the
|
|
462
|
+
# same split here so the two lanes are comparable.
|
|
463
|
+
from topos.services.llm.openai import _ollama_timings
|
|
464
|
+
|
|
465
|
+
timings = _ollama_timings(data)
|
|
458
466
|
return {
|
|
459
467
|
"text": data.get("response", ""),
|
|
460
468
|
"usage": {
|
|
461
469
|
"prompt_tokens": max(0, prompt_tokens),
|
|
462
470
|
"completion_tokens": max(0, completion_tokens),
|
|
463
471
|
"total_tokens": max(0, total_tokens),
|
|
472
|
+
**({"timings": timings} if timings else {}),
|
|
464
473
|
},
|
|
474
|
+
**({"timings": timings} if timings else {}),
|
|
465
475
|
}
|
|
466
476
|
except urllib.error.HTTPError as e:
|
|
467
477
|
# Include the response body: Ollama puts the actionable message
|
|
@@ -273,7 +273,12 @@ class Engine:
|
|
|
273
273
|
origin=origin,
|
|
274
274
|
source_id=normalized.source_id,
|
|
275
275
|
duration_ms=duration_ms,
|
|
276
|
-
|
|
276
|
+
# Engine.run is NON-STREAMING: the whole body arrives at
|
|
277
|
+
# once, so there is no first-token moment to measure here.
|
|
278
|
+
# Passing duration as ttfb manufactured the sentinel that
|
|
279
|
+
# poisoned the column — leave it unset and let the absence
|
|
280
|
+
# be visible.
|
|
281
|
+
ttfb_ms=None,
|
|
277
282
|
)
|
|
278
283
|
except Exception:
|
|
279
284
|
logger.debug("Failed to emit engine llm usage observation", exc_info=True)
|
|
@@ -370,9 +370,16 @@ def emit_engine_llm_usage_observation(
|
|
|
370
370
|
"provider": provider_key,
|
|
371
371
|
"model": model_key,
|
|
372
372
|
}
|
|
373
|
-
#
|
|
373
|
+
# ttfb_ms is RECORDED OR ABSENT — never inferred from duration.
|
|
374
|
+
#
|
|
375
|
+
# It used to default to `resolved_duration`, and the result was that 120 of
|
|
376
|
+
# 135 home-chat rows carried ttfb_ms == duration_ms. Every percentile anyone
|
|
377
|
+
# computed from that column was a duration percentile wearing a TTFB label,
|
|
378
|
+
# and the one metric this system is now being tuned for was, in effect, not
|
|
379
|
+
# measured at all. An honest NULL is a gap you can see; a plausible wrong
|
|
380
|
+
# number is one you cannot.
|
|
374
381
|
resolved_duration = int(duration_ms) if duration_ms is not None else None
|
|
375
|
-
resolved_ttfb = int(ttfb_ms) if ttfb_ms is not None else
|
|
382
|
+
resolved_ttfb = int(ttfb_ms) if ttfb_ms is not None else None
|
|
376
383
|
metadata: Dict[str, Any] = {
|
|
377
384
|
"purpose": purpose,
|
|
378
385
|
"provider": provider_key,
|
|
@@ -232,6 +232,27 @@ def run_pack_backfill(conn: sqlite3.Connection, pack_id: str, limit: int = 500)
|
|
|
232
232
|
conn.commit()
|
|
233
233
|
conn.commit()
|
|
234
234
|
stats["quarantined"] = writer.stats.get("quarantined", 0) - stats.pop("quarantined0")
|
|
235
|
+
|
|
236
|
+
# A backfill IS a run. Without this the registry keeps last_run_at NULL and
|
|
237
|
+
# the lens card reads "never run" over a pack that just wrote facts —
|
|
238
|
+
# observed 2026-09-03 on values.motivation, 73 records in, 11 facts out,
|
|
239
|
+
# card still blank. mark_pack_run is otherwise only called at the end of an
|
|
240
|
+
# ingest batch (derivation_job.py:292), which a quiet node may never have.
|
|
241
|
+
from .registry import mark_pack_run
|
|
242
|
+
mark_pack_run(conn, pack_id, pack.version)
|
|
243
|
+
|
|
244
|
+
# Embed what we just wrote, or the owner can see these facts on the Facts
|
|
245
|
+
# page and cannot ask about them: the semantic lane reads signal_embeddings,
|
|
246
|
+
# and the embedding job runs only when an ingest batch happens. Idempotent
|
|
247
|
+
# and incremental by content hash, so this is cheap when there is nothing
|
|
248
|
+
# new. Never fatal — the facts are already committed, and a missing
|
|
249
|
+
# embedding is a degraded answer, not a lost fact.
|
|
250
|
+
try:
|
|
251
|
+
from ...features.signal.derived_index import index_derived_objects
|
|
252
|
+
stats["indexed"] = int(index_derived_objects(conn).get("embedded", 0) or 0)
|
|
253
|
+
except Exception: # noqa: BLE001 — see comment above: never fatal
|
|
254
|
+
stats["indexed"] = -1
|
|
255
|
+
conn.commit()
|
|
235
256
|
return stats
|
|
236
257
|
|
|
237
258
|
|
|
@@ -16,6 +16,40 @@ from ..storage.raw.file_store import RawFileStore
|
|
|
16
16
|
logger = logging.getLogger("topos.ingestion.ingest_helpers")
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
def chat_ui_raw_payload(payload: dict, *, job_id: str, dataset_id: str) -> dict:
|
|
20
|
+
"""Map a chat UI-stream record to the v1 raw shape {id, thread_id, role, content, created_at}.
|
|
21
|
+
|
|
22
|
+
The v1 chat vocabulary — {id, thread_id, role} — is what the file importer,
|
|
23
|
+
the schema registry, and the browser extension all send. Older store_message
|
|
24
|
+
callers used {message_id, conversation_id, sender_type}. Read v1 first and
|
|
25
|
+
fall back to the legacy names, so a client on either vocabulary lands
|
|
26
|
+
correctly. Reading ONLY the legacy names (the prior behaviour) mislabelled
|
|
27
|
+
every extension message role=user (sender_type absent), merged every chat
|
|
28
|
+
under the dataset id (conversation_id absent), and minted a fresh id per
|
|
29
|
+
record (message_id absent), defeating message-id idempotency.
|
|
30
|
+
"""
|
|
31
|
+
role = str(payload.get("role") or "").strip()
|
|
32
|
+
if not role:
|
|
33
|
+
sender_type = payload.get("sender_type", "human")
|
|
34
|
+
role = "user" if sender_type == "human" else str(sender_type)
|
|
35
|
+
created_at = payload.get("created_at")
|
|
36
|
+
if created_at is None:
|
|
37
|
+
ts = payload.get("ts")
|
|
38
|
+
if isinstance(ts, (int, float)):
|
|
39
|
+
created_at = ts
|
|
40
|
+
elif isinstance(ts, str):
|
|
41
|
+
created_at = ts
|
|
42
|
+
else:
|
|
43
|
+
created_at = datetime.now(timezone.utc).timestamp()
|
|
44
|
+
return {
|
|
45
|
+
"id": str(payload.get("id") or payload.get("message_id") or job_id),
|
|
46
|
+
"thread_id": payload.get("thread_id") or payload.get("conversation_id") or dataset_id,
|
|
47
|
+
"role": role,
|
|
48
|
+
"content": payload.get("content", ""),
|
|
49
|
+
"created_at": created_at,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
19
53
|
def _ui_stream_passes_payload_through(source: Any, source_id: str) -> bool:
|
|
20
54
|
"""True when ui_stream ingest should forward the client payload to the source parser."""
|
|
21
55
|
if source_id.startswith("browser_"):
|
|
@@ -207,25 +241,7 @@ async def ingest_ui_payload(
|
|
|
207
241
|
# Legacy path: ChatGPT UI only (backward compatibility when source_id omitted or chatgpt default)
|
|
208
242
|
file_store = RawFileStore()
|
|
209
243
|
job_id = job_id or str(uuid.uuid4())
|
|
210
|
-
|
|
211
|
-
role = "user" if sender_type == "human" else sender_type
|
|
212
|
-
content = payload.get("content", "")
|
|
213
|
-
created_at = payload.get("created_at")
|
|
214
|
-
if created_at is None:
|
|
215
|
-
ts = payload.get("ts")
|
|
216
|
-
if isinstance(ts, (int, float)):
|
|
217
|
-
created_at = ts
|
|
218
|
-
elif isinstance(ts, str):
|
|
219
|
-
created_at = ts
|
|
220
|
-
else:
|
|
221
|
-
created_at = datetime.now(timezone.utc).timestamp()
|
|
222
|
-
record = {
|
|
223
|
-
"id": payload.get("message_id") or job_id,
|
|
224
|
-
"thread_id": payload.get("conversation_id") or dataset_id,
|
|
225
|
-
"role": role,
|
|
226
|
-
"content": content,
|
|
227
|
-
"created_at": created_at,
|
|
228
|
-
}
|
|
244
|
+
record = chat_ui_raw_payload(payload, job_id=job_id, dataset_id=dataset_id)
|
|
229
245
|
logger.info(
|
|
230
246
|
"[PIPELINE:RAW] Appending UI message to raw store: job_id=%s, dataset_id=%s, message_id=%s, content_preview=%s",
|
|
231
247
|
job_id,
|
|
@@ -382,25 +398,7 @@ async def _ingest_ui_payload_direct(
|
|
|
382
398
|
)
|
|
383
399
|
raw_payload.setdefault("record_id", record_id)
|
|
384
400
|
else:
|
|
385
|
-
|
|
386
|
-
role = "user" if sender_type == "human" else sender_type
|
|
387
|
-
content = payload.get("content", "")
|
|
388
|
-
created_at = payload.get("created_at")
|
|
389
|
-
if created_at is None:
|
|
390
|
-
ts = payload.get("ts")
|
|
391
|
-
if isinstance(ts, (int, float)):
|
|
392
|
-
created_at = ts
|
|
393
|
-
elif isinstance(ts, str):
|
|
394
|
-
created_at = ts
|
|
395
|
-
else:
|
|
396
|
-
created_at = datetime.now(timezone.utc).timestamp()
|
|
397
|
-
raw_payload = {
|
|
398
|
-
"id": payload.get("message_id") or job_id,
|
|
399
|
-
"thread_id": payload.get("conversation_id") or dataset_id,
|
|
400
|
-
"role": role,
|
|
401
|
-
"content": content,
|
|
402
|
-
"created_at": created_at,
|
|
403
|
-
}
|
|
401
|
+
raw_payload = chat_ui_raw_payload(payload, job_id=job_id, dataset_id=dataset_id)
|
|
404
402
|
record_id = raw_payload["id"]
|
|
405
403
|
raw_record = RawRecord(record_id=record_id, payload=raw_payload)
|
|
406
404
|
|
|
@@ -256,6 +256,7 @@ REASONS = frozenset(
|
|
|
256
256
|
# --- engine: the grantee content filter, one per scrubbed artifact list
|
|
257
257
|
"grantee_scrub_facts",
|
|
258
258
|
"hosted_binding_text_withheld",
|
|
259
|
+
"owner_permission_claim_replaced",
|
|
259
260
|
"grantee_scrub_scores",
|
|
260
261
|
"grantee_scrub_semantic_hits",
|
|
261
262
|
"grantee_scrub_summaries",
|
|
@@ -181,7 +181,90 @@ async def _ollama_generate(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
181
181
|
"completion_tokens": completion_tokens,
|
|
182
182
|
"total_tokens": total_tokens,
|
|
183
183
|
}
|
|
184
|
-
|
|
184
|
+
timings = _ollama_timings(data)
|
|
185
|
+
if timings:
|
|
186
|
+
usage = {**usage, "timings": timings}
|
|
187
|
+
return {"output": text, "model": resp_model, "usage": usage, "timings": timings}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
#: Nanoseconds-to-milliseconds, rounded to whole ms — the resolution anyone
|
|
191
|
+
#: reasons about latency in. Ollama reports every duration in ns.
|
|
192
|
+
def _ms(value: Any) -> int:
|
|
193
|
+
try:
|
|
194
|
+
return int(round(float(value) / 1e6))
|
|
195
|
+
except (TypeError, ValueError):
|
|
196
|
+
return 0
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
#: Below this, the computed prefill rate is dominated by fixed overhead and
|
|
200
|
+
#: says nothing about caching. Live false positive at 32 tokens.
|
|
201
|
+
_CACHE_SIGNAL_MIN_PROMPT_TOKENS = 512
|
|
202
|
+
|
|
203
|
+
#: Sits in the empty band between the fastest observed REAL prefill (~1,045
|
|
204
|
+
#: tok/s on a 3B) and the slowest observed cache HIT (~17,565 tok/s on a 27B).
|
|
205
|
+
_CACHE_HIT_TOK_S = 3000.0
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _ollama_timings(data: Dict[str, Any]) -> Dict[str, Any]:
|
|
209
|
+
"""Split a generation into load, prefill and decode.
|
|
210
|
+
|
|
211
|
+
Ollama puts ``total_duration``, ``load_duration``, ``prompt_eval_duration``
|
|
212
|
+
and ``eval_duration`` on the SAME terminating JSON object we already read
|
|
213
|
+
token counts from, and every one of them was being thrown away — at four
|
|
214
|
+
parse sites, for the whole life of this codebase. A repo-wide search for
|
|
215
|
+
``load_duration`` found two hits, both prose in a plan document: it was
|
|
216
|
+
specified and never built.
|
|
217
|
+
|
|
218
|
+
Without the split, "the model was slow" is unanswerable. With it the three
|
|
219
|
+
causes separate cleanly. Measured on this machine 2026-09-03:
|
|
220
|
+
|
|
221
|
+
* ``load`` — weights into memory. Cold 5,695 ms on a 27B, warm 4.7 ms. The
|
|
222
|
+
544x separation is why ``cold`` below is a threshold and not a guess.
|
|
223
|
+
* ``prefill`` — reading the prompt. THE one that matters: it IS
|
|
224
|
+
time-to-first-token, ~65-90 tok/s, and 78 s of a real turn.
|
|
225
|
+
* ``decode`` — writing the answer, 3.4-10.1 tok/s. Caching cannot touch it.
|
|
226
|
+
|
|
227
|
+
``prefill_cached`` is a prefix-cache hit, and it is deliberately NOT
|
|
228
|
+
``prompt_eval_duration == 0``: measured hits ran 74-191 ms on a 3B and
|
|
229
|
+
~6,300 ms on a 27B, and ``prompt_eval_count`` still reports the FULL prompt
|
|
230
|
+
on a hit, so the duration is the only signal there is.
|
|
231
|
+
"""
|
|
232
|
+
load_ms = _ms(data.get("load_duration"))
|
|
233
|
+
prefill_ms = _ms(data.get("prompt_eval_duration"))
|
|
234
|
+
decode_ms = _ms(data.get("eval_duration"))
|
|
235
|
+
prompt_toks = int(data.get("prompt_eval_count") or 0)
|
|
236
|
+
completion_toks = int(data.get("eval_count") or 0)
|
|
237
|
+
timings: Dict[str, Any] = {
|
|
238
|
+
"load_ms": load_ms,
|
|
239
|
+
"prefill_ms": prefill_ms,
|
|
240
|
+
"decode_ms": decode_ms,
|
|
241
|
+
"total_ms": _ms(data.get("total_duration")),
|
|
242
|
+
# A cold load is 3 orders of magnitude from a warm one; 1s sits in the
|
|
243
|
+
# empty middle of that gap rather than near either edge.
|
|
244
|
+
"cold": load_ms >= 1000,
|
|
245
|
+
}
|
|
246
|
+
if prompt_toks and prefill_ms > 0:
|
|
247
|
+
timings["prefill_tok_s"] = round(prompt_toks * 1000.0 / prefill_ms, 1)
|
|
248
|
+
if completion_toks and decode_ms > 0:
|
|
249
|
+
timings["decode_tok_s"] = round(completion_toks * 1000.0 / decode_ms, 1)
|
|
250
|
+
# A hit still reports the full prompt_eval_count, so it has to be inferred
|
|
251
|
+
# from the RATE. Two guards, both learned from a false positive in live
|
|
252
|
+
# data: a 32-token prompt to a 3B model reported 561 tok/s and was flagged
|
|
253
|
+
# as cached when nothing was cached at all.
|
|
254
|
+
#
|
|
255
|
+
# 1. Short prompts carry no signal. Below a few hundred tokens the fixed
|
|
256
|
+
# per-request overhead dominates and the computed rate is noise.
|
|
257
|
+
# 2. The threshold has to clear a SMALL model's genuine speed, not just a
|
|
258
|
+
# large one's. Measured real prefill: 65-90 tok/s on a 27B, but
|
|
259
|
+
# 684-1,045 tok/s on a 3B. Measured cache hits: 17,565 tok/s (27B) and
|
|
260
|
+
# 33,275 tok/s (3B). 3,000 sits in the empty band between the fastest
|
|
261
|
+
# real prefill and the slowest hit, rather than just above the one
|
|
262
|
+
# model it was first calibrated on.
|
|
263
|
+
rate = timings.get("prefill_tok_s")
|
|
264
|
+
if prompt_toks >= _CACHE_SIGNAL_MIN_PROMPT_TOKENS and isinstance(rate, float):
|
|
265
|
+
if rate > _CACHE_HIT_TOK_S:
|
|
266
|
+
timings["prefill_cached"] = True
|
|
267
|
+
return timings
|
|
185
268
|
|
|
186
269
|
|
|
187
270
|
async def _ollama_stream_generate(
|
|
@@ -245,6 +328,9 @@ async def _ollama_stream_generate(
|
|
|
245
328
|
prompt_tokens = 0
|
|
246
329
|
completion_tokens = 0
|
|
247
330
|
done_reason = ""
|
|
331
|
+
# Stays empty when the stream ends without a terminating frame — a dropped
|
|
332
|
+
# connection must not raise a NameError on the way out.
|
|
333
|
+
timings: Dict[str, Any] = {}
|
|
248
334
|
# Liveness (plan §2): phase-aware heartbeats whenever nothing else flows —
|
|
249
335
|
# 10s pre-first-token (load + prefill are silent), 30s mid-stream. Emitted
|
|
250
336
|
# frames of any kind reset the clock.
|
|
@@ -306,6 +392,7 @@ async def _ollama_stream_generate(
|
|
|
306
392
|
prompt_tokens = int(data.get("prompt_eval_count") or prompt_tokens)
|
|
307
393
|
completion_tokens = int(data.get("eval_count") or completion_tokens)
|
|
308
394
|
done_reason = str(data.get("done_reason") or "")
|
|
395
|
+
timings = _ollama_timings(data)
|
|
309
396
|
except httpx.RequestError as exc:
|
|
310
397
|
raise HTTPException(
|
|
311
398
|
status_code=status.HTTP_502_BAD_GATEWAY,
|
|
@@ -335,6 +422,13 @@ async def _ollama_stream_generate(
|
|
|
335
422
|
"total_tokens": total_tokens,
|
|
336
423
|
}
|
|
337
424
|
result: Dict[str, Any] = {"output": text, "model": resp_model, "usage": usage}
|
|
425
|
+
# Nested under usage on purpose: the browser whitelists exactly
|
|
426
|
+
# output/model/usage (homeLlmStream.ts:415), and the control plane passes
|
|
427
|
+
# the payload through verbatim (_final_payload, llm_generation_sse.py:353),
|
|
428
|
+
# so timings reach the UI with NO control-plane change.
|
|
429
|
+
if timings:
|
|
430
|
+
result["usage"] = {**usage, "timings": timings}
|
|
431
|
+
result["timings"] = timings
|
|
338
432
|
if thinking_chars:
|
|
339
433
|
result["thinking_chars"] = thinking_chars
|
|
340
434
|
if done_reason:
|
|
@@ -813,6 +813,18 @@
|
|
|
813
813
|
"steps": [],
|
|
814
814
|
"notes": []
|
|
815
815
|
},
|
|
816
|
+
{
|
|
817
|
+
"version": "1.3.49",
|
|
818
|
+
"summary": "Release 1.3.49.",
|
|
819
|
+
"steps": [],
|
|
820
|
+
"notes": []
|
|
821
|
+
},
|
|
822
|
+
{
|
|
823
|
+
"version": "1.3.50",
|
|
824
|
+
"summary": "Release 1.3.50.",
|
|
825
|
+
"steps": [],
|
|
826
|
+
"notes": []
|
|
827
|
+
},
|
|
816
828
|
{
|
|
817
829
|
"version": "unreleased",
|
|
818
830
|
"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
|
|
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.48 → topos_node-1.3.50}/topos/canonicalization/mappers/browser_activity_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/github_activity_mapper.py
RENAMED
|
File without changes
|
{topos_node-1.3.48 → topos_node-1.3.50}/topos/canonicalization/mappers/google_calendar_mapper.py
RENAMED
|
File without changes
|