topos-node 1.2.6__tar.gz → 1.2.7__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.2.6/topos_node.egg-info → topos_node-1.2.7}/PKG-INFO +1 -1
- {topos_node-1.2.6 → topos_node-1.2.7}/pyproject.toml +1 -1
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/__version__.py +2 -2
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/query.py +13 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/game_layer.py +4 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/retrieval.py +111 -15
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/sqlite/stores.py +9 -2
- {topos_node-1.2.6 → topos_node-1.2.7/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.2.6 → topos_node-1.2.7}/LICENSE +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/MANIFEST.in +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/README.md +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/setup.cfg +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/shared/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/shared/filtering.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/shared/schema_registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/tests/test_extensions.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/profiles.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/analytics.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/app_registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/backup.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/compute_remote.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/data_commit.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/database_explorer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/db.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/device.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/engine_run.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/enrichment.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/filter_lab.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/health.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/home_chat.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/llm.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/local_mcp.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/query_api.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/signal.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/source_install.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/source_scrub.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/sources.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/sources_overview.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/sync.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/tool_index.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/ui_config.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/uma_data.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/upgrades.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/usage.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/api/user_identity.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/app.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/auth.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/models.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/cli/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/cli/__main__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/cli/commands.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/config/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/config/settings.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/contacts/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/contacts/identity.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/control_plane_client.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/api_models.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/device_helpers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/errors.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/events.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/common.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/config.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/device.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/handlers/uma.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/logging.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/metrics.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/routine_access.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/startup_banner.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/state.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/table_layers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/core/types.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/disclosure/tier.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/client.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/engine.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/intake.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/model_cache.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/registration.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/router.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/tasks.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/transport.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/engine/validator.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/url_classification_core.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/url_classification_enrichment_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/canonical/url_classification_signal_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/processor.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment/website_classifier.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/evals/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/extensions.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/edges.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/linking.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/reads.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/facts/extract.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/facts/reads.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/facts/store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/service.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/stats/engine.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/stats/fold.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/stats/insights.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/filter_lab/service.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/filter_lab/store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/home_chat/schema.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/home_chat/store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/manager.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/progress.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/lineage/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/lineage/provenance.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/lineage/tracker.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/observability/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/observability/alerts.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/observability/metrics.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/observability/tracing.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/openai_client.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/audit.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/stages.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/projections/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/protocol/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/audit.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/ddr.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/disclosure.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/fingerprint.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/grant_cache.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/inference.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/intent.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/manifest.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/minimizer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/negotiation.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/pipeline.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/planner.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/runtime.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/scope_registry.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/session.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/session_utils.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/source_generation.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/query/types.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/rate_limit.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/routines/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/routines/schema.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/routines/store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/runtime_update.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/scope_resolution.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/container.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/interfaces.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/llm/base.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/llm/openai.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/local.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/services/postgres.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/definitions.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/install_service.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/registry.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/startup_banner.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/client.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/paths.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/schema.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/source_settings.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/storage/user_identity.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sync/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sync/client.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/sync_handlers.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/testing/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/testing/lifespan.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/uma_filters.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/uma_resource_id.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/uma_rpt.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/upgrades/manifests.json +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/upgrades/runner.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/utils/base_object.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos/websocket_client.py +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos_node.egg-info/SOURCES.txt +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.2.6 → topos_node-1.2.7}/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.2.
|
|
7
|
+
version = "1.2.7"
|
|
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"
|
|
@@ -50,11 +50,24 @@ async def handle_query(message: Dict[str, Any]) -> Optional[Dict[str, Any]]:
|
|
|
50
50
|
"session_id": payload.get("query_session_id") or payload.get("session_id"),
|
|
51
51
|
},
|
|
52
52
|
}
|
|
53
|
+
# Client-supplied reference instant (offset-aware ISO): "yesterday"
|
|
54
|
+
# resolves against the USER's calendar day, not this server's UTC day.
|
|
55
|
+
# Unparseable/absent → None → planner wall clock.
|
|
56
|
+
query_now = None
|
|
57
|
+
raw_now = str(payload.get("now") or "").strip()
|
|
58
|
+
if raw_now:
|
|
59
|
+
try:
|
|
60
|
+
from datetime import datetime
|
|
61
|
+
|
|
62
|
+
query_now = datetime.fromisoformat(raw_now.replace("Z", "+00:00"))
|
|
63
|
+
except ValueError:
|
|
64
|
+
logger.debug("unparseable query now=%r ignored", raw_now)
|
|
53
65
|
result = await get_query_orchestrator(conn=hub.get_db_connection()).execute(
|
|
54
66
|
query_text=intent,
|
|
55
67
|
scope_id=scope_id,
|
|
56
68
|
access_mode=str(payload.get("access_mode") or "summary"),
|
|
57
69
|
manifest=manifest,
|
|
70
|
+
now=query_now,
|
|
58
71
|
query_session_id=payload.get("query_session_id") or payload.get("session_id"),
|
|
59
72
|
filter_manifest=filter_manifest,
|
|
60
73
|
field_transforms=payload.get("field_transforms"),
|
|
@@ -165,6 +165,10 @@ class DefaultGameLayer:
|
|
|
165
165
|
elif access_mode == "summary":
|
|
166
166
|
payload["answer_type"] = "summary"
|
|
167
167
|
payload["summaries"] = context_packet.get("summaries") or []
|
|
168
|
+
# Planner-parsed date window (present only when retrieval honored
|
|
169
|
+
# one) — lets synthesis state the searched range explicitly.
|
|
170
|
+
if context_packet.get("time_window"):
|
|
171
|
+
payload["time_window"] = context_packet["time_window"]
|
|
168
172
|
else:
|
|
169
173
|
payload["answer_type"] = "raw"
|
|
170
174
|
payload["rows"] = context_packet.get("rows") or []
|
|
@@ -587,21 +587,57 @@ def _resolve_source_ids(
|
|
|
587
587
|
return resolve_retrieval_source_ids(manifest, installed_source_ids)
|
|
588
588
|
|
|
589
589
|
|
|
590
|
+
def _parse_instant(raw: Any) -> Optional[datetime]:
|
|
591
|
+
if not raw:
|
|
592
|
+
return None
|
|
593
|
+
try:
|
|
594
|
+
ts = datetime.fromisoformat(str(raw).replace("Z", "+00:00"))
|
|
595
|
+
except ValueError:
|
|
596
|
+
return None
|
|
597
|
+
return ts if ts.tzinfo else ts.replace(tzinfo=timezone.utc)
|
|
598
|
+
|
|
599
|
+
|
|
590
600
|
def _parse_row_timestamp(row: Dict[str, Any]) -> Optional[datetime]:
|
|
591
601
|
for field in ("event_at", "ts", "occurred_at", "created_at"):
|
|
592
|
-
|
|
593
|
-
if not
|
|
594
|
-
continue
|
|
595
|
-
try:
|
|
596
|
-
ts = datetime.fromisoformat(str(raw).replace("Z", "+00:00"))
|
|
597
|
-
if ts.tzinfo is None:
|
|
598
|
-
ts = ts.replace(tzinfo=timezone.utc)
|
|
602
|
+
ts = _parse_instant(row.get(field))
|
|
603
|
+
if ts is not None:
|
|
599
604
|
return ts
|
|
600
|
-
except ValueError:
|
|
601
|
-
continue
|
|
602
605
|
return None
|
|
603
606
|
|
|
604
607
|
|
|
608
|
+
def _prefer_time_window(
|
|
609
|
+
items: List[Dict[str, Any]],
|
|
610
|
+
time_range: Optional[Tuple[str, str]],
|
|
611
|
+
) -> List[Dict[str, Any]]:
|
|
612
|
+
"""Keep the items inside the plan's time window when any exist.
|
|
613
|
+
|
|
614
|
+
Soft fallback, mirroring the vector lane's unscoped retry: a time-scoped
|
|
615
|
+
ask over a lane with nothing in-window degrades to dated-but-out-of-window
|
|
616
|
+
evidence rather than an empty lane — but every returned item is annotated
|
|
617
|
+
with `in_time_window` so synthesis can say "nothing from yesterday; most
|
|
618
|
+
recent instead" rather than passing off stale items as in-range. Undated
|
|
619
|
+
items count as out-of-window: they cannot evidence a date-scoped claim.
|
|
620
|
+
"""
|
|
621
|
+
if not time_range or not items:
|
|
622
|
+
return items
|
|
623
|
+
start = _parse_instant(time_range[0])
|
|
624
|
+
end = _parse_instant(time_range[1])
|
|
625
|
+
if start is None or end is None:
|
|
626
|
+
return items
|
|
627
|
+
in_window: List[Dict[str, Any]] = []
|
|
628
|
+
for item in items:
|
|
629
|
+
ts = _parse_row_timestamp(item)
|
|
630
|
+
if ts is not None and start <= ts <= end:
|
|
631
|
+
in_window.append(item)
|
|
632
|
+
if in_window:
|
|
633
|
+
for item in in_window:
|
|
634
|
+
item["in_time_window"] = True
|
|
635
|
+
return in_window
|
|
636
|
+
for item in items:
|
|
637
|
+
item["in_time_window"] = False
|
|
638
|
+
return items
|
|
639
|
+
|
|
640
|
+
|
|
605
641
|
def _apply_filter_manifest_rows(
|
|
606
642
|
rows: List[Dict[str, Any]],
|
|
607
643
|
filter_manifest: Optional[Dict[str, Any]],
|
|
@@ -641,6 +677,7 @@ def _load_user_goal_summaries(
|
|
|
641
677
|
source_ids: Optional[List[str]] = None,
|
|
642
678
|
limit: int = _SUMMARY_ITEM_CAP,
|
|
643
679
|
conn: Optional[Any] = None,
|
|
680
|
+
time_range: Optional[Tuple[str, str]] = None,
|
|
644
681
|
) -> List[Dict[str, Any]]:
|
|
645
682
|
try:
|
|
646
683
|
# Prefer the query's own connection (multi-db verification, seeded evals);
|
|
@@ -652,20 +689,40 @@ def _load_user_goal_summaries(
|
|
|
652
689
|
if conn is None:
|
|
653
690
|
return []
|
|
654
691
|
params: List[Any] = []
|
|
655
|
-
|
|
692
|
+
# event_at is the source message's time from the unified timeline
|
|
693
|
+
# (user_goals.record_id = message_id); created_at is only ingest time.
|
|
694
|
+
# Without a date field goals can never answer "yesterday's goals" and
|
|
695
|
+
# dodge recency decay entirely.
|
|
696
|
+
select = (
|
|
697
|
+
"SELECT g.goal_id, g.record_id, g.source_id, g.goal_text, g.created_at,"
|
|
698
|
+
" (SELECT MAX(t.event_at) FROM timeline t WHERE t.record_id = g.record_id)"
|
|
699
|
+
" FROM user_goals g"
|
|
700
|
+
)
|
|
701
|
+
where = ""
|
|
656
702
|
if source_ids:
|
|
657
703
|
placeholders = ",".join("?" for _ in source_ids)
|
|
658
|
-
|
|
704
|
+
where = f" WHERE g.source_id IN ({placeholders})"
|
|
659
705
|
params.extend(source_ids)
|
|
660
|
-
|
|
706
|
+
tail = " ORDER BY g.created_at DESC LIMIT ?"
|
|
661
707
|
params.append(max(limit * 3, 50))
|
|
662
|
-
|
|
708
|
+
try:
|
|
709
|
+
rows = conn.execute(select + where + tail, tuple(params)).fetchall()
|
|
710
|
+
except Exception:
|
|
711
|
+
# Databases predating the timeline projection: dated by ingest only.
|
|
712
|
+
rows = [
|
|
713
|
+
(*row, None)
|
|
714
|
+
for row in conn.execute(
|
|
715
|
+
"SELECT goal_id, record_id, source_id, goal_text, created_at"
|
|
716
|
+
" FROM user_goals" + where.replace("g.", "") + tail.replace("g.", ""),
|
|
717
|
+
tuple(params),
|
|
718
|
+
).fetchall()
|
|
719
|
+
]
|
|
663
720
|
items: List[Dict[str, Any]] = []
|
|
664
721
|
tokens = _query_tokens(query_text)
|
|
665
722
|
query_lower = (query_text or "").lower()
|
|
666
723
|
goal_intent = any(term in query_lower for term in _EXTRA_SURFACE_TERMS)
|
|
667
724
|
seen_texts: set = set()
|
|
668
|
-
for goal_id, record_id, source_id, goal_text in rows:
|
|
725
|
+
for goal_id, record_id, source_id, goal_text, created_at, event_at in rows:
|
|
669
726
|
text = str(goal_text or "").strip()
|
|
670
727
|
if not text:
|
|
671
728
|
continue
|
|
@@ -686,10 +743,13 @@ def _load_user_goal_summaries(
|
|
|
686
743
|
"record_id": record_id,
|
|
687
744
|
"source_id": source_id,
|
|
688
745
|
"dimension": "work",
|
|
746
|
+
"event_at": event_at or created_at,
|
|
747
|
+
"created_at": created_at,
|
|
689
748
|
"relevance_score": round(_goal_relevance(text, query_text), 4),
|
|
690
749
|
"retrieval_source": "user_goal",
|
|
691
750
|
}
|
|
692
751
|
)
|
|
752
|
+
items = _prefer_time_window(items, time_range)
|
|
693
753
|
items.sort(key=lambda item: float(item.get("relevance_score") or 0.0), reverse=True)
|
|
694
754
|
return items[:limit]
|
|
695
755
|
except Exception as exc:
|
|
@@ -1035,6 +1095,14 @@ def _load_canonical_summary_items(
|
|
|
1035
1095
|
"relevance_score": round(_canonical_relevance(text, query_text), 4),
|
|
1036
1096
|
"retrieval_source": f"canonical:{table}",
|
|
1037
1097
|
}
|
|
1098
|
+
# Per-table event-time column (same keys the recency sort in
|
|
1099
|
+
# _list_canonical_rows uses); without it canonical rows can neither
|
|
1100
|
+
# decay in fusion nor answer a date-scoped ask.
|
|
1101
|
+
for ts_key in ("event_at", "starts_at", "occurred_at", "entry_at"):
|
|
1102
|
+
ts_val = clean.get(ts_key) or row.get(ts_key)
|
|
1103
|
+
if ts_val:
|
|
1104
|
+
item["event_at"] = ts_val
|
|
1105
|
+
break
|
|
1038
1106
|
if owner is not None:
|
|
1039
1107
|
item["owner_authored"] = owner
|
|
1040
1108
|
items.append(item)
|
|
@@ -1440,6 +1508,9 @@ def _semantic_hits(
|
|
|
1440
1508
|
"similarity": item.get("similarity"),
|
|
1441
1509
|
"source_id": item.get("source_id"),
|
|
1442
1510
|
"signal_dimension": item.get("signal_dimension"),
|
|
1511
|
+
# Without the event time, vector items are exempt from
|
|
1512
|
+
# recency decay by accident and undated at synthesis.
|
|
1513
|
+
"event_at": item.get("event_at"),
|
|
1443
1514
|
}
|
|
1444
1515
|
)
|
|
1445
1516
|
return hits, result.get("error")
|
|
@@ -2059,7 +2130,10 @@ def _build_summary_items(
|
|
|
2059
2130
|
str(s).strip() for s in (manifest.default_source_ids or []) if str(s).strip()
|
|
2060
2131
|
] or (source_ids or None)
|
|
2061
2132
|
goal_items = _load_user_goal_summaries(
|
|
2062
|
-
query_text,
|
|
2133
|
+
query_text,
|
|
2134
|
+
source_ids=goal_source_ids or None,
|
|
2135
|
+
conn=bundle_conn,
|
|
2136
|
+
time_range=getattr(plan, "time_range", None) if plan else None,
|
|
2063
2137
|
)
|
|
2064
2138
|
|
|
2065
2139
|
canonical_items = _load_canonical_summary_items(
|
|
@@ -2073,6 +2147,9 @@ def _build_summary_items(
|
|
|
2073
2147
|
conn=bundle_conn,
|
|
2074
2148
|
exposure_visible=exposure_visible,
|
|
2075
2149
|
)
|
|
2150
|
+
canonical_items = _prefer_time_window(
|
|
2151
|
+
canonical_items, getattr(plan, "time_range", None) if plan else None
|
|
2152
|
+
)
|
|
2076
2153
|
|
|
2077
2154
|
# Interaction browse ("who do I talk to"): the contact registry is the
|
|
2078
2155
|
# ground truth of interaction partners — mention-only names (someone the
|
|
@@ -2162,6 +2239,7 @@ def _build_summary_items(
|
|
|
2162
2239
|
"record_id": hit.get("record_id"),
|
|
2163
2240
|
"source_id": hit.get("source_id"),
|
|
2164
2241
|
"signal_dimension": hit.get("signal_dimension"),
|
|
2242
|
+
"event_at": hit.get("event_at"),
|
|
2165
2243
|
"relevance_score": round(similarity, 4),
|
|
2166
2244
|
"retrieval_source": "vector",
|
|
2167
2245
|
}
|
|
@@ -2236,6 +2314,12 @@ def _build_summary_items(
|
|
|
2236
2314
|
"retrieval_source": "signal_fact",
|
|
2237
2315
|
}
|
|
2238
2316
|
)
|
|
2317
|
+
# Same time-window preference as the goal lane: dimension facts now carry
|
|
2318
|
+
# created_at (and sometimes event_at) — a "yesterday" ask keeps in-window
|
|
2319
|
+
# facts when any exist, annotated fallback otherwise.
|
|
2320
|
+
fact_items = _prefer_time_window(
|
|
2321
|
+
fact_items, getattr(plan, "time_range", None) if plan else None
|
|
2322
|
+
)
|
|
2239
2323
|
fact_items.sort(key=lambda item: float(item.get("relevance_score") or 0.0), reverse=True)
|
|
2240
2324
|
if first_person:
|
|
2241
2325
|
# The dimension-dump lane carries raw stat payloads too — the same
|
|
@@ -2608,6 +2692,18 @@ class DefaultSignalRetrievalAdapter:
|
|
|
2608
2692
|
)
|
|
2609
2693
|
if summaries:
|
|
2610
2694
|
touched.append("signal")
|
|
2695
|
+
# Surface the planner's parsed window so synthesis can state
|
|
2696
|
+
# which dates were searched ("nothing from 2026-07-16") instead
|
|
2697
|
+
# of inferring it from per-item timestamps. Summary mode only:
|
|
2698
|
+
# its lanes honor the window; raw/inference do not yet
|
|
2699
|
+
# (PLAN_TEMPORAL_COHERENCE.md M5/M6) and must not claim to.
|
|
2700
|
+
if plan is not None and (plan.time_range or plan.as_of):
|
|
2701
|
+
window: Dict[str, Any] = {"source": "query_planner"}
|
|
2702
|
+
if plan.time_range:
|
|
2703
|
+
window["from"], window["to"] = plan.time_range
|
|
2704
|
+
if plan.as_of:
|
|
2705
|
+
window["as_of"] = plan.as_of
|
|
2706
|
+
packet["time_window"] = window
|
|
2611
2707
|
else:
|
|
2612
2708
|
summaries = []
|
|
2613
2709
|
for dim in manifest.primary_dimensions:
|
|
@@ -609,7 +609,7 @@ class SQLiteSignalFeatureStore:
|
|
|
609
609
|
return summary_id
|
|
610
610
|
|
|
611
611
|
def _list_rows(self, table: str, *, dimension: Optional[str], limit: int, offset: int) -> ListPage:
|
|
612
|
-
query = f"SELECT payload_json FROM {table}"
|
|
612
|
+
query = f"SELECT payload_json, created_at FROM {table}"
|
|
613
613
|
params: List[Any] = []
|
|
614
614
|
if dimension is not None:
|
|
615
615
|
query += " WHERE dimension=?"
|
|
@@ -618,7 +618,14 @@ class SQLiteSignalFeatureStore:
|
|
|
618
618
|
total = int(count[0]) if count else 0
|
|
619
619
|
query += " ORDER BY rowid LIMIT ? OFFSET ?"
|
|
620
620
|
params.extend([limit, offset])
|
|
621
|
-
items
|
|
621
|
+
items: List[Dict[str, Any]] = []
|
|
622
|
+
for payload_json, created_at in self._conn.execute(query, params).fetchall():
|
|
623
|
+
item = json.loads(payload_json)
|
|
624
|
+
# The row timestamp lives in the column, not the payload; without it
|
|
625
|
+
# facts are undated downstream (no recency decay, no time filtering).
|
|
626
|
+
if created_at:
|
|
627
|
+
item.setdefault("created_at", created_at)
|
|
628
|
+
items.append(item)
|
|
622
629
|
return ListPage(items=items, total=total, offset=offset, limit=limit)
|
|
623
630
|
|
|
624
631
|
def get_by_dimension(self, dimension: str, *, limit: int = 100, offset: int = 0) -> ListPage:
|
|
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.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/browser_activity_mapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{topos_node-1.2.6 → topos_node-1.2.7}/topos/canonicalization/mappers/github_activity_mapper.py
RENAMED
|
File without changes
|
{topos_node-1.2.6 → topos_node-1.2.7}/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
|
|
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
|